aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/servo/testing_commands.py8
-rw-r--r--tests/wpt/metadata/2dcontext/conformance-requirements/2d.voidreturn.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html.ini26
-rw-r--r--tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html.ini17
-rw-r--r--tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html.ini5
-rw-r--r--tests/wpt/metadata/2dcontext/imagebitmap/createImageBitmap-invalid-args.html.ini86
-rw-r--r--tests/wpt/metadata/2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html.ini17
-rw-r--r--tests/wpt/metadata/2dcontext/transformations/2d.transformation.setTransform.multiple.html.ini5
-rw-r--r--tests/wpt/metadata/FileAPI/idlharness.html.ini3
-rw-r--r--tests/wpt/metadata/FileAPI/idlharness.worker.js.ini21
-rw-r--r--tests/wpt/metadata/MANIFEST.json33745
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/idlharness.html.ini111
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/idlharness.https.html.ini111
-rw-r--r--tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini111
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js.ini197
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html.ini101
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js.ini47
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html.ini8
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js.ini8
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/exceptions.html.ini6
-rw-r--r--tests/wpt/metadata/WebIDL/ecmascript-binding/legacy-platform-object.html.ini17
-rw-r--r--tests/wpt/metadata/WebIDL/interfaces.html.ini272
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/access-control-and-redirects.htm.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/access-control-basic-allow-preflight-cache.htm.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/access-control-preflight-request-header-sorted.htm.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/access-control-sandboxed-iframe-denied.htm.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/data-uri.htm.ini3
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/event-upload-progress-crossorigin.htm.ini8
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/open-url-worker-origin.htm.ini3
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/responseXML-unavailable-in-worker.html.ini5
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/responsedocument-decoding.htm.ini8
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/send-content-type-string.htm.ini8
-rw-r--r--tests/wpt/metadata/XMLHttpRequest/setrequestheader-content-type.htm.ini3
-rw-r--r--tests/wpt/metadata/cssom-view/DOMRectList.html.ini8
-rw-r--r--tests/wpt/metadata/cssom-view/elementFromPoint-002.html.ini5
-rw-r--r--tests/wpt/metadata/cssom-view/elementFromPoint-003.html.ini5
-rw-r--r--tests/wpt/metadata/cssom-view/elementsFromPoint-iframes.html.ini8
-rw-r--r--tests/wpt/metadata/cssom-view/elementsFromPoint-invalid-cases.html.ini5
-rw-r--r--tests/wpt/metadata/cssom-view/elementsFromPoint-shadowroot.html.ini5
-rw-r--r--tests/wpt/metadata/cssom-view/elementsFromPoint-simple.html.ini20
-rw-r--r--tests/wpt/metadata/cssom-view/elementsFromPoint-svg.html.ini14
-rw-r--r--tests/wpt/metadata/cssom-view/elementsFromPoint-table.html.ini9
-rw-r--r--tests/wpt/metadata/cssom-view/interfaces.html.ini329
-rw-r--r--tests/wpt/metadata/cssom-view/scrollIntoView-empty-args.html.ini18
-rw-r--r--tests/wpt/metadata/cssom-view/scrollintoview.html.ini122
-rw-r--r--tests/wpt/metadata/cssom-view/ttwf-scrollintoview.html.ini5
-rw-r--r--tests/wpt/metadata/cssom/MediaList.xhtml.ini3
-rw-r--r--tests/wpt/metadata/cssom/MediaList2.xhtml.ini3
-rw-r--r--tests/wpt/metadata/cssom/cssom-ruleTypeAndOrder.html.ini5
-rw-r--r--tests/wpt/metadata/cssom/getComputedStyle-pseudo.html.ini6
-rw-r--r--tests/wpt/metadata/cssom/index-003.html.ini5
-rw-r--r--tests/wpt/metadata/cssom/interfaces.html.ini429
-rw-r--r--tests/wpt/metadata/dom/abort/event.any.js.ini11
-rw-r--r--tests/wpt/metadata/dom/events/Event-timestamp-high-resolution.html.ini5
-rw-r--r--tests/wpt/metadata/dom/events/Event-timestamp-safe-resolution.html.ini5
-rw-r--r--tests/wpt/metadata/dom/events/EventTarget-constructible.any.js.ini17
-rw-r--r--tests/wpt/metadata/dom/interface-objects.html.ini8
-rw-r--r--tests/wpt/metadata/dom/interfaces.html.ini324
-rw-r--r--tests/wpt/metadata/dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html.ini5
-rw-r--r--tests/wpt/metadata/dom/nodes/Document-createEvent.html.ini15
-rw-r--r--tests/wpt/metadata/dom/traversal/NodeIterator.html.ini5
-rw-r--r--tests/wpt/metadata/dom/traversal/TreeWalker.html.ini5
-rw-r--r--tests/wpt/metadata/domparsing/XMLSerializer-serializeToString.html.ini9
-rw-r--r--tests/wpt/metadata/domparsing/xml-serialization.xhtml.ini6
-rw-r--r--tests/wpt/metadata/encoding/idlharness.html.ini3
-rw-r--r--tests/wpt/metadata/encoding/iso-2022-jp-decoder.html.ini3
-rw-r--r--tests/wpt/metadata/encoding/replacement-encodings.html.ini20
-rw-r--r--tests/wpt/metadata/encoding/unsupported-encodings.html.ini20
-rw-r--r--tests/wpt/metadata/encoding/utf-32.html.ini26
-rw-r--r--tests/wpt/metadata/eventsource/format-field-id-null.htm.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/abort/cache.https.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/abort/general-serviceworker.https.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/abort/general-sharedworker.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/abort/general.any.js.ini11
-rw-r--r--tests/wpt/metadata/fetch/api/abort/serviceworker-intercepted.https.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/basic/integrity-worker.html.ini6
-rw-r--r--tests/wpt/metadata/fetch/api/basic/integrity.html.ini6
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-expose-star-worker.html.ini6
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-expose-star.html.ini3
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-filtering-worker.html.ini2
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-filtering.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-preflight-cache.any.js.ini11
-rw-r--r--tests/wpt/metadata/fetch/api/cors/cors-preflight-star.any.js.ini12
-rw-r--r--tests/wpt/metadata/fetch/api/headers/headers-combine.html.ini6
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-error.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-idl.html.ini6
-rw-r--r--tests/wpt/metadata/fetch/api/request/request-type-attribute-historical.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-cancel-stream.html.ini3
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-idl.html.ini9
-rw-r--r--tests/wpt/metadata/fetch/api/response/response-stream-disturbed-6.html.ini17
-rw-r--r--tests/wpt/metadata/fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html.ini45
-rw-r--r--tests/wpt/metadata/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html.ini15
-rw-r--r--tests/wpt/metadata/fullscreen/interfaces.html.ini6
-rw-r--r--tests/wpt/metadata/hr-time/idlharness.html.ini15
-rw-r--r--tests/wpt/metadata/hr-time/timeOrigin.html.ini11
-rw-r--r--tests/wpt/metadata/hr-time/window-worker-timeOrigin.window.js.ini5
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html.ini3
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html.ini6
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html.ini5
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html.ini5
-rw-r--r--tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html.ini5
-rw-r--r--tests/wpt/metadata/html/browsers/history/the-history-interface/history_properties_only_fully_active.html.ini5
-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/window-indexed-properties.html.ini3
-rw-r--r--tests/wpt/metadata/html/dom/documents/dom-tree-accessors/nameditem-03.html.ini5
-rw-r--r--tests/wpt/metadata/html/dom/historical.html.ini17
-rw-r--r--tests/wpt/metadata/html/dom/interfaces.html.ini3678
-rw-r--r--tests/wpt/metadata/html/dom/reflection-forms.html.ini606
-rw-r--r--tests/wpt/metadata/html/dom/reflection-metadata.html.ini537
-rw-r--r--tests/wpt/metadata/html/dom/reflection-misc.html.ini804
-rw-r--r--tests/wpt/metadata/html/dom/reflection-tabular.html.ini192
-rw-r--r--tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.html.ini9
-rw-r--r--tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html.ini27
-rw-r--r--tests/wpt/metadata/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_media_change.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_type.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_type_change.html.ini11
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html.ini18
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/security.reset.cross.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/security.reset.redirect.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_005.htm.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_023.htm.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_025.htm.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_029.htm.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_031.htm.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/adoption.html.ini27
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html.ini12
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html.ini20
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html.ini26
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html.ini26
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html.ini41
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode.html.ini44
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini11
-rw-r--r--tests/wpt/metadata/html/semantics/embedded-content/the-img-element/usemap-casing.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/form-submission-0/submission-checks.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/forms/textfieldselection/selection-value-interactions.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-button-element/button-checkvalidity.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-button-element/button-setcustomvalidity.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-button-element/button-validationmessage.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-button-element/button-willvalidate.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-form-element/form-checkvalidity.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-form-element/form-elements-filter.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/files.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-checkvalidity.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-setcustomvalidity.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-stepdown.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-stepup.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-validationmessage.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-validity.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-input-element/input-willvalidate.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.html.ini27
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-progress-element/progress.window.js.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html.ini9
-rw-r--r--tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/interfaces.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/035.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/035.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/040.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/040.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/042.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/042.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/043.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/043.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/044.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/044.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/045.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/045.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/054.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/054.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/055.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/055.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/077.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/077.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/079.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/079.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/080.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/083.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/083.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/084.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/084.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/099.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/108.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/108.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/109.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/109.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/116.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/116.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/131.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/131.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/132.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/132.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/133.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/133.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/134.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/134.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/135.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/135.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/136.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/136.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/138.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/138.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/139.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/139.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/140.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/140.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/141.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/141.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/142.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/142.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/143.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/143.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/144.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/144.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/145.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/145.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/146.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/146.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/147.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/147.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/148.html.ini (renamed from tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/148.html.ini)0
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini6
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini3
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini27
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini27
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/selectors/pseudo-classes/checked-type-change.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/selectors/pseudo-classes/indeterminate-type-change.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html.ini8
-rw-r--r--tests/wpt/metadata/html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/selectors/pseudo-classes/required-optional-hidden.html.ini5
-rw-r--r--tests/wpt/metadata/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html.ini3
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/basic.html.ini20
-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-idle-periods.html.ini9
-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-removed-frame.html.ini5
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/callback-suspended.html.ini5
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout-with-raf.html.ini8
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout.html.ini8
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/cancel-invoked.html.ini11
-rw-r--r--tests/wpt/metadata/html/webappapis/idle-callbacks/idlharness.html.ini20
-rw-r--r--tests/wpt/metadata/mozilla-sync4
-rw-r--r--tests/wpt/metadata/navigation-timing/idlharness.html.ini165
-rw-r--r--tests/wpt/metadata/navigation-timing/nav2_idlharness.html.ini3
-rw-r--r--tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/030.html.ini3
-rw-r--r--tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/080.html.ini3
-rw-r--r--tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/099.html.ini3
-rw-r--r--tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/100.html.ini5
-rw-r--r--tests/wpt/metadata/performance-timeline/idlharness.html.ini11
-rw-r--r--tests/wpt/metadata/performance-timeline/po-callback-mutate.any.js.ini11
-rw-r--r--tests/wpt/metadata/performance-timeline/po-disconnect.any.js.ini11
-rw-r--r--tests/wpt/metadata/performance-timeline/po-observe.any.js.ini23
-rw-r--r--tests/wpt/metadata/referrer-policy/generic/link-rel-prefetch.html.ini5
-rw-r--r--tests/wpt/metadata/subresource-integrity/subresource-css-ed25519.tentative.html.ini14
-rw-r--r--tests/wpt/metadata/subresource-integrity/subresource-ed25519-with-csp.tentative.html.ini5
-rw-r--r--tests/wpt/metadata/subresource-integrity/subresource-ed25519.tentative.html.ini14
-rw-r--r--tests/wpt/metadata/uievents/interfaces.html.ini188
-rw-r--r--tests/wpt/metadata/uievents/legacy/Event-subclasses-init.html.ini5
-rw-r--r--tests/wpt/metadata/url/a-element-xhtml.xhtml.ini18
-rw-r--r--tests/wpt/metadata/url/a-element.html.ini18
-rw-r--r--tests/wpt/metadata/url/interfaces.any.js.ini18
-rw-r--r--tests/wpt/metadata/url/url-constructor.html.ini9
-rw-r--r--tests/wpt/metadata/url/url-setters.html.ini6
-rw-r--r--tests/wpt/metadata/url/urlsearchparams-constructor.html.ini3
-rw-r--r--tests/wpt/metadata/url/urlsearchparams-delete.html.ini8
-rw-r--r--tests/wpt/metadata/url/urlsearchparams-sort.html.ini3
-rw-r--r--tests/wpt/metadata/webgl/conformance-1.0.3/conformance/canvas/rapid-resizing.html.ini6
-rw-r--r--tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-creation-and-destruction.html.ini6
-rw-r--r--tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-creation.html.ini6
-rw-r--r--tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-release-upon-reload.html.ini6
-rw-r--r--tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-release-with-workers.html.ini6
-rw-r--r--tests/wpt/metadata/webgl/conformance-1.0.3/conformance/glsl/misc/shader-with-non-reserved-words.html.ini146
-rw-r--r--tests/wpt/metadata/webgl/conformance-1.0.3/conformance/textures/texture-size.html.ini8
-rw-r--r--tests/wpt/metadata/websockets/constructor/010.html.ini11
-rw-r--r--tests/wpt/metadata/websockets/constructor/011.html.ini6
-rw-r--r--tests/wpt/metadata/webstorage/storage_enumerate.html.ini8
-rw-r--r--tests/wpt/metadata/webstorage/storage_session_window_noopener.html.ini5
-rw-r--r--tests/wpt/metadata/workers/WorkerLocation-origin.sub.window.js.ini5
-rw-r--r--tests/wpt/metadata/workers/interfaces.worker.js.ini31
-rw-r--r--tests/wpt/metadata/workers/name-property.html.ini1
-rw-r--r--tests/wpt/metadata/workers/worker-performance.worker.js.ini3
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json4
-rw-r--r--tests/wpt/mozilla/meta/bluetooth/interfaces.html.ini177
-rw-r--r--tests/wpt/mozilla/meta/bluetooth/readValue/characteristic/event-is-fired.html.ini5
-rw-r--r--tests/wpt/mozilla/tests/lint.whitelist1
-rw-r--r--tests/wpt/mozilla/tests/mozilla/htmlfontelement_size_attribute.html6
-rw-r--r--tests/wpt/web-platform-tests/.gitignore1
-rw-r--r--tests/wpt/web-platform-tests/.travis.yml53
-rw-r--r--tests/wpt/web-platform-tests/.well-known/README.md9
-rw-r--r--tests/wpt/web-platform-tests/.well-known/idp-proxy/README.md12
-rw-r--r--tests/wpt/web-platform-tests/.well-known/idp-proxy/mock-idp.js198
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/2x2.pngbin788238 -> 1575 bytes
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/conformance-requirements/2d.missingargs.html1
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/conformance-requirements/2d.voidreturn.html1
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html203
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1.html34
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10.html38
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10_ref.html26
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11.html36
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11_ref.html26
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12.html36
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12_ref.html26
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1_ref.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2.html35
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2_ref.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3.html36
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3_ref.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4.html37
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4_ref.html26
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5.html36
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5_ref.html26
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6.html36
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6_ref.html26
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7.html36
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7_ref.html26
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8.html36
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8_ref.html26
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9.html43
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9_ref.html22
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html268
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1.html30
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10.html34
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_ref.html19
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html32
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11_ref.html19
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12.html32
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12_ref.html32
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13.html38
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13_ref.html20
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14.html33
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14_ref.html25
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15.html33
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15_ref.html25
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_ref.html19
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_ref.html23
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_ref.html23
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4.html32
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_ref.html29
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5.html31
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_ref.html39
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6.html32
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_ref.html25
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7.html32
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_ref.html35
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8.html32
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_ref.html35
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9.html37
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9_ref.html19
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html46
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-drawImage.html2
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-invalid-args.html187
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html44
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/text-styles/2d.text.font.parse.tiny.html28
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/tools/current-work-canvas.xhtml6407
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/tools/gentestutils.py310
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/tools/name2dir.yaml24
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/tools/spec.yaml4
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/tools/specextract.py41
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/tools/tests.yaml6
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml3
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/tools/tests2dtext.yaml8
-rw-r--r--tests/wpt/web-platform-tests/2dcontext/transformations/2d.transformation.setTransform.multiple.html1
-rw-r--r--tests/wpt/web-platform-tests/FileAPI/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/FileAPI/idlharness.html7
-rw-r--r--tests/wpt/web-platform-tests/FileAPI/idlharness.worker.js7
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/idb-binary-key-detached.htm7
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/interfaces.html3
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/interfaces.idl8
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js3
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/keypath-exceptions.htm2
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/large-nested-cloning.html288
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/nested-cloning-common.js211
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/nested-cloning-large-multiple.html54
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/nested-cloning-large.html49
-rw-r--r--tests/wpt/web-platform-tests/IndexedDB/nested-cloning-small.html47
-rw-r--r--tests/wpt/web-platform-tests/README.md97
-rw-r--r--tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.js4
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/current-realm.html7
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js51
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html59
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js32
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js121
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html139
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js120
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html11
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js111
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js3
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html71
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/legacy-platform-object.html191
-rw-r--r--tests/wpt/web-platform-tests/WebIDL/interfaces.html28
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects-async-same-origin.htm71
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects-async.htm89
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects.htm60
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm43
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-access-control-origin-header.htm22
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-async.htm29
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method-async.htm27
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method.htm24
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-header.htm48
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-method.htm48
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-timeout.htm46
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache.htm45
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-star.htm22
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow.htm22
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm32
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-cors-safelisted-response-headers.htm31
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-denied.htm34
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-get-fail-non-simple.htm31
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-non-cors-safelisted-content-type.htm35
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-post-success-no-content-type.htm26
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-post-with-non-cors-safelisted-content-type.htm42
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-preflight-denied.htm31
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-header-denied.htm39
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-method-denied.htm38
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-not-supported.htm37
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-credential-async.htm29
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-credential-sync.htm24
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-headers-async.htm35
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-headers-sync.htm29
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-header-lowercase.htm29
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-header-sorted.htm28
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-headers-origin.htm29
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-301.htm28
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-400.htm28
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-501.htm28
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-must-not-contain-cookie.htm57
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-header-denied.htm39
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-method-denied.htm38
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-not-supported.htm38
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-recursive-failed-request.htm38
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-body-sync.htm25
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-body.htm29
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-exposed-headers.htm38
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-allow-origin-null.htm32
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-allow.htm32
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm43
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-denied.htm41
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/allow-lists-starting-with-comma.htm33
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/data-uri.htm6
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.htm41
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/open-url-worker-origin.htm4
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/overridemimetype-blob.html2
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-allow-lists.py20
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-allow-with-body.py15
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-auth-basic.py17
-rwxr-xr-xtests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow-no-credentials.py6
-rwxr-xr-xtests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow-star.py6
-rwxr-xr-xtests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow.py7
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-cors-safelisted-request-headers.py14
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-denied.py5
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-options-not-supported.py9
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache-invalidation.py47
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache-timeout.py48
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache.py47
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-put-allow.py20
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-whitelist-response-headers.py19
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-cookie.py16
-rwxr-xr-xtests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-origin-header.py9
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-denied.py50
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-header-lowercase.py16
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-header-sorted.py18
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-headers-origin.py12
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-invalid-status.py16
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-must-not-contain-cookie.py12
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-sandboxed-iframe.html24
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/inspect-headers.py8
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/no-custom-header-on-preflight.py27
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/pass.txt (renamed from tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/mmY/index.html)0
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/redirect-cors.py20
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/reset-token.py5
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/responseType-document-in-worker.js9
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/responseXML-unavailable-in-worker.js9
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/resources/win-1252-html.py5
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/responseType-document-in-worker.html13
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/responseXML-unavailable-in-worker.html13
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/responsedocument-decoding.htm39
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/responsetext-decoding.htm103
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/send-content-type-string.htm4
-rw-r--r--tests/wpt/web-platform-tests/XMLHttpRequest/setrequestheader-content-type.htm14
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/Accelerometer.https.html2
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/OWNERS3
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/idlharness.https.html52
-rw-r--r--tests/wpt/web-platform-tests/accelerometer/support-iframe.html10
-rw-r--r--tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor.https.html2
-rw-r--r--tests/wpt/web-platform-tests/ambient-light/OWNERS4
-rw-r--r--tests/wpt/web-platform-tests/ambient-light/idlharness.https.html48
-rw-r--r--tests/wpt/web-platform-tests/ambient-light/support-iframe.html10
-rw-r--r--tests/wpt/web-platform-tests/annotation-protocol/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/app-uri/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/app-uri/README.md13
-rw-r--r--tests/wpt/web-platform-tests/app-uri/appURI_test.html393
-rw-r--r--tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/mmY/sth.txt1
-rw-r--r--tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/{mY}/z...z/index.html1
-rw-r--r--tests/wpt/web-platform-tests/app-uri/resources/ImaGes/{{a}}/Test_1/$a/sth34!.pngbin3059 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/app-uri/resources/ImaGes/~t/{!a}/corrupted_file.pngbin2964 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/app-uri/resources/ImaGes/~t/{!a}/~sth.pngbin3059 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-128.pngbin2447 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-16.pngbin984 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-48.pngbin1453 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/assumptions/ahem-ref.html300
-rw-r--r--tests/wpt/web-platform-tests/assumptions/ahem.html297
-rw-r--r--tests/wpt/web-platform-tests/assumptions/tools/ahem-generate-table.py102
-rw-r--r--tests/wpt/web-platform-tests/audio-output/HTMLMediaElement-sinkId-idl.html50
-rw-r--r--tests/wpt/web-platform-tests/audio-output/setSinkId-manual.https.html132
-rw-r--r--tests/wpt/web-platform-tests/audio-output/setSinkId.https.html45
-rw-r--r--tests/wpt/web-platform-tests/auxclick/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/background-fetch/content-security-policy.https.window.js20
-rw-r--r--tests/wpt/web-platform-tests/background-fetch/credentials-in-url.https.window.js32
-rw-r--r--tests/wpt/web-platform-tests/background-fetch/dangling-markup.https.window.js17
-rw-r--r--tests/wpt/web-platform-tests/background-fetch/interfaces.idl101
-rw-r--r--tests/wpt/web-platform-tests/background-fetch/interfaces.worker.js2
-rw-r--r--tests/wpt/web-platform-tests/background-fetch/mixed-content-and-allowed-schemes.https.window.js80
-rw-r--r--tests/wpt/web-platform-tests/background-fetch/port-blocking.https.window.js35
-rw-r--r--tests/wpt/web-platform-tests/background-fetch/resources/sw.js1
-rw-r--r--tests/wpt/web-platform-tests/background-fetch/resources/utils.js26
-rw-r--r--tests/wpt/web-platform-tests/battery-status/battery-interface-idlharness.https.html1
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-basic-blob.html18
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-basic-blobMax.html18
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-basic-buffersource.html18
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-basic-buffersourceMax.html18
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-basic-formdata.html18
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-basic-formdataMax.html18
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-basic-string.html18
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-basic-stringMax.html18
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-common.sub.js354
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-cors.sub.window.js41
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-error.window.js39
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-navigate.html19
-rw-r--r--tests/wpt/web-platform-tests/beacon/beacon-redirect.window.js25
-rw-r--r--tests/wpt/web-platform-tests/beacon/headers/header-content-type.html37
-rw-r--r--tests/wpt/web-platform-tests/beacon/navigate.iFrame.sub.html45
-rw-r--r--tests/wpt/web-platform-tests/beacon/resources/beacon.py112
-rw-r--r--tests/wpt/web-platform-tests/check_stability.ini1
-rw-r--r--tests/wpt/web-platform-tests/check_stability.py997
-rw-r--r--tests/wpt/web-platform-tests/ci_built_diff.sh17
-rw-r--r--tests/wpt/web-platform-tests/ci_lint.sh4
-rw-r--r--tests/wpt/web-platform-tests/ci_stability.sh58
-rwxr-xr-xtests/wpt/web-platform-tests/ci_unittest.sh27
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/navigation-insecure.html52
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/navigation.html66
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/navigation.https.html59
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/resource.html74
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/storage.https.html53
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/support/echo-clear-site-data.py4
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/support/page_with_resource.sub.html27
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/support/send_report.html24
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/support/service_worker.js1
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/support/test_utils.js89
-rw-r--r--tests/wpt/web-platform-tests/clear-site-data/support/test_utils.sub.js277
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/OWNERS (renamed from tests/wpt/web-platform-tests/clipboard/OWNERS)0
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-interfaces.https.html34
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-basics.https.html69
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-write-dttext-read-dttext-manual.https.html30
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-write-dttext-read-text-manual.https.html27
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-dttext-manual.https.html27
-rw-r--r--tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-text-manual.https.html24
-rw-r--r--tests/wpt/web-platform-tests/common/PrefixedLocalStorage.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/PrefixedPostMessage.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/canvas-frame.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/canvas-index.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/canvas-spec.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/canvas-tests.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/canvas-tests.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/css-paint-tests.js4
-rw-r--r--tests/wpt/web-platform-tests/common/css-paint-tests.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/get-host-info.sub.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/media.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/object-association.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/performance-timeline-utils.js6
-rw-r--r--tests/wpt/web-platform-tests/common/performance-timeline-utils.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/reftest-wait.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/stringifiers.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/test-setting-immutable-prototype.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/utils.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/common/vendor-prefix.js115
-rw-r--r--tests/wpt/web-platform-tests/common/vendor-prefix.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/compat/OWNERS3
-rw-r--r--tests/wpt/web-platform-tests/compat/green-ref.html6
-rw-r--r--tests/wpt/web-platform-tests/compat/historical.html18
-rw-r--r--tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-bottom.html22
-rw-r--r--tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-left.html22
-rw-r--r--tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-right.html22
-rw-r--r--tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-top.html22
-rw-r--r--tests/wpt/web-platform-tests/config.default.json6
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/html/elements/picture/srcset-microsyntax-leading-dot-x-valid.html (renamed from tests/wpt/web-platform-tests/conformance-checkers/html/elements/picture/srcset-microsyntax-leading-dot-x-novalid.html)0
-rw-r--r--tests/wpt/web-platform-tests/conformance-checkers/messages.json292
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/manifest-src-allowed.sub.html9
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/manifest-src-blocked.sub.html9
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html41
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html.sub.headers6
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive.sub.html41
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive.sub.html.sub.headers6
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html41
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html.sub.headers6
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code.sub.html41
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code.sub.html.sub.headers6
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/blink-contrib/resources/go-to-echo-report.js5
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/connect-src/connect-src-beacon-blocked.sub.html11
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/font-src/font-match-allowed.sub.html2
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/font-src/font-mismatch-blocked.sub.html2
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/font-src/font-none-blocked.sub.html2
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/font-src/font-self-allowed.html2
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/inheritance/iframe.html84
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/inheritance/window.html66
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/navigation/javascript-url-navigation-inherits-csp.html16
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/navigation/support/test_csp_self_window.sub.html8
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/navigation/support/test_csp_self_window.sub.html.sub.headers6
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/javascript-window-open-blocked.html22
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/javascript-window-open-blocked.html.sub.headers6
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html28
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers7
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html28
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html.sub.headers7
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html23
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html.sub.headers7
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html33
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html.sub.headers7
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_worker-importScripts.https.html18
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/script-sample-no-opt-in.html17
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/script-sample.html39
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html19
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers7
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/Ahem.ttfbin12480 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/fonts.css2
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/support/import-scripts.js3
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_allowed.html22
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_matching_hash_no_unsafe_inline_attribute.html26
-rw-r--r--tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_not_matching_hash.html25
-rw-r--r--tests/wpt/web-platform-tests/cookies/secure/set-from-dom.sub.html47
-rw-r--r--tests/wpt/web-platform-tests/cookies/secure/set-from-http.sub.html36
-rw-r--r--tests/wpt/web-platform-tests/core-aam/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/core-aam/README.md59
-rw-r--r--tests/wpt/web-platform-tests/core-aam/alert-manual.html95
-rw-r--r--tests/wpt/web-platform-tests/core-aam/alertdialog-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/application-manual.html89
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-atomic_false-manual.html85
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-atomic_true-manual.html120
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-autocomplete_both-manual.html69
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-autocomplete_inline-manual.html69
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-autocomplete_list-manual.html69
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-busy_false-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-busy_true-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-busy_value_changes-manual.html136
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-checked_false_on_checkbox-manual.html85
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-checked_false_on_menuitemradio-manual.html99
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-checked_mixed-manual.html91
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-checked_true_on_checkbox-manual.html85
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-checked_true_on_menuitemradio-manual.html99
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-checked_value_changes-manual.html136
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-colcount_new-manual.html96
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-colindex_new-manual.html87
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-colspan_new-manual.html87
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-controls-manual.html99
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-current_value_changes-manual.html123
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-current_with_non-false_allowed_value_new-manual.html77
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-current_with_unrecognized_value_new-manual.html77
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-describedby-manual.html113
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-details_new-manual.html87
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-disabled_false-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-disabled_true-manual.html88
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-disabled_value_changes-manual.html80
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-dropeffect_copy-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-dropeffect_execute-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-dropeffect_link-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-dropeffect_move-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-dropeffect_none-manual.html55
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-dropeffect_popup-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-dropeffect_value_changes-manual.html62
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-errormessage-manual.html95
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-expanded_false-manual.html77
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-expanded_true-manual.html77
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-expanded_value_changes-manual.html150
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-flowto-manual.html95
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-grabbed_false-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-grabbed_true-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-grabbed_value_changes-manual.html70
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-haspopup_dialog_new-manual.html91
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-haspopup_false-manual.html55
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-haspopup_listbox_new-manual.html91
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-haspopup_menu_new-manual.html91
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-haspopup_tree_new-manual.html91
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-haspopup_true-manual.html91
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-hidden_true-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-hidden_true_when_element_is_focused_or_fires_event_new-manual.html97
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-hidden_value_changes-manual.html124
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-invalid_false-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-invalid_grammar-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-invalid_spelling-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-invalid_true-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-invalid_value_changes-manual.html120
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-invalid_with_unrecognized_value_new-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts_new-manual.html63
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-label-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-labelledby-manual.html119
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-level_on_heading-manual.html77
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-level_on_non-heading-manual.html79
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-live_assertive-manual.html108
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-live_off-manual.html108
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-live_polite-manual.html108
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-modal_false_new-manual.html79
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-modal_true_new-manual.html79
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-multiline_false-manual.html67
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-multiline_true-manual.html75
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-multiselectable_false-manual.html65
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-multiselectable_true-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-orientation_horizontal-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-orientation_undefined_new-manual.html61
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-orientation_vertical-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-owns_may_need_manual_verification-manual.html141
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-placeholder_new-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-posinset-manual.html79
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-pressed_false-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-pressed_mixed-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-pressed_true-manual.html85
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-pressed_value_changes-manual.html104
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-readonly_false-manual.html79
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-readonly_is_unspecified_on_gridcell_new-manual.html81
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_checkbox-manual.html77
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_radiogroup-manual.html88
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_textbox-manual.html77
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-readonly_value_changes-manual.html104
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-relevant-manual.html108
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-required_true-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-required_value_changes-manual.html104
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-roledescription_is_empty_or_whitespace_characters_new-manual.html55
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-roledescription_new-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-rowcount_new-manual.html96
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-rowindex_new-manual.html96
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-rowspan_new-manual.html87
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-selected_false-manual.html87
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-selected_true-manual.html87
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-setsize_-1_new-manual.html80
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-setsize_3-manual.html80
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-sort_ascending-manual.html81
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-sort_descending-manual.html81
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-sort_none-manual.html59
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-sort_other-manual.html81
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-valuemax-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-valuemin-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-valuenow-manual.html77
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-valuenow_value_changes-manual.html78
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-valuetext-manual.html77
-rw-r--r--tests/wpt/web-platform-tests/core-aam/aria-valuetext_value_changes-manual.html70
-rw-r--r--tests/wpt/web-platform-tests/core-aam/article-manual.html109
-rw-r--r--tests/wpt/web-platform-tests/core-aam/banner-manual.html113
-rw-r--r--tests/wpt/web-platform-tests/core-aam/button_with_aria-haspopup_dialog_new-manual.html89
-rw-r--r--tests/wpt/web-platform-tests/core-aam/button_with_aria-haspopup_true-manual.html89
-rw-r--r--tests/wpt/web-platform-tests/core-aam/button_with_default_values_for_aria-pressed_and_aria-haspopup-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/button_with_defined_value_for_aria-pressed-manual.html91
-rw-r--r--tests/wpt/web-platform-tests/core-aam/cell_new-manual.html113
-rw-r--r--tests/wpt/web-platform-tests/core-aam/checkbox-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/columnheader-manual.html101
-rw-r--r--tests/wpt/web-platform-tests/core-aam/combobox-manual.html111
-rw-r--r--tests/wpt/web-platform-tests/core-aam/complementary-manual.html113
-rw-r--r--tests/wpt/web-platform-tests/core-aam/contentinfo-manual.html113
-rw-r--r--tests/wpt/web-platform-tests/core-aam/definition-manual.html95
-rw-r--r--tests/wpt/web-platform-tests/core-aam/dialog-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/directory-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/document-manual.html91
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_css_display_none-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_css_visibility_hidden-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_html5_hidden-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_button-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_checkbox_new-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_img-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_math-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_menuitemcheckbox_new-manual.html75
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_menuitemradio_new-manual.html75
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_option_new-manual.html75
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_progressbar-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_radio_new-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_scrollbar-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_separator-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_slider-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_switch_new-manual.html73
-rw-r--r--tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_tab_new-manual.html75
-rw-r--r--tests/wpt/web-platform-tests/core-aam/feed_new-manual.html105
-rw-r--r--tests/wpt/web-platform-tests/core-aam/figure_new-manual.html103
-rw-r--r--tests/wpt/web-platform-tests/core-aam/form-manual.html107
-rw-r--r--tests/wpt/web-platform-tests/core-aam/grid-manual.html164
-rw-r--r--tests/wpt/web-platform-tests/core-aam/gridcell-manual.html119
-rw-r--r--tests/wpt/web-platform-tests/core-aam/group-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/heading-manual.html95
-rw-r--r--tests/wpt/web-platform-tests/core-aam/img-manual.html97
-rw-r--r--tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-controls-manual.html72
-rw-r--r--tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-describedby-manual.html72
-rw-r--r--tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-details_new-manual.html72
-rw-r--r--tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-errormessage_new-manual.html72
-rw-r--r--tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-flowto-manual.html72
-rw-r--r--tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-labelledby-manual.html72
-rw-r--r--tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-owns-manual.html72
-rw-r--r--tests/wpt/web-platform-tests/core-aam/include_element_that_is_focusable-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/include_element_with_id_inside_element_with_aria-activedescendant-manual.html74
-rw-r--r--tests/wpt/web-platform-tests/core-aam/link-manual.html115
-rw-r--r--tests/wpt/web-platform-tests/core-aam/list-manual.html93
-rw-r--r--tests/wpt/web-platform-tests/core-aam/listbox_not_owned_by_or_child_of_combobox-manual.html111
-rw-r--r--tests/wpt/web-platform-tests/core-aam/listbox_owned_by_or_child_of_combobox-manual.html114
-rw-r--r--tests/wpt/web-platform-tests/core-aam/listitem-manual.html105
-rw-r--r--tests/wpt/web-platform-tests/core-aam/log-manual.html137
-rw-r--r--tests/wpt/web-platform-tests/core-aam/main-manual.html107
-rw-r--r--tests/wpt/web-platform-tests/core-aam/marquee-manual.html127
-rw-r--r--tests/wpt/web-platform-tests/core-aam/math-manual.html89
-rw-r--r--tests/wpt/web-platform-tests/core-aam/menu-manual.html105
-rw-r--r--tests/wpt/web-platform-tests/core-aam/menu_child_of_menu_item-manual.html109
-rw-r--r--tests/wpt/web-platform-tests/core-aam/menubar-manual.html105
-rw-r--r--tests/wpt/web-platform-tests/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html85
-rw-r--r--tests/wpt/web-platform-tests/core-aam/menuitem_owned_by_or_child_of_group-manual.html88
-rw-r--r--tests/wpt/web-platform-tests/core-aam/menuitemcheckbox-manual.html99
-rw-r--r--tests/wpt/web-platform-tests/core-aam/menuitemradio-manual.html105
-rw-r--r--tests/wpt/web-platform-tests/core-aam/navigation-manual.html107
-rw-r--r--tests/wpt/web-platform-tests/core-aam/none_new-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/none_used_on_element_that_is_focused_or_fires_event-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/none_used_on_table_element_with_td_children_new-manual.html85
-rw-r--r--tests/wpt/web-platform-tests/core-aam/none_used_on_ul_element_with_li_children_new-manual.html86
-rw-r--r--tests/wpt/web-platform-tests/core-aam/note-manual.html89
-rw-r--r--tests/wpt/web-platform-tests/core-aam/option_inside_combobox-manual.html94
-rw-r--r--tests/wpt/web-platform-tests/core-aam/option_not_inside_combobox-manual.html91
-rw-r--r--tests/wpt/web-platform-tests/core-aam/presentation-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/presentation_used_on_element_that_is_focused_or_fires_event-manual.html71
-rw-r--r--tests/wpt/web-platform-tests/core-aam/presentation_used_on_table_element_with_td_children_new-manual.html85
-rw-r--r--tests/wpt/web-platform-tests/core-aam/presentation_used_on_ul_element_with_li_children_new-manual.html86
-rw-r--r--tests/wpt/web-platform-tests/core-aam/progressbar-manual.html109
-rw-r--r--tests/wpt/web-platform-tests/core-aam/radio-manual.html95
-rw-r--r--tests/wpt/web-platform-tests/core-aam/radiogroup-manual.html85
-rw-r--r--tests/wpt/web-platform-tests/core-aam/region_with_an_accessible_name_new-manual.html113
-rw-r--r--tests/wpt/web-platform-tests/core-aam/region_without_an_accessible_name_new-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/row_inside_treegrid-manual.html99
-rw-r--r--tests/wpt/web-platform-tests/core-aam/row_not_inside_treegrid-manual.html99
-rw-r--r--tests/wpt/web-platform-tests/core-aam/rowgroup-manual.html80
-rw-r--r--tests/wpt/web-platform-tests/core-aam/rowheader-manual.html101
-rw-r--r--tests/wpt/web-platform-tests/core-aam/scrollbar-manual.html103
-rw-r--r--tests/wpt/web-platform-tests/core-aam/search-manual.html107
-rw-r--r--tests/wpt/web-platform-tests/core-aam/searchbox_new-manual.html109
-rw-r--r--tests/wpt/web-platform-tests/core-aam/separator_focusable_new-manual.html103
-rw-r--r--tests/wpt/web-platform-tests/core-aam/separator_non-focusable-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/slider-manual.html103
-rw-r--r--tests/wpt/web-platform-tests/core-aam/spinbutton-manual.html103
-rw-r--r--tests/wpt/web-platform-tests/core-aam/status-manual.html133
-rw-r--r--tests/wpt/web-platform-tests/core-aam/switch_new-manual.html115
-rw-r--r--tests/wpt/web-platform-tests/core-aam/tab-manual.html85
-rw-r--r--tests/wpt/web-platform-tests/core-aam/table_new-manual.html152
-rw-r--r--tests/wpt/web-platform-tests/core-aam/tablist-manual.html147
-rw-r--r--tests/wpt/web-platform-tests/core-aam/tabpanel-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/term_new-manual.html95
-rw-r--r--tests/wpt/web-platform-tests/core-aam/textbox_when_aria-multiline_is_false-manual.html103
-rw-r--r--tests/wpt/web-platform-tests/core-aam/textbox_when_aria-multiline_is_true-manual.html103
-rw-r--r--tests/wpt/web-platform-tests/core-aam/timer-manual.html131
-rw-r--r--tests/wpt/web-platform-tests/core-aam/toolbar-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/tooltip-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/core-aam/tree-manual.html105
-rw-r--r--tests/wpt/web-platform-tests/core-aam/treegrid-manual.html119
-rw-r--r--tests/wpt/web-platform-tests/core-aam/treeitem-manual.html85
-rw-r--r--tests/wpt/web-platform-tests/credential-management/credentialscontainer-create-basics.https.html59
-rw-r--r--tests/wpt/web-platform-tests/credential-management/idl.https.html1
-rw-r--r--tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-ref.html19
-rw-r--r--tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-repaint-ref.html6
-rw-r--r--tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-repaint.html35
-rw-r--r--tests/wpt/web-platform-tests/css-backgrounds/background-clip-color.html60
-rw-r--r--tests/wpt/web-platform-tests/css-cascade/inherit-initial.html36
-rw-r--r--tests/wpt/web-platform-tests/css-font-display/font-display.html72
-rw-r--r--tests/wpt/web-platform-tests/css-font-display/resources/slow-ahem-loading.py16
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/font-display/font-display-ref.html (renamed from tests/wpt/web-platform-tests/css-font-display/font-display-ref.html)0
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/font-display/font-display.html72
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/matching/OWNERS4
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/matching/README.md50
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/matching/fixed-stretch-style-over-weight-ref.html27
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/matching/fixed-stretch-style-over-weight.html38
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/matching/font-matching.css59
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/matching/resources/variabletest_matching.ttfbin0 -> 4552 bytes
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/matching/stretch-distance-over-weight-distance-ref.html27
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/matching/stretch-distance-over-weight-distance.html62
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/matching/style-ranges-over-weight-direction-ref.html27
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/matching/style-ranges-over-weight-direction.html64
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/variations/OWNERS4
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/variations/font-parse-numeric-stretch-style-weight.html144
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/variations/resources/variabletest_box.ttfbin0 -> 3820 bytes
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/variations/variable-box-font-ref.html20
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/variations/variable-box-font.html31
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/variations/variable-gpos-m2b-ref.html21
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/variations/variable-gpos-m2b.html45
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/variations/variable-gsub-ref.html21
-rw-r--r--tests/wpt/web-platform-tests/css-fonts/variations/variable-gsub.html34
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/background-image-alpha.html4
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/background-image-tiled-ref.html5
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/background-image-tiled.html5
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-001-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-001.html34
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-002-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-002.html34
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-001-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-001.html36
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-002-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-002.html35
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-003-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-003.html35
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-001-ref.html23
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-001.html40
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-002-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-002.html40
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-003-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-003.html40
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-004-ref.html23
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-004.html41
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/hidpi/device-pixel-ratio-ref.html24
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/hidpi/device-pixel-ratio.html39
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/paint-arguments.html2
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/paint-function-arguments.html2
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-001.html48
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-002.html48
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-003.html48
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-004.html49
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-005.html45
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-006.html44
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-007.html48
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-008.html48
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-009.html46
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-010.html46
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-011.html44
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-012.html48
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-013.html44
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-014.html46
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-015.html49
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-016.html48
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-017.html47
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-018-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-018.html59
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-019.html47
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-020.html46
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-021.html49
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-022.html47
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/registered-properties-in-custom-paint.html62
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/style-background-image-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/style-background-image.html62
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/style-before-pseudo-ref.html33
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/style-before-pseudo.html63
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/style-first-letter-pseudo-ref.html30
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/style-first-letter-pseudo.html57
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/valid-image-after-load.html6
-rw-r--r--tests/wpt/web-platform-tests/css-paint-api/valid-image-before-load.html6
-rw-r--r--tests/wpt/web-platform-tests/css-scoping/slotted-parsing.html57
-rw-r--r--tests/wpt/web-platform-tests/css-scoping/slotted-with-pseudo-element-ref.html7
-rw-r--r--tests/wpt/web-platform-tests/css-scoping/slotted-with-pseudo-element.html22
-rw-r--r--tests/wpt/web-platform-tests/css-values/unset-value-storage.html23
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-002.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-004.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-006.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-007.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-008.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-009.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-010.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-011.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-012.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-004.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-006.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-007.xht2
-rwxr-xr-xtests/wpt/web-platform-tests/css/CSS2/cascade/at-import-008.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-004.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-006.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-007.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-008.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009a.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009b.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-010.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-011.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-012.xht2
-rwxr-xr-xtests/wpt/web-platform-tests/css/CSS2/cascade/cascade-precedence-001.xht4
-rwxr-xr-xtests/wpt/web-platform-tests/css/CSS2/cascade/cascade-precedence-002.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/default-stylesheet-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-004.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-006.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-007.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-008.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-009.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-010.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-011.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-012.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-013.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-014.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-015.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-017.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-018.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-019.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-020.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-021.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-022.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-023.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-024.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-025.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-027.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-028.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-029.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/inherited-value-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/inherited-value-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/non-inherited-value-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/sort-by-order-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-004.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-006.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-007.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-008.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-009.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-011.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-012.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-013.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-004.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-006.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-007.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-008.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-009.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-010.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-011.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-012.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-013.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-014.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-015.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-016.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-017.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-018.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/css1/c11-import-000.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/css1/c13-inh-underlin-000.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/css1/c13-inheritance-000.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/css1/c21-pseu-cls-000.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/css1/c21-pseu-id-000.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/css1/c31-important-000.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/css1/c32-cascading-000.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/css1/c548-ln-ht-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/css1/c548-ln-ht-004.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/css1/c64-uri-000.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/i18n/OWNERS1
-rwxr-xr-xtests/wpt/web-platform-tests/css/CSS2/lists/list-style-019.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/lists/list-style-021.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/margin-em-inherit-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/margin-percentage-inherit-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/padding-em-inherit-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/padding-percentage-inherit-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/normal-flow/height-inherit-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/absolute-replaced-width-013.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/absolute-replaced-width-027-ref.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-004.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005a.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005b.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/left-offset-percentage-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/positioning/top-offset-percentage-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-001-ref.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-001.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-002.xht8
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-003.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-001.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-002.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-003.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-004.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-006.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-007.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-008.xht3
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-009.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/signed-numbers-001.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/syntax/signed-numbers-002.xht1
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/reference/table-anonymous-border-spacing-ref.xht16
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/reference/table-anonymous-text-indent-ref.xht16
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/table-anonymous-border-spacing.xht26
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/tables/table-anonymous-text-indent.xht26
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/visuren/top-114.xht2
-rwxr-xr-xtests/wpt/web-platform-tests/css/build-css-testsuites.sh78
-rw-r--r--tests/wpt/web-platform-tests/css/css-align-3/default-alignment/justify-items-legacy-001.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds-3/background-clip-content-box-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-backgrounds-3/reference/background-clip-content-box-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-counter-styles-3/i18n/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/css/css-counter-styles-3/i18n/css3-counter-styles-070.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/auto-margins-001-ref.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/auto-margins-001.html53
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/negative-margins-001.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-001.html151
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-002-ref.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-002.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-widths-001-ref.html40
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-widths-001.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-001.html709
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-002.html160
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-003.html96
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-004.html44
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-005-ref.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-005.html66
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/whitespace-in-flexitem-001-ref.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-flexbox-1/whitespace-in-flexitem-001.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts-3/support/fonts/Unnamed Med/FontFeatureTest.ttfbin7172 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts-3/support/fonts/Unnamed Med/Unnamed-Medium.ttfbin7172 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-fonts-3/test_datafont_same_origin.html43
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001-ref.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-definite-sizes-001.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-grid-container-containing-block-001.html352
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-grid-container-parent-001.html114
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-item-absolute-positioning-dynamic-001.html45
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-paint-positioned-children-001-ref.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-paint-positioned-children-001.html40
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-children-writing-modes-001-ref.html81
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-children-writing-modes-001.html105
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-item-dynamic-change-001.html53
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-001-ref.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-001.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-rtl-001-ref.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-rtl-001.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-content-alignment-001.html403
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-content-alignment-rtl-001.html403
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-gaps-001.html309
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-gaps-rtl-001.html309
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-implicit-grid-001.html87
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-implicit-grid-line-001.html96
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-padding-001.html251
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-unknown-named-grid-line-001.html77
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-within-grid-implicit-track-001.html193
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-sizing-positioned-items-001.html200
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-should-not-create-implicit-tracks-001.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-should-not-take-up-space-001.html190
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-sizing-001-ref.html67
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-sizing-001.html74
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-001.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-002.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-003.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-004.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-005.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-006.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-007.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-008.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-009.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-010.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-011.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-012.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-013.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-014.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-015.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-016.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-017.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-019.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-020.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-021.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-022.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-023.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-024.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-025.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-001.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-002.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-003.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-004.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-005.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-006.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-007.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-008.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-009.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-010.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-011.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-012.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-013.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-014.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-015.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-016.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-017.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-018.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-019.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-020.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-021.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-022.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-023.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-024.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-fit-content-tracks-dont-stretch-001.html208
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-002.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-003.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-004.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-009.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-010.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-011.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-012.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-005.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-006.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-007.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-008.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-013.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-014.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-015.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-016.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-005.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-006.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-007.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-008.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-013.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-014.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-015.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-016.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html55
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-002.html56
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-003.html57
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html53
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html54
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-006.html54
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-007.html58
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-008.html61
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-009.html59
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-010.html57
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-011.html59
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-012.html57
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/grid-definition/grid-shorthand-001.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-006.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-007.html10
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-008.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-009.html9
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-021.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/100x50-green.pngbin15130 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/25x50-green.pngbin0 -> 99 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/50x100-green.pngbin15180 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/50x25-green.pngbin0 -> 100 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/implicit-grids/grid-support-grid-auto-columns-rows-002.html59
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/placement/grid-placement-using-named-grid-lines-001.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/reference/grid-support-grid-auto-columns-rows-002-ref.html67
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/support/grid-alignment.css240
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/support/grid.css277
-rw-r--r--tests/wpt/web-platform-tests/css/css-grid-1/support/style-change.js5
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical-1/OWNERS (renamed from tests/wpt/web-platform-tests/css/css-logical-properties-1/OWNERS)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical-1/cascading-001-ref.html (renamed from tests/wpt/web-platform-tests/css/css-logical-props-1/cascading-001-ref.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical-1/cascading-001.html (renamed from tests/wpt/web-platform-tests/css/css-logical-props-1/cascading-001.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-block-size-vlr.html (renamed from tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-block-size-vlr.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-block-size.html (renamed from tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-block-size.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-inline-size-vlr.html (renamed from tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-inline-size-vlr.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-inline-size.html (renamed from tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-inline-size.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-quirklength.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical-1/resources/style-check.js (renamed from tests/wpt/web-platform-tests/css/css-logical-properties-1/resources/style-check.js)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-quirklength.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-masking-1/clip-path-svg-content/clip-path-precision-001.svg2
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-001-ref.xht33
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-001.xht49
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-002-ref.xht54
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-002.xht51
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-001-ref.xht33
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-001.xht48
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-002-ref.xht54
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-002.xht50
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-clip-001.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-003-ref.xht6
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-003.xht10
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-005.xht8
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-gap-001-ref.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-gap-large-001.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-rule-shorthand-2-ref.xht49
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-rule-shorthand-2.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-multicol-1/multicol-width-small-001.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/css-page-3/page-size-001.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-flexbox-ref.html63
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-flexbox.html80
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-get-bounding-client-rect.html63
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-grid-ref.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-grid.html93
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inflow-position-ref.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inflow-position.html46
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inline-ref.html68
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inline.html104
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-input-box-gets-focused-after-scroll.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-margins-ref.html63
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-margins.html92
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-bottom-ref.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-bottom.html135
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-inline-ref.html73
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-inline.html114
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-left-ref.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-left.html141
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-right-ref.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-right.html149
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-table-ref.html66
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-table.html131
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-top-ref.html83
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-top.html128
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-offset-top-left.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-overflow-padding-ref.html69
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-overflow-padding.html106
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-root-scroller-ref.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-root-scroller.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-stacking-context-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-stacking-context.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-ref.html81
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-translate-ref.html67
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-translate.html92
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms.html101
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-writing-modes-ref.html57
-rw-r--r--tests/wpt/web-platform-tests/css/css-position-3/position-sticky-writing-modes.html68
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo-4/marker-and-other-pseudo-elements-ref.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo-4/marker-and-other-pseudo-elements.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo-4/marker-color-ref.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo-4/marker-color.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo-4/marker-font-properties-ref.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo-4/marker-font-properties.html29
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo-4/marker-inherit-values-ref.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-pseudo-4/marker-inherit-values.html40
-rw-r--r--tests/wpt/web-platform-tests/css/css-ruby-1/line-break-around-ruby-001.html3
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/basic-shape-circle-ellipse-serialization.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-002.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-003.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-002.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-003.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-004.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-005.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-box-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-002.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-003.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-004.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-005.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-006.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-007.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-008.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-009.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-010.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-011.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-000.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-002.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-003.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-004.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-005.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-006.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-007.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-008.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-009.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-010.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-011.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-002.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-003.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-004.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-005.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-006.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-007.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-008.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-009.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-002.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-003.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-004.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-005.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-006.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-box-pair-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-inherit-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-initial-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-none-000.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-notation-000.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/support/parsing-utils.js45
-rw-r--r--tests/wpt/web-platform-tests/css/css-shapes-1/spec-examples/shape-outside-012.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-1.html96
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-2.html96
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-3.html86
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/caption-side-1.html42
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-1.html90
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-2.html84
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-calc-width-001.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-excess-width-distribution-001.html43
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/computing-row-measure-0.html71
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/computing-row-measure-1.html94
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/percentage-sizing-of-table-cell-children.html199
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/html-to-css-mapping-1.html63
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/html-to-css-mapping-2.html226
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-1.html98
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-2.html150
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-3.html106
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-fixed-layout-1.html44
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/support/base.css21
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/support/check-layout-th.js190
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/table-model-fixup-2.html464
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/table-model-fixup.html125
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/tools/markup-generator.html200
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-001.html101
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-002.html110
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-003.html114
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-004-dynamic.html81
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-005.html55
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-001.html62
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-002.html62
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-003-ref.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-003.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-crash.html43
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-non-rowcol-001.html110
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-001.html80
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-002-dynamic.html89
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-003-dynamic.html89
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-group-001.html124
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-group-002.html107
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowcol-001.html71
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowcol-002.html57
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-001.html69
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-002-border-separate.html107
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-002.html107
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-003-border-separate.html104
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-003.html104
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-004-dynamic.html176
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-005-ref.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-005.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-crash.html31
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-col-001.html107
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-nested-001.html140
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-nested-002.html106
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-row-001.html92
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-row-002.html92
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-column-measure-0.html76
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-column-measure-1.html92
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-table-width-0.html39
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-table-width-1.html51
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-1.html61
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-2.html61
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-guess.html61
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-percent-guess.html64
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.1.html51
-rw-r--r--tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.html51
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/i18n/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-break/line-break-anywhere-001.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-break/line-break-anywhere-002.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-break/reference/line-break-anywhere-001-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-002.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-003.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-004.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-005.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-006.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-007.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-008.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-009.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-010.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-011.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-002.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-003.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-001.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-002.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-003.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-004.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-005.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-006.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-007.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-008.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-009.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-010.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-011.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-012.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-013.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-014.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/reference/pre-wrap-001-ref.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-001.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-002.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-003.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-004.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-005.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-006.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-007.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-008.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-009.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-010.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-011.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-012.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-013.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-014.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms-2/animation/resources/interpolation-testcommon.js54
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms-2/animation/rotate-interpolation.html68
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms-2/animation/scale-interpolation.html68
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms-2/animation/translate-interpolation.html78
-rw-r--r--tests/wpt/web-platform-tests/css/css-transforms-2/transforms-support-calc.html69
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions-1/events-001.html356
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions-1/events-002.html181
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions-1/events-003.html173
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions-1/events-004.html207
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions-1/events-005.html191
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions-1/events-006.html189
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions-1/events-007.html98
-rw-r--r--tests/wpt/web-platform-tests/css/css-transitions-1/support/helper.js103
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/box-sizing-026.html1
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/caret-color-020.html9
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/cursor-auto-005.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/cursor-image-005-nfs.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-001.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-002.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-003.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-004.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-005.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-1.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-2.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-3.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-4.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-002.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-003.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-004.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-005.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-006.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-000.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-002.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-003.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-004.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-005.html48
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-006.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-007.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-008.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-009.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-010.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-011.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-012.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-013.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-014.html29
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-015.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-down-016.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-000.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-002.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-003.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-004.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-005.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-006.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-007.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-008.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-009.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-010.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-011.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-012.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-013.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-014.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-015.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-left-016.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-000.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-002.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-003.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-004.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-005.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-006.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-007.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-008.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-009.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-010.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-011.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-012.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-013.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-014.html31
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-015.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-right-016.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-000.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-002.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-003.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-004.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-005.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-006.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-007.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-008.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-009.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-010.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-011.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-012.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-013.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-014.html29
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-015.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/nav-up-016.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-006-ref.html13
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-008-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-012-ref.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-013-ref.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-016-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-021-ref.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-022-ref.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-008.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-009.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-010.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-011.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-012.html14
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-013.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-014.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-015.html54
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-016.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-017.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-018.html52
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-019.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-020.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/resize-021.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/support/1x1-red.png (renamed from tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-red.png)bin135 -> 135 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/support/orange.pngbin0 -> 1851 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/support/orange.svg4
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/support/test.mp4bin0 -> 187227 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/support/test.ogvbin0 -> 287648 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/support/test.webmbin0 -> 190970 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-006.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-007.html33
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-008.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-009.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-010.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-011.html32
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-012.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-013.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-014.html40
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-015.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-016.html45
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-017.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-018.html30
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-019.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-020.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-021.html29
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-022.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-023.html35
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-001.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-002.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-003.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-004.html34
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-005.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-1.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-2.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-3.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-4.html21
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-002.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-003.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-004.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-005.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-006.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-000.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-002.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-003.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-004.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-005.html48
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-006.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-007.html38
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-008.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-009.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-010.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-011.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-012.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-013.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-014.html29
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-015.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-down-016.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-000.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-002.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-003.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-004.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-005.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-006.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-007.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-008.html20
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-009.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-010.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-011.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-012.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-013.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-014.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-015.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-left-016.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-000.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-002.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-003.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-004.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-005.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-006.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-007.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-008.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-009.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-010.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-011.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-012.html18
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-013.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-014.html31
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-015.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-right-016.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-000.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-002.html27
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-003.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-004.html41
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-005.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-006.html47
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-007.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-008.html23
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-009.html25
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-010.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-011.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-012.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-013.html16
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-014.html29
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-015.html37
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/nav-up-016.html28
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-001-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-001-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-002-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-002-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-003-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-003-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-004-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-004-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-005-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-005-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-009-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-009-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-010-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-010-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-011-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-011-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-012-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-012-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-013-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-013-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-009-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-009-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-010-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-010-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-011-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-011-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-012-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-012-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-013-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-013-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-009-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-009-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-010-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-010-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-011-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-011-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-012-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-012-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-013-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-013-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-009-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-009-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-010-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-010-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-011-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-011-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-012-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-012-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-013-frame.html (renamed from tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-013-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/css/css-values-3/absolute-length-units-001.html43
-rw-r--r--tests/wpt/web-platform-tests/css/css-values-3/attr-invalid-type-003.html46
-rw-r--r--tests/wpt/web-platform-tests/css/css-values-3/reference/vh_not_refreshing_on_chrome-ref.html17
-rw-r--r--tests/wpt/web-platform-tests/css/css-values-3/reference/vh_not_refreshing_on_chrome_iframe-ref.html7
-rw-r--r--tests/wpt/web-platform-tests/css/css-values-3/support/vh_not_refreshing_on_chrome_iframe.html89
-rw-r--r--tests/wpt/web-platform-tests/css/css-values-3/unset-value-storage.html24
-rw-r--r--tests/wpt/web-platform-tests/css/css-values-3/vh_not_refreshing_on_chrome.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-values-3/vh_not_refreshing_on_chrome_iframe.html85
-rw-r--r--tests/wpt/web-platform-tests/css/css-variables-1/variable-generated-content-dynamic-001-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/css/css-variables-1/variable-generated-content-dynamic-001.html19
-rw-r--r--tests/wpt/web-platform-tests/css/css-variables-1/vars-font-shorthand-001.html5
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/background-position-vrl-018-ref.xht5
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vlr-007.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vlr-009.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vrl-006.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vrl-008.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-003.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-005.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-007.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-009.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-011.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-013.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-021.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-023.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-004.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-006.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-008.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-010.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-012.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001f.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001i.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001j.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001k.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001l.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001m.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001n.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001o.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001p.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001q.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001r.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001s.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001t.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001u.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001v.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001w.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001x.html2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/support/text-orientation.js8
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/tools/generators/orthogonal-parent-shrink-to-fit.ejs2
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-computed-root.html26
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-lr.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-rl.html36
-rw-r--r--tests/wpt/web-platform-tests/css/css3-color/t424-hsl-parsing-f.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/css3-color/t425-hsla-parsing-f.xht4
-rw-r--r--tests/wpt/web-platform-tests/css/css3-selectors/i18n/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/css/fonts/ahem/COPYING36
-rw-r--r--tests/wpt/web-platform-tests/css/fonts/ahem/README49
-rw-r--r--tests/wpt/web-platform-tests/css/fonts/ahem/ahem.ttfbin13884 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/DOMMatrix-attributes.html66
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/DOMMatrix2DInit-validate-fixup.html183
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/DOMMatrixInit-validate-fixup.html44
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/DOMRect-002.html171
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/DOMRectList.html36
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/interfaces.html1
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/spec-examples.html92
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/structured-serialization.html6
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/support/dommatrix-test-util.js43
-rw-r--r--tests/wpt/web-platform-tests/css/geometry-1/support/interfaces.js6
-rw-r--r--tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-002.html2
-rw-r--r--tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-003.html2
-rw-r--r--tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-004.html2
-rw-r--r--tests/wpt/web-platform-tests/css/motion-1/animation/offset-anchor-interpolation.html72
-rw-r--r--tests/wpt/web-platform-tests/css/motion-1/animation/offset-distance-interpolation.html55
-rw-r--r--tests/wpt/web-platform-tests/css/motion-1/animation/offset-position-interpolation.html72
-rw-r--r--tests/wpt/web-platform-tests/css/motion-1/animation/offset-rotate-interpolation.html55
-rw-r--r--tests/wpt/web-platform-tests/css/motion-1/animation/resources/interpolation-testcommon.js65
-rw-r--r--tests/wpt/web-platform-tests/css/motion-1/offset-supports-calc.html50
-rw-r--r--tests/wpt/web-platform-tests/css/tools/w3ctestlib/Indexer.py2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-1.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-10.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-11.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-12.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-13.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-2.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-3.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-4.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-5.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-6.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-7.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-9.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-1.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-3.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-4.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-1.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-2.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-1.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-2.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-3.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-6.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-1.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-8.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/masking/reftest.list1
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/multicol-height-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/reference/multicol-height-002.xht2
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/reftest.list1
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001-ref.html10
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001.html16
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/reftest.list1
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/base.css21
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-1.html96
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-2.html96
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-3.html86
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/caption-side-1.html42
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/fixed-layout-1.html90
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/fixed-layout-2.html84
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-0.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-1.html94
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/percentage-sizing-of-table-cell-children.html198
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html-to-css-mapping-1.html63
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html-to-css-mapping-2.html226
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-1.html98
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-2.html150
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-3.html106
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-fixed-layout-1.html44
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/markup-generator.html200
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/table-model-fixup-2.html464
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/table-model-fixup.html125
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/visibility-collapse-col-001.html101
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/visibility-collapse-row-001.html80
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-0.html76
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-1.html92
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-0.html39
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-1.html51
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-1.html61
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-2.html61
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-guess.html61
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-percent-guess.html64
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.1.html51
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.html51
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/opera/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/reference/ttwf-reftest-borderRadius-ref.html19
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/ttwf-jstest-borderRadius.html34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/ttwf-reftest-borderRadius.html25
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/elementFromPosition.html127
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/reference/ttwf-reftest-borderRadius-ref.html19
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/ttwf-reftest-borderRadius.html24
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/ttwf-scrollintoview.html32
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/window-screen-height.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/background-clip-color.html28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/background-clip-image.html28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/reference/background-clip-color-ref.html25
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/reference/background-clip-image-ref.html25
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/support/img_star.pngbin123 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images-002.html40
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images-003.html25
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images.html27
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image-002.jpgbin115747 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image-003.jpgbin191182 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image.jpgbin77546 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-bottom.htm31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-left.htm31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand.htm31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color.htm34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_position.html72
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_radius.html72
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_size.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_position.html72
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_radius.html72
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_size.html70
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/list.txt12
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box.html72
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_position.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_radius.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_size.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box.html70
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_position.html73
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_radius.html73
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_size.html72
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_position.html74
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_radius.html72
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_size.html70
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/list.txt12
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box.html72
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_position.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_radius.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_size.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/border.pngbin849 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/css3.pngbin57166 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/ttwf.pngbin26434 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/border-image-001.html25
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/reference/border-image-ref.html36
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/support/bt_blue.pngbin2068 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/support/repeat-x.pngbin1033 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/flex-justify.html89
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/flex-min-auto.html17
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/reference/flex-justify-rel.html90
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/reference/flex-min-auto-rel.html17
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jingke/cssom-view-window-pageXOffset-return-scrollX.html24
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/keynesqu/Flexible-order.html66
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/keynesqu/reference/Flexible-order-ref.html54
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/neo_and_rayi/extensions_to_the_HTMLElement_interface.html131
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/flex-align-items-center.html53
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/flex-items-flexibility.html57
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/readme.txt43
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/reference/flex-align-items-center-ref.html67
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/reference/flex-items-flexibility.html48
-rwxr-xr-xtests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/phuangce/flex-margin-no-collapse.html53
-rwxr-xr-xtests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/phuangce/reference/flex-margin-no-collapse-ref.html38
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-repeat-round.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-round-and-stretch.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-slice-percentage.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-repeat-round-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-round-and-stretch-ref.html18
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-slice-percentage-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/border-image-round-result.pngbin4038 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/border.pngbin849 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/borderresult.pngbin9419 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tang,shaofeng/border-image-repeat_repeatnegx_none_50px.html88
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/css-border-radius-001.html42
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/css-border-radius-002.html42
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/readme.txt1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-001.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-002.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/y.pngbin4103 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-boxsizing.html43
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-childmargin.html48
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-flex-prescation.html32
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-margin.html42
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-padding.html49
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-basic.html32
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-cascading.html48
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/background-size-035.html33
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/bg.jpgbin16569 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/reference/background-size-ref.html31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaoyan.jxy/background-clip_padding-box.html36
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaoyan.jxy/reference/background_clip_padding-box.html38
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/css-backgrounds-sizingimages-001.html29
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/reference/css-backgrounds-sizingimages-001-ref.html27
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/support/test.pngbin14702 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhangxiaochong/box-shadow-outset-without-border-radius.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhangxiaochong/reference/box-shadow-outset-without-border-radius.html26
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/border-radius-clipping.html40
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/flexible-box-float.html47
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/reference/border-radius-clipping-ref.html28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/reference/flex-box-float-ref.html41
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/box-sizing-border-box-001.html33
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-001.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-002.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-offset-001.html29
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/box-sizing-border-box-001-ref.html29
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/outline-001-ref.html38
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/outline-offset-001-ref.html26
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/tonychyan/css-transform-combination-001.html47
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/tonychyan/css-transform-hover-001.html48
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-bothlines.html46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-firstline.html46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-secondline.html46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto.html39
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-order.html47
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-green.pngbin135 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-lime.pngbin135 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-maroon.pngbin109 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-navy.pngbin109 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-white.pngbin109 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-gg-rr.pngbin224 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-green.pngbin218 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-red.pngbin217 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/README28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/a-green.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/b-green.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/c-red.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/cat.pngbin1883 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/import-green.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/import-red.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-gg-gr.pngbin148 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rgr-grg.pngbin222 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rrg-rgg.pngbin231 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-rgr-grg-rgr.pngbin223 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-tr.pngbin137 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50%.pngbin691 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50px.pngbin671 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-v-100px.pngbin760 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-v-50px.pngbin757 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-purple.pngbin92 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-teal.pngbin92 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-white.pngbin78 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/README4
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/swatch-green.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/swatch-red.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-blue.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-green.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-lime.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-orange.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-red.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-teal.pngbin156 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-white.pngbin85 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-yellow.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-bl.pngbin1368 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-br.pngbin1045 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-inner-half-size.pngbin180 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-outer.pngbin2412 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-tl.pngbin1025 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-tr.pngbin1235 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/css-transform-scale-001.html51
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-001.html24
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-002.html24
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cjgammon/css-transforms/reftest/transform-origin-01-ref.html34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cjgammon/css-transforms/transform-origin-01.html56
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cshoop/medialist-creating-object-001.html28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/background-position-center-001-ref.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/background-position-center-001.html54
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/border-bottom-left-radius-001.xht69
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-green.pngbin135 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-lime.pngbin135 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-maroon.pngbin109 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-navy.pngbin109 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-red.pngbin135 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-white.pngbin109 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/20x20-green.pngbin106 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/20x20-red.pngbin104 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-gg-rr.pngbin224 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-green.pngbin218 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-red.pngbin217 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/a-green.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/b-green.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/c-red.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/cat.pngbin1883 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/import-green.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/import-red.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-grg-rgr-grg.pngbin222 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-grg-rrg-rgg.pngbin231 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-rgr-grg-rgr.pngbin222 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-tr.pngbin137 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-h-50%.pngbin691 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-h-50px.pngbin671 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-v-100px.pngbin760 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-v-50px.pngbin757 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-purple.pngbin92 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-teal.pngbin92 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-white.pngbin78 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/support/swatch-green.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/support/swatch-red.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-blue.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-green.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-lime.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-orange.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-red.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-white.pngbin85 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-yellow.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-bl.pngbin1368 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-br.pngbin1045 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-inner-half-size.pngbin180 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-outer.pngbin2412 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-tl.pngbin1025 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-tr.pngbin1235 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/divya/index-001.html28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/divya/index-002.html82
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/gangleton/reference/transform-translateX-002-ref.html28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/gangleton/transform-translateX-002.html45
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewx90.html24
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewy90.html25
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-TODO24
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-README4
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-001.html50
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-002.html48
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-003.html36
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-004.html67
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-005.html71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-README6
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-001.html47
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-002.html83
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-003.html55
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-004.html58
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-005.html55
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-006.html55
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-007.html84
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-008.html84
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-009.html87
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-010.html87
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-011.html31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-012.html29
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-013.html29
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-014.html29
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-015.html29
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-016.html47
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-README13
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-001.html57
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-002.html55
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-003.html57
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-004.html70
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-README6
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-fixed-001.html80
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-001.xml17
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-002.xml21
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-003.xml16
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-004.xml18
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-005.xml19
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-006.xml18
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-007.xml18
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-008.xml21
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-009.xml18
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-010.xml17
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-README2
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/border-style-001.html26
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/border-style-002.html26
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-container-margin.html30
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-modify.html66
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-with-element-insert.html70
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction.html54
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-item-change-width.html58
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-container.html34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-modify.html45
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-with-element-insert.html77
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction.html77
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-item-change-width.html54
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-100x60.pngbin207 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-96x60.pngbin206 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-180-degrees-001.html26
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-270-degrees-001.html26
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-90-degrees-001.html26
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-attachment-fixed.html33
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-border-box.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-content-box.html41
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-padding-box.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-border-box-ref.xht27
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-content-box-ref.xht45
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-padding-box-ref.xht28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-green.pngbin135 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-lime.pngbin135 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-maroon.pngbin109 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-navy.pngbin109 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-red.pngbin135 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-white.pngbin109 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-gg-rr.pngbin224 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-green.pngbin218 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-red.pngbin217 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/README28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/a-green.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/b-green.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/c-red.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/cat.pngbin1883 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/import-green.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/import-red.css1
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rgr-grg.pngbin222 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rrg-rgg.pngbin231 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-rgr-grg-rgr.pngbin223 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-tr.pngbin137 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50%.pngbin691 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50px.pngbin671 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-100px.pngbin760 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-50px.pngbin757 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-purple.pngbin92 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-teal.pngbin92 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-white.pngbin78 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/README4
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-green.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-red.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-blue.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-green.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-lime.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-orange.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-red.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-teal.pngbin156 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-white.pngbin85 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-yellow.pngbin84 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-bl.pngbin1368 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-br.pngbin1045 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-inner-half-size.pngbin180 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-outer.pngbin2412 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-tl.pngbin1025 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-tr.pngbin1235 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/miked782000/transform-oragin.html44
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/miked782000/ttwf-reftest-rotate.html53
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-cssText-serialize.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-cssstyledeclaration-set.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule-constructors.html62
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule.html58
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-setProperty-shorthand.html69
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssstyledeclaration-mutability.html68
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/diagonal-percentage-vector-background.html31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/diagonal-scaled.svg21
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-percentage-vector-background-ref.html31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-scaled-fixed.svg10
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/background-color-transparent.html27
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/background-origin.html28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/reference/background-color-transparent.html25
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/reference/background-origin.html27
-rwxr-xr-xtests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/mark/css3-box-shadow-outline.html24
-rwxr-xr-xtests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/mark/reference/css3-box-shadow-outline-ref.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/keiko-kiki/refrence/ref-shape-circle-001.html33
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/keiko-kiki/shape-circle-001.html34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/dish-isolated.pngbin871518 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-000.html53
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-001.html53
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001-ref.html15
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001.html16
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters.html26
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-value-1em.html28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/where-is-letter-spacing-applied.html19
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/onlymollah/shape-outside-negative-center-positive-radius-ellipse-000.html61
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/smallni/letter-spacing-value-1em.html28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/gradient.pngbin57599 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-01.html38
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-02-mask-box.html42
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001-ref.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hiromitsuuuuu/test_font_face_parser.html73
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001-ref.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001.html37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/ahem.css4
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2-ref.xhtml52
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2.xhtml56
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3-ref.xhtml58
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3.xhtml48
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4-ref.xhtml38
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4.xhtml37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2-ref.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2.xhtml33
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2-ref.xhtml31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2.xhtml36
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2-ref.xhtml29
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2-ref.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2.xhtml37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2-ref.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2.xhtml33
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2-ref.xhtml31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2.xhtml36
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2-ref.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2.xhtml33
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2-ref.xhtml31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2.xhtml36
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2-ref.xhtml29
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2-ref.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2.xhtml37
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2-ref.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2.xhtml33
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2-ref.xhtml31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2.xhtml36
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-iframe.html24
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-ref.xhtml19
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1.xhtml33
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-iframe.html27
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-ref.xhtml19
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-iframe.html29
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-ref.xhtml19
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-iframe.html20
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-ref.xhtml19
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1-ref.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1a.xhtml46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1b.xhtml46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1-ref.xhtml39
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1.xhtml87
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2-ref.xhtml41
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2.xhtml104
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3-ref.xhtml40
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3.xhtml104
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-1.xhtml87
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-2.xhtml107
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-3.xhtml107
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1-ref.xhtml39
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1.xhtml87
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2-ref.xhtml44
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2.xhtml107
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3-ref.xhtml43
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3.xhtml107
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1-ref.xhtml43
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1.xhtml103
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1-ref.xhtml38
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1a.xhtml39
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1b.xhtml45
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1-ref.xhtml39
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1a.xhtml47
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1b.xhtml43
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1c.xhtml75
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1d.xhtml75
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2-ref.xhtml39
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2a.xhtml42
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2b.xhtml46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1-ref.xhtml45
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1a.xhtml39
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1b.xhtml55
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2-ref.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2.xhtml46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3-ref.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3a.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3b.xhtml38
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3c.xhtml38
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4-ref.xhtml21
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4.xhtml27
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5-ref.xhtml25
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5.xhtml36
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1-ref.xhtml91
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1a.xhtml102
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1b.xhtml102
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2-ref.xhtml45
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2a.xhtml41
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2b.xhtml44
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1-ref.html36
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1.html47
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1-ref.xhtml78
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1.xhtml71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1-ref.xhtml55
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1.xhtml73
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3-ref.html21
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3.html39
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1-ref.xhtml74
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1.xhtml70
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2-ref.xhtml73
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2.xhtml71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3-ref.xhtml44
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3.xhtml46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4-ref.xhtml50
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4.xhtml52
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1-ref.xhtml74
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1.xhtml70
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2-ref.xhtml73
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2.xhtml71
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3-ref.xhtml44
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3.xhtml46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4-ref.xhtml51
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4.xhtml52
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-disabled-ref.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-enabled-ref.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1.xhtml40
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-helper.html31
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-ref.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1.xhtml40
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1-ref.html35
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1.html46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2-ref.html36
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2.html42
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3-ref.html35
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3.html42
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4-ref.html35
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4.html46
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/reftest.list141
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/solidblue.pngbin135 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/CSSOM/samples/CSSStyleDeclaration-setProperty.html173
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001-ref.html18
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-002.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003-ref.html18
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-004.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-005.html22
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/t32k/css-fonts-font-face-rule.html45
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-18n-ref.html38
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-18n.html39
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n-ref.html38
-rw-r--r--tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n.html40
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/DOMRectList.html24
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/HTMLBody-ScrollArea_quirksmode.html2
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/cssom-getClientRects-002.html26
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementFromPoint-002.html40
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementFromPoint-003.html48
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementFromPoint.html25
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementFromPosition.html2
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementScroll.html5
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-iframes.html83
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-invalid-cases.html56
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-shadowroot.html87
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-simple.html131
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-svg.html67
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-table.html99
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/elementsFromPoint.html16
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/historical.html8
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/interfaces.html67
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/resources/elementsFromPoint.js48
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/resources/iframe1.html16
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/resources/iframe2.html25
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/scrollBoundaryBehavior-manual.html151
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/scrollIntoView-empty-args.html99
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-001-ref.html3
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-001.html17
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-002-ref.html2
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-002.html17
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/scrollintoview.html112
-rw-r--r--tests/wpt/web-platform-tests/cssom-view/ttwf-scrollintoview.html32
-rw-r--r--tests/wpt/web-platform-tests/cssom/CSSStyleRule.html19
-rw-r--r--tests/wpt/web-platform-tests/cssom/MediaList2.xhtml (renamed from tests/wpt/web-platform-tests/cssom/MediaList.xhtml)0
-rw-r--r--tests/wpt/web-platform-tests/cssom/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/cssom/cssom-ruleTypeAndOrder.html75
-rw-r--r--tests/wpt/web-platform-tests/cssom/getComputedStyle-pseudo.html53
-rw-r--r--tests/wpt/web-platform-tests/cssom/index-003.html95
-rw-r--r--tests/wpt/web-platform-tests/cssom/interfaces.html227
-rw-r--r--tests/wpt/web-platform-tests/cssom/stylesheet-same-origin.sub.html21
-rw-r--r--tests/wpt/web-platform-tests/cssom/support/xmlss-pi.xhtml1
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/historical.html35
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/reactions/ChildNode.html6
-rw-r--r--tests/wpt/web-platform-tests/custom-elements/upgrading/Node-cloneNode.html48
-rw-r--r--tests/wpt/web-platform-tests/docs/.ruby-version2
-rw-r--r--tests/wpt/web-platform-tests/docs/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/docs/_running-tests/index.md37
-rw-r--r--tests/wpt/web-platform-tests/docs/_writing-tests/ahem.md2
-rw-r--r--tests/wpt/web-platform-tests/docs/_writing-tests/file-names.md65
-rw-r--r--tests/wpt/web-platform-tests/docs/_writing-tests/general-guidelines.md28
-rw-r--r--tests/wpt/web-platform-tests/docs/_writing-tests/idlharness.md6
-rw-r--r--tests/wpt/web-platform-tests/docs/_writing-tests/lint-tool.md10
-rw-r--r--tests/wpt/web-platform-tests/docs/_writing-tests/server-features.md2
-rw-r--r--tests/wpt/web-platform-tests/docs/_writing-tests/testharness-api.md28
-rw-r--r--tests/wpt/web-platform-tests/docs/introduction.md2
-rw-r--r--tests/wpt/web-platform-tests/dom/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/dom/abort/event.any.js22
-rw-r--r--tests/wpt/web-platform-tests/dom/events/Event-timestamp-high-resolution.html16
-rw-r--r--tests/wpt/web-platform-tests/dom/events/Event-timestamp-safe-resolution.html49
-rw-r--r--tests/wpt/web-platform-tests/dom/events/EventTarget-constructible.any.js62
-rw-r--r--tests/wpt/web-platform-tests/dom/interface-objects.html2
-rw-r--r--tests/wpt/web-platform-tests/dom/interfaces.html3
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createDocument.html1
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createHTMLDocument.html6
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Document-constructor.html1
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html15
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_02.html8
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.html10
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.js10
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Element-classlist.html71
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Element-matches-init.js65
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Element-matches.html79
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Element-webkitMatchesSelector.html79
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/Node-cloneNode.html81
-rw-r--r--tests/wpt/web-platform-tests/dom/nodes/selectors.js44
-rw-r--r--tests/wpt/web-platform-tests/dom/traversal/NodeIterator.html17
-rw-r--r--tests/wpt/web-platform-tests/dom/traversal/TreeWalker.html26
-rw-r--r--tests/wpt/web-platform-tests/domparsing/XMLSerializer-serializeToString.html44
-rw-r--r--tests/wpt/web-platform-tests/domparsing/innerhtml-mxss.sub.html49
-rw-r--r--tests/wpt/web-platform-tests/domparsing/xml-serialization.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/domxpath/interfaces.html80
-rw-r--r--tests/wpt/web-platform-tests/domxpath/interfaces.tentative.html83
-rw-r--r--tests/wpt/web-platform-tests/editing/data/insert-list-items-in-table-cells.js43
-rw-r--r--tests/wpt/web-platform-tests/editing/run/insert-list-items-in-table-cell.html51
-rw-r--r--tests/wpt/web-platform-tests/encoding/api-invalid-label.html4
-rw-r--r--tests/wpt/web-platform-tests/encoding/api-replacement-encodings.html4
-rw-r--r--tests/wpt/web-platform-tests/encoding/eof-shift_jis-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/encoding/eof-shift_jis.html5
-rw-r--r--tests/wpt/web-platform-tests/encoding/eof-utf-8-one-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/encoding/eof-utf-8-one.html5
-rw-r--r--tests/wpt/web-platform-tests/encoding/eof-utf-8-three-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/encoding/eof-utf-8-three.html5
-rw-r--r--tests/wpt/web-platform-tests/encoding/eof-utf-8-two-ref.html4
-rw-r--r--tests/wpt/web-platform-tests/encoding/eof-utf-8-two.html5
-rw-r--r--tests/wpt/web-platform-tests/encoding/iso-2022-jp-decoder.html4
-rw-r--r--tests/wpt/web-platform-tests/encoding/replacement-encodings.html30
-rw-r--r--tests/wpt/web-platform-tests/encoding/resources/decoding-helpers.js32
-rw-r--r--tests/wpt/web-platform-tests/encoding/resources/encodings.js3
-rw-r--r--tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.htmlbin0 -> 740 bytes
-rw-r--r--tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.xmlbin0 -> 1412 bytes
-rw-r--r--tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.htmlbin0 -> 736 bytes
-rw-r--r--tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.xmlbin0 -> 1408 bytes
-rw-r--r--tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.htmlbin0 -> 740 bytes
-rw-r--r--tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.xmlbin0 -> 1412 bytes
-rw-r--r--tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.htmlbin0 -> 736 bytes
-rw-r--r--tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.xmlbin0 -> 1408 bytes
-rw-r--r--tests/wpt/web-platform-tests/encoding/single-byte-decoder.html2
-rw-r--r--tests/wpt/web-platform-tests/encoding/unsupported-encodings.html37
-rw-r--r--tests/wpt/web-platform-tests/encoding/utf-32.html37
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-creation-with-gc.html41
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-setcert-with-gc.html32
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys-with-session.html104
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys.html59
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-reference.html157
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release-noreference.html131
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release.html118
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-multiple-mediakeys.html131
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-reload.html103
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-check-init-data-type.html51
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clear-key-invalid-license.html47
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clearkey-update-non-ascii-input.html53
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-events.html65
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-generate-request-disallowed-input.html107
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html121
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html87
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses.html174
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-not-callable-after-createsession.html67
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-onencrypted.html44
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-encrypted-and-clear-sources.html130
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html143
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-after-src.html96
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-before-src.html96
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-two-videos.html90
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-requestmediakeysystemaccess.html322
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-reset-src-after-setmediakeys.html67
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-session-closed-event.html51
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-playback.html48
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-resetting-src.html44
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-at-same-time.html109
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html83
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html50
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-to-multiple-video-elements.html50
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys.html59
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-syntax.html1017
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-unique-origin.html79
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-update-disallowed-input.html73
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-utils.js333
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-waiting-for-a-key.html168
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/webm/test-encrypted-different-av-keys.webmbin221378 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/webm/test-encrypted.webmbin223402 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/Google/webm/test.webmbin219448 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/encrypted-media/encrypted-media-default-feature-policy.https.sub.html21
-rw-r--r--tests/wpt/web-platform-tests/entries-api/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/entries-api/errors-manual.html61
-rw-r--r--tests/wpt/web-platform-tests/entries-api/file-webkitRelativePath-manual.html32
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystem-manual.html40
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-attributes-manual.html37
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-createReader-manual.html23
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getDirectory-manual.html128
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getFile-manual.html115
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getParent-manual.html17
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystemdirectoryreader-manual.html77
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystementry-attributes-manual.html29
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystementry-getParent-manual.html27
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystemfileentry-attributes-manual.html37
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystemfileentry-file-manual.html26
-rw-r--r--tests/wpt/web-platform-tests/entries-api/filesystemfileentry-getParent-manual.html17
-rw-r--r--tests/wpt/web-platform-tests/entries-api/interfaces-manual.html54
-rw-r--r--tests/wpt/web-platform-tests/entries-api/interfaces.html39
-rw-r--r--tests/wpt/web-platform-tests/entries-api/interfaces.idl70
-rw-r--r--tests/wpt/web-platform-tests/entries-api/support.js131
-rw-r--r--tests/wpt/web-platform-tests/entries-api/support/a/b/c/3.txt (renamed from tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/achicu/css-exclusions/exclusions-pos-01.xht)0
-rw-r--r--tests/wpt/web-platform-tests/entries-api/support/a/b/c/d/1.txt (renamed from tests/wpt/web-platform-tests/html/semantics/forms/the-progress-element/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/entries-api/support/a/b/c/d/2.txt (renamed from tests/wpt/web-platform-tests/microdata/conformance-requirements/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/entries-api/support/upload.txt (renamed from tests/wpt/web-platform-tests/microdata/converting-html-to-other-formats/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/entries-api/support/upload/file.txt (renamed from tests/wpt/web-platform-tests/microdata/converting-html-to-other-formats/json/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/entries-api/support/upload/subdir/1.txt (renamed from tests/wpt/web-platform-tests/microdata/dependencies/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/entries-api/support/upload/subdir/2.txt (renamed from tests/wpt/web-platform-tests/microdata/encoding-microdata/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/entries-api/support/upload/subdir/3.txt (renamed from tests/wpt/web-platform-tests/microdata/encoding-microdata/associating-names-with-items/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm2
-rw-r--r--tests/wpt/web-platform-tests/eventsource/eventsource-constructor-non-same-origin.htm3
-rw-r--r--tests/wpt/web-platform-tests/eventsource/format-field-id-null.htm33
-rw-r--r--tests/wpt/web-platform-tests/eventsource/resources/last-event-id.py12
-rw-r--r--tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm2
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/README.md59
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html39
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy-attribute.https.sub.html26
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy.https.sub.html47
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/payment-default-feature-policy.https.sub.html47
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/payment-disabled-by-feature-policy.https.sub.html45
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/payment-disabled-by-feature-policy.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-payment.html16
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-usb.html9
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-webvr.html9
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/resources/featurepolicy.js154
-rw-r--r--tests/wpt/web-platform-tests/feature-policy/resources/redirect-on-load.html11
-rw-r--r--tests/wpt/web-platform-tests/fetch/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/abort/cache.https.html57
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/abort/general-serviceworker.https.html23
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/abort/general-sharedworker.html14
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/abort/general.any.js524
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/abort/serviceworker-intercepted.https.html102
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/block-mime-as-script.html38
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/basic/integrity.js70
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/cors/cors-expose-star.js17
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-cache.any.js46
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-star.any.js8
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/headers/headers-combine.html20
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/headers/headers-record.html49
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-error.html82
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-error.js57
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-headers.html13
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-idl.html1
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-structure.html6
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/request-type-attribute-historical.html11
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/request/url-encoding.html25
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/basic.html5
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/empty.txt (renamed from tests/wpt/web-platform-tests/microdata/encoding-microdata/items/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/infinite-slow-response.py36
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/preflight.py6
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/script-with-header.py5
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/stash-put.py7
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/stash-take.py9
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/sw-intercept.js10
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/resources/utils.js20
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/response-cancel-stream.html16
-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-init-001.html13
-rw-r--r--tests/wpt/web-platform-tests/fetch/api/response/response-stream-disturbed-6.html88
-rw-r--r--tests/wpt/web-platform-tests/fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html228
-rw-r--r--tests/wpt/web-platform-tests/fetch/security/dangling-markup-mitigation.tentative.html11
-rw-r--r--tests/wpt/web-platform-tests/fonts/Ahem.ttfbin0 -> 21768 bytes
-rw-r--r--tests/wpt/web-platform-tests/fonts/README.md2
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-nested-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-timing-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html37
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-allowed-cross-origin-manual.sub.html30
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-not-allowed-cross-origin-manual.sub.html31
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-not-allowed-manual.html (renamed from tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-enabled-flag-not-set-manual.html)0
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html6
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-dialog-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-null-ns-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-svg-rect-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-timing-manual.html5
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/resources/attempt-fullscreen.html23
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/api/resources/report-fullscreen-enabled.html11
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/model/move-to-inactive-document-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/rendering/fullscreen-pseudo-class-manual.html34
-rw-r--r--tests/wpt/web-platform-tests/fullscreen/rendering/fullscreen-pseudo-class-support.html21
-rw-r--r--tests/wpt/web-platform-tests/gamepad/events-manual.html4
-rw-r--r--tests/wpt/web-platform-tests/gamepad/getgamepads-polling-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/gamepad/idlharness-manual.html12
-rw-r--r--tests/wpt/web-platform-tests/gamepad/idlharness.html12
-rw-r--r--tests/wpt/web-platform-tests/gamepad/timestamp-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/generic-sensor/OWNERS4
-rw-r--r--tests/wpt/web-platform-tests/generic-sensor/generic-sensor-tests.js73
-rw-r--r--tests/wpt/web-platform-tests/generic-sensor/idlharness.html86
-rw-r--r--tests/wpt/web-platform-tests/generic-sensor/idlharness.https.html63
-rw-r--r--tests/wpt/web-platform-tests/gyroscope/Gyroscope.https.html2
-rw-r--r--tests/wpt/web-platform-tests/gyroscope/OWNERS3
-rw-r--r--tests/wpt/web-platform-tests/gyroscope/idlharness.https.html48
-rw-r--r--tests/wpt/web-platform-tests/gyroscope/support-iframe.html10
-rw-r--r--tests/wpt/web-platform-tests/hr-time/idlharness.html38
-rw-r--r--tests/wpt/web-platform-tests/hr-time/timeOrigin.html45
-rw-r--r--tests/wpt/web-platform-tests/hr-time/timing-attack.html55
-rw-r--r--tests/wpt/web-platform-tests/hr-time/window-worker-time-origin.html36
-rw-r--r--tests/wpt/web-platform-tests/hr-time/window-worker-timeOrigin.window.js30
-rw-r--r--tests/wpt/web-platform-tests/html-media-capture/idlharness.html11
-rw-r--r--tests/wpt/web-platform-tests/html/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/html/README.md21
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html6
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/support/window-name-navigation.sub.html11
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/support/window-name-test.sub.html23
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html17
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html13
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html18
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html17
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html13
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html18
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html44
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/navigate-helpers.js23
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html69
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html15
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_properties_only_fully_active.html22
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/appcache-worker.html81
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-dedicated-worker-not-in-cache.js1
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-shared-worker-not-in-cache.js64
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker-data.py5
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker-import.py7
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker.manifest10
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker.py102
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/cross-origin-objects.html30
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/frame.html2
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/origin/origin-of-data-document.html21
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html8
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/window-indexed-properties.html6
-rw-r--r--tests/wpt/web-platform-tests/html/browsers/the-window-object/window-named-properties.html2
-rw-r--r--tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.html1
-rw-r--r--tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/nameditem-03.html100
-rw-r--r--tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/nameditem-08.html13
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements-embedded.js6
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements-forms.js72
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements-grouping.js3
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements-metadata.js19
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements-misc.js6
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements-obsolete.js7
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements-sections.js3
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements-tabular.js4
-rw-r--r--tests/wpt/web-platform-tests/html/dom/elements-text.js10
-rw-r--r--tests/wpt/web-platform-tests/html/dom/historical.html33
-rw-r--r--tests/wpt/web-platform-tests/html/dom/interfaces.html4
-rw-r--r--tests/wpt/web-platform-tests/html/dom/interfaces.worker.js13
-rw-r--r--tests/wpt/web-platform-tests/html/dom/original-harness.js3
-rw-r--r--tests/wpt/web-platform-tests/html/dom/reflection.js55
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/001.xhtml50
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/002.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/003-1.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/003.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/004.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/005.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/006.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/007.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/008.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/009.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/010-1.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/012.xhtml44
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/013.xhtml44
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/014.xhtml44
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.manual.xhtml58
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/helper-drag-me-green-box.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/canvas/helper-drop-here-canvas.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/crashers/dialog-001.html6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/cross-document/001-1.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/cross-document/001.html2
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.manual.html2
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/cross-document/003-1.html160
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/cross-document/003.html12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/001.xhtml78
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/002.xhtml58
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/003.xhtml60
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/004.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/005.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/006.xhtml60
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/007.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/008.xhtml60
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/009-1.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/009.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/010-1.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/010.xhtml44
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/011.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/012.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/013-1.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/014-1.xhtml60
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/015-manual.html96
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/016.xhtml64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/017.xhtml64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/018.xhtml66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/019.xhtml66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/020.xhtml74
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/021.xhtml66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/022.xhtml82
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/023.xhtml58
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/024.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/025.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/026.xhtml64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/027.xhtml64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/028.xhtml72
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/029.xhtml64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/030.xhtml80
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/031.xhtml214
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/032.xhtml196
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/033.xhtml196
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/034.xhtml198
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/035.xhtml198
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/036.xhtml196
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/037.xhtml198
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/038.xhtml224
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/039.xhtml208
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/040.xhtml208
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/041.xhtml210
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/042.xhtml210
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/043.xhtml208
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/044.xhtml208
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/045.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/046.xhtml276
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/047.xhtml260
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/048.xhtml260
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/049.xhtml262
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/050.xhtml262
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/051.xhtml260
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/052.xhtml260
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/053.html154
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/054.html154
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/055.html74
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/056.xhtml60
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/057.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/058.html146
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/datastore/helper-drop-box-here.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dom/specials.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/001.xhtml30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/002.xhtml30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/003.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/004.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/005.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/006.xhtml44
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/007.xhtml30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/008.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/009.xhtml30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/010.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/011.xhtml30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/012.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/013.xhtml30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/014.xhtml30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/015.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/016.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/017.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/018.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/019.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/020.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/021.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/022.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/023.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/024.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/025.html138
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/026.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/027.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/drop/028.html64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dropzone/001.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dropzone/002.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dropzone/003.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dropzone/004.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dropzone/005.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dropzone/006.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dropzone/007.html88
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dropzone/008.html92
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dropzone/009.html24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/dropzone/010.html24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/001-1.xhtml58
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/002-1.xhtml58
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/003-1.xhtml58
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/004.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/005.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/006.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/007.xhtml64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/008.xhtml64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/009.xhtml64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/010.xhtml66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/011.xhtml66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/012.xhtml66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/013.xhtml68
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/014.xhtml68
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/015.xhtml68
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/016.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/017.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/018.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/019.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/020.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/021.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/022.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/023.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/024.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/025.html118
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/026.html102
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/027.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/028.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/029.html134
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/030.html88
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/031-1.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/031.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/032.html138
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/033.html138
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/034.html90
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/035.html142
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/036.html120
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/037-proposed.xhtml138
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/037-spec.xhtml136
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/038-proposed.html136
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-HELPER-1.html348
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-HELPER-2.html72
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-manual.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/events-file-suite-manual.html252
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/events-suite-manual.html652
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-input-with-circle.xhtml58
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-link-with-circle.xhtml58
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-p-with-circle.xhtml58
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drop-here-body-circle.xhtml62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/001.html148
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/002.html234
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/003.html122
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/004.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/005.html10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/006.html10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/007.html136
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/008.html164
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/010.html6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/011.html124
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/001.html14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/002.html36
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/003.html14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/004.html14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/005.html14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/006.html26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/007.html14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/008.html26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/009.html14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/001.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/002.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/003.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/004.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/005.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/006.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/007.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/008.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/009.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/010.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/011.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/014-1.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/015.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/016.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/017.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/018.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/021.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/022.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/023.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/024.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/025.xhtml38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/026.xhtml38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/027.xhtml38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/028.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.manual.xhtml48
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/helper-drop-image-here.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/images/helper-drop-vertical-scrollbar.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactive/frames-1.html22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactive/frames.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactive/object-retention.html220
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactive/plugins.html40
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/001.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/002.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/003.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/004.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/005.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/006.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/007.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/008.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/009.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/010.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/011.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/012.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/015.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/016.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/017.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/018.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/019.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/020.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/021.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/022.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/media/001.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/000.html68
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/001.html134
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/002.html90
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/003.html142
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/004.html104
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/005.html104
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/006.html88
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/007.html104
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/008.html68
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/009.html76
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/010.html88
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/011.html94
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/012.html88
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/013.html86
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/014.html74
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/015.html74
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/016.html186
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/017.html140
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/018.html76
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/019.html78
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/020.html84
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/microdata/021.html84
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/001-1.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/001.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/002.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/007-1.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/007.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/008-1.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/008.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/009-1.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/010-1.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/010.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/011-1.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/011.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/012.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/013.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/016-1.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/016.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/017.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/021-1.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/022-1.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/022.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/023-1.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/023.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drag-image-dont-drop.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drag-selection-dont-drop.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-here-reload.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-image-now.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-link-now.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-now.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-selection-here.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/001.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/002.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/003.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/004.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/005.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/006.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/007.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/008.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/009.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/010.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/011.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/012.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/013.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/014.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/015.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/016.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/017.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/018.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/019.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/020.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/021.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/022.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/024.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/025.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/026.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/027.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/028.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/029.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/030.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/031.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/032.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/033.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/034.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/035.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/036.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/038.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/039.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/040.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/041.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/042.html16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/043.html28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/044.html12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/045.html10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/046.html10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/047.html10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/048.html10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/049.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/050.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/051.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/052.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/053.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/054.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/055.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/056.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/057.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/058.html28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/059.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/060.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/061.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/overlay/062.html22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/alttab.html16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cancel-middle-click.html76
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cancel-right-click.html76
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-001.html16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-002.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-003.html24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-004.html12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-005.html10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-006.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/003.html2
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/004.html2
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/005.html8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/006.html8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/007.html8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/008.html12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/009.html8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/010.html2
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/011.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-keypress.html8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-link.html16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-to-title.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/file-drop-position.html8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/file-os-to-os.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/file-to-system.html90
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/html-to-os-HELPER-FILE.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/html-to-os.html28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/html-unicode-to-os.html26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/inputs-no-js.html22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/001.html44
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/002.html48
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/003.html60
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/004.html28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/005.html36
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/006.html30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/007.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/008.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/009.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/010.html36
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/011.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/012.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/013.html22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/014.html12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/015.html30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/016.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/017.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/018.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/019.html36
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/020.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/021.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/keyboardshortcuts.html28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/all.html308
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copy.html308
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copylink.html308
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copymove.html308
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/link.html308
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/linkmove.html308
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/move.html308
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/onlydropzone.html104
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/onlydropzoneevents.html128
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/releasemodifiersdrag.html206
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/releasemodifiersdrop.html176
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/scriptmodified.html162
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/moving-window.html14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/overlappingwindows.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/placeholderposition1.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/placeholderposition2.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-001.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-002.html60
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-003.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-004.html64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-005.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-006.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-007.html66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-008.html64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-009.html62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-010.html64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-011.html62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-101.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-102.html60
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-103.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-104.html64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-105.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-106.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-107.html68
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-108.html64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-109.html62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-110.html64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-111.html62
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-203.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-204.html64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-205.html44
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-206.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-207.html68
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-303.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-304.html64
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-305.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-306.html42
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-307.html66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/plugindrop.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-between-ui.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-from-os.html26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-from-ui.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-os.html20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-ui-via.html30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-ui.html24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-ui-to-self.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-unicode-to-os.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/taskbardrop.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/taskbarminimise.html16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/text-os-to-os.html18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/platform/text-to-os.html26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/reload/001.xhtml34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/reload/002.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/reload/003.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/reload/006.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/reload/007.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/reload/008.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/reload/009.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/reload/010.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/reload/011.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/reload/012-2.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/001.xhtml40
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/002.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/003.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/004.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/005.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/006.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/007.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/008.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/009.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/010.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/011.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/012.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/013.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/014.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/015.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/016.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/017.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/018.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/019.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/020.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/021.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/remove/022.html20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/001.xhtml32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/002.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/003.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/006.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/007.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/008.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/001.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/002.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/003.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/004.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/005.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/006.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/007.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/008.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/009.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/010.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/011.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/012.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/013.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/014.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/015.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/016.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/017.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/018.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/019.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/020.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/021.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/022.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/023.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/024.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/025.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/026.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/027.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/028.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/029.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/030.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/031.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/032.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/033.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/034.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/035.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/036.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/045.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/046.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/047.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/048.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/049.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/050.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/051.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/052.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/053.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/054.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/055.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/056.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/057.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/058.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/059.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/060.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/061.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/062.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/063.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/064-1.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/064.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/065.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/066.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/067-1.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/067-2.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/069.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/070.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/071.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/072.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/073.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/074.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/075.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/076.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/077.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/078.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/079.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/080.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/081.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/082.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/083.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/084.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/085.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/086.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/087.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/088.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/089.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/090.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/091-2.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/092.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/093.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/094.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/095.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/096.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/097.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/098.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/099.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/100.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/101.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/102.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/103.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/104.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/105.xhtml12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/107.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/108.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/109.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/110.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/111.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/112.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/113.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/114.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/115.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/116.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/117.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/118.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/119.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/120.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/121.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/122.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/123.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/124.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/125.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/126.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/127.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/128.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/129.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/130.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/131.xhtml22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/132.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/133.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/134.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/135.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/136.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/137.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/138.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/139.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/140.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/141.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/142.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/143.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/144.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/145.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/146.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/147.html22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/148.html22
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/149.html20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/150.html20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/151.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/152.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/153.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/154.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/155.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/162.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/163.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/164.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/165.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/166.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/167.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/168.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/169.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/170.xhtml24
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/171.xhtml30
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/172.html70
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/173.html70
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-blue-box.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-input.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-textarea.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-blue-box-contenteditable.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-blue-box.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-input.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-textarea.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-scroll-then-drop-input.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/003.svg8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/004.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/008.svg8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/009.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/011.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/012.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/013-1.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/013.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/014-1.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/014.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/015.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/016-1.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/016.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/019.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/020.xhtml4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/021.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/022.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/023.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/024.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/025.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/026.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/027.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/028.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/029.xhtml10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/030.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/031.xhtml28
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/032.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/033.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/034.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/035.xhtml6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/042.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/043.xhtml14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/046.svg8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/047.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/048.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/049.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/050.xhtml8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/051.xhtml20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/052.svg10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/053.svg14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/054.svg18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/055.svg14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/056.svg96
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/057.svg200
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/058.svg34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/059-1.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/059.svg6
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/060-1.svg2
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/060.svg12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/061.svg10
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/062.svg8
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/063.svg14
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/064.svg18
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/065.svg12
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/066.svg16
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/svg/067.svg20
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/synthetic/001.html154
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/synthetic/005-manual.html570
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/synthetic/006-manual.html124
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/001-manual.html208
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/002-manual.html154
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/003-manual.html164
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/004-1.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/004-manual.html50
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/005-1.html32
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/005-manual.html50
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/006-manual.html66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/007-manual.html66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/008-manual.html74
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/009-manual.html40
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/010-manual.html40
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/011-manual.html114
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/012-manual.html98
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/013-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/101-manual.html226
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/102-manual.html54
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/103-1.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/103-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/104-1.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/104-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/105-1.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/105-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/106-1.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/106-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/107-1.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/107-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/108-1.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/108-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/109-1.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/109-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/110-1.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/110-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/111-manual.html76
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/112-manual.html82
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/113-manual.html66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/114-manual.html82
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/115-manual.html66
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/116-manual.html44
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/117-1.html48
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/117-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/118-1.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/118-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/201-manual.html156
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/202.html118
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-mustallow.html34
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-mustblock.html26
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-showorigin.html46
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html142
-rw-r--r--tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html106
-rw-r--r--tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-001.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-002.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-003.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-004.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-005.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-006.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-007.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-008.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-009.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-010.html4
-rw-r--r--tests/wpt/web-platform-tests/html/editing/focus/tabindex-focus-flag.html62
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html95
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/echo.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/structuredclone/echo.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/no-transferring.html2
-rw-r--r--tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html400
-rw-r--r--tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html4
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign-ref.xhtmlbin0 -> 588 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign_bottom.xhtmlbin0 -> 814 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign_top.xhtmlbin0 -> 802 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-direction-ref.html37
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-direction.html38
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-direction-ref.html45
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-direction.html46
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-group-direction-ref.html45
-rw-r--r--tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-group-direction.html54
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html51
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html92
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html36
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/support/refresh.py4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_media_change.html43
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_non_matching_media.html20
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_type.html71
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_type_change.html39
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/historical.html1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/mime-types/canPlayType.html5
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html44
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-order.html83
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-data-url.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/security.reset.cross.html8
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/security.reset.redirect.html8
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html38
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_001.htm32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_002.htm25
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_003-manual.htm32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_004-manual.htm33
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_005.htm32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_006-manual.htm37
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_007-manual.htm37
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_008-manual.htm37
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_010-manual.htm37
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_011.htm (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_011.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_012.htm34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_013.htm36
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_014.htm34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_015.htm34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_016.htm33
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_017.htm34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_018.htm34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_019.htm34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_020-manual.htm34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_021-manual.htm44
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_022-manual.htm37
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_023.htm33
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_024.htm32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_025.htm30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_026.htm32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_027.htm32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_028.htm33
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_029.htm32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_030.htm31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_031.htm32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_032.htm32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/blank.htm2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-on-popup.html14
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-that-tries-to-navigate-parent-and-sends-result-to-grandparent.html11
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-its-child.html4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-its-child.html11
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-itself.html11
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_001.htm11
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_002.htm (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_002.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_003.htm (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_003.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_004.htm10
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_006.htm (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_006.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_007.htm (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_007.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_008.htm9
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_010.htm9
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_012.htm (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_012.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020.htm28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020a.htm13
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021.htm28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021a.htm13
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_022.htm11
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_023.htm (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_023.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_024.htm (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_024.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_026.htm12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_027.htm21
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_028.htm (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_028.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_029.htm (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_029.htm)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_031.htm19
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_032.htm27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/sandbox.pdf (renamed from tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox.pdf)bin80990 -> 80990 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/sandbox_helper.js14
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-fail.htm9
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-iframe-content.htm9
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-pass.htm9
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/adoption.html91
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html54
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html82
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html121
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html133
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html128
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode.html138
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/delay-load-event-detached.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/delay-load-event.html35
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/non-active-document.html52
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/usemap-casing.html92
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address.html19
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/form-control-infrastructure/association.window.js7
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html17
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/submission-checks.window.js62
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/selection-value-interactions.html23
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-checkvalidity.html44
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-labels.html48
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-setcustomvalidity.html43
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-validationmessage.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-validity.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-willvalidate.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html45
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html44
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html41
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-validity.html41
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html41
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-action.html43
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-checkvalidity.html47
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-elements-filter.html20
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-length.html38
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/files.html25
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-checkvalidity.html44
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-height.html42
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-labels.html49
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-setcustomvalidity.html43
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-stepdown.html44
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-stepup.html45
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-validationmessage.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-validity.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-value-invalidstateerr.html41
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html41
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html39
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-width.html42
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-willvalidate.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/iframe-label-attributes.html8
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/label-attributes.html212
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/labelable-elements.html1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-progress-element/progress.window.js18
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml26
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html91
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html42
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html65
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html55
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/resources/common.js18
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/interfaces.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/links/following-hyperlinks/activation-behavior.window.js50
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/links/following-hyperlinks/active-document.window.js23
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/001.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/002.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/003.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/004.html25
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/005.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/006.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/007.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/008.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/009.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/010.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/011.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/012.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/013.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/014.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/015.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/015a.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/016.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/017.html33
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/018.html35
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/019.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/020.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/021.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/022.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/023.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/023.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/024.html32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/025.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/026.html33
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/027.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/028.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/029.html37
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/030.html39
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/031.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/032.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/033.html35
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/034.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/035.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/036.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/037.html33
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/038.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/039.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/039.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/040.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/041.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/042.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/043.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/044.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/045.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/046.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/047.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/048.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/049.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/050.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/050.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/051.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/052.html26
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/053.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/054.html33
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/055.html32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/056.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/057.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/058.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/059.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/060.html32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/061.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/062.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/063.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/064.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/065.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/066.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/067.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/067.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/068.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/069.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/069.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/070.html48
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/071.html55
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/072.html50
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/073.html52
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/074.html49
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/075.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/075.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/076.html32
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/077.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/077.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/078.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/078.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/079.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/079.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/080.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/081.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/082.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/083.html48
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/084.html47
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/085.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/086.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/087.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/088.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/089.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/090.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/091.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/092.html26
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/094.html23
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/095.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/096.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/097.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/099.html19
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/101.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/101.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/102.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/103.html39
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/104.html39
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/105.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/106-import.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/106-import.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/106-noimport.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/106-noimport.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/107-import.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/107-import.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/107-noimport.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/107-noimport.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/108.html25
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/109.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/110.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/111.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/111.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/112.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/112.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/113.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/114.html26
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/115.html26
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/116.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/117.html25
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/118.html25
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/119.html (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/119.html)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/120.html17
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/121.html17
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/122.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/123.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/124.html25
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/125.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/126.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/127.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/128.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/129.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/130.html34
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/131.html22
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/132.html22
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/133.html29
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/134.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/135.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/136.html33
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/137.html21
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/138.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/139.html30
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/140.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/141.html26
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/142.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/143.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/144.html28
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/145.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/146.html22
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/147.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/148.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/149.html59
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/css/background.css (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/css/background.css)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/css/import.css (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/css/import.css)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld-postMessage.html19
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld.html15
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/count-script-tags.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/count-script-tags.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-body.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/find-body.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-foo.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/find-foo.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-1.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-1.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-10.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-10.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-11.js4
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-2.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-2.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-3.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-3.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-4.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-4.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-5.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-5.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-6.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-6.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-7.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-7.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-8.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-8.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-9.js (renamed from tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-9.js)0
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/testlib/testlib.js43
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-1.html68
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-2.html22
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-3.html22
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-event.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-01.html52
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-02.html26
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-03.html37
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/credentials.sub.html71
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html31
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html21
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html19
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html5
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html5
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external.js7
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html12
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html56
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html56
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html54
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html54
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling-parseerror-dependentmultiple.html19
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling.html1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/imports-a.js1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4a.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4b.js3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4c.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4d.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5a.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5b.js3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5c.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5d.js3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5e.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html36
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6a.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6b.js3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6c.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6d.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html37
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7a.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7b.js3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7c.js3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7d.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7e.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7f.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-matches-inner.js1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-matches.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-mismatches-inner.js1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-mismatches.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity.html40
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html62
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/load-error-events.html61
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py20
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/credentials-iframe.sub.html50
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8-with-charset-header.js1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8.js1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-utf8-with-charset-header.js1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-utf8.js1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/throw-error.js3
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-16be.jsbin0 -> 142 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-16le.jsbin0 -> 142 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-8.js2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/load-error-events-helpers.js47
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/load-error-events.py15
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/slow.py5
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-language-type.html18
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-languages-01.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-languages-02.html98
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-empty.html48
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-js.html99
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-with-params.html41
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html91
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/template-content.html64
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/checked-type-change.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/indeterminate-type-change.html24
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html43
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html27
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html36
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/required-optional-hidden.html36
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/tabular-data/processing-model-1/span-limits.html1
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/a-download-404.py2
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html25
-rw-r--r--tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/resources/a-download-404.html2
-rw-r--r--tests/wpt/web-platform-tests/html/syntax/parsing-html-fragments/the-input-byte-stream-003.htmlbin2624 -> 2632 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/syntax/parsing-html-fragments/the-input-byte-stream-004.htmlbin2612 -> 2624 bytes
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/basic.html51
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-suspended.html93
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/scripting/events/messageevent-constructor.https.html4
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content.html136
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/001.xhtml16
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/002.xhtml19
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/003.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/004.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/005.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/006.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/historical.window.js10
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html19
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/001.xhtml17
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/002.xhtml19
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/003.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/004.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/005.xhtml18
-rw-r--r--tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/006.xhtml19
-rw-r--r--tests/wpt/web-platform-tests/http/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/http/refresh/README.md1
-rw-r--r--tests/wpt/web-platform-tests/http/refresh/navigate.window.js23
-rw-r--r--tests/wpt/web-platform-tests/http/refresh/resources/multiple.asis6
-rw-r--r--tests/wpt/web-platform-tests/http/refresh/resources/refresh.py4
-rw-r--r--tests/wpt/web-platform-tests/http/refresh/resources/refreshed.txt1
-rw-r--r--tests/wpt/web-platform-tests/http/refresh/subresource.any.js6
-rw-r--r--tests/wpt/web-platform-tests/image-decodes/image-decode-iframe.html55
-rw-r--r--tests/wpt/web-platform-tests/image-decodes/image-decode-path-changes.html112
-rw-r--r--tests/wpt/web-platform-tests/image-decodes/image-decode.html112
-rw-r--r--tests/wpt/web-platform-tests/images/smiley.png.headers1
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/README.md7
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/OWNERS (renamed from tests/wpt/web-platform-tests/assumptions/OWNERS)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/ahem-ref.html322
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/ahem.html319
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/canvas-background-ref.html (renamed from tests/wpt/web-platform-tests/assumptions/canvas-background-ref.html)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/canvas-background.html (renamed from tests/wpt/web-platform-tests/assumptions/canvas-background.html)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/html-elements.html (renamed from tests/wpt/web-platform-tests/assumptions/html-elements.html)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/initial-color-ref.html (renamed from tests/wpt/web-platform-tests/assumptions/initial-color-ref.html)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/initial-color.html (renamed from tests/wpt/web-platform-tests/assumptions/initial-color.html)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/medium-font-size-ref.html (renamed from tests/wpt/web-platform-tests/assumptions/medium-font-size-ref.html)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/medium-font-size.html (renamed from tests/wpt/web-platform-tests/assumptions/medium-font-size.html)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/min-font-size-ref.html (renamed from tests/wpt/web-platform-tests/assumptions/min-font-size-ref.html)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/min-font-size.html (renamed from tests/wpt/web-platform-tests/assumptions/min-font-size.html)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/assumptions/tools/ahem-generate-table.py102
-rwxr-xr-xtests/wpt/web-platform-tests/infrastructure/assumptions/tools/build.sh (renamed from tests/wpt/web-platform-tests/assumptions/tools/build.sh)0
-rw-r--r--tests/wpt/web-platform-tests/infrastructure/expected-fail/failing-test.html (renamed from tests/wpt/web-platform-tests/infrastructure/failing-test.html)0
-rw-r--r--tests/wpt/web-platform-tests/innerText/getter-tests.js7
-rw-r--r--tests/wpt/web-platform-tests/input-events/input-events-cut-paste-manual.html83
-rw-r--r--tests/wpt/web-platform-tests/input-events/input-events-exec-command.html86
-rw-r--r--tests/wpt/web-platform-tests/input-events/input-events-get-target-ranges-manual.html76
-rw-r--r--tests/wpt/web-platform-tests/input-events/input-events-typing-data-manual.html38
-rw-r--r--tests/wpt/web-platform-tests/input-events/input-events-typing-manual.html60
-rw-r--r--tests/wpt/web-platform-tests/interfaces/clipboard.idl13
-rw-r--r--tests/wpt/web-platform-tests/interfaces/console.idl22
-rw-r--r--tests/wpt/web-platform-tests/interfaces/cssom-view.idl184
-rw-r--r--tests/wpt/web-platform-tests/interfaces/cssom.idl323
-rw-r--r--tests/wpt/web-platform-tests/interfaces/dedicated-workers.idl133
-rw-r--r--tests/wpt/web-platform-tests/interfaces/dom.idl30
-rw-r--r--tests/wpt/web-platform-tests/interfaces/geometry.idl28
-rw-r--r--tests/wpt/web-platform-tests/interfaces/html.idl1230
-rw-r--r--tests/wpt/web-platform-tests/interfaces/payment-handler.idl55
-rw-r--r--tests/wpt/web-platform-tests/interfaces/payment-request.idl114
-rw-r--r--tests/wpt/web-platform-tests/interfaces/remoteplayback.idl32
-rw-r--r--tests/wpt/web-platform-tests/interfaces/uievents.idl181
-rw-r--r--tests/wpt/web-platform-tests/interfaces/web-share.idl12
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webidl.idl44
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webrtc-pc.idl129
-rw-r--r--tests/wpt/web-platform-tests/interfaces/webusb.idl176
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/bounding-box.html61
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/client-rect.html45
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/containing-block.html73
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/cross-origin-iframe.html52
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/disconnect.html53
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/display-none.html54
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/edge-inclusive-intersection.html66
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/iframe-no-root.html71
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/multiple-targets.html80
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/multiple-thresholds.html96
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/observer-attributes.html31
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/observer-exceptions.html48
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/observer-in-iframe.html9
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/observer-without-js-reference.html50
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/remove-element.html82
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/resources/cross-origin-subframe.html125
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/resources/iframe-no-root-subframe.html4
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/resources/intersection-observer-test-utils.js122
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/resources/observer-in-iframe-subframe.html65
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/resources/timestamp-subframe.html28
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/root-margin.html86
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/same-document-no-root.html61
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/same-document-root.html90
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/same-document-zero-size-target.html61
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/shadow-content.html44
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/timestamp.html99
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/unclipped-root.html57
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/zero-area-element-hidden.html43
-rw-r--r--tests/wpt/web-platform-tests/intersection-observer/zero-area-element-visible.html39
-rwxr-xr-xtests/wpt/web-platform-tests/lint11
-rw-r--r--tests/wpt/web-platform-tests/lint.whitelist147
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/longtask-attributes.html37
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/longtask-in-childiframe-crossorigin.html49
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/longtask-in-childiframe.html52
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/longtask-in-externalscript.html33
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/longtask-in-parentiframe.html29
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/longtask-in-raf.html35
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/longtask-in-sibling-iframe-crossorigin.html12
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/longtask-in-sibling-iframe.html11
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/resources/makelongtask.js2
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/resources/raflongtask.js2
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/resources/subframe-observing-longtask.html21
-rw-r--r--tests/wpt/web-platform-tests/longtask-timing/resources/subframe-with-longtask.html2
-rw-r--r--tests/wpt/web-platform-tests/magnetometer/Magnetometer.https.html2
-rw-r--r--tests/wpt/web-platform-tests/magnetometer/OWNERS3
-rw-r--r--tests/wpt/web-platform-tests/magnetometer/idlharness.https.html59
-rw-r--r--tests/wpt/web-platform-tests/magnetometer/support-iframe.html10
-rwxr-xr-xtests/wpt/web-platform-tests/manifest8
-rw-r--r--tests/wpt/web-platform-tests/mathml/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-1.html3
-rw-r--r--tests/wpt/web-platform-tests/mathml/relations/html5-tree/href-click-2.html3
-rw-r--r--tests/wpt/web-platform-tests/media-source/interfaces.html2
-rw-r--r--tests/wpt/web-platform-tests/media-source/mediasource-append-buffer.html52
-rw-r--r--tests/wpt/web-platform-tests/media-source/mediasource-seekable.html3
-rw-r--r--tests/wpt/web-platform-tests/media/test-a-128k-44100Hz-1ch.webmbin0 -> 9840 bytes
-rw-r--r--tests/wpt/web-platform-tests/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webmbin0 -> 76501 bytes
-rw-r--r--tests/wpt/web-platform-tests/media/test-v-128k-320x240-24fps-8kfr.webmbin0 -> 38195 bytes
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-fromelement/capture.html44
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-fromelement/creation.html43
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-fromelement/ended.html43
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/GUM-api.https.html9
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/GUM-deny.https.html18
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/GUM-empty-option-param.https.html23
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/GUM-impossible-constraint.https.html18
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/GUM-optional-constraint.https.html16
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/GUM-trivial-constraint.https.html16
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/GUM-unknownkey-option-param.https.html34
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-IDL-all.html2
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html28
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html56
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-add-audio-track.https.html5
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-audio-only.https.html3
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-default-feature-policy.https.sub.html61
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https.html5
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-gettrackid.https.html7
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-id-manual.https.html15
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-idl.https.html46
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-removetrack.https.html5
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-video-only.https.html3
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-audio-is-silence.https.html3
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html51
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-end-manual.https.html3
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html60
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-id.https.html4
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-init.https.html28
-rw-r--r--tests/wpt/web-platform-tests/mediacapture-streams/historical.html18
-rw-r--r--tests/wpt/web-platform-tests/microdata/encoding-microdata/names-the-itemprop-attribute/original-id.json1
-rw-r--r--tests/wpt/web-platform-tests/microdata/introduction/global-identifiers-for-items/.gitkeep0
-rw-r--r--tests/wpt/web-platform-tests/microdata/introduction/overview/.gitkeep0
-rw-r--r--tests/wpt/web-platform-tests/microdata/introduction/selecting-names-when-defining-vocabularies/.gitkeep0
-rw-r--r--tests/wpt/web-platform-tests/microdata/introduction/the-basic-syntax/.gitkeep0
-rw-r--r--tests/wpt/web-platform-tests/microdata/introduction/typed-items/.gitkeep0
-rw-r--r--tests/wpt/web-platform-tests/microdata/introduction/using-the-microdata-dom-api/.gitkeep0
-rw-r--r--tests/wpt/web-platform-tests/microdata/terminology/.gitkeep0
-rw-r--r--tests/wpt/web-platform-tests/navigation-timing/idlharness.html109
-rw-r--r--tests/wpt/web-platform-tests/navigation-timing/nav2_idlharness.html1
-rw-r--r--tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_exist.html1
-rw-r--r--tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_values.html33
-rw-r--r--tests/wpt/web-platform-tests/navigation-timing/resources/webperftestharness.js5
-rw-r--r--tests/wpt/web-platform-tests/netinfo/netinfo-basics.html37
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.resize.html56
-rw-r--r--tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html50
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_autocomplete-manual.html47
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_list-manual.html47
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasdate-manual.html52
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasnumber-manual.html44
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_length-manual.html56
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_selectedindex-manual.html50
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_checkvalidity.html44
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_labels.html48
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_setcustomvalidity.html43
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_validationmessage.html40
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_validity.html40
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_willvalidate.html40
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_checkvalidity.html45
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_setcustomvalidity.html44
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validationmessage.html41
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validity.html41
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_willvalidate.html41
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_action.html43
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_checkvalidity.html47
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_length.html38
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_submit.html51
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_checkvalidity.html44
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_height.html42
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_labels.html49
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_setcustomvalidity.html43
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_stepdown.html44
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_stepup.html45
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_validationmessage.html40
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_validity.html40
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_value_invalidstateerr.html41
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_valueasdate_invalidstateerr.html41
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_valueasnumber_invalidstateerr.html39
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_width.html42
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_willvalidate.html40
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Session_History/contents/Session_History/css/result.css12
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Infraware/Session_History/contents/Session_History/index.html63
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_000-manual.htm2
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_002-manual.htm2
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_013-manual.htm2
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_015-manual.htm2
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue-area.pngbin1469 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue-border.pngbin1823 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue.pngbin485 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/fail.gifbin24480 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/movie_300_frame_0.pngbin11493 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster.pngbin83058 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_blue.pngbin5316 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_green.pngbin5130 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_red.pngbin4605 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/rect.svg4
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_001.htm11
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_004.htm10
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_008.htm9
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_010.htm9
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_020.htm28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_020a.htm13
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_021.htm28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_021a.htm13
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_022.htm11
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_026.htm12
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_027.htm21
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_031.htm19
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_032.htm27
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_001.htm33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_002.htm25
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_003-manual.htm32
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_004-manual.htm33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_005.htm33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_006-manual.htm37
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_007-manual.htm37
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_008-manual.htm37
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_010-manual.htm37
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_012.htm36
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_013.htm38
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_014.htm36
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_015.htm36
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_016.htm35
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_017.htm36
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_018.htm36
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_019.htm36
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_020-manual.htm34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_021-manual.htm44
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_022-manual.htm38
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_023.htm34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_024.htm33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_025.htm32
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_026.htm33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_027.htm33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_028.htm34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_029.htm33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_030.htm33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_031.htm33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_032.htm33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_helper.js14
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-fail.htm9
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-iframe-content.htm9
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-pass.htm9
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/selection/addRange.htm72
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/selection/collapse.htm73
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/structuredclone/structuredclone_0.html400
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/xhtml5/colgroup_valign_bottom.xhtmlbin1246 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Microsoft/xhtml5/colgroup_valign_top.xhtmlbin1202 -> 0 bytes
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/001.html27
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/002.html27
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/003.html27
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/004.html25
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/005.html27
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/006.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/007.html27
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/008.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/009.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/010.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/011.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/012.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/013.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/014.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/015.html34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/015a.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/016.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/017.html33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/018.html35
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/019.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/020.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/021.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/022.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/024.html32
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/025.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/026.html33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/027.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/028.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/029.html37
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/030.html39
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/031.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/032.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/033.html35
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/034.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/035.html35
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/036.html34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/037.html33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/038.html34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/040.html34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/041.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/042.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/043.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/044.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/045.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/046.html27
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/047.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/048.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/049.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/051.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/052.html26
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/053.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/054.html33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/055.html32
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/056.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/057.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/058.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/059.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/060.html32
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/061.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/062.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/063.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/064.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/065.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/066.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/068.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/070.html48
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/071.html55
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/072.html50
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/073.html52
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/074.html49
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/076.html32
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/080.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/081.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/082.html34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/083.html48
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/084.html47
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/085.html24
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/086.html24
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/087.html24
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/088.html24
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/089.html34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/090.html34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/091.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/092.html26
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/094.html23
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/095.html24
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/096.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/097.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/099.html19
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/100.html19
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/102.html24
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/103.html39
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/104.html39
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/105.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/108.html25
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/109.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/110.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/113.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/114.html26
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/115.html26
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/116.html24
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/117.html26
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/118.html26
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/120.html17
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/121.html17
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/122.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/123.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/124.html25
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/125.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/126.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/127.html34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/128.html34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/129.html40
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/130.html34
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/131.html22
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/132.html22
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/133.html29
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/134.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/135.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/136.html33
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/137.html21
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/138.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/139.html30
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/140.html24
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/141.html26
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/142.html27
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/143.html31
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/144.html28
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/145.html24
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/146.html22
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/147.html40
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/148.html40
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/149.html59
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/pages/helloworld-postMessage.html19
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/pages/helloworld.html15
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-11.js4
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-12.js4
-rw-r--r--tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/testlib/testlib.js43
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/OWNERS3
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor.https.html103
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor_insecure_context.html21
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor_onerror-manual.https.html22
-rw-r--r--tests/wpt/web-platform-tests/orientation-sensor/idlharness.https.html57
-rw-r--r--tests/wpt/web-platform-tests/page-visibility/idlharness.html5
-rw-r--r--tests/wpt/web-platform-tests/page-visibility/iframe-unload.html49
-rw-r--r--tests/wpt/web-platform-tests/page-visibility/onvisibilitychange.html17
-rw-r--r--tests/wpt/web-platform-tests/page-visibility/resources/iframe-with-subframes.html6
-rw-r--r--tests/wpt/web-platform-tests/page-visibility/resources/iframe.html12
-rw-r--r--tests/wpt/web-platform-tests/page-visibility/resources/pagevistestharness.js2
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/basetest.html46
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-contentful-bg-image.html41
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-contentful-canvas.html41
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-contentful-image.html40
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-contentful-paint.html66
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-contentful-svg.html40
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-paint-bg-color.html37
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/first-paint-only.html40
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/paint-visited.html43
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/resources/circle.svg3
-rw-r--r--tests/wpt/web-platform-tests/paint-timing/resources/circles.pngbin0 -> 2479 bytes
-rw-r--r--tests/wpt/web-platform-tests/payment-handler/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/payment-handler/interfaces.https.any.js20
-rw-r--r--tests/wpt/web-platform-tests/payment-method-basic-card/OWNERS4
-rw-r--r--tests/wpt/web-platform-tests/payment-method-basic-card/empty-data-manual.https.html139
-rw-r--r--tests/wpt/web-platform-tests/payment-method-basic-card/payment-request-canmakepayment-method.https.html89
-rw-r--r--tests/wpt/web-platform-tests/payment-method-id/OWNERS3
-rw-r--r--tests/wpt/web-platform-tests/payment-method-id/README.md4
-rw-r--r--tests/wpt/web-platform-tests/payment-request/OWNERS5
-rw-r--r--tests/wpt/web-platform-tests/payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html92
-rw-r--r--tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.http.html12
-rw-r--r--tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.https.html52
-rw-r--r--tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-call-immediate-manual.https.html193
-rw-r--r--tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-duplicate-shipping-options-manual.https.html97
-rw-r--r--tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-method-abort-update-manual.https.html269
-rw-r--r--tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-state-checks-manual.https.html115
-rw-r--r--tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updatewith-method.https.html66
-rw-r--r--tests/wpt/web-platform-tests/payment-request/algorithms-manual.https.html166
-rw-r--r--tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html2
-rw-r--r--tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-same-origin.https.html2
-rw-r--r--tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/basic.https.html2
-rw-r--r--tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/echo-PaymentRequest.html2
-rw-r--r--tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html26
-rw-r--r--tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html6
-rw-r--r--tests/wpt/web-platform-tests/payment-request/change-shipping-option-manual.https.html94
-rw-r--r--tests/wpt/web-platform-tests/payment-request/historical.https.html12
-rw-r--r--tests/wpt/web-platform-tests/payment-request/interfaces.https.html151
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-abort-method.https.html2
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-canmakepayment-method.https.html162
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-canmakepayment-method.https.http148
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-constructor-crash.https.html21
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-constructor.https.html969
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-ctor-currency-code-checks.https.html339
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-ctor-pmi-handling.https.html145
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-id-attribute.https.html25
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-id.https.html18
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-in-iframe.html18
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-onshippingaddresschange-attribute.https.html7
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-onshippingoptionchange-attribute.https.html7
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-response-id.html4
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-shippingAddress-attribute.https.html28
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-shippingOption-attribute.https.html100
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-shippingType-attribute.https.html62
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-show-method.https.html19
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-update-event-constructor.http.html14
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-update-event-constructor.https.html51
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-request-update-event-updatewith-method.https.html66
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-response/complete-method-manual.https.html84
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-response/helpers.js139
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-response/methodName-attribute-manual.https.html28
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-response/payerEmail-attribute-manual.https.html48
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-response/payerName-attribute-manual.https.html48
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-response/payerPhone-attribute-manual.https.html48
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-response/requestId-attribute-manual.https.html34
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-response/shippingAddress-attribute-manual.https.html101
-rw-r--r--tests/wpt/web-platform-tests/payment-request/payment-response/shippingOption-attribute-manual.https.html43
-rw-r--r--tests/wpt/web-platform-tests/payment-request/rejects_if_not_active.https.html156
-rw-r--r--tests/wpt/web-platform-tests/payment-request/resources/page1.html1
-rw-r--r--tests/wpt/web-platform-tests/payment-request/resources/page2.html1
-rw-r--r--tests/wpt/web-platform-tests/payment-request/shipping-address-changed-manual.https.html85
-rw-r--r--tests/wpt/web-platform-tests/payment-request/updateWith-method-pmi-handling-manual.https.html131
-rw-r--r--tests/wpt/web-platform-tests/payment-request/user-abort-algorithm-manual.https.html70
-rw-r--r--tests/wpt/web-platform-tests/payment-request/user-accepts-payment-request-algo-manual.https.html220
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/idlharness.html24
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/performanceobservers.js23
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/po-callback-mutate.any.js66
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/po-disconnect.any.js11
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/po-entries-sort.any.js64
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/po-observe.any.js43
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/po-observe.html3
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/resources/worker-with-performance-observer.js6
-rw-r--r--tests/wpt/web-platform-tests/performance-timeline/worker-with-performance-observer.html18
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/html/pointerevent_drag_interaction-manual.html87
-rw-r--r--tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js8
-rw-r--r--tests/wpt/web-platform-tests/preload/download-resources.html18
-rw-r--r--tests/wpt/web-platform-tests/preload/dynamic-adding-preload-nonce.html40
-rw-r--r--tests/wpt/web-platform-tests/preload/dynamic-adding-preload-nonce.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/dynamic-adding-preload.html5
-rw-r--r--tests/wpt/web-platform-tests/preload/link-header-on-subresource.html17
-rw-r--r--tests/wpt/web-platform-tests/preload/link-header-preload-delay-onload.html12
-rw-r--r--tests/wpt/web-platform-tests/preload/link-header-preload-delay-onload.html.headers6
-rw-r--r--tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html16
-rw-r--r--tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html.headers3
-rw-r--r--tests/wpt/web-platform-tests/preload/link-header-preload.html8
-rw-r--r--tests/wpt/web-platform-tests/preload/link-header-preload.html.headers6
-rw-r--r--tests/wpt/web-platform-tests/preload/onerror-event.html2
-rw-r--r--tests/wpt/web-platform-tests/preload/onload-event.html10
-rw-r--r--tests/wpt/web-platform-tests/preload/preload-csp.sub.html18
-rw-r--r--tests/wpt/web-platform-tests/preload/preload-default-csp.sub.html18
-rw-r--r--tests/wpt/web-platform-tests/preload/preload-with-type.html14
-rw-r--r--tests/wpt/web-platform-tests/preload/reflected-as-value.html1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/A4.ogvbin0 -> 94372 bytes
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/A4.ogv.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/CanvasTest.ttfbin0 -> 2528 bytes
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/CanvasTest.ttf.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/dummy-preloads-subresource.css1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/dummy-preloads-subresource.css.sub.headers2
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/dummy.css.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/dummy.js.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/dummy.xml.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/empty.html.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/foo.vtt4
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/foo.vtt.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/preload_helper.js8
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/sound_5.ogabin0 -> 18541 bytes
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/sound_5.oga.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/square.png.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/white.mp4bin0 -> 13713 bytes
-rw-r--r--tests/wpt/web-platform-tests/preload/resources/white.mp4.sub.headers1
-rw-r--r--tests/wpt/web-platform-tests/preload/single-download-preload.html52
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/common.js4
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/controlling-ua/idlharness.https.html28
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/PresentationConnection_onmessage_receiving-ua.html4
-rw-r--r--tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/idlharness_receiving-ua.html22
-rw-r--r--tests/wpt/web-platform-tests/quirks-mode/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/quirks-mode/classname-query-after-sibling-adoption.html32
-rw-r--r--tests/wpt/web-platform-tests/referrer-policy/README.md6
-rw-r--r--tests/wpt/web-platform-tests/referrer-policy/generic/link-rel-prefetch.html33
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/basic.html49
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/callback-exception.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-exception.html)0
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/callback-idle-periods.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-idle-periods.html)0
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/callback-iframe.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-iframe.html)0
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/callback-invoked.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-invoked.html)0
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/callback-multiple-calls.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-multiple-calls.html)0
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/callback-removed-frame.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-removed-frame.html)0
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/callback-suspended.html93
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/callback-timeout-with-raf.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout-with-raf.html)0
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/callback-timeout.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout.html)0
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/callback-xhr-sync.html16
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/cancel-invoked.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/cancel-invoked.html)0
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/idlharness.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/idlharness.html)0
-rw-r--r--tests/wpt/web-platform-tests/requestidlecallback/resources/post_name_on_load.html (renamed from tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/resources/post_name_on_load.html)0
-rw-r--r--tests/wpt/web-platform-tests/resize-observer/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/resize-observer/eventloop.html259
-rw-r--r--tests/wpt/web-platform-tests/resize-observer/notify.html351
-rw-r--r--tests/wpt/web-platform-tests/resize-observer/observe.html207
-rw-r--r--tests/wpt/web-platform-tests/resize-observer/resources/iframe.html38
-rw-r--r--tests/wpt/web-platform-tests/resize-observer/resources/resizeTestHelper.js148
-rw-r--r--tests/wpt/web-platform-tests/resize-observer/svg.html333
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/idlharness.html22
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/blue.pngbin0 -> 1010 bytes
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/resources/gzip_xml.py5
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/single-entry-per-resource.html45
-rw-r--r--tests/wpt/web-platform-tests/resource-timing/test_resource_timing.js6
-rw-r--r--tests/wpt/web-platform-tests/resources/OWNERS3
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/README.md4
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/chooser_service.mojom.js279
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/chooser_service.mojom.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/device.mojom.js3460
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/device.mojom.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/device_manager.mojom.js856
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/device_manager.mojom.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/mojo_bindings.js5129
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/mojo_bindings.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/string16.mojom.js159
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/string16.mojom.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/webusb-test.js541
-rw-r--r--tests/wpt/web-platform-tests/resources/chromium/webusb-test.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/resources/idlharness.js517
-rw-r--r--tests/wpt/web-platform-tests/resources/idlharness.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/resources/sriharness.js100
-rw-r--r--tests/wpt/web-platform-tests/resources/test/README.md6
-rw-r--r--tests/wpt/web-platform-tests/resources/test/conftest.py5
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/add_cleanup_count.html41
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/api-tests-1.html88
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlArray/is_json_type.html195
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlDictionary/get_inheritance_stack.html35
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/default_to_json_operation.html189
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/get_inheritance_stack.html35
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/has_default_to_json_regular_operation.html47
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/has_to_json_regular_operation.html32
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/test_immutable_prototype.html321
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/test_to_json_operation.html190
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/traverse_inherited_and_consequential_interfaces.html65
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterfaceMember/is_to_json_regular_operation.html42
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/basic.html35
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tests/idlharness/helper.js24
-rw-r--r--tests/wpt/web-platform-tests/resources/test/tox.ini2
-rw-r--r--tests/wpt/web-platform-tests/resources/test/wptserver.py2
-rw-r--r--tests/wpt/web-platform-tests/resources/testharness.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/resources/testharness.js122
-rw-r--r--tests/wpt/web-platform-tests/resources/testharness.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/resources/testharnessreport.js4
-rw-r--r--tests/wpt/web-platform-tests/resources/testharnessreport.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/resources/webidl2/lib/webidl2.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/selection/addRange.htm29
-rw-r--r--tests/wpt/web-platform-tests/selection/collapse.htm30
-rw-r--r--tests/wpt/web-platform-tests/selection/interfaces.html37
-rw-r--r--tests/wpt/web-platform-tests/selection/removeAllRanges.html9
-rwxr-xr-xtests/wpt/web-platform-tests/serve5
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/blue.png.sub.headers2
-rw-r--r--tests/wpt/web-platform-tests/server-timing/resources/green.png.sub.headers2
-rw-r--r--tests/wpt/web-platform-tests/server-timing/test_server_timing.html34
-rw-r--r--tests/wpt/web-platform-tests/server-timing/test_server_timing.html.sub.headers2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/resources/close-worker.js1
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/claim-fetch.https.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/claim-shared-worker-fetch.https.html68
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/claim-worker-fetch.https.html68
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-client-types.https.html7
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-redirect.https.html273
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https.html266
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event.https.html255
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/fetch-frame-resource.https.html11
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/fetch-request-xhr.https.html92
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/immutable-prototype-serviceworker.https.html23
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/import-scripts-redirect.https.html33
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-sw.https.html12
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-window.https.html37
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/interfaces.https.html58
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-basic.https.html11
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-mime-types.https.html11
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-scope.https.html12
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-script-url.https.html11
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-script.https.html11
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-security-error.https.html11
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/mime-sniffing.https.html24
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/redirect-scope.py1
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/opaque-response-preloaded.https.html35
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/register-link-element.https.html25
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/registration-basic.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/registration-mime-types.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/registration-scope.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/registration-script-url.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/registration-script.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/registration-security-error.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html222
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/registration.https.html9
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/bytecheck-worker-imported-script.py19
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/bytecheck-worker.py32
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-shared-worker-fetch-iframe.html13
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-shared-worker-fetch-worker.js8
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-worker-fetch-iframe.html13
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-worker-fetch-worker.js5
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/extendable-event-async-waituntil.js21
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-canvas-tainting-iframe.html7
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-redirect-iframe.html25
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-xhr-iframe.https.html32
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-response-xhr-iframe.https.html4
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/immutable-prototype-serviceworker.js19
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-redirect-import.js1
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-redirect-worker.js1
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces-idls.js130
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces-worker.sub.js86
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces.js15
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/mime-sniffing-worker.js5
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-out-scope.py2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-scope1.py2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-scope2.py2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-being-preloaded-xhr.html33
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-iframe.html34
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-worker.js2
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-xhr.html35
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-basic.js44
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-mime-types.js86
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-scope.js102
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-script-url.js64
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-script.js88
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-security-error.js78
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests.js460
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/skip-waiting-installed-worker.js22
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/test-helpers.sub.js29
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-max-aged-worker-imported-script.py12
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-max-aged-worker.py28
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/skip-waiting-installed.https.html5
-rw-r--r--tests/wpt/web-platform-tests/service-workers/service-worker/update-bytecheck.https.html72
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/Extensions-to-Event-Interface.html24
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/event-post-dispatch.html226
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/event-with-related-target.html36
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/historical.html25
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/resources/event-path-test-helpers.js8
-rw-r--r--tests/wpt/web-platform-tests/shadow-dom/slotchange-customelements.html55
-rw-r--r--tests/wpt/web-platform-tests/speech-api/OWNERS3
-rw-r--r--tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-ownership.html19
-rw-r--r--tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-twice.html17
-rw-r--r--tests/wpt/web-platform-tests/speech-api/historical.html18
-rw-r--r--tests/wpt/web-platform-tests/storage/interfaces.https.worker.js (renamed from tests/wpt/web-platform-tests/storage/interfaces.worker.js)0
-rw-r--r--tests/wpt/web-platform-tests/streams/byte-length-queuing-strategy.js7
-rw-r--r--tests/wpt/web-platform-tests/streams/count-queuing-strategy.js7
-rw-r--r--tests/wpt/web-platform-tests/streams/generate-test-wrappers.js11
-rw-r--r--tests/wpt/web-platform-tests/streams/piping/pipe-through.js126
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.dedicatedworker.html11
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.html10
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.js194
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.serviceworker.https.html12
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.sharedworker.html11
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.dedicatedworker.html11
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.html10
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.js156
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.serviceworker.https.html12
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.sharedworker.html11
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/general.js2
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.dedicatedworker.html11
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.html10
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.js147
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.serviceworker.https.html12
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.sharedworker.html11
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/brand-checks.js101
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/default-reader.js2
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/general.js4
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.dedicatedworker.html11
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.html10
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.js108
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.serviceworker.https.html12
-rw-r--r--tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.sharedworker.html11
-rw-r--r--tests/wpt/web-platform-tests/streams/resources/test-utils.js22
-rw-r--r--tests/wpt/web-platform-tests/streams/writable-streams/brand-checks.html2
-rw-r--r--tests/wpt/web-platform-tests/streams/writable-streams/brand-checks.js111
-rw-r--r--tests/wpt/web-platform-tests/streams/writable-streams/properties.js2
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-broken-signature.js1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-broken-signature.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature-headers.js1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature-headers.js.headers4
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature.js1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature2.js1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature2.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-no-signature.js1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature.js1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature2.js1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature2.js.headers1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature-headers.css1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature-headers.css.headers4
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature.css1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature2.css1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature2.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-no-signature.css1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-wrong-signature.css1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-wrong-signature.css.headers1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style.css1
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/ed25519-style.css.headers2
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/subresource-css-ed25519.tentative.html126
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/subresource-ed25519-with-csp.tentative.html51
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/subresource-ed25519.tentative.html83
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/subresource-integrity.sub.html97
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/tools/ed25519.py109
-rw-r--r--tests/wpt/web-platform-tests/subresource-integrity/tools/list_hashes.py28
-rw-r--r--tests/wpt/web-platform-tests/svg/historical.html4
-rw-r--r--tests/wpt/web-platform-tests/svg/interfaces.html3
-rw-r--r--tests/wpt/web-platform-tests/tools/browserutils/browser.py325
-rw-r--r--tests/wpt/web-platform-tests/tools/browserutils/install.py23
-rw-r--r--tests/wpt/web-platform-tests/tools/browserutils/virtualenv.py52
-rw-r--r--tests/wpt/web-platform-tests/tools/certs/cacert.pem83
-rw-r--r--tests/wpt/web-platform-tests/tools/certs/cakey.pem30
-rw-r--r--tests/wpt/web-platform-tests/tools/certs/web-platform.test.key28
-rw-r--r--tests/wpt/web-platform-tests/tools/certs/web-platform.test.pem86
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/__init__.py (renamed from tests/wpt/web-platform-tests/tools/browserutils/__init__.py)0
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/before_install.sh11
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/check_stability.py385
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/ci_built_diff.sh25
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/ci_lint.sh9
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/ci_resources_unittest.sh20
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/ci_stability.sh22
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/ci_tools_unittest.sh25
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/ci_wpt.sh19
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/commands.json6
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/install.sh11
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/jobs.py119
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/lib.sh45
-rwxr-xr-xtests/wpt/web-platform-tests/tools/ci/run.sh10
-rw-r--r--tests/wpt/web-platform-tests/tools/ci/tests/test_jobs.py76
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/commands.json3
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/lint.py71
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/tests/test_file_lints.py45
-rw-r--r--tests/wpt/web-platform-tests/tools/lint/tests/test_lint.py18
-rw-r--r--tests/wpt/web-platform-tests/tools/localpaths.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/commands.json3
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/log.py12
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/manifest.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/sourcefile.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/tests/test_sourcefile.py20
-rw-r--r--tests/wpt/web-platform-tests/tools/manifest/update.py28
-rw-r--r--tests/wpt/web-platform-tests/tools/pytest.ini2
-rw-r--r--tests/wpt/web-platform-tests/tools/serve/commands.json2
-rw-r--r--tests/wpt/web-platform-tests/tools/serve/serve.py18
-rw-r--r--tests/wpt/web-platform-tests/tools/tox.ini4
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py63
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/error.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py22
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/__init__.py (renamed from tests/wpt/web-platform-tests/webdriver/actions/__init__.py)0
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/browser.py374
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/commands.json9
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/install.py46
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/markdown.py55
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/paths5
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/requirements.txt (renamed from tests/wpt/web-platform-tests/tools/browserutils/requirements.txt)0
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/run.py419
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/stability.py195
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/testfiles.py286
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py138
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/tox.ini21
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/utils.py (renamed from tests/wpt/web-platform-tests/tools/browserutils/utils.py)0
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/virtualenv.py52
-rw-r--r--tests/wpt/web-platform-tests/tools/wpt/wpt.py142
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrun.py308
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/requirements_ie.txt2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py9
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/edge.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py41
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/ie.py81
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/sauce.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py160
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py10
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorinternetexplorer.py10
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py257
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py15
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait.js18
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_marionette.js17
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_servodriver.js15
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_webdriver.js43
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/testharness_marionette.js1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py110
-rwxr-xr-xtests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters.py54
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py112
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py223
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py1
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/metadata.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/sync.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py6
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/webdriver_server.py17
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py45
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py2
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/static.py3
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py38
-rw-r--r--tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py29
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/tests/functional/test_handlers.py8
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py4
-rw-r--r--tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py6
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/TrustedHTML.tentative.html17
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/TrustedScriptURL.tentative.html23
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/TrustedURL.tentative.html41
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-innerHTML.tentative.html36
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-insertAdjacentHTML.tentative.html93
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-location-href.tentative.html41
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-outerHTML.tentative.html53
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-script-src.tentative.html56
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/document-write.tentative.html14
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/innerHTML.tentative.html22
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/insertAdjacentHTML.tentative.html61
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/location-href.tentative.html30
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/outerHTML.tentative.html30
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/script-src.tentative.html30
-rw-r--r--tests/wpt/web-platform-tests/trusted-types/support/helper.js47
-rw-r--r--tests/wpt/web-platform-tests/uievents/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/uievents/constructors/inputevent-constructor.html12
-rw-r--r--tests/wpt/web-platform-tests/uievents/interfaces.html48
-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/keyboard/key.css (renamed from tests/wpt/web-platform-tests/uievents/keyboard/key-manual.css)0
-rw-r--r--tests/wpt/web-platform-tests/uievents/keyboard/key.js (renamed from tests/wpt/web-platform-tests/uievents/keyboard/key-manual.js)0
-rw-r--r--tests/wpt/web-platform-tests/uievents/legacy/Event-subclasses-init.html17
-rwxr-xr-xtests/wpt/web-platform-tests/update-built-tests.sh2
-rw-r--r--tests/wpt/web-platform-tests/url/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/url/setters_tests.json10
-rw-r--r--tests/wpt/web-platform-tests/url/urlsearchparams-constructor.html6
-rw-r--r--tests/wpt/web-platform-tests/url/urlsearchparams-delete.html15
-rw-r--r--tests/wpt/web-platform-tests/url/urlsearchparams-sort.html7
-rw-r--r--tests/wpt/web-platform-tests/url/urltestdata.json157
-rw-r--r--tests/wpt/web-platform-tests/user-timing/measure.html2
-rw-r--r--tests/wpt/web-platform-tests/user-timing/measure_navigation_timing.html2
-rw-r--r--tests/wpt/web-platform-tests/vibration/api-is-present.html1
-rw-r--r--tests/wpt/web-platform-tests/vibration/cancel-when-hidden-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/vibration/cancel-with-0-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/vibration/cancel-with-array-0-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/vibration/cancel-with-empty-array-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/vibration/cancel-with-new-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/vibration/invalid-values.html2
-rw-r--r--tests/wpt/web-platform-tests/vibration/pattern-array-extra-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/vibration/pattern-array-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/vibration/pattern-array-with-0-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/vibration/silent-ignore.html1
-rw-r--r--tests/wpt/web-platform-tests/vibration/simple-array-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/vibration/simple-scalar-manual.html1
-rw-r--r--tests/wpt/web-platform-tests/viewport/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-attribute-event-handlers-manual.html75
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-dimensions-custom-scrollbars-manual.html22
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-dimensions-scrollbars-manual.html22
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-no-resize-event-on-overflow-recalc.html4
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-offset-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-page-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-read-size-causes-layout.html12
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-read-size-in-iframe-causes-layout.html8
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-resize-event-manual.html6
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-resize-event-on-load-overflowing-page.html6
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-scale-iframe-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-scale-manual.html12
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-scroll-event-manual.html18
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-scrollbars-cause-resize.html18
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-type.html18
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-unscaled-scale-iframe.html8
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-unscaled-scale.html8
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-unscaled-scroll-iframe.html18
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-unscaled-scroll.html18
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-unscaled-size-iframe.html26
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-unscaled-size.html26
-rw-r--r--tests/wpt/web-platform-tests/viewport/viewport-url-bar-changes-height-manual.html87
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/alertdialog_modal_false-manual.html11
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/alertdialog_modal_true-manual.html11
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/application_activedescendant-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/application_activedescendant_value_changes-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-current_not_declared-manual.html18
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_changes-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_date-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_location-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_page-manual.html24
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_step-manual.html24
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_time-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_true-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_unspecified-manual.html18
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-details_pointing_to_details_element-manual.html25
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/aria-details_pointing_to_div_element-manual.html25
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/article_in_feed_posinset_and_setsize-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/article_in_feed_setsize_-1-manual.html6
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/article_not_in_feed_posinset_and_setsize-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_haspopup_dialog-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_haspopup_emptystring-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_haspopup_false-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_haspopup_foo-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_haspopup_grid-manual.html17
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_haspopup_listbox-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_haspopup_menu-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_haspopup_tree-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_haspopup_true-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_haspopup_unspecified-manual.html18
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_roledescription_empty-manual.html4
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_roledescription_valid-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/button_roledescription_whitespace_only-manual.html6
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_div-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_headers_and_border-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_three_actual_columns-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_with_html_colspan_not_specified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_div-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3_with_three_actual_rows-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_with_html_rowspan_not_specified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_colindex_4-manual.html9
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/cell_rowindex_4-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_false-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_true-manual.html12
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_unspecified-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_div-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3_with_three_actual_columns-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_with_html_colspan_not_specified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_div-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3_with_three_actual_rows-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_with_html_rowspan_not_specified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_colindex_4-manual.html9
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_rowindex_4-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_selected_false_not_automatically_propagated-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/columnheader_selected_true_not_automatically_propagated-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_controls_an_invalid_id-manual.html5
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_dialog-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_false-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_grid-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_listbox-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_menu-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_tree-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_true-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_unspecified-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_orientation_horizontal-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_orientation_unspecified-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_orientation_vertical-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_readonly_false-manual.html22
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_readonly_true-manual.html22
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/combobox_readonly_unspecified-manual.html22
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/dialog_modal_false-manual.html11
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/dialog_modal_true-manual.html11
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/dialog_modal_unspecified-manual.html11
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/div_element_without_role_roledescription_valid-manual.html12
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/errormessage_object_in_invalid_state-manual.html37
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/errormessage_object_in_valid_state-manual.html45
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/feed-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/figure-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_aria-readonly_false_automatically_propagated-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_aria-readonly_true_automatically_propagated-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_busy_false-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_busy_true-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_busy_value_changes-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_colcount_8-manual.html7
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_false-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_true-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_unspecified-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_false-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_true-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_unspecified-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_rowcount_3-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_false-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_true-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_unspecified-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_false-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_true-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_unspecified-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/gridcell_aria-colspan_2_on_div-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/gridcell_aria-rowspan_2_on_div-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/gridcell_colindex_4-manual.html9
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/gridcell_rowindex_4-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/group_hidden_undefined_element_not_rendered-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/group_hidden_undefined_element_rendered-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/heading_level_unspecified-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/keyshortcuts_multiple_shortcuts-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/keyshortcuts_one_shortcut-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/listbox_busy_false-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/listbox_busy_true-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/listbox_orientation_horizontal-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/listbox_orientation_unspecified-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/listbox_orientation_vertical-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/listbox_readonly_false-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/listbox_readonly_true-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/listbox_readonly_unspecified-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/listitem_setsize_-1-manual.html6
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menu_orientation_horizontal-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menu_orientation_unspecified-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menu_orientation_vertical-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menubar_busy_false-manual.html4
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menubar_busy_true-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menubar_orientation_horizontal-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menubar_orientation_unspecified-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menubar_orientation_vertical-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menuitem_posinset_and_setsize-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_posinset_and_setsize-manual.html12
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_false-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_true-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_unspecified-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menuitemradio_posinset_and_setsize-manual.html12
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_false-manual.html18
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_true-manual.html18
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_unspecified-manual.html18
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/none-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/option_selected_false-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/option_selected_true-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/option_selected_undefined-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/option_selected_value_changes-manual.html19
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_horizontal-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_unspecified-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_vertical-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_false-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_true-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_unspecified-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/region_with_name-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/region_without_name-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/row_colindex_4-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/row_rowindex_4-manual.html17
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/rowheader_aria-colspan_2_on_div-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/rowheader_aria-rowspan_2_on_div-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/rowheader_colindex_4-manual.html9
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/rowheader_rowindex_4-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/rowheader_selected_false_not_automatically_propagated-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/rowheader_selected_true_not_automatically_propagated-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/scrollbar_all_values_unspecified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/scrollbar_only_valuenow_unspecified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/scrollbar_orientation_unspecified-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_activedescendant-manual.html34
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_activedescendant_value_changes-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_both-manual.html7
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_inline-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_list-manual.html7
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_none-manual.html7
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_unspecified-manual.html7
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_false-manual.html22
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_true-manual.html12
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_unspecified-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_placeholder-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_false-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_true-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_unspecified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_required_false-manual.html26
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_required_true-manual.html26
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/searchbox_required_unspecified-manual.html26
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/separator_focusable_all_values_unspecified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/separator_focusable_only_valuenow_unspecified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/separator_focusable_valuetext-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/separator_orientation_unspecified-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/separator_unfocusable_all_values_unspecified-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/separator_unfocusable_valuetext-manual.html6
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/slider_all_values_unspecified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/slider_only_valuenow_unspecified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/slider_orientation_unspecified-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/slider_readonly_false-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/slider_readonly_true-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/slider_readonly_unspecified-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/spinbutton_all_values_unspecified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/spinbutton_only_aria-valuenow_unspecified-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_false-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_true-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_unspecified-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/switch_checked_false-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/switch_checked_mixed-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/switch_checked_true-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/switch_checked_undefined-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/switch_checked_value_changes-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/switch_readonly_false-manual.html26
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/switch_readonly_true-manual.html28
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/switch_readonly_unspecified-manual.html26
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/tab_posinset_and_setsize-manual.html16
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/table_colcount_-1-manual.html7
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/table_colcount_8-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/table_rowcount_-1-manual.html7
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/table_rowcount_3-manual.html7
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/tablist_orientation_horizontal-manual.html10
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/tablist_orientation_unspecified-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/tablist_orientation_vertical-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/term_role-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/textbox_placeholder-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_horizontal-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_unspecified-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_vertical-manual.html14
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/tools/make_tests.pl84
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/tree_orientation_horizontal-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/tree_orientation_unspecified-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/tree_orientation_vertical-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/treegrid_colcount_8-manual.html7
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_horizontal-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_unspecified-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_vertical-manual.html8
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/treegrid_rowcount_3-manual.html7
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/treeitem_selected_false-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/treeitem_selected_true-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/treeitem_selected_undefined-manual.html2
-rw-r--r--tests/wpt/web-platform-tests/wai-aria/treeitem_selected_value_changes-manual.html19
-rw-r--r--tests/wpt/web-platform-tests/wasm/create_multiple_memory.worker.js13
-rw-r--r--tests/wpt/web-platform-tests/wasm/many-memories.window.js19
-rw-r--r--tests/wpt/web-platform-tests/wasm/wasm_service_worker_test.html20
-rw-r--r--tests/wpt/web-platform-tests/wasm/wasm_service_worker_test.https.html21
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js74
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js348
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-filters.html210
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-shapes.html152
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-transform.html242
-rw-r--r--tests/wpt/web-platform-tests/web-animations/animation-model/keyframe-effects/spacing-keyframes.html391
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/Animatable/animate-no-browsing-context.html108
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/AnimationTimeline/idlharness.html2
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/constructor.html2
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite.html71
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html5
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/setTarget.html71
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/spacing.html60
-rw-r--r--tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffectReadOnly/spacing.html239
-rw-r--r--tests/wpt/web-platform-tests/web-animations/resources/keyframe-utils.js8
-rw-r--r--tests/wpt/web-platform-tests/web-animations/resources/xhr-doc.py5
-rw-r--r--tests/wpt/web-platform-tests/web-animations/testcommon.js5
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_hw_disabled-manual.https.html32
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_insecure_context.html39
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_push.https.html167
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_push_ArrayBuffer-manual.https.html40
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_push_DOMString-manual.https.html37
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_recordType_empty-manual.https.html34
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_recordType_json-manual.https.html34
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_recordType_opaque-manual.https.html34
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_recordType_text-manual.https.html34
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_recordType_url-manual.https.html35
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/nfc_watch.https.html73
-rw-r--r--tests/wpt/web-platform-tests/web-nfc/resources/nfc_help.js81
-rw-r--r--tests/wpt/web-platform-tests/web-share/OWNERS2
-rw-r--r--tests/wpt/web-platform-tests/web-share/idlharness.https.html32
-rw-r--r--tests/wpt/web-platform-tests/web-share/resources/manual-helper.js78
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-cancel-manual.html24
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-empty.https.html34
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-extra-argument-manual.html21
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-extra-field-manual.html21
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-non-string-manual.html23
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-null-manual.html22
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-securecontext.http.html16
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-simple-manual.html28
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-unicode-strings-manual.html25
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-unicode-strings-nonutf8-manual.html27
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-url-data-manual.html19
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-url-empty-manual.html18
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-url-encoding-manual.html22
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-url-invalid.https.html20
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-url-noscheme-manual.html19
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-url-pathonly-manual.html19
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-url-relative-manual.html20
-rw-r--r--tests/wpt/web-platform-tests/web-share/share-without-user-gesture.https.html19
-rw-r--r--tests/wpt/web-platform-tests/webaudio/historical.html15
-rw-r--r--tests/wpt/web-platform-tests/webaudio/js/helpers.js10
-rw-r--r--tests/wpt/web-platform-tests/webaudio/js/vendor-prefixes.js2
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html8
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiodestinationnode-interface/idl-test.html8
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audioparam-interface/idl-test.html8
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-delaynode-interface/idl-test.html8
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html8
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html1
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html1
-rw-r--r--tests/wpt/web-platform-tests/webaudio/the-audio-api/the-waveshapernode-interface/curve-tests.html1
-rw-r--r--tests/wpt/web-platform-tests/webdriver/OWNERS5
-rw-r--r--tests/wpt/web-platform-tests/webdriver/README.md95
-rw-r--r--tests/wpt/web-platform-tests/webdriver/actions/conftest.py34
-rw-r--r--tests/wpt/web-platform-tests/webdriver/actions/key.py154
-rw-r--r--tests/wpt/web-platform-tests/webdriver/actions/mouse.py113
-rw-r--r--tests/wpt/web-platform-tests/webdriver/actions/sequence.py31
-rw-r--r--tests/wpt/web-platform-tests/webdriver/actions/special_keys.py32
-rw-r--r--tests/wpt/web-platform-tests/webdriver/actions/support/test_actions_wdspec.html170
-rw-r--r--tests/wpt/web-platform-tests/webdriver/conftest.py14
-rw-r--r--tests/wpt/web-platform-tests/webdriver/contexts.py97
-rw-r--r--tests/wpt/web-platform-tests/webdriver/elements/active.py6
-rw-r--r--tests/wpt/web-platform-tests/webdriver/get_title.py282
-rw-r--r--tests/wpt/web-platform-tests/webdriver/interface/interface.html21
-rw-r--r--tests/wpt/web-platform-tests/webdriver/navigation.py102
-rw-r--r--tests/wpt/web-platform-tests/webdriver/support/asserts.py119
-rw-r--r--tests/wpt/web-platform-tests/webdriver/support/fixtures.py222
-rw-r--r--tests/wpt/web-platform-tests/webdriver/support/http_request.py22
-rw-r--r--tests/wpt/web-platform-tests/webdriver/support/inline.py19
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/__init__.py (renamed from tests/wpt/web-platform-tests/webdriver/actions/support/__init__.py)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/actions/__init__.py (renamed from tests/wpt/web-platform-tests/microdata/encoding-microdata/microdata-and-other-namespaces/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/actions/conftest.py34
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/actions/key.py154
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/actions/mouse.py136
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/actions/sequence.py146
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/actions/special_keys.py39
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/actions/support/__init__.py (renamed from tests/wpt/web-platform-tests/microdata/encoding-microdata/names-the-itemprop-attribute/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/actions/support/keys.py (renamed from tests/wpt/web-platform-tests/webdriver/actions/support/keys.py)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/actions/support/refine.py (renamed from tests/wpt/web-platform-tests/webdriver/actions/support/refine.py)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/actions/support/test_actions_wdspec.html181
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/conftest.py14
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/contexts/maximize_window.py277
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/contexts/resizing_and_positioning.py61
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/cookies/cookies.py28
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/element_click/__init__.py (renamed from tests/wpt/web-platform-tests/microdata/encoding-microdata/the-microdata-model/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/element_click/select.py213
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/fullscreen_window.py208
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/get_window_rect.py161
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/interaction/send_keys_content_editable.py23
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/interface.html (renamed from tests/wpt/web-platform-tests/webdriver/interface.html)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/minimize_window.py225
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/navigation/current_url.py102
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/navigation/get_title.py282
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/retrieval/__init__.py (renamed from tests/wpt/web-platform-tests/microdata/encoding-microdata/values/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element.py59
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element_from_element.py59
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element_from_elements.py58
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_elements.py60
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/sessions/get_timeouts.py46
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/conftest.py22
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/create.py27
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/default_values.py48
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/invalid_capabilities.py88
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/merge.py76
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/response.py54
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/set_window_rect.py506
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/state/__init__.py (renamed from tests/wpt/web-platform-tests/microdata/iana/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/state/get_element_attribute.py192
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/state/get_element_property.py164
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/state/get_element_tag_name.py146
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/state/is_element_selected.py180
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/state/text/__init__.py (renamed from tests/wpt/web-platform-tests/microdata/introduction/.gitkeep)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/state/text/get_text.py29
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/status.py21
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/support/__init__.py (renamed from tests/wpt/web-platform-tests/webdriver/support/__init__.py)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/support/asserts.py122
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/support/fixtures.py250
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/support/http_request.py23
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/support/inline.py40
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/support/merge_dictionaries.py (renamed from tests/wpt/web-platform-tests/webdriver/support/merge_dictionaries.py)0
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/support/wait.py28
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/user_prompts/accept_alert.py46
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/user_prompts/dismiss_alert.py46
-rw-r--r--tests/wpt/web-platform-tests/webdriver/tests/user_prompts/get_alert_text.py59
-rw-r--r--tests/wpt/web-platform-tests/webmessaging/Channel_postMessage_ports_readonly_array.htm7
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCCertificate.html4
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCConfiguration-bundlePolicy.html128
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCConfiguration-helper.js24
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceCandidatePoolSize.html14
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceServers.html570
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceTransportPolicy.html119
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCConfiguration-rtcpMuxPolicy.html143
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-helper.js114
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https.html165
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-ontonechange-long.https.html50
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-ontonechange.https.html285
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCDtlsTransport-getRemoteCertificates.html105
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCIceTransport.html190
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addIceCandidate.html379
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addTrack.https.html285
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addTransceiver.html422
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-constructor.html62
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createAnswer.html17
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createDataChannel.html281
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createOffer.html12
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getDefaultIceServers.html98
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getIdentityAssertion.html400
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html187
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getTransceivers.html8
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-helper.js58
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-onnegotiationneeded.html110
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-ontrack.https.html270
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-peerIdentity.html318
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.html232
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https.html310
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver.html267
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-answer.html164
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html147
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html153
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-rollback.html123
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription.html243
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-answer.html117
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html135
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html150
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html111
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription.html279
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpCapabilities-helper.js52
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-codecs.html233
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-degradationPreference.html85
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-encodings.html396
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-headerExtensions.html75
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-helper.js262
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-rtcp.html105
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-transactionId.html146
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getCapabilities.html34
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getContributingSources.https.html86
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getParameters.html47
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getStats.html54
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html76
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpSender-getCapabilities.html40
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpSender-getStats.html54
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpSender-replaceTrack.html25
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpSender-setParameters.html30
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver-setCodecPreferences.html136
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver-setDirection.html94
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCSctpTransport-constructor.html24
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCStats-helper.js857
-rw-r--r--tests/wpt/web-platform-tests/webrtc/RTCTrackEvent-constructor.html158
-rw-r--r--tests/wpt/web-platform-tests/webrtc/coverage/RTCDTMFSender.txt122
-rw-r--r--tests/wpt/web-platform-tests/webrtc/coverage/identity.txt220
-rw-r--r--tests/wpt/web-platform-tests/webrtc/coverage/set-session-description.txt240
-rw-r--r--tests/wpt/web-platform-tests/webrtc/dictionary-helper.js101
-rw-r--r--tests/wpt/web-platform-tests/webrtc/historical.html37
-rw-r--r--tests/wpt/web-platform-tests/webrtc/identity-helper.js70
-rw-r--r--tests/wpt/web-platform-tests/webrtc/interfaces.html231
-rw-r--r--tests/wpt/web-platform-tests/webrtc/simplecall.html12
-rw-r--r--tests/wpt/web-platform-tests/websockets/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/websockets/constructor/010.html13
-rw-r--r--tests/wpt/web-platform-tests/websockets/constructor/011.html12
-rw-r--r--tests/wpt/web-platform-tests/websockets/unload-a-document/001-1.html2
-rw-r--r--tests/wpt/web-platform-tests/websockets/unload-a-document/001-2.html4
-rw-r--r--tests/wpt/web-platform-tests/websockets/unload-a-document/001.html2
-rw-r--r--tests/wpt/web-platform-tests/websockets/unload-a-document/002-1.html2
-rw-r--r--tests/wpt/web-platform-tests/websockets/unload-a-document/002-2.html4
-rw-r--r--tests/wpt/web-platform-tests/websockets/unload-a-document/002.html2
-rw-r--r--tests/wpt/web-platform-tests/webstorage/resources/storage_session_window_noopener_second.html34
-rw-r--r--tests/wpt/web-platform-tests/webstorage/storage_enumerate.html42
-rw-r--r--tests/wpt/web-platform-tests/webstorage/storage_session_window_noopener.html36
-rw-r--r--tests/wpt/web-platform-tests/webusb/README.md12
-rw-r--r--tests/wpt/web-platform-tests/webusb/idlharness.https.html251
-rw-r--r--tests/wpt/web-platform-tests/webusb/resources/check-availability.html9
-rw-r--r--tests/wpt/web-platform-tests/webusb/resources/fake-devices.js90
-rw-r--r--tests/wpt/web-platform-tests/webusb/resources/featurepolicytest.js14
-rw-r--r--tests/wpt/web-platform-tests/webusb/resources/open-in-iframe.html16
-rw-r--r--tests/wpt/web-platform-tests/webusb/resources/usb-helpers.js129
-rw-r--r--tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html27
-rw-r--r--tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy-attribute.https.sub.html28
-rw-r--r--tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy.https.sub.html18
-rw-r--r--tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy.https.sub.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/webusb/usb-default-feature-policy.https.sub.html18
-rw-r--r--tests/wpt/web-platform-tests/webusb/usb-disabled-by-feature-policy.https.sub.html18
-rw-r--r--tests/wpt/web-platform-tests/webusb/usb-disabled-by-feature-policy.https.sub.html.headers2
-rw-r--r--tests/wpt/web-platform-tests/webusb/usb-manual.https.html131
-rw-r--r--tests/wpt/web-platform-tests/webusb/usbConnectionEvent.https.html22
-rw-r--r--tests/wpt/web-platform-tests/webusb/usbDevice-iframe.https.html51
-rw-r--r--tests/wpt/web-platform-tests/webusb/usbDevice.https.html654
-rw-r--r--tests/wpt/web-platform-tests/webusb/usbInTransferResult.https.html31
-rw-r--r--tests/wpt/web-platform-tests/webusb/usbIsochronousInTransferPacket.https.html33
-rw-r--r--tests/wpt/web-platform-tests/webusb/usbIsochronousInTransferResult.https.html41
-rw-r--r--tests/wpt/web-platform-tests/webusb/usbIsochronousOutTransferPacket.https.html26
-rw-r--r--tests/wpt/web-platform-tests/webusb/usbIsochronousOutTransferResult.https.html24
-rw-r--r--tests/wpt/web-platform-tests/webusb/usbOutTransferResult.https.html24
-rw-r--r--tests/wpt/web-platform-tests/webvr/idlharness.html10
-rw-r--r--tests/wpt/web-platform-tests/webvr/webvr-disabled-by-feature-policy.https.sub.html33
-rw-r--r--tests/wpt/web-platform-tests/webvr/webvr-disabled-by-feature-policy.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html27
-rw-r--r--tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy-attribute.https.sub.html25
-rw-r--r--tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy.https.sub.html30
-rw-r--r--tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html30
-rw-r--r--tests/wpt/web-platform-tests/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html.headers1
-rw-r--r--tests/wpt/web-platform-tests/webvtt/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/webvtt/api/VTTCue/align.html9
-rw-r--r--tests/wpt/web-platform-tests/webvtt/api/VTTCue/common.js8
-rw-r--r--tests/wpt/web-platform-tests/webvtt/api/VTTCue/line.html7
-rw-r--r--tests/wpt/web-platform-tests/webvtt/api/VTTCue/snapToLines.html7
-rw-r--r--tests/wpt/web-platform-tests/webvtt/api/VTTCue/text.html5
-rw-r--r--tests/wpt/web-platform-tests/webvtt/api/VTTCue/vertical.html7
-rw-r--r--tests/wpt/web-platform-tests/webvtt/api/VTTRegion/id.html21
-rw-r--r--tests/wpt/web-platform-tests/webvtt/api/historical.html35
-rw-r--r--tests/wpt/web-platform-tests/webvtt/api/interfaces.html7
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/buildtests.py78
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/common.js9
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/entities.dat54
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/tags.dat166
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/text.dat29
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/timestamps.dat5
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/tree-building.dat83
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/entities.html21
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/tags.html21
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/text.html19
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/timestamps.html2
-rw-r--r--tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/tree-building.html14
-rw-r--r--tests/wpt/web-platform-tests/workers/OWNERS1
-rw-r--r--tests/wpt/web-platform-tests/workers/WorkerLocation-origin.sub.window.js11
-rw-r--r--tests/wpt/web-platform-tests/workers/Worker_dispatchEvent_ErrorEvent.htm6
-rw-r--r--tests/wpt/web-platform-tests/workers/data-url.html4
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces.idl104
-rw-r--r--tests/wpt/web-platform-tests/workers/interfaces.worker.js2
-rw-r--r--tests/wpt/web-platform-tests/workers/name-property.html6
-rw-r--r--tests/wpt/web-platform-tests/workers/postMessage_ports_readonly_array.htm6
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/interface-objects/002.worker.js3
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.html2
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/navigation/001.html4
-rw-r--r--tests/wpt/web-platform-tests/workers/semantics/navigation/002.html6
-rw-r--r--tests/wpt/web-platform-tests/workers/support/WorkerLocation-origin.html6
-rw-r--r--tests/wpt/web-platform-tests/workers/support/WorkerLocation.js1
-rw-r--r--tests/wpt/web-platform-tests/workers/support/name-as-accidental-global.js8
-rw-r--r--tests/wpt/web-platform-tests/workers/support/name.js9
-rw-r--r--tests/wpt/web-platform-tests/workers/worker-performance.worker.js128
-rw-r--r--tests/wpt/web-platform-tests/worklets/README.md1
-rw-r--r--tests/wpt/web-platform-tests/worklets/animation-worklet-import.html14
-rw-r--r--tests/wpt/web-platform-tests/worklets/paint-worklet-import.html14
-rw-r--r--tests/wpt/web-platform-tests/worklets/resources/empty-worklet-script.js1
-rw-r--r--tests/wpt/web-platform-tests/worklets/resources/import-cyclic-worklet-script.js1
-rw-r--r--tests/wpt/web-platform-tests/worklets/resources/import-nested-internal-worklet-script.js1
-rw-r--r--tests/wpt/web-platform-tests/worklets/resources/import-nested-worklet-script.js1
-rw-r--r--tests/wpt/web-platform-tests/worklets/resources/import-tests.js114
-rw-r--r--tests/wpt/web-platform-tests/worklets/resources/throwing-worklet-script.js1
-rwxr-xr-xtests/wpt/web-platform-tests/wpt5
-rw-r--r--tests/wpt/web-platform-tests/wpt.py1
-rwxr-xr-xtests/wpt/web-platform-tests/wptrun5
5546 files changed, 180639 insertions, 90092 deletions
diff --git a/python/servo/testing_commands.py b/python/servo/testing_commands.py
index 8f17aa149b9..29d098e6cb4 100644
--- a/python/servo/testing_commands.py
+++ b/python/servo/testing_commands.py
@@ -496,14 +496,12 @@ class MachCommands(CommandBase):
description='Update the web platform tests',
category='testing',
parser=updatecommandline.create_parser())
- @CommandArgument('--patch', action='store_true', default=False,
- help='Create an mq patch or git commit containing the changes')
- def update_wpt(self, patch, **kwargs):
+ def update_wpt(self, **kwargs):
self.ensure_bootstrapped()
run_file = path.abspath(path.join("tests", "wpt", "update.py"))
- kwargs["no_patch"] = not patch
+ patch = kwargs.get("patch", False)
- if kwargs["no_patch"] and kwargs["sync"]:
+ if not patch and kwargs["sync"]:
print("Are you sure you don't want a patch?")
return 1
diff --git a/tests/wpt/metadata/2dcontext/conformance-requirements/2d.voidreturn.html.ini b/tests/wpt/metadata/2dcontext/conformance-requirements/2d.voidreturn.html.ini
new file mode 100644
index 00000000000..a8951ee5130
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/conformance-requirements/2d.voidreturn.html.ini
@@ -0,0 +1,5 @@
+[2d.voidreturn.html]
+ type: testharness
+ [void methods return undefined]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html.ini
new file mode 100644
index 00000000000..379f7c20b67
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html.ini
@@ -0,0 +1,26 @@
+[drawimage_canvas.html]
+ type: testharness
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 70,70 should be blue.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 70,99 should be blue.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,70 should be blue.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 82,82 should be blue.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 84,99 should be black.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,84 should be black.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,99 should be black.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 69,69 should be red.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html.ini
new file mode 100644
index 00000000000..142318dfec4
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html.ini
@@ -0,0 +1,17 @@
+[drawimage_html_image.html]
+ type: testharness
+ [Draw 100x100 image to 100x100 canvas at 0,0.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 70,99 should be light purple.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,70 should be light purple.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 99,99 should be light purple.]
+ expected: FAIL
+
+ [Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- Pixel 69,69 should be red.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html.ini
new file mode 100644
index 00000000000..983d69ca16e
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html.ini
@@ -0,0 +1,5 @@
+[drawimage_svg_image_1.html]
+ type: testharness
+ [Load a 100x100 image to a SVG image and draw it to a 100x100 canvas.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/imagebitmap/createImageBitmap-invalid-args.html.ini b/tests/wpt/metadata/2dcontext/imagebitmap/createImageBitmap-invalid-args.html.ini
new file mode 100644
index 00000000000..02038e45fee
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/imagebitmap/createImageBitmap-invalid-args.html.ini
@@ -0,0 +1,86 @@
+[createImageBitmap-invalid-args.html]
+ type: testharness
+ [createImageBitmap with a HTMLImageElement source and sw set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a HTMLImageElement source and sh set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a HTMLImageElement source and oversized (unallocatable) crop region rejects with an InvalidStateError DOMException.]
+ expected: FAIL
+
+ [createImageBitmap with a HTMLVideoElement source and sw set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a HTMLVideoElement source and sh set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a HTMLVideoElement source and oversized (unallocatable) crop region rejects with an InvalidStateError DOMException.]
+ expected: FAIL
+
+ [createImageBitmap with a HTMLCanvasElement source and sw set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a HTMLCanvasElement source and sh set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a HTMLCanvasElement source and oversized (unallocatable) crop region rejects with an InvalidStateError DOMException.]
+ expected: FAIL
+
+ [createImageBitmap with a OffscreenCanvas source and sw set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a OffscreenCanvas source and sh set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a OffscreenCanvas source and oversized (unallocatable) crop region rejects with an InvalidStateError DOMException.]
+ expected: FAIL
+
+ [createImageBitmap with a ImageData source and sw set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a ImageData source and sh set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a ImageData source and oversized (unallocatable) crop region rejects with an InvalidStateError DOMException.]
+ expected: FAIL
+
+ [createImageBitmap with a ImageBitmap source and sw set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a ImageBitmap source and sh set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a ImageBitmap source and oversized (unallocatable) crop region rejects with an InvalidStateError DOMException.]
+ expected: FAIL
+
+ [createImageBitmap with a Blob source and sw set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a Blob source and sh set to 0 rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with a Blob source and oversized (unallocatable) crop region rejects with an InvalidStateError DOMException.]
+ expected: FAIL
+
+ [createImageBitmap with undefined image source rejects with a TypeError.]
+ expected: FAIL
+
+ [createImageBitmap with null image source rejects with a TypeError.]
+ expected: FAIL
+
+ [createImageBitmap with empty image source rejects with a InvalidStateError.]
+ expected: FAIL
+
+ [createImageBitmap with empty video source rejects with a InvalidStateError.]
+ expected: FAIL
+
+ [createImageBitmap with an oversized canvas source rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with an invalid OffscreenCanvas source rejects with a RangeError.]
+ expected: FAIL
+
+ [createImageBitmap with an undecodable blob source rejects with an InvalidStateError.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html.ini b/tests/wpt/metadata/2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html.ini
new file mode 100644
index 00000000000..f860c7d33e5
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html.ini
@@ -0,0 +1,17 @@
+[createImageBitmap-sizeOverflow.html]
+ type: testharness
+ [createImageBitmap does not crash or reject the promise when passing very large sx]
+ expected: FAIL
+
+ [createImageBitmap does not crash or reject the promise when passing very large sy]
+ expected: FAIL
+
+ [createImageBitmap does not crash or reject the promise when passing very large sw]
+ expected: FAIL
+
+ [createImageBitmap does not crash or reject the promise when passing very large sh]
+ expected: FAIL
+
+ [createImageBitmap does not crash or reject the promise when passing very large sx, sy, sw and sh]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/2dcontext/transformations/2d.transformation.setTransform.multiple.html.ini b/tests/wpt/metadata/2dcontext/transformations/2d.transformation.setTransform.multiple.html.ini
new file mode 100644
index 00000000000..36b1d671802
--- /dev/null
+++ b/tests/wpt/metadata/2dcontext/transformations/2d.transformation.setTransform.multiple.html.ini
@@ -0,0 +1,5 @@
+[2d.transformation.setTransform.multiple.html]
+ type: testharness
+ [Canvas test: 2d.transformation.setTransform.multiple]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/FileAPI/idlharness.html.ini b/tests/wpt/metadata/FileAPI/idlharness.html.ini
index f4c97314499..bcf886825d9 100644
--- a/tests/wpt/metadata/FileAPI/idlharness.html.ini
+++ b/tests/wpt/metadata/FileAPI/idlharness.html.ini
@@ -12,3 +12,6 @@
[FileReader interface: calling readAsBinaryString(Blob) on new FileReader() with too few arguments must throw TypeError]
expected: FAIL
+ [FileReader interface: new FileReader() must inherit property "readAsBinaryString(Blob)" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini b/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini
index fc33de592fa..70812cb9f6f 100644
--- a/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini
+++ b/tests/wpt/metadata/FileAPI/idlharness.worker.js.ini
@@ -57,3 +57,24 @@
[FileReaderSync interface: calling readAsDataURL(Blob) on new FileReaderSync() with too few arguments must throw TypeError]
expected: FAIL
+ [FileReader interface: new FileReader() must inherit property "readAsBinaryString(Blob)" with the proper type]
+ expected: FAIL
+
+ [FileReaderSync interface: operation readAsText(Blob, DOMString)]
+ expected: FAIL
+
+ [FileReaderSync interface: new FileReaderSync() must inherit property "readAsArrayBuffer(Blob)" with the proper type]
+ expected: FAIL
+
+ [FileReaderSync interface: new FileReaderSync() must inherit property "readAsBinaryString(Blob)" with the proper type]
+ expected: FAIL
+
+ [FileReaderSync interface: new FileReaderSync() must inherit property "readAsText(Blob, DOMString)" with the proper type]
+ 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(Blob)" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index 72c1dc5e9cd..34e824fc394 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -241,6 +241,12 @@
{}
]
],
+ "audio-output/setSinkId-manual.https.html": [
+ [
+ "/audio-output/setSinkId-manual.https.html",
+ {}
+ ]
+ ],
"battery-status/battery-charging-manual.https.html": [
[
"/battery-status/battery-charging-manual.https.html",
@@ -271,12 +277,1356 @@
{}
]
],
+ "clipboard-apis/async-write-dttext-read-dttext-manual.https.html": [
+ [
+ "/clipboard-apis/async-write-dttext-read-dttext-manual.https.html",
+ {}
+ ]
+ ],
+ "clipboard-apis/async-write-dttext-read-text-manual.https.html": [
+ [
+ "/clipboard-apis/async-write-dttext-read-text-manual.https.html",
+ {}
+ ]
+ ],
+ "clipboard-apis/async-write-text-read-dttext-manual.https.html": [
+ [
+ "/clipboard-apis/async-write-text-read-dttext-manual.https.html",
+ {}
+ ]
+ ],
+ "clipboard-apis/async-write-text-read-text-manual.https.html": [
+ [
+ "/clipboard-apis/async-write-text-read-text-manual.https.html",
+ {}
+ ]
+ ],
"console/console-count-logging-manual.html": [
[
"/console/console-count-logging-manual.html",
{}
]
],
+ "core-aam/alert-manual.html": [
+ [
+ "/core-aam/alert-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/alertdialog-manual.html": [
+ [
+ "/core-aam/alertdialog-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/application-manual.html": [
+ [
+ "/core-aam/application-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-atomic_false-manual.html": [
+ [
+ "/core-aam/aria-atomic_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-atomic_true-manual.html": [
+ [
+ "/core-aam/aria-atomic_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-autocomplete_both-manual.html": [
+ [
+ "/core-aam/aria-autocomplete_both-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-autocomplete_inline-manual.html": [
+ [
+ "/core-aam/aria-autocomplete_inline-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-autocomplete_list-manual.html": [
+ [
+ "/core-aam/aria-autocomplete_list-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-busy_false-manual.html": [
+ [
+ "/core-aam/aria-busy_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-busy_true-manual.html": [
+ [
+ "/core-aam/aria-busy_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-busy_value_changes-manual.html": [
+ [
+ "/core-aam/aria-busy_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-checked_false_on_checkbox-manual.html": [
+ [
+ "/core-aam/aria-checked_false_on_checkbox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-checked_false_on_menuitemradio-manual.html": [
+ [
+ "/core-aam/aria-checked_false_on_menuitemradio-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-checked_mixed-manual.html": [
+ [
+ "/core-aam/aria-checked_mixed-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-checked_true_on_checkbox-manual.html": [
+ [
+ "/core-aam/aria-checked_true_on_checkbox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-checked_true_on_menuitemradio-manual.html": [
+ [
+ "/core-aam/aria-checked_true_on_menuitemradio-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-checked_value_changes-manual.html": [
+ [
+ "/core-aam/aria-checked_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-colcount_new-manual.html": [
+ [
+ "/core-aam/aria-colcount_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-colindex_new-manual.html": [
+ [
+ "/core-aam/aria-colindex_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-colspan_new-manual.html": [
+ [
+ "/core-aam/aria-colspan_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-controls-manual.html": [
+ [
+ "/core-aam/aria-controls-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-current_value_changes-manual.html": [
+ [
+ "/core-aam/aria-current_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-current_with_non-false_allowed_value_new-manual.html": [
+ [
+ "/core-aam/aria-current_with_non-false_allowed_value_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-current_with_unrecognized_value_new-manual.html": [
+ [
+ "/core-aam/aria-current_with_unrecognized_value_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-describedby-manual.html": [
+ [
+ "/core-aam/aria-describedby-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-details_new-manual.html": [
+ [
+ "/core-aam/aria-details_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-disabled_false-manual.html": [
+ [
+ "/core-aam/aria-disabled_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-disabled_true-manual.html": [
+ [
+ "/core-aam/aria-disabled_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-disabled_value_changes-manual.html": [
+ [
+ "/core-aam/aria-disabled_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-dropeffect_copy-manual.html": [
+ [
+ "/core-aam/aria-dropeffect_copy-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-dropeffect_execute-manual.html": [
+ [
+ "/core-aam/aria-dropeffect_execute-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-dropeffect_link-manual.html": [
+ [
+ "/core-aam/aria-dropeffect_link-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-dropeffect_move-manual.html": [
+ [
+ "/core-aam/aria-dropeffect_move-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-dropeffect_none-manual.html": [
+ [
+ "/core-aam/aria-dropeffect_none-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-dropeffect_popup-manual.html": [
+ [
+ "/core-aam/aria-dropeffect_popup-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-dropeffect_value_changes-manual.html": [
+ [
+ "/core-aam/aria-dropeffect_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-errormessage-manual.html": [
+ [
+ "/core-aam/aria-errormessage-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-expanded_false-manual.html": [
+ [
+ "/core-aam/aria-expanded_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-expanded_true-manual.html": [
+ [
+ "/core-aam/aria-expanded_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-expanded_value_changes-manual.html": [
+ [
+ "/core-aam/aria-expanded_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-flowto-manual.html": [
+ [
+ "/core-aam/aria-flowto-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-grabbed_false-manual.html": [
+ [
+ "/core-aam/aria-grabbed_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-grabbed_true-manual.html": [
+ [
+ "/core-aam/aria-grabbed_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-grabbed_value_changes-manual.html": [
+ [
+ "/core-aam/aria-grabbed_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-haspopup_dialog_new-manual.html": [
+ [
+ "/core-aam/aria-haspopup_dialog_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-haspopup_false-manual.html": [
+ [
+ "/core-aam/aria-haspopup_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-haspopup_listbox_new-manual.html": [
+ [
+ "/core-aam/aria-haspopup_listbox_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-haspopup_menu_new-manual.html": [
+ [
+ "/core-aam/aria-haspopup_menu_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-haspopup_tree_new-manual.html": [
+ [
+ "/core-aam/aria-haspopup_tree_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-haspopup_true-manual.html": [
+ [
+ "/core-aam/aria-haspopup_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-hidden_true-manual.html": [
+ [
+ "/core-aam/aria-hidden_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-hidden_true_when_element_is_focused_or_fires_event_new-manual.html": [
+ [
+ "/core-aam/aria-hidden_true_when_element_is_focused_or_fires_event_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-hidden_value_changes-manual.html": [
+ [
+ "/core-aam/aria-hidden_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-invalid_false-manual.html": [
+ [
+ "/core-aam/aria-invalid_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-invalid_grammar-manual.html": [
+ [
+ "/core-aam/aria-invalid_grammar-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-invalid_spelling-manual.html": [
+ [
+ "/core-aam/aria-invalid_spelling-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-invalid_true-manual.html": [
+ [
+ "/core-aam/aria-invalid_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-invalid_value_changes-manual.html": [
+ [
+ "/core-aam/aria-invalid_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-invalid_with_unrecognized_value_new-manual.html": [
+ [
+ "/core-aam/aria-invalid_with_unrecognized_value_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-keyshortcuts_new-manual.html": [
+ [
+ "/core-aam/aria-keyshortcuts_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-label-manual.html": [
+ [
+ "/core-aam/aria-label-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-labelledby-manual.html": [
+ [
+ "/core-aam/aria-labelledby-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-level_on_heading-manual.html": [
+ [
+ "/core-aam/aria-level_on_heading-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-level_on_non-heading-manual.html": [
+ [
+ "/core-aam/aria-level_on_non-heading-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-live_assertive-manual.html": [
+ [
+ "/core-aam/aria-live_assertive-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-live_off-manual.html": [
+ [
+ "/core-aam/aria-live_off-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-live_polite-manual.html": [
+ [
+ "/core-aam/aria-live_polite-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-modal_false_new-manual.html": [
+ [
+ "/core-aam/aria-modal_false_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-modal_true_new-manual.html": [
+ [
+ "/core-aam/aria-modal_true_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-multiline_false-manual.html": [
+ [
+ "/core-aam/aria-multiline_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-multiline_true-manual.html": [
+ [
+ "/core-aam/aria-multiline_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-multiselectable_false-manual.html": [
+ [
+ "/core-aam/aria-multiselectable_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-multiselectable_true-manual.html": [
+ [
+ "/core-aam/aria-multiselectable_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-orientation_horizontal-manual.html": [
+ [
+ "/core-aam/aria-orientation_horizontal-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-orientation_undefined_new-manual.html": [
+ [
+ "/core-aam/aria-orientation_undefined_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-orientation_vertical-manual.html": [
+ [
+ "/core-aam/aria-orientation_vertical-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-owns_may_need_manual_verification-manual.html": [
+ [
+ "/core-aam/aria-owns_may_need_manual_verification-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-placeholder_new-manual.html": [
+ [
+ "/core-aam/aria-placeholder_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-posinset-manual.html": [
+ [
+ "/core-aam/aria-posinset-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-pressed_false-manual.html": [
+ [
+ "/core-aam/aria-pressed_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-pressed_mixed-manual.html": [
+ [
+ "/core-aam/aria-pressed_mixed-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-pressed_true-manual.html": [
+ [
+ "/core-aam/aria-pressed_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-pressed_value_changes-manual.html": [
+ [
+ "/core-aam/aria-pressed_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-readonly_false-manual.html": [
+ [
+ "/core-aam/aria-readonly_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-readonly_is_unspecified_on_gridcell_new-manual.html": [
+ [
+ "/core-aam/aria-readonly_is_unspecified_on_gridcell_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-readonly_true_on_checkbox-manual.html": [
+ [
+ "/core-aam/aria-readonly_true_on_checkbox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-readonly_true_on_radiogroup-manual.html": [
+ [
+ "/core-aam/aria-readonly_true_on_radiogroup-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-readonly_true_on_textbox-manual.html": [
+ [
+ "/core-aam/aria-readonly_true_on_textbox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-readonly_value_changes-manual.html": [
+ [
+ "/core-aam/aria-readonly_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-relevant-manual.html": [
+ [
+ "/core-aam/aria-relevant-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-required_true-manual.html": [
+ [
+ "/core-aam/aria-required_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-required_value_changes-manual.html": [
+ [
+ "/core-aam/aria-required_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-roledescription_is_empty_or_whitespace_characters_new-manual.html": [
+ [
+ "/core-aam/aria-roledescription_is_empty_or_whitespace_characters_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-roledescription_new-manual.html": [
+ [
+ "/core-aam/aria-roledescription_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-rowcount_new-manual.html": [
+ [
+ "/core-aam/aria-rowcount_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-rowindex_new-manual.html": [
+ [
+ "/core-aam/aria-rowindex_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-rowspan_new-manual.html": [
+ [
+ "/core-aam/aria-rowspan_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-selected_false-manual.html": [
+ [
+ "/core-aam/aria-selected_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-selected_true-manual.html": [
+ [
+ "/core-aam/aria-selected_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-setsize_-1_new-manual.html": [
+ [
+ "/core-aam/aria-setsize_-1_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-setsize_3-manual.html": [
+ [
+ "/core-aam/aria-setsize_3-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-sort_ascending-manual.html": [
+ [
+ "/core-aam/aria-sort_ascending-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-sort_descending-manual.html": [
+ [
+ "/core-aam/aria-sort_descending-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-sort_none-manual.html": [
+ [
+ "/core-aam/aria-sort_none-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-sort_other-manual.html": [
+ [
+ "/core-aam/aria-sort_other-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-valuemax-manual.html": [
+ [
+ "/core-aam/aria-valuemax-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-valuemin-manual.html": [
+ [
+ "/core-aam/aria-valuemin-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-valuenow-manual.html": [
+ [
+ "/core-aam/aria-valuenow-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-valuenow_value_changes-manual.html": [
+ [
+ "/core-aam/aria-valuenow_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-valuetext-manual.html": [
+ [
+ "/core-aam/aria-valuetext-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/aria-valuetext_value_changes-manual.html": [
+ [
+ "/core-aam/aria-valuetext_value_changes-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/article-manual.html": [
+ [
+ "/core-aam/article-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/banner-manual.html": [
+ [
+ "/core-aam/banner-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/button_with_aria-haspopup_dialog_new-manual.html": [
+ [
+ "/core-aam/button_with_aria-haspopup_dialog_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/button_with_aria-haspopup_true-manual.html": [
+ [
+ "/core-aam/button_with_aria-haspopup_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/button_with_default_values_for_aria-pressed_and_aria-haspopup-manual.html": [
+ [
+ "/core-aam/button_with_default_values_for_aria-pressed_and_aria-haspopup-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/button_with_defined_value_for_aria-pressed-manual.html": [
+ [
+ "/core-aam/button_with_defined_value_for_aria-pressed-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/cell_new-manual.html": [
+ [
+ "/core-aam/cell_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/checkbox-manual.html": [
+ [
+ "/core-aam/checkbox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/columnheader-manual.html": [
+ [
+ "/core-aam/columnheader-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/combobox-manual.html": [
+ [
+ "/core-aam/combobox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/complementary-manual.html": [
+ [
+ "/core-aam/complementary-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/contentinfo-manual.html": [
+ [
+ "/core-aam/contentinfo-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/definition-manual.html": [
+ [
+ "/core-aam/definition-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/dialog-manual.html": [
+ [
+ "/core-aam/dialog-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/directory-manual.html": [
+ [
+ "/core-aam/directory-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/document-manual.html": [
+ [
+ "/core-aam/document-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_element_hidden_with_css_display_none-manual.html": [
+ [
+ "/core-aam/exclude_element_hidden_with_css_display_none-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_element_hidden_with_css_visibility_hidden-manual.html": [
+ [
+ "/core-aam/exclude_element_hidden_with_css_visibility_hidden-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_element_hidden_with_html5_hidden-manual.html": [
+ [
+ "/core-aam/exclude_element_hidden_with_html5_hidden-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_button-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_button-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_checkbox_new-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_checkbox_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_img-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_img-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_math-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_math-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_menuitemcheckbox_new-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_menuitemcheckbox_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_menuitemradio_new-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_menuitemradio_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_option_new-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_option_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_progressbar-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_progressbar-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_radio_new-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_radio_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_scrollbar-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_scrollbar-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_separator-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_separator-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_slider-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_slider-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_switch_new-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_switch_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/exclude_presentational_children_of_tab_new-manual.html": [
+ [
+ "/core-aam/exclude_presentational_children_of_tab_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/feed_new-manual.html": [
+ [
+ "/core-aam/feed_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/figure_new-manual.html": [
+ [
+ "/core-aam/figure_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/form-manual.html": [
+ [
+ "/core-aam/form-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/grid-manual.html": [
+ [
+ "/core-aam/grid-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/gridcell-manual.html": [
+ [
+ "/core-aam/gridcell-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/group-manual.html": [
+ [
+ "/core-aam/group-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/heading-manual.html": [
+ [
+ "/core-aam/heading-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/img-manual.html": [
+ [
+ "/core-aam/img-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/include_element_referenced_by_global_aria-controls-manual.html": [
+ [
+ "/core-aam/include_element_referenced_by_global_aria-controls-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/include_element_referenced_by_global_aria-describedby-manual.html": [
+ [
+ "/core-aam/include_element_referenced_by_global_aria-describedby-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/include_element_referenced_by_global_aria-details_new-manual.html": [
+ [
+ "/core-aam/include_element_referenced_by_global_aria-details_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/include_element_referenced_by_global_aria-errormessage_new-manual.html": [
+ [
+ "/core-aam/include_element_referenced_by_global_aria-errormessage_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/include_element_referenced_by_global_aria-flowto-manual.html": [
+ [
+ "/core-aam/include_element_referenced_by_global_aria-flowto-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/include_element_referenced_by_global_aria-labelledby-manual.html": [
+ [
+ "/core-aam/include_element_referenced_by_global_aria-labelledby-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/include_element_referenced_by_global_aria-owns-manual.html": [
+ [
+ "/core-aam/include_element_referenced_by_global_aria-owns-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/include_element_that_is_focusable-manual.html": [
+ [
+ "/core-aam/include_element_that_is_focusable-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/include_element_with_id_inside_element_with_aria-activedescendant-manual.html": [
+ [
+ "/core-aam/include_element_with_id_inside_element_with_aria-activedescendant-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/link-manual.html": [
+ [
+ "/core-aam/link-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/list-manual.html": [
+ [
+ "/core-aam/list-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/listbox_not_owned_by_or_child_of_combobox-manual.html": [
+ [
+ "/core-aam/listbox_not_owned_by_or_child_of_combobox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/listbox_owned_by_or_child_of_combobox-manual.html": [
+ [
+ "/core-aam/listbox_owned_by_or_child_of_combobox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/listitem-manual.html": [
+ [
+ "/core-aam/listitem-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/log-manual.html": [
+ [
+ "/core-aam/log-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/main-manual.html": [
+ [
+ "/core-aam/main-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/marquee-manual.html": [
+ [
+ "/core-aam/marquee-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/math-manual.html": [
+ [
+ "/core-aam/math-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/menu-manual.html": [
+ [
+ "/core-aam/menu-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/menu_child_of_menu_item-manual.html": [
+ [
+ "/core-aam/menu_child_of_menu_item-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/menubar-manual.html": [
+ [
+ "/core-aam/menubar-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/menuitem_not_owned_by_or_child_of_group-manual.html": [
+ [
+ "/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/menuitem_owned_by_or_child_of_group-manual.html": [
+ [
+ "/core-aam/menuitem_owned_by_or_child_of_group-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/menuitemcheckbox-manual.html": [
+ [
+ "/core-aam/menuitemcheckbox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/menuitemradio-manual.html": [
+ [
+ "/core-aam/menuitemradio-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/navigation-manual.html": [
+ [
+ "/core-aam/navigation-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/none_new-manual.html": [
+ [
+ "/core-aam/none_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/none_used_on_element_that_is_focused_or_fires_event-manual.html": [
+ [
+ "/core-aam/none_used_on_element_that_is_focused_or_fires_event-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/none_used_on_table_element_with_td_children_new-manual.html": [
+ [
+ "/core-aam/none_used_on_table_element_with_td_children_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/none_used_on_ul_element_with_li_children_new-manual.html": [
+ [
+ "/core-aam/none_used_on_ul_element_with_li_children_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/note-manual.html": [
+ [
+ "/core-aam/note-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/option_inside_combobox-manual.html": [
+ [
+ "/core-aam/option_inside_combobox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/option_not_inside_combobox-manual.html": [
+ [
+ "/core-aam/option_not_inside_combobox-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/presentation-manual.html": [
+ [
+ "/core-aam/presentation-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/presentation_used_on_element_that_is_focused_or_fires_event-manual.html": [
+ [
+ "/core-aam/presentation_used_on_element_that_is_focused_or_fires_event-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/presentation_used_on_table_element_with_td_children_new-manual.html": [
+ [
+ "/core-aam/presentation_used_on_table_element_with_td_children_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/presentation_used_on_ul_element_with_li_children_new-manual.html": [
+ [
+ "/core-aam/presentation_used_on_ul_element_with_li_children_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/progressbar-manual.html": [
+ [
+ "/core-aam/progressbar-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/radio-manual.html": [
+ [
+ "/core-aam/radio-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/radiogroup-manual.html": [
+ [
+ "/core-aam/radiogroup-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/region_with_an_accessible_name_new-manual.html": [
+ [
+ "/core-aam/region_with_an_accessible_name_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/region_without_an_accessible_name_new-manual.html": [
+ [
+ "/core-aam/region_without_an_accessible_name_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/row_inside_treegrid-manual.html": [
+ [
+ "/core-aam/row_inside_treegrid-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/row_not_inside_treegrid-manual.html": [
+ [
+ "/core-aam/row_not_inside_treegrid-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/rowgroup-manual.html": [
+ [
+ "/core-aam/rowgroup-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/rowheader-manual.html": [
+ [
+ "/core-aam/rowheader-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/scrollbar-manual.html": [
+ [
+ "/core-aam/scrollbar-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/search-manual.html": [
+ [
+ "/core-aam/search-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/searchbox_new-manual.html": [
+ [
+ "/core-aam/searchbox_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/separator_focusable_new-manual.html": [
+ [
+ "/core-aam/separator_focusable_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/separator_non-focusable-manual.html": [
+ [
+ "/core-aam/separator_non-focusable-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/slider-manual.html": [
+ [
+ "/core-aam/slider-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/spinbutton-manual.html": [
+ [
+ "/core-aam/spinbutton-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/status-manual.html": [
+ [
+ "/core-aam/status-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/switch_new-manual.html": [
+ [
+ "/core-aam/switch_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/tab-manual.html": [
+ [
+ "/core-aam/tab-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/table_new-manual.html": [
+ [
+ "/core-aam/table_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/tablist-manual.html": [
+ [
+ "/core-aam/tablist-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/tabpanel-manual.html": [
+ [
+ "/core-aam/tabpanel-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/term_new-manual.html": [
+ [
+ "/core-aam/term_new-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/textbox_when_aria-multiline_is_false-manual.html": [
+ [
+ "/core-aam/textbox_when_aria-multiline_is_false-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/textbox_when_aria-multiline_is_true-manual.html": [
+ [
+ "/core-aam/textbox_when_aria-multiline_is_true-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/timer-manual.html": [
+ [
+ "/core-aam/timer-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/toolbar-manual.html": [
+ [
+ "/core-aam/toolbar-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/tooltip-manual.html": [
+ [
+ "/core-aam/tooltip-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/tree-manual.html": [
+ [
+ "/core-aam/tree-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/treegrid-manual.html": [
+ [
+ "/core-aam/treegrid-manual.html",
+ {}
+ ]
+ ],
+ "core-aam/treeitem-manual.html": [
+ [
+ "/core-aam/treeitem-manual.html",
+ {}
+ ]
+ ],
"css/CSS2/backgrounds/background-012.xht": [
[
"/css/CSS2/backgrounds/background-012.xht",
@@ -9193,555 +10543,657 @@
{}
]
],
- "css/css-ui-3/nav-dir-001.html": [
+ "css/css-ui-3/resize-001.html": [
[
- "/css/css-ui-3/nav-dir-001.html",
+ "/css/css-ui-3/resize-001.html",
{}
]
],
- "css/css-ui-3/nav-dir-002.html": [
+ "css/css-ui-3/resize-002.html": [
[
- "/css/css-ui-3/nav-dir-002.html",
+ "/css/css-ui-3/resize-002.html",
{}
]
],
- "css/css-ui-3/nav-dir-003.html": [
+ "css/css-ui-3/resize-003.html": [
[
- "/css/css-ui-3/nav-dir-003.html",
+ "/css/css-ui-3/resize-003.html",
{}
]
],
- "css/css-ui-3/nav-dir-004.html": [
+ "css/css-ui-3/resize-004.html": [
[
- "/css/css-ui-3/nav-dir-004.html",
+ "/css/css-ui-3/resize-004.html",
{}
]
],
- "css/css-ui-3/nav-dir-005.html": [
+ "css/css-ui-3/resize-005.html": [
[
- "/css/css-ui-3/nav-dir-005.html",
+ "/css/css-ui-3/resize-005.html",
{}
]
],
- "css/css-ui-3/nav-dir-missing-1.html": [
+ "css/css-ui-3/resize-006.html": [
[
- "/css/css-ui-3/nav-dir-missing-1.html",
+ "/css/css-ui-3/resize-006.html",
{}
]
],
- "css/css-ui-3/nav-dir-missing-2.html": [
+ "css/css-ui-3/resize-007.html": [
[
- "/css/css-ui-3/nav-dir-missing-2.html",
+ "/css/css-ui-3/resize-007.html",
{}
]
],
- "css/css-ui-3/nav-dir-missing-3.html": [
+ "css/css-ui-3/resize-008.html": [
[
- "/css/css-ui-3/nav-dir-missing-3.html",
+ "/css/css-ui-3/resize-008.html",
{}
]
],
- "css/css-ui-3/nav-dir-missing-4.html": [
+ "css/css-ui-3/resize-009.html": [
[
- "/css/css-ui-3/nav-dir-missing-4.html",
+ "/css/css-ui-3/resize-009.html",
{}
]
],
- "css/css-ui-3/nav-dir-target-001.html": [
+ "css/css-ui-3/resize-010.html": [
[
- "/css/css-ui-3/nav-dir-target-001.html",
+ "/css/css-ui-3/resize-010.html",
{}
]
],
- "css/css-ui-3/nav-dir-target-002.html": [
+ "css/css-ui-3/resize-011.html": [
[
- "/css/css-ui-3/nav-dir-target-002.html",
+ "/css/css-ui-3/resize-011.html",
{}
]
],
- "css/css-ui-3/nav-dir-target-003.html": [
+ "css/css-ui-3/resize-012.html": [
[
- "/css/css-ui-3/nav-dir-target-003.html",
+ "/css/css-ui-3/resize-012.html",
{}
]
],
- "css/css-ui-3/nav-dir-target-004.html": [
+ "css/css-ui-3/resize-013.html": [
[
- "/css/css-ui-3/nav-dir-target-004.html",
+ "/css/css-ui-3/resize-013.html",
{}
]
],
- "css/css-ui-3/nav-dir-target-005.html": [
+ "css/css-ui-3/resize-014.html": [
[
- "/css/css-ui-3/nav-dir-target-005.html",
+ "/css/css-ui-3/resize-014.html",
{}
]
],
- "css/css-ui-3/nav-dir-target-006.html": [
+ "css/css-ui-3/resize-015.html": [
[
- "/css/css-ui-3/nav-dir-target-006.html",
+ "/css/css-ui-3/resize-015.html",
{}
]
],
- "css/css-ui-3/nav-down-000.html": [
+ "css/css-ui-3/resize-016.html": [
[
- "/css/css-ui-3/nav-down-000.html",
+ "/css/css-ui-3/resize-016.html",
{}
]
],
- "css/css-ui-3/nav-down-001.html": [
+ "css/css-ui-3/resize-017.html": [
[
- "/css/css-ui-3/nav-down-001.html",
+ "/css/css-ui-3/resize-017.html",
{}
]
],
- "css/css-ui-3/nav-down-002.html": [
+ "css/css-ui-3/resize-018.html": [
[
- "/css/css-ui-3/nav-down-002.html",
+ "/css/css-ui-3/resize-018.html",
{}
]
],
- "css/css-ui-3/nav-down-003.html": [
+ "css/css-ui-3/resize-019.html": [
[
- "/css/css-ui-3/nav-down-003.html",
+ "/css/css-ui-3/resize-019.html",
{}
]
],
- "css/css-ui-3/nav-down-004.html": [
+ "css/css-ui-3/resize-020.html": [
[
- "/css/css-ui-3/nav-down-004.html",
+ "/css/css-ui-3/resize-020.html",
{}
]
],
- "css/css-ui-3/nav-down-005.html": [
+ "css/css-ui-3/resize-021.html": [
[
- "/css/css-ui-3/nav-down-005.html",
+ "/css/css-ui-3/resize-021.html",
{}
]
],
- "css/css-ui-3/nav-down-006.html": [
+ "css/css-ui-3/select-cursor-001-manual.html": [
[
- "/css/css-ui-3/nav-down-006.html",
+ "/css/css-ui-3/select-cursor-001-manual.html",
{}
]
],
- "css/css-ui-3/nav-down-007.html": [
+ "css/css-ui-3/text-overflow-017.html": [
[
- "/css/css-ui-3/nav-down-007.html",
+ "/css/css-ui-3/text-overflow-017.html",
{}
]
],
- "css/css-ui-3/nav-down-008.html": [
+ "css/css-ui-3/text-overflow-018.html": [
[
- "/css/css-ui-3/nav-down-008.html",
+ "/css/css-ui-3/text-overflow-018.html",
{}
]
],
- "css/css-ui-3/nav-down-009.html": [
+ "css/css-ui-3/text-overflow-019.html": [
[
- "/css/css-ui-3/nav-down-009.html",
+ "/css/css-ui-3/text-overflow-019.html",
{}
]
],
- "css/css-ui-3/nav-down-010.html": [
+ "css/css-ui-3/text-overflow.html": [
[
- "/css/css-ui-3/nav-down-010.html",
+ "/css/css-ui-3/text-overflow.html",
{}
]
],
- "css/css-ui-3/nav-down-011.html": [
+ "css/css-ui-4/nav-dir-001.html": [
[
- "/css/css-ui-3/nav-down-011.html",
+ "/css/css-ui-4/nav-dir-001.html",
{}
]
],
- "css/css-ui-3/nav-down-012.html": [
+ "css/css-ui-4/nav-dir-002.html": [
[
- "/css/css-ui-3/nav-down-012.html",
+ "/css/css-ui-4/nav-dir-002.html",
{}
]
],
- "css/css-ui-3/nav-down-013.html": [
+ "css/css-ui-4/nav-dir-003.html": [
[
- "/css/css-ui-3/nav-down-013.html",
+ "/css/css-ui-4/nav-dir-003.html",
{}
]
],
- "css/css-ui-3/nav-down-014.html": [
+ "css/css-ui-4/nav-dir-004.html": [
[
- "/css/css-ui-3/nav-down-014.html",
+ "/css/css-ui-4/nav-dir-004.html",
{}
]
],
- "css/css-ui-3/nav-down-015.html": [
+ "css/css-ui-4/nav-dir-005.html": [
[
- "/css/css-ui-3/nav-down-015.html",
+ "/css/css-ui-4/nav-dir-005.html",
{}
]
],
- "css/css-ui-3/nav-down-016.html": [
+ "css/css-ui-4/nav-dir-missing-1.html": [
[
- "/css/css-ui-3/nav-down-016.html",
+ "/css/css-ui-4/nav-dir-missing-1.html",
{}
]
],
- "css/css-ui-3/nav-left-000.html": [
+ "css/css-ui-4/nav-dir-missing-2.html": [
[
- "/css/css-ui-3/nav-left-000.html",
+ "/css/css-ui-4/nav-dir-missing-2.html",
{}
]
],
- "css/css-ui-3/nav-left-001.html": [
+ "css/css-ui-4/nav-dir-missing-3.html": [
[
- "/css/css-ui-3/nav-left-001.html",
+ "/css/css-ui-4/nav-dir-missing-3.html",
{}
]
],
- "css/css-ui-3/nav-left-002.html": [
+ "css/css-ui-4/nav-dir-missing-4.html": [
[
- "/css/css-ui-3/nav-left-002.html",
+ "/css/css-ui-4/nav-dir-missing-4.html",
{}
]
],
- "css/css-ui-3/nav-left-003.html": [
+ "css/css-ui-4/nav-dir-target-001.html": [
[
- "/css/css-ui-3/nav-left-003.html",
+ "/css/css-ui-4/nav-dir-target-001.html",
{}
]
],
- "css/css-ui-3/nav-left-004.html": [
+ "css/css-ui-4/nav-dir-target-002.html": [
[
- "/css/css-ui-3/nav-left-004.html",
+ "/css/css-ui-4/nav-dir-target-002.html",
{}
]
],
- "css/css-ui-3/nav-left-005.html": [
+ "css/css-ui-4/nav-dir-target-003.html": [
[
- "/css/css-ui-3/nav-left-005.html",
+ "/css/css-ui-4/nav-dir-target-003.html",
{}
]
],
- "css/css-ui-3/nav-left-006.html": [
+ "css/css-ui-4/nav-dir-target-004.html": [
[
- "/css/css-ui-3/nav-left-006.html",
+ "/css/css-ui-4/nav-dir-target-004.html",
{}
]
],
- "css/css-ui-3/nav-left-007.html": [
+ "css/css-ui-4/nav-dir-target-005.html": [
[
- "/css/css-ui-3/nav-left-007.html",
+ "/css/css-ui-4/nav-dir-target-005.html",
{}
]
],
- "css/css-ui-3/nav-left-008.html": [
+ "css/css-ui-4/nav-dir-target-006.html": [
[
- "/css/css-ui-3/nav-left-008.html",
+ "/css/css-ui-4/nav-dir-target-006.html",
{}
]
],
- "css/css-ui-3/nav-left-009.html": [
+ "css/css-ui-4/nav-down-000.html": [
[
- "/css/css-ui-3/nav-left-009.html",
+ "/css/css-ui-4/nav-down-000.html",
{}
]
],
- "css/css-ui-3/nav-left-010.html": [
+ "css/css-ui-4/nav-down-001.html": [
[
- "/css/css-ui-3/nav-left-010.html",
+ "/css/css-ui-4/nav-down-001.html",
{}
]
],
- "css/css-ui-3/nav-left-011.html": [
+ "css/css-ui-4/nav-down-002.html": [
[
- "/css/css-ui-3/nav-left-011.html",
+ "/css/css-ui-4/nav-down-002.html",
{}
]
],
- "css/css-ui-3/nav-left-012.html": [
+ "css/css-ui-4/nav-down-003.html": [
[
- "/css/css-ui-3/nav-left-012.html",
+ "/css/css-ui-4/nav-down-003.html",
{}
]
],
- "css/css-ui-3/nav-left-013.html": [
+ "css/css-ui-4/nav-down-004.html": [
[
- "/css/css-ui-3/nav-left-013.html",
+ "/css/css-ui-4/nav-down-004.html",
{}
]
],
- "css/css-ui-3/nav-left-014.html": [
+ "css/css-ui-4/nav-down-005.html": [
[
- "/css/css-ui-3/nav-left-014.html",
+ "/css/css-ui-4/nav-down-005.html",
{}
]
],
- "css/css-ui-3/nav-left-015.html": [
+ "css/css-ui-4/nav-down-006.html": [
[
- "/css/css-ui-3/nav-left-015.html",
+ "/css/css-ui-4/nav-down-006.html",
{}
]
],
- "css/css-ui-3/nav-left-016.html": [
+ "css/css-ui-4/nav-down-007.html": [
[
- "/css/css-ui-3/nav-left-016.html",
+ "/css/css-ui-4/nav-down-007.html",
{}
]
],
- "css/css-ui-3/nav-right-000.html": [
+ "css/css-ui-4/nav-down-008.html": [
[
- "/css/css-ui-3/nav-right-000.html",
+ "/css/css-ui-4/nav-down-008.html",
{}
]
],
- "css/css-ui-3/nav-right-001.html": [
+ "css/css-ui-4/nav-down-009.html": [
[
- "/css/css-ui-3/nav-right-001.html",
+ "/css/css-ui-4/nav-down-009.html",
{}
]
],
- "css/css-ui-3/nav-right-002.html": [
+ "css/css-ui-4/nav-down-010.html": [
[
- "/css/css-ui-3/nav-right-002.html",
+ "/css/css-ui-4/nav-down-010.html",
{}
]
],
- "css/css-ui-3/nav-right-003.html": [
+ "css/css-ui-4/nav-down-011.html": [
[
- "/css/css-ui-3/nav-right-003.html",
+ "/css/css-ui-4/nav-down-011.html",
{}
]
],
- "css/css-ui-3/nav-right-004.html": [
+ "css/css-ui-4/nav-down-012.html": [
[
- "/css/css-ui-3/nav-right-004.html",
+ "/css/css-ui-4/nav-down-012.html",
{}
]
],
- "css/css-ui-3/nav-right-005.html": [
+ "css/css-ui-4/nav-down-013.html": [
[
- "/css/css-ui-3/nav-right-005.html",
+ "/css/css-ui-4/nav-down-013.html",
{}
]
],
- "css/css-ui-3/nav-right-006.html": [
+ "css/css-ui-4/nav-down-014.html": [
[
- "/css/css-ui-3/nav-right-006.html",
+ "/css/css-ui-4/nav-down-014.html",
{}
]
],
- "css/css-ui-3/nav-right-007.html": [
+ "css/css-ui-4/nav-down-015.html": [
[
- "/css/css-ui-3/nav-right-007.html",
+ "/css/css-ui-4/nav-down-015.html",
{}
]
],
- "css/css-ui-3/nav-right-008.html": [
+ "css/css-ui-4/nav-down-016.html": [
[
- "/css/css-ui-3/nav-right-008.html",
+ "/css/css-ui-4/nav-down-016.html",
{}
]
],
- "css/css-ui-3/nav-right-009.html": [
+ "css/css-ui-4/nav-left-000.html": [
[
- "/css/css-ui-3/nav-right-009.html",
+ "/css/css-ui-4/nav-left-000.html",
{}
]
],
- "css/css-ui-3/nav-right-010.html": [
+ "css/css-ui-4/nav-left-001.html": [
[
- "/css/css-ui-3/nav-right-010.html",
+ "/css/css-ui-4/nav-left-001.html",
{}
]
],
- "css/css-ui-3/nav-right-011.html": [
+ "css/css-ui-4/nav-left-002.html": [
[
- "/css/css-ui-3/nav-right-011.html",
+ "/css/css-ui-4/nav-left-002.html",
{}
]
],
- "css/css-ui-3/nav-right-012.html": [
+ "css/css-ui-4/nav-left-003.html": [
[
- "/css/css-ui-3/nav-right-012.html",
+ "/css/css-ui-4/nav-left-003.html",
{}
]
],
- "css/css-ui-3/nav-right-013.html": [
+ "css/css-ui-4/nav-left-004.html": [
[
- "/css/css-ui-3/nav-right-013.html",
+ "/css/css-ui-4/nav-left-004.html",
{}
]
],
- "css/css-ui-3/nav-right-014.html": [
+ "css/css-ui-4/nav-left-005.html": [
[
- "/css/css-ui-3/nav-right-014.html",
+ "/css/css-ui-4/nav-left-005.html",
{}
]
],
- "css/css-ui-3/nav-right-015.html": [
+ "css/css-ui-4/nav-left-006.html": [
[
- "/css/css-ui-3/nav-right-015.html",
+ "/css/css-ui-4/nav-left-006.html",
{}
]
],
- "css/css-ui-3/nav-right-016.html": [
+ "css/css-ui-4/nav-left-007.html": [
[
- "/css/css-ui-3/nav-right-016.html",
+ "/css/css-ui-4/nav-left-007.html",
{}
]
],
- "css/css-ui-3/nav-up-000.html": [
+ "css/css-ui-4/nav-left-008.html": [
[
- "/css/css-ui-3/nav-up-000.html",
+ "/css/css-ui-4/nav-left-008.html",
{}
]
],
- "css/css-ui-3/nav-up-001.html": [
+ "css/css-ui-4/nav-left-009.html": [
[
- "/css/css-ui-3/nav-up-001.html",
+ "/css/css-ui-4/nav-left-009.html",
{}
]
],
- "css/css-ui-3/nav-up-002.html": [
+ "css/css-ui-4/nav-left-010.html": [
[
- "/css/css-ui-3/nav-up-002.html",
+ "/css/css-ui-4/nav-left-010.html",
{}
]
],
- "css/css-ui-3/nav-up-003.html": [
+ "css/css-ui-4/nav-left-011.html": [
[
- "/css/css-ui-3/nav-up-003.html",
+ "/css/css-ui-4/nav-left-011.html",
{}
]
],
- "css/css-ui-3/nav-up-004.html": [
+ "css/css-ui-4/nav-left-012.html": [
[
- "/css/css-ui-3/nav-up-004.html",
+ "/css/css-ui-4/nav-left-012.html",
{}
]
],
- "css/css-ui-3/nav-up-005.html": [
+ "css/css-ui-4/nav-left-013.html": [
[
- "/css/css-ui-3/nav-up-005.html",
+ "/css/css-ui-4/nav-left-013.html",
{}
]
],
- "css/css-ui-3/nav-up-006.html": [
+ "css/css-ui-4/nav-left-014.html": [
[
- "/css/css-ui-3/nav-up-006.html",
+ "/css/css-ui-4/nav-left-014.html",
{}
]
],
- "css/css-ui-3/nav-up-007.html": [
+ "css/css-ui-4/nav-left-015.html": [
[
- "/css/css-ui-3/nav-up-007.html",
+ "/css/css-ui-4/nav-left-015.html",
{}
]
],
- "css/css-ui-3/nav-up-008.html": [
+ "css/css-ui-4/nav-left-016.html": [
[
- "/css/css-ui-3/nav-up-008.html",
+ "/css/css-ui-4/nav-left-016.html",
{}
]
],
- "css/css-ui-3/nav-up-009.html": [
+ "css/css-ui-4/nav-right-000.html": [
[
- "/css/css-ui-3/nav-up-009.html",
+ "/css/css-ui-4/nav-right-000.html",
{}
]
],
- "css/css-ui-3/nav-up-010.html": [
+ "css/css-ui-4/nav-right-001.html": [
[
- "/css/css-ui-3/nav-up-010.html",
+ "/css/css-ui-4/nav-right-001.html",
{}
]
],
- "css/css-ui-3/nav-up-011.html": [
+ "css/css-ui-4/nav-right-002.html": [
[
- "/css/css-ui-3/nav-up-011.html",
+ "/css/css-ui-4/nav-right-002.html",
{}
]
],
- "css/css-ui-3/nav-up-012.html": [
+ "css/css-ui-4/nav-right-003.html": [
[
- "/css/css-ui-3/nav-up-012.html",
+ "/css/css-ui-4/nav-right-003.html",
{}
]
],
- "css/css-ui-3/nav-up-013.html": [
+ "css/css-ui-4/nav-right-004.html": [
[
- "/css/css-ui-3/nav-up-013.html",
+ "/css/css-ui-4/nav-right-004.html",
{}
]
],
- "css/css-ui-3/nav-up-014.html": [
+ "css/css-ui-4/nav-right-005.html": [
[
- "/css/css-ui-3/nav-up-014.html",
+ "/css/css-ui-4/nav-right-005.html",
{}
]
],
- "css/css-ui-3/nav-up-015.html": [
+ "css/css-ui-4/nav-right-006.html": [
[
- "/css/css-ui-3/nav-up-015.html",
+ "/css/css-ui-4/nav-right-006.html",
{}
]
],
- "css/css-ui-3/nav-up-016.html": [
+ "css/css-ui-4/nav-right-007.html": [
[
- "/css/css-ui-3/nav-up-016.html",
+ "/css/css-ui-4/nav-right-007.html",
{}
]
],
- "css/css-ui-3/resize-001.html": [
+ "css/css-ui-4/nav-right-008.html": [
[
- "/css/css-ui-3/resize-001.html",
+ "/css/css-ui-4/nav-right-008.html",
{}
]
],
- "css/css-ui-3/resize-002.html": [
+ "css/css-ui-4/nav-right-009.html": [
[
- "/css/css-ui-3/resize-002.html",
+ "/css/css-ui-4/nav-right-009.html",
{}
]
],
- "css/css-ui-3/resize-003.html": [
+ "css/css-ui-4/nav-right-010.html": [
[
- "/css/css-ui-3/resize-003.html",
+ "/css/css-ui-4/nav-right-010.html",
{}
]
],
- "css/css-ui-3/resize-004.html": [
+ "css/css-ui-4/nav-right-011.html": [
[
- "/css/css-ui-3/resize-004.html",
+ "/css/css-ui-4/nav-right-011.html",
{}
]
],
- "css/css-ui-3/resize-005.html": [
+ "css/css-ui-4/nav-right-012.html": [
[
- "/css/css-ui-3/resize-005.html",
+ "/css/css-ui-4/nav-right-012.html",
{}
]
],
- "css/css-ui-3/resize-006.html": [
+ "css/css-ui-4/nav-right-013.html": [
[
- "/css/css-ui-3/resize-006.html",
+ "/css/css-ui-4/nav-right-013.html",
{}
]
],
- "css/css-ui-3/resize-007.html": [
+ "css/css-ui-4/nav-right-014.html": [
[
- "/css/css-ui-3/resize-007.html",
+ "/css/css-ui-4/nav-right-014.html",
{}
]
],
- "css/css-ui-3/select-cursor-001-manual.html": [
+ "css/css-ui-4/nav-right-015.html": [
[
- "/css/css-ui-3/select-cursor-001-manual.html",
+ "/css/css-ui-4/nav-right-015.html",
{}
]
],
- "css/css-ui-3/text-overflow.html": [
+ "css/css-ui-4/nav-right-016.html": [
[
- "/css/css-ui-3/text-overflow.html",
+ "/css/css-ui-4/nav-right-016.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-000.html": [
+ [
+ "/css/css-ui-4/nav-up-000.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-001.html": [
+ [
+ "/css/css-ui-4/nav-up-001.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-002.html": [
+ [
+ "/css/css-ui-4/nav-up-002.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-003.html": [
+ [
+ "/css/css-ui-4/nav-up-003.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-004.html": [
+ [
+ "/css/css-ui-4/nav-up-004.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-005.html": [
+ [
+ "/css/css-ui-4/nav-up-005.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-006.html": [
+ [
+ "/css/css-ui-4/nav-up-006.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-007.html": [
+ [
+ "/css/css-ui-4/nav-up-007.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-008.html": [
+ [
+ "/css/css-ui-4/nav-up-008.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-009.html": [
+ [
+ "/css/css-ui-4/nav-up-009.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-010.html": [
+ [
+ "/css/css-ui-4/nav-up-010.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-011.html": [
+ [
+ "/css/css-ui-4/nav-up-011.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-012.html": [
+ [
+ "/css/css-ui-4/nav-up-012.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-013.html": [
+ [
+ "/css/css-ui-4/nav-up-013.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-014.html": [
+ [
+ "/css/css-ui-4/nav-up-014.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-015.html": [
+ [
+ "/css/css-ui-4/nav-up-015.html",
+ {}
+ ]
+ ],
+ "css/css-ui-4/nav-up-016.html": [
+ [
+ "/css/css-ui-4/nav-up-016.html",
{}
]
],
@@ -10147,6 +11599,12 @@
{}
]
],
+ "cssom-view/scrollBoundaryBehavior-manual.html": [
+ [
+ "/cssom-view/scrollBoundaryBehavior-manual.html",
+ {}
+ ]
+ ],
"dpub-aam/doc-abstract-manual.html": [
[
"/dpub-aam/doc-abstract-manual.html",
@@ -10387,6 +11845,96 @@
{}
]
],
+ "entries-api/errors-manual.html": [
+ [
+ "/entries-api/errors-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/file-webkitRelativePath-manual.html": [
+ [
+ "/entries-api/file-webkitRelativePath-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystem-manual.html": [
+ [
+ "/entries-api/filesystem-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystemdirectoryentry-attributes-manual.html": [
+ [
+ "/entries-api/filesystemdirectoryentry-attributes-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystemdirectoryentry-createReader-manual.html": [
+ [
+ "/entries-api/filesystemdirectoryentry-createReader-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystemdirectoryentry-getDirectory-manual.html": [
+ [
+ "/entries-api/filesystemdirectoryentry-getDirectory-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystemdirectoryentry-getFile-manual.html": [
+ [
+ "/entries-api/filesystemdirectoryentry-getFile-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystemdirectoryentry-getParent-manual.html": [
+ [
+ "/entries-api/filesystemdirectoryentry-getParent-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystemdirectoryreader-manual.html": [
+ [
+ "/entries-api/filesystemdirectoryreader-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystementry-attributes-manual.html": [
+ [
+ "/entries-api/filesystementry-attributes-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystementry-getParent-manual.html": [
+ [
+ "/entries-api/filesystementry-getParent-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystemfileentry-attributes-manual.html": [
+ [
+ "/entries-api/filesystemfileentry-attributes-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystemfileentry-file-manual.html": [
+ [
+ "/entries-api/filesystemfileentry-file-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/filesystemfileentry-getParent-manual.html": [
+ [
+ "/entries-api/filesystemfileentry-getParent-manual.html",
+ {}
+ ]
+ ],
+ "entries-api/interfaces-manual.html": [
+ [
+ "/entries-api/interfaces-manual.html",
+ {}
+ ]
+ ],
"fullscreen/api/document-exit-fullscreen-manual.html": [
[
"/fullscreen/api/document-exit-fullscreen-manual.html",
@@ -10429,15 +11977,15 @@
{}
]
],
- "fullscreen/api/element-ready-check-containing-iframe-manual.html": [
+ "fullscreen/api/element-ready-check-allowed-cross-origin-manual.sub.html": [
[
- "/fullscreen/api/element-ready-check-containing-iframe-manual.html",
+ "/fullscreen/api/element-ready-check-allowed-cross-origin-manual.sub.html",
{}
]
],
- "fullscreen/api/element-ready-check-enabled-flag-not-set-manual.html": [
+ "fullscreen/api/element-ready-check-containing-iframe-manual.html": [
[
- "/fullscreen/api/element-ready-check-enabled-flag-not-set-manual.html",
+ "/fullscreen/api/element-ready-check-containing-iframe-manual.html",
{}
]
],
@@ -10459,6 +12007,18 @@
{}
]
],
+ "fullscreen/api/element-ready-check-not-allowed-cross-origin-manual.sub.html": [
+ [
+ "/fullscreen/api/element-ready-check-not-allowed-cross-origin-manual.sub.html",
+ {}
+ ]
+ ],
+ "fullscreen/api/element-ready-check-not-allowed-manual.html": [
+ [
+ "/fullscreen/api/element-ready-check-not-allowed-manual.html",
+ {}
+ ]
+ ],
"fullscreen/api/element-ready-check-not-in-document-manual.html": [
[
"/fullscreen/api/element-ready-check-not-in-document-manual.html",
@@ -10495,6 +12055,12 @@
{}
]
],
+ "fullscreen/api/element-request-fullscreen-dialog-manual.html": [
+ [
+ "/fullscreen/api/element-request-fullscreen-dialog-manual.html",
+ {}
+ ]
+ ],
"fullscreen/api/element-request-fullscreen-manual.html": [
[
"/fullscreen/api/element-request-fullscreen-manual.html",
@@ -10507,6 +12073,12 @@
{}
]
],
+ "fullscreen/api/element-request-fullscreen-null-ns-manual.html": [
+ [
+ "/fullscreen/api/element-request-fullscreen-null-ns-manual.html",
+ {}
+ ]
+ ],
"fullscreen/api/element-request-fullscreen-same-manual.html": [
[
"/fullscreen/api/element-request-fullscreen-same-manual.html",
@@ -10561,6 +12133,12 @@
{}
]
],
+ "fullscreen/model/move-to-inactive-document-manual.html": [
+ [
+ "/fullscreen/model/move-to-inactive-document-manual.html",
+ {}
+ ]
+ ],
"fullscreen/model/remove-child-manual.html": [
[
"/fullscreen/model/remove-child-manual.html",
@@ -10591,6 +12169,12 @@
{}
]
],
+ "fullscreen/rendering/fullscreen-pseudo-class-manual.html": [
+ [
+ "/fullscreen/rendering/fullscreen-pseudo-class-manual.html",
+ {}
+ ]
+ ],
"gamepad/events-manual.html": [
[
"/gamepad/events-manual.html",
@@ -11335,6 +12919,18 @@
{}
]
],
+ "html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html": [
+ [
+ "/html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html",
+ {}
+ ]
+ ],
+ "html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html": [
+ [
+ "/html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html",
+ {}
+ ]
+ ],
"html/editing/dnd/the-dragevent-interface/dragevent-manual.html": [
[
"/html/editing/dnd/the-dragevent-interface/dragevent-manual.html",
@@ -11629,6 +13225,60 @@
{}
]
],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_003-manual.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_003-manual.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_004-manual.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_004-manual.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_006-manual.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_006-manual.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_007-manual.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_007-manual.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_008-manual.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_008-manual.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_010-manual.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_010-manual.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_020-manual.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_020-manual.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_021-manual.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_021-manual.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_022-manual.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_022-manual.htm",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-img-element/ismap/img-ismap-coordinates-manual.html": [
[
"/html/semantics/embedded-content/the-img-element/ismap/img-ismap-coordinates-manual.html",
@@ -11803,9 +13453,21 @@
{}
]
],
- "input-events/input-events-typing-data-manual.html": [
+ "input-events/input-events-cut-paste-manual.html": [
+ [
+ "/input-events/input-events-cut-paste-manual.html",
+ {}
+ ]
+ ],
+ "input-events/input-events-get-target-ranges-manual.html": [
+ [
+ "/input-events/input-events-get-target-ranges-manual.html",
+ {}
+ ]
+ ],
+ "input-events/input-events-typing-manual.html": [
[
- "/input-events/input-events-typing-data-manual.html",
+ "/input-events/input-events-typing-manual.html",
{}
]
],
@@ -11905,42 +13567,6 @@
{}
]
],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_autocomplete-manual.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_autocomplete-manual.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_list-manual.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_list-manual.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasdate-manual.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasdate-manual.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasnumber-manual.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasnumber-manual.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_length-manual.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_length-manual.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_selectedindex-manual.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_selectedindex-manual.html",
- {}
- ]
- ],
"old-tests/submission/Microsoft/dragdrop/dragdrop_000-manual.htm": [
[
"/old-tests/submission/Microsoft/dragdrop/dragdrop_000-manual.htm",
@@ -12043,60 +13669,6 @@
{}
]
],
- "old-tests/submission/Microsoft/sandbox/sandbox_003-manual.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_003-manual.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_004-manual.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_004-manual.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_006-manual.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_006-manual.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_007-manual.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_007-manual.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_008-manual.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_008-manual.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_010-manual.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_010-manual.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_020-manual.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_020-manual.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_021-manual.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_021-manual.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_022-manual.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_022-manual.htm",
- {}
- ]
- ],
"orientation-event/free-fall-manual.html": [
[
"/orientation-event/free-fall-manual.html",
@@ -12193,6 +13765,12 @@
{}
]
],
+ "orientation-sensor/OrientationSensor_onerror-manual.https.html": [
+ [
+ "/orientation-sensor/OrientationSensor_onerror-manual.https.html",
+ {}
+ ]
+ ],
"page-visibility/test_minimize-manual.html": [
[
"/page-visibility/test_minimize-manual.html",
@@ -12205,6 +13783,126 @@
{}
]
],
+ "payment-method-basic-card/empty-data-manual.https.html": [
+ [
+ "/payment-method-basic-card/empty-data-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html": [
+ [
+ "/payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/PaymentRequestUpdateEvent/updateWith-call-immediate-manual.https.html": [
+ [
+ "/payment-request/PaymentRequestUpdateEvent/updateWith-call-immediate-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/PaymentRequestUpdateEvent/updateWith-duplicate-shipping-options-manual.https.html": [
+ [
+ "/payment-request/PaymentRequestUpdateEvent/updateWith-duplicate-shipping-options-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/PaymentRequestUpdateEvent/updateWith-method-abort-update-manual.https.html": [
+ [
+ "/payment-request/PaymentRequestUpdateEvent/updateWith-method-abort-update-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/PaymentRequestUpdateEvent/updateWith-state-checks-manual.https.html": [
+ [
+ "/payment-request/PaymentRequestUpdateEvent/updateWith-state-checks-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/algorithms-manual.https.html": [
+ [
+ "/payment-request/algorithms-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/change-shipping-option-manual.https.html": [
+ [
+ "/payment-request/change-shipping-option-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/payment-response/complete-method-manual.https.html": [
+ [
+ "/payment-request/payment-response/complete-method-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/payment-response/methodName-attribute-manual.https.html": [
+ [
+ "/payment-request/payment-response/methodName-attribute-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/payment-response/payerEmail-attribute-manual.https.html": [
+ [
+ "/payment-request/payment-response/payerEmail-attribute-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/payment-response/payerName-attribute-manual.https.html": [
+ [
+ "/payment-request/payment-response/payerName-attribute-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/payment-response/payerPhone-attribute-manual.https.html": [
+ [
+ "/payment-request/payment-response/payerPhone-attribute-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/payment-response/requestId-attribute-manual.https.html": [
+ [
+ "/payment-request/payment-response/requestId-attribute-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/payment-response/shippingAddress-attribute-manual.https.html": [
+ [
+ "/payment-request/payment-response/shippingAddress-attribute-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/payment-response/shippingOption-attribute-manual.https.html": [
+ [
+ "/payment-request/payment-response/shippingOption-attribute-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/shipping-address-changed-manual.https.html": [
+ [
+ "/payment-request/shipping-address-changed-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/updateWith-method-pmi-handling-manual.https.html": [
+ [
+ "/payment-request/updateWith-method-pmi-handling-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/user-abort-algorithm-manual.https.html": [
+ [
+ "/payment-request/user-abort-algorithm-manual.https.html",
+ {}
+ ]
+ ],
+ "payment-request/user-accepts-payment-request-algo-manual.https.html": [
+ [
+ "/payment-request/user-accepts-payment-request-algo-manual.https.html",
+ {}
+ ]
+ ],
"pointerevents/compat/pointerevent_touch-action_two-finger_interaction-manual.html": [
[
"/pointerevents/compat/pointerevent_touch-action_two-finger_interaction-manual.html",
@@ -12217,6 +13915,12 @@
{}
]
],
+ "pointerevents/html/pointerevent_drag_interaction-manual.html": [
+ [
+ "/pointerevents/html/pointerevent_drag_interaction-manual.html",
+ {}
+ ]
+ ],
"pointerevents/pointerevent_attributes_hoverable_pointers-manual.html": [
[
"/pointerevents/pointerevent_attributes_hoverable_pointers-manual.html",
@@ -16015,18 +17719,6 @@
{}
]
],
- "uievents/keyboard/key-manual.css": [
- [
- "/uievents/keyboard/key-manual.css",
- {}
- ]
- ],
- "uievents/keyboard/key-manual.js": [
- [
- "/uievents/keyboard/key-manual.js",
- {}
- ]
- ],
"uievents/mouse/mouseevent_move_button-manual.html": [
[
"/uievents/mouse/mouseevent_move_button-manual.html",
@@ -16165,6 +17857,12 @@
{}
]
],
+ "viewport/viewport-attribute-event-handlers-manual.html": [
+ [
+ "/viewport/viewport-attribute-event-handlers-manual.html",
+ {}
+ ]
+ ],
"viewport/viewport-dimensions-custom-scrollbars-manual.html": [
[
"/viewport/viewport-dimensions-custom-scrollbars-manual.html",
@@ -16213,6 +17911,12 @@
{}
]
],
+ "viewport/viewport-url-bar-changes-height-manual.html": [
+ [
+ "/viewport/viewport-url-bar-changes-height-manual.html",
+ {}
+ ]
+ ],
"wai-aria/alertdialog_modal_false-manual.html": [
[
"/wai-aria/alertdialog_modal_false-manual.html",
@@ -17575,6 +19279,138 @@
{}
]
],
+ "web-nfc/nfc_hw_disabled-manual.https.html": [
+ [
+ "/web-nfc/nfc_hw_disabled-manual.https.html",
+ {}
+ ]
+ ],
+ "web-nfc/nfc_push_ArrayBuffer-manual.https.html": [
+ [
+ "/web-nfc/nfc_push_ArrayBuffer-manual.https.html",
+ {}
+ ]
+ ],
+ "web-nfc/nfc_push_DOMString-manual.https.html": [
+ [
+ "/web-nfc/nfc_push_DOMString-manual.https.html",
+ {}
+ ]
+ ],
+ "web-nfc/nfc_recordType_empty-manual.https.html": [
+ [
+ "/web-nfc/nfc_recordType_empty-manual.https.html",
+ {}
+ ]
+ ],
+ "web-nfc/nfc_recordType_json-manual.https.html": [
+ [
+ "/web-nfc/nfc_recordType_json-manual.https.html",
+ {}
+ ]
+ ],
+ "web-nfc/nfc_recordType_opaque-manual.https.html": [
+ [
+ "/web-nfc/nfc_recordType_opaque-manual.https.html",
+ {}
+ ]
+ ],
+ "web-nfc/nfc_recordType_text-manual.https.html": [
+ [
+ "/web-nfc/nfc_recordType_text-manual.https.html",
+ {}
+ ]
+ ],
+ "web-nfc/nfc_recordType_url-manual.https.html": [
+ [
+ "/web-nfc/nfc_recordType_url-manual.https.html",
+ {}
+ ]
+ ],
+ "web-share/share-cancel-manual.html": [
+ [
+ "/web-share/share-cancel-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-extra-argument-manual.html": [
+ [
+ "/web-share/share-extra-argument-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-extra-field-manual.html": [
+ [
+ "/web-share/share-extra-field-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-non-string-manual.html": [
+ [
+ "/web-share/share-non-string-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-null-manual.html": [
+ [
+ "/web-share/share-null-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-simple-manual.html": [
+ [
+ "/web-share/share-simple-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-unicode-strings-manual.html": [
+ [
+ "/web-share/share-unicode-strings-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-unicode-strings-nonutf8-manual.html": [
+ [
+ "/web-share/share-unicode-strings-nonutf8-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-url-data-manual.html": [
+ [
+ "/web-share/share-url-data-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-url-empty-manual.html": [
+ [
+ "/web-share/share-url-empty-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-url-encoding-manual.html": [
+ [
+ "/web-share/share-url-encoding-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-url-noscheme-manual.html": [
+ [
+ "/web-share/share-url-noscheme-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-url-pathonly-manual.html": [
+ [
+ "/web-share/share-url-pathonly-manual.html",
+ {}
+ ]
+ ],
+ "web-share/share-url-relative-manual.html": [
+ [
+ "/web-share/share-url-relative-manual.html",
+ {}
+ ]
+ ],
"webstorage/storage_local-manual.html": [
[
"/webstorage/storage_local-manual.html",
@@ -17586,6 +19422,12 @@
"/webstorage/storage_session-manual.html",
{}
]
+ ],
+ "webusb/usb-manual.https.html": [
+ [
+ "/webusb/usb-manual.https.html",
+ {}
+ ]
]
},
"reftest": {
@@ -17625,828 +19467,1020 @@
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1.html": [
+ "2dcontext/line-styles/canvas_linestyles_linecap_001.htm": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1.html",
+ "/2dcontext/line-styles/canvas_linestyles_linecap_001.htm",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1_ref.html",
+ "/2dcontext/line-styles/canvas_linestyles_linecap_001-ref.htm",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10.html": [
+ "2dcontext/line-styles/lineto_a.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10.html",
+ "/2dcontext/line-styles/lineto_a.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10_ref.html",
+ "/2dcontext/line-styles/lineto_ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11.html": [
+ "2dcontext/shadows/canvas_shadows_002.htm": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11.html",
+ "/2dcontext/shadows/canvas_shadows_002.htm",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11_ref.html",
+ "/2dcontext/shadows/canvas_shadows_002-ref.htm",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12.html": [
+ "2dcontext/text-styles/canvas_text_font_001.htm": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12.html",
+ "/2dcontext/text-styles/canvas_text_font_001.htm",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12_ref.html",
+ "/2dcontext/text-styles/canvas_text_font_001-ref.htm",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2.html": [
+ "2dcontext/the-canvas-state/canvas_state_restore_001.htm": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2.html",
+ "/2dcontext/the-canvas-state/canvas_state_restore_001.htm",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2_ref.html",
+ "/2dcontext/the-canvas-state/canvas_state_restore_001-ref.htm",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3.html": [
+ "2dcontext/transformations/canvas_transformations_reset_001.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3.html",
+ "/2dcontext/transformations/canvas_transformations_reset_001.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3_ref.html",
+ "/2dcontext/transformations/canvas_transformations_reset_001-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4.html": [
+ "2dcontext/transformations/canvas_transformations_scale_001.htm": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4.html",
+ "/2dcontext/transformations/canvas_transformations_scale_001.htm",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4_ref.html",
+ "/2dcontext/transformations/canvas_transformations_scale_001-ref.htm",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5.html": [
+ "2dcontext/transformations/transform_a.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5.html",
+ "/2dcontext/transformations/transform_a.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5_ref.html",
+ "/2dcontext/transformations/transform_ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6.html": [
+ "FileAPI/url/url_xmlhttprequest_img.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6.html",
+ "/FileAPI/url/url_xmlhttprequest_img.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6_ref.html",
+ "/FileAPI/url/url_xmlhttprequest_img-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7.html": [
+ "apng/animated-png-timeout.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7.html",
+ "/apng/animated-png-timeout.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7_ref.html",
+ "/apng/animated-png-timeout-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8.html": [
+ "compat/webkit-linear-gradient-line-bottom.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8.html",
+ "/compat/webkit-linear-gradient-line-bottom.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8_ref.html",
+ "/compat/green-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9.html": [
+ "compat/webkit-linear-gradient-line-left.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9.html",
+ "/compat/webkit-linear-gradient-line-left.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9_ref.html",
+ "/compat/green-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1.html": [
+ "compat/webkit-linear-gradient-line-right.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1.html",
+ "/compat/webkit-linear-gradient-line-right.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_ref.html",
+ "/compat/green-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10.html": [
+ "compat/webkit-linear-gradient-line-top.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10.html",
+ "/compat/webkit-linear-gradient-line-top.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_ref.html",
+ "/compat/green-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html": [
+ "compat/webkit-text-fill-color-property-001a.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html",
+ "/compat/webkit-text-fill-color-property-001a.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11_ref.html",
+ "/compat/webkit-text-fill-color-property-001-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12.html": [
+ "compat/webkit-text-fill-color-property-001b.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12.html",
+ "/compat/webkit-text-fill-color-property-001b.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12_ref.html",
+ "/compat/webkit-text-fill-color-property-001-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13.html": [
+ "compat/webkit-text-fill-color-property-001c.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13.html",
+ "/compat/webkit-text-fill-color-property-001c.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13_ref.html",
+ "/compat/webkit-text-fill-color-property-001-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14.html": [
+ "compat/webkit-text-fill-color-property-001d.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14.html",
+ "/compat/webkit-text-fill-color-property-001d.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14_ref.html",
+ "/compat/webkit-text-fill-color-property-001-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15.html": [
+ "compat/webkit-text-fill-color-property-002.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15.html",
+ "/compat/webkit-text-fill-color-property-002.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15_ref.html",
+ "/compat/webkit-text-fill-color-property-002-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2.html": [
+ "compat/webkit-text-fill-color-property-003.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2.html",
+ "/compat/webkit-text-fill-color-property-003.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_ref.html",
+ "/compat/webkit-text-fill-color-property-003-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3.html": [
+ "compat/webkit-text-fill-color-property-004.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3.html",
+ "/compat/webkit-text-fill-color-property-004.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_ref.html",
+ "/compat/webkit-text-fill-color-property-004-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4.html": [
+ "compat/webkit-text-fill-color-property-005.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4.html",
+ "/compat/webkit-text-fill-color-property-005.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_ref.html",
+ "/compat/webkit-text-fill-color-property-005-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5.html": [
+ "compat/webkit-text-fill-color-property-006.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5.html",
+ "/compat/webkit-text-fill-color-property-006.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_ref.html",
+ "/compat/webkit-text-fill-color-property-006-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6.html": [
+ "css-backgrounds/background-clip-color-repaint.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6.html",
+ "/css-backgrounds/background-clip-color-repaint.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_ref.html",
+ "/css-backgrounds/background-clip-color-repaint-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7.html": [
+ "css-backgrounds/background-clip-color.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7.html",
+ "/css-backgrounds/background-clip-color.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_ref.html",
+ "/css-backgrounds/background-clip-color-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8.html": [
+ "css-fonts/font-display/font-display.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8.html",
+ "/css-fonts/font-display/font-display.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_ref.html",
+ "/css-fonts/font-display/font-display-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9.html": [
+ "css-fonts/matching/fixed-stretch-style-over-weight.html": [
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9.html",
+ "/css-fonts/matching/fixed-stretch-style-over-weight.html",
[
[
- "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9_ref.html",
+ "/css-fonts/matching/fixed-stretch-style-over-weight-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/line-styles/canvas_linestyles_linecap_001.htm": [
+ "css-fonts/matching/stretch-distance-over-weight-distance.html": [
[
- "/2dcontext/line-styles/canvas_linestyles_linecap_001.htm",
+ "/css-fonts/matching/stretch-distance-over-weight-distance.html",
[
[
- "/2dcontext/line-styles/canvas_linestyles_linecap_001-ref.htm",
+ "/css-fonts/matching/stretch-distance-over-weight-distance-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/line-styles/lineto_a.html": [
+ "css-fonts/matching/style-ranges-over-weight-direction.html": [
[
- "/2dcontext/line-styles/lineto_a.html",
+ "/css-fonts/matching/style-ranges-over-weight-direction.html",
[
[
- "/2dcontext/line-styles/lineto_ref.html",
+ "/css-fonts/matching/style-ranges-over-weight-direction-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/shadows/canvas_shadows_002.htm": [
+ "css-fonts/variations/variable-box-font.html": [
[
- "/2dcontext/shadows/canvas_shadows_002.htm",
+ "/css-fonts/variations/variable-box-font.html",
[
[
- "/2dcontext/shadows/canvas_shadows_002-ref.htm",
+ "/css-fonts/variations/variable-box-font-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/text-styles/canvas_text_font_001.htm": [
+ "css-fonts/variations/variable-gpos-m2b.html": [
[
- "/2dcontext/text-styles/canvas_text_font_001.htm",
+ "/css-fonts/variations/variable-gpos-m2b.html",
[
[
- "/2dcontext/text-styles/canvas_text_font_001-ref.htm",
+ "/css-fonts/variations/variable-gpos-m2b-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/the-canvas-state/canvas_state_restore_001.htm": [
+ "css-fonts/variations/variable-gsub.html": [
[
- "/2dcontext/the-canvas-state/canvas_state_restore_001.htm",
+ "/css-fonts/variations/variable-gsub.html",
[
[
- "/2dcontext/the-canvas-state/canvas_state_restore_001-ref.htm",
+ "/css-fonts/variations/variable-gsub-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/transformations/canvas_transformations_reset_001.html": [
+ "css-paint-api/background-image-alpha.html": [
[
- "/2dcontext/transformations/canvas_transformations_reset_001.html",
+ "/css-paint-api/background-image-alpha.html",
[
[
- "/2dcontext/transformations/canvas_transformations_reset_001-ref.html",
+ "/css-paint-api/background-image-alpha-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/transformations/canvas_transformations_scale_001.htm": [
+ "css-paint-api/background-image-multiple.html": [
[
- "/2dcontext/transformations/canvas_transformations_scale_001.htm",
+ "/css-paint-api/background-image-multiple.html",
[
[
- "/2dcontext/transformations/canvas_transformations_scale_001-ref.htm",
+ "/css-paint-api/background-image-multiple-ref.html",
"=="
]
],
{}
]
],
- "2dcontext/transformations/transform_a.html": [
+ "css-paint-api/background-image-tiled.html": [
[
- "/2dcontext/transformations/transform_a.html",
+ "/css-paint-api/background-image-tiled.html",
[
[
- "/2dcontext/transformations/transform_ref.html",
+ "/css-paint-api/background-image-tiled-ref.html",
"=="
]
],
{}
]
],
- "FileAPI/url/url_xmlhttprequest_img.html": [
+ "css-paint-api/geometry-background-image-001.html": [
[
- "/FileAPI/url/url_xmlhttprequest_img.html",
+ "/css-paint-api/geometry-background-image-001.html",
[
[
- "/FileAPI/url/url_xmlhttprequest_img-ref.html",
+ "/css-paint-api/geometry-background-image-001-ref.html",
"=="
]
],
{}
]
],
- "apng/animated-png-timeout.html": [
+ "css-paint-api/geometry-background-image-002.html": [
[
- "/apng/animated-png-timeout.html",
+ "/css-paint-api/geometry-background-image-002.html",
[
[
- "/apng/animated-png-timeout-ref.html",
+ "/css-paint-api/geometry-background-image-002-ref.html",
"=="
]
],
{}
]
],
- "assumptions/ahem.html": [
+ "css-paint-api/geometry-background-image-tiled-001.html": [
[
- "/assumptions/ahem.html",
+ "/css-paint-api/geometry-background-image-tiled-001.html",
[
[
- "/assumptions/ahem-ref.html",
+ "/css-paint-api/geometry-background-image-tiled-001-ref.html",
"=="
]
],
{}
]
],
- "assumptions/canvas-background.html": [
+ "css-paint-api/geometry-background-image-tiled-002.html": [
[
- "/assumptions/canvas-background.html",
+ "/css-paint-api/geometry-background-image-tiled-002.html",
[
[
- "/assumptions/canvas-background-ref.html",
+ "/css-paint-api/geometry-background-image-tiled-002-ref.html",
"=="
]
],
{}
]
],
- "assumptions/initial-color.html": [
+ "css-paint-api/geometry-background-image-tiled-003.html": [
[
- "/assumptions/initial-color.html",
+ "/css-paint-api/geometry-background-image-tiled-003.html",
[
[
- "/assumptions/initial-color-ref.html",
+ "/css-paint-api/geometry-background-image-tiled-003-ref.html",
"=="
]
],
{}
]
],
- "assumptions/medium-font-size.html": [
+ "css-paint-api/geometry-border-image-001.html": [
[
- "/assumptions/medium-font-size.html",
+ "/css-paint-api/geometry-border-image-001.html",
[
[
- "/assumptions/medium-font-size-ref.html",
+ "/css-paint-api/geometry-border-image-001-ref.html",
"=="
]
],
{}
]
],
- "assumptions/min-font-size.html": [
+ "css-paint-api/geometry-border-image-002.html": [
[
- "/assumptions/min-font-size.html",
+ "/css-paint-api/geometry-border-image-002.html",
[
[
- "/assumptions/min-font-size-ref.html",
- "!="
+ "/css-paint-api/geometry-border-image-002-ref.html",
+ "=="
]
],
{}
]
],
- "compat/webkit-text-fill-color-property-001a.html": [
+ "css-paint-api/geometry-border-image-003.html": [
[
- "/compat/webkit-text-fill-color-property-001a.html",
+ "/css-paint-api/geometry-border-image-003.html",
[
[
- "/compat/webkit-text-fill-color-property-001-ref.html",
+ "/css-paint-api/geometry-border-image-003-ref.html",
"=="
]
],
{}
]
],
- "compat/webkit-text-fill-color-property-001b.html": [
+ "css-paint-api/geometry-border-image-004.html": [
[
- "/compat/webkit-text-fill-color-property-001b.html",
+ "/css-paint-api/geometry-border-image-004.html",
[
[
- "/compat/webkit-text-fill-color-property-001-ref.html",
+ "/css-paint-api/geometry-border-image-004-ref.html",
"=="
]
],
{}
]
],
- "compat/webkit-text-fill-color-property-001c.html": [
+ "css-paint-api/hidpi/device-pixel-ratio.html": [
[
- "/compat/webkit-text-fill-color-property-001c.html",
+ "/css-paint-api/hidpi/device-pixel-ratio.html",
[
[
- "/compat/webkit-text-fill-color-property-001-ref.html",
+ "/css-paint-api/hidpi/device-pixel-ratio-ref.html",
"=="
]
],
{}
]
],
- "compat/webkit-text-fill-color-property-001d.html": [
+ "css-paint-api/invalid-image-constructor-error.html": [
[
- "/compat/webkit-text-fill-color-property-001d.html",
+ "/css-paint-api/invalid-image-constructor-error.html",
[
[
- "/compat/webkit-text-fill-color-property-001-ref.html",
+ "/css-paint-api/invalid-image-constructor-error-ref.html",
"=="
]
],
{}
]
],
- "compat/webkit-text-fill-color-property-002.html": [
+ "css-paint-api/invalid-image-paint-error.html": [
[
- "/compat/webkit-text-fill-color-property-002.html",
+ "/css-paint-api/invalid-image-paint-error.html",
[
[
- "/compat/webkit-text-fill-color-property-002-ref.html",
+ "/css-paint-api/invalid-image-paint-error-ref.html",
"=="
]
],
{}
]
],
- "compat/webkit-text-fill-color-property-003.html": [
+ "css-paint-api/invalid-image-pending-script.html": [
[
- "/compat/webkit-text-fill-color-property-003.html",
+ "/css-paint-api/invalid-image-pending-script.html",
[
[
- "/compat/webkit-text-fill-color-property-003-ref.html",
+ "/css-paint-api/invalid-image-pending-script-ref.html",
"=="
]
],
{}
]
],
- "compat/webkit-text-fill-color-property-004.html": [
+ "css-paint-api/overdraw.html": [
[
- "/compat/webkit-text-fill-color-property-004.html",
+ "/css-paint-api/overdraw.html",
[
[
- "/compat/webkit-text-fill-color-property-004-ref.html",
+ "/css-paint-api/overdraw-ref.html",
"=="
]
],
{}
]
],
- "compat/webkit-text-fill-color-property-005.html": [
+ "css-paint-api/paint-arguments.html": [
[
- "/compat/webkit-text-fill-color-property-005.html",
+ "/css-paint-api/paint-arguments.html",
[
[
- "/compat/webkit-text-fill-color-property-005-ref.html",
+ "/css-paint-api/paint-arguments-ref.html",
"=="
]
],
{}
]
],
- "compat/webkit-text-fill-color-property-006.html": [
+ "css-paint-api/paint-function-arguments.html": [
[
- "/compat/webkit-text-fill-color-property-006.html",
+ "/css-paint-api/paint-function-arguments.html",
[
[
- "/compat/webkit-text-fill-color-property-006-ref.html",
+ "/css-paint-api/paint-function-arguments-ref.html",
"=="
]
],
{}
]
],
- "css-font-display/font-display.html": [
+ "css-paint-api/paint2d-composite.html": [
[
- "/css-font-display/font-display.html",
+ "/css-paint-api/paint2d-composite.html",
[
[
- "/css-font-display/font-display-ref.html",
+ "/css-paint-api/paint2d-composite-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/background-image-alpha.html": [
+ "css-paint-api/paint2d-filter.html": [
[
- "/css-paint-api/background-image-alpha.html",
+ "/css-paint-api/paint2d-filter.html",
[
[
- "/css-paint-api/background-image-alpha-ref.html",
+ "/css-paint-api/paint2d-filter-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/background-image-multiple.html": [
+ "css-paint-api/paint2d-gradient.html": [
[
- "/css-paint-api/background-image-multiple.html",
+ "/css-paint-api/paint2d-gradient.html",
[
[
- "/css-paint-api/background-image-multiple-ref.html",
+ "/css-paint-api/paint2d-gradient-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/background-image-tiled.html": [
+ "css-paint-api/paint2d-image.html": [
[
- "/css-paint-api/background-image-tiled.html",
+ "/css-paint-api/paint2d-image.html",
[
[
- "/css-paint-api/background-image-tiled-ref.html",
+ "/css-paint-api/paint2d-image-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/invalid-image-constructor-error.html": [
+ "css-paint-api/paint2d-paths.html": [
[
- "/css-paint-api/invalid-image-constructor-error.html",
+ "/css-paint-api/paint2d-paths.html",
[
[
- "/css-paint-api/invalid-image-constructor-error-ref.html",
+ "/css-paint-api/paint2d-paths-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/invalid-image-paint-error.html": [
+ "css-paint-api/paint2d-rects.html": [
[
- "/css-paint-api/invalid-image-paint-error.html",
+ "/css-paint-api/paint2d-rects.html",
[
[
- "/css-paint-api/invalid-image-paint-error-ref.html",
+ "/css-paint-api/paint2d-rects-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/invalid-image-pending-script.html": [
+ "css-paint-api/paint2d-shadows.html": [
[
- "/css-paint-api/invalid-image-pending-script.html",
+ "/css-paint-api/paint2d-shadows.html",
[
[
- "/css-paint-api/invalid-image-pending-script-ref.html",
+ "/css-paint-api/paint2d-shadows-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/overdraw.html": [
+ "css-paint-api/paint2d-transform.html": [
[
- "/css-paint-api/overdraw.html",
+ "/css-paint-api/paint2d-transform.html",
[
[
- "/css-paint-api/overdraw-ref.html",
+ "/css-paint-api/paint2d-transform-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/paint-arguments.html": [
+ "css-paint-api/parse-input-arguments-001.html": [
[
- "/css-paint-api/paint-arguments.html",
+ "/css-paint-api/parse-input-arguments-001.html",
[
[
- "/css-paint-api/paint-arguments-ref.html",
+ "/css-paint-api/parse-input-arguments-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/paint-function-arguments.html": [
+ "css-paint-api/parse-input-arguments-002.html": [
[
- "/css-paint-api/paint-function-arguments.html",
+ "/css-paint-api/parse-input-arguments-002.html",
[
[
- "/css-paint-api/paint-function-arguments-ref.html",
+ "/css-paint-api/parse-input-arguments-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/paint2d-composite.html": [
+ "css-paint-api/parse-input-arguments-003.html": [
[
- "/css-paint-api/paint2d-composite.html",
+ "/css-paint-api/parse-input-arguments-003.html",
[
[
- "/css-paint-api/paint2d-composite-ref.html",
+ "/css-paint-api/parse-input-arguments-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/paint2d-filter.html": [
+ "css-paint-api/parse-input-arguments-004.html": [
[
- "/css-paint-api/paint2d-filter.html",
+ "/css-paint-api/parse-input-arguments-004.html",
[
[
- "/css-paint-api/paint2d-filter-ref.html",
+ "/css-paint-api/parse-input-arguments-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/paint2d-gradient.html": [
+ "css-paint-api/parse-input-arguments-005.html": [
[
- "/css-paint-api/paint2d-gradient.html",
+ "/css-paint-api/parse-input-arguments-005.html",
[
[
- "/css-paint-api/paint2d-gradient-ref.html",
+ "/css-paint-api/parse-input-arguments-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/paint2d-image.html": [
+ "css-paint-api/parse-input-arguments-006.html": [
[
- "/css-paint-api/paint2d-image.html",
+ "/css-paint-api/parse-input-arguments-006.html",
[
[
- "/css-paint-api/paint2d-image-ref.html",
+ "/css-paint-api/parse-input-arguments-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/paint2d-paths.html": [
+ "css-paint-api/parse-input-arguments-007.html": [
[
- "/css-paint-api/paint2d-paths.html",
+ "/css-paint-api/parse-input-arguments-007.html",
[
[
- "/css-paint-api/paint2d-paths-ref.html",
+ "/css-paint-api/parse-input-arguments-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/paint2d-rects.html": [
+ "css-paint-api/parse-input-arguments-008.html": [
[
- "/css-paint-api/paint2d-rects.html",
+ "/css-paint-api/parse-input-arguments-008.html",
[
[
- "/css-paint-api/paint2d-rects-ref.html",
+ "/css-paint-api/parse-input-arguments-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/paint2d-shadows.html": [
+ "css-paint-api/parse-input-arguments-009.html": [
[
- "/css-paint-api/paint2d-shadows.html",
+ "/css-paint-api/parse-input-arguments-009.html",
[
[
- "/css-paint-api/paint2d-shadows-ref.html",
+ "/css-paint-api/parse-input-arguments-ref.html",
"=="
]
],
{}
]
],
- "css-paint-api/paint2d-transform.html": [
+ "css-paint-api/parse-input-arguments-010.html": [
[
- "/css-paint-api/paint2d-transform.html",
+ "/css-paint-api/parse-input-arguments-010.html",
[
[
- "/css-paint-api/paint2d-transform-ref.html",
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-011.html": [
+ [
+ "/css-paint-api/parse-input-arguments-011.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-012.html": [
+ [
+ "/css-paint-api/parse-input-arguments-012.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-013.html": [
+ [
+ "/css-paint-api/parse-input-arguments-013.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-014.html": [
+ [
+ "/css-paint-api/parse-input-arguments-014.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-015.html": [
+ [
+ "/css-paint-api/parse-input-arguments-015.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-016.html": [
+ [
+ "/css-paint-api/parse-input-arguments-016.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-017.html": [
+ [
+ "/css-paint-api/parse-input-arguments-017.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-018.html": [
+ [
+ "/css-paint-api/parse-input-arguments-018.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-018-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-019.html": [
+ [
+ "/css-paint-api/parse-input-arguments-019.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-020.html": [
+ [
+ "/css-paint-api/parse-input-arguments-020.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-021.html": [
+ [
+ "/css-paint-api/parse-input-arguments-021.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-022.html": [
+ [
+ "/css-paint-api/parse-input-arguments-022.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/registered-properties-in-custom-paint.html": [
+ [
+ "/css-paint-api/registered-properties-in-custom-paint.html",
+ [
+ [
+ "/css-paint-api/parse-input-arguments-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/style-background-image.html": [
+ [
+ "/css-paint-api/style-background-image.html",
+ [
+ [
+ "/css-paint-api/style-background-image-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/style-before-pseudo.html": [
+ [
+ "/css-paint-api/style-before-pseudo.html",
+ [
+ [
+ "/css-paint-api/style-before-pseudo-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css-paint-api/style-first-letter-pseudo.html": [
+ [
+ "/css-paint-api/style-first-letter-pseudo.html",
+ [
+ [
+ "/css-paint-api/style-first-letter-pseudo-ref.html",
"=="
]
],
@@ -18477,6 +20511,18 @@
{}
]
],
+ "css-scoping/slotted-with-pseudo-element.html": [
+ [
+ "/css-scoping/slotted-with-pseudo-element.html",
+ [
+ [
+ "/css-scoping/slotted-with-pseudo-element-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/abspos/abspos-containing-block-initial-001.xht": [
[
"/css/CSS2/abspos/abspos-containing-block-initial-001.xht",
@@ -87545,6 +89591,18 @@
{}
]
],
+ "css/CSS2/tables/table-anonymous-border-spacing.xht": [
+ [
+ "/css/CSS2/tables/table-anonymous-border-spacing.xht",
+ [
+ [
+ "/css/CSS2/tables/reference/table-anonymous-border-spacing-ref.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/tables/table-anonymous-objects-009.xht": [
[
"/css/CSS2/tables/table-anonymous-objects-009.xht",
@@ -89473,6 +91531,18 @@
{}
]
],
+ "css/CSS2/tables/table-anonymous-text-indent.xht": [
+ [
+ "/css/CSS2/tables/table-anonymous-text-indent.xht",
+ [
+ [
+ "/css/CSS2/tables/reference/table-anonymous-text-indent-ref.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/CSS2/tables/table-backgrounds-bc-cell-001.xht": [
[
"/css/CSS2/tables/table-backgrounds-bc-cell-001.xht",
@@ -102705,6 +104775,18 @@
{}
]
],
+ "css/css-flexbox-1/auto-margins-001.html": [
+ [
+ "/css/css-flexbox-1/auto-margins-001.html",
+ [
+ [
+ "/css/css-flexbox-1/auto-margins-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-flexbox-1/css-box-justify-content.html": [
[
"/css/css-flexbox-1/css-box-justify-content.html",
@@ -106437,6 +108519,42 @@
{}
]
],
+ "css/css-flexbox-1/percentage-heights-002.html": [
+ [
+ "/css/css-flexbox-1/percentage-heights-002.html",
+ [
+ [
+ "/css/css-flexbox-1/percentage-heights-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-flexbox-1/percentage-widths-001.html": [
+ [
+ "/css/css-flexbox-1/percentage-widths-001.html",
+ [
+ [
+ "/css/css-flexbox-1/percentage-widths-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-flexbox-1/position-absolute-005.html": [
+ [
+ "/css/css-flexbox-1/position-absolute-005.html",
+ [
+ [
+ "/css/css-flexbox-1/position-absolute-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-flexbox-1/ttwf-reftest-flex-align-content-center.html": [
[
"/css/css-flexbox-1/ttwf-reftest-flex-align-content-center.html",
@@ -106593,6 +108711,18 @@
{}
]
],
+ "css/css-flexbox-1/whitespace-in-flexitem-001.html": [
+ [
+ "/css/css-flexbox-1/whitespace-in-flexitem-001.html",
+ [
+ [
+ "/css/css-flexbox-1/whitespace-in-flexitem-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-fonts-3/alternates-order.html": [
[
"/css/css-fonts-3/alternates-order.html",
@@ -107553,6 +109683,90 @@
{}
]
],
+ "css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001.html": [
+ [
+ "/css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001.html",
+ [
+ [
+ "/css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-item-absolute-positioning-dynamic-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-item-absolute-positioning-dynamic-001.html",
+ [
+ [
+ "/css/reference/ref-filled-green-200px-square.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-paint-positioned-children-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-paint-positioned-children-001.html",
+ [
+ [
+ "/css/css-grid-1/abspos/grid-paint-positioned-children-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-children-writing-modes-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-children-writing-modes-001.html",
+ [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-children-writing-modes-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-item-dynamic-change-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-item-dynamic-change-001.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-background-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-background-001.html",
+ [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-background-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-background-rtl-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-background-rtl-001.html",
+ [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-background-rtl-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-grid-1/abspos/orthogonal-positioned-grid-items-001.html": [
[
"/css/css-grid-1/abspos/orthogonal-positioned-grid-items-001.html",
@@ -107961,6 +110175,18 @@
{}
]
],
+ "css/css-grid-1/abspos/positioned-grid-items-sizing-001.html": [
+ [
+ "/css/css-grid-1/abspos/positioned-grid-items-sizing-001.html",
+ [
+ [
+ "/css/css-grid-1/abspos/positioned-grid-items-sizing-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-grid-1/alignment/grid-content-distribution-001.html": [
[
"/css/css-grid-1/alignment/grid-content-distribution-001.html",
@@ -108549,6 +110775,150 @@
{}
]
],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-002.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-002.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-003.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-003.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-006.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-006.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-007.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-007.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-008.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-008.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-009.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-009.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-010.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-010.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-011.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-011.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-012.html": [
+ [
+ "/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-012.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-grid-1/grid-definition/fr-unit-with-percentage.html": [
[
"/css/css-grid-1/grid-definition/fr-unit-with-percentage.html",
@@ -109869,6 +112239,18 @@
{}
]
],
+ "css/css-grid-1/implicit-grids/grid-support-grid-auto-columns-rows-002.html": [
+ [
+ "/css/css-grid-1/implicit-grids/grid-support-grid-auto-columns-rows-002.html",
+ [
+ [
+ "/css/css-grid-1/reference/grid-support-grid-auto-columns-rows-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-grid-1/layout-algorithm/grid-layout-free-space-unit.html": [
[
"/css/css-grid-1/layout-algorithm/grid-layout-free-space-unit.html",
@@ -109929,6 +112311,18 @@
{}
]
],
+ "css/css-grid-1/placement/grid-placement-using-named-grid-lines-001.html": [
+ [
+ "/css/css-grid-1/placement/grid-placement-using-named-grid-lines-001.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-images-3/css-image-fallbacks-and-annotations.html": [
[
"/css/css-images-3/css-image-fallbacks-and-annotations.html",
@@ -110049,12 +112443,12 @@
{}
]
],
- "css/css-logical-props-1/cascading-001.html": [
+ "css/css-logical-1/cascading-001.html": [
[
- "/css/css-logical-props-1/cascading-001.html",
+ "/css/css-logical-1/cascading-001.html",
[
[
- "/css/css-logical-props-1/cascading-001-ref.html",
+ "/css/css-logical-1/cascading-001-ref.html",
"=="
]
],
@@ -110714,7 +113108,7 @@
"/css/css-masking-1/clip-path-svg-content/clip-path-precision-001.svg",
[
[
- "/css/css-masking-1/clip-path-svg-content/reference/clip-path-precision-002-ref.svg",
+ "/css/css-masking-1/clip-path-svg-content/reference/clip-path-precision-001-ref.svg",
"=="
]
],
@@ -111969,24 +114363,24 @@
{}
]
],
- "css/css-multicol-1/multicol-block-clip-001.xht": [
+ "css/css-multicol-1/multicol-block-no-clip-001.xht": [
[
- "/css/css-multicol-1/multicol-block-clip-001.xht",
+ "/css/css-multicol-1/multicol-block-no-clip-001.xht",
[
[
- "/css/css-multicol-1/multicol-block-clip-001-ref.xht",
+ "/css/css-multicol-1/multicol-block-no-clip-001-ref.xht",
"=="
]
],
{}
]
],
- "css/css-multicol-1/multicol-block-clip-002.xht": [
+ "css/css-multicol-1/multicol-block-no-clip-002.xht": [
[
- "/css/css-multicol-1/multicol-block-clip-002.xht",
+ "/css/css-multicol-1/multicol-block-no-clip-002.xht",
[
[
- "/css/css-multicol-1/multicol-block-clip-002-ref.xht",
+ "/css/css-multicol-1/multicol-block-no-clip-002-ref.xht",
"=="
]
],
@@ -113133,6 +115527,18 @@
{}
]
],
+ "css/css-multicol-1/multicol-rule-shorthand-2.xht": [
+ [
+ "/css/css-multicol-1/multicol-rule-shorthand-2.xht",
+ [
+ [
+ "/css/css-multicol-1/multicol-rule-shorthand-2-ref.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-multicol-1/multicol-rule-solid-000.xht": [
[
"/css/css-multicol-1/multicol-rule-solid-000.xht",
@@ -113889,6 +116295,54 @@
{}
]
],
+ "css/css-position-3/position-sticky-flexbox.html": [
+ [
+ "/css/css-position-3/position-sticky-flexbox.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-flexbox-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-grid.html": [
+ [
+ "/css/css-position-3/position-sticky-grid.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-grid-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-inflow-position.html": [
+ [
+ "/css/css-position-3/position-sticky-inflow-position.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-inflow-position-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-inline.html": [
+ [
+ "/css/css-position-3/position-sticky-inline.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-inline-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-position-3/position-sticky-left.html": [
[
"/css/css-position-3/position-sticky-left.html",
@@ -113901,6 +116355,102 @@
{}
]
],
+ "css/css-position-3/position-sticky-margins.html": [
+ [
+ "/css/css-position-3/position-sticky-margins.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-margins-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-bottom.html": [
+ [
+ "/css/css-position-3/position-sticky-nested-bottom.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-nested-bottom-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-inline.html": [
+ [
+ "/css/css-position-3/position-sticky-nested-inline.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-nested-inline-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-left.html": [
+ [
+ "/css/css-position-3/position-sticky-nested-left.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-nested-left-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-right.html": [
+ [
+ "/css/css-position-3/position-sticky-nested-right.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-nested-right-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-table.html": [
+ [
+ "/css/css-position-3/position-sticky-nested-table.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-nested-table-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-top.html": [
+ [
+ "/css/css-position-3/position-sticky-nested-top.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-nested-top-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-overflow-padding.html": [
+ [
+ "/css/css-position-3/position-sticky-overflow-padding.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-overflow-padding-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-position-3/position-sticky-right.html": [
[
"/css/css-position-3/position-sticky-right.html",
@@ -113913,6 +116463,30 @@
{}
]
],
+ "css/css-position-3/position-sticky-root-scroller.html": [
+ [
+ "/css/css-position-3/position-sticky-root-scroller.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-root-scroller-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-stacking-context.html": [
+ [
+ "/css/css-position-3/position-sticky-stacking-context.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-stacking-context-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-position-3/position-sticky-table-tfoot-bottom.html": [
[
"/css/css-position-3/position-sticky-table-tfoot-bottom.html",
@@ -114021,6 +116595,42 @@
{}
]
],
+ "css/css-position-3/position-sticky-transforms-translate.html": [
+ [
+ "/css/css-position-3/position-sticky-transforms-translate.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-transforms-translate-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-transforms.html": [
+ [
+ "/css/css-position-3/position-sticky-transforms.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-transforms-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-writing-modes.html": [
+ [
+ "/css/css-position-3/position-sticky-writing-modes.html",
+ [
+ [
+ "/css/css-position-3/position-sticky-writing-modes-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-pseudo-4/first-letter-001.html": [
[
"/css/css-pseudo-4/first-letter-001.html",
@@ -114057,6 +116667,54 @@
{}
]
],
+ "css/css-pseudo-4/marker-and-other-pseudo-elements.html": [
+ [
+ "/css/css-pseudo-4/marker-and-other-pseudo-elements.html",
+ [
+ [
+ "/css/css-pseudo-4/marker-and-other-pseudo-elements-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-pseudo-4/marker-color.html": [
+ [
+ "/css/css-pseudo-4/marker-color.html",
+ [
+ [
+ "/css/css-pseudo-4/marker-color-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-pseudo-4/marker-font-properties.html": [
+ [
+ "/css/css-pseudo-4/marker-font-properties.html",
+ [
+ [
+ "/css/css-pseudo-4/marker-font-properties-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-pseudo-4/marker-inherit-values.html": [
+ [
+ "/css/css-pseudo-4/marker-inherit-values.html",
+ [
+ [
+ "/css/css-pseudo-4/marker-inherit-values-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-regions-1/contentEditable/contentEditable-001.html": [
[
"/css/css-regions-1/contentEditable/contentEditable-001.html",
@@ -118009,6 +120667,30 @@
{}
]
],
+ "css/css-tables-3/visibility-collapse-colspan-003.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-colspan-003.html",
+ [
+ [
+ "/css/css-tables-3/visibility-collapse-colspan-003-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-005.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-rowspan-005.html",
+ [
+ [
+ "/css/css-tables-3/visibility-collapse-rowspan-005-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-text-3/i18n/css3-text-line-break-jazh-001.html": [
[
"/css/css-text-3/i18n/css3-text-line-break-jazh-001.html",
@@ -123313,6 +125995,30 @@
{}
]
],
+ "css/css-text-3/line-break/line-break-anywhere-001.html": [
+ [
+ "/css/css-text-3/line-break/line-break-anywhere-001.html",
+ [
+ [
+ "/css/css-text-3/line-break/reference/line-break-anywhere-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/line-break/line-break-anywhere-002.html": [
+ [
+ "/css/css-text-3/line-break/line-break-anywhere-002.html",
+ [
+ [
+ "/css/css-text-3/line-break/reference/line-break-anywhere-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-text-3/line-break/line-break-normal-021.xht": [
[
"/css/css-text-3/line-break/line-break-normal-021.xht",
@@ -123474,7 +126180,7 @@
"/css/css-text-3/line-breaking/line-breaking-001.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123486,7 +126192,7 @@
"/css/css-text-3/line-breaking/line-breaking-002.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123498,7 +126204,7 @@
"/css/css-text-3/line-breaking/line-breaking-003.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123510,7 +126216,7 @@
"/css/css-text-3/line-breaking/line-breaking-004.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123522,7 +126228,7 @@
"/css/css-text-3/line-breaking/line-breaking-005.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123534,7 +126240,7 @@
"/css/css-text-3/line-breaking/line-breaking-006.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123546,7 +126252,7 @@
"/css/css-text-3/line-breaking/line-breaking-007.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123558,7 +126264,7 @@
"/css/css-text-3/line-breaking/line-breaking-008.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123570,7 +126276,7 @@
"/css/css-text-3/line-breaking/line-breaking-009.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123582,7 +126288,7 @@
"/css/css-text-3/line-breaking/line-breaking-010.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123594,7 +126300,7 @@
"/css/css-text-3/line-breaking/line-breaking-011.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-001-ref.html",
"=="
]
],
@@ -123606,7 +126312,7 @@
"/css/css-text-3/line-breaking/line-breaking-ic-001.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-ic-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-ic-001-ref.html",
"=="
]
],
@@ -123618,7 +126324,7 @@
"/css/css-text-3/line-breaking/line-breaking-ic-002.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-ic-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-ic-001-ref.html",
"=="
]
],
@@ -123630,7 +126336,7 @@
"/css/css-text-3/line-breaking/line-breaking-ic-003.html",
[
[
- "/css/css-text-3/line-breaking/references/line-breaking-ic-001-ref.html",
+ "/css/css-text-3/line-breaking/reference/line-breaking-ic-001-ref.html",
"=="
]
],
@@ -125329,6 +128035,342 @@
{}
]
],
+ "css/css-text-3/white-space/pre-wrap-001.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-001.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-002.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-002.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-003.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-003.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-004.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-004.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-005.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-005.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-006.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-006.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-007.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-007.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-008.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-008.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-009.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-009.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-010.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-010.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-011.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-011.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-012.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-012.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-013.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-013.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/pre-wrap-014.html": [
+ [
+ "/css/css-text-3/white-space/pre-wrap-014.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-001.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-001.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-002.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-002.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-003.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-003.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-004.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-004.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-005.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-005.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-006.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-006.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-007.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-007.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-008.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-008.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-009.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-009.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-010.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-010.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-011.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-011.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-012.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-012.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-013.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-013.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-014.html": [
+ [
+ "/css/css-text-3/white-space/textarea-pre-wrap-014.html",
+ [
+ [
+ "/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-text-3/white-space/white-space-collapsing-discard-001.xht": [
[
"/css/css-text-3/white-space/white-space-collapsing-discard-001.xht",
@@ -138670,10 +141712,6 @@
"/css/css-ui-3/box-sizing-026.html",
[
[
- "/css/css-ui-3/reference/box-sizing-001-ref.html",
- "=="
- ],
- [
"/css/reference/ref-filled-green-100px-square.xht",
"=="
]
@@ -139029,6 +142067,174 @@
{}
]
],
+ "css/css-ui-3/text-overflow-006.html": [
+ [
+ "/css/css-ui-3/text-overflow-006.html",
+ [
+ [
+ "/css/css-ui-3/reference/text-overflow-006-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-007.html": [
+ [
+ "/css/css-ui-3/text-overflow-007.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-008.html": [
+ [
+ "/css/css-ui-3/text-overflow-008.html",
+ [
+ [
+ "/css/css-ui-3/reference/text-overflow-008-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-009.html": [
+ [
+ "/css/css-ui-3/text-overflow-009.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-010.html": [
+ [
+ "/css/css-ui-3/text-overflow-010.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-011.html": [
+ [
+ "/css/css-ui-3/text-overflow-011.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-012.html": [
+ [
+ "/css/css-ui-3/text-overflow-012.html",
+ [
+ [
+ "/css/css-ui-3/reference/text-overflow-012-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-013.html": [
+ [
+ "/css/css-ui-3/text-overflow-013.html",
+ [
+ [
+ "/css/css-ui-3/reference/text-overflow-013-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-014.html": [
+ [
+ "/css/css-ui-3/text-overflow-014.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-015.html": [
+ [
+ "/css/css-ui-3/text-overflow-015.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-016.html": [
+ [
+ "/css/css-ui-3/text-overflow-016.html",
+ [
+ [
+ "/css/css-ui-3/reference/text-overflow-016-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-020.html": [
+ [
+ "/css/css-ui-3/text-overflow-020.html",
+ [
+ [
+ "/css/reference/ref-filled-green-100px-square.xht",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-021.html": [
+ [
+ "/css/css-ui-3/text-overflow-021.html",
+ [
+ [
+ "/css/css-ui-3/reference/text-overflow-021-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "css/css-ui-3/text-overflow-022.html": [
+ [
+ "/css/css-ui-3/text-overflow-022.html",
+ [
+ [
+ "/css/css-ui-3/reference/text-overflow-022-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-values-3/attr-color-invalid-cast.html": [
[
"/css/css-values-3/attr-color-invalid-cast.html",
@@ -139089,18 +142295,6 @@
{}
]
],
- "css/css-values-3/attr-invalid-type-003.html": [
- [
- "/css/css-values-3/attr-invalid-type-003.html",
- [
- [
- "/css/css-values-3/reference/200-200-green.html",
- "=="
- ]
- ],
- {}
- ]
- ],
"css/css-values-3/attr-length-invalid-cast.html": [
[
"/css/css-values-3/attr-length-invalid-cast.html",
@@ -139461,18 +142655,6 @@
{}
]
],
- "css/css-values-3/vh_not_refreshing_on_chrome_iframe.html": [
- [
- "/css/css-values-3/vh_not_refreshing_on_chrome_iframe.html",
- [
- [
- "/css/css-values-3/reference/vh_not_refreshing_on_chrome-ref.html",
- "=="
- ]
- ],
- {}
- ]
- ],
"css/css-values-4/ic-unit-001.html": [
[
"/css/css-values-4/ic-unit-001.html",
@@ -139545,6 +142727,18 @@
{}
]
],
+ "css/css-variables-1/variable-generated-content-dynamic-001.html": [
+ [
+ "/css/css-variables-1/variable-generated-content-dynamic-001.html",
+ [
+ [
+ "/css/css-variables-1/variable-generated-content-dynamic-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-variables-1/variable-reference-without-whitespace.html": [
[
"/css/css-variables-1/variable-reference-without-whitespace.html",
@@ -151786,7 +154980,7 @@
"/css/mediaqueries-3/relative-units-002.html",
[
[
- "/css/reference/ref-green-body.xht",
+ "/css/mediaqueries-3/reference/ref-green-body.xht",
"=="
]
],
@@ -151798,7 +154992,7 @@
"/css/mediaqueries-3/relative-units-003.html",
[
[
- "/css/reference/ref-green-body.xht",
+ "/css/mediaqueries-3/reference/ref-green-body.xht",
"=="
]
],
@@ -151810,7 +155004,7 @@
"/css/mediaqueries-3/relative-units-004.html",
[
[
- "/css/reference/ref-green-body.xht",
+ "/css/mediaqueries-3/reference/ref-green-body.xht",
"=="
]
],
@@ -161117,6 +164311,18 @@
{}
]
],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001.html": [
+ [
+ "/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001.html",
+ [
+ [
+ "/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-emphasis-color-property-001.html": [
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-emphasis-color-property-001.html",
@@ -163805,6 +167011,18 @@
{}
]
],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1.html": [
+ [
+ "/css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1.html",
+ [
+ [
+ "/css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-declaration-01.html": [
[
"/css/vendor-imports/mozilla/mozilla-central-reftests/variables/variable-declaration-01.html",
@@ -166325,6 +169543,30 @@
{}
]
],
+ "cssom-view/scrollingElement-quirks-dynamic-001.html": [
+ [
+ "/cssom-view/scrollingElement-quirks-dynamic-001.html",
+ [
+ [
+ "/cssom-view/scrollingElement-quirks-dynamic-001-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "cssom-view/scrollingElement-quirks-dynamic-002.html": [
+ [
+ "/cssom-view/scrollingElement-quirks-dynamic-002.html",
+ [
+ [
+ "/cssom-view/scrollingElement-quirks-dynamic-002-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"cssom/selectorText-modification-restyle-001.html": [
[
"/cssom/selectorText-modification-restyle-001.html",
@@ -166337,6 +169579,54 @@
{}
]
],
+ "encoding/eof-shift_jis.html": [
+ [
+ "/encoding/eof-shift_jis.html",
+ [
+ [
+ "/encoding/eof-shift_jis-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "encoding/eof-utf-8-one.html": [
+ [
+ "/encoding/eof-utf-8-one.html",
+ [
+ [
+ "/encoding/eof-utf-8-one-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "encoding/eof-utf-8-three.html": [
+ [
+ "/encoding/eof-utf-8-three.html",
+ [
+ [
+ "/encoding/eof-utf-8-three-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "encoding/eof-utf-8-two.html": [
+ [
+ "/encoding/eof-utf-8-two.html",
+ [
+ [
+ "/encoding/eof-utf-8-two-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"html/dom/elements/global-attributes/dir_auto-EN-L.html": [
[
"/html/dom/elements/global-attributes/dir_auto-EN-L.html",
@@ -167993,6 +171283,30 @@
{}
]
],
+ "html/rendering/non-replaced-elements/tables/colgroup_valign_bottom.xhtml": [
+ [
+ "/html/rendering/non-replaced-elements/tables/colgroup_valign_bottom.xhtml",
+ [
+ [
+ "/html/rendering/non-replaced-elements/tables/colgroup_valign-ref.xhtml",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "html/rendering/non-replaced-elements/tables/colgroup_valign_top.xhtml": [
+ [
+ "/html/rendering/non-replaced-elements/tables/colgroup_valign_top.xhtml",
+ [
+ [
+ "/html/rendering/non-replaced-elements/tables/colgroup_valign-ref.xhtml",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"html/rendering/non-replaced-elements/tables/table-border-1.html": [
[
"/html/rendering/non-replaced-elements/tables/table-border-1.html",
@@ -168041,6 +171355,18 @@
{}
]
],
+ "html/rendering/non-replaced-elements/tables/table-direction.html": [
+ [
+ "/html/rendering/non-replaced-elements/tables/table-direction.html",
+ [
+ [
+ "/html/rendering/non-replaced-elements/tables/table-direction-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"html/rendering/non-replaced-elements/tables/table-layout.html": [
[
"/html/rendering/non-replaced-elements/tables/table-layout.html",
@@ -168053,6 +171379,30 @@
{}
]
],
+ "html/rendering/non-replaced-elements/tables/table-row-direction.html": [
+ [
+ "/html/rendering/non-replaced-elements/tables/table-row-direction.html",
+ [
+ [
+ "/html/rendering/non-replaced-elements/tables/table-row-direction-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "html/rendering/non-replaced-elements/tables/table-row-group-direction.html": [
+ [
+ "/html/rendering/non-replaced-elements/tables/table-row-group-direction.html",
+ [
+ [
+ "/html/rendering/non-replaced-elements/tables/table-row-group-direction-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"html/rendering/non-replaced-elements/tables/table-width-150percent.html": [
[
"/html/rendering/non-replaced-elements/tables/table-width-150percent.html",
@@ -169181,6 +172531,66 @@
{}
]
],
+ "infrastructure/assumptions/ahem.html": [
+ [
+ "/infrastructure/assumptions/ahem.html",
+ [
+ [
+ "/infrastructure/assumptions/ahem-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/canvas-background.html": [
+ [
+ "/infrastructure/assumptions/canvas-background.html",
+ [
+ [
+ "/infrastructure/assumptions/canvas-background-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/initial-color.html": [
+ [
+ "/infrastructure/assumptions/initial-color.html",
+ [
+ [
+ "/infrastructure/assumptions/initial-color-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/medium-font-size.html": [
+ [
+ "/infrastructure/assumptions/medium-font-size.html",
+ [
+ [
+ "/infrastructure/assumptions/medium-font-size-ref.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/min-font-size.html": [
+ [
+ "/infrastructure/assumptions/min-font-size.html",
+ [
+ [
+ "/infrastructure/assumptions/min-font-size-ref.html",
+ "!="
+ ]
+ ],
+ {}
+ ]
+ ],
"infrastructure/reftest-wait.html": [
[
"/infrastructure/reftest-wait.html",
@@ -173383,18 +176793,6 @@
{}
]
],
- "css/css-multicol-1/multicol-rule-shorthand-2.xht": [
- [
- "/css/css-multicol-1/multicol-rule-shorthand-2.xht",
- [
- [
- "/css/css-multicol-1/multicol-rule-shorthand-2.xht",
- "=="
- ]
- ],
- {}
- ]
- ],
"css/css-transforms-1/2d-rotate-notref.html": [
[
"/css/css-transforms-1/2d-rotate-notref.html",
@@ -173888,72 +177286,52 @@
{}
]
],
- "./check_stability.py": [
- [
- {}
- ]
- ],
- "./ci_built_diff.sh": [
- [
- {}
- ]
- ],
- "./ci_lint.sh": [
- [
- {}
- ]
- ],
- "./ci_stability.sh": [
- [
- {}
- ]
- ],
- "./ci_unittest.sh": [
+ "./config.default.json": [
[
{}
]
],
- "./config.default.json": [
+ "./lint.whitelist": [
[
{}
]
],
- "./lint": [
+ "./serve.py": [
[
{}
]
],
- "./lint.whitelist": [
+ "./server-side.md": [
[
{}
]
],
- "./manifest": [
+ "./update-built-tests.sh": [
[
{}
]
],
- "./serve": [
+ "./wpt": [
[
{}
]
],
- "./serve.py": [
+ "./wpt.py": [
[
{}
]
],
- "./server-side.md": [
+ ".well-known/README.md": [
[
{}
]
],
- "./update-built-tests.sh": [
+ ".well-known/idp-proxy/README.md": [
[
{}
]
],
- "./wptrun": [
+ ".well-known/idp-proxy/mock-idp.js": [
[
{}
]
@@ -174343,141 +177721,6 @@
{}
]
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_ref.html": [
- [
- {}
- ]
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9_ref.html": [
- [
- {}
- ]
- ],
"2dcontext/drawing-model/.gitkeep": [
[
{}
@@ -175273,6 +178516,11 @@
{}
]
],
+ "IndexedDB/nested-cloning-common.js": [
+ [
+ {}
+ ]
+ ],
"IndexedDB/support-promises.js": [
[
{}
@@ -175448,11 +178696,6 @@
{}
]
],
- "WebIDL/ecmascript-binding/es-exceptions/constructor-object.js": [
- [
- {}
- ]
- ],
"WebIDL/invalid/idl/enum.widl": [
[
{}
@@ -176023,6 +179266,121 @@
{}
]
],
+ "XMLHttpRequest/resources/access-control-allow-lists.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-allow-with-body.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-auth-basic.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-allow-no-credentials.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-allow-star.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-allow.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-cors-safelisted-request-headers.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-denied.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-options-not-supported.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-preflight-cache-invalidation.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-preflight-cache-timeout.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-preflight-cache.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-put-allow.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-basic-whitelist-response-headers.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-cookie.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-origin-header.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-denied.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-request-header-lowercase.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-request-header-sorted.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-request-headers-origin.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-request-invalid-status.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-request-must-not-contain-cookie.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/access-control-sandboxed-iframe.html": [
+ [
+ {}
+ ]
+ ],
"XMLHttpRequest/resources/auth1/auth.py": [
[
{}
@@ -176198,6 +179556,11 @@
{}
]
],
+ "XMLHttpRequest/resources/no-custom-header-on-preflight.py": [
+ [
+ {}
+ ]
+ ],
"XMLHttpRequest/resources/nocors/folder.txt": [
[
{}
@@ -176208,6 +179571,16 @@
{}
]
],
+ "XMLHttpRequest/resources/pass.txt": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/redirect-cors.py": [
+ [
+ {}
+ ]
+ ],
"XMLHttpRequest/resources/redirect.py": [
[
{}
@@ -176218,6 +179591,21 @@
{}
]
],
+ "XMLHttpRequest/resources/reset-token.py": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/responseType-document-in-worker.js": [
+ [
+ {}
+ ]
+ ],
+ "XMLHttpRequest/resources/responseXML-unavailable-in-worker.js": [
+ [
+ {}
+ ]
+ ],
"XMLHttpRequest/resources/send-after-setting-document-domain-window-1.htm": [
[
{}
@@ -176263,6 +179651,11 @@
{}
]
],
+ "XMLHttpRequest/resources/win-1252-html.py": [
+ [
+ {}
+ ]
+ ],
"XMLHttpRequest/resources/win-1252-xml.py": [
[
{}
@@ -176358,21 +179751,11 @@
{}
]
],
- "accelerometer/support-iframe.html": [
- [
- {}
- ]
- ],
"ambient-light/OWNERS": [
[
{}
]
],
- "ambient-light/support-iframe.html": [
- [
- {}
- ]
- ],
"annotation-model/.editorconfig": [
[
{}
@@ -177818,6 +181201,11 @@
{}
]
],
+ "annotation-protocol/OWNERS": [
+ [
+ {}
+ ]
+ ],
"annotation-protocol/README.md": [
[
{}
@@ -178803,267 +182191,267 @@
{}
]
],
- "app-uri/OWNERS": [
+ "background-fetch/OWNERS": [
[
{}
]
],
- "app-uri/README.md": [
+ "background-fetch/interfaces.idl": [
[
{}
]
],
- "app-uri/resources/ExamPLE/mmY/index.html": [
+ "background-fetch/resources/sw.js": [
[
{}
]
],
- "app-uri/resources/ExamPLE/mmY/sth.txt": [
+ "background-fetch/resources/utils.js": [
[
{}
]
],
- "app-uri/resources/ExamPLE/{mY}/z...z/index.html": [
+ "battery-status/OWNERS": [
[
{}
]
],
- "app-uri/resources/ImaGes/{{a}}/Test_1/$a/sth34!.png": [
+ "battery-status/support-iframe.html": [
[
{}
]
],
- "app-uri/resources/ImaGes/~t/{!a}/corrupted_file.png": [
+ "battery-status/support-window-open.html": [
[
{}
]
],
- "app-uri/resources/ImaGes/~t/{!a}/~sth.png": [
+ "beacon/beacon-common.sub.js": [
[
{}
]
],
- "app-uri/resources/icons/w3c-128.png": [
+ "beacon/headers/header-referrer.js": [
[
{}
]
],
- "app-uri/resources/icons/w3c-16.png": [
+ "beacon/navigate.iFrame.sub.html": [
[
{}
]
],
- "app-uri/resources/icons/w3c-48.png": [
+ "beacon/resources/beacon.py": [
[
{}
]
],
- "assumptions/OWNERS": [
+ "beacon/resources/content-type.py": [
[
{}
]
],
- "assumptions/ahem-ref.html": [
+ "beacon/resources/inspect-header.py": [
[
{}
]
],
- "assumptions/canvas-background-ref.html": [
+ "bluetooth/OWNERS": [
[
{}
]
],
- "assumptions/initial-color-ref.html": [
+ "clear-site-data/support/echo-clear-site-data.py": [
[
{}
]
],
- "assumptions/medium-font-size-ref.html": [
+ "clear-site-data/support/page_with_resource.sub.html": [
[
{}
]
],
- "assumptions/min-font-size-ref.html": [
+ "clear-site-data/support/send_report.html": [
[
{}
]
],
- "assumptions/tools/ahem-generate-table.py": [
+ "clear-site-data/support/service_worker.js": [
[
{}
]
],
- "assumptions/tools/build.sh": [
+ "clear-site-data/support/test_utils.sub.js": [
[
{}
]
],
- "auxclick/OWNERS": [
+ "clipboard-apis/OWNERS": [
[
{}
]
],
- "background-fetch/OWNERS": [
+ "common/OWNERS": [
[
{}
]
],
- "background-fetch/interfaces.idl": [
+ "common/PrefixedLocalStorage.js": [
[
{}
]
],
- "battery-status/OWNERS": [
+ "common/PrefixedLocalStorage.js.headers": [
[
{}
]
],
- "battery-status/support-iframe.html": [
+ "common/PrefixedPostMessage.js": [
[
{}
]
],
- "battery-status/support-window-open.html": [
+ "common/PrefixedPostMessage.js.headers": [
[
{}
]
],
- "beacon/headers/header-referrer.js": [
+ "common/blank.html": [
[
{}
]
],
- "beacon/resources/content-type.py": [
+ "common/canvas-frame.css": [
[
{}
]
],
- "beacon/resources/inspect-header.py": [
+ "common/canvas-frame.css.headers": [
[
{}
]
],
- "bluetooth/OWNERS": [
+ "common/canvas-index.css": [
[
{}
]
],
- "clear-site-data/support/echo-clear-site-data.py": [
+ "common/canvas-index.css.headers": [
[
{}
]
],
- "clear-site-data/support/test_utils.js": [
+ "common/canvas-spec.css": [
[
{}
]
],
- "clipboard/OWNERS": [
+ "common/canvas-spec.css.headers": [
[
{}
]
],
- "common/OWNERS": [
+ "common/canvas-tests.css": [
[
{}
]
],
- "common/PrefixedLocalStorage.js": [
+ "common/canvas-tests.css.headers": [
[
{}
]
],
- "common/PrefixedPostMessage.js": [
+ "common/canvas-tests.js": [
[
{}
]
],
- "common/blank.html": [
+ "common/canvas-tests.js.headers": [
[
{}
]
],
- "common/canvas-frame.css": [
+ "common/css-paint-tests.js": [
[
{}
]
],
- "common/canvas-index.css": [
+ "common/css-paint-tests.js.headers": [
[
{}
]
],
- "common/canvas-spec.css": [
+ "common/css-red.txt": [
[
{}
]
],
- "common/canvas-tests.css": [
+ "common/domain-setter.sub.html": [
[
{}
]
],
- "common/canvas-tests.js": [
+ "common/dummy.xhtml": [
[
{}
]
],
- "common/css-paint-tests.js": [
+ "common/dummy.xml": [
[
{}
]
],
- "common/css-red.txt": [
+ "common/entities.json": [
[
{}
]
],
- "common/domain-setter.sub.html": [
+ "common/form-submission.py": [
[
{}
]
],
- "common/dummy.xhtml": [
+ "common/get-host-info.sub.js": [
[
{}
]
],
- "common/dummy.xml": [
+ "common/get-host-info.sub.js.headers": [
[
{}
]
],
- "common/entities.json": [
+ "common/large.py": [
[
{}
]
],
- "common/form-submission.py": [
+ "common/media.js": [
[
{}
]
],
- "common/get-host-info.sub.js": [
+ "common/media.js.headers": [
[
{}
]
],
- "common/large.py": [
+ "common/object-association.js": [
[
{}
]
],
- "common/media.js": [
+ "common/object-association.js.headers": [
[
{}
]
],
- "common/object-association.js": [
+ "common/performance-timeline-utils.js": [
[
{}
]
],
- "common/performance-timeline-utils.js": [
+ "common/performance-timeline-utils.js.headers": [
[
{}
]
@@ -179083,16 +182471,31 @@
{}
]
],
+ "common/reftest-wait.js.headers": [
+ [
+ {}
+ ]
+ ],
"common/stringifiers.js": [
[
{}
]
],
+ "common/stringifiers.js.headers": [
+ [
+ {}
+ ]
+ ],
"common/test-setting-immutable-prototype.js": [
[
{}
]
],
+ "common/test-setting-immutable-prototype.js.headers": [
+ [
+ {}
+ ]
+ ],
"common/text-plain.txt": [
[
{}
@@ -179103,7 +182506,22 @@
{}
]
],
- "common/vendor-prefix.js": [
+ "common/utils.js.headers": [
+ [
+ {}
+ ]
+ ],
+ "common/vendor-prefix.js.headers": [
+ [
+ {}
+ ]
+ ],
+ "compat/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "compat/green-ref.html": [
[
{}
]
@@ -196973,7 +200391,7 @@
{}
]
],
- "conformance-checkers/html/elements/picture/srcset-microsyntax-leading-dot-x-novalid.html": [
+ "conformance-checkers/html/elements/picture/srcset-microsyntax-leading-dot-x-valid.html": [
[
{}
]
@@ -201653,21 +205071,11 @@
{}
]
],
- "content-security-policy/blink-contrib/manifest-src-allowed.sub.html": [
- [
- {}
- ]
- ],
"content-security-policy/blink-contrib/manifest-src-allowed.sub.html.sub.headers": [
[
{}
]
],
- "content-security-policy/blink-contrib/manifest-src-blocked.sub.html": [
- [
- {}
- ]
- ],
"content-security-policy/blink-contrib/manifest-src-blocked.sub.html.sub.headers": [
[
{}
@@ -201703,26 +205111,6 @@
{}
]
],
- "content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html.sub.headers": [
- [
- {}
- ]
- ],
- "content-security-policy/blink-contrib/object-src-applet-archive.sub.html.sub.headers": [
- [
- {}
- ]
- ],
- "content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html.sub.headers": [
- [
- {}
- ]
- ],
- "content-security-policy/blink-contrib/object-src-applet-code.sub.html.sub.headers": [
- [
- {}
- ]
- ],
"content-security-policy/blink-contrib/object-src-no-url-allowed.sub.html.sub.headers": [
[
{}
@@ -202353,6 +205741,16 @@
{}
]
],
+ "content-security-policy/navigation/support/test_csp_self_window.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "content-security-policy/navigation/support/test_csp_self_window.sub.html.sub.headers": [
+ [
+ {}
+ ]
+ ],
"content-security-policy/nonce-hiding/script-nonces-hidden.tentative.html.headers": [
[
{}
@@ -202418,6 +205816,11 @@
{}
]
],
+ "content-security-policy/script-src/javascript-window-open-blocked.html.sub.headers": [
+ [
+ {}
+ ]
+ ],
"content-security-policy/script-src/script-src-1_1.html.sub.headers": [
[
{}
@@ -202463,6 +205866,26 @@
{}
]
],
+ "content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html.sub.headers": [
+ [
+ {}
+ ]
+ ],
"content-security-policy/script-src/script-src-sri_hash.sub.html.sub.headers": [
[
{}
@@ -202593,7 +206016,7 @@
{}
]
],
- "content-security-policy/support/Ahem.ttf": [
+ "content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers": [
[
{}
]
@@ -202638,6 +206061,11 @@
{}
]
],
+ "content-security-policy/support/import-scripts.js": [
+ [
+ {}
+ ]
+ ],
"content-security-policy/support/inject-image.js": [
[
{}
@@ -202763,6 +206191,16 @@
{}
]
],
+ "core-aam/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "core-aam/README.md": [
+ [
+ {}
+ ]
+ ],
"cors/OWNERS": [
[
{}
@@ -202833,12 +206271,77 @@
{}
]
],
- "css-font-display/font-display-ref.html": [
+ "css-backgrounds/background-clip-color-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-backgrounds/background-clip-color-repaint-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/font-display/font-display-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/matching/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/matching/README.md": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/matching/fixed-stretch-style-over-weight-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/matching/font-matching.css": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/matching/resources/variabletest_matching.ttf": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/matching/stretch-distance-over-weight-distance-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/matching/style-ranges-over-weight-direction-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/variations/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/variations/resources/variabletest_box.ttf": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/variations/variable-box-font-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-fonts/variations/variable-gpos-m2b-ref.html": [
[
{}
]
],
- "css-font-display/resources/slow-ahem-loading.py": [
+ "css-fonts/variations/variable-gsub-ref.html": [
[
{}
]
@@ -202863,6 +206366,56 @@
{}
]
],
+ "css-paint-api/geometry-background-image-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/geometry-background-image-002-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/geometry-background-image-tiled-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/geometry-background-image-tiled-002-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/geometry-background-image-tiled-003-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/geometry-border-image-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/geometry-border-image-002-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/geometry-border-image-003-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/geometry-border-image-004-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/hidpi/device-pixel-ratio-ref.html": [
+ [
+ {}
+ ]
+ ],
"css-paint-api/invalid-image-constructor-error-ref.html": [
[
{}
@@ -202933,6 +206486,31 @@
{}
]
],
+ "css-paint-api/parse-input-arguments-018-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/parse-input-arguments-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/style-background-image-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/style-before-pseudo-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css-paint-api/style-first-letter-pseudo-ref.html": [
+ [
+ {}
+ ]
+ ],
"css-paint-api/valid-image-after-load-ref.html": [
[
{}
@@ -202943,6 +206521,11 @@
{}
]
],
+ "css-scoping/slotted-with-pseudo-element-ref.html": [
+ [
+ {}
+ ]
+ ],
"css-timing/OWNERS": [
[
{}
@@ -211008,6 +214591,11 @@
{}
]
],
+ "css/CSS2/i18n/OWNERS": [
+ [
+ {}
+ ]
+ ],
"css/CSS2/i18n/syndata/.htaccess": [
[
{}
@@ -219223,6 +222811,16 @@
{}
]
],
+ "css/CSS2/tables/reference/table-anonymous-border-spacing-ref.xht": [
+ [
+ {}
+ ]
+ ],
+ "css/CSS2/tables/reference/table-anonymous-text-indent-ref.xht": [
+ [
+ {}
+ ]
+ ],
"css/CSS2/tables/reference/table-margin-004-ref.xht": [
[
{}
@@ -225568,6 +229166,11 @@
{}
]
],
+ "css/css-counter-styles-3/i18n/OWNERS": [
+ [
+ {}
+ ]
+ ],
"css/css-counter-styles-3/i18n/README": [
[
{}
@@ -225718,6 +229321,11 @@
{}
]
],
+ "css/css-flexbox-1/auto-margins-001-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-flexbox-1/css-flexbox-column-ref.html": [
[
{}
@@ -226578,6 +230186,21 @@
{}
]
],
+ "css/css-flexbox-1/percentage-heights-002-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-flexbox-1/percentage-widths-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-flexbox-1/position-absolute-005-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-flexbox-1/reference/Flexible-order-ref.html": [
[
{}
@@ -227003,6 +230626,11 @@
{}
]
],
+ "css/css-flexbox-1/whitespace-in-flexitem-001-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-fonts-3/OWNERS": [
[
{}
@@ -227588,16 +231216,6 @@
{}
]
],
- "css/css-fonts-3/support/fonts/Unnamed Med/FontFeatureTest.ttf": [
- [
- {}
- ]
- ],
- "css/css-fonts-3/support/fonts/Unnamed Med/Unnamed-Medium.ttf": [
- [
- {}
- ]
- ],
"css/css-fonts-3/support/fonts/font-feature-settings-rendering-2-expected.html": [
[
{}
@@ -235023,6 +238641,31 @@
{}
]
],
+ "css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-paint-positioned-children-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-children-writing-modes-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-background-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-background-rtl-001-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-grid-1/abspos/orthogonal-positioned-grid-items-001-ref.html": [
[
{}
@@ -235153,6 +238796,11 @@
{}
]
],
+ "css/css-grid-1/abspos/positioned-grid-items-sizing-001-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-grid-1/grid-definition/support/testing-utils.js": [
[
{}
@@ -235173,12 +238821,12 @@
{}
]
],
- "css/css-grid-1/grid-items/support/100x50-green.png": [
+ "css/css-grid-1/grid-items/support/200x200-green.png": [
[
{}
]
],
- "css/css-grid-1/grid-items/support/200x200-green.png": [
+ "css/css-grid-1/grid-items/support/25x50-green.png": [
[
{}
]
@@ -235188,7 +238836,7 @@
{}
]
],
- "css/css-grid-1/grid-items/support/50x100-green.png": [
+ "css/css-grid-1/grid-items/support/50x25-green.png": [
[
{}
]
@@ -235263,6 +238911,11 @@
{}
]
],
+ "css/css-grid-1/reference/grid-support-grid-auto-columns-rows-002-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-grid-1/reference/grid-text-green-margin-no-collapse-ref.html": [
[
{}
@@ -235273,6 +238926,21 @@
{}
]
],
+ "css/css-grid-1/support/grid-alignment.css": [
+ [
+ {}
+ ]
+ ],
+ "css/css-grid-1/support/grid.css": [
+ [
+ {}
+ ]
+ ],
+ "css/css-grid-1/support/style-change.js": [
+ [
+ {}
+ ]
+ ],
"css/css-grid-1/test-plan/index.html": [
[
{}
@@ -235538,17 +239206,17 @@
{}
]
],
- "css/css-logical-properties-1/OWNERS": [
+ "css/css-logical-1/OWNERS": [
[
{}
]
],
- "css/css-logical-properties-1/resources/style-check.js": [
+ "css/css-logical-1/cascading-001-ref.html": [
[
{}
]
],
- "css/css-logical-props-1/cascading-001-ref.html": [
+ "css/css-logical-1/resources/style-check.js": [
[
{}
]
@@ -235808,12 +239476,12 @@
{}
]
],
- "css/css-multicol-1/multicol-block-clip-001-ref.xht": [
+ "css/css-multicol-1/multicol-block-no-clip-001-ref.xht": [
[
{}
]
],
- "css/css-multicol-1/multicol-block-clip-002-ref.xht": [
+ "css/css-multicol-1/multicol-block-no-clip-002-ref.xht": [
[
{}
]
@@ -236168,6 +239836,11 @@
{}
]
],
+ "css/css-multicol-1/multicol-rule-shorthand-2-ref.xht": [
+ [
+ {}
+ ]
+ ],
"css/css-multicol-1/multicol-rule-solid-000-ref.xht": [
[
{}
@@ -236778,16 +240451,86 @@
{}
]
],
+ "css/css-position-3/position-sticky-flexbox-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-grid-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-inflow-position-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-inline-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-position-3/position-sticky-left-ref.html": [
[
{}
]
],
+ "css/css-position-3/position-sticky-margins-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-bottom-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-inline-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-left-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-right-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-table-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-nested-top-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-overflow-padding-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-position-3/position-sticky-right-ref.html": [
[
{}
]
],
+ "css/css-position-3/position-sticky-root-scroller-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-stacking-context-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-position-3/position-sticky-table-tfoot-bottom-ref.html": [
[
{}
@@ -236833,6 +240576,21 @@
{}
]
],
+ "css/css-position-3/position-sticky-transforms-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-transforms-translate-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-writing-modes-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-pseudo-4/OWNERS": [
[
{}
@@ -236843,6 +240601,26 @@
{}
]
],
+ "css/css-pseudo-4/marker-and-other-pseudo-elements-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-pseudo-4/marker-color-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-pseudo-4/marker-font-properties-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-pseudo-4/marker-inherit-values-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-regions-1/OWNERS": [
[
{}
@@ -238833,6 +242611,31 @@
{}
]
],
+ "css/css-tables-3/support/base.css": [
+ [
+ {}
+ ]
+ ],
+ "css/css-tables-3/support/check-layout-th.js": [
+ [
+ {}
+ ]
+ ],
+ "css/css-tables-3/tools/markup-generator.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-colspan-003-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-005-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-text-3/OWNERS": [
[
{}
@@ -238858,6 +242661,11 @@
{}
]
],
+ "css/css-text-3/i18n/OWNERS": [
+ [
+ {}
+ ]
+ ],
"css/css-text-3/i18n/reference/css3-text-line-break-jazh-001-ref.html": [
[
{}
@@ -241088,6 +244896,11 @@
{}
]
],
+ "css/css-text-3/line-break/reference/line-break-anywhere-001-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-text-3/line-break/reference/line-break-normal-021-ref.xht": [
[
{}
@@ -242023,6 +245836,16 @@
{}
]
],
+ "css/css-text-3/white-space/reference/pre-wrap-001-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-text-3/white-space/reference/white-space-collapsing-discard-001-ref.xht": [
[
{}
@@ -243463,6 +247286,11 @@
{}
]
],
+ "css/css-transforms-2/animation/resources/interpolation-testcommon.js": [
+ [
+ {}
+ ]
+ ],
"css/css-transforms-2/css-rotate-2d-3d-001-ref.html": [
[
{}
@@ -244063,6 +247891,46 @@
{}
]
],
+ "css/css-ui-3/reference/text-overflow-006-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-3/reference/text-overflow-008-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-3/reference/text-overflow-012-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-3/reference/text-overflow-013-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-3/reference/text-overflow-016-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-3/reference/text-overflow-021-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-3/reference/text-overflow-022-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-3/support/1x1-red.png": [
+ [
+ {}
+ ]
+ ],
"css/css-ui-3/support/PTS/PngSuite.LICENSE": [
[
{}
@@ -245048,157 +248916,187 @@
{}
]
],
- "css/css-ui-3/support/nav-dir-target-001-frame.html": [
+ "css/css-ui-3/support/orange.png": [
[
{}
]
],
- "css/css-ui-3/support/nav-dir-target-002-frame.html": [
+ "css/css-ui-3/support/orange.svg": [
[
{}
]
],
- "css/css-ui-3/support/nav-dir-target-003-frame.html": [
+ "css/css-ui-3/support/r1-1.svg": [
[
{}
]
],
- "css/css-ui-3/support/nav-dir-target-004-frame.html": [
+ "css/css-ui-3/support/red.ico": [
[
{}
]
],
- "css/css-ui-3/support/nav-dir-target-005-frame.html": [
+ "css/css-ui-3/support/test.mp4": [
[
{}
]
],
- "css/css-ui-3/support/nav-down-009-frame.html": [
+ "css/css-ui-3/support/test.ogv": [
[
{}
]
],
- "css/css-ui-3/support/nav-down-010-frame.html": [
+ "css/css-ui-3/support/test.webm": [
[
{}
]
],
- "css/css-ui-3/support/nav-down-011-frame.html": [
+ "css/css-ui-3/support/w100.svg": [
[
{}
]
],
- "css/css-ui-3/support/nav-down-012-frame.html": [
+ "css/css-ui-3/support/w100_h100.svg": [
[
{}
]
],
- "css/css-ui-3/support/nav-down-013-frame.html": [
+ "css/css-ui-3/support/w100_r1-1.svg": [
[
{}
]
],
- "css/css-ui-3/support/nav-left-009-frame.html": [
+ "css/css-ui-3/text-overflow-ref.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-left-010-frame.html": [
+ "css/css-ui-4/OWNERS": [
[
{}
]
],
- "css/css-ui-3/support/nav-left-011-frame.html": [
+ "css/css-ui-4/support/nav-dir-target-001-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-left-012-frame.html": [
+ "css/css-ui-4/support/nav-dir-target-002-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-left-013-frame.html": [
+ "css/css-ui-4/support/nav-dir-target-003-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-right-009-frame.html": [
+ "css/css-ui-4/support/nav-dir-target-004-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-right-010-frame.html": [
+ "css/css-ui-4/support/nav-dir-target-005-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-right-011-frame.html": [
+ "css/css-ui-4/support/nav-down-009-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-right-012-frame.html": [
+ "css/css-ui-4/support/nav-down-010-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-right-013-frame.html": [
+ "css/css-ui-4/support/nav-down-011-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-up-009-frame.html": [
+ "css/css-ui-4/support/nav-down-012-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-up-010-frame.html": [
+ "css/css-ui-4/support/nav-down-013-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-up-011-frame.html": [
+ "css/css-ui-4/support/nav-left-009-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-up-012-frame.html": [
+ "css/css-ui-4/support/nav-left-010-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/nav-up-013-frame.html": [
+ "css/css-ui-4/support/nav-left-011-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/r1-1.svg": [
+ "css/css-ui-4/support/nav-left-012-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/red.ico": [
+ "css/css-ui-4/support/nav-left-013-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/w100.svg": [
+ "css/css-ui-4/support/nav-right-009-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/w100_h100.svg": [
+ "css/css-ui-4/support/nav-right-010-frame.html": [
[
{}
]
],
- "css/css-ui-3/support/w100_r1-1.svg": [
+ "css/css-ui-4/support/nav-right-011-frame.html": [
[
{}
]
],
- "css/css-ui-3/text-overflow-ref.html": [
+ "css/css-ui-4/support/nav-right-012-frame.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-4/support/nav-right-013-frame.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-4/support/nav-up-009-frame.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-4/support/nav-up-010-frame.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-4/support/nav-up-011-frame.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-4/support/nav-up-012-frame.html": [
+ [
+ {}
+ ]
+ ],
+ "css/css-ui-4/support/nav-up-013-frame.html": [
[
{}
]
@@ -245463,6 +249361,11 @@
{}
]
],
+ "css/css-values-3/support/vh_not_refreshing_on_chrome_iframe.html": [
+ [
+ {}
+ ]
+ ],
"css/css-values-3/vh-calc-support.html": [
[
{}
@@ -245533,6 +249436,11 @@
{}
]
],
+ "css/css-variables-1/variable-generated-content-dynamic-001-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/css-writing-modes-3/OWNERS": [
[
{}
@@ -249978,6 +253886,11 @@
{}
]
],
+ "css/css3-selectors/i18n/OWNERS": [
+ [
+ {}
+ ]
+ ],
"css/css3-selectors/i18n/README": [
[
{}
@@ -250788,21 +254701,6 @@
{}
]
],
- "css/fonts/ahem/COPYING": [
- [
- {}
- ]
- ],
- "css/fonts/ahem/README": [
- [
- {}
- ]
- ],
- "css/fonts/ahem/ahem.ttf": [
- [
- {}
- ]
- ],
"css/geometry-1/OWNERS": [
[
{}
@@ -250838,6 +254736,11 @@
{}
]
],
+ "css/motion-1/animation/resources/interpolation-testcommon.js": [
+ [
+ {}
+ ]
+ ],
"css/motion-1/offset-path-ray-ref.html": [
[
{}
@@ -254298,6 +258201,11 @@
{}
]
],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-emphasis-color-property-001-ref.html": [
[
{}
@@ -255068,6 +258976,11 @@
{}
]
],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1-ref.html": [
+ [
+ {}
+ ]
+ ],
"css/vendor-imports/mozilla/mozilla-central-reftests/variables/reftest.list": [
[
{}
@@ -275653,161 +279566,6 @@
{}
]
],
- "css/work-in-progress/microsoft/css-tables/base.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/bounding-box-computation-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/bounding-box-computation-2.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/bounding-box-computation-3.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/caption-side-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/fixed-layout-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/fixed-layout-2.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-0.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/height-distribution/percentage-sizing-of-table-cell-children.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/html-to-css-mapping-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/html-to-css-mapping-2.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/html5-table-formatting-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/html5-table-formatting-2.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/html5-table-formatting-3.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/html5-table-formatting-fixed-layout-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/markup-generator.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/table-model-fixup-2.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/table-model-fixup.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/visibility-collapse-col-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/visibility-collapse-row-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-0.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-0.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-2.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-guess.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-percent-guess.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.html": [
- [
- {}
- ]
- ],
"css/work-in-progress/microsoft/emboxes.png": [
[
{}
@@ -279028,2612 +282786,37 @@
{}
]
],
- "css/work-in-progress/ttwf_bj/Along/reference/ttwf-reftest-borderRadius-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/Along/ttwf-jstest-borderRadius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/Along/ttwf-reftest-borderRadius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/Chris/elementFromPosition.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/Chris/reference/ttwf-reftest-borderRadius-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/Chris/ttwf-reftest-borderRadius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/Chris/ttwf-scrollintoview.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/Chris/window-screen-height.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/angela/background-clip-color.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/angela/background-clip-image.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/angela/reference/background-clip-color-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/angela/reference/background-clip-image-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/angela/support/img_star.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/babyliner/border-images-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/babyliner/border-images-003.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/babyliner/border-images.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/babyliner/images/border-image-002.jpg": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/babyliner/images/border-image-003.jpg": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/babyliner/images/border-image.jpg": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-bottom.htm": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-left.htm": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand.htm": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color.htm": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/border-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_position.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_radius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_size.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/content-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_position.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_radius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_size.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/list.txt": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_position.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_radius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_size.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/border-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_position.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_radius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_size.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/content-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_position.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_radius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_size.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/list.txt": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_position.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_radius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_size.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/resource/border.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/resource/css3.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/finscn/resource/ttwf.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/henry_d/border-image-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/henry_d/reference/border-image-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/henry_d/support/bt_blue.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/henry_d/support/repeat-x.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/jieorlin/flex-justify.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/jieorlin/flex-min-auto.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/jieorlin/reference/flex-justify-rel.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/jieorlin/reference/flex-min-auto-rel.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/jingke/cssom-view-window-pageXOffset-return-scrollX.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/keynesqu/Flexible-order.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/keynesqu/reference/Flexible-order-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/neo_and_rayi/extensions_to_the_HTMLElement_interface.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/peter/flex-align-items-center.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/peter/flex-items-flexibility.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/peter/readme.txt": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/peter/reference/flex-align-items-center-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/peter/reference/flex-items-flexibility.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/phuangce/flex-margin-no-collapse.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/phuangce/reference/flex-margin-no-collapse-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/renjing/border-image-repeat-round.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/renjing/border-image-round-and-stretch.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/renjing/border-image-slice-percentage.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/renjing/reference/border-image-repeat-round-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/renjing/reference/border-image-round-and-stretch-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/renjing/reference/border-image-slice-percentage-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/renjing/support/border-image-round-result.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/renjing/support/border.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/renjing/support/borderresult.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/tang,shaofeng/border-image-repeat_repeatnegx_none_50px.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/tmd/css-border-radius-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/tmd/css-border-radius-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/tmd/readme.txt": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/tmd/reference/y.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-boxsizing.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-childmargin.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-flex-prescation.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-margin.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-padding.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-basic.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-cascading.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/xiaochun/background-size-035.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/xiaochun/bg.jpg": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/xiaochun/reference/background-size-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/xiaoyan.jxy/background-clip_padding-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/xiaoyan.jxy/reference/background_clip_padding-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/yuhong/css-backgrounds-sizingimages-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/yuhong/reference/css-backgrounds-sizingimages-001-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/yuhong/support/test.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/zhangxiaochong/box-shadow-outset-without-border-radius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/zhangxiaochong/reference/box-shadow-outset-without-border-radius.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/zhouli/border-radius-clipping.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/zhouli/flexible-box-float.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/zhouli/reference/border-radius-clipping-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_bj/zhouli/reference/flex-box-float-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/justh/box-sizing-border-box-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/justh/outline-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/justh/outline-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/justh/outline-offset-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/justh/ref/box-sizing-border-box-001-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/justh/ref/outline-001-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/justh/ref/outline-offset-001-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/tonychyan/css-transform-combination-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/tonychyan/css-transform-hover-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-bothlines.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-firstline.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-secondline.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-order.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/achicu/css-exclusions/exclusions-pos-01.xht": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-lime.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-maroon.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-navy.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-white.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/60x60-gg-rr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/60x60-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/60x60-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/README": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/a-green.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/b-green.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/c-red.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/cat.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/import-green.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/import-red.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/pattern-gg-gr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rgr-grg.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rrg-rgg.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/pattern-rgr-grg-rgr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/pattern-tr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50%.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50px.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/ruler-v-100px.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/ruler-v-50px.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/square-purple.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/square-teal.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/square-white.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/support/README": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/support/swatch-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/support/swatch-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-blue.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-lime.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-orange.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-teal.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-white.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-yellow.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-bl.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-br.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-inner-half-size.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-outer.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-tl.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-tr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/chrissanborn/css-transform-scale-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/cjgammon/css-transforms/reftest/transform-origin-01-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/cjgammon/css-transforms/transform-origin-01.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/cshoop/medialist-creating-object-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/background-position-center-001-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/background-position-center-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/border-bottom-left-radius-001.xht": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-lime.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-maroon.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-navy.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-white.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/20x20-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/20x20-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/60x60-gg-rr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/60x60-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/60x60-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/a-green.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/b-green.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/c-red.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/cat.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/import-green.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/import-red.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/pattern-grg-rgr-grg.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/pattern-grg-rrg-rgg.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/pattern-rgr-grg-rgr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/pattern-tr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/ruler-h-50%.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/ruler-h-50px.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/ruler-v-100px.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/ruler-v-50px.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/square-purple.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/square-teal.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/square-white.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/support/swatch-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/support/swatch-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-blue.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-lime.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-orange.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-white.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-yellow.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-bl.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-br.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-inner-half-size.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-outer.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-tl.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-tr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/divya/index-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/divya/index-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/gangleton/reference/transform-translateX-002-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/gangleton/transform-translateX-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewx90.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewy90.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-TODO": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-README": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-003.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-004.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-005.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-README": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-003.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-004.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-005.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-006.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-007.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-008.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-009.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-010.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-011.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-012.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-013.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-014.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-015.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-016.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-README": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-003.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-004.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-README": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-fixed-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-001.xml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-002.xml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-003.xml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-004.xml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-005.xml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-006.xml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-007.xml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-008.xml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-009.xml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-010.xml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-README": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/border-style-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/hixie/border-style-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/flex-container-margin.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-modify.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-with-element-insert.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/flex-direction.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/flex-item-change-width.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-container.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-modify.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-with-element-insert.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-item-change-width.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-100x60.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-96x60.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-180-degrees-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-270-degrees-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-90-degrees-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/background-attachment-fixed.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/background-origin-border-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/background-origin-content-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/background-origin-padding-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-border-box-ref.xht": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-content-box-ref.xht": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-padding-box-ref.xht": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-lime.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-maroon.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-navy.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-white.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/60x60-gg-rr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/60x60-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/60x60-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/README": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/a-green.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/b-green.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/c-red.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/cat.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/import-green.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/import-red.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rgr-grg.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rrg-rgg.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/pattern-rgr-grg-rgr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/pattern-tr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50%.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50px.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-100px.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-50px.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/square-purple.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/square-teal.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/square-white.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/support/README": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-blue.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-green.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-lime.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-orange.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-red.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-teal.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-white.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-yellow.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-bl.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-br.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-inner-half-size.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-outer.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-tl.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-tr.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/miked782000/transform-oragin.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/miked782000/ttwf-reftest-rotate.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssom-cssText-serialize.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssom-cssstyledeclaration-set.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule-constructors.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssom-setProperty-shorthand.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssstyledeclaration-mutability.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/ssreed/diagonal-percentage-vector-background.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/ssreed/diagonal-scaled.svg": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-percentage-vector-background-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-scaled-fixed.svg": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shanghai/Zourui/background-color-transparent.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shanghai/Zourui/background-origin.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shanghai/Zourui/reference/background-color-transparent.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shanghai/Zourui/reference/background-origin.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shanghai/mark/css3-box-shadow-outline.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shanghai/mark/reference/css3-box-shadow-outline-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/keiko-kiki/refrence/ref-shape-circle-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/keiko-kiki/shape-circle-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/loutongbing/dish-isolated.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-000.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-value-1em.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/markqin/where-is-letter-spacing-applied.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/onlymollah/shape-outside-negative-center-positive-radius-ellipse-000.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/smallni/letter-spacing-value-1em.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/yanghengfeng/gradient.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-01.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-02-mask-box.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/hiromitsuuuuu/test_font_face_parser.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/ahem.css": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-iframe.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-iframe.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-iframe.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-iframe.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1a.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1b.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-3.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1a.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1b.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1a.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1b.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1c.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1d.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2a.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2b.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1a.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1b.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3a.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3b.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3c.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1a.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1b.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2a.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2b.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-disabled-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-enabled-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-helper.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-ref.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1.xhtml": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/reftest.list": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/solidblue.png": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/starters/CSSOM/samples/CSSStyleDeclaration-setProperty.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-002.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003-ref.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-004.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-005.html": [
- [
- {}
- ]
- ],
- "css/work-in-progress/ttwf_tokyo/t32k/css-fonts-font-face-rule.html": [
+ "cssom-view/OWNERS": [
[
{}
]
],
- "css/work-in-progress/ttwf_tokyo/takuya/font-family-18n-ref.html": [
+ "cssom-view/iframe.html": [
[
{}
]
],
- "css/work-in-progress/ttwf_tokyo/takuya/font-family-18n.html": [
+ "cssom-view/resources/elementsFromPoint.js": [
[
{}
]
],
- "css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n-ref.html": [
+ "cssom-view/resources/iframe1.html": [
[
{}
]
],
- "css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n.html": [
+ "cssom-view/resources/iframe2.html": [
[
{}
]
],
- "cssom-view/OWNERS": [
+ "cssom-view/scrollingElement-quirks-dynamic-001-ref.html": [
[
{}
]
],
- "cssom-view/iframe.html": [
+ "cssom-view/scrollingElement-quirks-dynamic-002-ref.html": [
[
{}
]
@@ -282098,6 +283281,11 @@
{}
]
],
+ "cssom/support/xmlss-pi.xhtml": [
+ [
+ {}
+ ]
+ ],
"custom-elements/OWNERS": [
[
{}
@@ -282243,6 +283431,11 @@
{}
]
],
+ "docs/_writing-tests/file-names.md": [
+ [
+ {}
+ ]
+ ],
"docs/_writing-tests/general-guidelines.md": [
[
{}
@@ -282733,6 +283926,11 @@
{}
]
],
+ "dom/nodes/Element-matches-init.js": [
+ [
+ {}
+ ]
+ ],
"dom/nodes/Element-matches.js": [
[
{}
@@ -282998,6 +284196,11 @@
{}
]
],
+ "editing/data/insert-list-items-in-table-cells.js": [
+ [
+ {}
+ ]
+ ],
"editing/data/inserthorizontalrule.js": [
[
{}
@@ -283168,6 +284371,26 @@
{}
]
],
+ "encoding/eof-shift_jis-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "encoding/eof-utf-8-one-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "encoding/eof-utf-8-three-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "encoding/eof-utf-8-two-ref.html": [
+ [
+ {}
+ ]
+ ],
"encoding/legacy-mb-japanese/shift_jis/jis0208_index.js": [
[
{}
@@ -283713,232 +284936,67 @@
{}
]
],
- "encoding/resources/encodings.js": [
- [
- {}
- ]
- ],
- "encoding/resources/single-byte-raw.py": [
- [
- {}
- ]
- ],
- "encoding/resources/text-plain-charset.py": [
- [
- {}
- ]
- ],
- "encrypted-media/EncryptedMediaExtensions.idl": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-creation-with-gc.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-setcert-with-gc.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys-with-session.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-reference.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release-noreference.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-multiple-mediakeys.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-reload.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-check-init-data-type.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clear-key-invalid-license.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clearkey-update-non-ascii-input.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-events.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-generate-request-disallowed-input.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-not-callable-after-createsession.html": [
+ "encoding/resources/decoding-helpers.js": [
[
{}
]
],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-onencrypted.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-encrypted-and-clear-sources.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-after-src.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-before-src.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-two-videos.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-requestmediakeysystemaccess.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-reset-src-after-setmediakeys.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-session-closed-event.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-playback.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-resetting-src.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-at-same-time.html": [
- [
- {}
- ]
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html": [
+ "encoding/resources/encodings.js": [
[
{}
]
],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html": [
+ "encoding/resources/single-byte-raw.py": [
[
{}
]
],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-to-multiple-video-elements.html": [
+ "encoding/resources/text-plain-charset.py": [
[
{}
]
],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys.html": [
+ "encoding/resources/utf-32-big-endian-bom.html": [
[
{}
]
],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-syntax.html": [
+ "encoding/resources/utf-32-big-endian-bom.xml": [
[
{}
]
],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-unique-origin.html": [
+ "encoding/resources/utf-32-big-endian-nobom.html": [
[
{}
]
],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-update-disallowed-input.html": [
+ "encoding/resources/utf-32-big-endian-nobom.xml": [
[
{}
]
],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-utils.js": [
+ "encoding/resources/utf-32-little-endian-bom.html": [
[
{}
]
],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-waiting-for-a-key.html": [
+ "encoding/resources/utf-32-little-endian-bom.xml": [
[
{}
]
],
- "encrypted-media/Google/webm/test-encrypted-different-av-keys.webm": [
+ "encoding/resources/utf-32-little-endian-nobom.html": [
[
{}
]
],
- "encrypted-media/Google/webm/test-encrypted.webm": [
+ "encoding/resources/utf-32-little-endian-nobom.xml": [
[
{}
]
],
- "encrypted-media/Google/webm/test.webm": [
+ "encrypted-media/EncryptedMediaExtensions.idl": [
[
{}
]
@@ -284318,6 +285376,61 @@
{}
]
],
+ "entries-api/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "entries-api/interfaces.idl": [
+ [
+ {}
+ ]
+ ],
+ "entries-api/support.js": [
+ [
+ {}
+ ]
+ ],
+ "entries-api/support/a/b/c/3.txt": [
+ [
+ {}
+ ]
+ ],
+ "entries-api/support/a/b/c/d/1.txt": [
+ [
+ {}
+ ]
+ ],
+ "entries-api/support/a/b/c/d/2.txt": [
+ [
+ {}
+ ]
+ ],
+ "entries-api/support/upload.txt": [
+ [
+ {}
+ ]
+ ],
+ "entries-api/support/upload/file.txt": [
+ [
+ {}
+ ]
+ ],
+ "entries-api/support/upload/subdir/1.txt": [
+ [
+ {}
+ ]
+ ],
+ "entries-api/support/upload/subdir/2.txt": [
+ [
+ {}
+ ]
+ ],
+ "entries-api/support/upload/subdir/3.txt": [
+ [
+ {}
+ ]
+ ],
"eventsource/OWNERS": [
[
{}
@@ -284408,6 +285521,51 @@
{}
]
],
+ "feature-policy/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "feature-policy/README.md": [
+ [
+ {}
+ ]
+ ],
+ "feature-policy/payment-allowed-by-feature-policy.https.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "feature-policy/payment-disabled-by-feature-policy.https.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "feature-policy/resources/feature-policy-payment.html": [
+ [
+ {}
+ ]
+ ],
+ "feature-policy/resources/feature-policy-usb.html": [
+ [
+ {}
+ ]
+ ],
+ "feature-policy/resources/feature-policy-webvr.html": [
+ [
+ {}
+ ]
+ ],
+ "feature-policy/resources/featurepolicy.js": [
+ [
+ {}
+ ]
+ ],
+ "feature-policy/resources/redirect-on-load.html": [
+ [
+ {}
+ ]
+ ],
"fetch/OWNERS": [
[
{}
@@ -284593,6 +285751,11 @@
{}
]
],
+ "fetch/api/request/request-error.js": [
+ [
+ {}
+ ]
+ ],
"fetch/api/request/resources/cache.py": [
[
{}
@@ -284608,6 +285771,11 @@
{}
]
],
+ "fetch/api/resources/basic.html": [
+ [
+ {}
+ ]
+ ],
"fetch/api/resources/cache.py": [
[
{}
@@ -284628,6 +285796,16 @@
{}
]
],
+ "fetch/api/resources/empty.txt": [
+ [
+ {}
+ ]
+ ],
+ "fetch/api/resources/infinite-slow-response.py": [
+ [
+ {}
+ ]
+ ],
"fetch/api/resources/inspect-headers.py": [
[
{}
@@ -284653,11 +285831,26 @@
{}
]
],
+ "fetch/api/resources/stash-put.py": [
+ [
+ {}
+ ]
+ ],
+ "fetch/api/resources/stash-take.py": [
+ [
+ {}
+ ]
+ ],
"fetch/api/resources/status.py": [
[
{}
]
],
+ "fetch/api/resources/sw-intercept.js": [
+ [
+ {}
+ ]
+ ],
"fetch/api/resources/top.txt": [
[
{}
@@ -284763,6 +285956,11 @@
{}
]
],
+ "fonts/Ahem.ttf": [
+ [
+ {}
+ ]
+ ],
"fonts/CanvasTest.ttf": [
[
{}
@@ -284773,6 +285971,11 @@
{}
]
],
+ "fonts/README.md": [
+ [
+ {}
+ ]
+ ],
"fonts/math/axisheight5000-verticalarrow14000.woff": [
[
{}
@@ -285113,6 +286316,21 @@
{}
]
],
+ "fullscreen/api/resources/attempt-fullscreen.html": [
+ [
+ {}
+ ]
+ ],
+ "fullscreen/api/resources/report-fullscreen-enabled.html": [
+ [
+ {}
+ ]
+ ],
+ "fullscreen/rendering/fullscreen-pseudo-class-support.html": [
+ [
+ {}
+ ]
+ ],
"fullscreen/trusted-click.js": [
[
{}
@@ -285148,11 +286366,6 @@
{}
]
],
- "gyroscope/support-iframe.html": [
- [
- {}
- ]
- ],
"hr-time/OWNERS": [
[
{}
@@ -285278,6 +286491,11 @@
{}
]
],
+ "html/README.md": [
+ [
+ {}
+ ]
+ ],
"html/browsers/.gitkeep": [
[
{}
@@ -285378,6 +286596,16 @@
{}
]
],
+ "html/browsers/browsing-the-web/history-traversal/support/window-name-navigation.sub.html": [
+ [
+ {}
+ ]
+ ],
+ "html/browsers/browsing-the-web/history-traversal/support/window-name-test.sub.html": [
+ [
+ {}
+ ]
+ ],
"html/browsers/browsing-the-web/history-traversal/unset_context_name.html": [
[
{}
@@ -285578,6 +286806,11 @@
{}
]
],
+ "html/browsers/browsing-the-web/scroll-to-fragid/navigate-helpers.js": [
+ [
+ {}
+ ]
+ ],
"html/browsers/browsing-the-web/unloading-documents/.gitkeep": [
[
{}
@@ -286198,6 +287431,36 @@
{}
]
],
+ "html/browsers/offline/appcache/workers/resources/appcache-dedicated-worker-not-in-cache.js": [
+ [
+ {}
+ ]
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-shared-worker-not-in-cache.js": [
+ [
+ {}
+ ]
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-worker-data.py": [
+ [
+ {}
+ ]
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-worker-import.py": [
+ [
+ {}
+ ]
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-worker.manifest": [
+ [
+ {}
+ ]
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-worker.py": [
+ [
+ {}
+ ]
+ ],
"html/browsers/offline/application-cache-api/.gitkeep": [
[
{}
@@ -292253,6 +293516,11 @@
{}
]
],
+ "html/infrastructure/safe-passing-of-structured-data/echo.js": [
+ [
+ {}
+ ]
+ ],
"html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/nested-worker-success.js": [
[
{}
@@ -292883,6 +294151,11 @@
{}
]
],
+ "html/rendering/non-replaced-elements/tables/colgroup_valign-ref.xhtml": [
+ [
+ {}
+ ]
+ ],
"html/rendering/non-replaced-elements/tables/table-border-1-ref.html": [
[
{}
@@ -292903,6 +294176,11 @@
{}
]
],
+ "html/rendering/non-replaced-elements/tables/table-direction-ref.html": [
+ [
+ {}
+ ]
+ ],
"html/rendering/non-replaced-elements/tables/table-layout-notref.html": [
[
{}
@@ -292913,6 +294191,16 @@
{}
]
],
+ "html/rendering/non-replaced-elements/tables/table-row-direction-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "html/rendering/non-replaced-elements/tables/table-row-group-direction-ref.html": [
+ [
+ {}
+ ]
+ ],
"html/rendering/non-replaced-elements/tables/table-width-150percent-ref.html": [
[
{}
@@ -293298,6 +294586,11 @@
{}
]
],
+ "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/support/refresh.py": [
+ [
+ {}
+ ]
+ ],
"html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/support/refresh.sub.html": [
[
{}
@@ -293813,6 +295106,11 @@
{}
]
],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-on-popup.html": [
+ [
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-without-user-gesture-failed.html": [
[
{}
@@ -293823,16 +295121,171 @@
{}
]
],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-that-tries-to-navigate-parent-and-sends-result-to-grandparent.html": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-its-child.html": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-its-child.html": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-itself.html": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_001.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_002.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_003.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_004.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_006.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_007.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_008.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_010.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_012.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020a.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021a.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_022.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_023.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_024.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_026.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_027.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_028.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_029.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_031.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_032.htm": [
+ [
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-iframe-element/support/navigation-changed-iframe.html": [
[
{}
]
],
+ "html/semantics/embedded-content/the-iframe-element/support/sandbox.pdf": [
+ [
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-iframe-element/support/sandbox_allow_script.html": [
[
{}
]
],
+ "html/semantics/embedded-content/the-iframe-element/support/sandbox_helper.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/standalone-fail.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/standalone-iframe-content.htm": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/standalone-pass.htm": [
+ [
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-img-element/.gitkeep": [
[
{}
@@ -294133,6 +295586,11 @@
{}
]
],
+ "html/semantics/forms/the-label-element/iframe-label-attributes.html": [
+ [
+ {}
+ ]
+ ],
"html/semantics/forms/the-legend-element/.gitkeep": [
[
{}
@@ -294163,11 +295621,6 @@
{}
]
],
- "html/semantics/forms/the-progress-element/.gitkeep": [
- [
- {}
- ]
- ],
"html/semantics/forms/the-select-element/.gitkeep": [
[
{}
@@ -294378,6 +295831,11 @@
{}
]
],
+ "html/semantics/interactive-elements/the-dialog-element/resources/common.js": [
+ [
+ {}
+ ]
+ ],
"html/semantics/interactive-elements/the-menu-element/.gitkeep": [
[
{}
@@ -294493,6 +295951,106 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/execution-timing/102.html": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/css/background.css": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/css/import.css": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld-postMessage.html": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld.html": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/count-script-tags.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-body.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-foo.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-1.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-10.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-11.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-2.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-3.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-4.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-5.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-6.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-7.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-8.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-9.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/testlib/testlib.js": [
+ [
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/external-script-utf8.js": [
[
{}
@@ -294603,6 +296161,11 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external.js": [
+ [
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/module/errorhandling-parseerror-common.js": [
[
{}
@@ -294763,6 +296326,121 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-4a.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-4b.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-4c.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-4d.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5a.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5b.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5c.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5d.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5e.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-6a.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-6b.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-6c.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-6d.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7a.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7b.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7c.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7d.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7e.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7f.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/integrity-matches-inner.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/integrity-matches.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/integrity-mismatches-inner.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/integrity-mismatches.js": [
+ [
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/module/missing-export-nested.js": [
[
{}
@@ -294778,11 +296456,41 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/resources/credentials-iframe.sub.html": [
+ [
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/module/resources/delayed-modulescript.py": [
[
{}
]
],
+ "html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8-with-charset-header.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/resources/import-utf8-with-charset-header.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/resources/import-utf8.js": [
+ [
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/module/set-currentScript-on-window.js": [
[
{}
@@ -294818,6 +296526,11 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/module/throw-error.js": [
+ [
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/module/throw-nested.js": [
[
{}
@@ -294828,6 +296541,21 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/resources/bom-utf-16be.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/resources/bom-utf-16le.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/resources/bom-utf-8.js": [
+ [
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/resources/cocoa-module.js": [
[
{}
@@ -294843,11 +296571,26 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/resources/load-error-events-helpers.js": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/resources/load-error-events.py": [
+ [
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/resources/set-script-executed.js": [
[
{}
]
],
+ "html/semantics/scripting-1/the-script-element/resources/slow.py": [
+ [
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/script-not-executed-after-shutdown-child.html": [
[
{}
@@ -295203,6 +296946,16 @@
{}
]
],
+ "html/semantics/text-level-semantics/the-a-element/a-download-404.py": [
+ [
+ {}
+ ]
+ ],
+ "html/semantics/text-level-semantics/the-a-element/resources/a-download-404.html": [
+ [
+ {}
+ ]
+ ],
"html/semantics/text-level-semantics/the-abbr-element/.gitkeep": [
[
{}
@@ -295738,11 +297491,6 @@
{}
]
],
- "html/webappapis/idle-callbacks/resources/post_name_on_load.html": [
- [
- {}
- ]
- ],
"html/webappapis/scripting/.gitkeep": [
[
{}
@@ -295928,6 +297676,11 @@
{}
]
],
+ "http/OWNERS": [
+ [
+ {}
+ ]
+ ],
"http/basic-auth-cache-test-ref.html": [
[
{}
@@ -295938,6 +297691,26 @@
{}
]
],
+ "http/refresh/README.md": [
+ [
+ {}
+ ]
+ ],
+ "http/refresh/resources/multiple.asis": [
+ [
+ {}
+ ]
+ ],
+ "http/refresh/resources/refresh.py": [
+ [
+ {}
+ ]
+ ],
+ "http/refresh/resources/refreshed.txt": [
+ [
+ {}
+ ]
+ ],
"http/resources/securedimage.py": [
[
{}
@@ -296118,6 +297891,11 @@
{}
]
],
+ "images/smiley.png.headers": [
+ [
+ {}
+ ]
+ ],
"images/threecolors.png": [
[
{}
@@ -296143,6 +297921,51 @@
{}
]
],
+ "infrastructure/README.md": [
+ [
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/ahem-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/canvas-background-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/initial-color-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/medium-font-size-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/min-font-size-ref.html": [
+ [
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/tools/ahem-generate-table.py": [
+ [
+ {}
+ ]
+ ],
+ "infrastructure/assumptions/tools/build.sh": [
+ [
+ {}
+ ]
+ ],
"infrastructure/reftest-wait-ref.html": [
[
{}
@@ -296168,11 +297991,31 @@
{}
]
],
+ "interfaces/clipboard.idl": [
+ [
+ {}
+ ]
+ ],
+ "interfaces/console.idl": [
+ [
+ {}
+ ]
+ ],
+ "interfaces/cssom-view.idl": [
+ [
+ {}
+ ]
+ ],
"interfaces/cssom.idl": [
[
{}
]
],
+ "interfaces/dedicated-workers.idl": [
+ [
+ {}
+ ]
+ ],
"interfaces/dom.idl": [
[
{}
@@ -296198,6 +298041,16 @@
{}
]
],
+ "interfaces/payment-handler.idl": [
+ [
+ {}
+ ]
+ ],
+ "interfaces/payment-request.idl": [
+ [
+ {}
+ ]
+ ],
"interfaces/remoteplayback.idl": [
[
{}
@@ -296213,11 +298066,56 @@
{}
]
],
+ "interfaces/web-share.idl": [
+ [
+ {}
+ ]
+ ],
+ "interfaces/webidl.idl": [
+ [
+ {}
+ ]
+ ],
"interfaces/webrtc-pc.idl": [
[
{}
]
],
+ "interfaces/webusb.idl": [
+ [
+ {}
+ ]
+ ],
+ "intersection-observer/observer-in-iframe.html": [
+ [
+ {}
+ ]
+ ],
+ "intersection-observer/resources/cross-origin-subframe.html": [
+ [
+ {}
+ ]
+ ],
+ "intersection-observer/resources/iframe-no-root-subframe.html": [
+ [
+ {}
+ ]
+ ],
+ "intersection-observer/resources/intersection-observer-test-utils.js": [
+ [
+ {}
+ ]
+ ],
+ "intersection-observer/resources/observer-in-iframe-subframe.html": [
+ [
+ {}
+ ]
+ ],
+ "intersection-observer/resources/timestamp-subframe.html": [
+ [
+ {}
+ ]
+ ],
"js/builtins/Math.maxmin.js": [
[
{}
@@ -296233,6 +298131,11 @@
{}
]
],
+ "longtask-timing/OWNERS": [
+ [
+ {}
+ ]
+ ],
"longtask-timing/resources/makelongtask.js": [
[
{}
@@ -296258,7 +298161,7 @@
{}
]
],
- "magnetometer/support-iframe.html": [
+ "mathml/OWNERS": [
[
{}
]
@@ -296848,132 +298751,42 @@
{}
]
],
- "media/white.mp4": [
- [
- {}
- ]
- ],
- "media/white.webm": [
- [
- {}
- ]
- ],
- "mediacapture-record/OWNERS": [
- [
- {}
- ]
- ],
- "mediacapture-streams/OWNERS": [
- [
- {}
- ]
- ],
- "mediasession/README.md": [
- [
- {}
- ]
- ],
- "microdata/conformance-requirements/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/converting-html-to-other-formats/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/converting-html-to-other-formats/json/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/dependencies/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/encoding-microdata/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/encoding-microdata/associating-names-with-items/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/encoding-microdata/items/.gitkeep": [
+ "media/test-a-128k-44100Hz-1ch.webm": [
[
{}
]
],
- "microdata/encoding-microdata/microdata-and-other-namespaces/.gitkeep": [
+ "media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm": [
[
{}
]
],
- "microdata/encoding-microdata/names-the-itemprop-attribute/.gitkeep": [
+ "media/test-v-128k-320x240-24fps-8kfr.webm": [
[
{}
]
],
- "microdata/encoding-microdata/names-the-itemprop-attribute/original-id.json": [
- [
- {}
- ]
- ],
- "microdata/encoding-microdata/the-microdata-model/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/encoding-microdata/values/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/iana/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/introduction/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/introduction/global-identifiers-for-items/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/introduction/overview/.gitkeep": [
- [
- {}
- ]
- ],
- "microdata/introduction/selecting-names-when-defining-vocabularies/.gitkeep": [
+ "media/white.mp4": [
[
{}
]
],
- "microdata/introduction/the-basic-syntax/.gitkeep": [
+ "media/white.webm": [
[
{}
]
],
- "microdata/introduction/typed-items/.gitkeep": [
+ "mediacapture-record/OWNERS": [
[
{}
]
],
- "microdata/introduction/using-the-microdata-dom-api/.gitkeep": [
+ "mediacapture-streams/OWNERS": [
[
{}
]
],
- "microdata/terminology/.gitkeep": [
+ "mediasession/README.md": [
[
{}
]
@@ -297738,16 +299551,6 @@
{}
]
],
- "old-tests/submission/Infraware/Session_History/contents/Session_History/css/result.css": [
- [
- {}
- ]
- ],
- "old-tests/submission/Infraware/Session_History/contents/Session_History/index.html": [
- [
- {}
- ]
- ],
"old-tests/submission/Microsoft/dragdrop/dragdrop_support.js": [
[
{}
@@ -297783,206 +299586,11 @@
{}
]
],
- "old-tests/submission/Microsoft/images/blue-area.png": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/images/blue-border.png": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/images/blue.png": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/images/fail.gif": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/images/movie_300_frame_0.png": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/images/poster.png": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/images/poster_blue.png": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/images/poster_green.png": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/images/poster_red.png": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/images/rect.svg": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_001.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_002.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_003.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_004.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_006.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_007.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_008.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_010.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_012.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_020.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_020a.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_021.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_021a.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_022.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_023.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_024.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_026.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_027.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_028.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_029.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_031.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_032.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox.pdf": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_helper.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/standalone-fail.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/standalone-iframe-content.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/standalone-pass.htm": [
- [
- {}
- ]
- ],
"old-tests/submission/Microsoft/selection/RemoveElementContainingSelection.htm": [
[
{}
]
],
- "old-tests/submission/Microsoft/selection/addRange.htm": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/selection/collapse.htm": [
- [
- {}
- ]
- ],
"old-tests/submission/Microsoft/selection/collapseToEnd.htm": [
[
{}
@@ -298038,126 +299646,6 @@
{}
]
],
- "old-tests/submission/Microsoft/structuredclone/echo.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/xhtml5/colgroup_valign_bottom.xhtml": [
- [
- {}
- ]
- ],
- "old-tests/submission/Microsoft/xhtml5/colgroup_valign_top.xhtml": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/102.html": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/css/background.css": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/css/import.css": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/pages/helloworld-postMessage.html": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/pages/helloworld.html": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/count-script-tags.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/find-body.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/find-foo.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-1.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-10.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-11.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-12.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-2.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-3.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-4.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-5.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-6.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-7.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-8.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-9.js": [
- [
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/testlib/testlib.js": [
- [
- {}
- ]
- ],
"old-tests/submission/migration.txt": [
[
{}
@@ -298893,6 +300381,16 @@
{}
]
],
+ "page-visibility/resources/iframe-with-subframes.html": [
+ [
+ {}
+ ]
+ ],
+ "page-visibility/resources/iframe.html": [
+ [
+ {}
+ ]
+ ],
"page-visibility/resources/pagevistestharness.js": [
[
{}
@@ -298908,6 +300406,41 @@
{}
]
],
+ "paint-timing/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "paint-timing/resources/circle.svg": [
+ [
+ {}
+ ]
+ ],
+ "paint-timing/resources/circles.png": [
+ [
+ {}
+ ]
+ ],
+ "payment-handler/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "payment-method-basic-card/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "payment-method-id/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "payment-method-id/README.md": [
+ [
+ {}
+ ]
+ ],
"payment-request/OWNERS": [
[
{}
@@ -298923,12 +300456,22 @@
{}
]
],
- "payment-request/payment-request-canmakepayment-method.https.http": [
+ "payment-request/payment-request-response-id.html": [
[
{}
]
],
- "payment-request/payment-request-response-id.html": [
+ "payment-request/payment-response/helpers.js": [
+ [
+ {}
+ ]
+ ],
+ "payment-request/resources/page1.html": [
+ [
+ {}
+ ]
+ ],
+ "payment-request/resources/page2.html": [
[
{}
]
@@ -298948,6 +300491,11 @@
{}
]
],
+ "performance-timeline/resources/worker-with-performance-observer.js": [
+ [
+ {}
+ ]
+ ],
"pointerevents/OWNERS": [
[
{}
@@ -298988,51 +300536,146 @@
{}
]
],
+ "preload/dynamic-adding-preload-nonce.html.headers": [
+ [
+ {}
+ ]
+ ],
"preload/link-header-preload-delay-onload.html.headers": [
[
{}
]
],
+ "preload/link-header-preload-nonce.html.headers": [
+ [
+ {}
+ ]
+ ],
"preload/link-header-preload.html.headers": [
[
{}
]
],
+ "preload/resources/A4.ogv": [
+ [
+ {}
+ ]
+ ],
+ "preload/resources/A4.ogv.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "preload/resources/CanvasTest.ttf": [
+ [
+ {}
+ ]
+ ],
+ "preload/resources/CanvasTest.ttf.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "preload/resources/dummy-preloads-subresource.css": [
+ [
+ {}
+ ]
+ ],
+ "preload/resources/dummy-preloads-subresource.css.sub.headers": [
+ [
+ {}
+ ]
+ ],
"preload/resources/dummy.css": [
[
{}
]
],
+ "preload/resources/dummy.css.sub.headers": [
+ [
+ {}
+ ]
+ ],
"preload/resources/dummy.js": [
[
{}
]
],
+ "preload/resources/dummy.js.sub.headers": [
+ [
+ {}
+ ]
+ ],
"preload/resources/dummy.xml": [
[
{}
]
],
+ "preload/resources/dummy.xml.sub.headers": [
+ [
+ {}
+ ]
+ ],
"preload/resources/empty.html": [
[
{}
]
],
+ "preload/resources/empty.html.sub.headers": [
+ [
+ {}
+ ]
+ ],
"preload/resources/fetch-destination-worker.js": [
[
{}
]
],
+ "preload/resources/foo.vtt": [
+ [
+ {}
+ ]
+ ],
+ "preload/resources/foo.vtt.sub.headers": [
+ [
+ {}
+ ]
+ ],
"preload/resources/preload_helper.js": [
[
{}
]
],
+ "preload/resources/sound_5.oga": [
+ [
+ {}
+ ]
+ ],
+ "preload/resources/sound_5.oga.sub.headers": [
+ [
+ {}
+ ]
+ ],
"preload/resources/square.png": [
[
{}
]
],
+ "preload/resources/square.png.sub.headers": [
+ [
+ {}
+ ]
+ ],
+ "preload/resources/white.mp4": [
+ [
+ {}
+ ]
+ ],
+ "preload/resources/white.mp4.sub.headers": [
+ [
+ {}
+ ]
+ ],
"presentation-api/OWNERS": [
[
{}
@@ -301798,6 +303441,31 @@
{}
]
],
+ "requestidlecallback/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "requestidlecallback/resources/post_name_on_load.html": [
+ [
+ {}
+ ]
+ ],
+ "resize-observer/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "resize-observer/resources/iframe.html": [
+ [
+ {}
+ ]
+ ],
+ "resize-observer/resources/resizeTestHelper.js": [
+ [
+ {}
+ ]
+ ],
"resource-timing/OWNERS": [
[
{}
@@ -301823,6 +303491,11 @@
{}
]
],
+ "resource-timing/resources/blue.png": [
+ [
+ {}
+ ]
+ ],
"resource-timing/resources/fake_responses.html": [
[
{}
@@ -302398,11 +304071,41 @@
{}
]
],
+ "service-workers/service-worker/resources/bytecheck-worker-imported-script.py": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/bytecheck-worker.py": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/claim-shared-worker-fetch-iframe.html": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/claim-shared-worker-fetch-worker.js": [
+ [
+ {}
+ ]
+ ],
"service-workers/service-worker/resources/claim-with-redirect-iframe.html": [
[
{}
]
],
+ "service-workers/service-worker/resources/claim-worker-fetch-iframe.html": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/claim-worker-fetch-worker.js": [
+ [
+ {}
+ ]
+ ],
"service-workers/service-worker/resources/claim-worker.js": [
[
{}
@@ -302618,11 +304321,6 @@
{}
]
],
- "service-workers/service-worker/resources/fetch-event-redirect-iframe.html": [
- [
- {}
- ]
- ],
"service-workers/service-worker/resources/fetch-event-respond-with-argument-iframe.html": [
[
{}
@@ -302883,6 +304581,11 @@
{}
]
],
+ "service-workers/service-worker/resources/immutable-prototype-serviceworker.js": [
+ [
+ {}
+ ]
+ ],
"service-workers/service-worker/resources/import-mime-type-worker.py": [
[
{}
@@ -302893,6 +304596,16 @@
{}
]
],
+ "service-workers/service-worker/resources/import-scripts-redirect-import.js": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/import-scripts-redirect-worker.js": [
+ [
+ {}
+ ]
+ ],
"service-workers/service-worker/resources/import-scripts-resource-map-worker.js": [
[
{}
@@ -302923,12 +304636,12 @@
{}
]
],
- "service-workers/service-worker/resources/interfaces-worker.sub.js": [
+ "service-workers/service-worker/resources/interfaces-idls.js": [
[
{}
]
],
- "service-workers/service-worker/resources/interfaces.js": [
+ "service-workers/service-worker/resources/interfaces-worker.sub.js": [
[
{}
]
@@ -302993,6 +304706,11 @@
{}
]
],
+ "service-workers/service-worker/resources/mime-sniffing-worker.js": [
+ [
+ {}
+ ]
+ ],
"service-workers/service-worker/resources/mime-type-worker.py": [
[
{}
@@ -303113,7 +304831,7 @@
{}
]
],
- "service-workers/service-worker/resources/opaque-response-preloaded-iframe.html": [
+ "service-workers/service-worker/resources/opaque-response-being-preloaded-xhr.html": [
[
{}
]
@@ -303123,6 +304841,11 @@
{}
]
],
+ "service-workers/service-worker/resources/opaque-response-preloaded-xhr.html": [
+ [
+ {}
+ ]
+ ],
"service-workers/service-worker/resources/other.html": [
[
{}
@@ -303193,7 +304916,32 @@
{}
]
],
- "service-workers/service-worker/resources/registration-tests.js": [
+ "service-workers/service-worker/resources/registration-tests-basic.js": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/registration-tests-mime-types.js": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/registration-tests-scope.js": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/registration-tests-script-url.js": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/registration-tests-script.js": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/registration-tests-security-error.js": [
[
{}
]
@@ -303323,6 +305071,16 @@
{}
]
],
+ "service-workers/service-worker/resources/update-max-aged-worker-imported-script.py": [
+ [
+ {}
+ ]
+ ],
+ "service-workers/service-worker/resources/update-max-aged-worker.py": [
+ [
+ {}
+ ]
+ ],
"service-workers/service-worker/resources/update-nocookie-worker.py": [
[
{}
@@ -303463,6 +305221,11 @@
{}
]
],
+ "speech-api/OWNERS": [
+ [
+ {}
+ ]
+ ],
"staticrange/OWNERS": [
[
{}
@@ -303573,11 +305336,26 @@
{}
]
],
+ "streams/readable-byte-streams/brand-checks.js": [
+ [
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/detached-buffers.js": [
+ [
+ {}
+ ]
+ ],
"streams/readable-byte-streams/general.js": [
[
{}
]
],
+ "streams/readable-byte-streams/properties.js": [
+ [
+ {}
+ ]
+ ],
"streams/readable-streams/bad-strategies.js": [
[
{}
@@ -303623,11 +305401,6 @@
{}
]
],
- "streams/readable-streams/pipe-through.js": [
- [
- {}
- ]
- ],
"streams/readable-streams/tee.js": [
[
{}
@@ -303793,6 +305566,126 @@
{}
]
],
+ "subresource-integrity/ed25519-broken-signature.js": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-broken-signature.js.headers": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-multi-signature-headers.js": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-multi-signature-headers.js.headers": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-multi-signature.js": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-multi-signature.js.headers": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-multi-signature2.js": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-multi-signature2.js.headers": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-no-signature.js": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-signature.js": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-signature.js.headers": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-signature2.js": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-signature2.js.headers": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style-multi-signature-headers.css": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style-multi-signature-headers.css.headers": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style-multi-signature.css": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style-multi-signature.css.headers": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style-multi-signature2.css": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style-multi-signature2.css.headers": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style-no-signature.css": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style-wrong-signature.css": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style-wrong-signature.css.headers": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style.css": [
+ [
+ {}
+ ]
+ ],
+ "subresource-integrity/ed25519-style.css.headers": [
+ [
+ {}
+ ]
+ ],
"subresource-integrity/matching-digest.js": [
[
{}
@@ -303808,6 +305701,11 @@
{}
]
],
+ "subresource-integrity/tools/ed25519.py": [
+ [
+ {}
+ ]
+ ],
"subresource-integrity/tools/generate_javascript.py": [
[
{}
@@ -304078,6 +305976,11 @@
{}
]
],
+ "trusted-types/support/helper.js": [
+ [
+ {}
+ ]
+ ],
"uievents/OWNERS": [
[
{}
@@ -304108,6 +306011,16 @@
{}
]
],
+ "uievents/keyboard/key.css": [
+ [
+ {}
+ ]
+ ],
+ "uievents/keyboard/key.js": [
+ [
+ {}
+ ]
+ ],
"uievents/legacy-domevents-tests/Status.html": [
[
{}
@@ -304503,11 +306416,6 @@
{}
]
],
- "viewport/OWNERS": [
- [
- {}
- ]
- ],
"viewport/viewport_support.js": [
[
{}
@@ -304623,6 +306531,11 @@
{}
]
],
+ "web-animations/resources/xhr-doc.py": [
+ [
+ {}
+ ]
+ ],
"web-animations/testcommon.js": [
[
{}
@@ -304633,6 +306546,21 @@
{}
]
],
+ "web-nfc/resources/nfc_help.js": [
+ [
+ {}
+ ]
+ ],
+ "web-share/OWNERS": [
+ [
+ {}
+ ]
+ ],
+ "web-share/resources/manual-helper.js": [
+ [
+ {}
+ ]
+ ],
"webaudio/.gitignore": [
[
{}
@@ -304663,11 +306591,6 @@
{}
]
],
- "webaudio/js/vendor-prefixes.js": [
- [
- {}
- ]
- ],
"webaudio/refresh_idl.rb": [
[
{}
@@ -304838,57 +306761,87 @@
{}
]
],
- "webdriver/actions/__init__.py": [
+ "webdriver/tests/__init__.py": [
+ [
+ {}
+ ]
+ ],
+ "webdriver/tests/actions/__init__.py": [
+ [
+ {}
+ ]
+ ],
+ "webdriver/tests/actions/support/__init__.py": [
[
{}
]
],
- "webdriver/actions/support/__init__.py": [
+ "webdriver/tests/actions/support/keys.py": [
[
{}
]
],
- "webdriver/actions/support/keys.py": [
+ "webdriver/tests/actions/support/refine.py": [
[
{}
]
],
- "webdriver/actions/support/refine.py": [
+ "webdriver/tests/actions/support/test_actions_wdspec.html": [
[
{}
]
],
- "webdriver/actions/support/test_actions_wdspec.html": [
+ "webdriver/tests/element_click/__init__.py": [
[
{}
]
],
- "webdriver/support/__init__.py": [
+ "webdriver/tests/retrieval/__init__.py": [
[
{}
]
],
- "webdriver/support/asserts.py": [
+ "webdriver/tests/state/__init__.py": [
[
{}
]
],
- "webdriver/support/fixtures.py": [
+ "webdriver/tests/state/text/__init__.py": [
[
{}
]
],
- "webdriver/support/http_request.py": [
+ "webdriver/tests/support/__init__.py": [
[
{}
]
],
- "webdriver/support/inline.py": [
+ "webdriver/tests/support/asserts.py": [
[
{}
]
],
- "webdriver/support/merge_dictionaries.py": [
+ "webdriver/tests/support/fixtures.py": [
+ [
+ {}
+ ]
+ ],
+ "webdriver/tests/support/http_request.py": [
+ [
+ {}
+ ]
+ ],
+ "webdriver/tests/support/inline.py": [
+ [
+ {}
+ ]
+ ],
+ "webdriver/tests/support/merge_dictionaries.py": [
+ [
+ {}
+ ]
+ ],
+ "webdriver/tests/support/wait.py": [
[
{}
]
@@ -313268,11 +315221,61 @@
{}
]
],
+ "webrtc/RTCConfiguration-helper.js": [
+ [
+ {}
+ ]
+ ],
+ "webrtc/RTCDTMFSender-helper.js": [
+ [
+ {}
+ ]
+ ],
"webrtc/RTCPeerConnection-helper.js": [
[
{}
]
],
+ "webrtc/RTCRtpCapabilities-helper.js": [
+ [
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpParameters-helper.js": [
+ [
+ {}
+ ]
+ ],
+ "webrtc/RTCStats-helper.js": [
+ [
+ {}
+ ]
+ ],
+ "webrtc/coverage/RTCDTMFSender.txt": [
+ [
+ {}
+ ]
+ ],
+ "webrtc/coverage/identity.txt": [
+ [
+ {}
+ ]
+ ],
+ "webrtc/coverage/set-session-description.txt": [
+ [
+ {}
+ ]
+ ],
+ "webrtc/dictionary-helper.js": [
+ [
+ {}
+ ]
+ ],
+ "webrtc/identity-helper.js": [
+ [
+ {}
+ ]
+ ],
"websockets/OWNERS": [
[
{}
@@ -313423,11 +315426,21 @@
{}
]
],
+ "websockets/unload-a-document/001-2.html": [
+ [
+ {}
+ ]
+ ],
"websockets/unload-a-document/002-1.html": [
[
{}
]
],
+ "websockets/unload-a-document/002-2.html": [
+ [
+ {}
+ ]
+ ],
"websockets/unload-a-document/005-1.html": [
[
{}
@@ -313528,6 +315541,11 @@
{}
]
],
+ "webstorage/resources/storage_session_window_noopener_second.html": [
+ [
+ {}
+ ]
+ ],
"webstorage/resources/storage_session_window_open_second.html": [
[
{}
@@ -313538,12 +315556,22 @@
{}
]
],
- "webusb/resources/check-availability.html": [
+ "webusb/README.md": [
+ [
+ {}
+ ]
+ ],
+ "webusb/resources/fake-devices.js": [
[
{}
]
],
- "webusb/resources/featurepolicytest.js": [
+ "webusb/resources/open-in-iframe.html": [
+ [
+ {}
+ ]
+ ],
+ "webusb/resources/usb-helpers.js": [
[
{}
]
@@ -313563,6 +315591,21 @@
{}
]
],
+ "webvr/webvr-disabled-by-feature-policy.https.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "webvr/webvr-enabled-by-feature-policy.https.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
+ "webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html.headers": [
+ [
+ {}
+ ]
+ ],
"webvtt/OWNERS": [
[
{}
@@ -313578,6 +315621,11 @@
{}
]
],
+ "webvtt/api/VTTCue/common.js": [
+ [
+ {}
+ ]
+ ],
"webvtt/api/categories.json": [
[
{}
@@ -313618,6 +315666,11 @@
{}
]
],
+ "webvtt/parsing/cue-text-parsing/dat/text.dat": [
+ [
+ {}
+ ]
+ ],
"webvtt/parsing/cue-text-parsing/dat/timestamps.dat": [
[
{}
@@ -315718,11 +317771,6 @@
{}
]
],
- "workers/interfaces.idl": [
- [
- {}
- ]
- ],
"workers/interfaces/DedicatedWorkerGlobalScope/postMessage/message-event.js": [
[
{}
@@ -315943,6 +317991,11 @@
{}
]
],
+ "workers/support/WorkerLocation-origin.html": [
+ [
+ {}
+ ]
+ ],
"workers/support/WorkerLocation.js": [
[
{}
@@ -315963,6 +318016,11 @@
{}
]
],
+ "workers/support/name-as-accidental-global.js": [
+ [
+ {}
+ ]
+ ],
"workers/support/name.js": [
[
{}
@@ -315983,6 +318041,41 @@
{}
]
],
+ "worklets/README.md": [
+ [
+ {}
+ ]
+ ],
+ "worklets/resources/empty-worklet-script.js": [
+ [
+ {}
+ ]
+ ],
+ "worklets/resources/import-cyclic-worklet-script.js": [
+ [
+ {}
+ ]
+ ],
+ "worklets/resources/import-nested-internal-worklet-script.js": [
+ [
+ {}
+ ]
+ ],
+ "worklets/resources/import-nested-worklet-script.js": [
+ [
+ {}
+ ]
+ ],
+ "worklets/resources/import-tests.js": [
+ [
+ {}
+ ]
+ ],
+ "worklets/resources/throwing-worklet-script.js": [
+ [
+ {}
+ ]
+ ],
"x-frame-options/support/helper.js": [
[
{}
@@ -316792,6 +318885,24 @@
{}
]
],
+ "2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html": [
+ [
+ "/2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html",
+ {}
+ ]
+ ],
+ "2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html": [
+ [
+ "/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html",
+ {}
+ ]
+ ],
+ "2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html": [
+ [
+ "/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html",
+ {}
+ ]
+ ],
"2dcontext/drawing-paths-to-the-canvas/canvas_complexshapes_ispointInpath_001.htm": [
[
"/2dcontext/drawing-paths-to-the-canvas/canvas_complexshapes_ispointInpath_001.htm",
@@ -318568,6 +320679,18 @@
{}
]
],
+ "2dcontext/imagebitmap/createImageBitmap-invalid-args.html": [
+ [
+ "/2dcontext/imagebitmap/createImageBitmap-invalid-args.html",
+ {}
+ ]
+ ],
+ "2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html": [
+ [
+ "/2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html",
+ {}
+ ]
+ ],
"2dcontext/line-styles/2d.line.cap.butt.html": [
[
"/2dcontext/line-styles/2d.line.cap.butt.html",
@@ -320392,6 +322515,12 @@
{}
]
],
+ "2dcontext/text-styles/2d.text.font.parse.tiny.html": [
+ [
+ "/2dcontext/text-styles/2d.text.font.parse.tiny.html",
+ {}
+ ]
+ ],
"2dcontext/text-styles/2d.text.measure.width.space.html": [
[
"/2dcontext/text-styles/2d.text.measure.width.space.html",
@@ -322716,14 +324845,6 @@
}
]
],
- "IndexedDB/large-nested-cloning.html": [
- [
- "/IndexedDB/large-nested-cloning.html",
- {
- "timeout": "long"
- }
- ]
- ],
"IndexedDB/large-requests-abort.html": [
[
"/IndexedDB/large-requests-abort.html",
@@ -322744,6 +324865,30 @@
{}
]
],
+ "IndexedDB/nested-cloning-large-multiple.html": [
+ [
+ "/IndexedDB/nested-cloning-large-multiple.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "IndexedDB/nested-cloning-large.html": [
+ [
+ "/IndexedDB/nested-cloning-large.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "IndexedDB/nested-cloning-small.html": [
+ [
+ "/IndexedDB/nested-cloning-small.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"IndexedDB/objectstore_keyorder.htm": [
[
"/IndexedDB/objectstore_keyorder.htm",
@@ -323610,27 +325755,43 @@
{}
]
],
- "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html": [
+ "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js": [
[
- "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html",
+ "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.html",
+ {}
+ ],
+ [
+ "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.worker.html",
{}
]
],
- "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html": [
+ "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js": [
+ [
+ "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.html",
+ {}
+ ],
[
- "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html",
+ "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.worker.html",
{}
]
],
- "WebIDL/ecmascript-binding/es-exceptions/constructor-object.html": [
+ "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js": [
[
- "/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html",
+ "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.html",
+ {}
+ ],
+ [
+ "/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.worker.html",
{}
]
],
- "WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js": [
+ "WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js": [
[
- "/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.html",
+ "/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.html",
+ {}
+ ],
+ [
+ "/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.worker.html",
{}
]
],
@@ -323664,6 +325825,12 @@
{}
]
],
+ "WebIDL/ecmascript-binding/legacy-platform-object.html": [
+ [
+ "/WebIDL/ecmascript-binding/legacy-platform-object.html",
+ {}
+ ]
+ ],
"WebIDL/ecmascript-binding/put-forwards.html": [
[
"/WebIDL/ecmascript-binding/put-forwards.html",
@@ -323676,6 +325843,12 @@
{}
]
],
+ "WebIDL/interfaces.html": [
+ [
+ "/WebIDL/interfaces.html",
+ {}
+ ]
+ ],
"XMLHttpRequest/FormData-append.html": [
[
"/XMLHttpRequest/FormData-append.html",
@@ -323782,6 +325955,294 @@
{}
]
],
+ "XMLHttpRequest/access-control-and-redirects-async-same-origin.htm": [
+ [
+ "/XMLHttpRequest/access-control-and-redirects-async-same-origin.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-and-redirects-async.htm": [
+ [
+ "/XMLHttpRequest/access-control-and-redirects-async.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-and-redirects.htm": [
+ [
+ "/XMLHttpRequest/access-control-and-redirects.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow-access-control-origin-header.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow-access-control-origin-header.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow-async.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow-async.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method-async.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method-async.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-header.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-header.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-method.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-method.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow-preflight-cache-timeout.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow-preflight-cache-timeout.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow-preflight-cache.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow-preflight-cache.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow-star.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow-star.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-allow.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-allow.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-cors-safelisted-response-headers.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-cors-safelisted-response-headers.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-denied.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-denied.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-get-fail-non-simple.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-get-fail-non-simple.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-non-cors-safelisted-content-type.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-non-cors-safelisted-content-type.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-post-success-no-content-type.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-post-success-no-content-type.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-post-with-non-cors-safelisted-content-type.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-post-with-non-cors-safelisted-content-type.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-basic-preflight-denied.htm": [
+ [
+ "/XMLHttpRequest/access-control-basic-preflight-denied.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-async-header-denied.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-async-header-denied.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-async-method-denied.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-async-method-denied.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-async-not-supported.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-async-not-supported.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-credential-async.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-credential-async.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-credential-sync.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-credential-sync.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-headers-async.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-headers-async.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-headers-sync.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-headers-sync.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-request-header-lowercase.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-request-header-lowercase.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-request-header-sorted.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-request-header-sorted.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-request-headers-origin.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-request-headers-origin.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-request-invalid-status-301.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-request-invalid-status-301.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-request-invalid-status-400.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-request-invalid-status-400.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-request-invalid-status-501.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-request-invalid-status-501.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-request-must-not-contain-cookie.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-request-must-not-contain-cookie.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-sync-header-denied.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-sync-header-denied.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-sync-method-denied.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-sync-method-denied.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-preflight-sync-not-supported.htm": [
+ [
+ "/XMLHttpRequest/access-control-preflight-sync-not-supported.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-recursive-failed-request.htm": [
+ [
+ "/XMLHttpRequest/access-control-recursive-failed-request.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-response-with-body-sync.htm": [
+ [
+ "/XMLHttpRequest/access-control-response-with-body-sync.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-response-with-body.htm": [
+ [
+ "/XMLHttpRequest/access-control-response-with-body.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-response-with-exposed-headers.htm": [
+ [
+ "/XMLHttpRequest/access-control-response-with-exposed-headers.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-sandboxed-iframe-allow-origin-null.htm": [
+ [
+ "/XMLHttpRequest/access-control-sandboxed-iframe-allow-origin-null.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-sandboxed-iframe-allow.htm": [
+ [
+ "/XMLHttpRequest/access-control-sandboxed-iframe-allow.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm": [
+ [
+ "/XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/access-control-sandboxed-iframe-denied.htm": [
+ [
+ "/XMLHttpRequest/access-control-sandboxed-iframe-denied.htm",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/allow-lists-starting-with-comma.htm": [
+ [
+ "/XMLHttpRequest/allow-lists-starting-with-comma.htm",
+ {}
+ ]
+ ],
"XMLHttpRequest/anonymous-mode-unsupported.htm": [
[
"/XMLHttpRequest/anonymous-mode-unsupported.htm",
@@ -324330,6 +326791,24 @@
{}
]
],
+ "XMLHttpRequest/responseType-document-in-worker.html": [
+ [
+ "/XMLHttpRequest/responseType-document-in-worker.html",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/responseXML-unavailable-in-worker.html": [
+ [
+ "/XMLHttpRequest/responseXML-unavailable-in-worker.html",
+ {}
+ ]
+ ],
+ "XMLHttpRequest/responsedocument-decoding.htm": [
+ [
+ "/XMLHttpRequest/responsedocument-decoding.htm",
+ {}
+ ]
+ ],
"XMLHttpRequest/responsetext-decoding.htm": [
[
"/XMLHttpRequest/responsetext-decoding.htm",
@@ -325066,15 +327545,33 @@
{}
]
],
- "app-uri/appURI_test.html": [
+ "audio-output/HTMLMediaElement-sinkId-idl.html": [
+ [
+ "/audio-output/HTMLMediaElement-sinkId-idl.html",
+ {}
+ ]
+ ],
+ "audio-output/setSinkId.https.html": [
+ [
+ "/audio-output/setSinkId.https.html",
+ {}
+ ]
+ ],
+ "background-fetch/content-security-policy.https.window.js": [
[
- "/app-uri/appURI_test.html",
+ "/background-fetch/content-security-policy.https.window.html",
{}
]
],
- "assumptions/html-elements.html": [
+ "background-fetch/credentials-in-url.https.window.js": [
[
- "/assumptions/html-elements.html",
+ "/background-fetch/credentials-in-url.https.window.html",
+ {}
+ ]
+ ],
+ "background-fetch/dangling-markup.https.window.js": [
+ [
+ "/background-fetch/dangling-markup.https.window.html",
{}
]
],
@@ -325096,6 +327593,18 @@
{}
]
],
+ "background-fetch/mixed-content-and-allowed-schemes.https.window.js": [
+ [
+ "/background-fetch/mixed-content-and-allowed-schemes.https.window.html",
+ {}
+ ]
+ ],
+ "background-fetch/port-blocking.https.window.js": [
+ [
+ "/background-fetch/port-blocking.https.window.html",
+ {}
+ ]
+ ],
"battery-status/battery-iframe.https.html": [
[
"/battery-status/battery-iframe.https.html",
@@ -325126,6 +327635,96 @@
{}
]
],
+ "beacon/beacon-basic-blob.html": [
+ [
+ "/beacon/beacon-basic-blob.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "beacon/beacon-basic-blobMax.html": [
+ [
+ "/beacon/beacon-basic-blobMax.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "beacon/beacon-basic-buffersource.html": [
+ [
+ "/beacon/beacon-basic-buffersource.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "beacon/beacon-basic-buffersourceMax.html": [
+ [
+ "/beacon/beacon-basic-buffersourceMax.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "beacon/beacon-basic-formdata.html": [
+ [
+ "/beacon/beacon-basic-formdata.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "beacon/beacon-basic-formdataMax.html": [
+ [
+ "/beacon/beacon-basic-formdataMax.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "beacon/beacon-basic-string.html": [
+ [
+ "/beacon/beacon-basic-string.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "beacon/beacon-basic-stringMax.html": [
+ [
+ "/beacon/beacon-basic-stringMax.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "beacon/beacon-cors.sub.window.js": [
+ [
+ "/beacon/beacon-cors.sub.window.html",
+ {}
+ ]
+ ],
+ "beacon/beacon-error.window.js": [
+ [
+ "/beacon/beacon-error.window.html",
+ {}
+ ]
+ ],
+ "beacon/beacon-navigate.html": [
+ [
+ "/beacon/beacon-navigate.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "beacon/beacon-redirect.window.js": [
+ [
+ "/beacon/beacon-redirect.window.html",
+ {}
+ ]
+ ],
"beacon/headers/header-content-type.html": [
[
"/beacon/headers/header-content-type.html",
@@ -325186,9 +327785,45 @@
{}
]
],
- "clear-site-data/navigation.html": [
+ "clear-site-data/navigation-insecure.html": [
+ [
+ "/clear-site-data/navigation-insecure.html",
+ {}
+ ]
+ ],
+ "clear-site-data/navigation.https.html": [
+ [
+ "/clear-site-data/navigation.https.html",
+ {}
+ ]
+ ],
+ "clear-site-data/resource.html": [
+ [
+ "/clear-site-data/resource.html",
+ {}
+ ]
+ ],
+ "clear-site-data/storage.https.html": [
+ [
+ "/clear-site-data/storage.https.html",
+ {}
+ ]
+ ],
+ "clipboard-apis/async-interfaces.https.html": [
+ [
+ "/clipboard-apis/async-interfaces.https.html",
+ {}
+ ]
+ ],
+ "clipboard-apis/async-navigator-clipboard-basics.https.html": [
+ [
+ "/clipboard-apis/async-navigator-clipboard-basics.https.html",
+ {}
+ ]
+ ],
+ "compat/historical.html": [
[
- "/clear-site-data/navigation.html",
+ "/compat/historical.html",
{}
]
],
@@ -325760,30 +328395,6 @@
{}
]
],
- "content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html": [
- [
- "/content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html",
- {}
- ]
- ],
- "content-security-policy/blink-contrib/object-src-applet-archive.sub.html": [
- [
- "/content-security-policy/blink-contrib/object-src-applet-archive.sub.html",
- {}
- ]
- ],
- "content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html": [
- [
- "/content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html",
- {}
- ]
- ],
- "content-security-policy/blink-contrib/object-src-applet-code.sub.html": [
- [
- "/content-security-policy/blink-contrib/object-src-applet-code.sub.html",
- {}
- ]
- ],
"content-security-policy/blink-contrib/object-src-no-url-allowed.sub.html": [
[
"/content-security-policy/blink-contrib/object-src-no-url-allowed.sub.html",
@@ -326444,6 +329055,18 @@
{}
]
],
+ "content-security-policy/inheritance/iframe.html": [
+ [
+ "/content-security-policy/inheritance/iframe.html",
+ {}
+ ]
+ ],
+ "content-security-policy/inheritance/window.html": [
+ [
+ "/content-security-policy/inheritance/window.html",
+ {}
+ ]
+ ],
"content-security-policy/inside-worker/dedicated-inheritance.html": [
[
"/content-security-policy/inside-worker/dedicated-inheritance.html",
@@ -326534,6 +329157,12 @@
{}
]
],
+ "content-security-policy/navigation/javascript-url-navigation-inherits-csp.html": [
+ [
+ "/content-security-policy/navigation/javascript-url-navigation-inherits-csp.html",
+ {}
+ ]
+ ],
"content-security-policy/navigation/to-javascript-url-frame-src.html": [
[
"/content-security-policy/navigation/to-javascript-url-frame-src.html",
@@ -326592,6 +329221,12 @@
{}
]
],
+ "content-security-policy/script-src/javascript-window-open-blocked.html": [
+ [
+ "/content-security-policy/script-src/javascript-window-open-blocked.html",
+ {}
+ ]
+ ],
"content-security-policy/script-src/script-src-1_1.html": [
[
"/content-security-policy/script-src/script-src-1_1.html",
@@ -326646,6 +329281,30 @@
{}
]
],
+ "content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html": [
+ [
+ "/content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html",
+ {}
+ ]
+ ],
+ "content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html": [
+ [
+ "/content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html",
+ {}
+ ]
+ ],
+ "content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html": [
+ [
+ "/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html",
+ {}
+ ]
+ ],
+ "content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html": [
+ [
+ "/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html",
+ {}
+ ]
+ ],
"content-security-policy/script-src/script-src-sri_hash.sub.html": [
[
"/content-security-policy/script-src/script-src-sri_hash.sub.html",
@@ -326748,6 +329407,12 @@
{}
]
],
+ "content-security-policy/script-src/script-src-strict_dynamic_worker-importScripts.https.html": [
+ [
+ "/content-security-policy/script-src/script-src-strict_dynamic_worker-importScripts.https.html",
+ {}
+ ]
+ ],
"content-security-policy/script-src/script-src-strict_dynamic_worker.https.html": [
[
"/content-security-policy/script-src/script-src-strict_dynamic_worker.https.html",
@@ -326958,6 +329623,12 @@
{}
]
],
+ "content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html": [
+ [
+ "/content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html",
+ {}
+ ]
+ ],
"content-security-policy/style-src/style-src-none-blocked.html": [
[
"/content-security-policy/style-src/style-src-none-blocked.html",
@@ -327012,6 +329683,24 @@
{}
]
],
+ "content-security-policy/unsafe-hashed-attributes/script_event_handlers_allowed.html": [
+ [
+ "/content-security-policy/unsafe-hashed-attributes/script_event_handlers_allowed.html",
+ {}
+ ]
+ ],
+ "content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_matching_hash_no_unsafe_inline_attribute.html": [
+ [
+ "/content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_matching_hash_no_unsafe_inline_attribute.html",
+ {}
+ ]
+ ],
+ "content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_not_matching_hash.html": [
+ [
+ "/content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_not_matching_hash.html",
+ {}
+ ]
+ ],
"content-security-policy/worker-src/dedicated-child.sub.html": [
[
"/content-security-policy/worker-src/dedicated-child.sub.html",
@@ -327114,12 +329803,24 @@
{}
]
],
+ "cookies/secure/set-from-dom.sub.html": [
+ [
+ "/cookies/secure/set-from-dom.sub.html",
+ {}
+ ]
+ ],
"cookies/secure/set-from-http.https.sub.html": [
[
"/cookies/secure/set-from-http.https.sub.html",
{}
]
],
+ "cookies/secure/set-from-http.sub.html": [
+ [
+ "/cookies/secure/set-from-http.sub.html",
+ {}
+ ]
+ ],
"cookies/secure/set-from-ws.https.sub.html": [
[
"/cookies/secure/set-from-ws.https.sub.html",
@@ -327266,12 +329967,30 @@
{}
]
],
+ "css-cascade/inherit-initial.html": [
+ [
+ "/css-cascade/inherit-initial.html",
+ {}
+ ]
+ ],
"css-font-loading/fontfacesetloadevent-constructor.html": [
[
"/css-font-loading/fontfacesetloadevent-constructor.html",
{}
]
],
+ "css-fonts/variations/font-parse-numeric-stretch-style-weight.html": [
+ [
+ "/css-fonts/variations/font-parse-numeric-stretch-style-weight.html",
+ {}
+ ]
+ ],
+ "css-scoping/slotted-parsing.html": [
+ [
+ "/css-scoping/slotted-parsing.html",
+ {}
+ ]
+ ],
"css-timing/cubic-bezier-timing-functions-output.html": [
[
"/css-timing/cubic-bezier-timing-functions-output.html",
@@ -327314,12 +330033,6 @@
{}
]
],
- "css-values/unset-value-storage.html": [
- [
- "/css-values/unset-value-storage.html",
- {}
- ]
- ],
"css/compositing-1/mix-blend-mode/mix-blend-mode-creates-stacking-context.html": [
[
"/css/compositing-1/mix-blend-mode/mix-blend-mode-creates-stacking-context.html",
@@ -327368,6 +330081,12 @@
{}
]
],
+ "css/css-align-3/default-alignment/justify-items-legacy-001.html": [
+ [
+ "/css/css-align-3/default-alignment/justify-items-legacy-001.html",
+ {}
+ ]
+ ],
"css/css-align-3/default-alignment/place-items-shorthand-001.html": [
[
"/css/css-align-3/default-alignment/place-items-shorthand-001.html",
@@ -328036,6 +330755,42 @@
{}
]
],
+ "css/css-flexbox-1/percentage-heights-001.html": [
+ [
+ "/css/css-flexbox-1/percentage-heights-001.html",
+ {}
+ ]
+ ],
+ "css/css-flexbox-1/position-absolute-001.html": [
+ [
+ "/css/css-flexbox-1/position-absolute-001.html",
+ {}
+ ]
+ ],
+ "css/css-flexbox-1/position-absolute-002.html": [
+ [
+ "/css/css-flexbox-1/position-absolute-002.html",
+ {}
+ ]
+ ],
+ "css/css-flexbox-1/position-absolute-003.html": [
+ [
+ "/css/css-flexbox-1/position-absolute-003.html",
+ {}
+ ]
+ ],
+ "css/css-flexbox-1/position-absolute-004.html": [
+ [
+ "/css/css-flexbox-1/position-absolute-004.html",
+ {}
+ ]
+ ],
+ "css/css-fonts-3/test_datafont_same_origin.html": [
+ [
+ "/css/css-fonts-3/test_datafont_same_origin.html",
+ {}
+ ]
+ ],
"css/css-fonts-3/test_font_family_parsing.html": [
[
"/css/css-fonts-3/test_font_family_parsing.html",
@@ -328048,6 +330803,318 @@
{}
]
],
+ "css/css-grid-1/abspos/absolute-positioning-definite-sizes-001.html": [
+ [
+ "/css/css-grid-1/abspos/absolute-positioning-definite-sizes-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/absolute-positioning-grid-container-containing-block-001.html": [
+ [
+ "/css/css-grid-1/abspos/absolute-positioning-grid-container-containing-block-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/absolute-positioning-grid-container-parent-001.html": [
+ [
+ "/css/css-grid-1/abspos/absolute-positioning-grid-container-parent-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-content-alignment-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-content-alignment-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-content-alignment-rtl-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-content-alignment-rtl-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-gaps-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-gaps-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-gaps-rtl-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-gaps-rtl-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-implicit-grid-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-implicit-grid-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-implicit-grid-line-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-implicit-grid-line-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-padding-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-padding-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-unknown-named-grid-line-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-unknown-named-grid-line-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-within-grid-implicit-track-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-positioned-items-within-grid-implicit-track-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/grid-sizing-positioned-items-001.html": [
+ [
+ "/css/css-grid-1/abspos/grid-sizing-positioned-items-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/positioned-grid-items-should-not-create-implicit-tracks-001.html": [
+ [
+ "/css/css-grid-1/abspos/positioned-grid-items-should-not-create-implicit-tracks-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/abspos/positioned-grid-items-should-not-take-up-space-001.html": [
+ [
+ "/css/css-grid-1/abspos/positioned-grid-items-should-not-take-up-space-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html": [
+ [
+ "/css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html",
+ {}
+ ]
+ ],
+ "css/css-grid-1/alignment/grid-fit-content-tracks-dont-stretch-001.html": [
+ [
+ "/css/css-grid-1/alignment/grid-fit-content-tracks-dont-stretch-001.html",
+ {}
+ ]
+ ],
"css/css-grid-1/alignment/grid-self-alignment-stretch-001.html": [
[
"/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html",
@@ -328372,6 +331439,12 @@
{}
]
],
+ "css/css-grid-1/grid-definition/grid-shorthand-001.html": [
+ [
+ "/css/css-grid-1/grid-definition/grid-shorthand-001.html",
+ {}
+ ]
+ ],
"css/css-grid-1/grid-definition/grid-support-flexible-lengths-001.html": [
[
"/css/css-grid-1/grid-definition/grid-support-flexible-lengths-001.html",
@@ -328432,33 +331505,33 @@
{}
]
],
- "css/css-logical-properties-1/logicalprops-block-size-vlr.html": [
+ "css/css-logical-1/logicalprops-block-size-vlr.html": [
[
- "/css/css-logical-properties-1/logicalprops-block-size-vlr.html",
+ "/css/css-logical-1/logicalprops-block-size-vlr.html",
{}
]
],
- "css/css-logical-properties-1/logicalprops-block-size.html": [
+ "css/css-logical-1/logicalprops-block-size.html": [
[
- "/css/css-logical-properties-1/logicalprops-block-size.html",
+ "/css/css-logical-1/logicalprops-block-size.html",
{}
]
],
- "css/css-logical-properties-1/logicalprops-inline-size-vlr.html": [
+ "css/css-logical-1/logicalprops-inline-size-vlr.html": [
[
- "/css/css-logical-properties-1/logicalprops-inline-size-vlr.html",
+ "/css/css-logical-1/logicalprops-inline-size-vlr.html",
{}
]
],
- "css/css-logical-properties-1/logicalprops-inline-size.html": [
+ "css/css-logical-1/logicalprops-inline-size.html": [
[
- "/css/css-logical-properties-1/logicalprops-inline-size.html",
+ "/css/css-logical-1/logicalprops-inline-size.html",
{}
]
],
- "css/css-logical-properties-1/logicalprops-quirklength.html": [
+ "css/css-logical-1/logicalprops-quirklength.html": [
[
- "/css/css-logical-properties-1/logicalprops-quirklength.html",
+ "/css/css-logical-1/logicalprops-quirklength.html",
{}
]
],
@@ -328468,6 +331541,18 @@
{}
]
],
+ "css/css-position-3/position-sticky-input-box-gets-focused-after-scroll.html": [
+ [
+ "/css/css-position-3/position-sticky-input-box-gets-focused-after-scroll.html",
+ {}
+ ]
+ ],
+ "css/css-position-3/position-sticky-offset-top-left.html": [
+ [
+ "/css/css-position-3/position-sticky-offset-top-left.html",
+ {}
+ ]
+ ],
"css/css-position-3/position-sticky-parsing.html": [
[
"/css/css-position-3/position-sticky-parsing.html",
@@ -328516,6 +331601,12 @@
{}
]
],
+ "css/css-shapes-1/basic-shape-circle-ellipse-serialization.html": [
+ [
+ "/css/css-shapes-1/basic-shape-circle-ellipse-serialization.html",
+ {}
+ ]
+ ],
"css/css-shapes-1/shape-outside-invalid-001.html": [
[
"/css/css-shapes-1/shape-outside-invalid-001.html",
@@ -329176,6 +332267,348 @@
{}
]
],
+ "css/css-tables-3/bounding-box-computation-1.html": [
+ [
+ "/css/css-tables-3/bounding-box-computation-1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/bounding-box-computation-2.html": [
+ [
+ "/css/css-tables-3/bounding-box-computation-2.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/bounding-box-computation-3.html": [
+ [
+ "/css/css-tables-3/bounding-box-computation-3.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/caption-side-1.html": [
+ [
+ "/css/css-tables-3/caption-side-1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/fixed-layout-1.html": [
+ [
+ "/css/css-tables-3/fixed-layout-1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/fixed-layout-2.html": [
+ [
+ "/css/css-tables-3/fixed-layout-2.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/fixed-layout-calc-width-001.html": [
+ [
+ "/css/css-tables-3/fixed-layout-calc-width-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/fixed-layout-excess-width-distribution-001.html": [
+ [
+ "/css/css-tables-3/fixed-layout-excess-width-distribution-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/height-distribution/computing-row-measure-0.html": [
+ [
+ "/css/css-tables-3/height-distribution/computing-row-measure-0.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/height-distribution/computing-row-measure-1.html": [
+ [
+ "/css/css-tables-3/height-distribution/computing-row-measure-1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/height-distribution/percentage-sizing-of-table-cell-children.html": [
+ [
+ "/css/css-tables-3/height-distribution/percentage-sizing-of-table-cell-children.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/html-to-css-mapping-1.html": [
+ [
+ "/css/css-tables-3/html-to-css-mapping-1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/html-to-css-mapping-2.html": [
+ [
+ "/css/css-tables-3/html-to-css-mapping-2.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/html5-table-formatting-1.html": [
+ [
+ "/css/css-tables-3/html5-table-formatting-1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/html5-table-formatting-2.html": [
+ [
+ "/css/css-tables-3/html5-table-formatting-2.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/html5-table-formatting-3.html": [
+ [
+ "/css/css-tables-3/html5-table-formatting-3.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/html5-table-formatting-fixed-layout-1.html": [
+ [
+ "/css/css-tables-3/html5-table-formatting-fixed-layout-1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/table-model-fixup-2.html": [
+ [
+ "/css/css-tables-3/table-model-fixup-2.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/table-model-fixup.html": [
+ [
+ "/css/css-tables-3/table-model-fixup.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-col-001.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-col-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-col-002.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-col-002.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-col-003.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-col-003.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-col-004-dynamic.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-col-004-dynamic.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-col-005.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-col-005.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-colspan-001.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-colspan-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-colspan-002.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-colspan-002.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-colspan-crash.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-colspan-crash.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-non-rowcol-001.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-non-rowcol-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-row-001.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-row-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-row-002-dynamic.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-row-002-dynamic.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-row-003-dynamic.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-row-003-dynamic.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-row-group-001.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-row-group-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-row-group-002.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-row-group-002.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowcol-001.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-rowcol-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowcol-002.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-rowcol-002.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-001.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-rowspan-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-002-border-separate.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-rowspan-002-border-separate.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-002.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-rowspan-002.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-003-border-separate.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-rowspan-003-border-separate.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-003.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-rowspan-003.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-004-dynamic.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-rowspan-004-dynamic.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-crash.html": [
+ [
+ "/css/css-tables-3/visibility-collapse-rowspan-crash.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-hidden-col-001.html": [
+ [
+ "/css/css-tables-3/visibility-hidden-col-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-hidden-nested-001.html": [
+ [
+ "/css/css-tables-3/visibility-hidden-nested-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-hidden-nested-002.html": [
+ [
+ "/css/css-tables-3/visibility-hidden-nested-002.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-hidden-row-001.html": [
+ [
+ "/css/css-tables-3/visibility-hidden-row-001.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/visibility-hidden-row-002.html": [
+ [
+ "/css/css-tables-3/visibility-hidden-row-002.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/width-distribution/computing-column-measure-0.html": [
+ [
+ "/css/css-tables-3/width-distribution/computing-column-measure-0.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/width-distribution/computing-column-measure-1.html": [
+ [
+ "/css/css-tables-3/width-distribution/computing-column-measure-1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/width-distribution/computing-table-width-0.html": [
+ [
+ "/css/css-tables-3/width-distribution/computing-table-width-0.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/width-distribution/computing-table-width-1.html": [
+ [
+ "/css/css-tables-3/width-distribution/computing-table-width-1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-1.html": [
+ [
+ "/css/css-tables-3/width-distribution/distribution-algo-1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-2.html": [
+ [
+ "/css/css-tables-3/width-distribution/distribution-algo-2.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-min-content-guess.html": [
+ [
+ "/css/css-tables-3/width-distribution/distribution-algo-min-content-guess.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-min-content-percent-guess.html": [
+ [
+ "/css/css-tables-3/width-distribution/distribution-algo-min-content-percent-guess.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.1.html": [
+ [
+ "/css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.1.html",
+ {}
+ ]
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.html": [
+ [
+ "/css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.html",
+ {}
+ ]
+ ],
"css/css-text-3/i18n/css3-text-line-break-baspglwj-001.html": [
[
"/css/css-text-3/i18n/css3-text-line-break-baspglwj-001.html",
@@ -330046,6 +333479,24 @@
{}
]
],
+ "css/css-transforms-2/animation/rotate-interpolation.html": [
+ [
+ "/css/css-transforms-2/animation/rotate-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-transforms-2/animation/scale-interpolation.html": [
+ [
+ "/css/css-transforms-2/animation/scale-interpolation.html",
+ {}
+ ]
+ ],
+ "css/css-transforms-2/animation/translate-interpolation.html": [
+ [
+ "/css/css-transforms-2/animation/translate-interpolation.html",
+ {}
+ ]
+ ],
"css/css-transforms-2/parsing/rotate-parsing-invalid.html": [
[
"/css/css-transforms-2/parsing/rotate-parsing-invalid.html",
@@ -330082,6 +333533,12 @@
{}
]
],
+ "css/css-transforms-2/transforms-support-calc.html": [
+ [
+ "/css/css-transforms-2/transforms-support-calc.html",
+ {}
+ ]
+ ],
"css/css-transitions-1/before-DOMContentLoaded-001.html": [
[
"/css/css-transitions-1/before-DOMContentLoaded-001.html",
@@ -330316,12 +333773,30 @@
{}
]
],
+ "css/css-ui-3/text-overflow-023.html": [
+ [
+ "/css/css-ui-3/text-overflow-023.html",
+ {}
+ ]
+ ],
+ "css/css-values-3/absolute-length-units-001.html": [
+ [
+ "/css/css-values-3/absolute-length-units-001.html",
+ {}
+ ]
+ ],
"css/css-values-3/calc-unit-analysis.html": [
[
"/css/css-values-3/calc-unit-analysis.html",
{}
]
],
+ "css/css-values-3/unset-value-storage.html": [
+ [
+ "/css/css-values-3/unset-value-storage.html",
+ {}
+ ]
+ ],
"css/css-values-3/viewport-relative-lengths-scaled-viewport.html": [
[
"/css/css-values-3/viewport-relative-lengths-scaled-viewport.html",
@@ -330904,6 +334379,24 @@
{}
]
],
+ "css/css-writing-modes-3/wm-propagation-body-computed-root.html": [
+ [
+ "/css/css-writing-modes-3/wm-propagation-body-computed-root.html",
+ {}
+ ]
+ ],
+ "css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-lr.html": [
+ [
+ "/css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-lr.html",
+ {}
+ ]
+ ],
+ "css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-rl.html": [
+ [
+ "/css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-rl.html",
+ {}
+ ]
+ ],
"css/css-writing-modes-3/writing-mode-parsing-001.html": [
[
"/css/css-writing-modes-3/writing-mode-parsing-001.html",
@@ -331204,6 +334697,12 @@
{}
]
],
+ "css/geometry-1/DOMMatrix-attributes.html": [
+ [
+ "/css/geometry-1/DOMMatrix-attributes.html",
+ {}
+ ]
+ ],
"css/geometry-1/DOMMatrix-css-string.worker.js": [
[
"/css/geometry-1/DOMMatrix-css-string.worker.html",
@@ -331222,6 +334721,12 @@
{}
]
],
+ "css/geometry-1/DOMMatrix2DInit-validate-fixup.html": [
+ [
+ "/css/geometry-1/DOMMatrix2DInit-validate-fixup.html",
+ {}
+ ]
+ ],
"css/geometry-1/DOMMatrixInit-validate-fixup.html": [
[
"/css/geometry-1/DOMMatrixInit-validate-fixup.html",
@@ -331258,6 +334763,18 @@
{}
]
],
+ "css/geometry-1/DOMRect-002.html": [
+ [
+ "/css/geometry-1/DOMRect-002.html",
+ {}
+ ]
+ ],
+ "css/geometry-1/DOMRectList.html": [
+ [
+ "/css/geometry-1/DOMRectList.html",
+ {}
+ ]
+ ],
"css/geometry-1/WebKitCSSMatrix.html": [
[
"/css/geometry-1/WebKitCSSMatrix.html",
@@ -331288,6 +334805,12 @@
{}
]
],
+ "css/geometry-1/spec-examples.html": [
+ [
+ "/css/geometry-1/spec-examples.html",
+ {}
+ ]
+ ],
"css/geometry-1/structured-serialization.html": [
[
"/css/geometry-1/structured-serialization.html",
@@ -331300,6 +334823,36 @@
{}
]
],
+ "css/motion-1/animation/offset-anchor-interpolation.html": [
+ [
+ "/css/motion-1/animation/offset-anchor-interpolation.html",
+ {}
+ ]
+ ],
+ "css/motion-1/animation/offset-distance-interpolation.html": [
+ [
+ "/css/motion-1/animation/offset-distance-interpolation.html",
+ {}
+ ]
+ ],
+ "css/motion-1/animation/offset-position-interpolation.html": [
+ [
+ "/css/motion-1/animation/offset-position-interpolation.html",
+ {}
+ ]
+ ],
+ "css/motion-1/animation/offset-rotate-interpolation.html": [
+ [
+ "/css/motion-1/animation/offset-rotate-interpolation.html",
+ {}
+ ]
+ ],
+ "css/motion-1/offset-supports-calc.html": [
+ [
+ "/css/motion-1/offset-supports-calc.html",
+ {}
+ ]
+ ],
"css/motion-1/parsing/offset-anchor-parsing-invalid.html": [
[
"/css/motion-1/parsing/offset-anchor-parsing-invalid.html",
@@ -331396,6 +334949,12 @@
{}
]
],
+ "cssom-view/DOMRectList.html": [
+ [
+ "/cssom-view/DOMRectList.html",
+ {}
+ ]
+ ],
"cssom-view/HTMLBody-ScrollArea_quirksmode.html": [
[
"/cssom-view/HTMLBody-ScrollArea_quirksmode.html",
@@ -331432,6 +334991,12 @@
{}
]
],
+ "cssom-view/cssom-getClientRects-002.html": [
+ [
+ "/cssom-view/cssom-getClientRects-002.html",
+ {}
+ ]
+ ],
"cssom-view/cssom-getClientRects.html": [
[
"/cssom-view/cssom-getClientRects.html",
@@ -331468,6 +335033,18 @@
{}
]
],
+ "cssom-view/elementFromPoint-002.html": [
+ [
+ "/cssom-view/elementFromPoint-002.html",
+ {}
+ ]
+ ],
+ "cssom-view/elementFromPoint-003.html": [
+ [
+ "/cssom-view/elementFromPoint-003.html",
+ {}
+ ]
+ ],
"cssom-view/elementFromPoint.html": [
[
"/cssom-view/elementFromPoint.html",
@@ -331486,6 +335063,42 @@
{}
]
],
+ "cssom-view/elementsFromPoint-iframes.html": [
+ [
+ "/cssom-view/elementsFromPoint-iframes.html",
+ {}
+ ]
+ ],
+ "cssom-view/elementsFromPoint-invalid-cases.html": [
+ [
+ "/cssom-view/elementsFromPoint-invalid-cases.html",
+ {}
+ ]
+ ],
+ "cssom-view/elementsFromPoint-shadowroot.html": [
+ [
+ "/cssom-view/elementsFromPoint-shadowroot.html",
+ {}
+ ]
+ ],
+ "cssom-view/elementsFromPoint-simple.html": [
+ [
+ "/cssom-view/elementsFromPoint-simple.html",
+ {}
+ ]
+ ],
+ "cssom-view/elementsFromPoint-svg.html": [
+ [
+ "/cssom-view/elementsFromPoint-svg.html",
+ {}
+ ]
+ ],
+ "cssom-view/elementsFromPoint-table.html": [
+ [
+ "/cssom-view/elementsFromPoint-table.html",
+ {}
+ ]
+ ],
"cssom-view/elementsFromPoint.html": [
[
"/cssom-view/elementsFromPoint.html",
@@ -331504,6 +335117,12 @@
{}
]
],
+ "cssom-view/interfaces.html": [
+ [
+ "/cssom-view/interfaces.html",
+ {}
+ ]
+ ],
"cssom-view/matchMedia.xht": [
[
"/cssom-view/matchMedia.xht",
@@ -331582,15 +335201,15 @@
{}
]
],
- "cssom-view/ttwf-js-cssomview-getclientrects-length.html": [
+ "cssom-view/scrollintoview.html": [
[
- "/cssom-view/ttwf-js-cssomview-getclientrects-length.html",
+ "/cssom-view/scrollintoview.html",
{}
]
],
- "cssom-view/ttwf-scrollintoview.html": [
+ "cssom-view/ttwf-js-cssomview-getclientrects-length.html": [
[
- "/cssom-view/ttwf-scrollintoview.html",
+ "/cssom-view/ttwf-js-cssomview-getclientrects-length.html",
{}
]
],
@@ -331672,9 +335291,9 @@
{}
]
],
- "cssom/MediaList.xhtml": [
+ "cssom/MediaList2.xhtml": [
[
- "/cssom/MediaList.xhtml",
+ "/cssom/MediaList2.xhtml",
{}
]
],
@@ -331732,6 +335351,12 @@
{}
]
],
+ "cssom/cssom-ruleTypeAndOrder.html": [
+ [
+ "/cssom/cssom-ruleTypeAndOrder.html",
+ {}
+ ]
+ ],
"cssom/cssom-setProperty-shorthand.html": [
[
"/cssom/cssom-setProperty-shorthand.html",
@@ -331780,12 +335405,6 @@
{}
]
],
- "cssom/index-003.html": [
- [
- "/cssom/index-003.html",
- {}
- ]
- ],
"cssom/inline-style-001.html": [
[
"/cssom/inline-style-001.html",
@@ -331990,6 +335609,12 @@
{}
]
],
+ "custom-elements/historical.html": [
+ [
+ "/custom-elements/historical.html",
+ {}
+ ]
+ ],
"custom-elements/htmlconstructor/newtarget.html": [
[
"/custom-elements/htmlconstructor/newtarget.html",
@@ -332218,6 +335843,16 @@
{}
]
],
+ "dom/abort/event.any.js": [
+ [
+ "/dom/abort/event.any.html",
+ {}
+ ],
+ [
+ "/dom/abort/event.any.worker.html",
+ {}
+ ]
+ ],
"dom/collections/HTMLCollection-as-proto-length-get-throws.html": [
[
"/dom/collections/HTMLCollection-as-proto-length-get-throws.html",
@@ -332428,6 +336063,18 @@
{}
]
],
+ "dom/events/Event-timestamp-high-resolution.html": [
+ [
+ "/dom/events/Event-timestamp-high-resolution.html",
+ {}
+ ]
+ ],
+ "dom/events/Event-timestamp-safe-resolution.html": [
+ [
+ "/dom/events/Event-timestamp-safe-resolution.html",
+ {}
+ ]
+ ],
"dom/events/Event-type-empty.html": [
[
"/dom/events/Event-type-empty.html",
@@ -332476,6 +336123,16 @@
{}
]
],
+ "dom/events/EventTarget-constructible.any.js": [
+ [
+ "/dom/events/EventTarget-constructible.any.html",
+ {}
+ ],
+ [
+ "/dom/events/EventTarget-constructible.any.worker.html",
+ {}
+ ]
+ ],
"dom/events/EventTarget-dispatchEvent-returnvalue.html": [
[
"/dom/events/EventTarget-dispatchEvent-returnvalue.html",
@@ -332694,12 +336351,6 @@
{}
]
],
- "dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html": [
- [
- "/dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html",
- {}
- ]
- ],
"dom/nodes/Document-contentType/contentType/contenttype_datauri_02.html": [
[
"/dom/nodes/Document-contentType/contentType/contenttype_datauri_02.html",
@@ -334076,6 +337727,12 @@
{}
]
],
+ "domparsing/innerhtml-mxss.sub.html": [
+ [
+ "/domparsing/innerhtml-mxss.sub.html",
+ {}
+ ]
+ ],
"domparsing/insert-adjacent.html": [
[
"/domparsing/insert-adjacent.html",
@@ -334136,9 +337793,9 @@
{}
]
],
- "domxpath/interfaces.html": [
+ "domxpath/interfaces.tentative.html": [
[
- "/domxpath/interfaces.html",
+ "/domxpath/interfaces.tentative.html",
{}
]
],
@@ -334244,6 +337901,12 @@
{}
]
],
+ "editing/run/insert-list-items-in-table-cell.html": [
+ [
+ "/editing/run/insert-list-items-in-table-cell.html",
+ {}
+ ]
+ ],
"editing/run/inserthorizontalrule.html": [
[
"/editing/run/inserthorizontalrule.html",
@@ -335034,6 +338697,12 @@
}
]
],
+ "encoding/replacement-encodings.html": [
+ [
+ "/encoding/replacement-encodings.html",
+ {}
+ ]
+ ],
"encoding/single-byte-decoder.html": [
[
"/encoding/single-byte-decoder.html",
@@ -335112,6 +338781,18 @@
{}
]
],
+ "encoding/unsupported-encodings.html": [
+ [
+ "/encoding/unsupported-encodings.html",
+ {}
+ ]
+ ],
+ "encoding/utf-32.html": [
+ [
+ "/encoding/utf-32.html",
+ {}
+ ]
+ ],
"encrypted-media/clearkey-check-initdata-type.html": [
[
"/encrypted-media/clearkey-check-initdata-type.html",
@@ -335770,12 +339451,24 @@
}
]
],
+ "encrypted-media/encrypted-media-default-feature-policy.https.sub.html": [
+ [
+ "/encrypted-media/encrypted-media-default-feature-policy.https.sub.html",
+ {}
+ ]
+ ],
"encrypted-media/idlharness.html": [
[
"/encrypted-media/idlharness.html",
{}
]
],
+ "entries-api/interfaces.html": [
+ [
+ "/entries-api/interfaces.html",
+ {}
+ ]
+ ],
"eventsource/dedicated-worker/eventsource-close.htm": [
[
"/eventsource/dedicated-worker/eventsource-close.htm",
@@ -335978,6 +339671,12 @@
{}
]
],
+ "eventsource/format-field-id-null.htm": [
+ [
+ "/eventsource/format-field-id-null.htm",
+ {}
+ ]
+ ],
"eventsource/format-field-id.htm": [
[
"/eventsource/format-field-id.htm",
@@ -336148,6 +339847,70 @@
{}
]
],
+ "feature-policy/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html": [
+ [
+ "/feature-policy/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html",
+ {}
+ ]
+ ],
+ "feature-policy/payment-allowed-by-feature-policy-attribute.https.sub.html": [
+ [
+ "/feature-policy/payment-allowed-by-feature-policy-attribute.https.sub.html",
+ {}
+ ]
+ ],
+ "feature-policy/payment-allowed-by-feature-policy.https.sub.html": [
+ [
+ "/feature-policy/payment-allowed-by-feature-policy.https.sub.html",
+ {}
+ ]
+ ],
+ "feature-policy/payment-default-feature-policy.https.sub.html": [
+ [
+ "/feature-policy/payment-default-feature-policy.https.sub.html",
+ {}
+ ]
+ ],
+ "feature-policy/payment-disabled-by-feature-policy.https.sub.html": [
+ [
+ "/feature-policy/payment-disabled-by-feature-policy.https.sub.html",
+ {}
+ ]
+ ],
+ "fetch/api/abort/cache.https.html": [
+ [
+ "/fetch/api/abort/cache.https.html",
+ {}
+ ]
+ ],
+ "fetch/api/abort/general-serviceworker.https.html": [
+ [
+ "/fetch/api/abort/general-serviceworker.https.html",
+ {}
+ ]
+ ],
+ "fetch/api/abort/general-sharedworker.html": [
+ [
+ "/fetch/api/abort/general-sharedworker.html",
+ {}
+ ]
+ ],
+ "fetch/api/abort/general.any.js": [
+ [
+ "/fetch/api/abort/general.any.html",
+ {}
+ ],
+ [
+ "/fetch/api/abort/general.any.worker.html",
+ {}
+ ]
+ ],
+ "fetch/api/abort/serviceworker-intercepted.https.html": [
+ [
+ "/fetch/api/abort/serviceworker-intercepted.https.html",
+ {}
+ ]
+ ],
"fetch/api/basic/accept-header.any.js": [
[
"/fetch/api/basic/accept-header.any.html",
@@ -336430,6 +340193,16 @@
{}
]
],
+ "fetch/api/cors/cors-preflight-cache.any.js": [
+ [
+ "/fetch/api/cors/cors-preflight-cache.any.html",
+ {}
+ ],
+ [
+ "/fetch/api/cors/cors-preflight-cache.any.worker.html",
+ {}
+ ]
+ ],
"fetch/api/cors/cors-preflight-redirect.any.js": [
[
"/fetch/api/cors/cors-preflight-redirect.any.html",
@@ -336910,6 +340683,18 @@
{}
]
],
+ "fetch/api/request/request-type-attribute-historical.html": [
+ [
+ "/fetch/api/request/request-type-attribute-historical.html",
+ {}
+ ]
+ ],
+ "fetch/api/request/url-encoding.html": [
+ [
+ "/fetch/api/request/url-encoding.html",
+ {}
+ ]
+ ],
"fetch/api/response/multi-globals/url-parsing.html": [
[
"/fetch/api/response/multi-globals/url-parsing.html",
@@ -337012,6 +340797,12 @@
{}
]
],
+ "fetch/api/response/response-stream-disturbed-6.html": [
+ [
+ "/fetch/api/response/response-stream-disturbed-6.html",
+ {}
+ ]
+ ],
"fetch/api/response/response-trailer.html": [
[
"/fetch/api/response/response-trailer.html",
@@ -337110,6 +340901,12 @@
{}
]
],
+ "fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html": [
+ [
+ "/fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html",
+ {}
+ ]
+ ],
"fetch/security/dangling-markup-mitigation.tentative.html": [
[
"/fetch/security/dangling-markup-mitigation.tentative.html",
@@ -337134,6 +340931,12 @@
{}
]
],
+ "fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html": [
+ [
+ "/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html",
+ {}
+ ]
+ ],
"fullscreen/api/document-fullscreen-enabled.html": [
[
"/fullscreen/api/document-fullscreen-enabled.html",
@@ -337176,9 +340979,9 @@
{}
]
],
- "generic-sensor/idlharness.html": [
+ "generic-sensor/idlharness.https.html": [
[
- "/generic-sensor/idlharness.html",
+ "/generic-sensor/idlharness.https.html",
{}
]
],
@@ -337286,9 +341089,21 @@
{}
]
],
- "hr-time/window-worker-time-origin.html": [
+ "hr-time/timeOrigin.html": [
+ [
+ "/hr-time/timeOrigin.html",
+ {}
+ ]
+ ],
+ "hr-time/timing-attack.html": [
[
- "/hr-time/window-worker-time-origin.html",
+ "/hr-time/timing-attack.html",
+ {}
+ ]
+ ],
+ "hr-time/window-worker-timeOrigin.window.js": [
+ [
+ "/hr-time/window-worker-timeOrigin.window.html",
{}
]
],
@@ -337434,6 +341249,42 @@
{}
]
],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html": [
+ [
+ "/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html",
+ {}
+ ]
+ ],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html": [
+ [
+ "/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html",
+ {}
+ ]
+ ],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html": [
+ [
+ "/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html",
+ {}
+ ]
+ ],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html": [
+ [
+ "/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html",
+ {}
+ ]
+ ],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html": [
+ [
+ "/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html",
+ {}
+ ]
+ ],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html": [
+ [
+ "/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html",
+ {}
+ ]
+ ],
"html/browsers/browsing-the-web/navigating-across-documents/001.html": [
[
"/html/browsers/browsing-the-web/navigating-across-documents/001.html",
@@ -337670,6 +341521,18 @@
}
]
],
+ "html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html": [
+ [
+ "/html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html",
+ {}
+ ]
+ ],
+ "html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html": [
+ [
+ "/html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html",
+ {}
+ ]
+ ],
"html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html": [
[
"/html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html",
@@ -338004,6 +341867,12 @@
{}
]
],
+ "html/browsers/history/the-history-interface/history_properties_only_fully_active.html": [
+ [
+ "/html/browsers/history/the-history-interface/history_properties_only_fully_active.html",
+ {}
+ ]
+ ],
"html/browsers/history/the-history-interface/history_pushstate.html": [
[
"/html/browsers/history/the-history-interface/history_pushstate.html",
@@ -338364,6 +342233,12 @@
{}
]
],
+ "html/browsers/offline/appcache/workers/appcache-worker.html": [
+ [
+ "/html/browsers/offline/appcache/workers/appcache-worker.html",
+ {}
+ ]
+ ],
"html/browsers/offline/application-cache-api/api_status_idle.html": [
[
"/html/browsers/offline/application-cache-api/api_status_idle.html",
@@ -340096,6 +343971,12 @@
{}
]
],
+ "html/dom/historical.html": [
+ [
+ "/html/dom/historical.html",
+ {}
+ ]
+ ],
"html/dom/interfaces.html": [
[
"/html/dom/interfaces.html",
@@ -340312,6 +344193,12 @@
{}
]
],
+ "html/editing/focus/tabindex-focus-flag.html": [
+ [
+ "/html/editing/focus/tabindex-focus-flag.html",
+ {}
+ ]
+ ],
"html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.html": [
[
"/html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.html",
@@ -340470,6 +344357,12 @@
{}
]
],
+ "html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html": [
+ [
+ "/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html",
+ {}
+ ]
+ ],
"html/infrastructure/terminology/plugins/text-plain.html": [
[
"/html/infrastructure/terminology/plugins/text-plain.html",
@@ -340852,12 +344745,6 @@
{}
]
],
- "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html": [
- [
- "/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html",
- {}
- ]
- ],
"html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html": [
[
"/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html",
@@ -340867,6 +344754,14 @@
"html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html": [
[
"/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html": [
+ [
+ "/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html",
{}
]
],
@@ -340906,6 +344801,30 @@
{}
]
],
+ "html/semantics/document-metadata/the-style-element/style_media_change.html": [
+ [
+ "/html/semantics/document-metadata/the-style-element/style_media_change.html",
+ {}
+ ]
+ ],
+ "html/semantics/document-metadata/the-style-element/style_non_matching_media.html": [
+ [
+ "/html/semantics/document-metadata/the-style-element/style_non_matching_media.html",
+ {}
+ ]
+ ],
+ "html/semantics/document-metadata/the-style-element/style_type.html": [
+ [
+ "/html/semantics/document-metadata/the-style-element/style_type.html",
+ {}
+ ]
+ ],
+ "html/semantics/document-metadata/the-style-element/style_type_change.html": [
+ [
+ "/html/semantics/document-metadata/the-style-element/style_type_change.html",
+ {}
+ ]
+ ],
"html/semantics/document-metadata/the-title-element/title.text-01.html": [
[
"/html/semantics/document-metadata/the-title-element/title.text-01.html",
@@ -342036,6 +345955,18 @@
{}
]
],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-order.html": [
+ [
+ "/html/semantics/embedded-content/media-elements/track/track-element/track-cue-order.html",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-data-url.html": [
+ [
+ "/html/semantics/embedded-content/media-elements/track/track-element/track-data-url.html",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/media-elements/user-interface/muted.html": [
[
"/html/semantics/embedded-content/media-elements/user-interface/muted.html",
@@ -342920,12 +346851,54 @@
{}
]
],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation_by_user_activation_without_user_gesture.html": [
[
"/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation_by_user_activation_without_user_gesture.html",
{}
]
],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html": [
[
"/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html",
@@ -342992,12 +346965,152 @@
{}
]
],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_001.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_001.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_002.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_002.htm",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_005.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_005.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_011.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_011.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_012.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_012.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_013.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_013.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_014.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_014.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_015.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_015.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_016.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_016.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_017.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_017.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_018.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_018.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_019.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_019.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_023.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_023.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_024.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_024.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_025.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_025.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_026.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_026.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_027.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_027.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_028.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_028.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_029.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_029.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_030.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_030.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_031.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_031.htm",
+ {}
+ ]
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_032.htm": [
+ [
+ "/html/semantics/embedded-content/the-iframe-element/sandbox_032.htm",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-img-element/Image-constructor.html": [
[
"/html/semantics/embedded-content/the-img-element/Image-constructor.html",
{}
]
],
+ "html/semantics/embedded-content/the-img-element/adoption.html": [
+ [
+ "/html/semantics/embedded-content/the-img-element/adoption.html",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-img-element/current-pixel-density/basic.html": [
[
"/html/semantics/embedded-content/the-img-element/current-pixel-density/basic.html",
@@ -343016,6 +347129,60 @@
{}
]
],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html": [
+ [
+ "/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html": [
+ [
+ "/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html": [
+ [
+ "/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html": [
+ [
+ "/html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html": [
+ [
+ "/html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode.html": [
+ [
+ "/html/semantics/embedded-content/the-img-element/decode/image-decode.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "html/semantics/embedded-content/the-img-element/delay-load-event-detached.html": [
+ [
+ "/html/semantics/embedded-content/the-img-element/delay-load-event-detached.html",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-img-element/delay-load-event.html": [
[
"/html/semantics/embedded-content/the-img-element/delay-load-event.html",
@@ -343040,6 +347207,12 @@
{}
]
],
+ "html/semantics/embedded-content/the-img-element/non-active-document.html": [
+ [
+ "/html/semantics/embedded-content/the-img-element/non-active-document.html",
+ {}
+ ]
+ ],
"html/semantics/embedded-content/the-img-element/nonexistent-image.html": [
[
"/html/semantics/embedded-content/the-img-element/nonexistent-image.html",
@@ -343282,6 +347455,12 @@
{}
]
],
+ "html/semantics/forms/form-control-infrastructure/association.window.js": [
+ [
+ "/html/semantics/forms/form-control-infrastructure/association.window.html",
+ {}
+ ]
+ ],
"html/semantics/forms/form-control-infrastructure/form.html": [
[
"/html/semantics/forms/form-control-infrastructure/form.html",
@@ -343306,6 +347485,12 @@
{}
]
],
+ "html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html": [
+ [
+ "/html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html",
+ {}
+ ]
+ ],
"html/semantics/forms/form-submission-0/form-data-set-usv.html": [
[
"/html/semantics/forms/form-submission-0/form-data-set-usv.html",
@@ -343318,6 +347503,12 @@
{}
]
],
+ "html/semantics/forms/form-submission-0/submission-checks.window.js": [
+ [
+ "/html/semantics/forms/form-submission-0/submission-checks.window.html",
+ {}
+ ]
+ ],
"html/semantics/forms/form-submission-0/submit-entity-body.html": [
[
"/html/semantics/forms/form-submission-0/submit-entity-body.html",
@@ -343426,6 +347617,12 @@
{}
]
],
+ "html/semantics/forms/the-button-element/button-checkvalidity.html": [
+ [
+ "/html/semantics/forms/the-button-element/button-checkvalidity.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-button-element/button-click-submits.html": [
[
"/html/semantics/forms/the-button-element/button-click-submits.html",
@@ -343438,12 +347635,24 @@
{}
]
],
+ "html/semantics/forms/the-button-element/button-labels.html": [
+ [
+ "/html/semantics/forms/the-button-element/button-labels.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-button-element/button-menu-historical.html": [
[
"/html/semantics/forms/the-button-element/button-menu-historical.html",
{}
]
],
+ "html/semantics/forms/the-button-element/button-setcustomvalidity.html": [
+ [
+ "/html/semantics/forms/the-button-element/button-setcustomvalidity.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-button-element/button-type.html": [
[
"/html/semantics/forms/the-button-element/button-type.html",
@@ -343456,6 +347665,24 @@
{}
]
],
+ "html/semantics/forms/the-button-element/button-validationmessage.html": [
+ [
+ "/html/semantics/forms/the-button-element/button-validationmessage.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-button-element/button-validity.html": [
+ [
+ "/html/semantics/forms/the-button-element/button-validity.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-button-element/button-willvalidate.html": [
+ [
+ "/html/semantics/forms/the-button-element/button-willvalidate.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-datalist-element/datalistoptions.html": [
[
"/html/semantics/forms/the-datalist-element/datalistoptions.html",
@@ -343480,6 +347707,36 @@
{}
]
],
+ "html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html": [
+ [
+ "/html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html": [
+ [
+ "/html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html": [
+ [
+ "/html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-fieldset-element/fieldset-validity.html": [
+ [
+ "/html/semantics/forms/the-fieldset-element/fieldset-validity.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html": [
+ [
+ "/html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-form-element/form-action-reflection-with-base-url.html": [
[
"/html/semantics/forms/the-form-element/form-action-reflection-with-base-url.html",
@@ -343504,12 +347761,24 @@
{}
]
],
+ "html/semantics/forms/the-form-element/form-action.html": [
+ [
+ "/html/semantics/forms/the-form-element/form-action.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-form-element/form-autocomplete.html": [
[
"/html/semantics/forms/the-form-element/form-autocomplete.html",
{}
]
],
+ "html/semantics/forms/the-form-element/form-checkvalidity.html": [
+ [
+ "/html/semantics/forms/the-form-element/form-checkvalidity.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-form-element/form-elements-filter.html": [
[
"/html/semantics/forms/the-form-element/form-elements-filter.html",
@@ -343552,6 +347821,12 @@
{}
]
],
+ "html/semantics/forms/the-form-element/form-length.html": [
+ [
+ "/html/semantics/forms/the-form-element/form-length.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-form-element/form-nameditem.html": [
[
"/html/semantics/forms/the-form-element/form-nameditem.html",
@@ -343636,6 +347911,42 @@
{}
]
],
+ "html/semantics/forms/the-input-element/input-checkvalidity.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-checkvalidity.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-height.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-height.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-labels.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-labels.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-setcustomvalidity.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-setcustomvalidity.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-stepdown.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-stepdown.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-stepup.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-stepup.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-input-element/input-type-button.html": [
[
"/html/semantics/forms/the-input-element/input-type-button.html",
@@ -343648,6 +347959,48 @@
{}
]
],
+ "html/semantics/forms/the-input-element/input-validationmessage.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-validationmessage.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-validity.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-validity.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-value-invalidstateerr.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-value-invalidstateerr.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-width.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-width.html",
+ {}
+ ]
+ ],
+ "html/semantics/forms/the-input-element/input-willvalidate.html": [
+ [
+ "/html/semantics/forms/the-input-element/input-willvalidate.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-input-element/maxlength.html": [
[
"/html/semantics/forms/the-input-element/maxlength.html",
@@ -343894,6 +348247,12 @@
{}
]
],
+ "html/semantics/forms/the-progress-element/progress.window.js": [
+ [
+ "/html/semantics/forms/the-progress-element/progress.window.html",
+ {}
+ ]
+ ],
"html/semantics/forms/the-select-element/common-HTMLOptionsCollection-add.html": [
[
"/html/semantics/forms/the-select-element/common-HTMLOptionsCollection-add.html",
@@ -343972,6 +348331,12 @@
{}
]
],
+ "html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml": [
+ [
+ "/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml",
+ {}
+ ]
+ ],
"html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html": [
[
"/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html",
@@ -344086,6 +348451,18 @@
{}
]
],
+ "html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html": [
+ [
+ "/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html",
+ {}
+ ]
+ ],
+ "html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html": [
+ [
+ "/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html",
+ {}
+ ]
+ ],
"html/semantics/interactive-elements/the-dialog-element/dialog-close.html": [
[
"/html/semantics/interactive-elements/the-dialog-element/dialog-close.html",
@@ -344116,6 +348493,18 @@
{}
]
],
+ "html/semantics/links/following-hyperlinks/activation-behavior.window.js": [
+ [
+ "/html/semantics/links/following-hyperlinks/activation-behavior.window.html",
+ {}
+ ]
+ ],
+ "html/semantics/links/following-hyperlinks/active-document.window.js": [
+ [
+ "/html/semantics/links/following-hyperlinks/active-document.window.html",
+ {}
+ ]
+ ],
"html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_attribute-getter-setter.html": [
[
"/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_attribute-getter-setter.html",
@@ -344206,6 +348595,894 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/execution-timing/001.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/001.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/002.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/002.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/003.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/003.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/004.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/004.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/005.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/005.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/006.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/006.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/007.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/007.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/008.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/008.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/009.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/009.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/010.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/010.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/011.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/011.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/012.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/012.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/013.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/013.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/014.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/014.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/015.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/015.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/015a.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/015a.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/016.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/016.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/017.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/017.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/018.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/018.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/019.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/019.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/020.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/020.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/021.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/021.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/022.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/022.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/023.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/023.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/024.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/024.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/025.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/025.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/026.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/026.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/027.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/027.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/028.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/028.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/029.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/029.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/030.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/030.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/031.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/031.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/032.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/032.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/033.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/033.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/034.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/034.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/035.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/035.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/036.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/036.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/037.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/037.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/038.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/038.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/039.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/039.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/040.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/040.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/041.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/041.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/042.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/042.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/043.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/043.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/044.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/044.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/045.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/045.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/046.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/046.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/047.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/047.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/048.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/048.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/049.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/049.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/050.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/050.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/051.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/051.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/052.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/052.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/053.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/053.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/054.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/054.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/055.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/055.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/056.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/056.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/057.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/057.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/058.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/058.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/059.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/059.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/060.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/060.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/061.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/061.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/062.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/062.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/063.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/063.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/064.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/064.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/065.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/065.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/066.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/066.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/067.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/067.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/068.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/068.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/069.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/069.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/070.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/070.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/071.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/071.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/072.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/072.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/073.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/073.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/074.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/074.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/075.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/075.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/076.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/076.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/077.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/077.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/078.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/078.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/079.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/079.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/080.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/080.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/081.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/081.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/082.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/082.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/083.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/083.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/084.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/084.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/085.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/085.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/086.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/086.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/087.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/087.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/088.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/088.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/089.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/089.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/090.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/090.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/091.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/091.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/092.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/092.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/094.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/094.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/095.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/095.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/096.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/096.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/097.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/097.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/099.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/099.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/101.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/101.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/103.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/103.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/104.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/104.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/105.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/105.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/106-import.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/106-import.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/106-noimport.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/106-noimport.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/107-import.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/107-import.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/107-noimport.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/107-noimport.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/108.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/108.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/109.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/109.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/110.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/110.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/111.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/111.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/112.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/112.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/113.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/113.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/114.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/114.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/115.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/115.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/116.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/116.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/117.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/117.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/118.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/118.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/119.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/119.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/120.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/120.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/121.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/121.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/122.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/122.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/123.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/123.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/124.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/124.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/125.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/125.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/126.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/126.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/127.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/127.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/128.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/128.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/129.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/129.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/130.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/130.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/131.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/131.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/132.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/132.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/133.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/133.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/134.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/134.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/135.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/135.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/136.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/136.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/137.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/137.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/138.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/138.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/139.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/139.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/140.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/140.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/141.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/141.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/142.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/142.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/143.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/143.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/144.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/144.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/145.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/145.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/146.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/146.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/147.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/147.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/148.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/148.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/149.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/execution-timing/149.html",
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/fetch-src/alpha/base.html": [
[
"/html/semantics/scripting-1/the-script-element/fetch-src/alpha/base.html",
@@ -344236,9 +349513,39 @@
{}
]
],
- "html/semantics/scripting-1/the-script-element/load-event.html": [
+ "html/semantics/scripting-1/the-script-element/load-error-events-1.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/load-error-events-1.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/load-error-events-2.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/load-error-events-2.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/load-error-events-3.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/load-error-events-3.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/charset-01.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/charset-01.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/charset-02.html": [
[
- "/html/semantics/scripting-1/the-script-element/load-event.html",
+ "/html/semantics/scripting-1/the-script-element/module/charset-02.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/charset-03.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/charset-03.html",
{}
]
],
@@ -344254,6 +349561,12 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/module/credentials.sub.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/credentials.sub.html",
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/module/crossorigin.html": [
[
"/html/semantics/scripting-1/the-script-element/module/crossorigin.html",
@@ -344266,6 +349579,78 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/module/custom-element-exception.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html",
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html": [
[
"/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html",
@@ -344352,6 +349737,42 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/integrity.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/integrity.html",
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/module/late-namespace-request.html": [
[
"/html/semantics/scripting-1/the-script-element/module/late-namespace-request.html",
@@ -344364,6 +349785,24 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/load-error-events.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/load-error-events.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml": [
+ [
+ "/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml",
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html": [
[
"/html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html",
@@ -344490,24 +349929,6 @@
{}
]
],
- "html/semantics/scripting-1/the-script-element/script-language-type.html": [
- [
- "/html/semantics/scripting-1/the-script-element/script-language-type.html",
- {}
- ]
- ],
- "html/semantics/scripting-1/the-script-element/script-languages-01.html": [
- [
- "/html/semantics/scripting-1/the-script-element/script-languages-01.html",
- {}
- ]
- ],
- "html/semantics/scripting-1/the-script-element/script-languages-02.html": [
- [
- "/html/semantics/scripting-1/the-script-element/script-languages-02.html",
- {}
- ]
- ],
"html/semantics/scripting-1/the-script-element/script-noembed-noframes-iframe.xhtml": [
[
"/html/semantics/scripting-1/the-script-element/script-noembed-noframes-iframe.xhtml",
@@ -344562,6 +349983,24 @@
{}
]
],
+ "html/semantics/scripting-1/the-script-element/script-type-and-language-empty.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/script-type-and-language-empty.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/script-type-and-language-js.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/script-type-and-language-js.html",
+ {}
+ ]
+ ],
+ "html/semantics/scripting-1/the-script-element/script-type-and-language-with-params.html": [
+ [
+ "/html/semantics/scripting-1/the-script-element/script-type-and-language-with-params.html",
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-script-element/scripting-enabled.html": [
[
"/html/semantics/scripting-1/the-script-element/scripting-enabled.html",
@@ -344652,6 +350091,12 @@
{}
]
],
+ "html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html": [
+ [
+ "/html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html",
+ {}
+ ]
+ ],
"html/semantics/scripting-1/the-template-element/template-element/template-content-node-document.html": [
[
"/html/semantics/scripting-1/the-template-element/template-element/template-content-node-document.html",
@@ -344682,6 +350127,12 @@
{}
]
],
+ "html/semantics/selectors/pseudo-classes/checked-type-change.html": [
+ [
+ "/html/semantics/selectors/pseudo-classes/checked-type-change.html",
+ {}
+ ]
+ ],
"html/semantics/selectors/pseudo-classes/checked.html": [
[
"/html/semantics/selectors/pseudo-classes/checked.html",
@@ -344736,12 +350187,24 @@
{}
]
],
+ "html/semantics/selectors/pseudo-classes/indeterminate-type-change.html": [
+ [
+ "/html/semantics/selectors/pseudo-classes/indeterminate-type-change.html",
+ {}
+ ]
+ ],
"html/semantics/selectors/pseudo-classes/indeterminate.html": [
[
"/html/semantics/selectors/pseudo-classes/indeterminate.html",
{}
]
],
+ "html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html": [
+ [
+ "/html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html",
+ {}
+ ]
+ ],
"html/semantics/selectors/pseudo-classes/inrange-outofrange.html": [
[
"/html/semantics/selectors/pseudo-classes/inrange-outofrange.html",
@@ -344754,12 +350217,30 @@
{}
]
],
+ "html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html": [
+ [
+ "/html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html",
+ {}
+ ]
+ ],
+ "html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html": [
+ [
+ "/html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html",
+ {}
+ ]
+ ],
"html/semantics/selectors/pseudo-classes/readwrite-readonly.html": [
[
"/html/semantics/selectors/pseudo-classes/readwrite-readonly.html",
{}
]
],
+ "html/semantics/selectors/pseudo-classes/required-optional-hidden.html": [
+ [
+ "/html/semantics/selectors/pseudo-classes/required-optional-hidden.html",
+ {}
+ ]
+ ],
"html/semantics/selectors/pseudo-classes/required-optional.html": [
[
"/html/semantics/selectors/pseudo-classes/required-optional.html",
@@ -344793,7 +350274,9 @@
"html/semantics/tabular-data/processing-model-1/span-limits.html": [
[
"/html/semantics/tabular-data/processing-model-1/span-limits.html",
- {}
+ {
+ "timeout": "long"
+ }
]
],
"html/semantics/tabular-data/the-caption-element/caption_001.html": [
@@ -344940,6 +350423,12 @@
{}
]
],
+ "html/semantics/text-level-semantics/the-a-element/a-download-click-404.html": [
+ [
+ "/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html",
+ {}
+ ]
+ ],
"html/semantics/text-level-semantics/the-a-element/a-download-click.html": [
[
"/html/semantics/text-level-semantics/the-a-element/a-download-click.html",
@@ -346444,78 +351933,6 @@
{}
]
],
- "html/webappapis/idle-callbacks/basic.html": [
- [
- "/html/webappapis/idle-callbacks/basic.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/callback-exception.html": [
- [
- "/html/webappapis/idle-callbacks/callback-exception.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/callback-idle-periods.html": [
- [
- "/html/webappapis/idle-callbacks/callback-idle-periods.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/callback-iframe.html": [
- [
- "/html/webappapis/idle-callbacks/callback-iframe.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/callback-invoked.html": [
- [
- "/html/webappapis/idle-callbacks/callback-invoked.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/callback-multiple-calls.html": [
- [
- "/html/webappapis/idle-callbacks/callback-multiple-calls.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/callback-removed-frame.html": [
- [
- "/html/webappapis/idle-callbacks/callback-removed-frame.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/callback-suspended.html": [
- [
- "/html/webappapis/idle-callbacks/callback-suspended.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/callback-timeout-with-raf.html": [
- [
- "/html/webappapis/idle-callbacks/callback-timeout-with-raf.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/callback-timeout.html": [
- [
- "/html/webappapis/idle-callbacks/callback-timeout.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/cancel-invoked.html": [
- [
- "/html/webappapis/idle-callbacks/cancel-invoked.html",
- {}
- ]
- ],
- "html/webappapis/idle-callbacks/idlharness.html": [
- [
- "/html/webappapis/idle-callbacks/idlharness.html",
- {}
- ]
- ],
"html/webappapis/scripting/event-loops/microtask_after_raf.html": [
[
"/html/webappapis/scripting/event-loops/microtask_after_raf.html",
@@ -346984,241 +352401,311 @@
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content.html": [
+ "html/webappapis/system-state-and-capabilities/the-navigator-object/historical.window.js": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/content.html",
+ "/html/webappapis/system-state-and-capabilities/the-navigator-object/historical.window.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/001.xhtml": [
+ "html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-indexed.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/content/001.xhtml",
+ "/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-indexed.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/002.xhtml": [
+ "html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/content/002.xhtml",
+ "/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/003.xhtml": [
+ "html/webappapis/system-state-and-capabilities/the-navigator-object/navigator.any.js": [
+ [
+ "/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator.any.html",
+ {}
+ ],
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/content/003.xhtml",
+ "/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator.any.worker.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/004.xhtml": [
+ "html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/content/004.xhtml",
+ "/html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/005.xhtml": [
+ "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/content/005.xhtml",
+ "/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/006.xhtml": [
+ "html/webappapis/the-windoworworkerglobalscope-mixin/Worker_Self_Origin.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/content/006.xhtml",
+ "/html/webappapis/the-windoworworkerglobalscope-mixin/Worker_Self_Origin.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-indexed.html": [
+ "html/webappapis/timers/evil-spec-example.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-indexed.html",
+ "/html/webappapis/timers/evil-spec-example.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html": [
+ "html/webappapis/timers/negative-setinterval.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html",
+ "/html/webappapis/timers/negative-setinterval.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/navigator.any.js": [
+ "html/webappapis/timers/negative-settimeout.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator.any.html",
+ "/html/webappapis/timers/negative-settimeout.html",
+ {}
+ ]
+ ],
+ "html/webappapis/timers/type-long-setinterval.html": [
+ [
+ "/html/webappapis/timers/type-long-setinterval.html",
+ {}
+ ]
+ ],
+ "html/webappapis/timers/type-long-settimeout.html": [
+ [
+ "/html/webappapis/timers/type-long-settimeout.html",
+ {}
+ ]
+ ],
+ "http/content_length.html": [
+ [
+ "/http/content_length.html",
+ {}
+ ]
+ ],
+ "http/refresh/navigate.window.js": [
+ [
+ "/http/refresh/navigate.window.html",
+ {}
+ ]
+ ],
+ "http/refresh/subresource.any.js": [
+ [
+ "/http/refresh/subresource.any.html",
{}
],
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator.any.worker.html",
+ "/http/refresh/subresource.any.worker.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage.html": [
+ "imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/navigatorlanguage.html",
+ "/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol.html": [
+ "imagebitmap-renderingcontext/context-creation-with-alpha.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol.html",
+ "/imagebitmap-renderingcontext/context-creation-with-alpha.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/001.xhtml": [
+ "imagebitmap-renderingcontext/context-creation.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/001.xhtml",
+ "/imagebitmap-renderingcontext/context-creation.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/002.xhtml": [
+ "imagebitmap-renderingcontext/context-preserves-canvas.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/002.xhtml",
+ "/imagebitmap-renderingcontext/context-preserves-canvas.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/003.xhtml": [
+ "imagebitmap-renderingcontext/tranferFromImageBitmap-null.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/003.xhtml",
+ "/imagebitmap-renderingcontext/tranferFromImageBitmap-null.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/004.xhtml": [
+ "imagebitmap-renderingcontext/transferFromImageBitmap-detached.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/004.xhtml",
+ "/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/005.xhtml": [
+ "infrastructure/assumptions/html-elements.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/005.xhtml",
+ "/infrastructure/assumptions/html-elements.html",
{}
]
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/006.xhtml": [
+ "infrastructure/expected-fail/failing-test.html": [
[
- "/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/006.xhtml",
+ "/infrastructure/expected-fail/failing-test.html",
{}
]
],
- "html/webappapis/the-windoworworkerglobalscope-mixin/Worker_Self_Origin.html": [
+ "innerText/getter.html": [
[
- "/html/webappapis/the-windoworworkerglobalscope-mixin/Worker_Self_Origin.html",
+ "/innerText/getter.html",
{}
]
],
- "html/webappapis/timers/evil-spec-example.html": [
+ "innerText/setter.html": [
[
- "/html/webappapis/timers/evil-spec-example.html",
+ "/innerText/setter.html",
{}
]
],
- "html/webappapis/timers/negative-setinterval.html": [
+ "input-events/idlharness.html": [
[
- "/html/webappapis/timers/negative-setinterval.html",
+ "/input-events/idlharness.html",
{}
]
],
- "html/webappapis/timers/negative-settimeout.html": [
+ "input-events/input-events-exec-command.html": [
[
- "/html/webappapis/timers/negative-settimeout.html",
+ "/input-events/input-events-exec-command.html",
{}
]
],
- "html/webappapis/timers/type-long-setinterval.html": [
+ "intersection-observer/bounding-box.html": [
[
- "/html/webappapis/timers/type-long-setinterval.html",
+ "/intersection-observer/bounding-box.html",
{}
]
],
- "html/webappapis/timers/type-long-settimeout.html": [
+ "intersection-observer/client-rect.html": [
[
- "/html/webappapis/timers/type-long-settimeout.html",
+ "/intersection-observer/client-rect.html",
{}
]
],
- "http/content_length.html": [
+ "intersection-observer/containing-block.html": [
[
- "/http/content_length.html",
+ "/intersection-observer/containing-block.html",
{}
]
],
- "image-decodes/image-decode-iframe.html": [
+ "intersection-observer/cross-origin-iframe.html": [
[
- "/image-decodes/image-decode-iframe.html",
- {
- "timeout": "long"
- }
+ "/intersection-observer/cross-origin-iframe.html",
+ {}
]
],
- "image-decodes/image-decode-path-changes.html": [
+ "intersection-observer/disconnect.html": [
[
- "/image-decodes/image-decode-path-changes.html",
- {
- "timeout": "long"
- }
+ "/intersection-observer/disconnect.html",
+ {}
]
],
- "image-decodes/image-decode.html": [
+ "intersection-observer/display-none.html": [
[
- "/image-decodes/image-decode.html",
- {
- "timeout": "long"
- }
+ "/intersection-observer/display-none.html",
+ {}
]
],
- "imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html": [
+ "intersection-observer/edge-inclusive-intersection.html": [
[
- "/imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html",
+ "/intersection-observer/edge-inclusive-intersection.html",
{}
]
],
- "imagebitmap-renderingcontext/context-creation-with-alpha.html": [
+ "intersection-observer/iframe-no-root.html": [
[
- "/imagebitmap-renderingcontext/context-creation-with-alpha.html",
+ "/intersection-observer/iframe-no-root.html",
{}
]
],
- "imagebitmap-renderingcontext/context-creation.html": [
+ "intersection-observer/multiple-targets.html": [
[
- "/imagebitmap-renderingcontext/context-creation.html",
+ "/intersection-observer/multiple-targets.html",
{}
]
],
- "imagebitmap-renderingcontext/context-preserves-canvas.html": [
+ "intersection-observer/multiple-thresholds.html": [
[
- "/imagebitmap-renderingcontext/context-preserves-canvas.html",
+ "/intersection-observer/multiple-thresholds.html",
{}
]
],
- "imagebitmap-renderingcontext/tranferFromImageBitmap-null.html": [
+ "intersection-observer/observer-attributes.html": [
[
- "/imagebitmap-renderingcontext/tranferFromImageBitmap-null.html",
+ "/intersection-observer/observer-attributes.html",
{}
]
],
- "imagebitmap-renderingcontext/transferFromImageBitmap-detached.html": [
+ "intersection-observer/observer-exceptions.html": [
[
- "/imagebitmap-renderingcontext/transferFromImageBitmap-detached.html",
+ "/intersection-observer/observer-exceptions.html",
{}
]
],
- "infrastructure/failing-test.html": [
+ "intersection-observer/observer-without-js-reference.html": [
[
- "/infrastructure/failing-test.html",
+ "/intersection-observer/observer-without-js-reference.html",
{}
]
],
- "innerText/getter.html": [
+ "intersection-observer/remove-element.html": [
[
- "/innerText/getter.html",
+ "/intersection-observer/remove-element.html",
{}
]
],
- "innerText/setter.html": [
+ "intersection-observer/root-margin.html": [
[
- "/innerText/setter.html",
+ "/intersection-observer/root-margin.html",
{}
]
],
- "input-events/idlharness.html": [
+ "intersection-observer/same-document-no-root.html": [
[
- "/input-events/idlharness.html",
+ "/intersection-observer/same-document-no-root.html",
+ {}
+ ]
+ ],
+ "intersection-observer/same-document-root.html": [
+ [
+ "/intersection-observer/same-document-root.html",
+ {}
+ ]
+ ],
+ "intersection-observer/same-document-zero-size-target.html": [
+ [
+ "/intersection-observer/same-document-zero-size-target.html",
+ {}
+ ]
+ ],
+ "intersection-observer/shadow-content.html": [
+ [
+ "/intersection-observer/shadow-content.html",
+ {}
+ ]
+ ],
+ "intersection-observer/timestamp.html": [
+ [
+ "/intersection-observer/timestamp.html",
+ {}
+ ]
+ ],
+ "intersection-observer/unclipped-root.html": [
+ [
+ "/intersection-observer/unclipped-root.html",
+ {}
+ ]
+ ],
+ "intersection-observer/zero-area-element-hidden.html": [
+ [
+ "/intersection-observer/zero-area-element-hidden.html",
+ {}
+ ]
+ ],
+ "intersection-observer/zero-area-element-visible.html": [
+ [
+ "/intersection-observer/zero-area-element-visible.html",
{}
]
],
@@ -347918,6 +353405,24 @@
{}
]
],
+ "mediacapture-fromelement/capture.html": [
+ [
+ "/mediacapture-fromelement/capture.html",
+ {}
+ ]
+ ],
+ "mediacapture-fromelement/creation.html": [
+ [
+ "/mediacapture-fromelement/creation.html",
+ {}
+ ]
+ ],
+ "mediacapture-fromelement/ended.html": [
+ [
+ "/mediacapture-fromelement/ended.html",
+ {}
+ ]
+ ],
"mediacapture-fromelement/idlharness.html": [
[
"/mediacapture-fromelement/idlharness.html",
@@ -348032,6 +353537,12 @@
{}
]
],
+ "mediacapture-streams/MediaStream-default-feature-policy.https.sub.html": [
+ [
+ "/mediacapture-streams/MediaStream-default-feature-policy.https.sub.html",
+ {}
+ ]
+ ],
"mediacapture-streams/MediaStream-finished-add.https.html": [
[
"/mediacapture-streams/MediaStream-finished-add.https.html",
@@ -348074,6 +353585,12 @@
{}
]
],
+ "mediacapture-streams/MediaStreamTrack-getSettings.https.html": [
+ [
+ "/mediacapture-streams/MediaStreamTrack-getSettings.https.html",
+ {}
+ ]
+ ],
"mediacapture-streams/MediaStreamTrack-id.https.html": [
[
"/mediacapture-streams/MediaStreamTrack-id.https.html",
@@ -348092,6 +353609,12 @@
{}
]
],
+ "mediacapture-streams/historical.html": [
+ [
+ "/mediacapture-streams/historical.html",
+ {}
+ ]
+ ],
"mediasession/idlharness.html": [
[
"/mediasession/idlharness.html",
@@ -358796,1283 +364319,193 @@
{}
]
],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_checkvalidity.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/button_checkvalidity.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_labels.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/button_labels.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_setcustomvalidity.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/button_setcustomvalidity.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_validationmessage.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/button_validationmessage.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_validity.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/button_validity.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_willvalidate.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/button_willvalidate.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/fieldset_checkvalidity.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_checkvalidity.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/fieldset_setcustomvalidity.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_setcustomvalidity.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validationmessage.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validationmessage.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validity.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validity.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/fieldset_willvalidate.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_willvalidate.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/form_action.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/form_action.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/form_checkvalidity.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/form_checkvalidity.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/form_length.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/form_length.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/form_submit.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/form_submit.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_checkvalidity.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_checkvalidity.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_height.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_height.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_labels.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_labels.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_setcustomvalidity.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_setcustomvalidity.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_stepdown.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_stepdown.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_stepup.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_stepup.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_validationmessage.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_validationmessage.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_validity.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_validity.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_value_invalidstateerr.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_value_invalidstateerr.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_valueasdate_invalidstateerr.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_valueasdate_invalidstateerr.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_valueasnumber_invalidstateerr.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_valueasnumber_invalidstateerr.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_width.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_width.html",
- {}
- ]
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_willvalidate.html": [
- [
- "/old-tests/submission/Infraware/Forms/contents/Forms/input_willvalidate.html",
- {}
- ]
- ],
"old-tests/submission/Microsoft/history/history_000.htm": [
[
"/old-tests/submission/Microsoft/history/history_000.htm",
{}
]
],
- "old-tests/submission/Microsoft/sandbox/sandbox_001.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_001.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_002.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_002.htm",
- {
- "timeout": "long"
- }
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_005.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_005.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_011.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_011.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_012.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_012.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_013.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_013.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_014.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_014.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_015.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_015.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_016.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_016.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_017.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_017.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_018.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_018.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_019.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_019.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_023.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_023.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_024.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_024.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_025.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_025.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_026.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_026.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_027.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_027.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_028.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_028.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_029.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_029.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_030.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_030.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_031.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_031.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_032.htm": [
- [
- "/old-tests/submission/Microsoft/sandbox/sandbox_032.htm",
- {}
- ]
- ],
- "old-tests/submission/Microsoft/structuredclone/structuredclone_0.html": [
- [
- "/old-tests/submission/Microsoft/structuredclone/structuredclone_0.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/001.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/001.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/002.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/002.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/003.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/003.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/004.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/004.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/005.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/005.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/006.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/006.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/007.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/007.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/008.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/008.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/009.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/009.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/010.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/010.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/011.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/011.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/012.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/012.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/013.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/013.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/014.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/014.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/015.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/015.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/015a.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/015a.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/016.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/016.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/017.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/017.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/018.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/018.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/019.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/019.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/020.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/020.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/021.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/021.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/022.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/022.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/023.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/023.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/024.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/024.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/025.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/025.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/026.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/026.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/027.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/027.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/028.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/028.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/029.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/029.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/030.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/030.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/031.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/031.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/032.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/032.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/033.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/033.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/034.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/034.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/035.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/035.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/036.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/036.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/037.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/037.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/038.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/038.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/039.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/039.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/040.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/040.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/041.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/041.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/042.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/042.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/043.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/043.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/044.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/044.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/045.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/045.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/046.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/046.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/047.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/047.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/048.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/048.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/049.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/049.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/050.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/050.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/051.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/051.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/052.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/052.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/053.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/053.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/054.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/054.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/055.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/055.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/056.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/056.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/057.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/057.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/058.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/058.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/059.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/059.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/060.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/060.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/061.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/061.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/062.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/062.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/063.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/063.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/064.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/064.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/065.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/065.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/066.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/066.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/067.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/067.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/068.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/068.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/069.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/069.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/070.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/070.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/071.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/071.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/072.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/072.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/073.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/073.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/074.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/074.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/075.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/075.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/076.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/076.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/077.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/077.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/078.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/078.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/079.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/079.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/080.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/080.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/081.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/081.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/082.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/082.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/083.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/083.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/084.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/084.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/085.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/085.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/086.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/086.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/087.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/087.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/088.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/088.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/089.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/089.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/090.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/090.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/091.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/091.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/092.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/092.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/094.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/094.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/095.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/095.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/096.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/096.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/097.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/097.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/099.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/099.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/100.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/100.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/101.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/101.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/103.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/103.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/104.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/104.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/105.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/105.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/106-import.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/106-import.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/106-noimport.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/106-noimport.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/107-import.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/107-import.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/107-noimport.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/107-noimport.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/108.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/108.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/109.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/109.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/110.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/110.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/111.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/111.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/112.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/112.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/113.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/113.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/114.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/114.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/115.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/115.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/116.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/116.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/117.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/117.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/118.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/118.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/119.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/119.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/120.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/120.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/121.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/121.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/122.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/122.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/123.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/123.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/124.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/124.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/125.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/125.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/126.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/126.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/127.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/127.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/128.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/128.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/129.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/129.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/130.html": [
- [
- "/old-tests/submission/Opera/script_scheduling/130.html",
- {}
- ]
- ],
- "old-tests/submission/Opera/script_scheduling/131.html": [
+ "orientation-event/devicemotionevent-init.html": [
[
- "/old-tests/submission/Opera/script_scheduling/131.html",
+ "/orientation-event/devicemotionevent-init.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/132.html": [
+ "orientation-event/deviceorientationabsoluteevent.html": [
[
- "/old-tests/submission/Opera/script_scheduling/132.html",
+ "/orientation-event/deviceorientationabsoluteevent.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/133.html": [
+ "orientation-event/deviceorientationevent-init.html": [
[
- "/old-tests/submission/Opera/script_scheduling/133.html",
+ "/orientation-event/deviceorientationevent-init.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/134.html": [
+ "orientation-event/idlharness.html": [
[
- "/old-tests/submission/Opera/script_scheduling/134.html",
+ "/orientation-event/idlharness.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/135.html": [
+ "orientation-sensor/OrientationSensor.https.html": [
[
- "/old-tests/submission/Opera/script_scheduling/135.html",
+ "/orientation-sensor/OrientationSensor.https.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/136.html": [
+ "orientation-sensor/OrientationSensor_insecure_context.html": [
[
- "/old-tests/submission/Opera/script_scheduling/136.html",
+ "/orientation-sensor/OrientationSensor_insecure_context.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/137.html": [
+ "orientation-sensor/idlharness.https.html": [
[
- "/old-tests/submission/Opera/script_scheduling/137.html",
+ "/orientation-sensor/idlharness.https.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/138.html": [
+ "page-visibility/idlharness.html": [
[
- "/old-tests/submission/Opera/script_scheduling/138.html",
+ "/page-visibility/idlharness.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/139.html": [
+ "page-visibility/iframe-unload.html": [
[
- "/old-tests/submission/Opera/script_scheduling/139.html",
+ "/page-visibility/iframe-unload.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/140.html": [
+ "page-visibility/onvisibilitychange.html": [
[
- "/old-tests/submission/Opera/script_scheduling/140.html",
+ "/page-visibility/onvisibilitychange.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/141.html": [
+ "page-visibility/prerender_call.html": [
[
- "/old-tests/submission/Opera/script_scheduling/141.html",
+ "/page-visibility/prerender_call.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/142.html": [
+ "page-visibility/test_attributes_exist.html": [
[
- "/old-tests/submission/Opera/script_scheduling/142.html",
+ "/page-visibility/test_attributes_exist.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/143.html": [
+ "page-visibility/test_child_document.html": [
[
- "/old-tests/submission/Opera/script_scheduling/143.html",
+ "/page-visibility/test_child_document.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/144.html": [
+ "page-visibility/test_default_view.html": [
[
- "/old-tests/submission/Opera/script_scheduling/144.html",
+ "/page-visibility/test_default_view.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/145.html": [
+ "page-visibility/test_read_only.html": [
[
- "/old-tests/submission/Opera/script_scheduling/145.html",
+ "/page-visibility/test_read_only.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/146.html": [
+ "page-visibility/unload.html": [
[
- "/old-tests/submission/Opera/script_scheduling/146.html",
+ "/page-visibility/unload.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/147.html": [
+ "paint-timing/basetest.html": [
[
- "/old-tests/submission/Opera/script_scheduling/147.html",
+ "/paint-timing/basetest.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/148.html": [
+ "paint-timing/first-contentful-bg-image.html": [
[
- "/old-tests/submission/Opera/script_scheduling/148.html",
+ "/paint-timing/first-contentful-bg-image.html",
{}
]
],
- "old-tests/submission/Opera/script_scheduling/149.html": [
+ "paint-timing/first-contentful-canvas.html": [
[
- "/old-tests/submission/Opera/script_scheduling/149.html",
+ "/paint-timing/first-contentful-canvas.html",
{}
]
],
- "orientation-event/devicemotionevent-init.html": [
+ "paint-timing/first-contentful-image.html": [
[
- "/orientation-event/devicemotionevent-init.html",
+ "/paint-timing/first-contentful-image.html",
{}
]
],
- "orientation-event/deviceorientationabsoluteevent.html": [
+ "paint-timing/first-contentful-paint.html": [
[
- "/orientation-event/deviceorientationabsoluteevent.html",
+ "/paint-timing/first-contentful-paint.html",
{}
]
],
- "orientation-event/deviceorientationevent-init.html": [
+ "paint-timing/first-contentful-svg.html": [
[
- "/orientation-event/deviceorientationevent-init.html",
+ "/paint-timing/first-contentful-svg.html",
{}
]
],
- "orientation-event/idlharness.html": [
+ "paint-timing/first-paint-bg-color.html": [
[
- "/orientation-event/idlharness.html",
+ "/paint-timing/first-paint-bg-color.html",
{}
]
],
- "orientation-sensor/idlharness.https.html": [
+ "paint-timing/first-paint-only.html": [
[
- "/orientation-sensor/idlharness.https.html",
+ "/paint-timing/first-paint-only.html",
{}
]
],
- "page-visibility/idlharness.html": [
+ "paint-timing/paint-visited.html": [
[
- "/page-visibility/idlharness.html",
+ "/paint-timing/paint-visited.html",
{}
]
],
- "page-visibility/prerender_call.html": [
+ "payment-handler/interfaces.https.any.js": [
[
- "/page-visibility/prerender_call.html",
+ "/payment-handler/interfaces.https.any.html",
{}
- ]
- ],
- "page-visibility/test_attributes_exist.html": [
+ ],
[
- "/page-visibility/test_attributes_exist.html",
+ "/payment-handler/interfaces.https.any.worker.html",
{}
]
],
- "page-visibility/test_child_document.html": [
+ "payment-method-basic-card/payment-request-canmakepayment-method.https.html": [
[
- "/page-visibility/test_child_document.html",
+ "/payment-method-basic-card/payment-request-canmakepayment-method.https.html",
{}
]
],
- "page-visibility/test_default_view.html": [
+ "payment-request/PaymentRequestUpdateEvent/constructor.http.html": [
[
- "/page-visibility/test_default_view.html",
+ "/payment-request/PaymentRequestUpdateEvent/constructor.http.html",
{}
]
],
- "page-visibility/test_read_only.html": [
+ "payment-request/PaymentRequestUpdateEvent/constructor.https.html": [
[
- "/page-visibility/test_read_only.html",
+ "/payment-request/PaymentRequestUpdateEvent/constructor.https.html",
{}
]
],
- "page-visibility/unload.html": [
+ "payment-request/PaymentRequestUpdateEvent/updatewith-method.https.html": [
[
- "/page-visibility/unload.html",
+ "/payment-request/PaymentRequestUpdateEvent/updatewith-method.https.html",
{}
]
],
@@ -360154,10 +364587,18 @@
{}
]
],
+ "payment-request/payment-request-canmakepayment-method.https.html": [
+ [
+ "/payment-request/payment-request-canmakepayment-method.https.html",
+ {}
+ ]
+ ],
"payment-request/payment-request-constructor-crash.https.html": [
[
"/payment-request/payment-request-constructor-crash.https.html",
- {}
+ {
+ "timeout": "long"
+ }
]
],
"payment-request/payment-request-constructor.https.html": [
@@ -360166,15 +364607,21 @@
{}
]
],
- "payment-request/payment-request-id.https.html": [
+ "payment-request/payment-request-ctor-currency-code-checks.https.html": [
+ [
+ "/payment-request/payment-request-ctor-currency-code-checks.https.html",
+ {}
+ ]
+ ],
+ "payment-request/payment-request-ctor-pmi-handling.https.html": [
[
- "/payment-request/payment-request-id.https.html",
+ "/payment-request/payment-request-ctor-pmi-handling.https.html",
{}
]
],
- "payment-request/payment-request-in-iframe.html": [
+ "payment-request/payment-request-id-attribute.https.html": [
[
- "/payment-request/payment-request-in-iframe.html",
+ "/payment-request/payment-request-id-attribute.https.html",
{}
]
],
@@ -360190,27 +364637,33 @@
{}
]
],
- "payment-request/payment-request-show-method.https.html": [
+ "payment-request/payment-request-shippingAddress-attribute.https.html": [
[
- "/payment-request/payment-request-show-method.https.html",
+ "/payment-request/payment-request-shippingAddress-attribute.https.html",
{}
]
],
- "payment-request/payment-request-update-event-constructor.http.html": [
+ "payment-request/payment-request-shippingOption-attribute.https.html": [
[
- "/payment-request/payment-request-update-event-constructor.http.html",
+ "/payment-request/payment-request-shippingOption-attribute.https.html",
{}
]
],
- "payment-request/payment-request-update-event-constructor.https.html": [
+ "payment-request/payment-request-shippingType-attribute.https.html": [
[
- "/payment-request/payment-request-update-event-constructor.https.html",
+ "/payment-request/payment-request-shippingType-attribute.https.html",
{}
]
],
- "payment-request/payment-request-update-event-updatewith-method.https.html": [
+ "payment-request/payment-request-show-method.https.html": [
[
- "/payment-request/payment-request-update-event-updatewith-method.https.html",
+ "/payment-request/payment-request-show-method.https.html",
+ {}
+ ]
+ ],
+ "payment-request/rejects_if_not_active.https.html": [
+ [
+ "/payment-request/rejects_if_not_active.https.html",
{}
]
],
@@ -360230,6 +364683,16 @@
{}
]
],
+ "performance-timeline/po-callback-mutate.any.js": [
+ [
+ "/performance-timeline/po-callback-mutate.any.html",
+ {}
+ ],
+ [
+ "/performance-timeline/po-callback-mutate.any.worker.html",
+ {}
+ ]
+ ],
"performance-timeline/po-disconnect.any.js": [
[
"/performance-timeline/po-disconnect.any.html",
@@ -360240,6 +364703,16 @@
{}
]
],
+ "performance-timeline/po-entries-sort.any.js": [
+ [
+ "/performance-timeline/po-entries-sort.any.html",
+ {}
+ ],
+ [
+ "/performance-timeline/po-entries-sort.any.worker.html",
+ {}
+ ]
+ ],
"performance-timeline/po-getentries.any.js": [
[
"/performance-timeline/po-getentries.any.html",
@@ -360288,6 +364761,12 @@
{}
]
],
+ "performance-timeline/worker-with-performance-observer.html": [
+ [
+ "/performance-timeline/worker-with-performance-observer.html",
+ {}
+ ]
+ ],
"pointerevents/extension/idlharness.html": [
[
"/pointerevents/extension/idlharness.html",
@@ -360360,6 +364839,12 @@
{}
]
],
+ "preload/dynamic-adding-preload-nonce.html": [
+ [
+ "/preload/dynamic-adding-preload-nonce.html",
+ {}
+ ]
+ ],
"preload/dynamic-adding-preload.html": [
[
"/preload/dynamic-adding-preload.html",
@@ -360372,12 +364857,24 @@
{}
]
],
+ "preload/link-header-on-subresource.html": [
+ [
+ "/preload/link-header-on-subresource.html",
+ {}
+ ]
+ ],
"preload/link-header-preload-delay-onload.html": [
[
"/preload/link-header-preload-delay-onload.html",
{}
]
],
+ "preload/link-header-preload-nonce.html": [
+ [
+ "/preload/link-header-preload-nonce.html",
+ {}
+ ]
+ ],
"preload/link-header-preload.html": [
[
"/preload/link-header-preload.html",
@@ -360558,6 +365055,12 @@
{}
]
],
+ "quirks-mode/classname-query-after-sibling-adoption.html": [
+ [
+ "/quirks-mode/classname-query-after-sibling-adoption.html",
+ {}
+ ]
+ ],
"quirks-mode/hashless-hex-color.html": [
[
"/quirks-mode/hashless-hex-color.html",
@@ -360644,6 +365147,12 @@
{}
]
],
+ "referrer-policy/generic/link-rel-prefetch.html": [
+ [
+ "/referrer-policy/generic/link-rel-prefetch.html",
+ {}
+ ]
+ ],
"referrer-policy/generic/sandboxed-iframe-with-opaque-origin.html": [
[
"/referrer-policy/generic/sandboxed-iframe-with-opaque-origin.html",
@@ -368666,6 +373175,108 @@
{}
]
],
+ "requestidlecallback/basic.html": [
+ [
+ "/requestidlecallback/basic.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/callback-exception.html": [
+ [
+ "/requestidlecallback/callback-exception.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/callback-idle-periods.html": [
+ [
+ "/requestidlecallback/callback-idle-periods.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/callback-iframe.html": [
+ [
+ "/requestidlecallback/callback-iframe.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/callback-invoked.html": [
+ [
+ "/requestidlecallback/callback-invoked.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/callback-multiple-calls.html": [
+ [
+ "/requestidlecallback/callback-multiple-calls.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/callback-removed-frame.html": [
+ [
+ "/requestidlecallback/callback-removed-frame.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/callback-suspended.html": [
+ [
+ "/requestidlecallback/callback-suspended.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/callback-timeout-with-raf.html": [
+ [
+ "/requestidlecallback/callback-timeout-with-raf.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/callback-timeout.html": [
+ [
+ "/requestidlecallback/callback-timeout.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/callback-xhr-sync.html": [
+ [
+ "/requestidlecallback/callback-xhr-sync.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/cancel-invoked.html": [
+ [
+ "/requestidlecallback/cancel-invoked.html",
+ {}
+ ]
+ ],
+ "requestidlecallback/idlharness.html": [
+ [
+ "/requestidlecallback/idlharness.html",
+ {}
+ ]
+ ],
+ "resize-observer/eventloop.html": [
+ [
+ "/resize-observer/eventloop.html",
+ {}
+ ]
+ ],
+ "resize-observer/notify.html": [
+ [
+ "/resize-observer/notify.html",
+ {}
+ ]
+ ],
+ "resize-observer/observe.html": [
+ [
+ "/resize-observer/observe.html",
+ {}
+ ]
+ ],
+ "resize-observer/svg.html": [
+ [
+ "/resize-observer/svg.html",
+ {}
+ ]
+ ],
"resource-timing/idlharness.html": [
[
"/resource-timing/idlharness.html",
@@ -368750,6 +373361,14 @@
{}
]
],
+ "resource-timing/single-entry-per-resource.html": [
+ [
+ "/resource-timing/single-entry-per-resource.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"resource-timing/test_resource_timing.html": [
[
"/resource-timing/test_resource_timing.html",
@@ -369086,6 +373705,12 @@
}
]
],
+ "selection/addRange.htm": [
+ [
+ "/selection/addRange.htm",
+ {}
+ ]
+ ],
"selection/collapse-00.html": [
[
"/selection/collapse-00.html",
@@ -369118,6 +373743,12 @@
}
]
],
+ "selection/collapse.htm": [
+ [
+ "/selection/collapse.htm",
+ {}
+ ]
+ ],
"selection/collapseToStartEnd.html": [
[
"/selection/collapseToStartEnd.html",
@@ -369574,6 +374205,12 @@
{}
]
],
+ "service-workers/service-worker/claim-shared-worker-fetch.https.html": [
+ [
+ "/service-workers/service-worker/claim-shared-worker-fetch.https.html",
+ {}
+ ]
+ ],
"service-workers/service-worker/claim-using-registration.https.html": [
[
"/service-workers/service-worker/claim-using-registration.https.html",
@@ -369586,6 +374223,12 @@
{}
]
],
+ "service-workers/service-worker/claim-worker-fetch.https.html": [
+ [
+ "/service-workers/service-worker/claim-worker-fetch.https.html",
+ {}
+ ]
+ ],
"service-workers/service-worker/client-id.https.html": [
[
"/service-workers/service-worker/client-id.https.html",
@@ -369732,6 +374375,12 @@
}
]
],
+ "service-workers/service-worker/fetch-event-referrer-policy.https.html": [
+ [
+ "/service-workers/service-worker/fetch-event-referrer-policy.https.html",
+ {}
+ ]
+ ],
"service-workers/service-worker/fetch-event-respond-with-argument.https.html": [
[
"/service-workers/service-worker/fetch-event-respond-with-argument.https.html",
@@ -369936,6 +374585,18 @@
{}
]
],
+ "service-workers/service-worker/immutable-prototype-serviceworker.https.html": [
+ [
+ "/service-workers/service-worker/immutable-prototype-serviceworker.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/import-scripts-redirect.https.html": [
+ [
+ "/service-workers/service-worker/import-scripts-redirect.https.html",
+ {}
+ ]
+ ],
"service-workers/service-worker/import-scripts-resource-map.https.html": [
[
"/service-workers/service-worker/import-scripts-resource-map.https.html",
@@ -369966,9 +374627,15 @@
{}
]
],
- "service-workers/service-worker/interfaces.https.html": [
+ "service-workers/service-worker/interfaces-sw.https.html": [
[
- "/service-workers/service-worker/interfaces.https.html",
+ "/service-workers/service-worker/interfaces-sw.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/interfaces-window.https.html": [
+ [
+ "/service-workers/service-worker/interfaces-window.https.html",
{}
]
],
@@ -369990,6 +374657,48 @@
{}
]
],
+ "service-workers/service-worker/link-element-register-basic.https.html": [
+ [
+ "/service-workers/service-worker/link-element-register-basic.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/link-element-register-mime-types.https.html": [
+ [
+ "/service-workers/service-worker/link-element-register-mime-types.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/link-element-register-scope.https.html": [
+ [
+ "/service-workers/service-worker/link-element-register-scope.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/link-element-register-script-url.https.html": [
+ [
+ "/service-workers/service-worker/link-element-register-script-url.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/link-element-register-script.https.html": [
+ [
+ "/service-workers/service-worker/link-element-register-script.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/link-element-register-security-error.https.html": [
+ [
+ "/service-workers/service-worker/link-element-register-security-error.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/mime-sniffing.https.html": [
+ [
+ "/service-workers/service-worker/mime-sniffing.https.html",
+ {}
+ ]
+ ],
"service-workers/service-worker/multi-globals/url-parsing.https.html": [
[
"/service-workers/service-worker/multi-globals/url-parsing.https.html",
@@ -370172,12 +374881,6 @@
{}
]
],
- "service-workers/service-worker/register-link-element.https.html": [
- [
- "/service-workers/service-worker/register-link-element.https.html",
- {}
- ]
- ],
"service-workers/service-worker/register-link-header.https.html": [
[
"/service-workers/service-worker/register-link-header.https.html",
@@ -370196,6 +374899,12 @@
{}
]
],
+ "service-workers/service-worker/registration-basic.https.html": [
+ [
+ "/service-workers/service-worker/registration-basic.https.html",
+ {}
+ ]
+ ],
"service-workers/service-worker/registration-end-to-end.https.html": [
[
"/service-workers/service-worker/registration-end-to-end.https.html",
@@ -370214,15 +374923,45 @@
{}
]
],
+ "service-workers/service-worker/registration-mime-types.https.html": [
+ [
+ "/service-workers/service-worker/registration-mime-types.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/registration-scope.https.html": [
+ [
+ "/service-workers/service-worker/registration-scope.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/registration-script-url.https.html": [
+ [
+ "/service-workers/service-worker/registration-script-url.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/registration-script.https.html": [
+ [
+ "/service-workers/service-worker/registration-script.https.html",
+ {}
+ ]
+ ],
+ "service-workers/service-worker/registration-security-error.https.html": [
+ [
+ "/service-workers/service-worker/registration-security-error.https.html",
+ {}
+ ]
+ ],
"service-workers/service-worker/registration-service-worker-attributes.https.html": [
[
"/service-workers/service-worker/registration-service-worker-attributes.https.html",
{}
]
],
- "service-workers/service-worker/registration.https.html": [
+ "service-workers/service-worker/registration-updateviacache.https.html": [
[
- "/service-workers/service-worker/registration.https.html",
+ "/service-workers/service-worker/registration-updateviacache.https.html",
{}
]
],
@@ -370370,6 +375109,12 @@
{}
]
],
+ "service-workers/service-worker/update-bytecheck.https.html": [
+ [
+ "/service-workers/service-worker/update-bytecheck.https.html",
+ {}
+ ]
+ ],
"service-workers/service-worker/update-recovery.https.html": [
[
"/service-workers/service-worker/update-recovery.https.html",
@@ -370514,12 +375259,24 @@
{}
]
],
+ "shadow-dom/event-post-dispatch.html": [
+ [
+ "/shadow-dom/event-post-dispatch.html",
+ {}
+ ]
+ ],
"shadow-dom/event-with-related-target.html": [
[
"/shadow-dom/event-with-related-target.html",
{}
]
],
+ "shadow-dom/historical.html": [
+ [
+ "/shadow-dom/historical.html",
+ {}
+ ]
+ ],
"shadow-dom/leaktests/get-elements.html": [
[
"/shadow-dom/leaktests/get-elements.html",
@@ -370544,6 +375301,12 @@
{}
]
],
+ "shadow-dom/slotchange-customelements.html": [
+ [
+ "/shadow-dom/slotchange-customelements.html",
+ {}
+ ]
+ ],
"shadow-dom/slotchange-event.html": [
[
"/shadow-dom/slotchange-event.html",
@@ -370904,6 +375667,24 @@
{}
]
],
+ "speech-api/SpeechSynthesis-speak-ownership.html": [
+ [
+ "/speech-api/SpeechSynthesis-speak-ownership.html",
+ {}
+ ]
+ ],
+ "speech-api/SpeechSynthesis-speak-twice.html": [
+ [
+ "/speech-api/SpeechSynthesis-speak-twice.html",
+ {}
+ ]
+ ],
+ "speech-api/historical.html": [
+ [
+ "/speech-api/historical.html",
+ {}
+ ]
+ ],
"staticrange/idlharness.html": [
[
"/staticrange/idlharness.html",
@@ -370928,9 +375709,9 @@
{}
]
],
- "storage/interfaces.worker.js": [
+ "storage/interfaces.https.worker.js": [
[
- "/storage/interfaces.worker.html",
+ "/storage/interfaces.https.worker.html",
{}
]
],
@@ -371246,6 +376027,54 @@
{}
]
],
+ "streams/readable-byte-streams/brand-checks.dedicatedworker.html": [
+ [
+ "/streams/readable-byte-streams/brand-checks.dedicatedworker.html",
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/brand-checks.html": [
+ [
+ "/streams/readable-byte-streams/brand-checks.html",
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/brand-checks.serviceworker.https.html": [
+ [
+ "/streams/readable-byte-streams/brand-checks.serviceworker.https.html",
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/brand-checks.sharedworker.html": [
+ [
+ "/streams/readable-byte-streams/brand-checks.sharedworker.html",
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/detached-buffers.dedicatedworker.html": [
+ [
+ "/streams/readable-byte-streams/detached-buffers.dedicatedworker.html",
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/detached-buffers.html": [
+ [
+ "/streams/readable-byte-streams/detached-buffers.html",
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/detached-buffers.serviceworker.https.html": [
+ [
+ "/streams/readable-byte-streams/detached-buffers.serviceworker.https.html",
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/detached-buffers.sharedworker.html": [
+ [
+ "/streams/readable-byte-streams/detached-buffers.sharedworker.html",
+ {}
+ ]
+ ],
"streams/readable-byte-streams/general.dedicatedworker.html": [
[
"/streams/readable-byte-streams/general.dedicatedworker.html",
@@ -371270,6 +376099,30 @@
{}
]
],
+ "streams/readable-byte-streams/properties.dedicatedworker.html": [
+ [
+ "/streams/readable-byte-streams/properties.dedicatedworker.html",
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/properties.html": [
+ [
+ "/streams/readable-byte-streams/properties.html",
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/properties.serviceworker.https.html": [
+ [
+ "/streams/readable-byte-streams/properties.serviceworker.https.html",
+ {}
+ ]
+ ],
+ "streams/readable-byte-streams/properties.sharedworker.html": [
+ [
+ "/streams/readable-byte-streams/properties.sharedworker.html",
+ {}
+ ]
+ ],
"streams/readable-streams/bad-strategies.dedicatedworker.html": [
[
"/streams/readable-streams/bad-strategies.dedicatedworker.html",
@@ -371486,30 +376339,6 @@
{}
]
],
- "streams/readable-streams/pipe-through.dedicatedworker.html": [
- [
- "/streams/readable-streams/pipe-through.dedicatedworker.html",
- {}
- ]
- ],
- "streams/readable-streams/pipe-through.html": [
- [
- "/streams/readable-streams/pipe-through.html",
- {}
- ]
- ],
- "streams/readable-streams/pipe-through.serviceworker.https.html": [
- [
- "/streams/readable-streams/pipe-through.serviceworker.https.html",
- {}
- ]
- ],
- "streams/readable-streams/pipe-through.sharedworker.html": [
- [
- "/streams/readable-streams/pipe-through.sharedworker.html",
- {}
- ]
- ],
"streams/readable-streams/tee.dedicatedworker.html": [
[
"/streams/readable-streams/tee.dedicatedworker.html",
@@ -371918,6 +376747,24 @@
{}
]
],
+ "subresource-integrity/subresource-css-ed25519.tentative.html": [
+ [
+ "/subresource-integrity/subresource-css-ed25519.tentative.html",
+ {}
+ ]
+ ],
+ "subresource-integrity/subresource-ed25519-with-csp.tentative.html": [
+ [
+ "/subresource-integrity/subresource-ed25519-with-csp.tentative.html",
+ {}
+ ]
+ ],
+ "subresource-integrity/subresource-ed25519.tentative.html": [
+ [
+ "/subresource-integrity/subresource-ed25519.tentative.html",
+ {}
+ ]
+ ],
"subresource-integrity/subresource-integrity.sub.html": [
[
"/subresource-integrity/subresource-integrity.sub.html",
@@ -371992,6 +376839,90 @@
{}
]
],
+ "trusted-types/TrustedHTML.tentative.html": [
+ [
+ "/trusted-types/TrustedHTML.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/TrustedScriptURL.tentative.html": [
+ [
+ "/trusted-types/TrustedScriptURL.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/TrustedURL.tentative.html": [
+ [
+ "/trusted-types/TrustedURL.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/block-string-assignment-to-innerHTML.tentative.html": [
+ [
+ "/trusted-types/block-string-assignment-to-innerHTML.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/block-string-assignment-to-insertAdjacentHTML.tentative.html": [
+ [
+ "/trusted-types/block-string-assignment-to-insertAdjacentHTML.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/block-string-assignment-to-location-href.tentative.html": [
+ [
+ "/trusted-types/block-string-assignment-to-location-href.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/block-string-assignment-to-outerHTML.tentative.html": [
+ [
+ "/trusted-types/block-string-assignment-to-outerHTML.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/block-string-assignment-to-script-src.tentative.html": [
+ [
+ "/trusted-types/block-string-assignment-to-script-src.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/document-write.tentative.html": [
+ [
+ "/trusted-types/document-write.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/innerHTML.tentative.html": [
+ [
+ "/trusted-types/innerHTML.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/insertAdjacentHTML.tentative.html": [
+ [
+ "/trusted-types/insertAdjacentHTML.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/location-href.tentative.html": [
+ [
+ "/trusted-types/location-href.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/outerHTML.tentative.html": [
+ [
+ "/trusted-types/outerHTML.tentative.html",
+ {}
+ ]
+ ],
+ "trusted-types/script-src.tentative.html": [
+ [
+ "/trusted-types/script-src.tentative.html",
+ {}
+ ]
+ ],
"uievents/constructors/inputevent-constructor.html": [
[
"/uievents/constructors/inputevent-constructor.html",
@@ -372004,6 +376935,14 @@
{}
]
],
+ "uievents/interfaces.html": [
+ [
+ "/uievents/interfaces.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
"uievents/legacy-domevents-tests/approved/ProcessingInstruction.DOMCharacterDataModified.html": [
[
"/uievents/legacy-domevents-tests/approved/ProcessingInstruction.DOMCharacterDataModified.html",
@@ -372040,6 +376979,12 @@
{}
]
],
+ "uievents/legacy/Event-subclasses-init.html": [
+ [
+ "/uievents/legacy/Event-subclasses-init.html",
+ {}
+ ]
+ ],
"uievents/order-of-events/focus-events/focus-automated-blink-webkit.html": [
[
"/uievents/order-of-events/focus-events/focus-automated-blink-webkit.html",
@@ -372466,6 +377411,18 @@
{}
]
],
+ "wasm/create_multiple_memory.worker.js": [
+ [
+ "/wasm/create_multiple_memory.worker.html",
+ {}
+ ]
+ ],
+ "wasm/many-memories.window.js": [
+ [
+ "/wasm/many-memories.window.html",
+ {}
+ ]
+ ],
"wasm/wasm_indexeddb_test.html": [
[
"/wasm/wasm_indexeddb_test.html",
@@ -372484,9 +377441,9 @@
{}
]
],
- "wasm/wasm_service_worker_test.html": [
+ "wasm/wasm_service_worker_test.https.html": [
[
- "/wasm/wasm_service_worker_test.html",
+ "/wasm/wasm_service_worker_test.https.html",
{}
]
],
@@ -372514,24 +377471,6 @@
{}
]
],
- "web-animations/animation-model/animation-types/spacing-keyframes-filters.html": [
- [
- "/web-animations/animation-model/animation-types/spacing-keyframes-filters.html",
- {}
- ]
- ],
- "web-animations/animation-model/animation-types/spacing-keyframes-shapes.html": [
- [
- "/web-animations/animation-model/animation-types/spacing-keyframes-shapes.html",
- {}
- ]
- ],
- "web-animations/animation-model/animation-types/spacing-keyframes-transform.html": [
- [
- "/web-animations/animation-model/animation-types/spacing-keyframes-transform.html",
- {}
- ]
- ],
"web-animations/animation-model/combining-effects/effect-composition.html": [
[
"/web-animations/animation-model/combining-effects/effect-composition.html",
@@ -372562,9 +377501,9 @@
{}
]
],
- "web-animations/animation-model/keyframe-effects/spacing-keyframes.html": [
+ "web-animations/interfaces/Animatable/animate-no-browsing-context.html": [
[
- "/web-animations/animation-model/keyframe-effects/spacing-keyframes.html",
+ "/web-animations/interfaces/Animatable/animate-no-browsing-context.html",
{}
]
],
@@ -372802,24 +377741,12 @@
{}
]
],
- "web-animations/interfaces/KeyframeEffect/spacing.html": [
- [
- "/web-animations/interfaces/KeyframeEffect/spacing.html",
- {}
- ]
- ],
"web-animations/interfaces/KeyframeEffectReadOnly/copy-contructor.html": [
[
"/web-animations/interfaces/KeyframeEffectReadOnly/copy-contructor.html",
{}
]
],
- "web-animations/interfaces/KeyframeEffectReadOnly/spacing.html": [
- [
- "/web-animations/interfaces/KeyframeEffectReadOnly/spacing.html",
- {}
- ]
- ],
"web-animations/timing-model/animation-effects/active-time.html": [
[
"/web-animations/timing-model/animation-effects/active-time.html",
@@ -372922,6 +377849,60 @@
{}
]
],
+ "web-nfc/nfc_insecure_context.html": [
+ [
+ "/web-nfc/nfc_insecure_context.html",
+ {}
+ ]
+ ],
+ "web-nfc/nfc_push.https.html": [
+ [
+ "/web-nfc/nfc_push.https.html",
+ {}
+ ]
+ ],
+ "web-nfc/nfc_watch.https.html": [
+ [
+ "/web-nfc/nfc_watch.https.html",
+ {}
+ ]
+ ],
+ "web-share/idlharness.https.html": [
+ [
+ "/web-share/idlharness.https.html",
+ {}
+ ]
+ ],
+ "web-share/share-empty.https.html": [
+ [
+ "/web-share/share-empty.https.html",
+ {}
+ ]
+ ],
+ "web-share/share-securecontext.http.html": [
+ [
+ "/web-share/share-securecontext.http.html",
+ {}
+ ]
+ ],
+ "web-share/share-url-invalid.https.html": [
+ [
+ "/web-share/share-url-invalid.https.html",
+ {}
+ ]
+ ],
+ "web-share/share-without-user-gesture.https.html": [
+ [
+ "/web-share/share-without-user-gesture.https.html",
+ {}
+ ]
+ ],
+ "webaudio/historical.html": [
+ [
+ "/webaudio/historical.html",
+ {}
+ ]
+ ],
"webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html": [
[
"/webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html",
@@ -373066,9 +378047,15 @@
{}
]
],
- "webdriver/interface.html": [
+ "webdriver/interface/interface.html": [
+ [
+ "/webdriver/interface/interface.html",
+ {}
+ ]
+ ],
+ "webdriver/tests/interface.html": [
[
- "/webdriver/interface.html",
+ "/webdriver/tests/interface.html",
{}
]
],
@@ -377758,12 +382745,56 @@
{}
]
],
+ "webrtc/RTCConfiguration-bundlePolicy.html": [
+ [
+ "/webrtc/RTCConfiguration-bundlePolicy.html",
+ {}
+ ]
+ ],
"webrtc/RTCConfiguration-iceCandidatePoolSize.html": [
[
"/webrtc/RTCConfiguration-iceCandidatePoolSize.html",
{}
]
],
+ "webrtc/RTCConfiguration-iceServers.html": [
+ [
+ "/webrtc/RTCConfiguration-iceServers.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCConfiguration-iceTransportPolicy.html": [
+ [
+ "/webrtc/RTCConfiguration-iceTransportPolicy.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCConfiguration-rtcpMuxPolicy.html": [
+ [
+ "/webrtc/RTCConfiguration-rtcpMuxPolicy.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCDTMFSender-insertDTMF.https.html": [
+ [
+ "/webrtc/RTCDTMFSender-insertDTMF.https.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCDTMFSender-ontonechange-long.https.html": [
+ [
+ "/webrtc/RTCDTMFSender-ontonechange-long.https.html",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "webrtc/RTCDTMFSender-ontonechange.https.html": [
+ [
+ "/webrtc/RTCDTMFSender-ontonechange.https.html",
+ {}
+ ]
+ ],
"webrtc/RTCDataChannel-bufferedAmount.html": [
[
"/webrtc/RTCDataChannel-bufferedAmount.html",
@@ -377788,18 +382819,36 @@
{}
]
],
+ "webrtc/RTCDtlsTransport-getRemoteCertificates.html": [
+ [
+ "/webrtc/RTCDtlsTransport-getRemoteCertificates.html",
+ {}
+ ]
+ ],
"webrtc/RTCIceCandidate-constructor.html": [
[
"/webrtc/RTCIceCandidate-constructor.html",
{}
]
],
+ "webrtc/RTCIceTransport.html": [
+ [
+ "/webrtc/RTCIceTransport.html",
+ {}
+ ]
+ ],
"webrtc/RTCPeerConnection-addIceCandidate.html": [
[
"/webrtc/RTCPeerConnection-addIceCandidate.html",
{}
]
],
+ "webrtc/RTCPeerConnection-addTrack.https.html": [
+ [
+ "/webrtc/RTCPeerConnection-addTrack.https.html",
+ {}
+ ]
+ ],
"webrtc/RTCPeerConnection-addTransceiver.html": [
[
"/webrtc/RTCPeerConnection-addTransceiver.html",
@@ -377848,6 +382897,24 @@
{}
]
],
+ "webrtc/RTCPeerConnection-getDefaultIceServers.html": [
+ [
+ "/webrtc/RTCPeerConnection-getDefaultIceServers.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-getIdentityAssertion.html": [
+ [
+ "/webrtc/RTCPeerConnection-getIdentityAssertion.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-getStats.https.html": [
+ [
+ "/webrtc/RTCPeerConnection-getStats.https.html",
+ {}
+ ]
+ ],
"webrtc/RTCPeerConnection-getTransceivers.html": [
[
"/webrtc/RTCPeerConnection-getTransceivers.html",
@@ -377884,9 +382951,51 @@
{}
]
],
- "webrtc/RTCPeerConnection-removeTrack.html": [
+ "webrtc/RTCPeerConnection-ontrack.https.html": [
[
- "/webrtc/RTCPeerConnection-removeTrack.html",
+ "/webrtc/RTCPeerConnection-ontrack.https.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-peerIdentity.html": [
+ [
+ "/webrtc/RTCPeerConnection-peerIdentity.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-removeTrack.https.html": [
+ [
+ "/webrtc/RTCPeerConnection-removeTrack.https.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-setDescription-transceiver.html": [
+ [
+ "/webrtc/RTCPeerConnection-setDescription-transceiver.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-setLocalDescription-answer.html": [
+ [
+ "/webrtc/RTCPeerConnection-setLocalDescription-answer.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-setLocalDescription-offer.html": [
+ [
+ "/webrtc/RTCPeerConnection-setLocalDescription-offer.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-setLocalDescription-pranswer.html": [
+ [
+ "/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-setLocalDescription-rollback.html": [
+ [
+ "/webrtc/RTCPeerConnection-setLocalDescription-rollback.html",
{}
]
],
@@ -377896,6 +383005,30 @@
{}
]
],
+ "webrtc/RTCPeerConnection-setRemoteDescription-answer.html": [
+ [
+ "/webrtc/RTCPeerConnection-setRemoteDescription-answer.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-setRemoteDescription-offer.html": [
+ [
+ "/webrtc/RTCPeerConnection-setRemoteDescription-offer.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html": [
+ [
+ "/webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCPeerConnection-setRemoteDescription-rollback.html": [
+ [
+ "/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html",
+ {}
+ ]
+ ],
"webrtc/RTCPeerConnection-setRemoteDescription.html": [
[
"/webrtc/RTCPeerConnection-setRemoteDescription.html",
@@ -377908,18 +383041,120 @@
{}
]
],
+ "webrtc/RTCRtpParameters-codecs.html": [
+ [
+ "/webrtc/RTCRtpParameters-codecs.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpParameters-degradationPreference.html": [
+ [
+ "/webrtc/RTCRtpParameters-degradationPreference.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpParameters-encodings.html": [
+ [
+ "/webrtc/RTCRtpParameters-encodings.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpParameters-headerExtensions.html": [
+ [
+ "/webrtc/RTCRtpParameters-headerExtensions.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpParameters-rtcp.html": [
+ [
+ "/webrtc/RTCRtpParameters-rtcp.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpParameters-transactionId.html": [
+ [
+ "/webrtc/RTCRtpParameters-transactionId.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpReceiver-getCapabilities.html": [
+ [
+ "/webrtc/RTCRtpReceiver-getCapabilities.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpReceiver-getContributingSources.https.html": [
+ [
+ "/webrtc/RTCRtpReceiver-getContributingSources.https.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpReceiver-getParameters.html": [
+ [
+ "/webrtc/RTCRtpReceiver-getParameters.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpReceiver-getStats.html": [
+ [
+ "/webrtc/RTCRtpReceiver-getStats.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpReceiver-getSynchronizationSources.https.html": [
+ [
+ "/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpSender-getCapabilities.html": [
+ [
+ "/webrtc/RTCRtpSender-getCapabilities.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpSender-getStats.html": [
+ [
+ "/webrtc/RTCRtpSender-getStats.html",
+ {}
+ ]
+ ],
"webrtc/RTCRtpSender-replaceTrack.html": [
[
"/webrtc/RTCRtpSender-replaceTrack.html",
{}
]
],
+ "webrtc/RTCRtpSender-setParameters.html": [
+ [
+ "/webrtc/RTCRtpSender-setParameters.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpTransceiver-setCodecPreferences.html": [
+ [
+ "/webrtc/RTCRtpTransceiver-setCodecPreferences.html",
+ {}
+ ]
+ ],
+ "webrtc/RTCRtpTransceiver-setDirection.html": [
+ [
+ "/webrtc/RTCRtpTransceiver-setDirection.html",
+ {}
+ ]
+ ],
"webrtc/RTCSctpTransport-constructor.html": [
[
"/webrtc/RTCSctpTransport-constructor.html",
{}
]
],
+ "webrtc/RTCTrackEvent-constructor.html": [
+ [
+ "/webrtc/RTCTrackEvent-constructor.html",
+ {}
+ ]
+ ],
"webrtc/datachannel-emptystring.html": [
[
"/webrtc/datachannel-emptystring.html",
@@ -377938,6 +383173,12 @@
{}
]
],
+ "webrtc/historical.html": [
+ [
+ "/webrtc/historical.html",
+ {}
+ ]
+ ],
"webrtc/interfaces.html": [
[
"/webrtc/interfaces.html",
@@ -379918,6 +385159,12 @@
}
]
],
+ "webstorage/storage_session_window_noopener.html": [
+ [
+ "/webstorage/storage_session_window_noopener.html",
+ {}
+ ]
+ ],
"webstorage/storage_session_window_open.html": [
[
"/webstorage/storage_session_window_open.html",
@@ -379954,6 +385201,12 @@
{}
]
],
+ "webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html": [
+ [
+ "/webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html",
+ {}
+ ]
+ ],
"webusb/usb-allowed-by-feature-policy-attribute.https.sub.html": [
[
"/webusb/usb-allowed-by-feature-policy-attribute.https.sub.html",
@@ -379978,12 +385231,96 @@
{}
]
],
+ "webusb/usbConnectionEvent.https.html": [
+ [
+ "/webusb/usbConnectionEvent.https.html",
+ {}
+ ]
+ ],
+ "webusb/usbDevice-iframe.https.html": [
+ [
+ "/webusb/usbDevice-iframe.https.html",
+ {}
+ ]
+ ],
+ "webusb/usbDevice.https.html": [
+ [
+ "/webusb/usbDevice.https.html",
+ {}
+ ]
+ ],
+ "webusb/usbInTransferResult.https.html": [
+ [
+ "/webusb/usbInTransferResult.https.html",
+ {}
+ ]
+ ],
+ "webusb/usbIsochronousInTransferPacket.https.html": [
+ [
+ "/webusb/usbIsochronousInTransferPacket.https.html",
+ {}
+ ]
+ ],
+ "webusb/usbIsochronousInTransferResult.https.html": [
+ [
+ "/webusb/usbIsochronousInTransferResult.https.html",
+ {}
+ ]
+ ],
+ "webusb/usbIsochronousOutTransferPacket.https.html": [
+ [
+ "/webusb/usbIsochronousOutTransferPacket.https.html",
+ {}
+ ]
+ ],
+ "webusb/usbIsochronousOutTransferResult.https.html": [
+ [
+ "/webusb/usbIsochronousOutTransferResult.https.html",
+ {}
+ ]
+ ],
+ "webusb/usbOutTransferResult.https.html": [
+ [
+ "/webusb/usbOutTransferResult.https.html",
+ {}
+ ]
+ ],
"webvr/idlharness.html": [
[
"/webvr/idlharness.html",
{}
]
],
+ "webvr/webvr-disabled-by-feature-policy.https.sub.html": [
+ [
+ "/webvr/webvr-disabled-by-feature-policy.https.sub.html",
+ {}
+ ]
+ ],
+ "webvr/webvr-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html": [
+ [
+ "/webvr/webvr-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html",
+ {}
+ ]
+ ],
+ "webvr/webvr-enabled-by-feature-policy-attribute.https.sub.html": [
+ [
+ "/webvr/webvr-enabled-by-feature-policy-attribute.https.sub.html",
+ {}
+ ]
+ ],
+ "webvr/webvr-enabled-by-feature-policy.https.sub.html": [
+ [
+ "/webvr/webvr-enabled-by-feature-policy.https.sub.html",
+ {}
+ ]
+ ],
+ "webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html": [
+ [
+ "/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html",
+ {}
+ ]
+ ],
"webvtt/api/VTTCue/align.html": [
[
"/webvtt/api/VTTCue/align.html",
@@ -380062,6 +385399,12 @@
{}
]
],
+ "webvtt/api/VTTRegion/id.html": [
+ [
+ "/webvtt/api/VTTRegion/id.html",
+ {}
+ ]
+ ],
"webvtt/api/VTTRegion/lines.html": [
[
"/webvtt/api/VTTRegion/lines.html",
@@ -380104,6 +385447,12 @@
{}
]
],
+ "webvtt/api/historical.html": [
+ [
+ "/webvtt/api/historical.html",
+ {}
+ ]
+ ],
"webvtt/api/interfaces.html": [
[
"/webvtt/api/interfaces.html",
@@ -380122,6 +385471,12 @@
{}
]
],
+ "webvtt/parsing/cue-text-parsing/tests/text.html": [
+ [
+ "/webvtt/parsing/cue-text-parsing/tests/text.html",
+ {}
+ ]
+ ],
"webvtt/parsing/cue-text-parsing/tests/timestamps.html": [
[
"/webvtt/parsing/cue-text-parsing/tests/timestamps.html",
@@ -380428,6 +385783,12 @@
{}
]
],
+ "workers/WorkerLocation-origin.sub.window.js": [
+ [
+ "/workers/WorkerLocation-origin.sub.window.html",
+ {}
+ ]
+ ],
"workers/WorkerLocation.htm": [
[
"/workers/WorkerLocation.htm",
@@ -381430,6 +386791,24 @@
{}
]
],
+ "workers/worker-performance.worker.js": [
+ [
+ "/workers/worker-performance.worker.html",
+ {}
+ ]
+ ],
+ "worklets/animation-worklet-import.html": [
+ [
+ "/worklets/animation-worklet-import.html",
+ {}
+ ]
+ ],
+ "worklets/paint-worklet-import.html": [
+ [
+ "/worklets/paint-worklet-import.html",
+ {}
+ ]
+ ],
"x-frame-options/deny.sub.html": [
[
"/x-frame-options/deny.sub.html",
@@ -401744,65 +407123,251 @@
]
},
"wdspec": {
- "webdriver/actions/conftest.py": [
+ "webdriver/elements/active.py": [
+ [
+ "/webdriver/elements/active.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/actions/conftest.py": [
+ [
+ "/webdriver/tests/actions/conftest.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/actions/key.py": [
+ [
+ "/webdriver/tests/actions/key.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/actions/mouse.py": [
+ [
+ "/webdriver/tests/actions/mouse.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/actions/sequence.py": [
+ [
+ "/webdriver/tests/actions/sequence.py",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "webdriver/tests/actions/special_keys.py": [
[
- "/webdriver/actions/conftest.py",
+ "/webdriver/tests/actions/special_keys.py",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "webdriver/tests/conftest.py": [
+ [
+ "/webdriver/tests/conftest.py",
{}
]
],
- "webdriver/actions/key.py": [
+ "webdriver/tests/contexts/maximize_window.py": [
+ [
+ "/webdriver/tests/contexts/maximize_window.py",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "webdriver/tests/contexts/resizing_and_positioning.py": [
[
- "/webdriver/actions/key.py",
+ "/webdriver/tests/contexts/resizing_and_positioning.py",
{}
]
],
- "webdriver/actions/mouse.py": [
+ "webdriver/tests/cookies/cookies.py": [
[
- "/webdriver/actions/mouse.py",
+ "/webdriver/tests/cookies/cookies.py",
{}
]
],
- "webdriver/actions/sequence.py": [
+ "webdriver/tests/element_click/select.py": [
[
- "/webdriver/actions/sequence.py",
+ "/webdriver/tests/element_click/select.py",
{}
]
],
- "webdriver/actions/special_keys.py": [
+ "webdriver/tests/fullscreen_window.py": [
[
- "/webdriver/actions/special_keys.py",
+ "/webdriver/tests/fullscreen_window.py",
{
"timeout": "long"
}
]
],
- "webdriver/conftest.py": [
+ "webdriver/tests/get_window_rect.py": [
[
- "/webdriver/conftest.py",
+ "/webdriver/tests/get_window_rect.py",
{}
]
],
- "webdriver/contexts.py": [
+ "webdriver/tests/interaction/send_keys_content_editable.py": [
[
- "/webdriver/contexts.py",
+ "/webdriver/tests/interaction/send_keys_content_editable.py",
{}
]
],
- "webdriver/elements/active.py": [
+ "webdriver/tests/minimize_window.py": [
[
- "/webdriver/elements/active.py",
+ "/webdriver/tests/minimize_window.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/navigation/current_url.py": [
+ [
+ "/webdriver/tests/navigation/current_url.py",
{}
]
],
- "webdriver/get_title.py": [
+ "webdriver/tests/navigation/get_title.py": [
[
- "/webdriver/get_title.py",
+ "/webdriver/tests/navigation/get_title.py",
{}
]
],
- "webdriver/navigation.py": [
+ "webdriver/tests/retrieval/find_element.py": [
[
- "/webdriver/navigation.py",
+ "/webdriver/tests/retrieval/find_element.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/retrieval/find_element_from_element.py": [
+ [
+ "/webdriver/tests/retrieval/find_element_from_element.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/retrieval/find_element_from_elements.py": [
+ [
+ "/webdriver/tests/retrieval/find_element_from_elements.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/retrieval/find_elements.py": [
+ [
+ "/webdriver/tests/retrieval/find_elements.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/sessions/get_timeouts.py": [
+ [
+ "/webdriver/tests/sessions/get_timeouts.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/sessions/new_session/conftest.py": [
+ [
+ "/webdriver/tests/sessions/new_session/conftest.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/sessions/new_session/create.py": [
+ [
+ "/webdriver/tests/sessions/new_session/create.py",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "webdriver/tests/sessions/new_session/default_values.py": [
+ [
+ "/webdriver/tests/sessions/new_session/default_values.py",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "webdriver/tests/sessions/new_session/invalid_capabilities.py": [
+ [
+ "/webdriver/tests/sessions/new_session/invalid_capabilities.py",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "webdriver/tests/sessions/new_session/merge.py": [
+ [
+ "/webdriver/tests/sessions/new_session/merge.py",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "webdriver/tests/sessions/new_session/response.py": [
+ [
+ "/webdriver/tests/sessions/new_session/response.py",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "webdriver/tests/set_window_rect.py": [
+ [
+ "/webdriver/tests/set_window_rect.py",
+ {
+ "timeout": "long"
+ }
+ ]
+ ],
+ "webdriver/tests/state/get_element_attribute.py": [
+ [
+ "/webdriver/tests/state/get_element_attribute.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/state/get_element_property.py": [
+ [
+ "/webdriver/tests/state/get_element_property.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/state/get_element_tag_name.py": [
+ [
+ "/webdriver/tests/state/get_element_tag_name.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/state/is_element_selected.py": [
+ [
+ "/webdriver/tests/state/is_element_selected.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/state/text/get_text.py": [
+ [
+ "/webdriver/tests/state/text/get_text.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/status.py": [
+ [
+ "/webdriver/tests/status.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/user_prompts/accept_alert.py": [
+ [
+ "/webdriver/tests/user_prompts/accept_alert.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/user_prompts/dismiss_alert.py": [
+ [
+ "/webdriver/tests/user_prompts/dismiss_alert.py",
+ {}
+ ]
+ ],
+ "webdriver/tests/user_prompts/get_alert_text.py": [
+ [
+ "/webdriver/tests/user_prompts/get_alert_text.py",
{}
]
]
@@ -401814,7 +407379,7 @@
"support"
],
"./.gitignore": [
- "db3d1dc9d2e7ff65681a28e4dfcaeaaa8290afac",
+ "c8dab707b3810b2e1c7d2bb03dde0d302f7647ce",
"support"
],
"./.gitmodules": [
@@ -401822,7 +407387,7 @@
"support"
],
"./.travis.yml": [
- "130d5c86ee06fc2bff6779ec8db90a86db7f0547",
+ "1e5af7c585f3789659d7a614cfbed060f763f3ad",
"support"
],
"./CONTRIBUTING.md": [
@@ -401838,71 +407403,55 @@
"support"
],
"./README.md": [
- "3858f125599899a11b0949715318e43135711609",
+ "fa83617dc51fcc6f69732e43be203bc94de05ec1",
"support"
],
"./check_stability.ini": [
- "4ee10945191db8ce3e1d8bfae86bc3f0ad40868f",
- "support"
- ],
- "./check_stability.py": [
- "164119b28e9dee2e29eff569dc3a59ec94a04a59",
- "support"
- ],
- "./ci_built_diff.sh": [
- "1488986c7b100ff2b65b0abb3555806084f0a2bb",
- "support"
- ],
- "./ci_lint.sh": [
- "8f26616f562c85c9a5bbd757590bf3a70faa44b8",
- "support"
- ],
- "./ci_stability.sh": [
- "2d54d770ed8439a93e98961b3105b3248684744d",
+ "f8af4287f3b0f6925a2a6c5c75b3788e24de1680",
"support"
],
- "./ci_unittest.sh": [
- "c3a982f623844d363af376e1add4c4616294f657",
+ "./config.default.json": [
+ "403d365196f6fe2c631d27fe6042e3114d204016",
"support"
],
- "./config.default.json": [
- "26f2c0e4aced7e1787adacb36e11c3cbf44bbd48",
+ "./lint.whitelist": [
+ "19621e7cafd9e6a43f3e54d8dd49c487b836c5b7",
"support"
],
- "./lint": [
- "ab5e8d20914f329be7e14690a21af641dd33f752",
+ "./serve.py": [
+ "0efa39b1f26f86d73f2fce4f9e46003d62057b41",
"support"
],
- "./lint.whitelist": [
- "59074d9f9b155631ac1bf03a9b4b40175ca8b538",
+ "./server-side.md": [
+ "c51b17fbac2a2e3121dc74f7badbd2873ce92f61",
"support"
],
- "./manifest": [
- "a6fa6f29100b87d7bfb47672d91002d880e14c1e",
+ "./update-built-tests.sh": [
+ "d0184e7d0761064d0acaae095a50c0b1dfd9c3b6",
"support"
],
- "./serve": [
- "aa28dcfdd87f967544e051978bbccf9f3ce9c097",
+ "./wpt": [
+ "4312550682b01b597b993e75d0c521e9a26b09d9",
"support"
],
- "./serve.py": [
- "0efa39b1f26f86d73f2fce4f9e46003d62057b41",
+ "./wpt.py": [
+ "d73918dcbe679eb70beff902500df84d56ddc74b",
"support"
],
- "./server-side.md": [
- "c51b17fbac2a2e3121dc74f7badbd2873ce92f61",
+ ".well-known/README.md": [
+ "04a3fdbfc71c56c334f20d931dc7b427af2cce30",
"support"
],
- "./update-built-tests.sh": [
- "99b5beb84b30521fa4c4a8a061acc309ee3d0d4a",
+ ".well-known/idp-proxy/README.md": [
+ "ff5a09cfac1bf14fee4c6c057bac351e3229706a",
"support"
],
- "./wptrun": [
- "43c9d3fce7085be3c51a34cced8a69706c125219",
+ ".well-known/idp-proxy/mock-idp.js": [
+ "c6687ea38b936e06efda7e48c443250c289f3c62",
"support"
],
"2dcontext/2x2.png": [
- "c67d3f646e86413722833d2308a9bfc793a916bf",
+ "007be94902fda049d59255d281de42ab28cf109d",
"support"
],
"2dcontext/2x4.png": [
@@ -402594,7 +408143,7 @@
"support"
],
"2dcontext/conformance-requirements/2d.missingargs.html": [
- "02cc4f67ed14d1e35eb97402879991001ba08a33",
+ "4bd35deb225149592999a5f9db32d5c5a3228a6b",
"testharness"
],
"2dcontext/conformance-requirements/2d.type.delete.html": [
@@ -402602,7 +408151,7 @@
"testharness"
],
"2dcontext/conformance-requirements/2d.voidreturn.html": [
- "5333c70e61a2f762242f9bc085b453fbe16a6d48",
+ "63d998f1a4997ffedffd97b6f11ce3b8fd650666",
"testharness"
],
"2dcontext/drawing-images-to-the-canvas/.gitkeep": [
@@ -402753,221 +408302,17 @@
"4674a8a0b00f134aec38b80915cb16568c123218",
"testharness"
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1.html": [
- "45cc6f5a95362cd6f8f101692afbfe25572ebc52",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10.html": [
- "d6bde3c8a7cb6255b7e52065cef381eb63045972",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10_ref.html": [
- "fc6d733f48745d483b6703ba59b32fc29ad8012f",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11.html": [
- "10c87532f043983ac8312be3a874d819f8e1e33c",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11_ref.html": [
- "c8c570c550aac764217ccc0f9a683ffdc798cf3b",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12.html": [
- "2072da2d7ebe715814bcd36472095e701bff8f12",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12_ref.html": [
- "948c7a4095a3f1da82812aa26ee32eee033c517a",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1_ref.html": [
- "06a8ac92ae2e06670652b280eec5a8d91c7c9804",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2.html": [
- "7a79dc3b97ec80068e2f7437c1bcfc612d09fe72",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2_ref.html": [
- "49b6f0e32f8ca6021e4d76f48c7bf9c2d9135303",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3.html": [
- "ad3af2745bdca16f90bb5a8bdfcdd6fd2b3306b4",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3_ref.html": [
- "505f8af29ffffde788a4a9be8b7099f96b78c6b5",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4.html": [
- "05e96c0f9f62a2743b029119b348ed3e58279256",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4_ref.html": [
- "56bf9b6acb0da3cab55367ec0f1b15655cb2be20",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5.html": [
- "58823be95d7cb39eca4b7683b9a3a9103a4c4f25",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5_ref.html": [
- "4515e1303a684a0c83613f759cceccde4ef1ebf3",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6.html": [
- "fd09a7a1c596f9fa7ef12568d06bab2db45c4921",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6_ref.html": [
- "948c7a4095a3f1da82812aa26ee32eee033c517a",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7.html": [
- "ae32d6351ecb6e3df1bf073b31561422e1743a10",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7_ref.html": [
- "e1dbfa8e6bdd816be642e8b7ebf5537fa331dd59",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8.html": [
- "da697640dc83e4f7b7d0f020004e5adaff20c11d",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8_ref.html": [
- "a8245d6015224b501d26a6b84622f25e2d97f91f",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9.html": [
- "a7c9d8bd351c54a8b509c9935736fcefe4eb5476",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9_ref.html": [
- "635d7901d4bc9a48828c5f65bbc7414eb6efa7fc",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1.html": [
- "8cff9e2344fbbe84b2ce315f260e69c6ad92dd51",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10.html": [
- "ca239d9a40410e4331863f2d11daabae3e590af3",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_ref.html": [
- "9a70c803aaf5bd8a843b18d6d16779575d4dc6f8",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html": [
- "04415ce09b3b52561f5d179e7a6a8050199189c9",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11_ref.html": [
- "b51c787c97490eed29787cadf62b0c5e5cbd9180",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12.html": [
- "efee9a63933437315c9adec573113d8dee786659",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12_ref.html": [
- "5529c622869289c1a64987216b525766003d5f8c",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13.html": [
- "50eb35b3f6f75bec5002df0893c37c00c005a8df",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13_ref.html": [
- "30150e3530438d42704fda8b3623286658f6c724",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14.html": [
- "fa83293cfbdbb67a9d5d27a20ac19ff5d9c46d07",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14_ref.html": [
- "0feedb34e5ade7a4e58cb4eb92e2b958a06929fe",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15.html": [
- "b37463cc33b46e9aba5bbe73244fd422ef38406e",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15_ref.html": [
- "d6817ddb2ac78b524f7cc80ebd4f348aded4d89f",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_ref.html": [
- "9a70c803aaf5bd8a843b18d6d16779575d4dc6f8",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2.html": [
- "b03f11e43e455e2d1f453ecc2a4de00e00005ebc",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_ref.html": [
- "a95c84aace62371b4a58c381acaab51499cdeedb",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3.html": [
- "134fa026f56880acb111a8e91efe3a8bcc03bb6b",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_ref.html": [
- "59d699ac4347a4af4246c0333e14a91a201da15c",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4.html": [
- "5d7254f7bbc8c6feffb2a4fcfeecb06fe6ed3d6c",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_ref.html": [
- "6204815172949961351ea34906f99d05063bc78f",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5.html": [
- "6a02b961aa4a5eb013366cd85dbea06fd2c08da0",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_ref.html": [
- "5554083bf4b74facca2670cd28d1a57449931334",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6.html": [
- "ce7cbe3b76274177301acca263f7cdd6c4033aa1",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_ref.html": [
- "359acc11d83341062450e86162d831a9fc1ae158",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7.html": [
- "f5469ba799e0845bc59766d76713ee052f3e6966",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_ref.html": [
- "53efd12eca32f7898ddeabdca9b2e61f952b296d",
- "support"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8.html": [
- "37958b2fb55bd90567c7c0b64b599165b20992b9",
- "reftest"
- ],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_ref.html": [
- "89f6e5589e3619835d67e8d919ab6a507fb3bbb5",
- "support"
+ "2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html": [
+ "3b15af010f2ce13316fed6fcab9d85e05484b60d",
+ "testharness"
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9.html": [
- "25812771d9663a529f802ed3fbdaaf68c130341f",
- "reftest"
+ "2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html": [
+ "ec86f8f5c84628cd5f3b8673de8dde34dc372fd9",
+ "testharness"
],
- "2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9_ref.html": [
- "5e4587978bcf32905a2676da269a5a09d7938718",
- "support"
+ "2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html": [
+ "d86bbcbac918dc468c484e46cc03e6125122d1ef",
+ "testharness"
],
"2dcontext/drawing-model/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
@@ -404566,7 +409911,15 @@
"support"
],
"2dcontext/imagebitmap/createImageBitmap-drawImage.html": [
- "78a4df712927cfdf78c27490e3186e77da403511",
+ "56ebe218b07fe534ded2c5734c0ecbd1b4c30d49",
+ "testharness"
+ ],
+ "2dcontext/imagebitmap/createImageBitmap-invalid-args.html": [
+ "e839d537057d03f55108b871d2d32272cac7bc7f",
+ "testharness"
+ ],
+ "2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html": [
+ "977be16edd03dcfa70f3c6f987bad1455e44b93f",
"testharness"
],
"2dcontext/line-styles/.gitkeep": [
@@ -405889,6 +411242,10 @@
"89b84bac918d08d7d304213771a05097ee4fcee3",
"testharness"
],
+ "2dcontext/text-styles/2d.text.font.parse.tiny.html": [
+ "40109440e410076e11789c45e534099c230dba07",
+ "testharness"
+ ],
"2dcontext/text-styles/2d.text.measure.width.space.html": [
"95d92a11068904059e0bbd21a774e9166f6079a7",
"testharness"
@@ -406018,7 +411375,7 @@
"support"
],
"2dcontext/tools/current-work-canvas.xhtml": [
- "891246c4dfe34f9b43b5e642b058072c4d664817",
+ "c712cdec9ced8da63eb6b8dfce17906a4210883e",
"support"
],
"2dcontext/tools/gentest.py": [
@@ -406026,19 +411383,19 @@
"support"
],
"2dcontext/tools/gentestutils.py": [
- "f613a789c0e231a3600070583661ba3b1842fed3",
+ "d7862903e270295fd11e2d98c5c4dbcde4ae0717",
"support"
],
"2dcontext/tools/name2dir.yaml": [
- "1333578a501fec686bc7ed22edf4cc8e7203ae13",
+ "3a852f1cc85eae2a17e67d56ce0c9bb5e4e69b41",
"support"
],
"2dcontext/tools/spec.yaml": [
- "4405a99f9fa29069670a1fb8aaef5e1c89ac33d0",
+ "4692cedcc0d1d5af9ac917fa19d3979e2129a933",
"support"
],
"2dcontext/tools/specextract.py": [
- "c6c58223012640480eb1e7d0b9ce4c343cafdb7c",
+ "5c656f7f4859ec0eb0559b1b1dfe6e085032d7c8",
"support"
],
"2dcontext/tools/templates.yaml": [
@@ -406046,15 +411403,15 @@
"support"
],
"2dcontext/tools/tests.yaml": [
- "ce69d48960f561a0bf43b7346d7e387e2ac9e110",
+ "7a0d644759c65dc61373eaef42d7c9581683f660",
"support"
],
"2dcontext/tools/tests2d.yaml": [
- "ec014d7d44955c771414aa70748cabdcf48b3a2b",
+ "99a4d558b9ad07ae18fa71a6276d0b08db0f49e1",
"support"
],
"2dcontext/tools/tests2dtext.yaml": [
- "67b14fc993eb652d87c7a282dd6582d459e7f800",
+ "7ae8c51177c71b7b0e2394406e88f0096853b244",
"support"
],
"2dcontext/transformations/.gitkeep": [
@@ -406114,7 +411471,7 @@
"testharness"
],
"2dcontext/transformations/2d.transformation.setTransform.multiple.html": [
- "5bf26a6a0b7a35d0127d04949616cb9f9034f218",
+ "6dfc04af35454f22aa8cf41289a974b34b430373",
"testharness"
],
"2dcontext/transformations/2d.transformation.setTransform.nonfinite.html": [
@@ -406214,7 +411571,7 @@
"testharness"
],
"FileAPI/OWNERS": [
- "5e749f9ec12704ea48e99cf4c31e703e5325d419",
+ "f1d0cf569f445712d986e9a85f3cbc717137d7fe",
"support"
],
"FileAPI/blob/Blob-XHR-revoke.html": [
@@ -406278,7 +411635,7 @@
"manual"
],
"FileAPI/idlharness.html": [
- "80280c78fd64daf52b994e96418b989aa61f2fd4",
+ "0eb0d3b2f6c394a6b30f71102bd002ae6e339283",
"testharness"
],
"FileAPI/idlharness.idl": [
@@ -406286,7 +411643,7 @@
"support"
],
"FileAPI/idlharness.worker.js": [
- "3cb4879c7504d1152cd7c032f24b2a56c0670646",
+ "b1a1f7256b08c42c278ffe972b9ed3f51d17389b",
"testharness"
],
"FileAPI/progress-manual.html": [
@@ -406462,7 +411819,7 @@
"testharness"
],
"IndexedDB/idb-binary-key-detached.htm": [
- "e7ed8b831bce3a06d21d629cd0112480dfc0f6a5",
+ "ff7f932150cca2156afd7eda9d97e49566942803",
"testharness"
],
"IndexedDB/idb-binary-key-roundtrip.htm": [
@@ -407582,15 +412939,15 @@
"testharness"
],
"IndexedDB/interfaces.html": [
- "df929a719e8f3f8af4151b221c47f6f4c4f4039b",
+ "d2ff3cf10fbaf798d3bf5868699979829703d859",
"testharness"
],
"IndexedDB/interfaces.idl": [
- "0386e2b5923f9532549bfeeabc37dcc3528e3c78",
+ "f367517cad717e2066ad8179df9ba5aa3b402c97",
"support"
],
"IndexedDB/interfaces.worker.js": [
- "7edbb0cce85708e4b578ceae18a833fd623cd976",
+ "fdacaee0ed6b2a97b579495f5944df04e70b7deb",
"testharness"
],
"IndexedDB/interleaved-cursors.html": [
@@ -407634,7 +412991,7 @@
"testharness"
],
"IndexedDB/keypath-exceptions.htm": [
- "24d150a9bddd39dd51821e01ddac4f45bdd04e91",
+ "5992b8baa05e57279efd2ba4098529676314a9f4",
"testharness"
],
"IndexedDB/keypath-special-identifiers.htm": [
@@ -407653,10 +413010,6 @@
"ef0680b2623521388e23654b5428cbfb553b4ee8",
"testharness"
],
- "IndexedDB/large-nested-cloning.html": [
- "831510a9d36a19081cf037940b19092e37303e19",
- "testharness"
- ],
"IndexedDB/large-requests-abort.html": [
"7b8b1ccb8b7f9d737b648ceade5192a57c4ad690",
"testharness"
@@ -407669,6 +413022,22 @@
"d08882dc03b23cedaf1369c76937c95fec69df1e",
"testharness"
],
+ "IndexedDB/nested-cloning-common.js": [
+ "6e96fe11781f75b6beca649e9264c5e990ea7ffc",
+ "support"
+ ],
+ "IndexedDB/nested-cloning-large-multiple.html": [
+ "6e16a5af0faab1406b6a2ae18397178b24440796",
+ "testharness"
+ ],
+ "IndexedDB/nested-cloning-large.html": [
+ "5981f9fd67f8487e27494aea57cf3dae9eacb3e6",
+ "testharness"
+ ],
+ "IndexedDB/nested-cloning-small.html": [
+ "9b9c7e27e3b80fc49c06406e05c251d2c66dacb0",
+ "testharness"
+ ],
"IndexedDB/objectstore_keyorder.htm": [
"dda6c0ad4832b2a48980efdcb0efdae995c43fdd",
"testharness"
@@ -407882,7 +413251,7 @@
"testharness"
],
"WebCryptoAPI/digest/digest.js": [
- "762440c527d20877cfaf5b0c900d8078e662c6bc",
+ "e68b81bd47af7373a63466ebe2fd13050d5d246d",
"support"
],
"WebCryptoAPI/digest/digest.worker.js": [
@@ -408286,31 +413655,27 @@
"support"
],
"WebIDL/current-realm.html": [
- "167c7c1f53ae2bf457f6b3f917f0ef988c585c7c",
+ "3d9564314c7ce59ce6a29dfa94c35e496e214bf5",
"testharness"
],
- "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html": [
- "9ae0ceb48cac77c8470b114576ab17c2e7c1a88c",
+ "WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js": [
+ "34432979f039c4e1ba4eb90d4f2acc96d1d441d8",
"testharness"
],
- "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html": [
- "24f79517a695477aa4af4b1005ff24977fe44b72",
+ "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js": [
+ "7fc6412ffa2a2586e5ea2dca7f5cdafba38c7585",
"testharness"
],
- "WebIDL/ecmascript-binding/es-exceptions/constructor-object.html": [
- "480d5c2f21d8f18e5231e8293cf44d1050b9106a",
+ "WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js": [
+ "d297d4c52ecf1667cb79ddb076260f9005ee5df4",
"testharness"
],
- "WebIDL/ecmascript-binding/es-exceptions/constructor-object.js": [
- "3d637243f719e2df7ecc9af4e44522e746f38ab7",
- "support"
- ],
- "WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js": [
- "b986594f41fc9df68ee2d3a3aaccae51bf7dd3e9",
+ "WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js": [
+ "f20cbaff1efb774748241b90778a0964f5671fee",
"testharness"
],
"WebIDL/ecmascript-binding/es-exceptions/exceptions.html": [
- "15537c428eeb22a3addb13497ff02181666a1de1",
+ "fc4d6cf93ff64192ee325d7309ac267cf8ff5d6c",
"testharness"
],
"WebIDL/ecmascript-binding/has-instance.html": [
@@ -408329,6 +413694,10 @@
"4eac8c853a0627577d2bd96ed76c45bd187a5734",
"testharness"
],
+ "WebIDL/ecmascript-binding/legacy-platform-object.html": [
+ "24807487f4acea28e3b1315e0876d99a79fb592d",
+ "testharness"
+ ],
"WebIDL/ecmascript-binding/put-forwards.html": [
"95fcfc28dae32ab9aadf21d2512a519d6a9fd5ab",
"testharness"
@@ -408337,6 +413706,10 @@
"8038a4e188651f4ccd24a3c3bcd3af773c55bc97",
"testharness"
],
+ "WebIDL/interfaces.html": [
+ "699d2feb7ed9f91ae04957131fcb23cebc19b621",
+ "testharness"
+ ],
"WebIDL/invalid/idl/enum.widl": [
"cebcfcecfe4b09a4d3ea15e766e9b13044dfe0b8",
"support"
@@ -408849,12 +414222,204 @@
"07fc81c4d96ced6791efde32982fe3edff515cfe",
"testharness"
],
+ "XMLHttpRequest/access-control-and-redirects-async-same-origin.htm": [
+ "48f2e103991c8c308054fd873be8b561b412b9c7",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-and-redirects-async.htm": [
+ "46b2fb128461a926e0cfaf214b6df52197b45bf8",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-and-redirects.htm": [
+ "ff051032814b1242f527970edc58675e3e14fb98",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm": [
+ "6693ba20a5241c7ab0261669cf24082a0a7c4e2f",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow-access-control-origin-header.htm": [
+ "88aa693115ee05b05adea5273bdfab501b167a60",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow-async.htm": [
+ "eb115b994e3d5de90ccf54a904266c347959f35b",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method-async.htm": [
+ "280a31d318826ecf1405de6faa735495f2b40f9c",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method.htm": [
+ "bab7383cd05a3cb4d4e6a8e5287bc8e5810baad9",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-header.htm": [
+ "567806f8997dc26cc5a9334aaa7dfe6c222404a5",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-method.htm": [
+ "782aca237c5d30a3a6ba2ee9be4824e01446e411",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow-preflight-cache-timeout.htm": [
+ "84567f027ffcff9f5a1ed9c17b984f5835d5882b",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow-preflight-cache.htm": [
+ "b2412a98e2a7a9ec4872bd8f42fc111b33a5ce7d",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow-star.htm": [
+ "694f8b8d67002e7b27d98ea2eb32f27fee311cad",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-allow.htm": [
+ "8c2f2df46c8086f657806f763e68d775e1294bd0",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm": [
+ "29b6638f3de85cc39b77b86353dc49865e1fdc39",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-cors-safelisted-response-headers.htm": [
+ "43748883f8bf38fe34e0c0f568dec6e1cc7c9b28",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-denied.htm": [
+ "890170b5b2857a6e837ea3ed0dc4692e206a864a",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-get-fail-non-simple.htm": [
+ "4641b3a58df7f1eeea460e995692418cfd63f507",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-non-cors-safelisted-content-type.htm": [
+ "b6e15129e3e0917bb35f5b021ba7849b924d6945",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-post-success-no-content-type.htm": [
+ "4e7a3f374bf054f9f49ed487c8f417374514293c",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-post-with-non-cors-safelisted-content-type.htm": [
+ "d7877dca1a16e5c3f52881558f9951e4a5f78ba8",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-basic-preflight-denied.htm": [
+ "36a1951a7b814d7594e7474646ee9d03108208c6",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-async-header-denied.htm": [
+ "f69a2fdd41df78f29187bfa848e88c5c39b60736",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-async-method-denied.htm": [
+ "29bb39b957742d739bb0d54464b48a53533206fe",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-async-not-supported.htm": [
+ "7520098b97455ca0795304751cef93197be469f6",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-credential-async.htm": [
+ "ae93b44faf45f95927a1ee82052a414273333e61",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-credential-sync.htm": [
+ "fa393dd9f33c2c7f151f00f034ae0f23a5bbf74a",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-headers-async.htm": [
+ "bd10420c088f4e871d1377bf1b7e45d30c1458c9",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-headers-sync.htm": [
+ "8dcf3427076b048f2a38890a15427d703c36728f",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-request-header-lowercase.htm": [
+ "1f3beb7047a0f4828d44f67664a977469af75263",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-request-header-sorted.htm": [
+ "45f904c2322ee7b14cc78075f99243bbad7ecd96",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-request-headers-origin.htm": [
+ "7928f916ba92a1c7c13bb2c099ec08fc5f14429e",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-request-invalid-status-301.htm": [
+ "e59e2de75149869531b056b53501b92302fdee04",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-request-invalid-status-400.htm": [
+ "48fbbfd1a516469058e7559969eb1f36f02c3f14",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-request-invalid-status-501.htm": [
+ "a59b9c8f77991992faade11e955061078b9d9623",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-request-must-not-contain-cookie.htm": [
+ "78f95f6f962f1696a1ff37a6a3216fba4e741f56",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-sync-header-denied.htm": [
+ "98e89f8ddccbba846b6f21f1d77b6a64554bcb52",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-sync-method-denied.htm": [
+ "536deb1a3322c4ef45e259849e659d1fa4bea7c7",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-preflight-sync-not-supported.htm": [
+ "997d43197782650b479ccdef1cc43d8bde7e31e4",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-recursive-failed-request.htm": [
+ "03650f5362e483a6e29a05554723385ab601495f",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-response-with-body-sync.htm": [
+ "ae7e24c4b3b3295caa7e76555ac8a21d9062556a",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-response-with-body.htm": [
+ "e5b2ae207a2ae58bd20a4d6903991cff5e27b5a7",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-response-with-exposed-headers.htm": [
+ "9c4a5cf99e43f1315dfd73f543450e4056dcef36",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-sandboxed-iframe-allow-origin-null.htm": [
+ "2b507239c3e3fa6602068d6d92897c5d042a7a0d",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-sandboxed-iframe-allow.htm": [
+ "b1140eacc383af590578319b25ee803ba50c3fee",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm": [
+ "a476086f22c912c13d4ac175af95c80f8e226c25",
+ "testharness"
+ ],
+ "XMLHttpRequest/access-control-sandboxed-iframe-denied.htm": [
+ "32fcbfa28e93aad6e0040b5b1c9478ce76e7e06e",
+ "testharness"
+ ],
+ "XMLHttpRequest/allow-lists-starting-with-comma.htm": [
+ "34a8d82f397f35902c73d9ced2f3cf900d04ae53",
+ "testharness"
+ ],
"XMLHttpRequest/anonymous-mode-unsupported.htm": [
"54a03fefabfad02e09baa4e9d37e19b6403dad9b",
"testharness"
],
"XMLHttpRequest/data-uri.htm": [
- "46ebfd602e8d6821cb2e22181625609242d8459e",
+ "d42eb014a32cf82d7eba31ad9b80f51bff43eeea",
"testharness"
],
"XMLHttpRequest/event-abort.htm": [
@@ -408906,7 +414471,7 @@
"testharness"
],
"XMLHttpRequest/event-upload-progress-crossorigin.htm": [
- "329b648fb3dc0169c5bf185ad9bb88245e7f889d",
+ "7a18f690ea1c7679d52ff0fd39ea931650d6b9c5",
"testharness"
],
"XMLHttpRequest/event-upload-progress.htm": [
@@ -409130,7 +414695,7 @@
"testharness"
],
"XMLHttpRequest/open-url-worker-origin.htm": [
- "f105c0e4b249f82545f2763c4b1a23a3a217e3a7",
+ "1e377fb04baa8c55c2d656b572f285cfe71cbc7c",
"testharness"
],
"XMLHttpRequest/open-url-worker-simple.htm": [
@@ -409142,7 +414707,7 @@
"testharness"
],
"XMLHttpRequest/overridemimetype-blob.html": [
- "e1b9cd224a563b32715a7d738e0070adca360be4",
+ "462d95dec7146c2a7beba5d8b2285fd2b8460002",
"testharness"
],
"XMLHttpRequest/overridemimetype-done-state.htm": [
@@ -409189,6 +414754,98 @@
"4769a0c31c00777fb37e1af76209e68040918b64",
"support"
],
+ "XMLHttpRequest/resources/access-control-allow-lists.py": [
+ "941a26e0b85d608bb2617362df74263564b5981d",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-allow-with-body.py": [
+ "fbd35be708e601c7c3fb625ce28b9f43de784e13",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-auth-basic.py": [
+ "08d5c99e4c576557cab5ddc56fda038aab767dee",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-allow-no-credentials.py": [
+ "593fc8c4d78f0213017c0fb2fa78ac46274eb6ea",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-allow-star.py": [
+ "d9aa8e1eaf8e73256edabafec32960bba8499f40",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-allow.py": [
+ "b7351f59af91646549075b6b732eeb6c750e3faf",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-cors-safelisted-request-headers.py": [
+ "19a0b1d88765fa152c17c7f684651be8c4bae3da",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-denied.py": [
+ "35e7b6c552caf55e8ea7d34ec51d354c8eb2bc6e",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-options-not-supported.py": [
+ "ee16a30ec1252bd66ef899f7c7bc8d3d0fb76562",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-preflight-cache-invalidation.py": [
+ "5b043f99d8f9d3f1c253324447df2d0586bf735a",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-preflight-cache-timeout.py": [
+ "4e205534cff698089c017cd3f959f74862f3870a",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-preflight-cache.py": [
+ "32e713011ca3c4235f8ef77c4ec49c08c6a49469",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-put-allow.py": [
+ "eda02da8e1d89f28ff0e07442539b7eca4ca556f",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-basic-whitelist-response-headers.py": [
+ "c530b8431372e0511c91b150c5f1015d504ae374",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-cookie.py": [
+ "0551a6a4284fcae2ed5314d5d02767a4da1ad981",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-origin-header.py": [
+ "529883eed380c4505c1ddbc87ae5885254756626",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-denied.py": [
+ "b41ba9f1e3fcad508d575331e0f3f43bc75c07b9",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-request-header-lowercase.py": [
+ "3f39f2f6bdda8c167df09525b8d23d04c16b2462",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-request-header-sorted.py": [
+ "357dbf2f01ab59c8689af632c1116d2053f3829d",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-request-headers-origin.py": [
+ "abc6b25627e019ae67b90beebad42164143321d0",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-request-invalid-status.py": [
+ "c572b1e3d79f66df0a40766e6e4c3cc785458d0e",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-preflight-request-must-not-contain-cookie.py": [
+ "1343bfee18c64bfbb625591bc65117e5b692c487",
+ "support"
+ ],
+ "XMLHttpRequest/resources/access-control-sandboxed-iframe.html": [
+ "3aa5a903afc03e167a88322db44c29b287509f47",
+ "support"
+ ],
"XMLHttpRequest/resources/auth1/auth.py": [
"cbe9305740f7e0a9e8c7be9dbfcb606f8abb2758",
"support"
@@ -409318,7 +414975,7 @@
"support"
],
"XMLHttpRequest/resources/inspect-headers.py": [
- "c1bad8ca957dca4cc0a95909ba072f23d03eabd2",
+ "aab673bbdc7411c40ef2d7350486e779f3703e89",
"support"
],
"XMLHttpRequest/resources/invalid-utf8-html.py": [
@@ -409329,6 +414986,10 @@
"9af7a5f9be37e7ebbbea4c683bfb2d9415229ece",
"support"
],
+ "XMLHttpRequest/resources/no-custom-header-on-preflight.py": [
+ "76437951442df8d19438573add8bf2b2a0be4b18",
+ "support"
+ ],
"XMLHttpRequest/resources/nocors/folder.txt": [
"92400e232461d345128d2d7303eb5f5bba12763f",
"support"
@@ -409337,6 +414998,14 @@
"cc9f324cf5b044646edfc6aa9e98cdc2a40e41b9",
"support"
],
+ "XMLHttpRequest/resources/pass.txt": [
+ "27d2303f215d7d1a8f12f0b80b9b56a2cdf6c9a7",
+ "support"
+ ],
+ "XMLHttpRequest/resources/redirect-cors.py": [
+ "a04af2badb3f212a9ef48e3cde491f199a85b6bc",
+ "support"
+ ],
"XMLHttpRequest/resources/redirect.py": [
"988961f44badedfcea4e1660339ea921178b7a42",
"support"
@@ -409345,6 +415014,18 @@
"7e84cbcb29783dd435c9be6ad960731d5d92706c",
"support"
],
+ "XMLHttpRequest/resources/reset-token.py": [
+ "ba56e4c405f81ea5ca396417ae7cd48f2029f7cb",
+ "support"
+ ],
+ "XMLHttpRequest/resources/responseType-document-in-worker.js": [
+ "6f1477cf04fd21df905b4d14e00a67b29c98d961",
+ "support"
+ ],
+ "XMLHttpRequest/resources/responseXML-unavailable-in-worker.js": [
+ "8ede1fa55ed1831f90022f2efb2b6e64b1cf4aea",
+ "support"
+ ],
"XMLHttpRequest/resources/send-after-setting-document-domain-window-1.htm": [
"a4bd8b70cc61f9d403b529c079d47691a27abb8a",
"support"
@@ -409381,6 +415062,10 @@
"11a068dcf9fa14b05a24f15c0609143ba705e112",
"support"
],
+ "XMLHttpRequest/resources/win-1252-html.py": [
+ "c062b6b3440e7398a05d0c1db7a5e12d3aa7e58c",
+ "support"
+ ],
"XMLHttpRequest/resources/win-1252-xml.py": [
"e4b0b7ebd6543479a74bdf76592b027b9383e0c9",
"support"
@@ -409477,8 +415162,20 @@
"fb0018f3cc052de846232231771ea8436ec4c8c0",
"testharness"
],
+ "XMLHttpRequest/responseType-document-in-worker.html": [
+ "4eceb42987047585ac193254951f900b5960975d",
+ "testharness"
+ ],
+ "XMLHttpRequest/responseXML-unavailable-in-worker.html": [
+ "6111310764e8aac694655f173aef9653325ef7e8",
+ "testharness"
+ ],
+ "XMLHttpRequest/responsedocument-decoding.htm": [
+ "5435b4fe9a2fe3e85766aca35f4f42a14486164b",
+ "testharness"
+ ],
"XMLHttpRequest/responsetext-decoding.htm": [
- "fe5a326a1c2a18f1c16ae08c5edcf6c2be585468",
+ "538d6d5121157e04c44fd947140f2c913dc3b65e",
"testharness"
],
"XMLHttpRequest/responsetype.html": [
@@ -409598,7 +415295,7 @@
"testharness"
],
"XMLHttpRequest/send-content-type-string.htm": [
- "98c309853c6ab4e453cc5b9a2ec771ab5aa75284",
+ "1f90fd9a583794013b505524c9d6d1bad3e4db9c",
"testharness"
],
"XMLHttpRequest/send-data-arraybuffer.htm": [
@@ -409806,7 +415503,7 @@
"testharness"
],
"XMLHttpRequest/setrequestheader-content-type.htm": [
- "1b9023583c5d404cd036da58a076391568b42e71",
+ "388341fe59bbc12228bad7a605a26cab014220ad",
"testharness"
],
"XMLHttpRequest/setrequestheader-header-allowed.htm": [
@@ -409946,7 +415643,7 @@
"testharness"
],
"accelerometer/Accelerometer.https.html": [
- "cb802e1f9df53ef6e8e3a34daf54f9e02b019383",
+ "cdf386711da6ef6a795bcf179e7c7ce373751f56",
"testharness"
],
"accelerometer/Accelerometer_insecure_context.html": [
@@ -409958,19 +415655,15 @@
"manual"
],
"accelerometer/OWNERS": [
- "36770a71443523aa2f91f9958ba24066f0b4dcec",
+ "b119dbb984792f33c6e7463f3105d37c3c3b7ad8",
"support"
],
"accelerometer/idlharness.https.html": [
- "eedb225d9e8a05d528e62cc2d689dbfe36858052",
+ "a4b5c164268d6742e7da504d15d6b9eeb4cfc6ce",
"testharness"
],
- "accelerometer/support-iframe.html": [
- "5782b270802060f88a1842c2393fb7d18c8c75a8",
- "support"
- ],
"ambient-light/AmbientLightSensor.https.html": [
- "3bc1a9bbc660ec9ee83f65914c35a52201eccb4b",
+ "86a1f84e2e034d58b2a7f6fc01880028b444c7cd",
"testharness"
],
"ambient-light/AmbientLightSensor_insecure_context.html": [
@@ -409982,17 +415675,13 @@
"manual"
],
"ambient-light/OWNERS": [
- "72539a05ddcce7467524b36255696565a2c484e8",
+ "267fa5a34646c535ff4e4772543bc2c5d8aecc30",
"support"
],
"ambient-light/idlharness.https.html": [
- "0c0f48d162d3ef69b8fe1486a99cc315fab5ab31",
+ "f48a58b450fa15e820bef6d9c6f5dac834d8d6fb",
"testharness"
],
- "ambient-light/support-iframe.html": [
- "62024c4c0cff6fb5a21a6db62cd9756de0a2f479",
- "support"
- ],
"annotation-model/.editorconfig": [
"18e9e31b4beb20bcfa5ad281584d816204a3f531",
"support"
@@ -411177,6 +416866,10 @@
"c578cc1a560dde5f9b7f478ed23570822e10fa26",
"support"
],
+ "annotation-protocol/OWNERS": [
+ "16577d2283b826f0541dbc795177c7aac7e1b228",
+ "support"
+ ],
"annotation-protocol/README.md": [
"54f819a4ce6362242423199196c07ac965f99f9b",
"support"
@@ -411997,117 +417690,33 @@
"b9ba0287c92e5dbda1dc207ab45e9c90e8618878",
"reftest"
],
- "app-uri/OWNERS": [
- "e28f77cc2634a830fd6e144e22d9d217e5949b37",
- "support"
- ],
- "app-uri/README.md": [
- "4436e7aeff0faf41a37b0e9d09651f8ee8eacd80",
- "support"
- ],
- "app-uri/appURI_test.html": [
- "543d4c7d28f16424eb84666fa6ff6646c2f665f4",
+ "audio-output/HTMLMediaElement-sinkId-idl.html": [
+ "8f37d8d2fc1cb9b5ad0d85234f733f534f4f0db8",
"testharness"
],
- "app-uri/resources/ExamPLE/mmY/index.html": [
- "27d2303f215d7d1a8f12f0b80b9b56a2cdf6c9a7",
- "support"
- ],
- "app-uri/resources/ExamPLE/mmY/sth.txt": [
- "b7634884952a8c2af526d0adbbd4319fe782f141",
- "support"
- ],
- "app-uri/resources/ExamPLE/{mY}/z...z/index.html": [
- "27d2303f215d7d1a8f12f0b80b9b56a2cdf6c9a7",
- "support"
- ],
- "app-uri/resources/ImaGes/{{a}}/Test_1/$a/sth34!.png": [
- "ec7895dcf3afeb4ff750802b8711c41ad1c9a87d",
- "support"
- ],
- "app-uri/resources/ImaGes/~t/{!a}/corrupted_file.png": [
- "29dac334ddd67f7622fd69116faa8f7accd7e6c6",
- "support"
- ],
- "app-uri/resources/ImaGes/~t/{!a}/~sth.png": [
- "ec7895dcf3afeb4ff750802b8711c41ad1c9a87d",
- "support"
- ],
- "app-uri/resources/icons/w3c-128.png": [
- "668553c70b6df1f5abf5d03b974aa2c7dadd5738",
- "support"
- ],
- "app-uri/resources/icons/w3c-16.png": [
- "5413eb642995b8c7ff8977e6548a7895fdd27366",
- "support"
- ],
- "app-uri/resources/icons/w3c-48.png": [
- "53c2735980b4d1b4ea30f47d79ac353df0242028",
- "support"
- ],
- "assumptions/OWNERS": [
- "946f23f945163bf9f9da080291b21473f6e1cbd0",
- "support"
- ],
- "assumptions/ahem-ref.html": [
- "f38cdd07d07558540e19c2b2ec063dbc54f8be7f",
- "support"
- ],
- "assumptions/ahem.html": [
- "e097b6e6eb9ecf107cea94b3984661cc62c7ac67",
- "reftest"
- ],
- "assumptions/canvas-background-ref.html": [
- "0868a5443b1aacb8fd95327bc7c71d071158b0f1",
- "support"
- ],
- "assumptions/canvas-background.html": [
- "2f1a763d3e15a27a9220b1f084847f33092003d0",
- "reftest"
+ "audio-output/setSinkId-manual.https.html": [
+ "6743b9f6843a1c6134ac9cc627375b0368986e55",
+ "manual"
],
- "assumptions/html-elements.html": [
- "dacd5dc7e1d723046d5e9eea0a0eb8046d501fca",
+ "audio-output/setSinkId.https.html": [
+ "556ab735b0461aab4dbbb02d277da6ea07106469",
"testharness"
],
- "assumptions/initial-color-ref.html": [
- "23bd9bc50c23f6bdbe2c63bbd652a28e1a222586",
- "support"
- ],
- "assumptions/initial-color.html": [
- "14b5a61881546831e2b2733ae9592b2f932f86c4",
- "reftest"
- ],
- "assumptions/medium-font-size-ref.html": [
- "49f1b97b20c6ef7b0452e078fcfc56d8f3c14f77",
- "support"
- ],
- "assumptions/medium-font-size.html": [
- "011f54dc11a955ac173621651c67b2282d046dd9",
- "reftest"
- ],
- "assumptions/min-font-size-ref.html": [
- "5a0be668075cd811b2dc28267210c4cfdd692397",
- "support"
- ],
- "assumptions/min-font-size.html": [
- "df47a9a9342da260175776c3406856be096d0012",
- "reftest"
- ],
- "assumptions/tools/ahem-generate-table.py": [
- "ed433a26632138f063bbb6093b7f1850e0769c36",
+ "background-fetch/OWNERS": [
+ "0c4e22b970a92b2d77b0f50cc27c2d46aad0b43b",
"support"
],
- "assumptions/tools/build.sh": [
- "e7549e915a809b48cac816dacdd7a9bbf476b596",
- "support"
+ "background-fetch/content-security-policy.https.window.js": [
+ "1675b0665319efe5ce8423230f839b20e3b6a63b",
+ "testharness"
],
- "auxclick/OWNERS": [
- "314d421a5544db277664bb55bd04b87e9ed2fdba",
- "support"
+ "background-fetch/credentials-in-url.https.window.js": [
+ "6fa8d069c6f17da908078ac1a3770b2bd730426c",
+ "testharness"
],
- "background-fetch/OWNERS": [
- "0c4e22b970a92b2d77b0f50cc27c2d46aad0b43b",
- "support"
+ "background-fetch/dangling-markup.https.window.js": [
+ "fd9efe16c485c6fa6cc4b587b492eb24bf9ccac2",
+ "testharness"
],
"background-fetch/interfaces-worker.https.html": [
"3bdcb55c864d99da109cdc0abe56c06aaf3e3d1e",
@@ -412118,13 +417727,29 @@
"testharness"
],
"background-fetch/interfaces.idl": [
- "cb1f28998d888157cfde900072ab8220f9709837",
+ "f2c8fc84af7bf785ba42f1398181e2ab08c3826a",
"support"
],
"background-fetch/interfaces.worker.js": [
- "0c959d5fa41c3db70c326b83e064b8261a6f90b4",
+ "5027979889540dc52a763f3877f4a739a633aa0a",
+ "testharness"
+ ],
+ "background-fetch/mixed-content-and-allowed-schemes.https.window.js": [
+ "13873d861416a40d831026a88f864f13a9447c7f",
+ "testharness"
+ ],
+ "background-fetch/port-blocking.https.window.js": [
+ "6e06b6e9b9cd8713ff5a8ca405c1b54fe15c559c",
"testharness"
],
+ "background-fetch/resources/sw.js": [
+ "9b4fbabe0209a5367186e8c5717be88f32530027",
+ "support"
+ ],
+ "background-fetch/resources/utils.js": [
+ "1109faf95d0b0d09f2eb9a486638d68af55cb52c",
+ "support"
+ ],
"battery-status/OWNERS": [
"c08081d13e4029cf4fffb48c15d323d8b15a581b",
"support"
@@ -412150,7 +417775,7 @@
"testharness"
],
"battery-status/battery-interface-idlharness.https.html": [
- "7f1578703d6f2a7d417b4d6569febb9f9836ea0e",
+ "6782a2da1811570e601d44422c385bc33f97cd70",
"testharness"
],
"battery-status/battery-plugging-in-manual.https.html": [
@@ -412177,8 +417802,60 @@
"61b61d09a21daee964e0ebd26f7bdfdd1964c8ae",
"support"
],
+ "beacon/beacon-basic-blob.html": [
+ "60262cdcf9a58117db70f2afdeed195c820b04c7",
+ "testharness"
+ ],
+ "beacon/beacon-basic-blobMax.html": [
+ "fc22daa6ecfd30f94452f32250876709ceb0de64",
+ "testharness"
+ ],
+ "beacon/beacon-basic-buffersource.html": [
+ "d5b79f5174e0d7d086e72cf8c2ae5b2ccbdc9dcb",
+ "testharness"
+ ],
+ "beacon/beacon-basic-buffersourceMax.html": [
+ "1705d1ce9ca7e8ada8e143c404546b2b29f581fd",
+ "testharness"
+ ],
+ "beacon/beacon-basic-formdata.html": [
+ "6157608b53dfe533307141d531fcfd9ac6acca9f",
+ "testharness"
+ ],
+ "beacon/beacon-basic-formdataMax.html": [
+ "cd00ed52c24c8e7106d662594f5fafa0d48b37d4",
+ "testharness"
+ ],
+ "beacon/beacon-basic-string.html": [
+ "d1bbdd45e304aee9e5a2ac462ca5fb95397e0c0c",
+ "testharness"
+ ],
+ "beacon/beacon-basic-stringMax.html": [
+ "a02beda7ba6c743a1e104068ff9259c5c8741096",
+ "testharness"
+ ],
+ "beacon/beacon-common.sub.js": [
+ "75bee9ae7588c181a9a4f3eb9bced109a0190bfc",
+ "support"
+ ],
+ "beacon/beacon-cors.sub.window.js": [
+ "1821072ced64052cea6d2fc3ccb73cfe23a4235e",
+ "testharness"
+ ],
+ "beacon/beacon-error.window.js": [
+ "3e78d3aba0964c79965c83727bb2a73381382a2e",
+ "testharness"
+ ],
+ "beacon/beacon-navigate.html": [
+ "88999e7d123854f9e40411365b58da15d7d651a0",
+ "testharness"
+ ],
+ "beacon/beacon-redirect.window.js": [
+ "8c75ccdace165cfc3697797b571c3d5ca79ac6a4",
+ "testharness"
+ ],
"beacon/headers/header-content-type.html": [
- "5753ef82d17941aaf0c929da8952f88aa4186f02",
+ "86ea95acb53498323dde13266834bb4bd2f3ad35",
"testharness"
],
"beacon/headers/header-referrer-no-referrer-when-downgrade.https.html": [
@@ -412217,6 +417894,14 @@
"8185d2b31fbf67a573444d3c8f828f96422526f5",
"support"
],
+ "beacon/navigate.iFrame.sub.html": [
+ "03a7f2477d3efef7572b1c45a6ed113350aec948",
+ "support"
+ ],
+ "beacon/resources/beacon.py": [
+ "12c892f085e2498f4c4abfda2409c61b0243a27f",
+ "support"
+ ],
"beacon/resources/content-type.py": [
"0734a043b92b0a2646d643f14c0e7e0e33043b1d",
"support"
@@ -412233,22 +417918,70 @@
"5d4d8278b1f24798765974c35777f70fcbfc9cfa",
"testharness"
],
- "clear-site-data/navigation.html": [
- "daf340429ca71997c7d9c6021354522f0285c4d1",
+ "clear-site-data/navigation-insecure.html": [
+ "97c069cf7c938e1ebdba3f243ad48369a7fb5542",
+ "testharness"
+ ],
+ "clear-site-data/navigation.https.html": [
+ "462ebc571ae718c9b34ed78e8798c9edfec18e8d",
+ "testharness"
+ ],
+ "clear-site-data/resource.html": [
+ "d60a41f939a4e69e162ba760f86f63bfaeef0360",
+ "testharness"
+ ],
+ "clear-site-data/storage.https.html": [
+ "2b14613ad14aa9925b7882a972efd44c2ccc29e7",
"testharness"
],
"clear-site-data/support/echo-clear-site-data.py": [
- "d8768caed378b9a3eadeb7a566bcd099f6c2e9de",
+ "6d6822db671d4591d9c9d8aecfc9d6d2dcf2f308",
+ "support"
+ ],
+ "clear-site-data/support/page_with_resource.sub.html": [
+ "246451c21ea53f7ac0868a5d8772aa4527dd5664",
+ "support"
+ ],
+ "clear-site-data/support/send_report.html": [
+ "352a8a947bfa42fd59a93181f8aedb64ee6e37ae",
"support"
],
- "clear-site-data/support/test_utils.js": [
- "6980ed5592440f13bccbd83afdf6c6aa0b55e2f2",
+ "clear-site-data/support/service_worker.js": [
+ "eb87eb25d4b84ae78c57a7bd3cd3d43b4df99881",
"support"
],
- "clipboard/OWNERS": [
+ "clear-site-data/support/test_utils.sub.js": [
+ "10f5f9d409ef513edb129e0e8522aa5f74d51ce8",
+ "support"
+ ],
+ "clipboard-apis/OWNERS": [
"bae753666bda85e9805a5e2fad80ba71459b8aba",
"support"
],
+ "clipboard-apis/async-interfaces.https.html": [
+ "68a1ea255a72e54e6a2147797d4213914a79aece",
+ "testharness"
+ ],
+ "clipboard-apis/async-navigator-clipboard-basics.https.html": [
+ "59f25a9968d47079857989146e26562c3784be34",
+ "testharness"
+ ],
+ "clipboard-apis/async-write-dttext-read-dttext-manual.https.html": [
+ "7b2a4d7f1e1e918f8a96694f6619875b746d0255",
+ "manual"
+ ],
+ "clipboard-apis/async-write-dttext-read-text-manual.https.html": [
+ "d0fbfc54f1d1a68aaf5a2b96e25101dfe9aec883",
+ "manual"
+ ],
+ "clipboard-apis/async-write-text-read-dttext-manual.https.html": [
+ "4b0df740f9f8fa6f3831b1255dde491b83e3ef6c",
+ "manual"
+ ],
+ "clipboard-apis/async-write-text-read-text-manual.https.html": [
+ "e69933ca4cdc42105d469b7ffb105aa60a8e0875",
+ "manual"
+ ],
"common/OWNERS": [
"13fbb201f77b9929d7f5693b70855c9b68abc70b",
"support"
@@ -412257,10 +417990,18 @@
"0516e849d40a16e82e1bb800372df28ed802aa8d",
"support"
],
+ "common/PrefixedLocalStorage.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
"common/PrefixedPostMessage.js": [
"2a2e37640bd0089be111d96eeed0b311753e0234",
"support"
],
+ "common/PrefixedPostMessage.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
"common/blank.html": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -412269,24 +418010,48 @@
"785ccd1f9e4b4eee437eeff66305b2b4041266dd",
"support"
],
+ "common/canvas-frame.css.headers": [
+ "1060d9437c410f4ee2a97f315d5dcc06640cfcb1",
+ "support"
+ ],
"common/canvas-index.css": [
"13571798b21b833a302201801c6c768a589833a8",
"support"
],
+ "common/canvas-index.css.headers": [
+ "1060d9437c410f4ee2a97f315d5dcc06640cfcb1",
+ "support"
+ ],
"common/canvas-spec.css": [
"f8338e4b6f3e725651820431adee039310a42432",
"support"
],
+ "common/canvas-spec.css.headers": [
+ "1060d9437c410f4ee2a97f315d5dcc06640cfcb1",
+ "support"
+ ],
"common/canvas-tests.css": [
"5aeba7a0e72feba74a6cb4d707161131102792a0",
"support"
],
+ "common/canvas-tests.css.headers": [
+ "1060d9437c410f4ee2a97f315d5dcc06640cfcb1",
+ "support"
+ ],
"common/canvas-tests.js": [
"329e3ae1cfde2ee0525302e6a3260faed3885f28",
"support"
],
+ "common/canvas-tests.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
"common/css-paint-tests.js": [
- "0e88a610e5ad9ff1deb04adec35b73caadbff201",
+ "81e8d7dc10c489d1d3ef2666a437b5e3972b9643",
+ "support"
+ ],
+ "common/css-paint-tests.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
"support"
],
"common/css-red.txt": [
@@ -412317,6 +418082,10 @@
"4175d0fff3555e25a646b0673a082fefdc113fe0",
"support"
],
+ "common/get-host-info.sub.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
"common/large.py": [
"19d0b8d5fec34f080c37f1b1b837ea0c2401ad82",
"support"
@@ -412325,12 +418094,24 @@
"a575b8135e6ddb1501fc2a082d7544ee86011b7d",
"support"
],
+ "common/media.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
"common/object-association.js": [
"c6955b7bbf00d73ec5959678391aa59d36da8321",
"support"
],
+ "common/object-association.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
"common/performance-timeline-utils.js": [
- "0616ad8871126af7a74ff6937f3f7c623adcbd3e",
+ "cf06f5a0e00f29d862753144634b4e1d0f074fb8",
+ "support"
+ ],
+ "common/performance-timeline-utils.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
"support"
],
"common/redirect-opt-in.py": [
@@ -412345,14 +418126,26 @@
"613bcbbcdfeadf3f460d9c0a3fc96049d0e54783",
"support"
],
+ "common/reftest-wait.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
"common/stringifiers.js": [
"4c6d28a4b6d982edeb5232fa624936254f2df5f0",
"support"
],
+ "common/stringifiers.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
"common/test-setting-immutable-prototype.js": [
"2cafc5c2b867e0fd6f738b1fbeaa503761c400b7",
"support"
],
+ "common/test-setting-immutable-prototype.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
"common/text-plain.txt": [
"38df1ae8fa75f343d9c584ee7b68cbd12948ba68",
"support"
@@ -412361,10 +418154,42 @@
"1d8598ff2c801c54c0f9be1c688b753bb6291c94",
"support"
],
- "common/vendor-prefix.js": [
- "b80ec842b65a3423dd789a2226f2ba3caf598049",
+ "common/utils.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
+ "common/vendor-prefix.js.headers": [
+ "e3593850f8098d3f3ff82c042deab15f51c66a52",
+ "support"
+ ],
+ "compat/OWNERS": [
+ "e714708a95e56bc556b64d991cb72f0ccace4f92",
+ "support"
+ ],
+ "compat/green-ref.html": [
+ "4b23ea52d785a6dd19785bd4278bf700eb5547f8",
"support"
],
+ "compat/historical.html": [
+ "2d71e7532fc32af61d2410927b6405a9e79279a4",
+ "testharness"
+ ],
+ "compat/webkit-linear-gradient-line-bottom.html": [
+ "af59a0aa3b8a195ba7ef401b582be9384a23a388",
+ "reftest"
+ ],
+ "compat/webkit-linear-gradient-line-left.html": [
+ "f131166051da9a82ede93f076f15832f61f39234",
+ "reftest"
+ ],
+ "compat/webkit-linear-gradient-line-right.html": [
+ "2d87c4a09d77f3171fa91bbf8f2f0b1a412b7d94",
+ "reftest"
+ ],
+ "compat/webkit-linear-gradient-line-top.html": [
+ "be7fb91dc6459617c20232cd5333e9b3340f3341",
+ "reftest"
+ ],
"compat/webkit-text-fill-color-currentColor.html": [
"7512b6ce45b5528ee7b9794c32954e954d736f88",
"testharness"
@@ -426697,7 +432522,7 @@
"690672633429a925ffecc0d3d92c751b4d8b3c02",
"support"
],
- "conformance-checkers/html/elements/picture/srcset-microsyntax-leading-dot-x-novalid.html": [
+ "conformance-checkers/html/elements/picture/srcset-microsyntax-leading-dot-x-valid.html": [
"415d4b7e85b43c2e3cf46fb22316b8bd35a4d905",
"support"
],
@@ -429590,7 +435415,7 @@
"support"
],
"conformance-checkers/messages.json": [
- "742126ed2e1c98c54dea09f903eca1879848d338",
+ "77e43d470fe6884315c194bb64b0acec88e29827",
"support"
],
"conformance-checkers/tools/build-svg-tests.py": [
@@ -430801,18 +436626,10 @@
"d847dfa9fec3763edd4b8d1e0394e5c991d37524",
"support"
],
- "content-security-policy/blink-contrib/manifest-src-allowed.sub.html": [
- "87232e07bea2e0b932f1de48ea9349ba21883cda",
- "support"
- ],
"content-security-policy/blink-contrib/manifest-src-allowed.sub.html.sub.headers": [
"b8aecfde2a75b6c0a0475e39c38f0802df07b503",
"support"
],
- "content-security-policy/blink-contrib/manifest-src-blocked.sub.html": [
- "87232e07bea2e0b932f1de48ea9349ba21883cda",
- "support"
- ],
"content-security-policy/blink-contrib/manifest-src-blocked.sub.html.sub.headers": [
"903f086b16a9f45d27a6b92345473e1e139b241c",
"support"
@@ -430849,38 +436666,6 @@
"368845671fc996d39fd6f85c113a26cdaa98ee3e",
"support"
],
- "content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html": [
- "7f81f0fe6a5ed984e6084250672e598a2fe2c707",
- "testharness"
- ],
- "content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html.sub.headers": [
- "37429d7e5523b4fa092f319e0348abf62f1fe95e",
- "support"
- ],
- "content-security-policy/blink-contrib/object-src-applet-archive.sub.html": [
- "9d07979a968cea9958c237e465b3562fac0d6e65",
- "testharness"
- ],
- "content-security-policy/blink-contrib/object-src-applet-archive.sub.html.sub.headers": [
- "0e9b0159e148542c330eeb1c9501911e2e0473c0",
- "support"
- ],
- "content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html": [
- "5b0ef3d19498af074fbd2ca00b6af16774b1b4cc",
- "testharness"
- ],
- "content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html.sub.headers": [
- "eac4a0d1aecb5475bb88b223deec64209f98b25c",
- "support"
- ],
- "content-security-policy/blink-contrib/object-src-applet-code.sub.html": [
- "5827478d16c8bf8f473daae756eaeabaafdee879",
- "testharness"
- ],
- "content-security-policy/blink-contrib/object-src-applet-code.sub.html.sub.headers": [
- "8d1f3d53e9702d62946969231a45c79f26e6e287",
- "support"
- ],
"content-security-policy/blink-contrib/object-src-no-url-allowed.sub.html": [
"e4cd8d8e7a3150626eea1d6ca7beed13feb6a76c",
"testharness"
@@ -430998,7 +436783,7 @@
"support"
],
"content-security-policy/blink-contrib/resources/go-to-echo-report.js": [
- "621ddec05f232bac83af53c5bc58035dfa6679ee",
+ "cf5a9535e88f5fa1ef702fd67f3abbc66a7707da",
"support"
],
"content-security-policy/blink-contrib/resources/inject-image.js": [
@@ -431342,7 +437127,7 @@
"testharness"
],
"content-security-policy/connect-src/connect-src-beacon-blocked.sub.html": [
- "0965458e1d32dacec7a9379a7f0e484277389398",
+ "4d88ea8d1c46369639c32b8301cfface99c0bef2",
"testharness"
],
"content-security-policy/connect-src/connect-src-eventsource-blocked.sub.html": [
@@ -431438,19 +437223,19 @@
"support"
],
"content-security-policy/font-src/font-match-allowed.sub.html": [
- "b86342dc1007155ec1b3f216f0fcba18d147cf09",
+ "4bc23af2a5a3280630e50cc4c35a9769e499b7a6",
"testharness"
],
"content-security-policy/font-src/font-mismatch-blocked.sub.html": [
- "93dbab4e5ce5b6e22bfd9ab7c4a7f9ff559c8045",
+ "274372eb59cca6e399d8c786d7a0f443c6f35254",
"testharness"
],
"content-security-policy/font-src/font-none-blocked.sub.html": [
- "6e37e31d96d956543e877d99f0fcfe9a13742ee1",
+ "a4be6133c29126bc833f4a127524372d9435baff",
"testharness"
],
"content-security-policy/font-src/font-self-allowed.html": [
- "a1dd23693dffbe7c1169d8116f0dfab6364003f3",
+ "5c506f77de6efb56d1b4f488c81b750fe757720a",
"testharness"
],
"content-security-policy/font-src/font-stylesheet-font-blocked.sub.html": [
@@ -431777,6 +437562,14 @@
"4114664a54645718ccbb5292f5103dc1942724aa",
"testharness"
],
+ "content-security-policy/inheritance/iframe.html": [
+ "3121f2277196e721af7d8cd522be148c875c79bd",
+ "testharness"
+ ],
+ "content-security-policy/inheritance/window.html": [
+ "5a59b9b239186ad49aa1928f0beb9cf4234b4a6e",
+ "testharness"
+ ],
"content-security-policy/inside-worker/dedicated-inheritance.html": [
"225fa2ffe085ac9b419d7ed5287cfad28f3945bf",
"testharness"
@@ -431881,6 +437674,18 @@
"2553698b40d91f95f33bb14e7bd906d665b0381a",
"testharness"
],
+ "content-security-policy/navigation/javascript-url-navigation-inherits-csp.html": [
+ "bb01b98b633fe5ffb79b1b4e0943a77b85a11057",
+ "testharness"
+ ],
+ "content-security-policy/navigation/support/test_csp_self_window.sub.html": [
+ "df2273c83ff0d663fdcd46d91a0eb0e8a743b49b",
+ "support"
+ ],
+ "content-security-policy/navigation/support/test_csp_self_window.sub.html.sub.headers": [
+ "44b5dae4b9d0c5570e79d4fed8a7e8a709470c95",
+ "support"
+ ],
"content-security-policy/navigation/to-javascript-url-frame-src.html": [
"3070ea56bcb7dc454d7bc252377f0dc5bcb03c7c",
"testharness"
@@ -431969,6 +437774,14 @@
"9256478a189aeabb765763a48fda9a6fd2ab077e",
"support"
],
+ "content-security-policy/script-src/javascript-window-open-blocked.html": [
+ "7d047c4966eee6c35a6bf24a80b4fbb672cb89b4",
+ "testharness"
+ ],
+ "content-security-policy/script-src/javascript-window-open-blocked.html.sub.headers": [
+ "e8583f7292cd90aa13e0e997aedf41763eb18928",
+ "support"
+ ],
"content-security-policy/script-src/script-src-1_1.html": [
"c547fd94e350bfd49541734515a4068de44f525d",
"testharness"
@@ -432041,6 +437854,38 @@
"4c2700452b8e0cb5451ee00aaa8ff92f12e9623e",
"support"
],
+ "content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html": [
+ "0f0f571fbc0db3b96112cb62f66d03c45674c127",
+ "testharness"
+ ],
+ "content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers": [
+ "dec2d5659d318a58d7e957837ce3a217db2ea649",
+ "support"
+ ],
+ "content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html": [
+ "c0407821e7f7de5d80d601c7e693b0e283902e61",
+ "testharness"
+ ],
+ "content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html.sub.headers": [
+ "39b7686073001e610bee5ba2a2c1083080b1aa68",
+ "support"
+ ],
+ "content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html": [
+ "f43c7510cf175e41d18b87f084136efeb22a0d86",
+ "testharness"
+ ],
+ "content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html.sub.headers": [
+ "6d5a35850052379753d5e39fe30aca1ddc9635f7",
+ "support"
+ ],
+ "content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html": [
+ "a7b51858b4c9a967bf740e76a5e1de726f5dfcdd",
+ "testharness"
+ ],
+ "content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html.sub.headers": [
+ "57c9026a7add5b8de2b153b14039787d44cbfa83",
+ "support"
+ ],
"content-security-policy/script-src/script-src-sri_hash.sub.html": [
"c720b6a69726026ea34545b94bcdc7cef443c453",
"testharness"
@@ -432177,6 +438022,10 @@
"a50a792b1ef19fe452196e5e50036d6de01dc6e5",
"support"
],
+ "content-security-policy/script-src/script-src-strict_dynamic_worker-importScripts.https.html": [
+ "99a224807bf8aefd4460ebadccb8bfa8aee30f1d",
+ "testharness"
+ ],
"content-security-policy/script-src/script-src-strict_dynamic_worker.https.html": [
"a59f7f33614eb541a216b317f0916271f359ba1b",
"testharness"
@@ -432218,11 +438067,11 @@
"testharness"
],
"content-security-policy/securitypolicyviolation/script-sample-no-opt-in.html": [
- "44cad18dc963c49062c0f3b7ea7a8951157cbcb7",
+ "f36718ff0a9040db0b9257f772f5bcae98ae2305",
"testharness"
],
"content-security-policy/securitypolicyviolation/script-sample.html": [
- "009e5de237b0aa1d3b7e2c100cb8fdf9bb1080a5",
+ "9e2ad606d8c3d17f6417134f84aef32305c92c49",
"testharness"
],
"content-security-policy/securitypolicyviolation/securitypolicyviolation-block-cross-origin-image-from-script.sub.html": [
@@ -432353,6 +438202,14 @@
"7f50fcc3b1c1a6ed9ee57f3e93114522b7736fc5",
"testharness"
],
+ "content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html": [
+ "a50ea52186d51091482e8e12b7087fcac050dc5e",
+ "testharness"
+ ],
+ "content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers": [
+ "b735c690c93a323d71cedf2a05bca301fb8fed3f",
+ "support"
+ ],
"content-security-policy/style-src/style-src-none-blocked.html": [
"31f823b50c081e59c8624c08e5a9d8c9274378c8",
"testharness"
@@ -432369,10 +438226,6 @@
"a46cfc14f19813fc3b71928dd4b9d459f318b035",
"testharness"
],
- "content-security-policy/support/Ahem.ttf": [
- "8cdc9e68594fbb6db8c7b4bff643ab2432b51db6",
- "support"
- ],
"content-security-policy/support/alert-pass.js": [
"9d9311651dff245f3c45fca59bacac7804a48746",
"support"
@@ -432402,7 +438255,11 @@
"support"
],
"content-security-policy/support/fonts.css": [
- "6bf8e753cdcdebcd0d50f20d4c64e267897fedf4",
+ "4577fb4f580bfd9c723e1a5ee0f9d8438ce41ac9",
+ "support"
+ ],
+ "content-security-policy/support/import-scripts.js": [
+ "79a3767181ce25e78a574f8bd51f8bc796bee0b8",
"support"
],
"content-security-policy/support/inject-image.js": [
@@ -432501,6 +438358,18 @@
"3cb51cc3be98ab648a58c858727e749bfdf53424",
"testharness"
],
+ "content-security-policy/unsafe-hashed-attributes/script_event_handlers_allowed.html": [
+ "3dac897440d3bcca283c606c51d23a9d37c66a62",
+ "testharness"
+ ],
+ "content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_matching_hash_no_unsafe_inline_attribute.html": [
+ "2864ff4485ab5fee87000898cba6c9d786586684",
+ "testharness"
+ ],
+ "content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_not_matching_hash.html": [
+ "d4f78683e9e76a341134c34be726d435d113b71b",
+ "testharness"
+ ],
"content-security-policy/worker-src/dedicated-child.sub.html": [
"fb394b266d3c21a44d7f0edfbbcc5d5ff31e8b6f",
"testharness"
@@ -432585,6 +438454,10 @@
"6532cda9322290949bedc06cdc45ce80521068aa",
"testharness"
],
+ "cookies/secure/set-from-dom.sub.html": [
+ "aa0f2272bb79fb6e83f533c1c4e452372e125822",
+ "testharness"
+ ],
"cookies/secure/set-from-http.https.sub.html": [
"b6e52fd4c91631976c64340dc6e672e329e32937",
"testharness"
@@ -432593,6 +438466,10 @@
"163473a9d34481457eb0fc689ad3b5e985e45a8a",
"support"
],
+ "cookies/secure/set-from-http.sub.html": [
+ "89e4afad6ceefc5728ef91092fedfa155fc3f880",
+ "testharness"
+ ],
"cookies/secure/set-from-http.sub.html.headers": [
"b1b6ee4d317f108574453da7410f91d52eecdf83",
"support"
@@ -432605,6 +438482,894 @@
"31461ac108fe717b074a41e14c12d9b83c064f85",
"testharness"
],
+ "core-aam/OWNERS": [
+ "3a6002295ea2893ba74763e46965bd2d1291d55b",
+ "support"
+ ],
+ "core-aam/README.md": [
+ "a910a51a7869305635992eb784b0ddfe70d8f8ae",
+ "support"
+ ],
+ "core-aam/alert-manual.html": [
+ "c859aafe43f6e9123de0a080356bf28ab69cdef1",
+ "manual"
+ ],
+ "core-aam/alertdialog-manual.html": [
+ "718e0c7c4ac148fde7d58115dced3c77c1d262ef",
+ "manual"
+ ],
+ "core-aam/application-manual.html": [
+ "003e33f14415d88ef226f8a654c12a6f7072ab4d",
+ "manual"
+ ],
+ "core-aam/aria-atomic_false-manual.html": [
+ "c31104df1f2d21b3280d215a16f3c2cda45aa87c",
+ "manual"
+ ],
+ "core-aam/aria-atomic_true-manual.html": [
+ "1c4378409a9a19e6039f1bf677ee389992641076",
+ "manual"
+ ],
+ "core-aam/aria-autocomplete_both-manual.html": [
+ "4334983a8cc2d70bc141393b693b9f739764adcf",
+ "manual"
+ ],
+ "core-aam/aria-autocomplete_inline-manual.html": [
+ "a59669dd7daff22770ab0b224330da40eda091f5",
+ "manual"
+ ],
+ "core-aam/aria-autocomplete_list-manual.html": [
+ "b1ef9ebea38ad1e565b593027199a1b25174ecf1",
+ "manual"
+ ],
+ "core-aam/aria-busy_false-manual.html": [
+ "5a864465eeabb2616c9de41c155dab1de2a41470",
+ "manual"
+ ],
+ "core-aam/aria-busy_true-manual.html": [
+ "1e1732ed47bb0ed692b5ee6fdfb0e13407d9508a",
+ "manual"
+ ],
+ "core-aam/aria-busy_value_changes-manual.html": [
+ "37072fdc4353a6edc509eb82fbcf041123e1bdd7",
+ "manual"
+ ],
+ "core-aam/aria-checked_false_on_checkbox-manual.html": [
+ "a876e8cd2f5909c9244266e74bcb2c43d4644a0d",
+ "manual"
+ ],
+ "core-aam/aria-checked_false_on_menuitemradio-manual.html": [
+ "33d1fafc0b1dead3b87bf63f2da16a7d700e2304",
+ "manual"
+ ],
+ "core-aam/aria-checked_mixed-manual.html": [
+ "3a0d20457b5adaa0a1557f5c9311831ab2ad4d78",
+ "manual"
+ ],
+ "core-aam/aria-checked_true_on_checkbox-manual.html": [
+ "203a4c3c635bcb21ec99a15595a64173a5ebed70",
+ "manual"
+ ],
+ "core-aam/aria-checked_true_on_menuitemradio-manual.html": [
+ "7a2aa3896861003e90b4c3e8e73adfaca8dcaf7e",
+ "manual"
+ ],
+ "core-aam/aria-checked_value_changes-manual.html": [
+ "1b60088a1e7441cd4074fec2f674d9f055e5841e",
+ "manual"
+ ],
+ "core-aam/aria-colcount_new-manual.html": [
+ "04fd57706e621226bd4ba173e56a61ea59f2bba6",
+ "manual"
+ ],
+ "core-aam/aria-colindex_new-manual.html": [
+ "8365f1b54c90e5c2cbc451512ec74b36bc83b925",
+ "manual"
+ ],
+ "core-aam/aria-colspan_new-manual.html": [
+ "916205a9d0595a3cc0f35763a5c43ddf6a1b578e",
+ "manual"
+ ],
+ "core-aam/aria-controls-manual.html": [
+ "f61aca68b1ae4709cb883d1281aadb418203d67a",
+ "manual"
+ ],
+ "core-aam/aria-current_value_changes-manual.html": [
+ "3422e86f65c3bd3886ae2d6c820670bcb6e9d681",
+ "manual"
+ ],
+ "core-aam/aria-current_with_non-false_allowed_value_new-manual.html": [
+ "2eefb0c82d0b79eb0d248c29891b18df10eecd6c",
+ "manual"
+ ],
+ "core-aam/aria-current_with_unrecognized_value_new-manual.html": [
+ "3a74e4a0dc60d5bb7a4611c9953b2bc8a358766a",
+ "manual"
+ ],
+ "core-aam/aria-describedby-manual.html": [
+ "042028f26f5cd2a268fc04c5055d4778e5570da3",
+ "manual"
+ ],
+ "core-aam/aria-details_new-manual.html": [
+ "35b69bdb2c33a8a6366dade9c177c49e8794f411",
+ "manual"
+ ],
+ "core-aam/aria-disabled_false-manual.html": [
+ "a86ac2e0b8f9df36bb9b13a0db2a7d4017c17cc8",
+ "manual"
+ ],
+ "core-aam/aria-disabled_true-manual.html": [
+ "ab71f5a8b037aea3acbeaf7595873396e0683c4b",
+ "manual"
+ ],
+ "core-aam/aria-disabled_value_changes-manual.html": [
+ "b39c020d186b3098c55e6f51288ef7d00a302216",
+ "manual"
+ ],
+ "core-aam/aria-dropeffect_copy-manual.html": [
+ "904734aa17a6281fcb7fa3f129ff240869153236",
+ "manual"
+ ],
+ "core-aam/aria-dropeffect_execute-manual.html": [
+ "af47742a879ef4b4dc75a5a8d77a3b546c3cc31f",
+ "manual"
+ ],
+ "core-aam/aria-dropeffect_link-manual.html": [
+ "ad688f3230161fa22457d7c71bfab32232b541b0",
+ "manual"
+ ],
+ "core-aam/aria-dropeffect_move-manual.html": [
+ "ae5d81fb4cc1f5b3053d51a9db612364743f0ee4",
+ "manual"
+ ],
+ "core-aam/aria-dropeffect_none-manual.html": [
+ "e10b72943abf5950f09e4f2fcaca5c256c60c4bf",
+ "manual"
+ ],
+ "core-aam/aria-dropeffect_popup-manual.html": [
+ "3f28bb13ccc039cd183367749a69d4bd953d8b58",
+ "manual"
+ ],
+ "core-aam/aria-dropeffect_value_changes-manual.html": [
+ "448a3821b05732ca142b545c419dba13f39e3333",
+ "manual"
+ ],
+ "core-aam/aria-errormessage-manual.html": [
+ "b2cc894907f3fff1092f102adc58bdd878f434b9",
+ "manual"
+ ],
+ "core-aam/aria-expanded_false-manual.html": [
+ "249d36e19d4ca26b281a1eb9f623c107fdc11567",
+ "manual"
+ ],
+ "core-aam/aria-expanded_true-manual.html": [
+ "6374a29b6a2bc008f12884d361149139070ea1a4",
+ "manual"
+ ],
+ "core-aam/aria-expanded_value_changes-manual.html": [
+ "4695aed01e4473c45e723f1e21bfff74c1231a98",
+ "manual"
+ ],
+ "core-aam/aria-flowto-manual.html": [
+ "ab781f7aed85fbb840bb3b38e1b16897d0cb9b20",
+ "manual"
+ ],
+ "core-aam/aria-grabbed_false-manual.html": [
+ "9fc589158670650b9016af89c5d0dbf8e2f99f4e",
+ "manual"
+ ],
+ "core-aam/aria-grabbed_true-manual.html": [
+ "d55d6a540ca0200aa63b15ab3cc50e914c4e15bd",
+ "manual"
+ ],
+ "core-aam/aria-grabbed_value_changes-manual.html": [
+ "9c89d94f4f91efe0e23cb068ecb455d8a2a60d36",
+ "manual"
+ ],
+ "core-aam/aria-haspopup_dialog_new-manual.html": [
+ "fce55e4f6982abee6f158b36c1df06a6f775d2c8",
+ "manual"
+ ],
+ "core-aam/aria-haspopup_false-manual.html": [
+ "4fbd1d6a7e229c5d92efb34e77a1ec552e4e2bac",
+ "manual"
+ ],
+ "core-aam/aria-haspopup_listbox_new-manual.html": [
+ "c8e6ce5f5b52b55136c22742d9168264cb126e4d",
+ "manual"
+ ],
+ "core-aam/aria-haspopup_menu_new-manual.html": [
+ "ad0ed72f17a76c05dd0aa873418084167d837b00",
+ "manual"
+ ],
+ "core-aam/aria-haspopup_tree_new-manual.html": [
+ "99a729c76d38e1d500f99c940d895b634dab7055",
+ "manual"
+ ],
+ "core-aam/aria-haspopup_true-manual.html": [
+ "0610a9c974ed3b1f7ff2c3ca0a76c20db57606c5",
+ "manual"
+ ],
+ "core-aam/aria-hidden_true-manual.html": [
+ "4ad0f934d67800e562343f2f0409da87035655e8",
+ "manual"
+ ],
+ "core-aam/aria-hidden_true_when_element_is_focused_or_fires_event_new-manual.html": [
+ "cff04a903a339c608d25e76bdae6ee4c9dc983f5",
+ "manual"
+ ],
+ "core-aam/aria-hidden_value_changes-manual.html": [
+ "ab82bdb93aee0de057c47d69ea5afecf4c723d73",
+ "manual"
+ ],
+ "core-aam/aria-invalid_false-manual.html": [
+ "9afee59c1274f99de33bbcc4c2730e40671f3361",
+ "manual"
+ ],
+ "core-aam/aria-invalid_grammar-manual.html": [
+ "4a4d889c8166fe089dc93abf6d8b4f40186b0160",
+ "manual"
+ ],
+ "core-aam/aria-invalid_spelling-manual.html": [
+ "421e1a55d691b997777c13fd8713d1e3018dc46a",
+ "manual"
+ ],
+ "core-aam/aria-invalid_true-manual.html": [
+ "09a266562226255012792c41190d95b397b46eae",
+ "manual"
+ ],
+ "core-aam/aria-invalid_value_changes-manual.html": [
+ "48f5ebaf55dfe24c78b30502e5af874b25c34172",
+ "manual"
+ ],
+ "core-aam/aria-invalid_with_unrecognized_value_new-manual.html": [
+ "4cccc23d5ac0b71183dff5cd7fdf768125f46499",
+ "manual"
+ ],
+ "core-aam/aria-keyshortcuts_new-manual.html": [
+ "ddaabd128729156e8d58fdd83e587c8c5f956745",
+ "manual"
+ ],
+ "core-aam/aria-label-manual.html": [
+ "6daff0af3825fa736448495529ff082eefad93ae",
+ "manual"
+ ],
+ "core-aam/aria-labelledby-manual.html": [
+ "10ae53e2bddb00e1cc54c91cb19b67008c033e3b",
+ "manual"
+ ],
+ "core-aam/aria-level_on_heading-manual.html": [
+ "386f2b127c43c50313343a5b118aa1624c00e087",
+ "manual"
+ ],
+ "core-aam/aria-level_on_non-heading-manual.html": [
+ "4ff3e8af345db1aecb23d60e9b5cfa3d02202c9b",
+ "manual"
+ ],
+ "core-aam/aria-live_assertive-manual.html": [
+ "66127854ece079613fbde5d2709089ac6083a8d3",
+ "manual"
+ ],
+ "core-aam/aria-live_off-manual.html": [
+ "7d3656ea6928dbf381e412a4de1da94bb7f5f87a",
+ "manual"
+ ],
+ "core-aam/aria-live_polite-manual.html": [
+ "7554361de5acc223cfb890e65c77018584c434fb",
+ "manual"
+ ],
+ "core-aam/aria-modal_false_new-manual.html": [
+ "381e83c5dc0e97f40ea23296ab4c0987abac6c0f",
+ "manual"
+ ],
+ "core-aam/aria-modal_true_new-manual.html": [
+ "2c493da988e55c14e6ae22b6062c88db2924ec83",
+ "manual"
+ ],
+ "core-aam/aria-multiline_false-manual.html": [
+ "1a487ac0061ef450a4c6bd6c7664fb827a8f085f",
+ "manual"
+ ],
+ "core-aam/aria-multiline_true-manual.html": [
+ "6ebc05326d73e45f91420caa390c084b95a7bd93",
+ "manual"
+ ],
+ "core-aam/aria-multiselectable_false-manual.html": [
+ "18c6164e4416acfc961895731a0fe3d6f0fe3162",
+ "manual"
+ ],
+ "core-aam/aria-multiselectable_true-manual.html": [
+ "44375b1e1312639cf517834b844644e710f553a8",
+ "manual"
+ ],
+ "core-aam/aria-orientation_horizontal-manual.html": [
+ "8862d7f7a5ab93f777e8ef032226be3444c86c76",
+ "manual"
+ ],
+ "core-aam/aria-orientation_undefined_new-manual.html": [
+ "0fd3f611373b8622b8bff386f1d1690e01bd8bed",
+ "manual"
+ ],
+ "core-aam/aria-orientation_vertical-manual.html": [
+ "ee9edbd3a36b03753c94e7c26cca9e9b0268e0a1",
+ "manual"
+ ],
+ "core-aam/aria-owns_may_need_manual_verification-manual.html": [
+ "13e3796ff854b458a0319709f04f1aae2a11f39a",
+ "manual"
+ ],
+ "core-aam/aria-placeholder_new-manual.html": [
+ "519b1a991584a92c5a660e04e5ade0066ae464fc",
+ "manual"
+ ],
+ "core-aam/aria-posinset-manual.html": [
+ "18d811d72fed48e70adda7f44f42980a57afe616",
+ "manual"
+ ],
+ "core-aam/aria-pressed_false-manual.html": [
+ "9f2e5c3401fd293d7d1dcda7b46bf6a59d43b42a",
+ "manual"
+ ],
+ "core-aam/aria-pressed_mixed-manual.html": [
+ "4e92ee5529060f55bacb63369d3f62fb15acf9c4",
+ "manual"
+ ],
+ "core-aam/aria-pressed_true-manual.html": [
+ "e29b0515a226bd3eb461080357623ddd47a67c38",
+ "manual"
+ ],
+ "core-aam/aria-pressed_value_changes-manual.html": [
+ "ef7b7c37eadc4e0595b1ad0f663514f59ff45dfb",
+ "manual"
+ ],
+ "core-aam/aria-readonly_false-manual.html": [
+ "8009becf00f1cf96c98841c736522583c7a3c79f",
+ "manual"
+ ],
+ "core-aam/aria-readonly_is_unspecified_on_gridcell_new-manual.html": [
+ "771e05c31ff56c7e533578fc76f353fee975451d",
+ "manual"
+ ],
+ "core-aam/aria-readonly_true_on_checkbox-manual.html": [
+ "c34fe5d9936fd305beb1d382a74c738b494da453",
+ "manual"
+ ],
+ "core-aam/aria-readonly_true_on_radiogroup-manual.html": [
+ "d1b5578370ce7ccc19f4db951a773c15bb115224",
+ "manual"
+ ],
+ "core-aam/aria-readonly_true_on_textbox-manual.html": [
+ "2a618d52bede8ed766951fe9481c238281e07481",
+ "manual"
+ ],
+ "core-aam/aria-readonly_value_changes-manual.html": [
+ "eaff04abf14ea32fc932eaa71af332c81605902d",
+ "manual"
+ ],
+ "core-aam/aria-relevant-manual.html": [
+ "f1e14260d46573039f44d98fdc918dac3a911e76",
+ "manual"
+ ],
+ "core-aam/aria-required_true-manual.html": [
+ "b3e7baa15286aa75cff1086c6497a81173582e7c",
+ "manual"
+ ],
+ "core-aam/aria-required_value_changes-manual.html": [
+ "579334e6278b6edf04ebcbbeb5b9bbf77073bc33",
+ "manual"
+ ],
+ "core-aam/aria-roledescription_is_empty_or_whitespace_characters_new-manual.html": [
+ "3962c1149025fb57e6e2ab3968c945f34a8d93f4",
+ "manual"
+ ],
+ "core-aam/aria-roledescription_new-manual.html": [
+ "32fa5268e48f61f9b914090c6689b9fb359c2ccb",
+ "manual"
+ ],
+ "core-aam/aria-rowcount_new-manual.html": [
+ "7d78485d802b486e7b78e7a1189407ff315a1ad8",
+ "manual"
+ ],
+ "core-aam/aria-rowindex_new-manual.html": [
+ "6a08fbbc607bf60c97fa3bdfb6188e0d7cfd0236",
+ "manual"
+ ],
+ "core-aam/aria-rowspan_new-manual.html": [
+ "fc4817b38147574abaa3570ed3dfe7321f81ec36",
+ "manual"
+ ],
+ "core-aam/aria-selected_false-manual.html": [
+ "fcfba1d3ea92579fc24dc95274d8674a4dd9689f",
+ "manual"
+ ],
+ "core-aam/aria-selected_true-manual.html": [
+ "c57ee5987a5805eba611eb4996429d464c1b578e",
+ "manual"
+ ],
+ "core-aam/aria-setsize_-1_new-manual.html": [
+ "1aa760fbcf69fe8cf6f51347e1b61e8273b064d7",
+ "manual"
+ ],
+ "core-aam/aria-setsize_3-manual.html": [
+ "627b548cfd62f35afe9956a9924557014032757a",
+ "manual"
+ ],
+ "core-aam/aria-sort_ascending-manual.html": [
+ "a80a64a238c6cf9ab14e06e911a15f06a84d2974",
+ "manual"
+ ],
+ "core-aam/aria-sort_descending-manual.html": [
+ "0e020930ba439aad0216ed84e6499c3caf10f8a7",
+ "manual"
+ ],
+ "core-aam/aria-sort_none-manual.html": [
+ "a1b290ff9b2d013a948c2c3acfd26f9220073fc6",
+ "manual"
+ ],
+ "core-aam/aria-sort_other-manual.html": [
+ "8336aff3f8e16bfdb596dddb1bb12b4eba5559ab",
+ "manual"
+ ],
+ "core-aam/aria-valuemax-manual.html": [
+ "f852b9de68752a73a14a22059b8201a7211f25e5",
+ "manual"
+ ],
+ "core-aam/aria-valuemin-manual.html": [
+ "0ed24aa015fd799ff755057fc55d6a7da1178ed9",
+ "manual"
+ ],
+ "core-aam/aria-valuenow-manual.html": [
+ "cb7d42a3a1ef6745510d457c861b3c91f024922d",
+ "manual"
+ ],
+ "core-aam/aria-valuenow_value_changes-manual.html": [
+ "25b56657fd81c6d75967b4e70e304d6c6e001e1e",
+ "manual"
+ ],
+ "core-aam/aria-valuetext-manual.html": [
+ "f00cb422daf4280c9022054d21cec986be87ca72",
+ "manual"
+ ],
+ "core-aam/aria-valuetext_value_changes-manual.html": [
+ "6a0cbb8c1a185f944488a9d0b8ec3870bace35a4",
+ "manual"
+ ],
+ "core-aam/article-manual.html": [
+ "140251a0eee810b28cfff5f8f788429c290dc56f",
+ "manual"
+ ],
+ "core-aam/banner-manual.html": [
+ "6c629ff372f0ba73bbc31c52e3452e0ec7e56b22",
+ "manual"
+ ],
+ "core-aam/button_with_aria-haspopup_dialog_new-manual.html": [
+ "0f9ec5572b8eb69fce716603c2ffbb35f6546310",
+ "manual"
+ ],
+ "core-aam/button_with_aria-haspopup_true-manual.html": [
+ "d3a5c0b2d7a4f8d3b5fde379a85020ffa5b9c8bb",
+ "manual"
+ ],
+ "core-aam/button_with_default_values_for_aria-pressed_and_aria-haspopup-manual.html": [
+ "3a2b80b8ee6317d240d9971c565946a01735062d",
+ "manual"
+ ],
+ "core-aam/button_with_defined_value_for_aria-pressed-manual.html": [
+ "f8c140ccaccdb7f66ebebb538381cc825cb13aa3",
+ "manual"
+ ],
+ "core-aam/cell_new-manual.html": [
+ "ae4cf75a82e8482f4b0e5c023cc228abef66a157",
+ "manual"
+ ],
+ "core-aam/checkbox-manual.html": [
+ "c928767c1b6355411e0f94f9b8e7df7d8fd9c909",
+ "manual"
+ ],
+ "core-aam/columnheader-manual.html": [
+ "22cbd39e5da6e18e62547aa7d47754084dd27ded",
+ "manual"
+ ],
+ "core-aam/combobox-manual.html": [
+ "c30d849b24521b7dfe1364a22d340d96c9adbe43",
+ "manual"
+ ],
+ "core-aam/complementary-manual.html": [
+ "68c8b3bac4f10411651ccdf035f95b6982e332a9",
+ "manual"
+ ],
+ "core-aam/contentinfo-manual.html": [
+ "8aea3dd1b09e8d4899c44b2500907a9a9980ac74",
+ "manual"
+ ],
+ "core-aam/definition-manual.html": [
+ "32ec8c37210e61ecabeb718605cd3cc18c32b0bc",
+ "manual"
+ ],
+ "core-aam/dialog-manual.html": [
+ "185229736630b12324939dcad6ca661aea912b3e",
+ "manual"
+ ],
+ "core-aam/directory-manual.html": [
+ "65e83d8de84ecfe560ad694ee2bb19ba89b83c37",
+ "manual"
+ ],
+ "core-aam/document-manual.html": [
+ "5d3e81bda52e8dcbde9f08c68d57cfdc3a5618c2",
+ "manual"
+ ],
+ "core-aam/exclude_element_hidden_with_css_display_none-manual.html": [
+ "8d90d5975d23c29380b8a9c4c3ddce755c46c40e",
+ "manual"
+ ],
+ "core-aam/exclude_element_hidden_with_css_visibility_hidden-manual.html": [
+ "ca68655fce7a3ac4c39474c22d131acef27fda66",
+ "manual"
+ ],
+ "core-aam/exclude_element_hidden_with_html5_hidden-manual.html": [
+ "9852875a50efe39674c674d51b27c95b8a24c8cd",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_button-manual.html": [
+ "4319a2775114feb0598402ac4afeb4a2f223e119",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_checkbox_new-manual.html": [
+ "19b61c5ae7986e13aa330a8f7138b794d0bff88c",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_img-manual.html": [
+ "f6fd8172fb4cebb646a3f802a843e442fd4595da",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_math-manual.html": [
+ "89cdfe74dbaf497af4c6a61e77e08f3ddfa40a50",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_menuitemcheckbox_new-manual.html": [
+ "353a319aadd237dbf59fb649793357445ac2d225",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_menuitemradio_new-manual.html": [
+ "86042a801723c341ddfefbfec0753d0b2782ada2",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_option_new-manual.html": [
+ "3559e7422ac1da20ec979c8778f73d5f5d5f0263",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_progressbar-manual.html": [
+ "1f42a525dfad95e6f4563b1c7cafe9f149f6f2ca",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_radio_new-manual.html": [
+ "f7fcef7b737489ebae6bbb04d1491274f20fef20",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_scrollbar-manual.html": [
+ "c8ca1ae6a80876c4270d9ab4c158ce864875ad9b",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_separator-manual.html": [
+ "9d17f744c06ef63e7a35c990a78c6490951664f6",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_slider-manual.html": [
+ "28a68c465bd9e1ff55732ef28e94e8c7e4aecf0f",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_switch_new-manual.html": [
+ "19a63482251f6c2ec182bfa42728f664d014d3e1",
+ "manual"
+ ],
+ "core-aam/exclude_presentational_children_of_tab_new-manual.html": [
+ "6d1843fe8b1d58100f5802bad629f48e372fc9fc",
+ "manual"
+ ],
+ "core-aam/feed_new-manual.html": [
+ "e659bdcd01aebd53bc527ed476cb7e67227b4c60",
+ "manual"
+ ],
+ "core-aam/figure_new-manual.html": [
+ "175904be565488c2fa57f8da6f031fb4929bd5eb",
+ "manual"
+ ],
+ "core-aam/form-manual.html": [
+ "3f9b8144aaa5945f384789e6ab84e96f72d53ae2",
+ "manual"
+ ],
+ "core-aam/grid-manual.html": [
+ "45aa9dce7ec6f37f5b9457824cd8aef4384c6ace",
+ "manual"
+ ],
+ "core-aam/gridcell-manual.html": [
+ "c72cf8632ce6dc9c9e256ea4ef152bc667d9af80",
+ "manual"
+ ],
+ "core-aam/group-manual.html": [
+ "0d61a26299bda921e326821e4882d03d6196afc1",
+ "manual"
+ ],
+ "core-aam/heading-manual.html": [
+ "8da1a2e8f544abc7734301a2db773d4597ccd49b",
+ "manual"
+ ],
+ "core-aam/img-manual.html": [
+ "4b7a6ec157300dcffadaefa243c7c89eebc158ef",
+ "manual"
+ ],
+ "core-aam/include_element_referenced_by_global_aria-controls-manual.html": [
+ "b9d9fd53ef5625443dd84e6a43ff3dd3e66c61c7",
+ "manual"
+ ],
+ "core-aam/include_element_referenced_by_global_aria-describedby-manual.html": [
+ "800eb7e59730a182baa757654875406e6a33c31b",
+ "manual"
+ ],
+ "core-aam/include_element_referenced_by_global_aria-details_new-manual.html": [
+ "57f69a68a6911e5e580a0d3ff307ef4346e59b76",
+ "manual"
+ ],
+ "core-aam/include_element_referenced_by_global_aria-errormessage_new-manual.html": [
+ "2cefe94d13199d8c3c4a1850b1cf5dcc9e6a61ff",
+ "manual"
+ ],
+ "core-aam/include_element_referenced_by_global_aria-flowto-manual.html": [
+ "2e0bac9bf235765e0069aa59de2e20cd47177993",
+ "manual"
+ ],
+ "core-aam/include_element_referenced_by_global_aria-labelledby-manual.html": [
+ "b57e67396e0255d57e4e55ffb50d9571b7a5d91f",
+ "manual"
+ ],
+ "core-aam/include_element_referenced_by_global_aria-owns-manual.html": [
+ "c83c6b8f6a8011dcce1e3bc3a3e33ab684a10e9f",
+ "manual"
+ ],
+ "core-aam/include_element_that_is_focusable-manual.html": [
+ "7c2202d531272fe4bcd5767d34cbbd4231e72451",
+ "manual"
+ ],
+ "core-aam/include_element_with_id_inside_element_with_aria-activedescendant-manual.html": [
+ "aa67c2ffd1f38cc578984c044319017a720cae9e",
+ "manual"
+ ],
+ "core-aam/link-manual.html": [
+ "08a9850a68d397c0c94a5b8273c86333e3c445fd",
+ "manual"
+ ],
+ "core-aam/list-manual.html": [
+ "3bca83e6f292af793140669e5d1a477b13824dd4",
+ "manual"
+ ],
+ "core-aam/listbox_not_owned_by_or_child_of_combobox-manual.html": [
+ "08134c2a597049966243bb43e7794395a1796fc1",
+ "manual"
+ ],
+ "core-aam/listbox_owned_by_or_child_of_combobox-manual.html": [
+ "70c893bc1617777f8f4bf199e7751b3e0236907a",
+ "manual"
+ ],
+ "core-aam/listitem-manual.html": [
+ "fe47c78b32125a3608478ce2e329e8e6e73b02c3",
+ "manual"
+ ],
+ "core-aam/log-manual.html": [
+ "b0cfb23b15694c7b27ab81236ce2cd9523da2f04",
+ "manual"
+ ],
+ "core-aam/main-manual.html": [
+ "8e6e5db5991f1665ee358c86e611ae6d63327ab3",
+ "manual"
+ ],
+ "core-aam/marquee-manual.html": [
+ "d37d31030ef5bd924a51c299e3eda67171abdb92",
+ "manual"
+ ],
+ "core-aam/math-manual.html": [
+ "45a130f52eaf4324df8eabeb162544e8048b2ecd",
+ "manual"
+ ],
+ "core-aam/menu-manual.html": [
+ "55f6cbab2fb9466fcb7f0adad6532b0eb1ab0dbd",
+ "manual"
+ ],
+ "core-aam/menu_child_of_menu_item-manual.html": [
+ "65836d38e9842a8bbf341e05da8a0590a4a8ae95",
+ "manual"
+ ],
+ "core-aam/menubar-manual.html": [
+ "51b75485984cc0f4d77f32049c47d39bec0d74eb",
+ "manual"
+ ],
+ "core-aam/menuitem_not_owned_by_or_child_of_group-manual.html": [
+ "c2a94ee210c24c2dd03c20781b98d84e6aa489d1",
+ "manual"
+ ],
+ "core-aam/menuitem_owned_by_or_child_of_group-manual.html": [
+ "0885a232296e242e633e7929d90b292a90505d0e",
+ "manual"
+ ],
+ "core-aam/menuitemcheckbox-manual.html": [
+ "3c9bafc81c06ed2dc45788c412c0013c103aad35",
+ "manual"
+ ],
+ "core-aam/menuitemradio-manual.html": [
+ "696306c6d495f47723df3240323e7e896c2e0447",
+ "manual"
+ ],
+ "core-aam/navigation-manual.html": [
+ "d3b80c33c4738b8ba1b3b6aa719b2403b05a2e01",
+ "manual"
+ ],
+ "core-aam/none_new-manual.html": [
+ "cbef2eed17c93f0c43b81968c79e172198c3f87d",
+ "manual"
+ ],
+ "core-aam/none_used_on_element_that_is_focused_or_fires_event-manual.html": [
+ "37804ca22720578b4513f71f08b297e65f2f59ed",
+ "manual"
+ ],
+ "core-aam/none_used_on_table_element_with_td_children_new-manual.html": [
+ "9abf93a3e9de4117abcb56cc533007ea96680010",
+ "manual"
+ ],
+ "core-aam/none_used_on_ul_element_with_li_children_new-manual.html": [
+ "b8e90f929bab2ca1fc30e04f841fc49a931531e3",
+ "manual"
+ ],
+ "core-aam/note-manual.html": [
+ "ae0d55036db32cf4646d2f6dd8ce13c374f71712",
+ "manual"
+ ],
+ "core-aam/option_inside_combobox-manual.html": [
+ "8e13f4e37088d43288d73b65cadedd884ccd3e32",
+ "manual"
+ ],
+ "core-aam/option_not_inside_combobox-manual.html": [
+ "fb5244e2337d0b0589fa111cd11474bbddefb8ce",
+ "manual"
+ ],
+ "core-aam/presentation-manual.html": [
+ "6d164fca767b1dc0002f958f04a7484ada67ebc9",
+ "manual"
+ ],
+ "core-aam/presentation_used_on_element_that_is_focused_or_fires_event-manual.html": [
+ "d671a5e21682870819586eecc6a9f3d74182eac9",
+ "manual"
+ ],
+ "core-aam/presentation_used_on_table_element_with_td_children_new-manual.html": [
+ "4494e50029966771e05f4261a4204e451c1088ba",
+ "manual"
+ ],
+ "core-aam/presentation_used_on_ul_element_with_li_children_new-manual.html": [
+ "9c4256fbab54a0651372c010df4b4b54645d48c3",
+ "manual"
+ ],
+ "core-aam/progressbar-manual.html": [
+ "c4fd3f1c2a0762700aa7b05dff80b47123fdc2c5",
+ "manual"
+ ],
+ "core-aam/radio-manual.html": [
+ "cecdb8fde332fb31e61324ada239079ab925e7b2",
+ "manual"
+ ],
+ "core-aam/radiogroup-manual.html": [
+ "9c9d0db1ace6d092d64fda9db7e5c6ce7755c84b",
+ "manual"
+ ],
+ "core-aam/region_with_an_accessible_name_new-manual.html": [
+ "2fa731fdafc525eb1ca9c5958d6815c6eadd83b4",
+ "manual"
+ ],
+ "core-aam/region_without_an_accessible_name_new-manual.html": [
+ "a2a6f7766fe0b57726b6f7fb76de982b5830d510",
+ "manual"
+ ],
+ "core-aam/row_inside_treegrid-manual.html": [
+ "41b5f2cb912d1fe031dca42b6591f6d080522f28",
+ "manual"
+ ],
+ "core-aam/row_not_inside_treegrid-manual.html": [
+ "cefd7631e03b4c182ed16d46cf3ece9a7eeb49d9",
+ "manual"
+ ],
+ "core-aam/rowgroup-manual.html": [
+ "9a11d3a6fbd7866736a930ff522c1fa6622fc878",
+ "manual"
+ ],
+ "core-aam/rowheader-manual.html": [
+ "dcd21b93f6230837f587bc616e259578ac8118aa",
+ "manual"
+ ],
+ "core-aam/scrollbar-manual.html": [
+ "1cec55790cb5b7394872df2b9003fde85b0ba176",
+ "manual"
+ ],
+ "core-aam/search-manual.html": [
+ "5ef988d9e86bcc57d5cba3050af31cf455225029",
+ "manual"
+ ],
+ "core-aam/searchbox_new-manual.html": [
+ "b376ede0ebd4b86f9bd70e73c14043abe33b69e0",
+ "manual"
+ ],
+ "core-aam/separator_focusable_new-manual.html": [
+ "0ef8d2f270a3bb97ef1d1cc96758cafcefe56dc5",
+ "manual"
+ ],
+ "core-aam/separator_non-focusable-manual.html": [
+ "2bb493f07c66109f4f616c88456f7d6ea0af4fdb",
+ "manual"
+ ],
+ "core-aam/slider-manual.html": [
+ "07890401b354c4374c234567296e6e3e8002b5da",
+ "manual"
+ ],
+ "core-aam/spinbutton-manual.html": [
+ "d1b86e8184d1f4bf0120c14314d38b2b21db6155",
+ "manual"
+ ],
+ "core-aam/status-manual.html": [
+ "ae21b30623663495df042c975a22ef820f46d5f5",
+ "manual"
+ ],
+ "core-aam/switch_new-manual.html": [
+ "1ad6e017f138891c62a4671bc957a47efd51019b",
+ "manual"
+ ],
+ "core-aam/tab-manual.html": [
+ "f1e10ec87a29ee5ea7e535f69da392dfcbdd6533",
+ "manual"
+ ],
+ "core-aam/table_new-manual.html": [
+ "41ddee4a58eaffaf6c0236ab0299ed7df4c3a7be",
+ "manual"
+ ],
+ "core-aam/tablist-manual.html": [
+ "dcc005bbf334f34f87e997dc2f514c19400b921d",
+ "manual"
+ ],
+ "core-aam/tabpanel-manual.html": [
+ "cce118b7d1002c1dc895f08a31d8dba2fc34f92b",
+ "manual"
+ ],
+ "core-aam/term_new-manual.html": [
+ "c551a46778d6f983ad890efcad40fbf19efafa47",
+ "manual"
+ ],
+ "core-aam/textbox_when_aria-multiline_is_false-manual.html": [
+ "b6798573553d05d1633e99292af9a21b99421d36",
+ "manual"
+ ],
+ "core-aam/textbox_when_aria-multiline_is_true-manual.html": [
+ "01569747831aa6cc672c054664030767215cf8a4",
+ "manual"
+ ],
+ "core-aam/timer-manual.html": [
+ "45e10de6a4de88047e63713c9d1cb1a13ede9269",
+ "manual"
+ ],
+ "core-aam/toolbar-manual.html": [
+ "e8dd02cba761318997d69fc44bc2fb0fd6c42c2d",
+ "manual"
+ ],
+ "core-aam/tooltip-manual.html": [
+ "d0ce96d1ce2d918f41ac2c595ab22ba0bd647d82",
+ "manual"
+ ],
+ "core-aam/tree-manual.html": [
+ "51dc4b4b499fea248051556f48bec20b8b8dbae2",
+ "manual"
+ ],
+ "core-aam/treegrid-manual.html": [
+ "6d8e0f4056481bd18a894fc9a2666ce998e14e53",
+ "manual"
+ ],
+ "core-aam/treeitem-manual.html": [
+ "adb1499f09e7b3d86f359ce526260b312d51e207",
+ "manual"
+ ],
"cors/304.htm": [
"644c902be2861bed6dfa48ed12a12b08c6d9a2f5",
"testharness"
@@ -432742,29 +439507,121 @@
"support"
],
"credential-management/credentialscontainer-create-basics.https.html": [
- "49f1139b264e09fd398fa14b37ecc94119b63558",
+ "ee1e63bbe0d74a932650c2c32ed26d7ca41e1c7d",
"testharness"
],
"credential-management/idl.https.html": [
- "0df70baded35ef70ab7395c8933ba7e1d041aa85",
+ "e9a108beef51c52bbaaf2e53371aec57e69541c0",
"testharness"
],
- "css-font-display/font-display-ref.html": [
- "26fcc2758c649ce922397cd1c4aa862bdbf1e6a0",
+ "css-backgrounds/background-clip-color-ref.html": [
+ "82aaf4a4516534051621142b11a567b91dbc8a0d",
"support"
],
- "css-font-display/font-display.html": [
- "d83914326318602ce0eef5f248254a391b338df0",
+ "css-backgrounds/background-clip-color-repaint-ref.html": [
+ "2bfc7fdecbde5d71301222d9c6549b97caee0d89",
+ "support"
+ ],
+ "css-backgrounds/background-clip-color-repaint.html": [
+ "ca6786586a6e6ba2d0c677c68f4cad67c787aedd",
"reftest"
],
- "css-font-display/resources/slow-ahem-loading.py": [
- "aac16c1e618841ebdd28463adf5688ca837b9d57",
- "support"
+ "css-backgrounds/background-clip-color.html": [
+ "9680097433363351d87f2b34da76108a3d33a5d9",
+ "reftest"
+ ],
+ "css-cascade/inherit-initial.html": [
+ "67ecb845c4bcdacc8185b0f78d36856f9a408342",
+ "testharness"
],
"css-font-loading/fontfacesetloadevent-constructor.html": [
"ad355c3d5220c1b938182241a8e8abe030ace699",
"testharness"
],
+ "css-fonts/font-display/font-display-ref.html": [
+ "26fcc2758c649ce922397cd1c4aa862bdbf1e6a0",
+ "support"
+ ],
+ "css-fonts/font-display/font-display.html": [
+ "46e883b5b615b2aa8ba7e8eff3eb197f64614df2",
+ "reftest"
+ ],
+ "css-fonts/matching/OWNERS": [
+ "2f711301297bd297b6bf5ccde958cd7a59c9e678",
+ "support"
+ ],
+ "css-fonts/matching/README.md": [
+ "194fbc4cdaf1ff4a43e1a4e6b7bc7fbc17eec6d8",
+ "support"
+ ],
+ "css-fonts/matching/fixed-stretch-style-over-weight-ref.html": [
+ "ad90e9467acd3120ba00239b453199aa95497c5e",
+ "support"
+ ],
+ "css-fonts/matching/fixed-stretch-style-over-weight.html": [
+ "3badf758ea56c9fb5113abca48be629f293e6abf",
+ "reftest"
+ ],
+ "css-fonts/matching/font-matching.css": [
+ "a24323853e4e73ee13b9a969090b0f721024114b",
+ "support"
+ ],
+ "css-fonts/matching/resources/variabletest_matching.ttf": [
+ "de5e05decac0303e5297ed2cb067c715ff4c4adf",
+ "support"
+ ],
+ "css-fonts/matching/stretch-distance-over-weight-distance-ref.html": [
+ "40ff6866132dd3e29a8d85c5fd949aba729ae304",
+ "support"
+ ],
+ "css-fonts/matching/stretch-distance-over-weight-distance.html": [
+ "2d666b0543d30fc1cf85fc7a9bda1946ed83507d",
+ "reftest"
+ ],
+ "css-fonts/matching/style-ranges-over-weight-direction-ref.html": [
+ "05fe52539dc7bb809fc88ee1fee597288d843bf1",
+ "support"
+ ],
+ "css-fonts/matching/style-ranges-over-weight-direction.html": [
+ "9959089a65b466230e6217944c68342e5269b49a",
+ "reftest"
+ ],
+ "css-fonts/variations/OWNERS": [
+ "2f711301297bd297b6bf5ccde958cd7a59c9e678",
+ "support"
+ ],
+ "css-fonts/variations/font-parse-numeric-stretch-style-weight.html": [
+ "b9aa593e5fcba0d7af8f66446d473608a7025f1c",
+ "testharness"
+ ],
+ "css-fonts/variations/resources/variabletest_box.ttf": [
+ "2fc122ff444d3ddef1f29ebde9a87827244ceeb0",
+ "support"
+ ],
+ "css-fonts/variations/variable-box-font-ref.html": [
+ "65ccabcdeaa322eeceaa646863eba52654e3149b",
+ "support"
+ ],
+ "css-fonts/variations/variable-box-font.html": [
+ "f3836fd9ea898b84bcef5dc259eeadbd4ecaeb68",
+ "reftest"
+ ],
+ "css-fonts/variations/variable-gpos-m2b-ref.html": [
+ "769b04d218db5f7d882512b17c70683281499481",
+ "support"
+ ],
+ "css-fonts/variations/variable-gpos-m2b.html": [
+ "af751a58338e49cc18b0b54c9451662d223f4977",
+ "reftest"
+ ],
+ "css-fonts/variations/variable-gsub-ref.html": [
+ "1b80955335d4a14f3e0d545a6b5165aadff05a87",
+ "support"
+ ],
+ "css-fonts/variations/variable-gsub.html": [
+ "2ae8392efc584c909f11ca04fb33a77f1b3c65ba",
+ "reftest"
+ ],
"css-paint-api/OWNERS": [
"0c1517f7ba747014c7c091b61d48f11421ed91c2",
"support"
@@ -432774,7 +439631,7 @@
"support"
],
"css-paint-api/background-image-alpha.html": [
- "2476286f8be52ae4f8ba22dd939b961d8e7ca379",
+ "84acc5f998812497d344067d7095c7561dda13ee",
"reftest"
],
"css-paint-api/background-image-multiple-ref.html": [
@@ -432786,11 +439643,91 @@
"reftest"
],
"css-paint-api/background-image-tiled-ref.html": [
- "a879be73470aae683bd7596132225770bc8be27b",
+ "bcee5040691f057a672e58eec3beed75122be3b8",
"support"
],
"css-paint-api/background-image-tiled.html": [
- "03aff62fc21832b44d9de15805232d87d0089ed3",
+ "83f9e2566f9e6957fdf3b67e9e62374984861e78",
+ "reftest"
+ ],
+ "css-paint-api/geometry-background-image-001-ref.html": [
+ "bca138ca3ce5b6dee10f935fd2ff9756d18b12ef",
+ "support"
+ ],
+ "css-paint-api/geometry-background-image-001.html": [
+ "a1f6d2148bfcdb68e4ca437b396b0ccbada101a9",
+ "reftest"
+ ],
+ "css-paint-api/geometry-background-image-002-ref.html": [
+ "4d33168e6298c1ed7d44ff431791615cdaf9038f",
+ "support"
+ ],
+ "css-paint-api/geometry-background-image-002.html": [
+ "f48a940cfc7b3654ee92b655330ae30af5315e17",
+ "reftest"
+ ],
+ "css-paint-api/geometry-background-image-tiled-001-ref.html": [
+ "475fd7979cd173f378c03a7d9d27503e12c2dc7c",
+ "support"
+ ],
+ "css-paint-api/geometry-background-image-tiled-001.html": [
+ "a892266cab4d74a3f4df2bbe1cda8823a38f3153",
+ "reftest"
+ ],
+ "css-paint-api/geometry-background-image-tiled-002-ref.html": [
+ "c5363f4f7843ff8025ae5457524c0c9f4aac144c",
+ "support"
+ ],
+ "css-paint-api/geometry-background-image-tiled-002.html": [
+ "051788b53366cffcc10debdf2d678d50bffd1f54",
+ "reftest"
+ ],
+ "css-paint-api/geometry-background-image-tiled-003-ref.html": [
+ "d4f9428be3b8f9003eb9373b3eb87ebed0c55c15",
+ "support"
+ ],
+ "css-paint-api/geometry-background-image-tiled-003.html": [
+ "29141ae2c9c87237ed3406dd43c6b3a7a1a5aa36",
+ "reftest"
+ ],
+ "css-paint-api/geometry-border-image-001-ref.html": [
+ "81026e756ea8e3be653e176c09f1762507915cb8",
+ "support"
+ ],
+ "css-paint-api/geometry-border-image-001.html": [
+ "d8f948af1254c810496739e4c7cc570ba96cf64f",
+ "reftest"
+ ],
+ "css-paint-api/geometry-border-image-002-ref.html": [
+ "076c1f3e3b5cfd3a434e94f33872f5f598a7225b",
+ "support"
+ ],
+ "css-paint-api/geometry-border-image-002.html": [
+ "57b518eb310db31c40f0db37637b0f8199ee9734",
+ "reftest"
+ ],
+ "css-paint-api/geometry-border-image-003-ref.html": [
+ "141bf94dcd935420b95ee4da52139bf51318196d",
+ "support"
+ ],
+ "css-paint-api/geometry-border-image-003.html": [
+ "9d01df8817d9e5beb27d3439789cbe914c418b2c",
+ "reftest"
+ ],
+ "css-paint-api/geometry-border-image-004-ref.html": [
+ "d730b44bd1020305b70da095a15f9a4f7e9f262a",
+ "support"
+ ],
+ "css-paint-api/geometry-border-image-004.html": [
+ "368a9d855ffc46457e6c54cddfbc934e92096ee0",
+ "reftest"
+ ],
+ "css-paint-api/hidpi/device-pixel-ratio-ref.html": [
+ "18f9d4d369de750ceb92c2e275ede5fcb3bf6f49",
+ "support"
+ ],
+ "css-paint-api/hidpi/device-pixel-ratio.html": [
+ "470ec454e18e5398718f3117171b172208f84fee",
"reftest"
],
"css-paint-api/invalid-image-constructor-error-ref.html": [
@@ -432830,7 +439767,7 @@
"support"
],
"css-paint-api/paint-arguments.html": [
- "7e70944e4d1dd456cc91eb443f09bb2e28b812f4",
+ "7acf977d7e09bb85ada1b0df7fd9e4ea3a11ddfe",
"reftest"
],
"css-paint-api/paint-function-arguments-ref.html": [
@@ -432838,7 +439775,7 @@
"support"
],
"css-paint-api/paint-function-arguments.html": [
- "e4083cf39fca7ce4783d36e3235d4cfecf7d2db9",
+ "cc19f4bc39c7a2cc1d9ed35a6a5a50d3935830af",
"reftest"
],
"css-paint-api/paint2d-composite-ref.html": [
@@ -432905,12 +439842,136 @@
"f840916bab6d10cff1b08d1cfaecee97699d80cb",
"reftest"
],
+ "css-paint-api/parse-input-arguments-001.html": [
+ "0ba1a9978d295825784a2909447e565701e6fc09",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-002.html": [
+ "d35b4e39d8b0f54935571ee62fe7255e93c917dd",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-003.html": [
+ "f6c8cb6feba2b14349bc3fa3170b278e698df526",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-004.html": [
+ "1dd64759c041d9633ce04add066f4e1573fd05e5",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-005.html": [
+ "25d32d33e5de6d289d0e8c776876cb66f03e7c2e",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-006.html": [
+ "effa515567b0212403d83588c335d8fc72c056f6",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-007.html": [
+ "f2f837e7c82462f17d9ebb1a8ab5346e5b8c945c",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-008.html": [
+ "60034209a8984ac0be807494fc4373329d3792eb",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-009.html": [
+ "d57e2370218d385a02e2021219869b5dec0e45c4",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-010.html": [
+ "9d4ef380f3596a73ea7816d13b3913b541ec05b9",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-011.html": [
+ "15edc8fc44d339514911566fe7cf07ec899cf04a",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-012.html": [
+ "0cc064f143a0b1bed6b6e3b79f9a95754eb60ea3",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-013.html": [
+ "e4a99687b156723308ed27a9e863754cb6dcdbd2",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-014.html": [
+ "c10d44a53a00e6a9745d6ea1c359298723a0aee1",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-015.html": [
+ "a78c728b67af31e47c8d46e60e33ba437769a020",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-016.html": [
+ "1c14dbe6c6bc0f218724731112c4c45888ede8b5",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-017.html": [
+ "cba3754c5044665b2648fec05e25d7b6028c185f",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-018-ref.html": [
+ "7dd468373f6efa2b5a3a8d16c91c0d4dec87c143",
+ "support"
+ ],
+ "css-paint-api/parse-input-arguments-018.html": [
+ "b606bfff93300f114ea4efab85e489727e9821c7",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-019.html": [
+ "db11565957c3da1ca7a51b9ab36cd4a823386a55",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-020.html": [
+ "acbff610abd29a01574add30679b43d7a735c9bd",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-021.html": [
+ "6f567a29ed4ec26ad8c97277469783a614a5811b",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-022.html": [
+ "9f0efcee3e1412faa19fe50f475623fd5cf2852b",
+ "reftest"
+ ],
+ "css-paint-api/parse-input-arguments-ref.html": [
+ "6133bd65ef569456f58f1e501d81e088256bdc0a",
+ "support"
+ ],
+ "css-paint-api/registered-properties-in-custom-paint.html": [
+ "3855c8c28ea3a24bade81080f3f288ef75243dce",
+ "reftest"
+ ],
+ "css-paint-api/style-background-image-ref.html": [
+ "0985e20363c8aac715c534ad59f1209889244fb0",
+ "support"
+ ],
+ "css-paint-api/style-background-image.html": [
+ "a3202db04922cc2527436fa319ea9e8432eecdcd",
+ "reftest"
+ ],
+ "css-paint-api/style-before-pseudo-ref.html": [
+ "6dcbe78ab89343178e18e3e92744b25759ec8241",
+ "support"
+ ],
+ "css-paint-api/style-before-pseudo.html": [
+ "7808e4e86a0556202a0e2ea5574d60c94bf2c537",
+ "reftest"
+ ],
+ "css-paint-api/style-first-letter-pseudo-ref.html": [
+ "c6a94e5bafa098b8f4023312db97abebe992abc3",
+ "support"
+ ],
+ "css-paint-api/style-first-letter-pseudo.html": [
+ "034cc6ebdf18ea4d346a2a363be69eb8added8e7",
+ "reftest"
+ ],
"css-paint-api/valid-image-after-load-ref.html": [
"b0c34ee1480fe1108fe8dc53f2bbb2f3ffa1c408",
"support"
],
"css-paint-api/valid-image-after-load.html": [
- "4f20acb987ed51fc374d873db74522ed4bd1dc1c",
+ "c00a13e38ba694a79e4934c854684aaaf0b19068",
"reftest"
],
"css-paint-api/valid-image-before-load-ref.html": [
@@ -432918,7 +439979,19 @@
"support"
],
"css-paint-api/valid-image-before-load.html": [
- "67d8cdd3e3a1656ba315fcbf6dae7236680bac16",
+ "89d6d44680d1df3fdc7ece62ff7ed2edffbaa01d",
+ "reftest"
+ ],
+ "css-scoping/slotted-parsing.html": [
+ "6bac5b15011d7177a40f7ca3e3c5f7e410643920",
+ "testharness"
+ ],
+ "css-scoping/slotted-with-pseudo-element-ref.html": [
+ "48561a3dff973b7ad1bfa9702461e50fd4a67c2d",
+ "support"
+ ],
+ "css-scoping/slotted-with-pseudo-element.html": [
+ "27d36ba54623bbee2cdd09b7a9322873d5ab0011",
"reftest"
],
"css-timing/OWNERS": [
@@ -432957,10 +440030,6 @@
"1b98ee851da85aa7ffd3d523df0fd2fd4fdbef22",
"testharness"
],
- "css-values/unset-value-storage.html": [
- "d2e5101f623e29cc993fe2460f6c85f6ec31b471",
- "testharness"
- ],
"css/.gitignore": [
"3f645ca3bf6a77220d48e3e07b6dc3e1653d883c",
"support"
@@ -445430,11 +452499,11 @@
"support"
],
"css/CSS2/cascade-import/cascade-import-001.xht": [
- "289ea30a31e27c4905d28a161ce2f77dff7cb038",
+ "154b8c59cec3584cc4149bce971c84311e6c67d1",
"visual"
],
"css/CSS2/cascade-import/cascade-import-002.xht": [
- "98e6cc9795316c8d5fbaa3ec3ca4154e0ae4035c",
+ "21af08d33a535ac504c6dded1bb700d586856013",
"visual"
],
"css/CSS2/cascade-import/cascade-import-002.xht.headers": [
@@ -445442,43 +452511,43 @@
"support"
],
"css/CSS2/cascade-import/cascade-import-003.xht": [
- "f6c0f2a7bc06d33768b08a880481b2527ed9d0c1",
+ "dc954fbc95b9a2bc2f110bed7592a6e029cc4fca",
"visual"
],
"css/CSS2/cascade-import/cascade-import-004.xht": [
- "9c5b97594d38b42d00ee6afc2ab84308a6e2137d",
+ "a72a523e76c4e2f8649d1cf3802ebb0773af0ea0",
"visual"
],
"css/CSS2/cascade-import/cascade-import-005.xht": [
- "a687750e720cf404c1b7b5c7b71c3b08c83923c1",
+ "3e19c7a2c2714a558bd1d4602f524cde70a0871d",
"visual"
],
"css/CSS2/cascade-import/cascade-import-006.xht": [
- "82f090dbead7152a3f3bcbdd9c8341454f044833",
+ "da452116aa5ab417ac4227fceba0a0643c637c2f",
"visual"
],
"css/CSS2/cascade-import/cascade-import-007.xht": [
- "e2539df6c095e4691b22a0afd0b262a3f4d29e13",
+ "04023f5a6710edfe6a9b93908a6e5ad3f2525d37",
"visual"
],
"css/CSS2/cascade-import/cascade-import-008.xht": [
- "471d83c2b5e58b4bf1b48ab1a834d981626ea239",
+ "9a7292be04cd685aff2061861fae1a2f85e872d6",
"visual"
],
"css/CSS2/cascade-import/cascade-import-009.xht": [
- "145a7fa727698b6ac5baa09e2a74dd63229d60fc",
+ "b286496dae37010603295963f20a6a7db5ce31bf",
"visual"
],
"css/CSS2/cascade-import/cascade-import-010.xht": [
- "eef3ce408a486c1fcfd2bc7326f606792bf4c0c4",
+ "5bbae9f69eb8670e98e88b005fe84a5bee20aa3c",
"visual"
],
"css/CSS2/cascade-import/cascade-import-011.xht": [
- "aa542944296ed23a3cda10c32ae90cb9deeb2915",
+ "f21fa7845a784c13a17ebe9ca82bfba10ec4a88d",
"visual"
],
"css/CSS2/cascade-import/cascade-import-012.xht": [
- "2eb70f8e963a45e01eca960cd548d6d590c963dc",
+ "20ed7447eab30ffd26ed845d4ae4facf60cca933",
"visual"
],
"css/CSS2/cascade-import/cascade-import-dynamic-001.xht": [
@@ -445590,35 +452659,35 @@
"support"
],
"css/CSS2/cascade/at-import-001.xht": [
- "3896ade2b506eeb79dc9970653424920bd7e2192",
+ "30b7cfeefb95781bc4ff9db0aed2205cc2fb3c63",
"visual"
],
"css/CSS2/cascade/at-import-002.xht": [
- "d7b441538990cc1f858f0fecd8d2cfa413c0fb8c",
+ "b05099d0d46e6c09538af63def233b3e33ec415a",
"reftest"
],
"css/CSS2/cascade/at-import-003.xht": [
- "8fde16da5337dc0473760472813dc47ef2b15b63",
+ "02c087cb1b7a295c646016cfebb987c8e78f1d2e",
"reftest"
],
"css/CSS2/cascade/at-import-004.xht": [
- "c8c8d806b6507e606df5fbff49555835e3958c08",
+ "f5f78238d51d2e9f37f8bdaf41451befd629a5b3",
"reftest"
],
"css/CSS2/cascade/at-import-005.xht": [
- "a7e6b9bcd1e61f9a6ddaf911f4bf7b6975628ff2",
+ "3119dba1fefacc38eb3644eff3603f28b0bea97d",
"reftest"
],
"css/CSS2/cascade/at-import-006.xht": [
- "0c4f14266b5019d7e36dc35e7d342e4ba8c66068",
+ "7ffdebc029d8699310d9d7bc97ed1d5875ca72b0",
"reftest"
],
"css/CSS2/cascade/at-import-007.xht": [
- "76a2a7f242187477c716f9dfc77673bc5729df83",
+ "a3f9b450a8809ba307a0bc303661324c02ab93ae",
"reftest"
],
"css/CSS2/cascade/at-import-008.xht": [
- "abd6995549462a9963e80be8259293b21bef19f6",
+ "30a6545a8255e5a8a9845f06c686be209a573fb1",
"manual"
],
"css/CSS2/cascade/at-import-009.xht": [
@@ -445634,39 +452703,39 @@
"reftest"
],
"css/CSS2/cascade/cascade-001.xht": [
- "6dc93f0a3e66f7577eaf1cacb505ae9148514509",
+ "f39bf31d8fe13a77dc506e848f5a293eb558d148",
"manual"
],
"css/CSS2/cascade/cascade-002.xht": [
- "e709afbcbea183aaf6cb99468785564e22562e60",
+ "df77697e13d27b06e394abec4a7d9390e33ac5c7",
"manual"
],
"css/CSS2/cascade/cascade-003.xht": [
- "f909dc0bcff179a9e8eed2724f9a5749fddba2d6",
+ "9c408a90c98fa39268fe1e8fb46a0735e6921937",
"manual"
],
"css/CSS2/cascade/cascade-004.xht": [
- "b9464957521438a96f96f5a046c6cdff55f39c93",
+ "5898da319a9a42c3a23b09da1a47d41ff36a066c",
"manual"
],
"css/CSS2/cascade/cascade-005.xht": [
- "429bd4e5c804e9b30c2070a3f63a03ae93dd0f62",
+ "ae410ece5c98b3bf1463b7cbd9431efef5aaf91a",
"reftest"
],
"css/CSS2/cascade/cascade-006.xht": [
- "d56a26056bf86ca2a584e5a8f1acde562e44c1bf",
+ "3be58168e01e29af2709f604cfd7b3236802881e",
"manual"
],
"css/CSS2/cascade/cascade-007.xht": [
- "28505c90b9cec7275718ade3b83826c4942f3357",
+ "939ff78758e0ce168d58559330a569921203667f",
"reftest"
],
"css/CSS2/cascade/cascade-008.xht": [
- "700cd41fac22d47df56770ba97ea3935b6d9e008",
+ "df17ac34cd57bfecee7702a6ebbcc409e3bf5031",
"visual"
],
"css/CSS2/cascade/cascade-009.xht": [
- "f6099327b89ccc51ea050d62342ddb749d1db9e0",
+ "3c16373a6ef462b139737a60048a3e66edc2784a",
"reftest"
],
"css/CSS2/cascade/cascade-009a-ref.xht": [
@@ -445674,7 +452743,7 @@
"support"
],
"css/CSS2/cascade/cascade-009a.xht": [
- "bb213cadb23a2e1f10c49965c93883994b458924",
+ "54d6fb04bf0d298e974409c20aa7d7d47fbf4ba1",
"reftest"
],
"css/CSS2/cascade/cascade-009b-ref.xht": [
@@ -445682,15 +452751,15 @@
"support"
],
"css/CSS2/cascade/cascade-009b.xht": [
- "dc5306f49664138890a6ff22d8c74d8de0b7854c",
+ "1d50e0ef9b9a89ec68d2e7df92c5d07754848462",
"reftest"
],
"css/CSS2/cascade/cascade-010.xht": [
- "dbdac362e62d26194704641669b766ce3ea56a27",
+ "d636b32ab4cce902fe43f3b7d8cca96d212050cb",
"manual"
],
"css/CSS2/cascade/cascade-011.xht": [
- "1fb4fadd9098c44a2d9917c0e0795f7b2d492994",
+ "c4c833c39c0800380d90be637413a0563679274e",
"manual"
],
"css/CSS2/cascade/cascade-012-ref.xht": [
@@ -445698,139 +452767,139 @@
"support"
],
"css/CSS2/cascade/cascade-012.xht": [
- "f04032cfa0a4ad28974702aeb03554fdeb29dffe",
+ "9f08b93b3b63ef08e43cbaea0a69061cdce68385",
"reftest"
],
"css/CSS2/cascade/cascade-precedence-001.xht": [
- "e55a2eb26b7d3325252b0c41af08c8b04815c3b1",
+ "e652c002d426adb389e47d71031188783195a9d7",
"visual"
],
"css/CSS2/cascade/cascade-precedence-002.xht": [
- "353a2693533496e3970b5516b732f3c04f4800ea",
+ "2a6653c4f456e277da4239ee392c529414e2c78e",
"visual"
],
"css/CSS2/cascade/default-stylesheet-001.xht": [
- "5240b7b068fe223f9560d1d856b51272099ae619",
+ "f9dd36c30d1600765e79fb30d37b03dc2ac96637",
"visual"
],
"css/CSS2/cascade/html-attribute-001.xht": [
- "0f1741f04e3087e4f37ea41a35ae1085357b609b",
+ "dd9dc535b8bbd732cb3024fd250543c6f906e4fb",
"visual"
],
"css/CSS2/cascade/html-attribute-002.xht": [
- "fc460e14ddf2498bca1f431896e1661934cc088f",
+ "f554aca4ec535abb1b8cb8bc211e9f7065cf2fc8",
"manual"
],
"css/CSS2/cascade/html-attribute-003.xht": [
- "739c604c23945b29c94170626fd67bddd2c1b285",
+ "ea60e1374448098ee27f7b454a515ebe7e01aa04",
"visual"
],
"css/CSS2/cascade/html-attribute-004.xht": [
- "7c33b434a5288ad6a964c661649afba8e5b3163a",
+ "40b24f5202e0601d1735232ba0e87cdaf17c69c3",
"visual"
],
"css/CSS2/cascade/html-attribute-005.xht": [
- "3d60fcee78a36750494dcbcebd2ab8158d484e41",
+ "e88b63728559b6a5d41b0011b3ceed329127c50c",
"visual"
],
"css/CSS2/cascade/html-attribute-006.xht": [
- "edd51222411c1d8c99e2766071fb9b91a115c3c7",
+ "f8eecce89358d95ba0c7e36acb0ba66d0c1a3315",
"visual"
],
"css/CSS2/cascade/html-attribute-007.xht": [
- "2810f9253ad481610b8946852889845c3ff901da",
+ "ec876b1bc0e1041c01c889febef7585f2f3c2c71",
"visual"
],
"css/CSS2/cascade/html-attribute-008.xht": [
- "84246136326d802a74b6bbcfd22e736f9cf6216f",
+ "43a8538f62fb2443e268866927bf51687e69d89c",
"visual"
],
"css/CSS2/cascade/html-attribute-009.xht": [
- "d811e4938b4cd7e8e0204b321e9773b7c47af1c6",
+ "54a1ee9dfa4589fcbe344d7f057dfd0896831968",
"reftest"
],
"css/CSS2/cascade/html-attribute-010.xht": [
- "57796e12d56be790c7521aedff908faeac435075",
+ "f99c3bc2172d07bbb97a76c0f148ee2c72b66ec9",
"visual"
],
"css/CSS2/cascade/html-attribute-011.xht": [
- "03aca910f1f72c1b5c5cfa6938e630d9bdd4386d",
+ "8d87b51e86ed58ca1340995b760a57fdf1241bee",
"visual"
],
"css/CSS2/cascade/html-attribute-012.xht": [
- "fde0f39c8fae8742b3dd68562a2d0e7e8b19ed4a",
+ "8b6726a045cc8c02ce706ba0491c0626673f0d9c",
"visual"
],
"css/CSS2/cascade/html-attribute-013.xht": [
- "be5c75fd6c0f69308afc7462aaa4bf5ba1691a11",
+ "2984d5c3ff9b9aeea967f14e86b9e9457d429d34",
"visual"
],
"css/CSS2/cascade/html-attribute-014.xht": [
- "bf404477d9f79ca433f85251ac3fd55175b21700",
+ "6ec1c986a8f817437973fdc0ea982969c04dc7b9",
"visual"
],
"css/CSS2/cascade/html-attribute-015.xht": [
- "19645860d40ba861cca7bb0aa4a0f878d64c4aa2",
+ "bc83e62f012d9f6e8e63650a996b7a37772e6169",
"visual"
],
"css/CSS2/cascade/html-attribute-017.xht": [
- "72922a75739af8e6c988c90055a1d3e3f7dba076",
+ "09fde2f3aa7668fcb7741ebd0d9ff7e912002ed6",
"visual"
],
"css/CSS2/cascade/html-attribute-018.xht": [
- "a8b6d197c376f3a22e986ba154a545d20f4d58ea",
+ "8ed048480d83ff01779e4ad16c48bece61b59ede",
"visual"
],
"css/CSS2/cascade/html-attribute-019.xht": [
- "bf252108640fa22ea15896ffe93389d4113b6849",
+ "2696b185d580aaf7c37c27097e73a0fca3f34f05",
"visual"
],
"css/CSS2/cascade/html-attribute-020.xht": [
- "82b199afcebfa9fd54620c3b194fcebe65170c07",
+ "23f83f2d2e1c3913b140b4833f99701a839b9e3c",
"visual"
],
"css/CSS2/cascade/html-attribute-021.xht": [
- "d14129f126e3369b6a50dd7933be670af89c0620",
+ "97650f036cf3e51accfc55000c1766860dadab37",
"visual"
],
"css/CSS2/cascade/html-attribute-022.xht": [
- "7d999ab374e0c429b73904bab782f32c2504ae8e",
+ "420b15055e71513145193c29441b487a16008c06",
"visual"
],
"css/CSS2/cascade/html-attribute-023.xht": [
- "aa7ab3d9072c99c34e055a64f131e04e25020017",
+ "0b341cf7f2fad123c26dd10e2dc383b6cdf7d0bf",
"visual"
],
"css/CSS2/cascade/html-attribute-024.xht": [
- "e4759f945a29bf990f2100518f16ea9393dea174",
+ "d258089c72177cb9fa388b366e4add458bc17ccc",
"visual"
],
"css/CSS2/cascade/html-attribute-025.xht": [
- "00b547f7a3ccde66cb6001ac3859f6544e740ecd",
+ "f38032a477349085e9ac577ff8e05ad586b51fce",
"visual"
],
"css/CSS2/cascade/html-attribute-027.xht": [
- "825dbf9995c33baeb2b6f1a402280878ca2425d4",
+ "c02758f732df064c2d5d5a2473825f10fbc2e475",
"visual"
],
"css/CSS2/cascade/html-attribute-028.xht": [
- "d7a8ba99d38b9578941f0dbc7a25ab0d44faa681",
+ "280468417dd7cda0d6f9ee3b49583b6067f6ef2f",
"reftest"
],
"css/CSS2/cascade/html-attribute-029.xht": [
- "361c46779db5bf3a4eb61ac51a8e863f7d4fd2a7",
+ "c964b1090b990c67585bc52cc4baf63b3b73d537",
"manual"
],
"css/CSS2/cascade/html-precedence-001.xht": [
- "a91d2183ff8c511bf3fa6a474b2450ccd6be24e7",
+ "6d02266ee1f8ea4bdb3b7e3e1db4cd77f5e9417a",
"reftest"
],
"css/CSS2/cascade/html-precedence-002.xht": [
- "125e22c813bc7fcfede7a841434bdb68b616bfee",
+ "1497f005d5dd936ecf4d8614cde71e5012cf0192",
"visual"
],
"css/CSS2/cascade/html-precedence-003.xht": [
- "32849ad79c455f152efe2f16d3051bdbb5408f9e",
+ "f0897b52d6a42c1ea5410fd3cc0f5cdfab48243f",
"manual"
],
"css/CSS2/cascade/html-precedence-004-ref.xht": [
@@ -445846,15 +452915,15 @@
"manual"
],
"css/CSS2/cascade/inherit-001.xht": [
- "0f149c5ab605ad2680e3b0b55d75ceca0e8d1705",
+ "fd8f544f18d18849df4d90fb97501564a9754a4d",
"visual"
],
"css/CSS2/cascade/inherit-002.xht": [
- "7e29b251393bfbca02fec97b3bf657cebf6b2b5e",
+ "da6997f8f1c8e2f7e847453d8a311e56c106f661",
"visual"
],
"css/CSS2/cascade/inherit-003.xht": [
- "cfcd2eca16e08d181218fb2e13ee996def03e28e",
+ "5789a88efd6608631de6c181417956b0babf0b3c",
"visual"
],
"css/CSS2/cascade/inherit-004.xht": [
@@ -445882,55 +452951,55 @@
"reftest"
],
"css/CSS2/cascade/inherited-value-001.xht": [
- "8208918e0da9b4b3e4479019851a9c5b451cab85",
+ "c079776a53953344db95dde98245f19a458ceded",
"visual"
],
"css/CSS2/cascade/inherited-value-002.xht": [
- "254a39f59d428ec1594f889adb39185f877a6b0c",
+ "aaaee58caf78f7ba7036820b327999b24b361ecf",
"visual"
],
"css/CSS2/cascade/non-inherited-value-001.xht": [
- "64e9c139da44668640004a07aec18f2514b7024c",
+ "c112ada532e7d8cef93353d8c25cde313ad8c436",
"visual"
],
"css/CSS2/cascade/sort-by-order-001.xht": [
- "4edcdee3c31b5c9ba55922ff287c88eeedbb9c2e",
+ "5361866834f562743620a3decdc265417cb03874",
"reftest"
],
"css/CSS2/cascade/specificity-001.xht": [
- "96764188297fc2912f1bf2b63ceeb2c9bd8117f6",
+ "be1c69d16b1663290f6654dbf13d198f3962ac49",
"reftest"
],
"css/CSS2/cascade/specificity-002.xht": [
- "05ebe0a1f9a50575d84c84ccebe0928401fe1722",
+ "2f48bbed3651f133990ebb920bab40d6f36e5def",
"reftest"
],
"css/CSS2/cascade/specificity-003.xht": [
- "b5630ecd8b85507f16bc62bc7f77e6c9250fe412",
+ "b9b581ea8a5fc47363d53199320b4efd9a540a87",
"reftest"
],
"css/CSS2/cascade/specificity-004.xht": [
- "f804be28647d13020bca45f04f5fd094ccfdaaf2",
+ "df26fea241616ca5e138e1f39a6da64a6563884c",
"reftest"
],
"css/CSS2/cascade/specificity-005.xht": [
- "e48d1ebf8c5f163724359fd0875be2f74b317fb8",
+ "0ba1071a009186b39ef155516b5720d0ffbfa680",
"reftest"
],
"css/CSS2/cascade/specificity-006.xht": [
- "46d51be389834670d57509b439dae9d45682cdfb",
+ "6855b79b60c2e5b20f1247bbea9273fc9ca97b6a",
"reftest"
],
"css/CSS2/cascade/specificity-007.xht": [
- "00a731b2ffe51f4a4989717a5c459249b32b94d0",
+ "1469c11c1e81ae061bafd97cbef46961ea053b62",
"reftest"
],
"css/CSS2/cascade/specificity-008.xht": [
- "28bac9adb96281a8147691a79bba26966001da79",
+ "38dd6f02bd96da07bd5afd5a659b8f949e2dc736",
"reftest"
],
"css/CSS2/cascade/specificity-009.xht": [
- "c8338dce9f0654217679337308e9b55e7fead1c9",
+ "e25dffe83501181ac9ba9fcd031bbfcb15f5ae71",
"visual"
],
"css/CSS2/cascade/specificity-011-ref.xht": [
@@ -445938,11 +453007,11 @@
"support"
],
"css/CSS2/cascade/specificity-011.xht": [
- "154f23052a0244539ac99494d60e022930bde40a",
+ "fd074fba9218f3c313e5ff570038fd48282bf3ea",
"reftest"
],
"css/CSS2/cascade/specificity-012.xht": [
- "068a0e84bea0d68d8ba9835989033f1368f6dd96",
+ "f23f31601d1b64b1b0648f54470a111565b3ae33",
"manual"
],
"css/CSS2/cascade/specificity-013-ref.xht": [
@@ -445950,7 +453019,7 @@
"support"
],
"css/CSS2/cascade/specificity-013.xht": [
- "b8ae6a1d9fc72ebcaae4ee4f2b4f9708c2c0386d",
+ "5b8f1f118448eaee145f4aab8326fb3e11949f8b",
"reftest"
],
"css/CSS2/cascade/support/1x1-green.png": [
@@ -446166,75 +453235,75 @@
"support"
],
"css/CSS2/cascade/user-stylesheet-001.xht": [
- "545e6488a093978d324acd01efc26e6c888e067a",
+ "22c68a4ad54ada476d42fd11b238a0ada1e98701",
"manual"
],
"css/CSS2/cascade/user-stylesheet-002.xht": [
- "afc941b164ffde4040b371526d3fe4543e03d079",
+ "f8294b820f94d290d07fb7f9fc607edd95e9c206",
"manual"
],
"css/CSS2/cascade/user-stylesheet-003.xht": [
- "62d12c541879e901e6bc801ae69102612da6bc3d",
+ "1242c920a98f73c078cabba02c5115447ef439b3",
"manual"
],
"css/CSS2/cascade/user-stylesheet-004.xht": [
- "f17106f355f9a26d4e50fd5ef576cf74888d70ba",
+ "f890fa30bb3d41818e189494c3d376505a7839ed",
"manual"
],
"css/CSS2/cascade/user-stylesheet-005.xht": [
- "fd1154c0e2dc166f352835fd3e9417aee6deceed",
+ "b8796e3034e518cb4b5341108fa8b27961666f93",
"manual"
],
"css/CSS2/cascade/user-stylesheet-006.xht": [
- "491884b35b697ef37ec11f2bf8e8416333514d67",
+ "2e3452a6b28085de85489b5a34e856abff75d1bb",
"manual"
],
"css/CSS2/cascade/user-stylesheet-007.xht": [
- "33ca70084987063727a36db49192fdef390333f1",
+ "a6d3405185cfb10adf4ad570f3c63a6ae8a39cda",
"manual"
],
"css/CSS2/cascade/user-stylesheet-008.xht": [
- "4628f5fd83e64287824b4ab20e9e725ed50421b0",
+ "9947411c444a39532c5bd07c217ccd5fa6650cf8",
"manual"
],
"css/CSS2/cascade/user-stylesheet-009.xht": [
- "e68c9e52db142c54faf0ea2110715e9a7c52116f",
+ "39b4ec0e033f12e64a7727cac5cb966913cdfc05",
"manual"
],
"css/CSS2/cascade/user-stylesheet-010.xht": [
- "f4726c8065d11d0df141cec834b9b70fdee5a76d",
+ "11061bbe00e403efca964398e147cfca23614898",
"manual"
],
"css/CSS2/cascade/user-stylesheet-011.xht": [
- "1e8969149c10c745b54134c8e9758f9a48f1366c",
+ "c07393a90c556be74d8595df8e2372718aa402fd",
"manual"
],
"css/CSS2/cascade/user-stylesheet-012.xht": [
- "428af4a29a14d1ee47167f35141a65f51736fd57",
+ "bff85765268d0b374fc2720f32873a63c0ae10f7",
"manual"
],
"css/CSS2/cascade/user-stylesheet-013.xht": [
- "144db016594b4837672e48fdbaafc4d67e439f87",
+ "e4ae88139a836193052bddc5f93f02bf30ae3751",
"manual"
],
"css/CSS2/cascade/user-stylesheet-014.xht": [
- "e032b66f6bba806b03a01480bb520efc9a533de2",
+ "64b79759a9ce1eaf0aeb7bbf97a15bee601c3a4c",
"manual"
],
"css/CSS2/cascade/user-stylesheet-015.xht": [
- "5a9f2866e25fa53674f13b076893dff3bbd56615",
+ "73acd9e5ce152f3a0019126a8bde862f0a0d8458",
"manual"
],
"css/CSS2/cascade/user-stylesheet-016.xht": [
- "b74cac7b55673282eea944b6dd5ada9e04943d78",
+ "c327ad5d92507b27f6cde6213146611e25f22de3",
"manual"
],
"css/CSS2/cascade/user-stylesheet-017.xht": [
- "21be079bec2ab4c565a8e3daefcef3c629911869",
+ "336dbbf2519c0e2ed910a7d221fd0f5e915cebf2",
"manual"
],
"css/CSS2/cascade/user-stylesheet-018.xht": [
- "341e9a1685ec5b42ddeba413c341f700df3e5f98",
+ "74869c22d5441ad5a9a2c05c3ce231ca69c7650a",
"manual"
],
"css/CSS2/colors/bidi-color-001.xht": [
@@ -447526,7 +454595,7 @@
"support"
],
"css/CSS2/css1/c11-import-000.xht": [
- "3773a4f125c92eaa66778dd1fe34ba4cf38af899",
+ "b0607df10c8ac3a283e889500e3cc27dc37cb84e",
"reftest"
],
"css/CSS2/css1/c12-grouping-000-ref.xht": [
@@ -447538,7 +454607,7 @@
"reftest"
],
"css/CSS2/css1/c13-inh-underlin-000.xht": [
- "0b1d9e8113a1e8ba1433d9fed61be1c7ef02ede8",
+ "6f48fcc4ee9e5ae57a93bf5f8ddd0f4d6f0fe0b9",
"visual"
],
"css/CSS2/css1/c13-inheritance-000-ref.xht": [
@@ -447546,7 +454615,7 @@
"support"
],
"css/CSS2/css1/c13-inheritance-000.xht": [
- "ffa6eeba75a463f1b163c367ffd1b03ea6d551a9",
+ "06a5952afd4ec25a5b732e1dd62ac18ecead1bae",
"reftest"
],
"css/CSS2/css1/c14-classes-000-ref.xht": [
@@ -447618,11 +454687,11 @@
"manual"
],
"css/CSS2/css1/c21-pseu-cls-000.xht": [
- "908243b6f15d97941a18e72c8ae90ee4905c3746",
+ "3752b958a3d97464ae8cc4acbbf9d7ef1ffba2fc",
"manual"
],
"css/CSS2/css1/c21-pseu-id-000.xht": [
- "d25adb367411416379798b1ff8a0299cdc885ab1",
+ "55e3cc0a6fd38a4c25eaa3da50f72e1935e2843b",
"manual"
],
"css/CSS2/css1/c21-pseud-anch-000.xht": [
@@ -447666,7 +454735,7 @@
"visual"
],
"css/CSS2/css1/c31-important-000.xht": [
- "572fa7aef5061af8bdf76dc59be136aa4be6ac69",
+ "994ff1b613111ba0184e11ebd71606ce2f997354",
"reftest"
],
"css/CSS2/css1/c32-cascading-000-ref.xht": [
@@ -447674,7 +454743,7 @@
"support"
],
"css/CSS2/css1/c32-cascading-000.xht": [
- "b670e1150e3fd4f2db5e84f4313230b30535c5ff",
+ "eaacfd701d6097e7f4979868fcd44de08a799373",
"reftest"
],
"css/CSS2/css1/c411-vt-mrgn-000.xht": [
@@ -448178,7 +455247,7 @@
"support"
],
"css/CSS2/css1/c548-ln-ht-003.xht": [
- "4c8d330304096c9edfff65ad228f5bcc332c37c0",
+ "e0b139cc3aec6f3e6cbdc977d096c6c4c062ea8a",
"reftest"
],
"css/CSS2/css1/c548-ln-ht-004-ref.xht": [
@@ -448186,7 +455255,7 @@
"support"
],
"css/CSS2/css1/c548-ln-ht-004.xht": [
- "ea3db64f183fec967dcdc5fe63e35b4dc9308b48",
+ "642ce41aa57f231f840497e9cc975d2d24512660",
"reftest"
],
"css/CSS2/css1/c5501-imrgn-t-000-ref.xht": [
@@ -449050,7 +456119,7 @@
"support"
],
"css/CSS2/css1/c64-uri-000.xht": [
- "7a6ccb6ec871d5bf99af51f0b551ec934ec16ff1",
+ "6ed2cc6e54d85b24f201f42ef60f10c564914ea5",
"reftest"
],
"css/CSS2/css1/c71-fwd-parsing-000-ref.xht": [
@@ -454713,6 +461782,10 @@
"078e1dd6dd61d36cec239ed75d02051f61fe60a5",
"support"
],
+ "css/CSS2/i18n/OWNERS": [
+ "529a7d4e2cfca44f7804f88e375b383e2388c23d",
+ "support"
+ ],
"css/CSS2/i18n/syndata/.htaccess": [
"be46d101ca33b82d51c60791d5da81847385fc43",
"support"
@@ -457374,7 +464447,7 @@
"support"
],
"css/CSS2/lists/list-style-019.xht": [
- "59185f79589f3430c4153095481de32c871b67e4",
+ "91afbaec5c0d265318d1ae6cbc922bd740a30e87",
"reftest"
],
"css/CSS2/lists/list-style-020-ref.xht": [
@@ -457390,7 +464463,7 @@
"support"
],
"css/CSS2/lists/list-style-021.xht": [
- "1cbddcee5bc3523eaeba2d37339b1739fdde3a72",
+ "c375699bb204c7b9d2f18bd439d7acc783f9551d",
"reftest"
],
"css/CSS2/lists/list-style-applies-to-001.xht": [
@@ -458878,7 +465951,7 @@
"support"
],
"css/CSS2/margin-padding-clear/margin-em-inherit-001.xht": [
- "70aa9730124b136ef03ba2d4b53b43ba7e8cc343",
+ "549d015ca2282c21bad3069ac8338c76eae03bbc",
"reftest"
],
"css/CSS2/margin-padding-clear/margin-inline-001-ref.xht": [
@@ -459202,7 +466275,7 @@
"support"
],
"css/CSS2/margin-padding-clear/margin-percentage-inherit-001.xht": [
- "7443dc0849e8a55c8aaea23760a51fda3d0f480c",
+ "3bb582d29deb92db2f5b1adbb1ea60781d96e9af",
"reftest"
],
"css/CSS2/margin-padding-clear/margin-percentage-undefined-001.xht": [
@@ -460282,7 +467355,7 @@
"support"
],
"css/CSS2/margin-padding-clear/padding-em-inherit-001.xht": [
- "f119b484c7e9da48b1dfae1779c367a26e472e4a",
+ "edf51f6828a356812f434cddc7085e60f5398d83",
"reftest"
],
"css/CSS2/margin-padding-clear/padding-left-001.xht": [
@@ -460634,7 +467707,7 @@
"support"
],
"css/CSS2/margin-padding-clear/padding-percentage-inherit-001.xht": [
- "0d0138cc7465337f5ab574c0bda9f773805f4004",
+ "cf6c74f28f38e03d016d5fc3896d3787768ee41b",
"reftest"
],
"css/CSS2/margin-padding-clear/padding-percentage-undefined-001.xht": [
@@ -462830,7 +469903,7 @@
"reftest"
],
"css/CSS2/normal-flow/height-inherit-001.xht": [
- "fda6ceaafbe490f62085a14ff8c083f403516112",
+ "bbcd33d7c0d49ac8b5b72e1c2d52d6392e35e06a",
"reftest"
],
"css/CSS2/normal-flow/height-percentage-001-ref.xht": [
@@ -466750,7 +473823,7 @@
"reftest"
],
"css/CSS2/positioning/absolute-replaced-width-013.xht": [
- "b464e096ccb1bc02a89592946ea9f312e7709f2e",
+ "9ed4299bb4057496566599edc48c5f9343be20f2",
"reftest"
],
"css/CSS2/positioning/absolute-replaced-width-015-ref.xht": [
@@ -466802,7 +473875,7 @@
"reftest"
],
"css/CSS2/positioning/absolute-replaced-width-027-ref.xht": [
- "2c3b02cc80860855e4a0830c8bc4da03905367be",
+ "a5f7c2922e919fed49199fb7327fb54174202222",
"support"
],
"css/CSS2/positioning/absolute-replaced-width-027.xht": [
@@ -467570,7 +474643,7 @@
"support"
],
"css/CSS2/positioning/dynamic-top-change-001.xht": [
- "6df86fd54d7924387af55d77b435df7e5cb9e958",
+ "3ca5c6bff278449641bb1c85fc32ae9d284df9ae",
"reftest"
],
"css/CSS2/positioning/dynamic-top-change-002-ref.xht": [
@@ -467578,27 +474651,27 @@
"support"
],
"css/CSS2/positioning/dynamic-top-change-002.xht": [
- "40c5059cec88e2c85aceb832cb28179d82c607b2",
+ "7dabc5b41cfce544cd6fc7a1c3d37e92f71e55f5",
"reftest"
],
"css/CSS2/positioning/dynamic-top-change-003.xht": [
- "f04c237d91f706ec3af3be1727c0fd86a256b4a7",
+ "a1cbba880e40f2bf0f0b8dfd05c32e5b93cb011d",
"reftest"
],
"css/CSS2/positioning/dynamic-top-change-004.xht": [
- "ae0183eee43b2a0acc8bb2938f41f84225eda04c",
+ "7056f834d6cae0f89a4b76bf7aba04bea5fa19de",
"reftest"
],
"css/CSS2/positioning/dynamic-top-change-005.xht": [
- "e4c1363a050570443931ed08097fd5a3e2e46e20",
+ "261601fe53280d9c386aff91d39f20df8c4bcb43",
"visual"
],
"css/CSS2/positioning/dynamic-top-change-005a.xht": [
- "a3b66c29e309d9ad615ec170f2ced76fe401e301",
+ "0381c12404ba7ec0e64eadc632dbd876d8dd2e9b",
"visual"
],
"css/CSS2/positioning/dynamic-top-change-005b.xht": [
- "ffce7b03a1ca920e20a368d7759bc2bab59deb2a",
+ "8ee57c05569aab5d54ce27430312aa68e55e110f",
"visual"
],
"css/CSS2/positioning/left-004-ref.xht": [
@@ -467914,7 +474987,7 @@
"support"
],
"css/CSS2/positioning/left-offset-percentage-002.xht": [
- "a6a5983c404babeeee4c84505fba860c54f4aa0d",
+ "7fbabde2dfbe028e4eb95254bdf2d555f9aa5539",
"reftest"
],
"css/CSS2/positioning/position-001.xht": [
@@ -469114,7 +476187,7 @@
"reftest"
],
"css/CSS2/positioning/top-offset-percentage-002.xht": [
- "4e18ff75863795095389735b96d557a8fbffde44",
+ "f2cb2458aa77e92eb192718028a4418a67282b64",
"reftest"
],
"css/CSS2/reference/60x60-green.html": [
@@ -469402,19 +476475,19 @@
"reftest"
],
"css/CSS2/selectors/attribute-value-selector-001-ref.xht": [
- "cc5ab97ad0b2bd2c9dc422c580bfd23bf731c304",
+ "6eb42b758e00b2d9bb41450530a710ccb1d8ae81",
"support"
],
"css/CSS2/selectors/attribute-value-selector-001.xht": [
- "fa6e3b8b4a1f0590f5849d3486416d8b8fe1e3c0",
+ "3c9b82d12fc6e93c50bd196b47ba8f4521dc2023",
"reftest"
],
"css/CSS2/selectors/attribute-value-selector-002.xht": [
- "72dfda92fefb318f1729683957841664929ec359",
+ "43cb55e259afd32bac61a315594651297b47e515",
"reftest"
],
"css/CSS2/selectors/attribute-value-selector-003.xht": [
- "b52a459c432c60c7699161b21f3c1b747253064b",
+ "07904c2ee48717ace5cc920e0c508a87d2fd2b76",
"reftest"
],
"css/CSS2/selectors/attribute-value-selector-004.xht": [
@@ -474666,7 +481739,7 @@
"support"
],
"css/CSS2/syntax/core-syntax-001.xht": [
- "0d00dda2dbfd4fec65b86f8f3db0fd2c0ef7124f",
+ "c13c7398c669f4e4bdf781a75b5898803a06d58e",
"reftest"
],
"css/CSS2/syntax/core-syntax-002-ref.xht": [
@@ -474674,15 +481747,15 @@
"support"
],
"css/CSS2/syntax/core-syntax-002.xht": [
- "baad1eef8de7d56df13bb8c77aa2d5b22060a80d",
+ "5112a461a9da6fd374ee75367b1241001a77fce3",
"reftest"
],
"css/CSS2/syntax/core-syntax-003.xht": [
- "a103e81effdbe66e4ab58133b4cc3fc8e48c8ebf",
+ "4e75ddf4bdda2aa673a5d988b2ba683e129afa19",
"reftest"
],
"css/CSS2/syntax/core-syntax-004.xht": [
- "5272eb4abedacec7754f9b2a9cb9f399fabc9258",
+ "22b5b2e876cc4811921382bebd73b77be5e94ed2",
"reftest"
],
"css/CSS2/syntax/core-syntax-006-ref.xht": [
@@ -474690,7 +481763,7 @@
"support"
],
"css/CSS2/syntax/core-syntax-006.xht": [
- "2bd96a86b802c1fb340592c72f083f258ed9e8ee",
+ "7a5e151afe0f313bf230a476e3d58a5a80e16cff",
"reftest"
],
"css/CSS2/syntax/core-syntax-007-ref.xht": [
@@ -474698,15 +481771,15 @@
"support"
],
"css/CSS2/syntax/core-syntax-007.xht": [
- "9906220e67a0b04623d8674f45fa2dd356da9f2f",
+ "db758c4019bdd277d89faf4ac1f39c06b9af4bc2",
"reftest"
],
"css/CSS2/syntax/core-syntax-008.xht": [
- "539858614f1760b47bf8c210d9143ed64d3e89e8",
+ "a82132a4ce45d624bfb1ce4bcfef5b4bbb2d7932",
"reftest"
],
"css/CSS2/syntax/core-syntax-009.xht": [
- "0d14614584b32ad61c85a5240dcd72e9c4d936c5",
+ "8ec94eb1916558a7e8bfa9dd7b5a6675dd85b74a",
"reftest"
],
"css/CSS2/syntax/counters-001-ref.xht": [
@@ -475246,11 +482319,11 @@
"support"
],
"css/CSS2/syntax/signed-numbers-001.xht": [
- "c6fc1aad1aa947b9523ea654b11776401966a774",
+ "5c875531ee9629c0cd7e945f6c1265c13b46feac",
"reftest"
],
"css/CSS2/syntax/signed-numbers-002.xht": [
- "5f4209f1001556e1624a146b9512f2e76cedba32",
+ "eb1e97005eaff5c3d9bf222eb69861e5a3313d1d",
"reftest"
],
"css/CSS2/syntax/square-brackets-001.xht": [
@@ -479021,6 +486094,14 @@
"fb4b7b86ff4b56d001b6ffe72f6d9c8a91046d2c",
"support"
],
+ "css/CSS2/tables/reference/table-anonymous-border-spacing-ref.xht": [
+ "157b21a9f2954094ec5e682c3d131f320b6473a2",
+ "support"
+ ],
+ "css/CSS2/tables/reference/table-anonymous-text-indent-ref.xht": [
+ "40d1dfe3486108892a7d6ff61bc99196730bcb55",
+ "support"
+ ],
"css/CSS2/tables/reference/table-margin-004-ref.xht": [
"cb0ab88ee6938c670cdb7140781d13173f759b41",
"support"
@@ -479361,6 +486442,10 @@
"cfb48d7f833a6afe528d58e77d8c387a9c69135e",
"visual"
],
+ "css/CSS2/tables/table-anonymous-border-spacing.xht": [
+ "f71fad8c0d476789196971c66abcba4b23320292",
+ "reftest"
+ ],
"css/CSS2/tables/table-anonymous-objects-000.xht": [
"edbc3202f1429ab7002b31af4e545c81cd9ddab2",
"visual"
@@ -480205,6 +487290,10 @@
"516b5f1e6cec15bc53aef58f1eb41973c46e7190",
"visual"
],
+ "css/CSS2/tables/table-anonymous-text-indent.xht": [
+ "57bfe388308a128e32abc674b64acbf9903d6141",
+ "reftest"
+ ],
"css/CSS2/tables/table-anonymous-whitespace-001.xht": [
"50b8874d4b4b1fbcde591344235be17ce7e4138f",
"visual"
@@ -486162,15 +493251,15 @@
"reftest"
],
"css/CSS2/visuren/inherit-static-offset-001.xht": [
- "14adfe6fbcaa68c00899b8c26449172650fc156f",
+ "61f1fd742a5548e57d8391500fcc62f564e0e738",
"reftest"
],
"css/CSS2/visuren/inherit-static-offset-002.xht": [
- "caea5fb3322f504223900b8196baac1e42dd6395",
+ "170c1e848ac1e221432fcb1f3a9a536b19acda19",
"reftest"
],
"css/CSS2/visuren/inherit-static-offset-003.xht": [
- "bc194b610dfe11cd54ca71cbd9f3ab290485401c",
+ "576183ea1b56bc0ddd53cd595f326a28bea60f9e",
"reftest"
],
"css/CSS2/visuren/inline-formatting-context-001-ref.xht": [
@@ -486198,7 +493287,7 @@
"support"
],
"css/CSS2/visuren/position-absolute-percentage-inherit-001.xht": [
- "366bbef593b68f482e7ed8466495190cef90d430",
+ "720e644016b30dbe27a13692f48d493004ff00a0",
"reftest"
],
"css/CSS2/visuren/right-offset-position-fixed-001-ref.xht": [
@@ -486234,7 +493323,7 @@
"support"
],
"css/CSS2/visuren/top-114.xht": [
- "5736e3d496bfa7a31ab6e840b81d8a9d81e25d64",
+ "9a29954d994d7eaf7608804318317731bd695de6",
"reftest"
],
"css/CSS2/visuren/top-115-ref.xht": [
@@ -490274,7 +497363,7 @@
"manual"
],
"css/build-css-testsuites.sh": [
- "ab2382a838116f012204de2c3d70bc591bc9600d",
+ "97cc415658e55acdc98c10db219bd832abf37ca5",
"support"
],
"css/compositing-1/Blending_in_a_group_with_filter-ref.html": [
@@ -490753,6 +497842,10 @@
"016c2ff7902fc01d8368645b7177e3932aa64d42",
"testharness"
],
+ "css/css-align-3/default-alignment/justify-items-legacy-001.html": [
+ "bcf17f709a9b87ef728262b658d1dfa65afc93bb",
+ "testharness"
+ ],
"css/css-align-3/default-alignment/place-items-shorthand-001.html": [
"cc69bbbee852e6cd203d3f39dac2a1e05a428361",
"testharness"
@@ -491322,7 +498415,7 @@
"reftest"
],
"css/css-backgrounds-3/background-clip-content-box-001.html": [
- "acc05421599eec798327aa8cd89a27728f42d655",
+ "0274ddcafae18210539741524c8d142adfabfed6",
"reftest"
],
"css/css-backgrounds-3/background-clip-content-box.html": [
@@ -493758,7 +500851,7 @@
"support"
],
"css/css-backgrounds-3/reference/background-clip-content-box-ref.html": [
- "7c660f0f62d27fb5d06039138a5d28b2c07883a5",
+ "8d6167560bb724cd2cabb59984821bb2569945c8",
"support"
],
"css/css-backgrounds-3/reference/background-image-001-ref.html": [
@@ -495717,6 +502810,10 @@
"820cad495f069d1badb3a727b9a2514269c6008e",
"support"
],
+ "css/css-counter-styles-3/i18n/OWNERS": [
+ "529a7d4e2cfca44f7804f88e375b383e2388c23d",
+ "support"
+ ],
"css/css-counter-styles-3/i18n/README": [
"be36f3153ffc6d9bde3da5e219063f046afe9d20",
"support"
@@ -495994,7 +503091,7 @@
"manual"
],
"css/css-counter-styles-3/i18n/css3-counter-styles-070.html": [
- "53b74dce2c73344c6ffc5e5ce3676e9b1ca31a1a",
+ "a51f3d3a4fd88219141d856675491da088cba789",
"manual"
],
"css/css-counter-styles-3/i18n/css3-counter-styles-071.html": [
@@ -496817,6 +503914,14 @@
"55ac1cc272d6feaba627f45e402671e7bc83487d",
"reftest"
],
+ "css/css-flexbox-1/auto-margins-001-ref.html": [
+ "dfc6fe046906c564110225d01572aa6aa1e40858",
+ "support"
+ ],
+ "css/css-flexbox-1/auto-margins-001.html": [
+ "2c9ced81462c263bafbc1ebc6024529e26f23e95",
+ "reftest"
+ ],
"css/css-flexbox-1/css-box-justify-content.html": [
"a3e68485221a64b4197da0ea9e4e56352406098f",
"reftest"
@@ -499206,7 +506311,7 @@
"reftest"
],
"css/css-flexbox-1/negative-margins-001.html": [
- "f9f00cac79a95072abb682ac20ab040e61141d6d",
+ "b180f3d5054d7dea5c878cb1519c1ba48e2cbf7c",
"reftest"
],
"css/css-flexbox-1/order-001.htm": [
@@ -499237,6 +506342,50 @@
"fbb795af85abb6bb28a2c3ac94012aad7e99b45b",
"testharness"
],
+ "css/css-flexbox-1/percentage-heights-001.html": [
+ "5c3c576ee34a20e61e33a9851d332c743a9f078a",
+ "testharness"
+ ],
+ "css/css-flexbox-1/percentage-heights-002-ref.html": [
+ "63dfc89a1635f0f283e7513c58ba225f44be5739",
+ "support"
+ ],
+ "css/css-flexbox-1/percentage-heights-002.html": [
+ "1b41b57b585955953e6c5ae2bc3b0bfdd1e63cf9",
+ "reftest"
+ ],
+ "css/css-flexbox-1/percentage-widths-001-ref.html": [
+ "a139951dbeb1676b7add9a43d154595dc2e9859b",
+ "support"
+ ],
+ "css/css-flexbox-1/percentage-widths-001.html": [
+ "22e1681cfb553f1c1e5242f02319f22d75a12de4",
+ "reftest"
+ ],
+ "css/css-flexbox-1/position-absolute-001.html": [
+ "bcf0ce321b9aca0fba213f677e9db92d595175fc",
+ "testharness"
+ ],
+ "css/css-flexbox-1/position-absolute-002.html": [
+ "459087f00f8417a3345f0bfc25b6d66d44364a5f",
+ "testharness"
+ ],
+ "css/css-flexbox-1/position-absolute-003.html": [
+ "25d21bf70a43936b159001b9a405e9df65e0f222",
+ "testharness"
+ ],
+ "css/css-flexbox-1/position-absolute-004.html": [
+ "222c04822ec756d6f4f504ed507aa678c7960b75",
+ "testharness"
+ ],
+ "css/css-flexbox-1/position-absolute-005-ref.html": [
+ "f1bcb4c179fb298384a33b2f9d9723544fef4459",
+ "support"
+ ],
+ "css/css-flexbox-1/position-absolute-005.html": [
+ "438bbc49265086b53018e830694c1fbd3887bde3",
+ "reftest"
+ ],
"css/css-flexbox-1/reference/Flexible-order-ref.html": [
"a6a2ef286c9c2abd0456056ad17cbb0ece7dc2d4",
"support"
@@ -499637,6 +506786,14 @@
"3c6673e9c9040b93d5a841a0368a95f57dbb553b",
"visual"
],
+ "css/css-flexbox-1/whitespace-in-flexitem-001-ref.html": [
+ "09714cc32e9189de91ac4644e2651d90b080a20e",
+ "support"
+ ],
+ "css/css-flexbox-1/whitespace-in-flexitem-001.html": [
+ "62ff3e2eac64bb2057391e4dcc4664a4839bbbe8",
+ "reftest"
+ ],
"css/css-fonts-3/OWNERS": [
"1c72d614a2fa507e3c4c127a3ac36f0f9e157460",
"support"
@@ -500561,14 +507718,6 @@
"3d219e370db37a3392e07eb0c804d10ca7caf9c9",
"support"
],
- "css/css-fonts-3/support/fonts/Unnamed Med/FontFeatureTest.ttf": [
- "956115601525cc9a4150b87f88421ffce437aaf8",
- "support"
- ],
- "css/css-fonts-3/support/fonts/Unnamed Med/Unnamed-Medium.ttf": [
- "80f2ee7fb17371c44aa582e71721cd767c1c1b6e",
- "support"
- ],
"css/css-fonts-3/support/fonts/font-feature-settings-rendering-2-expected.html": [
"883083cdde66caca05384d3d6930070454e94fad",
"support"
@@ -506505,6 +513654,10 @@
"2a8f7afbb6ccfc4084534c36bd4cfeebcbae4194",
"manual"
],
+ "css/css-fonts-3/test_datafont_same_origin.html": [
+ "a793f06cceb92b34dc27728307995774a5d95b63",
+ "testharness"
+ ],
"css/css-fonts-3/test_font_family_parsing.html": [
"fa926a9e86823cddea6d9f1418c752cf04e341ad",
"testharness"
@@ -506605,6 +513758,106 @@
"f7a5738de1e8c4231afad100668cf18ba46a7b51",
"support"
],
+ "css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001-ref.html": [
+ "bbc71495d0244bdb0400d8739a821dd225829131",
+ "support"
+ ],
+ "css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001.html": [
+ "a38fc1b790da03a61afc3ab0c8369b78c1038fe0",
+ "reftest"
+ ],
+ "css/css-grid-1/abspos/absolute-positioning-definite-sizes-001.html": [
+ "884098260e1c51873c90d8328e31973f69adb224",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/absolute-positioning-grid-container-containing-block-001.html": [
+ "d7a6d2f0196a3e1e7b9bd618a1f885ae58dd05fb",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/absolute-positioning-grid-container-parent-001.html": [
+ "a7d866aed9b5021e681dadb85eca50462db1d748",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/grid-item-absolute-positioning-dynamic-001.html": [
+ "92363ede0248b32c2254572015efaa7eaa1cd1dc",
+ "reftest"
+ ],
+ "css/css-grid-1/abspos/grid-paint-positioned-children-001-ref.html": [
+ "b86ce6a3644e3b202938ae4158635a2d224ad8c6",
+ "support"
+ ],
+ "css/css-grid-1/abspos/grid-paint-positioned-children-001.html": [
+ "1093709bd8e0cbbbbdc02032e1e4771cd9ab53e3",
+ "reftest"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-children-writing-modes-001-ref.html": [
+ "8baf87330e4005ddb664f5fc71c972e4e1c00f40",
+ "support"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-children-writing-modes-001.html": [
+ "45d1fbeb11504621afa26f82ff0819d4c8659962",
+ "reftest"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-item-dynamic-change-001.html": [
+ "9aa0e70e845521fd7127581a4cd017e1ba3dc15c",
+ "reftest"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-background-001-ref.html": [
+ "4094fef3dedb631dfb06f600ce44ccfbfdb78d02",
+ "support"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-background-001.html": [
+ "1776e1042cf1712a86906e6e8b56faf9d80bb143",
+ "reftest"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-background-rtl-001-ref.html": [
+ "b274695780cb0fb46e78c25909c24ed5fd27f285",
+ "support"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-background-rtl-001.html": [
+ "581116474bdd4214f803dd7c6375104308c245e8",
+ "reftest"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-content-alignment-001.html": [
+ "dc376db419836c1fb2cc0d0477b20454159813e9",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-content-alignment-rtl-001.html": [
+ "4530ed56a6b6b37d876cb9e56d73718440560f7f",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-gaps-001.html": [
+ "09614159f2996973a825a574ce884679aff69283",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-gaps-rtl-001.html": [
+ "b92090cc95a982097b54ba0695c4b0b43fb26b5e",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-implicit-grid-001.html": [
+ "41cc2addf301921ffef0c1b98fb34ab41af059c6",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-implicit-grid-line-001.html": [
+ "7e1f3ea3a2db26462048f2614725c8467095e934",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-padding-001.html": [
+ "024ababa5af46ec7fe3195ecbb2af5a7d1aab075",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-unknown-named-grid-line-001.html": [
+ "a0a24530691fd19fc07986657375033c1d7eb524",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/grid-positioned-items-within-grid-implicit-track-001.html": [
+ "36d607db41c6cd74eb66859e550cfd339d3cd6f8",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/grid-sizing-positioned-items-001.html": [
+ "44c77a955845c78f581e039f78364a8caed6a6c1",
+ "testharness"
+ ],
"css/css-grid-1/abspos/orthogonal-positioned-grid-items-001-ref.html": [
"a9fb23476ac659978575cb83d3188f4d6d6e7b0f",
"support"
@@ -506845,72 +514098,232 @@
"6e0f7a2262ec3476d8cf32ea562fe0f67ad5a7f1",
"reftest"
],
+ "css/css-grid-1/abspos/positioned-grid-items-should-not-create-implicit-tracks-001.html": [
+ "f042dd8f7e7c4d228ef9f1a7eae641899f516940",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/positioned-grid-items-should-not-take-up-space-001.html": [
+ "2d6dec61a1a2902a58f50b3b8e1330c97ce547b9",
+ "testharness"
+ ],
+ "css/css-grid-1/abspos/positioned-grid-items-sizing-001-ref.html": [
+ "de3401d0edd3dbb428066d5fa85f5235d083aa18",
+ "support"
+ ],
+ "css/css-grid-1/abspos/positioned-grid-items-sizing-001.html": [
+ "053c2ad3fe2edfd36dc8743c01cf098af91c026c",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html": [
+ "19ae01ab31a15efc601d2857d3ca1dd879cb4e66",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html": [
+ "abb8f221910dc58b87ff1d3f5b9f346994688a8d",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html": [
+ "1dee7406f817681eaec5c1b5607b9762bc546329",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html": [
+ "03da21bdcbb4fdb53f93c372da2af4a175fc0bc9",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html": [
+ "c4e793351e05b74a9d859286407f30f019e581ee",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html": [
+ "ab2604e1dd0396402ce6ab0acea3a340d107ad08",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html": [
+ "17b0c72f106d9103af25c654e913ad00c2a5ee19",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html": [
+ "32b50873af5b434817de9ca3fb5ea3b79808bdbc",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html": [
+ "29551eeae983adc5cdd9b518b64a1d0c9560f062",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html": [
+ "396afc15a311bb0a636ba2570b57366a52fbc770",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html": [
+ "49109ff240399f0f1f60308850f805779dfc4b21",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html": [
+ "45a9279c62d4052a150a6da13ae9c177a38f01a2",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html": [
+ "29d4695a9ad8eb5eebcdf15b3693a714bc412779",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html": [
+ "66d7b70d305869abb453caf2f0e51a274bd1a537",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html": [
+ "874f6b55e6b204d6cfc41c73a2c00a5f4229d298",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html": [
+ "51b59909bd41adefa471e9b8bf9ff75e9ed92259",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html": [
+ "6423406f9bfaf43ac97fd4547a784c2bb8d19bc0",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html": [
+ "123575acf3c090c6479e5e4fa064c75fcea56bda",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html": [
+ "f611e34104ae873f1124032aa22621dfcf4fa128",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html": [
+ "c0a3bf24655a77c05dce301b0173f18d0fa42234",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html": [
+ "e39bd0c869b5c69f99ddb0e43ecd516c23e22051",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html": [
+ "436855cb48c5de8f913f209ba8172644c0e97226",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html": [
+ "07ea8b43529cc3abe597b5cbaf71b577c0e08a81",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html": [
+ "4ef7fd0b4687fe9f08513cccff2707bb05d92a78",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html": [
+ "4ecabe7266535153ce6e38e1bee6e4eba28c5260",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html": [
+ "dc702a1d181ef4efcf4d5161ff1b10bbb8e08337",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html": [
+ "a5646db94e62b9455c9ed44e9f1a86f1cda74153",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html": [
+ "9940f6e83d28a45ad87a50b24afe5eca1c3ff596",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html": [
+ "ed6197207c84d52614f2e4bda31aa0794ac244ce",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html": [
+ "df920f26e14d9adb3e987771b74f3ca21d001b9d",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html": [
+ "24cdde781a98046593d3f0a57906b756326c4d83",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html": [
+ "489c89b0d82b3ad92e342db2b680b152e4bab404",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html": [
+ "4905906bd110e7b9ef3ad1ca4e0b01417b0998c8",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html": [
+ "c9ef480494c982efd2cc2b6801eb0c308de0a608",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html": [
+ "f93f4f2a62aa2073676466dcfc5975556dd04739",
+ "testharness"
+ ],
+ "css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html": [
+ "748d617dac4b7c97592967c0df1ee82f6a43cc0a",
+ "testharness"
+ ],
"css/css-grid-1/alignment/grid-content-distribution-001.html": [
- "71d678f48849879663d199ec57a5f19fb5e026b3",
+ "5622a264eb2dbd6cf621ac97aa4a8ae5db82c6b3",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-002.html": [
- "a20d044edc50199306349700b03522225841fc72",
+ "2c62d06a72062571ede87351e2538e386807e0b9",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-003.html": [
- "4ef0c09a8c51e4fd2979887fe7420a62eb783027",
+ "c07303851028f6421158fe307889a7a53d7f31e0",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-004.html": [
- "f1f2f65fad70478230f2456cbdf68ead9c6de7f6",
+ "f8692678b09611f1bcb5f1a1446f4eaeeadb64ac",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-005.html": [
- "cf1c4546b569bea0bea062736ccea0e9e4f934ac",
+ "7d0900472ae1237a92d1070ac434e7f56f537a52",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-006.html": [
- "f0f17f458563b57a39ff7b684996edfede82e510",
+ "ca8fea1a3e366d3dda1f939d6e119949a3774c48",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-007.html": [
- "08db6086c6a30888fee6881d6646d42c509d218b",
+ "01482b8fae411849e91dae8390d9bfe6e6ab9844",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-008.html": [
- "66d112eae6876a44c2246312719c2e6a3b93a5eb",
+ "77bb5394d7628566d07047220a08aba58970cf6b",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-009.html": [
- "a27003f50acf7ff550d99b14a4a4435f80e791c0",
+ "b5ded29b361ee406736a514d00743915ee7588c5",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-010.html": [
- "1f59c3d1af79df13007d0ba29132917a6e075e54",
+ "c0a3834676fa8bb146441bb7bc969560c667d1e0",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-011.html": [
- "edaf37eff5ed1db1709729e669aee460457de3ec",
+ "f9be3a544d65dd63f8a718b0884fd87bcebc34a0",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-012.html": [
- "6ba269671145f1f8d5a32f6a1efe5927a695f693",
+ "ee86f5d97a3db4b22f3ea5e9cec5d1f603401d36",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-013.html": [
- "a2036358ed56a79580d675cccd820e40b82bb3d0",
+ "ef01ff8ea9d9357382c59fca4832901e091b58b6",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-014.html": [
- "9e20812f1655d4bbbde261694deee0c1d09ff214",
+ "db95b9693a1e8986d81fb0fb42b045226ae87de2",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-015.html": [
- "d49d3b8b7a92a7cae108d7baa9d40b95699149aa",
+ "818bb47cab93792162cd3effbb1ab4bbf4cafeb4",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-016.html": [
- "9ac8ed870190e63aa9e248cf41c81c41b4816442",
+ "c5a38881fd5302f7f87fc0a08048455c2f9c6d93",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-017.html": [
- "7295162365f4929cf68ebad634be1d3bd6f7227a",
+ "4ad7a14d8e640963a7b19401e5805d20379da1ad",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-018.html": [
@@ -506918,321 +514331,373 @@
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-019.html": [
- "5e97218c93c95bd57edd96219a520a894184b2b6",
+ "4a72208bc09151b5b6b471582c7211d1c6e1abf9",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-020.html": [
- "228cd6b2312f64f7ae7bb1421fb6b8c5e6bb4c22",
+ "cb61983358d8df21f445c52e2b4672f036b92930",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-021.html": [
- "a626f563a51ef70a0a6221dd397c4ea9dce74f2c",
+ "9be4696e87426cb7d7bbfbd623012427e1211e15",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-022.html": [
- "0699d18ff695b8920588304e9685f843fa006b4f",
+ "bc821e4fdc223b8f73c640f7dedc74c459cc6124",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-023.html": [
- "788e76b9f562e1a2af800b8939d8cd6dccdaf991",
+ "1cf05242c1918dfd94c8e3f429296696f1fbf2a5",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-024.html": [
- "d0f957e475c3c0934a3d84e64ea6552e47cfac7a",
+ "ed4439dcc8fca88286db1b6fbbfb9130f37bf17d",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-025.html": [
- "136e1a1999f3696a5742cb53a0d30e6411cfa6f4",
+ "ada440cf035137bd6c5377d543de603802a10680",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-001.html": [
- "0681924a44ddc7c141a8c20203289c0862e7ec7c",
+ "a4fb6eded9c20195017f73aacf53d08fff0fe990",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-002.html": [
- "e7771a519139a375f641125ea2a0a90102d228c7",
+ "a87a2c260aaa872ec9ea5699a0dcfa106e45bb2b",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-003.html": [
- "7ff3085ec34b3fe9664ef0a9e02ebe862c42c22f",
+ "1ae67e7963212bf6afa678b929873d86cec025e1",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-004.html": [
- "c474e6c83ca32385734a035fd36ef41e2e666f24",
+ "bc0978ff89ec6af691f88aa88e2b805f17012368",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-005.html": [
- "c5a5d80b273add95223306d99471d3a030fb8be6",
+ "2b5a655c5a934b98c0d7fcb8553eb8efa35cb5af",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-006.html": [
- "55d9f476640c87eb1663114599ddb6eafd91b7f0",
+ "712436aec944f0e7163da66a62d8a629a1c7ce80",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-007.html": [
- "d81f70fda4665e94cd32483127e069dec9b760cc",
+ "fa284f5404d3e24cc395a37380291cf58440e447",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-008.html": [
- "d4f0fde36ff5b437ebda34698d199cce359f00fa",
+ "24253384b12c5c20ef44dd14d882ab35a7a411f2",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-009.html": [
- "5a50c58f6b9ba8b4b51b020b93ee61d23bfb500f",
+ "a89a85650c01a24a088b5b704805389ac487afc7",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-010.html": [
- "fa5cc94c766ac0d455326bb117ae530df0ce6d4d",
+ "a676ad7b1ad0dc6ad205d767a4e366d43b2d1600",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-011.html": [
- "3f02b75738ac80f1875a3adc0ce07052841c6be4",
+ "c53c339b5ac8ea5f9b021cca8eca56bbffa25ead",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-012.html": [
- "97dac1879d441e29c97743e9e63bb44f6a413f67",
+ "d8746b969ea563cc8e683d00824a239cb9f45953",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-013.html": [
- "99832804da447b3cc35db8bb60492781a03ffb62",
+ "94aef014e0d0bb420a8d7421ebabb2a9699a14b4",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-014.html": [
- "2cc1f4a715b939a882d7394cb0d49d5ba4b127c7",
+ "1eec29a79380f6fb9e55f5e65f61f9fb906da192",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-015.html": [
- "8b1947a434ec968a5bd0170334e7e2c907e69f28",
+ "c792926de9e4a1923b5f67c44095fc5609f03f79",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-016.html": [
- "998612427cda18f277c5edf484892fd3b313bffc",
+ "3cda565159049d2b6d715166d9835041cb4918df",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-017.html": [
- "080c87419291575847c9e94eadf5096f4a438bb3",
+ "1d387c5780df35128eabaec4d431cb92c7f96d0f",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-018.html": [
- "aec32266b3e66fb38f45888140bf773d537728c9",
+ "dc470e6ad001ba3c32a264941a5a245a8241a91f",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-019.html": [
- "6891c290c82adce07bb2409732789b627f07ded0",
+ "425356e77beca062326b6902b0dc0322bf081e72",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-020.html": [
- "0ea2837b789ce2289aa2ec1c514006899d13def7",
+ "8bd9b585fe347a4be4ef2df571164ccd5a2163b5",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-021.html": [
- "0e2a972619d21b4de097ddca6f39f2cae486cc5c",
+ "f8127fd46686ae877b0ca01b26d0278a49fa898e",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-022.html": [
- "fb73bdbdff8fda79519e4fe387127ca539506357",
+ "e8094181ef73d466757fef11a439efa1af839a06",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-023.html": [
- "c8b2681075b476b15221bcb1fe1ea6a4e0c40409",
+ "c62f2d4b7bc3e85cc51b46b97e7281a7030e39a6",
"reftest"
],
"css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-024.html": [
- "6446e5dede7383a43ac46b8083b6012b312a8124",
+ "046b9b3ebcc52c5ef1a5448ebef9ede1f0ed39f7",
"reftest"
],
+ "css/css-grid-1/alignment/grid-fit-content-tracks-dont-stretch-001.html": [
+ "9fbe55ecef2ac64d864d6592cb9b81198acac261",
+ "testharness"
+ ],
"css/css-grid-1/alignment/grid-self-alignment-stretch-001.html": [
- "4ebbf6afe7452b5a61c9a475b7beb3958dd39ee5",
+ "faa0a4a8e6660d8bb12cec2ccbe86e8e23bcc936",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-002.html": [
- "a1b58d6358acae0e0a4d48ec2e896b5a86b296bf",
+ "735b425c34d147a32b97e60606a5d088389fecfc",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-003.html": [
- "3d0b16a4ad5d537fa2728e630bf81d8a55303cd4",
+ "7f5a41bc81b97bb4b62e55b69fa1ecfe241edaed",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-004.html": [
- "71f1966a0c3f899dd3b2601d225ec5683514e296",
+ "0e12bf8b99c417c9176100f7b945b9a83d53f69c",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-005.html": [
- "c95fbde16d02ff01eab5e39a1f9b66ab5d0ca88c",
+ "d28606de466e787ac8e4c1f742806c2bbf570a88",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-006.html": [
- "3bf926a4638e8a7a36d255e3a54c2b33e978c850",
+ "2ea3e018bf73940231af89dc72c2352fe2985732",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-007.html": [
- "00a3a65a3028898decd5b33dc749d1d4b61c05f5",
+ "d2ff7e0efbb1240bfa4b21b0d2e7eb0891950348",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-008.html": [
- "f7058e3180965b0b85b83d66cc3623e4d6ed081c",
+ "0ee2f7d1f4bed6383a762f86efa6dc2a8a27bf4b",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-009.html": [
- "c56e42e2c7726204f112bc124adf6bf4e75e1c83",
+ "d64052253097bade696ff9c8bee42bfa8cca9604",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-010.html": [
- "cbec5d103a8c29e5af97a54fe856c250ced3ee69",
+ "9523288742cb15e2451b41b85596ff868b6b4648",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-011.html": [
- "b2556efc42d96830190ef6bbe0fdeef7c939cd76",
+ "9929a38f502a2e82ae93b6a39910eacb04ee6e58",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-012.html": [
- "7700cff07f4930e4453c7dabef98ff41dd85f04b",
+ "9a19df31cfded6c4270da40070c3e8390c8366b2",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-013.html": [
- "64c4f341755b5bef5772cc164427033fbf3d44f3",
+ "a8cb352297f011b42b3740fd73f2f78f0bdca29d",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-014.html": [
- "e7f19c6990b60e8d527089d600d0b5d585f37d42",
+ "11e3cb854d0c9fb7535a7408a56e9f372acf7b74",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-015.html": [
- "516f95b9ab855414499423cc0b6354b37735c428",
+ "7b145fe80d78b51f42f1a257e64b77f256324029",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-016.html": [
- "4e6a1caea23ac6a54e2e6f5fd9585d574dd615aa",
+ "3d7b17fa76b3f21ccd882072158f25c723698b24",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html": [
- "ba37dd2cb887de2c6a577e7ad538f588f6c2a6b5",
+ "613da8787ea601c01cd79348e68d94cbdf4f6c12",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html": [
- "2a88930bce761a86b84bc39cbbb9c6c4fb1ade6f",
+ "bfbfeef9485cd0a842729d72ae6a7d2978fed0ee",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html": [
- "1a598d7e5c0a63aedb6fa83a81084707a97082bd",
+ "47f8fa7e366a0928a1ef6ee30d3e97898d10b882",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html": [
- "aba771e25d3801ea42786fd006e5e444605fed9e",
+ "0277d86138e1e5aecea0fcde768a48a8b841046c",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-005.html": [
- "45aee24069e89a238c99b61ee905ab516fc1fe4e",
+ "b82ead09258f8746f6c7d4d9fd363b2bdfe2fe42",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-006.html": [
- "481ed2e3a960f5e3da1dde22245d1da6f33cd344",
+ "290d852faea189b602457356f6abf8df51f4e306",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-007.html": [
- "62b193d96908b1950ad8d7ff994e7f0718b3a9f1",
+ "f8418fe79ca641e453791ca1c202cdad50220b2e",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-008.html": [
- "55f131bf1a0566068b0882ec90cd37e257b9b28a",
+ "10e77671b9a37de05f4898e035aa29fde999f64c",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html": [
- "d2ae2b5839c06f483740ee96fbd718110515d095",
+ "9f7f821d8fd60bf5ab47f5341a3a103afe94d3a8",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html": [
- "90cbedb0e00ad7da4b3d9627804d668e160935eb",
+ "f5327de3394428415fed804e4e79efc0fe963817",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html": [
- "53f3a18185535c7310df5ba9132e63cad8daa651",
+ "a7aac5da4c4e085b14c77a0088a4d608c637f9bc",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html": [
- "170a800b282312f4f4e35845b4d6009b3e491ca4",
+ "b35ad113f09d62cb40cf4a16ff6faca82d73de35",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-013.html": [
- "ec7e80425ea1e5df487f43d62d1bbf8e5774d294",
+ "5e97e65254d39476e883cb847d421a54496c71a8",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-014.html": [
- "66d1929467cee9b75c05c30f1be0b29969646b1d",
+ "cf7374a5f900e4d6a675dc32a9181cfd1653075d",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-015.html": [
- "d22228744c0dfab1d541361812317680c8e6db34",
+ "1ebbfc6564b9c8350fa618bea97ecab3fb44eade",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-016.html": [
- "6a5b4f1e3f8713ec386971b90c152844a1963153",
+ "74711c54c4c2148895e75132d9cebc225a9128a2",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html": [
- "f3839a8b379099186f499886a2687d879941e553",
+ "a4d4dec0f3fb7f490c2e046d535d8f86a89ec519",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html": [
- "f2e48ba123603f1617302a842d13b41f8a134791",
+ "2ab21074fa42c487f294866c39859e06364715de",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html": [
- "9cf06a6284b8ea46a451b750b634800edf0a263e",
+ "695ee5fa198c111a3f8dcee1520938878b003410",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html": [
- "ee801dc782b31539787b108e2249163648fb9476",
+ "6625c4aa82c02c86075a49d0485160b24f5ed5b6",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-005.html": [
- "595f81d3ca4465d53968b1a5e7d2c5ef9364e1d7",
+ "5c400ff43392287f0203102c100ae1d286286e94",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-006.html": [
- "d824792aa48927230d5d79413d6b31ff9e6a9044",
+ "5c4f715f864ee0718a28cd56aef5bb63549042da",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-007.html": [
- "7875a1c3f5bd7ed5f9bc6d57ee55a74eae70d08c",
+ "82b67b0f255a36275c9e2179f7c0a6c194b80881",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-008.html": [
- "a91f9d4cd8375f9a3843df68c1699be43464a519",
+ "df9a693d3d6a7ecfb8767b1e53af0f71b54e4cac",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html": [
- "b34bf92f1eb907ed1cae789ca5d0526180746a8d",
+ "9223ee50b9c22c737e42f113e67418c3b9f42312",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html": [
- "923c6fbd83ef1df81c92f3b818d5ed6bc8545eb8",
+ "065d965da5145e629517941de214c53a990e7d04",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html": [
- "30701ba96fd590d43fa4d69e2393493812950a9e",
+ "819fb3899679610911df95110f051973ef4fcbb6",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html": [
- "eb4d83cc9c0053fd305994ce7eeb7015a75a85d3",
+ "52459738d7455d7ed97045aea124b2160d37643a",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-013.html": [
- "3d1e1bd37812a4707305255afa4ff94433995771",
+ "09be06f107f5ea97fc6db45b8bca150e10dc7296",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-014.html": [
- "746b1f48171561ad5aacc7ce282592fefbb2ab3e",
+ "0270a89bde2e54d3108d8ab8b8dbb3f64ae855af",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-015.html": [
- "a913de9564b2e44fec43b66177cc6b94cb174a08",
+ "f49ae99abd185af7bc9937c16bb7f4bb2044bdc6",
"testharness"
],
"css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-016.html": [
- "749d78928a228bb67878b3c088d36bcfd010aa08",
+ "86d478dee444129ccd10f76aed6d80c75251ff13",
"testharness"
],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html": [
+ "e7250b61f6dc882945f73412ec73c0de7f139aad",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-002.html": [
+ "083e1bed1a996e0a333456163df2610d94acd682",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-003.html": [
+ "4ce945c003fe0ea32b6d92ace158f3975ec557bd",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html": [
+ "5d67cb17c0af2c67282c454b5dcc4b0eaf346220",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html": [
+ "d12ea65c89b6df11bdc0e9cbfd92b72084fe9709",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-006.html": [
+ "04c3d0b31ecdac7281680f551c3d2368985f7acd",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-007.html": [
+ "4163237401ba3f1e8e7bb8f4cd85c130aad85079",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-008.html": [
+ "9322237dea7e159bdab91cf9e7964e81a19a6240",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-009.html": [
+ "7de044c48d604dda57553267f6247fa2926a2316",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-010.html": [
+ "fc5cfbb40c6610126e402487cda944934c266a1b",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-011.html": [
+ "e7bd2ef62d02b104e0df649945ca59a5fca930bf",
+ "reftest"
+ ],
+ "css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-012.html": [
+ "dc9d15b18538afb38790de51e31095ce9f93e0a9",
+ "reftest"
+ ],
"css/css-grid-1/grid-definition/fr-unit-with-percentage.html": [
"e29ef66eb632f1f9834df3233f741fb51fed5eea",
"reftest"
@@ -507277,6 +514742,10 @@
"e30c5d9b04eaf45a511b8df22a2c9719a03ecd92",
"reftest"
],
+ "css/css-grid-1/grid-definition/grid-shorthand-001.html": [
+ "31ef1f583e9d09e4d719a0ca5cb5531e8ce08b36",
+ "testharness"
+ ],
"css/css-grid-1/grid-definition/grid-support-flexible-lengths-001.html": [
"f03efa4af7f9eb9decd60bfe44c7a3166947ba32",
"testharness"
@@ -507478,19 +514947,19 @@
"reftest"
],
"css/css-grid-1/grid-items/grid-minimum-size-grid-items-006.html": [
- "a18e54cb5ba9b0f91c443e073084784778ebfa7b",
+ "df2f90f3fb83a670f78b6b63c096ef78fd14a6c2",
"reftest"
],
"css/css-grid-1/grid-items/grid-minimum-size-grid-items-007.html": [
- "bf657a093b431c6c0f17f4c207a7b32ba0822045",
+ "1d2a78a5862a71a9b360bf568bcfb53c7f868f17",
"reftest"
],
"css/css-grid-1/grid-items/grid-minimum-size-grid-items-008.html": [
- "fc9ce48c25c9d446e1b6186469216a551aa67afa",
+ "5dbaa3254fa6c4235fc6fb56a1635fc27060c3a8",
"reftest"
],
"css/css-grid-1/grid-items/grid-minimum-size-grid-items-009.html": [
- "c843c219820996931e54f2ae404cbb03bfea2e59",
+ "70210c9a1706894f4a6a63ffa92b3c979998d2a3",
"reftest"
],
"css/css-grid-1/grid-items/grid-minimum-size-grid-items-010.html": [
@@ -507538,7 +515007,7 @@
"reftest"
],
"css/css-grid-1/grid-items/grid-minimum-size-grid-items-021.html": [
- "de9477d81656c85b0d41044b1ffb44634c78eb0e",
+ "205f2292e788eee87490530488e2f1575e809ade",
"testharness"
],
"css/css-grid-1/grid-items/grid-order-property-auto-placement-001.html": [
@@ -507633,20 +515102,20 @@
"ff6fda3a436fa54df17a321e2458204fd963dfb2",
"support"
],
- "css/css-grid-1/grid-items/support/100x50-green.png": [
- "cd621ca154bb5b1f92d8f593a15ec8eba8ce8e38",
- "support"
- ],
"css/css-grid-1/grid-items/support/200x200-green.png": [
"4e0148e2484a2bb979af76a5015aa25db5e2cc6d",
"support"
],
+ "css/css-grid-1/grid-items/support/25x50-green.png": [
+ "0891f51a69b099a3d04ec15bcc81ef5da2766c06",
+ "support"
+ ],
"css/css-grid-1/grid-items/support/500x500-green.png": [
"8d02cbc578a3704611aeacf28a534f3983851060",
"support"
],
- "css/css-grid-1/grid-items/support/50x100-green.png": [
- "2995c59ce9aad40a9303380fc9dcc644e38bdc68",
+ "css/css-grid-1/grid-items/support/50x25-green.png": [
+ "7082f20d7a960faa3a3a2db3f78586997ebc17dd",
"support"
],
"css/css-grid-1/grid-items/support/50x50-green.png": [
@@ -507773,6 +515242,10 @@
"85a397623ccb6b2ced1450af19f0eaf3a2f6df22",
"reftest"
],
+ "css/css-grid-1/implicit-grids/grid-support-grid-auto-columns-rows-002.html": [
+ "909c91b995daafc31a6fa9f6989dc78c892840e3",
+ "reftest"
+ ],
"css/css-grid-1/layout-algorithm/grid-layout-free-space-unit.html": [
"5873efcda9c17e48a8437a62bf6871cbf96bdc46",
"reftest"
@@ -507793,6 +515266,10 @@
"eced3add6efb636f7d33e8a66048da2179c8a152",
"reftest"
],
+ "css/css-grid-1/placement/grid-placement-using-named-grid-lines-001.html": [
+ "8015ca1523215344ba88559f5efd3407e1b22de2",
+ "reftest"
+ ],
"css/css-grid-1/reference/display-grid-ref.html": [
"6819ecfa15b9553b99dadf71aaa1959c1a22d6d4",
"support"
@@ -507845,6 +515322,10 @@
"ff487f266aa067949899506059e19d4b8fbf429c",
"support"
],
+ "css/css-grid-1/reference/grid-support-grid-auto-columns-rows-002-ref.html": [
+ "15153e77178d8cd869839e9a449e9beb130af023",
+ "support"
+ ],
"css/css-grid-1/reference/grid-text-green-margin-no-collapse-ref.html": [
"feb53485e24aeaf9a5f27be5e42cc4a6fc5b8df0",
"support"
@@ -507853,6 +515334,18 @@
"a9d8444db24ab38518f07a965a8a537cc6add437",
"support"
],
+ "css/css-grid-1/support/grid-alignment.css": [
+ "b45aee51245613ceddf8eda70d995a26027671bd",
+ "support"
+ ],
+ "css/css-grid-1/support/grid.css": [
+ "6bb300b8baebf700481ea162fb7b41913fcca29c",
+ "support"
+ ],
+ "css/css-grid-1/support/style-change.js": [
+ "a92e1d3f5be007d10fdf432bb198f87b00bdc35a",
+ "support"
+ ],
"css/css-grid-1/test-plan/index.html": [
"e633dc7584fbc7bfe99177aa5dd9fbd107a2d3f5",
"support"
@@ -508125,42 +515618,42 @@
"8542b83ed433bfdda8f8bf4f92c8d2e993f9c968",
"visual"
],
- "css/css-logical-properties-1/OWNERS": [
+ "css/css-logical-1/OWNERS": [
"4dd9aea6bf0ddc75d703b1ca3867fedbc27095e8",
"support"
],
- "css/css-logical-properties-1/logicalprops-block-size-vlr.html": [
+ "css/css-logical-1/cascading-001-ref.html": [
+ "b95cd62ce3592f653aaa54de0dbc27e16618064b",
+ "support"
+ ],
+ "css/css-logical-1/cascading-001.html": [
+ "a94344f196774b463dff39c022a48a0cc5585c88",
+ "reftest"
+ ],
+ "css/css-logical-1/logicalprops-block-size-vlr.html": [
"68a86c5b34cf3769e4cda12ef4d23ecdb523734f",
"testharness"
],
- "css/css-logical-properties-1/logicalprops-block-size.html": [
+ "css/css-logical-1/logicalprops-block-size.html": [
"e9597ce04c2b8be8128f9b411e7990bc85d3842a",
"testharness"
],
- "css/css-logical-properties-1/logicalprops-inline-size-vlr.html": [
+ "css/css-logical-1/logicalprops-inline-size-vlr.html": [
"a0438d0713820ac5ab82f0165af7711f71d91ae6",
"testharness"
],
- "css/css-logical-properties-1/logicalprops-inline-size.html": [
+ "css/css-logical-1/logicalprops-inline-size.html": [
"fea8f8205053e933de3dc4490c918c3db69a4a05",
"testharness"
],
- "css/css-logical-properties-1/logicalprops-quirklength.html": [
- "c2b3d06c377e8abae3691abb60f8bd84433ed384",
+ "css/css-logical-1/logicalprops-quirklength.html": [
+ "3024bbd54e4cbe1ee55e59684188587e2a56fda6",
"testharness"
],
- "css/css-logical-properties-1/resources/style-check.js": [
+ "css/css-logical-1/resources/style-check.js": [
"f6260209571bdd53be52c698f072c121e3702dd1",
"support"
],
- "css/css-logical-props-1/cascading-001-ref.html": [
- "b95cd62ce3592f653aaa54de0dbc27e16618064b",
- "support"
- ],
- "css/css-logical-props-1/cascading-001.html": [
- "a94344f196774b463dff39c022a48a0cc5585c88",
- "reftest"
- ],
"css/css-masking-1/OWNERS": [
"388433ab37e52bf8982700fad3ffd34b8ecae122",
"support"
@@ -508382,7 +515875,7 @@
"reftest"
],
"css/css-masking-1/clip-path-svg-content/clip-path-precision-001.svg": [
- "503f6c38f4cd7ff99bea66749465005698c1e036",
+ "3da4a56cf2510a1e128bfc5de32b8a88412d1ee2",
"reftest"
],
"css/css-masking-1/clip-path-svg-content/clip-path-recursion-001.svg": [
@@ -508966,7 +516459,7 @@
"reftest"
],
"css/css-multicol-1/OWNERS": [
- "b57cbdb893bb5494e68700974ff711b6078f962e",
+ "721c176d7b1e3d610405ea043c93288f7c09ebd0",
"support"
],
"css/css-multicol-1/multicol-basic-001.html": [
@@ -509001,20 +516494,20 @@
"848a55c4030658976dbd2d974e6f84af5b04c983",
"reftest"
],
- "css/css-multicol-1/multicol-block-clip-001-ref.xht": [
- "52df45645962d7755cc5b3bc8b6a23390aa5e9a2",
+ "css/css-multicol-1/multicol-block-no-clip-001-ref.xht": [
+ "6afb96f8754a72747da16aacdab0570da8767884",
"support"
],
- "css/css-multicol-1/multicol-block-clip-001.xht": [
- "0bfb98cd583828b29fc633a5a81414b4487e9498",
+ "css/css-multicol-1/multicol-block-no-clip-001.xht": [
+ "68de9967f55c35fec8dc5320faa7eba3bb1ad98a",
"reftest"
],
- "css/css-multicol-1/multicol-block-clip-002-ref.xht": [
- "62c7651a40669c2dab4e65287c40b283c6fb85a4",
+ "css/css-multicol-1/multicol-block-no-clip-002-ref.xht": [
+ "7adc06282f790b8f92222983b9deb83e12f9a7f8",
"support"
],
- "css/css-multicol-1/multicol-block-clip-002.xht": [
- "8d79a3ed0586ff53c953b815ab8bc2fa744d8be6",
+ "css/css-multicol-1/multicol-block-no-clip-002.xht": [
+ "40425dbeaafff125094148caf361809b63b558c5",
"reftest"
],
"css/css-multicol-1/multicol-br-inside-avoidcolumn-001.xht": [
@@ -509046,7 +516539,7 @@
"support"
],
"css/css-multicol-1/multicol-clip-001.xht": [
- "eada3dec72ce77b3f574682a9f10001f5cd177b4",
+ "c73c8d4449e585178c120285c894f705fe59860d",
"reftest"
],
"css/css-multicol-1/multicol-clip-002-ref.xht": [
@@ -509150,11 +516643,11 @@
"reftest"
],
"css/css-multicol-1/multicol-count-computed-003-ref.xht": [
- "6609329dd3993b57f79b9fe037f9f6c9346e3db7",
+ "80e54fbeedd11f39d9041d45d266cf87a69d28b1",
"support"
],
"css/css-multicol-1/multicol-count-computed-003.xht": [
- "6e7d8e1fa3bf54c055158fb48ad43c9269b8d010",
+ "ce7639f1d4f7f992f529aa7016e6a7f0ab256464",
"reftest"
],
"css/css-multicol-1/multicol-count-computed-004-ref.xht": [
@@ -509166,7 +516659,7 @@
"reftest"
],
"css/css-multicol-1/multicol-count-computed-005.xht": [
- "f3395d21c0fcab726231a414bbb4114457d271b1",
+ "fdc0811616680d44203af48c16fcbd91f5e2d9ea",
"reftest"
],
"css/css-multicol-1/multicol-count-computed-2-ref.xht": [
@@ -509298,7 +516791,7 @@
"reftest"
],
"css/css-multicol-1/multicol-gap-001-ref.xht": [
- "192998427ff195c1e221aed17bc0a63b2dca0d90",
+ "86e3bafd6e6c873a8c7e540f44570f14b31df812",
"support"
],
"css/css-multicol-1/multicol-gap-001.xht": [
@@ -509330,7 +516823,7 @@
"support"
],
"css/css-multicol-1/multicol-gap-large-001.xht": [
- "10fbfdc7a7e6a111e16af1361d81f73a9d69e76b",
+ "289b2d6a252b42203190818bf2998c869cba8f79",
"reftest"
],
"css/css-multicol-1/multicol-gap-large-002-ref.xht": [
@@ -509681,9 +517174,13 @@
"ad09fbd31d5f85a113cfdc6eec0e02a49e71f7d5",
"reftest"
],
+ "css/css-multicol-1/multicol-rule-shorthand-2-ref.xht": [
+ "fed844463e2290e7ea69956b2a45df5544c5cd59",
+ "support"
+ ],
"css/css-multicol-1/multicol-rule-shorthand-2.xht": [
- "300f2f7cb52e28064185a030efa181bbac4e5562",
- "reftest_node"
+ "6294072e93f905621fcf6abb0011ebbc30fdd1dd",
+ "reftest"
],
"css/css-multicol-1/multicol-rule-solid-000-ref.xht": [
"ef30aa2924aad1617ae6a489d1c49370ba09ab99",
@@ -509938,7 +517435,7 @@
"support"
],
"css/css-multicol-1/multicol-width-small-001.xht": [
- "e9d93c9734aae96cfd5676c4ac52c2f2e0a6e63b",
+ "0962e4c7c6f3698ccbf6c82fa0664b9817ffe208",
"reftest"
],
"css/css-multicol-1/multicol-zero-height-001-ref.xht": [
@@ -510310,7 +517807,7 @@
"manual"
],
"css/css-page-3/page-size-001.xht": [
- "16c36f942f6adef1c8c8dcd8d5152acc04934741",
+ "42004561a954366869fb4ec5f71fb279c423e65f",
"manual"
],
"css/css-page-3/page-size-002.xht": [
@@ -510501,8 +517998,44 @@
"2a908e60a635dbf765987c0f93d0f33c8ea85de6",
"reftest"
],
+ "css/css-position-3/position-sticky-flexbox-ref.html": [
+ "f8dedb4a637ea3f4bf79eb621f52a8c4622f8c75",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-flexbox.html": [
+ "efb055a7efb5ee3aabd28e369d0bdc9ae98bd33d",
+ "reftest"
+ ],
"css/css-position-3/position-sticky-get-bounding-client-rect.html": [
- "77da4ac9e0eea6433c4fa890cd4a2151f46c35a3",
+ "5b9a1a29084f46228749c1b2b1a664be3ce02c43",
+ "testharness"
+ ],
+ "css/css-position-3/position-sticky-grid-ref.html": [
+ "9748c25d3db9b5ec2753ff53ceb0b82db9453cdc",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-grid.html": [
+ "a06a40f39b4a748c111dc01281261c5451204f95",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-inflow-position-ref.html": [
+ "bcce2ded8073a7b5b3477bcf90157cb0e77c2b40",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-inflow-position.html": [
+ "c8e2bcdddf9e8ee93f9306d88b96c3bf1f1bfaf6",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-inline-ref.html": [
+ "9458cab53d2065e4893d127ee0097bbd53c6b898",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-inline.html": [
+ "9fe0b3407310fbe1ee8b1614db0801bdf93b38be",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-input-box-gets-focused-after-scroll.html": [
+ "6580451dddfd6f8865925326c170f630f343fbcd",
"testharness"
],
"css/css-position-3/position-sticky-left-ref.html": [
@@ -510513,6 +518046,74 @@
"5151bca08dff652ea728cb8bccbb6b7c6d364dd8",
"reftest"
],
+ "css/css-position-3/position-sticky-margins-ref.html": [
+ "0cdb788c913f47a121114ac5b8e6a140bb08c1ff",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-margins.html": [
+ "72fb6ae7d97bf2448ebd68ccf110edd6bae2c92f",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-nested-bottom-ref.html": [
+ "59a8e46358a8a5bf8638a2d1982c63becef5bc77",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-nested-bottom.html": [
+ "3604a921be04927dd19b805b7c9abaed6d0e7c72",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-nested-inline-ref.html": [
+ "8fb9378e91a20b71ef886b9aac0147b25d00a9a3",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-nested-inline.html": [
+ "50be9f2fb6ab9295081f6f13705be4853e48fdde",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-nested-left-ref.html": [
+ "52804c5589c3035818cd653c1801a70645a9fe99",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-nested-left.html": [
+ "c32881097147e285b6ee66e6239af4808d780c83",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-nested-right-ref.html": [
+ "5703ad6457deca332232e510dc479c39b7020d24",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-nested-right.html": [
+ "39683624316599779b0efcb347010b92694e02a6",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-nested-table-ref.html": [
+ "7b8956bc720e2e25e7ff0bc5889812c26837ab58",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-nested-table.html": [
+ "87a80629bcfcace28d4f13bce99325d55d317574",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-nested-top-ref.html": [
+ "66ea8b8c72023089d52e6ebdf5bfff5d56259bfc",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-nested-top.html": [
+ "88e35164b6ede3adf9727989cf59ff9956bdbae7",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-offset-top-left.html": [
+ "a25b64d016644c272ea92b6129a59eefb21d2fa0",
+ "testharness"
+ ],
+ "css/css-position-3/position-sticky-overflow-padding-ref.html": [
+ "b3d81934cc90e70dff6bc5cd7789594a8fcd7ecf",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-overflow-padding.html": [
+ "588502dc7eb4a7f88f78dd1b2cdc857861c89f77",
+ "reftest"
+ ],
"css/css-position-3/position-sticky-parsing.html": [
"224bc984bc6eb4a55931461cf7e51f7b04d219f4",
"testharness"
@@ -510525,6 +518126,22 @@
"f79c0e3e99085e483652950b141fe15c3c4d01d8",
"reftest"
],
+ "css/css-position-3/position-sticky-root-scroller-ref.html": [
+ "b66947a9f1b39c6c489267477d0122eeaeac7341",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-root-scroller.html": [
+ "8f77892b5a205a392942649476be7d5d54a91788",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-stacking-context-ref.html": [
+ "dd6e5d4734c924c1ad08d14db986fb89d7cb03f6",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-stacking-context.html": [
+ "ac1e643ac9f03d0fe415c3f52a4db7c407dd3537",
+ "reftest"
+ ],
"css/css-position-3/position-sticky-table-tfoot-bottom-ref.html": [
"b902bec7e12fd6d9cad02c61f332a44f5818f8ee",
"support"
@@ -510597,6 +518214,30 @@
"30c0c00c6313a747b51c8b6d4f1301056af56560",
"reftest"
],
+ "css/css-position-3/position-sticky-transforms-ref.html": [
+ "b01ae263ac6b712912ba2af06edbaeaf75ba0215",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-transforms-translate-ref.html": [
+ "49d0db4c6b27c9f66bd58f5a075d024cbeaeb076",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-transforms-translate.html": [
+ "71bdb184c1ad2d1405f683e05a5b4117c8c7362a",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-transforms.html": [
+ "c3d2c2b167bcf6b8e7c45b90d9a797a216c27632",
+ "reftest"
+ ],
+ "css/css-position-3/position-sticky-writing-modes-ref.html": [
+ "407a1831479ccca61f6f7b268abcbf97f667f0bf",
+ "support"
+ ],
+ "css/css-position-3/position-sticky-writing-modes.html": [
+ "b6d16a38b73d4c107e587194818a542fee9d0716",
+ "reftest"
+ ],
"css/css-pseudo-4/OWNERS": [
"e196548942a4d77448f734235b3456e2a830a5a7",
"support"
@@ -510617,6 +518258,38 @@
"5eacc4126a2781412995e4edbcd2999b0e892d92",
"reftest"
],
+ "css/css-pseudo-4/marker-and-other-pseudo-elements-ref.html": [
+ "73ab862dcf3131ae7d7166ef06e52db0cd0eb7c7",
+ "support"
+ ],
+ "css/css-pseudo-4/marker-and-other-pseudo-elements.html": [
+ "ce59ad1afe6f3182565076bb951149bc1e5526f0",
+ "reftest"
+ ],
+ "css/css-pseudo-4/marker-color-ref.html": [
+ "0fdf62848013d34255a05820901d7e4f8acbb63b",
+ "support"
+ ],
+ "css/css-pseudo-4/marker-color.html": [
+ "a06cc25cbfd06ef1d4c0f4e4cdc658812e963181",
+ "reftest"
+ ],
+ "css/css-pseudo-4/marker-font-properties-ref.html": [
+ "d83c1ae2c21ad4c20961725589481f046e108a99",
+ "support"
+ ],
+ "css/css-pseudo-4/marker-font-properties.html": [
+ "ac3d673508fb9578d0a1d363b82021df8a1b9fbd",
+ "reftest"
+ ],
+ "css/css-pseudo-4/marker-inherit-values-ref.html": [
+ "92bdc9d8f482c34ad389f27c957d4024a7e05b43",
+ "support"
+ ],
+ "css/css-pseudo-4/marker-inherit-values.html": [
+ "f11765ff416808470d52dde2500106c294243469",
+ "reftest"
+ ],
"css/css-regions-1/OWNERS": [
"a10a15c87ddef84355e4bbc8b8966cf0738e9d69",
"support"
@@ -512782,7 +520455,7 @@
"support"
],
"css/css-ruby-1/line-break-around-ruby-001.html": [
- "1cffa24ce265830eedc422bc10e7b1a364ede21e",
+ "ebdb7fd720f0dc22143c7547312bd795c163f9d0",
"testharness"
],
"css/css-ruby-1/ruby-001.xht": [
@@ -512873,6 +520546,10 @@
"d26aa70436055346420fd8bae6fd174daf090124",
"support"
],
+ "css/css-shapes-1/basic-shape-circle-ellipse-serialization.html": [
+ "b0841c5c1e328846aaa95376ae62178173cdf5a5",
+ "testharness"
+ ],
"css/css-shapes-1/shape-outside-invalid-001.html": [
"550e970032ac78ada40b7b8b3e7159c4160d60da",
"testharness"
@@ -513502,251 +521179,251 @@
"support"
],
"css/css-shapes-1/shape-outside/values/shape-image-threshold-000.html": [
- "69651ee9840472c11d94edbd0ccfdebf38584649",
+ "65d3c04c3ebf6358f69cec7cc3afcbdfc1eb59d1",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-image-threshold-001.html": [
- "1c6f776c7996971cb7bea24326d081864495c991",
+ "0b633a9ede51f0c9cb8be2542191f60ba0dc178d",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-image-threshold-002.html": [
- "1e465667899c3bd0bb145253229acf15302be3c4",
+ "f1f8c94820a106101b45e6ec6caae31ceb5dd795",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-image-threshold-003.html": [
- "66e26fd5d65d03403e2018109791a32aa67a32dc",
+ "2e81c6f4c0a29148086e50052edd03566fe231b4",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-margin-000.html": [
- "6ed34d4ccf950ca194f00ccf33d7d5a305244932",
+ "387be9c19cd9f18686842752a98147a367a6c45a",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-margin-001.html": [
- "a5f2206d6212c6b772042f681c3030657db99681",
+ "46510fdc745cae19ddfc57a00e5f782a5e24486e",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-margin-002.html": [
- "e5567dfe061edf9f9e311cfa9ceb065fd04769b0",
+ "721414aa99066881fe918a9e4342445601f1fca8",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-margin-003.html": [
- "f58946ddb311fd9f881148c4d0bffd34fce68faa",
+ "8bbb861c94c48f1f457f3a3d8f0e146e0e7a4bae",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-margin-004.html": [
- "f300faefe734ec9660ec1b37bbaeb434f662bd1c",
+ "dd3377d6eff2c587df37a0498ca072f919e712d0",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-margin-005.html": [
- "9067abf60eae5fb9472b223b5df1287ebdd209a8",
+ "df92f71df9c54bce34782276cf85ffd778664f78",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-box-000.html": [
- "437825ff3ba08ec656c46fdd7ad24c485d7624ac",
+ "f23db096457420df917685342bd07e7bb2686e49",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-000.html": [
- "f63ef7f71bf6905dd8d073d0d16b8a1fe658aa4b",
+ "12ff3257751f1df762cde2d000464e3d4fd3d9c5",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-001.html": [
- "99e68601263837ab6b25866c879e77b9db7f22e8",
+ "a15faaedd31885d4892d0e03e2eb8eb0d4bb074d",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-002.html": [
- "a50d742cbea9b829c0988044926acf33cbbd09ed",
+ "5ee88098535926f552e268cfc93dc36c9447b886",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-003.html": [
- "c18de4227def55d9a7f0ba468908ae68c4abc35f",
+ "898a5c390663f88358fcb5d95e425dc9e60ad130",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-004.html": [
- "c3844b7a357690ddcc00a1d3ce1c46d280ec146a",
+ "e389160f506190fdc124a59e8ed8527397395a9c",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-005.html": [
- "e82a130aafe0055b084532979d94da7f40803a75",
+ "68f761b81fe2dcaff77a965d94c0eb6ea52e1c8c",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-006.html": [
- "b303b8bb60b3649288db347f3852ad6a59244d8c",
+ "8d20724aa519d89a0e0e945ed5040fc69e426262",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-007.html": [
- "cc18e14cbb6acde21aa45aaeb114920790137291",
+ "b046b1b212f9f4dc756e316f4851102f9938d111",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-008.html": [
- "7d19c8fde5427098f7947450f7ff6e9ea7091df2",
+ "ee51ba2b34b93c9799b3fd8a4dc4277d260d5968",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-009.html": [
- "ad426e85a3d348fc0929a9eb12b3106c0fda9e88",
+ "427efa1d5610cd8b8bd9d1033702b7dc29859b0e",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-010.html": [
- "689551cbecd5285fa2262344b28a42e6b7ad29ba",
+ "0eeb3f383de0c97a276e78225fd081b651c6ab65",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-circle-011.html": [
- "37e47cae4323fb3093830e0b5eaee7d9583e915a",
+ "3c1d9ac789d9c4ced69e407580c2acf8d16622ea",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-000.html": [
- "fb7081494fc3ff9b2812bb61db73d6bfb00af170",
+ "e2e1d27cd03fc2845ba75ebd589e76a6ba3712f9",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-001.html": [
- "b41242b62d6ccee3e98a66b3e6f0efbbefc25b75",
+ "34c1def23ce44a7a65d70cca2f417f0f877fa9f2",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-000.html": [
- "9e889fa97cc321a735a1e0e25e1b213169a19163",
+ "f6740e5867f0dc389ccc923a7f23eb4f964abb87",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-001.html": [
- "a740c289a390a131884c07e0d2767d8b1a864066",
+ "910bb80b104c5e8b8c30ab31f8c5d5c4e31c59e8",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-002.html": [
- "3d9b5b82987aede6f119378a1da203b1e8cccd6d",
+ "2f648d82bd2abb4d45df10cf96f9f00a73cd51d9",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-003.html": [
- "76e17d66e49d2a74395b4faca41696fb675b822d",
+ "858a4c88d3cb90d5d9c1e2614e703787c277377a",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-004.html": [
- "11483d118c27bd0fc79afaebc449f8d73a7eedbb",
+ "2f335df44bbafdfc2c0268dd329e10f229524f68",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-005.html": [
- "58523da093d2a0cb87a3fa9e9e9f9697d15402ad",
+ "f604cead962e240d66402a9b82da1edf2a132f1a",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-006.html": [
- "5e373dbbbb930d563b2ad1fd4f87fb5f06f3c878",
+ "6ef24ef982f535907460aa3efa85949756d010c0",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-007.html": [
- "2badb14d4668b0634bb1341d7a26f352340082d3",
+ "b00a4b32a6110bba67e8ad4089823e861f39d861",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-008.html": [
- "16188a3155de5f4f74d8bb66677eff1f58b35564",
+ "13aede9b53907cc660243fed19a1b04d2ff7cfd9",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-009.html": [
- "bf416949dafc1335ba72f10a6d54781dec8d8ac9",
+ "57c770abcb64c9ba3c9f29b6011b21a3380ff68e",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-010.html": [
- "d6ceda083d30640c08bac7abe583d3af0f323476",
+ "4b74b1deafba4f84ff9bcc33872c51d95aa52390",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-ellipse-011.html": [
- "c7dbcf41b14171ec9a5ef2d7a55070d88bad981c",
+ "cb3c8c4718513f528a83987dc732c7b0bad6f192",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-inset-000.html": [
- "d5c019a5431466bec0a6c8d222c92f20428a3844",
+ "4bcfaf4bdd99a0ecadf59ffa9a88d0f54bee2577",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-inset-001.html": [
- "726e07120f44db27df71294a6d736c06f3720e51",
+ "fe1e87c9203832d0f93a3376b101114677b7cf24",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-inset-002.html": [
- "a33dfbd7c602b8877f7a690785606b32bf92d7a2",
+ "6af9b30dbdea04ab2aa68a2fe3a272e5cdd313d6",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-inset-003.html": [
- "ac2cc7b536c2878cd975a0997cde1cf9503de669",
+ "a67b7fc6dbd040184b7701dfe1d489de439d8833",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-inset-004.html": [
- "15fe37bf6bd283b152f08c1c67fd75f79e5a02ff",
+ "47a141219718f670ae3a63ad8bc99bc97246cf9b",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-inset-005.html": [
- "afab2382f71df2d825035813c9223e25292b5735",
+ "7b553c79eb75e4032df53ef213a543e7e8b1d143",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-inset-006.html": [
- "474b0798648bbd57fd0e68ad03b1ba4fa2e332b4",
+ "4f69b32917489d25a2574c2ded2639249f457405",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-inset-007.html": [
- "01972b10e62a8e27feaff3a08b6441137e644312",
+ "47629a05e5edd29437c762c6747857876dc3edb4",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-inset-008.html": [
- "b784a6955144bff1732dfa98656f9eba5293f5ac",
+ "02694df63510bda3b0e11f6f1c7a2f5755fdd3ae",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-inset-009.html": [
- "b3d23ed4770451d35e09a8c88d5e3e95a7da78ca",
+ "c97b3bc406352dcee6b4d0d388ce72cb438be125",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-polygon-000.html": [
- "e2084c924a10279213e9773ca6085d2a31dc298f",
+ "fe91ef7e18f7ba383b5c692a240e15895b6e04c6",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-polygon-001.html": [
- "54af3951f26f4f865c6f0ecaaca8844a828ef41a",
+ "3cc946ec70615c880eb3b095639e57949badf0ba",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-polygon-002.html": [
- "4869e5b6d1403862ec72f983eb7e229b736cf463",
+ "ff1ff0dc480422fd81f3d98540c96b7bc41dfb88",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-polygon-003.html": [
- "b977821fc6b7ab76ad101f3914dc4efc7f24682d",
+ "0c15ad6f5bd02c2a538be196b85cf6f8415598f4",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-polygon-004.html": [
- "0e1e4a31c25d926e00f7f3266a0bc3b949cf6cbe",
+ "9d9d7fb50b74989595e3ce56bb163329c4878e7c",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-polygon-005.html": [
- "9896b1d45a80bfcbc48abc4f44733b4beeeac0e0",
+ "3eed8b92275cd788beb557c6eab362d2775f3063",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-polygon-006.html": [
- "32d87af12a054e0936a46d55f1f908311d158c64",
+ "b74773d4db5f8e83f31d6a5b3f1c87531f31cfeb",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-000.html": [
- "98b321b2ed53ede0f3de28e8993b8c82a99184c4",
+ "e76b525d99d71102ddaec091981e27c1f7668fcd",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-001.html": [
- "4c7b2448a83fbdebae5eb9f1bf6844fab83f4fd7",
+ "2142e84e512cc7e106b4a280fef364e3d74976b3",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-shape-box-pair-000.html": [
- "3e046938b7669581d47efb6e153b9fa51ab4f14d",
+ "25d495ec7cc29e6774d92c67717b55d31491677e",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-shape-inherit-000.html": [
- "cf58e0f4d76459a3a296f3f7e5b58bc2edcb9ca4",
+ "546033bbd4c43c4427695ddab05591e078c5d592",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-shape-initial-000.html": [
- "a08052f68341d5b555bbb0a16772e452923283cb",
+ "e7815df3b546efc985dfb000349043c4de8501fe",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-shape-none-000.html": [
- "82b5914ba70bdeba3b7f2833b6f1052c8a5982c1",
+ "8dd611c1f104f69807f631849d38da168874a9a2",
"testharness"
],
"css/css-shapes-1/shape-outside/values/shape-outside-shape-notation-000.html": [
- "0c9321d3f9651625d8b3d0f85cfb5873e9ac2a11",
+ "edf23e6fdcd2d7699ce484089664da5d03e3a1e2",
"testharness"
],
"css/css-shapes-1/shape-outside/values/support/parsing-utils.js": [
- "52b60f43828972af1ad3f3f0cb131881f5ef65d7",
+ "9ef646aa7352e94c2b2e43b0031d3fb654ac2985",
"support"
],
"css/css-shapes-1/spec-examples/reference/shape-outside-001-ref.html": [
@@ -513810,7 +521487,7 @@
"testharness"
],
"css/css-shapes-1/spec-examples/shape-outside-012.html": [
- "4e2b6cfb70f0362e59508b9d3bcd142393623988",
+ "1db1130bb5f2f5a8a12bab7ec5a9fa0c40165be4",
"testharness"
],
"css/css-shapes-1/spec-examples/shape-outside-013.html": [
@@ -514445,6 +522122,38 @@
"eccf10a7909e2358ac6425140e87c323ed786296",
"support"
],
+ "css/css-tables-3/bounding-box-computation-1.html": [
+ "9402c84e354540f5b4e6dfb764cd199c55b30475",
+ "testharness"
+ ],
+ "css/css-tables-3/bounding-box-computation-2.html": [
+ "303da96792f188f997d71dcb07d5881b7a797581",
+ "testharness"
+ ],
+ "css/css-tables-3/bounding-box-computation-3.html": [
+ "34c4af4939b4757db8c73ba84b0fc281f35261a0",
+ "testharness"
+ ],
+ "css/css-tables-3/caption-side-1.html": [
+ "291362e69ca403e9ebdc00968920ff60303a4b77",
+ "testharness"
+ ],
+ "css/css-tables-3/fixed-layout-1.html": [
+ "ed5606608c07f8cd0d439f6b1193b2e9688ba964",
+ "testharness"
+ ],
+ "css/css-tables-3/fixed-layout-2.html": [
+ "f2ee35f8eac9da526350d4ac6daba16e733e0c9f",
+ "testharness"
+ ],
+ "css/css-tables-3/fixed-layout-calc-width-001.html": [
+ "0b8262ca3abd6104e86c305d738a2c70f6cb1f87",
+ "testharness"
+ ],
+ "css/css-tables-3/fixed-layout-excess-width-distribution-001.html": [
+ "36b7b7893dba1f3ddc2edf46fee323d75e5af49d",
+ "testharness"
+ ],
"css/css-tables-3/floats/floats-wrap-bfc-006b-ref.xht": [
"22f5ec058d34dc57c010bca8a301eaa8f7901880",
"support"
@@ -514461,6 +522170,230 @@
"2e974c516d48ec57de1d7ccce28d9cced148cadd",
"reftest"
],
+ "css/css-tables-3/height-distribution/computing-row-measure-0.html": [
+ "ca51cd8391c4f310f627276eff409dca8c59b7e0",
+ "testharness"
+ ],
+ "css/css-tables-3/height-distribution/computing-row-measure-1.html": [
+ "6b5dfdf5cddd682c347f7c8670459e3ad4e19ffe",
+ "testharness"
+ ],
+ "css/css-tables-3/height-distribution/percentage-sizing-of-table-cell-children.html": [
+ "55a759d84f38e6adf0f091c9c0ecaa69060cb51a",
+ "testharness"
+ ],
+ "css/css-tables-3/html-to-css-mapping-1.html": [
+ "55cf746ad6557259534e38a4879d7b6f5a994d6c",
+ "testharness"
+ ],
+ "css/css-tables-3/html-to-css-mapping-2.html": [
+ "924ce8021be616cce02e6e045494e0b2bb323061",
+ "testharness"
+ ],
+ "css/css-tables-3/html5-table-formatting-1.html": [
+ "9b6c1038d52dea9fa58e195bd2050fbaaa4f470f",
+ "testharness"
+ ],
+ "css/css-tables-3/html5-table-formatting-2.html": [
+ "c6e77dec265beab9482b20aafd8f332dad53b5b5",
+ "testharness"
+ ],
+ "css/css-tables-3/html5-table-formatting-3.html": [
+ "af258fb3b11380c9e776b1b74f3ef1c303e5a039",
+ "testharness"
+ ],
+ "css/css-tables-3/html5-table-formatting-fixed-layout-1.html": [
+ "28849b8293b2f4e1e660662f77e025b51a32332e",
+ "testharness"
+ ],
+ "css/css-tables-3/support/base.css": [
+ "abe7468e88cad3aef32c7e59fa4a33a7930ef53b",
+ "support"
+ ],
+ "css/css-tables-3/support/check-layout-th.js": [
+ "a9d8444db24ab38518f07a965a8a537cc6add437",
+ "support"
+ ],
+ "css/css-tables-3/table-model-fixup-2.html": [
+ "19e3577e862601a0cf00dd4644017218c363f0db",
+ "testharness"
+ ],
+ "css/css-tables-3/table-model-fixup.html": [
+ "bf4a9b28167ad2488496b4d4e89ca6d4a8a001ed",
+ "testharness"
+ ],
+ "css/css-tables-3/tools/markup-generator.html": [
+ "51db0929423a4932e4b783dba135adc100da34d9",
+ "support"
+ ],
+ "css/css-tables-3/visibility-collapse-col-001.html": [
+ "37a2cc2810033c7ae7f77e6a590a0c7676989abb",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-col-002.html": [
+ "afe49801b688476f8a9e25f6bf72d65b66c0d35e",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-col-003.html": [
+ "fd305ad0e69fe3dbdd360268ccf03faa0a540a2a",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-col-004-dynamic.html": [
+ "d485121ac249288ea6e548f73907e3402c8c6447",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-col-005.html": [
+ "ecade1aa3fdf57bf909d2db3cf6cec01c6980004",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-colspan-001.html": [
+ "738c2ceb03c12a552747dee5f8054d2f08c8ad13",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-colspan-002.html": [
+ "84068350c0f3dd2c6dd6bd26747f3d7a562bb62f",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-colspan-003-ref.html": [
+ "0994829d87e2c735c941507e9d2535cc34c70472",
+ "support"
+ ],
+ "css/css-tables-3/visibility-collapse-colspan-003.html": [
+ "f87bdbbca78a52f5ed7d374ed73c5f68bdeac98c",
+ "reftest"
+ ],
+ "css/css-tables-3/visibility-collapse-colspan-crash.html": [
+ "5b36da38e9a20e5ffac58aead916573d861d8778",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-non-rowcol-001.html": [
+ "01bfc00297b86ab1657fbe6ccfc4305918e007d0",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-row-001.html": [
+ "561091d13f3a50eff5c4be15208f02ff870e3108",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-row-002-dynamic.html": [
+ "eda3a60911cf11c6293a84c2dfd1535e8c9a100f",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-row-003-dynamic.html": [
+ "9847d3956b673a8dddb23381022a6a79b75c9f7a",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-row-group-001.html": [
+ "9101f01e3211f9c1e68bc3e0b202ba82cbf25e11",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-row-group-002.html": [
+ "bf2b6402f5012838d5a810f630b933f07fdc88aa",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-rowcol-001.html": [
+ "c448e0f49b516d3021f014ba5a39e30fb3ced33c",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-rowcol-002.html": [
+ "643b3d0dea23964e964d117600738bf9493591cf",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-001.html": [
+ "d20c4abcd7989df116ea693d79d3187dadbc701b",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-002-border-separate.html": [
+ "cf6ffb31a7f9403209ad5936ed11471f79279150",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-002.html": [
+ "639b5724c319adf1f5d7ea742a41e503ac87cb15",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-003-border-separate.html": [
+ "20617265e1daa314d5eed0527632c5e464852f2d",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-003.html": [
+ "f12cae04668c2cdb0f4e474a884cbd3093b06ed9",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-004-dynamic.html": [
+ "4151f0e7d8b634f8d5c85982ad4059fbaa90d9fc",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-005-ref.html": [
+ "842e9d58ac110f3a6f1f9a48f14b4d6e11e2e198",
+ "support"
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-005.html": [
+ "853233a8744c6387efbf31673986c7af798c5684",
+ "reftest"
+ ],
+ "css/css-tables-3/visibility-collapse-rowspan-crash.html": [
+ "0445b87883f6a0a8c361dce7fe6d7c70b2fa62e9",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-hidden-col-001.html": [
+ "8d76f7ce025eabcd0bff6f84aade9bf9be91171a",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-hidden-nested-001.html": [
+ "1f2eab48163bd064eddfa0c711f6fdf4d7773830",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-hidden-nested-002.html": [
+ "d279020ff40c4d2dfa9c771f3adb88e6ac7077c0",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-hidden-row-001.html": [
+ "68c6a1309b71dc39de84ef43a95cecae1a5aaafa",
+ "testharness"
+ ],
+ "css/css-tables-3/visibility-hidden-row-002.html": [
+ "ac9f17dc7b4755d419318a62600fdc2df60b0e88",
+ "testharness"
+ ],
+ "css/css-tables-3/width-distribution/computing-column-measure-0.html": [
+ "d52466ec6ce668ea9bab02195e6d2f322c11d9f8",
+ "testharness"
+ ],
+ "css/css-tables-3/width-distribution/computing-column-measure-1.html": [
+ "29bd50eaa57f885723025339ace2126e149bd0db",
+ "testharness"
+ ],
+ "css/css-tables-3/width-distribution/computing-table-width-0.html": [
+ "ab750620df9b6b6553fb1340d5f317fa5188afff",
+ "testharness"
+ ],
+ "css/css-tables-3/width-distribution/computing-table-width-1.html": [
+ "e80d7f892aa975892aa58eb6635c610b0d99341e",
+ "testharness"
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-1.html": [
+ "7eaadd0fab17f54010abcfbf1e185ad721ff1bad",
+ "testharness"
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-2.html": [
+ "7eaadd0fab17f54010abcfbf1e185ad721ff1bad",
+ "testharness"
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-min-content-guess.html": [
+ "1c161c6acf98576feacb27fd842a5e605a373235",
+ "testharness"
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-min-content-percent-guess.html": [
+ "56c2c9386bc9de95419d79818fec4dd2bbdbe74a",
+ "testharness"
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.1.html": [
+ "99fabe0b4aaf1c36b533cb8369cfb47f0db07c46",
+ "testharness"
+ ],
+ "css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.html": [
+ "9eeb49d2d78c3f81825de0d9e24de2a097275175",
+ "testharness"
+ ],
"css/css-text-3/OWNERS": [
"a9db9c3323d29904f9e631e48ddcd6c722e097a3",
"support"
@@ -514497,6 +522430,10 @@
"8af41ae6dd675774349e365cff8e0ee6b50bf7bf",
"support"
],
+ "css/css-text-3/i18n/OWNERS": [
+ "529a7d4e2cfca44f7804f88e375b383e2388c23d",
+ "support"
+ ],
"css/css-text-3/i18n/css3-text-line-break-baspglwj-001.html": [
"b08dfce276ccafb057c793d69c25cf0caff332cc",
"testharness"
@@ -518505,6 +526442,14 @@
"708040c72a525e3ca122156c0212ca7ec14852bd",
"support"
],
+ "css/css-text-3/line-break/line-break-anywhere-001.html": [
+ "1df8077c37fe3330623ee3ea12eb0efb6ef5f733",
+ "reftest"
+ ],
+ "css/css-text-3/line-break/line-break-anywhere-002.html": [
+ "639f9030e99b2cd0d6b42acc7a3c0da54b3fb420",
+ "reftest"
+ ],
"css/css-text-3/line-break/line-break-normal-021.xht": [
"6490bab71e762e042c5d37e7ad2b9852a53e50e6",
"reftest"
@@ -518557,6 +526502,10 @@
"8f124452720b5b1be387b72f721aff36111c01d6",
"reftest"
],
+ "css/css-text-3/line-break/reference/line-break-anywhere-001-ref.html": [
+ "6224337b8fabfa02acd3e742a65d2c7905043648",
+ "support"
+ ],
"css/css-text-3/line-break/reference/line-break-normal-021-ref.xht": [
"cc36420439dfb604810d5238e587bdb8d4a58a0e",
"support"
@@ -518610,59 +526559,59 @@
"support"
],
"css/css-text-3/line-breaking/line-breaking-001.html": [
- "3b3b07e7b0b38eceb406ece70a8276805256e93d",
+ "101c97ef00130bf5b904ee7fced14d128868b512",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-002.html": [
- "a2a8e0b1841aefedb0a313f02de3855f648effd4",
+ "66b9b3d14f1fe059d072d2faafd6847e115b7cea",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-003.html": [
- "27ce3e782d2f05ef9041b0886b636506022e7145",
+ "e53139f9f8175da5e3a7eb1ea82fc1f3c892e7f9",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-004.html": [
- "0ba49c1d8eec8df943a7c41e3ef502c477f2c0b7",
+ "e39c4b512cc325384726c5adffbbcccb14a446d8",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-005.html": [
- "02e63b116bf6d84a61fea082155c9a2f810ec234",
+ "0345094f500b23392cffdf48a6ca3cbf83be5b0c",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-006.html": [
- "b5921486b03a63b92e5b0f32286015fc10cd73ec",
+ "5b16e5bc5e484958517824ae6fce4462974b4c76",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-007.html": [
- "d52ba3d19fa9b47799798ee4fa48da63a527c477",
+ "43b4a7445b8d9ae5ecd753c7a9196bc3a0316aa2",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-008.html": [
- "f3596def9f2070e68689f1c907b37077f722c8f8",
+ "2bd35b7f6fb9fe3773e0104d11940d87b6011955",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-009.html": [
- "031e87586134b64c552e8fa2b35f866e4af04af3",
+ "c13b6cb3d448165c03530ad347575398d6d68451",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-010.html": [
- "e2de292594fc4d375939b8b8a834e6ef1edb71fb",
+ "7af4ec0774476064707a93ba1a8c2d041e5519ad",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-011.html": [
- "9dec2517875f9c2a83e251351b30895bba790b08",
+ "570233dc8a399e5f0cb47bc9302e306a083a184d",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-ic-001.html": [
- "ffe827dd366e5fc20c8c03f9560c80b6e7370095",
+ "1ae52aede1788270943bb03bb44d1c391a65a0b3",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-ic-002.html": [
- "a58bc14119a5d47df7a7c900a1e02be05bba0d38",
+ "595b8383b62a15bea1ab55f1c8d9376122cea9f9",
"reftest"
],
"css/css-text-3/line-breaking/line-breaking-ic-003.html": [
- "3ae6ef88fe7a3497692cae873a9d3dfb1937afbd",
+ "0fca11a308fafb818f4f1c22126dccc07f7b0094",
"reftest"
],
"css/css-text-3/line-breaking/reference/line-breaking-001-ref.html": [
@@ -520021,6 +527970,70 @@
"3a8b93dbbca1507311781081e33425e06a499a37",
"reftest"
],
+ "css/css-text-3/white-space/pre-wrap-001.html": [
+ "f93cc40a8d455d13fe110c3d7cc0284514d5ad8c",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-002.html": [
+ "64d2ec262a5fd3e2442d91081b9982f6959a5dd1",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-003.html": [
+ "3aea664385b6a065a30c1fc5e59ff799e67eba28",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-004.html": [
+ "039737abdebd796d54ac18473e7fa0fdb2260a6b",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-005.html": [
+ "52c66158b35fbc23e206ca058dd202315a56785d",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-006.html": [
+ "026913263a924c13e5ae44e2b682520c58228d1b",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-007.html": [
+ "9da32f0784c236fb42eb191196eeb879560cb9ba",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-008.html": [
+ "a8899baab31c158f1c58f376a65aba6996c29efe",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-009.html": [
+ "8ae0f2dc17e299fb5e9356c0b51f5ef203ace797",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-010.html": [
+ "af0595c7e23d3c011f513fa3573db153e4a522f4",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-011.html": [
+ "357ff8ef998ec147ea3ac7a5ecfd461391ba5f87",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-012.html": [
+ "07466d5c4186519718c265cf95415c19a4177d44",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-013.html": [
+ "a76f6a4042f4bd0579d495a5e94812303dab888e",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/pre-wrap-014.html": [
+ "aaa1e079c44e86250c6f12841d4c7635db74ad76",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/reference/pre-wrap-001-ref.html": [
+ "bba318097b9c85f6c15dc7f69bfcdc39514278e8",
+ "support"
+ ],
+ "css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html": [
+ "0d9b285072f9db8f337b743a8040e3d69bc97a2f",
+ "support"
+ ],
"css/css-text-3/white-space/reference/white-space-collapsing-discard-001-ref.xht": [
"a67bc4fe47ec809cea74476ccab6b0cebc1fdfb3",
"support"
@@ -520101,6 +528114,62 @@
"94f7655139fc8059856e3b92129b09a4a62509ec",
"testharness"
],
+ "css/css-text-3/white-space/textarea-pre-wrap-001.html": [
+ "e5aa5ae1cccf994eb821039ff9726ab41591dae2",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-002.html": [
+ "242cdc5e31096f99fe05f816898e69f29669dacf",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-003.html": [
+ "52eb65dfa1f0a2e415e6770908101eb75cb543e3",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-004.html": [
+ "d47ff3de33fb1c73eeb734d0d75dcd082e9ebec0",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-005.html": [
+ "f0aa2fc03ab62dd6099571636d6e882decd45b64",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-006.html": [
+ "a11429b9e29eb1fb6780ae4778da5990b154a634",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-007.html": [
+ "22b1d2bba518e4bb08225dcf908f083291e9e843",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-008.html": [
+ "b044f1f9774eb64ec3a47a5f145fb0540994ccee",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-009.html": [
+ "ab5bf5af5a528b388ff6968c6cfced9b3c1d12c7",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-010.html": [
+ "87f7f79bfb3cfa7493c5c805d3cd889835689799",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-011.html": [
+ "700bd41635bd14683d5efeead256ab70e00f3619",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-012.html": [
+ "ac711d5740bfd7244442f957bd5df6ed9f8d1633",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-013.html": [
+ "46a942378c02a6b856a7f29038683f4ada91f2b2",
+ "reftest"
+ ],
+ "css/css-text-3/white-space/textarea-pre-wrap-014.html": [
+ "8e8b3768bac0b8bb8a5a93f8d2afecf4fad1e819",
+ "reftest"
+ ],
"css/css-text-3/white-space/white-space-collapse-000.html": [
"311f61dd93bf7b39b07f14aacad5d4bd77639cb2",
"testharness"
@@ -525273,6 +533342,22 @@
"7a9cc02dc9cddb5888ffe57ff57693689a510594",
"reftest"
],
+ "css/css-transforms-2/animation/resources/interpolation-testcommon.js": [
+ "e53ebd086f11169bf516f4d2e68449290943ba98",
+ "support"
+ ],
+ "css/css-transforms-2/animation/rotate-interpolation.html": [
+ "f5b8b30c9bc0789d59b3451789c24009b93dd21f",
+ "testharness"
+ ],
+ "css/css-transforms-2/animation/scale-interpolation.html": [
+ "51271e16c98a7a4e6405c28d149e77eb439e670c",
+ "testharness"
+ ],
+ "css/css-transforms-2/animation/translate-interpolation.html": [
+ "9a28f675c790c3dec66f655418051a5a7ba52ec7",
+ "testharness"
+ ],
"css/css-transforms-2/backface-visibility-hidden-001.html": [
"d12cfa3b31b7f98d0ff5693bfde49247d34cb156",
"reftest"
@@ -525861,6 +533946,10 @@
"cf9af05cb3d0f2a54fce7554f15cf0159c16a5a7",
"reftest"
],
+ "css/css-transforms-2/transforms-support-calc.html": [
+ "f179489200392d7af2e33a9ac2123c51b9aac21d",
+ "testharness"
+ ],
"css/css-transforms-2/transofrmed-preserve-3d-1.html": [
"6b9049d0a41eaa593b0d7aa2eaceebe952850851",
"reftest"
@@ -525910,31 +533999,31 @@
"testharness"
],
"css/css-transitions-1/events-001.html": [
- "abffac2d61bc91e8b3277b402f9b624bac35936b",
+ "30eb9732ba5c1d5325cb95a1d21e34f06251c613",
"testharness"
],
"css/css-transitions-1/events-002.html": [
- "52374e677c313f03551994597d8b83dc0f8f1490",
+ "5fb98d8366418a6d6c72e1885bf0ea0f428e42be",
"testharness"
],
"css/css-transitions-1/events-003.html": [
- "3e490116ffa0850bc849c2731dfa43c42ce78a17",
+ "cb4147b4b9e43b3ec6fc70c7887621790e00c0ea",
"testharness"
],
"css/css-transitions-1/events-004.html": [
- "26295080416d83dcb6ccdc6d3158d2e84b29e32b",
+ "ba0027ef26edfde941ab3c2f0072e10f0c6248a4",
"testharness"
],
"css/css-transitions-1/events-005.html": [
- "d5a001057e76b24a9614a1e6eb0c79e6ecb86186",
+ "fb8c4dd32adcb9b264f2990ab4e962986561f5ed",
"testharness"
],
"css/css-transitions-1/events-006.html": [
- "0e3dd5bdfd7f0d4cb3324bf8315f2a1748df04c2",
+ "2e957a34c69ca94037f4b8af9c3e87fc94a63a46",
"testharness"
],
"css/css-transitions-1/events-007.html": [
- "3848e7aa9b6023144fd2dd8bde568a664a564d02",
+ "f92ae90b2f7a88f32f141b3136ff833fb7ba6a2b",
"testharness"
],
"css/css-transitions-1/hidden-container-001.html": [
@@ -526042,7 +534131,7 @@
"support"
],
"css/css-transitions-1/support/helper.js": [
- "b286f9cb99db632a2e95707119e7cb6e0a0f3aab",
+ "73bb1ba1862facb0d8a3e3dcd78611a79f458025",
"support"
],
"css/css-transitions-1/support/import-green.css": [
@@ -526562,7 +534651,7 @@
"reftest"
],
"css/css-ui-3/box-sizing-026.html": [
- "6bb008f9fa588f7b70bcef848418f6859471bd68",
+ "6a26323ef89863c263b04b5818210dd2c5e56b01",
"reftest"
],
"css/css-ui-3/box-sizing-027.html": [
@@ -526654,7 +534743,7 @@
"testharness"
],
"css/css-ui-3/caret-color-020.html": [
- "ccb5ab72ef95d82eba7504f26170a88a98178edd",
+ "46c6575138d57250aa385e2ee5fa4a8453da644e",
"testharness"
],
"css/css-ui-3/caret-color-021.html": [
@@ -526758,7 +534847,7 @@
"manual"
],
"css/css-ui-3/cursor-auto-005.html": [
- "a43f04957e1fae08426b704fa20811f468fd2384",
+ "a68a5b0fb98e906f04187fcf074f71bdaf306641",
"manual"
],
"css/css-ui-3/cursor-border-area.html": [
@@ -526814,7 +534903,7 @@
"manual"
],
"css/css-ui-3/cursor-image-005-nfs.html": [
- "93029cc439245985a3cf93d39898f051d8d7ef00",
+ "ca07822b75d3299c3530fa72d33feb6bdcf7fa36",
"manual"
],
"css/css-ui-3/cursor-image-005.html": [
@@ -527073,338 +535162,6 @@
"2e8ca204b57791ff0ba7c22c9190e7d8c75ff627",
"manual"
],
- "css/css-ui-3/nav-dir-001.html": [
- "772379f7700569ae3396718479f5729660ea64bc",
- "manual"
- ],
- "css/css-ui-3/nav-dir-002.html": [
- "667c89bf03731e47f3e871d6f130667a60712376",
- "manual"
- ],
- "css/css-ui-3/nav-dir-003.html": [
- "c2f3616ff3fe089b96e2b3bbf5f15886b799a6f3",
- "manual"
- ],
- "css/css-ui-3/nav-dir-004.html": [
- "5ea15af69676bd15d0297c362976a5ef82c2c0dc",
- "manual"
- ],
- "css/css-ui-3/nav-dir-005.html": [
- "13feee69db21b78cae93c6f7f315371735484bb6",
- "manual"
- ],
- "css/css-ui-3/nav-dir-missing-1.html": [
- "5caf870ac600fe8b462468fe077a174186fbcdfe",
- "manual"
- ],
- "css/css-ui-3/nav-dir-missing-2.html": [
- "75996535a3240a35dcf009e3f240c5a5258b438f",
- "manual"
- ],
- "css/css-ui-3/nav-dir-missing-3.html": [
- "196a7aea5c99b4399046cf9083e68b7d1e9459f3",
- "manual"
- ],
- "css/css-ui-3/nav-dir-missing-4.html": [
- "f0480a64f31e01f548dd5dabec74ab6afd27c1ff",
- "manual"
- ],
- "css/css-ui-3/nav-dir-target-001.html": [
- "10ea2d0f38406e8bcfbb33062303c9af58413221",
- "manual"
- ],
- "css/css-ui-3/nav-dir-target-002.html": [
- "2bbb676b6004d2458904a2163c9ef08795449f38",
- "manual"
- ],
- "css/css-ui-3/nav-dir-target-003.html": [
- "cb840313416793c463b6c28257ae184a98145823",
- "manual"
- ],
- "css/css-ui-3/nav-dir-target-004.html": [
- "5f625b2fdae6f6045a4701a922bb3744912c326f",
- "manual"
- ],
- "css/css-ui-3/nav-dir-target-005.html": [
- "be67a70fb20d9727b4a2178ecb45c3496fb7783b",
- "manual"
- ],
- "css/css-ui-3/nav-dir-target-006.html": [
- "39bdba09ae5e3a5c6506c291ec93b07615596740",
- "manual"
- ],
- "css/css-ui-3/nav-down-000.html": [
- "87397f09746ae146acf076d0a9a92f4b09b7fbf4",
- "manual"
- ],
- "css/css-ui-3/nav-down-001.html": [
- "ae56cf157703e85096efa3dd13ef227917f9d8e2",
- "manual"
- ],
- "css/css-ui-3/nav-down-002.html": [
- "c2c297028fd36e546ef24211fc170c7c08c3e256",
- "manual"
- ],
- "css/css-ui-3/nav-down-003.html": [
- "279906f4a9f03fbdc64f4bbb8283c981bbd0c072",
- "manual"
- ],
- "css/css-ui-3/nav-down-004.html": [
- "9291c84ef07a6c0a7aaeb38c012ea9ca3dd1ba7f",
- "manual"
- ],
- "css/css-ui-3/nav-down-005.html": [
- "6f8cedba205d51bf19f8c483606e3bb07e48fcbf",
- "manual"
- ],
- "css/css-ui-3/nav-down-006.html": [
- "58098a1a42d38bbdb48269bda43c120af648e5dd",
- "manual"
- ],
- "css/css-ui-3/nav-down-007.html": [
- "2614f21a71b11ca4c34476994b9dd6727c6b6b76",
- "manual"
- ],
- "css/css-ui-3/nav-down-008.html": [
- "52ba1760f7847779a7c27c72eba7b715210a7e9c",
- "manual"
- ],
- "css/css-ui-3/nav-down-009.html": [
- "7828f6b16d08f00f65c6dc43058a5c7042a14ff3",
- "manual"
- ],
- "css/css-ui-3/nav-down-010.html": [
- "0b48cda4813e8f79f3fa258a45811eb0215e23c0",
- "manual"
- ],
- "css/css-ui-3/nav-down-011.html": [
- "70a73d28364296de6dd99f9a82953b971eb8a448",
- "manual"
- ],
- "css/css-ui-3/nav-down-012.html": [
- "3f3db4e329a737c3f0064dd8cfd92e4e4e7847b6",
- "manual"
- ],
- "css/css-ui-3/nav-down-013.html": [
- "3274b1ec8a3b7ca30dd40043383d48e480ae5a43",
- "manual"
- ],
- "css/css-ui-3/nav-down-014.html": [
- "dc80661a5645e67bc8be17f5d505031ea192e102",
- "manual"
- ],
- "css/css-ui-3/nav-down-015.html": [
- "63e10ad2c200c8f6ce977580323edd29947d6a5c",
- "manual"
- ],
- "css/css-ui-3/nav-down-016.html": [
- "024626f546e56694b448ea2afc09c931fb45dec1",
- "manual"
- ],
- "css/css-ui-3/nav-left-000.html": [
- "f4f25a7f7f41e121d89461c175433bb57582fd7e",
- "manual"
- ],
- "css/css-ui-3/nav-left-001.html": [
- "65c5511aa99e4252f303d392a20b811e4a3fd47c",
- "manual"
- ],
- "css/css-ui-3/nav-left-002.html": [
- "b8f11306069a5e026fc5b9c823215527432aa3f5",
- "manual"
- ],
- "css/css-ui-3/nav-left-003.html": [
- "4e343788ca5789761ee2a67f7d6a84cae84ed46d",
- "manual"
- ],
- "css/css-ui-3/nav-left-004.html": [
- "36f1718aff3256e811d35ae68f07f44a965f9423",
- "manual"
- ],
- "css/css-ui-3/nav-left-005.html": [
- "fd3636dad346ab2bdea7e524f58ce932677f7039",
- "manual"
- ],
- "css/css-ui-3/nav-left-006.html": [
- "8b4420eae2175b91eb429d0603ea38a5daac833e",
- "manual"
- ],
- "css/css-ui-3/nav-left-007.html": [
- "bbdf1136a43af0fdb06150f5b5cf56b2938bb51e",
- "manual"
- ],
- "css/css-ui-3/nav-left-008.html": [
- "d4a9f1aed5750e9a9febd0492a4284f8fbd0fcff",
- "manual"
- ],
- "css/css-ui-3/nav-left-009.html": [
- "8b24f5ba804c45e0d2db8f7693671c562d40af84",
- "manual"
- ],
- "css/css-ui-3/nav-left-010.html": [
- "f553d0935a27bddb3844674f7a27c1f783ce0a6f",
- "manual"
- ],
- "css/css-ui-3/nav-left-011.html": [
- "d60282a45345c8b5691f8d4b78f5ad547c82aeb7",
- "manual"
- ],
- "css/css-ui-3/nav-left-012.html": [
- "3913422f42da4864d048f05decb151b31843dfd2",
- "manual"
- ],
- "css/css-ui-3/nav-left-013.html": [
- "2161dafa345cb968fbea21ae20872ef180098cdc",
- "manual"
- ],
- "css/css-ui-3/nav-left-014.html": [
- "e3b67dfb13e832d56e91f7f791c407f3c4f897ac",
- "manual"
- ],
- "css/css-ui-3/nav-left-015.html": [
- "482e87762da0ddccd0e31e23afa4663e9f6176b1",
- "manual"
- ],
- "css/css-ui-3/nav-left-016.html": [
- "f2d88e02608df672c7adb7750725f5a450586a5a",
- "manual"
- ],
- "css/css-ui-3/nav-right-000.html": [
- "a636814c5823ad74b1a04a9cc8d3e24b987cd42a",
- "manual"
- ],
- "css/css-ui-3/nav-right-001.html": [
- "32c5f7be5de8255962b9ecd25a90d082b187aef5",
- "manual"
- ],
- "css/css-ui-3/nav-right-002.html": [
- "dbced845931603a2a6e7b26a3ef3efca03ee8780",
- "manual"
- ],
- "css/css-ui-3/nav-right-003.html": [
- "c86350267e181367403d9d4fce1e641895fec2db",
- "manual"
- ],
- "css/css-ui-3/nav-right-004.html": [
- "634c9bbae8361d83d86e48e3c59da4f5cb7d1b4e",
- "manual"
- ],
- "css/css-ui-3/nav-right-005.html": [
- "27f4324a629556b75d2d5c623a8bdb31b0ecce84",
- "manual"
- ],
- "css/css-ui-3/nav-right-006.html": [
- "c05f10b124d05460bdb2b67def551c21098486a5",
- "manual"
- ],
- "css/css-ui-3/nav-right-007.html": [
- "cf9d55ae148b4680d70ff66430683709fddd73f1",
- "manual"
- ],
- "css/css-ui-3/nav-right-008.html": [
- "bcd91d9b700a78b1c20af109a38f95704f42f2b2",
- "manual"
- ],
- "css/css-ui-3/nav-right-009.html": [
- "7276fc822e5567a1f62e89a8b199930267b53f5f",
- "manual"
- ],
- "css/css-ui-3/nav-right-010.html": [
- "a7eb042049572cb4ddd5544c8c4ea4ccf44c3d6f",
- "manual"
- ],
- "css/css-ui-3/nav-right-011.html": [
- "2ee0abf5da3622b294acfebc45f2f798eac3c14b",
- "manual"
- ],
- "css/css-ui-3/nav-right-012.html": [
- "d09cab41027f1d08458262051fd8663b55748058",
- "manual"
- ],
- "css/css-ui-3/nav-right-013.html": [
- "591faab8291eacc020ed1fbd990e309dae8b550b",
- "manual"
- ],
- "css/css-ui-3/nav-right-014.html": [
- "a77ecf3fc8d909c4bd33fdef48d51fa4ec1b9b2f",
- "manual"
- ],
- "css/css-ui-3/nav-right-015.html": [
- "1fcebc9cda37d0d3fed29506a7c9f83b3f10135b",
- "manual"
- ],
- "css/css-ui-3/nav-right-016.html": [
- "ab2b98b052349f012d8f916c3b2d89dc73d9abd0",
- "manual"
- ],
- "css/css-ui-3/nav-up-000.html": [
- "b61e0f3ef9279a2803f2a4d76eb656fd58855c3d",
- "manual"
- ],
- "css/css-ui-3/nav-up-001.html": [
- "79d8e066d90ccaac03b6d744cf5c228c21bb2d46",
- "manual"
- ],
- "css/css-ui-3/nav-up-002.html": [
- "58107264c1f592a0d0d66ab57df66d02e6b09c99",
- "manual"
- ],
- "css/css-ui-3/nav-up-003.html": [
- "f5ed4091a72e87333b947b3865426e154f18c50e",
- "manual"
- ],
- "css/css-ui-3/nav-up-004.html": [
- "25e21393ee33456a3ab2190de02956eb2cc9f359",
- "manual"
- ],
- "css/css-ui-3/nav-up-005.html": [
- "b0e1878c4b15c861e1247bb1a97f11fa85758a6a",
- "manual"
- ],
- "css/css-ui-3/nav-up-006.html": [
- "ce3f9ff267207f89fdadd4cf1a214b73cd474d4f",
- "manual"
- ],
- "css/css-ui-3/nav-up-007.html": [
- "cc0bd401a05cb1fb0b747468fa42900444ca4d7f",
- "manual"
- ],
- "css/css-ui-3/nav-up-008.html": [
- "afcd3260649917122b6e930a93e3be2825bf3811",
- "manual"
- ],
- "css/css-ui-3/nav-up-009.html": [
- "5bf6751b09d8343248e8c3766de42b3fb6b566ad",
- "manual"
- ],
- "css/css-ui-3/nav-up-010.html": [
- "0365436c8edb5bb7fd0ef3734ae51c6eebbf4da7",
- "manual"
- ],
- "css/css-ui-3/nav-up-011.html": [
- "e991ca8ebb252377d0d195f9c733846a25e101a5",
- "manual"
- ],
- "css/css-ui-3/nav-up-012.html": [
- "f507c524983d1aef87104e122380d202e57bf05e",
- "manual"
- ],
- "css/css-ui-3/nav-up-013.html": [
- "287d3119523969f3285520d781e668d2d3625127",
- "manual"
- ],
- "css/css-ui-3/nav-up-014.html": [
- "f84d3ca73ada8439df5cb908985c68f2aaa70c18",
- "manual"
- ],
- "css/css-ui-3/nav-up-015.html": [
- "e8b8d238be0509c7328293961d10cbf3fad33578",
- "manual"
- ],
- "css/css-ui-3/nav-up-016.html": [
- "ad8cc6d69e04b4bd5ed109f7af651d4eebf05c98",
- "manual"
- ],
"css/css-ui-3/outline-001.html": [
"c5058ebab47c4d310acb8e1dd566d3b55293fc90",
"reftest"
@@ -527589,6 +535346,34 @@
"ea7ec45c0b7b59812e6592c6211986d5ea3127af",
"support"
],
+ "css/css-ui-3/reference/text-overflow-006-ref.html": [
+ "e6c2501941e2c8275d2d2a5322c217533f370d63",
+ "support"
+ ],
+ "css/css-ui-3/reference/text-overflow-008-ref.html": [
+ "1aeb23c5928c075cffbb7fc81a4b6e328f60fc06",
+ "support"
+ ],
+ "css/css-ui-3/reference/text-overflow-012-ref.html": [
+ "cd83e5bc38f51672eff31efab017431065d17b9e",
+ "support"
+ ],
+ "css/css-ui-3/reference/text-overflow-013-ref.html": [
+ "414a9396a5972ec32b7d4b0e891c4b883b8bfb33",
+ "support"
+ ],
+ "css/css-ui-3/reference/text-overflow-016-ref.html": [
+ "cd35899144c43cb2a76d2986a28cd009140d7cca",
+ "support"
+ ],
+ "css/css-ui-3/reference/text-overflow-021-ref.html": [
+ "317e02ebc1fb90e7d91bed1fd982d2bf81a10cfc",
+ "support"
+ ],
+ "css/css-ui-3/reference/text-overflow-022-ref.html": [
+ "a223e8c0151a7ffc350466dd3b13f766f67425e8",
+ "support"
+ ],
"css/css-ui-3/resize-001.html": [
"cee9af6bf866dc360a2f6e8a8a8b29376205dfde",
"manual"
@@ -527617,10 +535402,70 @@
"ec49229d583a225738a3f514ae280d1ddfafd199",
"manual"
],
+ "css/css-ui-3/resize-008.html": [
+ "8ab240226c30f6c13c368ea2d9d36812624cee21",
+ "manual"
+ ],
+ "css/css-ui-3/resize-009.html": [
+ "3a0c023506f975edb6b33d8f33a45911b767476a",
+ "manual"
+ ],
+ "css/css-ui-3/resize-010.html": [
+ "25eb9b36b22d59fca313dd2bc5bd01482b1e97ab",
+ "manual"
+ ],
+ "css/css-ui-3/resize-011.html": [
+ "e748077bb1f53f0298ff0a90122243e088c74512",
+ "manual"
+ ],
+ "css/css-ui-3/resize-012.html": [
+ "b46a69991f46cd17379c560bca5775ee9b615e51",
+ "manual"
+ ],
+ "css/css-ui-3/resize-013.html": [
+ "26714a476eb6e6b34e006bd004907ac51f61a062",
+ "manual"
+ ],
+ "css/css-ui-3/resize-014.html": [
+ "e31a1fba24516a5b64d5934f1d0f89337d52226c",
+ "manual"
+ ],
+ "css/css-ui-3/resize-015.html": [
+ "c994a65d309d23f2cedb38645b521f36325d9224",
+ "manual"
+ ],
+ "css/css-ui-3/resize-016.html": [
+ "3c08942b3f27ab8b90fcbad01fbc96c778a5bcaa",
+ "manual"
+ ],
+ "css/css-ui-3/resize-017.html": [
+ "b333ab876e53b194a5f292152fa3277d643ff50d",
+ "manual"
+ ],
+ "css/css-ui-3/resize-018.html": [
+ "38c5691917b0a1fdfffb5347beadd824e6e7ceda",
+ "manual"
+ ],
+ "css/css-ui-3/resize-019.html": [
+ "aabb0e62b8fa9b51d663c7759442ff4d7fbfe3b7",
+ "manual"
+ ],
+ "css/css-ui-3/resize-020.html": [
+ "dae674378da42d37720c2e892525da3c6df564e4",
+ "manual"
+ ],
+ "css/css-ui-3/resize-021.html": [
+ "cb95c6ff5f784bcd91a044a5ed3fcc2ae311f388",
+ "manual"
+ ],
"css/css-ui-3/select-cursor-001-manual.html": [
"192de157a390bef30b481257c3979c117c08e6fa",
"manual"
],
+ "css/css-ui-3/support/1x1-red.png": [
+ "b8da86921d04ba42f42b0a60b03c5c2172f58c2b",
+ "support"
+ ],
"css/css-ui-3/support/PTS/PngSuite.LICENSE": [
"6535877ae26ff794820c6bde77fb7d59a322e2ff",
"support"
@@ -528409,158 +536254,590 @@
"3deb8a8171218fc8fb08098cd815099106f0d6bc",
"support"
],
- "css/css-ui-3/support/nav-dir-target-001-frame.html": [
+ "css/css-ui-3/support/orange.png": [
+ "df451ef5ab05264d56616c24d94fde0e0882fff7",
+ "support"
+ ],
+ "css/css-ui-3/support/orange.svg": [
+ "2d1dffcb42c54326795ed90700d23b7347a1644b",
+ "support"
+ ],
+ "css/css-ui-3/support/r1-1.svg": [
+ "e2eb4fc2608d74be2156eccb5ea5a22866e6eb66",
+ "support"
+ ],
+ "css/css-ui-3/support/red.ico": [
+ "559cf518d41b151bac2638045093ca0a0d9317e8",
+ "support"
+ ],
+ "css/css-ui-3/support/test.mp4": [
+ "2750d8491565f07a5f09eadfe1a1f0336a3ca26a",
+ "support"
+ ],
+ "css/css-ui-3/support/test.ogv": [
+ "25cc63ff816d5bfb039da788131050dba9d7dc6c",
+ "support"
+ ],
+ "css/css-ui-3/support/test.webm": [
+ "a06d964d2c7a770ddfc375532d06b94bf1a83c3c",
+ "support"
+ ],
+ "css/css-ui-3/support/w100.svg": [
+ "a82922abdcaba31b934a27cbc43bca3bd46de54b",
+ "support"
+ ],
+ "css/css-ui-3/support/w100_h100.svg": [
+ "b5b050ad0344710ddec9e5c93a6cbfeeaf2ee20f",
+ "support"
+ ],
+ "css/css-ui-3/support/w100_r1-1.svg": [
+ "0667f9291cd181d556973f9160cc31b77c418856",
+ "support"
+ ],
+ "css/css-ui-3/text-overflow-001.html": [
+ "7a09684be603baa70060c492a1b07cfb9ac05cb6",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-002.html": [
+ "1ec568d24ac29f013f022f14f2bebfd5caa02834",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-003.html": [
+ "71ef58a5310fb01b844eaecf9c9db4fd1d2afbff",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-004.html": [
+ "7f8d6b8a49fe41b336b437083978acf69e562a1e",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-005.html": [
+ "19d88ba58ec539abc1e32a3e07526a7abea355f4",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-006.html": [
+ "f1cf60e25fd70476597cd86cd81ebeea6a5586a3",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-007.html": [
+ "c4efe1edf35eaf83285d87829304ff371e33c76e",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-008.html": [
+ "6dae594a6197701649c6fafcbc2f266131fcd041",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-009.html": [
+ "e5de25b0ba1656c38a7c732baffc4f3306683f23",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-010.html": [
+ "6f55e6742384c08368649656cda8f46aee5fe619",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-011.html": [
+ "5ce16822f7171d50bc2e2659f9231cd33f5593ca",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-012.html": [
+ "2c83443f2808e4b20b25dcdc4f8bb254e00b40e8",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-013.html": [
+ "625eeabf9fad164337a1e40cbd038d3a6b471786",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-014.html": [
+ "d3b43ba202011615e0fc2ccd80e742e7b7a22b84",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-015.html": [
+ "ed90af2ad47fd37b3c40ae2c9ac2ae5c9343abf1",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-016.html": [
+ "a1e53d9b311db7d49fcbffeb9a4632ec79bd5721",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-017.html": [
+ "03ae27b87d81b474cbea774f2f39ff32e654575c",
+ "manual"
+ ],
+ "css/css-ui-3/text-overflow-018.html": [
+ "f46736c20bfc3cf7bd169d7bdad2c90f2e206556",
+ "manual"
+ ],
+ "css/css-ui-3/text-overflow-019.html": [
+ "42c979c66b0bc6a253416c6dfc665ab88fc110ce",
+ "manual"
+ ],
+ "css/css-ui-3/text-overflow-020.html": [
+ "99c73b2e261a5526d7883572eb2ce61da0b58688",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-021.html": [
+ "afbaf2e7d3acfa93b295b656a0ffbb2a4f74011f",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-022.html": [
+ "095f78700529b34397887722b57b56dd7dd97861",
+ "reftest"
+ ],
+ "css/css-ui-3/text-overflow-023.html": [
+ "4fd38a517e41851216d12db8c6b732d96f76e325",
+ "testharness"
+ ],
+ "css/css-ui-3/text-overflow-ref.html": [
+ "db55b0b95a7406e9c4f00081b3e2cbe6b07363f7",
+ "support"
+ ],
+ "css/css-ui-3/text-overflow.html": [
+ "d3a6c835c23b82a85398e7981461a0cd3a75b861",
+ "manual"
+ ],
+ "css/css-ui-4/OWNERS": [
+ "b57cbdb893bb5494e68700974ff711b6078f962e",
+ "support"
+ ],
+ "css/css-ui-4/nav-dir-001.html": [
+ "b9d172945ca5861bc050d920cef1dc0a9c7a6c78",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-002.html": [
+ "b10929bc98bfa76f5d2fee1070e0dab503ce2b9d",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-003.html": [
+ "5a5763462d593ebd69adf6e04c325711136592f9",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-004.html": [
+ "3a0cc6b3c5e76a4d904e8fe71ba26c2c21c4c4e0",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-005.html": [
+ "22b541a91781b3302544adb2f2582dcd4be32f6c",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-missing-1.html": [
+ "abcd5d3fc22f36a41092764b3b6394ca2d34eec3",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-missing-2.html": [
+ "7f2a8b5a5d4f37ced0a3352325e7cdb816d3aa63",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-missing-3.html": [
+ "475efcd6f2e10c13733d8deba4f9cbabecd513dc",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-missing-4.html": [
+ "f16b0e211d6841657805fadba27efa2c23d4b879",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-target-001.html": [
+ "074a17a86ce546a221d0bf777eb1183becdfa3e5",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-target-002.html": [
+ "400fab62f649816b883904579d1452eb0f1c92f7",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-target-003.html": [
+ "bc613463b188200a4b0236ca214861fbeec568f8",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-target-004.html": [
+ "1252ef4d84d40f6c8f01952d1cbef59c930f0601",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-target-005.html": [
+ "e7bbfec4d257d314c2d76832b4819e93120dabbe",
+ "manual"
+ ],
+ "css/css-ui-4/nav-dir-target-006.html": [
+ "7ef856d8390d8f100892725e6917fd9f253f07cb",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-000.html": [
+ "c1287ca547c24ac6f7db35bb3e709d36d491696b",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-001.html": [
+ "e3e7e4e2f2af5b4481ad5953bedc1ab084131231",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-002.html": [
+ "ce80fa70f7af5a02aef62f354538e24ff8d74527",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-003.html": [
+ "f28b125c07a6f1b464e20c32059e6228ef65ca4d",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-004.html": [
+ "52487b6bd550d9a6396f46e44fe6f280432489d9",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-005.html": [
+ "b273d38a9237e2faba8ab35180eed6525743f63e",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-006.html": [
+ "922782236d3b8f29c293bc7e529d4c3ea28a85a8",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-007.html": [
+ "e9b39ec847bd11c5c23874113fbfa696d3c1ef77",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-008.html": [
+ "9de3f3e72d237f1396a257f488440b39d7eff6c8",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-009.html": [
+ "afb44a2aff57fe82db4d28303d71797414aceb3a",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-010.html": [
+ "fb99b0a1ee8882f805912a7ab93c82c9a890c143",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-011.html": [
+ "4df9181b9a3cc39b1f351c876e97e36c9f0ce2d9",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-012.html": [
+ "1c7c0a008a49863cde0cc0cdfc1674f0fc47d660",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-013.html": [
+ "29418276a64f375c5eccf832786c8ea9de32383b",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-014.html": [
+ "c6278153a24485493d191d8885d924c6c88c297b",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-015.html": [
+ "f904e5163c518673ce581122348a2e03ff2332ca",
+ "manual"
+ ],
+ "css/css-ui-4/nav-down-016.html": [
+ "9df191bf38953fdb1841a230ca6d9429590b06da",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-000.html": [
+ "e1118a0700e78f46480990ad563649500e02582e",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-001.html": [
+ "f9c2a4df21b58d84c3218431df8bfb05ef12edf7",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-002.html": [
+ "aa9edc7a2c814dba056e808bd6a2f86d1aa84357",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-003.html": [
+ "e284972b15bd670b3807feed1a6114b739564d31",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-004.html": [
+ "6aa49f0d92c8334aff95a61740b1eb006f6d1b1f",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-005.html": [
+ "5108603791efa443cb887cb2987fa86e5749ca8e",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-006.html": [
+ "e3681e4abf731cb4b62725f4786784776e04a353",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-007.html": [
+ "9b2c699af68b90a35b01ce0584952221ed9cd113",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-008.html": [
+ "f54bd3fe942c8edd0970d619d2378370c060a24b",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-009.html": [
+ "77c7d64326e3037705987b825871177e11b7ba3a",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-010.html": [
+ "dd936da3c9e8987e0dc6820a3b3ef27c6d8343dc",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-011.html": [
+ "72a2e80caee777bbcfafbb0ff585215e30769735",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-012.html": [
+ "24a2dafadbe7dd62a7c6dd6594b70b5e4751bc4a",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-013.html": [
+ "c7a113934e2385447017bc1481e1425d2c81fef4",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-014.html": [
+ "228504658b117be051baeff6142f629ae78d1c2d",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-015.html": [
+ "4b75e893a9a6c8de4228524b760b96acea70a36e",
+ "manual"
+ ],
+ "css/css-ui-4/nav-left-016.html": [
+ "651d1c8346a2eed890ae2cf6bd4db90ea6ac1b43",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-000.html": [
+ "7e89c22c3c2472d4f5fbd564e3825315d75de459",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-001.html": [
+ "f35a838abd7c2aecfcd24f1c6243fe1bb0c31082",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-002.html": [
+ "e6b16797d864bd1ced18ad253ab52e0f57c49fef",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-003.html": [
+ "31dbffcff7faeb6094db87645e47236d26c50a06",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-004.html": [
+ "03fa277bf596746f3b61ee5e5be3a321d8a7bba7",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-005.html": [
+ "d965a2305d4899a8d90e4faefda1d79053216ed3",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-006.html": [
+ "f4a6d0adc871cfbf040ea18b9142c747012ad7b6",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-007.html": [
+ "c64c02364cea3cd165a93cf877be323562e5eb26",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-008.html": [
+ "73ab7ab6d230a440e93ab3e958543003b734ab8b",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-009.html": [
+ "1192b7d91598ab6d3526e580296c3023c6a41ac2",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-010.html": [
+ "3edd085374d6d655aaa3b568c61dcec2596b37a8",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-011.html": [
+ "3e63e30d78a57bbedeeb9a834f8fb317737267cf",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-012.html": [
+ "06501e7caa08668e94231bd7def9151433d89c0b",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-013.html": [
+ "f8c8d473001ee85eebfd1f8c6a9802e8ec80f761",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-014.html": [
+ "f166818dd0e1783b253a06c258fa1a290f3ef976",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-015.html": [
+ "7d755c5d58d1fb7b6613c2b9efa1e2a520535bd9",
+ "manual"
+ ],
+ "css/css-ui-4/nav-right-016.html": [
+ "2014e179db743e4dc024d2fed2fd97df7788e32b",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-000.html": [
+ "bab571c2051c63a097b58e4377f06747e15f5db1",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-001.html": [
+ "1e9ee078938ebe3930426e99b206bd3ff014e288",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-002.html": [
+ "1fce38fdce1b66c65c508d82c7344dc21346fc1d",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-003.html": [
+ "24b2fcc3d1365d0b6c12a6874154ed2570cf2d95",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-004.html": [
+ "bc242a5091c641bdba6bc6bcc6e49fe13aefcd9a",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-005.html": [
+ "c94c2f9cad3b09ccbe019dcf21f33d153f0a12d0",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-006.html": [
+ "fd8885267245e5bafd6a2c82b2f793978ea908c7",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-007.html": [
+ "9c5f8cfc0f639ed96d34e1bbb902ae72765ee5f1",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-008.html": [
+ "cab2a75dc074657e52a230681d05187cbe679032",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-009.html": [
+ "1c6e6bdbc6f061804b41f091e80e2a1906ef6eb7",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-010.html": [
+ "63448df6cd508ca823c04fc7ff381d943d1b4ebe",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-011.html": [
+ "f53598e695b27987b40931954696e2ac3d5557e1",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-012.html": [
+ "36b0539a4f353a3d3e61d10192b03d99a85b2d8c",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-013.html": [
+ "4e41dac5ca3f5b648fb48a37b9a41a0eb1d170f7",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-014.html": [
+ "1e440d1596484e70a737af0eabad2494f5b4d01c",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-015.html": [
+ "68e2e24d6a0ebd3c2ec5246a28f110aaf1fd54c9",
+ "manual"
+ ],
+ "css/css-ui-4/nav-up-016.html": [
+ "917c171498ee00053803d6bd90f1bf47a09923da",
+ "manual"
+ ],
+ "css/css-ui-4/support/nav-dir-target-001-frame.html": [
"ab56e27f58e6034f0c3c18aec5d3b594247dc3ec",
"support"
],
- "css/css-ui-3/support/nav-dir-target-002-frame.html": [
+ "css/css-ui-4/support/nav-dir-target-002-frame.html": [
"8302be532bc6f2de6e036d52c30a0815f5c4bc1f",
"support"
],
- "css/css-ui-3/support/nav-dir-target-003-frame.html": [
+ "css/css-ui-4/support/nav-dir-target-003-frame.html": [
"2199b88f0900b167bd100a01515f13035d8def4c",
"support"
],
- "css/css-ui-3/support/nav-dir-target-004-frame.html": [
+ "css/css-ui-4/support/nav-dir-target-004-frame.html": [
"a19162873778a13e53594d414cf3d7645d0ac7e7",
"support"
],
- "css/css-ui-3/support/nav-dir-target-005-frame.html": [
+ "css/css-ui-4/support/nav-dir-target-005-frame.html": [
"7bb73c3b77a09520bcc30efa00db08d7cc57c415",
"support"
],
- "css/css-ui-3/support/nav-down-009-frame.html": [
+ "css/css-ui-4/support/nav-down-009-frame.html": [
"c92870d141222c76ffdf3a3991cfc6ad13244755",
"support"
],
- "css/css-ui-3/support/nav-down-010-frame.html": [
+ "css/css-ui-4/support/nav-down-010-frame.html": [
"33dcfb2eca41dd433aae3dddede8d2049b06fb33",
"support"
],
- "css/css-ui-3/support/nav-down-011-frame.html": [
+ "css/css-ui-4/support/nav-down-011-frame.html": [
"bf1cb3d249515604b2d48e87a3723ad35504dad1",
"support"
],
- "css/css-ui-3/support/nav-down-012-frame.html": [
+ "css/css-ui-4/support/nav-down-012-frame.html": [
"30c972bc4a24110087e8c5bbf0fee5510f1ecba3",
"support"
],
- "css/css-ui-3/support/nav-down-013-frame.html": [
+ "css/css-ui-4/support/nav-down-013-frame.html": [
"c8ee3abc1638ba49f9d248d0f1aa6c11c4e0ac00",
"support"
],
- "css/css-ui-3/support/nav-left-009-frame.html": [
+ "css/css-ui-4/support/nav-left-009-frame.html": [
"c92870d141222c76ffdf3a3991cfc6ad13244755",
"support"
],
- "css/css-ui-3/support/nav-left-010-frame.html": [
+ "css/css-ui-4/support/nav-left-010-frame.html": [
"5140e553106756832551c863dc0087ed069af106",
"support"
],
- "css/css-ui-3/support/nav-left-011-frame.html": [
+ "css/css-ui-4/support/nav-left-011-frame.html": [
"bf1cb3d249515604b2d48e87a3723ad35504dad1",
"support"
],
- "css/css-ui-3/support/nav-left-012-frame.html": [
+ "css/css-ui-4/support/nav-left-012-frame.html": [
"a26dcfa3bee1d858eb19ed9a037e8e84b97212b7",
"support"
],
- "css/css-ui-3/support/nav-left-013-frame.html": [
+ "css/css-ui-4/support/nav-left-013-frame.html": [
"0c00e3acb82897f72b3e59d68d1836dd377479b2",
"support"
],
- "css/css-ui-3/support/nav-right-009-frame.html": [
+ "css/css-ui-4/support/nav-right-009-frame.html": [
"c92870d141222c76ffdf3a3991cfc6ad13244755",
"support"
],
- "css/css-ui-3/support/nav-right-010-frame.html": [
+ "css/css-ui-4/support/nav-right-010-frame.html": [
"02fff488db2ed803ae99e56ed9e96099cd1d1646",
"support"
],
- "css/css-ui-3/support/nav-right-011-frame.html": [
+ "css/css-ui-4/support/nav-right-011-frame.html": [
"bf1cb3d249515604b2d48e87a3723ad35504dad1",
"support"
],
- "css/css-ui-3/support/nav-right-012-frame.html": [
+ "css/css-ui-4/support/nav-right-012-frame.html": [
"3ceba251d6f27775ea5bb3e4b4a02ab4bd0046ff",
"support"
],
- "css/css-ui-3/support/nav-right-013-frame.html": [
+ "css/css-ui-4/support/nav-right-013-frame.html": [
"6a8e603b8a76c66b46fcc88b525f3a95c05d4993",
"support"
],
- "css/css-ui-3/support/nav-up-009-frame.html": [
+ "css/css-ui-4/support/nav-up-009-frame.html": [
"c92870d141222c76ffdf3a3991cfc6ad13244755",
"support"
],
- "css/css-ui-3/support/nav-up-010-frame.html": [
+ "css/css-ui-4/support/nav-up-010-frame.html": [
"9277942bdf4e8a9e4aca5facbb4269f50110af47",
"support"
],
- "css/css-ui-3/support/nav-up-011-frame.html": [
+ "css/css-ui-4/support/nav-up-011-frame.html": [
"bf1cb3d249515604b2d48e87a3723ad35504dad1",
"support"
],
- "css/css-ui-3/support/nav-up-012-frame.html": [
+ "css/css-ui-4/support/nav-up-012-frame.html": [
"bbc21cc4304d7c5bf9f207268e5730d86c0999e4",
"support"
],
- "css/css-ui-3/support/nav-up-013-frame.html": [
+ "css/css-ui-4/support/nav-up-013-frame.html": [
"aba357c58d6c4ce9975e2dd5dd9ef704895b4afb",
"support"
],
- "css/css-ui-3/support/r1-1.svg": [
- "e2eb4fc2608d74be2156eccb5ea5a22866e6eb66",
- "support"
- ],
- "css/css-ui-3/support/red.ico": [
- "559cf518d41b151bac2638045093ca0a0d9317e8",
- "support"
- ],
- "css/css-ui-3/support/w100.svg": [
- "a82922abdcaba31b934a27cbc43bca3bd46de54b",
- "support"
- ],
- "css/css-ui-3/support/w100_h100.svg": [
- "b5b050ad0344710ddec9e5c93a6cbfeeaf2ee20f",
- "support"
- ],
- "css/css-ui-3/support/w100_r1-1.svg": [
- "0667f9291cd181d556973f9160cc31b77c418856",
- "support"
- ],
- "css/css-ui-3/text-overflow-001.html": [
- "7a09684be603baa70060c492a1b07cfb9ac05cb6",
- "reftest"
- ],
- "css/css-ui-3/text-overflow-002.html": [
- "1ec568d24ac29f013f022f14f2bebfd5caa02834",
- "reftest"
- ],
- "css/css-ui-3/text-overflow-003.html": [
- "71ef58a5310fb01b844eaecf9c9db4fd1d2afbff",
- "reftest"
- ],
- "css/css-ui-3/text-overflow-004.html": [
- "7f8d6b8a49fe41b336b437083978acf69e562a1e",
- "reftest"
- ],
- "css/css-ui-3/text-overflow-005.html": [
- "19d88ba58ec539abc1e32a3e07526a7abea355f4",
- "reftest"
- ],
- "css/css-ui-3/text-overflow-ref.html": [
- "db55b0b95a7406e9c4f00081b3e2cbe6b07363f7",
- "support"
- ],
- "css/css-ui-3/text-overflow.html": [
- "d3a6c835c23b82a85398e7981461a0cd3a75b861",
- "manual"
- ],
"css/css-values-3/OWNERS": [
"857b8aadc90a4073e122c667a554669a93886785",
"support"
],
+ "css/css-values-3/absolute-length-units-001.html": [
+ "d21dfd079ff6ac225e5f36c25e34bd994a713fa2",
+ "testharness"
+ ],
"css/css-values-3/absolute_length_units.html": [
"64ea61f181e9e6c1c801ff7e10c75122beab45c2",
"visual"
@@ -528585,10 +536862,6 @@
"595100ad77485fe61bba6f186dc1ce255c133a4e",
"reftest"
],
- "css/css-values-3/attr-invalid-type-003.html": [
- "595100ad77485fe61bba6f186dc1ce255c133a4e",
- "reftest"
- ],
"css/css-values-3/attr-length-invalid-cast.html": [
"b3330e159de0c7ff9fa0a922bbebb2e6960abfb6",
"reftest"
@@ -528698,11 +536971,11 @@
"support"
],
"css/css-values-3/reference/vh_not_refreshing_on_chrome-ref.html": [
- "214ac04a1caed95fff6854c18a7fae9ffdca1b76",
+ "affece13e73e451198a986146abde869b90c64cb",
"support"
],
"css/css-values-3/reference/vh_not_refreshing_on_chrome_iframe-ref.html": [
- "ad8d37ad73e28b91af8b469eac6eab2bc0bdb9ef",
+ "81474dbdd159353cc30131e37d54556e422e3f5a",
"support"
],
"css/css-values-3/support/1x1-green.png": [
@@ -528881,6 +537154,14 @@
"078e1dd6dd61d36cec239ed75d02051f61fe60a5",
"support"
],
+ "css/css-values-3/support/vh_not_refreshing_on_chrome_iframe.html": [
+ "95f9582bf94c0bc60ddee79415b763af8762faf0",
+ "support"
+ ],
+ "css/css-values-3/unset-value-storage.html": [
+ "ce34d77ec21c9b94a2ffe31d4f9e153e14605474",
+ "testharness"
+ ],
"css/css-values-3/vh-calc-support-pct.html": [
"1d1b6fd96100b08b7abe0125d386edf736d57aa6",
"reftest"
@@ -528934,11 +537215,7 @@
"support"
],
"css/css-values-3/vh_not_refreshing_on_chrome.html": [
- "c06a199c4771fe43cbcb458863590f2602062d84",
- "reftest"
- ],
- "css/css-values-3/vh_not_refreshing_on_chrome_iframe.html": [
- "c2d5cf3948c42be36eab1ee5bd9e4758c48eef78",
+ "b95d1e9054aaaa9c9a780fd4852307ed3604d46a",
"reftest"
],
"css/css-values-3/viewport-relative-lengths-scaled-viewport.html": [
@@ -529093,6 +537370,14 @@
"13085879fd567a224901d142cee05a96836ff749",
"testharness"
],
+ "css/css-variables-1/variable-generated-content-dynamic-001-ref.html": [
+ "f1a7e50f8c66bd18ad4e94f494f0cf31c8511093",
+ "support"
+ ],
+ "css/css-variables-1/variable-generated-content-dynamic-001.html": [
+ "b0374a1825f8dae8c03768cc1eec5297e0a05c71",
+ "reftest"
+ ],
"css/css-variables-1/variable-invalidation.html": [
"11106961651b3920aa302bd42695af7fe1b7484a",
"testharness"
@@ -529198,7 +537483,7 @@
"testharness"
],
"css/css-variables-1/vars-font-shorthand-001.html": [
- "52b5d737026e63f382b2f626fe3039a529005db1",
+ "ac2c476205ffb2c2f985c44cb5e4acada01b0093",
"reftest"
],
"css/css-writing-modes-3/OWNERS": [
@@ -530350,7 +538635,7 @@
"manual"
],
"css/css-writing-modes-3/background-position-vrl-018-ref.xht": [
- "d4872271295e1c6959d7e560f21076f721bad1bb",
+ "8f097a15a5d6a9d9ae9c851abdb88f03e408cb9c",
"support"
],
"css/css-writing-modes-3/background-position-vrl-018.xht": [
@@ -531302,11 +539587,11 @@
"reftest"
],
"css/css-writing-modes-3/contiguous-floated-table-vlr-007.xht": [
- "cdefb61a7766ee846c81553a6797fcb263a8dc35",
+ "b03e26b2eb2ae9eddd76cd4b96c004f10cfb15f1",
"reftest"
],
"css/css-writing-modes-3/contiguous-floated-table-vlr-009.xht": [
- "b892a1a4c51ebfe2b8446c9787d001af64283a3d",
+ "e4969ad20f4892e539f4b6af959f544d0a1c02e6",
"reftest"
],
"css/css-writing-modes-3/contiguous-floated-table-vrl-002.xht": [
@@ -531318,11 +539603,11 @@
"reftest"
],
"css/css-writing-modes-3/contiguous-floated-table-vrl-006.xht": [
- "43da7e1c56b3f983b4eac3c153ff0e29c24b119d",
+ "64687447330f8bcf2cb03538058e329ac3eb48be",
"reftest"
],
"css/css-writing-modes-3/contiguous-floated-table-vrl-008.xht": [
- "4baa13869a2747e865a988e8a0fb63bf4989a0e7",
+ "50908668186f32ed39a7e64ad630bd9a71c85d2b",
"reftest"
],
"css/css-writing-modes-3/different-block-flow-dir-001.xht": [
@@ -531974,11 +540259,11 @@
"support"
],
"css/css-writing-modes-3/line-box-height-vlr-003.xht": [
- "03b71cb044e731fcb8b58041f1f642f839061dfd",
+ "9d355624e6e9e2b868b9890aaffed418dedd81c1",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vlr-005.xht": [
- "983c1a4f31c170fea66c38d2a626c105a7071dfe",
+ "6ff3ba2274767fd6b710970cad62dcd00a122a3c",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vlr-007-ref.xht": [
@@ -531986,11 +540271,11 @@
"support"
],
"css/css-writing-modes-3/line-box-height-vlr-007.xht": [
- "aec7be36f364fa6f90a8371a489b4b3a3cf9cf82",
+ "4ba8dc40e9c0743b6055adb173311fb2e356cce6",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vlr-009.xht": [
- "4f4e72f788c804eec614238c4bc21c5328f2d472",
+ "439fe965f6ea34d25e4cc9710893a0f538eef24e",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vlr-011-ref.xht": [
@@ -531998,11 +540283,11 @@
"support"
],
"css/css-writing-modes-3/line-box-height-vlr-011.xht": [
- "3f63e7d48990c2a136fb932c5db1688eb9f35762",
+ "ab420fd12b1a9df50bb16434985f24edc8dcdd7a",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vlr-013.xht": [
- "88386222e5ff936aa5d52bcc5a1bb9424f29d6d5",
+ "15b6d066907ab67224536a045d3d12bbfc265af2",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vlr-021-ref.xht": [
@@ -532010,7 +540295,7 @@
"support"
],
"css/css-writing-modes-3/line-box-height-vlr-021.xht": [
- "636042d0e21518748f09ef7df43d809f46c9872c",
+ "97661051cf530fc7810203e7068072a42570d4e8",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vlr-023-ref.xht": [
@@ -532018,7 +540303,7 @@
"support"
],
"css/css-writing-modes-3/line-box-height-vlr-023.xht": [
- "bc545a63f82b19898cb6e5a056eeda98a6e73110",
+ "4c6eb6c5a4e271c50f1c8e8f9b4760b6be04264a",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vrl-002-ref.xht": [
@@ -532026,11 +540311,11 @@
"support"
],
"css/css-writing-modes-3/line-box-height-vrl-002.xht": [
- "88a19212954a57a8731e0c879bfcb1ebe439eed4",
+ "35cbc9b97dba18aae3f1fe78b5d30112f08c0505",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vrl-004.xht": [
- "4b28eee29924e4eebe196350c9e013b6c109ad5e",
+ "3fd6410b4ead23b5b122d27a6fb8bc7ba84ae65d",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vrl-006-ref.xht": [
@@ -532038,11 +540323,11 @@
"support"
],
"css/css-writing-modes-3/line-box-height-vrl-006.xht": [
- "80b3a935fd622bbf4928561d92315259a7af6eb5",
+ "8c4aee9b0dd61c8f2b29c8d1cad9f6b8d21d09fb",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vrl-008.xht": [
- "ee5be203f79c6afcf49647cb20932440a2f78116",
+ "6a5d20d37ad23987efeae1f6e4ee17ae77ca2a6b",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vrl-010-ref.xht": [
@@ -532050,11 +540335,11 @@
"support"
],
"css/css-writing-modes-3/line-box-height-vrl-010.xht": [
- "9fa7b8b6f04afcd6f506e3d55245b36091d67116",
+ "4f4038c84de1d5c7fe044e0334b8f64493e21609",
"reftest"
],
"css/css-writing-modes-3/line-box-height-vrl-012.xht": [
- "c73fe1815124b5c6c50196d6032d9e3fa77f06f4",
+ "af9a1409c41728f261794835cdedbfa2078aa141",
"reftest"
],
"css/css-writing-modes-3/margin-collapse-vlr-003.xht": [
@@ -532198,103 +540483,103 @@
"reftest"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001.html": [
- "2adaf63d50922f66d8061db031d8846af1d673dc",
+ "fda6b9308b2b81c47baf638f0c92b4a15e833fe1",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html": [
- "78c16633502d708e0116f0df628405198fce7947",
+ "92033c82920853f1983a3f04ade9c3bd542838fb",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html": [
- "08545cbb5e0f01205256a19fe3be505388324733",
+ "1d8aadeb0e68f7b11da11ba0a4ffd62dea164914",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html": [
- "52af0469482efb5147dbdc8f384fd0c44b3c43db",
+ "4cb5ed4df1c2e147c3e44ebc5cc0ea7ddda0f696",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html": [
- "e9c2e93d418b1c9cbd6126b11360089dbd93602d",
+ "f744763a79077eaad0a37eb8bb6acf36160028e7",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html": [
- "454ed190537cd3075c6a24f6d2061cc343eea99e",
+ "896248fa233a86f29c12628efd5fc6e8120b1b0c",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001f.html": [
- "cb23fb6c7bc4149a478e67c0ebd955806e1a78a7",
+ "071922c9de86d7b7b907a3e9313e2014711c7608",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html": [
- "26c4f6535d5553ce973c5ea5146b89c3738a567c",
+ "da73815d6633270d06d4b85dcd1026b43c2b50cd",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html": [
- "cdb811d78d6b7109b53cb4d20bb06a364a6d6d82",
+ "96bd59af353f87c557c5c45c1cea544ef71b6a4d",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001i.html": [
- "097b2fa0d843bd284b3a1989a02eb585bde0d354",
+ "8751d9ef7ecffde03e78a9f0882b751ab4cc64d9",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001j.html": [
- "bc33cb570ac84ff438cef48dab9f266ba110c949",
+ "6fea0068f8ec1de136912232ee195b73cdb0f7c0",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001k.html": [
- "9bb6ee871bde8587f47aec05d747e47e56c9b4fa",
+ "b3c0a23767d434efd61275b13064f564220d395d",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001l.html": [
- "4768b3e090a971b2325981f8b2de752ad7f7b5d3",
+ "53dbb64e41ddab1da163ec2a053e65bf715984e1",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001m.html": [
- "7f40e62d660600898a768ec43d6d3cc03e1304fe",
+ "9ac06fb0d17338daf9f49d491c265d07b0b14f8a",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001n.html": [
- "2b120f85ce79696091d4fa38a877ae02c62d70dd",
+ "aa044cc981347088729a48186b96ceccc91f980c",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001o.html": [
- "d2958493951375d29e923416d3e4a775b20c9f29",
+ "6db30cefbda0b1dd9805e9d951eb0fbcb096ba06",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001p.html": [
- "7d1d3e3be199428f3f0d3638682bbb99d0bc1bc6",
+ "60e78b10e371e29326a1884f7014db469733279a",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001q.html": [
- "1b073c1a2f0a5cc71c266c05e717531bbff813b6",
+ "c3b44523b661601242cbcd820c2cd4f76a49afd7",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001r.html": [
- "cbd3acdd080254793e87fd7fe3dfe21e564b532c",
+ "cd1deff02dc5de77f37c53ad5d56874c20c80d5a",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001s.html": [
- "bfbe0dcc0e6a4202d6365acc6d8d22fce12f92ed",
+ "e648684a3ce92763655e45ed91557899e8fa9f8d",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001t.html": [
- "822fe1f0efce56f31f0976b1da53bb93517b8b90",
+ "1bdb2a1b50b08f928190617c724cfbead43c1059",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001u.html": [
- "2eb755bb7e915ff918ef1092d1ebfa1e8defde31",
+ "5f8696abfd475bc2d70056e1c155474c4699229b",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001v.html": [
- "51000462ecc028568ede495f2ac68f493bd15e6e",
+ "912a3332f894531b035c92d35772539dbfa54da2",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001w.html": [
- "d24748727ce1825770059025b1f7717404943d5d",
+ "28441f89c8601db3c07aea2cab72af83375e42d5",
"testharness"
],
"css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001x.html": [
- "21ca496672899e66f235fd36577c0c01fad8c7f1",
+ "ee4398e9fb25878ceec678a3a756a55f814dbc60",
"testharness"
],
"css/css-writing-modes-3/outline-inline-block-vrl-006.html": [
@@ -534410,7 +542695,7 @@
"support"
],
"css/css-writing-modes-3/support/text-orientation.js": [
- "368d5f273357ebeb737905ebb26c06c5a690f778",
+ "f81f0599ec6f87267af1b9f3521ed5d0d1c9338f",
"support"
],
"css/css-writing-modes-3/support/vertical-form.png": [
@@ -535182,7 +543467,7 @@
"support"
],
"css/css-writing-modes-3/tools/generators/orthogonal-parent-shrink-to-fit.ejs": [
- "a7400b5fd3de25495f570566fd98ff0d6aa01753",
+ "fc4066286c9282a1fb1b1f9b5ddf34beeac95430",
"support"
],
"css/css-writing-modes-3/tools/generators/package.json": [
@@ -535461,6 +543746,18 @@
"cd58814cd747579216fc3d038849b2ecfaa22e39",
"reftest"
],
+ "css/css-writing-modes-3/wm-propagation-body-computed-root.html": [
+ "a212bca7bfbf52fb0358d0ea6567fa8e3df643a9",
+ "testharness"
+ ],
+ "css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-lr.html": [
+ "a4284176396d19a960760502597a34f7852aa4b9",
+ "testharness"
+ ],
+ "css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-rl.html": [
+ "eba0c1019f7a6294520aadd26f67d5b9ff993f4f",
+ "testharness"
+ ],
"css/css-writing-modes-3/writing-mode-horizontal-001l.html": [
"b8266a3ac8d55bcf9ee7ddddc31cdedb07717da1",
"reftest"
@@ -535750,7 +544047,7 @@
"support"
],
"css/css3-color/t424-hsl-parsing-f.xht": [
- "2fbf518efbdae2af7cb651dd0c9c7158751e61de",
+ "2c02fbf1d640b5f683392be3cc31f2c70510c475",
"reftest"
],
"css/css3-color/t424-hsl-values-b-1-ref.html": [
@@ -535898,7 +544195,7 @@
"reftest"
],
"css/css3-color/t425-hsla-parsing-f.xht": [
- "b1d4b2c4fb2cfb0cc262282ef83276e68540feb3",
+ "82561b7b56fbc73c227898b4492ece9a1acc4517",
"reftest"
],
"css/css3-color/t425-hsla-values-b-ref.html": [
@@ -537241,6 +545538,10 @@
"37366f5a6bbdf759063817e180a83e34f81ea8c7",
"support"
],
+ "css/css3-selectors/i18n/OWNERS": [
+ "529a7d4e2cfca44f7804f88e375b383e2388c23d",
+ "support"
+ ],
"css/css3-selectors/i18n/README": [
"be36f3153ffc6d9bde3da5e219063f046afe9d20",
"support"
@@ -538217,18 +546518,6 @@
"6f3884860a84b9b6e7524c84626638e303a14660",
"support"
],
- "css/fonts/ahem/COPYING": [
- "1a8e3831fe53a5da6fec64a397094d9abc92cda0",
- "support"
- ],
- "css/fonts/ahem/README": [
- "0457a7b5613236deb9d49a699edbfcef474ea408",
- "support"
- ],
- "css/fonts/ahem/ahem.ttf": [
- "88d834aadcd7b547720992a2894b9ab3251e3e04",
- "support"
- ],
"css/geometry-1/DOMMatrix-001.html": [
"a8cfa83e572a766b61e4eae5946e7efb62e9eab7",
"testharness"
@@ -538245,6 +546534,10 @@
"6041bd4e7fd1535d9c8515f1b2f07981b2bdd366",
"testharness"
],
+ "css/geometry-1/DOMMatrix-attributes.html": [
+ "433984b90fc4579257db57b07a09ae36f7e5b4d3",
+ "testharness"
+ ],
"css/geometry-1/DOMMatrix-css-string.worker.js": [
"e97dcab8cdf554c5f60c12dd037ece69d7c854b2",
"testharness"
@@ -538257,8 +546550,12 @@
"fbcaa50f5daab1a11325cbbd46e10c524a1f6f80",
"testharness"
],
+ "css/geometry-1/DOMMatrix2DInit-validate-fixup.html": [
+ "aa00e3456bf951230fb85999874795c918964cf4",
+ "testharness"
+ ],
"css/geometry-1/DOMMatrixInit-validate-fixup.html": [
- "201d59db6923ae141d980ac40ddce08375bd1900",
+ "bb27ad23e388ea50a26618bc50709d78997f1081",
"testharness"
],
"css/geometry-1/DOMPoint-001.html": [
@@ -538281,8 +546578,16 @@
"f24895dc1d994388c45fb6fa39132a7e1c03d18b",
"testharness"
],
+ "css/geometry-1/DOMRect-002.html": [
+ "ff12ef1246036cf5f94f0d03da8a136424349f7d",
+ "testharness"
+ ],
+ "css/geometry-1/DOMRectList.html": [
+ "382b6c7ea9bc4c75d1b007b59ccdcb9c642f51ce",
+ "testharness"
+ ],
"css/geometry-1/OWNERS": [
- "4b2b22591c272446136118ce3d174d1b66200743",
+ "173dd21a142b526b7447cc24e93a800e84f70bbc",
"support"
],
"css/geometry-1/WebKitCSSMatrix.html": [
@@ -538298,23 +546603,27 @@
"testharness"
],
"css/geometry-1/interfaces.html": [
- "5381de7d65645da14f56f906363b00ffda90e524",
+ "c3ec6da200303fb99e86255eaf1da1e261374d39",
"testharness"
],
"css/geometry-1/interfaces.worker.js": [
"22348a0aaeec8dcd677b8f60486f2e043b8f8a86",
"testharness"
],
+ "css/geometry-1/spec-examples.html": [
+ "9cf446202e4527e26d113e36d2e7427ab32ce2f0",
+ "testharness"
+ ],
"css/geometry-1/structured-serialization.html": [
- "6f38a37d56ffb9d2ddc17f7c4ed0613b7a5c8136",
+ "1cc9f91deb2cf68704f0f5cda77a3288f45d5c5a",
"testharness"
],
"css/geometry-1/support/dommatrix-test-util.js": [
- "d0f0c482648ac39ccaebe359880b079369a8ba21",
+ "999ac15d20bb22fcdb27ae7ebc526aea8f577b5a",
"support"
],
"css/geometry-1/support/interfaces.js": [
- "083416b9f77bf1d06802ca30b6231c2897f4348d",
+ "13d88ccf8c2f03db7e1db7f6fc704ba46a06e0e1",
"support"
],
"css/mediaqueries-3/OWNERS": [
@@ -538426,15 +546735,15 @@
"reftest"
],
"css/mediaqueries-3/relative-units-002.html": [
- "1c2a7f8f80bdf454ff8e6ad88f6850d414939b0b",
+ "c533d6fead2ed27d02b826aeba0d8abbb45031a2",
"reftest"
],
"css/mediaqueries-3/relative-units-003.html": [
- "c8824d27b1e6e2949cdf7de040b5f2dbcd4ca7d8",
+ "e42e3e16ae2cc3c2c9679c653fcb9d6ab49e1c15",
"reftest"
],
"css/mediaqueries-3/relative-units-004.html": [
- "83fa4c3d9fbb3b08c5e0735d6505b531488a792f",
+ "1db0c6b7ee4aa554328cda73a7fab0bd373598c8",
"reftest"
],
"css/mediaqueries-3/support/media_queries_iframe.html": [
@@ -538449,6 +546758,26 @@
"4f4f13f66e77a41e97ee5035568f1e0944ec8b2e",
"testharness"
],
+ "css/motion-1/animation/offset-anchor-interpolation.html": [
+ "30eb3ea68aa502d93125d4e54ff15c0a96458cfa",
+ "testharness"
+ ],
+ "css/motion-1/animation/offset-distance-interpolation.html": [
+ "f242f67f0d1a1c25a871d4ae949d42f9d1df0027",
+ "testharness"
+ ],
+ "css/motion-1/animation/offset-position-interpolation.html": [
+ "6c21c93c0715af758033d7b582f072988b379b15",
+ "testharness"
+ ],
+ "css/motion-1/animation/offset-rotate-interpolation.html": [
+ "37c091bd5a59d4853bc9f5c82e157ac3d4f29643",
+ "testharness"
+ ],
+ "css/motion-1/animation/resources/interpolation-testcommon.js": [
+ "51a3f4808392b7bcce4f2569256c540a3be817dc",
+ "support"
+ ],
"css/motion-1/offset-path-ray-ref.html": [
"dfea2bd9cadf9d1b83e95bc2dbffef3539937ff1",
"support"
@@ -538477,6 +546806,10 @@
"09f4897e2d2fa99303edb59e2872a9a373db3e26",
"support"
],
+ "css/motion-1/offset-supports-calc.html": [
+ "f893e408a6e958d0ac5b26489ffe10374735f053",
+ "testharness"
+ ],
"css/motion-1/parsing/offset-anchor-parsing-invalid.html": [
"b48194c7ee35af7d114fd514f060ea9e8aae6372",
"testharness"
@@ -539018,7 +547351,7 @@
"support"
],
"css/tools/w3ctestlib/Indexer.py": [
- "429ed09f00fdbb3107063b583e07d8eac9fc447c",
+ "7c34093692123e09035e8d322757d1a1865603ce",
"support"
],
"css/tools/w3ctestlib/OutputFormats.py": [
@@ -540294,263 +548627,263 @@
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-1.html": [
- "e4b08019299f251b2b1f78e4ed6e00e6b1a24432",
+ "5f167290a8e0fff96660c1d6f3834382af86323d",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-10.html": [
- "573d05d34e2b2d001e3bcf135786ba6513125e56",
+ "13df1179a487d04b184b51869a313407cdf48fce",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-11.html": [
- "18642a0cd1ff83f21498c5d2fcc4b2e56d8daf62",
+ "de6c6eb0c34c82faaa74ca7ed34d1e819ef9cb6b",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-12.html": [
- "4aa1847a4835b79531259be970fa6da623ffd683",
+ "e213ba44ea00235462c9feed295521fe653f2a3e",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-13.html": [
- "8bdccc3b37dca395597b1bfb20f25be77565a62a",
+ "9401910b64ccec604bc048d6086b823ee1aca784",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14-ref.html": [
- "0d6d2bf17823ddeb2c52b8b5a3fbb106a1ab73b5",
+ "e0c41c7d1ec9363b037d880657e0e181a0d52f95",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14.html": [
- "0d657c2d443574e0881646b31c30ddbc885fe62b",
+ "c600097503bdff38dc268f4b4377fa5c684df86c",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15-ref.html": [
- "ce1c706c674dfb34e7770f85fa64682de1796a90",
+ "00c20343e4cbc4c2c2c87d9f54536f7629162622",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15.html": [
- "152e273ac4c8cef89660c878af8f457e9a5b7c27",
+ "13c0f7ccf422c9245588d83e81dfcc05d76b7f0e",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-2.html": [
- "59d2a436ff8d9a9b741e38bce33d09a5eeb0ffef",
+ "305733910f3bf2c0a3889c679d54d7159899205e",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-3.html": [
- "0fca663c14e1206a7d7ca6c23d220a7b1af863ab",
+ "e6432c6079d6cc2f3cd3574c2353d4003e424002",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-4.html": [
- "cab1fc96692923e5e8cf8e0ca49d844272b67029",
+ "12a0a0f2c9ea488593666a4c2ee9af34c07b85a0",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-5.html": [
- "2019b1d7e9b7e0cd1c630c54c60bfc89caf9aace",
+ "255e8c5ec21d9b4cf66c0a6577b27b49b9184518",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-6.html": [
- "fc87592f9a77cf74d6ab0bcf5c718d870b48ccce",
+ "eca811d7f25ab1f8462eb3a30175f0b9da1c1264",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-7.html": [
- "93b46d6167438e0f061bf463f5f35a92e916fd18",
+ "dff822e68bc08fc5a43299b36ef6908dbee3b55c",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8-ref.html": [
- "111bdb377319e2ed730714de6bf71b0cfe5674c2",
+ "c145b739ba682678b7d9f7fd0ecca0748ad96e16",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8.html": [
- "78a83467b7ca0d87aaaeac3d5edc043282619aa4",
+ "27f6d768ddc67fc14ee7ca3eb0854f240c947007",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-9.html": [
- "82aa9e7e8aceef6d34d4d4749efdd16e874ae120",
+ "7698520c971d95383777739b3a042505c6bdd145",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-ref.html": [
- "dee091a8db848ef1340b83774737b4c9f432387a",
+ "46b88e89bc4498d4146a631c98348c499b417fc0",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-1.html": [
- "653bdbc83cd5eb99ee274e4a6e8e53a34476d5f5",
+ "d853136d910ea583c17a4a739d4e019319c096e8",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2-ref.html": [
- "3971920b1153eabe2418b1c9db5e303b8c488cb8",
+ "475ee785150ecb75474eea87ba3744ee06363d22",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2.html": [
- "5978697844c4434f91348e52ecf3e3c3d1a1708a",
+ "2a6baf15c0ce39ce82491fb186bdb5ec9aab87e0",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-3.html": [
- "9a9791057cd8e80d496d966ca36ffe9e08c62dba",
+ "3fa5a48021eb4ce82767445cf568c6a0b8a9c26a",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-4.html": [
- "83f4b3958fcbb47e1e9755d3163f97f099421bf6",
+ "cb6ebce8a023ca636bdde89947a84c54d9ac7539",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5-ref.html": [
- "0f05ef82b0bf48c7d6b2c687866d57b4076edc4f",
+ "7030a5eefb553cfa149692ea1f2737b219c8657a",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5.html": [
- "48cbf4b40b3a09ad99a884cc13b50fcd65775acb",
+ "c3125bc4cb0a96ff019e4a4c1dd697fb4f299acd",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6-ref.html": [
- "6d13942114f74f971d739a16eab6f7b368f45612",
+ "920db8da9d6be4c23fffa5e1892fbc9434eb41b0",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6.html": [
- "3d7482133885cc8a4382b8e4c748130d97d6b0fd",
+ "0db1ee3d037ffef1691eb51302dc21cd2761c846",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7-ref.html": [
- "48395831cdaed18abae32eb5269ffd2c476d8741",
+ "d1a8405116d449a173efe12947df3702835f5cda",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7.html": [
- "99076af8ebecc4df6988389fc6ed9a0ff5d67be6",
+ "227997da9f8d61033c6badc375f9254098a4b05c",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8-ref.html": [
- "d6b77c08573ada206f15924ea5861088953c65b8",
+ "8afcabcdb0d59c26e38049b42cc0d5a49a6ba257",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8.html": [
- "a87ff0053249f2752e5c3c2524ad0ed7b313705f",
+ "f1e90e52027349f9429f4f4a73d24cc365615e29",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9-ref.html": [
- "31026483f18ee80e0ac7723d6a7fb13632a13748",
+ "7556b737511dfc97e0bd3880be7c4c8641cd94d4",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9.html": [
- "3376ba90eafdb984901fdca69ba7dd40a962bc56",
+ "afa49c092f67a226e47f865cee1bd90b29266569",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1-ref.html": [
- "407b2a125b1435a8ca7fe0b3c31a68f17f3faf2c",
+ "dc2d651f026037400b08173ea6e3caa37f4aacb8",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1.html": [
- "4ec1b253ebe3393006fe343c7298283cb6a3bc26",
+ "035fe2c4d538ff07db03de65330451bf7adb8c76",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-1.html": [
- "ff1816e3ccdc344d3bc81fa1174167f99218a329",
+ "5760f548a6372180ba67a3307979d68dca96a3a1",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-2.html": [
- "f8ddba7940da0f948dcac8386c71387a1d163ce0",
+ "c3cd757aa6c280a5da5d6bca362474bb57b4fcfb",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-1.html": [
- "50a3ecc24a4615e10d557f605a7233100ec5e56c",
+ "384f11d655bfdba7a725ca3120c07e6363dd59e5",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-2.html": [
- "2c58c0d437054a9fe2384fcd8f45ca2febd2ae95",
+ "66089b4d810e3be098b721a00c1acfe757e99c75",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-3.html": [
- "84a2fd476bd635fb0967669dd625cde336a4850f",
+ "3600766573575c63306ca0a0e837f125551e804b",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4-ref.html": [
- "60ac2a7696d0027b617506a39149ddd8aecf3ee5",
+ "5c4c9033141cec9cd85492abb0a911e80c08f291",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4.html": [
- "d9c87fb3a27ece6f45077c00c2f8681973cfb991",
+ "f379dc4e8c15011c73b1a8c36e68d321baa1e4df",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5-ref.html": [
- "03aaf328bdb4b7649a438b29404020e48c5110f2",
+ "36ada19833858467356cecfb7dcc8207e36b3b7a",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5.html": [
- "35617acaefc679da0fbc694209fa137bff0787c4",
+ "68607b5bb39061988a9a8c5862bf88d35430697d",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-6.html": [
- "3e8e871fb27787e834736af3d671f7e7254f7e76",
+ "648aa0a0c21a6c54e24ef7729daa29292d420a39",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7-ref.html": [
- "24c53bd5d709ef3205f799f1eb01802ac95971a8",
+ "04b813e10c97c04d86957aa4bc3da00651fcb6fd",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7.html": [
- "414732490d4de2d9b27d663e277f78eda4814951",
+ "c0cb4962090a48b4ecdebcf67248f1b71a2f6cec",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8-ref.html": [
- "e15a19db56314596ff63dd778cad326393674812",
+ "9ccd76a3d7a7ca9523ebc04d5d4798bb82d01f16",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8.html": [
- "3a8522802c796a4ed95e4c93fd55771d49c1bc12",
+ "72037332e3bd9d068617d14f59203cfa35ce6d55",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-1.html": [
- "f456d5c6fc113b33ccaaf5fdd80a4627693406da",
+ "5cce795a43ba0eeb0ba04cd94b20b40d11eab2bb",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2-ref.html": [
- "819d83e74de44f0ac1cd91f13963a912332a8208",
+ "461188c6d1cff9107cfa260621adc3ba7a1f4cb9",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2.html": [
- "c60b7f868ceceb18db02c9dd50e12d1a3a0e8266",
+ "879a988b381eb86531f979f9612ef6cfacec1cb7",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3-ref.html": [
- "46c5d46e19e0a3ee0e68bcb640df670fc10089cf",
+ "183997ca0a35d5551f3b7c4b6fc8da76c3195982",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3.html": [
- "4815bed7023164118396bb6659ddec27b4165446",
+ "bcbc942356ddef43f57215c059fdb34c0f5fc559",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4-ref.html": [
- "fe5c8cae7811f585a5ff76e8bf8770e9e66e4187",
+ "7f35fb3b7b2c41dbbf9647a078a41069c1064049",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4.html": [
- "a17dcc0255b4fb34cd8074391c658feae43bba62",
+ "d18f1c4e05d023c50249d3ac56503a7e6757f6da",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5-ref.html": [
- "84f95c890e10c5faf1c46c28a440b2f28c3cd094",
+ "204abe8488984c5bb452b760ab206f5f9ff863d6",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5.html": [
- "c15af49e50dc4d38bbd967fc4f9a207d831460f1",
+ "07d3217544325f8f3a6f748a7be2b5dffe6010e3",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6-ref.html": [
- "1d5d19229560979682c0afb22e2e4915a360ec74",
+ "9137427b3b9fd00c156f46e9277cdac99e4258b1",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6.html": [
- "a06c8eba7abd93591dd2f76ce247d52cb574e901",
+ "4b3e779f2b05a21d3cb4f840f291a93dcf7ef7fb",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7-ref.html": [
- "f03108960c0188835664433ade1377bb101f5998",
+ "ccda860d8bb4b82ad137e2a680082844cb55efd4",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7.html": [
- "ec38ad5c5b60693ede3924a51688ce515bb9833b",
+ "b10e3e94828781210b3136e708666752e88f4b70",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-8.html": [
- "2caf007ce1003adf91f53d319979eb671ab44a8d",
+ "3b234a27c8f1a92ab0b315c914826dc21e3fb342",
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-ref.html": [
- "0c770671686e5437f7baca2beab8ea77f56eda27",
+ "8958a105c537bf438ee318a0ad56e278b168a0cf",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/reftest.list": [
@@ -543458,7 +551791,7 @@
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/masking/reftest.list": [
- "d591c5c591aaea8725b58fc8af66819208ebd2ca",
+ "9943729d968c8515e79ffd1ca44ba50e0841c20c",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/masking/support/50x100-opaque-blue.svg": [
@@ -543534,11 +551867,11 @@
"manual"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/multicol-height-002.xht": [
- "15988661cfe37abd0c3e8e26238b8b5c6c74ea5e",
+ "46fd36d04284c70506e8d8cf0ee0311c14a3f9f3",
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/reference/multicol-height-002.xht": [
- "a2d8c2ad7f3a817197cecf34385547d909119820",
+ "30d0428647c64f8d4a56f36748a6dcc0eb90e25d",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/reftest.list": [
@@ -544542,7 +552875,7 @@
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/reftest.list": [
- "a4079eb56e660e9f0759e83296ea8d1277e02310",
+ "3d686cfc2e832a735cc69da4e62b5fc82ff981db",
"support"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/ruby-text-decoration-01-ref.html": [
@@ -544581,6 +552914,14 @@
"4f9be0cd4fc10ed6008d7ec2f8de48a94fb42b5d",
"reftest"
],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001-ref.html": [
+ "85a469e9e7869feae254140cd52db2b3d99694bf",
+ "support"
+ ],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001.html": [
+ "aa2ca2f4711295e6380ec2ea6d04b7403a18e761",
+ "reftest"
+ ],
"css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-emphasis-color-property-001-ref.html": [
"f83e7f5ef7037c15e922446ede24aed63770eb4e",
"support"
@@ -546094,9 +554435,17 @@
"reftest"
],
"css/vendor-imports/mozilla/mozilla-central-reftests/values3/reftest.list": [
- "00d76f8a726f2174d079efecd88de0ffb360f53b",
+ "2c5def94727ddf9e6e20ab3926803cd6782c747a",
+ "support"
+ ],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1-ref.html": [
+ "dd176574ec62fb640bd053467b49cc9f591ad157",
"support"
],
+ "css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1.html": [
+ "2b6afe6276b93022260dd10eb4c39d858cce577e",
+ "reftest"
+ ],
"css/vendor-imports/mozilla/mozilla-central-reftests/variables/reftest.list": [
"2bc1154ca1e033ded743efb780fff7808f3148ec",
"support"
@@ -563405,130 +571754,6 @@
"62235c50272a72b79e4cb25736f20c66db2bdee1",
"support"
],
- "css/work-in-progress/microsoft/css-tables/base.css": [
- "cb31986a92c4e431c1882e241cdbaf96ca882fd9",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/bounding-box-computation-1.html": [
- "09bbaf166fa04e3b35794a2a0a85541f44f811e9",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/bounding-box-computation-2.html": [
- "d53df3d1f867c5ef69324bf66d1e44eb6cc40d56",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/bounding-box-computation-3.html": [
- "9df872172f858cb2df9eb2673206bb427f71f81c",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/caption-side-1.html": [
- "6506b9d5b926c8f74235bf5eccb3437801728e3b",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/fixed-layout-1.html": [
- "803017420fc43c6ea36f57d009bbe9030d8a9f6b",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/fixed-layout-2.html": [
- "bab3af419cc2243715ddff839828169e8f0b2e83",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-0.html": [
- "1c9027b4317dd990cd01cd7a4b2db9838a5574cd",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-1.html": [
- "61ef69a72b0307506df6277f9fb694e4589114d2",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/height-distribution/percentage-sizing-of-table-cell-children.html": [
- "442cdb710e53dc8705f4aa3641ac849ba874e5d5",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/html-to-css-mapping-1.html": [
- "f11a5c7c6ce8a264789f59820f3262c4a281741b",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/html-to-css-mapping-2.html": [
- "f17c742ff09402355799f190c505ffa408609157",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/html5-table-formatting-1.html": [
- "d9727fd1d9c3b711360ed97ecbba24d179a08847",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/html5-table-formatting-2.html": [
- "5967f05120b4338f606546070b1a889503998047",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/html5-table-formatting-3.html": [
- "92f526a695fa5bc53e6e64272c7b0119e144f6f7",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/html5-table-formatting-fixed-layout-1.html": [
- "e06bd936c60251f5fc57433d773c961274525e21",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/markup-generator.html": [
- "fbaac74233746fa6a82a0ef6c8536642f87ee8fe",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/table-model-fixup-2.html": [
- "fbba92722349247b88b5f617b6e83e666b326331",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/table-model-fixup.html": [
- "52c4184ac3821b8dc0145f8b2ef0056579820904",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/visibility-collapse-col-001.html": [
- "1f1f0d71a8ae5047f54947874cf8eba5a8ff9837",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/visibility-collapse-row-001.html": [
- "a394aeb3b5549f4cbbd5752e089fb95f310d1e77",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-0.html": [
- "04c271cc480b5daf958840ec79b953bbb48961a2",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-1.html": [
- "15ee7b380c6de4e20cd33c8543f083eec2b91f4f",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-0.html": [
- "c1f6bd30f79ef0c6d128782cbe4fe1e79cd90c6d",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-1.html": [
- "a62ae8535c9b897600dcba6c0c859cb8cd5df53e",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-1.html": [
- "4682ed687deb81cf1a0b2d4677301bf45dec7576",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-2.html": [
- "4682ed687deb81cf1a0b2d4677301bf45dec7576",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-guess.html": [
- "79ac2e7b0dee9c850c31d7cab695c7359ed06a00",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-percent-guess.html": [
- "8516ace74e2ad17055a0b68476b49b0e21fa1b1e",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.1.html": [
- "9f0f30a6d1f4f81206830d8168c91da4eb8cfbd7",
- "support"
- ],
- "css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.html": [
- "06eedc341154f88c9e4b0720ce3df746b201d776",
- "support"
- ],
"css/work-in-progress/microsoft/emboxes.png": [
"285e8d52b1493075c2388f84c1c5f8b3359d736d",
"support"
@@ -565470,7 +573695,7 @@
"support"
],
"css/work-in-progress/opera/OWNERS": [
- "3a52efa37cb05c353bb8ce78146c42db6a238b74",
+ "adc83b19e793491b1c6ea0fd8b46cd9f32e592fc",
"support"
],
"css/work-in-progress/opera/animations/0_as_keyframe_selector.html": [
@@ -566105,2092 +574330,16 @@
"1d659bc322b61f04f442253fcc0b3de70a28ca97",
"support"
],
- "css/work-in-progress/ttwf_bj/Along/reference/ttwf-reftest-borderRadius-ref.html": [
- "5629b8badd92036ab58c3e03b8abef2f7ae4fb38",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/Along/ttwf-jstest-borderRadius.html": [
- "02332d1feabb8e3fcf56fb41427f83388126214a",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/Along/ttwf-reftest-borderRadius.html": [
- "05fb216e8ff5da4f8b9d1c463a9fec89474d7219",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/Chris/elementFromPosition.html": [
- "e057a8d20b11971d3acf7c6d54d6e206fc95e52c",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/Chris/reference/ttwf-reftest-borderRadius-ref.html": [
- "5629b8badd92036ab58c3e03b8abef2f7ae4fb38",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/Chris/ttwf-reftest-borderRadius.html": [
- "921a94f6a4c9776aa24ece94f0d3dca1676d726c",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/Chris/ttwf-scrollintoview.html": [
- "5d486ed5b6d1b127e2cfb5bd2446d4f8daca1c52",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/Chris/window-screen-height.html": [
- "546b06a2e3606afbfb075732f2c8755b04a80e20",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/angela/background-clip-color.html": [
- "f187c766e5652aeaa7651584f1c61e078c42ab11",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/angela/background-clip-image.html": [
- "5bcd80473626041d9ea57315c62af348f585cb0e",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/angela/reference/background-clip-color-ref.html": [
- "f56c2929351413f41c19c424e4bddc1fcedb2926",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/angela/reference/background-clip-image-ref.html": [
- "ec78b9cc7a2ed94c5e1a914b621320d2c957815b",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/angela/support/img_star.png": [
- "a74f874259ac227ec6d5ef04d17c4529ee17018f",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/babyliner/border-images-002.html": [
- "12624cd4af2fedf396b366a56b62e61147f2fd92",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/babyliner/border-images-003.html": [
- "7ad22f15cbbe7fe972aa895a50f0b960dd9e1b84",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/babyliner/border-images.html": [
- "89a5af9b54bc6437fa9f51ebb57ef0275b53cbc5",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/babyliner/images/border-image-002.jpg": [
- "c6cb42d2d0403241f1c34c48f3754d2493b1e033",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/babyliner/images/border-image-003.jpg": [
- "51096d4968daf2c5766311c0025899ee33db5c4f",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/babyliner/images/border-image.jpg": [
- "2830a5fda951cdda2c473d7a68a12e03368e68f4",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-bottom.htm": [
- "7a8d0d35f406298858181a469da9bac73cf9232f",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-left.htm": [
- "610f0e3eb45a98a2024b4343cd24daa224a70ccc",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand.htm": [
- "1afbe38637bbddd805b9450d997035d4b5b4c414",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color.htm": [
- "1fd21d4cb8e32247dd1cd741fe113f875c167e06",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/border-box.html": [
- "19d29da795799fd859289856cf47859ffc5353e2",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_position.html": [
- "5d3fdcf7c9099124916bfe4b2db3068c0f358e1c",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_radius.html": [
- "357a4c7630df26e1cbc809df056df59d7ba34949",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_size.html": [
- "f77aa1c6b0092fa7d22a5e23168ddb6f334f71a2",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/content-box.html": [
- "0778ce4c86a6c866e9e55738e35067a49d0bbc23",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_position.html": [
- "f473a425b75316c0e653898738d4ff92f952fa05",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_radius.html": [
- "f97ad2db691772c56a0f0d15ed125c388f431c8b",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_size.html": [
- "0ab4aefd6a759fa55eeb935c200eb4de3533b0e2",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/list.txt": [
- "51b104b69911943bc5469c093046d5c0eb45334a",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box.html": [
- "535715a1a94874e9c42e6a4616b4f52cfceff64a",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_position.html": [
- "c2a283798011da68803c07273a9bc05adee8d311",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_radius.html": [
- "ea0975f291c89b491902a8e4cf360fc509f4599b",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_size.html": [
- "49068c38bc46b0fe11205c4ad9f238b1dd270bd6",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/border-box.html": [
- "5489d0025ee93402840add48a58a2f2d9ad57883",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_position.html": [
- "c5fe6d5a80202a11180dcf61b92417739cfc9b93",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_radius.html": [
- "69434fcaf52a8bfae1194654367ab215cb6e8c3f",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_size.html": [
- "78fa6eb0c6a187babd1eb08cf05e76d038671c4e",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/content-box.html": [
- "7e600c87265ac241578117be2f731437a361eed4",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_position.html": [
- "b46d01de97a612cc00871161563129d0820de5f6",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_radius.html": [
- "6c77c5792dabb4fe28239cf47eebdb3ee35ecb92",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_size.html": [
- "3b57b21333f7854382cd47e1dec9f4369b95ebd2",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/list.txt": [
- "d1f96e9ca006ac04e30d1232b2ea9aec79422514",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box.html": [
- "216f6cb1f26dbf341e74b390b62bef31623c2c2a",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_position.html": [
- "a38eda56f63457063d1d672410862e2218df6da8",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_radius.html": [
- "2f2429ee4b3061964af1a68b4d2ff4467ef14398",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_size.html": [
- "dd7c33dd5f0c5b1b9b60eb6ce7e7af3d6337c1d3",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/resource/border.png": [
- "c643564c8b6ff76e3e482414f3f722abfea4d43f",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/resource/css3.png": [
- "cffdfbbfddbaab163c15a1346b07756af722b900",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/finscn/resource/ttwf.png": [
- "06529bfcb786f62f4b702d31ced5668bd3dfd76e",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/henry_d/border-image-001.html": [
- "48735d54f3a687908efb9272ad5695d5eafb5d53",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/henry_d/reference/border-image-ref.html": [
- "20fbf25db32b6e292fe214e7db4671d817588846",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/henry_d/support/bt_blue.png": [
- "b84ede428db1255ddc5279e3a1e49065345cfafc",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/henry_d/support/repeat-x.png": [
- "fd78d4ff2efd2ab86c83fca420ee1671f5d0029f",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/jieorlin/flex-justify.html": [
- "bca5db70da493941a80ea4c33cb8e1c871a1e1d0",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/jieorlin/flex-min-auto.html": [
- "5edc96a3e46fa2d0c8ff07f4080a495f89044ddf",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/jieorlin/reference/flex-justify-rel.html": [
- "4fd88473ca79960aef9a44c1c227537f359de52d",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/jieorlin/reference/flex-min-auto-rel.html": [
- "2deae7bcbc79bfb0903ab466e0a3050f03b00afc",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/jingke/cssom-view-window-pageXOffset-return-scrollX.html": [
- "9847f906c578dd764573d3a85afd620146433c7f",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/keynesqu/Flexible-order.html": [
- "229fb3a4b4c161487d9984487a729827b82ad100",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/keynesqu/reference/Flexible-order-ref.html": [
- "a55811f49a0b4cce1bb84fc36cefc60875c4df9d",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/neo_and_rayi/extensions_to_the_HTMLElement_interface.html": [
- "25ebea62b5ac021afd6119021cc74eaf6e683896",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/peter/flex-align-items-center.html": [
- "ef269a71e8994eaa7205a07814a829d11ae0ef8c",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/peter/flex-items-flexibility.html": [
- "c9205d92cd01539603f380f1a6278f45a3f9dfe0",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/peter/readme.txt": [
- "2a75563a8c299b4d550dc48d671414c3f76cc316",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/peter/reference/flex-align-items-center-ref.html": [
- "4a49ba506121217ad2ed8c0cbe3bfb7aac1d4971",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/peter/reference/flex-items-flexibility.html": [
- "cde22c71329e8e2219d32a64e19ded42e4d48ec2",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/phuangce/flex-margin-no-collapse.html": [
- "2dd7718a8c762d199fe0eec0a38bc7b422cc1d10",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/phuangce/reference/flex-margin-no-collapse-ref.html": [
- "a4f33b81904ca80623b149d957ea377e956a799c",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/renjing/border-image-repeat-round.html": [
- "58e87e661a9d30de2f7226e8c89d4d9fe5d14223",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/renjing/border-image-round-and-stretch.html": [
- "b9fcee63fb28e1b08f3bec8ca96ebed20ea64cbe",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/renjing/border-image-slice-percentage.html": [
- "d631e470cf01175f72926bf9b1ed5fd6edd0228c",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/renjing/reference/border-image-repeat-round-ref.html": [
- "370a9d0481d0ea9c6b529705d8bfbe05a92fd439",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/renjing/reference/border-image-round-and-stretch-ref.html": [
- "c245b8c2487c81fc110460d4756301c556c1ba28",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/renjing/reference/border-image-slice-percentage-ref.html": [
- "370a9d0481d0ea9c6b529705d8bfbe05a92fd439",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/renjing/support/border-image-round-result.png": [
- "daa6f0aaeba7a819a0a222ee93a2947f8cfa46f3",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/renjing/support/border.png": [
- "c643564c8b6ff76e3e482414f3f722abfea4d43f",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/renjing/support/borderresult.png": [
- "62cba9dc4573e93e295c86fffe950da9346f2fc0",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/tang,shaofeng/border-image-repeat_repeatnegx_none_50px.html": [
- "4e07c2d7cbdb4c46e11dd0c529ea3766cf253b0a",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/tmd/css-border-radius-001.html": [
- "2a3f3359a4737dcf387c4cfa9b2981b130f2ad6f",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/tmd/css-border-radius-002.html": [
- "fb7e3a84777551d59cacd49fdb1befadb14639dc",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/tmd/readme.txt": [
- "105bbfce95d9e9a30e8f0f9e44c5faef8410ca44",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-001.html": [
- "9623632651093bf4504719b2450f2ec07792a0e2",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-002.html": [
- "456cf03ce09bbc22cc2a7b9bbc3622aa1df31e7f",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/tmd/reference/y.png": [
- "48da44d12b4e410770c53f50689c1f5b1cd32bbf",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-boxsizing.html": [
- "0fd269130a76ce02824e8b3039ce74dcf20dd256",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-childmargin.html": [
- "e295faf87efbae31fe7123119f0b1032bb3efdee",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-flex-prescation.html": [
- "cc92fb2eb2318436d241910ecba07a1fd39519f5",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-margin.html": [
- "75f5e35b1375971c0267f5893aa6450b5bb712d5",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-padding.html": [
- "313fcbab7b9f6dba6fcf87ce84639dd85c9ebcd0",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-basic.html": [
- "fc3115dc59e78c85002f0c342be70e2a15335baa",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-cascading.html": [
- "07d90a2aa93499ca3229767077a23b184dbc766d",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/xiaochun/background-size-035.html": [
- "d68280bbcda9a3fadfa3fb7f073fda2afb254738",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/xiaochun/bg.jpg": [
- "3ae2171caaa4e4efd309c1669dd7461e3df77172",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/xiaochun/reference/background-size-ref.html": [
- "27041db6d7f3abc1c7b55289a5e2e4dde5aa8527",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/xiaoyan.jxy/background-clip_padding-box.html": [
- "6af7e7f2d894865f5ef7f043e2ad2f3727db0d7c",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/xiaoyan.jxy/reference/background_clip_padding-box.html": [
- "1e0778a163d623d272321fdc6fd5c8732a3d4007",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/yuhong/css-backgrounds-sizingimages-001.html": [
- "3cde64cfff31a122f266c38f0bc435945282a4f9",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/yuhong/reference/css-backgrounds-sizingimages-001-ref.html": [
- "d8ea3e17a625e60b60775c3d666be6ac56ec8b66",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/yuhong/support/test.png": [
- "fbbebe5c65335c81cf6d9cd761025385804b7962",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/zhangxiaochong/box-shadow-outset-without-border-radius.html": [
- "1e710427338cc278a36ee18861c1e5dd0bf1eaea",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/zhangxiaochong/reference/box-shadow-outset-without-border-radius.html": [
- "c372b6c821f526e614c72f8ac2d172f6a238a5f0",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/zhouli/border-radius-clipping.html": [
- "49180352b5e78370562a69b4649d1dc07a9efb6a",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/zhouli/flexible-box-float.html": [
- "b0ccf708b5ef32033c732da5fa0e08808ca1ab1e",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/zhouli/reference/border-radius-clipping-ref.html": [
- "fc7beb3afaecb1f2facda42496da4531369c04b3",
- "support"
- ],
- "css/work-in-progress/ttwf_bj/zhouli/reference/flex-box-float-ref.html": [
- "13401bfeec43c7e2458694e3019f6ff13bd9dc45",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/justh/box-sizing-border-box-001.html": [
- "b31ddb6b5b7a7f527a359d9dc3b4b191d431215e",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/justh/outline-001.html": [
- "a7552987c6cf47f2bd9e499580f9d2633a46bdd3",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/justh/outline-002.html": [
- "589fea0d945067dbec945801ae8b5ac5551d2deb",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/justh/outline-offset-001.html": [
- "c5a2fbb0fc639aed4ab8fcc49f43efd20461de5d",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/justh/ref/box-sizing-border-box-001-ref.html": [
- "79a0a2b8bf11a8a210612d79f1ce3f6da6b4ef6b",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/justh/ref/outline-001-ref.html": [
- "22ca261454be5cc06811b4c35e3041ee5f28823c",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/justh/ref/outline-offset-001-ref.html": [
- "4e46126797b9d08b7529334dd4203c041bd222d4",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/tonychyan/css-transform-combination-001.html": [
- "e5f167beddcbbebef54ca3c836de3672066f28e4",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/tonychyan/css-transform-hover-001.html": [
- "f6ba5e9a71f338c04c797811314886bace0667ba",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-bothlines.html": [
- "3f842fd773422ade3a4b40bbd13135160715b468",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-firstline.html": [
- "5acdf9dd1420177f8fe43308ec9720b0afa28034",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-secondline.html": [
- "3ebf80d4aa9c8d274e029f96c46e2b0984c75764",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto.html": [
- "c185305ac17ff3d8b187d8273aad7c1f5ca86816",
- "support"
- ],
- "css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-order.html": [
- "eb33ad653f83d8027a8e41f4f937f4964371f20e",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/achicu/css-exclusions/exclusions-pos-01.xht": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-green.png": [
- "51e7b6974a09eda6cb31337717c5eaeb9c44b443",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-lime.png": [
- "b040eb633a35c0648ad72a2902361faf25bc419d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-maroon.png": [
- "f78757e5ebe897bd618d100718385c84e00f2369",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-navy.png": [
- "a3fd80b2c79866fd343e18eef5a51ed6e835e53e",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-red.png": [
- "b8da86921d04ba42f42b0a60b03c5c2172f58c2b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/1x1-white.png": [
- "71b246439f915ad21c7d39414d9f85c8ed73b4ca",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/60x60-gg-rr.png": [
- "e4843d42a26189132e1bdd53e8618521330baeca",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/60x60-green.png": [
- "2f8eb2409b0a18e0bff90725ec7eedc16e7be448",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/60x60-red.png": [
- "415b835abaaab822aab11880354296e7356bbb0a",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/README": [
- "c46bfcee920aef0b9167764ec78c699ed217c8f2",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/a-green.css": [
- "a9716c222274ba868bfd06c05e28cb7762d93245",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/b-green.css": [
- "eb78a4d12f35b4249051826ea000c53d04df80b7",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/c-red.css": [
- "dc288b7aa49b57e0abf803741e78582ba5ceffdb",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/cat.png": [
- "461fd17b274662b88500cdf42bab7f3b79e6019d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/import-green.css": [
- "db4f420efdb292d6520be1a3bf052ed3f6f9e7e3",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/import-red.css": [
- "0f2b9133fcfa22d5506a5cee307bd1a4d50e87e9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/pattern-gg-gr.png": [
- "d2c08ac27993be891c9f01afedc4681d73b6c6bb",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rgr-grg.png": [
- "cfb6ecc271c296c69b133a81f350a777b608bea4",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rrg-rgg.png": [
- "27080d4df556f59d4b501e03f2847bd9da5756a9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/pattern-rgr-grg-rgr.png": [
- "c100a35c361205932c506f1b3399753b91e4c45e",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/pattern-tr.png": [
- "c1e687deee7b79ae091f2b42c4f6cff430076444",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50%.png": [
- "9364be82a07500d6684a275174bcf5185444cb52",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50px.png": [
- "b3d7cc680b20a5fc44ea93f7df6d33894bc7b09b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/ruler-v-100px.png": [
- "d8b49696edb2bd614e9c00f96e7862798b6e621f",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/ruler-v-50px.png": [
- "eb299dc261ec04c8f2c11afb6f7a1c2ec147587b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/square-purple.png": [
- "ef0619128f22e05920930420b7d96f91f860d904",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/square-teal.png": [
- "92efae44b710cf1ddd9ba96e593dae03fb2519c4",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/square-white.png": [
- "2f93fcc1462ba32b9b7899e5e78c869e529e68ee",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/support/README": [
- "18698bf71d328054eba0b473486058bc9286c1a4",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/support/swatch-green.png": [
- "eedea3e9a99c18f5fc2de3796be2c6f9da2ea07d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/support/swatch-red.png": [
- "c51a03a807743f59e3027371ccfbd8e80235a485",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-blue.png": [
- "e79958e10feeeed3db88dee9bae9ea80055593c5",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-green.png": [
- "c51a03a807743f59e3027371ccfbd8e80235a485",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-lime.png": [
- "ee2cc3dcd6d8dda7c0e4ef3bbc7e63c74118211d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-orange.png": [
- "10768a5177b772013e628c7397ae64725057295d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-red.png": [
- "eedea3e9a99c18f5fc2de3796be2c6f9da2ea07d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-teal.png": [
- "994cd98028aff20822f2dca5a6058fb616bf5ce4",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-white.png": [
- "5bccb1922de065e551d7d106e6493bb91040f3da",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/swatch-yellow.png": [
- "9cc73897c2e1fc45f5224d81d02a6b87bf72b1fa",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-bl.png": [
- "16e4eaa4864c10e72433e575f59c9b67763fe06a",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-br.png": [
- "37f65e7a21d9b9b2daa508f193b8f665c58a1ce9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-inner-half-size.png": [
- "4ed63dd2bb54a8efc166719e00e1e27406b0ee59",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-outer.png": [
- "a0b8dfa40065b27f1d939ce0aab39ada3933c574",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-tl.png": [
- "956e5156fd8c0e75b1c0f3b8b3b900b653663f74",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/betravis/support/test-tr.png": [
- "078e1dd6dd61d36cec239ed75d02051f61fe60a5",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/chrissanborn/css-transform-scale-001.html": [
- "53ab522b158a025114eda53359e56dc9fd09722e",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-001.html": [
- "c017e29e830d1d655da880de8724c3458908cadf",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-002.html": [
- "f4636bd7bb85a86d7c6f59e739df75043a1702da",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/cjgammon/css-transforms/reftest/transform-origin-01-ref.html": [
- "fce8f9666c43ef68c14cf2f877d80954c21f9a03",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/cjgammon/css-transforms/transform-origin-01.html": [
- "6a182ba5ea92086d69f688893f4f5d48d1ee4a00",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/cshoop/medialist-creating-object-001.html": [
- "6186630d5620d20d8e84d055b3b8171f63d8372e",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/background-position-center-001-ref.html": [
- "145109c370850966318df2d890cd99760fd78239",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/background-position-center-001.html": [
- "ed942e5dee576261aa0b4ea676adf4a78aa29264",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/border-bottom-left-radius-001.xht": [
- "0b0beae9c2e39017fae4dec95e02cfc012683de8",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-green.png": [
- "51e7b6974a09eda6cb31337717c5eaeb9c44b443",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-lime.png": [
- "b040eb633a35c0648ad72a2902361faf25bc419d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-maroon.png": [
- "f78757e5ebe897bd618d100718385c84e00f2369",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-navy.png": [
- "a3fd80b2c79866fd343e18eef5a51ed6e835e53e",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-red.png": [
- "b8da86921d04ba42f42b0a60b03c5c2172f58c2b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/1x1-white.png": [
- "71b246439f915ad21c7d39414d9f85c8ed73b4ca",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/20x20-green.png": [
- "524a74a7759d730be8e2c85c04d23940c26b8911",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/20x20-red.png": [
- "32cea4ee0ecc6103820c2699755e61e3a0b82ec0",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/60x60-gg-rr.png": [
- "e4843d42a26189132e1bdd53e8618521330baeca",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/60x60-green.png": [
- "2f8eb2409b0a18e0bff90725ec7eedc16e7be448",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/60x60-red.png": [
- "415b835abaaab822aab11880354296e7356bbb0a",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/a-green.css": [
- "a9716c222274ba868bfd06c05e28cb7762d93245",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/b-green.css": [
- "eb78a4d12f35b4249051826ea000c53d04df80b7",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/c-red.css": [
- "dc288b7aa49b57e0abf803741e78582ba5ceffdb",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/cat.png": [
- "461fd17b274662b88500cdf42bab7f3b79e6019d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/import-green.css": [
- "db4f420efdb292d6520be1a3bf052ed3f6f9e7e3",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/import-red.css": [
- "0f2b9133fcfa22d5506a5cee307bd1a4d50e87e9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/pattern-grg-rgr-grg.png": [
- "a188423017146630d9cf6c89e738b5decb7011d9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/pattern-grg-rrg-rgg.png": [
- "27080d4df556f59d4b501e03f2847bd9da5756a9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/pattern-rgr-grg-rgr.png": [
- "1966920d714455be9bbdfe2aa409fbe557adae44",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/pattern-tr.png": [
- "c1e687deee7b79ae091f2b42c4f6cff430076444",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/ruler-h-50%.png": [
- "9364be82a07500d6684a275174bcf5185444cb52",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/ruler-h-50px.png": [
- "b3d7cc680b20a5fc44ea93f7df6d33894bc7b09b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/ruler-v-100px.png": [
- "d8b49696edb2bd614e9c00f96e7862798b6e621f",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/ruler-v-50px.png": [
- "eb299dc261ec04c8f2c11afb6f7a1c2ec147587b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/square-purple.png": [
- "ef0619128f22e05920930420b7d96f91f860d904",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/square-teal.png": [
- "92efae44b710cf1ddd9ba96e593dae03fb2519c4",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/square-white.png": [
- "2f93fcc1462ba32b9b7899e5e78c869e529e68ee",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/support/swatch-green.png": [
- "eedea3e9a99c18f5fc2de3796be2c6f9da2ea07d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/support/swatch-red.png": [
- "c51a03a807743f59e3027371ccfbd8e80235a485",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-blue.png": [
- "e79958e10feeeed3db88dee9bae9ea80055593c5",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-green.png": [
- "c51a03a807743f59e3027371ccfbd8e80235a485",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-lime.png": [
- "ee2cc3dcd6d8dda7c0e4ef3bbc7e63c74118211d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-orange.png": [
- "10768a5177b772013e628c7397ae64725057295d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-red.png": [
- "eedea3e9a99c18f5fc2de3796be2c6f9da2ea07d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-white.png": [
- "5bccb1922de065e551d7d106e6493bb91040f3da",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/swatch-yellow.png": [
- "9cc73897c2e1fc45f5224d81d02a6b87bf72b1fa",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-bl.png": [
- "16e4eaa4864c10e72433e575f59c9b67763fe06a",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-br.png": [
- "37f65e7a21d9b9b2daa508f193b8f665c58a1ce9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-inner-half-size.png": [
- "4ed63dd2bb54a8efc166719e00e1e27406b0ee59",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-outer.png": [
- "a0b8dfa40065b27f1d939ce0aab39ada3933c574",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-tl.png": [
- "956e5156fd8c0e75b1c0f3b8b3b900b653663f74",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/david/support/test-tr.png": [
- "078e1dd6dd61d36cec239ed75d02051f61fe60a5",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/divya/index-001.html": [
- "0f5a451a6059a217e25faca46cac97d621dbf9ef",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/divya/index-002.html": [
- "ac716bec977b04836ae8e70f4f5dd5915417677a",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/gangleton/reference/transform-translateX-002-ref.html": [
- "f1da9fba771d775c22c6f43211f897de7f05ac1d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/gangleton/transform-translateX-002.html": [
- "1237faf6168b28884eb36f89c733d65f1fdea249",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewx90.html": [
- "9784708d76678941720dc840e4db47c633304741",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewy90.html": [
- "66e0ccaea3ec6734475e096ba3cf62613f80c907",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-TODO": [
- "2b37b92ee536afa1f5d6f4870032eff31e9db998",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-README": [
- "66c4070388f6e5bb3382642dca421abc4a424501",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-001.html": [
- "50651e6bbb806585f97aa3ca4696caa2c0dda86f",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-002.html": [
- "b032747b03e99fab4fd1469c61ccb8e40cbdf607",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-003.html": [
- "5a5a5c741b5784eb1052e073710d253ea500fdea",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-004.html": [
- "7955f0c545345018865c65691f44ce84d2be881e",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-005.html": [
- "70291b12bca5124e4efb26e21fa14f3f9abf3416",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-README": [
- "0d40a19a4424d525c4e1f7e24a56be3550431ba2",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-001.html": [
- "bcef08bb9a7fefec4d86e853bfc1a72ffd2a2f4b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-002.html": [
- "adb4490c7f398b771a1a0d1867484c49ce156fe6",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-003.html": [
- "d1c2bb88cddaaab612c29e459f835254629be726",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-004.html": [
- "23cd276f011506a24c99aafe29a7bb3630c12dc9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-005.html": [
- "af606c2f583a977ab638871a7b91b940e171affb",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-006.html": [
- "74b8d8c1ecadcd160cf8f8dade60f5a6871a0780",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-007.html": [
- "f1e9a32f9029d7d5aca58b29527881a7535f92ba",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-008.html": [
- "bb7a847bc7bf45c065682b8b45a25d24deed846e",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-009.html": [
- "7cb9fe79167e6ed200e39adf26a2a176572d812b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-010.html": [
- "48aa78f5be913bd3592ce5490dcc01b596d0df4f",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-011.html": [
- "3eac9fd7d61d6e04c4b018eea5813930f5565683",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-012.html": [
- "5435418045a61084314d627321005caafc9434f1",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-013.html": [
- "c177837ade77b3e2a02d39157d26214036e3ee5b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-014.html": [
- "d2f4408d1994a878b8a4858740de365353efa713",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-015.html": [
- "9d331147583f5178b97454e8484f5550c1c62013",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-016.html": [
- "954c5d89b23fbacc945e3b3413167616ca54b364",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-README": [
- "f34c562382843b951b43c759eddd8ec03519ab51",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-001.html": [
- "73527dddc474f2a187680f0070122f48e7b6223a",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-002.html": [
- "67e6cec779d1b20f0bf3e735643f6dde78472e91",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-003.html": [
- "50382882a4c74d0a22786f72b721f4500f74f0ea",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-004.html": [
- "ed3fad686d12c21c8bebfa8d754cd2d93e2067eb",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-README": [
- "239844169f3883bc027034492031298b7868db99",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-inline-policy-fixed-001.html": [
- "1b43bdd09f739123ec87296f63fb01b2fcc9323a",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-001.xml": [
- "136eecccb3bf305ee209aa71e407d492e3f3b8ba",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-002.xml": [
- "b7f93a21cf8805f8827443424139437bda8c0780",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-003.xml": [
- "a646bde01d1599f003ab8e71578168b0acb611d5",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-004.xml": [
- "ab8dda91f701a71e0f318bda70804ba0b23f6f70",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-005.xml": [
- "6039544ec28b781c29c25e5e6e2b72f0d81a2d40",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-006.xml": [
- "cc5e929bbe575809a136d5d9aaa0dfebd1376134",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-007.xml": [
- "e5309bc3807adc81cff7cc6f01802dda0c3232a9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-008.xml": [
- "6a132e7c45b14a3f4709dba4a14a371d86b0b3a6",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-009.xml": [
- "709e16e05d8c6a805d22c710868cf97eb4f3eb53",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-010.xml": [
- "2e5e41721b92298d8694c245cbd49836c5cd1cf9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/background-multiple-README": [
- "df9c7bf069b9391ac29e1367841b4e52633b00cf",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/border-style-001.html": [
- "9fa25c3bb0f9ba71e7986ea3f274e5e596856ad6",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/hixie/border-style-002.html": [
- "354015dc9755610c721df5ab1a650089faefd4dc",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/flex-container-margin.html": [
- "4702e7999299f87ee8bbfef43015e35f089098a8",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-modify.html": [
- "d48842d27047ef10050ad731709b74aaf3ff3ba0",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-with-element-insert.html": [
- "5366d04ca2bb18f6f7666767378eca289f5b6ced",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/flex-direction.html": [
- "bc874745b67f463b0ec900b4df578063b4810cbc",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/flex-item-change-width.html": [
- "90af342f4b02f57b5865dc92d17d7f200199cf3f",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-container.html": [
- "92eb0066fe278a9bd1c71a4665304a72aee3b6fe",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-modify.html": [
- "8fe76d57346dd14dbd5db296e130a8bcec289df2",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-with-element-insert.html": [
- "227004b2fa1cee9b810fde5d1606e7c3a9517257",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction.html": [
- "37ee87562daeb948f79fc50c331e8ff56432e606",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-item-change-width.html": [
- "cc57d780a0652aea12bdcd69be33f83185b4de46",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-100x60.png": [
- "03d965b5f66e61948a47e0b28c35c496bc9bff0c",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-96x60.png": [
- "36050bffda9382cfd978dc82a2f0244a535a6a46",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-180-degrees-001.html": [
- "e6b35c523b9b57fa5306bc12f80170526905f3ea",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-270-degrees-001.html": [
- "700c7ec85a9a8e1fc7dc34b66aeb65e7e9264169",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-90-degrees-001.html": [
- "572947a7e34bf440db2f83f31c89f39b5da74854",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/background-attachment-fixed.html": [
- "a58fbdae78de02cd041ad3d3704f212a58793ca7",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/background-origin-border-box.html": [
- "02b2abe1dae43e71651400c54bd28da96dd4bb81",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/background-origin-content-box.html": [
- "2e140225cfaed337d56466c9519ff475eebdd04b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/background-origin-padding-box.html": [
- "a6efff7c261e0ea7e7d1ea90ad347305641ba411",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-border-box-ref.xht": [
- "f660dc0a05496fe4919cc3b985b770735adb3932",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-content-box-ref.xht": [
- "d89de4a7353b0c29fb9bd3737b2dc0884f3127c1",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-padding-box-ref.xht": [
- "11b2ad8a61bfef085e9c8fb80f74a76908fb2279",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-green.png": [
- "51e7b6974a09eda6cb31337717c5eaeb9c44b443",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-lime.png": [
- "b040eb633a35c0648ad72a2902361faf25bc419d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-maroon.png": [
- "f78757e5ebe897bd618d100718385c84e00f2369",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-navy.png": [
- "a3fd80b2c79866fd343e18eef5a51ed6e835e53e",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-red.png": [
- "b8da86921d04ba42f42b0a60b03c5c2172f58c2b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/1x1-white.png": [
- "71b246439f915ad21c7d39414d9f85c8ed73b4ca",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/60x60-gg-rr.png": [
- "e4843d42a26189132e1bdd53e8618521330baeca",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/60x60-green.png": [
- "2f8eb2409b0a18e0bff90725ec7eedc16e7be448",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/60x60-red.png": [
- "415b835abaaab822aab11880354296e7356bbb0a",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/README": [
- "c46bfcee920aef0b9167764ec78c699ed217c8f2",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/a-green.css": [
- "a9716c222274ba868bfd06c05e28cb7762d93245",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/b-green.css": [
- "eb78a4d12f35b4249051826ea000c53d04df80b7",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/c-red.css": [
- "dc288b7aa49b57e0abf803741e78582ba5ceffdb",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/cat.png": [
- "461fd17b274662b88500cdf42bab7f3b79e6019d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/import-green.css": [
- "db4f420efdb292d6520be1a3bf052ed3f6f9e7e3",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/import-red.css": [
- "0f2b9133fcfa22d5506a5cee307bd1a4d50e87e9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rgr-grg.png": [
- "cfb6ecc271c296c69b133a81f350a777b608bea4",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rrg-rgg.png": [
- "27080d4df556f59d4b501e03f2847bd9da5756a9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/pattern-rgr-grg-rgr.png": [
- "c100a35c361205932c506f1b3399753b91e4c45e",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/pattern-tr.png": [
- "c1e687deee7b79ae091f2b42c4f6cff430076444",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50%.png": [
- "9364be82a07500d6684a275174bcf5185444cb52",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50px.png": [
- "b3d7cc680b20a5fc44ea93f7df6d33894bc7b09b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-100px.png": [
- "d8b49696edb2bd614e9c00f96e7862798b6e621f",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-50px.png": [
- "eb299dc261ec04c8f2c11afb6f7a1c2ec147587b",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/square-purple.png": [
- "ef0619128f22e05920930420b7d96f91f860d904",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/square-teal.png": [
- "92efae44b710cf1ddd9ba96e593dae03fb2519c4",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/square-white.png": [
- "2f93fcc1462ba32b9b7899e5e78c869e529e68ee",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/support/README": [
- "18698bf71d328054eba0b473486058bc9286c1a4",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-green.png": [
- "eedea3e9a99c18f5fc2de3796be2c6f9da2ea07d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-red.png": [
- "c51a03a807743f59e3027371ccfbd8e80235a485",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-blue.png": [
- "e79958e10feeeed3db88dee9bae9ea80055593c5",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-green.png": [
- "c51a03a807743f59e3027371ccfbd8e80235a485",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-lime.png": [
- "ee2cc3dcd6d8dda7c0e4ef3bbc7e63c74118211d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-orange.png": [
- "10768a5177b772013e628c7397ae64725057295d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-red.png": [
- "eedea3e9a99c18f5fc2de3796be2c6f9da2ea07d",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-teal.png": [
- "994cd98028aff20822f2dca5a6058fb616bf5ce4",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-white.png": [
- "5bccb1922de065e551d7d106e6493bb91040f3da",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/swatch-yellow.png": [
- "9cc73897c2e1fc45f5224d81d02a6b87bf72b1fa",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-bl.png": [
- "16e4eaa4864c10e72433e575f59c9b67763fe06a",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-br.png": [
- "37f65e7a21d9b9b2daa508f193b8f665c58a1ce9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-inner-half-size.png": [
- "4ed63dd2bb54a8efc166719e00e1e27406b0ee59",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-outer.png": [
- "a0b8dfa40065b27f1d939ce0aab39ada3933c574",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-tl.png": [
- "956e5156fd8c0e75b1c0f3b8b3b900b653663f74",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/mejarc/support/test-tr.png": [
- "078e1dd6dd61d36cec239ed75d02051f61fe60a5",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/miked782000/transform-oragin.html": [
- "64fee586204eafc20dc79c8f81d9dc708291e858",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/miked782000/ttwf-reftest-rotate.html": [
- "34455e4fbd092e67b1d335a46eaf8fee70dfb0bf",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssom-cssText-serialize.html": [
- "b75d5a569b70f42bad2c91ab8e0523b4c65df9d0",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssom-cssstyledeclaration-set.html": [
- "12f5dce3d37a718ac5c872f662cc9f3d9cf09179",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule-constructors.html": [
- "4d3690e3ac97f2d05c7381ec2f52aa597d5dddf9",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule.html": [
- "965a8f6289fa5c6e34bfd447de3b8ef86573fea1",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssom-setProperty-shorthand.html": [
- "14c752e5dbeab2d58983d53aceab08519379bf0f",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/paulirish/cssstyledeclaration-mutability.html": [
- "2e00f38e66c50a54a865c8ca6a020c5ae09a4d00",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/ssreed/diagonal-percentage-vector-background.html": [
- "bf9cb9c9a3943707545948772911b4399821d28f",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/ssreed/diagonal-scaled.svg": [
- "fbd0e22b5fb86620319e808b80dfec4abc904b83",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-percentage-vector-background-ref.html": [
- "9ef1aaab9f7f7cc51e832477ca3e44f2d50807f1",
- "support"
- ],
- "css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-scaled-fixed.svg": [
- "5907bbac7ecb95f5dde1fe95e44d52355e878726",
- "support"
- ],
- "css/work-in-progress/ttwf_shanghai/Zourui/background-color-transparent.html": [
- "fbc7a0cea92ba9412076746c4fe7566fcbc92614",
- "support"
- ],
- "css/work-in-progress/ttwf_shanghai/Zourui/background-origin.html": [
- "82b286919ba6c35f9ce44995ddb3b48753411761",
- "support"
- ],
- "css/work-in-progress/ttwf_shanghai/Zourui/reference/background-color-transparent.html": [
- "720d114264f5818a0a2f5863af1f6cdee56abb7a",
- "support"
- ],
- "css/work-in-progress/ttwf_shanghai/Zourui/reference/background-origin.html": [
- "a4d93f3b2e8f5b28d11b39c3ae4f3d2ea2a0a530",
- "support"
- ],
- "css/work-in-progress/ttwf_shanghai/mark/css3-box-shadow-outline.html": [
- "9776cdf06cddb7f7074f7c61e00ca8cb4c3b365c",
- "support"
- ],
- "css/work-in-progress/ttwf_shanghai/mark/reference/css3-box-shadow-outline-ref.html": [
- "a5083581bcc90200997182b2ecc3a5c357b7f2ba",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/keiko-kiki/refrence/ref-shape-circle-001.html": [
- "6bf7c5ec77b050b1e1b55409a14500ac2757a68d",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/keiko-kiki/shape-circle-001.html": [
- "f0ae5c838b44732c2d64b378133be6ef9a60e521",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/loutongbing/dish-isolated.png": [
- "05db76fc630f7aaab9943b4ecfc2937d999e6038",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-000.html": [
- "a5c177f92a772c232207e5fa074d7ef2b9f9f2cc",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-001.html": [
- "a563ed10d71ff7cd45a2a4140d5e864383dd00cc",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001-ref.html": [
- "b30f1d90aaaad148c31bf5ccf76693c574873fbd",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001.html": [
- "326245b4c8bf083b9ce71e71da39c14236fb582a",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters.html": [
- "8da5eb4f57dcb8f29a578e973bf95e70fe7cfbab",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-value-1em.html": [
- "a8b54e9ddfa515595668a2c912ad88f8ec1f4d5a",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/markqin/where-is-letter-spacing-applied.html": [
- "62dbec6d3b8ac00a4838259419ca1ddcab13b4a8",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/onlymollah/shape-outside-negative-center-positive-radius-ellipse-000.html": [
- "847b29460e44d85be19cda8ca7c9333ffb1a86a7",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/smallni/letter-spacing-value-1em.html": [
- "a8b54e9ddfa515595668a2c912ad88f8ec1f4d5a",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/yanghengfeng/gradient.png": [
- "6d7fdbbd93b51dc43eca2a07673724a7733f3b38",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-01.html": [
- "1a047bc7e6223d9a9596bd89fe3c62a510980aa4",
- "support"
- ],
- "css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-02-mask-box.html": [
- "c7630a93cc31ba7254b2e17ccb7c0a27b0904549",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001-ref.html": [
- "1d1e1daa82096ca3001ff6195b518b34a2b1a242",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001.html": [
- "dc4dfb59f317e56c56d8a30d821f349fa0a5299b",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/hiromitsuuuuu/test_font_face_parser.html": [
- "98b0dd59c56635a1cf49958f34cf9570a708ebdd",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001-ref.html": [
- "abf8ab0565006bb633b907443978786cc6f6e4a3",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001.html": [
- "762397dbaac4145fb4def03dab73c871dc2a208d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/ahem.css": [
- "b8a049c3a68728a3853ad3d0a68c4b43acd3d3b8",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2-ref.xhtml": [
- "03d79f7e0c7d5ce4f7c6ce36bdf2d0dfbe5a59b8",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2.xhtml": [
- "f0e026f8ad5a661d0b5c59748728ca618c9258ec",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3-ref.xhtml": [
- "88d7c9c39d8e8061864afb451018346fdd8b43c2",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3.xhtml": [
- "f79e42a16d64840b23eaf864372673d89881a280",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4-ref.xhtml": [
- "3141af29d18e50afe441204fdf1d500ed46bba59",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4.xhtml": [
- "8e6a7521be9f3f5b5fb7434bbe88306df0c1c769",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2-ref.xhtml": [
- "6f55e1a875d249684c209b4c6495476a17495ae5",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2.xhtml": [
- "30d1ae626a1c6f816d3593cb0d997bd637389161",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2-ref.xhtml": [
- "9a10ae6def517ef3d94c2e54fa48ea5ef1783331",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2.xhtml": [
- "e9f3705d1c881059816098a26f62abe5da8ce6c6",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2-ref.xhtml": [
- "ed20a8b86e57eb24452c7c5305b48f533e3382a9",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2.xhtml": [
- "1146e89ab7e9b4d2f02952046f2d942652e5c13e",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2-ref.xhtml": [
- "5127559ac748647678ddb357ed38af4f1095b781",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2.xhtml": [
- "10d9b3233526275c014606e8fd6fd1f76f1a9fe5",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2-ref.xhtml": [
- "03209bd2ff73bb8e42049330c9a6824aef0b91c4",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2.xhtml": [
- "b338e8b2b0e6e3b945d31c9bd58b3ecbaa2f36ae",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2-ref.xhtml": [
- "0c0f62d86d00960cf645eb25ae6822dfbeec7ced",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2.xhtml": [
- "de5dc253a84a9be3a2b3f37a2ae774b17cdca879",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2-ref.xhtml": [
- "6a9ad987c1c2ad41bde4ef5fef6c2c2acbae135d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2.xhtml": [
- "6349059314821a35676e07edad4af00f67362e28",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2-ref.xhtml": [
- "0737dd744e8548c2b2e291524c0918f85aade573",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2.xhtml": [
- "80c1a0aca822baed5beb69f29a2f140bc74a622a",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2-ref.xhtml": [
- "ab09cca00ad2b1e87197fca06db1ea55923ab5e0",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2.xhtml": [
- "1845f433b726cf5bbafb13eb556201e1d9611be2",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2-ref.xhtml": [
- "667165c6e52e5bece02d692caae04b88c7851e73",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2.xhtml": [
- "fa1c6f3e9a72f6bc2d28b2d2717601f45beac6b0",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2-ref.xhtml": [
- "77c3c4df2bd8a0d0a4dd67bb9953a48d112c16bf",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2.xhtml": [
- "937b1922310136bfcc7caaae52939860205fc80b",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2-ref.xhtml": [
- "4f324501d61766509261483094fa0f532ba3e57b",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2.xhtml": [
- "0f6683a42537fb73026d4fbeea1899f092e7565b",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-iframe.html": [
- "c717a2bceb39ee48d778ceeaaef7b66a419c020f",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-ref.xhtml": [
- "c7187582a9991b4eac5fb4dadaf441c50efbdc7d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1.xhtml": [
- "a83be3905e667085d205afa0b68a2d17ba50892d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-iframe.html": [
- "04a0d85452288be2763c83e5a6e36f713e3456e4",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-ref.xhtml": [
- "c7187582a9991b4eac5fb4dadaf441c50efbdc7d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2.xhtml": [
- "14f273776591a654a4781a3a43a5df47e896fb9f",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-iframe.html": [
- "e90ac4f4a90f1e1c7dc4a7a6bb65cd0359474d8f",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-ref.xhtml": [
- "c7187582a9991b4eac5fb4dadaf441c50efbdc7d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3.xhtml": [
- "03553da0dbb26e31e65b08fabef6e59495b4159e",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-iframe.html": [
- "921ec19e0681dc146ca0f426b60a118203eb0442",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-ref.xhtml": [
- "c7187582a9991b4eac5fb4dadaf441c50efbdc7d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4.xhtml": [
- "38fd18dc3992376d811dfdcfb0647f877dda4e44",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1-ref.xhtml": [
- "e5d9c4c09573c91f171637d5ef25d280a2a5c65a",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1a.xhtml": [
- "add9274565845593c7f7aea10550c8b78f6b7cab",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1b.xhtml": [
- "4f6e5e99484281fc06c3bd9fc0b576e7ab341085",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1-ref.xhtml": [
- "aa21aecca47e0101b0c4130fccdfa8eafd1423ef",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1.xhtml": [
- "6b58bf8054a71109ff8bd7e9210c1cd186ce544b",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2-ref.xhtml": [
- "0378c15b6b3436c4ac39b136563de3a48805a1b5",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2.xhtml": [
- "66fdbcf9f9d2a9537b7cc8f8bad65db0ba7418fb",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3-ref.xhtml": [
- "b6e2421b23b9c1bf3ba6c134e1c79e4e469365c2",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3.xhtml": [
- "4cf6c4e0f7d4709eea9897777c0c604f58d16d84",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-1.xhtml": [
- "7ab556c581a92f945ac1dd499da2666d4c0addd4",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-2.xhtml": [
- "de9d3d7bbfd6d589fff375e8e6af27f991324997",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-3.xhtml": [
- "42f2d092b7a4097e83bdd570a4636fab3a318e19",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1-ref.xhtml": [
- "736d7d83c0cd6c38e997de47ac6945183c3f5c2d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1.xhtml": [
- "0f7a04f836d347a2fa9fdf5dd555ef13f137d6af",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2-ref.xhtml": [
- "de3f28500d288d7171661b1a3450195a76c0c922",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2.xhtml": [
- "b242bc1bf649c07472938483ddb693a89263dc16",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3-ref.xhtml": [
- "8e6bbff368926628d933931c1eb61553fdde1cf6",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3.xhtml": [
- "ffe07fd56802960c4c9603938f69e631ea38cc4e",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1-ref.xhtml": [
- "901e389a4cfaf2428432e23d5507bdc27b729188",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1.xhtml": [
- "30794350abcb2ac469661238dfa23af80666be9c",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1-ref.xhtml": [
- "65a2a517b33347c68e8f329a4bab9f3c721c7740",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1a.xhtml": [
- "0be3c73db1365a48363b0567a1708b8918be6d2f",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1b.xhtml": [
- "c179b2e74e3894203d09a553f538b4dbf8afb9b3",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1-ref.xhtml": [
- "860c6a61c1e87959bc4aa96f4eb93dbbad6cdca6",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1a.xhtml": [
- "d9fa626ac5235d79685d50a230ce3b9fb5693b73",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1b.xhtml": [
- "367a93fb2e08a4f0df66d803ccffca7dd6952093",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1c.xhtml": [
- "92753f6560994803a86d56d285f0e9170477dae3",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1d.xhtml": [
- "db4c51b309f60a7b062923af3931eb9cee0687df",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2-ref.xhtml": [
- "ff7dc91dc0dbf636ec3d740e07a407268d4d66a9",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2a.xhtml": [
- "e4e140faa0645fe29b5da21448696773c3f921d1",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2b.xhtml": [
- "a023aee828ec62d0a42d9205de70b65d51e28c23",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1-ref.xhtml": [
- "c297baf53886a6f51b465dedb1a8e51d9465c0b4",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1a.xhtml": [
- "9945f2ac1d8d723a1655c6a07474f76239c37c1c",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1b.xhtml": [
- "7272e26faa2961c26e0d7468046c0246c72fe13b",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2-ref.xhtml": [
- "281163d0e4188aec3b35cc332e3bca8bdf9385a2",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2.xhtml": [
- "ed39ff2ef46aa3dbee446c8689aab9884c930e5a",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3-ref.xhtml": [
- "ff54df75ff9827cda0e9180f328d0e315134b077",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3a.xhtml": [
- "85dbbe71c0fb74d4efc7e1d3ef8584f95a45564f",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3b.xhtml": [
- "6408d3b53a4207e6f221eb25b84b7c04c4e8778b",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3c.xhtml": [
- "bc5108852517f151196bbdf107e9e76747edc65f",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4-ref.xhtml": [
- "f96bc9d2935d9885e27099c8ad2accb164ed6bbc",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4.xhtml": [
- "63d97328b014dced510025e39a067b234c797263",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5-ref.xhtml": [
- "02c134ab97e3822e3d0277c8ee10ad3cb0e073b1",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5.xhtml": [
- "f867cbc59519c474c7a1503b7705a6ad22d79ce1",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1-ref.xhtml": [
- "2183b2270b4bf90e83e78fd3a23cd64f5c2f925f",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1a.xhtml": [
- "43db81090946f8a68ddaad5d21df93c9e4aa1320",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1b.xhtml": [
- "2ab3f98a8ed2632333333e85af6c39d8c7cb2e46",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2-ref.xhtml": [
- "1e187e5395ab75149d26d6540979c87c8aebee8d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2a.xhtml": [
- "278f4e7d3075694193d9917788034d1a2d36209e",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2b.xhtml": [
- "602fbd445c1585344ab6b6b29332924271fb0a22",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1-ref.html": [
- "89c4b5ce733ca8d3284393d982531eb0f4f626b0",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1.html": [
- "e3f0b9866457d4bc62f860782fbf897e01fe5fba",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1-ref.xhtml": [
- "e9500860dca0a357421d2a192822ebb6062a725f",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1.xhtml": [
- "a7cc488ca39a3c58187c013ed8f1a9d1bb20fa83",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1-ref.xhtml": [
- "ef018ecc1917414eb212929605549c2e53a6f3a1",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1.xhtml": [
- "b13d6fa5419dc5fd246daaa379e7e998fd90dce4",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3-ref.html": [
- "24f351e4568e5b6b1927bb0c25948330cfa8c991",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3.html": [
- "3545bdd440263683a068a5a3442b9a976a74b7a8",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1-ref.xhtml": [
- "9762999f108f9a6bea7de631d95b9a35a51ffa70",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1.xhtml": [
- "2b42ee89a4af92d35bfec9fe5552a75e72380d2d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2-ref.xhtml": [
- "456f0c9b3251bb885385fe54765c8db2d853f58e",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2.xhtml": [
- "9448a92467ea60b3c72b9b825a800f6b52acc3bf",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3-ref.xhtml": [
- "ecb9238df406d6c9ed475d69917608fd8d1865e0",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3.xhtml": [
- "ae3acf8e498836f926f917eb767fa1758b68a8fe",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4-ref.xhtml": [
- "831791670735223d881077b3b20ec3210dad543d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4.xhtml": [
- "3b3e67de169d53309b44cf6b3a6185331a7f9cd6",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1-ref.xhtml": [
- "4f79e3c308d66c32d90777efd782c0f3bce1dd1b",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1.xhtml": [
- "0d6370d067cc508fa1aea70f87d6a8656e1bc5a6",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2-ref.xhtml": [
- "dd69fe4d6b54d51cfa867189a7fd0854e40320dc",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2.xhtml": [
- "c752cd955a668509da4259d03988879c66b10070",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3-ref.xhtml": [
- "e9c8719352213f857590b6e08cd89872d383d268",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3.xhtml": [
- "95197a5d423cc43a449ae37c46731abdabf4a268",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4-ref.xhtml": [
- "386ebc49bfc8195877cf9dbe90915b7126349a65",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4.xhtml": [
- "2278d22efb3cd27bc6a3dd5589bff5c57cc89cef",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-disabled-ref.xhtml": [
- "c21ba9bdfdf0bbac732b67e07c1d5ee58db88e6d",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-enabled-ref.xhtml": [
- "d23176bdaa127a0a8b20fec89f1165f2eca33f04",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1.xhtml": [
- "a733071069d920089eded4d20df0d5e2a2059938",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-helper.html": [
- "8aebf0924edd15f0602ec8c5af0be8f214cf3d44",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-ref.xhtml": [
- "3f288560e7af41190b49308591828f7fcc199060",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1.xhtml": [
- "5b4ba2f275e68f9eccdbdbaaf9bb500bec4f1e31",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1-ref.html": [
- "9e70368f07cf78194b3f95e5593d0836227152eb",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1.html": [
- "848d4b85265e5301073cf6aedd2ac98c288c7889",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2-ref.html": [
- "748ce2b4d0e0a9e5c9d5e2a88c8d0896f7be4d51",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2.html": [
- "f6d3f04f00e21f19c5cd32deaa1e8ed4a319a435",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3-ref.html": [
- "7c80b4671cd489dbaa82feb635969871a7fa1dd5",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3.html": [
- "0cdf8242e5618c10035ed5be4439fc1357f44cfd",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4-ref.html": [
- "0985e0a16d2ad2b9d5566a637f208327e36b0081",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4.html": [
- "77c1723b46f97c2ede3af64ff76b56c5d987c617",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/reftest.list": [
- "71e86ec2e2abcff095b7bf6bda8e413a7a39449c",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/mozilla/solidblue.png": [
- "b0b2ba76fa77230137451abec8e92de03e4359cc",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/starters/CSSOM/samples/CSSStyleDeclaration-setProperty.html": [
- "abaa929e3325ab151f5bacef2b255aa00c7b0de4",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001-ref.html": [
- "909953519c0f0ce9ad6b950322c27b7d72639512",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001.html": [
- "34d7b32ad62bc4a7a2766935c4fa2fcb31ba4f06",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-002.html": [
- "aff47d8476495cbd8d620687c706fac0882998c9",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003-ref.html": [
- "db0af87e6fdefa197893bcf42251c783c8f9b2e3",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003.html": [
- "8036417e5070bfbe69025a141ffba4c69fc64960",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-004.html": [
- "cda09df5947c38ea52708db6175535e5022b70f8",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-005.html": [
- "8ed420c032c45e8aa5b8691cde4992b06a67cc0f",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/t32k/css-fonts-font-face-rule.html": [
- "1ce82379930675373fbae9c59135d2a1d35cfa28",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/takuya/font-family-18n-ref.html": [
- "71111a37e184a2ae9c123b4b37f1d52450788cbc",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/takuya/font-family-18n.html": [
- "ff1d0b7c30b0f54c83df17236a13c770b1296dff",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n-ref.html": [
- "c22fc5b8c6fae6c30382336c1de62d0de9178164",
- "support"
- ],
- "css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n.html": [
- "c0e7ffc3849463b430b08fc7ba4dada987315ec3",
- "support"
- ],
"cssom-view/CaretPosition-001.html": [
"182826b894852721a2efa7eaa0a3437904f13dbc",
"testharness"
],
+ "cssom-view/DOMRectList.html": [
+ "020d13088ba7b4b58ecb80bef3656a5a415b03ea",
+ "testharness"
+ ],
"cssom-view/HTMLBody-ScrollArea_quirksmode.html": [
- "cfe4e07fb9efa140a55175d3cf50ceaced93e1c9",
+ "6de6ee944522c61bc45335df91db210fd066b4f3",
"testharness"
],
"cssom-view/MediaQueryList-001.html": [
@@ -568202,7 +574351,7 @@
"testharness"
],
"cssom-view/OWNERS": [
- "083538f652edfeea9bde3d5d9f56667bc3773f6a",
+ "cf93c0eefa7ac990a83355eddb8b22fa4baddf53",
"support"
],
"cssom-view/Screen-pixelDepth-Screen-colorDepth001.html": [
@@ -568217,6 +574366,10 @@
"8dfaa313b4abad30281d07ce22ac06a61754cc06",
"testharness"
],
+ "cssom-view/cssom-getClientRects-002.html": [
+ "da348da01e09474f652ff1dfb6869665740668d5",
+ "testharness"
+ ],
"cssom-view/cssom-getClientRects.html": [
"f4e750bc1267f5c519a513ef1f25bf3660365788",
"testharness"
@@ -568241,24 +574394,56 @@
"bf1c490777f450275a95ecfc6d6d2c0d055aca82",
"testharness"
],
+ "cssom-view/elementFromPoint-002.html": [
+ "36d7e75021f7f6ab8f89b2654ba3c8f818af16b8",
+ "testharness"
+ ],
+ "cssom-view/elementFromPoint-003.html": [
+ "a689737bd60877e181a8a7ff27774ab383c3de0b",
+ "testharness"
+ ],
"cssom-view/elementFromPoint.html": [
- "e22ae99aa1fba51807aec245b810db5d584ac037",
+ "0f78405640523cf451b19ea0348b8216139b8168",
"testharness"
],
"cssom-view/elementFromPosition.html": [
- "d90dff8b15ec2977f341a7add9c7d627b62d9d0f",
+ "2bb07e21ddfbc24dabc39fa261c720a36f56a933",
"testharness"
],
"cssom-view/elementScroll.html": [
- "416cff5602d8836fcc7c2369e6f5abd86e43eed5",
+ "24c65428976fc4971a33368e6bf6f8b77199d69b",
+ "testharness"
+ ],
+ "cssom-view/elementsFromPoint-iframes.html": [
+ "ac39d7c8c7dfa49bc1e32b542082922a2a6a283f",
+ "testharness"
+ ],
+ "cssom-view/elementsFromPoint-invalid-cases.html": [
+ "7a0f96cbdc976149833ab904e44cc981ca2eaa2e",
+ "testharness"
+ ],
+ "cssom-view/elementsFromPoint-shadowroot.html": [
+ "e87feae5f1e6add43a315b8a3a7035e75708354a",
+ "testharness"
+ ],
+ "cssom-view/elementsFromPoint-simple.html": [
+ "19a0b3be6c48753390e72565e5c5020b35e54da5",
+ "testharness"
+ ],
+ "cssom-view/elementsFromPoint-svg.html": [
+ "2aef08e76167d67ca80f2f993d249692c7cc8ff8",
+ "testharness"
+ ],
+ "cssom-view/elementsFromPoint-table.html": [
+ "b3edbc3743a4c62125580846346f28aa8652242e",
"testharness"
],
"cssom-view/elementsFromPoint.html": [
- "d7d35ebb7041d1a0b67d01a51ab125eee5a8e7b2",
+ "72967af1e05060624a2eaacd059a59bcedacd934",
"testharness"
],
"cssom-view/historical.html": [
- "1d88b7050e61c06aae97c42251401e1d6acb7f06",
+ "a7a39c209b62ff516b955bc16c28ea0f5b94d8ac",
"testharness"
],
"cssom-view/htmlelement-offset-width-001.html": [
@@ -568269,6 +574454,10 @@
"81c8e70138fc30d0954d9de692ee396310586c7f",
"support"
],
+ "cssom-view/interfaces.html": [
+ "d74bbaf34040d130444915b4432c529a73d9604c",
+ "testharness"
+ ],
"cssom-view/matchMedia.xht": [
"3330cf1603555d50d097cdc584cf1c193c8b32d3",
"testharness"
@@ -568289,8 +574478,24 @@
"b2261ec702116c211ab5ac6fbb53698dfe60a7be",
"testharness"
],
+ "cssom-view/resources/elementsFromPoint.js": [
+ "0c31158817d4d6f9e59df0d2ebe0e41c6ce41bb5",
+ "support"
+ ],
+ "cssom-view/resources/iframe1.html": [
+ "ec93f617bdc7b0055d96c7b00ab7832cca1c1af0",
+ "support"
+ ],
+ "cssom-view/resources/iframe2.html": [
+ "0a8784c474ccdd4a3e76cb936855a8ef59566217",
+ "support"
+ ],
+ "cssom-view/scrollBoundaryBehavior-manual.html": [
+ "987051cdbad355cbb1bbb8ea1030a3b17e533f09",
+ "manual"
+ ],
"cssom-view/scrollIntoView-empty-args.html": [
- "c1bd398158cc935c8c69cb0291c2ef0e0faa6bad",
+ "57e22136750f54145c37722674389590b7f340b6",
"testharness"
],
"cssom-view/scrollIntoView-shadow.html": [
@@ -568317,10 +574522,30 @@
"a799c737e7962865c3ed3e380a664cafe97dcfe8",
"testharness"
],
+ "cssom-view/scrollingElement-quirks-dynamic-001-ref.html": [
+ "61f1de81876db66564e3edb8945312ed213d0b30",
+ "support"
+ ],
+ "cssom-view/scrollingElement-quirks-dynamic-001.html": [
+ "2bc3eee1754a051874ae5e8e229c661d7d8a9c1f",
+ "reftest"
+ ],
+ "cssom-view/scrollingElement-quirks-dynamic-002-ref.html": [
+ "85d4a5786e41af9ff89d6622fa329fbf79303c35",
+ "support"
+ ],
+ "cssom-view/scrollingElement-quirks-dynamic-002.html": [
+ "fcb2ceb93ba7b84c86e4c00e59e8febdc8ff8fed",
+ "reftest"
+ ],
"cssom-view/scrollingElement.html": [
"e3bc7ab9a646c1275e5dab9394df97d72ef8a42e",
"testharness"
],
+ "cssom-view/scrollintoview.html": [
+ "6ff3bd8afc87c9f678115e18d3ff8b5331f81c00",
+ "testharness"
+ ],
"cssom-view/support/1x1-green.png": [
"51e7b6974a09eda6cb31337717c5eaeb9c44b443",
"support"
@@ -568501,10 +574726,6 @@
"7f3440e65abbe692e3c28f1f1d04671054ecc815",
"testharness"
],
- "cssom-view/ttwf-scrollintoview.html": [
- "55d874f53db3c8ed03fff063584eecbcda10d2ce",
- "testharness"
- ],
"cssom-view/window-screen-height-immutable.html": [
"3193a200624217a260e17660006e9ce31a52814c",
"testharness"
@@ -568542,7 +574763,7 @@
"testharness"
],
"cssom/CSSStyleRule.html": [
- "9fe62d2e23709b77e9b5cda4522ec1c04d2940cf",
+ "e9d0acfc0c9123dcd2295e217bdfc1ac5195c3f0",
"testharness"
],
"cssom/CSSStyleSheet.html": [
@@ -568557,12 +574778,12 @@
"21d9e43514fb3a7fbf8933429242dc544224ef24",
"testharness"
],
- "cssom/MediaList.xhtml": [
+ "cssom/MediaList2.xhtml": [
"277ec40d3a64d9881e594901a6bcdcd6b70405db",
"testharness"
],
"cssom/OWNERS": [
- "504fa320d984433da43ab370215ecc2ee29ef66d",
+ "f131f271cb2f747e845584abcc445348e8c86521",
"support"
],
"cssom/StyleSheetList.html": [
@@ -568601,6 +574822,10 @@
"965a8f6289fa5c6e34bfd447de3b8ef86573fea1",
"testharness"
],
+ "cssom/cssom-ruleTypeAndOrder.html": [
+ "3940c95b6c5664b0efee76cc90ffc466c218366f",
+ "testharness"
+ ],
"cssom/cssom-setProperty-shorthand.html": [
"14c752e5dbeab2d58983d53aceab08519379bf0f",
"testharness"
@@ -568618,7 +574843,7 @@
"testharness"
],
"cssom/getComputedStyle-pseudo.html": [
- "6c74e57a2e32a13cc3b7e955a2d89dafdf6d1730",
+ "98f4a9a445621ae328a317402bdfb62c83de6b43",
"testharness"
],
"cssom/historical.html": [
@@ -568633,10 +574858,6 @@
"fe12bc0005ccfccfafd4f23644b28fbb5f5e33d1",
"testharness"
],
- "cssom/index-003.html": [
- "f55d9bc5b2e25b1af5169ecc164f62b6a95abfe5",
- "testharness"
- ],
"cssom/inline-style-001.html": [
"377c8610bc597d47a93f70a9cf95b3c7657d8319",
"testharness"
@@ -568658,7 +574879,7 @@
"testharness"
],
"cssom/interfaces.html": [
- "5876c88acd95d18166fdd049bdb3f09cdde4eb3f",
+ "c1dfd96239986c9c57d7b07caebbd1fc9654e0b9",
"testharness"
],
"cssom/medialist-interfaces-001.html": [
@@ -568726,7 +574947,7 @@
"support"
],
"cssom/stylesheet-same-origin.sub.html": [
- "719c525b1af3b6b46dfeeb0627034d799bab50b5",
+ "c8112887da9ee152a9ebe64988fd29cb2c27b9ba",
"testharness"
],
"cssom/support/1x1-green.png": [
@@ -568909,6 +575130,10 @@
"078e1dd6dd61d36cec239ed75d02051f61fe60a5",
"support"
],
+ "cssom/support/xmlss-pi.xhtml": [
+ "d25c88a9ce946cf0e2fde88062b7438b2df9c678",
+ "support"
+ ],
"cssom/ttwf-cssom-doc-ext-load-count.html": [
"800db5cd4f7342d8c4e5309d4035182ce42f7251",
"testharness"
@@ -568969,6 +575194,10 @@
"ad030517981b11892126023bc758b7fe323a3d14",
"testharness"
],
+ "custom-elements/historical.html": [
+ "991ebcff1d8b59a7a4d959f3061a17e0e8a83704",
+ "testharness"
+ ],
"custom-elements/htmlconstructor/newtarget.html": [
"11b7927c9a2946c752f56e5b44cfb4051ab8b6d6",
"testharness"
@@ -569018,7 +575247,7 @@
"testharness"
],
"custom-elements/reactions/ChildNode.html": [
- "90995dda943b6fa08e16f99afc2948b63c3cb4b9",
+ "7c0f92f4447c3abb74cddc7a111d7a0c5993b166",
"testharness"
],
"custom-elements/reactions/DOMStringMap.html": [
@@ -569122,7 +575351,7 @@
"testharness"
],
"custom-elements/upgrading/Node-cloneNode.html": [
- "3bc50b2f5d2affc43807fedb8d54f1e52b38d047",
+ "cc121ea56de1b8e1074062b5dda69f57e2add665",
"testharness"
],
"custom-elements/upgrading/upgrading-enqueue-reactions.html": [
@@ -569138,7 +575367,7 @@
"support"
],
"docs/.ruby-version": [
- "6a53a60564f3c6b4956718496467be313e77067d",
+ "1398f232620ec3c548dc2756fd74cfb365773033",
"support"
],
"docs/CNAME": [
@@ -569150,7 +575379,7 @@
"support"
],
"docs/OWNERS": [
- "f44b20b9ca4ae973a8a1da3a8d37e4c9dbb0dfdb",
+ "8b8fcd1bcd07619951c92029a3f5cad01fa75d44",
"support"
],
"docs/_appendix/github-intro.md": [
@@ -569214,11 +575443,11 @@
"support"
],
"docs/_running-tests/index.md": [
- "8c996a7b797bec83c579f5fd643fdfca32a30cc6",
+ "15811229e77d2949a6cb5d1848cff7136d8f11af",
"support"
],
"docs/_writing-tests/ahem.md": [
- "f3c2b3315367f25f4b29900a4ff37c7b82979e19",
+ "97ee326d501aea007b5f87ee98d0ee6ca303cbb1",
"support"
],
"docs/_writing-tests/assumptions.md": [
@@ -569233,12 +575462,16 @@
"05dbc66f5b2a1a590432d4669753d16b9d2b5da2",
"support"
],
+ "docs/_writing-tests/file-names.md": [
+ "c5ee71530be36dd025c542ddaadfb20c15a6e88c",
+ "support"
+ ],
"docs/_writing-tests/general-guidelines.md": [
- "7574493bd02c0586f61424de2e2f3f337f67f270",
+ "2c0af71d17ceab3abf736ff6e7b979b809dc1a0b",
"support"
],
"docs/_writing-tests/idlharness.md": [
- "9f908f014553757d12fb91626a31a8312ec75bc5",
+ "a28a8990c4e802a555b2bd0b0f185e01c9b00417",
"support"
],
"docs/_writing-tests/index.md": [
@@ -569246,7 +575479,7 @@
"support"
],
"docs/_writing-tests/lint-tool.md": [
- "76bb45b6385e589efcfadd523dac8babd07b16d6",
+ "96cf62f747c7367e81c6001831bd3f22ae62f0fa",
"support"
],
"docs/_writing-tests/manual.md": [
@@ -569262,7 +575495,7 @@
"support"
],
"docs/_writing-tests/server-features.md": [
- "b99519a3280770fb339c31237f1d90fa523e3644",
+ "d89a6d340ebb3808293d5b480772a65e765945a7",
"support"
],
"docs/_writing-tests/submission-process.md": [
@@ -569270,7 +575503,7 @@
"support"
],
"docs/_writing-tests/testharness-api.md": [
- "41fd0824ee16043f2b59ce51f00f42785e8ed0ee",
+ "5fa854f33ee9141f2226fa1e1b4e5aa44c3b75c7",
"support"
],
"docs/_writing-tests/testharness.md": [
@@ -569350,13 +575583,17 @@
"support"
],
"docs/introduction.md": [
- "6c7c15823a502b51b84bde1da8be9bcfb3012cdd",
+ "b877d57dfe88a167dd7ff229d3bdf9fd22c76e8f",
"support"
],
"dom/OWNERS": [
- "9b55eeb7739453218526eab2d6d00aedc475303a",
+ "2bfae729fb0eab4081f06e51ae5640b49e012b8e",
"support"
],
+ "dom/abort/event.any.js": [
+ "25e9c1104acb9b0092d1303190588a3953cf635d",
+ "testharness"
+ ],
"dom/collections/HTMLCollection-as-proto-length-get-throws.html": [
"487f3991b116ceb503352ed025961282a8761e95",
"testharness"
@@ -569505,6 +575742,14 @@
"5da96a9be09ad5dc69438ba9bd6b2ab58cf77ca1",
"testharness"
],
+ "dom/events/Event-timestamp-high-resolution.html": [
+ "689ee67c1e9a45378cc2fb35384a774515a1d641",
+ "testharness"
+ ],
+ "dom/events/Event-timestamp-safe-resolution.html": [
+ "dd22e8532f7ae8424d0a8ec898841a1c7545d020",
+ "testharness"
+ ],
"dom/events/Event-type-empty.html": [
"504518675cd65f5f694653f035130509cbf421c7",
"testharness"
@@ -569549,6 +575794,10 @@
"85dea0178b16b5c3e8ddbfa9a8b4bd8424bc0a3d",
"testharness"
],
+ "dom/events/EventTarget-constructible.any.js": [
+ "cd6977c89454651d094f8679c71b5ba512dd687f",
+ "testharness"
+ ],
"dom/events/EventTarget-dispatchEvent-returnvalue.html": [
"70fedeb118930fdc57292ce5f2bfe621f63c2563",
"testharness"
@@ -569566,11 +575815,11 @@
"testharness"
],
"dom/interface-objects.html": [
- "144554e0a9d53cdbb2c1f01d3dc169010db693b3",
+ "05963c8b0a839f3e07b5478d99fc034e4654b515",
"testharness"
],
"dom/interfaces.html": [
- "f8eb7f5fcfdc9ca4a500d5e43855a24a169c81cf",
+ "7d00e3a778083a91156f4e042c7abd270060a7fc",
"testharness"
],
"dom/lists/DOMTokenList-Iterable.html": [
@@ -569658,7 +575907,7 @@
"testharness"
],
"dom/nodes/DOMImplementation-createDocument.html": [
- "b03938e18d60802ba8ba3c0c7e8fd7714dd72768",
+ "3da48c26f9e3c3bed13a43ca0674e05a2b611fd5",
"testharness"
],
"dom/nodes/DOMImplementation-createDocumentType.html": [
@@ -569666,7 +575915,7 @@
"testharness"
],
"dom/nodes/DOMImplementation-createHTMLDocument.html": [
- "90be3c69aaccfa46c4ac0e2eb04921f19999f1dd",
+ "0015e6ffbdcbdcb6ea9eb3a1557e19f76d13a6ae",
"testharness"
],
"dom/nodes/DOMImplementation-createHTMLDocument.js": [
@@ -569706,7 +575955,7 @@
"testharness"
],
"dom/nodes/Document-constructor.html": [
- "38aa896f335ff68927e72af1c5de552e56ef195c",
+ "638599e01c32e6566a4c445c8042e5b129ca60f5",
"testharness"
],
"dom/nodes/Document-contentType/contentType/contenttype_bmp.html": [
@@ -569717,12 +575966,8 @@
"3ca3dbdee476c0652c301bc9029392a042b1fb63",
"testharness"
],
- "dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html": [
- "f1dab25ef39e57dbd446e56f8d1eccd5a66300d7",
- "testharness"
- ],
"dom/nodes/Document-contentType/contentType/contenttype_datauri_02.html": [
- "c6ecfbf45d1d50826964d4ced0d242c7cf0bf9db",
+ "83a3bb9787d53d6f7e20d2c3bfaa802b58d896a0",
"testharness"
],
"dom/nodes/Document-contentType/contentType/contenttype_gif.html": [
@@ -570006,11 +576251,11 @@
"support"
],
"dom/nodes/Document-createEvent.html": [
- "9274ffffe1b08dee78b64ffc70582957f0386bca",
+ "9d128acd63f3e972334d9a034e0c222495fd927e",
"testharness"
],
"dom/nodes/Document-createEvent.js": [
- "6e7d9350e2fd9ffad36fddd4d90438d620c7dbf3",
+ "5a8ecc8e5627e340eb10fdc91675968dc9b8fb98",
"support"
],
"dom/nodes/Document-createProcessingInstruction-xhtml.xhtml": [
@@ -570138,7 +576383,7 @@
"testharness"
],
"dom/nodes/Element-classlist.html": [
- "c197df35960b77a7794eed10a1a927867a6658f4",
+ "10a0336430514dbbe8e837472c4476254ea8f8fc",
"testharness"
],
"dom/nodes/Element-closest.html": [
@@ -570221,8 +576466,12 @@
"252ff76fd5ebecbe451151fa7b7b6acef44f1a45",
"testharness"
],
+ "dom/nodes/Element-matches-init.js": [
+ "ddce738f5820e51c5132356273e62235f2c8d0e4",
+ "support"
+ ],
"dom/nodes/Element-matches.html": [
- "1c3babeb4f7c2a9f2a35d96aa6eb456f88966cbd",
+ "c3d29ce89418e989a6ecba94771f643298128a26",
"testharness"
],
"dom/nodes/Element-matches.js": [
@@ -570278,7 +576527,7 @@
"testharness"
],
"dom/nodes/Element-webkitMatchesSelector.html": [
- "31934621453740439f9b318c0bb8b180ac3071c3",
+ "4893646fbb75af660d00070d704bf41a7ba77078",
"testharness"
],
"dom/nodes/MutationObserver-attributes.html": [
@@ -570322,7 +576571,7 @@
"testharness"
],
"dom/nodes/Node-cloneNode.html": [
- "f35c88d16e9a3bfc47eb6965d13076f537a20c3c",
+ "d4ab5a700e36fa6b8c26ffc6703d2a9020b5336e",
"testharness"
],
"dom/nodes/Node-compareDocumentPosition.html": [
@@ -570654,7 +576903,7 @@
"testharness"
],
"dom/nodes/selectors.js": [
- "15faac9fc281d4a0e5c525292f691fbcdf84bfc9",
+ "61d049342078d7e7f46c5916460aa34e878904ed",
"support"
],
"dom/ranges/Range-attributes.html": [
@@ -570798,7 +577047,7 @@
"testharness"
],
"dom/traversal/NodeIterator.html": [
- "86f51fa036aeda8fa544509e32b3b7e41a831f6d",
+ "eb86c6666fc081eb37edaca8f53adb72993faf8e",
"testharness"
],
"dom/traversal/TreeWalker-acceptNode-filter.html": [
@@ -570838,7 +577087,7 @@
"testharness"
],
"dom/traversal/TreeWalker.html": [
- "539f28f8c9c46049e3866ba847fbe47a13ebe7bd",
+ "75038e47051a5667e305b363e73034342aa0a073",
"testharness"
],
"dom/traversal/traversal-support.js": [
@@ -570910,7 +577159,7 @@
"support"
],
"domparsing/XMLSerializer-serializeToString.html": [
- "f981058d771b4e6a0936e9f496527fe6177b2479",
+ "121db7defe0663346fd83ba832e09d20ce6d41be",
"testharness"
],
"domparsing/createContextualFragment.html": [
@@ -570941,6 +577190,10 @@
"b420f01bdc20c9acd0787767f32a32e89224d755",
"testharness"
],
+ "domparsing/innerhtml-mxss.sub.html": [
+ "c85fb326dcab0bd83ac1e2264747642c1e4b2b82",
+ "testharness"
+ ],
"domparsing/insert-adjacent.html": [
"e5e03abc181a33da94810491d77060922b905d1a",
"testharness"
@@ -570970,7 +577223,7 @@
"testharness"
],
"domparsing/xml-serialization.xhtml": [
- "71944bd6e03639c4736db03b651e265d103cf5cf",
+ "b62d4cf898f819ccaf02769de3af12cdc80cea7e",
"testharness"
],
"domxpath/001.html": [
@@ -570989,8 +577242,8 @@
"4842d40e22e25ee72536946d785a3cd03bc6a11d",
"testharness"
],
- "domxpath/interfaces.html": [
- "6848bd27f62d93fa527684c5625a42f4dc6470c2",
+ "domxpath/interfaces.tentative.html": [
+ "e9539407a212ee2c3603b15d30f7840e0824d01d",
"testharness"
],
"domxpath/xml_xpath_runner.html": [
@@ -571241,6 +577494,10 @@
"821cc4fefcfce96832c1a4547698801b554ae426",
"support"
],
+ "editing/data/insert-list-items-in-table-cells.js": [
+ "f6e8969d30a53e42c6adace5bd9598862b92c611",
+ "support"
+ ],
"editing/data/inserthorizontalrule.js": [
"118414ee839b94b9a747e0dfd2068d728c171db7",
"support"
@@ -571437,6 +577694,10 @@
"1bed1283ad3b220b2949c0720cba60105c888ec2",
"testharness"
],
+ "editing/run/insert-list-items-in-table-cell.html": [
+ "7bb730a43273a9220ef491511acbdd5c91fbc9b7",
+ "testharness"
+ ],
"editing/run/inserthorizontalrule.html": [
"49b66e6425c8d7d8c3c7b63070a745483bcfc46f",
"testharness"
@@ -571534,11 +577795,11 @@
"testharness"
],
"encoding/api-invalid-label.html": [
- "03709b6005a96c42a80c4db5a71874fb3d0c3f6f",
+ "38912a0e00f769ff9c116a5871b3691d059a4ef9",
"testharness"
],
"encoding/api-replacement-encodings.html": [
- "6a7d970c4228c341332acc2779fb94416c7d380a",
+ "ea956ff139f386abf52226d981dbb5ec0e3f2a38",
"testharness"
],
"encoding/api-surrogates-utf8.html": [
@@ -571549,6 +577810,38 @@
"b9635c43ce159e1961106b039dce0e3d04fade34",
"testharness"
],
+ "encoding/eof-shift_jis-ref.html": [
+ "55ac2be8c2cce3bae0ea1e61f5c330c38adc1e9e",
+ "support"
+ ],
+ "encoding/eof-shift_jis.html": [
+ "c5f6bd10724c2186f9c3347a8eca29627c8fcb5d",
+ "reftest"
+ ],
+ "encoding/eof-utf-8-one-ref.html": [
+ "88e83397cb0e375bc9c84ddedfe60aa5cb11a667",
+ "support"
+ ],
+ "encoding/eof-utf-8-one.html": [
+ "8f89ca912cc4d01dc9cb72e027aef26e1d0cb2a6",
+ "reftest"
+ ],
+ "encoding/eof-utf-8-three-ref.html": [
+ "48dbb873550d0fb33c45a4ab4fff03654b1732b2",
+ "support"
+ ],
+ "encoding/eof-utf-8-three.html": [
+ "b04b8002836ea0f476b65270bb2b5797ffec5fdd",
+ "reftest"
+ ],
+ "encoding/eof-utf-8-two-ref.html": [
+ "ef39f0e0af97a88ceaf652a9df0b2cd07719bff5",
+ "support"
+ ],
+ "encoding/eof-utf-8-two.html": [
+ "dd855efd3ea7bd865c35c105506473fb7731bc36",
+ "reftest"
+ ],
"encoding/gb18030-encoder.html": [
"6f091a64de33492bd17ecbd37f5db0fff9af499a",
"testharness"
@@ -571562,7 +577855,7 @@
"testharness"
],
"encoding/iso-2022-jp-decoder.html": [
- "551248ae4bf66d051697af82978f21c6d4812d1a",
+ "c189c2f99ee066e9419fdebef5d620edf97cd785",
"testharness"
],
"encoding/iso-2022-jp-encoder.html": [
@@ -572301,8 +578594,16 @@
"22f0299c5a8741c6585c3f56b471d6970d0bb499",
"support"
],
+ "encoding/replacement-encodings.html": [
+ "10ebae214ee7307c8087206a318ce8b5765ed8e9",
+ "testharness"
+ ],
+ "encoding/resources/decoding-helpers.js": [
+ "e8e58f30dff991e6aa6a20553081a1754bf02300",
+ "support"
+ ],
"encoding/resources/encodings.js": [
- "27b7c95700ec1b5bfa45257574a01cf9ff30ca96",
+ "66626403db30a2778878a187df339b0bfd767495",
"support"
],
"encoding/resources/single-byte-raw.py": [
@@ -572313,8 +578614,40 @@
"f94642c1168f0c3d51a97c61c32ccec7627a0cf0",
"support"
],
+ "encoding/resources/utf-32-big-endian-bom.html": [
+ "e428533955536e3cf6bbf419aeb2555f96b5ecfa",
+ "support"
+ ],
+ "encoding/resources/utf-32-big-endian-bom.xml": [
+ "589c6770f4a150b81aa659d911a3c5c9b225ed6c",
+ "support"
+ ],
+ "encoding/resources/utf-32-big-endian-nobom.html": [
+ "8096ff53475f7b14a58d92f2adf18d41afd85588",
+ "support"
+ ],
+ "encoding/resources/utf-32-big-endian-nobom.xml": [
+ "b0a3c5cac44538fcc406141594de0e7766033a68",
+ "support"
+ ],
+ "encoding/resources/utf-32-little-endian-bom.html": [
+ "670d1ed741f53318a4b6d81c8716ca2fe8d50e99",
+ "support"
+ ],
+ "encoding/resources/utf-32-little-endian-bom.xml": [
+ "c1e0bfcdfa5362bdcf3a9a465da3c3e489e5941e",
+ "support"
+ ],
+ "encoding/resources/utf-32-little-endian-nobom.html": [
+ "8ffd4f3df1709d9b8b3ee44a165adfe335e56c1b",
+ "support"
+ ],
+ "encoding/resources/utf-32-little-endian-nobom.xml": [
+ "79133d037352faca749753860fc9146e111ca083",
+ "support"
+ ],
"encoding/single-byte-decoder.html": [
- "ca7c90ca9a5617b3c59b692707481ff0391fe2ef",
+ "2f64550e5e845fa2de949577f0756a021bede269",
"testharness"
],
"encoding/textdecoder-byte-order-marks.html": [
@@ -572361,176 +578694,16 @@
"2a65ef4f2ef610cffcb121998b7397568c197afb",
"testharness"
],
- "encrypted-media/EncryptedMediaExtensions.idl": [
- "ef1f1432c42fc6d01f3bfbd576fa5c7de349de96",
- "support"
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-creation-with-gc.html": [
- "4bf7d927ae93edf03588ce712b7e27f37859b18a",
- "support"
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-setcert-with-gc.html": [
- "170de67a99dd81e377a623533ca00af6719cd6d9",
- "support"
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys-with-session.html": [
- "601cb2597fe11b1f8cb154eeb6c2695578c8d553",
- "support"
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys.html": [
- "4cb533e0d57649061786ab287ca2f5ed090e0873",
- "support"
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-reference.html": [
- "ca8196c6c789a19c0c794621e869775b2a3bcfa5",
- "support"
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release-noreference.html": [
- "d4cd32f329466db1f102b21b4e41b58b97877a4f",
- "support"
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release.html": [
- "82c9c656d979220ccb82c184958f0d11a42e6a65",
- "support"
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-multiple-mediakeys.html": [
- "5acbbaef680c82548547dc50d5f3ee74a3b72b51",
- "support"
- ],
- "encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-reload.html": [
- "2c53d399a2e912386140cca469abd2fbc4dddbf2",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-check-init-data-type.html": [
- "4fa60672a3924b333b9c5e36c5d3cc7eadb7f6f5",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clear-key-invalid-license.html": [
- "41d9eab593a085430785ee2a67fc32c574602d2b",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clearkey-update-non-ascii-input.html": [
- "158e0ca659711220f915f49f04aa437d99c6a9fd",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-events.html": [
- "c5d7bd409b2bdf27e4c8940eb5e15909ae87cd83",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-generate-request-disallowed-input.html": [
- "74cac87a8e39dc2d85be5ad988941bea111f4f21",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html": [
- "3cc12d72464372f31ff1c5e83b2b206aadf8b74e",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html": [
- "f3dbde8b9547006d15a31edde8715f24fceab81a",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses.html": [
- "32e620b28b00b303a4201776d1a81e8a2b5e24f7",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-not-callable-after-createsession.html": [
- "71e8a6af936282d387ec3a447f3e01e2c1ac3eae",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-onencrypted.html": [
- "49851872e6fabdfe26aa0d586f9f5a9dfbf15a33",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-encrypted-and-clear-sources.html": [
- "e827dcd75b1f2346af3144ec3ebaabd8c4cab460",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html": [
- "c7ffa43ac0ae56b7963d7a778620a770c8a02017",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-after-src.html": [
- "4f7c2fa646541f43f15a4388f2dd3e0e8a14fe2e",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-before-src.html": [
- "8e3486fd92e20266d5c349a1d4e5b29a542f63ef",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-two-videos.html": [
- "e65661fed4695cd7f48336ca93ac2ef26f6972ce",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-requestmediakeysystemaccess.html": [
- "34f70ddbe8ff6446a6ddfa5063f940b44a6d8ce8",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-reset-src-after-setmediakeys.html": [
- "e39afa26d69eac1df32ed29c538143c3e7b4481d",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-session-closed-event.html": [
- "85fc8a51e8695a6a7693d9454be641b81e78388b",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-playback.html": [
- "da42d7b56708d2e59ae5d8e31652503543afae1a",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-resetting-src.html": [
- "43e42c6656c11ab484c0241e49a2f6e787748d0d",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-at-same-time.html": [
- "35543cce1af1162a91074eebb79eddf60f7b2ff7",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html": [
- "346f5299bd52389afcb1b8a60277aa8b2f348c79",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html": [
- "ceb74fe2cbc893811994762f6036eb81689ef963",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-to-multiple-video-elements.html": [
- "2fcdf02ec3eba9939085f69c08e387650f6b9037",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys.html": [
- "919f2e188651fa149768e2c44ec2b1651af640e9",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-syntax.html": [
- "24b6b998dd24262266d7db59ad145b9bd593dd3b",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-unique-origin.html": [
- "c431ff8f40b11154c77379417d0daf847b9f8d10",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-update-disallowed-input.html": [
- "62eec52b508eafc22fb2d87b508f5783074cf94a",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-utils.js": [
- "269a439028fa20fc47749d41e0996e552c95f053",
- "support"
- ],
- "encrypted-media/Google/migrated_to_root_disabled/encrypted-media-waiting-for-a-key.html": [
- "e816554176c28647fb99dddd024891d707a17f37",
- "support"
- ],
- "encrypted-media/Google/webm/test-encrypted-different-av-keys.webm": [
- "60180fbdbe12fbff4fd522f1f5e5b3819353cedf",
- "support"
+ "encoding/unsupported-encodings.html": [
+ "7fecb06dda9672e97759aaa8bc18e636b6b1480a",
+ "testharness"
],
- "encrypted-media/Google/webm/test-encrypted.webm": [
- "18e27236cc12e8b7cdc03e4d054aac4267d5b948",
- "support"
+ "encoding/utf-32.html": [
+ "d2d4255745538e257877dab134f0604d40ee4972",
+ "testharness"
],
- "encrypted-media/Google/webm/test.webm": [
- "f911e3e592b8bffe019df73dc6b760ecf32e7a75",
+ "encrypted-media/EncryptedMediaExtensions.idl": [
+ "ef1f1432c42fc6d01f3bfbd576fa5c7de349de96",
"support"
],
"encrypted-media/OWNERS": [
@@ -572969,6 +579142,10 @@
"85124d35b37f14c143e1fcb2965f131a8f2a3391",
"testharness"
],
+ "encrypted-media/encrypted-media-default-feature-policy.https.sub.html": [
+ "aa376680149e53e4839dc48b45291264fa5d6960",
+ "testharness"
+ ],
"encrypted-media/idlharness.html": [
"69456d56a5485b04465f4f6ee4abc80388703fd9",
"testharness"
@@ -573221,6 +579398,114 @@
"17c7a7646bd10a09035bfbc48f6a29c033b44bda",
"support"
],
+ "entries-api/OWNERS": [
+ "892d667b4e54cc48435f07f8a2f443b8b67f33b7",
+ "support"
+ ],
+ "entries-api/errors-manual.html": [
+ "baf8ef0435c4da686a5ed5e728a22fee317c2548",
+ "manual"
+ ],
+ "entries-api/file-webkitRelativePath-manual.html": [
+ "d9d64ee2a22291df02e5fda92eb33c036ca07314",
+ "manual"
+ ],
+ "entries-api/filesystem-manual.html": [
+ "fe56daafee4f7c23f875d4c24c68fa3e3b4c4049",
+ "manual"
+ ],
+ "entries-api/filesystemdirectoryentry-attributes-manual.html": [
+ "855122ab0d4790fb0d48ffb8b6d97536455ed22b",
+ "manual"
+ ],
+ "entries-api/filesystemdirectoryentry-createReader-manual.html": [
+ "b93968171378f0d2ff27bacf7e60a8572634c935",
+ "manual"
+ ],
+ "entries-api/filesystemdirectoryentry-getDirectory-manual.html": [
+ "59522acf10160f6cd651abb78d02ce9270814d52",
+ "manual"
+ ],
+ "entries-api/filesystemdirectoryentry-getFile-manual.html": [
+ "d2b2d4609831db0105c5c6a0f793ba3f646a3072",
+ "manual"
+ ],
+ "entries-api/filesystemdirectoryentry-getParent-manual.html": [
+ "115031830a8232983d10992abb367abdd8038313",
+ "manual"
+ ],
+ "entries-api/filesystemdirectoryreader-manual.html": [
+ "7466297ac6444c4f072b5cca00e5fa1922c3e63e",
+ "manual"
+ ],
+ "entries-api/filesystementry-attributes-manual.html": [
+ "87c24ffc18dcf0bc52c7c19f20e13d1a5a2f0238",
+ "manual"
+ ],
+ "entries-api/filesystementry-getParent-manual.html": [
+ "bd201000007e44bd8ad7638cef2d0e9d59b08779",
+ "manual"
+ ],
+ "entries-api/filesystemfileentry-attributes-manual.html": [
+ "c0a146470cf512eecb674bb4144377f693bf2b5a",
+ "manual"
+ ],
+ "entries-api/filesystemfileentry-file-manual.html": [
+ "e08af68d276923d00e7ac34e7e62284c8399f4d8",
+ "manual"
+ ],
+ "entries-api/filesystemfileentry-getParent-manual.html": [
+ "b0b391227a3dbbbb81f4d5601f7678597321d411",
+ "manual"
+ ],
+ "entries-api/interfaces-manual.html": [
+ "2e92f27db496e6463372faaabf733fd5b3bf7d94",
+ "manual"
+ ],
+ "entries-api/interfaces.html": [
+ "0ba0779cb78e322054b7c4d268d0697b747d6cb9",
+ "testharness"
+ ],
+ "entries-api/interfaces.idl": [
+ "7fc7361fd635d7377169a756c3369c082f41d5d2",
+ "support"
+ ],
+ "entries-api/support.js": [
+ "e8a802cfcd96ceb96db13d86548513f2df4d7654",
+ "support"
+ ],
+ "entries-api/support/a/b/c/3.txt": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "entries-api/support/a/b/c/d/1.txt": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "entries-api/support/a/b/c/d/2.txt": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "entries-api/support/upload.txt": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "entries-api/support/upload/file.txt": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "entries-api/support/upload/subdir/1.txt": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "entries-api/support/upload/subdir/2.txt": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "entries-api/support/upload/subdir/3.txt": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
"eventsource/OWNERS": [
"33d87cb2e49f774dbe822d1d6c0291c646a76785",
"support"
@@ -573234,7 +579519,7 @@
"testharness"
],
"eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm": [
- "559eef919d29e8db8d0e8c58d71803d3ceb9d761",
+ "9614ac5ce1967bbbcae6a1cc8d64465579f6410d",
"testharness"
],
"eventsource/dedicated-worker/eventsource-constructor-url-bogus.htm": [
@@ -573274,7 +579559,7 @@
"testharness"
],
"eventsource/eventsource-constructor-non-same-origin.htm": [
- "a4c501a1bd6dbc04dbead8326b5f804a2b832be1",
+ "6585a2c3f3335dacf045db66d4754e9a1d808cbd",
"testharness"
],
"eventsource/eventsource-constructor-stringify.htm": [
@@ -573365,6 +579650,10 @@
"5704f240a4b83319e1ad436caebec40f5005e946",
"testharness"
],
+ "eventsource/format-field-id-null.htm": [
+ "07ae9f25d3b1c85b2518bb92a3dcd0250b8c08dd",
+ "testharness"
+ ],
"eventsource/format-field-id.htm": [
"a33303664c6604026bcde699386d8d64647066d2",
"testharness"
@@ -573462,7 +579751,7 @@
"support"
],
"eventsource/resources/last-event-id.py": [
- "9f4a48ce1f216200763937429f5a70d2f356b611",
+ "60b7b62c4f825b69f8354729a0fb6d9c216b2d05",
"support"
],
"eventsource/resources/message.py": [
@@ -573490,7 +579779,7 @@
"testharness"
],
"eventsource/shared-worker/eventsource-constructor-non-same-origin.htm": [
- "a9814bf1b62a81a39012d85d4a2daa4e58e2e298",
+ "f3ce1138c30cb749d35b9843364a5b9735646a4c",
"testharness"
],
"eventsource/shared-worker/eventsource-constructor-url-bogus.htm": [
@@ -573537,20 +579826,96 @@
"eb60703976142de7a5565928a25d875ef142da0a",
"support"
],
+ "feature-policy/OWNERS": [
+ "51fd9c99d8f327e033d8bb1a2500b5143d333287",
+ "support"
+ ],
+ "feature-policy/README.md": [
+ "711c323f1690b0dbe780461241ad825cdd3cf274",
+ "support"
+ ],
+ "feature-policy/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html": [
+ "8595732f7794f10107ef234fe6e37cc12c80eeaa",
+ "testharness"
+ ],
+ "feature-policy/payment-allowed-by-feature-policy-attribute.https.sub.html": [
+ "7f00979fb8e60e938bfa816786705c95e611d2f3",
+ "testharness"
+ ],
+ "feature-policy/payment-allowed-by-feature-policy.https.sub.html": [
+ "762f4d517150b10438fca8571204caae79e00278",
+ "testharness"
+ ],
+ "feature-policy/payment-allowed-by-feature-policy.https.sub.html.headers": [
+ "038c90f26cb5c16047c294aa35a0b0251324dbc6",
+ "support"
+ ],
+ "feature-policy/payment-default-feature-policy.https.sub.html": [
+ "6980a706cca09eaeb2d63d6780a5e0a89ff52fa5",
+ "testharness"
+ ],
+ "feature-policy/payment-disabled-by-feature-policy.https.sub.html": [
+ "942104579b3710532d35bab01f9f387d5ed04fe0",
+ "testharness"
+ ],
+ "feature-policy/payment-disabled-by-feature-policy.https.sub.html.headers": [
+ "09f612159dc367bad5febc8e0a724f0a284517d5",
+ "support"
+ ],
+ "feature-policy/resources/feature-policy-payment.html": [
+ "958b32f77b02f2ff80cf174aadac62237d79056b",
+ "support"
+ ],
+ "feature-policy/resources/feature-policy-usb.html": [
+ "96ae900bcde19a4ffcab30f1d01b393e07936e99",
+ "support"
+ ],
+ "feature-policy/resources/feature-policy-webvr.html": [
+ "57a94b461d4be6a179a53d199dfdd9a2b096d0fb",
+ "support"
+ ],
+ "feature-policy/resources/featurepolicy.js": [
+ "c8fac11b41aa98314aeca32d88e3027ba6aa92d1",
+ "support"
+ ],
+ "feature-policy/resources/redirect-on-load.html": [
+ "5d9d75fc156f6d5a934a1aca7aa2b4a8e238dd4f",
+ "support"
+ ],
"fetch/OWNERS": [
- "e62831c5bfccaebe49384f42c515ece1b65244bb",
+ "41230bc6bb795469b2d6534b00db50477637e1ee",
"support"
],
"fetch/README.md": [
"cc3f679ff78bf2e3b39cf967102c257b84fd7680",
"support"
],
+ "fetch/api/abort/cache.https.html": [
+ "9465007a35059e9d72d4ab1dd8bff0d44f47c3d6",
+ "testharness"
+ ],
+ "fetch/api/abort/general-serviceworker.https.html": [
+ "ea0eda077eb4a5a234ad3b97595da16aee178fc9",
+ "testharness"
+ ],
+ "fetch/api/abort/general-sharedworker.html": [
+ "96563c4324949b5dece964eaf6df0b25324e8365",
+ "testharness"
+ ],
+ "fetch/api/abort/general.any.js": [
+ "784c14c7fd5a605d380584aeefb35392579f21d9",
+ "testharness"
+ ],
+ "fetch/api/abort/serviceworker-intercepted.https.html": [
+ "ee3512098bed44d034d9a0e6f2ccdbd5a07c7e42",
+ "testharness"
+ ],
"fetch/api/basic/accept-header.any.js": [
"ab322023411faca98534f620806b2418a6767e64",
"testharness"
],
"fetch/api/basic/block-mime-as-script.html": [
- "1dd503f1537b09f7aa875ea9a636d587b03601e3",
+ "63ec2123a1f652ddd34d63bed20494068222c98d",
"testharness"
],
"fetch/api/basic/conditional-get.html": [
@@ -573574,7 +579939,7 @@
"testharness"
],
"fetch/api/basic/integrity.js": [
- "cc098024968701fc4069ea3d70d2c16743731309",
+ "c697c5f11dec146f814d19472a8b94b0f50b1ae5",
"support"
],
"fetch/api/basic/mode-no-cors-worker.html": [
@@ -573690,7 +580055,7 @@
"testharness"
],
"fetch/api/cors/cors-expose-star.js": [
- "393131f216961ca07a225d61a5b51726d8b02c51",
+ "2403a7d229377d03230f32383e71960e32a84271",
"support"
],
"fetch/api/cors/cors-filtering-worker.html": [
@@ -573725,6 +580090,10 @@
"7e1bcbd453f80a91f1d61d9a0330854cb2b8a572",
"testharness"
],
+ "fetch/api/cors/cors-preflight-cache.any.js": [
+ "734ea38e3bc892c8639033a434ef8de4f4987875",
+ "testharness"
+ ],
"fetch/api/cors/cors-preflight-redirect.any.js": [
"f4800ef50b830a0dd8b036dcf3e58304c5c7bd8a",
"testharness"
@@ -573734,7 +580103,7 @@
"testharness"
],
"fetch/api/cors/cors-preflight-star.any.js": [
- "5516bbb914b5d2a847d800d5c0f49a6da23b88e7",
+ "fd336bff06ef9d08b9a728592c9e7bf0c43496db",
"testharness"
],
"fetch/api/cors/cors-preflight-status.any.js": [
@@ -573782,7 +580151,7 @@
"testharness"
],
"fetch/api/headers/headers-combine.html": [
- "0edea47e706ac6fae40ae78665f6a839f04c2b22",
+ "e0baba8cbe0564aec32db8b893844b99e0fae6c4",
"testharness"
],
"fetch/api/headers/headers-errors.html": [
@@ -573798,7 +580167,7 @@
"testharness"
],
"fetch/api/headers/headers-record.html": [
- "a1daa97525019a1ff4b2951d788c97f6394bf705",
+ "25ab8a6a8988b529c7023ed50a62f0ac46e20b8e",
"testharness"
],
"fetch/api/headers/headers-structure.html": [
@@ -574086,15 +580455,19 @@
"testharness"
],
"fetch/api/request/request-error.html": [
- "0831d11ecf78cddcc2aef2e2adef09429d918922",
+ "ec4b12f1eca0a0c64c04269f67194cdc90571e0a",
"testharness"
],
+ "fetch/api/request/request-error.js": [
+ "8a4d36d8d179473c04b1f640ebc898c1b10c4b1d",
+ "support"
+ ],
"fetch/api/request/request-headers.html": [
- "0a645876664c428f6ac8d170e991ccf257bb307e",
+ "ca4f2d4b881202dc965ac13a06609ac6a2684ffc",
"testharness"
],
"fetch/api/request/request-idl.html": [
- "56e19a129457bc9dcecf28fd472fd7ae608337ef",
+ "b2f1431738bd7f389ab43cf8c10aed3b0d12abb8",
"testharness"
],
"fetch/api/request/request-init-001.sub.html": [
@@ -574114,13 +580487,21 @@
"testharness"
],
"fetch/api/request/request-structure.html": [
- "f1e332f5d3a7ee414fa01411b2534884d10462e9",
+ "cc2471d809fcf7842c38762614c656bb45bb0fc7",
+ "testharness"
+ ],
+ "fetch/api/request/request-type-attribute-historical.html": [
+ "68620f3ea16b7ae1a9f1efde1cd0bb47f1150b9f",
"testharness"
],
"fetch/api/request/resources/cache.py": [
"3cd7d5191fe33b2f2dab571a4b006d8332fdf42e",
"support"
],
+ "fetch/api/request/url-encoding.html": [
+ "1f8a8e00c5c1ba5ae9995ca6561801479b487b3a",
+ "testharness"
+ ],
"fetch/api/resources/authentication.py": [
"b915aef6ecaacf3484e7a1144ed4769c4ff36539",
"support"
@@ -574129,6 +580510,10 @@
"a916571cccadbe7dcc59ae1fa60f968b28d1ef47",
"support"
],
+ "fetch/api/resources/basic.html": [
+ "eccdc121af21a750b7b75697402fc90b54c070cc",
+ "support"
+ ],
"fetch/api/resources/cache.py": [
"fe01c89d7bef1b6385f29250a0b458024b3e28ca",
"support"
@@ -574145,6 +580530,14 @@
"edc7a1d75d7c438ca3cca59f81d03058b3c2758f",
"support"
],
+ "fetch/api/resources/empty.txt": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "fetch/api/resources/infinite-slow-response.py": [
+ "dee0fa986bf9ce4fd5cd5127a9945caf1b1a4e6f",
+ "support"
+ ],
"fetch/api/resources/inspect-headers.py": [
"c9ac2870a45253664da7de1aaf82626fdd1482bb",
"support"
@@ -574154,7 +580547,7 @@
"support"
],
"fetch/api/resources/preflight.py": [
- "80ac2baa426c8760e4f6eb3cda3121e044988113",
+ "de99c8990074a9f248989cebe7cf1adb0f4ec84b",
"support"
],
"fetch/api/resources/redirect.py": [
@@ -574162,13 +580555,25 @@
"support"
],
"fetch/api/resources/script-with-header.py": [
- "0c988e869e2e7af06bef67a2eba8211554b38323",
+ "07a90ffa656f67c9774d8080f80456e81750dc0c",
+ "support"
+ ],
+ "fetch/api/resources/stash-put.py": [
+ "c7619b1c9d5616bfcdd4c1dc8bc680ab291c8e7e",
+ "support"
+ ],
+ "fetch/api/resources/stash-take.py": [
+ "96cf0b3e0ef753633f3ea84e3e0fba95c38ecc6f",
"support"
],
"fetch/api/resources/status.py": [
"d521bae08fa1ee19e7bbf4301157703e567ad5c6",
"support"
],
+ "fetch/api/resources/sw-intercept.js": [
+ "833e7b3a3cd91a6b0482e1a1159aaed59fd63341",
+ "support"
+ ],
"fetch/api/resources/top.txt": [
"af2c7b4ca07ae6c74d261bc745e174df8ab3ffef",
"support"
@@ -574178,7 +580583,7 @@
"support"
],
"fetch/api/resources/utils.js": [
- "1027bd5e728ae008520ce151722760dbb53a2368",
+ "d9e65bbd408a906a4d14aa40d4ed20ea2ed9f585",
"support"
],
"fetch/api/response/multi-globals/current/current.html": [
@@ -574198,7 +580603,7 @@
"testharness"
],
"fetch/api/response/response-cancel-stream.html": [
- "3269c6c337a392f95e852d4f6904c51a90e7f652",
+ "453323c2a0f9a908966df3cb53211c0b0a1fa19d",
"testharness"
],
"fetch/api/response/response-clone.html": [
@@ -574210,7 +580615,7 @@
"testharness"
],
"fetch/api/response/response-consume-stream.html": [
- "7dd429b389a997a879362629985089bad495a227",
+ "7e990d212ef225ac8475803e01b1772086dbc08d",
"testharness"
],
"fetch/api/response/response-consume.html": [
@@ -574226,7 +580631,7 @@
"testharness"
],
"fetch/api/response/response-init-001.html": [
- "e1d9ffd41e8ff0871b27ca7d33f088a124c09f4b",
+ "a45bf860ad19e31ff95c3add7b6f4ad7c0573254",
"testharness"
],
"fetch/api/response/response-init-002.html": [
@@ -574261,6 +580666,10 @@
"8177830f646faeb4678a7c5706e2e9c60e1f1078",
"testharness"
],
+ "fetch/api/response/response-stream-disturbed-6.html": [
+ "af3dcd2f8918b5c1365191490d127dcf2cc35cd9",
+ "testharness"
+ ],
"fetch/api/response/response-trailer.html": [
"9597194813fc6ce3e63a7622eb61f791b8746ec7",
"testharness"
@@ -574377,8 +580786,12 @@
"94af02c5ca5146386acd4fae5856f89cd244bed1",
"testharness"
],
+ "fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html": [
+ "92c4633c3d684de4b1d959dbff4f2bab1eaf15a0",
+ "testharness"
+ ],
"fetch/security/dangling-markup-mitigation.tentative.html": [
- "1321f79af7ba2b5140605a88f3ea8c92cc1f4de6",
+ "f7eb7151eb44f6b879beb325e923507f9430a3a5",
"testharness"
],
"fetch/security/embedded-credentials.tentative.sub.html": [
@@ -574389,6 +580802,10 @@
"09ab38acc0bc980af3e96a61390cd000885b2fe5",
"support"
],
+ "fonts/Ahem.ttf": [
+ "cb13ce54ae0c997d219670e6583637967170e40d",
+ "support"
+ ],
"fonts/CanvasTest.ttf": [
"10a7017b4caead6817aa08b25f14950e6402dd95",
"support"
@@ -574397,6 +580814,10 @@
"946f23f945163bf9f9da080291b21473f6e1cbd0",
"support"
],
+ "fonts/README.md": [
+ "eb192c5fe03811a1b69578c92bf77d8abab89f29",
+ "support"
+ ],
"fonts/math/axisheight5000-verticalarrow14000.woff": [
"5dbb41e35c4d0676c528c5be029ea90319fc200a",
"support"
@@ -574682,11 +581103,11 @@
"manual"
],
"fullscreen/api/document-exit-fullscreen-nested-manual.html": [
- "5ddaf5fd8c2aef02fc4cefffa80a569e513a5491",
+ "12715d90017a74434cfab8276acfab5419d39a7b",
"manual"
],
"fullscreen/api/document-exit-fullscreen-timing-manual.html": [
- "e152a235daa9e5721695c6f347fddd3f111180fc",
+ "9102264efe1ef6fb7394bfe987637fef359fc8c9",
"manual"
],
"fullscreen/api/document-exit-fullscreen-twice-manual.html": [
@@ -574701,6 +581122,10 @@
"380e2bef1b6b4ec75dcf041f3ed0185a5805ae44",
"testharness"
],
+ "fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html": [
+ "466e83807599b602d1d329a90087cea7f34d0573",
+ "testharness"
+ ],
"fullscreen/api/document-fullscreen-enabled.html": [
"dd76a7198bdc882285bbc01e8ee6379c52237350",
"testharness"
@@ -574713,12 +581138,12 @@
"ed8836f302fffdaa407bf9bf7799effa17fb6823",
"testharness"
],
- "fullscreen/api/element-ready-check-containing-iframe-manual.html": [
- "96f14dfff180ed3a78dd5df378c712800a8e1fd8",
+ "fullscreen/api/element-ready-check-allowed-cross-origin-manual.sub.html": [
+ "f62f912aeff6cd173e6e43aa9634568e32c0104c",
"manual"
],
- "fullscreen/api/element-ready-check-enabled-flag-not-set-manual.html": [
- "ca0144cfc4bdb114c6fe22ebe5fe65eff9cfc1bd",
+ "fullscreen/api/element-ready-check-containing-iframe-manual.html": [
+ "96f14dfff180ed3a78dd5df378c712800a8e1fd8",
"manual"
],
"fullscreen/api/element-ready-check-fullscreen-element-sibling-manual.html": [
@@ -574733,6 +581158,14 @@
"80bd222b0199b284ea5b554e2798860773d51ea2",
"manual"
],
+ "fullscreen/api/element-ready-check-not-allowed-cross-origin-manual.sub.html": [
+ "38efc0453dd398700e0b2d2518f6348162b5e06e",
+ "manual"
+ ],
+ "fullscreen/api/element-ready-check-not-allowed-manual.html": [
+ "ca0144cfc4bdb114c6fe22ebe5fe65eff9cfc1bd",
+ "manual"
+ ],
"fullscreen/api/element-ready-check-not-in-document-manual.html": [
"a840821f2e75f14d43d385f79de359c37e529921",
"manual"
@@ -574742,11 +581175,11 @@
"testharness"
],
"fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html": [
- "870575cb59c5a7f76097e19da8b3854120d6cb86",
+ "6b06ccdca77fda2a6777a6b22ca1dd6baadd65f7",
"manual"
],
"fullscreen/api/element-request-fullscreen-and-move-manual.html": [
- "29fb0d686ac510d169fbc10ca98eaed599f292df",
+ "5a4ee7d6ebcb448b58f61c9334f0585dba49a3f0",
"manual"
],
"fullscreen/api/element-request-fullscreen-and-move-to-iframe-manual.html": [
@@ -574761,6 +581194,10 @@
"86c1ac20aa86e860cfa8f05a9873f3a3cddbdcd9",
"manual"
],
+ "fullscreen/api/element-request-fullscreen-dialog-manual.html": [
+ "46033232549f3b3333443a97d23d0229c9705b24",
+ "manual"
+ ],
"fullscreen/api/element-request-fullscreen-manual.html": [
"ed7683b3c4a7134b640e07a7329a21361b122402",
"manual"
@@ -574773,12 +581210,16 @@
"8991e8df530fa7c24a9e084f2ab17fa9c70fb120",
"testharness"
],
+ "fullscreen/api/element-request-fullscreen-null-ns-manual.html": [
+ "5fe4a901e450a2f3e52866bc61324571866fb879",
+ "manual"
+ ],
"fullscreen/api/element-request-fullscreen-same-manual.html": [
"10b6ff2c859c50516209735dd1bdc3ea4d24f330",
"manual"
],
"fullscreen/api/element-request-fullscreen-svg-rect-manual.html": [
- "c22355542ab46b4981dbca8c30b8e44da258998f",
+ "2efd96350b1c3de0efc1e2b3d1aa603cfe7e7738",
"manual"
],
"fullscreen/api/element-request-fullscreen-svg-svg-manual.html": [
@@ -574786,7 +581227,7 @@
"manual"
],
"fullscreen/api/element-request-fullscreen-timing-manual.html": [
- "4c4b93ed28a9c778a80f277e39b2f406900baf28",
+ "4ecd76a2ef773172d45f656f52a7358be2a4568d",
"manual"
],
"fullscreen/api/element-request-fullscreen-top-manual.html": [
@@ -574809,6 +581250,14 @@
"9d9bec938f185b2461da4d00a5683ad5d07ee577",
"testharness"
],
+ "fullscreen/api/resources/attempt-fullscreen.html": [
+ "33e277b3f06677f14eed442ecce76b408e7e006e",
+ "support"
+ ],
+ "fullscreen/api/resources/report-fullscreen-enabled.html": [
+ "ba59db02939bc5ba00825befe4777c66cee64b4c",
+ "support"
+ ],
"fullscreen/interfaces.html": [
"f6f0dbc8a505896a0e7ec7aca2746bbd5c1eb7d9",
"testharness"
@@ -574817,6 +581266,10 @@
"818cb1b5db729db4959591dc75d4bb1ae3c7542d",
"manual"
],
+ "fullscreen/model/move-to-inactive-document-manual.html": [
+ "552d65141acc2221e8407316c02e0d4cf17db7eb",
+ "manual"
+ ],
"fullscreen/model/remove-child-manual.html": [
"b1142930c6c972057213bd477cf116fcc9e7fc2a",
"manual"
@@ -574837,6 +581290,14 @@
"c7fc8323d503adb6d7f0c390a8add90c5c9e8082",
"manual"
],
+ "fullscreen/rendering/fullscreen-pseudo-class-manual.html": [
+ "258b3c119a6a9ea7220a339b0d8e4964b8fb2a5e",
+ "manual"
+ ],
+ "fullscreen/rendering/fullscreen-pseudo-class-support.html": [
+ "0cdfe5cf8321b6c46a75a2f75f6224970368d4ae",
+ "support"
+ ],
"fullscreen/trusted-click.js": [
"e401e8e8bcd97446991398d6021a9bd712c923c5",
"support"
@@ -574846,35 +581307,35 @@
"support"
],
"gamepad/events-manual.html": [
- "681164d632f32528a17a58325fd8c3f33ae6217b",
+ "3a3873da02cde40cd459bcb4d692546f1d862d3d",
"manual"
],
"gamepad/getgamepads-polling-manual.html": [
- "f671c5211d4af9b43061143d5efb51f88820726d",
+ "5d3f77b11fa30687bf6e9042c51d88ce51c9cf6a",
"manual"
],
"gamepad/idlharness-manual.html": [
- "7f517fdc63f99ada3c56633daf16f15fd65ac638",
+ "b7feb12fc02bc656eb41f406999481d204293c08",
"manual"
],
"gamepad/idlharness.html": [
- "5a3fc1b9be284ad92d9cc252325e6f8eae02e1cc",
+ "c9d8668d614404f24a8bf15d803e07e2ff6debd4",
"testharness"
],
"gamepad/timestamp-manual.html": [
- "97bd408b075ab77dde7602073a6757f722ecc1ad",
+ "b2432e7ea263fb80be42e7eecf93a9d885c0205d",
"manual"
],
"generic-sensor/OWNERS": [
- "0a3ea46f600d1af4fb6f4a9777812476c3c66fcc",
+ "b1349055762c7d44414c0c11fb8500d5eee9a75f",
"support"
],
"generic-sensor/generic-sensor-tests.js": [
- "7b36a69dd7d9148f70a1d40d4108dcd747cb2913",
+ "0b89e14eadd32fd23202977471c9913f5213dce4",
"support"
],
- "generic-sensor/idlharness.html": [
- "0e3f29a3a065a3db2f6e0e77d9c6bbdf47bf5ca8",
+ "generic-sensor/idlharness.https.html": [
+ "fdb816b5036bae53a60672d3b6910ddb06dd9d51",
"testharness"
],
"geolocation-API/OWNERS": [
@@ -574938,7 +581399,7 @@
"testharness"
],
"gyroscope/Gyroscope.https.html": [
- "03510d4964a52a53fc7648b5435e810e75ea747a",
+ "504abfa42529e08576e49c3296464bcea5fe0b8a",
"testharness"
],
"gyroscope/Gyroscope_insecure_context.html": [
@@ -574950,17 +581411,13 @@
"manual"
],
"gyroscope/OWNERS": [
- "36770a71443523aa2f91f9958ba24066f0b4dcec",
+ "b119dbb984792f33c6e7463f3105d37c3c3b7ad8",
"support"
],
"gyroscope/idlharness.https.html": [
- "567b200f0ea88894bbffbffb6d20ea546f516e7d",
+ "2aedb883f553cae594afb7c5ef59222c0ee3fefb",
"testharness"
],
- "gyroscope/support-iframe.html": [
- "b02be6c1cdae86e449b8bf635e18e0b60957bb81",
- "support"
- ],
"hr-time/OWNERS": [
"b82f9756b15ef3ea45fb250e304031d9ceaee9c7",
"support"
@@ -574970,7 +581427,7 @@
"testharness"
],
"hr-time/idlharness.html": [
- "b56993b32650d40226e08beee147bc28c76cfa22",
+ "337a75247a6b53a7649c7fdf41c2dcdcf093ac11",
"testharness"
],
"hr-time/monotonic-clock.any.js": [
@@ -574985,8 +581442,16 @@
"289c39cd0c74f3ca28fe5087b75ef01135396594",
"testharness"
],
- "hr-time/window-worker-time-origin.html": [
- "556079c9d81c55df55c69738384991d31cad2c77",
+ "hr-time/timeOrigin.html": [
+ "f2258619e00dd12ee38958bf251c72acab60baa2",
+ "testharness"
+ ],
+ "hr-time/timing-attack.html": [
+ "1d3d88e71fb886374b50c6dc2c1141a80c8c0a06",
+ "testharness"
+ ],
+ "hr-time/window-worker-timeOrigin.window.js": [
+ "51267d21c761c3ccaee34bc4d5e533e69d739bc5",
"testharness"
],
"html-imports/OWNERS": [
@@ -575238,7 +581703,7 @@
"manual"
],
"html-media-capture/idlharness.html": [
- "32b3d387100f0e7ecda93d1fb88351680b259df0",
+ "d6f14981f18dda4e5720cf3e9bf4d4724746664d",
"testharness"
],
"html-media-capture/support/upload.txt": [
@@ -575246,7 +581711,11 @@
"support"
],
"html/OWNERS": [
- "0a32a8fdeb92636cbd5e751c4bd44458d7274abf",
+ "29a1a9d837b3231ac7d1663c0ea8e41e8ce9d525",
+ "support"
+ ],
+ "html/README.md": [
+ "2912eef6630f88093ef850036e7ec812a31f06f1",
"support"
],
"html/browsers/.gitkeep": [
@@ -575278,7 +581747,7 @@
"testharness"
],
"html/browsers/browsing-the-web/history-traversal/PopStateEvent.html": [
- "2a7ed0827fc61af7b3bdd238577887aff1902ea7",
+ "5a9c575a86adbbbca30734992b4d80c22f3973a1",
"testharness"
],
"html/browsers/browsing-the-web/history-traversal/browsing_context_name-0.html": [
@@ -575393,6 +581862,14 @@
"d049bc03734690b94017819ed70b1104378cc9b4",
"testharness"
],
+ "html/browsers/browsing-the-web/history-traversal/support/window-name-navigation.sub.html": [
+ "79ba1608590fae1fae8aacdf809b00741e101066",
+ "support"
+ ],
+ "html/browsers/browsing-the-web/history-traversal/support/window-name-test.sub.html": [
+ "841e6ebed7f83a59b4942be07452ad5c9b8f6519",
+ "support"
+ ],
"html/browsers/browsing-the-web/history-traversal/unset_context_name-1.html": [
"b3aba3e8d9c277aaf30f8cc6860431ba793ab283",
"testharness"
@@ -575401,6 +581878,30 @@
"d6a35d1de53be20dd8171b06349edafa4ae32a87",
"support"
],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html": [
+ "16dfcc1f1628c9dab89470a421138ffde85e866a",
+ "testharness"
+ ],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html": [
+ "74c59d584d8523ce523a26452767d6212d010234",
+ "testharness"
+ ],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html": [
+ "498803de18a2ac26f3d5bb19a470ad058cefa9ac",
+ "testharness"
+ ],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html": [
+ "2b0496b919110cc5996c79afdd420905e1d48ea6",
+ "testharness"
+ ],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html": [
+ "74ec6353b0b0afa070c745125c09b91d870f38c7",
+ "testharness"
+ ],
+ "html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html": [
+ "8865745d26bee3955927f4c9d35a5174578238ce",
+ "testharness"
+ ],
"html/browsers/browsing-the-web/navigating-across-documents/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -575713,8 +582214,20 @@
"7e24cd47a4ae882b40f7f8798a44faf05f034c3d",
"testharness"
],
+ "html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html": [
+ "fb63063e0ff1ca6aaa350fae9b8f01bed5f9771f",
+ "testharness"
+ ],
+ "html/browsers/browsing-the-web/scroll-to-fragid/navigate-helpers.js": [
+ "5b318196cb31c35e1b39eccd9e6a131a882f1a90",
+ "support"
+ ],
+ "html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html": [
+ "99a355c63562aded2e2b252d989de332e8c12a0d",
+ "testharness"
+ ],
"html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html": [
- "0af4162b8729fa5a8db73b24469fa91cc012fef8",
+ "ac172eb5c05ee24b8e3059cbc68851729f1be943",
"testharness"
],
"html/browsers/browsing-the-web/scroll-to-fragid/scroll-to-anchor-name.html": [
@@ -576225,6 +582738,10 @@
"e8adb6c9e141f07fef45d815a082fffdaed76f49",
"testharness"
],
+ "html/browsers/history/the-history-interface/history_properties_only_fully_active.html": [
+ "9e7b6ac657bca8ec1ecf009a5049f1cbd914fec8",
+ "testharness"
+ ],
"html/browsers/history/the-history-interface/history_pushstate.html": [
"841c9f9cbe19892f9981932ceef07dc30985cf8a",
"testharness"
@@ -576697,6 +583214,34 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "html/browsers/offline/appcache/workers/appcache-worker.html": [
+ "d4dc559a600b1d197e7b31f960b396da3faa4e42",
+ "testharness"
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-dedicated-worker-not-in-cache.js": [
+ "4f2e89ef4b23ff17d6c333831cdd81ebf46a9315",
+ "support"
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-shared-worker-not-in-cache.js": [
+ "e0ca1027ad1077119b95f6a56055417452ab4b04",
+ "support"
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-worker-data.py": [
+ "5686f9536fc98675e737d703d054370b1398399a",
+ "support"
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-worker-import.py": [
+ "8dced5671671d536c1e0bb554bf919f7f2f3861e",
+ "support"
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-worker.manifest": [
+ "284dcbf9adad4bc5d823e654ca889c08f679735c",
+ "support"
+ ],
+ "html/browsers/offline/appcache/workers/resources/appcache-worker.py": [
+ "8681ab72485c543d1e22de75cee685478090a848",
+ "support"
+ ],
"html/browsers/offline/application-cache-api/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -576914,11 +583459,11 @@
"testharness"
],
"html/browsers/origin/cross-origin-objects/cross-origin-objects.html": [
- "02e290c300057b9520390e55833194908d74ca76",
+ "9202ebf4d640ffccec49451bae23526c24a1053b",
"testharness"
],
"html/browsers/origin/cross-origin-objects/frame.html": [
- "dc9cd0af288e67202b3db551516613a2707201c5",
+ "7f982fe347ac7fbc14e853d14a2535685a970395",
"support"
],
"html/browsers/origin/cross-origin-objects/win-documentdomain.sub.html": [
@@ -576926,7 +583471,7 @@
"support"
],
"html/browsers/origin/origin-of-data-document.html": [
- "360415417ed0dadfaf947954fbd0cf801dbd5bdc",
+ "9fec457691ac4b071e9bc8de1ebf6f13dbadd4e5",
"testharness"
],
"html/browsers/origin/relaxing-the-same-origin-restriction/.gitkeep": [
@@ -577266,7 +583811,7 @@
"support"
],
"html/browsers/the-window-object/named-access-on-the-window-object/named-objects.html": [
- "b4aed70f7618d5d5e29350f19b4c1d45c045f9cb",
+ "8738c9e53e1c71b6b15ea0c3f2f0f9b0e4522144",
"testharness"
],
"html/browsers/the-window-object/named-access-on-the-window-object/test.html": [
@@ -577326,11 +583871,11 @@
"testharness"
],
"html/browsers/the-window-object/window-indexed-properties.html": [
- "22d5cb06bfc4724d27f565b8ffa2280bf2e8538b",
+ "06d489f3668c963c46c1ed31e9263d8717eab4e7",
"testharness"
],
"html/browsers/the-window-object/window-named-properties.html": [
- "03bab12397e43003c6a4d768d2faa580501400bf",
+ "21bb2b7a30381decf8b55152ba33cd723b67b8d5",
"testharness"
],
"html/browsers/the-window-object/window-open-noopener.html": [
@@ -577718,7 +584263,7 @@
"testharness"
],
"html/dom/documents/dom-tree-accessors/Document.currentScript.html": [
- "c7bbd7f042cf5b674217b4435be00b1dfd3af900",
+ "b8c28696c0974a392a9a62e079934641f57415b5",
"testharness"
],
"html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null-undef.html": [
@@ -577858,7 +584403,7 @@
"testharness"
],
"html/dom/documents/dom-tree-accessors/nameditem-03.html": [
- "6692f5b790960145e7a94b25227682237cbb4862",
+ "0887edcb756daa6447497510ea7c8a3967ae8c2f",
"testharness"
],
"html/dom/documents/dom-tree-accessors/nameditem-04.html": [
@@ -577878,7 +584423,7 @@
"testharness"
],
"html/dom/documents/dom-tree-accessors/nameditem-08.html": [
- "5ae6d9718f6568cf9c42a7ebdf2cbae767c68852",
+ "ffb7fbed3b9e0f2a73907358234136d5a62b6943",
"testharness"
],
"html/dom/documents/loading-xml-documents/.gitkeep": [
@@ -578470,39 +585015,39 @@
"testharness"
],
"html/dom/elements-embedded.js": [
- "e6a9921095e294494dd68c7defdba546ad0c81af",
+ "5d5d208f38657e9fda1741654909c29807e67d13",
"support"
],
"html/dom/elements-forms.js": [
- "a8b9288119430a636870a095c7fc2de686808490",
+ "ed722f36a003a8407c1c4a13f8c75880c4fa9c11",
"support"
],
"html/dom/elements-grouping.js": [
- "bfcba8c36c5f335f98097716685e15ecb2111ac3",
+ "29f046b3d2ad973439bfa05724c10796f3560651",
"support"
],
"html/dom/elements-metadata.js": [
- "7e6becc4e2f4136a1c64d28724d1f21160900dd1",
+ "f7d5c16c0e69c67a1b49b7a4ed28c14e4f3cf469",
"support"
],
"html/dom/elements-misc.js": [
- "59a2e8a1f2eddff79c28c72a7ac7aabb0d3dd87e",
+ "42b4ea21148dd17c442932ba8cb5e6e49db81a93",
"support"
],
"html/dom/elements-obsolete.js": [
- "fb3e79ce5681b0f20ed06b0d6878aa476e773faa",
+ "0db0f58ec0efeea46ff53f07f717797b62e4244c",
"support"
],
"html/dom/elements-sections.js": [
- "c611c450215141a6ad885286d5293007c7c786aa",
+ "19d908d792ecee4315eee3fa706b5eef5c1557cb",
"support"
],
"html/dom/elements-tabular.js": [
- "d48ca746757d7745c2ed7bdab4d8403e05a890d0",
+ "fe1dfcb1eeea3406987df8f05da234155e1e1a8b",
"support"
],
"html/dom/elements-text.js": [
- "14f242041b89a16a5342a81802fffef4a88be113",
+ "04b456ecdbc8028566ab39c9d2ffb92a3b6e6d9b",
"support"
],
"html/dom/elements/.gitkeep": [
@@ -579297,16 +585842,20 @@
"a4f99553c0cdf1c1efab08c85b9e3211b42d5412",
"support"
],
+ "html/dom/historical.html": [
+ "75fd4e5379337af2ebcb3cd7d62dbf3d726c4036",
+ "testharness"
+ ],
"html/dom/interactions-with-xpath-and-xslt/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
"html/dom/interfaces.html": [
- "4c0db96824033d94b98123954254930fb742d7e3",
+ "c937f2d908ecfae269b95ade6c830414acf0a005",
"testharness"
],
"html/dom/interfaces.worker.js": [
- "9e91d411453d4fdbcead08ad9daccbe2d9d7a975",
+ "e0916d634075e22c3542de6729ea762ed4b8f8ed",
"testharness"
],
"html/dom/new-harness.js": [
@@ -579314,7 +585863,7 @@
"support"
],
"html/dom/original-harness.js": [
- "2fe3c2879943e09252123e3c5a16e83ee524afcc",
+ "d93d680a6ac93c9029cbbca69208cb4f2c94209c",
"support"
],
"html/dom/reflection-embedded.html": [
@@ -579358,7 +585907,7 @@
"testharness"
],
"html/dom/reflection.js": [
- "406cdc2d3a78d7a16d6f6e41430992a36678eb84",
+ "4d841fe21eb604a563fc4d864e7db13c43de4621",
"support"
],
"html/dom/resources/self-origin-subframe.html": [
@@ -579414,47 +585963,47 @@
"support"
],
"html/editing/dnd/canvas/001.xhtml": [
- "1be7627b79e1b9feddf35bba80ad1927751d410a",
+ "25faa1e8b5768b4f363e6378275e88378fa28c39",
"support"
],
"html/editing/dnd/canvas/002.xhtml": [
- "f234a6fd66fe891d3988f29604d78b3f229793c3",
+ "208ebfcc5e0c70af3259b80d3d3d17551da14585",
"support"
],
"html/editing/dnd/canvas/003-1.xhtml": [
- "c1d762365128b712d1bec611508e4fc478859b94",
+ "a4c1933a42fd075efdab5f9a09e02fd7f78ef2f7",
"support"
],
"html/editing/dnd/canvas/003.xhtml": [
- "9b535ff567cfc74e1f250255d46b7ee5caa84934",
+ "b694ab3fb1f5da5abec397012c277d2f3244bb57",
"support"
],
"html/editing/dnd/canvas/004.xhtml": [
- "e9fb6e92505ac2857f3b16b66381590b918a900b",
+ "3742c51de7b898ef55255b8054d07f2dbd0bd11c",
"support"
],
"html/editing/dnd/canvas/005.xhtml": [
- "ea313b5304e41dc583d77b5921458f66ab8c395d",
+ "41ee6b6af56063ce6906a9397cd0dd49c151af4f",
"support"
],
"html/editing/dnd/canvas/006.xhtml": [
- "f3ca0c3a2bf1e1ca9bcc4433a5824ed608b5650b",
+ "636d9f561ea73fbf9c76b866b2bdb5169a64f63e",
"support"
],
"html/editing/dnd/canvas/007.xhtml": [
- "096ccd27482ef1f6fc08cce96e380a518d22d324",
+ "e8de510b0ea745c4ef0ac4c848f218ebd2c83dff",
"support"
],
"html/editing/dnd/canvas/008.xhtml": [
- "0da2981bef5f73bd1335af972903aa2a3f6c67c1",
+ "0fecba9a80d3168aaea464b2d7a18863fb14ee84",
"support"
],
"html/editing/dnd/canvas/009.xhtml": [
- "cb80e22f43a4d4ef3b4ab4fff8953adb5bfbc26d",
+ "6d7ad147b1577f15cda3ca8cadc7c3f8402d80d3",
"support"
],
"html/editing/dnd/canvas/010-1.xhtml": [
- "183878e7af9f67876d11d954e5d69edb5d507a59",
+ "5dec52bd28e2364695bade6dbd8b7987780402ca",
"support"
],
"html/editing/dnd/canvas/010.xhtml": [
@@ -579466,111 +586015,111 @@
"support"
],
"html/editing/dnd/canvas/012.xhtml": [
- "e811b0316aea33583ad588361b714a2d63374435",
+ "858dcb5e7ac5bd7353d57013bbdece2492438b7b",
"support"
],
"html/editing/dnd/canvas/013.xhtml": [
- "0eb0c10dd95d1917017396778889611632e39bd2",
+ "9e28ff8902aa788e14cfdc8f610c5c440e32cbf2",
"support"
],
"html/editing/dnd/canvas/014.xhtml": [
- "3b2be9c21d4d7e8db9c74775f678d840a3ec484f",
+ "078e533b53ded409757e28dfaeb831267cf89b78",
"support"
],
"html/editing/dnd/canvas/cross-domain/001.manual.xhtml": [
- "223cfc670bf6bf646e60f7999445f27b4462572d",
+ "0244b56893aca3f8ecc753ba6fb8a39c52d109b1",
"support"
],
"html/editing/dnd/canvas/helper-drag-me-green-box.xhtml": [
- "589965e23ff624365929851f545368da8dede88d",
+ "ae2bb9c800762c962da939661eac8ccf84359c8c",
"support"
],
"html/editing/dnd/canvas/helper-drop-here-canvas.xhtml": [
- "5186014cc341959a0ef1168ef35b80ec3be4f774",
+ "7f47dfa25d6e8ad4254b346e78a85970a4b15f0e",
"support"
],
"html/editing/dnd/crashers/dialog-001.html": [
- "aa39f8276af4880e6a16d50937a5d418e4dd2b4c",
+ "e44bf65332c62960e7524729160d0e6020ff3172",
"support"
],
"html/editing/dnd/cross-document/001-1.html": [
- "6c893edc75f7182c4ecc91e58b810d1a38b2ee54",
+ "c50fd160222c5cf3903092e8a310a75f78d03302",
"support"
],
"html/editing/dnd/cross-document/001.html": [
- "586342248b107f101a0ffd92ea3def6305669776",
+ "c1127e71064fca74a252ede3790007e548eb99bc",
"support"
],
"html/editing/dnd/cross-document/002.manual.html": [
- "a9d3e3b030c8492ea865d306435fe3c75fff845f",
+ "5085fe6eabdbd399fe0b0e1e0b8ea4462da55fce",
"support"
],
"html/editing/dnd/cross-document/003-1.html": [
- "f4a06dc49c7bd8f9708ade6db0a81d685d7e6349",
+ "c97f84e931d99e45861f487f46dbaeb599faf27d",
"support"
],
"html/editing/dnd/cross-document/003.html": [
- "42ce27ee00176b87d5c6f356b5b0388e838bc855",
+ "2b79c202f553036e4611cef7679da03f1ffc6b7f",
"support"
],
"html/editing/dnd/datastore/001.xhtml": [
- "6ada93c303445aeacceee4dec72d6d5138d4e117",
+ "cbfe1701d57968874c26a82f30acfede67946494",
"support"
],
"html/editing/dnd/datastore/002.xhtml": [
- "c056b4bbf65857556f5b694c8b098e47119e1d82",
+ "9e72ebc2633f17597d0284c853d3b5cad8d7ee45",
"support"
],
"html/editing/dnd/datastore/003.xhtml": [
- "f7061f419ad5220110c8e521d030ebdded10cdf5",
+ "b732ffdae1a675e1d0f61fa9240ec7b874a52a3a",
"support"
],
"html/editing/dnd/datastore/004.xhtml": [
- "f9c62ccbeba2ef4667a425ae547edd670c37b99f",
+ "ef0cbd76359951f75b21c9f249bbe5c1054f0f5b",
"support"
],
"html/editing/dnd/datastore/005.xhtml": [
- "ef97a94405ef0448702c466673e116f587528e5b",
+ "b8b6fdcd3d2f25b6faf662a09ab2999944b76469",
"support"
],
"html/editing/dnd/datastore/006.xhtml": [
- "c569325cc53e928e8eb0a319f012078193cfde57",
+ "0b132084e5d296fdb72c011a2f14f3e5400c7453",
"support"
],
"html/editing/dnd/datastore/007.xhtml": [
- "4cff7acf01277bf30665efd12dbc14db76e58c2f",
+ "7592c0eea5e8284a88380d92820cc8aea1c07b4b",
"support"
],
"html/editing/dnd/datastore/008.xhtml": [
- "bef29ac28a91f50586f48a72809d614ad5e57a37",
+ "e8a938415e69e5e2409fa9ace70385cb8b8c0330",
"support"
],
"html/editing/dnd/datastore/009-1.xhtml": [
- "a4a93b9ff882f1019cc076ce5ccf70b7d750b1e6",
+ "7999b9d244baa5b08abc3f778697ca7504d1f05a",
"support"
],
"html/editing/dnd/datastore/009.xhtml": [
- "3554d41bb02ffa0ce8ead9cf592d0fa5a4cd51a9",
+ "19683782c5f97a11d6387aaf04b2b88d4f8e00cc",
"support"
],
"html/editing/dnd/datastore/010-1.xhtml": [
- "ee71ceb72d678a3dc3548a8685fdaf95a67acc17",
+ "f9edcf322b957fedde46ad9a1c9c06743a4c1fa6",
"support"
],
"html/editing/dnd/datastore/010.xhtml": [
- "379158d4db7a985268f0736b60903e7aa3877bcb",
+ "839fdc009e72608d941f196f554e2306cb18f435",
"support"
],
"html/editing/dnd/datastore/011.xhtml": [
- "7d64aaba2698dc607ab65c07ea6438f3965c2cce",
+ "164426a072d0ab8316dfb972421beea259d0c14a",
"support"
],
"html/editing/dnd/datastore/012.xhtml": [
- "c82c70e029c4c53525216b28bdfe65e225be5ebf",
+ "441571cf63003deebbfda89733b4bff09a887873",
"support"
],
"html/editing/dnd/datastore/013-1.xhtml": [
- "01b8b51fc67e005915a8cf4ca5b50722a5b28dcf",
+ "062116bd5c236902d9a264f4ac1b4156dd105ca4",
"support"
],
"html/editing/dnd/datastore/013.xhtml": [
@@ -579578,7 +586127,7 @@
"support"
],
"html/editing/dnd/datastore/014-1.xhtml": [
- "788340ff047a2f8699f6e2ea46bd63e40d7b2c1f",
+ "84b4d06f0cc71e054ea17399bde5a407f6ca5e21",
"support"
],
"html/editing/dnd/datastore/014.xhtml": [
@@ -579586,179 +586135,179 @@
"support"
],
"html/editing/dnd/datastore/015-manual.html": [
- "cff27c8b20b2144096042db4ffaa669c5f37c00e",
+ "e83d2bbe807f1e3e0ab85e7ddcc4d260ccd02ab5",
"manual"
],
"html/editing/dnd/datastore/016.xhtml": [
- "edf4f8f459927e30c750f0fff7598e1efe1174f2",
+ "2f991d03217f2c7e224e4bda30b8323368623863",
"support"
],
"html/editing/dnd/datastore/017.xhtml": [
- "0d5e354c89d6c39a9e88339bfa72acb76a7e21f3",
+ "3c4af572ccbc3222d1b4d98478aa4a5aa0bf4b6a",
"support"
],
"html/editing/dnd/datastore/018.xhtml": [
- "e5d800f1664a201731a408bd5bd94e83b171f086",
+ "2c751723f131d65546cf7e461b709035241233b9",
"support"
],
"html/editing/dnd/datastore/019.xhtml": [
- "45ce63e603ddf2d02b2dcafda94458645cfad293",
+ "be50162e53455ad33c00c1f86180ef1353586ed2",
"support"
],
"html/editing/dnd/datastore/020.xhtml": [
- "90642648299a8d7c8bddfd849cc2c1ccd392a9bc",
+ "4e4029fd4daa875c9850ae77228c39bac2db62f1",
"support"
],
"html/editing/dnd/datastore/021.xhtml": [
- "21a7f617c49913aabde18b8277e501464cb98422",
+ "8ff6517eebc02b23d93c6ed2e4a612e097f4b6e4",
"support"
],
"html/editing/dnd/datastore/022.xhtml": [
- "acadc5df571b3870f4ce004d95f9d3c3957f2972",
+ "64dc1b3382a73bd0815fc3f97fe542281831a622",
"support"
],
"html/editing/dnd/datastore/023.xhtml": [
- "e530e1c958bdc7d03a9041b0467e8ca6e5a5d00e",
+ "1b5d31c97332dc077c4176e0b6cf57bbccac5c0b",
"support"
],
"html/editing/dnd/datastore/024.xhtml": [
- "b8818503f0302da271bc8009a7d14107cd0be21d",
+ "b41f9d3b352e56528b4f444b8d3b8349f65e28c0",
"support"
],
"html/editing/dnd/datastore/025.xhtml": [
- "bf3c728d9c3876ef9d38fca686385071237aa5a1",
+ "2f457c9ee14af9ec3ff717411d0d47bf5e306094",
"support"
],
"html/editing/dnd/datastore/026.xhtml": [
- "649ecd3f7db2dc928b6b68c2d9ac4b38481f9c50",
+ "439fb6ac660d7f1e360da13a3d3a9f27abd0f9bf",
"support"
],
"html/editing/dnd/datastore/027.xhtml": [
- "e22380b9dfc402b65227c478e03c25b173068aa3",
+ "234b8cb4049f8fbe10d8a1454dfbeec126eb3484",
"support"
],
"html/editing/dnd/datastore/028.xhtml": [
- "bef72fbd38a8dad5fd8f2d7490f8e5172ccd927c",
+ "9a0a3f5cb589be346592037231758e7a1d8b5e84",
"support"
],
"html/editing/dnd/datastore/029.xhtml": [
- "656af596fe19424e16c200a6b8123c22cf5e0912",
+ "8bfb9934d0619b6ff8e56148d0e47f0e54ad672b",
"support"
],
"html/editing/dnd/datastore/030.xhtml": [
- "4d82f0c1ca17a08a2835470d719c8b3716e5e586",
+ "a8be17fffcd504adecc98cae68b051d8d01275a5",
"support"
],
"html/editing/dnd/datastore/031.xhtml": [
- "602725c1632fd796b037e9568f42308cbdb1cb43",
+ "68dc1f705a6a40ddf58c08373cea219efbe38881",
"support"
],
"html/editing/dnd/datastore/032.xhtml": [
- "473ad78a90f7c373343b036d80943a76df8c7c0f",
+ "fb66aee18cbcfb81438c71873d269feb10fa1483",
"support"
],
"html/editing/dnd/datastore/033.xhtml": [
- "805924d92f90ef9a193ee818678c7120f7e9d62e",
+ "59bd90bf64dcc0187ab086b419097d7cffdb092c",
"support"
],
"html/editing/dnd/datastore/034.xhtml": [
- "6fd9493dbfdfc0a2c21bc62609866ca2ac36ffce",
+ "24c3d37f0ef1fe9e786a635558178f2aeb7cc091",
"support"
],
"html/editing/dnd/datastore/035.xhtml": [
- "591694a55debdd8dc4d516d8843ccb793cb57823",
+ "fc3fbdf760497041250d16ca1c0deca0b9aff964",
"support"
],
"html/editing/dnd/datastore/036.xhtml": [
- "34a3d5c5465d52ed0c9cea1ff2cd95c68fed0022",
+ "c4699f0292687a2d14968361fa33270e364f2a85",
"support"
],
"html/editing/dnd/datastore/037.xhtml": [
- "a75b03371ed99117f450d0ed8a7a73fa51e7481d",
+ "9c935b1e37ad18d8e2813a58deb1b34221831482",
"support"
],
"html/editing/dnd/datastore/038.xhtml": [
- "6348d44b7b70c52e1ee12ad2d7fc572e9d2ace99",
+ "1a8bf0c644a7be3303f6900ba36a8d478cd4166c",
"support"
],
"html/editing/dnd/datastore/039.xhtml": [
- "52d561699193c2930fbc6f03f9508beee61730b7",
+ "074f91b9f492391604f46479546df38042fe4dbe",
"support"
],
"html/editing/dnd/datastore/040.xhtml": [
- "b9c076d77017dbaeedf472d6ec3bfe6160e9a32c",
+ "9317095e8fb3c757038c269c71c5d12d817db080",
"support"
],
"html/editing/dnd/datastore/041.xhtml": [
- "92e4d94ed77a53d3a653017316a3c5d787153aec",
+ "338346dff3930e13435509ae3be7a867c2dd2357",
"support"
],
"html/editing/dnd/datastore/042.xhtml": [
- "cf0686e1b9cb042e87cae8b748ed5b9a828fe144",
+ "e874d3f6a68549b11941c56ff31cec5a73939410",
"support"
],
"html/editing/dnd/datastore/043.xhtml": [
- "6c1361b97c157e9d0f965cc858017ef6c068eea2",
+ "1246ee7632e388f4f004fada7de2f031e2e9829a",
"support"
],
"html/editing/dnd/datastore/044.xhtml": [
- "96d64f9d8b572fc7fdfec3bff35ad8b8c4f173a2",
+ "620113902d06e9084155f46686a038afd0452551",
"support"
],
"html/editing/dnd/datastore/045.xhtml": [
- "e0e5deb255222eb43b97e24cab4ab5f269406544",
+ "641af47539d994e0af43127a99cb6903d2028a32",
"support"
],
"html/editing/dnd/datastore/046.xhtml": [
- "19ca0b50603252a91c9a976d39542f196cac93f5",
+ "0be3a775f70c2ebaea5896ac23e6a25bbed9efb5",
"support"
],
"html/editing/dnd/datastore/047.xhtml": [
- "ca517ff634ffa17a6090538b48dec7881adb5607",
+ "73afbbe96610b15316dba954d7fc26e40a350f7a",
"support"
],
"html/editing/dnd/datastore/048.xhtml": [
- "3c95ee13d0b59c5a019b77e93f213bc9a0cfa444",
+ "99bc91a0f95a473481b4fb756f3e22696bbb4aa0",
"support"
],
"html/editing/dnd/datastore/049.xhtml": [
- "eb545d66ee312900feb05713aab5a05e0c79d7da",
+ "f9c711d777180ce4474d928f995c81eb092ef1df",
"support"
],
"html/editing/dnd/datastore/050.xhtml": [
- "ce37877ea50a51ed1030e97e00ec91d950e37823",
+ "4037bd19d75d76fbe16f9f74d92f28f13a3a31e7",
"support"
],
"html/editing/dnd/datastore/051.xhtml": [
- "387c6203e0fa4aa2359c9868d20968a494433922",
+ "b2d0f1cac0ad502b90a9ea6ccdc57d4b9d45d518",
"support"
],
"html/editing/dnd/datastore/052.xhtml": [
- "b9e652b527bef1aae8f431a5a6dfc623ca686c6b",
+ "62e03b7674a47ddc8ba866cbedcb92dc7623da1e",
"support"
],
"html/editing/dnd/datastore/053.html": [
- "9ed87e247826530f266634b28708c072c9fc3ac7",
+ "1ba076ae17da301816f8c2ff55e57497bf97079c",
"support"
],
"html/editing/dnd/datastore/054.html": [
- "b96eb8f1313cb8de44cfb40c3d7584428aefc3e9",
+ "ad145d08fa1138a08aa80794891bb1d3eaba509a",
"support"
],
"html/editing/dnd/datastore/055.html": [
- "5b3b90c0eb8ca85784b9ddf5a4ca2e95b323676c",
+ "97e3264ff26d2ddb7be954b96b9871a4f05a97e1",
"support"
],
"html/editing/dnd/datastore/056.xhtml": [
- "65cec0766726a1f4b05eab24023ab3e2a8d61354",
+ "dcf99c6c630abe58a33deafa4627d1e925515621",
"support"
],
"html/editing/dnd/datastore/057.xhtml": [
- "2be05f0a14707ba23b8e876f4d7aedbd47cc0135",
+ "edf84eb03b6b4e58971c21318933e8d9825721ca",
"support"
],
"html/editing/dnd/datastore/058.html": [
- "3b920bebf4ac1d4f70df4f2fc7189e5d0c697e4d",
+ "13057825bd2f336ef6a7416706d2ab2e35699ae0",
"support"
],
"html/editing/dnd/datastore/datatransfer-constructor-001.html": [
@@ -579770,7 +586319,7 @@
"testharness"
],
"html/editing/dnd/datastore/helper-drop-box-here.xhtml": [
- "1e499a114f3c920085a511689b4e39cc37969957",
+ "8fa0b1f257d5b9658e9bd4d344ffeb55445a3bfc",
"support"
],
"html/editing/dnd/dom/draggable.html": [
@@ -579782,7 +586331,7 @@
"testharness"
],
"html/editing/dnd/dom/specials.html": [
- "bb40f046d5e9870380b10f7d8451accc022ee165",
+ "57c2ec32caff6ecf676ff2bd5b526d690284019c",
"testharness"
],
"html/editing/dnd/draggable-areas/border-radius.html": [
@@ -579810,159 +586359,159 @@
"support"
],
"html/editing/dnd/drop/001.xhtml": [
- "2b74abc5eee9ab3e9fa5d7de22692ec79336af78",
+ "24e397850658b6053de04bbfdd29022524be3d40",
"support"
],
"html/editing/dnd/drop/002.xhtml": [
- "6e527248081a6ac9ca4bdf4915d055269477fb0b",
+ "5684c0f5f5b64e88ceb751e10f39cf0d49b855d8",
"support"
],
"html/editing/dnd/drop/003.xhtml": [
- "51d5e2fa022a5687201519d95af8efad852c026c",
+ "fbbaf3f7eb0bbacf3736e383049ad9aabfbf77a8",
"support"
],
"html/editing/dnd/drop/004.xhtml": [
- "64576e451a193b073b97a8dc6cc0075fc83a7fcb",
+ "7266f31a33822481284c04fb968f3590f3d1b341",
"support"
],
"html/editing/dnd/drop/005.xhtml": [
- "1edab5af8b06bac648a66f82236d43ed79b22018",
+ "92cb23dfc05bc31c57f01e66775d7f96930df626",
"support"
],
"html/editing/dnd/drop/006.xhtml": [
- "ac331203b470abd8c4bf35990c7f1c8d985546c0",
+ "6e8290ab04a3f8e658a0d30ec9250eab8d3f6135",
"support"
],
"html/editing/dnd/drop/007.xhtml": [
- "38563ca8843131922ce77915efe3d5d11eba1f26",
+ "c5d10cbef1fd6098274d763454f0a71a4503dee6",
"support"
],
"html/editing/dnd/drop/008.xhtml": [
- "a4d47dc35a02c118e0f5341ffaf49a0e99ba0ec7",
+ "3f58baf2a6ac2e915d6a00a546ac9ffd7cbe141f",
"support"
],
"html/editing/dnd/drop/009.xhtml": [
- "87a0d351120ff077c4cd023a10fafcd5cb3df3ba",
+ "b047bf84999de310acdde45e2608fb48f12993f4",
"support"
],
"html/editing/dnd/drop/010.xhtml": [
- "6cbf6c0a31054c3f3001f545ea37d86c669d5e76",
+ "c631a158e3f05be04f5a4d6a98ec9a698ba83039",
"support"
],
"html/editing/dnd/drop/011.xhtml": [
- "560f3aea6c1ccbb013f991897245ada3dfa89b6f",
+ "888897e501b49725e721a00d60045a0a6c24520c",
"support"
],
"html/editing/dnd/drop/012.xhtml": [
- "65928f2e142622e761fd902d1bd6a9bb2090c0d4",
+ "aa5fc552a18a226f36e50a7340d6965c1f9f6f49",
"support"
],
"html/editing/dnd/drop/013.xhtml": [
- "55f7e76af0a9c837e7045d61fe2ae140a4d6760d",
+ "fd127d85e5d969ffec5ddee7c667cd5cbb68bfcd",
"support"
],
"html/editing/dnd/drop/014.xhtml": [
- "376d2c35a74f22a8394ae0b03301a9897da2c218",
+ "31a3486801913119659be7ec1381ba3be2608441",
"support"
],
"html/editing/dnd/drop/015.xhtml": [
- "241932648916d3ebc90eed21d4b87ec93a00d262",
+ "ac7f273c0dacdcce78820c36bb67aff647d11cd2",
"support"
],
"html/editing/dnd/drop/016.xhtml": [
- "57e127d0727ea57696da2a187b5186c5b47ab7c4",
+ "db024d42c52be91b9a9738253a1b6c0e6a78484e",
"support"
],
"html/editing/dnd/drop/017.xhtml": [
- "87b1dfb5654e2abb63e2d971a5c89f52ed6ce7d4",
+ "c20f7ab937b9d611e204808c1dc0f32ef2b9fac1",
"support"
],
"html/editing/dnd/drop/018.xhtml": [
- "6f456ee9073f733291422817bc02148e3f67509b",
+ "27f1222021882b0cc46a24861b0d2e57bafd16d8",
"support"
],
"html/editing/dnd/drop/019.xhtml": [
- "ffcb1f247f80d478e4693d0b41343ac6909cb114",
+ "a8cb06c46b3f0634ad6650278d4b44008c7bedc0",
"support"
],
"html/editing/dnd/drop/020.xhtml": [
- "ad8fabf96313af648f69e9e72d6d95859bbcfe04",
+ "4c1fa13a3bc2f8d67e77e818c1aad0088a0a9a47",
"support"
],
"html/editing/dnd/drop/021.xhtml": [
- "17d0a028e1993686310e260d6bac7f86595913bf",
+ "1be0403c49267faba196f8cef27b6052e22b6101",
"support"
],
"html/editing/dnd/drop/022.xhtml": [
- "e13f6895ee96a24f3f7c5dced0e47776ff7f8e81",
+ "d9201be6529872cac83ceb5f3ac381ba463d35f8",
"support"
],
"html/editing/dnd/drop/023.xhtml": [
- "20ae0c62b88b3c37d8409192b1dd2676c0477a67",
+ "ca8c969c96c703eceae44aadabe5a78f8d5fc9a7",
"support"
],
"html/editing/dnd/drop/024.xhtml": [
- "713aa16f34d004a2a366baaa87411ddb8d5149c1",
+ "4e56ffe57f1b1f26f8914b4b35adf9d7c704e4a1",
"support"
],
"html/editing/dnd/drop/025.html": [
- "a8eb922f0a718eb3309f5695cb47fa6eed29ed7b",
+ "919a5fb16761c6d1eb8f1773d909453a13463569",
"support"
],
"html/editing/dnd/drop/026.xhtml": [
- "5d253fb6736226833969d2c5d1f48f84116dd9fc",
+ "44136d8d16ed2b4e08b1ec3e5ebb511118e9abf5",
"support"
],
"html/editing/dnd/drop/027.xhtml": [
- "969ac5055934d99d03a147ac816e5ebebcdd142f",
+ "7324b4d272fcfe4ec1d71648327e215aedbf275f",
"support"
],
"html/editing/dnd/drop/028.html": [
- "2f6f9d7be9a718d35ac61911edaa9cccf7e26830",
+ "fb26a6d104f1fb191100547f336d13dd97dc3a43",
"support"
],
"html/editing/dnd/dropzone/001.xhtml": [
- "05a1316e0bcd5cf809163ff3122c3ee07ba4fa17",
+ "38d79aae8f3d56968d8986025054ddbbb747f050",
"support"
],
"html/editing/dnd/dropzone/002.xhtml": [
- "7f0781b0a40a43fc473b624de0ee0206624913f8",
+ "44b291ee5a51105907b17f0e691cdae46f03e57f",
"support"
],
"html/editing/dnd/dropzone/003.xhtml": [
- "b29a01b43b94dbbe14ff350b9b8bcfea205c8452",
+ "c0b249b4ec5dea43e0056e6943aa74df95012e7e",
"support"
],
"html/editing/dnd/dropzone/004.xhtml": [
- "3acda27a371529e9b8ea5e356807de538a771454",
+ "b6301de35bb5d2930e57fdc59c0db4e6d6104126",
"support"
],
"html/editing/dnd/dropzone/005.xhtml": [
- "45ae9fed34960b94f45814566026e46249a0d6f2",
+ "633f73e16434c6c30ccf6b3f6e9b6d1fdf817c1c",
"support"
],
"html/editing/dnd/dropzone/006.xhtml": [
- "7c18415c9c5aec973ca451a6b88083bf602cd1dd",
+ "87097f7c2d92f35fd8a983ce5e02cb021b8efd12",
"support"
],
"html/editing/dnd/dropzone/007.html": [
- "be82258ff1f8af84b921f884d8ff1caa510ebe3b",
+ "3e87148c605eb3371091bb6fc371850b6ec0191c",
"support"
],
"html/editing/dnd/dropzone/008.html": [
- "e013a7b2096975f4ae8a8ce42a8a09202b758f26",
+ "8ddc3e93df7e8916894ba3801e43d3e66b78c4d4",
"support"
],
"html/editing/dnd/dropzone/009.html": [
- "9e58e53347c70e2994d44b578aa5fd3d8309dca7",
+ "ab37e7ed86b74fb7fa84c20eed26c4f39c6e9b9c",
"support"
],
"html/editing/dnd/dropzone/010.html": [
- "2b7c3a4f357b66129c778e9545ec4cdb4878c8ba",
+ "30fb52bc55bf02f84e378e3349b32043dc6f59eb",
"support"
],
"html/editing/dnd/events/001-1.xhtml": [
- "e53e5f7f02e79d26d0c03bbfb17774223ee2a1e4",
+ "827b751a01bfffcf86c41f931a5a81bc2321da5f",
"support"
],
"html/editing/dnd/events/001.xhtml": [
@@ -579970,7 +586519,7 @@
"support"
],
"html/editing/dnd/events/002-1.xhtml": [
- "5a5725f77d998ac27cc1c2e3d7a4a99819f38f11",
+ "63705a995d1f6ae0520b868b2547d1e79fc7d07f",
"support"
],
"html/editing/dnd/events/002.xhtml": [
@@ -579978,7 +586527,7 @@
"support"
],
"html/editing/dnd/events/003-1.xhtml": [
- "1369cc8644efd1570dd5ef3c052444cc3c8f7bca",
+ "96ea6854e84e1413152b5c3b1b01cc6ea5b2af30",
"support"
],
"html/editing/dnd/events/003.xhtml": [
@@ -579986,167 +586535,167 @@
"support"
],
"html/editing/dnd/events/004.xhtml": [
- "13064c739d98dc443392edcb8c2ecadc24d09774",
+ "c3506bb0049272373ac42d553b072aa159e114f3",
"support"
],
"html/editing/dnd/events/005.xhtml": [
- "f80626443852d4a535b8116940b938560636a3bc",
+ "b4e1157d2f0126e9f71eb32c895fc1a6ba7b8199",
"support"
],
"html/editing/dnd/events/006.xhtml": [
- "e422e7d7d1611b265ee8c94a71d6b447fd1ebb24",
+ "c6e79411523b04c5e847bb6d3be4cb899a7f03af",
"support"
],
"html/editing/dnd/events/007.xhtml": [
- "dc57e0784a950ec9a5ffa7a888573f8f98f21b61",
+ "b67e51e7cc1b9c64950e77ddf12fcc14ec717ba0",
"support"
],
"html/editing/dnd/events/008.xhtml": [
- "71b1252ac1fd78b016aa51f7dcffa5bc394adb50",
+ "56c35c09149431ab5a409f68ed0d909c3113c1e7",
"support"
],
"html/editing/dnd/events/009.xhtml": [
- "7775804f1501774eaf0bfdf978b524414a213cfc",
+ "1e326ab75e407fd89fa54957542311ce5bb91cec",
"support"
],
"html/editing/dnd/events/010.xhtml": [
- "a5d45c19227b7729a39661a3fdab1a9a3939f28c",
+ "c8bd7d148f420202fc27b4aac700b1715d0f7d59",
"support"
],
"html/editing/dnd/events/011.xhtml": [
- "5f3fa9542e71314c1800473968fb147d0ab67cb7",
+ "e0257f91ca9beb0c16e347c5f661124b0bbc0d90",
"support"
],
"html/editing/dnd/events/012.xhtml": [
- "9f6c3513981064bfe37226abf1a8b6afa21e4f6c",
+ "ec4aab4f6fbc08bf8eada5a9409799e80704b930",
"support"
],
"html/editing/dnd/events/013.xhtml": [
- "1de12e73fc6363a962792b4f2e3de7f0fe127067",
+ "85cf43959bbda0db79fdf4979081da2b0eb62086",
"support"
],
"html/editing/dnd/events/014.xhtml": [
- "800ee1fa94e9787496aff0a6748b5d9e2a5ba208",
+ "143b9d176960169a8ad94a5e1b55553c2f7d8ea9",
"support"
],
"html/editing/dnd/events/015.xhtml": [
- "4fa34b1adb08a30d7a1bbe7af1f5ab31d30e665a",
+ "93908a60be4fcf0b8bb9320ea1ac4aec64458a06",
"support"
],
"html/editing/dnd/events/016.xhtml": [
- "f74364679d3300e15f10f2e11df2d37983ea0a1b",
+ "5d8e2dde7ee3f99b6ae01694a08cf4087fa395fe",
"support"
],
"html/editing/dnd/events/017.xhtml": [
- "e58604cfd42af6123ad7361a417f1490e193e09e",
+ "f4dfea1daf60ef462e9df9f51afa7b7ef85614fc",
"support"
],
"html/editing/dnd/events/018.xhtml": [
- "bdade2a630755ecee63261c67738f7693903b0e5",
+ "9522ec71a9abec838652ca9d9b6d3d19f20fb9af",
"support"
],
"html/editing/dnd/events/019.xhtml": [
- "b7d21bc0dc10913fe523911827367231a78af60f",
+ "e202b47210d4a0e581257e37e9f1673de396e9c0",
"support"
],
"html/editing/dnd/events/020.xhtml": [
- "a639e4f6cd5c638a38a99660f4fa6f5bcbef4d76",
+ "8e41facc264e47d3d710960c9af79ffb70bc5521",
"support"
],
"html/editing/dnd/events/021.xhtml": [
- "d4e7e7f65cfba137f4790f862506acc74a5dedb0",
+ "da9256c76d44474226f13057c36b1f09e2d49c93",
"support"
],
"html/editing/dnd/events/022.xhtml": [
- "c9e02c8b842f185990b994715715001a8e5d5273",
+ "82ed6ffc13d019b51f17ab93b524b64070daaf2d",
"support"
],
"html/editing/dnd/events/023.xhtml": [
- "9ced58c1a0acee9c5ed245498663cf56c782732c",
+ "9dbbefb6fce8490ef6f5174f1edbdc345b5a732d",
"support"
],
"html/editing/dnd/events/024.xhtml": [
- "0d9717aa4152cc36d5a563cf18aaca0958f48f52",
+ "72cb9fab3aeeb35860f1716aeca4de7e3b4b0159",
"support"
],
"html/editing/dnd/events/025.html": [
- "a2cfc2299e4771a4ace0d1958ab9b5beead7cc36",
+ "3d56df56eb12387d12de79d21bf0718038d6b08e",
"support"
],
"html/editing/dnd/events/026.html": [
- "f11f4a65e63a24cc109b7d8ab7720bb67ff34c21",
+ "04dfa5ed8a913701537db96adc3e8e3cfa65bfb2",
"support"
],
"html/editing/dnd/events/027.xhtml": [
- "7dde484ab44ceacbe77c67b9da830edaa61046ef",
+ "5dda34396e953addbd4e4d874907ab90ee464c2f",
"support"
],
"html/editing/dnd/events/028.xhtml": [
- "81fe43c653345f2ca59229a22d6d71cdd63f7572",
+ "d1e60cef913716f04cad91f76b7bd0e0f5e4621a",
"support"
],
"html/editing/dnd/events/029.html": [
- "e3b4ae30677c9aadcc0a6d517f8a68562928c189",
+ "4e61f9e709a782c046610e60c29a56b1e674fae7",
"support"
],
"html/editing/dnd/events/030.html": [
- "3feb80e8187868c33be61a087ecdfaee22d36790",
+ "18d0b39dd25d2e73f1d798b06b95a6236c44fc1e",
"support"
],
"html/editing/dnd/events/031-1.html": [
- "28296e4950c07429d4521425308c8e53df6e5e29",
+ "293bcdcd834210bed5b32deae483963b3b0f1bc0",
"support"
],
"html/editing/dnd/events/031.html": [
- "ff96177cf6d5c1b7ddc3137d42af46d29e9f2d06",
+ "20b9012cd4e572108303f9829f989657750cc86a",
"support"
],
"html/editing/dnd/events/032.html": [
- "eff8124ae93e2f92a705c7179d0f58b7d74a89f6",
+ "4fc8397f356715dd6613eff81bdb9b812d763ce4",
"support"
],
"html/editing/dnd/events/033.html": [
- "a0abf6ae911fbff673df13109e9bb5b0b7d26297",
+ "e932dd74947e1bfd71390045ad6c21fa90b76acd",
"support"
],
"html/editing/dnd/events/034.html": [
- "c4a8c0efce7b1602780b49396abc79a718d6f769",
+ "8b7934beece59f3ab74e2a33879b068eb303efdc",
"support"
],
"html/editing/dnd/events/035.html": [
- "0237abe5ed6da9d548133160ae53063c0d43f578",
+ "0f57569761fc6b7a771962859f9dd11a0e460cf4",
"support"
],
"html/editing/dnd/events/036.html": [
- "bcfab31c78851d54b05ff3334af272970a782b6f",
+ "55bf863fadc6348b4b9fc99e9fa13ad2c47aabd6",
"support"
],
"html/editing/dnd/events/037-proposed.xhtml": [
- "6d93b13e477b4d0d148e4f7aa0a0f7ec4c5d938a",
+ "5480afc39a425b1724b5adb0fe6ddeccc1222476",
"support"
],
"html/editing/dnd/events/037-spec.xhtml": [
- "2c28fe78f79d19611915e7fa28f9c9d74988b409",
+ "127b15a742b763d40cf928f4655cf06904a6389a",
"support"
],
"html/editing/dnd/events/038-proposed.html": [
- "0231aaec3c9f5c57e46bde4401a05f3035cef45c",
+ "923df22bb235d18644d268ba70b3924408cd1b19",
"support"
],
"html/editing/dnd/events/events-cross-document-suite-HELPER-1.html": [
- "cd13d615a5f942b10db8fcae820907eb74eb2a88",
+ "fa063505887984bc29a3428198d08a30191d7834",
"support"
],
"html/editing/dnd/events/events-cross-document-suite-HELPER-2.html": [
- "9bcaf35d029bc142a337d3f8dc6df2b2941a58c2",
+ "f4a03faa51d2393e6671acda67df43df2e7eec74",
"support"
],
"html/editing/dnd/events/events-cross-document-suite-manual.html": [
- "02144d85d673589b501a7a1973548df1a724d076",
+ "0e051592fc8cc2d2dd37f4275e1ec6dbb3f29131",
"manual"
],
"html/editing/dnd/events/events-file-suite-manual.html": [
- "07295f34a61d1ccd3e4072921f05f70723572d18",
+ "1e0629010837f83b4e829271bfe304b947305312",
"manual"
],
"html/editing/dnd/events/events-non-draggable-001.html": [
@@ -580158,23 +586707,23 @@
"support"
],
"html/editing/dnd/events/events-suite-manual.html": [
- "19f13dd3b94ddf5cbc6889c48d4050732551eaa5",
+ "6b940e48678f498192e3cfe531e3e82c4d5affc6",
"manual"
],
"html/editing/dnd/events/helper-drag-me-input-with-circle.xhtml": [
- "bb1800380a2141775188573eb5018f40673874c8",
+ "a9d6758ba3e0fb606ddaf5a47f6201c79656a859",
"support"
],
"html/editing/dnd/events/helper-drag-me-link-with-circle.xhtml": [
- "b122c8d92f44aad70e2df292c49225685d6b6c80",
+ "65a9d9e93a6b632256bc98fd9d153f71d860b745",
"support"
],
"html/editing/dnd/events/helper-drag-me-p-with-circle.xhtml": [
- "efd20911b9b4bc4a9fcdb844837c5af9ee5ee8bf",
+ "2507840b7070792b553b52b4d800cf2ed3382cf1",
"support"
],
"html/editing/dnd/events/helper-drop-here-body-circle.xhtml": [
- "f0507c80eeed6374b08db1a2d5f2191f346cb42a",
+ "14a572f8bfa03bbc9acab61cb67e89acca40a02a",
"support"
],
"html/editing/dnd/events/relatedTarget-attribute-manual.html": [
@@ -580182,35 +586731,35 @@
"manual"
],
"html/editing/dnd/file/001.html": [
- "dd64d4fd33adc1fbdd639df9696ae549bafcc195",
+ "28e4e1d0e06a8c300c116aeb2d07e4808bdf56fe",
"support"
],
"html/editing/dnd/file/002.html": [
- "b43b75e6d173438897948131dd53d5929a08cedd",
+ "62f40d477019e663e377f314947c28ea6b556864",
"support"
],
"html/editing/dnd/file/003.html": [
- "74fee13c606a97bd562c7822274e69b33e5b94ba",
+ "df5bb0614ea6c7135caead8c5a1258bf981aeb13",
"support"
],
"html/editing/dnd/file/004.html": [
- "9e9bb61de1a07c4e747dbc19aa127678b6615de4",
+ "9f73256a0c120d543fe395764a0030ba05c0bb76",
"support"
],
"html/editing/dnd/file/005.html": [
- "836b03d4cfa27571027747e4eb9618147e324511",
+ "850559ce2ec7a47699770b66e8e9ceb1dded3e8f",
"support"
],
"html/editing/dnd/file/006.html": [
- "1876c1b99cae43c41abec8bd1bed4c33b1680703",
+ "23699891a80a21e3ca978d8c8eaf6246e6959997",
"support"
],
"html/editing/dnd/file/007.html": [
- "3999417e0542558408b22a640068a865df796a56",
+ "21851c97db234d854576e3ea6e1029ffed38a761",
"support"
],
"html/editing/dnd/file/008.html": [
- "049dc5a8b384dc5b22cc9fffb026b4c3d25ba581",
+ "081def5342c9b8bb426812bef312e6cdee3dd66e",
"support"
],
"html/editing/dnd/file/009.html": [
@@ -580218,11 +586767,11 @@
"support"
],
"html/editing/dnd/file/010.html": [
- "373ba0773617f9e48f0e118c700c88f710e3431c",
+ "1ef3da51d85dab71e9986645a1ffecfed8fa2436",
"support"
],
"html/editing/dnd/file/011.html": [
- "516dbd90c306decfc8826776234e79747dce4d0a",
+ "6c5de23f6a63e817d60d1357020ee90f71193372",
"support"
],
"html/editing/dnd/file/fail.txt": [
@@ -580230,83 +586779,83 @@
"support"
],
"html/editing/dnd/file/prompt/001.html": [
- "3b038b1dbe8aa7f2139861add4ffb20c073c4e61",
+ "a3c1af868a0d519cb3b814b8f9bfd9a4f721f8ed",
"support"
],
"html/editing/dnd/file/prompt/002.html": [
- "ce95802b88f67f96a1fd088707cdb3d55a3b620e",
+ "fb4b331d47590bc40cb5f4741b4f0540effab556",
"support"
],
"html/editing/dnd/file/prompt/003.html": [
- "152421bdd79032bbb24dc158f8d2e5d36e868d61",
+ "0a706328fd62c589c31bf121f9b199716ca72ebc",
"support"
],
"html/editing/dnd/file/prompt/004.html": [
- "ff1a7a6035d654276c47edf8fa9d77d2a3e81b9d",
+ "3277b549dbd2a60cc7b116eec4dcf5b96d8527c6",
"support"
],
"html/editing/dnd/file/prompt/005.html": [
- "35b24eccf4cebfb80bcfd1e20de37d1f4c08f9ea",
+ "0b3f4681fee32c8bd34486a4f2c85030a376c598",
"support"
],
"html/editing/dnd/file/prompt/006.html": [
- "a994f0d52ba7de818ae50e02a1312dde1fc60ef9",
+ "0e3d4a5b3491777183ceaa1286e3fcdb78c748f5",
"support"
],
"html/editing/dnd/file/prompt/007.html": [
- "cc567261a44ec157699c863066648fdbb1b9f4d9",
+ "b8bd960cd9ab71363ee41ae4f75cb383029fbdec",
"support"
],
"html/editing/dnd/file/prompt/008.html": [
- "c4b5a97c8674f387a147bf2d9be73298f4ec4236",
+ "17f79faab2a7fefed29a7eb3b20937724b47047b",
"support"
],
"html/editing/dnd/file/prompt/009.html": [
- "4cbe22684743519f0f364ad4fdae854f1ad0a385",
+ "a87042ac7c4b4d2f76a4ae38e8717ad508d41b28",
"support"
],
"html/editing/dnd/images/001.xhtml": [
- "250d44537483980dd9d32f60abe990d84896eed5",
+ "07f56583cb24f8fe0879f16c23c61fd5bacac0da",
"support"
],
"html/editing/dnd/images/002.xhtml": [
- "b698e485071a30546129407363be8227b0731b41",
+ "c4de19bb9e3f57b8c3c6c05349d7dfe25f51bdb5",
"support"
],
"html/editing/dnd/images/003.xhtml": [
- "9d6083ee6cc2726eb6ed4e24a9955c6cf9c7e7a2",
+ "204194b26b4dbd4c7de49cc91fb97c67ecce8b44",
"support"
],
"html/editing/dnd/images/004.xhtml": [
- "51ab53698851a4d3b0496e791ad4b2fc7eb15244",
+ "615c7fdd73a111bb1f6776b2160b6c3c74cfc184",
"support"
],
"html/editing/dnd/images/005.xhtml": [
- "24e75504fe6596908670d6d4990834aa4f369bf0",
+ "411e447ae0a593b7714528c4687bae016c5b4724",
"support"
],
"html/editing/dnd/images/006.xhtml": [
- "a13a245c7bef87fa3a2ae4ca448bb90ff0ed526b",
+ "773f5f00d54cc5b2e25e9240346e785b63bf19d8",
"support"
],
"html/editing/dnd/images/007.xhtml": [
- "fae99b17f75f390a775d52b40666cd6c03f7560f",
+ "8e9d09396e2bc5a592e8b2eb564967ea9c84dfcb",
"support"
],
"html/editing/dnd/images/008.xhtml": [
- "37113a0f337ef8f7213b6524576628e66d8cbf1d",
+ "2bbcffb1de70be3809d2ab8d1c73c612e7a06575",
"support"
],
"html/editing/dnd/images/009.xhtml": [
- "187e6b1396de914f3f4ba2e64857897e22a9846a",
+ "4929b7eef015fa6e4cf32f01a8c6b4810fb0f3ba",
"support"
],
"html/editing/dnd/images/010.xhtml": [
- "2811c140c5931ac25a4a7c6f218b90e9833ca1f9",
+ "bbab32edfe567863114bce789c47d468f60c309c",
"support"
],
"html/editing/dnd/images/011.xhtml": [
- "482c4105799e56182f24ca47ea19d6a9640224b8",
+ "0c053f5c8fe12ec5ba88ca8b508bedaa2ebb6065",
"support"
],
"html/editing/dnd/images/012-1.xhtml": [
@@ -580326,7 +586875,7 @@
"support"
],
"html/editing/dnd/images/014-1.xhtml": [
- "5336c684032b6d533621bd4d15c2e721072bd3c0",
+ "0908fa679244a52902e082633c5839428da0364b",
"support"
],
"html/editing/dnd/images/014.xhtml": [
@@ -580334,55 +586883,55 @@
"support"
],
"html/editing/dnd/images/015.xhtml": [
- "a3ca626cbf4fa83b6589e5320457546ded041b37",
+ "6ec78b173859b84d95c8bf8a439c356dc67338de",
"support"
],
"html/editing/dnd/images/016.xhtml": [
- "9f9db0cd9d7915c5402dd6b138017ebe3fd9a09b",
+ "42d7b83e8061a1120b744a24c0ed2042b4506ad9",
"support"
],
"html/editing/dnd/images/017.xhtml": [
- "ea261be2a552efe51d37ff626b64e560581ccf51",
+ "8ef34696587d2f532b1feebc9bed39def5f3b1c1",
"support"
],
"html/editing/dnd/images/018.xhtml": [
- "143b5d36858ed3c6a6f7aa3fb47a070a6f155fef",
+ "027ded72ad65a1e728f8e4284966211bdb984678",
"support"
],
"html/editing/dnd/images/021.xhtml": [
- "488a85b057eb32e6a27a9b6326a0294ac91cd8cc",
+ "441c457cbb1e699257a3bc0f90c5ee7680aa7b2b",
"support"
],
"html/editing/dnd/images/022.xhtml": [
- "8089d91b67abc515b32767a1c695a3598ecc7f65",
+ "53e50ac73970a98948d1be02f709b507d472f923",
"support"
],
"html/editing/dnd/images/023.xhtml": [
- "d6d67faa246049956746b98fbe4b4f7b92122435",
+ "4c2f697ea8312b2f1e2069bc517c0c5dd65905f0",
"support"
],
"html/editing/dnd/images/024.xhtml": [
- "04de9a9b718ecdec0ccbf10b1dd814409ada5504",
+ "2b767f81731432c30fcfd1bdb7fa6b80f2fa4a93",
"support"
],
"html/editing/dnd/images/025.xhtml": [
- "72a3ce8e454a7d7832d73ee161fec10b9eac68c9",
+ "b0ab0122cf0d1c0323008b52380d7408297fbf36",
"support"
],
"html/editing/dnd/images/026.xhtml": [
- "588959e8ceb6a1d4d33df0dfec9d1412272c5e8c",
+ "49b3f768f9190a6784d1c72e33040674846f3c3d",
"support"
],
"html/editing/dnd/images/027.xhtml": [
- "02cfc08aa4db1f7485135bc1334ab5b4e6d16506",
+ "e8baa453d62eb61894971e2b3f33718349fae0a9",
"support"
],
"html/editing/dnd/images/028.xhtml": [
- "5f4feeaf821635ce562fe5ad39e0635f933e01a1",
+ "2d2e04929127b7e3608674eb81108b0d995c9611",
"support"
],
"html/editing/dnd/images/cross-domain/001.manual.xhtml": [
- "74f9101ae0b35e44bac6a0ebda468e8298f3c50c",
+ "a26b1d7e2834ded272e583b1a250e6653edfceb1",
"support"
],
"html/editing/dnd/images/helper-circle.xhtml": [
@@ -580398,199 +586947,199 @@
"support"
],
"html/editing/dnd/images/helper-drop-image-here.xhtml": [
- "f9d5846e58c8ddfbdfc797474daf09b9bd3bce15",
+ "15c75cfb4752f8841bb6c62ca162bb5e14bd054a",
"support"
],
"html/editing/dnd/images/helper-drop-vertical-scrollbar.xhtml": [
- "013358eebb77ee8218e2e04137d12fca53d9d14e",
+ "5af4e1567b1307e986a1c15f013e83f980cb3e95",
"support"
],
"html/editing/dnd/interactive/frames-1.html": [
- "1cc1be9322b4ba0640a736fc4189b121db2bc856",
+ "f993b67ce83cac87219540f34c137e6b151a5282",
"support"
],
"html/editing/dnd/interactive/frames.html": [
- "b971d6361d5c4b5baa4247eb9f3a1372f3499568",
+ "225b57e57a81360d13d877e497479740c8aa8ba7",
"support"
],
"html/editing/dnd/interactive/object-retention.html": [
- "082be067f0e1f5d0ad5814f9a7c57b97a386cafe",
+ "6e2d19b6a6e42cdfb8c06f0da3deca0f10921d5d",
"support"
],
"html/editing/dnd/interactive/plugins.html": [
- "38c063bf4c23567fa5dce3bc502aa43f565b6988",
+ "f21ef9f3155a034a8b754a0bf3f639d4b65fda16",
"support"
],
"html/editing/dnd/interactiveelements/001.html": [
- "c1e45c74d18d5bb31003fe490eb67899dee6e613",
+ "064b001abe3c53e7600df629ba6e33680205046c",
"support"
],
"html/editing/dnd/interactiveelements/002.html": [
- "253d03c1a067e34ee82b59244173577ec57f3d65",
+ "00815519120615c18c42434355869e6ddaee914b",
"support"
],
"html/editing/dnd/interactiveelements/003.html": [
- "d3602c412e55114bbda4fc835b53687ea2721b69",
+ "cf6110887afb08a6d7e1109a47418cbf62b5cd23",
"support"
],
"html/editing/dnd/interactiveelements/004.html": [
- "8de3694ad67959df09e841a33e2e4eab4bfe0c8c",
+ "59d15a40642f66d740c80778ba13dac36710c929",
"support"
],
"html/editing/dnd/interactiveelements/005.html": [
- "c43f8473bc0a652044c6e0188c106107aa02fa70",
+ "7ea664ba49ed7f6831ccb1dae9896b96143709c5",
"support"
],
"html/editing/dnd/interactiveelements/006.html": [
- "e645b9034df780033be3f30b45871cadd09b3ebb",
+ "3d83482cccb217fbec863141b89aa531ac1c9c3f",
"support"
],
"html/editing/dnd/interactiveelements/007.html": [
- "024c2b2372d8a0f69f507b1d91a2b471931d7b14",
+ "8213c9b786489971b118d17609923ead345f076b",
"support"
],
"html/editing/dnd/interactiveelements/008.html": [
- "5d629404d22e73cbe50a9a0988b4ab6976af8ffd",
+ "d2181fc2f699b1072693c7fe84740841352fbe03",
"support"
],
"html/editing/dnd/interactiveelements/009.html": [
- "5d7415cfb1d6f967d123f76ab48b5d2e1e0951a0",
+ "d81882295cc53786d6fbe6e6c66ea63e27ff5909",
"support"
],
"html/editing/dnd/interactiveelements/010.html": [
- "fc40780077644a47f0a9d0025f7664bb3e2fbe97",
+ "f459ca8636dbca0cd2e4d83f9a3d4d81714070d5",
"support"
],
"html/editing/dnd/interactiveelements/011.html": [
- "2aca513d85737e9d785f142e5561308e77c2221e",
+ "4111818a8d0d348317f30bc3833fb601a7909fc1",
"support"
],
"html/editing/dnd/interactiveelements/012.html": [
- "f9734dd414bbd20c3cbcf85df58e122b34e1f8ff",
+ "15fbe97461682b7002dfb8ca3850e6243930abab",
"support"
],
"html/editing/dnd/interactiveelements/015.html": [
- "d8eea6302a375b89bee4e1300bb02cd2c4875ab2",
+ "13c907219a402c8cbe477e3728d0691542b43217",
"support"
],
"html/editing/dnd/interactiveelements/016.html": [
- "7a6d51272c9e13193f681071ce0584cfa94b86ea",
+ "8fc53ab056657f045310cd023b76a6a749802b27",
"support"
],
"html/editing/dnd/interactiveelements/017.html": [
- "8bcd89b31088c48ce231bd9a1a91f3047937d377",
+ "cbfefe7d091f76540db724bb97f50a75270f148e",
"support"
],
"html/editing/dnd/interactiveelements/018.html": [
- "6c1d64dbbbddd9e588d2189a72e57bb94ff966fc",
+ "0fe6b61c6c6ea801109464936c5e192e270f2c29",
"support"
],
"html/editing/dnd/interactiveelements/019.html": [
- "fd8a348bc536aff66e420eac65719288ae8cbe3a",
+ "4eed070f443bc168873b6bf3d48b83f767760520",
"support"
],
"html/editing/dnd/interactiveelements/020.html": [
- "2b0e5b8a1939766c7c6c022b4a91bd31e680df1d",
+ "fbe3c335e9ee0f38c5ac21ca5135f36c2ea10b6d",
"support"
],
"html/editing/dnd/interactiveelements/021.html": [
- "4179fdd09b647fea3de58a1de755ae3a37d1ba79",
+ "0297beea41d0d30bd1c78494e17e5a7c88796891",
"support"
],
"html/editing/dnd/interactiveelements/022.html": [
- "bdf719ddab9d616d9119f33e3f1306d26348963b",
+ "f566383d0ed32f52a7c346d7ffd6304c5d0fdc33",
"support"
],
"html/editing/dnd/media/001.xhtml": [
- "5d2e3cd342373a288828380ae8e01cd0b4a939ba",
+ "4a8951ffc465851fe05b200b4fc743ee536218f5",
"support"
],
"html/editing/dnd/microdata/000.html": [
- "610440b7a0c98798e60e632c195b82e9ec0e6213",
+ "32f30679319b2996cb5d9321dfae35d39e91ba40",
"support"
],
"html/editing/dnd/microdata/001.html": [
- "90cc2c2ee62ced57302a082342afabb2ffb11705",
+ "f4ed26dacc8904fa85ff0ccbcaa0f1e42866d34b",
"support"
],
"html/editing/dnd/microdata/002.html": [
- "4d05605d0143f8c1fe41be48ec417f6761b40b07",
+ "e40aae6167171394c73be46c7a9c69d013c2d9c5",
"support"
],
"html/editing/dnd/microdata/003.html": [
- "ffd48cd05f9d5092293f7257e3556436b7064467",
+ "c18fb06b0499a34fc70756d1d597b7835495191a",
"support"
],
"html/editing/dnd/microdata/004.html": [
- "93115fd685acd8e84f73f01934ff51972b660c8c",
+ "5222e6b69661571f36f1ce7695e981675f923e7b",
"support"
],
"html/editing/dnd/microdata/005.html": [
- "fe7df0a4a99d3c3084ea24ce94cef88798bbf6fd",
+ "0e3b5290c966dc38484e4c6ffe4c2f4cebe15d81",
"support"
],
"html/editing/dnd/microdata/006.html": [
- "4baadd68350c74b22490e5909bb37fe8b34d3816",
+ "f9c20147936536c7a109b7ba2a13e233fc5a10f0",
"support"
],
"html/editing/dnd/microdata/007.html": [
- "215621e2d2bf3718c1d02221124bf2b8ebd1654a",
+ "180be6a5ba7d32522ac77b4cd9a6218d49693bc6",
"support"
],
"html/editing/dnd/microdata/008.html": [
- "1b65a96de14cadaa31fcd6eb93dab1265af283d1",
+ "343fc6527cdb161d2ddf5981d3e151312f3567f0",
"support"
],
"html/editing/dnd/microdata/009.html": [
- "a97cc6ca22b3aa661fdd2bf3d2c1c0d7757ebab9",
+ "fb93e6052d039354459519078e39cd3247ff8fea",
"support"
],
"html/editing/dnd/microdata/010.html": [
- "b914fb52794f4a66bd888c0eaadc858388b7212e",
+ "31056daa05e24e1e41e2183214fd01408fb49d94",
"support"
],
"html/editing/dnd/microdata/011.html": [
- "aba6742d18adea6bac9edf14237541ee8fc828ed",
+ "d00256d19a2ee9fbb153e50cb2326592c812ffc0",
"support"
],
"html/editing/dnd/microdata/012.html": [
- "354681f0346ee0110db338104381e3820e01d539",
+ "1aec63c28232da31835a5bc5314cd575dcc11d6e",
"support"
],
"html/editing/dnd/microdata/013.html": [
- "e1b11acae2708b08b4087377542e7120a75ea4b7",
+ "a5639238226b2e68638247b48fa550bab375e766",
"support"
],
"html/editing/dnd/microdata/014.html": [
- "2020bafee90a00c1abdb1c8d60a9a1f63e5c2452",
+ "320ec5b93b2f5cf6ae8e67247448685bb99b8252",
"support"
],
"html/editing/dnd/microdata/015.html": [
- "fe0578b26acf7cd90b37d0cee24c0b15797d69df",
+ "21483a8c18955bb5608065ec43323eb9d43f80ed",
"support"
],
"html/editing/dnd/microdata/016.html": [
- "7c3c6cf30c8be82f5bbc4e5dcf526a88d2f0c9fb",
+ "228eca4c4f85d217870fb2553fa20a525ee969e6",
"support"
],
"html/editing/dnd/microdata/017.html": [
- "e20cefc0177d4413cde88ba32949822fdb33ebe2",
+ "8e06d0f0e125d5a7f6f7d2324ba1253b09f0e6b7",
"support"
],
"html/editing/dnd/microdata/018.html": [
- "be66ebe8a87ecf8b2a5ef1de2e5e182ea57a781f",
+ "31acabb774a3b59be1be627387a86eccd549b92c",
"support"
],
"html/editing/dnd/microdata/019.html": [
- "33c8b1586c9039f293499acd1e066fc38d13c874",
+ "8ff330aeeaa70a12ea492bc0256b0c3425c58076",
"support"
],
"html/editing/dnd/microdata/020.html": [
- "b4afcbb2eb5fc4a90e8a82669dba6646e4761fa7",
+ "899a2e38a2d095aeb1c4ea90d165213efdd0d04d",
"support"
],
"html/editing/dnd/microdata/021.html": [
- "dd13d2ed12f1bb45f316ae91567db71d96737d83",
+ "2a6528dbba2095886ea43c1c746f3e84607327bf",
"support"
],
"html/editing/dnd/microdata/test": [
@@ -580598,15 +587147,15 @@
"support"
],
"html/editing/dnd/navigation/001-1.xhtml": [
- "6e1c33a76a6c567aa2aa8613fd05b001f26fbbe1",
+ "3e0ae9a9f0c15133ef801b8ad34edf03b79c3f77",
"support"
],
"html/editing/dnd/navigation/001.xhtml": [
- "f40025873cf7ef83299bba09945a6de3d00772de",
+ "5ee6dc848ac40572a32a5e0266a844ddd99c00c9",
"support"
],
"html/editing/dnd/navigation/002.xhtml": [
- "d1585dd03adabc542034211e25cb2110366bfdec",
+ "dee091150aeb8e49c72e1bff4ae45de82099bf9d",
"support"
],
"html/editing/dnd/navigation/003.xhtml": [
@@ -580626,23 +587175,23 @@
"support"
],
"html/editing/dnd/navigation/007-1.xhtml": [
- "b1014791c35fc828a52999cfbab54a64a2d4a978",
+ "33ea016247bda2cffa223525c31d5e98e37f426d",
"support"
],
"html/editing/dnd/navigation/007.xhtml": [
- "05d61d397cc216bd117644c572b091ece10fd904",
+ "5e8735d18807fee97b7386739df650b4ac5f7942",
"support"
],
"html/editing/dnd/navigation/008-1.xhtml": [
- "bf4820c610e71ac238f2c766397377a046fcb4b5",
+ "4953e222e4c49e4431bbaa4bb55c99712fdf5234",
"support"
],
"html/editing/dnd/navigation/008.xhtml": [
- "b6dcc62f0d35acef8d0cbe2d0c72bde10dc6112f",
+ "5582908cb2796f4bf1b064184c585ac9d932ff87",
"support"
],
"html/editing/dnd/navigation/009-1.xhtml": [
- "38cb27eccb69a65cee58804f7ebe1bb89704a10a",
+ "96df8c929e7cbabcdb60a7bf1e411eaca9a783c5",
"support"
],
"html/editing/dnd/navigation/009.xhtml": [
@@ -580650,27 +587199,27 @@
"support"
],
"html/editing/dnd/navigation/010-1.xhtml": [
- "ad3f592f6585ee98e77f768edfe8b68a553ef55e",
+ "5f988d3115f1b4340cb35c763bb4d240a8a00a33",
"support"
],
"html/editing/dnd/navigation/010.xhtml": [
- "18e6e88f7dc756eb867d0b0cb51cae16e1272e38",
+ "67eb42be52bb8a85bf0f282e70b195bae90b1144",
"support"
],
"html/editing/dnd/navigation/011-1.xhtml": [
- "194352ea816ecc4943dfda048a43e07b55039cc4",
+ "a0a566b204899a618acb82349097464f981779a2",
"support"
],
"html/editing/dnd/navigation/011.xhtml": [
- "b6a068e06849a3e3d9c2346233498dac1e12b648",
+ "ff243bc26f15d36398643cceaf8f12f6c6a3c0e3",
"support"
],
"html/editing/dnd/navigation/012.xhtml": [
- "2d7aad3731f1bf8938bb1aedbafec5702e70e626",
+ "d2e60e9deab821cbbdb5d902e91baee5bc8baf16",
"support"
],
"html/editing/dnd/navigation/013.xhtml": [
- "0792ba3b2b74260f7df828ae334071fb607ebf3a",
+ "68b076c879db226681869463d934856466de6687",
"support"
],
"html/editing/dnd/navigation/014.xhtml": [
@@ -580682,15 +587231,15 @@
"support"
],
"html/editing/dnd/navigation/016-1.xhtml": [
- "fa5fe52e2fb9fe7313773051fcad3a7d10ba77f1",
+ "998d822907087860c2a489f9a1e19e4000fc5fa3",
"support"
],
"html/editing/dnd/navigation/016.xhtml": [
- "42313a0c626e6cd73c0c82683f32061b93e14b9f",
+ "b6a9379fe54d39ab3f0d4ae022d239e2fb5923c8",
"support"
],
"html/editing/dnd/navigation/017.xhtml": [
- "d53891d3980a3759f100bbacdd9dedfceb74b21d",
+ "daa4f7abe23b9a41c0b8bb280d04c41336cc55cc",
"support"
],
"html/editing/dnd/navigation/018.xhtml": [
@@ -580706,7 +587255,7 @@
"support"
],
"html/editing/dnd/navigation/021-1.xhtml": [
- "6855757315678e102c8fced16e29e1c4274dacea",
+ "06da86ee5c62907d8d4383f8615a97a7f285db43",
"support"
],
"html/editing/dnd/navigation/021.xhtml": [
@@ -580714,135 +587263,135 @@
"support"
],
"html/editing/dnd/navigation/022-1.xhtml": [
- "61f6bf78713f423160fe1a38b2d7fdcb333d2b9f",
+ "f6f56f3558ecf089b75b8c082124fbb286d14bae",
"support"
],
"html/editing/dnd/navigation/022.xhtml": [
- "33857c5c886df53da800f3a7bdf9aad831876661",
+ "3a32b2a7a58cc25e9d5f56b4e9b9a779dbc16921",
"support"
],
"html/editing/dnd/navigation/023-1.xhtml": [
- "49f0317b3aec9dd49f17b875c2eab571e8cd1e1b",
+ "f582ba58b27d5d49ef94655e1b1cb366a33c97e7",
"support"
],
"html/editing/dnd/navigation/023.xhtml": [
- "0b772dbdef144990667220ad5e2236a0fe08893b",
+ "dc528ecd4834f485382225dca3dc010b8a7e9880",
"support"
],
"html/editing/dnd/navigation/helper-drag-image-dont-drop.xhtml": [
- "373b7c2bfd14a8bf4b8f61856a1773bb4b991951",
+ "81f3517743627b2a6cfc9b5886384a941f3fa734",
"support"
],
"html/editing/dnd/navigation/helper-drag-selection-dont-drop.xhtml": [
- "0b51e1d04cab474b8f4dc99c808196af900b5458",
+ "b3e197c6196cbeb5a36e73083e60dab6a8d794bd",
"support"
],
"html/editing/dnd/navigation/helper-drop-here-reload.xhtml": [
- "3d089e94789b954e78588d8b417b1d677f4fd5e0",
+ "4117a36c24ef1261bb730be5be006d9e293e256a",
"support"
],
"html/editing/dnd/navigation/helper-drop-image-now.xhtml": [
- "de4d4bb6c930b5ab061c6af0dad530872d8dea90",
+ "2a80f22714767a9b7546a2ee39678ac351458f3b",
"support"
],
"html/editing/dnd/navigation/helper-drop-link-now.xhtml": [
- "7ae038eb1c1bd9edc03e57082e75b8c555ae24eb",
+ "313243b0c4252b1d05a9be693573e2cd5e2285d2",
"support"
],
"html/editing/dnd/navigation/helper-drop-now.xhtml": [
- "e4fa61d436fa57c34a99fa18f161a3a55a73314e",
+ "d54c92505d96a1f6b0e50ab19d0040f6c75b5ba7",
"support"
],
"html/editing/dnd/navigation/helper-drop-selection-here.xhtml": [
- "bc97adc078b09f7e5f52f5abeb06ef625b941f07",
+ "9d6e57e786c1eca1e0f7272d2e5bd7d4a7ef39d1",
"support"
],
"html/editing/dnd/overlay/001.xhtml": [
- "35d1aa40c3bc4743fc78f53a98bfa9911fa56f6e",
+ "eff3a6b4cf12c5deb6586c1e73341ccbf3bcbe5b",
"support"
],
"html/editing/dnd/overlay/002.xhtml": [
- "c77495f239b988140b32afb16e7f0dd0a829a23c",
+ "2a0c2eb73d0f9892d5eb4ddb54284f9d23fbd63e",
"support"
],
"html/editing/dnd/overlay/003.xhtml": [
- "7bb8ca0d17125cf5d19267be0b77d87a5b5aca89",
+ "7330d6b863fd7fbbc2184d9978a8b84ffc3c3cb4",
"support"
],
"html/editing/dnd/overlay/004.xhtml": [
- "e5020450e2cb56c65cf9851ae8d82fa6703f759a",
+ "dba5647e651413f69053c8a60e7a820335bddad9",
"support"
],
"html/editing/dnd/overlay/005.xhtml": [
- "3f42ab3b58e0cedaa6244103b546d820ed62f574",
+ "26adbd710d8d082519855c3752e7cd75392f4615",
"support"
],
"html/editing/dnd/overlay/006.xhtml": [
- "6d7366d2c7e19da43105e354ae066ca2f36feae8",
+ "211cca6ac9899927e2e413ecd3ae4650c24b2069",
"support"
],
"html/editing/dnd/overlay/007.xhtml": [
- "d78a396c2dbfe82b916e53083742d5533824f2d3",
+ "a0590e1ceac5a32b7ae4153fdcc3d50de2ddae54",
"support"
],
"html/editing/dnd/overlay/008.xhtml": [
- "822a724a504a7872116837a529c239ab7375547c",
+ "9c97ac63595f284d2c9fd44c3a803d7404218140",
"support"
],
"html/editing/dnd/overlay/009.xhtml": [
- "c93829b8687fc0f75675169e613a6f1be91bc8e1",
+ "76d7377428f5c120dc5611f8a5e6f600b17e9af3",
"support"
],
"html/editing/dnd/overlay/010.xhtml": [
- "98c087399e1e24a57d7fef1c28ec54b93c8a73e5",
+ "fc04c158bf74ff8262f4df87ce7fa6947c27b1b5",
"support"
],
"html/editing/dnd/overlay/011.xhtml": [
- "3e1bfcc751dcc0dea18f9e11385259498f7db8e7",
+ "e2bb53cefffee115ad9321e52c87e7473bb8c8ac",
"support"
],
"html/editing/dnd/overlay/012.xhtml": [
- "407e4893bc3857bfa3a268ff041ec0e59afbc5dc",
+ "a628079c80b4ee7f9280f9dd3e1653ae400eba76",
"support"
],
"html/editing/dnd/overlay/013.xhtml": [
- "3e08c283943682410beeab832bcc1f9f2994cf0d",
+ "7fce31e61aa4dfbab73b97da9fea6981af78275e",
"support"
],
"html/editing/dnd/overlay/014.xhtml": [
- "7324b3a381bd06eb187c3106286bf10e378cc405",
+ "828f445d7db1034876d1b5f258fb2ad893c50b3f",
"support"
],
"html/editing/dnd/overlay/015.xhtml": [
- "756edb61aa976ec448266db193158334a6bc88b4",
+ "5efaabf0444f18ab313d032685deaf11c8e9277d",
"support"
],
"html/editing/dnd/overlay/016.xhtml": [
- "d8e732c9e7ea7daf5fea31f7c5d633be821ca964",
+ "73b4cb6c49aa490b6fa4ab6764d80c3095720292",
"support"
],
"html/editing/dnd/overlay/017.xhtml": [
- "29fb61d8961918b4f2868f93abd662473566556b",
+ "860b8c0f37347b8452f8db3d24399eb48075caf0",
"support"
],
"html/editing/dnd/overlay/018.xhtml": [
- "44596a9ad149cada1b8c393fc5570a095fce181f",
+ "e1a02a54b77566ae1e1cdfc2458a302a10e17125",
"support"
],
"html/editing/dnd/overlay/019.xhtml": [
- "ac9e72f9e51ba70d1f2293f3187899dd48ea2b8c",
+ "c3c46de4be30376a4b244f8fbbf4d03a53cac5ca",
"support"
],
"html/editing/dnd/overlay/020.xhtml": [
- "e303861971d98111d84782295084b558a8268a26",
+ "f1bef72ed4a93f8d396965eb860989bba8983e81",
"support"
],
"html/editing/dnd/overlay/021.xhtml": [
- "6fd06a6f332f878fdae7f37b1da5913a2c9c9ce3",
+ "9aedb414ce90d0a1bad0e3b7355fd1b0dd23a808",
"support"
],
"html/editing/dnd/overlay/022.xhtml": [
- "9a211398b3b77bf62376eab9ce54ff2a57c8d918",
+ "2239a52b18ed28c733f68cffbf31eeaeeafa03cf",
"support"
],
"html/editing/dnd/overlay/023.xhtml": [
@@ -580850,155 +587399,155 @@
"support"
],
"html/editing/dnd/overlay/024.xhtml": [
- "4c9dcfad66402f9a1f51583e52ddc5d66de236fa",
+ "d0dc98bb9160e731b3ae63584f027d161b0fee43",
"support"
],
"html/editing/dnd/overlay/025.xhtml": [
- "78d0086884725690a2cb3234ef62ddd2df31b406",
+ "50dcf7accda9d7aea95812914a51781541addaef",
"support"
],
"html/editing/dnd/overlay/026.xhtml": [
- "069f73e3cc574b353a34dd97eafda6cf2c59f1f3",
+ "b68aff8721773a694d0754a4b66c53b7e8c835d7",
"support"
],
"html/editing/dnd/overlay/027.xhtml": [
- "664cb9767455fb77cb929d03cde92849c4edceaa",
+ "2f55dbb0dbce8a79a93b7e5daf60ef784cfb45b9",
"support"
],
"html/editing/dnd/overlay/028.xhtml": [
- "b6e5725165c17cf2e1e6d61e5ef33d35e3ddfe1c",
+ "c63917c4080c04f295b3ad5ee615b8fcdbb0b38a",
"support"
],
"html/editing/dnd/overlay/029.xhtml": [
- "c458d903877e21f5821d27ec0c7c3b0687ce0a05",
+ "8419783182607666cf016246d96c09d9696880df",
"support"
],
"html/editing/dnd/overlay/030.xhtml": [
- "ccc6173b14a777a9af246cf7ce5a3e0f0ac97cda",
+ "516f8ae0d02887ef58c4fe0392faa135086dc243",
"support"
],
"html/editing/dnd/overlay/031.xhtml": [
- "8aac4335b62a219b3a2cf907b505b3425c23aa49",
+ "14d296e3c6f210fb9d0c2f2107e3e0eafc390baf",
"support"
],
"html/editing/dnd/overlay/032.xhtml": [
- "11dd0819437d777b30368109bfb389d9152df298",
+ "8a132474ca687745e27e8f3efe13440068b6cecf",
"support"
],
"html/editing/dnd/overlay/033.xhtml": [
- "2b64e164a2549ae22139c39b4af7dcd6f0b8a346",
+ "137d1abbc6486aa35941d5276e65025189f56e3c",
"support"
],
"html/editing/dnd/overlay/034.xhtml": [
- "e3647e2269bd0948d7c35d94647427420b55d118",
+ "2a05fd9aa4b82cfb4f9c18f6b9282130aa0a724f",
"support"
],
"html/editing/dnd/overlay/035.xhtml": [
- "e0ab468fa143c9d5712d5ea6961d21514fea1b8b",
+ "c48880b09bb35d9f114d08b4d8d703a05129a16b",
"support"
],
"html/editing/dnd/overlay/036.xhtml": [
- "4a65dbcb207b0f3812409d2dd38fabd237148c6a",
+ "62b5b1911e84b48ed834967764f841d66d2ff65a",
"support"
],
"html/editing/dnd/overlay/038.xhtml": [
- "9346ace58d1b46a68dd2d8a45c34904c8277cd84",
+ "52ae95c3e43ec1b1512ef9cb206afd88169db920",
"support"
],
"html/editing/dnd/overlay/039.xhtml": [
- "e0dda3e13e80b9fc918c74fb7483dd031d66fb2d",
+ "3c1929022dd83511cf6d0f1b20673aa7bc805f8a",
"support"
],
"html/editing/dnd/overlay/040.xhtml": [
- "a778f7e536daf5570478e84f8b902d2802c0bed3",
+ "5e6d095d83d167b7ab02c0696e55ca2f5ceeb096",
"support"
],
"html/editing/dnd/overlay/041.xhtml": [
- "6abc3797e0323ed3401a2f0cca76e0cc438e1ac5",
+ "31fd6f04b6d466c5500364677c752454dbaf0b08",
"support"
],
"html/editing/dnd/overlay/042.html": [
- "87f09b10220940041d224ab5c8182ce8b83d00c1",
+ "1c4e5c1eb35a7b5c52b910b733aed64a783abb66",
"support"
],
"html/editing/dnd/overlay/043.html": [
- "729cfea2e9801647ef873195a14f5dde52580c13",
+ "66c00512adb9a7a1dc431c19ef272e254e57247e",
"support"
],
"html/editing/dnd/overlay/044.html": [
- "c2c0d0d6bccbcec2ffc7536f3cece3dda66d9053",
+ "5eab3088eead50f3f7c974cf21b54084e35b9354",
"support"
],
"html/editing/dnd/overlay/045.html": [
- "5ac859f7e615c81e36cc3ccc8778bba80320dafc",
+ "c64e3795833682a1680b3d00fb0b2c7177c93b3d",
"support"
],
"html/editing/dnd/overlay/046.html": [
- "212efe6df1fa0f109b25e7d5a73f098a0a9bff1e",
+ "4d1e6d1f2eedce77693b98762c2d9cb36d802479",
"support"
],
"html/editing/dnd/overlay/047.html": [
- "a18e922cb0af5312b5866091039778342cf3f449",
+ "178fb6a24d629dbf6f205b58eedfbfea4e0f2546",
"support"
],
"html/editing/dnd/overlay/048.html": [
- "0b73581821d3eed2b10c6f6dde099bab535e81f9",
+ "a022e2d18620c02dda279be5e5c5f9c55c9bacc6",
"support"
],
"html/editing/dnd/overlay/049.xhtml": [
- "398c78ebb16a0a86d8f2cd068e022a8fe37bf1a8",
+ "9f51a3db960084bdb6cdb7bb51e98f194efc4160",
"support"
],
"html/editing/dnd/overlay/050.xhtml": [
- "456a6e6f0dc6184e413165b05ce7cdea06a32594",
+ "a826bd28781f5855d2dff7b87cfaa278e24a9040",
"support"
],
"html/editing/dnd/overlay/051.xhtml": [
- "9453b607a2d56c92f5128471c05bf69a3005792c",
+ "ca4e4004df127ffb6ffbff128d29d18c6c7d39a8",
"support"
],
"html/editing/dnd/overlay/052.xhtml": [
- "8f5c5d5a4b4aaa8af5700d64e47177cb1e42fd5f",
+ "d5758173cf62fb59ea422d9d0e4ec208dbaeb2c6",
"support"
],
"html/editing/dnd/overlay/053.xhtml": [
- "3ad5ea5201d44f2b763aa8a3bb27da21f450c373",
+ "5a165ab7147e32119c92ba398f757300963d09cb",
"support"
],
"html/editing/dnd/overlay/054.xhtml": [
- "ebe4d649502dfb4cb83361533f889c29f4d277c1",
+ "180bc31eb12e7a40205e40692aed4fee9f29a391",
"support"
],
"html/editing/dnd/overlay/055.xhtml": [
- "23d29f5a6f6561fd68e8d84b7e176018ce87c9e0",
+ "75b0c22132d4c0c086286f30d849effd653a0ddb",
"support"
],
"html/editing/dnd/overlay/056.xhtml": [
- "46c6cc64e3dc026035360369784e7716271c10f9",
+ "6c8a487e1df638175a9f782fb53d540839f30384",
"support"
],
"html/editing/dnd/overlay/057.xhtml": [
- "f6c1883af9123989358f6055c081942fe29cc105",
+ "d881ed6634ef908bc7695a46d48e1cf45e54775e",
"support"
],
"html/editing/dnd/overlay/058.html": [
- "b3bc27f8aa5d866e65addc3edf2f089020676b4e",
+ "ecd3477f357dd62c55329ecad9f88b0389eaa8b2",
"support"
],
"html/editing/dnd/overlay/059.html": [
- "f00c7e7d94e079bd4eb04406dc71383115564a85",
+ "600b22c5d5060c94048bf0fddd0d18f319d509ae",
"support"
],
"html/editing/dnd/overlay/060.html": [
- "10eb732430bc11bc9581f788afef2803e3cdf0e6",
+ "58e01cd8babaf2e6d662f29654da905792772b5a",
"support"
],
"html/editing/dnd/overlay/061.html": [
- "c64ff8f4e694ff08c965534a1e9d8e0371807899",
+ "2b8ca3aef9a1ee6b8073de8566ee18fe0b9977ce",
"support"
],
"html/editing/dnd/overlay/062.html": [
- "0b443db7d4f70c0dadc8e06ebc72ba3e0c2d7132",
+ "bba0f975e38c2a6285342572a02382224a068447",
"support"
],
"html/editing/dnd/overlay/heavy-styling-001.html": [
@@ -581066,39 +587615,39 @@
"support"
],
"html/editing/dnd/platform/alttab.html": [
- "e1a15a551d914dd95cf4cb815855e2b55c4e36cb",
+ "8a81e3d183d8aef93c957af5fc8fe1aa682c415d",
"support"
],
"html/editing/dnd/platform/cancel-middle-click.html": [
- "47a1f8935d6c6e68bbe871bea90373d43b08dc0e",
+ "77be7ab2a5ec8e57069ce2030cdb6314fe0655e9",
"support"
],
"html/editing/dnd/platform/cancel-right-click.html": [
- "6a0101fd1607c404c00cdde077e5c8e14f8a92dc",
+ "c558fb84d4e7bce0d70b8aa9be24f2fb09d60f24",
"support"
],
"html/editing/dnd/platform/close-drag-001.html": [
- "6c053997f617fdb308634c0e569b12b7ff15ab04",
+ "f595fafd32d24c1045fa4401ab18b44792648e09",
"support"
],
"html/editing/dnd/platform/close-drag-002.html": [
- "9858f7485484a43703dea74b3c42f2d5acff17bd",
+ "4ce19553d72a89aa85c7fc7f7c2beee9c8997d4e",
"support"
],
"html/editing/dnd/platform/close-drag-003.html": [
- "9c8ecf31d16b2055e55fdf887b875dfe4de7f6d9",
+ "12c57a5f4130a2becb98bdecd3be3373302d97b5",
"support"
],
"html/editing/dnd/platform/close-drag-004.html": [
- "93a3f142983547bbb93199526cc801213aa8fac2",
+ "cf5b5d653fd75a636d5e1adf0d5049f7514b4727",
"support"
],
"html/editing/dnd/platform/close-drag-005.html": [
- "f3183a8a87162c594b7ff7abe357481566d37049",
+ "fbf5e36e899073828cc0c316e00486eb3ad5f051",
"support"
],
"html/editing/dnd/platform/close-drag-006.html": [
- "0c7443e2016b174a82484452edb366dfb032f9ba",
+ "a61490524f5931761bcac472fd4f779e0dd9d5c7",
"support"
],
"html/editing/dnd/platform/cursors/001.html": [
@@ -581110,163 +587659,163 @@
"support"
],
"html/editing/dnd/platform/cursors/003.html": [
- "ac2fe99cba418827fc8aaaeb3a001670cbebf995",
+ "0af89582267cbc7ce17ca7ef62aee86c8102f2bc",
"support"
],
"html/editing/dnd/platform/cursors/004.html": [
- "a70e83e16f33e9a3fe0f033f59ee11a36dd48edb",
+ "3456f055d76e06676a823abbdd3b1e5c9c8e48db",
"support"
],
"html/editing/dnd/platform/cursors/005.html": [
- "1704fca18b1c2fbd36ca0f51efc1b0ab96009ae8",
+ "a36321c4f74017ec6f35c26d6ac08ce673a17a46",
"support"
],
"html/editing/dnd/platform/cursors/006.html": [
- "1fca0088bb7911d0e4210ae8599b116d771a946e",
+ "f9208e6872258a3a0032ff88e43d97e7e73ef10d",
"support"
],
"html/editing/dnd/platform/cursors/007.html": [
- "256c868eaab0dfad4262a7f046405887bd56c13e",
+ "f970f5962dbc16492b661ebf78daee9a121812dd",
"support"
],
"html/editing/dnd/platform/cursors/008.html": [
- "b98d152baa518e0eb8aa8637aa970603727f3919",
+ "a4fd6d5cd12b74969fdaa2ca669c6d3083d9b25f",
"support"
],
"html/editing/dnd/platform/cursors/009.html": [
- "2a5fcdb9fb81b77fc7c8316e7dab18945afd48ab",
+ "46af85a2b555fd124311d12777b5fb21b607b774",
"support"
],
"html/editing/dnd/platform/cursors/010.html": [
- "dd05e99c28ebf7dd6a5f15966fd0b9fd4c638605",
+ "7840f4165ec8a681783852c3161691bbf4bb7dd9",
"support"
],
"html/editing/dnd/platform/cursors/011.html": [
- "3da2d4d4617f302221dc681e87e2ca162b9e5ac4",
+ "7c73d3b45487221119e70ea6d579cdb4580d7c51",
"support"
],
"html/editing/dnd/platform/drag-keypress.html": [
- "c1bd0e4842e12cf513b77aca436b74d716c7ebf5",
+ "48564d183c794fab512169f5d6b529bfdea2a92a",
"support"
],
"html/editing/dnd/platform/drag-link.html": [
- "7e9bf0f791dc7453c8659895b19fc5857cfa65e8",
+ "4baf94cb16150654222a4232c1ad78fa2a5f8a4d",
"support"
],
"html/editing/dnd/platform/drag-to-title.html": [
- "c22244a06c83f225c3d1aa93f42b8ccf41a58f3e",
+ "9428da065bf270bd57108c9462d6561472cae4a7",
"support"
],
"html/editing/dnd/platform/file-drop-position.html": [
- "2daaa61354d2fc82e5fe64317190dff1dfbe0e06",
+ "5d8ca1893c9c92337d742f60b5bc0a95a0fc5c64",
"support"
],
"html/editing/dnd/platform/file-os-to-os.html": [
- "7e442eb50f00f1f6324cc5d076dd1d37b8990c01",
+ "ba6adade9fe9d17247944fefd090cf6a3619d187",
"support"
],
"html/editing/dnd/platform/file-to-system.html": [
- "f555e9204c4eeaf370209d8a7fdb1570c782368d",
+ "feeca3f74aa0657f9f2d6991fd408fbec97f36de",
"support"
],
"html/editing/dnd/platform/html-to-os-HELPER-FILE.html": [
- "72838ce246738158080a12ad2ad238f270136fd7",
+ "7829c6f20b9cc31d4e1f30a3b3e250a0c8b06737",
"support"
],
"html/editing/dnd/platform/html-to-os.html": [
- "742d5e27246b081f3c21930bb77f20a5cea83af9",
+ "93b8c58e4ff93051135023008aac03a2830a9fa2",
"support"
],
"html/editing/dnd/platform/html-unicode-to-os.html": [
- "72fa8c4902b77cce8534e34bab26859b912922ff",
+ "618738410878fc1baf17d6278288f91ac5484d38",
"support"
],
"html/editing/dnd/platform/inputs-no-js.html": [
- "631e5542c8cf5d85663e859576dccbefeed42df3",
+ "38f93ec91ceb6e31fed630e47be7565bc4e059cd",
"support"
],
"html/editing/dnd/platform/interrupt/001.html": [
- "4eca22effd72f9c33cb053b39edeef1acc736195",
+ "791ded14bfbdbc60f16e4877eb40660052f6f4ef",
"support"
],
"html/editing/dnd/platform/interrupt/002.html": [
- "3d869099aef04216fb8fd172a8cd96eedf4ebb2f",
+ "a3fd5666d3befb2f9626d2791dc8e42e2076955d",
"support"
],
"html/editing/dnd/platform/interrupt/003.html": [
- "e3712d12c8a565f8475a4210af7fd7b86832e3c0",
+ "9815ab858a66f84ad701ca1f4bfa016c50f8691e",
"support"
],
"html/editing/dnd/platform/interrupt/004.html": [
- "ba7dbabde7103e9e5819f9eddb0d1622404ffd0a",
+ "6eaba8719cba4da8ac1e6c78230558fcccc53f26",
"support"
],
"html/editing/dnd/platform/interrupt/005.html": [
- "63a6d905dfcdb5a2cacd8c14689353dc52b5eea8",
+ "0a884744864780d0b288c17fca3fe7c4fb4f9a9c",
"support"
],
"html/editing/dnd/platform/interrupt/006.html": [
- "bfaee50c84a438a8af4d8ce28298846cae13f80e",
+ "6af92a6fce926c052a5b2c34442e784b1a9b9f6a",
"support"
],
"html/editing/dnd/platform/interrupt/007.html": [
- "12e061863fbebeb838077b2238fa27ba844bb364",
+ "b8974887401a5b5bbe72c3dcdb2033584ab648d1",
"support"
],
"html/editing/dnd/platform/interrupt/008.html": [
- "6b348498c7df83a8c11706f0b92ef28822fa79fb",
+ "edcfe7a2d78ebc615317a05b779e601ad05108b8",
"support"
],
"html/editing/dnd/platform/interrupt/009.html": [
- "749620e02ea1d1d095ae7c87566fc52206b79fbf",
+ "b3fb63e124070be681d3cc25dd28b7cf56fc024b",
"support"
],
"html/editing/dnd/platform/interrupt/010.html": [
- "41b61cda773df56301901eb48d1132ec7a27ef0b",
+ "7426e405e7724b953aa5e77113aa4b5716f1d8af",
"support"
],
"html/editing/dnd/platform/interrupt/011.html": [
- "3ff24c098bc61e4ea090cae84a170c5ce9579d9a",
+ "385ebe01335c3359a44fff77ea87f64725e4faa0",
"support"
],
"html/editing/dnd/platform/interrupt/012.html": [
- "d772cbb59166c1cfc9a7087aa048793c8c2cfff4",
+ "95733656a8d5f3cabad935ae82fc9a9f1eb327f5",
"support"
],
"html/editing/dnd/platform/interrupt/013.html": [
- "3a52505129f337e172e4ddfc3c1b38bef46e621d",
+ "d870a587d21b3b06e0dc8f9cfca5e42b61d39b84",
"support"
],
"html/editing/dnd/platform/interrupt/014.html": [
- "97be969592219b00d1286f1d3861b869eecfe64d",
+ "e65fc9ec36b0d5cec5644fb55c153ebb72b67ce5",
"support"
],
"html/editing/dnd/platform/interrupt/015.html": [
- "2f60476b8ce7972400d44ee855f1fdc0173b1f2e",
+ "d1b84c7e882a64a421deba2cc729a8c931a2881b",
"support"
],
"html/editing/dnd/platform/interrupt/016.html": [
- "5a74140f891c81ea94d79cc3ddf39ade40b718d5",
+ "df1318543d0f3dac482a5853e4e7d89736f3c768",
"support"
],
"html/editing/dnd/platform/interrupt/017.html": [
- "300a031d1f0d9ee5fe350900888fd3d6fed65075",
+ "08adb119046e4684a9d9fb40062f869578f7d7d8",
"support"
],
"html/editing/dnd/platform/interrupt/018.html": [
- "24f8a1ca53360c82326610d83298a966acace98c",
+ "352c200725ffa614cbca65da74605d44c4f50fdf",
"support"
],
"html/editing/dnd/platform/interrupt/019.html": [
- "60d83ec7bd7898b6d3d60757abc45c5f6283ac71",
+ "a450d7d07b436e90ac048972bad7f05eb98336d3",
"support"
],
"html/editing/dnd/platform/interrupt/020.html": [
- "9bbab8a531ae5a9477b5775cc8af1d7ae94ec09b",
+ "983e27fd1ca06adc3999baa00bd0c483ae167c52",
"support"
],
"html/editing/dnd/platform/interrupt/021.html": [
- "f90d4ed4ef6177576c301d9fa5631592f046bcad",
+ "bab384a28dba4af7bcfebc01e21bf1f16037748b",
"support"
],
"html/editing/dnd/platform/interrupt/fail.txt": [
@@ -581286,71 +587835,71 @@
"support"
],
"html/editing/dnd/platform/keyboardshortcuts.html": [
- "c56038e0185797aa3df8082e6c19e481457ab4e1",
+ "0c5cc578d65781acc48bbbf77f7110f2658ad2de",
"support"
],
"html/editing/dnd/platform/modifiers/all.html": [
- "0e00ce205b4bf55b6209fe6e9c13177e373be98b",
+ "202e21982b48e6d47069297fb3ab84857c7e274d",
"support"
],
"html/editing/dnd/platform/modifiers/copy.html": [
- "871c1927ae85f70e0e019882e8f7dba47a6259e3",
+ "23daad82ca72fb2b049c4fba01c65cad394e09ea",
"support"
],
"html/editing/dnd/platform/modifiers/copylink.html": [
- "3a79a3c0933af4c1a3676aea665eecb2d7b8cda6",
+ "1ceb5f906b89663ed2c09171e6e313adecaef14b",
"support"
],
"html/editing/dnd/platform/modifiers/copymove.html": [
- "08ce32cf90499131d86bedeb392d9a6d7e1a75d0",
+ "8fc38bd61a64f860fea02a35b8c08ec27e86698b",
"support"
],
"html/editing/dnd/platform/modifiers/link.html": [
- "7f7d6ad44d8ed1d8f11493d598bf1f0926b5d9f4",
+ "78be332c1d96b79be71308da4ce7d574f6250ad5",
"support"
],
"html/editing/dnd/platform/modifiers/linkmove.html": [
- "ccf7e56a776f441cebf820a01a3f69a0890fcbae",
+ "54553a5d26dae3e45280825b975d3bc6477acb5e",
"support"
],
"html/editing/dnd/platform/modifiers/move.html": [
- "ab9810fb6c4e0cfc0e14403b1070c4c8747318b8",
+ "005b9d694811e6d0f71bdef09ebd0220d348ab9b",
"support"
],
"html/editing/dnd/platform/modifiers/onlydropzone.html": [
- "9fe5ac15fa53c5747b3cd1547882e0aa56f1d680",
+ "46fabf3aa3e52263f7e42240d9b837290302157c",
"support"
],
"html/editing/dnd/platform/modifiers/onlydropzoneevents.html": [
- "74a4a0d2073794b7e0adf737cda2cdc6f7591e24",
+ "14c48ffa5a069dbcebd96db2f4a35e6dcf6adeef",
"support"
],
"html/editing/dnd/platform/modifiers/releasemodifiersdrag.html": [
- "e3d4bdc3495450f85a4a879dd2a0b61bff1d59e0",
+ "4201d5489e30f3d76ef9ec5a19aeb79749687575",
"support"
],
"html/editing/dnd/platform/modifiers/releasemodifiersdrop.html": [
- "f37465d95ead93605a4706cb85db6da7c2924ecb",
+ "776cd5e36a8c2de9b4552993ebd19ced7060dfdb",
"support"
],
"html/editing/dnd/platform/modifiers/scriptmodified.html": [
- "e05507f3150eb6b02bf7c3082319330883f464f4",
+ "acffe022396bebbe5fdf5265631b3937257accfa",
"support"
],
"html/editing/dnd/platform/moving-window.html": [
- "8cb80d2886277186977398f83d9d9b1a08a01f12",
+ "2308b7f0f0c90d283a950234abf944da7f7ee481",
"support"
],
"html/editing/dnd/platform/overlappingwindows.html": [
- "60ac731752476029f855bb1414bbdc40a38433a0",
+ "42382e0c729d4500df475f3b35d060f2ca16db1b",
"support"
],
"html/editing/dnd/platform/placeholderposition1.html": [
- "c61c97776866587909f12ea9bd1096f9bdab8c44",
+ "d9d3e00162efe1ce85092d5ed03ab2712698f7fe",
"support"
],
"html/editing/dnd/platform/placeholderposition2.html": [
- "3cf7b7e7889df4520cda9e3e4814552f3366afb1",
+ "3231826549b1945c5f061dcca72947275efc381d",
"support"
],
"html/editing/dnd/platform/plugin/click-to-activate.js": [
@@ -581366,131 +587915,131 @@
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-001.html": [
- "26e63f3ca30ec1755116b9d69c9fe559e4484124",
+ "0e00706b09cea91c9eb161869bf5c042cf287ea0",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-002.html": [
- "266d248d0b9c1a0985fa1e0766b444a681c61e7b",
+ "b419a7b9bee26be19ef78938ad7c89aa2b4acb3e",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-003.html": [
- "6490bbac01eacb7b6772e310af563470ac1f7075",
+ "9ecfb90f83a1aee3290fb1f97aa15670eef28f6d",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-004.html": [
- "098804fab22177f640de5dee1e148c5eb7576d25",
+ "a22f9952d56b24638fa7dbe01e8df70833f8ffa5",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-005.html": [
- "fd3adec0b77bd2519bb3f790ebfec0607c983377",
+ "b74c96cf5d5c9e70ec526c156a08ce71a5940e3f",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-006.html": [
- "2686672b056ee21185f7fd4e72ed5f853dd20a46",
+ "3addcf5e4e3ce81c328e8b5b10fd3a3a23dfc2d5",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-007.html": [
- "bbad100b3fa5fa0c72ed71afff89e72b6722812b",
+ "d427fba823867305440ef95d49644733f18233fa",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-008.html": [
- "3b98c022525729ca15c67da6ecc63c0a3979c140",
+ "160424fd68a6a9220f21e4025ed3f64d9d5e0746",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-009.html": [
- "d2f924d28f29aecd53c27f38db01a08d29ced1bb",
+ "d65bed55b0667091c50b2bdfa85015bf7ce4c2b3",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-010.html": [
- "866091ab1d776b1b327a94c68008965bd1161a9c",
+ "4bcfc4b8f9e5120dca8164c3dba2a9d0feb6088e",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-011.html": [
- "55811c577718dd40927d5d8b795faa32e833693f",
+ "9dfe8bf560b6831cd6b87062df35dedd99d8bf80",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-101.html": [
- "95e6ff8e8603120de3a8151b4cceef6b861ff19b",
+ "ba9a9e867047c5999e3c555d5f9ad4e691d7806b",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-102.html": [
- "705e0ee83b73f8459d99c2a13b8ac8c74f4dc9cd",
+ "1ef27eec32fdf50a93c2803ccaa37ba382c73ab7",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-103.html": [
- "0ce755892bae513dbc8d8ff877779f50d2781b2f",
+ "a6a62c60e395192a2bab04171effcbecdb4acc19",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-104.html": [
- "3be7d524d5199afbd3442a8d4709da06dcbb575a",
+ "52c97c0385628759c116665fbfb246934ab0f1b0",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-105.html": [
- "ccc6c4c58e2f08a3d8cdb626e50688ae304c3298",
+ "81c933e43290fe02494e0c46c8f3d63df6b81059",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-106.html": [
- "179e72904d84b3b7ed9a7947d7b215a7bc119016",
+ "291d11c5ad7cf1b7b9680ffabf1c1a0dff896356",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-107.html": [
- "ccb92293d2a4f40319b771cc1104350b9ee38be1",
+ "43b834dacf2204beb5e011302a289d7380b568c2",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-108.html": [
- "53f5a3398d23ad6fcb68c899763618d0c1d50c3a",
+ "c855871bf48a49e2627f4d1cbbdcc0d8833aba3d",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-109.html": [
- "70b2d9d821afd9aadd861dd4e964b350c695310e",
+ "679c22f26b8e786b499e0bf57483955d97039c9d",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-110.html": [
- "992c0ca509d585a44067a5b40336f246dd9ceace",
+ "6d9dd941ea3810c432e09dd12db1c318f5ff2d0d",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-111.html": [
- "041e157828885c2432f960ed25d17bb2db5d9f48",
+ "24bcf2ea74192f7a975ea840d28db93d9fb96ff0",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-203.html": [
- "6561c41eeb53d8b4dd2b7ef639e194362174e0f5",
+ "6830ddbeb149f152b8c61eaa63501583aecbbc87",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-204.html": [
- "8784c160e30d81a6ac9b7674dbc211405d8ce235",
+ "86ccab5fdc37dc3fb64d9fd5c4e58efc74085e3a",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-205.html": [
- "fe954ef9271dac5562c9131e1f6431d22123fedf",
+ "dca911c62b36a5152b84d0f1dedcbd9830fb08bc",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-206.html": [
- "4375bb0b3106e616a155234c859f47033efd8672",
+ "099f6c6cff5512d3b2d9bc1c9f7eba95acd6b03d",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-207.html": [
- "7cb6ee40608e0796e947ac1c6f23c23d81832be6",
+ "35ba8994c5e0fb7bcb6f4aeff0b6c4e7a25ead0f",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-303.html": [
- "c56574cf7bd53d16e492d983818ce2bb323c1cf1",
+ "544d9dc1ccc951740309be779f43e28d60c88233",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-304.html": [
- "c7b789c27875b4ae78a8413824372b9cca90de5e",
+ "6e9b5fb608fd5fb30a69a4ce468a3e592dcef9bc",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-305.html": [
- "66572762520e3f848066d30f10fb50ff2c41d3bd",
+ "acb912b3cc16308defa2a62c5b767ed5a04b7155",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-306.html": [
- "4724f07a2b9f56c922f752b14dadb854b9de360d",
+ "ec06af4321cbee8d44cdb0fda550d77bea6f3c2f",
"support"
],
"html/editing/dnd/platform/plugin/plugin-dnd-307.html": [
- "4b408e346e94231d31b5702c8ecf2925bd7945d4",
+ "e5d33d9a6a6f26bee085c37f356f9126fb471bba",
"support"
],
"html/editing/dnd/platform/plugin/swfsources/dragndrop.hx": [
@@ -581510,67 +588059,67 @@
"support"
],
"html/editing/dnd/platform/plugindrop.html": [
- "b1a7efce8924b40ce8d009070f38b74b77b3fa15",
+ "6e37e2f982802d2f622bdcb5a3bc5f5a582fc4f5",
"support"
],
"html/editing/dnd/platform/selection-between-ui.html": [
- "a537a5dc47baa9a09f3257818cf971d5d0a36c5b",
+ "403f6c06457bbb23186d6fcfaa47bb06c116ba01",
"support"
],
"html/editing/dnd/platform/selection-from-os.html": [
- "441cc851c2ae9884d3e3dfabc1eadf7957bc0f0a",
+ "35c6d7e029ba52fe74233503c06eee508db9f5bf",
"support"
],
"html/editing/dnd/platform/selection-from-ui.html": [
- "5304729577a3743079eb3dae7aac20172679bd86",
+ "583134233b9a97d0ed86a0948e331ed7eaf53fc4",
"support"
],
"html/editing/dnd/platform/selection-to-os.html": [
- "3c08188f5dbbc24dfc96bfe9b5c9e31596beb684",
+ "c5bbdb252961819024db7054fd459fc0912a7a93",
"support"
],
"html/editing/dnd/platform/selection-to-ui-via.html": [
- "cae13b522b158ec12b4850c098ca7e3f912a4369",
+ "0e0e9b743f418c784288d71c8c784c31414376eb",
"support"
],
"html/editing/dnd/platform/selection-to-ui.html": [
- "ef70e00cf8618783633308a18c57d75b6585fa6e",
+ "28afa76e7b1ef7c7cb659a9e2c0c4755f7c25c59",
"support"
],
"html/editing/dnd/platform/selection-ui-to-self.html": [
- "12b9d43986b09f135995c86b1b471b256ee277aa",
+ "9f3cf659f1ad3b8383f51ec0e106b295eb4ef6c9",
"support"
],
"html/editing/dnd/platform/selection-unicode-to-os.html": [
- "6a8d163df16e2cc4cb2a00cf63a03e1571ab8b24",
+ "8050e466f9c2dfba939e3e4fc7b585b8a728341d",
"support"
],
"html/editing/dnd/platform/taskbardrop.html": [
- "092dfef33d00fcff9f953d70e6053c43da84e0f9",
+ "6371eef22f4b182b77c4f281c30d69db2ea071b7",
"support"
],
"html/editing/dnd/platform/taskbarminimise.html": [
- "416174681560779f37cddb0b3719386ee9a2580b",
+ "c5e249d74bbba0decf7313cbeff93f19197f7d84",
"support"
],
"html/editing/dnd/platform/text-os-to-os.html": [
- "066d062714057673b1637bdba6bea67c9d9e9c1f",
+ "a9a12c1e64a64f1368e10d71195eae8c6a5a388c",
"support"
],
"html/editing/dnd/platform/text-to-os.html": [
- "d32f928a7c28f2d60d430d387d6587aaa91a714b",
+ "b463cbc8783da5d0b564574397348f40ec7e34b9",
"support"
],
"html/editing/dnd/reload/001.xhtml": [
- "d92bbb903d6b39015f76507948eaf7fbaafbd5e4",
+ "283f3264f4c778952353d737a63c66ab7244db21",
"support"
],
"html/editing/dnd/reload/002.xhtml": [
- "d9291446bd4135e7b6e6a087b13fd6a4bdbcbe51",
+ "fda2ab7dbb0fb03a9609afe0adc2ca840ef17dc8",
"support"
],
"html/editing/dnd/reload/003.xhtml": [
- "5891b6dbf73bb4b29db22c2942bc8c2d9b857d57",
+ "f832ba69c23769cddbf29c0611bba0719fd729b5",
"support"
],
"html/editing/dnd/reload/004.xhtml": [
@@ -581582,15 +588131,15 @@
"support"
],
"html/editing/dnd/reload/006.xhtml": [
- "6354339f5276eefdc05c72f14c4de840fbe5d9d6",
+ "c5cd04697ac66bee0db632f7050f1ff6c50b0cab",
"support"
],
"html/editing/dnd/reload/007.xhtml": [
- "9725f15d119201f1c8f9837e722fbcbd8a481bc0",
+ "cfc4d56ebe1bb63a05bea8dd4b2761f07f753f74",
"support"
],
"html/editing/dnd/reload/008.xhtml": [
- "ab4d03a856ecf8515ab947dfc0e8a5ce04b29ade",
+ "353eaf47090b9e60ee0cae1644bce4f6436e6c91",
"support"
],
"html/editing/dnd/reload/009-1.xhtml": [
@@ -581598,7 +588147,7 @@
"support"
],
"html/editing/dnd/reload/009.xhtml": [
- "c54f3cfdf001ab3ad93f451de4316c386bacfd7e",
+ "508edeab64688479f3998e0971d5b98c068c20f3",
"support"
],
"html/editing/dnd/reload/010-1.xhtml": [
@@ -581606,7 +588155,7 @@
"support"
],
"html/editing/dnd/reload/010.xhtml": [
- "ecc523c73a5fb2c9b3bf6848ae36032e94849473",
+ "4766b0ebca3982f9aa2760d5f03340c2ee35a9f8",
"support"
],
"html/editing/dnd/reload/011-1.xhtml": [
@@ -581614,7 +588163,7 @@
"support"
],
"html/editing/dnd/reload/011.xhtml": [
- "c63127c904535f0bc2cb6241ce534089fb17fdf6",
+ "b54f8f32c82f21578ea22a0c6acd7fd812411ef3",
"support"
],
"html/editing/dnd/reload/012-1.xhtml": [
@@ -581622,7 +588171,7 @@
"support"
],
"html/editing/dnd/reload/012-2.xhtml": [
- "079417faea7ff1e7075ba995a08c23ee57bc0373",
+ "5c5b550eda182b531fb099376d97347d550d7232",
"support"
],
"html/editing/dnd/reload/012.xhtml": [
@@ -581630,87 +588179,87 @@
"support"
],
"html/editing/dnd/remove/001.xhtml": [
- "0f8e35a791dd9aa1e0ebca947750fa1554b9413f",
+ "9ea0775b92a035b7d70e08c94e207e6e18124f7f",
"support"
],
"html/editing/dnd/remove/002.xhtml": [
- "36d92c9a0a169b298255f970ec2552e33d8639a3",
+ "f936f0b6234210be82b07399ef971f8bda2d983e",
"support"
],
"html/editing/dnd/remove/003.xhtml": [
- "03b1c506370bdbca5ca2cd3ac41a44a0ef71c6e6",
+ "11306548315c0fae89e5de7fc08bb1cebbf7e157",
"support"
],
"html/editing/dnd/remove/004.xhtml": [
- "00c67b71217c1709be10f377f6f7fe3a6dfa7464",
+ "6f3b8321b747e0d389ebe869ad6c7a421a1d8bd6",
"support"
],
"html/editing/dnd/remove/005.xhtml": [
- "34b9af04b5ff36cb6cfbc1353871fadf47436536",
+ "9d4c5564e9a302938d5a08dc0ff99c4c949d9e64",
"support"
],
"html/editing/dnd/remove/006.xhtml": [
- "b1e041d7e157321cfb0cbaae38afe29bea8c8880",
+ "0fd7f8edc4aa3d671297f74efeb6c811a30e5a49",
"support"
],
"html/editing/dnd/remove/007.xhtml": [
- "1fae3a7c50a3462769292184975c932e01f1f41d",
+ "47e34375c495b6d22dbc65510c66eb8fe6cbfa9b",
"support"
],
"html/editing/dnd/remove/008.xhtml": [
- "d60fdb6997cc2a3607058a66fc82475ed9d6c669",
+ "ad4062c25af451c000c4669206db7759feb48773",
"support"
],
"html/editing/dnd/remove/009.xhtml": [
- "866dfb333c3fe3ebb3748bf19d951443f299b772",
+ "4176237b448c316080b5f42c5894822b0cf09d1c",
"support"
],
"html/editing/dnd/remove/010.xhtml": [
- "14c45961e70ac79b4a200ae1b5e18d9fb358ded1",
+ "0286531012409c0b3ef76ef3829f1d5415c83a16",
"support"
],
"html/editing/dnd/remove/011.xhtml": [
- "6451510b0e11ec29ad73ecfd848e83e3af39aeb5",
+ "fbb5de49e375b914d7f8c343c9192ddbe24d5e95",
"support"
],
"html/editing/dnd/remove/012.xhtml": [
- "cf9bd6973a2f98f35a889e60e543d15d9c9c7900",
+ "4e4cd42485abdb73453ade26991c4c3d96f96212",
"support"
],
"html/editing/dnd/remove/013.xhtml": [
- "6b83970f1ca256dea15adc85dc80446e1f9c731f",
+ "ecc93f0705dab524814aaa2cd34f7e7032f17c3d",
"support"
],
"html/editing/dnd/remove/014.xhtml": [
- "7008317ac6e0da6718fd0df0de6ca5fb4da52423",
+ "5e19f9da8a0f05f5e8e80a3db9ae1394f5b7262c",
"support"
],
"html/editing/dnd/remove/015.xhtml": [
- "0e11e383e2dd3fb3fad0a78c2f8e47d3ff907afd",
+ "3808f7a947f0192b135d0d8ec6387d3c8aa10c7e",
"support"
],
"html/editing/dnd/remove/016.xhtml": [
- "8bfa608a895e1dd6d5410fb640514c00e62f247e",
+ "331ce94189bf35120ddcd7e8c1d15bfdc2659285",
"support"
],
"html/editing/dnd/remove/017.xhtml": [
- "fcb2281f56027914863ae6dc363383f829994aa3",
+ "45201763306392ce16e1706b02e3bce3120ae620",
"support"
],
"html/editing/dnd/remove/018.xhtml": [
- "3fa998dfdda19d66b39940e72836c6c86f27b463",
+ "2dee80d49bdd67c4ddf2f610b42652abca816948",
"support"
],
"html/editing/dnd/remove/019.xhtml": [
- "8839958f80d2bf37cf248be360c3c0a4ef84238a",
+ "edece2e031d50b6d2561cc521c4e823d6af329b6",
"support"
],
"html/editing/dnd/remove/020.xhtml": [
- "e2bd4aa7f154f8e65aae7743ad8efaa46d63448d",
+ "cb5b134d629843461f2e4e8187842f31c1c19f8b",
"support"
],
"html/editing/dnd/remove/021.xhtml": [
- "e29027964f3346e940de6454f4107f247a3dcad0",
+ "6ab93757377f7f0efcb16628261dac29dd5c72ca",
"support"
],
"html/editing/dnd/remove/022-1.html": [
@@ -581718,7 +588267,7 @@
"support"
],
"html/editing/dnd/remove/022.html": [
- "3c5d83f5aa63a2e859eae087cc77c766009c02f7",
+ "55e2cc2c2d91fdbf824f4e14b40af7e1f2c354f9",
"support"
],
"html/editing/dnd/remove/helper-drag-me-input.xhtml": [
@@ -581766,15 +588315,15 @@
"support"
],
"html/editing/dnd/roundtrip/001.xhtml": [
- "35910e7dc9d4fd4b0bfc554e8c8e503eef119a3a",
+ "a05441a7257573fd5928180b19e88e55d9da5547",
"support"
],
"html/editing/dnd/roundtrip/002.xhtml": [
- "6e67ae5f30c30fa79b734cd83c7324abf936782b",
+ "49dcd28f17ab53cc6c77901ff7ff936278315dfc",
"support"
],
"html/editing/dnd/roundtrip/003.xhtml": [
- "2ac1c5c8528aafc3fc2a43194f1ee12fe10c48a5",
+ "af98f90f3bfcfe09f840318de84d9786dbf0b450",
"support"
],
"html/editing/dnd/roundtrip/004.xhtml": [
@@ -581786,159 +588335,159 @@
"support"
],
"html/editing/dnd/roundtrip/006.xhtml": [
- "c085b1e46a17bede2d1928e1eacfac03ef4f9294",
+ "a27832b83ba24d414bf800fb1359b90b573d5e35",
"support"
],
"html/editing/dnd/roundtrip/007.xhtml": [
- "1a65f557c84ef26e5b07b6717b5092764921ea52",
+ "6e652209efab99b6140fc31e2539a2b1c7bf5b9c",
"support"
],
"html/editing/dnd/roundtrip/008.xhtml": [
- "18b69558cf10dd12b47cb66e7facf67c8caba276",
+ "f104c6eb242307a1282174b50c26891555ebbaf0",
"support"
],
"html/editing/dnd/selection/001.xhtml": [
- "bcc3875f19f84f6a581cc844579093c8cc9460d9",
+ "d88b3e95fbb34d2e4300924549dcc2f8500b9ed2",
"support"
],
"html/editing/dnd/selection/002.xhtml": [
- "082726f1da83519d228a21eff653dda4a9c0559d",
+ "e13ff85c063d72fe42b01623e307b71b5ea0e91b",
"support"
],
"html/editing/dnd/selection/003.xhtml": [
- "ff7bc36fe40f597ee6c7df5a0cd66009cad8e0eb",
+ "4b8dc59daa4147b12dc6fa0ad0dcc510b915ac48",
"support"
],
"html/editing/dnd/selection/004.xhtml": [
- "5e3054988544c7cacc40e8ddf8b27c3f554cae20",
+ "ca41b15576d6f0d84b5af16e9d04adc5ab5b8112",
"support"
],
"html/editing/dnd/selection/005.xhtml": [
- "cb4f3817758bd3b2717e4d136b306f1e54ec626e",
+ "b9fc44169074cc2a39f43866c9663ffeb44d2bc1",
"support"
],
"html/editing/dnd/selection/006.xhtml": [
- "3c5cb313114cc30186648d45d2c177647191c052",
+ "2921eab471a14049fd3d4f0959969c3022709199",
"support"
],
"html/editing/dnd/selection/007.xhtml": [
- "2be29eed54fdc7bc111f32b9341a7c4673a96d6f",
+ "9aa0900a74f3e903f7e03b3c5f0f9adbb0a38310",
"support"
],
"html/editing/dnd/selection/008.xhtml": [
- "5acfd761a7f0e3bd88ea00dbaf2c2e15c50d21d0",
+ "67ea3296f69422fa8a59b07cd7e3f27c8f9be6b0",
"support"
],
"html/editing/dnd/selection/009.xhtml": [
- "29133c60fd37908ec7cc49f0464ec158317a2094",
+ "ff46a354ec4310f9b95f19e067a5447f03700584",
"support"
],
"html/editing/dnd/selection/010.xhtml": [
- "c5f568fa86f7523e80bf15a0bb85150c41cbfbcb",
+ "9c282da7ae0f3f0de653e25cf803a27d54e2e7b0",
"support"
],
"html/editing/dnd/selection/011.xhtml": [
- "5ca9f924daf67bbd5739dd7a199e96ccf859dab1",
+ "521506e2c12031b7e59072d5220b359ce2fae16a",
"support"
],
"html/editing/dnd/selection/012.xhtml": [
- "edd17e075648ef69e957ad3d351a62a3f54da0e9",
+ "2f86f404c2172b7a6eb6dae10caba63a1341b3ae",
"support"
],
"html/editing/dnd/selection/013.xhtml": [
- "8f8106c65d7550b6b773943388d67618a6850fdc",
+ "4e4f8ba9cc38f78dcf0d6d229192809131ec2832",
"support"
],
"html/editing/dnd/selection/014.xhtml": [
- "420f882ca240bcc44c3837c1028f0a17e10aa830",
+ "9aae0e8fe4874558d5eb3ce840eb546731b12afd",
"support"
],
"html/editing/dnd/selection/015.xhtml": [
- "3a67566780decd4e706876c4d08cd6b681c49cfc",
+ "19728fc63386aa0c12ed083f2551fb0619d18cbf",
"support"
],
"html/editing/dnd/selection/016.xhtml": [
- "4b5f23a7519bd705a9feb8037094080b2ab37056",
+ "6d83ef0384c5357e73ffbae078998b4c75367c86",
"support"
],
"html/editing/dnd/selection/017.xhtml": [
- "a424c3bef978a593b79e4355ebc29290c26829e0",
+ "8840d5fb7f7571be1098055507c2618edeb33817",
"support"
],
"html/editing/dnd/selection/018.xhtml": [
- "08ca18944f5ac1c0aed4b5a2e57d0785de16f040",
+ "6f52319c0dd2bb8077bd4d661305a62926b1d82d",
"support"
],
"html/editing/dnd/selection/019.xhtml": [
- "aee68850571f63f64c1dd32584b24b01eadb20ac",
+ "3524ce91c9a1965a1ef73a1e6e9849784932ae80",
"support"
],
"html/editing/dnd/selection/020.xhtml": [
- "2c13786d6223b3c6066f6d9d23f8c6b918182ebb",
+ "9bbfbaf76e126441dad1344535404ee40e06836e",
"support"
],
"html/editing/dnd/selection/021.xhtml": [
- "89a87e1ade7850af9509d1bc6400fc17271d6eec",
+ "ea2fcb5de2893a81133bd2d4cb65ac07d442372d",
"support"
],
"html/editing/dnd/selection/022.xhtml": [
- "85455ab9f481e5a841ebe0082d7a04fd9880829d",
+ "f079b7469ef45a554af78c772dc85828255c8b3d",
"support"
],
"html/editing/dnd/selection/023.xhtml": [
- "fdafe3639278936eeb96684b54f37440b7b379b4",
+ "4e0c43255d75f3e95a1569e031b277c4f22d78db",
"support"
],
"html/editing/dnd/selection/024.xhtml": [
- "56981ae946751118e4824d0528f3db1004145068",
+ "8e9b348fd5529d263ab6d2c98452ea3e05622843",
"support"
],
"html/editing/dnd/selection/025.xhtml": [
- "096c85d97e37beda6ba7800b9fa0e9738643f618",
+ "d6ccc2d067f00dd08591722d511d57b87cd9fc70",
"support"
],
"html/editing/dnd/selection/026.xhtml": [
- "2f175465dc545ed2d4b4e49fb102b12aaf65b099",
+ "1b350e96dc27adc07e59a079033f9bd7d1c3a8a5",
"support"
],
"html/editing/dnd/selection/027.xhtml": [
- "c8280d8270ebec64bb0ec4574b6aea9affe4676f",
+ "b1a8e647cf824d9379f4733110611de56f02354a",
"support"
],
"html/editing/dnd/selection/028.xhtml": [
- "23b03ec6d3bb73c81a2d324c1d63da630465e893",
+ "007a9bf1d9ba01364cea2adc054204dbab2e47f0",
"support"
],
"html/editing/dnd/selection/029.xhtml": [
- "8ff271378f27f0c88e8836175f28bad7d9bd2821",
+ "25f5b71b290690e6a5c73d141adfe6f2e4c1c2b6",
"support"
],
"html/editing/dnd/selection/030.xhtml": [
- "233b6eba1a8170207a8edd58633518f0f95b1352",
+ "bbcfce5398676e9ad6d2a508ace0bd218ee3b700",
"support"
],
"html/editing/dnd/selection/031.xhtml": [
- "be3c230d7246c6f8903be0ac137aa8d39fae4955",
+ "c5e2ae55f2d0c924c4a46ee08305201ad5d6926b",
"support"
],
"html/editing/dnd/selection/032.xhtml": [
- "c76c77ad1c2d6049116129dbc83649081f4c73e3",
+ "8b2c3e25319b5b76f5ac3459cf7f44e7a8ed36e3",
"support"
],
"html/editing/dnd/selection/033.xhtml": [
- "a00e9415cef951e1fbd9794cb51b38a113fbf974",
+ "944d6b646c3993fd8d3a4ba4aa7fa25e60e8dbb5",
"support"
],
"html/editing/dnd/selection/034.xhtml": [
- "384cdd6581c109e4666b655ab31ccc5fee6c8c71",
+ "9a7821d7e6ef5d9e798f27d37b9fb693690053d8",
"support"
],
"html/editing/dnd/selection/035.xhtml": [
- "0ba40a6a07ac8727e631305a1dda308b404ebec3",
+ "3e83a7ff83dfc7972d41d05ac442b6e57a5074b5",
"support"
],
"html/editing/dnd/selection/036.xhtml": [
- "b8fcbfa04d5e73da3adaccd68dc8dd06aca3d15a",
+ "fbb17a02dda1100ac6ab25e57ec228d536a2bba0",
"support"
],
"html/editing/dnd/selection/037.xhtml": [
@@ -581974,103 +588523,103 @@
"support"
],
"html/editing/dnd/selection/045.xhtml": [
- "f5884dc16831f097b9eabc46832b77623383974d",
+ "c481ad5b81f218ef3d1cb849f61fb61edb9e5e6b",
"support"
],
"html/editing/dnd/selection/046.xhtml": [
- "0a413a5d9c7d0b0f5303a50e84722496a82e9bf8",
+ "d8c8f27a34639cde55add283529406d2e20a5988",
"support"
],
"html/editing/dnd/selection/047.xhtml": [
- "e89fef1487d164b666d0e4f38bc0e3e3e8da3049",
+ "08807edbf76689ad05a46af59712cd6869b13a1a",
"support"
],
"html/editing/dnd/selection/048.xhtml": [
- "050bdb1bd06a1dd6c19895b55dce130e223c262f",
+ "febb047456e71c2c3e4edeb10af2625c30998d0e",
"support"
],
"html/editing/dnd/selection/049.xhtml": [
- "ca50a87205c0b133c0f7411cfc5083342c22eed4",
+ "e2d74c13f303d406f598478051c405f1e5945b40",
"support"
],
"html/editing/dnd/selection/050.xhtml": [
- "7298a2fa2889f53b0460b860be3e98aa76e2d0b5",
+ "5b646b6260b30e1f75e3fdf44097de68103d6d95",
"support"
],
"html/editing/dnd/selection/051.xhtml": [
- "fecd1081d193018358cfe38ee24db60b144c541d",
+ "aed697e585703448228cf22608bc8bb6c0f67744",
"support"
],
"html/editing/dnd/selection/052.xhtml": [
- "83ae1f9599e911966ab22939cdacea4d0f35f9ee",
+ "a03e2980b06330afca8bd6c94cbde031e20b52e2",
"support"
],
"html/editing/dnd/selection/053.xhtml": [
- "344b78e7f290fe6f9b23d73ec403d3bfe558f157",
+ "44e29b3684061082dd8868ea40c2ba935c352218",
"support"
],
"html/editing/dnd/selection/054.xhtml": [
- "b5494c07923734017fca9c0160df72cd4375899f",
+ "34f698a2bdc8989a80c2eceaeb80be9c55f84589",
"support"
],
"html/editing/dnd/selection/055.xhtml": [
- "b26bf337ae728f0f6853f18104d97159b2166452",
+ "77369e8c022218fa4506e99f7e931c85e0ffcd52",
"support"
],
"html/editing/dnd/selection/056.xhtml": [
- "9306c5b4d16391e9870ca42820d016113a5951b7",
+ "633288558a52dfd27bcb6f1d26ef8a0c9951d472",
"support"
],
"html/editing/dnd/selection/057.xhtml": [
- "bcba83fc42529f38f916e87583d70bb3ec57acae",
+ "2d758ec6166881ffe36f303bb0d67cbd23ac06ac",
"support"
],
"html/editing/dnd/selection/058.xhtml": [
- "c877bc9aa2919e8207ef0e33fd62e38feed6a044",
+ "449dae4827aa431c459facddb6153b1da6028815",
"support"
],
"html/editing/dnd/selection/059.xhtml": [
- "12887622efded82b64cecd24c771ca4888e7718f",
+ "7864a9058c2860d541f98216d29d348271c74ba8",
"support"
],
"html/editing/dnd/selection/060.xhtml": [
- "525a3c45a6cab8c6b9111394dfa89ec01483c813",
+ "1b5db934b966f56c4b505dfb4850ff8276cc73e9",
"support"
],
"html/editing/dnd/selection/061.xhtml": [
- "aeffec2032039fe063fe66f64b10d50ea399ebd3",
+ "2651bdabace6ce33c76142b80856822566e7c14b",
"support"
],
"html/editing/dnd/selection/062.xhtml": [
- "f93c612352147fc3f2dde87ee040e22b6965af7a",
+ "35699d2248f9b737e1c5614573af92a2b0de40a0",
"support"
],
"html/editing/dnd/selection/063.xhtml": [
- "7e42b0fa378dc434750d431cd73a4dac90ea8020",
+ "88a2f8f0dba711bb0a4ce784c73dc4a67e9255b4",
"support"
],
"html/editing/dnd/selection/064-1.xhtml": [
- "5e10d1a49b31d43fc7ac749f513f7de48767881c",
+ "82094413188c390f271f5a2dd7f6d9fecb725b10",
"support"
],
"html/editing/dnd/selection/064.xhtml": [
- "d63a723a6b6f28a67d8342681d591e1b7dab4789",
+ "5851df8640ced6a9c3efdec533af7113b58263d0",
"support"
],
"html/editing/dnd/selection/065.xhtml": [
- "69a16372b9c17247ca340552b067f02ce6c715a4",
+ "a7ab52523e878206ad7e2e7ad6af69110751ff1a",
"support"
],
"html/editing/dnd/selection/066.xhtml": [
- "172f2a271221af4b895d4f2d11281777da8b2d56",
+ "a3c42865f801ed960c07e8e85500d721addfe03c",
"support"
],
"html/editing/dnd/selection/067-1.xhtml": [
- "33d9b6f3db48dd6068e35c4524d853ba24832b37",
+ "e23f9e90640f80c150ada8f5f07584009f1b9ce5",
"support"
],
"html/editing/dnd/selection/067-2.xhtml": [
- "adbebf329f0794c1e491073d081610b89c1bb58a",
+ "e3aa609ee6afd3c239e84a488ef264ecaf1fe658",
"support"
],
"html/editing/dnd/selection/067.xhtml": [
@@ -582090,91 +588639,91 @@
"support"
],
"html/editing/dnd/selection/069.xhtml": [
- "18536c4e804f60e9d23fa04ffa9333d335cf8ebb",
+ "3d91be4db232c02a790153e44c6d1e85a906f778",
"support"
],
"html/editing/dnd/selection/070.xhtml": [
- "142edced6fa3a7ffb294565d343fa0d563af3ec2",
+ "bdbf70efad3ea481bd1297f51e3be22ae53e4270",
"support"
],
"html/editing/dnd/selection/071.xhtml": [
- "9d4ff188023839421356105782768cd41282e33e",
+ "277dbca07755f06ee630664bbb2bc70a3325b603",
"support"
],
"html/editing/dnd/selection/072.xhtml": [
- "039bb19aa6dfe4d54440e9795cbbe7565f8521ab",
+ "4b9a7ced4964a4fe992bdb154d855f9a92457b5f",
"support"
],
"html/editing/dnd/selection/073.xhtml": [
- "105e7dbe7374d134412d8d44d6276da666f75855",
+ "ba4efe1fb44db07c4b7ab53b5a1d174f00f18f74",
"support"
],
"html/editing/dnd/selection/074.xhtml": [
- "a3527b647fbf9c8a9b0f5d5e3a79ca719bd5eba0",
+ "3bc3570b2e3e3c3e666878da750e18762dfbd472",
"support"
],
"html/editing/dnd/selection/075.xhtml": [
- "c1e386865a00756e991778069812cb77b3e18ed4",
+ "941546b499bbf44416c2276c8ada224e1c7e1332",
"support"
],
"html/editing/dnd/selection/076.xhtml": [
- "13e3053c9be495f1ac18b224b5a0e61b15c56b7d",
+ "b27e505e7840cb7ddd6b922ccd42582c89723623",
"support"
],
"html/editing/dnd/selection/077.xhtml": [
- "edcf61dc8bdc874a5a2ae845ff63de254b5818c2",
+ "af61724a55533d258d4bde62099eab3d65cd5dbd",
"support"
],
"html/editing/dnd/selection/078.xhtml": [
- "f89849494f341b49ac1eff42a919efcec184f7e1",
+ "0557e0dd2e26effabf1442b3501e0114c7baa1e4",
"support"
],
"html/editing/dnd/selection/079.xhtml": [
- "e6743d30b475b2f10bc9b9bbc35195e3ce9aefe0",
+ "0c2cc9d244f08d92f87c48534120688d91f1dad3",
"support"
],
"html/editing/dnd/selection/080.xhtml": [
- "18a59ae2df4f563c3075d546374acbdfc6f1a0e8",
+ "683b9961b749144b29f38ac700e86c3eb7b40211",
"support"
],
"html/editing/dnd/selection/081.xhtml": [
- "b7c8c417b75b022915c65f94fa840232362c279e",
+ "6a4ce0833e25eeafda5ce06c181ae0e5f8e117bc",
"support"
],
"html/editing/dnd/selection/082.xhtml": [
- "ce63fb290218fdbab4daf18878e92f19efa27a68",
+ "f39a9a6941ee7a1bab0560aacd4ff794176fd92d",
"support"
],
"html/editing/dnd/selection/083.xhtml": [
- "2668e41b0e162277ceff10828ce62d0cd345c5a3",
+ "a46bd081bab9d823fe8155b09759735c1c92841d",
"support"
],
"html/editing/dnd/selection/084.xhtml": [
- "a85f966841553ecd119326e7cbbc6a82dedb2152",
+ "9aecd920e4402751f5fab409a747a7887531b4cb",
"support"
],
"html/editing/dnd/selection/085.xhtml": [
- "9802df8f40d98477a56fc4170c4c8dc79345d167",
+ "1a4dabd36eaffba7f7a6a26b2a10e50969ced51e",
"support"
],
"html/editing/dnd/selection/086.xhtml": [
- "a7285720bb63bb54a735e0cc43c3ddd84b37e7dc",
+ "248e087afc56ffc7e1d967a919a43e2ccaf1251a",
"support"
],
"html/editing/dnd/selection/087.xhtml": [
- "5564255ea19b7aa1e7eee5be59368db6f197a9c9",
+ "212927bb23b71d36bf0276931304c6379c598107",
"support"
],
"html/editing/dnd/selection/088.xhtml": [
- "db83700a240c4c173962ccfdcdc2a73e5fa44dd3",
+ "89fd1c3b540de1f3186e0468be6334e51b8cc6e2",
"support"
],
"html/editing/dnd/selection/089.xhtml": [
- "81d750a30fd188c30a014c35279e5b7b4e7e75a9",
+ "f20831d1f2f02aec5b6470190af80522b3df2c6e",
"support"
],
"html/editing/dnd/selection/090.xhtml": [
- "8caebaeb0aafd762887b2af6427f9c2560a809ac",
+ "5bff64ca2bdb8614dbe63f691680de44d0ce5a2d",
"support"
],
"html/editing/dnd/selection/091-1.xhtml": [
@@ -582182,7 +588731,7 @@
"support"
],
"html/editing/dnd/selection/091-2.xhtml": [
- "272cfdc1145186a01be60947df67c44aaee138b9",
+ "da4936496846b405a15d6f930e2494d85b59eed7",
"support"
],
"html/editing/dnd/selection/091.xhtml": [
@@ -582190,59 +588739,59 @@
"support"
],
"html/editing/dnd/selection/092.xhtml": [
- "31334b71e61f6931f9e3e17f80a301524323ef41",
+ "bb8bccd0070976d6dd2fa3d9b36e3caf6480835c",
"support"
],
"html/editing/dnd/selection/093.xhtml": [
- "fdf75adc8ebbb094455ea429632197e4d2f363ee",
+ "db1462150094c5dfc6d7e4c1e079860fb93b1464",
"support"
],
"html/editing/dnd/selection/094.xhtml": [
- "c084d041d994c4d00cafc1be793cbc724286eb6f",
+ "5a8d5f163d163e83db99fb040eff4f74f8564b1f",
"support"
],
"html/editing/dnd/selection/095.xhtml": [
- "2f5b241b7c346628d2e6427e7f5b4a4a679dc030",
+ "a3e13a008d78dd951af0daa96afe132942bca65c",
"support"
],
"html/editing/dnd/selection/096.xhtml": [
- "2f65c8247a20176a5b96cb95ca8a158ad39a1591",
+ "3413468f0cbe5e6c7059d566e3c76b02a0b932e0",
"support"
],
"html/editing/dnd/selection/097.xhtml": [
- "48584035afe5a291a47f75d113266d3a21a96bc1",
+ "df70163ef8043bbb749351db0395493b59a3b321",
"support"
],
"html/editing/dnd/selection/098.xhtml": [
- "2b7344aafff856d074d7bd1cf939803e2305ee3f",
+ "297956a3ef9667d11bdb1c85877dc7d72e550e26",
"support"
],
"html/editing/dnd/selection/099.xhtml": [
- "75b605e4f17b4a7d72e52263702a6d0d5f0d6389",
+ "76ebe0c777ef2fde18741b50d575ed2cdf1045a1",
"support"
],
"html/editing/dnd/selection/100.xhtml": [
- "048e9f88ce401fefbaf1de95f6356e924c17b195",
+ "9f796e6a7de3a1b5e4a693405e60ec1d1fb611ec",
"support"
],
"html/editing/dnd/selection/101.xhtml": [
- "13fb2ab4b6deca8ad204f05aba5f4dcf1ae067f3",
+ "689548e6b63eaab63bdc5fb6a33b60505d1efbe7",
"support"
],
"html/editing/dnd/selection/102.xhtml": [
- "19bf40a3447c8babf04231f19a1933fcfd0239d0",
+ "9e3da70ded56d7898900bf79edca8579762ff404",
"support"
],
"html/editing/dnd/selection/103.xhtml": [
- "42897903027cd75a3d2a105f8b00b2a158638e11",
+ "d5bcfa9f39b04c44b36dd8682b34a650447a50df",
"support"
],
"html/editing/dnd/selection/104.xhtml": [
- "0fe1e4435af9c5b3c1d44048b0f0862e480516aa",
+ "9b7bf3a3e4ba9963c5934962fc6152c4751e94e1",
"support"
],
"html/editing/dnd/selection/105.xhtml": [
- "86cf4da92041c5df61e45d1218f8128f82a0d138",
+ "378893f578a416ba6b694c8d62d76d7fb06bf510",
"support"
],
"html/editing/dnd/selection/106.xhtml": [
@@ -582254,7 +588803,7 @@
"support"
],
"html/editing/dnd/selection/107.html": [
- "2cca91614cde86844f9953a37c88cb5d39b385b5",
+ "e71be4ba414752043ef8f9f6cd73de1150b78261",
"support"
],
"html/editing/dnd/selection/108-1.html": [
@@ -582262,195 +588811,195 @@
"support"
],
"html/editing/dnd/selection/108.html": [
- "3e82be6fffa43b7b7ee9ac515d668a37ddd9484f",
+ "bcaeb81994e4e279a9a59ebaa3f2d11e2c1ff3f1",
"support"
],
"html/editing/dnd/selection/109.xhtml": [
- "410ec4f20efb61af8d2fee407d557eb9ca5ea12d",
+ "2710bfb5e1e4d73c005332de2bb9b95d89685997",
"support"
],
"html/editing/dnd/selection/110.xhtml": [
- "2abe9d211b361a433cc2d32f56c4317f07f424b9",
+ "752ee35c9fd9f482431bd09977c1fa8869fcf231",
"support"
],
"html/editing/dnd/selection/111.xhtml": [
- "91827aea5c9e120b71c6e2f7507ed34e98960b58",
+ "e4156ea60b6e501d8691061dca758e951d233f1d",
"support"
],
"html/editing/dnd/selection/112.xhtml": [
- "c3934a38bc1a13d9669eeb345e62687428ebd884",
+ "aa9fb1efa342a64cb387df67a29227484b86b50f",
"support"
],
"html/editing/dnd/selection/113.xhtml": [
- "6cb1c4652b0998bc9daacbcd353d636e5b41db21",
+ "c55b9258e40c7033c813a8c83f885228c84f39f9",
"support"
],
"html/editing/dnd/selection/114.xhtml": [
- "74d580a0effce9f8b8f13563a40f3797cca6e693",
+ "36f8506c983b4488d0967c8b435f57aea5d0f741",
"support"
],
"html/editing/dnd/selection/115.xhtml": [
- "1f281c638539a2dc5a1555770ef11a28e4d6730a",
+ "bcfd91f1d76cfb39d27cde81f7ed26d3898d29f8",
"support"
],
"html/editing/dnd/selection/116.xhtml": [
- "13179222d469f226e88249ec5c9fe312821f60b6",
+ "f32259e61c248b509dd886f87c3cc5d5acae40f3",
"support"
],
"html/editing/dnd/selection/117.xhtml": [
- "d3e9e8909238ee12158be89544fd5a5055d6b196",
+ "e20fb5c754c9655b3462b1bcb2d7c3906e1bd02e",
"support"
],
"html/editing/dnd/selection/118.xhtml": [
- "4ba8cea88bb868eaafb221546b80d4050b574d96",
+ "71f8dff5cb622bf3332d53e59944d33dceca28e4",
"support"
],
"html/editing/dnd/selection/119.xhtml": [
- "8fe5a5dac2813a9a541d8c7c8d7c7484fd520b0e",
+ "87134262607f05186683911969db10771293e4a9",
"support"
],
"html/editing/dnd/selection/120.xhtml": [
- "950d7b21ca8fc99621ace09e901cfb177423e232",
+ "ffa2227c9e179211817a22978d1dade5b2668463",
"support"
],
"html/editing/dnd/selection/121.xhtml": [
- "c0ed17be98da4cc98c4ea94ac60394c472bacc84",
+ "0ebb217369dec3bb6303345406b2ebf176134584",
"support"
],
"html/editing/dnd/selection/122.xhtml": [
- "693838b5cd33985b54293aeea9e558a00249f628",
+ "4154d11a5dd6b13e4ac520f5e13e3dc012d9862c",
"support"
],
"html/editing/dnd/selection/123.xhtml": [
- "49e629fff740c24233c50045131bdacbcaa4d18b",
+ "4fd7cd5b18c2446518d6175c20ade19d054971fa",
"support"
],
"html/editing/dnd/selection/124.xhtml": [
- "18a86667c2c0d88edbbb78a697826c227837f670",
+ "f519002ca9fb35ab64e039801849348909f458cd",
"support"
],
"html/editing/dnd/selection/125.xhtml": [
- "3dcd05f15f5f4c527cc2c4222c45c0c69cfb44e4",
+ "95e9404cc70212d5b7738f82c8be06dd67261972",
"support"
],
"html/editing/dnd/selection/126.xhtml": [
- "373cdf6235981d1a9643257ffb841067f8c88d9a",
+ "f3920ca7744a47db096d9784d5b05efa32ad09d1",
"support"
],
"html/editing/dnd/selection/127.xhtml": [
- "35a3c87bf708b0a17c600bd987a0cbcb6d5d7300",
+ "dd1109c4643f198a8e7f643f62b5aa8333f85f14",
"support"
],
"html/editing/dnd/selection/128.xhtml": [
- "974741070060c72cd5e6e21f97d1d489349fc53e",
+ "62c3f210afc02a6bfdaa1ac4abfdf77b6e057544",
"support"
],
"html/editing/dnd/selection/129.xhtml": [
- "2f6d5e47278a2320b867e01ed1a09013db8498e2",
+ "92eadfb6f97e83a9dbc0d2b61bbd7cf671c7f260",
"support"
],
"html/editing/dnd/selection/130.xhtml": [
- "85dfd7bdcccc96950ea8dd3d0f4344ddd1ead21f",
+ "0531cb5664194c8bab40f4a229631f761ef0cf83",
"support"
],
"html/editing/dnd/selection/131.xhtml": [
- "428c5d08b394381aaba5b78317752dc103212cae",
+ "6794607f3779fe868943d62605fa3c20e44eaf9a",
"support"
],
"html/editing/dnd/selection/132.xhtml": [
- "1b7188e2bee6f1f14bce6227954216e2a9ece328",
+ "f016d4fc6a14ef101237ae6eebf40e9aadca3d86",
"support"
],
"html/editing/dnd/selection/133.xhtml": [
- "4145b9257bd6aa51fec3562fed3bfa372c615c62",
+ "d9b1ae2e8f98726e78ee91cabb1e4579333eaef9",
"support"
],
"html/editing/dnd/selection/134.xhtml": [
- "bc597272446c08fbea502bcd42e1f1eb148e12f3",
+ "b2cd44d7d1abc842dd87f45e8db0bb852cbf4ed7",
"support"
],
"html/editing/dnd/selection/135.xhtml": [
- "768579806267150edcc6849dff665ce3d343fb00",
+ "b17050442ea568f27ac719e2bb4efc83dd046749",
"support"
],
"html/editing/dnd/selection/136.xhtml": [
- "f49e431e13e080785b28b6e6fb79034abe3b8bf4",
+ "fd232911a49734a9b3067f43471f597c9bf471ae",
"support"
],
"html/editing/dnd/selection/137.xhtml": [
- "9db0b373c87638fdb9548c56393359e7012be84b",
+ "19843e87e19a4880ba5a08bb5b54a68e4ce0cce3",
"support"
],
"html/editing/dnd/selection/138.xhtml": [
- "19ecc285c01f1cfecdfd778985117f4e95ab8c4b",
+ "db86401a6662fd4df8c4d9e2faca9565f90c7e48",
"support"
],
"html/editing/dnd/selection/139.xhtml": [
- "f886d99f4124f71751c9fef2b10d133945f7118f",
+ "bf8a61c0ff6754e6839ee1708a2f09752fdfb0cd",
"support"
],
"html/editing/dnd/selection/140.xhtml": [
- "33accbbbcb8178c7bb5736611d6430af90c006d8",
+ "590723b00dccf554db174e5d6963fd35a313bdad",
"support"
],
"html/editing/dnd/selection/141.xhtml": [
- "a25885e0004dd432e9eeca269281966b103115cb",
+ "928bc03adb829dcff4ca5aa57b3423aea3053deb",
"support"
],
"html/editing/dnd/selection/142.xhtml": [
- "746404fb85fc1f8fef3ea61b57e1fc1fd3bb7d58",
+ "516481863b4a6f6e6a42d6d1b1aea4eb329e662e",
"support"
],
"html/editing/dnd/selection/143.xhtml": [
- "294393f63adbd1baae217403e392acc74f8bae12",
+ "36e94eafc1c8c813fde6f25c10fc6b7175cfdc1a",
"support"
],
"html/editing/dnd/selection/144.xhtml": [
- "f14716dae25e5b65c480727fbc7ef671a342da89",
+ "e564d1cfcc7a6a2a509e912d137c0d862117b956",
"support"
],
"html/editing/dnd/selection/145.xhtml": [
- "e3ee1b36037b95445e97bb58c4e49e9df6a03c12",
+ "919f9c5eee7131dd0f6c47a9dc36cc0ee036081b",
"support"
],
"html/editing/dnd/selection/146.xhtml": [
- "8f6b109e305301aeff5ea242b534b3069e365bac",
+ "aa80d5f64a3744a364c4a1d337c48ac4d5bd18b8",
"support"
],
"html/editing/dnd/selection/147.html": [
- "d612ab7d304ab06a6e45199a8d7aa73584f3a95b",
+ "4d91c8e4e547a2d09420ff2aab895dc8540ffec8",
"support"
],
"html/editing/dnd/selection/148.html": [
- "132197ba07fe5d79d407c621865335448bf881df",
+ "36f836e281284ba942c56ab7c4e557c3647b3250",
"support"
],
"html/editing/dnd/selection/149.html": [
- "60bc54c919aa74f7aef45e5a55f46f06fe6c0927",
+ "99000fee44a3531f9db4e7438f36f6403b0a2cd8",
"support"
],
"html/editing/dnd/selection/150.html": [
- "1e2bcc417ecdb56d599dbd7b2334bb9e5e74b9c0",
+ "bd5d180114a2f5b4bf3d5123c04e0e3ab4b5b39d",
"support"
],
"html/editing/dnd/selection/151.xhtml": [
- "a3de33228978c55cd79cd26e326a13183f0879b6",
+ "4b7d98d163d86105c356db2e37f57ada48196e17",
"support"
],
"html/editing/dnd/selection/152.xhtml": [
- "9489b21501e9e0ac12d73f8b7f4913f66daa07d9",
+ "0d916848464eadd0b6de942d35d56c4ef5813cb1",
"support"
],
"html/editing/dnd/selection/153.xhtml": [
- "41c74a56125e71ad0e221eff588d4f6989fa61d7",
+ "7654aa1b086e83bedfb65e19dc7b9414e066bc71",
"support"
],
"html/editing/dnd/selection/154.xhtml": [
- "5d3a1254a7b9246ff33d2e5e1f422a8dcd8c251e",
+ "2860415406468e56983c0a21a9201667893439cf",
"support"
],
"html/editing/dnd/selection/155.xhtml": [
- "96c2a802e21ae7d94a87fddb1f6b3b45df4c9ffb",
+ "431640c71909bf48b201c5734178a3839ae9bc76",
"support"
],
"html/editing/dnd/selection/156.xhtml": [
@@ -582478,51 +589027,51 @@
"support"
],
"html/editing/dnd/selection/162.xhtml": [
- "ef579f5f0876093b8427931eda9766079c51a3f6",
+ "c07820527933055747cc9d4e533bc3fa69c1653c",
"support"
],
"html/editing/dnd/selection/163.xhtml": [
- "dee09dc300b11f8f1e81243acb68a0f435c9ede0",
+ "5ff164c75b6d9e99dee4e2a98eed3ba13a61f9ef",
"support"
],
"html/editing/dnd/selection/164.xhtml": [
- "5a3c38f18286ac368eb8f631447f839afa26e7c9",
+ "817908b8d8f0a08a0bef60519ea80c09035d455c",
"support"
],
"html/editing/dnd/selection/165.xhtml": [
- "2558f4c40971fb4b36496ad5febe20385853097c",
+ "2e1b6363f80326f4ce8cbbbb8ae9d992d5e85357",
"support"
],
"html/editing/dnd/selection/166.xhtml": [
- "de93c82db2c19a6667306ec3b82a370925f3bec9",
+ "8f5063b6ffbad220abb8286542de75fcc6a28728",
"support"
],
"html/editing/dnd/selection/167.xhtml": [
- "58980244518992396707acd0a2c44a282172efa7",
+ "c6dcf0704a639b638bed7ab170fe431dfaf59bb6",
"support"
],
"html/editing/dnd/selection/168.xhtml": [
- "d77f5514998226d493e849f945c475e030b31ad0",
+ "71d1f789fb338f17f04908665e5e74015dadf57b",
"support"
],
"html/editing/dnd/selection/169.xhtml": [
- "8f3dbc04c189a79f4efd2fd672254f0159d942f6",
+ "72c5d28d843c251a6c169e5257995537c4f539d9",
"support"
],
"html/editing/dnd/selection/170.xhtml": [
- "34bc75ffbc55058db4f3d0d430525e72878e7171",
+ "5bc44863bee7751c61dc5a53d1e54cce5406edee",
"support"
],
"html/editing/dnd/selection/171.xhtml": [
- "cf50e40902ced844fb010bd803a44e8e3422ece1",
+ "1dbb836ff1c3bddbb343fa626f54061f98d5207f",
"support"
],
"html/editing/dnd/selection/172.html": [
- "5da6d4b82f4946f7d1121be5ba3bc6d392a2f431",
+ "1d529ae8b6ea62dbbe3ca2027011304b7865d1af",
"support"
],
"html/editing/dnd/selection/173.html": [
- "dbe88c635722a242d7c9ac0746e8d72cbd947b9c",
+ "36166ef6a99801b48200b3382df869c4053b89f8",
"support"
],
"html/editing/dnd/selection/helper-drag-me-input-to-other-input.xhtml": [
@@ -582538,35 +589087,35 @@
"support"
],
"html/editing/dnd/selection/helper-drag-me-textarea-to-other-blue-box.xhtml": [
- "8b9971d46f853918270ff0c059bdfac3cf8fed0f",
+ "28be4785d4e3f51f3ccd10c40c51250c3c5a5fed",
"support"
],
"html/editing/dnd/selection/helper-drag-me-textarea-to-other-input.xhtml": [
- "15a34983a1cf0993e842bbe054ac3dbb8dc22bc8",
+ "2ddfad22fb6380178538618b196696c793d2dd18",
"support"
],
"html/editing/dnd/selection/helper-drag-me-textarea-to-other-textarea.xhtml": [
- "d992a7111260062eccf78690414f2bfec11d75d9",
+ "dfb3d56abea1cdc2c34af5bce8cade47cae59379",
"support"
],
"html/editing/dnd/selection/helper-drop-here-blue-box-contenteditable.xhtml": [
- "97f07a148cb1804f7d95ae5faa383a5be996713e",
+ "774a0f38e923f8defa3a645e8ff0d5b16fe67695",
"support"
],
"html/editing/dnd/selection/helper-drop-here-blue-box.xhtml": [
- "8f54a4f5ed58da68dd1965c38644cd743ac45790",
+ "d8885f6cc0466a9e3963c87b749803e23788952d",
"support"
],
"html/editing/dnd/selection/helper-drop-here-input.xhtml": [
- "edba114a9f02c6f765e65790778be5904988229a",
+ "2a76eb7863b65bc77fd7aff9e476c131ae19bf14",
"support"
],
"html/editing/dnd/selection/helper-drop-here-textarea.xhtml": [
- "c28aa2b30555808af26b4ea26cb9e0a91dcd3fa3",
+ "c75c58c84910c456013bc8324d7155fa46e6209d",
"support"
],
"html/editing/dnd/selection/helper-scroll-then-drop-input.xhtml": [
- "4b1485acd5287dfe44c3d161acf926adf649052f",
+ "e3309f34cfbc1efe14135b0a0e039c0f7f31bc96",
"support"
],
"html/editing/dnd/svg/001.svg": [
@@ -582578,11 +589127,11 @@
"support"
],
"html/editing/dnd/svg/003.svg": [
- "18689f34d07cee06574750196523d2eefc0b34d3",
+ "a9967e2e3b552d15280de147ceb563ecce551eeb",
"support"
],
"html/editing/dnd/svg/004.svg": [
- "7d4cae4142310e9d0034f20963a65e4ae48016d1",
+ "87eff41de4cedcb72020f3a8ce2cdb3ec6dc1b4a",
"support"
],
"html/editing/dnd/svg/005.svg": [
@@ -582598,11 +589147,11 @@
"support"
],
"html/editing/dnd/svg/008.svg": [
- "c1b4928d605f8d449399cb264d625e6e1e7d4b7b",
+ "37b47e635db21cb5c7dd5abaa042947f44a899a6",
"support"
],
"html/editing/dnd/svg/009.svg": [
- "1b87a018ec253c97f7b301ad8f0a0f3ce6a39ece",
+ "a5f5ad955349d933c1d83ce8e3abe617540d9e71",
"support"
],
"html/editing/dnd/svg/010.svg": [
@@ -582610,27 +589159,27 @@
"support"
],
"html/editing/dnd/svg/011.svg": [
- "d469b08e8583de7d89f2a7fbd02b701a9f067b8d",
+ "eaa4b6b8a096682362dd6a95491b3a8d1d7dc85f",
"support"
],
"html/editing/dnd/svg/012.svg": [
- "937f8718493faaa31e4cc42738d0e2d89aaa8b98",
+ "1ded6cd5faad0c28c58e593e9e89a3696b8804b6",
"support"
],
"html/editing/dnd/svg/013-1.xhtml": [
- "709887234473fa93da8274023136c592f5cfff37",
+ "c4ed6301d94ebd4404ad582dc5b26b61e2aca521",
"support"
],
"html/editing/dnd/svg/013.svg": [
- "60c96613d4a2a940b194806ef4e22b9d6b23f8c2",
+ "7d0700baf15b56ff1ba9a2aa5e8b81b893e892b8",
"support"
],
"html/editing/dnd/svg/014-1.xhtml": [
- "2c64270549b0187d8747a835dea1df8e843c5c37",
+ "44ff2a2305c3d8872cac57a6d622f63eb2f761dd",
"support"
],
"html/editing/dnd/svg/014.svg": [
- "847687fdc27333a21ec3ee5ae5f7fce41b33d551",
+ "fa5afc7fe4057aae731f47aba750ed9f4ed0b6b9",
"support"
],
"html/editing/dnd/svg/015-1.xhtml": [
@@ -582638,15 +589187,15 @@
"support"
],
"html/editing/dnd/svg/015.svg": [
- "9a834617e29c8d712e2a96d3bc0df1e67914cdae",
+ "1d0ac56b7bbe04188355c68454ae4df8294dde10",
"support"
],
"html/editing/dnd/svg/016-1.xhtml": [
- "b7f7277c55be7c59de421b14e31aeab6e97815d8",
+ "5ef623cf30d4ae1b55d74db9db2552fbf4737f78",
"support"
],
"html/editing/dnd/svg/016.svg": [
- "fd5620ee22721fb421e82f0cec43f168be038262",
+ "62f21779f65369f82990314b6628b3dbab478201",
"support"
],
"html/editing/dnd/svg/017.xhtml": [
@@ -582658,47 +589207,47 @@
"support"
],
"html/editing/dnd/svg/019.xhtml": [
- "be2aa6bc27fb7dd51a44bc7f4f775453745c2110",
+ "5cfa191c5ebbfcabc04c625f161c3561f954360f",
"support"
],
"html/editing/dnd/svg/020.xhtml": [
- "329dd55e49e57a4837fc29c0f90fcd5e778539f0",
+ "7b833fea7276ee0c4b0045df56259bbe2ef7911c",
"support"
],
"html/editing/dnd/svg/021.xhtml": [
- "6c6bcd861783e1781f770a96b3f746e3d5b86f05",
+ "273c409148d7d066808d4a458f294d17888cf505",
"support"
],
"html/editing/dnd/svg/022.xhtml": [
- "ac41a52a74c97a80a5ecda92d66ef0180da37ee0",
+ "246d09516b2375af0adb53fbddc45e0b1a3186cf",
"support"
],
"html/editing/dnd/svg/023.xhtml": [
- "fd4f9fcf41f784f2d82a90c2430e260c88f2c5bf",
+ "33cf7f6353cbbce06b45d2c44c4a3f6f260195cf",
"support"
],
"html/editing/dnd/svg/024.xhtml": [
- "6fb0f91bcb300163e449fe4e944b06deffec0fae",
+ "d4352a1dfc17ff1e98d264c23e67abec210fe499",
"support"
],
"html/editing/dnd/svg/025.xhtml": [
- "b49e94f577897dfb09b626632a65110abf8c10b5",
+ "2238ff716b62f401d0cbb31c40207ccdce310b7a",
"support"
],
"html/editing/dnd/svg/026.xhtml": [
- "15671960e7bb3327dfe83536f82be6b1b3b9b995",
+ "03f15461cf8460d57fbf1f90ce23c92307ceec11",
"support"
],
"html/editing/dnd/svg/027.xhtml": [
- "70a980b21b17e780ccbecc49b1caadb2ff5c8b05",
+ "e50d59f46146f6ce60a3c49183b4abcda489e7a7",
"support"
],
"html/editing/dnd/svg/028.xhtml": [
- "52eca70aa0761924dc26cd18c9359e51928b40bc",
+ "8b49838700c54b2c034f35d9d48f33957db17df4",
"support"
],
"html/editing/dnd/svg/029.xhtml": [
- "2bf35ea1a1f387fbf454e109840f8feeee3b5f44",
+ "0f5fdd2a0246b21963bea45ed92d7d6f614f84cb",
"support"
],
"html/editing/dnd/svg/030-1.svg": [
@@ -582706,27 +589255,27 @@
"support"
],
"html/editing/dnd/svg/030.xhtml": [
- "352950d7587e6c46fa080a3ed9dd16af46238d3a",
+ "2524c785d3e5e78e977245e83c48ec1a51e0e4f4",
"support"
],
"html/editing/dnd/svg/031.xhtml": [
- "5573e1e654a79917111869ccb57d05d73ef81887",
+ "b659ecec062825ed8a7efe5afd64b25cad087bab",
"support"
],
"html/editing/dnd/svg/032.xhtml": [
- "cd00b97f2fdf1940e495e9dfb96bba1129947af9",
+ "12a2e01106aa692b2702fcda382590caa5ac2817",
"support"
],
"html/editing/dnd/svg/033.xhtml": [
- "2b9fe3e071492f86cfb4409d46495f597d970768",
+ "06458244b27d6b1f71536ea4f5cb3786a639fe0d",
"support"
],
"html/editing/dnd/svg/034.xhtml": [
- "8e2bac7dc49ff9afd24b6c73bdb3243d8388d64b",
+ "efca6d1c325c2fca9141c2cb27de0312cdb2f3d8",
"support"
],
"html/editing/dnd/svg/035.xhtml": [
- "b4cff062474b69293591cc85f9f7bda7f1b10f23",
+ "33d32612933ec258f8f32c709f55ac7231789230",
"support"
],
"html/editing/dnd/svg/036-1.svg": [
@@ -582762,11 +589311,11 @@
"support"
],
"html/editing/dnd/svg/042.xhtml": [
- "40cfd839c532719f0f2737548fc54d4d419069e2",
+ "031d02ea449fc96f58a5544573374763751d242b",
"support"
],
"html/editing/dnd/svg/043.xhtml": [
- "2724d194e1ab1e11929ce5dee19b888dc7263543",
+ "402733f80bb0a83950198b5c95c80b2eed9be9b2",
"support"
],
"html/editing/dnd/svg/044.svg": [
@@ -582778,99 +589327,99 @@
"support"
],
"html/editing/dnd/svg/046.svg": [
- "73b9a013845d0be4fb6aac8a323efd00ff2049c0",
+ "66cb5386cc3dc3945fa91c56b2e7e60d22ce6669",
"support"
],
"html/editing/dnd/svg/047.svg": [
- "3673cc0b75652202aa942f454bd3d3f6bf299cbe",
+ "125ae7f58c83437d932cf6d8a3052faab0c947d2",
"support"
],
"html/editing/dnd/svg/048.svg": [
- "8a967ef6dd5cb412dcb97da9a9c6bb08e762b0c2",
+ "95835f16c35cb2aab0d5b9ee4458524dd4b6222c",
"support"
],
"html/editing/dnd/svg/049.xhtml": [
- "46f177b104d9012a40f99ff6e53dd7a0f82ed918",
+ "1e86d0fec75497f343d57d017b03359ee80c4561",
"support"
],
"html/editing/dnd/svg/050.xhtml": [
- "bc4d12ba38eaad20b341861506e5703d5e0bc08c",
+ "45c1cd7c49ddf235b26569404eb84699f9bca42d",
"support"
],
"html/editing/dnd/svg/051.xhtml": [
- "0ecf58fd03630583b65872a377cd56f86716734b",
+ "b824ee337b0577fcedcc8c6716199fe826f9371f",
"support"
],
"html/editing/dnd/svg/052.svg": [
- "ddb636f03b8253cd022f5d10367670eff81e91e5",
+ "9e5cd4079f15e344ab715831139bfe21057b5690",
"support"
],
"html/editing/dnd/svg/053.svg": [
- "5b1cbccd879234fcb4ba781df376401a6263a7f4",
+ "a8fe7783e5dd27fba94072cf991680fa7b089a01",
"support"
],
"html/editing/dnd/svg/054.svg": [
- "4337fc5d4264a9a97c78eb72f4e9bef7bd869a61",
+ "539e17223c761636d1bc2c9087ff9345fdc87084",
"support"
],
"html/editing/dnd/svg/055.svg": [
- "02a8261dad75c24d330e3155d1fafdf1720ae227",
+ "440bfe88fea606bf27f7958548a4c94c58a6435c",
"support"
],
"html/editing/dnd/svg/056.svg": [
- "4884a6f453f490707a2049d08aa2842daffd3d0d",
+ "bbd4a90a311044cab60e98abec69f89fe3ace1f0",
"support"
],
"html/editing/dnd/svg/057.svg": [
- "b3985f723fa4a9c6e17eced83803d25e0c573220",
+ "4b0c3159ae5b30706ee5536c3e4754bc05f71da2",
"support"
],
"html/editing/dnd/svg/058.svg": [
- "34a20b313144691ab12f8a39ff1e3eaf01beabcc",
+ "f0875c8b982a5067a406b54d9137feb33d2d6466",
"support"
],
"html/editing/dnd/svg/059-1.svg": [
- "975db3b0f640bf94e41f93cd7a56bd700304fec0",
+ "b48aab53502383da68577c2ec5d338bb1b903c9e",
"support"
],
"html/editing/dnd/svg/059.svg": [
- "94a0aa4664427d732206874d6e164935044931f7",
+ "f117e2bb0531d52fc5dbde4d85161878df4b6706",
"support"
],
"html/editing/dnd/svg/060-1.svg": [
- "3fb7713a393223d1bbb050d9dba819fa9da22c42",
+ "2334e33c8d2e1203c3b4ab78739a39da7caefa88",
"support"
],
"html/editing/dnd/svg/060.svg": [
- "8848edc8923c6e7ee32f9ef469c305da602dd42b",
+ "ccc63586135bd4e30d041c06241d514d8bd4bb37",
"support"
],
"html/editing/dnd/svg/061.svg": [
- "24ce47b6da62634df42785aaf2aa37b8dc21eaaa",
+ "65957fe69870429d06658d36b3f9de0f167338e3",
"support"
],
"html/editing/dnd/svg/062.svg": [
- "c79524fb729fa2c05bf56e492a03a2b6b3dcecb2",
+ "b881d3b3d354e990efa72aba324dd7c6913dd560",
"support"
],
"html/editing/dnd/svg/063.svg": [
- "65b05bfb1f2bbf29319c589b3b516c1a9458d067",
+ "3cbccc168126c9fda5c60bf8ee4b27f2e70fbb90",
"support"
],
"html/editing/dnd/svg/064.svg": [
- "a589e15483a5c373df145c6c62c0362a0f8eeb6a",
+ "87e0812559b246a5cbd13f4a7c75de7cff609328",
"support"
],
"html/editing/dnd/svg/065.svg": [
- "91fed4fa229a42a3f7abb25ec520868eec992bee",
+ "0c114a89de49a46eca319717e718535552afdc15",
"support"
],
"html/editing/dnd/svg/066.svg": [
- "40866ed82a1f8445841d36d0bcf92648ce29642c",
+ "e1d2b201c3066d91c168fd91acd468bab90d310d",
"support"
],
"html/editing/dnd/svg/067.svg": [
- "8acaeb24116e0a66599f29b8d51024d9d89e90e7",
+ "74661e84bbfb9354417f73f4d36d7a3bacd447a2",
"support"
],
"html/editing/dnd/svg/helper-drop-selection-here-textArea.svg": [
@@ -582878,213 +589427,221 @@
"support"
],
"html/editing/dnd/synthetic/001.html": [
- "c4a4f9718167c650acb20648700311a60e2744cc",
+ "a464f4b3c4cceadb48a0c93c8be4ecb72de67c17",
"testharness"
],
"html/editing/dnd/synthetic/005-manual.html": [
- "223b2253aab055ea22c94ec28f058de2a79bef04",
+ "2c34cba5b352e89c7c4f2a1703c3ef658b43210d",
"manual"
],
"html/editing/dnd/synthetic/006-manual.html": [
- "3cca882e10cfb359f45244b606b14147e5322f38",
+ "9e36bdbecc05807d517056934e473bf21556d3fc",
"manual"
],
"html/editing/dnd/target-origin/001-manual.html": [
- "ba23df1e5f586edc2e55ec52efe12be98a5203b0",
+ "6d9a6910e4afcb1f369e3ba490f8a4559492ec40",
"manual"
],
"html/editing/dnd/target-origin/002-manual.html": [
- "51dc03cbc55654568591e1921dee540342c31bd0",
+ "b4aff5f5ad993cd6da595a135f0100929e3bae33",
"manual"
],
"html/editing/dnd/target-origin/003-manual.html": [
- "e69d11159f774836e61e5f2546e6d9fbeff5ca53",
+ "f5896bb164ae891ba852a5722738e978544a43e2",
"manual"
],
"html/editing/dnd/target-origin/004-1.html": [
- "33d7eef7bee461aff964e96d1fb3394529cbc6d0",
+ "a80baf9e87c039fb1386e1cb7f81787def1bb221",
"support"
],
"html/editing/dnd/target-origin/004-manual.html": [
- "c77294bf317f351ff76243ab555ec7b71c5ab71e",
+ "357b3a612d59858a653ba756f63b787af17971a6",
"manual"
],
"html/editing/dnd/target-origin/005-1.html": [
- "37ce96f7a8681a6e0956c95a2dbc43fd779a3dc6",
+ "5e82f418d5b3c534f4c27509d8b239ff7fe84c4c",
"support"
],
"html/editing/dnd/target-origin/005-manual.html": [
- "7f66f99412f884ebdc4b25d51bb9795deb250273",
+ "2715571560918ffb6d30fa9e203caff2a94066c6",
"manual"
],
"html/editing/dnd/target-origin/006-manual.html": [
- "656c884288500bb0429e4d92f9caec6b8e924e63",
+ "062ed2ae640661b7c3b52eeac9766d98d9470449",
"manual"
],
"html/editing/dnd/target-origin/007-manual.html": [
- "d737ee3882a5ad1b0d9042a2c5f5ca4d16cea5c8",
+ "38b15695d71a3ce9b1d7cd20da6b14a69f9eb80f",
"manual"
],
"html/editing/dnd/target-origin/008-manual.html": [
- "b52f42121599104973962348e800b7812c757cf7",
+ "84c12d5631b565fc1a61cee6a50c3597e06ee977",
"manual"
],
"html/editing/dnd/target-origin/009-manual.html": [
- "42c8d336dcb7a1cb75171808bb44fbc7e96a5455",
+ "e98aa65a3fe08b4e0480ab15648cda70c6e14e65",
"manual"
],
"html/editing/dnd/target-origin/010-manual.html": [
- "68336689ef2f125ea2b06c801c8d7e677d94891d",
+ "d786d28a11df0c715ddab544fbc9f609533fe8a4",
"manual"
],
"html/editing/dnd/target-origin/011-manual.html": [
- "445dea90323b62ecf8bfb417ae5fda657d499f06",
+ "0cc98fc81e6b62925d9af018cad417faede3b23f",
"manual"
],
"html/editing/dnd/target-origin/012-manual.html": [
- "ab67a181b30a3fd44f070be75b083068a884b728",
+ "673168f09974e5fa91778fd316c55b3d32f7781a",
"manual"
],
"html/editing/dnd/target-origin/013-manual.html": [
- "e40dbfec1ecc3352161e631be76518c6d2858876",
+ "a880c03660e812ec07ede07316e440763706479d",
"manual"
],
"html/editing/dnd/target-origin/101-manual.html": [
- "9c320d86c2f3c484bac93f43f97951b1907cbe1d",
+ "b7c79cd240dfa0f5facb2df39322adcb76c8cf17",
"manual"
],
"html/editing/dnd/target-origin/102-manual.html": [
- "9ece8b77c568879ff207702635c6cb25356d15c0",
+ "fb3264ebb572defd9fbf62fb1abaa635e81464d3",
"manual"
],
"html/editing/dnd/target-origin/103-1.html": [
- "a32f92d11624e06618768aa3cf706f4995359146",
+ "ea40909e872bc910e088ec6448a381f8eccd1c6f",
"support"
],
"html/editing/dnd/target-origin/103-manual.html": [
- "527a8a34f19921326f889fc1f65dc1c07bbca7f6",
+ "9ab7300a94a26c08faab321a0065706030e94b0c",
"manual"
],
"html/editing/dnd/target-origin/104-1.html": [
- "2115efbc1490ad8bc7d37159a8ba69179bc0c369",
+ "399e18bc5f3a5378def106c543277dfc3eaaca96",
"support"
],
"html/editing/dnd/target-origin/104-manual.html": [
- "2c58aa33fce9ddfd473c4b526fb672e5299357c9",
+ "9bd90bb316fd2df4194d88bbf2577049f1c524ba",
"manual"
],
"html/editing/dnd/target-origin/105-1.html": [
- "6375d254fbae051da48268de7d1b293d3460f421",
+ "31d0dac45ae997d32300f445967052d3ec4bee07",
"support"
],
"html/editing/dnd/target-origin/105-manual.html": [
- "7917f47d0d74a051d6c714ae6c311a5d96b7f745",
+ "517393bc7fb6c8d7d77a13c56b6aaba9c4e2e639",
"manual"
],
"html/editing/dnd/target-origin/106-1.html": [
- "aee5cd9da9e1343594bb8bf7788d6925be0d0fb7",
+ "b32c597c1164cf1249d05ddc5d46949af5eddae0",
"support"
],
"html/editing/dnd/target-origin/106-manual.html": [
- "4d0cce566bad31410a2a358634d4dea564a79c6f",
+ "cbc441c0d6efd95f56f62e92faa99c1caf4f792d",
"manual"
],
"html/editing/dnd/target-origin/107-1.html": [
- "1bbd9e32f8da544d3c41c10b7e720408c3e58a76",
+ "8ad2f951fba43c35b8e7af42a2cc1ac50d3f3a79",
"support"
],
"html/editing/dnd/target-origin/107-manual.html": [
- "25cf395aabe9156b3858008e72d48631b0bada9d",
+ "cb5ab77ff5ef0b7139769c819a951ded48ae6242",
"manual"
],
"html/editing/dnd/target-origin/108-1.html": [
- "a29c950b5ad6ee56380b20c98c69d9606a14e04a",
+ "678f9680d6599505e7b1b39f59ff895ba552486e",
"support"
],
"html/editing/dnd/target-origin/108-manual.html": [
- "6f010e7732b6c825a5e821d1e8d006705dbd9600",
+ "b18eb8dafa335b4be425c9285bcfc732695ff328",
"manual"
],
"html/editing/dnd/target-origin/109-1.html": [
- "0d2fad56c7282aee5252e8f7a0a00156e6b10b32",
+ "7ea776808c3801b97e3bdc8d5c77a8b0edbcbdcb",
"support"
],
"html/editing/dnd/target-origin/109-manual.html": [
- "8ddef20c18fb6b2292686d450dc75fa7a6888584",
+ "3088e434b71b7ddf88a67aba00f51a1d6d775c01",
"manual"
],
"html/editing/dnd/target-origin/110-1.html": [
- "b53437ad02958585eeddf89576bced8dab40f5da",
+ "592682b45eb2f92de8a286d8778aaa8422fbf833",
"support"
],
"html/editing/dnd/target-origin/110-manual.html": [
- "8b128fd12178e69443603e4fde7ddb7f5dc007ec",
+ "0747860d413c2c4db02dee4778d61957c2e4ca0c",
"manual"
],
"html/editing/dnd/target-origin/111-manual.html": [
- "51edc8c2b06af629706177f02f09b1e6b233a32d",
+ "43223529d3f64ca2230f907d8527012ad5fcbdee",
"manual"
],
"html/editing/dnd/target-origin/112-manual.html": [
- "7993a414b0d604f588bfe0a3af1bf3b2ea41724c",
+ "a4f91763335221239128023b1c6d9cc99f7e7fc8",
"manual"
],
"html/editing/dnd/target-origin/113-manual.html": [
- "8491b5284e04f949be78ce363eafa1747cee6d76",
+ "4ca614de1b8c1589069db829d98b66f868766545",
"manual"
],
"html/editing/dnd/target-origin/114-manual.html": [
- "16a683ae1250c4f520be4f29d2e3ed27a022d236",
+ "5a73fc778aaa3ad8b7f71ed11097ff12efe1fdb6",
"manual"
],
"html/editing/dnd/target-origin/115-manual.html": [
- "1c325556a7bc97687551dcb6bd7a56259930498b",
+ "224cf56b3f937d2f81fb23016927b54a001673c6",
"manual"
],
"html/editing/dnd/target-origin/116-manual.html": [
- "b7e014e3809996a49266c9b04bf8afd31be2b756",
+ "84fd8023130b497ed9b2b1b8564d980aa4401d6a",
"manual"
],
"html/editing/dnd/target-origin/117-1.html": [
- "279f22f2811747da2c9a6233daf2c493de573dd6",
+ "727345d22bd77b78da132b1e7def81c86c4d5b77",
"support"
],
"html/editing/dnd/target-origin/117-manual.html": [
- "3b6966dae64c77c239d1e0986a8fd202edfd3b76",
+ "a121526d08fbbcb1007b93727dd67bd284995998",
"manual"
],
"html/editing/dnd/target-origin/118-1.html": [
- "6144ac93a048df6ecf60fdbf8a646db99bc15d40",
+ "1b8724e360f886992a85ae7ae155413653fcef26",
"support"
],
"html/editing/dnd/target-origin/118-manual.html": [
- "5e3e6a22510cfed07c212c4f13c0a41ed3c61d67",
+ "c337807feb4b51adf21cc35c7eb7aeaab72ef82d",
"manual"
],
"html/editing/dnd/target-origin/201-manual.html": [
- "93ee484628fad1b812589616ea5fac54842444d5",
+ "3ff853819d379cc5d3b43a8b7d4d8754439f582c",
"manual"
],
"html/editing/dnd/target-origin/202.html": [
- "a524afedf1e1468b5dba2492b79b22c5252e0beb",
+ "ece83f7f0ded238fb9a541a9bbf848e5416d2590",
"testharness"
],
"html/editing/dnd/target-origin/HELPER-mustallow.html": [
- "2c30f170818973fabe8161cbf619f7b10c31e6b5",
+ "ae9626f94c4fd374b42af505baac1fac6f447c48",
"support"
],
"html/editing/dnd/target-origin/HELPER-mustblock.html": [
- "493b51b7bc7fbce9ce869d96ca68f691b249cb8d",
+ "54bdb0d23fed2b5056567542607562717d151c1e",
"support"
],
"html/editing/dnd/target-origin/HELPER-showorigin.html": [
- "3d88c7724fdca8e5432181c066b3f228a8fb823b",
+ "b4f1125d620da0e1154d89f4b04a4468769a34bc",
"support"
],
"html/editing/dnd/the-datatransfer-interface/dndTransferCases-manual.html": [
"78d645a13235dbed9cdca67814221dac80fd7788",
"manual"
],
+ "html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html": [
+ "1a057539ebd15f5d89fc44ee82641df16d9e111d",
+ "manual"
+ ],
+ "html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html": [
+ "f8ff466d4f98f34e12e037045034fc7d908abf94",
+ "manual"
+ ],
"html/editing/dnd/the-dragevent-interface/dragevent-manual.html": [
"d68dd91a57379388797a557e64d6ed553cd02a6e",
"manual"
@@ -583222,43 +589779,43 @@
"support"
],
"html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-001.html": [
- "5c20688ee9f871cdc0b1553287dfe6d4d64dcf15",
+ "66d0a937c05995f585517e793bd66e8968079c29",
"reftest"
],
"html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-002.html": [
- "80318bc3c90f72803255831a95c482bf99105d29",
+ "2f1dad9bf7fdad68a462beed45d54206d53edf59",
"reftest"
],
"html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-003.html": [
- "ae4f1d7e6c954fd1f3fa53fcd77833954bcdf6d9",
+ "c698a3fe27a6cbb9904da388c59e405627aee4eb",
"reftest"
],
"html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-004.html": [
- "ace6101644d2c0e426d611016a3cb3dc30968f4a",
+ "47fdd479640742bf36e4db5c11efba1d002a2cf7",
"reftest"
],
"html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-005.html": [
- "5aae7d56aa63f90160ba1e296378b0a0832c07f0",
+ "95ba6444490e2334eb66e11e32b36c8c21003a50",
"reftest"
],
"html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-006.html": [
- "e329657b5ebf7211237fa7712a3c710d3ea4b956",
+ "0ee476d9b5c29fa1ce0580abeabb91d1a79cd919",
"reftest"
],
"html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-007.html": [
- "10c986cf6e428c782a09572be5c5438d256b17c1",
+ "6f268eb4181115c208b2838edd88296968fc615d",
"reftest"
],
"html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-008.html": [
- "c026d35ec89818f5624daad20163fb4ceed62828",
+ "113319b384df45ad2440afa7c63441734ce6c3ae",
"reftest"
],
"html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-009.html": [
- "68e7e27bc3777a8fe0807380a28c1ce60aa3becc",
+ "22e2f9b4f714f366fdb6a5013fcb33303fba0486",
"reftest"
],
"html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-010.html": [
- "0320abd956316beff38f2ff06e0f32ee2b2e9887",
+ "d68569bcf39eaec10599b0e7939db3dd3241002f",
"reftest"
],
"html/editing/editing-0/spelling-and-grammar-checking/user-interaction-editing-spellcheck.html": [
@@ -583333,6 +589890,10 @@
"aed703113e44497f460012b955d8dda598acf57f",
"manual"
],
+ "html/editing/focus/tabindex-focus-flag.html": [
+ "ec7110ae00a54dfa39027ada9152647570cb86bc",
+ "testharness"
+ ],
"html/editing/inert-subtrees/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -583486,7 +590047,7 @@
"testharness"
],
"html/infrastructure/common-dom-interfaces/collections/htmlallcollection.html": [
- "eeb932d95184b11190af6a2e8be2adccc5a84601",
+ "5d3dd32c513cf4b04260c4acff4f1406bb168a07",
"testharness"
],
"html/infrastructure/common-dom-interfaces/collections/htmlformcontrolscollection.html": [
@@ -583629,6 +590190,10 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "html/infrastructure/safe-passing-of-structured-data/echo.js": [
+ "092d33c695a185b38798d5e0ba12666a6f26e48a",
+ "support"
+ ],
"html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success-and-failure.html": [
"8375e9daeb9a11e53a9841874fef50677f0970dc",
"testharness"
@@ -583654,7 +590219,7 @@
"support"
],
"html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/no-transferring.html": [
- "17b67f8d75e558be808493f5cba82f978a0b6822",
+ "024119585fe129c96d510f68072f1a1327fa630f",
"testharness"
],
"html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/resources/blank.html": [
@@ -583773,6 +590338,10 @@
"2a3deba2534cad6f5e0aa85cfc3c90debcead20a",
"testharness"
],
+ "html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html": [
+ "e0f5057cc03fe0bf0bc83587e620b623e4211da3",
+ "testharness"
+ ],
"html/infrastructure/terminology/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -584098,7 +590667,7 @@
"testharness"
],
"html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html": [
- "02f00d35b00fd8c08f7063ab8920171ab5070a71",
+ "21276710ad52159ecdc9208d2dd9b4345f3cb1d6",
"testharness"
],
"html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-start-manual.html": [
@@ -584481,6 +591050,18 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "html/rendering/non-replaced-elements/tables/colgroup_valign-ref.xhtml": [
+ "58ec4d37d310270ebccf93e2fe539037cd1d95f0",
+ "support"
+ ],
+ "html/rendering/non-replaced-elements/tables/colgroup_valign_bottom.xhtml": [
+ "c8a7f0b90852bed631ae6c86992566c403cc1ba8",
+ "reftest"
+ ],
+ "html/rendering/non-replaced-elements/tables/colgroup_valign_top.xhtml": [
+ "1732dc6dd595354e21c7fb6006c32b844ceedf18",
+ "reftest"
+ ],
"html/rendering/non-replaced-elements/tables/table-border-1-ref.html": [
"1f3aa494ba434211a8cdcd1be289e702856fa05a",
"support"
@@ -584513,6 +591094,14 @@
"699050ab3bcc8fc11d51c2ae4b9b10aee46876a5",
"reftest"
],
+ "html/rendering/non-replaced-elements/tables/table-direction-ref.html": [
+ "97b303c46c7afcc29e0c56856028409c34682baa",
+ "support"
+ ],
+ "html/rendering/non-replaced-elements/tables/table-direction.html": [
+ "4c890c9b43bfec7a82a6abeee94d558db2b8f83e",
+ "reftest"
+ ],
"html/rendering/non-replaced-elements/tables/table-layout-notref.html": [
"a05fad3c06f94c3a617f2efdc589bbb3f5525983",
"support"
@@ -584525,6 +591114,22 @@
"ec05c435cfd09291184360db7e8b0c5af9c7ba31",
"reftest"
],
+ "html/rendering/non-replaced-elements/tables/table-row-direction-ref.html": [
+ "5cf01204381d870738a7454080ea40904b2d0f0c",
+ "support"
+ ],
+ "html/rendering/non-replaced-elements/tables/table-row-direction.html": [
+ "433565959474b716d385c2d98d0976ae2121d6d5",
+ "reftest"
+ ],
+ "html/rendering/non-replaced-elements/tables/table-row-group-direction-ref.html": [
+ "23616d2840feaafbc6d06b1a1db18dd75d221a23",
+ "support"
+ ],
+ "html/rendering/non-replaced-elements/tables/table-row-group-direction.html": [
+ "d4b5cf18545eb48780d9a9a9bfa62ded7dc076bc",
+ "reftest"
+ ],
"html/rendering/non-replaced-elements/tables/table-vspace-hspace-s.html": [
"a93cbe26a0c5b9a7aeda1faf9db618f79aae8715",
"testharness"
@@ -585041,16 +591646,16 @@
"bf4610909834f094b85d4c2113009fc9f25b140b",
"testharness"
],
- "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html": [
- "050190b2706ff41b0a5844ca159990908d57177c",
- "testharness"
- ],
"html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/not-in-shadow-tree.html": [
"0d5f568af3b295b36e390156caf5ce523fd83d93",
"testharness"
],
"html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html": [
- "709457936084abefd847c1557748df61551bd920",
+ "80aa762a69d2ed8a702ad42fc38a3b9ef58c8be1",
+ "testharness"
+ ],
+ "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html": [
+ "d7222fbc63c3cda31b31e63e8e3119a9c61cef0d",
"testharness"
],
"html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/support/;url=foo": [
@@ -585069,6 +591674,10 @@
"5bb64e33bd2c80d47ade635a802d316dbfd33911",
"support"
],
+ "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/support/refresh.py": [
+ "299080c29e63843d660229bb8b974ebc0bfa0f18",
+ "support"
+ ],
"html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/support/refresh.sub.html": [
"bc4cbc00c0d68887d3ff616acad34b519cfd2532",
"support"
@@ -585129,6 +591738,22 @@
"3d608438361d8bec5726feb468a3c2fbd5b7cb7d",
"testharness"
],
+ "html/semantics/document-metadata/the-style-element/style_media_change.html": [
+ "fdf89bd030658cfa5f46325f0c61adca74784127",
+ "testharness"
+ ],
+ "html/semantics/document-metadata/the-style-element/style_non_matching_media.html": [
+ "cdcd861169c580a2ddae38b61cbbcd6efe1c5064",
+ "testharness"
+ ],
+ "html/semantics/document-metadata/the-style-element/style_type.html": [
+ "bbef3695e7fd32fb92abd9d1d6a59a9380d0d361",
+ "testharness"
+ ],
+ "html/semantics/document-metadata/the-style-element/style_type_change.html": [
+ "867064126601c92dce8a61d6f3e8237153a0a583",
+ "testharness"
+ ],
"html/semantics/document-metadata/the-title-element/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -585354,7 +591979,7 @@
"testharness"
],
"html/semantics/embedded-content/media-elements/historical.html": [
- "b5a667eb0acb011336be671a700214af2dd10e2f",
+ "3437c85a3b5e106c61ebb0b96207108d178f0890",
"testharness"
],
"html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack.html": [
@@ -585686,7 +592311,7 @@
"testharness"
],
"html/semantics/embedded-content/media-elements/mime-types/canPlayType.html": [
- "3ea30a20d18f5c8839ccfaa183627702db38ed4b",
+ "960d7daccac83f48f553edb4d32f1b5919f67dcc",
"testharness"
],
"html/semantics/embedded-content/media-elements/networkState_during_loadstart.html": [
@@ -585738,7 +592363,7 @@
"testharness"
],
"html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html": [
- "a9bad23477535b4227366de77b087d1c14389a30",
+ "f529d9f469607cd8975dd2df4d0636a8ceb739e7",
"testharness"
],
"html/semantics/embedded-content/media-elements/preload_reflects_none_autoplay.html": [
@@ -586013,6 +592638,14 @@
"f7576ff332cac04a4e2b663b6fdd40aef154b6b5",
"testharness"
],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-cue-order.html": [
+ "eeab6b02e728aea21878cf72664929766be057b7",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/media-elements/track/track-element/track-data-url.html": [
+ "e9c8849350512b1247543939ee0e529947e47c2d",
+ "testharness"
+ ],
"html/semantics/embedded-content/media-elements/user-interface/muted.html": [
"74deefbbc4b8f96ff4856db1c32c6428183cc040",
"testharness"
@@ -586346,11 +592979,11 @@
"testharness"
],
"html/semantics/embedded-content/the-canvas-element/security.reset.cross.html": [
- "1b844c83c588d722d3b0ef3247d76aaacddfbe9a",
+ "e263694445c44f0d428c2b67a63d81c96bcbc0b8",
"testharness"
],
"html/semantics/embedded-content/the-canvas-element/security.reset.redirect.html": [
- "93e50cbaf157c2639f62662801dc1df4b983bde9",
+ "53917c9910fc573b7438b47a6f4e23529bc46c29",
"testharness"
],
"html/semantics/embedded-content/the-canvas-element/size.attributes.default.html": [
@@ -586905,6 +593538,18 @@
"130faa6ea1a376ce786f69b672486d7056c32b05",
"testharness"
],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html": [
+ "4010899a36a52436b56867762390e9b27768f706",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html": [
+ "9d640f248b376f6bc6a95d09b948e49a3f655954",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html": [
+ "96453a352d2bed1d208e203594bcb24ab8ee37cd",
+ "testharness"
+ ],
"html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation_by_user_activation-manual.html": [
"7f8cc0226de24738bc75517e95d2942396b222a8",
"manual"
@@ -586913,6 +593558,22 @@
"fcbb80f82ca87610d00a6307da426b63f81e5a37",
"testharness"
],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html": [
+ "3891c651b0153f3ea8081e6060b6af684c68e996",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html": [
+ "9fba655fe48ede1d82512bd17b59d4a22b3e7b23",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html": [
+ "04d2705065f73237a7f497fc36d5ab528f1f2793",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html": [
+ "2f6d9ad5237db0f3973b0910bd45f184fb4831f9",
+ "testharness"
+ ],
"html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html": [
"5dcb098cdef98557922b9dd71d7b39d3de7a595b",
"testharness"
@@ -586977,12 +593638,140 @@
"0b373551fd3196bca5899de606d44ed8bab79075",
"testharness"
],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_001.htm": [
+ "f9f568882185304329471dd4e37457cd7393cc7c",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_002.htm": [
+ "4591ddde78ca22bd019d09454842f05334ef74d0",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_003-manual.htm": [
+ "2c83ba070de37050ddc4b5676fbc22826d61917d",
+ "manual"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_004-manual.htm": [
+ "a9690443b9d1380ca496e0a45cc816890e77174d",
+ "manual"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_005.htm": [
+ "cc38f1cb2941d56d605eaa914e260ccbc887ac77",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_006-manual.htm": [
+ "165e76c51151ae0975aef6a8db92f944b81fd07e",
+ "manual"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_007-manual.htm": [
+ "0587ab3d76bf38a647252d1225ac5415855b3164",
+ "manual"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_008-manual.htm": [
+ "fa7df332a160765981d1027fc1f82bf307c38b34",
+ "manual"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_010-manual.htm": [
+ "7ceaca86d83a128fbe3120599807104a4ade4ada",
+ "manual"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_011.htm": [
+ "29e029f0eea294ee83f1c82a61786ab405841396",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_012.htm": [
+ "85d232daf351a70bb32bbd0e12e37ca9bcca9067",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_013.htm": [
+ "589cd04b32b2ec9eacb0ce9432abef5ff09338ac",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_014.htm": [
+ "26859ec1b85ecb730d2987a46b3fe0b9981b3ab0",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_015.htm": [
+ "092f8869b4175c642c101d3dd1128a1acc633d77",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_016.htm": [
+ "0be9a4ecfeaefe7c116f02d85c8258e6907671de",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_017.htm": [
+ "d2d9040ca454b9f31c27bb7d5bc1597b7c52f804",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_018.htm": [
+ "fedc936924ca38286e39096b1745e388b6ca046f",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_019.htm": [
+ "d2c7c90c43cba4bdcd2bf1b3688157e1deaada43",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_020-manual.htm": [
+ "94d8f8d68042a0983058b317f32c2c8c4211b817",
+ "manual"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_021-manual.htm": [
+ "3a9c82cc3d7d37f4cbe582498ca2fb551620f31b",
+ "manual"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_022-manual.htm": [
+ "7045325193ba22e7d99fe756166599fc1ba67d16",
+ "manual"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_023.htm": [
+ "8f32fb01628330d9d1cd922fb8fa53903a9cf5c4",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_024.htm": [
+ "5c9fb00e410bde40f0a79b39db6d65d8dc6a90ca",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_025.htm": [
+ "8c1ddb426c980769695d60934cf6c3859c049462",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_026.htm": [
+ "0b6e855cca5f7107a6ab68b581949c7ccb97a701",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_027.htm": [
+ "25052a1413d090a884b8ace1f16800bea26be3dc",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_028.htm": [
+ "707b3b220813d65a2f6d553d3f8e868fd28755ed",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_029.htm": [
+ "36a68bba236715bdb26228f2b4627edfe40f3a7e",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_030.htm": [
+ "a78cdcfb022577c2a2bbe8459e09074501380b98",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_031.htm": [
+ "05584a1baa6bcd6eead0310a19887aefc89ab168",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/sandbox_032.htm": [
+ "fab9aa4f18b1276ad94f63626ed582599aad1a8e",
+ "testharness"
+ ],
"html/semantics/embedded-content/the-iframe-element/stash.py": [
"5513229f79ab37de67eb4d60ea9dd23cd31d133f",
"support"
],
"html/semantics/embedded-content/the-iframe-element/support/blank.htm": [
- "941efb7368e46b27b937d34b07fc4d41da01b002",
+ "ec2daf6a782747ad7d983aefafd954cc7e661cf7",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-on-popup.html": [
+ "042bf7ad5057dee3d2243c30d5a24227e15ef121",
"support"
],
"html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-without-user-gesture-failed.html": [
@@ -586993,14 +593782,138 @@
"a4a67179771917899f41114467b46be39d857eb5",
"support"
],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-that-tries-to-navigate-parent-and-sends-result-to-grandparent.html": [
+ "52ffb8ad46f9a2f9231e04df13b9dab898d8a457",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-its-child.html": [
+ "fb57a49a8b7c689464f6d25542d052145144a2b4",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-its-child.html": [
+ "b3d12b8cf7dc60a889e87988b30ca4e327338f6e",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-itself.html": [
+ "afcf7d38cda8f1c2e9bba904da72bd3c576ec629",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_001.htm": [
+ "fe13ce697bec46b5d7e2d8f5c1cdd5e157bdb737",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_002.htm": [
+ "ffbb78c74d7bdb93e34eddce4ffa4caa51817aaf",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_003.htm": [
+ "e2870e9585dcd621146c28186cb31c7941e7d9d7",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_004.htm": [
+ "bd6dfb1060afa083e4c59c5b132671a73779cec5",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_006.htm": [
+ "f61c5288124b87006246e64c75d1a34c85504a13",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_007.htm": [
+ "d6db044955736bc2b0497155c7979c39ae691cf3",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_008.htm": [
+ "58604db1641cce22a6c77bc88fa8bdc6284eb746",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_010.htm": [
+ "1f2f4e832931489fccbbb6659d0daa91939e7944",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_012.htm": [
+ "c73d69b345af0d0a51eb1a9ab059b8f5f0ea9a86",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020.htm": [
+ "732adb28914f90f15ff4f8909a8c0ded5b2540cf",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020a.htm": [
+ "54008f2c3d35e3a5305a7c410b0d762f7727a5ec",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021.htm": [
+ "55bd2d8894925e7f2bb008f00777774b2dcb5e2a",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021a.htm": [
+ "8589c93ff8c880bc7fe242d33b237ec846509993",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_022.htm": [
+ "788bc829a155bd05b46fd370204e8120c1c525b6",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_023.htm": [
+ "bb8bfec1199055af6539746ac086781ac8d69387",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_024.htm": [
+ "5a9234351a43c94b787b37534196379d9de5e84f",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_026.htm": [
+ "ade3314e844fe60d5b1bda86a4e8db5cd64108ed",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_027.htm": [
+ "6383bdfabe2c5a46d91c0e49d16a4731d172b59a",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_028.htm": [
+ "108b8c0998b5d0f312bb388416828b605c41d15d",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_029.htm": [
+ "c2b462ee8e71b2aefa4c79c3e804ee934af25aa1",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_031.htm": [
+ "0864437a4b9f97be08b4fa027e0cf2887bffa147",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_032.htm": [
+ "f64b366c71d51ff73b6370ac2db35013a8c1cb8d",
+ "support"
+ ],
"html/semantics/embedded-content/the-iframe-element/support/navigation-changed-iframe.html": [
"9dd191a0b5d9c15972363e260228956f7f487c7d",
"support"
],
+ "html/semantics/embedded-content/the-iframe-element/support/sandbox.pdf": [
+ "44050f8922b1dd32fcf9dcf4e1bf331646edf496",
+ "support"
+ ],
"html/semantics/embedded-content/the-iframe-element/support/sandbox_allow_script.html": [
"2319116d010e6b67be6d8aeb801a9b24171b3b0d",
"support"
],
+ "html/semantics/embedded-content/the-iframe-element/support/sandbox_helper.js": [
+ "7e3ec2a704a7f7a57f7808a4ff918269b7ce3ce9",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/standalone-fail.htm": [
+ "65f1509fd23a415de0b64f60239a0833abbc3ffd",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/standalone-iframe-content.htm": [
+ "c10472f44c627c1ed2b00e341c4e3e3101fcab94",
+ "support"
+ ],
+ "html/semantics/embedded-content/the-iframe-element/support/standalone-pass.htm": [
+ "3a8148c40148df2cfcb85054975ff9ad7c718923",
+ "support"
+ ],
"html/semantics/embedded-content/the-img-element/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -587013,6 +593926,10 @@
"2047645c2bdecc90189878cc68e861087d7bd84b",
"testharness"
],
+ "html/semantics/embedded-content/the-img-element/adoption.html": [
+ "6786386a825f42b04733a2e91c5e95ea907c00fc",
+ "testharness"
+ ],
"html/semantics/embedded-content/the-img-element/brokenimg.jpg": [
"200b8085f98203ccf455504727ba9d92203f1080",
"support"
@@ -587033,8 +593950,36 @@
"bdbfbe9a5908c6233bd7b9697a0762bd2e0f6ede",
"testharness"
],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html": [
+ "7fb6e548ca0d039496b35dadabd044274d0960be",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html": [
+ "361ae415a6a41c7442c24f24898b51aef0e2270a",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html": [
+ "34e5a2beebed1c95ab978258e3d93d9cefcd4d70",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html": [
+ "0af39535cb047736d88948de962f876b1addbdbb",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html": [
+ "9405efb65176096957438cbdcc59109b488d80e6",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-img-element/decode/image-decode.html": [
+ "5368b62bf6c950e8d57b16b36148e5695ce16fd8",
+ "testharness"
+ ],
+ "html/semantics/embedded-content/the-img-element/delay-load-event-detached.html": [
+ "6845b4a7fd45b083c1c380ad021860654baefc4f",
+ "testharness"
+ ],
"html/semantics/embedded-content/the-img-element/delay-load-event.html": [
- "e4782535af755b29864fd3de67bbdd0de13f19d7",
+ "54096da852f0ba13a634ba6bf9e3d2070bba8e5f",
"testharness"
],
"html/semantics/embedded-content/the-img-element/document-adopt-base-url.html": [
@@ -587089,6 +594034,10 @@
"1d58aab3f3fee594404e34681bde43f85824a738",
"manual"
],
+ "html/semantics/embedded-content/the-img-element/non-active-document.html": [
+ "ad443ef3039e99c92de2d14bfe7d1b93cd5bdb0c",
+ "testharness"
+ ],
"html/semantics/embedded-content/the-img-element/nonexistent-image.html": [
"ed3a4e8ec0ffe8411176c91de37e965f252534cd",
"testharness"
@@ -587142,7 +594091,7 @@
"testharness"
],
"html/semantics/embedded-content/the-img-element/usemap-casing.html": [
- "3f22805f970f300067ede61b013bdd41f81ede71",
+ "4f7dde7856e4bfab43ce4d411e8bf317dc2a7c6b",
"testharness"
],
"html/semantics/embedded-content/the-map-element/.gitkeep": [
@@ -587278,7 +594227,7 @@
"testharness"
],
"html/semantics/forms/attributes-common-to-form-controls/formAction_document_address.html": [
- "3d0ecc086a82bfa949e91ba6d13105fbbbf5d688",
+ "1398de0485753a60be754d40064ff10a7a6aa437",
"testharness"
],
"html/semantics/forms/attributes-common-to-form-controls/formaction.html": [
@@ -587425,6 +594374,10 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "html/semantics/forms/form-control-infrastructure/association.window.js": [
+ "378503a30aa005cd35e726ff252dc5e69644a04f",
+ "testharness"
+ ],
"html/semantics/forms/form-control-infrastructure/contains.json": [
"465d87952b71ff3ac6c3fe7b13c880028c53b3de",
"support"
@@ -587445,6 +594398,10 @@
"3b1dea35bb4af384125904d69bf569109965714f",
"testharness"
],
+ "html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html": [
+ "305a2a0d02488f0a90184ddd94894045f413b18a",
+ "testharness"
+ ],
"html/semantics/forms/form-submission-0/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -587469,6 +594426,10 @@
"92c8c30e186f0a94a962bb5c4be7acf0860b943e",
"testharness"
],
+ "html/semantics/forms/form-submission-0/submission-checks.window.js": [
+ "c13ed40ca2a1988368564cb5c9dbcabee4306ceb",
+ "testharness"
+ ],
"html/semantics/forms/form-submission-0/submit-entity-body.html": [
"f73376af978f2fb89dcbd6e9092f113d90c7a3d6",
"testharness"
@@ -587542,7 +594503,7 @@
"testharness"
],
"html/semantics/forms/textfieldselection/selection-value-interactions.html": [
- "0f93258e5237c49fa24efe5180409e48721e8025",
+ "c568d7fe10cb4c2071b5d38530ad601988a789ea",
"testharness"
],
"html/semantics/forms/textfieldselection/selection.html": [
@@ -587569,6 +594530,10 @@
"fd6cbf436213e6a1324d3944f28199b5b7a04d87",
"testharness"
],
+ "html/semantics/forms/the-button-element/button-checkvalidity.html": [
+ "8a50258a64a0897bbe50a6a0f151a83b3e4662f7",
+ "testharness"
+ ],
"html/semantics/forms/the-button-element/button-click-submits.html": [
"2572c669271b48b218a4ff058789fabed5f3751c",
"testharness"
@@ -587577,10 +594542,18 @@
"322fc4a9f013595a9ac2550401a2743b2ab85b07",
"testharness"
],
+ "html/semantics/forms/the-button-element/button-labels.html": [
+ "138bd9c218383a2e4e49d45b08eb15760e2c49b5",
+ "testharness"
+ ],
"html/semantics/forms/the-button-element/button-menu-historical.html": [
"61d2efc186cc8124ca884dbb8f5b74ef6ca339e8",
"testharness"
],
+ "html/semantics/forms/the-button-element/button-setcustomvalidity.html": [
+ "1db71a5bee8a77768dc54cbd1dc3ef000c2eaa6b",
+ "testharness"
+ ],
"html/semantics/forms/the-button-element/button-type.html": [
"dad1f595fb83eefbb8fa8261a42654c1178f3a13",
"testharness"
@@ -587589,6 +594562,18 @@
"a4bb6a1e45b5b92e170e87d153a44f2027ff3717",
"testharness"
],
+ "html/semantics/forms/the-button-element/button-validationmessage.html": [
+ "443871769510376bd4009893fc808e17ba3e03d8",
+ "testharness"
+ ],
+ "html/semantics/forms/the-button-element/button-validity.html": [
+ "867d20b4b61629a1394d53b37f15839e84386a75",
+ "testharness"
+ ],
+ "html/semantics/forms/the-button-element/button-willvalidate.html": [
+ "65e3d4c40ee1f2386759f3abf5ade870217993f3",
+ "testharness"
+ ],
"html/semantics/forms/the-datalist-element/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -587613,6 +594598,26 @@
"4d815c63bd1fb4a1ae1e3c3c94a98e2975f2f68c",
"testharness"
],
+ "html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html": [
+ "9fcfee0f0149cb35b4ea59a858639bb966be51d5",
+ "testharness"
+ ],
+ "html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html": [
+ "4954cc5b7e1c170a6ac3c815c8c1566be9da25d4",
+ "testharness"
+ ],
+ "html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html": [
+ "fa45f6b2b651a14cd13351e5f96c5b21cb61c4f0",
+ "testharness"
+ ],
+ "html/semantics/forms/the-fieldset-element/fieldset-validity.html": [
+ "619c711a6a1fa39324fa78d5c740bf2232da280f",
+ "testharness"
+ ],
+ "html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html": [
+ "ae6898e558da0ee8cca3cd31a5d3cfc5dc9c49a0",
+ "testharness"
+ ],
"html/semantics/forms/the-form-element/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -587633,12 +594638,20 @@
"e2a223d34051f8c80a2e6cb2afb24dfc8971c33a",
"testharness"
],
+ "html/semantics/forms/the-form-element/form-action.html": [
+ "f576ae6731a157cc2d3779cfb6f10819da7b2e8a",
+ "testharness"
+ ],
"html/semantics/forms/the-form-element/form-autocomplete.html": [
"c3aae63b6c007e3f39a7bf39c56bcdb7172273ad",
"testharness"
],
+ "html/semantics/forms/the-form-element/form-checkvalidity.html": [
+ "1b30a0c5dd414e6a928ca2392b5efc878cdfeb97",
+ "testharness"
+ ],
"html/semantics/forms/the-form-element/form-elements-filter.html": [
- "bfed166cfad06a5afb59cad6c5e5aea223e4d50b",
+ "7dfc9203a9900c8ade5e1f85926c92fe29f984a8",
"testharness"
],
"html/semantics/forms/the-form-element/form-elements-interfaces-01.html": [
@@ -587665,6 +594678,10 @@
"1131356cf872490f9ee110bf4e487a520be63c4c",
"testharness"
],
+ "html/semantics/forms/the-form-element/form-length.html": [
+ "4472cc5f40bdd836938ec95166b0b6f804ae04d0",
+ "testharness"
+ ],
"html/semantics/forms/the-form-element/form-nameditem.html": [
"928a0029fbad4251a30dc660de10ad6fd7f08def",
"testharness"
@@ -587746,7 +594763,7 @@
"manual"
],
"html/semantics/forms/the-input-element/files.html": [
- "04e66b0a0b1c952e8712689295c272b32a5777fa",
+ "dc7b22c4d70b7ae8cac255ad5b9bf0cf84806e8e",
"testharness"
],
"html/semantics/forms/the-input-element/hidden.html": [
@@ -587761,6 +594778,30 @@
"b54b500168a20c1e3d23437184bfed78c9c73ef1",
"reftest"
],
+ "html/semantics/forms/the-input-element/input-checkvalidity.html": [
+ "48966edfbef5bd48525f45ec4a0f3e240778fc36",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-height.html": [
+ "c9ee649fc6abd58e49c60afb6d5d916939f2fffb",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-labels.html": [
+ "0d260017459d6d3b7e446acc9177767ba288b652",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-setcustomvalidity.html": [
+ "8397448c6a8fc9371303266671c0a1d17d488d5c",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-stepdown.html": [
+ "1341b0d275696f2bdb7ecc70632fa9a929f7d8c4",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-stepup.html": [
+ "3305c40cd51e176ee6e73d2ce7042a3a0190ba5d",
+ "testharness"
+ ],
"html/semantics/forms/the-input-element/input-type-button.html": [
"03652904d0d1e992379c6ab79780b8af758a4803",
"testharness"
@@ -587769,6 +594810,34 @@
"a7619f660943eec21a9af1be2ac68d6a9be561b4",
"testharness"
],
+ "html/semantics/forms/the-input-element/input-validationmessage.html": [
+ "8d9679a2f600b93e0736a004be9d17964990691b",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-validity.html": [
+ "f96fcd74b42c108c6f6ca91df9e36dbba088983c",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-value-invalidstateerr.html": [
+ "f4003cc2133dea2e8305c9a6bdf91dd01f0f4c4a",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html": [
+ "f3c620461383467fcbf1b9c2ee55e9e2a1abf516",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html": [
+ "5cd8f0d590eb91eb6a5104afb5eba9d8b6dd3a74",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-width.html": [
+ "83299d319c30afb7869e281b354c97f99b22634a",
+ "testharness"
+ ],
+ "html/semantics/forms/the-input-element/input-willvalidate.html": [
+ "1ad2401b3db0e8a502ea943f2eba6b4c2801d818",
+ "testharness"
+ ],
"html/semantics/forms/the-input-element/maxlength-manual.html": [
"93c64a93ec974115ee693db091d2bd1f4ac8ea89",
"manual"
@@ -587869,12 +594938,16 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "html/semantics/forms/the-label-element/iframe-label-attributes.html": [
+ "3629d93c34f27a575114b15256803941c9893f6e",
+ "support"
+ ],
"html/semantics/forms/the-label-element/label-attributes.html": [
- "bb00ee78b9fa2343d85dcaa13376a832d376617a",
+ "612957c0c5b28b8797118eb5975bb41bc240d257",
"testharness"
],
"html/semantics/forms/the-label-element/labelable-elements.html": [
- "421328f898fb2487152f6fd8df315fc22ddea61a",
+ "80275984254360d8b713b5b330c18ae34138b670",
"testharness"
],
"html/semantics/forms/the-label-element/proxy-click-to-associated-element.html": [
@@ -587965,10 +595038,6 @@
"10685b8d6e5e3c7d17f4f8b702bcd9672c5c02a7",
"testharness"
],
- "html/semantics/forms/the-progress-element/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
"html/semantics/forms/the-progress-element/progress-2.html": [
"39e1303dd97060348893e6a32e23a2723ce86170",
"testharness"
@@ -587977,6 +595046,10 @@
"ae4f3f8d86b720ba8f6c1fe7443cc425519de5da",
"testharness"
],
+ "html/semantics/forms/the-progress-element/progress.window.js": [
+ "4a354f5de58cd0dfcd98b4970a9cee7de8b463cf",
+ "testharness"
+ ],
"html/semantics/forms/the-select-element/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -588057,8 +595130,12 @@
"81a270bc3c9304f8b2e7dd526519f4eab7d94f45",
"testharness"
],
+ "html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml": [
+ "03ce5d00e9887037bbd96f2d49e116c6b3329802",
+ "testharness"
+ ],
"html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html": [
- "55e04e640fd48d92c4be16a912cba57fb4bb9e27",
+ "67af41d4d44f0de60b952cb15db93b2938133bcf",
"testharness"
],
"html/semantics/forms/the-textarea-element/wrap-reflect-1-ref.html": [
@@ -588401,6 +595478,14 @@
"340924bc329569ce605ce228619d95f09f335ec5",
"support"
],
+ "html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html": [
+ "d172f6ea35a52d72284d912d944b72a15aed18ac",
+ "testharness"
+ ],
+ "html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html": [
+ "23b7417daa9d2d9d026b97653997fb866083b65f",
+ "testharness"
+ ],
"html/semantics/interactive-elements/the-dialog-element/dialog-close.html": [
"94ed2b8f019e1b65c47c5f971503496bb4765048",
"testharness"
@@ -588410,9 +595495,13 @@
"testharness"
],
"html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html": [
- "10dd870ad796a59bef26d18917bf91374f475f93",
+ "c00ac5b6d038b45b1a7cfbef94a4527757fa74e6",
"testharness"
],
+ "html/semantics/interactive-elements/the-dialog-element/resources/common.js": [
+ "15580f3e0243093710d4914224ca3963992e3f5b",
+ "support"
+ ],
"html/semantics/interactive-elements/the-menu-element/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -588430,7 +595519,7 @@
"testharness"
],
"html/semantics/interfaces.js": [
- "b63c7402601bbf801f65dff9bef38797cdaf9eae",
+ "a9ac58b56b1a0f69f4e47365cb0ada55f31958e3",
"support"
],
"html/semantics/links/.gitkeep": [
@@ -588449,6 +595538,14 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "html/semantics/links/following-hyperlinks/activation-behavior.window.js": [
+ "aebe3d5ccf39622783c358303acdd3d230bf6abf",
+ "testharness"
+ ],
+ "html/semantics/links/following-hyperlinks/active-document.window.js": [
+ "9561aaf89b8fd9ad0ef501e6f02167930044a66a",
+ "testharness"
+ ],
"html/semantics/links/introduction-3/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -588577,6 +595674,678 @@
"1fe7fe27c3680b24fbbb9c09c849ecb007637d3f",
"testharness"
],
+ "html/semantics/scripting-1/the-script-element/execution-timing/001.html": [
+ "d23ee4e0c5c00c5d7d4391ebb346536706667759",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/002.html": [
+ "5d092ce11bcefce70ae01bb7001bb889da3dbf5d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/003.html": [
+ "8816ebc0a22bd4d3e18abd2805674192d29f3c56",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/004.html": [
+ "04a8b79a47ca437a02a17bb551b7fef2b6a7d835",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/005.html": [
+ "37c775d72cfdd519dfe126265ab77b272d1bc0c8",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/006.html": [
+ "1a4f3d8b56d6e791731fda5e780a2b69573c3eea",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/007.html": [
+ "1e52e022c5b97bd1dee6cbfe6edda4cc491458d7",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/008.html": [
+ "ba143e2e8a844ddc8387233d8b4df3f5be5561c3",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/009.html": [
+ "b0b0c51cf1f3d451592817ee875959c9fcad9418",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/010.html": [
+ "e1bfc98b54eb53b3520fbfba440551121176453b",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/011.html": [
+ "40f7ba1fd6581d2d6244e22159b50f98d1612fe1",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/012.html": [
+ "842414a5d4fc08a4e912516113b0315037eb8a60",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/013.html": [
+ "a3d31f55bba0f353ab5caf78beacae281fd7de9d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/014.html": [
+ "1a3b078aafa030aa0e3caab6a5e62570bc88af1d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/015.html": [
+ "07443ef6a9cf56f819ff47255da89d68d56888d1",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/015a.html": [
+ "0291cba1bbbbe463a61eed48acfd5c1a40d79625",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/016.html": [
+ "202b0b13b825df17d884bbe451c7b0c5191140d5",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/017.html": [
+ "ce99b2f58fcce540ec59cdb1837a43ade8e3c445",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/018.html": [
+ "47ffb063e8310b7863b2eef1ec45fbb9804cd024",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/019.html": [
+ "4b1f1d3d868715cc9d43e85f7774e9578f8e3b23",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/020.html": [
+ "cd5cb151ef5aa014b8fc644da13004b4ab80f918",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/021.html": [
+ "5da0f3f20606338b7b5a3798412ec898d717c5cd",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/022.html": [
+ "324705142c6eb688e421f40866af8efda10614c5",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/023.html": [
+ "aba03041f8bbade7f83f31d8a38ff247db0a033a",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/024.html": [
+ "9189d5d9e97ac61133296d74960a47e8d735760d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/025.html": [
+ "709b649c46dd694b128c4c0269705ddce31fdf51",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/026.html": [
+ "f773e76d937b46495df061d263c2448045003d2c",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/027.html": [
+ "467f8ba4a1046d643dab83b5f9cf87219f437d16",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/028.html": [
+ "e6db3561c59689d2daf87a4ff7579e82869ad1a4",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/029.html": [
+ "8aed4c01686d0584f3bf64c96fa1b40f4c5e7cb6",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/030.html": [
+ "c4e54e3679de97974fc9712e94e1b65a59a92dc2",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/031.html": [
+ "a32f62c9e473df14a85bf5961821322107253d0a",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/032.html": [
+ "0960b1cf2ef637880c41c4b0d5bfb9d6a4d05db9",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/033.html": [
+ "0ff9f866cd241987016b2c9a032b4efdd2ddcafa",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/034.html": [
+ "d02af948b140f0a12e9ec61113e268a884063075",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/035.html": [
+ "710dd846ef4562af224083485916875bd7050074",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/036.html": [
+ "0dc31c258b1f527c93f8ad406aea991619e90f54",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/037.html": [
+ "699691cf6c438cf37577b447ddc8a4e02356043e",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/038.html": [
+ "9d58a9f108344b8015aba6e7f22bee9dc964801b",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/039.html": [
+ "8f1cc330e3aa99be1324239a939ea0c9c0344c4b",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/040.html": [
+ "10c9ca126729f1924f66f6ae73500077320f83c4",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/041.html": [
+ "08170c207fd5bdbcb03b991ae95a4f092a3bda9e",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/042.html": [
+ "0f0666cddf6f56ba8895bb6f439dea84bc140a27",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/043.html": [
+ "04f9067295d8bf022e9b4b2ebaed53248de23afa",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/044.html": [
+ "1ca89c76816117a1d3dc95604f4ebf6fde3c5dca",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/045.html": [
+ "b2e9b2a41e4c8036c4e6213f741039d899a6b741",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/046.html": [
+ "f6871a347c13221475de9488fac2a5389dda53ca",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/047.html": [
+ "8ec0b8d61e7db888255872254cd1a46573dacb41",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/048.html": [
+ "c7b02c6f69234639f2809425fdaf6ec004fce999",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/049.html": [
+ "807973fb2e8f5c00914f09445b602a9b6df2f544",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/050.html": [
+ "37c44d5bd82e4cc839404ec4af5e92b06614cbfd",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/051.html": [
+ "d06c4297e7bf4da6ccbad488864aa7fd2fcb1394",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/052.html": [
+ "b924f14c757438522610244498f28aa3a142c14b",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/053.html": [
+ "8712c6b08a1a5f43fbb901762b6b5cd12ebbace5",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/054.html": [
+ "71933d0ced1e7fa1123689eca895e52bd0944940",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/055.html": [
+ "27e5aaec0291a2b8fdb7a56798cba419f957f252",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/056.html": [
+ "9ecf4fa7eaf31babc4df73a4961a3cafb316b5a2",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/057.html": [
+ "c906d6ae1433447512d77bd9fce2d0a4cfe2adbc",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/058.html": [
+ "083f0f66c76b55f09085bc4a58d3fd38b71965e0",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/059.html": [
+ "e25c32a4f5a39f1be467ec0aa2c720a2d35ca932",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/060.html": [
+ "a3a4dc2504b3fc328b1799b5396ab12dd5e9c1e5",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/061.html": [
+ "6160078136cc7b7141a6782e1fe85d07809a8494",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/062.html": [
+ "23800f06871a9ccbcbbad57026392d1736c59f51",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/063.html": [
+ "4a14ffb877cfcabbca43c0839002a3665482ea42",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/064.html": [
+ "0df9e896cd4024431d79015bae07106b8c90ec38",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/065.html": [
+ "a3e198095c684fe65f7410b17f30e20d5159825a",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/066.html": [
+ "d0a459b7effa011e26f59e8fa5739d06613709da",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/067.html": [
+ "f883a1cc977c4a7fe60e3b092508650521397e14",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/068.html": [
+ "bbd657ff7506c8a28185b6865ddf9a389c27aaf7",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/069.html": [
+ "d1ee26c303c8e7c3e6f5041a25a978073be697f4",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/070.html": [
+ "7b0356538c3b22127fd386646fd59f26678d116b",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/071.html": [
+ "33eaa69d30bcb6fb76523f09d4f2da82e620824d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/072.html": [
+ "4499c86050bda22dc556949dfdc12200403b395b",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/073.html": [
+ "d425736a5e4963f2cb3dbb1b5302d254170ec31b",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/074.html": [
+ "e998a89f344b2cffe0dbb368eb7c3840f5627bff",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/075.html": [
+ "01089de4c049a4b35e675f8ac6c5c82f0770201e",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/076.html": [
+ "c410028036e51ae5529acce711ea3dc1cbc83728",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/077.html": [
+ "2bfe280f0ae7b745f2217055e66579ab6fb06769",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/078.html": [
+ "71244598c4d1c581fb0b8c9a9eb1b19f642428f7",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/079.html": [
+ "c8ad7d7bd5cdfbd52d4250b43df2abd4f06320e5",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/080.html": [
+ "719db071d0811f4bc538376c0a76f79d7c200730",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/081.html": [
+ "6597e659964354f9c41ddb6925f34623e58db53a",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/082.html": [
+ "bef1558730e9919f70c9d40aa811586648cc916a",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/083.html": [
+ "c8cfd89e086120759ea5fd8f16948076beee8155",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/084.html": [
+ "659b7632d4b0bd8ea4313640459afa18fa6d64a1",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/085.html": [
+ "2679374b00a1cbd7bceb27cc696f43f8607e46d5",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/086.html": [
+ "1fccb73a9edfc52c76a190ddf50b8d5f7b5b51c6",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/087.html": [
+ "3a540cfe0c880fd2e18744fe9e2ae6db4a99286d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/088.html": [
+ "90dbe71c37b9434a1d27fa1c5ec3114f21a2a31f",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/089.html": [
+ "8b2fb9ceac6efb40495bfc11a990e5c36f37841f",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/090.html": [
+ "bbe3fd83cb6ae72411fc90765ed1be34ebc121f3",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/091.html": [
+ "c0f530e26a32057f959e956e9afcf17d6ff4ea85",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/092.html": [
+ "12bb519adbd5c893c707cd3b380542d6b91066e5",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/094.html": [
+ "5915860f57305a372e1d1e0af64d3b7ac3a17a89",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/095.html": [
+ "909eee2234b05c80065928819a88f7ce70348034",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/096.html": [
+ "2b7db1943ab7ce33fac27d10fcccadac1a11c188",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/097.html": [
+ "a0ca9cf4f61905345ad53136617f2f77a4e44b66",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/099.html": [
+ "02e40ca54cb912ca3545f5b84d652bcd934cb09a",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/101.html": [
+ "8aa9b4d0c0c3aec53f4b9cbbbe04a98198379c8f",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/102.html": [
+ "e9947d2246c4df9e98198508c2105e10902e6203",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/103.html": [
+ "b7e6bcc02ea853070cc474f174fd585841812feb",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/104.html": [
+ "c701f6fd4c92d4f67069547ec00a28647841731f",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/105.html": [
+ "f0dad0aefb07c07d7201e92a674f90a68d469973",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/106-import.html": [
+ "e231c8038d73b9ee2dedfe0682fb8c21d5271fcb",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/106-noimport.html": [
+ "0ae4f0b07e4d96371f6cfa2f8344945caee4b936",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/107-import.html": [
+ "cd8a4716caaabb26a1dd6cb38068479b351a49fe",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/107-noimport.html": [
+ "60448c23c8165a2c4f439d89732f8fedf8498a3a",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/108.html": [
+ "0be6d320bf37804fcfe7b78a07a3142faaba1572",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/109.html": [
+ "39a7189ff52030e640d83198d6a4146e920a91f6",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/110.html": [
+ "3420419e7c63b7ca90e04bde19a4bc95f3a5c95d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/111.html": [
+ "a99a1c9e43cbd3332130a165774dd54d4ac8c4be",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/112.html": [
+ "4447a3344bfdf9e3d56a6bf754c33d2f53933aa0",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/113.html": [
+ "9bacb339d93392b93edab759c910c1cdab09f6df",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/114.html": [
+ "0000752ff78abb1158197a8e8920a54e97cb7b77",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/115.html": [
+ "52b423eb9f50314e1b27ee61fb41f6d279888c07",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/116.html": [
+ "d77e037c163cfc8c45a3eb3ecdcecd8b492cd8a3",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/117.html": [
+ "c28528923ecc446750f72c9886158dc731dc12c1",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/118.html": [
+ "641d49953c5e5270059ae8fd6cf3f65879350fb9",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/119.html": [
+ "cc32b1d7115f6803cd91176e8497238f25575169",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/120.html": [
+ "c2d7f974bf9bd4cc9e750eb4c50edecbcdcafd9e",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/121.html": [
+ "0245a0b6ba93d08756f62221336f3bd67d2a590c",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/122.html": [
+ "b5d0fad74d7fd7c10734e8f28c4167f9d98d5cae",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/123.html": [
+ "c3703a934c8641c6b883382c0a6018fd834f5e10",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/124.html": [
+ "7979e04915d796ef576dfb59d1f78982db2cf81e",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/125.html": [
+ "d569b9c830ee0a373650d4d9db327b966b182f5c",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/126.html": [
+ "be9626e860210736b9685ad7886ca056ab30fe1a",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/127.html": [
+ "1e0808649afba34d91bba059636ea57e3ed891bb",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/128.html": [
+ "a28ff6eafdd78e1af6322becbefb7cf50f2407e8",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/129.html": [
+ "7aa159087c7638e87413e0b0fc7908e6fc68698f",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/130.html": [
+ "243c9eba19176f31530e143516ca715755600c39",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/131.html": [
+ "740031dbe1bbbf94a0059dfd8446fbacaf831ede",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/132.html": [
+ "e6e3530979aecd63fba2604a93f3e75280f3b154",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/133.html": [
+ "25b8dbca8b21a766bed54cfc7febd8cfde976997",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/134.html": [
+ "15609476a51e77175976a82d0c10b59b220e3ac0",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/135.html": [
+ "ce7272e84d882fd6fe300b17e04d19c92872ec72",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/136.html": [
+ "ef70c5d1a5cb8d18256b20f9fbcbf3cd8298870d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/137.html": [
+ "0cc989017587965b2382325919c2d12861977271",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/138.html": [
+ "9da55aab3e057b46b1805961c10e8a9a1934d667",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/139.html": [
+ "1a5a367353adf741ef7f4acee41caaa215223fa4",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/140.html": [
+ "c7828895274df824c0b11f45625b23247cd1a6e3",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/141.html": [
+ "2b9164d00a4a1ecea2bacc63b3da663cc4a6262a",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/142.html": [
+ "8ce8fddf1a5101442d7626baa526d7c78a4ba9a0",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/143.html": [
+ "adad099b2203fc0d465247f254e59d49e4cdea9f",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/144.html": [
+ "1535549f62b6f3df33861a8a87d62410ba6b19cc",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/145.html": [
+ "8d3ec79d77d193dd07bc7a5a84faaa4f172a4f18",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/146.html": [
+ "cb7f116ba71d7482936f40fab78db72cbe24edbf",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/147.html": [
+ "8547607e8bb80733068d9ea6236995e64cea4397",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/148.html": [
+ "25c984be14ca2f8cf01549b264d72a9edf054970",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/149.html": [
+ "5fba7bd883dd018e25af52b1708e53151effcbba",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/css/background.css": [
+ "7a48895f08aca52493e4c9e192a382664b00341b",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/css/import.css": [
+ "2e8c8d9ede773e4078b2e8926d08c87e5b649bf1",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld-postMessage.html": [
+ "1c5be7112209bd55cce40459a5bc670018d224cc",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld.html": [
+ "7c78659eaaeec9f9a4c0bb990a538fabeac9db1f",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/count-script-tags.js": [
+ "54818d68b9c9ef3d0ede269cc75eb12e977fe8b9",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-body.js": [
+ "e65eff4f877fb89de51f569e07add665147cd9c9",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-foo.js": [
+ "4b22b857070d1aa7615e889d2602196ca9431049",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-1.js": [
+ "722fea5d23733d822faf5717f66f2ff2cccb62a4",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-10.js": [
+ "8b70b5a43ab3f1efd9755bf95f9a2713bbe588ce",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-11.js": [
+ "f26e65bc15505040371e3026cd09c8eb0df0a1c4",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-2.js": [
+ "3a3c18956bb0ccf8c13b301cd3c6f0a6e474ce75",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-3.js": [
+ "80d22183699d06a1b7da5136a118404a7e05778e",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-4.js": [
+ "80c723fe3486f7cb90b7b9fd25ea836125e562d1",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-5.js": [
+ "45ce718f612e0adf967327716087f04325fcbee9",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-6.js": [
+ "f7b945c3ed8e981a7f0ed1fc971c08fe05f971a5",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-7.js": [
+ "39f911ed6844c0d38ccd91c3642e234c274a916c",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-8.js": [
+ "fe0ad17a092c33cad29ffe0a00325ac573c0f464",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-9.js": [
+ "2cd9bb85862c8c577e2dff564459516f4a4b2c07",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/execution-timing/testlib/testlib.js": [
+ "935990254a9fdd0549a03fd9346c85e027986461",
+ "support"
+ ],
"html/semantics/scripting-1/the-script-element/external-script-utf8.js": [
"2d1c2cf696010feb64b17f00a072f3bbe6b1d713",
"support"
@@ -588617,8 +596386,16 @@
"5d5e954fd50f3d474e69875d11e03ade7c80d7cd",
"testharness"
],
- "html/semantics/scripting-1/the-script-element/load-event.html": [
- "e702aa5d09183d147850f61503d2e18f78a0a660",
+ "html/semantics/scripting-1/the-script-element/load-error-events-1.html": [
+ "f97f03f6a6e73665eb2f5c4c61801f432f75a59d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/load-error-events-2.html": [
+ "a20dbe60fad2827bc97fb647c3a29ec1c54cfd0c",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/load-error-events-3.html": [
+ "a2dd0a60944fb8785493a50ad802f7793355a385",
"testharness"
],
"html/semantics/scripting-1/the-script-element/log.py": [
@@ -588629,6 +596406,18 @@
"4014bf8d2c024f3c9bc8d90595fa9af7786fed3e",
"support"
],
+ "html/semantics/scripting-1/the-script-element/module/charset-01.html": [
+ "212b17deecd882699ef7f26ffa397f4cd2a705c4",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/charset-02.html": [
+ "84794e90fb4dbd4e11fbee3e4b390b8b3f01d54e",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/charset-03.html": [
+ "364c6d3b48ef8143d62d6f6bb02aa5554b0bd367",
+ "testharness"
+ ],
"html/semantics/scripting-1/the-script-element/module/compilation-error-1.html": [
"e36eda2e9941e0cfefbfd867d36da6de4dfe7b2e",
"testharness"
@@ -588637,6 +596426,10 @@
"fe3191547b7292f0c486febe0cef930a0a8fa590",
"testharness"
],
+ "html/semantics/scripting-1/the-script-element/module/credentials.sub.html": [
+ "52879d70166ca501a81688766ef9b928660796ab",
+ "testharness"
+ ],
"html/semantics/scripting-1/the-script-element/module/crossorigin-common.js": [
"a58804b6e2495f99ec3f8b7894ff52186a49a427",
"support"
@@ -588689,6 +596482,10 @@
"6bd1fff05e91002539688b03eff9d7313e0de9dc",
"support"
],
+ "html/semantics/scripting-1/the-script-element/module/custom-element-exception.html": [
+ "df1ab90d1a7aa3b74f1097283f8f9c116f42f9ee",
+ "testharness"
+ ],
"html/semantics/scripting-1/the-script-element/module/cycle-tdz-access-a.js": [
"00e8e5ec0b5bd3b3e8735bb38ceb5749a5090efa",
"support"
@@ -588705,8 +596502,56 @@
"32b68baebfa9d82753f186ff34789922b1467e81",
"support"
],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html": [
+ "fd09ee8d075fc21786f6ed605acace65d94d1325",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html": [
+ "fab2384255a9cccad102dd1f7e3ccec2d9f5f34a",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html": [
+ "5d91ebe7470fc1ab17e075f98f6e72a879ad60e6",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html": [
+ "b69fecbbf7254070d2f7a651a6429f829b65e275",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html": [
+ "e8fe7c798834fcd1c3f084a7344ed1f063c09831",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external.js": [
+ "3b18d95251c1f5470f1269cf42847c2ac257b16f",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html": [
+ "41aa6634b6ab394eea6eaf9dc4fe621d2ee14b9d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html": [
+ "997859fce8ed8854053d089a78ab999b3f88a072",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html": [
+ "c5e3bf053403a49ee72c7464b1c1d0758f0fc8be",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html": [
+ "a33d3b405b1a826f51dadb18431c855b13aee612",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html": [
+ "e22e6f200162000f043d114c89def6667097d13d",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html": [
+ "b332499d43e0768b5ddf1d5dbb5cd8ca702c3c64",
+ "testharness"
+ ],
"html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html": [
- "3c45e09c2192615bc44da576403a5ba065eb1ebf",
+ "32455a1418d94fa68368bae3b1c0291204f6b4e3",
"testharness"
],
"html/semantics/scripting-1/the-script-element/module/errorhandling-parseerror-common.js": [
@@ -588722,7 +596567,7 @@
"support"
],
"html/semantics/scripting-1/the-script-element/module/errorhandling-parseerror-dependentmultiple.html": [
- "956e41c3916bdf33307cd8c6e76fd48079433807",
+ "06f50ed88c9b682cea7bc511adc92dff6cd7d1dc",
"support"
],
"html/semantics/scripting-1/the-script-element/module/errorhandling-parseerror-dependentmultiple.js": [
@@ -588742,7 +596587,7 @@
"support"
],
"html/semantics/scripting-1/the-script-element/module/errorhandling.html": [
- "ffd411f153c55abf313fba5ab349b6a0cc50ba0f",
+ "10ccf68924459d54784ebc9cfdcdad21cb20811e",
"testharness"
],
"html/semantics/scripting-1/the-script-element/module/evaluation-error-1.html": [
@@ -588830,7 +596675,7 @@
"testharness"
],
"html/semantics/scripting-1/the-script-element/module/imports-a.js": [
- "8188ade38a674e3ac9d4a404f318d499713d4801",
+ "fda06c1c54bf3202f7c5ca0fbc56167c81abd9e0",
"support"
],
"html/semantics/scripting-1/the-script-element/module/imports-b.js": [
@@ -588889,6 +596734,122 @@
"80fa90a214bb4839703c36f9db36e07f3a2ca7f2",
"testharness"
],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html": [
+ "dbb8eb640576cd4f658e32dec441919e943f8d21",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-4a.js": [
+ "051586d3af5158af29ee8f46157964252a47ef65",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-4b.js": [
+ "ab58fcee083c1484097922a5e4f90927d798b13d",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-4c.js": [
+ "7ba0fbc265b5d816566bbee9dda4959270cd739c",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-4d.js": [
+ "bcbde9b3648aaac72d8d2ae20846a53cef8abed3",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html": [
+ "fcc8da57e88ee87592a02888c54bb6d66e5172f6",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5a.js": [
+ "b946a91f9241587336e2e173ad2e094c3c374e79",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5b.js": [
+ "4ce41460910bd773fb1ba8432e20187991af5a9e",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5c.js": [
+ "d19dda7708e1f524da0ae82f26d01897290d5c2e",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5d.js": [
+ "ccc29417e76a978123dc6a0c85eeb4b61fd128e1",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-5e.js": [
+ "49aebfc4b8248cd6039ef345ce89331bd18be4c8",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html": [
+ "3551a3ff4bb431ac58f5756f44fd529008f57379",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-6a.js": [
+ "7e23dd514acd330e9156c45cd5821138d48fc427",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-6b.js": [
+ "babcf67942ddc996ec49bc2e7cf0db30378ae1fa",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-6c.js": [
+ "105bb52e0cb5bbbf47a959b2da23c14a9a8d3391",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-6d.js": [
+ "52199bd9779c8ff3c606934f2db7801a8fb791dd",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html": [
+ "0a0751baa86be9922f3676e459472cfdb4aa67e6",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7a.js": [
+ "ae6edd647b25ebc5267dc54a85e41d09d0159252",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7b.js": [
+ "73c79dc1dfd80094b8a983171ec380fd8f4d39c0",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7c.js": [
+ "35739dc7feeeb2121f9559d6dd2f16a881c00cbd",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7d.js": [
+ "a2ac1ce5cc9f227728edba988d4d0700394ed13f",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7e.js": [
+ "a2b6fc5dc9bcee139c7f9148cd39536f43a295ff",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-7f.js": [
+ "b8f46f5cfd3f85714684fe3f175723437d03b6a2",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html": [
+ "62b71ff7d3d3a74337a3c782fe75fdbcd37b1b27",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/integrity-matches-inner.js": [
+ "bf1734923e4507555842710515c20288532fd995",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/integrity-matches.js": [
+ "1bad15e87002c14169a06bc65449093646cba6d0",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/integrity-mismatches-inner.js": [
+ "e2f89748841c2026e03f09fa95f4e01f82f6c0a1",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/integrity-mismatches.js": [
+ "22357a48e06898bddce26a9a74551c9fc2b2d3df",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/integrity.html": [
+ "e74521926155dcee55da8575caf330b342345617",
+ "testharness"
+ ],
"html/semantics/scripting-1/the-script-element/module/late-namespace-request.html": [
"a04ecfd484ada80c436c880c6fb39abba47eac1c",
"testharness"
@@ -588897,6 +596858,14 @@
"2fd8c4ee6fcc66a8ddc2100a0840ebcc324a7d58",
"testharness"
],
+ "html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html": [
+ "9b35d8d7ba6bb4826274c9570056cc962660d715",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/load-error-events.html": [
+ "304dc3a7e9cd48699742b0a1431adda1d0f253c0",
+ "testharness"
+ ],
"html/semantics/scripting-1/the-script-element/module/missing-export-nested.js": [
"5c6c1dae178b88b42ce87964e372f7d7db99ba70",
"support"
@@ -588905,6 +596874,10 @@
"27cd038ca24450b1aeb9fe52cb9dea85998d108c",
"support"
],
+ "html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml": [
+ "32a4a4db2a5325b909078c73f76ab51085e66c5a",
+ "testharness"
+ ],
"html/semantics/scripting-1/the-script-element/module/module-vs-script-1.html": [
"a7fd504c7bfeefb445de9f2a1212986f27e80465",
"testharness"
@@ -588921,10 +596894,34 @@
"4ce8bcce2537785c41f054175119e39169ed6110",
"testharness"
],
+ "html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py": [
+ "49a8855de3a01f4fa8abfd5c9dbc3d0c1af2e182",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/resources/credentials-iframe.sub.html": [
+ "78e5b389be7049324224b89562eaf39fb0e1a9e5",
+ "support"
+ ],
"html/semantics/scripting-1/the-script-element/module/resources/delayed-modulescript.py": [
"f09db3d2acdf3aba3fc8c67b2f089a0ba506c799",
"support"
],
+ "html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8-with-charset-header.js": [
+ "5ff227dc83335d8a3e8da0161993c1de239ee7f8",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8.js": [
+ "263589f24f862c862ac8f47ba2de71b77bd9e5bd",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/resources/import-utf8-with-charset-header.js": [
+ "23ca0a693a1d6ee4eca34bf27c55764e769437c6",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/module/resources/import-utf8.js": [
+ "c88ce333101627fd7674c1b4ede04fd1d0cf5bae",
+ "support"
+ ],
"html/semantics/scripting-1/the-script-element/module/script-for-event.html": [
"c225684e0c7d09f9628aab589c8673b140994243",
"testharness"
@@ -588973,6 +596970,10 @@
"e6f03a1d03faf88a31cdc08eddab26b2d4c029f4",
"support"
],
+ "html/semantics/scripting-1/the-script-element/module/throw-error.js": [
+ "5ce16a70c6b65be0612f3a62ac8f4dcfd6becc6e",
+ "support"
+ ],
"html/semantics/scripting-1/the-script-element/module/throw-nested.js": [
"c0672d30dc8a0109b5a1a3e38b9a1b481e36c94a",
"support"
@@ -589005,6 +597006,18 @@
"4ce8a4cf095d43c542aa8cbcdfd57c5cf381a97b",
"testharness"
],
+ "html/semantics/scripting-1/the-script-element/resources/bom-utf-16be.js": [
+ "c5524f60baeb48504b1a62e12611c34fcb60370f",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/resources/bom-utf-16le.js": [
+ "fe79fc884260e9be74c098719136f0eb1f2dac8a",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/resources/bom-utf-8.js": [
+ "5ebf2ec79435c375eeca84b12167801f0b6c576a",
+ "support"
+ ],
"html/semantics/scripting-1/the-script-element/resources/cocoa-module.js": [
"43291b3e6eff8267c88100990aae5d4b2a09f3bd",
"support"
@@ -589017,10 +597030,22 @@
"5797045ac8591d2662a6714367ae5fb257881793",
"support"
],
+ "html/semantics/scripting-1/the-script-element/resources/load-error-events-helpers.js": [
+ "57a043fff23635ce04b62672429b6abb088cdb9b",
+ "support"
+ ],
+ "html/semantics/scripting-1/the-script-element/resources/load-error-events.py": [
+ "0a9007a17bed4635d7f384d3a32a6d2dff11738c",
+ "support"
+ ],
"html/semantics/scripting-1/the-script-element/resources/set-script-executed.js": [
"87f80eee703965c88f2bf7015bfa76233d459d06",
"support"
],
+ "html/semantics/scripting-1/the-script-element/resources/slow.py": [
+ "200bd721dadd0eb50d0b7734b17a081505697cc9",
+ "support"
+ ],
"html/semantics/scripting-1/the-script-element/script-charset-01.html": [
"4d8f27447b5c76174a2e353f160066fbe156a005",
"testharness"
@@ -589049,18 +597074,6 @@
"458423e7b86ccaa89ffc0dc9f2c6b5b5bcea02cb",
"testharness"
],
- "html/semantics/scripting-1/the-script-element/script-language-type.html": [
- "6f8f694290991475df6df99996e8f39b610b58c5",
- "testharness"
- ],
- "html/semantics/scripting-1/the-script-element/script-languages-01.html": [
- "586f48daa539249c83dc93688dc7920e94326825",
- "testharness"
- ],
- "html/semantics/scripting-1/the-script-element/script-languages-02.html": [
- "9d287c52a5b9b3a392ba78c285a41861a2cfff24",
- "testharness"
- ],
"html/semantics/scripting-1/the-script-element/script-noembed-noframes-iframe.xhtml": [
"9023542ad8ef8efb989675d9afa189289aa77f85",
"testharness"
@@ -589113,6 +597126,18 @@
"773d82ec904b3bc9565fb94813af228e7833cf87",
"testharness"
],
+ "html/semantics/scripting-1/the-script-element/script-type-and-language-empty.html": [
+ "c26ddd7838ccbb36cc2216ba8236ea6ebf67e2c5",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/script-type-and-language-js.html": [
+ "2ff44c86f93aef83c837fb9cb4fc2116bbf60e12",
+ "testharness"
+ ],
+ "html/semantics/scripting-1/the-script-element/script-type-and-language-with-params.html": [
+ "7520d0e13774dc4243e902f0aceae943893c52cd",
+ "testharness"
+ ],
"html/semantics/scripting-1/the-script-element/scripting-enabled.html": [
"4a1324770dec284d6a8432a1ae94ff27f4fe5322",
"testharness"
@@ -589301,12 +597326,16 @@
"661adb3f098161bf4535d9184e175612cfcab886",
"testharness"
],
+ "html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html": [
+ "20d5847c7978323f71a46625e9e1fd2eb899063c",
+ "testharness"
+ ],
"html/semantics/scripting-1/the-template-element/template-element/template-content-node-document.html": [
"1943b45780474af52c24d8c734072aba2fe6a442",
"testharness"
],
"html/semantics/scripting-1/the-template-element/template-element/template-content.html": [
- "61432b241e8d7e2cd8d4c70f10260fd2f13371eb",
+ "a4d34cf0ed7b52cc9c30ad1d6b6aa322b5cfd2b4",
"testharness"
],
"html/semantics/scripting-1/the-template-element/template-element/template-descendant-body.html": [
@@ -589393,6 +597422,10 @@
"6be1e4a40962036b4fc0a300e8b13a082b391713",
"manual"
],
+ "html/semantics/selectors/pseudo-classes/checked-type-change.html": [
+ "3ac87c477fd16cfc944b19c7e843fe0a61c84c20",
+ "testharness"
+ ],
"html/semantics/selectors/pseudo-classes/checked.html": [
"b5790716eff3f91ac04f78e669bfacac4ede5642",
"testharness"
@@ -589433,10 +597466,18 @@
"e20ded9d68245b887923a0cc14f6d46bc34fd809",
"testharness"
],
+ "html/semantics/selectors/pseudo-classes/indeterminate-type-change.html": [
+ "490ebd95eca88e917baf5550015af18ab8de5c34",
+ "testharness"
+ ],
"html/semantics/selectors/pseudo-classes/indeterminate.html": [
"d4a60c5c7e3a3fbf16e87d347856b27a731a8820",
"testharness"
],
+ "html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html": [
+ "ef8776ed618df10937a704b154a1adfea351ac76",
+ "testharness"
+ ],
"html/semantics/selectors/pseudo-classes/inrange-outofrange.html": [
"8bcc8d0d7997c2bd55d66e816741ec4a9651dec7",
"testharness"
@@ -589445,10 +597486,22 @@
"c35cbd27d802f058e34ef687e41e3bb0f5a1ec3b",
"testharness"
],
+ "html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html": [
+ "d3d596673f9a9310d433f3500109ec03e1b7e588",
+ "testharness"
+ ],
+ "html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html": [
+ "68bfceb6c65638a0deeba8630c2e6e09f5dc344c",
+ "testharness"
+ ],
"html/semantics/selectors/pseudo-classes/readwrite-readonly.html": [
"835c87fe2a1952890b1adc3f39981a0c1360b5be",
"testharness"
],
+ "html/semantics/selectors/pseudo-classes/required-optional-hidden.html": [
+ "0d132ded36e5eaad8c5a4018bc6f966c739f70ca",
+ "testharness"
+ ],
"html/semantics/selectors/pseudo-classes/required-optional.html": [
"503189428dbc44ad4cd5d9c93b22d2ea9307d89e",
"testharness"
@@ -589498,7 +597551,7 @@
"support"
],
"html/semantics/tabular-data/processing-model-1/span-limits.html": [
- "221803eac571dfc67c97122467743be20b1d17c0",
+ "8e22913e1a3cae5de1413765e5e8de559d5178f2",
"testharness"
],
"html/semantics/tabular-data/the-caption-element/.gitkeep": [
@@ -589649,6 +597702,14 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "html/semantics/text-level-semantics/the-a-element/a-download-404.py": [
+ "c28a2e25288ef685cbcba11493a5eab7d5ede9a5",
+ "support"
+ ],
+ "html/semantics/text-level-semantics/the-a-element/a-download-click-404.html": [
+ "9c9b5c7f78d9c06707d4aaca8256f1fb3da9f06f",
+ "testharness"
+ ],
"html/semantics/text-level-semantics/the-a-element/a-download-click.html": [
"64cd3f544c42f21c33456e000788aeaab2fed3eb",
"testharness"
@@ -589673,6 +597734,10 @@
"d6cf92ac34d83cdd6357d516daeb87108933f8ed",
"testharness"
],
+ "html/semantics/text-level-semantics/the-a-element/resources/a-download-404.html": [
+ "f703d9a7ce1e09e0c9ef9ea2bd2cd2b318613f6d",
+ "support"
+ ],
"html/semantics/text-level-semantics/the-abbr-element/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -590006,11 +598071,11 @@
"support"
],
"html/syntax/parsing-html-fragments/the-input-byte-stream-003.html": [
- "9a6797fc94ed04cdbe5585502ac8f9671d93a36b",
+ "50a189451bcbec4009b8f7068aa59ea038c27248",
"testharness"
],
"html/syntax/parsing-html-fragments/the-input-byte-stream-004.html": [
- "f659c89c624ea7e0d10113dabd082c117d1e2fd9",
+ "3e0dd140e28c9cb66a532e4c9c8e7e4b1b5121e3",
"testharness"
],
"html/syntax/parsing-html-fragments/the-input-byte-stream-007.html": [
@@ -590681,58 +598746,6 @@
"f777c3f2ce746d415814083dc932f4a25a82c34f",
"support"
],
- "html/webappapis/idle-callbacks/basic.html": [
- "1349f9f3bc645fc999dcd2da6e53aa46779053c6",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/callback-exception.html": [
- "84270b568b8f4d67d04da5df99cd2e0eb8e51977",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/callback-idle-periods.html": [
- "65056dde042c8c0a25d3f9c375f0925aabab955f",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/callback-iframe.html": [
- "ace7008a593a32ca016685aaa85bda9b4c4bd8c8",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/callback-invoked.html": [
- "e7cf5a399d92f1fcb98f6ebb1ed3283d60d2bfe2",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/callback-multiple-calls.html": [
- "af6e6a65fda2486ac8669340988b1d57a178e77a",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/callback-removed-frame.html": [
- "ff034276659407d2dea91d2b0ed0e5919b875904",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/callback-suspended.html": [
- "f3f9eeda9e2d47825c77eaf278be6e976a8e1715",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/callback-timeout-with-raf.html": [
- "febb81c38f530c81d9e9837df2c6d603225ecfd1",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/callback-timeout.html": [
- "ba76964575cdf9b433f26c8a5d7a8183ab5c16e9",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/cancel-invoked.html": [
- "30787d765fa435c1392bd852559042bf3c2e2553",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/idlharness.html": [
- "520ee58982b43875f3caa08d7f46b9c6311be0b6",
- "testharness"
- ],
- "html/webappapis/idle-callbacks/resources/post_name_on_load.html": [
- "4c2db9979bcf68c61e62a805d59d95b7d164d9af",
- "support"
- ],
"html/webappapis/scripting/.gitkeep": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
@@ -590894,7 +598907,7 @@
"testharness"
],
"html/webappapis/scripting/events/messageevent-constructor.https.html": [
- "78d9fe8ca88a24621890aee14d33694aa76c6a27",
+ "41b986c878176f99ef150c12ef6b74d00ef1f7cb",
"testharness"
],
"html/webappapis/scripting/events/onerroreventhandler-frame.html": [
@@ -591177,44 +599190,20 @@
"2c41fa08c5296f814d286d8b459424c5c488e3e1",
"support"
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content.html": [
- "5a9a9f9452e113cc458fda86528a0240d33bd092",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/001.xhtml": [
- "421d04eab9a840fbe22b090996e8d145a055449d",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/002.xhtml": [
- "b3cb232ea7347baada581c3221dfcc0a5fb20aed",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/003.xhtml": [
- "62feedab0f34fddae585c18ba25dbb1a113a49ec",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/004.xhtml": [
- "7a32f6ff9f251674430f2133fdf35610b879733d",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/005.xhtml": [
- "40c238fbc46063b619b079de9c042c5b2f55a3b7",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/content/006.xhtml": [
- "a160f3bdac64c538b1f801f5a6f4a067338eb1ad",
- "testharness"
- ],
"html/webappapis/system-state-and-capabilities/the-navigator-object/get-navigatorlanguage-manual.html": [
"d487c6dac121b518886c5f9c3389e54a6238a81f",
"manual"
],
+ "html/webappapis/system-state-and-capabilities/the-navigator-object/historical.window.js": [
+ "2a13612466333815c1ee890ff8ef68163ad5fbca",
+ "testharness"
+ ],
"html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-indexed.html": [
"3a478a2d6f508242244308641a2d57d4eb00798b",
"testharness"
],
"html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html": [
- "f1907fd820e2f6a195400a9bca96f3dae45fc308",
+ "dc5ba1cb0f402f0fb0243bb2fa1b9da0c610341d",
"testharness"
],
"html/webappapis/system-state-and-capabilities/the-navigator-object/navigator.any.js": [
@@ -591229,30 +599218,6 @@
"9ab91396894612ad2a71643cd5253fcc8572983a",
"testharness"
],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/001.xhtml": [
- "d7418838994fc0f6916e89a1b79d2a9c8536d7c7",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/002.xhtml": [
- "3bdec81bc84240cba8f5dbd24b8c6f5ae035f9c0",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/003.xhtml": [
- "02eeb4a40996b0c0fc44da1b14e0ecf3c58b3cd0",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/004.xhtml": [
- "29522f446c7df762eac96c7b7d05d96a49a2558e",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/005.xhtml": [
- "d99c6f077b63017d4a5782b751a6d288b55fd92d",
- "testharness"
- ],
- "html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/006.xhtml": [
- "8efe37cac0d5dd0004bf0743c702eba27690058f",
- "testharness"
- ],
"html/webappapis/the-windoworworkerglobalscope-mixin/Worker_Self_Origin.html": [
"9b895ac9dba41e20e341114eac7ab383cd8b08fb",
"testharness"
@@ -591305,6 +599270,10 @@
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "http/OWNERS": [
+ "0bf8031d11c018af20c2a7387685b7b370ce643a",
+ "support"
+ ],
"http/basic-auth-cache-test-ref.html": [
"42fbbd76956a8d2a84221500f70bd5c42cf5c75a",
"support"
@@ -591321,22 +599290,34 @@
"c86f164a128d02814744e0456e4588062eb016c8",
"support"
],
- "http/resources/securedimage.py": [
- "bc4c7a8b5eef0e082a5fa7c8c763957d92730747",
+ "http/refresh/README.md": [
+ "f503dfb32f6762191ad3fda507256b697ffd1602",
"support"
],
- "image-decodes/image-decode-iframe.html": [
- "2632f69b005ea382ed91bfb71a7e0e2ee931a0c8",
+ "http/refresh/navigate.window.js": [
+ "d49d82110916c7bb675bb1c332c0d5499c180028",
"testharness"
],
- "image-decodes/image-decode-path-changes.html": [
- "64dde3f7b1f9ed02e4433858f075123f18c092a4",
- "testharness"
+ "http/refresh/resources/multiple.asis": [
+ "b0986e96d4eea0e280aec1a82bec472e39abcb22",
+ "support"
],
- "image-decodes/image-decode.html": [
- "02d38d593fb42587c3ef261c349f7c42db345005",
+ "http/refresh/resources/refresh.py": [
+ "a64a162dee650125a4ba6244caa9a8a1de397371",
+ "support"
+ ],
+ "http/refresh/resources/refreshed.txt": [
+ "eb5608b416f1f461e2acd0dbc848cd93807250d9",
+ "support"
+ ],
+ "http/refresh/subresource.any.js": [
+ "dd861a7c3fd42255edb603f50c7466dd9132917c",
"testharness"
],
+ "http/resources/securedimage.py": [
+ "bc4c7a8b5eef0e082a5fa7c8c763957d92730747",
+ "support"
+ ],
"imagebitmap-renderingcontext/bitmaprenderer-as-imagesource.html": [
"f80d1496329c64643d2b40e478779929de20c499",
"testharness"
@@ -591501,6 +599482,10 @@
"44481e3f374d75b735ac01ae83dc8ed9330238fc",
"support"
],
+ "images/smiley.png.headers": [
+ "4f956a2d550f09444239d1c0bc640200a3c60102",
+ "support"
+ ],
"images/threecolors.png": [
"3c394b0d754a7b02514b46d5483a0014d5dcdca6",
"support"
@@ -591521,7 +599506,67 @@
"4e33f8928d27bd64a96d72c32de08ebd483ab888",
"support"
],
- "infrastructure/failing-test.html": [
+ "infrastructure/README.md": [
+ "2f3b62e45352d2226918e0959616c04a82547d9f",
+ "support"
+ ],
+ "infrastructure/assumptions/OWNERS": [
+ "946f23f945163bf9f9da080291b21473f6e1cbd0",
+ "support"
+ ],
+ "infrastructure/assumptions/ahem-ref.html": [
+ "65ecf705ea9804f42a2503941afe96a0c06dd3b7",
+ "support"
+ ],
+ "infrastructure/assumptions/ahem.html": [
+ "770fd700c20d041fcfc2d01b53b3f0671c95ec15",
+ "reftest"
+ ],
+ "infrastructure/assumptions/canvas-background-ref.html": [
+ "0868a5443b1aacb8fd95327bc7c71d071158b0f1",
+ "support"
+ ],
+ "infrastructure/assumptions/canvas-background.html": [
+ "2f1a763d3e15a27a9220b1f084847f33092003d0",
+ "reftest"
+ ],
+ "infrastructure/assumptions/html-elements.html": [
+ "dacd5dc7e1d723046d5e9eea0a0eb8046d501fca",
+ "testharness"
+ ],
+ "infrastructure/assumptions/initial-color-ref.html": [
+ "23bd9bc50c23f6bdbe2c63bbd652a28e1a222586",
+ "support"
+ ],
+ "infrastructure/assumptions/initial-color.html": [
+ "14b5a61881546831e2b2733ae9592b2f932f86c4",
+ "reftest"
+ ],
+ "infrastructure/assumptions/medium-font-size-ref.html": [
+ "49f1b97b20c6ef7b0452e078fcfc56d8f3c14f77",
+ "support"
+ ],
+ "infrastructure/assumptions/medium-font-size.html": [
+ "011f54dc11a955ac173621651c67b2282d046dd9",
+ "reftest"
+ ],
+ "infrastructure/assumptions/min-font-size-ref.html": [
+ "5a0be668075cd811b2dc28267210c4cfdd692397",
+ "support"
+ ],
+ "infrastructure/assumptions/min-font-size.html": [
+ "df47a9a9342da260175776c3406856be096d0012",
+ "reftest"
+ ],
+ "infrastructure/assumptions/tools/ahem-generate-table.py": [
+ "7057b804e191b4c1a53df3b631042f9726eb8309",
+ "support"
+ ],
+ "infrastructure/assumptions/tools/build.sh": [
+ "e7549e915a809b48cac816dacdd7a9bbf476b596",
+ "support"
+ ],
+ "infrastructure/expected-fail/failing-test.html": [
"c832afb4826fd43d2fcc4f5e3fd6a773a6ee35f0",
"testharness"
],
@@ -591534,7 +599579,7 @@
"reftest"
],
"innerText/getter-tests.js": [
- "08171e0a781c05d91841e483d7e18c670c82c827",
+ "e5ec1c1fd4777a1a1c25720047a955ec04c0d014",
"support"
],
"innerText/getter.html": [
@@ -591557,20 +599602,48 @@
"cd25518dd402033694667ccd1982fd3b85faa412",
"testharness"
],
- "input-events/input-events-typing-data-manual.html": [
- "f94325d74e69fbd62bfdff3c0f4676a3d2c50d09",
+ "input-events/input-events-cut-paste-manual.html": [
+ "442b82811d9fabc1cd4b398ac28cac58d4f2f78b",
+ "manual"
+ ],
+ "input-events/input-events-exec-command.html": [
+ "233270068ad21c786fed0603a522d286c2419d56",
+ "testharness"
+ ],
+ "input-events/input-events-get-target-ranges-manual.html": [
+ "1c8c1e8d43593ac85807f22fc221d72de0d792a2",
+ "manual"
+ ],
+ "input-events/input-events-typing-manual.html": [
+ "f585014db144083ee2f70f6fd65f78bf2e289093",
"manual"
],
"interfaces/OWNERS": [
"f9c94ab08fa997459cba17e61d8cd00ee8b07b46",
"support"
],
+ "interfaces/clipboard.idl": [
+ "5af2846c7f9ff93f2f4f13780d0356cdac6a0d4f",
+ "support"
+ ],
+ "interfaces/console.idl": [
+ "14a90aae85ba0822b3dc7113a42cded55395765b",
+ "support"
+ ],
+ "interfaces/cssom-view.idl": [
+ "1bcfadd098734fc82c0cf791d4c0d35d69423ce2",
+ "support"
+ ],
"interfaces/cssom.idl": [
- "bb17bbe93776dbeb33f061a7a90889e922e3138e",
+ "fbd624297dbfaa5e0fc2144b701c38eda41537ac",
+ "support"
+ ],
+ "interfaces/dedicated-workers.idl": [
+ "16b2bc5c05aab5838458dfee6203b83d36b13dfd",
"support"
],
"interfaces/dom.idl": [
- "86f2e15d4b32af7b5127283eb3cfab5a78b46c0a",
+ "915affb8d20dcc9055d3f453efbb893d14fc529b",
"support"
],
"interfaces/fullscreen.idl": [
@@ -591578,19 +599651,27 @@
"support"
],
"interfaces/geometry.idl": [
- "b4c2837ade7a509306755eb7b682f6648c3684e3",
+ "dea55d151bd19d342f9b28bb2f11e5108ab970ff",
"support"
],
"interfaces/html.idl": [
- "137e061bbab6b23150d6ae9128df56a96cd1d68f",
+ "5e6afa54c3b4c41f31e24e6fbb55f0e77259c09f",
"support"
],
"interfaces/mediacapture-main.idl": [
"3d59aebd6219a0312ade8c543bb389030d670d82",
"support"
],
+ "interfaces/payment-handler.idl": [
+ "d1d50028218427ecb20ddd67061c9726fddcce3a",
+ "support"
+ ],
+ "interfaces/payment-request.idl": [
+ "3a5f9a4e768409532916c751e7169c35ec0e23a8",
+ "support"
+ ],
"interfaces/remoteplayback.idl": [
- "f7c100f4275f2e32fbca3bb8d9c4900df879ffe4",
+ "fc724b70bc1e1d30e538ee5154a99d4871414302",
"support"
],
"interfaces/touchevents.idl": [
@@ -591598,13 +599679,141 @@
"support"
],
"interfaces/uievents.idl": [
- "3fabcfa40caf9c66bc74bcd83663eddb0f385051",
+ "de07cb2600834f13c49e00d6d77df5108244b3ce",
+ "support"
+ ],
+ "interfaces/web-share.idl": [
+ "d3ab33fa078f1b3bd4b29e174369073aab3963d5",
+ "support"
+ ],
+ "interfaces/webidl.idl": [
+ "19271414e0e602d5bb4ec8343a9a5e10a9b65d3c",
"support"
],
"interfaces/webrtc-pc.idl": [
- "4f94c4236168ed722f71d81bd957e0da72b29c71",
+ "2e9e783362e8ea80cbad3c9c688d63b9c8256163",
+ "support"
+ ],
+ "interfaces/webusb.idl": [
+ "7b5749e1fece69552e0a8bfac7af401fac15394d",
+ "support"
+ ],
+ "intersection-observer/bounding-box.html": [
+ "a3ac1b70ba26234b7c968055171e652f3a8a14d8",
+ "testharness"
+ ],
+ "intersection-observer/client-rect.html": [
+ "acec9a4f59ebee1840950cf766a45676490eef84",
+ "testharness"
+ ],
+ "intersection-observer/containing-block.html": [
+ "8bdf6fa6a3ee09130981bf83728aa9f61a6ebc54",
+ "testharness"
+ ],
+ "intersection-observer/cross-origin-iframe.html": [
+ "98ac8bd3447bc16e86c4b15708dcd86aa4b5ed92",
+ "testharness"
+ ],
+ "intersection-observer/disconnect.html": [
+ "d8206b91756a367394ea9d444deefc0f37589427",
+ "testharness"
+ ],
+ "intersection-observer/display-none.html": [
+ "3dc956e76b23ae44f2694f4b24579f896a1086b5",
+ "testharness"
+ ],
+ "intersection-observer/edge-inclusive-intersection.html": [
+ "97921caeabdafb402de1a6f64fc28176eda3e6db",
+ "testharness"
+ ],
+ "intersection-observer/iframe-no-root.html": [
+ "6cbea44f209e59ea0b901b0fe1cec7ac1aee0b64",
+ "testharness"
+ ],
+ "intersection-observer/multiple-targets.html": [
+ "83173248b825b97063c61dd31c64d8fe7ba10aac",
+ "testharness"
+ ],
+ "intersection-observer/multiple-thresholds.html": [
+ "dcfa7d005d1f94186b173b20d4f9c367abc5a77b",
+ "testharness"
+ ],
+ "intersection-observer/observer-attributes.html": [
+ "69c802af77a38c450ce81c4c010588b0e4f240db",
+ "testharness"
+ ],
+ "intersection-observer/observer-exceptions.html": [
+ "28ccc6905713894b43033e30949170439215bf2e",
+ "testharness"
+ ],
+ "intersection-observer/observer-in-iframe.html": [
+ "3e6dcbc7aac43899186395f50649195b2ecc4c74",
+ "support"
+ ],
+ "intersection-observer/observer-without-js-reference.html": [
+ "4211529e1fdd3bfb9b3b64c29b7d000b3c706408",
+ "testharness"
+ ],
+ "intersection-observer/remove-element.html": [
+ "f2b3688fd8e069a41e16086baad74bda0fe2f180",
+ "testharness"
+ ],
+ "intersection-observer/resources/cross-origin-subframe.html": [
+ "91073aed8b250177d69ee36e9be95c30c9cf1c95",
+ "support"
+ ],
+ "intersection-observer/resources/iframe-no-root-subframe.html": [
+ "a9ea444d6bb15cda784871e2d495dc204b0e3d50",
+ "support"
+ ],
+ "intersection-observer/resources/intersection-observer-test-utils.js": [
+ "889d403e334e3c0fc4ae7a6af06ef9504145fa2b",
+ "support"
+ ],
+ "intersection-observer/resources/observer-in-iframe-subframe.html": [
+ "5f390b2e969132bce9ab486cbf2292765d5c62f2",
"support"
],
+ "intersection-observer/resources/timestamp-subframe.html": [
+ "7b590da7cf426cc7d2e3f25fac30f4533e36153c",
+ "support"
+ ],
+ "intersection-observer/root-margin.html": [
+ "be98d804610d2c08ee516a4aecbe59ffc58c22bd",
+ "testharness"
+ ],
+ "intersection-observer/same-document-no-root.html": [
+ "0f29996e4542db243c3fcd9c108463ba7260cb8e",
+ "testharness"
+ ],
+ "intersection-observer/same-document-root.html": [
+ "71876c5290184f77223843c7d3c0bed670e2ee3f",
+ "testharness"
+ ],
+ "intersection-observer/same-document-zero-size-target.html": [
+ "c1d1054447e116becb50aaf96aad00a25f0a6752",
+ "testharness"
+ ],
+ "intersection-observer/shadow-content.html": [
+ "11681640d5c8b2c62229ed5a717172f917d75ba4",
+ "testharness"
+ ],
+ "intersection-observer/timestamp.html": [
+ "0d57a6abc3c3056f921401f629ab231c458cf4cb",
+ "testharness"
+ ],
+ "intersection-observer/unclipped-root.html": [
+ "67dab96304c745f1b5462bb1074753b09d77fbd1",
+ "testharness"
+ ],
+ "intersection-observer/zero-area-element-hidden.html": [
+ "59d854e89ca0d7b035a87376566775ca2f3420e5",
+ "testharness"
+ ],
+ "intersection-observer/zero-area-element-visible.html": [
+ "f3e1fbeb1a912be412724cec47a6aa981664ff7d",
+ "testharness"
+ ],
"js/behaviours/SetPrototypeOf-window.html": [
"92efe1a4f3910a32097fb3cbeef0019d82a0e78a",
"testharness"
@@ -591693,56 +599902,60 @@
"6f8091035f4aa18131c548a81cbe80ba328169c9",
"testharness"
],
+ "longtask-timing/OWNERS": [
+ "30a9c29ba53bac131c0cca801c01dddb4779824e",
+ "support"
+ ],
"longtask-timing/longtask-attributes.html": [
- "a88bd658adcb9ef3dcbfa803397910e531bc864b",
+ "247359327818f59871be00d22942f6ecde5281a7",
"testharness"
],
"longtask-timing/longtask-in-childiframe-crossorigin.html": [
- "646324580798ab727e31db4c47b919bb9df6e6a9",
+ "1a461ce9d7283157047127312135a218044ec5c0",
"testharness"
],
"longtask-timing/longtask-in-childiframe.html": [
- "74f235096580d329eb0cc2d2c682857c2b6f2c6d",
+ "b2d61c298ef78fe19e1dc18e01db2bbf58cd1815",
"testharness"
],
"longtask-timing/longtask-in-externalscript.html": [
- "74329829a0248b8e81443f78b998bf97ac60e965",
+ "5d6f7a11f873c8e6477b105a8e7ae2547c5243ed",
"testharness"
],
"longtask-timing/longtask-in-parentiframe.html": [
- "4732540c350dcfed013f07af0590c5de04aacc2a",
+ "7b1a7373902b68ebcf8f5119cfe7904dd32acd03",
"testharness"
],
"longtask-timing/longtask-in-raf.html": [
- "e5a058a841e039e1d8f7b5f8b24d48937aad038b",
+ "d014ed0e7317871b8a14c9f2249a58d1df5589cb",
"testharness"
],
"longtask-timing/longtask-in-sibling-iframe-crossorigin.html": [
- "64085903b907b37077013d42747e3aaa8cf2b86e",
+ "6f9971d082ffa24a31e57697ea6bf929b237c62b",
"testharness"
],
"longtask-timing/longtask-in-sibling-iframe.html": [
- "d08d6f2ddf39615cc3dad7c65a01a29c9411a2a9",
+ "24fd1e4ce58d824d29a65edc913075ca98fe71d6",
"testharness"
],
"longtask-timing/resources/makelongtask.js": [
- "42c70ac5f3c87499e43eb6200e8c8007d7d1ad9c",
+ "64401c9b936a3a1bb43744d821258d43628819ca",
"support"
],
"longtask-timing/resources/raflongtask.js": [
- "9fc7b7f0c5dd55de7e5de9258fa6e70c759aed06",
+ "fd669203f66e5878150acf603610f2efdca51f33",
"support"
],
"longtask-timing/resources/subframe-observing-longtask.html": [
- "6a335da14401450f2da44c4d994c7c7b4102f57e",
+ "f2f852a5ec5aeb478b578948a301210f9ad12878",
"support"
],
"longtask-timing/resources/subframe-with-longtask.html": [
- "4acb6764c2fb60ad55733c420dfd7c1946542f17",
+ "07726af74120e3f066e8fd8f4988616984793428",
"support"
],
"magnetometer/Magnetometer.https.html": [
- "4e7d890f37469aecbce415187bb0bcf239dac37b",
+ "3fbdbbd6c3db9b1a44d7490101bea34045f1945e",
"testharness"
],
"magnetometer/Magnetometer_insecure_context.html": [
@@ -591754,15 +599967,15 @@
"manual"
],
"magnetometer/OWNERS": [
- "36770a71443523aa2f91f9958ba24066f0b4dcec",
+ "b119dbb984792f33c6e7463f3105d37c3c3b7ad8",
"support"
],
"magnetometer/idlharness.https.html": [
- "b21217da9dc986e605d172d72a5f4f3e7b2aa216",
+ "a72e1c3443feae9bf9d19385c0ba96e66b97f20c",
"testharness"
],
- "magnetometer/support-iframe.html": [
- "4afaea574bcbd68422278c5e093cf6d37ab4f9f1",
+ "mathml/OWNERS": [
+ "fc243e5e1a8898367d02bba2636a7b4f2541722c",
"support"
],
"mathml/README.md": [
@@ -592070,7 +600283,7 @@
"support"
],
"mathml/relations/html5-tree/href-click-1.html": [
- "6f54e8ae0d27ed2e1df922d85da8bf8f939cd88e",
+ "f5986ded6bc98b1866fa2258e10da888ff56ec1f",
"reftest"
],
"mathml/relations/html5-tree/href-click-2-ref.html": [
@@ -592078,7 +600291,7 @@
"support"
],
"mathml/relations/html5-tree/href-click-2.html": [
- "0737ec66e9d5421675cfaf3a010eb9acc328b1d4",
+ "12a08c6127f8aedcf886a58b7fb238da437d3122",
"reftest"
],
"mathml/relations/html5-tree/href-manual.html": [
@@ -592266,7 +600479,7 @@
"support"
],
"media-source/interfaces.html": [
- "6cb50e9726f1ba107b4d4d8e24ca4bfd8599c38f",
+ "fa1b832ea50c89a6fc1880befecc5fa059ceb60a",
"testharness"
],
"media-source/manifest.txt": [
@@ -592286,7 +600499,7 @@
"testharness"
],
"media-source/mediasource-append-buffer.html": [
- "56f0d90f006e300a412ec7ceb3c15a252ff303a5",
+ "fed1254d64c59b625af9745bbffcf5788ac5906e",
"testharness"
],
"media-source/mediasource-appendbuffer-quota-exceeded.html": [
@@ -592446,7 +600659,7 @@
"testharness"
],
"media-source/mediasource-seekable.html": [
- "5f75983eeb4eed4095a625ec997c01eaba021166",
+ "6e92616bfb23e0d00e387688ff6754e68b1da35f",
"testharness"
],
"media-source/mediasource-sequencemode-append-buffer.html": [
@@ -592717,6 +600930,18 @@
"167093849b93b142723513ac72a725c97da635a8",
"support"
],
+ "media/test-a-128k-44100Hz-1ch.webm": [
+ "eeaba4c92c956b9b97c0241b10a54c32557b9e37",
+ "support"
+ ],
+ "media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm": [
+ "e7c89345ef8085498f642f2eac75ac9b867d5814",
+ "support"
+ ],
+ "media/test-v-128k-320x240-24fps-8kfr.webm": [
+ "30080b0409424f065a1b286709c87c04c29fbb22",
+ "support"
+ ],
"media/white.mp4": [
"577f031289beb30fa38824950ea297818bab8e81",
"support"
@@ -592725,6 +600950,18 @@
"c3f2ab0ca87e837a5ffc6dfc1e757e1357c49d1f",
"support"
],
+ "mediacapture-fromelement/capture.html": [
+ "d5ccd840a00ed4a77dda172663cd39a035565873",
+ "testharness"
+ ],
+ "mediacapture-fromelement/creation.html": [
+ "f21413b0d01844dd41776c9a3b417a665b497e20",
+ "testharness"
+ ],
+ "mediacapture-fromelement/ended.html": [
+ "5d400556089e656fdf481a033cfadf0a2dc1f2e3",
+ "testharness"
+ ],
"mediacapture-fromelement/idlharness.html": [
"ceeb48e7982eb88561f4c1630cb0fcf15d9cf73c",
"testharness"
@@ -592746,35 +600983,35 @@
"testharness"
],
"mediacapture-streams/GUM-api.https.html": [
- "8df77e469f423b7c7e84ddc6924e01d63b1ffc20",
+ "ea80e175f08b16600df620d6a46a89dc571ea4f8",
"testharness"
],
"mediacapture-streams/GUM-deny.https.html": [
- "ff6cf94acac74d1a650d6c2515b762fa483b110f",
+ "58bc6b9e27d4c7036b188921598d9b5213f0b8db",
"testharness"
],
"mediacapture-streams/GUM-empty-option-param.https.html": [
- "64d32a60ba62577a02f7314db5c1e43d3b0d51a9",
+ "274f1a871405b0efc068c718dd22624ea0bbb5a2",
"testharness"
],
"mediacapture-streams/GUM-impossible-constraint.https.html": [
- "d0f93cff7289917b298a33691204509188bb633d",
+ "afa2a8a631915f851f3c238476a361aa16865af6",
"testharness"
],
"mediacapture-streams/GUM-optional-constraint.https.html": [
- "9697e652b353ffbb8f1ef31038b0826a7c866198",
+ "425f35ad458fe835cbaeb66acdde95452519bdd0",
"testharness"
],
"mediacapture-streams/GUM-trivial-constraint.https.html": [
- "46175d553affeaa8c801359261816430f8b1fdb8",
+ "89758369578246d620e41d53a75ae0b885d589a1",
"testharness"
],
"mediacapture-streams/GUM-unknownkey-option-param.https.html": [
- "bfd825c8fb46797d043d57d70689a766fa557bd3",
+ "cfa1c007fadcdef21b043185903bfb0696b7b44a",
"testharness"
],
"mediacapture-streams/MediaDevices-IDL-all.html": [
- "f1927866a05c7700dc2218e3a45eae1532a4171c",
+ "2d9b604f3039fd5bebbe0491f0bb31d5b0b47722",
"testharness"
],
"mediacapture-streams/MediaDevices-IDL-enumerateDevices.html": [
@@ -592790,63 +601027,71 @@
"testharness"
],
"mediacapture-streams/MediaStream-MediaElement-preload-none.https.html": [
- "0f2bbd7581f2f51376b7fada199b4d436f411dba",
+ "374f9942ebd05d866340981469ceb28bddf83727",
"testharness"
],
"mediacapture-streams/MediaStream-MediaElement-srcObject.https.html": [
- "f90dade04a03631f9c56333f621fd6379eb48998",
+ "f2958c6965640ff9e9dc2c038a593bdd41c6759c",
"testharness"
],
"mediacapture-streams/MediaStream-add-audio-track.https.html": [
- "eecbedef2bbb1281fd07e12d06f53455a8f87c88",
+ "1bcb7de8f2c0f85fed091dfcbb102d40264f387f",
"testharness"
],
"mediacapture-streams/MediaStream-audio-only.https.html": [
- "6bf048248ed199eb84d9ee815dc64d19d173291a",
+ "bc5a7f4380a0527fdc44c41b765e07df028d0dba",
+ "testharness"
+ ],
+ "mediacapture-streams/MediaStream-default-feature-policy.https.sub.html": [
+ "955b6cfddae2c8961abfba52ffe9192224500d0a",
"testharness"
],
"mediacapture-streams/MediaStream-finished-add.https.html": [
- "18cb89d609c81cd00870f58682b03c89fb74afbf",
+ "9cd9b2b53c1353b46bf7efc9e8d0e0c215107dee",
"testharness"
],
"mediacapture-streams/MediaStream-gettrackid.https.html": [
- "1d1d2a92be009863a17487d211523f4309ee8e4b",
+ "ecdf2ad3e658c08dabff3e0d5860e4d86f434f0d",
"testharness"
],
"mediacapture-streams/MediaStream-id-manual.https.html": [
- "c5ec056499818621f5948684da4715f5f14be124",
+ "464a4e5b40a4aabf1302e24d51222b0374ff4c8a",
"manual"
],
"mediacapture-streams/MediaStream-idl.https.html": [
- "ad6beb09e5036ca5d84e1add79f265d4899bc294",
+ "2cf280abdf5598a21000a26365f243fcc7ffdb6b",
"testharness"
],
"mediacapture-streams/MediaStream-removetrack.https.html": [
- "84eeb7a7b9499e44f40e8a650373fcb86e502abe",
+ "28bdf571b37412078199e127ecf3a9423770f0ce",
"testharness"
],
"mediacapture-streams/MediaStream-video-only.https.html": [
- "5f3e3390b52c567894cbcdf610489fc5b17ec94d",
+ "831fba0fe66ff11b5ca91784a0f91d863bd8a348",
"testharness"
],
"mediacapture-streams/MediaStreamTrack-MediaElement-disabled-audio-is-silence.https.html": [
- "48620661c2947245554e227d559d551a93787ae2",
+ "c70017e897191d1c3d77ee504f9ca2f73bb0aa48",
"testharness"
],
"mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html": [
- "ff30dfac08aae859ad469c15fd7e5469b830d3a9",
+ "9f8b4811f67bd0c9ed67327e9589db68432e3117",
"testharness"
],
"mediacapture-streams/MediaStreamTrack-end-manual.https.html": [
- "e5550adb1a9ce03ba672271aa1cdcec7ffde27d6",
+ "6511203b417168722d1e05d90e58364ebce145ea",
"manual"
],
+ "mediacapture-streams/MediaStreamTrack-getSettings.https.html": [
+ "013d31ba196d5a6f1506ceb8eab088e629dfd59b",
+ "testharness"
+ ],
"mediacapture-streams/MediaStreamTrack-id.https.html": [
- "ea67395aec0f0c619ba7b94eb4bd26b317a945d3",
+ "46327fba3cf783d6506634b837f8308417f954cd",
"testharness"
],
"mediacapture-streams/MediaStreamTrack-init.https.html": [
- "5dec952b5ea64b644a7fd90ef41d2da95388167b",
+ "3cb9f842f12185de5f1696a8d0cdc2fe102c246a",
"testharness"
],
"mediacapture-streams/MediaStreamTrackEvent-constructor.https.html": [
@@ -592857,6 +601102,10 @@
"2ef6c1440dc82da13537af344dfa6a2c84cc0808",
"support"
],
+ "mediacapture-streams/historical.html": [
+ "96a34ddfb393f19df98b2334a71e78b40e333e26",
+ "testharness"
+ ],
"mediasession/README.md": [
"5ceecb2611837e6c52a303cec32d8cb9fabe93a6",
"support"
@@ -592877,90 +601126,6 @@
"70a1f9e81faa3dbbe320a71a008e4594a29878a8",
"testharness"
],
- "microdata/conformance-requirements/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/converting-html-to-other-formats/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/converting-html-to-other-formats/json/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/dependencies/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/encoding-microdata/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/encoding-microdata/associating-names-with-items/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/encoding-microdata/items/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/encoding-microdata/microdata-and-other-namespaces/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/encoding-microdata/names-the-itemprop-attribute/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/encoding-microdata/names-the-itemprop-attribute/original-id.json": [
- "cc9626d22d5e06bb2397b813eff5e125d0fe7034",
- "support"
- ],
- "microdata/encoding-microdata/the-microdata-model/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/encoding-microdata/values/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/iana/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/introduction/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/introduction/global-identifiers-for-items/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/introduction/overview/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/introduction/selecting-names-when-defining-vocabularies/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/introduction/the-basic-syntax/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/introduction/typed-items/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/introduction/using-the-microdata-dom-api/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
- "microdata/terminology/.gitkeep": [
- "da39a3ee5e6b4b0d3255bfef95601890afd80709",
- "support"
- ],
"mixed-content/OWNERS": [
"167112f19752c9c180831820b6e348427606b63b",
"support"
@@ -594562,7 +602727,7 @@
"support"
],
"navigation-timing/idlharness.html": [
- "12635e5ffcc457a3db40ec483ea724f60a2ef59f",
+ "d05e1d10939fa6509bd7299d03d32d59f69a03f6",
"testharness"
],
"navigation-timing/nav2_data_uri.html": [
@@ -594570,15 +602735,15 @@
"support"
],
"navigation-timing/nav2_idlharness.html": [
- "6931ae3947e9f6553890c4c7895b774faad02102",
+ "ffc5d6f4a11a4bf2ad72404fc62d88be1c45a5f5",
"testharness"
],
"navigation-timing/nav2_test_attributes_exist.html": [
- "9cbe8d9f7bf8c959c810ebee65a245f2de6f2943",
+ "6ed5a8f92b282d956d7d946cf031296ed7bfef50",
"testharness"
],
"navigation-timing/nav2_test_attributes_values.html": [
- "f13d01f6c6cfa90b2bd92312b3c2e1c1b3aeed59",
+ "e5f14ce9a725cbb3a88a73b5f137625334f1e3de",
"testharness"
],
"navigation-timing/nav2_test_document_open.html": [
@@ -594678,7 +602843,7 @@
"support"
],
"navigation-timing/resources/webperftestharness.js": [
- "670154a84de50de0c6b310edfeb23a1f3d0d72d1",
+ "c149cde434fc6e82e9e50936308ec0ad9b3c2997",
"support"
],
"navigation-timing/test_document_open.html": [
@@ -594758,7 +602923,7 @@
"testharness"
],
"netinfo/netinfo-basics.html": [
- "c98cb1ac5580fbd9f378313c5be1eb785585ede3",
+ "f0fa5c7071c5cdcf3d1cc3e99de27c4c40c20e99",
"testharness"
],
"notifications/OWNERS": [
@@ -600342,7 +608507,7 @@
"testharness"
],
"offscreen-canvas/the-offscreen-canvas/offscreencanvas.resize.html": [
- "edbee70d71796502f9facde0f0d0e13a7207b3ee",
+ "1963e2f24313314c99e39e29f6818d39c2385a0d",
"testharness"
],
"offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html": [
@@ -600354,7 +608519,7 @@
"testharness"
],
"offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html": [
- "4623c0cbee66a2aff9d569a0ea52a09d277096ee",
+ "d434158f4ad895a531ad04708c6b5c31272a9e05",
"testharness"
],
"offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.w.html": [
@@ -600737,152 +608902,8 @@
"054fe1ca53999433cf4cddff7193d9f05d6c48dd",
"testharness"
],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_autocomplete-manual.html": [
- "982fae5b648a4ffec9dcf189b388cdea548d171a",
- "manual"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_list-manual.html": [
- "a45044c38b98f57b697e8b521edaabe26b897153",
- "manual"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasdate-manual.html": [
- "4ce3a7f6b5a1b3a99ff810a10cb805c3a8d74839",
- "manual"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasnumber-manual.html": [
- "8aecbcc14e2295f860f94444ed155e41b2ba73b5",
- "manual"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_length-manual.html": [
- "7e57d2b51b52665b2449a1963594ce0e8ac7af5e",
- "manual"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_selectedindex-manual.html": [
- "a41a903089c804cbc5b3892af00d283f02d318f5",
- "manual"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_checkvalidity.html": [
- "e6c56660e7c34d00e8d213dbc224d0ab1b855a59",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_labels.html": [
- "b101e88a54c0137bc3c91c576750a15e7ac26257",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_setcustomvalidity.html": [
- "0117c628e255c4605832d079b917674b9253b6b2",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_validationmessage.html": [
- "68cd80401bdc7fca7b030425b9c647ca4edb202a",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_validity.html": [
- "9f08314910a23e3b2d02fb2494735cdc997354a7",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/button_willvalidate.html": [
- "1e374d7c17ed9927771e0b3d133a78a5749d9cf7",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/fieldset_checkvalidity.html": [
- "b962a1ffe8aece17c35fbd17cc860fa021c87abd",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/fieldset_setcustomvalidity.html": [
- "47c535a2322a360140699c871601381b7b9ad4a2",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validationmessage.html": [
- "7baa8d557e2113037500c7fb3f2665d07bdaa605",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validity.html": [
- "06fe951ea001f9467bb1b25f31e2a730af250360",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/fieldset_willvalidate.html": [
- "5cfea5e35e04ddc746a572672951aaed70751870",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/form_action.html": [
- "8b1b58933750ceb37accb96be8cd52dccdad8595",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/form_checkvalidity.html": [
- "0f4b2f45cdc4f92f6e7668ebaf0e194b23a985c3",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/form_length.html": [
- "c46ff6f668f275fa7c6437e4d9e4dbdbc5fe2146",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/form_submit.html": [
- "8b7b994e4f791dda19f6124005e179891131c493",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_checkvalidity.html": [
- "a17793a91995bdf8578ec993fb3e3858f2087dd6",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_height.html": [
- "124ae4829b7e6eae12cf7bc77340cef954b96510",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_labels.html": [
- "2253acf35e842371d97adc580b5bbdc17bda8345",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_setcustomvalidity.html": [
- "73d60e2eb4150112e6bb34381f79b877002c0611",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_stepdown.html": [
- "ec4115b1a35e0ff15f49031d54af4668114ea327",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_stepup.html": [
- "7b2e7039c308c8aca6c2dc5fec99b5f07108092b",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_validationmessage.html": [
- "08d730c42e4951cdd22581fcf46db3463a56855d",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_validity.html": [
- "d0ad05c573ef8dec7b87140b3cf5ca33af32c5d4",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_value_invalidstateerr.html": [
- "aec0217d87765d6a1f59a2766453b6899eb8612f",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_valueasdate_invalidstateerr.html": [
- "f239e0a1b5ca28586347df5d3f53a2c00d5db1e5",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_valueasnumber_invalidstateerr.html": [
- "c36fd44454ab7bb69a7ced66ee0b127bc98d1360",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_width.html": [
- "ea165b1cf1bbba9e6feacd3694182e4272d207aa",
- "testharness"
- ],
- "old-tests/submission/Infraware/Forms/contents/Forms/input_willvalidate.html": [
- "57ab60fe29974212415aca5372752d8f576731f5",
- "testharness"
- ],
- "old-tests/submission/Infraware/Session_History/contents/Session_History/css/result.css": [
- "33f5ab222c677190c2812f5dae2d9ae58441e4cb",
- "support"
- ],
- "old-tests/submission/Infraware/Session_History/contents/Session_History/index.html": [
- "f92819ed994d67f2b1c7576f96dc0ca8214dc10e",
- "support"
- ],
"old-tests/submission/Microsoft/dragdrop/dragdrop_000-manual.htm": [
- "3deafc85db69960f4dba903542f8175c3e102f12",
+ "3b19176b2b546f741b52ff2aa11633d2fc9f392d",
"manual"
],
"old-tests/submission/Microsoft/dragdrop/dragdrop_001-manual.htm": [
@@ -600890,7 +608911,7 @@
"manual"
],
"old-tests/submission/Microsoft/dragdrop/dragdrop_002-manual.htm": [
- "4cf69ef89695860c26da2ae05be227ce98df0e3d",
+ "c26c5cf57753fcb32b15fc2761c8c4f9b4e5cbaf",
"manual"
],
"old-tests/submission/Microsoft/dragdrop/dragdrop_003-manual.htm": [
@@ -600934,7 +608955,7 @@
"manual"
],
"old-tests/submission/Microsoft/dragdrop/dragdrop_013-manual.htm": [
- "f77e322c36c171a5e3214c3f17ccd8c1293027af",
+ "585e7b7bdb022d14c582381fb8377fbbe42c894e",
"manual"
],
"old-tests/submission/Microsoft/dragdrop/dragdrop_014-manual.htm": [
@@ -600942,7 +608963,7 @@
"manual"
],
"old-tests/submission/Microsoft/dragdrop/dragdrop_015-manual.htm": [
- "cca5e58827fa7347657baa892ad1634f85e0d9ff",
+ "cbc9e684d05f7ca0a4681fd64983fbb07cde804e",
"manual"
],
"old-tests/submission/Microsoft/dragdrop/dragdrop_016-manual.htm": [
@@ -600981,290 +609002,10 @@
"f0b34dbb131de195d4d9709872a2a44856a358a6",
"testharness"
],
- "old-tests/submission/Microsoft/images/blue-area.png": [
- "b87d753e5caae6d356ed5ae0bf9430e69380a968",
- "support"
- ],
- "old-tests/submission/Microsoft/images/blue-border.png": [
- "d7e6fa96c94057798d394cfbd2cf9be077ba5870",
- "support"
- ],
- "old-tests/submission/Microsoft/images/blue.png": [
- "7de5cdb5ad04ac365430b3b5f5ba01d2ba57ea23",
- "support"
- ],
- "old-tests/submission/Microsoft/images/fail.gif": [
- "a4dad89f8247eef2a574d1d96b0d188e84f1b57f",
- "support"
- ],
- "old-tests/submission/Microsoft/images/movie_300_frame_0.png": [
- "1f29964d20d88de0d659fd76b864b51681582870",
- "support"
- ],
- "old-tests/submission/Microsoft/images/poster.png": [
- "bbc45c317f75201c1cbb2da7aa545b3a982d2c6e",
- "support"
- ],
- "old-tests/submission/Microsoft/images/poster_blue.png": [
- "cc45057561ac2849cca29068981742ce98578bfc",
- "support"
- ],
- "old-tests/submission/Microsoft/images/poster_green.png": [
- "4e33c4b7b8a991de8427d8b2d3ec63f3f52da5cb",
- "support"
- ],
- "old-tests/submission/Microsoft/images/poster_red.png": [
- "4eda712fc284ba0854dacce162f5aa04b1e8b24e",
- "support"
- ],
- "old-tests/submission/Microsoft/images/rect.svg": [
- "5a211884bd17e0c8ee7940c6d4dfdb8c3e95671f",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_001.htm": [
- "48964e2680c692875469694d563a97cfe672c39b",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_002.htm": [
- "ffbb78c74d7bdb93e34eddce4ffa4caa51817aaf",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_003.htm": [
- "e2870e9585dcd621146c28186cb31c7941e7d9d7",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_004.htm": [
- "af6d52f175930dc8fc4085bb6a5300dd7769da63",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_006.htm": [
- "f61c5288124b87006246e64c75d1a34c85504a13",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_007.htm": [
- "d6db044955736bc2b0497155c7979c39ae691cf3",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_008.htm": [
- "ce7769f9fa964b7b7a36edcbf09e4b4087588b30",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_010.htm": [
- "ef69e9687003a9119bd031b71b5a2ebb035da1a5",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_012.htm": [
- "c73d69b345af0d0a51eb1a9ab059b8f5f0ea9a86",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_020.htm": [
- "0c7084688df3eb695fb16956caa3411063e3b080",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_020a.htm": [
- "f90ff7b84ca93d6e0382c8d19fad54f1b79cbdcc",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_021.htm": [
- "edbc32a0032d525635a567462d15eab2ad11ae22",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_021a.htm": [
- "43e04efb96b00b226cb7122d0638fbafb1baf9a5",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_022.htm": [
- "cb08fec6513c3d44c476b0eb11e553f8abf4e3f8",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_023.htm": [
- "bb8bfec1199055af6539746ac086781ac8d69387",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_024.htm": [
- "5a9234351a43c94b787b37534196379d9de5e84f",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_026.htm": [
- "d51ae27e86848df7fbe4c915f8fa834a7388fa81",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_027.htm": [
- "812e203c471ceb9544a392c4e17b40c7253041ff",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_028.htm": [
- "108b8c0998b5d0f312bb388416828b605c41d15d",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_029.htm": [
- "c2b462ee8e71b2aefa4c79c3e804ee934af25aa1",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_031.htm": [
- "6de8e378d8a29737c10d133e0f2e8b944b2e2ab4",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/iframe_sandbox_032.htm": [
- "ae3b4502848aa1a70338f4cc4b752dd363c87774",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox.pdf": [
- "44050f8922b1dd32fcf9dcf4e1bf331646edf496",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_001.htm": [
- "c8d66c610d701b925870ce13f1778181c96f151f",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_002.htm": [
- "96e201a2071f304a1108a816a6184bfa1b3f37fc",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_003-manual.htm": [
- "c55979564d1de0153369bef2cf124c579a1c759d",
- "manual"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_004-manual.htm": [
- "3c05adf2b1fea715ea8b15a9165042eb8016616f",
- "manual"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_005.htm": [
- "f7275e130ec241de07e09692bc3eb658cf9131ca",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_006-manual.htm": [
- "1c38f4b6b5e7d2273d54a7d10add0d60b49c0465",
- "manual"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_007-manual.htm": [
- "ad8f48b0c839d82f45c13031e7f40278c8c91c77",
- "manual"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_008-manual.htm": [
- "ec87b739d6b4abdd68b27302fe61d60c7bd06e46",
- "manual"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_010-manual.htm": [
- "9f446f802853684f79ea0ad4ae8f87c578751eea",
- "manual"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_011.htm": [
- "29e029f0eea294ee83f1c82a61786ab405841396",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_012.htm": [
- "3d1568f115a78bd98de94b7c32fd19d147bf51ba",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_013.htm": [
- "68fcf3dbc17401e3edb2e1799a3fb4a56e76a3e7",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_014.htm": [
- "8967643e1a800c447b4afb09c94c8e66ba0f7d66",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_015.htm": [
- "fbd93f402e90b176ec272a006d3697fbfec582fd",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_016.htm": [
- "1b05ffc484b8c07dcbb9090ab9eab4e2714bc0bc",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_017.htm": [
- "46aa1d91d0ac6f677d099305661fe9d76113f545",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_018.htm": [
- "ab791525ddc5d8845eea85d39125604edc95126f",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_019.htm": [
- "5cdb69cb141ab5e70da7eb09e920d32d320cffb9",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_020-manual.htm": [
- "25c2095aa2190ad093974083f9be701e59029668",
- "manual"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_021-manual.htm": [
- "480582a7bc736ab265a2dc00504583795ada3a51",
- "manual"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_022-manual.htm": [
- "3539bbe4691fad447ada818cfa24a2230ce493cb",
- "manual"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_023.htm": [
- "5d4b06a4e5418643b2b8cd58279d6f6763446767",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_024.htm": [
- "cfec02a319f7333055023b4c9b4440951c732957",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_025.htm": [
- "5419edd55d86d2e536a7647293eac43589341ea6",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_026.htm": [
- "692a5ef1e836e27b6c19ca44e7165de07d779084",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_027.htm": [
- "b32331c80b01870e5336dd11684cd7f9231965ad",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_028.htm": [
- "8fc2311fd970454af714c395992ba65eea99d384",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_029.htm": [
- "79f12ea6165eca74d14465edb96688b6cd18924a",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_030.htm": [
- "f548832bd5902d2fc1a2f3a34822d00848c7c2f8",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_031.htm": [
- "48f43203e1750bd5ced9c4522097c84a63f370db",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_032.htm": [
- "fe53da9326a7e639281b4d00930cf1bd604aa113",
- "testharness"
- ],
- "old-tests/submission/Microsoft/sandbox/sandbox_helper.js": [
- "26a0364fcd01bf6448057fb6eacad5ecb16cb5ac",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/standalone-fail.htm": [
- "59b8ea582a1d64a26fdccb01bd3cf14d1b347257",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/standalone-iframe-content.htm": [
- "d45d9d424b82bec52c44372e99279d1b11f0fbdf",
- "support"
- ],
- "old-tests/submission/Microsoft/sandbox/standalone-pass.htm": [
- "8e495cf37e35d8a142a1550756e78004c0acfbaa",
- "support"
- ],
"old-tests/submission/Microsoft/selection/RemoveElementContainingSelection.htm": [
"bf01b165fa15b374f50f67055f85ce24a79138c9",
"support"
],
- "old-tests/submission/Microsoft/selection/addRange.htm": [
- "5c88ec51e9f0ea8fcde573d3c485853d234f7603",
- "support"
- ],
- "old-tests/submission/Microsoft/selection/collapse.htm": [
- "1b3a015748aadbb8ed80c50eab4a8a57cabb359d",
- "support"
- ],
"old-tests/submission/Microsoft/selection/collapseToEnd.htm": [
"7ab29052320bb2d05ac6bcd9e7282d939e0dc1b5",
"support"
@@ -601309,702 +609050,6 @@
"dbebb6a0f2c125dc5c7ddeccccae2eb6496d29f0",
"support"
],
- "old-tests/submission/Microsoft/structuredclone/echo.js": [
- "092d33c695a185b38798d5e0ba12666a6f26e48a",
- "support"
- ],
- "old-tests/submission/Microsoft/structuredclone/structuredclone_0.html": [
- "2cca7ed81a132d2fcc9267eeab13b63239ce0027",
- "testharness"
- ],
- "old-tests/submission/Microsoft/xhtml5/colgroup_valign_bottom.xhtml": [
- "0a17fc9900d71aa232a3f2b70c99c5f5b08c6e00",
- "support"
- ],
- "old-tests/submission/Microsoft/xhtml5/colgroup_valign_top.xhtml": [
- "86518ffd005cc320c75ab21add3aad40003aad74",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/001.html": [
- "600080685d1161455ff6315b4e020c6e7af809ba",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/002.html": [
- "0592dd7ea86299173e40007f865294c6ece7ce8b",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/003.html": [
- "2e00173f0a31d89e03e334a34e816954736b6b7f",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/004.html": [
- "efb4570b83dfe91806103d1eab382f958aa6908d",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/005.html": [
- "eaf72e018801e7a1ec753e25c10887dd23ca8759",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/006.html": [
- "d7b02d2e0a8a66f1ade9813e960467e18cc80131",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/007.html": [
- "be07dbc5e306681711a41335e5ec77fdde0f1cd1",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/008.html": [
- "f42f84cd34b9cda00292afdfe8be2e76a82960dd",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/009.html": [
- "c945db2f84e8c4b05f8f36f4b2bf789ccc07c89c",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/010.html": [
- "16ee83f5a6556c1ab69ce4a455a313c1bd6d0ab2",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/011.html": [
- "68fb6e929d6fe4980f164aa544fec29126255de2",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/012.html": [
- "54f78aff425fbbb21ac6a418e4eae5452733cf1f",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/013.html": [
- "94b6e0558f5e64ab1f087e021d1bbe4ab54d9c6d",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/014.html": [
- "2605ef5f637d3a8b53bf5a2e0a4fa618ffcb7312",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/015.html": [
- "90172b91f0fc5855b44372c365ae681856e7bfe5",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/015a.html": [
- "fc6f3367d0cdf49c971a441c30e600ce16172784",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/016.html": [
- "d7c6889ff1ec0e5bd05fdb3ae749badc4e0b18c3",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/017.html": [
- "f4e2a16e9a8a612c758c38ec7a6123e061e3ba29",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/018.html": [
- "f31b9f0e4b5925d7f84475ddf2288d094b67c524",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/019.html": [
- "c4497ebff084597f7d2da3d05d9538b539de9a19",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/020.html": [
- "b073c63563743bd592975d5af25744aa6e7b3b63",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/021.html": [
- "9ac42051b581afacc584eb644482513a101c2382",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/022.html": [
- "c6c7e33f99efb5cdc587ed45d7767fcfc9c1875c",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/023.html": [
- "aba03041f8bbade7f83f31d8a38ff247db0a033a",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/024.html": [
- "c8cdb10f8b9f0dc43e636b83b83eefe8806a47c2",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/025.html": [
- "e0559c2c6fc1b4014ccff023591121dd1fc3274f",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/026.html": [
- "e9b9373fafe9f2f3da4f54182b5976fdeab30f96",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/027.html": [
- "cced91c915de2d036f83890ee75599adac66473e",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/028.html": [
- "2976bb7c8394f611e28a9de4eba7234be0e86b09",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/029.html": [
- "5489f55410bec9e48775179f3b4404ca97b05b5c",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/030.html": [
- "931af49603550d16c2f680695daf1a4be0e18a84",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/031.html": [
- "383b24c1df0cba1ace7f225f6b44f5148ad4922c",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/032.html": [
- "e6a2bf9ac6f7b637c055c0219fb4cb8ddd0fcc32",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/033.html": [
- "f581245a38ad7941d34d0ab5faf39c292556c8f0",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/034.html": [
- "38f3ea50362c2f2dd996433326e963fdfea9dd27",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/035.html": [
- "3dd6bf09b113dc3347171a4720e89f1e9360552e",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/036.html": [
- "dfb0d5e5f49455fb69798abc018b980d8b876d4e",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/037.html": [
- "5dcb03165f18e3159a4571772126b8f956dfd288",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/038.html": [
- "52065f6ac80829f00fcb5e6b731742773828fdae",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/039.html": [
- "8f1cc330e3aa99be1324239a939ea0c9c0344c4b",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/040.html": [
- "6a05b448509b68bb59c2f38a363d996fa95107ef",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/041.html": [
- "24848d462f5e6cb45cb1143fb2dfc98c2f3e1f16",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/042.html": [
- "dc8a7c64229d2b4e8a7c5a09d17c2dc832b2be5b",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/043.html": [
- "8cca4d39e9e4760eac906e1fb6b0a6dd313cf6de",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/044.html": [
- "55d225f25c2e3db589dd8bc0e0f164747b53e6fb",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/045.html": [
- "37321a0ca1226643aa3b9c4d62b942475d610b9f",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/046.html": [
- "58af91b9175e5afefe0c9ffef26df87e28812eaf",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/047.html": [
- "1ea58df6d7b8080a08c8c950a6d753ca6d7973ea",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/048.html": [
- "0b395ca210c644d7318c381876f95c65930b4bb5",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/049.html": [
- "58d7eb0e40585eebe57bb50d08498835556380ad",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/050.html": [
- "37c44d5bd82e4cc839404ec4af5e92b06614cbfd",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/051.html": [
- "6208f818ca2009c15e4a0bb7f9653c6928a69804",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/052.html": [
- "e8193c210331af0a0b21f775fb199d05dbd667a5",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/053.html": [
- "611d706f28f30c6588661eefd0a00131fd354de0",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/054.html": [
- "be071a1fda3e2873bf453160665925d994b70c53",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/055.html": [
- "6b282bda0e17a53df4d49457bf005a83f8b2c05c",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/056.html": [
- "8b607fab9cfb89feb062bbcf5c938607bae53047",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/057.html": [
- "72688f2a9cccd51d36d303bcb74ab2a5aeb66dd1",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/058.html": [
- "8f0fe763850d7db28b88cba850790b94cc7b3609",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/059.html": [
- "aed4289e63b9039ea4e4c9320cc63617b2c2d710",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/060.html": [
- "d2f1927659a74daaf526ed60f79e86c5448e15db",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/061.html": [
- "82cca51baa7e57cc27cf6e91517fdf4d7658a938",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/062.html": [
- "feb1b20ae372f7892a47b80f35b439cf52443073",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/063.html": [
- "820e78ec069916ed875535840adf58c882b912b9",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/064.html": [
- "730e369359057dddee3631bf5fec733d049570e4",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/065.html": [
- "86fa4e81d9a685ce0c9df6b6e4e903d84e36f535",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/066.html": [
- "837015a45f6ce4c1b4f3e16d6940616608aa5af6",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/067.html": [
- "f883a1cc977c4a7fe60e3b092508650521397e14",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/068.html": [
- "61f912469372089d3a42bb6fc531449ecb3fa758",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/069.html": [
- "d1ee26c303c8e7c3e6f5041a25a978073be697f4",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/070.html": [
- "3da0ba23c1d5ba1fb50b09c1527a1954670452b4",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/071.html": [
- "dc60148531fe0a74c353c1f7a94ec347d9811387",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/072.html": [
- "4a526bc1c4b4ae127374fd9ced0476cea452480e",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/073.html": [
- "c7b8530547caf295982ce937339240551e7b12f3",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/074.html": [
- "617745997272248b6056df0f5fdd8b8bd7a06f43",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/075.html": [
- "01089de4c049a4b35e675f8ac6c5c82f0770201e",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/076.html": [
- "cb0431a664dd6c493acafbf93f0f578ef14daf85",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/077.html": [
- "2bfe280f0ae7b745f2217055e66579ab6fb06769",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/078.html": [
- "71244598c4d1c581fb0b8c9a9eb1b19f642428f7",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/079.html": [
- "c8ad7d7bd5cdfbd52d4250b43df2abd4f06320e5",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/080.html": [
- "4d00ef083f033195a1ae390f890b0add644ef647",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/081.html": [
- "736fc94a557cc1664e1fd925e043fad9851b4579",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/082.html": [
- "5b7ecbe358157d4f41569b9b17675121a77aec1b",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/083.html": [
- "b89df3759ab2a99cd5c9083b780347435f446560",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/084.html": [
- "bcebac9bb723954517dbb6fec37737ba19ce939b",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/085.html": [
- "cd01cf16c67489de21779c1353257b0370c0fb56",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/086.html": [
- "8b1a7067a1f4e9258d1d0f1772f59c32eac926f0",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/087.html": [
- "df3141759eeeb1540255e7fbd4d4d93128710dbc",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/088.html": [
- "eeb025d85f71a3a450e86405222ecfc9afb3529d",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/089.html": [
- "0f03075cd5b09dd0ba17c4e4755661881a26af66",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/090.html": [
- "bffe7c2005287562c1f9308cfdfd7ec167cb7f72",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/091.html": [
- "2baf6e46ff983ccadece2398ed22a626f401ee58",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/092.html": [
- "f070a8b078f5f7a41e684e6103b57647e697e49a",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/094.html": [
- "659f91819f3041b2d2c81c81d7dc12d581ad9bea",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/095.html": [
- "e6f049bc7253331e4e5f7449490b1d0d3484d069",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/096.html": [
- "51768500b4094f3e09545678c79e3cc21a79ec05",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/097.html": [
- "3ac30238216932854620a416f05cb1e7abcb25aa",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/099.html": [
- "49a56e4ebe6a752002776f81c8511b6f34852a15",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/100.html": [
- "c8e8962700545210d6f2e900af7e562d6d624171",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/101.html": [
- "8aa9b4d0c0c3aec53f4b9cbbbe04a98198379c8f",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/102.html": [
- "0b63d6d6e084ce841d491badee08cb3854095576",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/103.html": [
- "6c302cc82ff1e6601cde8b65a3c2657aa24f3614",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/104.html": [
- "f6f164b354426f813d5db92a71e0376a7d80927d",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/105.html": [
- "be5da9049dbc111612c9000e11299e83e56ed258",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/106-import.html": [
- "e231c8038d73b9ee2dedfe0682fb8c21d5271fcb",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/106-noimport.html": [
- "0ae4f0b07e4d96371f6cfa2f8344945caee4b936",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/107-import.html": [
- "cd8a4716caaabb26a1dd6cb38068479b351a49fe",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/107-noimport.html": [
- "60448c23c8165a2c4f439d89732f8fedf8498a3a",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/108.html": [
- "8e6efbb104c4ae47162246fba69eb5fc90187f21",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/109.html": [
- "aa58a708ca71f5fa1851bfcea55a46b2add90a9f",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/110.html": [
- "6d43803781726a849be707a65e866cf7cfd7650c",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/111.html": [
- "a99a1c9e43cbd3332130a165774dd54d4ac8c4be",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/112.html": [
- "4447a3344bfdf9e3d56a6bf754c33d2f53933aa0",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/113.html": [
- "3c2fb63108173f4a593678133c361a0c00d3d167",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/114.html": [
- "291ae93a0616b7c660ff90187c50ef9651d37f72",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/115.html": [
- "ea2566aadd4697a8635e4f7deb7bfd9829a1a3f9",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/116.html": [
- "04c55da04319500e067bd0eec273102f468af0e0",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/117.html": [
- "42ef819a45a0f7ea38d12916e78f9c098c270d1a",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/118.html": [
- "be6abe20855830d6516ee5ae4f73898e46eac349",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/119.html": [
- "cc32b1d7115f6803cd91176e8497238f25575169",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/120.html": [
- "2f3647df39d8655173ca28dc69508c9ddd0d2457",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/121.html": [
- "af72febfd67dcae75f570be9fce544793581540b",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/122.html": [
- "f78807ecaf353613a4a55c567569308afa14ff14",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/123.html": [
- "4cdc670b2177f03f02790850e3dd557c778c962e",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/124.html": [
- "cc22e8f1534dcac2507622a8c4946017596a1966",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/125.html": [
- "9f141f0670d3483c2d1de1577db65154cc870518",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/126.html": [
- "46ce40e99442957493920b9c2c01d0a76a6ea10a",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/127.html": [
- "9334cfbf95320e52e87d6c32d5f130b4a2c891f2",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/128.html": [
- "f68a149a41e074e6f6b486afe13366a1af7d68d8",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/129.html": [
- "2c572f0d5458bce00e595eb1a89f0b4286d8982d",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/130.html": [
- "7b8781d93d336a012de476f65f4cbcd6eaa6cf94",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/131.html": [
- "24b959e74a6c4150cd2696483b887449540671b3",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/132.html": [
- "030a5aa95ca9d96323da9a04aa60b763f6f087ed",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/133.html": [
- "20f72898a1f86e3ecd0ac5e50d761a6508156bf0",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/134.html": [
- "4f1cc0bb75447083be81af8c462a849a248789f4",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/135.html": [
- "e99c455cc443c2eca61bbd68067cc9394e20111f",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/136.html": [
- "2c19dc5583577e957d6a8b6514a1ca3fc30d8f5a",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/137.html": [
- "761beeaa1e7768c8ed207b3ea90fe9b580995f3f",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/138.html": [
- "d91858c8a3039586084b72c07a210116cc68f776",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/139.html": [
- "8410429412390c3e6c1ed3424ae37b2fea84842a",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/140.html": [
- "74a4679bdd67d0824b17a037951ea9a91bc75142",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/141.html": [
- "0f50a848604cbe77ecfa07ee1fa1b1ab29fa21f5",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/142.html": [
- "527bd61c3797e7e8c004fe86e81fb739743edd7e",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/143.html": [
- "7ea69ea1609261ba04ec269ae37317b18dc5a18b",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/144.html": [
- "d130d5587062f185d540d00cd50816241aa8c112",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/145.html": [
- "9710225d260f83ff49dcf2bfb4e42cee2cedbd66",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/146.html": [
- "b484b07c4a575789523a60afaf6a7e2d42812c9c",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/147.html": [
- "950c46780c11601e46d383ea7b9fe3f351cf6813",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/148.html": [
- "01e8dcb0e1aab56420bce9660e7d61f1124d6101",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/149.html": [
- "93ce7733a174f16ff233fb03b6fcaa0ea7b13c29",
- "testharness"
- ],
- "old-tests/submission/Opera/script_scheduling/css/background.css": [
- "7a48895f08aca52493e4c9e192a382664b00341b",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/css/import.css": [
- "2e8c8d9ede773e4078b2e8926d08c87e5b649bf1",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/pages/helloworld-postMessage.html": [
- "7b165a0bb8182c587d7328cb2295639e3c7e535b",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/pages/helloworld.html": [
- "f9203d943610e70b87f79b7beb331fe9520a4bf7",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/count-script-tags.js": [
- "54818d68b9c9ef3d0ede269cc75eb12e977fe8b9",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/find-body.js": [
- "e65eff4f877fb89de51f569e07add665147cd9c9",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/find-foo.js": [
- "4b22b857070d1aa7615e889d2602196ca9431049",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-1.js": [
- "722fea5d23733d822faf5717f66f2ff2cccb62a4",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-10.js": [
- "8b70b5a43ab3f1efd9755bf95f9a2713bbe588ce",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-11.js": [
- "af092f1827bebd1e69f3b914049ad4febfcc8dc5",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-12.js": [
- "7dcd929b6b7dd65553f87ec8b0fbf0ec84c335b2",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-2.js": [
- "3a3c18956bb0ccf8c13b301cd3c6f0a6e474ce75",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-3.js": [
- "80d22183699d06a1b7da5136a118404a7e05778e",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-4.js": [
- "80c723fe3486f7cb90b7b9fd25ea836125e562d1",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-5.js": [
- "45ce718f612e0adf967327716087f04325fcbee9",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-6.js": [
- "f7b945c3ed8e981a7f0ed1fc971c08fe05f971a5",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-7.js": [
- "39f911ed6844c0d38ccd91c3642e234c274a916c",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-8.js": [
- "fe0ad17a092c33cad29ffe0a00325ac573c0f464",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/scripts/include-9.js": [
- "2cd9bb85862c8c577e2dff564459516f4a4b2c07",
- "support"
- ],
- "old-tests/submission/Opera/script_scheduling/testlib/testlib.js": [
- "a33ccc49dfe5d8f23ee61a29fc8a26a3969409f0",
- "support"
- ],
"old-tests/submission/migration.txt": [
"80f76c03a8e921a83a82f2bf01beb2175248dd67",
"support"
@@ -602662,11 +609707,23 @@
"manual"
],
"orientation-sensor/OWNERS": [
- "36770a71443523aa2f91f9958ba24066f0b4dcec",
+ "b119dbb984792f33c6e7463f3105d37c3c3b7ad8",
"support"
],
+ "orientation-sensor/OrientationSensor.https.html": [
+ "145b750c49bf703c68bcf4ad645448bc284d393b",
+ "testharness"
+ ],
+ "orientation-sensor/OrientationSensor_insecure_context.html": [
+ "700603c508503fe859502f334153aaa7f5e6f511",
+ "testharness"
+ ],
+ "orientation-sensor/OrientationSensor_onerror-manual.https.html": [
+ "6f0eb976affc21e49f48c42c1bd9d9eb0083ee40",
+ "manual"
+ ],
"orientation-sensor/idlharness.https.html": [
- "049b5e9505165723cec70237e2ae5f0e2c7948f0",
+ "9301519eebff3db962bbeb148bf3dd3b1e305a23",
"testharness"
],
"page-visibility/OWNERS": [
@@ -602674,7 +609731,15 @@
"support"
],
"page-visibility/idlharness.html": [
- "6bbcc548a783a56340aa256e5f51ca51c1b3f4d3",
+ "e3f97d7f03caf99d71e9528c6db75c13c477b4eb",
+ "testharness"
+ ],
+ "page-visibility/iframe-unload.html": [
+ "b97bb09efe6a8e410f6bfd71dc92f041d1b980bf",
+ "testharness"
+ ],
+ "page-visibility/onvisibilitychange.html": [
+ "d1d46a5280fcc364815d87e3a4ee68b0404e8ebf",
"testharness"
],
"page-visibility/prerender_call.html": [
@@ -602685,8 +609750,16 @@
"2d6d55d85e17a9fe978db6dbe25ae35a599d5683",
"support"
],
+ "page-visibility/resources/iframe-with-subframes.html": [
+ "17615ac4c33fd7f2e49c3b5357de3b976eb2963b",
+ "support"
+ ],
+ "page-visibility/resources/iframe.html": [
+ "bfcc8f9ef2153686a0817b9d0f9fb36f2db73493",
+ "support"
+ ],
"page-visibility/resources/pagevistestharness.js": [
- "63604473eabaa8d3b9b410a1a0087d9b4b2e7b90",
+ "1c77f9af66e2d39e97056273c35197827f03bb06",
"support"
],
"page-visibility/resources/prerender_target.html": [
@@ -602725,16 +609798,128 @@
"5695dc622d2bc89c33c10fd73aac173c87cc7ad2",
"testharness"
],
- "payment-request/OWNERS": [
+ "paint-timing/OWNERS": [
+ "2b1094a1e18f3321cc7a3740cae2d5b2d5f85772",
+ "support"
+ ],
+ "paint-timing/basetest.html": [
+ "f34f6729a82f6efc16dc4d62c95f706688d0456b",
+ "testharness"
+ ],
+ "paint-timing/first-contentful-bg-image.html": [
+ "6ee710d78e5f0f174ba00fea97c49d05641ed514",
+ "testharness"
+ ],
+ "paint-timing/first-contentful-canvas.html": [
+ "b179da1518178287879fa36c4adbd3c5dc291e92",
+ "testharness"
+ ],
+ "paint-timing/first-contentful-image.html": [
+ "d557aed2ab81949a2916b764dea207b50bab6278",
+ "testharness"
+ ],
+ "paint-timing/first-contentful-paint.html": [
+ "7cf0881d8a247bc85e8c8ad1be131b84dc9b56bd",
+ "testharness"
+ ],
+ "paint-timing/first-contentful-svg.html": [
+ "41436ee277f1882235b668afb7144f14491c6a5c",
+ "testharness"
+ ],
+ "paint-timing/first-paint-bg-color.html": [
+ "bf6555a04e08636abb0f25c0948d8e7e5a34eb62",
+ "testharness"
+ ],
+ "paint-timing/first-paint-only.html": [
+ "826a97fb19bfcad80b1957251c3d57e995e78990",
+ "testharness"
+ ],
+ "paint-timing/paint-visited.html": [
+ "58554c3e238bf6d598817e425c609d44e69438d2",
+ "testharness"
+ ],
+ "paint-timing/resources/circle.svg": [
+ "81e7e9fd9b897bd8a62959368a0b7e7f2c2533cf",
+ "support"
+ ],
+ "paint-timing/resources/circles.png": [
+ "dda93e587da353e712ff9bc671ebcafa8dea222f",
+ "support"
+ ],
+ "payment-handler/OWNERS": [
+ "c5e5d0fd086bbe946f99aa8836785c81a2bccb3d",
+ "support"
+ ],
+ "payment-handler/interfaces.https.any.js": [
+ "a20a5909c9a94120049e45e543cc623b875ea7f5",
+ "testharness"
+ ],
+ "payment-method-basic-card/OWNERS": [
+ "ee0b02c59588d15b6efdb983c492ebbf50127e1c",
+ "support"
+ ],
+ "payment-method-basic-card/empty-data-manual.https.html": [
+ "f58fecb7d70aac64befe54f403208da14e479b1b",
+ "manual"
+ ],
+ "payment-method-basic-card/payment-request-canmakepayment-method.https.html": [
+ "70f2de7b94ca8e22fdbfed6d39f6f1627b5bf3b0",
+ "testharness"
+ ],
+ "payment-method-id/OWNERS": [
"78f6ac38657ede306b767f1156cebd44bebbfb8e",
"support"
],
+ "payment-method-id/README.md": [
+ "20d0e6d34a096a9e8c59a8e6ae7d0bfeaa0e6344",
+ "support"
+ ],
+ "payment-request/OWNERS": [
+ "a2937112040fe45b12ba87b6fb75bd9be6aab6ad",
+ "support"
+ ],
+ "payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html": [
+ "e1aefd7497d3d5005df88d034fbde4e6b26823d6",
+ "manual"
+ ],
+ "payment-request/PaymentRequestUpdateEvent/constructor.http.html": [
+ "017f1f1aca43171083833ddb27ff66e39902e85d",
+ "testharness"
+ ],
+ "payment-request/PaymentRequestUpdateEvent/constructor.https.html": [
+ "91210fe058e95195ff5f999a1540ce0f2914f552",
+ "testharness"
+ ],
+ "payment-request/PaymentRequestUpdateEvent/updateWith-call-immediate-manual.https.html": [
+ "300c0740bdbeadcc7aad94e759ec8eff4256b7c8",
+ "manual"
+ ],
+ "payment-request/PaymentRequestUpdateEvent/updateWith-duplicate-shipping-options-manual.https.html": [
+ "6d139db4c12f85981ea3d1e6dc167e21510847fb",
+ "manual"
+ ],
+ "payment-request/PaymentRequestUpdateEvent/updateWith-method-abort-update-manual.https.html": [
+ "4a166673c699656849c0dc4eba9076b9cdc613ff",
+ "manual"
+ ],
+ "payment-request/PaymentRequestUpdateEvent/updateWith-state-checks-manual.https.html": [
+ "d05ca169a1766893613ba546e60259e8dc848f96",
+ "manual"
+ ],
+ "payment-request/PaymentRequestUpdateEvent/updatewith-method.https.html": [
+ "08e63c4605bfa4838984aff13a82458ca2a6bdf8",
+ "testharness"
+ ],
+ "payment-request/algorithms-manual.https.html": [
+ "6b1c0579e14eadb2daf3ece2443c605a1d8bb57b",
+ "manual"
+ ],
"payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html": [
- "7cb0cd48493781fe9a4f059365752fdc8d1ada6c",
+ "e96ac343e8533e8e90d3cbd4113a902b9e93e0bc",
"testharness"
],
"payment-request/allowpaymentrequest/active-document-same-origin.https.html": [
- "0bcf7a59e03f70b56cc448910acab4188e225c86",
+ "8bbacc77b15f179bfc7ec4e08809e07181675030",
"testharness"
],
"payment-request/allowpaymentrequest/allowpaymentrequest-attribute-cross-origin-bc-containers.https.html": [
@@ -602746,7 +609931,7 @@
"testharness"
],
"payment-request/allowpaymentrequest/basic.https.html": [
- "fa308475bf7e81d897f39c5df4d0cd2795df7da7",
+ "0e8a08f2e25a1cc3302d68322f504930ebd3fc8f",
"testharness"
],
"payment-request/allowpaymentrequest/common.sub.js": [
@@ -602754,7 +609939,7 @@
"support"
],
"payment-request/allowpaymentrequest/echo-PaymentRequest.html": [
- "f330e448c1ac380bcaa23bc5bc15c3253aba18c4",
+ "1c0428fd7d3bdc4302bb061f6f99ce98d0e400b2",
"support"
],
"payment-request/allowpaymentrequest/no-attribute-cross-origin-bc-containers.https.html": [
@@ -602766,77 +609951,149 @@
"testharness"
],
"payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html": [
- "9452392f0dc2b4feb4ee87f09952819998b9e39c",
+ "3aa81e7a578d5250854a14a617140111969570f6",
"testharness"
],
"payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html": [
- "b8c0121e830a6b2c8897d98ee8cbd381802d4735",
+ "d92b607f67ce478d505544bb43cd015b4bc89987",
"testharness"
],
"payment-request/allowpaymentrequest/setting-allowpaymentrequest.https.sub.html": [
"6e4028440fff617d6a0e9abb06625891eb53b28a",
"testharness"
],
+ "payment-request/change-shipping-option-manual.https.html": [
+ "9285ebf2cd716ea072c18fe668e95cf6ce4ec3de",
+ "manual"
+ ],
"payment-request/historical.https.html": [
- "c0c611a34326ac2eba18e48d640aa358deaae551",
+ "6695acdcd1647fdd37702a7f63658dcd50f25596",
"testharness"
],
"payment-request/interfaces.https.html": [
- "29af302db74de64e2bd1352ad92092a309d28c92",
+ "87fb3213b7442ceb3f096d88b6bae3074f96d29c",
"testharness"
],
"payment-request/payment-request-abort-method.https.html": [
- "c9ee5af2ccd5ad364090807c8427f1d4624d3747",
+ "5c1ddf4e9e2a896036912983462f51f8ff6aa82b",
"testharness"
],
- "payment-request/payment-request-canmakepayment-method.https.http": [
- "b20131bc3f2717212f9940920183d650ee111333",
- "support"
+ "payment-request/payment-request-canmakepayment-method.https.html": [
+ "44a75a5b40fc80970bb629dd4d98722849d862f7",
+ "testharness"
],
"payment-request/payment-request-constructor-crash.https.html": [
- "bbf131cd4517d450299cac05560a137c23f47e8f",
+ "9983391839ed64c41f9a7ecfb48a9b4abe6b497c",
"testharness"
],
"payment-request/payment-request-constructor.https.html": [
- "44d2656f2990c51063254326521a02218a7fc500",
+ "1cda9bee85f3afe53e492a7f0e98b12cbfcd9b98",
+ "testharness"
+ ],
+ "payment-request/payment-request-ctor-currency-code-checks.https.html": [
+ "cee3a8a8b9d25b5a44445a416b1bc9be2b341a04",
"testharness"
],
- "payment-request/payment-request-id.https.html": [
- "3e74f97fdf39bb1ca9f2cb5596155705cd15b5b0",
+ "payment-request/payment-request-ctor-pmi-handling.https.html": [
+ "1be7fcc83fe7d90e59135b5c16e42bbd27b7390f",
"testharness"
],
- "payment-request/payment-request-in-iframe.html": [
- "26f2715d33e6d00e5ce03d7b07f35db2ac027acf",
+ "payment-request/payment-request-id-attribute.https.html": [
+ "9a8a1ffc3cd7ba3c29380c4a9962bd17f35087c3",
"testharness"
],
"payment-request/payment-request-onshippingaddresschange-attribute.https.html": [
- "9a16b563d8b5f355b73b84d01f61f910bab7eb18",
+ "c9e3679232a83abe6a9eefcb28e3387d2c7810e5",
"testharness"
],
"payment-request/payment-request-onshippingoptionchange-attribute.https.html": [
- "439c524e66216aad471ecea680a36430f89d9af9",
+ "9488e832b86b582310b0f46a68f9cf420b473e98",
"testharness"
],
"payment-request/payment-request-response-id.html": [
- "88df88efdb1d44b56ac9758295f2e2920ae6c9ff",
+ "8feda1d3b4c071014d4c8c7898598c7d23086216",
"support"
],
- "payment-request/payment-request-show-method.https.html": [
- "518136ad885f95172e578f6e2c165a559c51896b",
+ "payment-request/payment-request-shippingAddress-attribute.https.html": [
+ "ce33b78031644cb508c6fe148c21c37128b422c0",
"testharness"
],
- "payment-request/payment-request-update-event-constructor.http.html": [
- "6ddbcd3b5847492daf0c2e913369bc861e4d006a",
+ "payment-request/payment-request-shippingOption-attribute.https.html": [
+ "4dbafc96c5effd3b697026aa9a29095e8f4a9296",
"testharness"
],
- "payment-request/payment-request-update-event-constructor.https.html": [
- "6b546870fd384a5bf2106d25fd3159a72f8537b2",
+ "payment-request/payment-request-shippingType-attribute.https.html": [
+ "27ecc7e10e50bf2df07f84a15972c3b913ebf32f",
"testharness"
],
- "payment-request/payment-request-update-event-updatewith-method.https.html": [
- "d85bca2ccb865c11c550a9d9c1d8770b2c68d6bd",
+ "payment-request/payment-request-show-method.https.html": [
+ "1e4c792de7013839c713555a0a295bcbb9597094",
+ "testharness"
+ ],
+ "payment-request/payment-response/complete-method-manual.https.html": [
+ "dc083332294137bd562060c7bf13f0664e6e038f",
+ "manual"
+ ],
+ "payment-request/payment-response/helpers.js": [
+ "992e5ce9af876e7d3f76168f15691afd43b41791",
+ "support"
+ ],
+ "payment-request/payment-response/methodName-attribute-manual.https.html": [
+ "88c5c390ad6396a7ffd5f11948adddfb2458b4fd",
+ "manual"
+ ],
+ "payment-request/payment-response/payerEmail-attribute-manual.https.html": [
+ "d2aa361068844ac6fc95dd694a19eb093df399b0",
+ "manual"
+ ],
+ "payment-request/payment-response/payerName-attribute-manual.https.html": [
+ "3e18addaac52270128e3c4dd6e3f5d421816a67e",
+ "manual"
+ ],
+ "payment-request/payment-response/payerPhone-attribute-manual.https.html": [
+ "72009bc00083e739816d3442c42ed87f43d3e253",
+ "manual"
+ ],
+ "payment-request/payment-response/requestId-attribute-manual.https.html": [
+ "5bda341b3faa65d5ff24cbc4fd5afe110e413146",
+ "manual"
+ ],
+ "payment-request/payment-response/shippingAddress-attribute-manual.https.html": [
+ "27768a28c6d3ecee925ff096bc9a7f028dc53f18",
+ "manual"
+ ],
+ "payment-request/payment-response/shippingOption-attribute-manual.https.html": [
+ "da91f7d011efeb58409d300bed3c0a4c3c7367d6",
+ "manual"
+ ],
+ "payment-request/rejects_if_not_active.https.html": [
+ "b7defcf07abde6a18f0012c21bee2e00a5669cd0",
"testharness"
],
+ "payment-request/resources/page1.html": [
+ "9bd62a5279e60dc30b39c449f4aefbe30f9db336",
+ "support"
+ ],
+ "payment-request/resources/page2.html": [
+ "9bd62a5279e60dc30b39c449f4aefbe30f9db336",
+ "support"
+ ],
+ "payment-request/shipping-address-changed-manual.https.html": [
+ "db68756c6cc3cc2146f608a04988cd938a2dd0de",
+ "manual"
+ ],
+ "payment-request/updateWith-method-pmi-handling-manual.https.html": [
+ "b473073ad106e9e0732adb6bfbed5f54d6ec3194",
+ "manual"
+ ],
+ "payment-request/user-abort-algorithm-manual.https.html": [
+ "31a6f480d015c6c715df2001b03f487a205a7311",
+ "manual"
+ ],
+ "payment-request/user-accepts-payment-request-algo-manual.https.html": [
+ "37f114e9c510722f9966c092c8a4f5008688d86e",
+ "manual"
+ ],
"performance-timeline/OWNERS": [
"b82f9756b15ef3ea45fb250e304031d9ceaee9c7",
"support"
@@ -602846,15 +610103,23 @@
"testharness"
],
"performance-timeline/idlharness.html": [
- "14c5244fdb2af22bdad8b5333d2dd5b9696a9e49",
+ "30e6893af2cda301efb45fa7cfe16cec04701445",
"testharness"
],
"performance-timeline/performanceobservers.js": [
- "ac475b58b945d09335e80f40c6238ab7ebdab7fa",
+ "0faeecf506da5b8a5c722a1ce8c7b5854227bca0",
"support"
],
+ "performance-timeline/po-callback-mutate.any.js": [
+ "7dc6bb730a7a5ddd9c96dc76c4ca66494c138732",
+ "testharness"
+ ],
"performance-timeline/po-disconnect.any.js": [
- "28868de2ef9fa4aebe4a65799e899e4e9afbc192",
+ "91a3adfc0de224ef81349891452bb3759d53767e",
+ "testharness"
+ ],
+ "performance-timeline/po-entries-sort.any.js": [
+ "495bbed0d3144282716f09ee682f562db922c77e",
"testharness"
],
"performance-timeline/po-getentries.any.js": [
@@ -602870,11 +610135,11 @@
"testharness"
],
"performance-timeline/po-observe.any.js": [
- "78b32c64ddb9e6da80b57fb1f91576dd0f59b13a",
+ "40ad487d03ae3d8812dec02869d402636d10811e",
"testharness"
],
"performance-timeline/po-observe.html": [
- "0076397128975660e1f66f8d23e6b6945d2a804e",
+ "2486507d5925b6429899ddf4db386990d7ae560f",
"testharness"
],
"performance-timeline/po-resource.html": [
@@ -602885,6 +610150,14 @@
"f2f3c2b3cef895f514f595932b767299cd6dade0",
"support"
],
+ "performance-timeline/resources/worker-with-performance-observer.js": [
+ "6536127a1136f45cd59f62a9851fe61ceabe3d5b",
+ "support"
+ ],
+ "performance-timeline/worker-with-performance-observer.html": [
+ "dc978fd8669d67118109fcab245010fdd7d799b0",
+ "testharness"
+ ],
"pointerevents/OWNERS": [
"e76cae8532b1259fa8665b515468d0b25b0a9bb3",
"support"
@@ -602909,6 +610182,10 @@
"11d5baa9206313270be6289205b002b623af85db",
"testharness"
],
+ "pointerevents/html/pointerevent_drag_interaction-manual.html": [
+ "1eb570dbed48373f9e840b7694b774448b689879",
+ "manual"
+ ],
"pointerevents/idlharness.html": [
"6ca74eb661910c27ed6cb8bbbb819b749007a75f",
"testharness"
@@ -603086,7 +610363,7 @@
"support"
],
"pointerevents/pointerevent_support.js": [
- "2b8c7b6d0917b9cc624735b7dc1105a732f9b3f4",
+ "f2ab5ea976ffd62c669fda2db1484a4733ce5b28",
"support"
],
"pointerevents/pointerevent_suppress_compat_events_on_click-manual.html": [
@@ -603282,91 +610559,179 @@
"testharness"
],
"preload/download-resources.html": [
- "df19c269c7193a5dc86630799afcd16a941f58a5",
+ "f4894d37e5687cdadf8aa6879cf233b8af4e84da",
+ "testharness"
+ ],
+ "preload/dynamic-adding-preload-nonce.html": [
+ "b088a043cea13026f2a6aeff1e329728440f27f4",
"testharness"
],
+ "preload/dynamic-adding-preload-nonce.html.headers": [
+ "bc989923b6d9ff44e3efbd511264a3ba9e294078",
+ "support"
+ ],
"preload/dynamic-adding-preload.html": [
- "9f952dc438559f60028e09bc47d4a88722a56408",
+ "b69da90e272530d4f42bf6d9c5b3b772d1ffce48",
"testharness"
],
"preload/fetch-destination.https.html": [
"d24a50f1f0a52371f84ec35ccc1d99df63c7da44",
"testharness"
],
+ "preload/link-header-on-subresource.html": [
+ "ea2f018b648d77b13b8010b4ebe63cdc5f846603",
+ "testharness"
+ ],
"preload/link-header-preload-delay-onload.html": [
- "636fd33d632c5d3dfeacd0e3d479ebbba1d0a436",
+ "2f786770b2d0ea00c999e10afc46a85ec737d8e5",
"testharness"
],
"preload/link-header-preload-delay-onload.html.headers": [
- "a1c0a4f2f25e358784567be95cc02edc03173f45",
+ "80630631003ae230caab5a49c1073d7dc1e4c9aa",
+ "support"
+ ],
+ "preload/link-header-preload-nonce.html": [
+ "5686f83e37283200f9fd24483a4412af8816ee73",
+ "testharness"
+ ],
+ "preload/link-header-preload-nonce.html.headers": [
+ "5cecc11ba51e0f6a7dcff46dd0c0c1a3fa8e3fc7",
"support"
],
"preload/link-header-preload.html": [
- "93d80aee2daf5434d78484a412213f17fa92886f",
+ "baccd9981f5a8e4a7ac6d57bc3feac67bcd0d676",
"testharness"
],
"preload/link-header-preload.html.headers": [
- "d30ac6e50fb6d6b996814f9e98d88262d715c16e",
+ "8957392c3329646d4a17506b1fc5e3e4bb6237a8",
"support"
],
"preload/onerror-event.html": [
- "8d07912e570ef8ece9ffdc8f6cc8eeae219a3e5c",
+ "9f85f429c75d8469ef4bad843a09a307a20c6f58",
"testharness"
],
"preload/onload-event.html": [
- "8d190661c002ffe0c6f2fca51454fc2d67a6f465",
+ "a02dd91451d598684a91575e8b09bda81c90e43f",
"testharness"
],
"preload/preload-csp.sub.html": [
- "fabb968b75579b301045ecb00380336815e36e86",
+ "6b883cf98ebedfffbc66ab01db8736b3a978ba3b",
"testharness"
],
"preload/preload-default-csp.sub.html": [
- "4686e9047519b9a3e90ccda610442006c35cfc63",
+ "5dc342bc568e96a53d5d8c0259a4f3c32a9a6ae5",
"testharness"
],
"preload/preload-with-type.html": [
- "b15b6022d8fd4bdc88e7a54429667eb223bc2464",
+ "ede6cb60bc1fff4f5b7740f66f039c88adb23f6f",
"testharness"
],
"preload/reflected-as-value.html": [
- "835cd55f66486f2a66fd65d201a9184fb276ddab",
+ "28b98f82200b0c3461a9ff440df454a254f5e62a",
"testharness"
],
+ "preload/resources/A4.ogv": [
+ "cb9a48e1d53911d5be214320adfbf7596632a316",
+ "support"
+ ],
+ "preload/resources/A4.ogv.sub.headers": [
+ "ac876cf9750337fcde99e547f5dc1223bb200772",
+ "support"
+ ],
+ "preload/resources/CanvasTest.ttf": [
+ "10a7017b4caead6817aa08b25f14950e6402dd95",
+ "support"
+ ],
+ "preload/resources/CanvasTest.ttf.sub.headers": [
+ "ac876cf9750337fcde99e547f5dc1223bb200772",
+ "support"
+ ],
+ "preload/resources/dummy-preloads-subresource.css": [
+ "788dde4e1879591cdd0e8298741f30b0d12578cd",
+ "support"
+ ],
+ "preload/resources/dummy-preloads-subresource.css.sub.headers": [
+ "74cf2e94b49905203c42c7e701bd2308997347ea",
+ "support"
+ ],
"preload/resources/dummy.css": [
"788dde4e1879591cdd0e8298741f30b0d12578cd",
"support"
],
+ "preload/resources/dummy.css.sub.headers": [
+ "ac876cf9750337fcde99e547f5dc1223bb200772",
+ "support"
+ ],
"preload/resources/dummy.js": [
"bcd2891de63b59f9d6941009ec42f2020396617e",
"support"
],
+ "preload/resources/dummy.js.sub.headers": [
+ "ac876cf9750337fcde99e547f5dc1223bb200772",
+ "support"
+ ],
"preload/resources/dummy.xml": [
"2cd5f1a5408f112904afbc7a1e97d75d3ed93ce7",
"support"
],
+ "preload/resources/dummy.xml.sub.headers": [
+ "ac876cf9750337fcde99e547f5dc1223bb200772",
+ "support"
+ ],
"preload/resources/empty.html": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
+ "preload/resources/empty.html.sub.headers": [
+ "ac876cf9750337fcde99e547f5dc1223bb200772",
+ "support"
+ ],
"preload/resources/fetch-destination-worker.js": [
"04e1fd5f1b1829ab9df389f9497681c585b42b78",
"support"
],
+ "preload/resources/foo.vtt": [
+ "fbfdfb2648866047d0fa2a4ad4fde3462a491857",
+ "support"
+ ],
+ "preload/resources/foo.vtt.sub.headers": [
+ "ac876cf9750337fcde99e547f5dc1223bb200772",
+ "support"
+ ],
"preload/resources/preload_helper.js": [
- "bb0ed5216594759b2f0f0aa0cf3e9d2f072950d9",
+ "56ca07621a7198b2f983b3f13a5a63d9ce81ab3c",
+ "support"
+ ],
+ "preload/resources/sound_5.oga": [
+ "167093849b93b142723513ac72a725c97da635a8",
+ "support"
+ ],
+ "preload/resources/sound_5.oga.sub.headers": [
+ "ac876cf9750337fcde99e547f5dc1223bb200772",
"support"
],
"preload/resources/square.png": [
"fa547a180b73a5422d52c1702c9d1e43b1083f9c",
"support"
],
+ "preload/resources/square.png.sub.headers": [
+ "ac876cf9750337fcde99e547f5dc1223bb200772",
+ "support"
+ ],
+ "preload/resources/white.mp4": [
+ "577f031289beb30fa38824950ea297818bab8e81",
+ "support"
+ ],
+ "preload/resources/white.mp4.sub.headers": [
+ "ac876cf9750337fcde99e547f5dc1223bb200772",
+ "support"
+ ],
"preload/single-download-late-used-preload.html": [
"8476855931b0148754287ca5674000a1b6a9bca2",
"testharness"
],
"preload/single-download-preload.html": [
- "3ee15736925ad7eed449ff3074353140598461bd",
+ "2b7af8e911957d6b49246a17ceb284b97981241e",
"testharness"
],
"presentation-api/OWNERS": [
@@ -603430,7 +610795,7 @@
"testharness"
],
"presentation-api/controlling-ua/common.js": [
- "6b788aa76cb93a0454839209bb84aa25cd38011f",
+ "c6b28c0515da47b6c82a94ed23d88dddf5a51f82",
"support"
],
"presentation-api/controlling-ua/defaultRequest.https.html": [
@@ -603450,7 +610815,7 @@
"testharness"
],
"presentation-api/controlling-ua/idlharness.https.html": [
- "1d4a84cb5b0706a2a9d0332126b960b75c41cc28",
+ "2c04fce046431ca8e3ddb3eee5428ac99e4c217a",
"testharness"
],
"presentation-api/controlling-ua/reconnectToPresentation_notfound_error.https.html": [
@@ -603554,7 +610919,7 @@
"support"
],
"presentation-api/receiving-ua/support/PresentationConnection_onmessage_receiving-ua.html": [
- "7d7b0bb899d0ab8415c1705f5bee2ca7a9866561",
+ "da347fdf1c5c44a5974107678caab349add80c2f",
"support"
],
"presentation-api/receiving-ua/support/PresentationConnection_send_receiving-ua.html": [
@@ -603578,7 +610943,7 @@
"support"
],
"presentation-api/receiving-ua/support/idlharness_receiving-ua.html": [
- "adffe1f696cf03f0041383992ab59e47db0ab8c0",
+ "7d2a67a137e77029179039e34a86a9abe81189d7",
"support"
],
"presentation-api/receiving-ua/support/iframe.html": [
@@ -603646,7 +611011,7 @@
"testharness"
],
"quirks-mode/OWNERS": [
- "3a52efa37cb05c353bb8ce78146c42db6a238b74",
+ "adc83b19e793491b1c6ea0fd8b46cd9f32e592fc",
"support"
],
"quirks-mode/active-and-hover-manual.html": [
@@ -603657,6 +611022,10 @@
"01c5b2e89c88d4145429e8860eaa88f728d0601b",
"testharness"
],
+ "quirks-mode/classname-query-after-sibling-adoption.html": [
+ "a9fd790c46562057d00b9a042f548d28259042d0",
+ "testharness"
+ ],
"quirks-mode/hashless-hex-color.html": [
"161c0bfaabbfb59c426e855b9dcfa746ea9e8f95",
"testharness"
@@ -603698,7 +611067,7 @@
"support"
],
"referrer-policy/README.md": [
- "a908472f8b8c083f37da8feb38a198363f75376c",
+ "da67e3de754801ef0b51b7be9bebc7170769388c",
"support"
],
"referrer-policy/css-integration/README.md": [
@@ -603737,6 +611106,10 @@
"00233e7d4513c8e3c4b7f7fa60f313ef1b6dbddd",
"support"
],
+ "referrer-policy/generic/link-rel-prefetch.html": [
+ "96461340190f20f47a50b7fa4e6cdf9d2a7e09de",
+ "testharness"
+ ],
"referrer-policy/generic/referrer-policy-test-case.js": [
"20c8273fd2a2cad07d3a607717d69d6ae94cf27e",
"support"
@@ -611161,6 +618534,94 @@
"3d220a3cc0e6a05fbc40c0ab0e46a2e60162b2be",
"testharness"
],
+ "requestidlecallback/OWNERS": [
+ "84f418b8b821f1498bf87feaaf1f07de77720a4e",
+ "support"
+ ],
+ "requestidlecallback/basic.html": [
+ "b464e0a43f79867fc07f9843921ef63ad4581a23",
+ "testharness"
+ ],
+ "requestidlecallback/callback-exception.html": [
+ "84270b568b8f4d67d04da5df99cd2e0eb8e51977",
+ "testharness"
+ ],
+ "requestidlecallback/callback-idle-periods.html": [
+ "65056dde042c8c0a25d3f9c375f0925aabab955f",
+ "testharness"
+ ],
+ "requestidlecallback/callback-iframe.html": [
+ "ace7008a593a32ca016685aaa85bda9b4c4bd8c8",
+ "testharness"
+ ],
+ "requestidlecallback/callback-invoked.html": [
+ "e7cf5a399d92f1fcb98f6ebb1ed3283d60d2bfe2",
+ "testharness"
+ ],
+ "requestidlecallback/callback-multiple-calls.html": [
+ "af6e6a65fda2486ac8669340988b1d57a178e77a",
+ "testharness"
+ ],
+ "requestidlecallback/callback-removed-frame.html": [
+ "ff034276659407d2dea91d2b0ed0e5919b875904",
+ "testharness"
+ ],
+ "requestidlecallback/callback-suspended.html": [
+ "fe63f3ea133dbdb48b1a525a40d34a231e9a3789",
+ "testharness"
+ ],
+ "requestidlecallback/callback-timeout-with-raf.html": [
+ "febb81c38f530c81d9e9837df2c6d603225ecfd1",
+ "testharness"
+ ],
+ "requestidlecallback/callback-timeout.html": [
+ "ba76964575cdf9b433f26c8a5d7a8183ab5c16e9",
+ "testharness"
+ ],
+ "requestidlecallback/callback-xhr-sync.html": [
+ "272a688feaefc3c1ebab315ae9f4633f11a966f1",
+ "testharness"
+ ],
+ "requestidlecallback/cancel-invoked.html": [
+ "30787d765fa435c1392bd852559042bf3c2e2553",
+ "testharness"
+ ],
+ "requestidlecallback/idlharness.html": [
+ "520ee58982b43875f3caa08d7f46b9c6311be0b6",
+ "testharness"
+ ],
+ "requestidlecallback/resources/post_name_on_load.html": [
+ "4c2db9979bcf68c61e62a805d59d95b7d164d9af",
+ "support"
+ ],
+ "resize-observer/OWNERS": [
+ "59d77bdffdf0b2a5132447d23642f7a71bd3ba71",
+ "support"
+ ],
+ "resize-observer/eventloop.html": [
+ "f356e188c1a873c9058c17143463c8397ed33689",
+ "testharness"
+ ],
+ "resize-observer/notify.html": [
+ "29f22b18a6ae894b80bec599dd71fc5050dbb292",
+ "testharness"
+ ],
+ "resize-observer/observe.html": [
+ "d86de600a53f4a804b0b88b751ca764d97c4c24a",
+ "testharness"
+ ],
+ "resize-observer/resources/iframe.html": [
+ "e404bac83361b96185f5351784dbe56a4ef0d305",
+ "support"
+ ],
+ "resize-observer/resources/resizeTestHelper.js": [
+ "17aac2df7ca1362a4ce443663b642362e87cc150",
+ "support"
+ ],
+ "resize-observer/svg.html": [
+ "fb544abe50fddcd302d000e08bc822d21a31df6f",
+ "testharness"
+ ],
"resource-timing/OWNERS": [
"8fd9729d4d10437b0a46b5c0c00729b37f17b361",
"support"
@@ -611170,7 +618631,7 @@
"support"
],
"resource-timing/idlharness.html": [
- "c2582fcd7d9cf40d10d86589c341789ba94a68bd",
+ "f6ff9054d4412a6089ff182c9df0dcf4626dab21",
"testharness"
],
"resource-timing/iframe-setdomain.sub.html": [
@@ -611237,6 +618698,10 @@
"9e8051a2ff8fff72b36ed1cecb61f9e7bba29071",
"support"
],
+ "resource-timing/resources/blue.png": [
+ "99949c515749e66f471c3589ee7a0ef518aaccb5",
+ "support"
+ ],
"resource-timing/resources/fake_responses.html": [
"c942abc1e8c1672935ffc8ce34821891345bacb9",
"support"
@@ -611246,7 +618711,7 @@
"support"
],
"resource-timing/resources/gzip_xml.py": [
- "dfddf3eb3e80d77163ae12a5df71ed3e9559722a",
+ "cf637a4389fd259dee3a2df56194a68b3744b4c6",
"support"
],
"resource-timing/resources/iframe_TAO_match_origin.html": [
@@ -611317,12 +618782,16 @@
"59692fb2ebe890d65acba54aa2f814fcf9b46d39",
"support"
],
+ "resource-timing/single-entry-per-resource.html": [
+ "e23e9cab8d42a3bb6b0635cd3916d9131ccc6ba2",
+ "testharness"
+ ],
"resource-timing/test_resource_timing.html": [
"16c8af27032f9babbc6b5443a033a44d5597ff1e",
"testharness"
],
"resource-timing/test_resource_timing.js": [
- "212dd1f05242ce9e850698b0c9f7eff085313838",
+ "504f20a00b7be9c3b15666dfe34df02856a8bc72",
"support"
],
"screen-orientation/OWNERS": [
@@ -611593,6 +619062,10 @@
"adcc65d54d59715ee740b2436486058ec578b63a",
"testharness"
],
+ "selection/addRange.htm": [
+ "00a3f3a9ffd0976d98d4857632e11fac6f184cb4",
+ "testharness"
+ ],
"selection/addRange.js": [
"36982e3d91452822913d41c41c36d28339cab8a2",
"support"
@@ -611613,6 +619086,10 @@
"a66ab339d964529b3ba8a9af48eb26a4b9b55028",
"testharness"
],
+ "selection/collapse.htm": [
+ "7827a1438470252437440cedde0a0acf17713f15",
+ "testharness"
+ ],
"selection/collapse.js": [
"fdeaf514b240bdeadd89829e3321465d3e376926",
"support"
@@ -611658,7 +619135,7 @@
"testharness"
],
"selection/interfaces.html": [
- "55d32a5d2a362a2d7bd0ddc580fa24180f3d3579",
+ "1fb2684472fc29c5460b709908b6f0c4f779f1c1",
"testharness"
],
"selection/isCollapsed.html": [
@@ -611666,7 +619143,7 @@
"testharness"
],
"selection/removeAllRanges.html": [
- "bd203d8878c4de59de476fe6fa7417bd2678dfcc",
+ "c1ed8afc2f1ee80f5131d1ead6930c9895a2a6f3",
"testharness"
],
"selection/removeRange.html": [
@@ -611726,7 +619203,7 @@
"support"
],
"server-timing/resources/blue.png.sub.headers": [
- "d14ff7ce6dce67417c14192a89f4fe2d31c099a7",
+ "7ae842dc0c2e6a26e68aea5867214eb2dbd2b08b",
"support"
],
"server-timing/resources/green.png": [
@@ -611734,15 +619211,15 @@
"support"
],
"server-timing/resources/green.png.sub.headers": [
- "e2fca01ea5a9c31731a1d5c4199849bf728da892",
+ "827dfe4dedd1d3854048b1b13e336200a05cc0da",
"support"
],
"server-timing/test_server_timing.html": [
- "eab2a2be6984346d7fd83c8f3dcc99b2f3e09a08",
+ "2c8420d5bc6ac45923f0c5cbc43c6bd88caa877c",
"testharness"
],
"server-timing/test_server_timing.html.sub.headers": [
- "c49030e9c6dabb55bff24b633b6660212bd2ecca",
+ "ffca8e9271c6760a63ca331c541799a537411994",
"support"
],
"service-workers/OWNERS": [
@@ -611962,7 +619439,7 @@
"testharness"
],
"service-workers/service-worker/ServiceWorkerGlobalScope/resources/close-worker.js": [
- "559815205e99f825fdc0a0f2564e7e25586f3c05",
+ "4c116d7223d6d76ed2baa2cd39e2002f45d58171",
"support"
],
"service-workers/service-worker/ServiceWorkerGlobalScope/resources/error-worker.js": [
@@ -612062,13 +619539,17 @@
"testharness"
],
"service-workers/service-worker/claim-fetch.https.html": [
- "adec77bbeec2ec9ea7da3aba94375bc92e1b4f6f",
+ "69100d1070d261e9819217fd7a6531f48b343e14",
"testharness"
],
"service-workers/service-worker/claim-not-using-registration.https.html": [
"0a87c373f6ad15e8901487e71414662af5b2cee3",
"testharness"
],
+ "service-workers/service-worker/claim-shared-worker-fetch.https.html": [
+ "6393cb102990f971bf011fdcbbd1c5d7c07d438c",
+ "testharness"
+ ],
"service-workers/service-worker/claim-using-registration.https.html": [
"5ddaf9e70e6873bfe5029f7d5ee12c1a93356ab6",
"testharness"
@@ -612077,6 +619558,10 @@
"dac61fcadc94d01fa1f46ac65d81c0405d90ecd3",
"testharness"
],
+ "service-workers/service-worker/claim-worker-fetch.https.html": [
+ "2088f1d6974ad87503c950b5df665725f629e80d",
+ "testharness"
+ ],
"service-workers/service-worker/client-id.https.html": [
"bc07ff54eaf1fecc2a46ebcf34059590ac8c866d",
"testharness"
@@ -612098,7 +619583,7 @@
"testharness"
],
"service-workers/service-worker/clients-matchall-client-types.https.html": [
- "3219697b2d6fb9694ad4db1e2d157807b5e5dbcb",
+ "7c522e90fd156ba8b044acd4e606a0242b93f11a",
"testharness"
],
"service-workers/service-worker/clients-matchall-exact-controller.https.html": [
@@ -612170,7 +619655,11 @@
"testharness"
],
"service-workers/service-worker/fetch-event-redirect.https.html": [
- "2a6f2d4f818ac325edd9c69c1b08801961728b20",
+ "48c8d37bcdc37f83d5cfec4e1baba0f8aa1a24e4",
+ "testharness"
+ ],
+ "service-workers/service-worker/fetch-event-referrer-policy.https.html": [
+ "48c31881c1933ae05cbd3d782754c5202c6b055c",
"testharness"
],
"service-workers/service-worker/fetch-event-respond-with-argument.https.html": [
@@ -612202,11 +619691,11 @@
"testharness"
],
"service-workers/service-worker/fetch-event.https.html": [
- "9f991210c315a2d436f760b099a43871692c64c4",
+ "8fb51ce7439e3b8ee21eb5bc8924b2db884fd412",
"testharness"
],
"service-workers/service-worker/fetch-frame-resource.https.html": [
- "77709ff94cfaeec0b01e157714244d1b568c6b18",
+ "fec588cba5090da6bb4914c6719b8e4076a57c82",
"testharness"
],
"service-workers/service-worker/fetch-header-visibility.https.html": [
@@ -612258,7 +619747,7 @@
"testharness"
],
"service-workers/service-worker/fetch-request-xhr.https.html": [
- "088581ef6036d3cc8688d5974461d8e5b8ed1cfd",
+ "b30618dfe4c10370865229cbe9606cce8ed42040",
"testharness"
],
"service-workers/service-worker/fetch-response-taint.https.html": [
@@ -612305,6 +619794,14 @@
"6cafc3245c88f7d96f6a4672b327d3b58ee4a0ee",
"testharness"
],
+ "service-workers/service-worker/immutable-prototype-serviceworker.https.html": [
+ "5c17042fa54cd1fdba6f7aae513412d4a223b432",
+ "testharness"
+ ],
+ "service-workers/service-worker/import-scripts-redirect.https.html": [
+ "ad5ca174b55222c41d1dc1a21fe0bc070357062b",
+ "testharness"
+ ],
"service-workers/service-worker/import-scripts-resource-map.https.html": [
"6bc46467c667f942fd30de063806474e8c94cff0",
"testharness"
@@ -612325,8 +619822,12 @@
"dda1a1967e6e0be64b9bd2198a08aa0429e185ff",
"testharness"
],
- "service-workers/service-worker/interfaces.https.html": [
- "f5e18c249ad8264548923f3c875ffeff523ab424",
+ "service-workers/service-worker/interfaces-sw.https.html": [
+ "c6ea8c330c7886581ba57314cc65a707b25b44f3",
+ "testharness"
+ ],
+ "service-workers/service-worker/interfaces-window.https.html": [
+ "c596bb509623d00646cd8c1420394f7de8ff742d",
"testharness"
],
"service-workers/service-worker/invalid-blobtype.https.html": [
@@ -612341,6 +619842,34 @@
"3c75caa66d3906602d10b07ff22e7d0f210cfee9",
"testharness"
],
+ "service-workers/service-worker/link-element-register-basic.https.html": [
+ "c38709eafae1c43fb6de9c90ad41634bfb749d14",
+ "testharness"
+ ],
+ "service-workers/service-worker/link-element-register-mime-types.https.html": [
+ "7f09c63104e39c76638e9193ac07e383ac0435ad",
+ "testharness"
+ ],
+ "service-workers/service-worker/link-element-register-scope.https.html": [
+ "c29407cfdce522c6a576d866ece6fffe831c85ac",
+ "testharness"
+ ],
+ "service-workers/service-worker/link-element-register-script-url.https.html": [
+ "f3920a47686a1e4792f097f52cf51531dccd58a8",
+ "testharness"
+ ],
+ "service-workers/service-worker/link-element-register-script.https.html": [
+ "9751dfe02dff339124352311115e61b19e7edf66",
+ "testharness"
+ ],
+ "service-workers/service-worker/link-element-register-security-error.https.html": [
+ "026a444eb0ff60e7885f70c7a4c3fa03a2510de3",
+ "testharness"
+ ],
+ "service-workers/service-worker/mime-sniffing.https.html": [
+ "d61a859a111dea758efb91480817fa1a029c152b",
+ "testharness"
+ ],
"service-workers/service-worker/multi-globals/current/current.https.html": [
"2f7a23c1a4dfa7feb121e55d13ff8a0980165b37",
"support"
@@ -612450,7 +619979,7 @@
"support"
],
"service-workers/service-worker/navigation-preload/resources/redirect-scope.py": [
- "2083b2fadd7fd759adf1c36a2522f116dacb5d16",
+ "dfc8da93b28871eb02d0d4f357d12fa2b320efe9",
"support"
],
"service-workers/service-worker/navigation-preload/resources/redirect-worker.js": [
@@ -612498,7 +620027,7 @@
"testharness"
],
"service-workers/service-worker/opaque-response-preloaded.https.html": [
- "4441c255d614ef6d898873f81aa9e5090fbf2875",
+ "9b82b28618ed405aa5dddd35341a076aceea91d6",
"testharness"
],
"service-workers/service-worker/performance-timeline.https.html": [
@@ -612553,10 +620082,6 @@
"785f0ea662160a5b7b3fe6a7580e62f793e100cf",
"testharness"
],
- "service-workers/service-worker/register-link-element.https.html": [
- "fcd2a244ad1f12c954c231c479f89beaa3c145e6",
- "testharness"
- ],
"service-workers/service-worker/register-link-header.https.html": [
"fa97635d3a16a0f2a0a0bae8e4b81c8b5100d9cd",
"testharness"
@@ -612569,6 +620094,10 @@
"c729f05001dc2f4d2958010bab806e474507c934",
"testharness"
],
+ "service-workers/service-worker/registration-basic.https.html": [
+ "23c73f4e971d567cc62a3b9f3e478e87bb065691",
+ "testharness"
+ ],
"service-workers/service-worker/registration-end-to-end.https.html": [
"b7840bdb1c3ee304996942465b52644919f11422",
"testharness"
@@ -612581,12 +620110,32 @@
"6d11b9ecf339e6e476fe594d5cb4e0873b0845d1",
"testharness"
],
+ "service-workers/service-worker/registration-mime-types.https.html": [
+ "f96e0103bef5163690b4bc837b5fc6adf6163527",
+ "testharness"
+ ],
+ "service-workers/service-worker/registration-scope.https.html": [
+ "8e509079ae4fc3ba0e3fcf60f4a5d3efd137c7f0",
+ "testharness"
+ ],
+ "service-workers/service-worker/registration-script-url.https.html": [
+ "5bb7d7fce7eb1e6e96975c7b657ee5a463f8d9df",
+ "testharness"
+ ],
+ "service-workers/service-worker/registration-script.https.html": [
+ "afd8bfc2343053af9d424fc25af012cfc9de46f1",
+ "testharness"
+ ],
+ "service-workers/service-worker/registration-security-error.https.html": [
+ "c0d8abc53c14cefb1e58e8a3e7149b8bdae062a0",
+ "testharness"
+ ],
"service-workers/service-worker/registration-service-worker-attributes.https.html": [
"04a6fd8d3ff62fa4d969b629eb5f541c6447ae12",
"testharness"
],
- "service-workers/service-worker/registration.https.html": [
- "0a06c368a14c008c385c9df3cde35f090d96d58b",
+ "service-workers/service-worker/registration-updateviacache.https.html": [
+ "90c97975a11fc639e775d26e9d0354d514ae7a9b",
"testharness"
],
"service-workers/service-worker/rejections.https.html": [
@@ -612629,10 +620178,34 @@
"0ddb4f1cf84729ed673295719ec58a3e5d600a12",
"support"
],
+ "service-workers/service-worker/resources/bytecheck-worker-imported-script.py": [
+ "b488558e1bb16901b0a9b60f40aeddab9c464021",
+ "support"
+ ],
+ "service-workers/service-worker/resources/bytecheck-worker.py": [
+ "11a8883c24628b25f3faa1470da05caddd5eb094",
+ "support"
+ ],
+ "service-workers/service-worker/resources/claim-shared-worker-fetch-iframe.html": [
+ "2f7b5ec149446b2a81044e8b50ccc644facb4e42",
+ "support"
+ ],
+ "service-workers/service-worker/resources/claim-shared-worker-fetch-worker.js": [
+ "f5b8d26920aecfde1ee34657aa6006304c7da5a3",
+ "support"
+ ],
"service-workers/service-worker/resources/claim-with-redirect-iframe.html": [
"fdc472f4e9a591f0b471174b2aa1783107731f49",
"support"
],
+ "service-workers/service-worker/resources/claim-worker-fetch-iframe.html": [
+ "e72805025860524858f2518ef6ce671180d6107b",
+ "support"
+ ],
+ "service-workers/service-worker/resources/claim-worker-fetch-worker.js": [
+ "39b8e09aee52800a3d01effd3d7ca19c1d926d30",
+ "support"
+ ],
"service-workers/service-worker/resources/claim-worker.js": [
"e779a28c42928ff10219073171c1216c6623b4d4",
"support"
@@ -612754,7 +620327,7 @@
"support"
],
"service-workers/service-worker/resources/extendable-event-async-waituntil.js": [
- "6974e3550cb50b5789c10681abf0a1174bc1a3b8",
+ "1c4145015d38589beea2e5a6850bb4f97f773e0a",
"support"
],
"service-workers/service-worker/resources/extendable-event-waituntil.js": [
@@ -612774,7 +620347,7 @@
"support"
],
"service-workers/service-worker/resources/fetch-canvas-tainting-iframe.html": [
- "04c234d3cc210d24962ce2b7cbbefcbd16d335e8",
+ "aee62d5b6ee22664c493036c879ed8d530b5ba1d",
"support"
],
"service-workers/service-worker/resources/fetch-cors-xhr-iframe.html": [
@@ -612805,10 +620378,6 @@
"95ae0c97941a6b1645690e8504e7de8c6be634b1",
"support"
],
- "service-workers/service-worker/resources/fetch-event-redirect-iframe.html": [
- "f24007259baeab7e9a6932d35e0b2a5305b159a4",
- "support"
- ],
"service-workers/service-worker/resources/fetch-event-respond-with-argument-iframe.html": [
"4a9d7e189909b5adfdd4d1c0ebddb7cd90fde159",
"support"
@@ -612934,7 +620503,7 @@
"support"
],
"service-workers/service-worker/resources/fetch-request-xhr-iframe.https.html": [
- "3e514258608705763ee932821bee89696be1d2e9",
+ "72a1a0895f9b511075f77c618c8ab0aabd177346",
"support"
],
"service-workers/service-worker/resources/fetch-request-xhr-sync-iframe.html": [
@@ -612954,7 +620523,7 @@
"support"
],
"service-workers/service-worker/resources/fetch-response-xhr-iframe.https.html": [
- "5b29c0807de1229631a27ad3c9d66f288631938a",
+ "8a7db09b6c8f89414e6310c3744361f545f44758",
"support"
],
"service-workers/service-worker/resources/fetch-response-xhr-worker.js": [
@@ -613017,6 +620586,10 @@
"9ea5eb8893ae3d75c18566f5862c66df6bc831c0",
"support"
],
+ "service-workers/service-worker/resources/immutable-prototype-serviceworker.js": [
+ "0a428649e0ceaaacdea5d156e829c63668bc3f72",
+ "support"
+ ],
"service-workers/service-worker/resources/import-mime-type-worker.py": [
"7881cd81f7fe54bf3be799f3549098c78b896574",
"support"
@@ -613025,6 +620598,14 @@
"95d29c9b8749cabf795d9a867e260827a8360640",
"support"
],
+ "service-workers/service-worker/resources/import-scripts-redirect-import.js": [
+ "34472e2e6dac507ca6c937f3ce872d0b5718b89a",
+ "support"
+ ],
+ "service-workers/service-worker/resources/import-scripts-redirect-worker.js": [
+ "9507f4a23a9f54a898139c19e62fdf6ce3b21690",
+ "support"
+ ],
"service-workers/service-worker/resources/import-scripts-resource-map-worker.js": [
"bafc81b044c2a52f4ceefcd15a0b8b3c7553146e",
"support"
@@ -613049,12 +620630,12 @@
"9682ae01719d07e5713307a26b1b825087c4cf65",
"support"
],
- "service-workers/service-worker/resources/interfaces-worker.sub.js": [
- "393be6f93713e198afc5d2b7e6d229a39d591426",
+ "service-workers/service-worker/resources/interfaces-idls.js": [
+ "881448e41003f3e942e6a0b8220e39db279da5cf",
"support"
],
- "service-workers/service-worker/resources/interfaces.js": [
- "87d2be95591f013b611a30c6251b6d49099e377d",
+ "service-workers/service-worker/resources/interfaces-worker.sub.js": [
+ "1cb237ff00a54414a6e4010f1288be51799a52d5",
"support"
],
"service-workers/service-worker/resources/invalid-blobtype-iframe.https.html": [
@@ -613105,6 +620686,10 @@
"a9f19c8f8f6908c4a4732bbd0f6b2f3d19401909",
"support"
],
+ "service-workers/service-worker/resources/mime-sniffing-worker.js": [
+ "b37f174839f3fa92cb46835d3574e547de369b88",
+ "support"
+ ],
"service-workers/service-worker/resources/mime-type-worker.py": [
"72d9b6815717b9405835262abb40147d0d4170f0",
"support"
@@ -613130,15 +620715,15 @@
"support"
],
"service-workers/service-worker/resources/navigation-redirect-out-scope.py": [
- "8a4436e53f60b74062f0788bce089dc707f61388",
+ "c8b62fd6752deca11449831db271c3d8ec59874a",
"support"
],
"service-workers/service-worker/resources/navigation-redirect-scope1.py": [
- "8a4436e53f60b74062f0788bce089dc707f61388",
+ "c8b62fd6752deca11449831db271c3d8ec59874a",
"support"
],
"service-workers/service-worker/resources/navigation-redirect-scope2.py": [
- "8a4436e53f60b74062f0788bce089dc707f61388",
+ "c8b62fd6752deca11449831db271c3d8ec59874a",
"support"
],
"service-workers/service-worker/resources/navigation-redirect-to-http-iframe.html": [
@@ -613201,12 +620786,16 @@
"d81c494e7c0aedc7921c6d5a8c7a17b9b1f5a8aa",
"support"
],
- "service-workers/service-worker/resources/opaque-response-preloaded-iframe.html": [
- "df5f1602891ffd5344dfcdf8d2e406f27b3f54e8",
+ "service-workers/service-worker/resources/opaque-response-being-preloaded-xhr.html": [
+ "d42457f8fdee9f0608f3cccc37872cbed3fe4eb9",
"support"
],
"service-workers/service-worker/resources/opaque-response-preloaded-worker.js": [
- "84b0397640b74bc2cd5d8cd4fb90eb29dd5e032b",
+ "132a7dee868b03130d40611eb6b3420dbba35552",
+ "support"
+ ],
+ "service-workers/service-worker/resources/opaque-response-preloaded-xhr.html": [
+ "c53a1ee705cbe97b7843705b0834eafc8a890056",
"support"
],
"service-workers/service-worker/resources/other.html": [
@@ -613265,8 +620854,28 @@
"b137bd995f0ca7b0ecc6ee6f5dc87a3a4e524364",
"support"
],
- "service-workers/service-worker/resources/registration-tests.js": [
- "bdb31335f8d15de455108e0186183f1acdaef41e",
+ "service-workers/service-worker/resources/registration-tests-basic.js": [
+ "c20d86c2cc5de592c60524689411ec1db0b0c9ab",
+ "support"
+ ],
+ "service-workers/service-worker/resources/registration-tests-mime-types.js": [
+ "6b0eb1390ec3b00a6625c4a74feb2cd68c6b0e72",
+ "support"
+ ],
+ "service-workers/service-worker/resources/registration-tests-scope.js": [
+ "370f57a2cd56d39a2f1f60b61c9b6c54b3f512ed",
+ "support"
+ ],
+ "service-workers/service-worker/resources/registration-tests-script-url.js": [
+ "88678c58dcfa4e5355d8f96607f92c81d7d3c5d4",
+ "support"
+ ],
+ "service-workers/service-worker/resources/registration-tests-script.js": [
+ "3f153749950ea228d110e0bfcab51c339e734e38",
+ "support"
+ ],
+ "service-workers/service-worker/resources/registration-tests-security-error.js": [
+ "9bd12c8a1819a2d2c00e49df61972307b63a1a73",
"support"
],
"service-workers/service-worker/resources/registration-worker.js": [
@@ -613338,7 +620947,7 @@
"support"
],
"service-workers/service-worker/resources/skip-waiting-installed-worker.js": [
- "6c6338c7aad6dfc6ef45458fb40441a04820aa6d",
+ "96561dc391ccdb01200c468d0af36efa0f485705",
"support"
],
"service-workers/service-worker/resources/skip-waiting-worker.js": [
@@ -613354,7 +620963,7 @@
"support"
],
"service-workers/service-worker/resources/test-helpers.sub.js": [
- "113528ec940b15e9d7b6b982b6301c762a22b345",
+ "d1fae09808cce3b97e13ac73e7b781c5b51592a6",
"support"
],
"service-workers/service-worker/resources/testharness-helpers.js": [
@@ -613369,6 +620978,14 @@
"cc8130f60240234fa216778dac70dd34fe4b2374",
"support"
],
+ "service-workers/service-worker/resources/update-max-aged-worker-imported-script.py": [
+ "6a70122d9af961de27dd9958f86a92c0d7ff7f7e",
+ "support"
+ ],
+ "service-workers/service-worker/resources/update-max-aged-worker.py": [
+ "dc5784aa563f93a2ebd8c57acddefe8c3dcc1c3f",
+ "support"
+ ],
"service-workers/service-worker/resources/update-nocookie-worker.py": [
"0790be63a2023cccf03f84b2e5c8f5daa7958dd0",
"support"
@@ -613438,7 +621055,7 @@
"testharness"
],
"service-workers/service-worker/skip-waiting-installed.https.html": [
- "c635baadef3503e526f475132584da3f161b2d0a",
+ "00c260790547216d53e663404cf7cf9ecc7aa913",
"testharness"
],
"service-workers/service-worker/skip-waiting-using-registration.https.html": [
@@ -613493,6 +621110,10 @@
"9f43ba359c4d564f75d4ce4b6a040aac6ba50d5b",
"testharness"
],
+ "service-workers/service-worker/update-bytecheck.https.html": [
+ "ab13a5489f964de56db2fe25c5895a8a55ab7d88",
+ "testharness"
+ ],
"service-workers/service-worker/update-recovery.https.html": [
"aac5705d6844e4a33200418504adb57053a45be2",
"testharness"
@@ -613750,7 +621371,7 @@
"testharness"
],
"shadow-dom/Extensions-to-Event-Interface.html": [
- "ab0f4124c0d8d7e0bdffbb0300d1b6d1b57d7dda",
+ "b8a8b22197eb1c17e9cea05c73826211dd2f2532",
"testharness"
],
"shadow-dom/HTMLSlotElement-interface.html": [
@@ -613801,8 +621422,16 @@
"d8b41c5d5bd80cb9a680506d5c3170f30b10cae1",
"testharness"
],
+ "shadow-dom/event-post-dispatch.html": [
+ "ab40bb984bbbf8acad097fee7bfe11302969ac0f",
+ "testharness"
+ ],
"shadow-dom/event-with-related-target.html": [
- "d5e800955038a9998d9ce7db7405d3c6b1c15903",
+ "572ddb9624ba8871d93cb13fad830f1acc8d4cac",
+ "testharness"
+ ],
+ "shadow-dom/historical.html": [
+ "1469992db34a25397dc3d5a5e1eb600e8afcf71b",
"testharness"
],
"shadow-dom/leaktests/get-elements.html": [
@@ -613822,7 +621451,7 @@
"support"
],
"shadow-dom/resources/event-path-test-helpers.js": [
- "cb774b9ebdd143d2ba67be3d6b8d44a73b61d4a9",
+ "0b3340091c93e37362c5008fded9ac4efd042f35",
"support"
],
"shadow-dom/resources/shadow-dom-utils.js": [
@@ -613837,6 +621466,10 @@
"b6073e01e2544ffe2a8bb26946ac1cb5538ed195",
"testharness"
],
+ "shadow-dom/slotchange-customelements.html": [
+ "8071607531cdb7c3881e08f5557ccd9a7ecf4e45",
+ "testharness"
+ ],
"shadow-dom/slotchange-event.html": [
"c72d9d156bf6772c3e5ea054310810b34a049b94",
"testharness"
@@ -614141,6 +621774,22 @@
"bc28599cea839c13daf4739168f8c1ea42526050",
"testharness"
],
+ "speech-api/OWNERS": [
+ "025f9f081f215505e0e55838d4afe136aba573cf",
+ "support"
+ ],
+ "speech-api/SpeechSynthesis-speak-ownership.html": [
+ "6d72bb9c89ef527709fb01608e8b4d7e7bb7ccf7",
+ "testharness"
+ ],
+ "speech-api/SpeechSynthesis-speak-twice.html": [
+ "60eaf93103abe422222307b3c4172f2a0fabee57",
+ "testharness"
+ ],
+ "speech-api/historical.html": [
+ "45bfdcce349e2cb28611520b006c060347fdf58d",
+ "testharness"
+ ],
"staticrange/OWNERS": [
"290c71b49f1147778f51898e114db808b4568549",
"support"
@@ -614169,14 +621818,14 @@
"76fa61c3a87485266a7f9d6f66e5d08bb7881ff7",
"testharness"
],
+ "storage/interfaces.https.worker.js": [
+ "da11cf56486fe08214f91d181b3a19775f6aa59c",
+ "testharness"
+ ],
"storage/interfaces.idl": [
"d3ac8afefe85ca580a514349060b8019f6fccc36",
"support"
],
- "storage/interfaces.worker.js": [
- "da11cf56486fe08214f91d181b3a19775f6aa59c",
- "testharness"
- ],
"storage/opaque-origin.https.html": [
"6ce5a9b14d80030f0adfa1808857294e8c923cb2",
"testharness"
@@ -614246,7 +621895,7 @@
"testharness"
],
"streams/byte-length-queuing-strategy.js": [
- "e4b248c7de8b85df9ed01d707cf2dfcfd9a5bcb0",
+ "7ff2e4b0e5e51cd7a2769f4d39cd4eb7e5e1c8bd",
"support"
],
"streams/byte-length-queuing-strategy.serviceworker.https.html": [
@@ -614266,7 +621915,7 @@
"testharness"
],
"streams/count-queuing-strategy.js": [
- "33f8db7addcc8e01d798b9199b6d78ad35d8a243",
+ "0668d6cba799e52f793778c92dce2e7c572712db",
"support"
],
"streams/count-queuing-strategy.serviceworker.https.html": [
@@ -614278,7 +621927,7 @@
"testharness"
],
"streams/generate-test-wrappers.js": [
- "729d86f589af914bf59f046f40e3d98b5f37efc7",
+ "f40527e4036f235c2268e9f9c5b7267f2b0e3799",
"support"
],
"streams/piping/close-propagation-backward.dedicatedworker.html": [
@@ -614430,7 +622079,7 @@
"testharness"
],
"streams/piping/pipe-through.js": [
- "bf2cebbca84051b446f728d92c065869207299f2",
+ "df36e48e468e526d2d77e80906d62d1ec8e6d276",
"support"
],
"streams/piping/pipe-through.serviceworker.https.html": [
@@ -614461,6 +622110,46 @@
"005490d4fc62797e432b03c33c349d9136815625",
"testharness"
],
+ "streams/readable-byte-streams/brand-checks.dedicatedworker.html": [
+ "b0f32b03a352ef7ac1940eda90414a5f65980194",
+ "testharness"
+ ],
+ "streams/readable-byte-streams/brand-checks.html": [
+ "317e5c5cc2eedcc6902e8cc44567ea59e7f173ac",
+ "testharness"
+ ],
+ "streams/readable-byte-streams/brand-checks.js": [
+ "15d95be48677eae31eece31a54d2d63fdf64c1bc",
+ "support"
+ ],
+ "streams/readable-byte-streams/brand-checks.serviceworker.https.html": [
+ "c8279e28f5cd80d454d884154ae883a8c965705f",
+ "testharness"
+ ],
+ "streams/readable-byte-streams/brand-checks.sharedworker.html": [
+ "6f3911baf77e26af2d7e7d7472caae4df6d5a27e",
+ "testharness"
+ ],
+ "streams/readable-byte-streams/detached-buffers.dedicatedworker.html": [
+ "8742d541924382fb06a3258d6723f22ddf299045",
+ "testharness"
+ ],
+ "streams/readable-byte-streams/detached-buffers.html": [
+ "9eb042e92c7592d9a5a233469d491d61619a9045",
+ "testharness"
+ ],
+ "streams/readable-byte-streams/detached-buffers.js": [
+ "d593ac7499f206c20f8735e7b8c62cfed421bd8f",
+ "support"
+ ],
+ "streams/readable-byte-streams/detached-buffers.serviceworker.https.html": [
+ "dbc50df2acf0108c88437262608314d1417f6a40",
+ "testharness"
+ ],
+ "streams/readable-byte-streams/detached-buffers.sharedworker.html": [
+ "eb113a11109828edf35885b21e4e57fd3ef84368",
+ "testharness"
+ ],
"streams/readable-byte-streams/general.dedicatedworker.html": [
"8583d80450b090c16ed0795170340d040449bbc1",
"testharness"
@@ -614470,7 +622159,7 @@
"testharness"
],
"streams/readable-byte-streams/general.js": [
- "e8d971fb6491da06f9ceedb1b6cd6a5c06b6f3b4",
+ "4617fdb8c1ef68600f476dadcf47090100fc9ce8",
"support"
],
"streams/readable-byte-streams/general.serviceworker.https.html": [
@@ -614481,6 +622170,26 @@
"44f9ceaa3bfc9d8b92885997d322486bd0f237a6",
"testharness"
],
+ "streams/readable-byte-streams/properties.dedicatedworker.html": [
+ "0d766237560b16ddb1bfcd02e701089132f1b3ec",
+ "testharness"
+ ],
+ "streams/readable-byte-streams/properties.html": [
+ "5daad347136ccd82e952ba0f29894c4634ab4e6d",
+ "testharness"
+ ],
+ "streams/readable-byte-streams/properties.js": [
+ "4fd71882c2a1b8c35fb24a10599a6b90a0f32730",
+ "support"
+ ],
+ "streams/readable-byte-streams/properties.serviceworker.https.html": [
+ "2ef8fc878249c429a89e0748e6a98fac47c1a99a",
+ "testharness"
+ ],
+ "streams/readable-byte-streams/properties.sharedworker.html": [
+ "5c855e897d1143092ecc10b58268e6a576882184",
+ "testharness"
+ ],
"streams/readable-streams/bad-strategies.dedicatedworker.html": [
"269e32606201603b326048f42573c8535c060a18",
"testharness"
@@ -614530,7 +622239,7 @@
"testharness"
],
"streams/readable-streams/brand-checks.js": [
- "c8ffdcf56bfddf5792af6eed627db55d7df3b444",
+ "c4f26a5247feb64d9e1a2a6872e1a6a5819e4a5b",
"support"
],
"streams/readable-streams/brand-checks.serviceworker.https.html": [
@@ -614590,7 +622299,7 @@
"testharness"
],
"streams/readable-streams/default-reader.js": [
- "4bf42e5e2f45275c98122fd6e884d7af0dee1e77",
+ "8746e2c94c2bc28431aefaae71d83f87c5738cde",
"support"
],
"streams/readable-streams/default-reader.serviceworker.https.html": [
@@ -614650,7 +622359,7 @@
"testharness"
],
"streams/readable-streams/general.js": [
- "ef0060b256dfde2195f43529a1c1a0c63e290f16",
+ "e5ea14274f267ba4579627dd12b81e0863271328",
"support"
],
"streams/readable-streams/general.serviceworker.https.html": [
@@ -614661,26 +622370,6 @@
"44f9ceaa3bfc9d8b92885997d322486bd0f237a6",
"testharness"
],
- "streams/readable-streams/pipe-through.dedicatedworker.html": [
- "ed05dd7416cc07e178e481375c2372ce1094905e",
- "testharness"
- ],
- "streams/readable-streams/pipe-through.html": [
- "fddee6be61036c7fcd88a2e4661fbf5b5f796a18",
- "testharness"
- ],
- "streams/readable-streams/pipe-through.js": [
- "df79dbb2844e85b65abc5ffb356aedc833b81b0a",
- "support"
- ],
- "streams/readable-streams/pipe-through.serviceworker.https.html": [
- "e6604dc4e7f4404ee9dea5ab237fb4636bf9e85a",
- "testharness"
- ],
- "streams/readable-streams/pipe-through.sharedworker.html": [
- "8ecb019e754fd4239cb35c27787897efc2dacccb",
- "testharness"
- ],
"streams/readable-streams/tee.dedicatedworker.html": [
"028f2d402a74140b40a9a3eace6aad1cc862bb64",
"testharness"
@@ -614734,7 +622423,7 @@
"support"
],
"streams/resources/test-utils.js": [
- "099c7bce47262455ad4c51e59a2c92f5f6a9eb9c",
+ "a05a620307acb1e7cadba523b8a3c6d2de7e1748",
"support"
],
"streams/writable-streams/aborting.dedicatedworker.html": [
@@ -614802,11 +622491,11 @@
"testharness"
],
"streams/writable-streams/brand-checks.html": [
- "884307be73730033fe07625cdecd6487468c4f96",
+ "317e5c5cc2eedcc6902e8cc44567ea59e7f173ac",
"testharness"
],
"streams/writable-streams/brand-checks.js": [
- "a9889b29e8265b8d236e54182df9c9052d9ae38d",
+ "d88b00326d9b6d78e0ce9955e3e47ae24f8feb1f",
"support"
],
"streams/writable-streams/brand-checks.serviceworker.https.html": [
@@ -614966,7 +622655,7 @@
"testharness"
],
"streams/writable-streams/properties.js": [
- "651d62037ceff95818e8cd33c078a31e09dafd5c",
+ "cc5f851c607b8dc681cbdacb20362689d7259dea",
"support"
],
"streams/writable-streams/properties.serviceworker.https.html": [
@@ -615085,6 +622774,102 @@
"41feabebc138539a05d4b0b8833bff7440f43fd8",
"support"
],
+ "subresource-integrity/ed25519-broken-signature.js": [
+ "1db69de30b08f2d59395738881958b0895822d65",
+ "support"
+ ],
+ "subresource-integrity/ed25519-broken-signature.js.headers": [
+ "3d1277ddbda9e56d08f86c2e147dfb442c60c581",
+ "support"
+ ],
+ "subresource-integrity/ed25519-multi-signature-headers.js": [
+ "c6e2251496f85335f692107b57ccca1104547532",
+ "support"
+ ],
+ "subresource-integrity/ed25519-multi-signature-headers.js.headers": [
+ "936c168e51d337e5a6d9dbb668d426532c2ac653",
+ "support"
+ ],
+ "subresource-integrity/ed25519-multi-signature.js": [
+ "c6e2251496f85335f692107b57ccca1104547532",
+ "support"
+ ],
+ "subresource-integrity/ed25519-multi-signature.js.headers": [
+ "49252675b2b19591f0dfb56a79c301ebf9c1fff2",
+ "support"
+ ],
+ "subresource-integrity/ed25519-multi-signature2.js": [
+ "c6e2251496f85335f692107b57ccca1104547532",
+ "support"
+ ],
+ "subresource-integrity/ed25519-multi-signature2.js.headers": [
+ "f2b9947e5be6f6420ab2d39f382fef0a5af913c3",
+ "support"
+ ],
+ "subresource-integrity/ed25519-no-signature.js": [
+ "ef0d001cf032728c58832a0c149c0c9107927218",
+ "support"
+ ],
+ "subresource-integrity/ed25519-signature.js": [
+ "c6e2251496f85335f692107b57ccca1104547532",
+ "support"
+ ],
+ "subresource-integrity/ed25519-signature.js.headers": [
+ "3d1277ddbda9e56d08f86c2e147dfb442c60c581",
+ "support"
+ ],
+ "subresource-integrity/ed25519-signature2.js": [
+ "c6e2251496f85335f692107b57ccca1104547532",
+ "support"
+ ],
+ "subresource-integrity/ed25519-signature2.js.headers": [
+ "ccefb74016c47ae4e0a1e6d5d5da5300c738ffb1",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style-multi-signature-headers.css": [
+ "41feabebc138539a05d4b0b8833bff7440f43fd8",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style-multi-signature-headers.css.headers": [
+ "a48ada08c966ab04da44e19be8e49e79c29e758f",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style-multi-signature.css": [
+ "41feabebc138539a05d4b0b8833bff7440f43fd8",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style-multi-signature.css.headers": [
+ "947c2af5229677b9c4b38b1e67384d87ab280902",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style-multi-signature2.css": [
+ "41feabebc138539a05d4b0b8833bff7440f43fd8",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style-multi-signature2.css.headers": [
+ "841a5408db8f751788e8173d2a29887d44175a33",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style-no-signature.css": [
+ "41feabebc138539a05d4b0b8833bff7440f43fd8",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style-wrong-signature.css": [
+ "41feabebc138539a05d4b0b8833bff7440f43fd8",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style-wrong-signature.css.headers": [
+ "3d1277ddbda9e56d08f86c2e147dfb442c60c581",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style.css": [
+ "41feabebc138539a05d4b0b8833bff7440f43fd8",
+ "support"
+ ],
+ "subresource-integrity/ed25519-style.css.headers": [
+ "40773896fa85b0ac6545d3064f7e594e4e9b4339",
+ "support"
+ ],
"subresource-integrity/matching-digest.js": [
"c28fd94f8c51bd90da2464338e91281304818e0a",
"support"
@@ -615097,16 +622882,32 @@
"41feabebc138539a05d4b0b8833bff7440f43fd8",
"support"
],
+ "subresource-integrity/subresource-css-ed25519.tentative.html": [
+ "082e0f1608b3f2dd1635f9bba98cb4778b345777",
+ "testharness"
+ ],
+ "subresource-integrity/subresource-ed25519-with-csp.tentative.html": [
+ "7667e10ec87d0657911e66342488ea5f94d0c676",
+ "testharness"
+ ],
+ "subresource-integrity/subresource-ed25519.tentative.html": [
+ "c1bc88cc0ac723970244270a584748bb25148dd9",
+ "testharness"
+ ],
"subresource-integrity/subresource-integrity.sub.html": [
- "74d5ee47bc3cb52208c82da1304fbb3b6cd51560",
+ "3227dfa6ee2273f09b7fa927e556c713a6ddd4d6",
"testharness"
],
+ "subresource-integrity/tools/ed25519.py": [
+ "c219c7667f2a7f35d6978508740c74a5a1698ac5",
+ "support"
+ ],
"subresource-integrity/tools/generate_javascript.py": [
"08e8f4066ad2f5d6b7cdb8e2b81ecfb71f4f61f9",
"support"
],
"subresource-integrity/tools/list_hashes.py": [
- "a30aed8fd663c8baa7c5b2a116122979f6d80cda",
+ "e75c0b03d14e410ef77f7a604459681bfcbd9925",
"support"
],
"svg-aam/OWNERS": [
@@ -615126,7 +622927,7 @@
"support"
],
"svg/historical.html": [
- "aa221f26b20b39ff503bed79780a565e9be5ef21",
+ "f18f89f68fdf1266768700235f08e7181ce0e0e1",
"testharness"
],
"svg/import/animate-dom-01-f-manual.svg": [
@@ -617330,7 +625131,7 @@
"support"
],
"svg/interfaces.html": [
- "0c355e7adc334d000991f4181d3bf254302eb915",
+ "3f659056fc469cb96bccd516a596fb183f005e9f",
"testharness"
],
"svg/linking/reftests/href-a-element-attr-change.html": [
@@ -617505,8 +625306,68 @@
"11c8d88f78cb3e857479000332af49484da99212",
"testharness"
],
+ "trusted-types/TrustedHTML.tentative.html": [
+ "1bcbd6d4d990c00449a95fd9c410c199b83b6661",
+ "testharness"
+ ],
+ "trusted-types/TrustedScriptURL.tentative.html": [
+ "2a02a26d6c55e38d51abebe59b470d6f5008440c",
+ "testharness"
+ ],
+ "trusted-types/TrustedURL.tentative.html": [
+ "e6cff885204af25c0233d9c18dd3de5cb82ed51b",
+ "testharness"
+ ],
+ "trusted-types/block-string-assignment-to-innerHTML.tentative.html": [
+ "cde544697dbfa750e2f5ca8a1d7499d6c85c407e",
+ "testharness"
+ ],
+ "trusted-types/block-string-assignment-to-insertAdjacentHTML.tentative.html": [
+ "739b7940a27a298ca05005e9549774f9e0c0122f",
+ "testharness"
+ ],
+ "trusted-types/block-string-assignment-to-location-href.tentative.html": [
+ "b4da566f7eab26c9156e7976714618c74fd405b0",
+ "testharness"
+ ],
+ "trusted-types/block-string-assignment-to-outerHTML.tentative.html": [
+ "a5301e971af8a918df577a3c00cf5d4be2b1d413",
+ "testharness"
+ ],
+ "trusted-types/block-string-assignment-to-script-src.tentative.html": [
+ "4a92a5485db5e199036f10322a89b713b9b02423",
+ "testharness"
+ ],
+ "trusted-types/document-write.tentative.html": [
+ "4eaf06e1d68d027a858ef6818aeac9b912164cbd",
+ "testharness"
+ ],
+ "trusted-types/innerHTML.tentative.html": [
+ "d5797e778311a76860aab5ae1c1212ed6bf281b0",
+ "testharness"
+ ],
+ "trusted-types/insertAdjacentHTML.tentative.html": [
+ "67298baa3acbfd88c9d867e60fc46ff8f9e2a2ca",
+ "testharness"
+ ],
+ "trusted-types/location-href.tentative.html": [
+ "b6b009db2b50ef1a456762256c598b907cbdce81",
+ "testharness"
+ ],
+ "trusted-types/outerHTML.tentative.html": [
+ "959d23151fe6fa7f049fac11336da8ab9d962d0a",
+ "testharness"
+ ],
+ "trusted-types/script-src.tentative.html": [
+ "4a125530e91a3834077c658a9c0b550fcce8e626",
+ "testharness"
+ ],
+ "trusted-types/support/helper.js": [
+ "6ea027fb1cee52a457e64f9b2b2c8294aa8a9dfc",
+ "support"
+ ],
"uievents/OWNERS": [
- "0826698a2b0359d4b9201d5e7b2c9ceadfcf8ca5",
+ "d9038d2dcd0e077cfa7dbab516f2a8d74de2986d",
"support"
],
"uievents/README.md": [
@@ -617522,7 +625383,7 @@
"support"
],
"uievents/constructors/inputevent-constructor.html": [
- "5af5377e8f5435b7c7bfafa2808e0a8dcf848ce4",
+ "9a8db75f8b2396f92f1bd0ff99a7fbffea637ceb",
"testharness"
],
"uievents/hierarchy/README.md": [
@@ -617545,25 +625406,29 @@
"551486b9882d33a0ce31740809eaec0352403d69",
"manual"
],
+ "uievents/interfaces.html": [
+ "e755618e522288e9bf6dc4fc592fd6658dc97aba",
+ "testharness"
+ ],
"uievents/keyboard/README.md": [
"ee83feb002acf1f134fecf618d985103c906472b",
"support"
],
"uievents/keyboard/key-101en-us-manual.html": [
- "8c4bedcea88fd39cfe291e40b11c3b0cb510267a",
+ "0b54b880246409466d57dcbe941b89d74587e8e4",
"manual"
],
"uievents/keyboard/key-102fr-fr-manual.html": [
- "74ec4ae6f0cfa8ddc2f296d058a70d64977eb28a",
+ "65b31e543203b36d6a1026ba9da3e60de507cf67",
"manual"
],
- "uievents/keyboard/key-manual.css": [
+ "uievents/keyboard/key.css": [
"54d5f8a452d8bbbd040e66af7594debacb6d0377",
- "manual"
+ "support"
],
- "uievents/keyboard/key-manual.js": [
+ "uievents/keyboard/key.js": [
"d189977c13fcff73f9604a56a919676930176db4",
- "manual"
+ "support"
],
"uievents/legacy-domevents-tests/Status.html": [
"b4cfc46993f2349beca9aa583b1eaf24a1bdfe63",
@@ -617841,6 +625706,10 @@
"58f5c03e1f544b12e467663cc2bc0c15673f80b9",
"support"
],
+ "uievents/legacy/Event-subclasses-init.html": [
+ "6b1d7bce96ca023959d5248aa8af0aa83c6d3aa5",
+ "testharness"
+ ],
"uievents/mouse/mouseevent_move_button-manual.html": [
"9cc673035fef3c2e8677e8d6679babfe8a1af854",
"manual"
@@ -617938,7 +625807,7 @@
"testharness"
],
"url/OWNERS": [
- "7fa17c86fb4b69c80e41b8b3d942f10acd158ca3",
+ "e41e711c143c9d39073b5cec75224014fab87e9a",
"support"
],
"url/README.md": [
@@ -617982,7 +625851,7 @@
"testharness"
],
"url/setters_tests.json": [
- "6e388e46caf1a0259a6dc6778e7b33619e389751",
+ "4b01281c0f8811cf57f261f9328d7916c52f3619",
"support"
],
"url/toascii.json": [
@@ -618018,11 +625887,11 @@
"testharness"
],
"url/urlsearchparams-constructor.html": [
- "854e06efa9598f66705605bdef20c4a500ab2e9b",
+ "e7d341e38acba7c7608da8567c20a3468ca522e2",
"testharness"
],
"url/urlsearchparams-delete.html": [
- "eaeaab453fb90ba939c4dca0db11a07d50acce26",
+ "4713dfec8b4277cc29520dbd25958bd74e440c19",
"testharness"
],
"url/urlsearchparams-foreach.html": [
@@ -618046,7 +625915,7 @@
"testharness"
],
"url/urlsearchparams-sort.html": [
- "6a3904b5dada6b1e071b16529e75c6ce18ce45d6",
+ "dfc8f32339d084299318e9eb94fc47171247f2e1",
"testharness"
],
"url/urlsearchparams-stringifier.html": [
@@ -618054,7 +625923,7 @@
"testharness"
],
"url/urltestdata.json": [
- "dad11f4fb0275d1900f3d2362628bff54814c6dc",
+ "d93eea5fddec950368ce502e2f895174b2b847f5",
"support"
],
"user-timing/OWNERS": [
@@ -618114,7 +625983,7 @@
"testharness"
],
"user-timing/measure.html": [
- "8374bbae73ac549b6c8b953d25948ed33b579591",
+ "b021b6706afbf40f59ba1bbc743f4f4e57ea4f66",
"testharness"
],
"user-timing/measure_exceptions_navigation_timing.html": [
@@ -618122,7 +625991,7 @@
"testharness"
],
"user-timing/measure_navigation_timing.html": [
- "b54bbb96f5c24b61e4d64a3633229781213d9cd2",
+ "ff8fb60c227078ab96eddbaee26c6c3b1fa3a9d4",
"testharness"
],
"user-timing/measure_syntax_err.any.js": [
@@ -618146,27 +626015,27 @@
"support"
],
"vibration/api-is-present.html": [
- "0c3c74860bfa27bcdc22a29fe97aa1459a05148f",
+ "b8f5622deb5141ec9a3b66f6e30c6054d5a42288",
"testharness"
],
"vibration/cancel-when-hidden-manual.html": [
- "919d3a12fe1ae0b518f7a69a50bd95aaf06c4cd5",
+ "c83e444bb323268d89cca72b68de6893495ae702",
"manual"
],
"vibration/cancel-with-0-manual.html": [
- "98eeadb226d27685907319f364ac4091a962d995",
+ "33fefd5310ead5f12747716b30f212d8a8026b81",
"manual"
],
"vibration/cancel-with-array-0-manual.html": [
- "64a3b25d44cfe5773254ebdc6e22705177fb1eef",
+ "cd7b9d2818e06b8e305a087c00b770dcc6dddef1",
"manual"
],
"vibration/cancel-with-empty-array-manual.html": [
- "c5cb3390f2ba8af94f4f35398caa29b8f3c7c852",
+ "063a18afa082e52900742047dff81a3c22cd574b",
"manual"
],
"vibration/cancel-with-new-manual.html": [
- "4efea60445ee5349e58077cc06184f95d8c969af",
+ "62578765cf586c984017d38fac9e8f46cad96201",
"manual"
],
"vibration/idl.html": [
@@ -618174,117 +626043,121 @@
"testharness"
],
"vibration/invalid-values.html": [
- "52dda7cccc18982483eaba6fd3e8d8ebcb4155fd",
+ "9c7367db5eaf70dc9a020560b43531e16d44fca4",
"testharness"
],
"vibration/pattern-array-extra-manual.html": [
- "48f43b7ddc69b0cedb1f3077212ec554c0d5a818",
+ "35ad58df83597875739f4c532b5e72011de0f0d3",
"manual"
],
"vibration/pattern-array-manual.html": [
- "cb86e49638093e65b0660982649733e96fa9c813",
+ "d0d8d333566ff1a2ace0ca3e36dadeb36952549e",
"manual"
],
"vibration/pattern-array-with-0-manual.html": [
- "ce0e6f0374c75ca7f6067fb837580ed850de30af",
+ "bd5c644b5609f702dfec4985e3b2dfdf2de4c622",
"manual"
],
"vibration/silent-ignore.html": [
- "bfa8b3fd032dcddf8b2fb6ea83d449b15c74b6fb",
+ "986e856b25f4cb4c28d0add4acd46ec3d83612f6",
"testharness"
],
"vibration/simple-array-manual.html": [
- "ae52d64dfea4e39179595d565f86c6a3a0fae756",
+ "30734ec1632c9666069505bb19554adb03c8f9b6",
"manual"
],
"vibration/simple-scalar-manual.html": [
- "f6ae98a534bfc2d0b57ef11f8f1ebb3d72629c3c",
+ "fcc5e59095f69e8f62120e392d84de9f4c5647a2",
"manual"
],
- "viewport/OWNERS": [
- "a4fed30c25d50d5ce774e4e5b431efa99f73ecf3",
- "support"
+ "viewport/viewport-attribute-event-handlers-manual.html": [
+ "09901d9056f2e31f630becdd07f800e00496700a",
+ "manual"
],
"viewport/viewport-dimensions-custom-scrollbars-manual.html": [
- "34e5aa69477e51f2102eacb1295de1296eaf3662",
+ "ccef0829da2e4ebcad983235f97a6f3f767a0f51",
"manual"
],
"viewport/viewport-dimensions-scrollbars-manual.html": [
- "f6d7ef74f10b94ece1d3a7f0fc7573bf7672baca",
+ "465eb63a9f09880f98636502d4b3ee3b5e3ec794",
"manual"
],
"viewport/viewport-no-resize-event-on-overflow-recalc.html": [
- "9605e8e77cf652aa62c3730a3a5b4fa2f4e38011",
+ "f4d6cb3f76e4cf790875b3be90de821a279b3d82",
"testharness"
],
"viewport/viewport-offset-manual.html": [
- "f54fd0381984ca28532808d36e9c6806c3bfa09a",
+ "1d39d721a49e44d87583cb173cf0bba648fba352",
"manual"
],
"viewport/viewport-page-manual.html": [
- "4d0aabf3b0c75711d3978e9dec4d91f3f144755d",
+ "1431cc6a8495343697c01ef62d237c31a5850e99",
"manual"
],
"viewport/viewport-read-size-causes-layout.html": [
- "a5f89da7f731ad1627089dbd0df1ad292e53ccff",
+ "64a511ff2dd9c0381588b56b15fe1c82e0b1e07a",
"testharness"
],
"viewport/viewport-read-size-in-iframe-causes-layout.html": [
- "8bb04e31e5d5cb7e8ba152507b4b94471d38bfe8",
+ "8bf7b6c1a5721da2c1d1fc896d62a44893446a73",
"testharness"
],
"viewport/viewport-resize-event-manual.html": [
- "f3d9b990138377eaf0d7ccb0a5e3ff6b2a5bb3b1",
+ "38280c144ed74af990ebf9b65ad1d68052f93372",
"manual"
],
"viewport/viewport-resize-event-on-load-overflowing-page.html": [
- "906f44dee3be5931400b2b99dd8b4b4c3f6f6020",
+ "cd13682091b00c182e570a87eac642613a3c05c2",
"testharness"
],
"viewport/viewport-scale-iframe-manual.html": [
- "fe01308f32fe030aa4fcb442a3119bc40397cfcf",
+ "4ccf4a4bb7d13bc12afc6d9bbbc8072b460f87ec",
"manual"
],
"viewport/viewport-scale-manual.html": [
- "2350441e77ffb40ff0ace6ab565700eb605cbbbe",
+ "fd089f974778969d95cd7f6aa6389a6cf9dfb543",
"manual"
],
"viewport/viewport-scroll-event-manual.html": [
- "3119a8ede3338afe24583d3f79b6cba699ef0ad0",
+ "43e7031d3734a1c377e64d0f6a8247fef0782ceb",
"manual"
],
"viewport/viewport-scrollbars-cause-resize.html": [
- "b0a563926aedc95ce27182369b9921bea30b6ac6",
+ "a1017cff8faadfdcae008fd5f27e9c8e7c5383d3",
"testharness"
],
"viewport/viewport-type.html": [
- "f6c1ff74ac054612661a741ed63cc9e38c704b02",
+ "45334f4775607cd8547788e4107e81b03fad319f",
"testharness"
],
"viewport/viewport-unscaled-scale-iframe.html": [
- "9026a7bc429e19def5d082405a44e39a106652f2",
+ "d88c0bd1ce525137fb739182a35ae22bd6455c0f",
"testharness"
],
"viewport/viewport-unscaled-scale.html": [
- "68d25c2233a4e35bb6e0d24a07c39a3c23908e7b",
+ "eb5a1e32e015808651f008ebaaa785ec84d7a1f3",
"testharness"
],
"viewport/viewport-unscaled-scroll-iframe.html": [
- "f55662f1b5cbfc460014a13eabe470295555a98f",
+ "14e88914da4ce92b90cb191278aaa0a26e00ee7a",
"testharness"
],
"viewport/viewport-unscaled-scroll.html": [
- "9e5e473de8a4d0ff7cacf1b4f0fb8b45281a6285",
+ "12f4366f75a8fb078e1691c3ad091ea15a8561f9",
"testharness"
],
"viewport/viewport-unscaled-size-iframe.html": [
- "f2ab6df04eda125567a93c3221ba482cf2464875",
+ "937198c3bf9f26413c35e48f90b5b3b35e1c96a2",
"testharness"
],
"viewport/viewport-unscaled-size.html": [
- "ab196264ebd9d4deb1d7b510d5a08f4abf45fa5d",
+ "e92beb18c8adcf1f7d89cfa0512df46765440a5a",
"testharness"
],
+ "viewport/viewport-url-bar-changes-height-manual.html": [
+ "6b7e0dfc4b8bf51f7e5799a3089c2263e6dac63d",
+ "manual"
+ ],
"viewport/viewport_support.js": [
"2e2e9480e8ccca07d4334d957b6a1c597a1f8fbd",
"support"
@@ -618298,627 +626171,627 @@
"support"
],
"wai-aria/alertdialog_modal_false-manual.html": [
- "4474f69ff5b08402d45009d375f1a0c1d97a3498",
+ "754cdc408ed8152fa00cb22ae9148798e3b6f719",
"manual"
],
"wai-aria/alertdialog_modal_true-manual.html": [
- "c4806b5257c4773833395a97811f9f6f53237ea8",
+ "b5e55fb9f84d41d49b6d464ff838e6bf93e89d32",
"manual"
],
"wai-aria/application_activedescendant-manual.html": [
- "e0d72a20e249d425416ae87f1ae95af879170ff0",
+ "d8308fd422f658779a864616093e904e42c847da",
"manual"
],
"wai-aria/application_activedescendant_value_changes-manual.html": [
- "5d2fdd71f4aeb5a9a2206749acb88830e0a4b8da",
+ "4e71505531d12c69f9a982712c1d67cef0ef0f48",
"manual"
],
"wai-aria/aria-current_not_declared-manual.html": [
- "324c82df17ed329af958d09d374d1fe7c1af3dab",
+ "06f2576c3fe1e9ac32c7a85cd5e40342a3a4f253",
"manual"
],
"wai-aria/aria-current_with_value_changes-manual.html": [
- "f8d68ae8ceae0aeeb103a7480e867c8b8e7efe9f",
+ "e8b6e2e2e5f690867e3334f7c45a4724d00a757f",
"manual"
],
"wai-aria/aria-current_with_value_date-manual.html": [
- "b056105c712ff7d663ca1503480c0a73aacdaae5",
+ "13bb4f08afdc600bf5b13d3264985bb7815a346e",
"manual"
],
"wai-aria/aria-current_with_value_location-manual.html": [
- "99fa9466a41792114440a967e333070664581018",
+ "7aa384eb87ce58bdfb9dc1d937b1c8d32b47d813",
"manual"
],
"wai-aria/aria-current_with_value_page-manual.html": [
- "e7bd1caf26eb2b058420b7cc8e720749043962b8",
+ "91847017d79ff79ddbdfe694e8fea0da78ac579d",
"manual"
],
"wai-aria/aria-current_with_value_step-manual.html": [
- "012589a138d5c3423dd462994b6010da535d8d2d",
+ "749b289dfb529cbfb3b356540086f463965aae55",
"manual"
],
"wai-aria/aria-current_with_value_time-manual.html": [
- "be5a829a19818249201fed5f6ffd5a8ba02e69ca",
+ "f49a8f3a2467ad3bc0dc3cbaaf9e1cfa31766be1",
"manual"
],
"wai-aria/aria-current_with_value_true-manual.html": [
- "cab939d028e95da1d1b0fcedc9760ddc914b0498",
+ "ec3f2cd6a59d63f6efe753d2ab34293cec84173e",
"manual"
],
"wai-aria/aria-current_with_value_unspecified-manual.html": [
- "3c10b7d11e42bd33ae564638b7bcf279d095ae2e",
+ "3b5b8471080a303f0eca9e872bcf72ae9f141561",
"manual"
],
"wai-aria/aria-details_pointing_to_details_element-manual.html": [
- "79a84e9212395255a0d66cacc1d7b2016013e795",
+ "6e638999a1c8bcfc66da250322dec49fd2868219",
"manual"
],
"wai-aria/aria-details_pointing_to_div_element-manual.html": [
- "e236e8a9b3636a4856102dd9ca0f357695113972",
+ "32155fea154db4772d00298ba71500fa93180f2c",
"manual"
],
"wai-aria/article_in_feed_posinset_and_setsize-manual.html": [
- "71c916f22a2281066ca2a6e8a078f86df7203646",
+ "9e09b859a5000bef790a60856cf5ca8e20766094",
"manual"
],
"wai-aria/article_in_feed_setsize_-1-manual.html": [
- "b8211ce48ef3169d8777147e436566bbc978d674",
+ "76452d5ae4d5945c45c9b7ebda1624af3eee591d",
"manual"
],
"wai-aria/article_not_in_feed_posinset_and_setsize-manual.html": [
- "5e6ba423ced4df85aae71f0234e4df883f6f68ae",
+ "7f3b8130f9b8a421b48e25a67dd49a3760176d0f",
"manual"
],
"wai-aria/button_haspopup_dialog-manual.html": [
- "ebde034348367d0de4846f513b893fd4b538292d",
+ "108f4a0796ba86bfbf3547328c43b62c1553d1b5",
"manual"
],
"wai-aria/button_haspopup_emptystring-manual.html": [
- "fe1a0669555d1fb535714ea9bf25c14b94272f53",
+ "d008f881767d98788a280c28f30dd15e0b4507f1",
"manual"
],
"wai-aria/button_haspopup_false-manual.html": [
- "81ac95759365a20f94d8d7279ac25fcc82610cc0",
+ "cf3d8c78029128c0f9540fa5f340cfce69e28d2d",
"manual"
],
"wai-aria/button_haspopup_foo-manual.html": [
- "bf80557381db22456142b63a985df7e47d7eb550",
+ "e0161c6f138b6d6c6fea5ce5a30b605ccfc2cbc8",
"manual"
],
"wai-aria/button_haspopup_grid-manual.html": [
- "14e21d25c31ddcc12801c70114b7efc947331e5c",
+ "d679d1a2e13a5d73658c804e7fa3ed8465fcfa8a",
"manual"
],
"wai-aria/button_haspopup_listbox-manual.html": [
- "8fc2bd88d9d4222d8b3c30a3888fa40592c76861",
+ "f4c0e3ea8c2c27588937a3eb24661da832406ecf",
"manual"
],
"wai-aria/button_haspopup_menu-manual.html": [
- "5ae08497094b432b5fad8df9512512c1553ae916",
+ "e547bf37ad3062035a845b6e8ff85c2082bdcfc4",
"manual"
],
"wai-aria/button_haspopup_tree-manual.html": [
- "6c660c51df6aeab722bedbed64f7be7eb46bdac2",
+ "04c5530a3c3b0d97e39a23788304da6085c7c88f",
"manual"
],
"wai-aria/button_haspopup_true-manual.html": [
- "a7858f1137bb90d20e397478acc3106fc699a69b",
+ "06660fa8fe7b4a4a19727c1e1f4e93bf3b7e06fa",
"manual"
],
"wai-aria/button_haspopup_unspecified-manual.html": [
- "0d791a15ebdc111e48e6cf193b64fddbe1233ae0",
+ "ba242824494f6269d0d2c992037748bcd481953f",
"manual"
],
"wai-aria/button_roledescription_empty-manual.html": [
- "02e8c17c16956f706552e15f047ec7f7f285bf45",
+ "854033b2e291d4ed0e8553906305073aa5062fff",
"manual"
],
"wai-aria/button_roledescription_valid-manual.html": [
- "ba34a9172cd4aca2f5b993bc89b5f6251455b02c",
+ "609c9df2513fd3447ba7677e5fc8bef73d834847",
"manual"
],
"wai-aria/button_roledescription_whitespace_only-manual.html": [
- "9cbdb49690860b2f5d27667252a7bb70aada3482",
+ "b65b913b13e8065cb2dc3ec11fd9802ef7c1dddb",
"manual"
],
"wai-aria/cell-manual.html": [
- "834d5f2817238c77f2ff7d84cfcf130ea7fd93fa",
+ "0ec4a1d6fa6fe674fd59e8ee12119a26c0617d55",
"manual"
],
"wai-aria/cell_aria-colspan_2_on_div-manual.html": [
- "dbcfcede2f4b03c48f4f25a06cc86a0c4a55cbb4",
+ "20ed3d7c616a5df83b7ccb5348a0ec8910ea14e5",
"manual"
],
"wai-aria/cell_aria-colspan_2_on_td_html_colspan_3-manual.html": [
- "c43ff72c242ab1652d7ca7e7ca5eea23902f4d80",
+ "b7a0f0c405f7054650888757ef2e2414777d147a",
"manual"
],
"wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_headers_and_border-manual.html": [
- "34726e1d88332b35f400bc38710489b36e6469fc",
+ "a9c6472baa2a60c2405be20e6cdfb25321d71a35",
"manual"
],
"wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_three_actual_columns-manual.html": [
- "50a66444648047d92364b285f96bd92d22a1fc5c",
+ "f11c49f1db6d5246a3e14923a9bfadb1f2bb5ca4",
"manual"
],
"wai-aria/cell_aria-colspan_2_on_td_with_html_colspan_not_specified-manual.html": [
- "c72a990220f746dedb0501c1b429391c5d8ed656",
+ "49a9a8d79c91b840d4fa7c652437f34508c27825",
"manual"
],
"wai-aria/cell_aria-rowspan_2_on_div-manual.html": [
- "d737e00d21d0caf030f586b652bcf9cede6f5e5c",
+ "766a462e63e40ede31b5bcb28dfe4160199e4d6e",
"manual"
],
"wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3-manual.html": [
- "53bdc1deab18d8e6453ca4acda7818e2d40b3663",
+ "a906e8899c1131aeb6d12fac8ba6021d3ac35531",
"manual"
],
"wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3_with_three_actual_rows-manual.html": [
- "ab7904288326ef7d37b1ef2edeac7457f379a425",
+ "f977cc8e1100ca85b4251c2c08e7ed259c856e4f",
"manual"
],
"wai-aria/cell_aria-rowspan_2_on_td_with_html_rowspan_not_specified-manual.html": [
- "2fe3fb2279567437098626704e29292d2604fe84",
+ "62fc9761f1df3c93d97915ccb0296a27c4847b91",
"manual"
],
"wai-aria/cell_colindex_4-manual.html": [
- "e4b772ffbec3971567a632611b4d24f89a90faa8",
+ "2951c871b311f443b3ef63119299a3b7d15494e9",
"manual"
],
"wai-aria/cell_rowindex_4-manual.html": [
- "12a6b478fe42a6d4c509a4db01390b598057d3d2",
+ "0237b24b6e6cbfd5e35c20ddd3358821d57ab243",
"manual"
],
"wai-aria/checkbox_readonly_false-manual.html": [
- "0ca8232077c8ebe6124e6348876e0d7e305fcdc9",
+ "2ccf421bea917a7081b0e07179189ad47193cbe4",
"manual"
],
"wai-aria/checkbox_readonly_true-manual.html": [
- "c8710159d664ad1e47ffcede99591d36d19c758a",
+ "7d58401c763fa71fb51351948ce90c32d77bef06",
"manual"
],
"wai-aria/checkbox_readonly_unspecified-manual.html": [
- "39980b5e2b61c5b907b299f6581b61fc96176be0",
+ "b9c43e4c8c1913c6cdfc1e18a6cb4a26bd470555",
"manual"
],
"wai-aria/columnheader_aria-colspan_2_on_div-manual.html": [
- "02dbbd5d5065016aa6ad251b6972efbdb2adc3cd",
+ "0e259f88585602885fd753d9b3ce732f9d31a4a5",
"manual"
],
"wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3-manual.html": [
- "833176caaa8cc43ddeef6910c3c91d34d0f27a81",
+ "7b7d5ec0b8a57880e9699d590acb212f69245b42",
"manual"
],
"wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3_with_three_actual_columns-manual.html": [
- "8e991fc01285bf8b0df4600f2185aae321690324",
+ "2aa3893e949c87bd709273a0ef30e46147b8b2eb",
"manual"
],
"wai-aria/columnheader_aria-colspan_2_on_th_with_html_colspan_not_specified-manual.html": [
- "674ca111f421b11015b44680a894b124e0156e8e",
+ "5dd455653d81c7cf1bd9aea69cffea8a0d7a4aaa",
"manual"
],
"wai-aria/columnheader_aria-rowspan_2_on_div-manual.html": [
- "f8d61b206efd7b14349270a9cfbc0fc7b45144b5",
+ "c8ad953daf6925bc14e04ad76e947cd27dee5c7e",
"manual"
],
"wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3-manual.html": [
- "46c1c3749203b0177b42c8517f8f1486493552dd",
+ "beb80b0e82adf83da89213b9d1f7126560dad7e2",
"manual"
],
"wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3_with_three_actual_rows-manual.html": [
- "a352ec0168c837f7ac41e238d9f6b556a1636b4c",
+ "08e65dcc8fe5e6b641f9dcaa71c3ba0c98ede206",
"manual"
],
"wai-aria/columnheader_aria-rowspan_2_on_th_with_html_rowspan_not_specified-manual.html": [
- "f5ae66fb52322271cd48f8b0944c45f150a3c9a6",
+ "2ad181f5319b77d9db45fcbdabc8934cb9fa24aa",
"manual"
],
"wai-aria/columnheader_colindex_4-manual.html": [
- "763cf2903449e52748f60c9d94ba804eeb36e8e0",
+ "8289dc10e5f66c304fc370119bc29aaaa3e8ed8a",
"manual"
],
"wai-aria/columnheader_rowindex_4-manual.html": [
- "d7d2d22bbe8bd9653dfca49258966a3f5bddb630",
+ "fee6e82ce2af5dccdec2c730ea9988cbc3d4e1d8",
"manual"
],
"wai-aria/columnheader_selected_false_not_automatically_propagated-manual.html": [
- "07905926b9a086a9dac09e4208bff5c7be62d9fb",
+ "e869f2b1aa85c5e2e203d5521f9b08feb1f663ca",
"manual"
],
"wai-aria/columnheader_selected_true_not_automatically_propagated-manual.html": [
- "a94da04e13d0ffc5e4470fcd0681ca07cdb345a3",
+ "04f91ea9c7bc2376fcb510a692b35d2a5070b590",
"manual"
],
"wai-aria/combobox_controls_an_invalid_id-manual.html": [
- "870df040569649c51aa55f1cd4999d26412f0fcc",
+ "7bd7949e3668b305a5a623368ed6da2e144e2032",
"manual"
],
"wai-aria/combobox_haspopup_dialog-manual.html": [
- "fdd4269120fd9df0efe154b43a6153565da97943",
+ "961821dd5ce25610394362df85805695295045bf",
"manual"
],
"wai-aria/combobox_haspopup_false-manual.html": [
- "cc7de354f4a21d4aa0e999ea2441be72a71a5822",
+ "3f84b71eb40d187db111a82f0441d97cbc976a2e",
"manual"
],
"wai-aria/combobox_haspopup_grid-manual.html": [
- "d125af338b649432214e6140189349981836e858",
+ "018eb1a5e3acec237eaa2aff418b943e4db652e2",
"manual"
],
"wai-aria/combobox_haspopup_listbox-manual.html": [
- "8acc1c480dea1acf88ca7ca569604b8e9ea88ef5",
+ "fb411bd4b8308fee78d6e1723b9de63751da4e1e",
"manual"
],
"wai-aria/combobox_haspopup_menu-manual.html": [
- "378629479e77ea8389ec688bb33e539ce059ae2a",
+ "7becc965e84d0a68d15b3db779a7f9644bde46b4",
"manual"
],
"wai-aria/combobox_haspopup_tree-manual.html": [
- "b119af4fe48f9213c647e66a4a2a018558254bf9",
+ "cca6e5a853d8609855cf1d230c174bc66abd5e86",
"manual"
],
"wai-aria/combobox_haspopup_true-manual.html": [
- "0c513df922b7d0e343bc769253ac5ae8b52f4510",
+ "5586489253d14dba054db05683dfcaa0bb0da56a",
"manual"
],
"wai-aria/combobox_haspopup_unspecified-manual.html": [
- "710a825d44481c3f14d622e77b19c205f499dd1e",
+ "44e5de398426acb874cc1937e5183216ec35a712",
"manual"
],
"wai-aria/combobox_orientation_horizontal-manual.html": [
- "b0d1bfb6846a6c8008f5b61e5c86b7ff4507c10e",
+ "5bcd8c6c417fd7893bd56f454d5c68ab39da454e",
"manual"
],
"wai-aria/combobox_orientation_unspecified-manual.html": [
- "74cd83120d791c1c1328573ca078b7afeb62bcb7",
+ "38ce5005fbffaff4101e23118510309c044dc59b",
"manual"
],
"wai-aria/combobox_orientation_vertical-manual.html": [
- "ee0c7a375ddfe72da1c0acdf61430efbcbadecc5",
+ "b5c0f055a83c6ab23212c64f610c08def3e19e50",
"manual"
],
"wai-aria/combobox_readonly_false-manual.html": [
- "d197de6dd8bc807819dbd97c70cc7806c0cba25c",
+ "e7ddb2787f3cd24d722f41cbed0e46f1829a84fb",
"manual"
],
"wai-aria/combobox_readonly_true-manual.html": [
- "66add63e8639e204166b2d986600e45731b67f72",
+ "a8ed48eb1686c4d7d36da309a76c772d894fd886",
"manual"
],
"wai-aria/combobox_readonly_unspecified-manual.html": [
- "514077d1fe954cfb2880cf7490fa96a62993d3d9",
+ "33d47bc7569c9deace942d36f85167af931943f9",
"manual"
],
"wai-aria/dialog_modal_false-manual.html": [
- "15ca987281ad77292627823d69ecfaca9ac71523",
+ "b4705c5d80e52baac15c0c068663a02a925660f0",
"manual"
],
"wai-aria/dialog_modal_true-manual.html": [
- "24a9479dd97dd46a443477632fff425f80a44e3e",
+ "4f5282509f1bb49968e270ccbb7d436925d6ad45",
"manual"
],
"wai-aria/dialog_modal_unspecified-manual.html": [
- "beffdaa252e3043cb094ed655db013947d7d4ac8",
+ "a0405a2af36d1400d7a83aa2a5eeb6e92fdc1928",
"manual"
],
"wai-aria/div_element_without_role_roledescription_valid-manual.html": [
- "66ac2a107b7b7e517c5badfe10fcfed527d29235",
+ "a1878222bfe58fa9e40760d6ea8f362633875936",
"manual"
],
"wai-aria/errormessage_object_in_invalid_state-manual.html": [
- "0a2d618a703342da58071c35c510a370044e351f",
+ "2b588aec7e80f18d601bcf72370746d1d2851b40",
"manual"
],
"wai-aria/errormessage_object_in_valid_state-manual.html": [
- "458716e14fab5e9146acd42a1b738aade9c4638e",
+ "b218332ce5c032f72d012f22c3c0452bd0b88fd5",
"manual"
],
"wai-aria/feed-manual.html": [
- "946946d1fb7b9ded2b5c16f66315b999ccbcdfb8",
+ "5314038686453e25354d5444fcbdf5ad945cc965",
"manual"
],
"wai-aria/figure-manual.html": [
- "7efb8eb80093de1cb3a825cccac111c4e4a92b52",
+ "296f20edcfa4c2de5826af97e18b846b920c30a6",
"manual"
],
"wai-aria/grid_aria-readonly_false_automatically_propagated-manual.html": [
- "58e2c9fa82c4500e7dd3f2c60cbd7a07783d6dab",
+ "56b668db545c7b8cb1599c3d205b28218e19cf74",
"manual"
],
"wai-aria/grid_aria-readonly_true_automatically_propagated-manual.html": [
- "defa6fb97d9d71a6da5fef97ac788ae40d35d2f5",
+ "d02baf60fcebee6dd6e52e4884c8bb4e6729cfc1",
"manual"
],
"wai-aria/grid_busy_false-manual.html": [
- "fc5293d1eaf17932548fb4ffabeba91636d4d333",
+ "1e2a8ede68c23c6b308253546c3d25619318a4d9",
"manual"
],
"wai-aria/grid_busy_true-manual.html": [
- "525e53aea870f694194e7337efc54f04e9bf450e",
+ "8734b76e71476acf2c71f9bb7a714f890fd337cd",
"manual"
],
"wai-aria/grid_busy_value_changes-manual.html": [
- "c6f8e48d0633e5d2299db6d9a57ef44064f537b3",
+ "e5df53e46628117c5fe0e12d58334c845a9e404f",
"manual"
],
"wai-aria/grid_colcount_8-manual.html": [
- "d27a7c3ccc0186a970f85c12b177bd0390137887",
+ "b66693301f389b525ad6e933c5474505b56ab7b3",
"manual"
],
"wai-aria/grid_columnheader_readonly_false-manual.html": [
- "966772d35396d2946eecf282626ed76fff983bda",
+ "2c4a43cd02609acc031d33eb4e689648370abd59",
"manual"
],
"wai-aria/grid_columnheader_readonly_true-manual.html": [
- "c77203c5aff070fde3ba2a166a527a4047685fb5",
+ "f935328efc9d08b5af2e10f1259963b416bbaae6",
"manual"
],
"wai-aria/grid_columnheader_readonly_unspecified-manual.html": [
- "b0ba733622e16cd2cd8d282995cfb251a8fbb348",
+ "4cc660c0363fa6a4d4ab7542ee60a8f3617be879",
"manual"
],
"wai-aria/grid_columnheader_required_false-manual.html": [
- "ff3177c827e9878f399ee9ea3d21408e382bd7a2",
+ "5b2b2bb0ec6562b83dbf6356e6569d8c8ecf5217",
"manual"
],
"wai-aria/grid_columnheader_required_true-manual.html": [
- "f435b39b4c0c2a946a8b6f92fd9a602f652cde3f",
+ "45d1ab83024a4c88fa16985c58fe99ff44a8c3da",
"manual"
],
"wai-aria/grid_columnheader_required_unspecified-manual.html": [
- "8d6287495265d1b57dbb704e4d4be43b8aa6b84b",
+ "4f516fcd837222a86d2ecfb431b36361c73dc8a2",
"manual"
],
"wai-aria/grid_rowcount_3-manual.html": [
- "cef045744fef8f057ace5432b94b1d4159403f4d",
+ "beb0b7e7c70aec7a1c40c6a04bc0d58aff45d874",
"manual"
],
"wai-aria/grid_rowheader_readonly_false-manual.html": [
- "4be468949bce221b4d2c8918510aef8502382667",
+ "cab82961b14adc4c99e9321c0dc94b38eea2028a",
"manual"
],
"wai-aria/grid_rowheader_readonly_true-manual.html": [
- "70bf1009bbdfe23edec4904631c1619c596e5b48",
+ "9ebdaa97febbe584b1e44bf048a29814a24381ea",
"manual"
],
"wai-aria/grid_rowheader_readonly_unspecified-manual.html": [
- "4f0e5ca22061d60117b3a9ba1ba0d912f1495a41",
+ "c50f645b458fba36b881bc85474ea7b3c1710e45",
"manual"
],
"wai-aria/grid_rowheader_required_false-manual.html": [
- "63136f3c7b01adfbb2674fe0626bef5dc97f8ed5",
+ "56f954adf8783d91ce550c71b876850a3ea19521",
"manual"
],
"wai-aria/grid_rowheader_required_true-manual.html": [
- "1d69644d4a256c3a86dba4d8cf305bf3689d0071",
+ "bd031d825385c77efea8479087b407cae84164c0",
"manual"
],
"wai-aria/grid_rowheader_required_unspecified-manual.html": [
- "50a4f4995f11a6b92e3641853aa3ccfa4dc8ec21",
+ "0ce55c3222ff79ccfe99dbb18332fc67d96eaaa9",
"manual"
],
"wai-aria/gridcell_aria-colspan_2_on_div-manual.html": [
- "25067f7097c864aeda4eefe26f5be4bd325863af",
+ "1a7d9b0cc28bfaef446972e0fd42f4f51c4be3fa",
"manual"
],
"wai-aria/gridcell_aria-rowspan_2_on_div-manual.html": [
- "010d88a933289303f232113e4e8f8622c8003598",
+ "44a9be247679dd52a94f28a1d5147c953867fad0",
"manual"
],
"wai-aria/gridcell_colindex_4-manual.html": [
- "6199a65ea843c7dcce4d4f1111cc2107aebe5097",
+ "3f2cc5549c8c48bed4482eef4d15016a866a432e",
"manual"
],
"wai-aria/gridcell_rowindex_4-manual.html": [
- "64fa525a32345da709081cee13a81fc792c7c6c3",
+ "3ab620afeb2de8c158c1420949d151a2e98f061d",
"manual"
],
"wai-aria/group_hidden_undefined_element_not_rendered-manual.html": [
- "763f3cd871e5d962475d51c7c731c320771da71f",
+ "862b7a9ba1a34dbf9346b2fedeeb52a1a5502784",
"manual"
],
"wai-aria/group_hidden_undefined_element_rendered-manual.html": [
- "49c532fd3f0f4860e824de0724d8b4a242f11787",
+ "2adf0911f14a94eccd19cc8fdf71c7dc2ee4a2e7",
"manual"
],
"wai-aria/heading_level_unspecified-manual.html": [
- "fb9281071562532515626298f454cb34df3ea103",
+ "08fb0566ab4c31b346e61359a4726df4e358f3b5",
"manual"
],
"wai-aria/keyshortcuts_multiple_shortcuts-manual.html": [
- "05a59ef67203ab6071e92c089c9dd827569aec54",
+ "b55b4986db34910d5bc9eab9da5278959b65a571",
"manual"
],
"wai-aria/keyshortcuts_one_shortcut-manual.html": [
- "4450737fa1d041dfade64fbcb53b52a5b3b15509",
+ "4698eff259585037b1da1cc97112b906df28b6b4",
"manual"
],
"wai-aria/listbox_busy_false-manual.html": [
- "648441a3cdfe1497cca809ea8d1f2601ab5efd49",
+ "5569cc12e3b9d2b8fde247c790d72e11015ae78b",
"manual"
],
"wai-aria/listbox_busy_true-manual.html": [
- "590263880933fbd11c7a23be0d4f79805e2736de",
+ "10359f9d21d1fce801fcdd959a12cc5d3f959515",
"manual"
],
"wai-aria/listbox_orientation_horizontal-manual.html": [
- "1e94ef3f3433847c24e19c5bbabb19c89b5cf47c",
+ "4eac9ea9de1faaf6b4edf0d39453ed0c142d8229",
"manual"
],
"wai-aria/listbox_orientation_unspecified-manual.html": [
- "19be848a27f51882c242e2926829ffdfd6402557",
+ "4429e641a1c432347fa0989f1b4a912c238f81fd",
"manual"
],
"wai-aria/listbox_orientation_vertical-manual.html": [
- "d61e7e5f80b898f33e098cd988928743e66e02e1",
+ "3392029434e2f8a8e65fc06960e47f62c3d3224e",
"manual"
],
"wai-aria/listbox_readonly_false-manual.html": [
- "6215aef6018d0bd2e96d8268c22f4e0e8b6470ce",
+ "13f5c9c82beafb26b084dffbf9765cbc1b09a717",
"manual"
],
"wai-aria/listbox_readonly_true-manual.html": [
- "2a4c68f94c86705c977964a66b04ec9d77a76991",
+ "133b4d223e1c74ef642b8d627c3f04b7742cd4df",
"manual"
],
"wai-aria/listbox_readonly_unspecified-manual.html": [
- "9730fa266f511e3fbe81571164bf6fd4ccbfc0af",
+ "4f4e9ef883e7bf9d5e4c719cfec417a4ba427a55",
"manual"
],
"wai-aria/listitem_setsize_-1-manual.html": [
- "d1c13740bdea5368782fc63d69a86724cb72e42b",
+ "bde65a9d5a00ceed56cbce667a541570100c7279",
"manual"
],
"wai-aria/menu_orientation_horizontal-manual.html": [
- "b9486b82f7021651631cd6b245a4a15dcdf76d36",
+ "cb4012affde2f37218f511c11e92a24e987eba89",
"manual"
],
"wai-aria/menu_orientation_unspecified-manual.html": [
- "478c8468afce0cd6382d49c047e33309cfbb54f8",
+ "24903e47b6a6ae1be0a49df8a2ea2abfffd5cf72",
"manual"
],
"wai-aria/menu_orientation_vertical-manual.html": [
- "644f6a7babf3dedecc6fcbece2b064d95108d583",
+ "e7be595d08ccb2f6e94f1c5e3bd66e74f07a04e6",
"manual"
],
"wai-aria/menubar_busy_false-manual.html": [
- "ae32a78c10bf8369f1964797b418e01b92a93f39",
+ "f036c27a389e2680551846a5def6a9d56d398a43",
"manual"
],
"wai-aria/menubar_busy_true-manual.html": [
- "1f94737f35e78a4ab28ec77254e28b88e5db60c7",
+ "27a589285c997241c506cbb4aa2a05b546422e8d",
"manual"
],
"wai-aria/menubar_orientation_horizontal-manual.html": [
- "562009d3e450ffa6f17d13569ec685c53b349be7",
+ "f38cd16c8da078230397b8845b0584a087bd6a83",
"manual"
],
"wai-aria/menubar_orientation_unspecified-manual.html": [
- "7b643abbfb79a718239c7b7501142660a0ffeab1",
+ "6281641a562dc090ec2a31cb3569d3a0708b7ec4",
"manual"
],
"wai-aria/menubar_orientation_vertical-manual.html": [
- "38cf7ac0a2da58bac662dcab5829bbf4a7cef7f5",
+ "a9f61de067b3e926fb51fd0c0f1d8007ccc33857",
"manual"
],
"wai-aria/menuitem_posinset_and_setsize-manual.html": [
- "891df600c46c77d090279f2b7982d55a657539c8",
+ "b444b779d3f65b58bed822e6cc1440828f63557a",
"manual"
],
"wai-aria/menuitemcheckbox_posinset_and_setsize-manual.html": [
- "699233b362c77df950b9e45cc3e6ee083b86a661",
+ "39781006ca59817acf455d556b8c76cd6b489445",
"manual"
],
"wai-aria/menuitemcheckbox_readonly_false-manual.html": [
- "6bf1377e5f89d1b675b6882d00818898c507e77c",
+ "b8841fa91199dcc5662c06780d31cb8261ff92a6",
"manual"
],
"wai-aria/menuitemcheckbox_readonly_true-manual.html": [
- "cd6ed1a83a7fb54651d695f1bdf70e457b803c77",
+ "71b4785cf69375262139df7f18025f55d97774e6",
"manual"
],
"wai-aria/menuitemcheckbox_readonly_unspecified-manual.html": [
- "7d78d89134691a360ca4c8694deaa44bbac47152",
+ "3359f715e3d96cadb2eaf8f07904caeaff36846f",
"manual"
],
"wai-aria/menuitemradio_posinset_and_setsize-manual.html": [
- "7ce92f27e514c4362c45f4387e839a5028e7a6e3",
+ "81ced2031a3f8119f415b6ade261dc47b4c54852",
"manual"
],
"wai-aria/menuitemradio_readonly_false-manual.html": [
- "d8fcd51120ecf49dc423a8ce4db1b5960a55f9d7",
+ "ae7976e8c538e0e712f9ad91ad056a78c258df11",
"manual"
],
"wai-aria/menuitemradio_readonly_true-manual.html": [
- "2236c83482e0b0e4374880452f96a1316565d7a4",
+ "1b1959ce48d2f765952210b507213e7842c57152",
"manual"
],
"wai-aria/menuitemradio_readonly_unspecified-manual.html": [
- "7926d65dc6e034524ea46553aeee03b671494a8e",
+ "1ba57d551c68d52dc75748717106f7c1a30204c4",
"manual"
],
"wai-aria/none-manual.html": [
- "005e4f982bbcb5d23a79383d50418fcfb05c8cd6",
+ "2d2a19bfb7d55f8cb69fd8cbabf10f9d43fc36f7",
"manual"
],
"wai-aria/option_selected_false-manual.html": [
- "5a27d0b83878d76f9718a1c630e90f36da581f96",
+ "a9236aa03abaef97f1af1d9f3011b76d36100487",
"manual"
],
"wai-aria/option_selected_true-manual.html": [
- "ac88cde0974d7f689f222b525dbdbc49644597a0",
+ "fc5f2c6ddb47c33d9e732e0de6a023b25a196618",
"manual"
],
"wai-aria/option_selected_undefined-manual.html": [
- "bd4f2244e9dee99e9d28ba535e94d5f5cffb4f4f",
+ "7c7f968fdcfbacf6e63aff45f89cfc283de7259f",
"manual"
],
"wai-aria/option_selected_value_changes-manual.html": [
- "4b88c894f9eb92b701de56c72f833da11ebf82fe",
+ "e359cc94d1ef484632bf190876447654a23404ad",
"manual"
],
"wai-aria/radiogroup_orientation_horizontal-manual.html": [
- "6fb68f322c3370a8cf27df1f195103225891d437",
+ "5b2f86e5454bf00e02c0b7a728524c7d7c30c55a",
"manual"
],
"wai-aria/radiogroup_orientation_unspecified-manual.html": [
- "ec071b1efdb5e8adf0004058d3f37005bf7e0614",
+ "59b1f62489854443d46e1349f27261a36670fbe9",
"manual"
],
"wai-aria/radiogroup_orientation_vertical-manual.html": [
- "7096f085928618c5d9aba1824ddaa61691d8403d",
+ "a7c523b054a176f529b66b13bc26a987c7f9e5b6",
"manual"
],
"wai-aria/radiogroup_readonly_false-manual.html": [
- "921d0141f6783c0efbff6629bf1b1857053b421e",
+ "8ff1ac067d0d41ef96b629ecd66f00ed37ef9f27",
"manual"
],
"wai-aria/radiogroup_readonly_true-manual.html": [
- "7b0de053f6808aa7dc42862f3a56c6be11534868",
+ "ab0a26eff7d0815ae76ca0ea38e57134703cfccd",
"manual"
],
"wai-aria/radiogroup_readonly_unspecified-manual.html": [
- "d3c809e855dd926d159211b8492adc433f76e5e0",
+ "87bb3a459e24471da03f95c65ff283013e9bed83",
"manual"
],
"wai-aria/region_with_name-manual.html": [
- "bcdb5ba7f53fe1ec265b8916cea081c8404f1c0a",
+ "1200dd9cd7882ddb7d01602723023d379df0eb1c",
"manual"
],
"wai-aria/region_without_name-manual.html": [
- "7813ef502cf9d2bf19e32d4d90309fd11b63a7aa",
+ "a860494a93a7d7d5b01cdd0028b38c4048e51e4b",
"manual"
],
"wai-aria/row_colindex_4-manual.html": [
- "8e9afef99bfdaa9bea7dd1e45a56b64945d1bcb6",
+ "28ca687e2b8da7e3dd2e0fcb3dfc0bb5ffb63840",
"manual"
],
"wai-aria/row_rowindex_4-manual.html": [
- "e9b43b20553dc2bcf96b4d748ea406da7a23f780",
+ "35f2f062b8997476241dac74c1996aecb401c1bc",
"manual"
],
"wai-aria/rowheader_aria-colspan_2_on_div-manual.html": [
- "dbef0cd0578126a0824fc7aef4eb78c0e181769a",
+ "80d410187bb0a6384322f95bd27c967191fef80e",
"manual"
],
"wai-aria/rowheader_aria-rowspan_2_on_div-manual.html": [
- "83e110d8ba40814f2fe4c1f05d28b8836a78fb96",
+ "af1896c0909c5c486a622f31a4a64a11cfa1bf1d",
"manual"
],
"wai-aria/rowheader_colindex_4-manual.html": [
- "2292ac114585ab45abf82d52773bf7efe946b6ce",
+ "a4468840e263a5bf7224e058e7099377f418fe09",
"manual"
],
"wai-aria/rowheader_rowindex_4-manual.html": [
- "8d691e8758b61ded2041f8d2c55c85c30e1533ab",
+ "a832405f0127c6761ad76ffd5141e4361a85c4ee",
"manual"
],
"wai-aria/rowheader_selected_false_not_automatically_propagated-manual.html": [
- "f40306ce25f9c5a7dc7f08ed9a4c0d536e481ba4",
+ "4a57e83377abd3d66d3d8d26232e702b6b53e87f",
"manual"
],
"wai-aria/rowheader_selected_true_not_automatically_propagated-manual.html": [
- "c110ccc314a93a4824cc2f8cc8d24f92c334199f",
+ "b5fbf74482276815c2df2d0bd78beadafd6bd804",
"manual"
],
"wai-aria/scripts/ATTAcomm.js": [
@@ -618930,239 +626803,239 @@
"support"
],
"wai-aria/scrollbar_all_values_unspecified-manual.html": [
- "5abf9c5b4e66a106ead1eadefca0557f4947f061",
+ "c6b90c5767929eb353fc0670886650562ee6eae6",
"manual"
],
"wai-aria/scrollbar_only_valuenow_unspecified-manual.html": [
- "09e7a2d0c666bd3e4bd9b0a879552119dab9ebe6",
+ "4f501f675fe735b7d32929764beccb87648bf25b",
"manual"
],
"wai-aria/scrollbar_orientation_unspecified-manual.html": [
- "ff7005258d71d406b25e47070834ec0b07343885",
+ "951dc98f02cd790fa6fa0c540e4d03a3a88173ae",
"manual"
],
"wai-aria/searchbox-manual.html": [
- "0de383cb2d7006576ba35820e66ceebf61863b89",
+ "0138026be588d9279fe7e086e1d672ef0266abde",
"manual"
],
"wai-aria/searchbox_activedescendant-manual.html": [
- "dd5f73bee1935829af7116d9f0fab21379143e3d",
+ "1f7614531432509aaedc910bae517bfa3bb0867c",
"manual"
],
"wai-aria/searchbox_activedescendant_value_changes-manual.html": [
- "d103b48d3326496c1856e02c9b1b2c2c3387381c",
+ "0e5e9c0947ba355f832d15609a3b8a73ba7a61ad",
"manual"
],
"wai-aria/searchbox_autocomplete_both-manual.html": [
- "f7343424e6bc112e3acbcc34d4158c98228654b3",
+ "7763946ddb6d67a28c294c000370b9b3427b51bc",
"manual"
],
"wai-aria/searchbox_autocomplete_inline-manual.html": [
- "e8d7c3ddb5df6db9147f9f06924b58115edd309a",
+ "57285eeb124be858e60aca78ddb32ea94c0866bf",
"manual"
],
"wai-aria/searchbox_autocomplete_list-manual.html": [
- "0acb822f02bb8f28689f8c4b1712b64a6fd734dd",
+ "b5c9b3cddd08e18eccfdd5e865973c6d9846059d",
"manual"
],
"wai-aria/searchbox_autocomplete_none-manual.html": [
- "36bea2c8a923325fc27feea3af253b3983ac75dc",
+ "30a44a4066dda6ad45eec4b10556ce8f48693829",
"manual"
],
"wai-aria/searchbox_autocomplete_unspecified-manual.html": [
- "2bf04a21da06e02bfea174345190d60c3882e9d0",
+ "e0a9bff6a5e9c0eec42f0e5e0f0ad905ff7ff953",
"manual"
],
"wai-aria/searchbox_multiline_false-manual.html": [
- "8925514b998791a401e5d7057a09f8704d20e081",
+ "699b2b06af38cd8be622ccc75b6d7fbe80ee0b6e",
"manual"
],
"wai-aria/searchbox_multiline_true-manual.html": [
- "c3edc4db1f3771e9c4052eaa20290417c862557d",
+ "7bb4f2752ef7e03bb217e8e1b12f4a40b638bde1",
"manual"
],
"wai-aria/searchbox_multiline_unspecified-manual.html": [
- "0a95f460836d8cf3b74b29a99da2040a142a409e",
+ "f2f175d68df0e97b598ed7a47d44a53cd87b5b19",
"manual"
],
"wai-aria/searchbox_placeholder-manual.html": [
- "27e545c161a89de25268a5e3a316a2743ccb0027",
+ "0e92a02e93b59778595fc4b6d1847fad1040c924",
"manual"
],
"wai-aria/searchbox_readonly_false-manual.html": [
- "e7843da9128a39a93b83a97e06c046f6b4b7f494",
+ "fc1678fc0b32e648e8e7b9a7b63570b09ca8d360",
"manual"
],
"wai-aria/searchbox_readonly_true-manual.html": [
- "f5045cdf606ccdaf85047b37674437ed12fcc778",
+ "adb59b597333f72b18ebd3f2a81832544254d9de",
"manual"
],
"wai-aria/searchbox_readonly_unspecified-manual.html": [
- "7962346d46ef428826f3286b446e62328aacdf4a",
+ "65c71f924f6f39e7fea8176c4a3fc88fe188a8bd",
"manual"
],
"wai-aria/searchbox_required_false-manual.html": [
- "1348c650dc9117cde518a541b228d61878a1628a",
+ "24e7a5f334ae398fdd6f64233b3ce9211894cc5e",
"manual"
],
"wai-aria/searchbox_required_true-manual.html": [
- "968edf9cca483de64a10e4042188394fcc1bf20a",
+ "c3e7a012036938ce5a4f4dc05a6f6bc0b7416b37",
"manual"
],
"wai-aria/searchbox_required_unspecified-manual.html": [
- "25cd28c00c19ecec1fe2e2f35c6b77c782472464",
+ "d34be4256f960a77708588f48ab1a9e79db9b60e",
"manual"
],
"wai-aria/separator_focusable_all_values_unspecified-manual.html": [
- "b0ae5eea6d4c786c78e4983b7410b25750070762",
+ "f46996bb772c14320ea7e10cb8df4faf6bf9861c",
"manual"
],
"wai-aria/separator_focusable_only_valuenow_unspecified-manual.html": [
- "e4f6b409e75ed0fd6f217ec3d09fa4b2b9f85b07",
+ "8c559244f82b6d5ae1fc8ddacfb51d56cf26aa53",
"manual"
],
"wai-aria/separator_focusable_valuetext-manual.html": [
- "b3c3280d13620a0eb16c11eb99fd0ad727ee65fe",
+ "09ab4cb8eaabb21f727965f880dc2b82c28a270f",
"manual"
],
"wai-aria/separator_orientation_unspecified-manual.html": [
- "5058603cf64a799bee96ddfa6ba25d5382d2962d",
+ "9b453b2ca005003e705a0ee8449a16380220e67f",
"manual"
],
"wai-aria/separator_unfocusable_all_values_unspecified-manual.html": [
- "351cb43fb0a5b7259f20af99f799d26b61eda917",
+ "a9c2ed95d25b3bf5d80d1ddbbae44a16abadf235",
"manual"
],
"wai-aria/separator_unfocusable_valuetext-manual.html": [
- "196679826f29a8c2f35688d286ab96739ca89fd9",
+ "f4a30a6c4302e52e626ac509d4f094d4b602f6ee",
"manual"
],
"wai-aria/slider_all_values_unspecified-manual.html": [
- "676af2418ba5e2d81b40c1163fce968c4e09271e",
+ "d2db25aca78f1ceeefcdfffd12e7d2e1ef53faef",
"manual"
],
"wai-aria/slider_only_valuenow_unspecified-manual.html": [
- "e680b6db19d9e20f343662fe8cad18f2127969eb",
+ "cd760f95d6c09bc1783c5b98511d3bffb03318f4",
"manual"
],
"wai-aria/slider_orientation_unspecified-manual.html": [
- "be4d713d88e3b5a695ee72d405ed5a7a6fef20b4",
+ "933b0fc2abab6066680289a7cab1fa0e301b2270",
"manual"
],
"wai-aria/slider_readonly_false-manual.html": [
- "1f28f53f85f09ccbd1fd6d29006b52137b1a6e42",
+ "ec57379556314d03d41b1ebc70452b00d5ab92e6",
"manual"
],
"wai-aria/slider_readonly_true-manual.html": [
- "7da49fd65f5e7125e16ac11c72c1089343dac280",
+ "55beb79ef5f7022741306fea89f75a027b01abca",
"manual"
],
"wai-aria/slider_readonly_unspecified-manual.html": [
- "3f30636e9d9a66c4b05c93f97cd07b5df1ae3ab3",
+ "07ea9b783b15a51be94553da194f6b6db024433f",
"manual"
],
"wai-aria/spinbutton_all_values_unspecified-manual.html": [
- "6c8b07b26d43d0758022ae98b7d0a4948f3774b2",
+ "729333014db5518140bb08f62975ab1c12a2f72b",
"manual"
],
"wai-aria/spinbutton_only_aria-valuenow_unspecified-manual.html": [
- "e37e9e695b4994d65e404736f615cc1ca3aa8e43",
+ "3730099c5a4509a410781c7f11ddac12f604a0dc",
"manual"
],
"wai-aria/spinbutton_readonly_false-manual.html": [
- "57ab040f5916928f561ca8aa670ced4759a1dd3b",
+ "44ee2f47d72e7f7df372f9841bd8049ab5696348",
"manual"
],
"wai-aria/spinbutton_readonly_true-manual.html": [
- "7a8fc228f516d5c9b66af0c927f8cc05430fd351",
+ "78cbceb43c560e143a91b658bd8f050d9ab79883",
"manual"
],
"wai-aria/spinbutton_readonly_unspecified-manual.html": [
- "a1a2fc5e6ad54304c05fb920dab84a49600f4076",
+ "902d7279671f0ff0e4b73513af163e79ab0448e2",
"manual"
],
"wai-aria/switch_checked_false-manual.html": [
- "fa15dea1f4b4bc7b1aac5035f732920326e97f8f",
+ "9ee1f6b66ff6e43d213a8c996cd93c31b294b8d0",
"manual"
],
"wai-aria/switch_checked_mixed-manual.html": [
- "d55ea8551ab16c8d6d0a1cfb1a8c0974c87204cc",
+ "e5b099f54de006e948a935b8d98d911377b7ff31",
"manual"
],
"wai-aria/switch_checked_true-manual.html": [
- "baf1617beea35eb2f42ed1597ce6393f2bf8efc0",
+ "3366919521e536e6f9d3b6489c6a51d95f45b3e5",
"manual"
],
"wai-aria/switch_checked_undefined-manual.html": [
- "c25629284a5acd599d91d9543a2a2eeee3a717de",
+ "5dfc172e54c67598ce4b0c0df1add788f9a99d5f",
"manual"
],
"wai-aria/switch_checked_value_changes-manual.html": [
- "4d74746193097d0a8967f1472c7e96bc122b8448",
+ "7f85dcd0690edb960ebd2b3adace2682ff614dd7",
"manual"
],
"wai-aria/switch_readonly_false-manual.html": [
- "577993a64256c0894c2ed28fdc50781ac27ce04f",
+ "76e454316863a8c989b0ee5b2ccab7320674f3eb",
"manual"
],
"wai-aria/switch_readonly_true-manual.html": [
- "efc96c374cf33423b49230ea5becfa6ac3d16262",
+ "3b54c61992fbdf640cd972a84a2ceb35be62ff17",
"manual"
],
"wai-aria/switch_readonly_unspecified-manual.html": [
- "816bafc802bced572c214c8ab425296ab84789f5",
+ "95e6d14c9306e80b4415e3518d6beba1f6eaa08c",
"manual"
],
"wai-aria/tab_posinset_and_setsize-manual.html": [
- "346e5c5270d1b1689fd05a6ecae6b7e756406478",
+ "442fb6861b70e2566f758a9385a473aa6c15981f",
"manual"
],
"wai-aria/table_colcount_-1-manual.html": [
- "cde4ff838a6a036be876272be42fb72fc8e1688e",
+ "9ed42e5dc32bdbedfe1852ffd7cbd66ac37df0bb",
"manual"
],
"wai-aria/table_colcount_8-manual.html": [
- "c09250107ec06f550f2e73c6949aacbfc21189fe",
+ "d5aaadf2fecad13b133beea57edcd9f28543df75",
"manual"
],
"wai-aria/table_rowcount_-1-manual.html": [
- "7a3c9f6b33607f42d5797e28baac33431c29161b",
+ "c96a3fb3b42852171d6f2bd8c49d34f287e90ed2",
"manual"
],
"wai-aria/table_rowcount_3-manual.html": [
- "400cb15cd7f415c87a2e46764b371c6194222c52",
+ "4bff8cd970877b57ddedcf1f71b40ded7dbd0a96",
"manual"
],
"wai-aria/tablist_orientation_horizontal-manual.html": [
- "3951505d891a1a30aa9419be6440b877f823e26f",
+ "8d28e4582bb14282f678d1864771ae454ca69891",
"manual"
],
"wai-aria/tablist_orientation_unspecified-manual.html": [
- "3f87b5f653114ff83de54c772302386ea8b5fa6c",
+ "214c8fdb2eb888844f762d62e3551448d822fa35",
"manual"
],
"wai-aria/tablist_orientation_vertical-manual.html": [
- "04b81f2596bca71ee915c0fea22f62c05735eb5f",
+ "273cf3ae78293cff630a04a90d7eac6aad2476a4",
"manual"
],
"wai-aria/term_role-manual.html": [
- "e30e255a9a38c567632d9ad4b6eae652a0c7fd70",
+ "d7b1c0188f53083cfebd2d87c79b632396325169",
"manual"
],
"wai-aria/textbox_placeholder-manual.html": [
- "e6e613dd04ab2be24fcfb3c04439e72694bbbe34",
+ "f9227242ec8f69d8380781be4be14c96f1a780af",
"manual"
],
"wai-aria/toolbar_orientation_horizontal-manual.html": [
- "e73f1accfe2a6f7363e7828a60eff9e6297727d9",
+ "9134ff1b2b7d54ffdad94c777bd764f457e7b7c3",
"manual"
],
"wai-aria/toolbar_orientation_unspecified-manual.html": [
- "55eef19b3b47b045d87d6a1d9766e9f0a275b055",
+ "415df0e6f4e3873ef988cef4fe398bd32f825743",
"manual"
],
"wai-aria/toolbar_orientation_vertical-manual.html": [
- "c4cae7a5ffd8e51778f8431684f8ee07a26fca06",
+ "53624df73eb9115bd3e57b8194d4bb23f8ce7d7a",
"manual"
],
"wai-aria/tools/convert_wiki.pl": [
@@ -619170,65 +627043,73 @@
"support"
],
"wai-aria/tools/make_tests.pl": [
- "0b85da0135983b2f69b881fab53d18b56c0033ff",
+ "8c51b77876da3ca0a00716caf4934ee9708a4d3a",
"support"
],
"wai-aria/tree_orientation_horizontal-manual.html": [
- "6b2563e7f29ca7aada9fa96988cccddd379cdaf3",
+ "95a3a84f9380386ad8b0050d8aa227fe9e584e39",
"manual"
],
"wai-aria/tree_orientation_unspecified-manual.html": [
- "8c7182ca1a52daaf36d450751332c30f51d5018b",
+ "9df862f7bc55d7d003b3607eae80b941e8f82d17",
"manual"
],
"wai-aria/tree_orientation_vertical-manual.html": [
- "b09f9d7c54c3717198553178df9679f7f6d1a889",
+ "9d43cbb3cd327485e5228b9fda834dacf08e31b3",
"manual"
],
"wai-aria/treegrid_colcount_8-manual.html": [
- "25447c872391678dd0a497ac4f3aabb88f283239",
+ "9022552296ca199d57141412c0ff0b147f8404ba",
"manual"
],
"wai-aria/treegrid_orientation_horizontal-manual.html": [
- "ec787bf61b415949f79dc0e3a4ff327ce326f9b0",
+ "6265daaff71fc45f8ca14b9b6f197a1d412e3d30",
"manual"
],
"wai-aria/treegrid_orientation_unspecified-manual.html": [
- "4314603f45287d36af965fc08c254b731e374d08",
+ "bdb06eadbb33032340bf43359196a9b8631e258e",
"manual"
],
"wai-aria/treegrid_orientation_vertical-manual.html": [
- "aac9062cd2beb489325d12929ce6271792b6e9a0",
+ "1c7923e0c408a40d2cbd42a5b29a1c56ffa19f48",
"manual"
],
"wai-aria/treegrid_rowcount_3-manual.html": [
- "94405aed60e8e66eb09d9a47c42b7cce7aee18ea",
+ "cd96f68e1a1b06d46023cae8dba0141d562b049e",
"manual"
],
"wai-aria/treeitem_selected_false-manual.html": [
- "5f47782f253083d694e574662be46b7f4cd0e042",
+ "325e783812c348e3b2797fbe3335057972bed6b0",
"manual"
],
"wai-aria/treeitem_selected_true-manual.html": [
- "91341d36056973a3e446a58798d8e5a6693d3403",
+ "cce5c060e2e7ad826dcce7996cf4496e48874085",
"manual"
],
"wai-aria/treeitem_selected_undefined-manual.html": [
- "8924f1b2deb4239056b8c008bf58baec675ef4df",
+ "d8a7dacf9e21a1f5b25b4f17f575270cf593abcb",
"manual"
],
"wai-aria/treeitem_selected_value_changes-manual.html": [
- "9cb6b12c4743d4a177ad44e62dae6e5ede3bdb78",
+ "e82b65811aa337b03cfe72d25215c29234b798dd",
"manual"
],
"wasm/compile_worker.js": [
"652193b876206d7a0f361f145469a604d03e3784",
"support"
],
+ "wasm/create_multiple_memory.worker.js": [
+ "893d408fc56d030416a3c89ae3680dc028ecf1d7",
+ "testharness"
+ ],
"wasm/incrementer.wasm": [
"acdf9d22c042ea3b2637c14b1576b4c8ffb4e97a",
"support"
],
+ "wasm/many-memories.window.js": [
+ "591b015662a6d181677892ec9c87f39bb36bbc23",
+ "testharness"
+ ],
"wasm/resources/blank.html": [
"0ddb4f1cf84729ed673295719ec58a3e5d600a12",
"support"
@@ -619273,8 +627154,8 @@
"d70aecce9f01ae39589bf339588d3a3002bed258",
"support"
],
- "wasm/wasm_service_worker_test.html": [
- "894981ab7cb20e72dd683c8063868311ea226838",
+ "wasm/wasm_service_worker_test.https.html": [
+ "254d9b7074c89c57e15613e6efe9674eba95b74d",
"testharness"
],
"web-animations/OWNERS": [
@@ -619302,25 +627183,13 @@
"testharness"
],
"web-animations/animation-model/animation-types/property-list.js": [
- "83a52204cc36f6b757129dae947f03f6a8748bde",
+ "6a1aafd6077aa656cfba4bba48f7ceca8344b810",
"support"
],
"web-animations/animation-model/animation-types/property-types.js": [
- "66c606f9451cc30ba6d23bcfffcb61871283b0b8",
+ "98c3bbc4e0403d289a053711ebba7a0029345282",
"support"
],
- "web-animations/animation-model/animation-types/spacing-keyframes-filters.html": [
- "bd771a8a18245560221d92ea3495f81918c09848",
- "testharness"
- ],
- "web-animations/animation-model/animation-types/spacing-keyframes-shapes.html": [
- "03c3ab6815cfa96c07d5f95b6059fb276c50a25f",
- "testharness"
- ],
- "web-animations/animation-model/animation-types/spacing-keyframes-transform.html": [
- "c1c5c2ea4580948d00502a048f3e562c61006ab9",
- "testharness"
- ],
"web-animations/animation-model/combining-effects/effect-composition.html": [
"8ac06085132d822e908d48de4c1109b66323f19f",
"testharness"
@@ -619341,8 +627210,8 @@
"b01c7c5145c183fdca80dec4ca1966b0f72a7003",
"testharness"
],
- "web-animations/animation-model/keyframe-effects/spacing-keyframes.html": [
- "318bc877791852b0829a3e10cb19e2a20a15adab",
+ "web-animations/interfaces/Animatable/animate-no-browsing-context.html": [
+ "3a5538db728127970721e20e3b2eaea59fac3afc",
"testharness"
],
"web-animations/interfaces/Animatable/animate.html": [
@@ -619458,7 +627327,7 @@
"testharness"
],
"web-animations/interfaces/AnimationTimeline/idlharness.html": [
- "d8c0e90499563d96ac9802632840f5333f61c8ac",
+ "80984bce09d54d4c57c4cea3a218b01467e43f9c",
"testharness"
],
"web-animations/interfaces/Document/getAnimations.html": [
@@ -619474,7 +627343,7 @@
"testharness"
],
"web-animations/interfaces/KeyframeEffect/constructor.html": [
- "1011b4146d1054ee6498cce1905230a10fdb9f96",
+ "2bc0a19e2ff3304dfea3286096db46821bca6c16",
"testharness"
],
"web-animations/interfaces/KeyframeEffect/copy-contructor.html": [
@@ -619486,11 +627355,11 @@
"testharness"
],
"web-animations/interfaces/KeyframeEffect/iterationComposite.html": [
- "5b7dbc28de885751ea952f4fecc2bd07cb3cea11",
+ "2ed50cdb27335345015d8b13c64ef86c67048757",
"testharness"
],
"web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html": [
- "6f561694e38420194fd1817ee965436348221d06",
+ "86ae5b18686e634743913adfcca9f1144b6902a4",
"testharness"
],
"web-animations/interfaces/KeyframeEffect/setKeyframes.html": [
@@ -619498,31 +627367,27 @@
"testharness"
],
"web-animations/interfaces/KeyframeEffect/setTarget.html": [
- "a8fe23e2645133e8fb29511d2d4df493a9928330",
- "testharness"
- ],
- "web-animations/interfaces/KeyframeEffect/spacing.html": [
- "2231741d51d2645b5ff97fc4ec6156d5bc6cd442",
+ "8c75e6605a134c96e261e5383414b7e15b32d121",
"testharness"
],
"web-animations/interfaces/KeyframeEffectReadOnly/copy-contructor.html": [
"8ef986f13e7fe7ffeb7403f647b4169ac0d6a138",
"testharness"
],
- "web-animations/interfaces/KeyframeEffectReadOnly/spacing.html": [
- "2eb6b663f4ec25284370d16042444c43edb80c02",
- "testharness"
- ],
"web-animations/resources/easing-tests.js": [
"5ef1183a4d3e12ad3edfe678c9fa002e7edce888",
"support"
],
"web-animations/resources/keyframe-utils.js": [
- "ff5700466b5af6ffaad824437d6566003a22e25b",
+ "2903e56e508f7034e1918b5688c8a605db9bae51",
+ "support"
+ ],
+ "web-animations/resources/xhr-doc.py": [
+ "de68c45fc1d38a49946f9046f34031e9278a1531",
"support"
],
"web-animations/testcommon.js": [
- "26d892976e935d0352ef1ede012435cc67be9f79",
+ "d057ad66c4561ef32f83770e4948f2019da89d48",
"support"
],
"web-animations/timing-model/animation-effects/active-time.html": [
@@ -619597,6 +627462,138 @@
"83c52be8280bba314116ff1337028ea7835ddf43",
"testharness"
],
+ "web-nfc/nfc_hw_disabled-manual.https.html": [
+ "0577a5faa4d00fa8962a9d17b1404bf3822d910d",
+ "manual"
+ ],
+ "web-nfc/nfc_insecure_context.html": [
+ "ca6795303e0d200904d47a1f80b7fc255c1d353b",
+ "testharness"
+ ],
+ "web-nfc/nfc_push.https.html": [
+ "ada53723b88641d04566f76f7af366f45ec783e9",
+ "testharness"
+ ],
+ "web-nfc/nfc_push_ArrayBuffer-manual.https.html": [
+ "79189e00a1d62f0e1f936d5ca687bb48522dd0bc",
+ "manual"
+ ],
+ "web-nfc/nfc_push_DOMString-manual.https.html": [
+ "f2656df15c0d0cf49eeb3645cf71bc1ab1c967c9",
+ "manual"
+ ],
+ "web-nfc/nfc_recordType_empty-manual.https.html": [
+ "e85ae0dbad98d4f842d3b9d8b4a6f36b8071e5d6",
+ "manual"
+ ],
+ "web-nfc/nfc_recordType_json-manual.https.html": [
+ "58a65c05bbb9ba434dffb5d4a4adf9575ee5eaf8",
+ "manual"
+ ],
+ "web-nfc/nfc_recordType_opaque-manual.https.html": [
+ "3dd5221c1532b10c6aeb1e2380da73977f59993f",
+ "manual"
+ ],
+ "web-nfc/nfc_recordType_text-manual.https.html": [
+ "287fb5e7659b0fe56e7747f8d0ecbeb461494b0d",
+ "manual"
+ ],
+ "web-nfc/nfc_recordType_url-manual.https.html": [
+ "efeacce32b87627d824131af5624d4f88f1f6045",
+ "manual"
+ ],
+ "web-nfc/nfc_watch.https.html": [
+ "3be1abdfa170bbdc9f6d8e5a6fa200886a148110",
+ "testharness"
+ ],
+ "web-nfc/resources/nfc_help.js": [
+ "d2236e6b3b25b34311325ca8548cf9e4e371693f",
+ "support"
+ ],
+ "web-share/OWNERS": [
+ "181c1272157cd564690976d357829e322174b493",
+ "support"
+ ],
+ "web-share/idlharness.https.html": [
+ "17e370aefd324ffac6a6f4b0211fbaecd1781ad4",
+ "testharness"
+ ],
+ "web-share/resources/manual-helper.js": [
+ "d3e545c3b6c0d10d904adc7595b9cb51de5ce9d2",
+ "support"
+ ],
+ "web-share/share-cancel-manual.html": [
+ "b4dcc0ac05c2a14907d55058f7d51190842fe0d3",
+ "manual"
+ ],
+ "web-share/share-empty.https.html": [
+ "aa25dc3fef3c62d9b128866a2c48df204bfaa548",
+ "testharness"
+ ],
+ "web-share/share-extra-argument-manual.html": [
+ "d0d2e67e49c16b874e5c5cbe4d1c6920b6b70a17",
+ "manual"
+ ],
+ "web-share/share-extra-field-manual.html": [
+ "78fd9fb76a1760402c74f64250e9b26790451ebc",
+ "manual"
+ ],
+ "web-share/share-non-string-manual.html": [
+ "32c960f32291cf120334f2099042b4c5d7caa56b",
+ "manual"
+ ],
+ "web-share/share-null-manual.html": [
+ "d2866b0401cecafdb590e2b6f57d0b934e32160a",
+ "manual"
+ ],
+ "web-share/share-securecontext.http.html": [
+ "6fd79e8f54c17f73406452e2a79c6eb3a45b4e41",
+ "testharness"
+ ],
+ "web-share/share-simple-manual.html": [
+ "cfdd2d3d767a8bbfb888291cdd274852baca7093",
+ "manual"
+ ],
+ "web-share/share-unicode-strings-manual.html": [
+ "bf6dcec872839af760c0a679eb503d36f0b3bb48",
+ "manual"
+ ],
+ "web-share/share-unicode-strings-nonutf8-manual.html": [
+ "905b702262f0ace4e6e9958d67b18a1f71f691c6",
+ "manual"
+ ],
+ "web-share/share-url-data-manual.html": [
+ "da8db7178175e818ab285c5efeb529e397ae42a8",
+ "manual"
+ ],
+ "web-share/share-url-empty-manual.html": [
+ "7f45e7a4c7b2da28e292cde168623f53311893ae",
+ "manual"
+ ],
+ "web-share/share-url-encoding-manual.html": [
+ "6c8790abb9dea90bff649ad9716c5eadf3fd9032",
+ "manual"
+ ],
+ "web-share/share-url-invalid.https.html": [
+ "965504e6db948e198ce01448af04c5d9a3ba26f9",
+ "testharness"
+ ],
+ "web-share/share-url-noscheme-manual.html": [
+ "d6457b424901d125a7aac579c3b1e2b4f9c8c851",
+ "manual"
+ ],
+ "web-share/share-url-pathonly-manual.html": [
+ "cbdedbd4265fd27194f4d938c0c7462a707f241f",
+ "manual"
+ ],
+ "web-share/share-url-relative-manual.html": [
+ "41dd5d1a50c21f9e77c6832b56195561ee29106f",
+ "manual"
+ ],
+ "web-share/share-without-user-gesture.https.html": [
+ "d883b2469759722cf76c4624a1a81908c9aa5ae0",
+ "testharness"
+ ],
"webaudio/.gitignore": [
"11bc81247643b0a9fc665f1e4b1f592cc1f4c670",
"support"
@@ -619609,22 +627606,22 @@
"230684ec60fd2e408f9b6014417f3eddfe2dc95a",
"support"
],
+ "webaudio/historical.html": [
+ "93068df297042344669093ce899f0230c87ebf54",
+ "testharness"
+ ],
"webaudio/js/buffer-loader.js": [
"4d564eae0b3d7d1045626d1f144cd2638dba64e5",
"support"
],
"webaudio/js/helpers.js": [
- "c8f3fa9e30a721973bc63f329cc0654ac52592c3",
+ "c5d44cf8101c50b59c366ed1971205193f32e1bf",
"support"
],
"webaudio/js/lodash.js": [
"58c3eae918fedad54c56d488a14f99ce87943500",
"support"
],
- "webaudio/js/vendor-prefixes.js": [
- "3b7d06164273077415b7fc99652355bcf0e10e17",
- "support"
- ],
"webaudio/refresh_idl.rb": [
"9ef52c13448d19b241b40a5c81f4a0480c05c5de",
"support"
@@ -619646,7 +627643,7 @@
"support"
],
"webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html": [
- "11ec68dec57c960cea256c28237715866c58ac84",
+ "a799ad9a51801a67a82159e9a16b639ad0c50226",
"testharness"
],
"webaudio/the-audio-api/the-audiobuffersourcenode-interface/.gitkeep": [
@@ -619662,7 +627659,7 @@
"support"
],
"webaudio/the-audio-api/the-audiodestinationnode-interface/idl-test.html": [
- "74770d22caf02df7fb3cd3fb1e7499436e69cbed",
+ "215cd494eca448981b5f0a4dc931d7ece9a33b80",
"testharness"
],
"webaudio/the-audio-api/the-audiolistener-interface/.gitkeep": [
@@ -619682,7 +627679,7 @@
"support"
],
"webaudio/the-audio-api/the-audioparam-interface/idl-test.html": [
- "c1680330a6224285ad9bc9d6a6b046b75a860101",
+ "a1bba8cf32a40cefdc3cd27bb4cd33ab2ddb72db",
"testharness"
],
"webaudio/the-audio-api/the-audioparam-interface/retrospective-exponentialRampToValueAtTime.html": [
@@ -619742,7 +627739,7 @@
"support"
],
"webaudio/the-audio-api/the-delaynode-interface/idl-test.html": [
- "55a67c98908e18856e55c2e9437b63e8dc6feb94",
+ "2721b0ff902b22214a2c1cecd0b7978d520efad2",
"testharness"
],
"webaudio/the-audio-api/the-dynamicscompressornode-interface/.gitkeep": [
@@ -619758,11 +627755,11 @@
"support"
],
"webaudio/the-audio-api/the-gainnode-interface/idl-test.html": [
- "35c753a641939795d00ec7ce1a55bfc74324a075",
+ "7d3e3335d8b7fe23faec74788b402c8383da53b8",
"testharness"
],
"webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html": [
- "0933aa32383aa561af5956a1e21f1c2b6890942b",
+ "32f1b481b638364f2a33fbbf2b63e529f9ead61c",
"testharness"
],
"webaudio/the-audio-api/the-iirfilternode-interface/test-iirfilternode.html": [
@@ -619774,7 +627771,7 @@
"support"
],
"webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html": [
- "ad08dea6c04f20892a7bc3404b7ca0abdabdebce",
+ "a394f084e22f4b27b695b3b5b14352053b5e25e4",
"testharness"
],
"webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/.gitkeep": [
@@ -619818,7 +627815,7 @@
"support"
],
"webaudio/the-audio-api/the-waveshapernode-interface/curve-tests.html": [
- "cc9f8148b1e7d75a61599a094f9ed21377e97edb",
+ "f88431616d6a8084a3434c1606e3543178d019fb",
"testharness"
],
"webauthn/OWNERS": [
@@ -619850,101 +627847,241 @@
"testharness"
],
"webdriver/OWNERS": [
- "cbfd094d14a2be6678df83a7bcd8b022922396dd",
+ "4986cd1bfa1e4c8e5c836581871745b5b2cc440e",
"support"
],
"webdriver/README.md": [
- "a4611303723fa7225d7667a1e4fe2495451b824f",
+ "185acb69e9516e0564e16bf7d7f8dc2a4c48d3c7",
"support"
],
- "webdriver/actions/__init__.py": [
+ "webdriver/elements/active.py": [
+ "9080770b60a988cb37e30700efb118d392a896c7",
+ "wdspec"
+ ],
+ "webdriver/interface/interface.html": [
+ "ff6f1ffa851eed97a5a2ba4e247058bc3982111e",
+ "testharness"
+ ],
+ "webdriver/tests/__init__.py": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
- "webdriver/actions/conftest.py": [
- "78b6434a88021b7f56e5a7bf3e858fc9558a7c19",
+ "webdriver/tests/actions/__init__.py": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "webdriver/tests/actions/conftest.py": [
+ "ebdbe326fd2fc53a3522b846505808496407b5b8",
"wdspec"
],
- "webdriver/actions/key.py": [
- "918bcadf034657dfcb679fd92c8a11efe34bfedf",
+ "webdriver/tests/actions/key.py": [
+ "69542dc107d881bf18dfff3203bfd7a9ec31b4ad",
"wdspec"
],
- "webdriver/actions/mouse.py": [
- "823e2b1e5ba200487d0598eecbb051f73b5ea69f",
+ "webdriver/tests/actions/mouse.py": [
+ "d7af66e45c8e306b4258b92c54ed86073fd21c8d",
"wdspec"
],
- "webdriver/actions/sequence.py": [
- "d80f382863e52ff223db735a2a551197e570774f",
+ "webdriver/tests/actions/sequence.py": [
+ "4244635ccbab0920eba8a2fa88645fa7333df363",
"wdspec"
],
- "webdriver/actions/special_keys.py": [
- "b2d6c2fa8852c6299b6bd214f67007efebe3029a",
+ "webdriver/tests/actions/special_keys.py": [
+ "3b10143dea60567f30b4ab6c544e005d02f31fc3",
"wdspec"
],
- "webdriver/actions/support/__init__.py": [
+ "webdriver/tests/actions/support/__init__.py": [
"da39a3ee5e6b4b0d3255bfef95601890afd80709",
"support"
],
- "webdriver/actions/support/keys.py": [
+ "webdriver/tests/actions/support/keys.py": [
"636991372c21e52b623ed4ada9dfb675dd7f7e14",
"support"
],
- "webdriver/actions/support/refine.py": [
+ "webdriver/tests/actions/support/refine.py": [
"0d244bffe67ef57be68aad99f1cbc7440ff80e27",
"support"
],
- "webdriver/actions/support/test_actions_wdspec.html": [
- "c56cc117512bf9a5b6378dcead8e2640493d23a4",
+ "webdriver/tests/actions/support/test_actions_wdspec.html": [
+ "94b6f474bb4417cf2c06cb5fc6042c01bde98aa2",
"support"
],
- "webdriver/conftest.py": [
- "9d8720123b3b9a6a76d45fe4462965fb32af7158",
+ "webdriver/tests/conftest.py": [
+ "ab95734024a8e152ed84128eb804344740be91d4",
"wdspec"
],
- "webdriver/contexts.py": [
- "23308285354163ead68a2e56042ec6703c25620c",
+ "webdriver/tests/contexts/maximize_window.py": [
+ "904dd1db0e9731148a1793065b1d38acf0ac094b",
"wdspec"
],
- "webdriver/elements/active.py": [
- "40ac5fcc5db4d489a802f58bb03dfc78563eafa0",
+ "webdriver/tests/contexts/resizing_and_positioning.py": [
+ "479379109115668183643e8a050396219332887d",
+ "wdspec"
+ ],
+ "webdriver/tests/cookies/cookies.py": [
+ "e31177e638269864031e44808945fa1e7c46031c",
+ "wdspec"
+ ],
+ "webdriver/tests/element_click/__init__.py": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "webdriver/tests/element_click/select.py": [
+ "5ba51b660c7203bba3ada597c2f56fe094358e1f",
+ "wdspec"
+ ],
+ "webdriver/tests/fullscreen_window.py": [
+ "6b1e481aac6856b6e858df17731d037997b99f83",
"wdspec"
],
- "webdriver/get_title.py": [
- "7cfc8b7302442c585429094db89c12a042dc9fd2",
+ "webdriver/tests/get_window_rect.py": [
+ "0dc9c8cc1332907be819d52feb7c94f4b1cc928a",
"wdspec"
],
- "webdriver/interface.html": [
+ "webdriver/tests/interaction/send_keys_content_editable.py": [
+ "130c57e80a0738ed500f59b0178753f8acaf15bf",
+ "wdspec"
+ ],
+ "webdriver/tests/interface.html": [
"d783d0dd370f58b264ef238d8da5cd8601dc3c7f",
"testharness"
],
- "webdriver/navigation.py": [
- "dd2f52a3a77497ce8785e698f9ab462390ed0d57",
+ "webdriver/tests/minimize_window.py": [
+ "e0950b165c0cbf76e8adcd865176ea164a1ea768",
+ "wdspec"
+ ],
+ "webdriver/tests/navigation/current_url.py": [
+ "cec2987258d9c807a247da9e0216b3af1f171484",
+ "wdspec"
+ ],
+ "webdriver/tests/navigation/get_title.py": [
+ "11c84957a3177acbbf34597bc0defb3f77c5744c",
+ "wdspec"
+ ],
+ "webdriver/tests/retrieval/__init__.py": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "webdriver/tests/retrieval/find_element.py": [
+ "a2d29c9c8dd5303d196d0682a19f3f3560b35872",
+ "wdspec"
+ ],
+ "webdriver/tests/retrieval/find_element_from_element.py": [
+ "78d5e503bf979307f313b72f7578c55264c6e207",
+ "wdspec"
+ ],
+ "webdriver/tests/retrieval/find_element_from_elements.py": [
+ "0be0eb0bd904fa8f7e5332d43cef2b36dae1a579",
+ "wdspec"
+ ],
+ "webdriver/tests/retrieval/find_elements.py": [
+ "7df448c94c89bdb9f6818a69a9d52b21faa4b944",
+ "wdspec"
+ ],
+ "webdriver/tests/sessions/get_timeouts.py": [
+ "eaee354d16aa8c3a0fc960198fa4c5d9365bdee5",
+ "wdspec"
+ ],
+ "webdriver/tests/sessions/new_session/conftest.py": [
+ "d2df38e506cb9a3e501f03fe03e2a31af42d6f04",
+ "wdspec"
+ ],
+ "webdriver/tests/sessions/new_session/create.py": [
+ "f47ffcbaf22af9f445e4202ebeaa03bb9415fbc9",
+ "wdspec"
+ ],
+ "webdriver/tests/sessions/new_session/default_values.py": [
+ "d0802053ea0e1c81304b985821c743727b5222ec",
+ "wdspec"
+ ],
+ "webdriver/tests/sessions/new_session/invalid_capabilities.py": [
+ "20e143186f39022c0a8cf6218b08a2fe22f96153",
+ "wdspec"
+ ],
+ "webdriver/tests/sessions/new_session/merge.py": [
+ "e58b671da735c6040248c80a3384760ee4496c88",
+ "wdspec"
+ ],
+ "webdriver/tests/sessions/new_session/response.py": [
+ "3eca8e1d571b0c94b2a08fccfbe8cb9f1b1ba6d5",
+ "wdspec"
+ ],
+ "webdriver/tests/set_window_rect.py": [
+ "e84559c2ee94009fe808c3008c58e6e4b9ca27aa",
+ "wdspec"
+ ],
+ "webdriver/tests/state/__init__.py": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "webdriver/tests/state/get_element_attribute.py": [
+ "1e25aaf5c3ab4c24130566d7823830a11a86393d",
+ "wdspec"
+ ],
+ "webdriver/tests/state/get_element_property.py": [
+ "2d4e145cd55c6ee0ed69c617c77975e295e56119",
+ "wdspec"
+ ],
+ "webdriver/tests/state/get_element_tag_name.py": [
+ "ed23abfb5a1e9d3afdf168c722e7b64827c176ec",
+ "wdspec"
+ ],
+ "webdriver/tests/state/is_element_selected.py": [
+ "77b93dd58e0fb4f504c94bc39013d6ada59126bc",
+ "wdspec"
+ ],
+ "webdriver/tests/state/text/__init__.py": [
+ "da39a3ee5e6b4b0d3255bfef95601890afd80709",
+ "support"
+ ],
+ "webdriver/tests/state/text/get_text.py": [
+ "570274d59020c4d8d0b8ecd604660ee7d710a165",
"wdspec"
],
- "webdriver/support/__init__.py": [
+ "webdriver/tests/status.py": [
+ "5d3ae3da2967072dff274f384cceaecc07b6aa4b",
+ "wdspec"
+ ],
+ "webdriver/tests/support/__init__.py": [
"5a31a3917a5157516c10951a3b3d5ffb43b992d9",
"support"
],
- "webdriver/support/asserts.py": [
- "cf1d298a9dc61b07eb9efe1ff3ed98a318d48bc4",
+ "webdriver/tests/support/asserts.py": [
+ "b02f45e99cdee49f12608e60333e566c8c0e04d0",
"support"
],
- "webdriver/support/fixtures.py": [
- "3820de38416455a7fc3c351dadfa761bacd9901d",
+ "webdriver/tests/support/fixtures.py": [
+ "ed33ffdd2084ba3c65d82ff7ce7996d45ba98ce5",
"support"
],
- "webdriver/support/http_request.py": [
- "01c4b525c27f77d253c75031a9cee3f17aca8df0",
+ "webdriver/tests/support/http_request.py": [
+ "cb40c781fea2280b98135522def5e6a116d7b946",
"support"
],
- "webdriver/support/inline.py": [
- "bc85126e5637145e81f27d037f3a9090747130c8",
+ "webdriver/tests/support/inline.py": [
+ "d05c1b209ab1b8c22ab542d0418340896bc844fb",
"support"
],
- "webdriver/support/merge_dictionaries.py": [
+ "webdriver/tests/support/merge_dictionaries.py": [
"84a6d3c6f8f4afded0f21264bbaeebec38a7f827",
"support"
],
+ "webdriver/tests/support/wait.py": [
+ "a4b0c9c340ea7055139d9fcab3246ee836d6a441",
+ "support"
+ ],
+ "webdriver/tests/user_prompts/accept_alert.py": [
+ "30aa726664c6228dd5901bef862d3d55b3474e41",
+ "wdspec"
+ ],
+ "webdriver/tests/user_prompts/dismiss_alert.py": [
+ "bf75a630194dee1d619cb2818d71f9fb06a5dbbc",
+ "wdspec"
+ ],
+ "webdriver/tests/user_prompts/get_alert_text.py": [
+ "2eabe61f38757fd377e9773b7697a9a1ed21ceb6",
+ "wdspec"
+ ],
"webgl/OWNERS": [
"f8e0703fe2cc88edd21ef2c94fcb2e1a8889f5ae",
"support"
@@ -629342,7 +637479,7 @@
"testharness"
],
"webmessaging/Channel_postMessage_ports_readonly_array.htm": [
- "9483112ff0962b068d69758f959627a9c9d299c5",
+ "2e23f79e2997ffa88b88651be6f2c355574f5de2",
"testharness"
],
"webmessaging/Channel_postMessage_target_source.htm": [
@@ -629766,11 +637903,47 @@
"support"
],
"webrtc/RTCCertificate.html": [
- "76e0c5f601c8ba4aefb06d1ebab8454c78fe07df",
+ "6580d666a55637ff5847c0f6f1a701d2db75b749",
"testharness"
],
+ "webrtc/RTCConfiguration-bundlePolicy.html": [
+ "2ae7780f86084baf6478bf92a8440cf142fe8611",
+ "testharness"
+ ],
+ "webrtc/RTCConfiguration-helper.js": [
+ "eb27b6312d0a3e6f0c6af7d366fc1172aeacea99",
+ "support"
+ ],
"webrtc/RTCConfiguration-iceCandidatePoolSize.html": [
- "7816790d82628acb7cf04e0a046046884c1207e7",
+ "6b55bd01a1422f2315cae765a7d539bf81151c1f",
+ "testharness"
+ ],
+ "webrtc/RTCConfiguration-iceServers.html": [
+ "2dbc12945221f64684a46311f9ebe23f69ea247e",
+ "testharness"
+ ],
+ "webrtc/RTCConfiguration-iceTransportPolicy.html": [
+ "f95cceffe7485aac7b53d3f891ad87d50ccc8b1d",
+ "testharness"
+ ],
+ "webrtc/RTCConfiguration-rtcpMuxPolicy.html": [
+ "a9beda60053916185106aedac98014123d6f7105",
+ "testharness"
+ ],
+ "webrtc/RTCDTMFSender-helper.js": [
+ "54456b1c74d55552fdad0405f55dcd728205b561",
+ "support"
+ ],
+ "webrtc/RTCDTMFSender-insertDTMF.https.html": [
+ "50ef787a77512dc7eea7731b9766fda4d1456694",
+ "testharness"
+ ],
+ "webrtc/RTCDTMFSender-ontonechange-long.https.html": [
+ "d89602fd655bf032cadfc538291ccea858eb2446",
+ "testharness"
+ ],
+ "webrtc/RTCDTMFSender-ontonechange.https.html": [
+ "5d81b305d0b46f158e1533ffea648ae61f09c58a",
"testharness"
],
"webrtc/RTCDataChannel-bufferedAmount.html": [
@@ -629789,16 +637962,28 @@
"8a8b30a23abddb5d11a802fead534fd56aacbb62",
"testharness"
],
+ "webrtc/RTCDtlsTransport-getRemoteCertificates.html": [
+ "76eb9e89291ce2aa8fa81dd7216a853193abd6e2",
+ "testharness"
+ ],
"webrtc/RTCIceCandidate-constructor.html": [
"6938c88a0167e418aa9e93416865c857cc3489c5",
"testharness"
],
+ "webrtc/RTCIceTransport.html": [
+ "c145a8a34c79dd970475e77ff5bf1a363c0ac56c",
+ "testharness"
+ ],
"webrtc/RTCPeerConnection-addIceCandidate.html": [
- "6ca52e2e6ec19dc38a7cc0a4ce132f7c5de9e398",
+ "dd19f1d7a8d12ee85101e53bb30c553e94d67b6a",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-addTrack.https.html": [
+ "c434d2cdcb134f28b203df07cecca04e11195700",
"testharness"
],
"webrtc/RTCPeerConnection-addTransceiver.html": [
- "0ce85d1a83181d1bd0f337c7dbb5443efbda32cd",
+ "d4f7108629c221c95fcaafa554ecd820c27a6922",
"testharness"
],
"webrtc/RTCPeerConnection-canTrickleIceCandidates.html": [
@@ -629810,31 +637995,43 @@
"testharness"
],
"webrtc/RTCPeerConnection-constructor.html": [
- "60e9ec4bec3e3d3b785568be8cf089c959e71813",
+ "2152cb1835b1afe939504e934a7f19d30b17ba3d",
"testharness"
],
"webrtc/RTCPeerConnection-createAnswer.html": [
- "3aa68d867967e466b493a4f6cf27ba4f5839af88",
+ "d70701dac44c536f793b124c0b1f86e7a08b2fd5",
"testharness"
],
"webrtc/RTCPeerConnection-createDataChannel.html": [
- "47e58b26cf295fa1a0559ac7de7d1f119cb05106",
+ "0e2c9ab2b4900aa7955d75f867bb5958c7c70ce3",
"testharness"
],
"webrtc/RTCPeerConnection-createOffer.html": [
- "07b9d476471b20d827a09a0c8b79a36e48d986b0",
+ "5b3d38072afd9bbb3e95925c3959ff3f4268a347",
"testharness"
],
"webrtc/RTCPeerConnection-generateCertificate.html": [
"27fb46922255203da0fc26a63808aeb98a60b640",
"testharness"
],
+ "webrtc/RTCPeerConnection-getDefaultIceServers.html": [
+ "208bb45887440df3bf1e45dd63f09d2d5b70857d",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-getIdentityAssertion.html": [
+ "14467ef5431d17e7c6d37d78919c363cd5c98c6f",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-getStats.https.html": [
+ "1fc0c03ebd989d77c9d721b027a12a0cbbf24d53",
+ "testharness"
+ ],
"webrtc/RTCPeerConnection-getTransceivers.html": [
- "498e9cb9d143626fb78839c1c550d05e9a46c22f",
+ "b4c97af4f907a3d02fe1ebd24f00ab110b387575",
"testharness"
],
"webrtc/RTCPeerConnection-helper.js": [
- "fbfee08e2b8c5f031780b5efd1139cfe310c89fb",
+ "e3b2656366be168b5f2e3cde9461a4e69a51c9ef",
"support"
],
"webrtc/RTCPeerConnection-iceConnectionState.html": [
@@ -629854,33 +638051,169 @@
"testharness"
],
"webrtc/RTCPeerConnection-onnegotiationneeded.html": [
- "e74e16479aca577be6673056eef0fd0212ec7151",
+ "ca1cbd230de7aec4844879ae43f822941f566620",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-ontrack.https.html": [
+ "3db4d8b29f4e1372055a50a279cae525f52cbb40",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-peerIdentity.html": [
+ "2e6808671da699ad3a61f7ebd766b92686ddb17c",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-removeTrack.https.html": [
+ "561575bea206ec1c9572e1e5e6f97d1e0bebe2d1",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-setDescription-transceiver.html": [
+ "aab677c9196488544b30c7eecd180c3046290bb2",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-setLocalDescription-answer.html": [
+ "e215aa042c67a23ae776b83d662a035a22e03810",
"testharness"
],
- "webrtc/RTCPeerConnection-removeTrack.html": [
- "6e0b10df88f69f33ff9aac63975cfea2561f28a0",
+ "webrtc/RTCPeerConnection-setLocalDescription-offer.html": [
+ "9f30ee4801fbcd574d90c3f15a733c448f148649",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-setLocalDescription-pranswer.html": [
+ "9653d2176c51b638b0c03dec363d2a2fb8386281",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-setLocalDescription-rollback.html": [
+ "293081a9ebd031cc4919a01ec323630394d401a8",
"testharness"
],
"webrtc/RTCPeerConnection-setLocalDescription.html": [
- "3a182c851b4724e34e0baaacb9f0670e741c0e49",
+ "b4cac26716f01ff80c902d3536dc0d2de6d85388",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-setRemoteDescription-answer.html": [
+ "3f85858a7afe6a5346b2d47f5505d25caef2668b",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-setRemoteDescription-offer.html": [
+ "ce5345bbaf5b5230b1fd53bbb55ab4439c3eb979",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html": [
+ "6ddea8760cbacc775ee99aa700fd71883cfb9bd7",
+ "testharness"
+ ],
+ "webrtc/RTCPeerConnection-setRemoteDescription-rollback.html": [
+ "6142a9b3b95bb26634af5300bc24981f2b4cb2a4",
"testharness"
],
"webrtc/RTCPeerConnection-setRemoteDescription.html": [
- "b3e0010a4e7a17a881c4d4a2dfc010cfad98a79a",
+ "2a2e3f9ff0a5912fa260d7124f7f5a9c3862c533",
"testharness"
],
"webrtc/RTCPeerConnectionIceEvent-constructor.html": [
"f273bd7fdfc883a15e8fb16fef5309061254c6cc",
"testharness"
],
+ "webrtc/RTCRtpCapabilities-helper.js": [
+ "f66e7842a8b761612e40ef1a825357d9e21d5af5",
+ "support"
+ ],
+ "webrtc/RTCRtpParameters-codecs.html": [
+ "b9ba3d410e50400b7f8a41956439c4e19b14daf0",
+ "testharness"
+ ],
+ "webrtc/RTCRtpParameters-degradationPreference.html": [
+ "8f03fb8300b92360e907f567d35660dec84d6343",
+ "testharness"
+ ],
+ "webrtc/RTCRtpParameters-encodings.html": [
+ "e7ff72c2ef0066bc05842ebbb3c991bc9320c102",
+ "testharness"
+ ],
+ "webrtc/RTCRtpParameters-headerExtensions.html": [
+ "8bc6b13b74eb1026240822672b0267381a7b984a",
+ "testharness"
+ ],
+ "webrtc/RTCRtpParameters-helper.js": [
+ "fcf16b5ae297d141b48003115905aa5bf28eab32",
+ "support"
+ ],
+ "webrtc/RTCRtpParameters-rtcp.html": [
+ "275b24f5688c7eeca316afa3fccda8533e1e0eda",
+ "testharness"
+ ],
+ "webrtc/RTCRtpParameters-transactionId.html": [
+ "7d94448a9767caafd0f0b341b4d61e0c586942ed",
+ "testharness"
+ ],
+ "webrtc/RTCRtpReceiver-getCapabilities.html": [
+ "9eef967677aa2f0880f5114e7831437f931f2256",
+ "testharness"
+ ],
+ "webrtc/RTCRtpReceiver-getContributingSources.https.html": [
+ "a81980a24e23e9c5c350d65be05bae97b3ef1e6d",
+ "testharness"
+ ],
+ "webrtc/RTCRtpReceiver-getParameters.html": [
+ "ed910cbe15534cae43b79cc008395bd62fbd0637",
+ "testharness"
+ ],
+ "webrtc/RTCRtpReceiver-getStats.html": [
+ "f00accac88efd9108078b0a3d72751a44f108864",
+ "testharness"
+ ],
+ "webrtc/RTCRtpReceiver-getSynchronizationSources.https.html": [
+ "56d0157f4ce987436c12ddff886b74549abbe682",
+ "testharness"
+ ],
+ "webrtc/RTCRtpSender-getCapabilities.html": [
+ "27f083617973770f0d42efb93813f0112fc68ad2",
+ "testharness"
+ ],
+ "webrtc/RTCRtpSender-getStats.html": [
+ "9a95fe0a2bd44fda187b586303a95dd5eb7db0cf",
+ "testharness"
+ ],
"webrtc/RTCRtpSender-replaceTrack.html": [
- "9e8eca4fa11cc72471bc48d98bec8e5936111334",
+ "f7b8caa578c9c818e8ca11777daf664ccb9457ec",
+ "testharness"
+ ],
+ "webrtc/RTCRtpSender-setParameters.html": [
+ "615bd9591e0f9c873827c9ae8e787b12d2efaf0f",
+ "testharness"
+ ],
+ "webrtc/RTCRtpTransceiver-setCodecPreferences.html": [
+ "ff8d04f3c6b2e18ea085233b5c98e8172eeca527",
+ "testharness"
+ ],
+ "webrtc/RTCRtpTransceiver-setDirection.html": [
+ "539eaba516eef7419c5e543d7218a41f850f5e7b",
"testharness"
],
"webrtc/RTCSctpTransport-constructor.html": [
- "3b975dbe89ea36a78df48510bf1db5d06628db0f",
+ "b92f3acf5113a475b58892f48406aafc9634be07",
"testharness"
],
+ "webrtc/RTCStats-helper.js": [
+ "8fa8b228d3b6ee861c843a5f6b7aa2a1c8260763",
+ "support"
+ ],
+ "webrtc/RTCTrackEvent-constructor.html": [
+ "a73dde79625035cdd40d5abd8856cd44161dfdf9",
+ "testharness"
+ ],
+ "webrtc/coverage/RTCDTMFSender.txt": [
+ "d431a4f13bf10935ce7dd086feba7ed7ffd2cccc",
+ "support"
+ ],
+ "webrtc/coverage/identity.txt": [
+ "42dc017bac018a25b283741ca2feaf97aead88d8",
+ "support"
+ ],
+ "webrtc/coverage/set-session-description.txt": [
+ "a688c54f0b53050794c968ba3d37bd25621fc0e3",
+ "support"
+ ],
"webrtc/datachannel-emptystring.html": [
"56a37968e489d6ee39a1234ca888dd628f17648e",
"testharness"
@@ -629889,12 +638222,24 @@
"a1753a9a537a626775194ccc5dfdbf6829c5df35",
"testharness"
],
+ "webrtc/dictionary-helper.js": [
+ "9a43fcdfda7da1c281cbb221d1c463d1e280ee3a",
+ "support"
+ ],
"webrtc/getstats.html": [
"6656998d4adfab0e6ca51c98cd141cf162d3879c",
"testharness"
],
+ "webrtc/historical.html": [
+ "918bdc69f500ff726dc98643b418f14ac5ba3c3a",
+ "testharness"
+ ],
+ "webrtc/identity-helper.js": [
+ "c7639c627cceaad0e122d83ccde429d044c0773d",
+ "support"
+ ],
"webrtc/interfaces.html": [
- "bd71316e6efddce47bb4cf3218b3133f8c69c3db",
+ "efd0c4a62b9c90f27da1188c30e4503755e7f8d2",
"testharness"
],
"webrtc/no-media-call.html": [
@@ -629906,7 +638251,7 @@
"testharness"
],
"webrtc/simplecall.html": [
- "ce76df05d5866807a4b58c9509ce66efcddaf3d7",
+ "6194af79f137d59334da2193cc6f24b9458344be",
"testharness"
],
"websockets/Close-1000-reason.htm": [
@@ -630018,7 +638363,7 @@
"testharness"
],
"websockets/OWNERS": [
- "891fabbcf4359695999272da171ad3177d5f3e7e",
+ "10f99e83578e8082173bb1da68f7fb6f1c371d58",
"support"
],
"websockets/README.md": [
@@ -630286,11 +638631,11 @@
"testharness"
],
"websockets/constructor/010.html": [
- "c0c6f54f8c9290e6fbf8a1ddf22e6a1362ef586d",
+ "bac5f0dca1508252e49dcf61ca3f095664bfaf89",
"testharness"
],
"websockets/constructor/011.html": [
- "60f0ca813c13a6003a3f376ffbddd38a8a7a6f98",
+ "47314c9d8762f552694791286e2607bab72ec39d",
"testharness"
],
"websockets/constructor/012.html": [
@@ -630802,19 +639147,27 @@
"support"
],
"websockets/unload-a-document/001-1.html": [
- "5388c58ec7f586a8c79da8955ea25ff0350a08ff",
+ "89f76dff719f15fce07b674aa4bcc971610da686",
+ "support"
+ ],
+ "websockets/unload-a-document/001-2.html": [
+ "facbeee79f931d0ba88163abac18b38bff94f260",
"support"
],
"websockets/unload-a-document/001.html": [
- "bcfd6cdc6b9dc497c3828fe0a77f1db3676be495",
+ "f78f6bc059375d19b8ac2619fba93b12e5506132",
"testharness"
],
"websockets/unload-a-document/002-1.html": [
- "284ca768f294b0716ada9f2936f3862e075388c2",
+ "353ee429f9d6e90d86f0de251f7ad86f436ad4e2",
+ "support"
+ ],
+ "websockets/unload-a-document/002-2.html": [
+ "e689149429d1e29775d7c7f6f5ad6afdde0a1b39",
"support"
],
"websockets/unload-a-document/002.html": [
- "f39414dbf15f502f6be82324bbf389e75532cb6b",
+ "aaf934be13d0c9df63a1ff5da6d90cb290855b11",
"testharness"
],
"websockets/unload-a-document/003.html": [
@@ -631005,6 +639358,10 @@
"56b3c331a13ef832f9aa1721839516bf96e0eda8",
"support"
],
+ "webstorage/resources/storage_session_window_noopener_second.html": [
+ "56743e7c12f266463dface58439ab5f2a644a802",
+ "support"
+ ],
"webstorage/resources/storage_session_window_open_second.html": [
"828dee748950bef2094afc43b0f9db8c3a655acb",
"support"
@@ -631018,7 +639375,7 @@
"testharness"
],
"webstorage/storage_enumerate.html": [
- "6d7c52b7b8fef7b6e987d4fade5fb1271266c6bb",
+ "32dbada8253834d01404e5fc9d69fbc06c8d4dec",
"testharness"
],
"webstorage/storage_functions_not_overwritten.html": [
@@ -631073,6 +639430,10 @@
"16420690823c36d08a83656746a0f05324602036",
"testharness"
],
+ "webstorage/storage_session_window_noopener.html": [
+ "386af726f84fac19f96d64420c53927cd548f88b",
+ "testharness"
+ ],
"webstorage/storage_session_window_open.html": [
"86f5002f1c0e22234928673465cc4317b6d599f5",
"testharness"
@@ -631097,52 +639458,136 @@
"e455416b72ce1b90a3b82b3fb44c57fba19f29df",
"support"
],
+ "webusb/README.md": [
+ "34eaa588ed78672070782cb556939ea711a18caf",
+ "support"
+ ],
"webusb/idlharness.https.html": [
- "e402105766a837cd26f6d020663ec4b50b757f86",
+ "135ae431cdac90d34b85fe1ea355abaf9a9fb732",
"testharness"
],
- "webusb/resources/check-availability.html": [
- "0c6ef6ab90dab93dde9577cdf1751c3df1e8e52a",
+ "webusb/resources/fake-devices.js": [
+ "2cfce7b35b9441529946c4bcea9427e261808c36",
"support"
],
- "webusb/resources/featurepolicytest.js": [
- "a28b28b34371aaae8af41e4ba562fa98cfdf1f12",
+ "webusb/resources/open-in-iframe.html": [
+ "6e6050f742e0da58fc94a5c0a0aa75f16dfcede9",
"support"
],
+ "webusb/resources/usb-helpers.js": [
+ "164413453b70ea42f885481cc3ed839a4314527e",
+ "support"
+ ],
+ "webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html": [
+ "fda5a143afa30b86a318b3ab74baed513a5275bb",
+ "testharness"
+ ],
"webusb/usb-allowed-by-feature-policy-attribute.https.sub.html": [
- "37d342e708981b147904fb315f2b2d030ecab613",
+ "9e891075241bb843a283193506250285e93740e2",
"testharness"
],
"webusb/usb-allowed-by-feature-policy.https.sub.html": [
- "8784cbaba39cd8ebafe22aae0438f54f88f8f288",
+ "dce5c37e64183ea3d698ef8cc5b751c506a495ed",
"testharness"
],
"webusb/usb-allowed-by-feature-policy.https.sub.html.headers": [
- "a579c20e4a57dc30372470c685922e6a973a6d84",
+ "2d7c5aef94d200bdf580a4ee3c7fdc9356dba183",
"support"
],
"webusb/usb-default-feature-policy.https.sub.html": [
- "c1e4f73710447815cc36edfc01d2c221b35a954e",
+ "d9d33a643c824fbd880ee283aa47950391622fa8",
"testharness"
],
"webusb/usb-disabled-by-feature-policy.https.sub.html": [
- "852f9e5816750a4f79e6205a46437977f15ef90f",
+ "414b0b8087cbfa333e205a7b42d838c5f8108cf7",
"testharness"
],
"webusb/usb-disabled-by-feature-policy.https.sub.html.headers": [
- "c8b3c972c90674c75d652a31a8d0b28eec8ca6e7",
+ "7cc713de57caf823d0f778d943d6e7bb3900fb1e",
"support"
],
+ "webusb/usb-manual.https.html": [
+ "e2b90443b8af646908867e44a1d3388074c5e62b",
+ "manual"
+ ],
+ "webusb/usbConnectionEvent.https.html": [
+ "b350ec95c8dfc96783b80d4914b932eeecbe00a1",
+ "testharness"
+ ],
+ "webusb/usbDevice-iframe.https.html": [
+ "d2c3f13551a4d3b58e155aec01fb19f6fade5073",
+ "testharness"
+ ],
+ "webusb/usbDevice.https.html": [
+ "db4de6d427f744294fc24f8a11c0971c2df207b1",
+ "testharness"
+ ],
+ "webusb/usbInTransferResult.https.html": [
+ "abfce8f939654027c4f9ef275878016dca126bb6",
+ "testharness"
+ ],
+ "webusb/usbIsochronousInTransferPacket.https.html": [
+ "0c13763ed243ed0981f00658d50eace2e49e654b",
+ "testharness"
+ ],
+ "webusb/usbIsochronousInTransferResult.https.html": [
+ "131e36c8782adf4c02198b1905d233159295d5aa",
+ "testharness"
+ ],
+ "webusb/usbIsochronousOutTransferPacket.https.html": [
+ "c8cd321d866b6ff693fe15b02d8808d092929ce1",
+ "testharness"
+ ],
+ "webusb/usbIsochronousOutTransferResult.https.html": [
+ "ec9dfc49ebcb419d777c16995940d91678a26954",
+ "testharness"
+ ],
+ "webusb/usbOutTransferResult.https.html": [
+ "f08a98a927d57cda8b780a8304a0fa6cf727cc81",
+ "testharness"
+ ],
"webvr/OWNERS": [
"adb04954bffbb33f29864668db95f5c5367d6a05",
"support"
],
"webvr/idlharness.html": [
- "236974fe82ab29908e849d25c5ce748f5c0509c3",
+ "ef6ad8bff43a6423b9b3e7deb8017a8b3fa0c112",
+ "testharness"
+ ],
+ "webvr/webvr-disabled-by-feature-policy.https.sub.html": [
+ "324e77ca73617cf34b3d7b8fac9844c67cae5e61",
+ "testharness"
+ ],
+ "webvr/webvr-disabled-by-feature-policy.https.sub.html.headers": [
+ "0938d2df0283e585613610216f2be36fe77471af",
+ "support"
+ ],
+ "webvr/webvr-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html": [
+ "859b0684996afdb9e551d6272aa85eb2e8b44f84",
+ "testharness"
+ ],
+ "webvr/webvr-enabled-by-feature-policy-attribute.https.sub.html": [
+ "f5458498607e8a7e71cc7b31baa14941afa8d385",
+ "testharness"
+ ],
+ "webvr/webvr-enabled-by-feature-policy.https.sub.html": [
+ "d0fbd41b8ba164915e357059cb0b3bd1e13d954a",
"testharness"
],
+ "webvr/webvr-enabled-by-feature-policy.https.sub.html.headers": [
+ "da771aa55d4ac72feb2ddda07b2102c0e39decb6",
+ "support"
+ ],
+ "webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html": [
+ "1c754d666b538adff54db3b32f806633f399f3d3",
+ "testharness"
+ ],
+ "webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html.headers": [
+ "acc2d4484a518df41b784ec5031ed41fe280e708",
+ "support"
+ ],
"webvtt/OWNERS": [
- "a630f47bc188f4fb7b4ee83653437339f4d70575",
+ "3927364206320a3898eb0fec28e2a879bb04d606",
"support"
],
"webvtt/README.md": [
@@ -631150,13 +639595,17 @@
"support"
],
"webvtt/api/VTTCue/align.html": [
- "e150765ae1e87996eff7dc8b888284e9c279d7f8",
+ "63cdd33756b623125db6c5c40b471a6a50dc6d4a",
"testharness"
],
"webvtt/api/VTTCue/categories.json": [
"b1ada14973c010a88020f0bd1568c30c48e0c041",
"support"
],
+ "webvtt/api/VTTCue/common.js": [
+ "e88f3e9ddc5a5d4d9597403e8f7ef01d1daa339a",
+ "support"
+ ],
"webvtt/api/VTTCue/constructor.html": [
"c844f513868cbf4053c70f37bbb630b53a763a2a",
"testharness"
@@ -631166,7 +639615,7 @@
"testharness"
],
"webvtt/api/VTTCue/line.html": [
- "07115104642dbfea2347f6926ca2cffff5839f25",
+ "456e481bc10ca23bdce440d883fd02f9178bfa03",
"testharness"
],
"webvtt/api/VTTCue/lineAlign.html": [
@@ -631190,21 +639639,25 @@
"testharness"
],
"webvtt/api/VTTCue/snapToLines.html": [
- "0e4ad4e1e42545ad720b134f69fcd63de22ade70",
+ "a5911e8ab0db84edc17027940b4121f87aa63b76",
"testharness"
],
"webvtt/api/VTTCue/text.html": [
- "090ecc4c467c9bb2547c0906abfdb5b8572ecaf6",
+ "b59a813eddf6917d0c5ac3434d16f88f376f0f7a",
"testharness"
],
"webvtt/api/VTTCue/vertical.html": [
- "ca0be2954bfe511dd0f7f60ebcab4731cfeaac28",
+ "5c39a39983d4d0f1156e0db95fa312ac82cb3333",
"testharness"
],
"webvtt/api/VTTRegion/constructor.html": [
"0ee58bc32daf656ddc1c8ea6eec84f487b2bf010",
"testharness"
],
+ "webvtt/api/VTTRegion/id.html": [
+ "6f289f2de147d93146160c249babc23f4f800494",
+ "testharness"
+ ],
"webvtt/api/VTTRegion/lines.html": [
"590cec0b814df0bca2760cde94b2f74b4c9defca",
"testharness"
@@ -631237,8 +639690,12 @@
"0e4808b113d2ff6fc4963ff0e5803ad6616288d2",
"support"
],
+ "webvtt/api/historical.html": [
+ "9a45972a29621122da23404a7adc4d237fd7c093",
+ "testharness"
+ ],
"webvtt/api/interfaces.html": [
- "dbff06876d1a0db46505423b9c1d919c2188b7a9",
+ "3b4f42db6f608d1e89d2a3fab575e05da8a3d005",
"testharness"
],
"webvtt/categories.json": [
@@ -631254,43 +639711,51 @@
"support"
],
"webvtt/parsing/cue-text-parsing/buildtests.py": [
- "5fe90ed238ef80fd3f69f72ca5df90984451d044",
+ "9666493048b16b9f1f97c8d20dab851f22597d7c",
"support"
],
"webvtt/parsing/cue-text-parsing/common.js": [
- "d248c8ae97cc9205a5d6094b1800255e60551bf6",
+ "10ae3cea61a80465ee055d3934e3829f4632047b",
"support"
],
"webvtt/parsing/cue-text-parsing/dat/entities.dat": [
- "183dd9377fccb89e151dc298ec8b819d1209fee3",
+ "02613e33aa1f565f3a1918b12dea5a6f2ac9debb",
"support"
],
"webvtt/parsing/cue-text-parsing/dat/tags.dat": [
- "461d05cbc43780eacc6cbd667bb5ccc6215d9c5b",
+ "c2991ca245d80426a3910ff07a1aa4aed68a0a96",
+ "support"
+ ],
+ "webvtt/parsing/cue-text-parsing/dat/text.dat": [
+ "57c33406f221c63954d6f11f1982f3bafc47f79c",
"support"
],
"webvtt/parsing/cue-text-parsing/dat/timestamps.dat": [
- "7946c639cd942ecb62eadf81aec77e3ecd09a788",
+ "fa90baa1075aed52609d9e736d28a7b7cc2c77dc",
"support"
],
"webvtt/parsing/cue-text-parsing/dat/tree-building.dat": [
- "4b8777b30361d5193137991be3b3268013a03fe9",
+ "0448b464614506116d320ad645000b4b466953dd",
"support"
],
"webvtt/parsing/cue-text-parsing/tests/entities.html": [
- "43183d8d79641b451636efc22aa70431ec0ab1f7",
+ "3e4a9ea6beeb9068ab685f8edb0238bb12f42c5e",
"testharness"
],
"webvtt/parsing/cue-text-parsing/tests/tags.html": [
- "5c1bb0dace4c7c18b0265c568f81a5594424ed6b",
+ "7e3d25f90ef4793f39aaa6986af8ee88fea31866",
+ "testharness"
+ ],
+ "webvtt/parsing/cue-text-parsing/tests/text.html": [
+ "cd575cb3a8507339cfded6676279e66fa136ced1",
"testharness"
],
"webvtt/parsing/cue-text-parsing/tests/timestamps.html": [
- "9096541716f4318972db549f8a1fce33ca810b2a",
+ "5c693a298ad24030e14fb96d60dbacd8e989d6b4",
"testharness"
],
"webvtt/parsing/cue-text-parsing/tests/tree-building.html": [
- "a812b24c8c9a8adbf05ea51a20e8b102a697cc88",
+ "1f0f7b412016e1bdc1a3ba5be3362023f769b1b9",
"testharness"
],
"webvtt/parsing/file-parsing/README.md": [
@@ -633898,7 +642363,7 @@
"support"
],
"workers/OWNERS": [
- "3648bbedbe71884c7d375289fb63250f968be14f",
+ "424c4c3664d3eb0c5123b4a05c55ee78a1dbbba5",
"support"
],
"workers/README.md": [
@@ -633949,6 +642414,10 @@
"ed0358c1e713d7b29ee98f9686f2a4a25a9a682e",
"testharness"
],
+ "workers/WorkerLocation-origin.sub.window.js": [
+ "e29c2a3e8ff5486b49cf7f60d6c688b152c023d9",
+ "testharness"
+ ],
"workers/WorkerLocation.htm": [
"a39ec72cc081a7f48c15346d2e1764cd08600d1f",
"testharness"
@@ -634062,7 +642531,7 @@
"testharness"
],
"workers/Worker_dispatchEvent_ErrorEvent.htm": [
- "a1100df5a79ed7b484a8d5c5746bd646a165242b",
+ "a27efcba6fcdbb34bb07ac8553a6bbfa04761008",
"testharness"
],
"workers/Worker_script_mimetype.htm": [
@@ -634322,15 +642791,11 @@
"testharness"
],
"workers/data-url.html": [
- "a9084f9a3b6fc31d54b564b80869826f132f1166",
+ "c693eac37e1a8856b82a923b2f1142360afc6411",
"testharness"
],
- "workers/interfaces.idl": [
- "d8961ea6af91a92a064bcf0e0da5b56781f6bc6b",
- "support"
- ],
"workers/interfaces.worker.js": [
- "e35e0f6de69052f24340bd887da469b85833953b",
+ "bab03d904dde60b7456d3cd60284c1ecc84a7649",
"testharness"
],
"workers/interfaces/DedicatedWorkerGlobalScope/EventTarget.worker.js": [
@@ -634566,7 +643031,7 @@
"testharness"
],
"workers/name-property.html": [
- "762b7b4b65503e599560829675a1df07a61dd566",
+ "1c53fc1fdc2d6c8ed5592d832a18bdbd3bca541b",
"testharness"
],
"workers/nested_worker.worker.js": [
@@ -634638,7 +643103,7 @@
"testharness"
],
"workers/postMessage_ports_readonly_array.htm": [
- "421c9ef573548559dad40272370150487c0aed8a",
+ "31c0e1779c7054dc6fa4137427b81d9c72229f73",
"testharness"
],
"workers/postMessage_target_source.htm": [
@@ -634682,7 +643147,7 @@
"testharness"
],
"workers/semantics/interface-objects/002.worker.js": [
- "e067c76ffd47b09d97484a6cbd3d86a29102df9d",
+ "d6d07e646862f3cb460ebf71372af79dcfccc397",
"testharness"
],
"workers/semantics/interface-objects/003.html": [
@@ -634742,15 +643207,15 @@
"testharness"
],
"workers/semantics/navigation/001-1.html": [
- "2f0df288870e99e80de02fe4a09c9cac141d4559",
+ "4dac7306512b047e8239c7f5c10e6b8ed83b9212",
"support"
],
"workers/semantics/navigation/001.html": [
- "4a744751f35cbc67ec87ea76e22947a5f66959e9",
+ "fd9870c19b051c1580b4b7b366ea5ce71541b5dc",
"testharness"
],
"workers/semantics/navigation/002.html": [
- "e28d7129aa2aa8fabe3641bea8f60ecd70335fa9",
+ "bc96fc2e64a3ffe6a71c314d7a65ed9a89cf440f",
"testharness"
],
"workers/semantics/reporting-errors/001.html": [
@@ -634893,8 +643358,12 @@
"ac8c81ce2d0e4833bf1d61a18a05b2ce531b576a",
"support"
],
+ "workers/support/WorkerLocation-origin.html": [
+ "b49e5a610ee9f206fb6363b9c48b29ba208991df",
+ "support"
+ ],
"workers/support/WorkerLocation.js": [
- "6d835557e345feb354e640020e74476258a075f6",
+ "5091e6c55ad0e5654f08df696fda16668676a601",
"support"
],
"workers/support/WorkerNavigator.js": [
@@ -634909,8 +643378,12 @@
"b0e679dd7720701364abeaca6870d94db5d7ee74",
"support"
],
+ "workers/support/name-as-accidental-global.js": [
+ "530670268fae610b60066773ee475743b8498b53",
+ "support"
+ ],
"workers/support/name.js": [
- "af3a704319d8ee15cf7df2638e4c2c5e59af2403",
+ "27fa41f445888125f84dab8a57ca62b41c09e506",
"support"
],
"workers/support/nosiniff-error-worker.py": [
@@ -634925,6 +643398,46 @@
"671ecb263ceb15ca28ef9cfc2ee6efa6e08a70fb",
"support"
],
+ "workers/worker-performance.worker.js": [
+ "d1759a707897f66bf013e888ed188023145e2622",
+ "testharness"
+ ],
+ "worklets/README.md": [
+ "33a3530260a18e74dd96470d9890bbdb4ecdb08d",
+ "support"
+ ],
+ "worklets/animation-worklet-import.html": [
+ "42ad4c05fb7093051344351c7b8802f8ef8fbf4c",
+ "testharness"
+ ],
+ "worklets/paint-worklet-import.html": [
+ "0319b5195ba14348c6b5031d1198c5f401d13938",
+ "testharness"
+ ],
+ "worklets/resources/empty-worklet-script.js": [
+ "84b3339c3419e318803e51f46d7252d9e8ac183b",
+ "support"
+ ],
+ "worklets/resources/import-cyclic-worklet-script.js": [
+ "f32abb012c93bb69087688f31a0c243d9e6d1060",
+ "support"
+ ],
+ "worklets/resources/import-nested-internal-worklet-script.js": [
+ "b897cf335179eb5c0e9536e8e883da1eba509ea7",
+ "support"
+ ],
+ "worklets/resources/import-nested-worklet-script.js": [
+ "463fc9e39a1502333cfe329613516e82f66f08de",
+ "support"
+ ],
+ "worklets/resources/import-tests.js": [
+ "7fd020b68f1ef3fc0bf8d057d30af3970f9b06cd",
+ "support"
+ ],
+ "worklets/resources/throwing-worklet-script.js": [
+ "a7164f899afec387321c7737aa1006aa5f225669",
+ "support"
+ ],
"x-frame-options/deny.sub.html": [
"5a589f4b4c6f2503104b33ae7002dcc5c4153eb7",
"testharness"
diff --git a/tests/wpt/metadata/WebCryptoAPI/idlharness.html.ini b/tests/wpt/metadata/WebCryptoAPI/idlharness.html.ini
index 00bc82e22c5..9cc87fa0988 100644
--- a/tests/wpt/metadata/WebCryptoAPI/idlharness.html.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/idlharness.html.ini
@@ -162,3 +162,114 @@
[SubtleCrypto interface: calling unwrapKey(KeyFormat,BufferSource,CryptoKey,AlgorithmIdentifier,AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
expected: FAIL
+ [Crypto interface: crypto must inherit property "subtle" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation sign(AlgorithmIdentifier, CryptoKey, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation digest(AlgorithmIdentifier, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation generateKey(AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation exportKey(KeyFormat, CryptoKey)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling encrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling decrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "sign(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling sign(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "digest(AlgorithmIdentifier, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling digest(AlgorithmIdentifier, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "generateKey(AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling generateKey(AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "exportKey(KeyFormat, CryptoKey)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling exportKey(KeyFormat, CryptoKey) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/idlharness.https.html.ini b/tests/wpt/metadata/WebCryptoAPI/idlharness.https.html.ini
index 486075b8159..3d8365a111c 100644
--- a/tests/wpt/metadata/WebCryptoAPI/idlharness.https.html.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/idlharness.https.html.ini
@@ -162,3 +162,114 @@
[SubtleCrypto interface: calling unwrapKey(KeyFormat,BufferSource,CryptoKey,AlgorithmIdentifier,AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
expected: FAIL
+ [Crypto interface: crypto must inherit property "subtle" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation sign(AlgorithmIdentifier, CryptoKey, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation digest(AlgorithmIdentifier, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation generateKey(AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation exportKey(KeyFormat, CryptoKey)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling encrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling decrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "sign(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling sign(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "digest(AlgorithmIdentifier, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling digest(AlgorithmIdentifier, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "generateKey(AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling generateKey(AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "exportKey(KeyFormat, CryptoKey)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling exportKey(KeyFormat, CryptoKey) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini b/tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini
index 71b1ea6c745..a6e580bf852 100644
--- a/tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini
+++ b/tests/wpt/metadata/WebCryptoAPI/idlharness.worker.js.ini
@@ -165,3 +165,114 @@
[SubtleCrypto interface: calling unwrapKey(KeyFormat,BufferSource,CryptoKey,AlgorithmIdentifier,AlgorithmIdentifier,boolean,[object Object\]) on crypto.subtle with too few arguments must throw TypeError]
expected: FAIL
+ [Crypto interface: crypto must inherit property "subtle" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation sign(AlgorithmIdentifier, CryptoKey, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation digest(AlgorithmIdentifier, BufferSource)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation generateKey(AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation exportKey(KeyFormat, CryptoKey)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)]
+ expected: FAIL
+
+ [SubtleCrypto interface: operation unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\])]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "encrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling encrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "decrypt(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling decrypt(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "sign(AlgorithmIdentifier, CryptoKey, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling sign(AlgorithmIdentifier, CryptoKey, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling verify(AlgorithmIdentifier, CryptoKey, BufferSource, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "digest(AlgorithmIdentifier, BufferSource)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling digest(AlgorithmIdentifier, BufferSource) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "generateKey(AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling generateKey(AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling deriveKey(AlgorithmIdentifier, CryptoKey, AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling deriveBits(AlgorithmIdentifier, CryptoKey, unsigned long) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling importKey(KeyFormat, [object Object\],[object Object\], AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "exportKey(KeyFormat, CryptoKey)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling exportKey(KeyFormat, CryptoKey) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier)" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling wrapKey(KeyFormat, CryptoKey, CryptoKey, AlgorithmIdentifier) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [SubtleCrypto interface: crypto.subtle must inherit property "unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [SubtleCrypto interface: calling unwrapKey(KeyFormat, BufferSource, CryptoKey, AlgorithmIdentifier, AlgorithmIdentifier, boolean, [object Object\]) on crypto.subtle with too few arguments must throw TypeError]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js.ini
new file mode 100644
index 00000000000..aac790394bf
--- /dev/null
+++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js.ini
@@ -0,0 +1,197 @@
+[DOMException-constructor-behavior.any.worker.html]
+ type: testharness
+ [new DOMException()]
+ expected: FAIL
+
+ [new DOMException(): inherited-ness]
+ expected: FAIL
+
+ [new DOMException(null)]
+ expected: FAIL
+
+ [new DOMException(undefined)]
+ expected: FAIL
+
+ [new DOMException(undefined): inherited-ness]
+ expected: FAIL
+
+ [new DOMException("foo")]
+ expected: FAIL
+
+ [new DOMException("foo"): inherited-ness]
+ expected: FAIL
+
+ [new DOMException("bar", undefined)]
+ expected: FAIL
+
+ [new DOMException("bar", "NotSupportedError")]
+ expected: FAIL
+
+ [new DOMException("bar", "NotSupportedError"): inherited-ness]
+ expected: FAIL
+
+ [new DOMException("bar", "foo")]
+ expected: FAIL
+
+ [new DOMexception("msg", "IndexSizeError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "HierarchyRequestError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "WrongDocumentError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InvalidCharacterError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "NoModificationAllowedError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "NotFoundError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "NotSupportedError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InUseAttributeError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InvalidStateError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "SyntaxError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InvalidModificationError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "NamespaceError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InvalidAccessError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "SecurityError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "NetworkError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "AbortError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "URLMismatchError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "QuotaExceededError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "TimeoutError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InvalidNodeTypeError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "DataCloneError")]
+ expected: FAIL
+
+
+[DOMException-constructor-behavior.any.html]
+ type: testharness
+ [new DOMException()]
+ expected: FAIL
+
+ [new DOMException(): inherited-ness]
+ expected: FAIL
+
+ [new DOMException(null)]
+ expected: FAIL
+
+ [new DOMException(undefined)]
+ expected: FAIL
+
+ [new DOMException(undefined): inherited-ness]
+ expected: FAIL
+
+ [new DOMException("foo")]
+ expected: FAIL
+
+ [new DOMException("foo"): inherited-ness]
+ expected: FAIL
+
+ [new DOMException("bar", undefined)]
+ expected: FAIL
+
+ [new DOMException("bar", "NotSupportedError")]
+ expected: FAIL
+
+ [new DOMException("bar", "NotSupportedError"): inherited-ness]
+ expected: FAIL
+
+ [new DOMException("bar", "foo")]
+ expected: FAIL
+
+ [new DOMexception("msg", "IndexSizeError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "HierarchyRequestError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "WrongDocumentError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InvalidCharacterError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "NoModificationAllowedError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "NotFoundError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "NotSupportedError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InUseAttributeError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InvalidStateError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "SyntaxError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InvalidModificationError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "NamespaceError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InvalidAccessError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "SecurityError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "NetworkError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "AbortError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "URLMismatchError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "QuotaExceededError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "TimeoutError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "InvalidNodeTypeError")]
+ expected: FAIL
+
+ [new DOMexception("msg", "DataCloneError")]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html.ini
deleted file mode 100644
index d31be8ca02c..00000000000
--- a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html.ini
+++ /dev/null
@@ -1,101 +0,0 @@
-[DOMException-constructor.html]
- type: testharness
- [new DOMException()]
- expected: FAIL
-
- [new DOMException(): own-ness]
- expected: FAIL
-
- [new DOMException(null)]
- expected: FAIL
-
- [new DOMException(undefined)]
- expected: FAIL
-
- [new DOMException(undefined): own-ness]
- expected: FAIL
-
- [new DOMException("foo")]
- expected: FAIL
-
- [new DOMException("foo"): own-ness]
- expected: FAIL
-
- [new DOMException("bar", undefined)]
- expected: FAIL
-
- [new DOMException("bar", "NotSupportedError")]
- expected: FAIL
-
- [new DOMException("bar", "NotSupportedError"): own-ness]
- expected: FAIL
-
- [new DOMException("bar", "foo")]
- expected: FAIL
-
- [new DOMexception("msg", "IndexSizeError")]
- expected: FAIL
-
- [new DOMexception("msg", "HierarchyRequestError")]
- expected: FAIL
-
- [new DOMexception("msg", "WrongDocumentError")]
- expected: FAIL
-
- [new DOMexception("msg", "InvalidCharacterError")]
- expected: FAIL
-
- [new DOMexception("msg", "NoModificationAllowedError")]
- expected: FAIL
-
- [new DOMexception("msg", "NotFoundError")]
- expected: FAIL
-
- [new DOMexception("msg", "NotSupportedError")]
- expected: FAIL
-
- [new DOMexception("msg", "InUseAttributeError")]
- expected: FAIL
-
- [new DOMexception("msg", "InvalidStateError")]
- expected: FAIL
-
- [new DOMexception("msg", "SyntaxError")]
- expected: FAIL
-
- [new DOMexception("msg", "InvalidModificationError")]
- expected: FAIL
-
- [new DOMexception("msg", "NamespaceError")]
- expected: FAIL
-
- [new DOMexception("msg", "InvalidAccessError")]
- expected: FAIL
-
- [new DOMexception("msg", "SecurityError")]
- expected: FAIL
-
- [new DOMexception("msg", "NetworkError")]
- expected: FAIL
-
- [new DOMexception("msg", "AbortError")]
- expected: FAIL
-
- [new DOMexception("msg", "URLMismatchError")]
- expected: FAIL
-
- [new DOMexception("msg", "QuotaExceededError")]
- expected: FAIL
-
- [new DOMexception("msg", "TimeoutError")]
- expected: FAIL
-
- [new DOMexception("msg", "InvalidNodeTypeError")]
- expected: FAIL
-
- [new DOMexception("msg", "DataCloneError")]
- expected: FAIL
-
- [new DOMException("bar", "UnknownError")]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js.ini
new file mode 100644
index 00000000000..0cdcdc1a133
--- /dev/null
+++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js.ini
@@ -0,0 +1,47 @@
+[DOMException-custom-bindings.any.worker.html]
+ type: testharness
+ [message property descriptor]
+ expected: FAIL
+
+ [name property descriptor]
+ expected: FAIL
+
+ [code property descriptor]
+ expected: FAIL
+
+ [code property is not affected by shadowing the name property]
+ expected: FAIL
+
+ [Object.prototype.toString behavior is like other interfaces]
+ expected: FAIL
+
+ [Inherits its toString() from Error.prototype]
+ expected: FAIL
+
+ [toString() behavior from Error.prototype applies as expected]
+ expected: FAIL
+
+
+[DOMException-custom-bindings.any.html]
+ type: testharness
+ [message property descriptor]
+ expected: FAIL
+
+ [name property descriptor]
+ expected: FAIL
+
+ [code property descriptor]
+ expected: FAIL
+
+ [code property is not affected by shadowing the name property]
+ expected: FAIL
+
+ [Object.prototype.toString behavior is like other interfaces]
+ expected: FAIL
+
+ [Inherits its toString() from Error.prototype]
+ expected: FAIL
+
+ [toString() behavior from Error.prototype applies as expected]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html.ini
deleted file mode 100644
index 39e25898e41..00000000000
--- a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[constructor-object.html]
- type: testharness
- [existence and properties of DOMException]
- expected: FAIL
-
- [existence of name and code properties on DOMException.prototype]
- 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
deleted file mode 100644
index 40ad9777f12..00000000000
--- a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[constructor-object.worker.html]
- type: testharness
- [existence and properties of DOMException]
- expected: FAIL
-
- [existence of name and code properties on DOMException.prototype]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/exceptions.html.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/exceptions.html.ini
index 5dc6276d371..eb114de745d 100644
--- a/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/exceptions.html.ini
+++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/es-exceptions/exceptions.html.ini
@@ -1,8 +1,5 @@
[exceptions.html]
type: testharness
- [exception.hasOwnProperty("name")]
- expected: FAIL
-
[Object.getOwnPropertyDescriptor(exception, "name")]
expected: FAIL
@@ -12,9 +9,6 @@
[Object.getOwnPropertyDescriptor(exception, "code")]
expected: FAIL
- [In iframe: exception.hasOwnProperty("name")]
- expected: FAIL
-
[In iframe: Object.getOwnPropertyDescriptor(exception, "name")]
expected: FAIL
diff --git a/tests/wpt/metadata/WebIDL/ecmascript-binding/legacy-platform-object.html.ini b/tests/wpt/metadata/WebIDL/ecmascript-binding/legacy-platform-object.html.ini
new file mode 100644
index 00000000000..a2250466733
--- /dev/null
+++ b/tests/wpt/metadata/WebIDL/ecmascript-binding/legacy-platform-object.html.ini
@@ -0,0 +1,17 @@
+[legacy-platform-object.html]
+ type: testharness
+ [[[GetOwnProperty\]\] with getters and no setters]
+ expected: FAIL
+
+ [[[GetOwnProperty\]\] with named property getters and setters]
+ expected: FAIL
+
+ [[[GetOwnProperty\]\] with indexed property getters and setters]
+ expected: FAIL
+
+ [Test [[DefineOwnProperty\]\] with no indexed property setter support.]
+ expected: FAIL
+
+ [Test [[DefineOwnProperty\]\] with indexed property setter support.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/WebIDL/interfaces.html.ini b/tests/wpt/metadata/WebIDL/interfaces.html.ini
new file mode 100644
index 00000000000..777f3bae5e8
--- /dev/null
+++ b/tests/wpt/metadata/WebIDL/interfaces.html.ini
@@ -0,0 +1,272 @@
+[interfaces.html]
+ type: testharness
+ [DOMException must be primary interface of new DOMException()]
+ expected: FAIL
+
+ [Stringification of new DOMException()]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "message" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "code" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "INDEX_SIZE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "DOMSTRING_SIZE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "HIERARCHY_REQUEST_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "WRONG_DOCUMENT_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "INVALID_CHARACTER_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "NO_DATA_ALLOWED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "NO_MODIFICATION_ALLOWED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "NOT_FOUND_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "NOT_SUPPORTED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "INUSE_ATTRIBUTE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "INVALID_STATE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "SYNTAX_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "INVALID_MODIFICATION_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "NAMESPACE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "INVALID_ACCESS_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "VALIDATION_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "TYPE_MISMATCH_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "SECURITY_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "NETWORK_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "ABORT_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "URL_MISMATCH_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "QUOTA_EXCEEDED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "TIMEOUT_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "INVALID_NODE_TYPE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException() must inherit property "DATA_CLONE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException must be primary interface of new DOMException("my message")]
+ expected: FAIL
+
+ [Stringification of new DOMException("my message")]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "message" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "code" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "INDEX_SIZE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "DOMSTRING_SIZE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "HIERARCHY_REQUEST_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "WRONG_DOCUMENT_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "INVALID_CHARACTER_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "NO_DATA_ALLOWED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "NO_MODIFICATION_ALLOWED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "NOT_FOUND_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "NOT_SUPPORTED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "INUSE_ATTRIBUTE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "INVALID_STATE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "SYNTAX_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "INVALID_MODIFICATION_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "NAMESPACE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "INVALID_ACCESS_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "VALIDATION_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "TYPE_MISMATCH_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "SECURITY_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "NETWORK_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "ABORT_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "URL_MISMATCH_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "QUOTA_EXCEEDED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "TIMEOUT_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "INVALID_NODE_TYPE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message") must inherit property "DATA_CLONE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException must be primary interface of new DOMException("my message", "myName")]
+ expected: FAIL
+
+ [Stringification of new DOMException("my message", "myName")]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "message" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "code" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "INDEX_SIZE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "DOMSTRING_SIZE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "HIERARCHY_REQUEST_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "WRONG_DOCUMENT_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "INVALID_CHARACTER_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "NO_DATA_ALLOWED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "NO_MODIFICATION_ALLOWED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "NOT_FOUND_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "NOT_SUPPORTED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "INUSE_ATTRIBUTE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "INVALID_STATE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "SYNTAX_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "INVALID_MODIFICATION_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "NAMESPACE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "INVALID_ACCESS_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "VALIDATION_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "TYPE_MISMATCH_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "SECURITY_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "NETWORK_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "ABORT_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "URL_MISMATCH_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "QUOTA_EXCEEDED_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "TIMEOUT_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "INVALID_NODE_TYPE_ERR" with the proper type]
+ expected: FAIL
+
+ [DOMException interface: new DOMException("my message", "myName") must inherit property "DATA_CLONE_ERR" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/access-control-and-redirects.htm.ini b/tests/wpt/metadata/XMLHttpRequest/access-control-and-redirects.htm.ini
new file mode 100644
index 00000000000..0e557f621cb
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/access-control-and-redirects.htm.ini
@@ -0,0 +1,5 @@
+[access-control-and-redirects.htm]
+ type: testharness
+ [Remote sync redirect to local origin]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm.ini b/tests/wpt/metadata/XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm.ini
new file mode 100644
index 00000000000..314fe9ed767
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm.ini
@@ -0,0 +1,5 @@
+[access-control-basic-allow-access-control-origin-header-data-url.htm]
+ type: testharness
+ [Access granted to null-origin iframe]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/access-control-basic-allow-preflight-cache.htm.ini b/tests/wpt/metadata/XMLHttpRequest/access-control-basic-allow-preflight-cache.htm.ini
new file mode 100644
index 00000000000..95c4fdddc22
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/access-control-basic-allow-preflight-cache.htm.ini
@@ -0,0 +1,5 @@
+[access-control-basic-allow-preflight-cache.htm]
+ type: testharness
+ [Preflight cache should allow second request]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm.ini b/tests/wpt/metadata/XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm.ini
new file mode 100644
index 00000000000..2373b260a04
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm.ini
@@ -0,0 +1,5 @@
+[access-control-basic-cors-safelisted-request-headers.htm]
+ type: testharness
+ [Request with CORS-safelisted headers]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/access-control-preflight-request-header-sorted.htm.ini b/tests/wpt/metadata/XMLHttpRequest/access-control-preflight-request-header-sorted.htm.ini
new file mode 100644
index 00000000000..35cf478e1c5
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/access-control-preflight-request-header-sorted.htm.ini
@@ -0,0 +1,5 @@
+[access-control-preflight-request-header-sorted.htm]
+ type: testharness
+ [Tests that Access-Control-Request-Headers are sorted.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm.ini b/tests/wpt/metadata/XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm.ini
new file mode 100644
index 00000000000..4a8015c9825
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm.ini
@@ -0,0 +1,5 @@
+[access-control-sandboxed-iframe-denied-without-wildcard.htm]
+ type: testharness
+ [Sandboxed iframe is denied CORS access to server that allows parent origin]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/access-control-sandboxed-iframe-denied.htm.ini b/tests/wpt/metadata/XMLHttpRequest/access-control-sandboxed-iframe-denied.htm.ini
new file mode 100644
index 00000000000..04c63335f3c
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/access-control-sandboxed-iframe-denied.htm.ini
@@ -0,0 +1,5 @@
+[access-control-sandboxed-iframe-denied.htm]
+ type: testharness
+ [Sandboxed iframe is denied access to path]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/data-uri.htm.ini b/tests/wpt/metadata/XMLHttpRequest/data-uri.htm.ini
index 398241a89a8..544845997d9 100644
--- a/tests/wpt/metadata/XMLHttpRequest/data-uri.htm.ini
+++ b/tests/wpt/metadata/XMLHttpRequest/data-uri.htm.ini
@@ -26,6 +26,3 @@
[XHR method GET with MIME type text/html;charset=UTF-8]
expected: FAIL
- [XHR method HEAD with MIME type text/plain]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/XMLHttpRequest/event-upload-progress-crossorigin.htm.ini b/tests/wpt/metadata/XMLHttpRequest/event-upload-progress-crossorigin.htm.ini
new file mode 100644
index 00000000000..0947bf1513a
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/event-upload-progress-crossorigin.htm.ini
@@ -0,0 +1,8 @@
+[event-upload-progress-crossorigin.htm]
+ type: testharness
+ [Upload events registered too late (http://www1.web-platform.test:8000/XMLHttpRequest/resources/corsenabled.py)]
+ expected: FAIL
+
+ [Upload events registered too late (resources/redirect.py?code=307&location=http://www1.web-platform.test:8000/XMLHttpRequest/resources/corsenabled.py)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/open-url-worker-origin.htm.ini b/tests/wpt/metadata/XMLHttpRequest/open-url-worker-origin.htm.ini
index be2ee0358af..78c84602472 100644
--- a/tests/wpt/metadata/XMLHttpRequest/open-url-worker-origin.htm.ini
+++ b/tests/wpt/metadata/XMLHttpRequest/open-url-worker-origin.htm.ini
@@ -3,6 +3,3 @@
[Referer header]
expected: FAIL
- [Origin header]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/XMLHttpRequest/responseXML-unavailable-in-worker.html.ini b/tests/wpt/metadata/XMLHttpRequest/responseXML-unavailable-in-worker.html.ini
new file mode 100644
index 00000000000..58ad7a7e3f2
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/responseXML-unavailable-in-worker.html.ini
@@ -0,0 +1,5 @@
+[responseXML-unavailable-in-worker.html]
+ type: testharness
+ [XMLHttpRequest's responseXML property should not be exposed in workers.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/responsedocument-decoding.htm.ini b/tests/wpt/metadata/XMLHttpRequest/responsedocument-decoding.htm.ini
new file mode 100644
index 00000000000..08e4a01a1db
--- /dev/null
+++ b/tests/wpt/metadata/XMLHttpRequest/responsedocument-decoding.htm.ini
@@ -0,0 +1,8 @@
+[responsedocument-decoding.htm]
+ type: testharness
+ [XMLHttpRequest: response document decoding (application/xml %3C%3Fxml%20version%3D'1.0'%20encoding%3D'windows-1252'%3F%3E%3Cx%3E%e6%a9%9f%3C%2Fx%3E)]
+ expected: FAIL
+
+ [XMLHttpRequest: response document decoding (text/html %3C!doctype%20html%3E%3Cmeta%20charset%3Dwindows-1252%3E%3Cx%3E%e6%a9%9f%3C%2Fx%3E)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/XMLHttpRequest/send-content-type-string.htm.ini b/tests/wpt/metadata/XMLHttpRequest/send-content-type-string.htm.ini
deleted file mode 100644
index 5ae82d20062..00000000000
--- a/tests/wpt/metadata/XMLHttpRequest/send-content-type-string.htm.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[send-content-type-string.htm]
- type: testharness
- [XMLHttpRequest: send() - Content-Type 1]
- expected: FAIL
-
- [XMLHttpRequest: send() - Content-Type 2]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/XMLHttpRequest/setrequestheader-content-type.htm.ini b/tests/wpt/metadata/XMLHttpRequest/setrequestheader-content-type.htm.ini
index a1089ee9426..684f4d84dca 100644
--- a/tests/wpt/metadata/XMLHttpRequest/setrequestheader-content-type.htm.ini
+++ b/tests/wpt/metadata/XMLHttpRequest/setrequestheader-content-type.htm.ini
@@ -93,3 +93,6 @@
[URLSearchParams request has correct default Content-Type of "application/x-www-form-urlencoded;charset=UTF-8"]
expected: FAIL
+ [Blob request with set type respects setRequestHeader("") to be specified]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/DOMRectList.html.ini b/tests/wpt/metadata/cssom-view/DOMRectList.html.ini
new file mode 100644
index 00000000000..4cde0b9a38c
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/DOMRectList.html.ini
@@ -0,0 +1,8 @@
+[DOMRectList.html]
+ type: testharness
+ [Element getClientRects()]
+ expected: FAIL
+
+ [Range getClientRects()]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/elementFromPoint-002.html.ini b/tests/wpt/metadata/cssom-view/elementFromPoint-002.html.ini
new file mode 100644
index 00000000000..164539762c4
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/elementFromPoint-002.html.ini
@@ -0,0 +1,5 @@
+[elementFromPoint-002.html]
+ type: testharness
+ [Checking whether dynamic changes to visibility interact correctly with\n table anonymous boxes]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/elementFromPoint-003.html.ini b/tests/wpt/metadata/cssom-view/elementFromPoint-003.html.ini
new file mode 100644
index 00000000000..94b8fd085df
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/elementFromPoint-003.html.ini
@@ -0,0 +1,5 @@
+[elementFromPoint-003.html]
+ type: testharness
+ [Checking whether dynamic changes to visibility interact correctly with\n table anonymous boxes]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/elementsFromPoint-iframes.html.ini b/tests/wpt/metadata/cssom-view/elementsFromPoint-iframes.html.ini
new file mode 100644
index 00000000000..3a52000a845
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/elementsFromPoint-iframes.html.ini
@@ -0,0 +1,8 @@
+[elementsFromPoint-iframes.html]
+ type: testharness
+ [elementsFromPoint on the root document for points in iframe elements]
+ expected: FAIL
+
+ [elementsFromPoint on inner documents]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/elementsFromPoint-invalid-cases.html.ini b/tests/wpt/metadata/cssom-view/elementsFromPoint-invalid-cases.html.ini
new file mode 100644
index 00000000000..e4e2cad0798
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/elementsFromPoint-invalid-cases.html.ini
@@ -0,0 +1,5 @@
+[elementsFromPoint-invalid-cases.html]
+ type: testharness
+ [The root element is the last element returned for otherwise empty queries within the viewport]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/elementsFromPoint-shadowroot.html.ini b/tests/wpt/metadata/cssom-view/elementsFromPoint-shadowroot.html.ini
new file mode 100644
index 00000000000..d99add047f0
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/elementsFromPoint-shadowroot.html.ini
@@ -0,0 +1,5 @@
+[elementsFromPoint-shadowroot.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/elementsFromPoint-simple.html.ini b/tests/wpt/metadata/cssom-view/elementsFromPoint-simple.html.ini
new file mode 100644
index 00000000000..278c63575ba
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/elementsFromPoint-simple.html.ini
@@ -0,0 +1,20 @@
+[elementsFromPoint-simple.html]
+ type: testharness
+ [elementsFromPoint for each corner of a simple div]
+ expected: FAIL
+
+ [elementsFromPoint for each corner of a div that has a pseudo-element]
+ expected: FAIL
+
+ [elementsFromPoint for each corner of a div that is between another div and its pseudo-element]
+ expected: FAIL
+
+ [elementsFromPoint for each corner of a div that has a margin]
+ expected: FAIL
+
+ [elementsFromPoint for each corner of a div with pointer-events:none]
+ expected: FAIL
+
+ [elementsFromPoint for each corner of a div with a 3d transform]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/elementsFromPoint-svg.html.ini b/tests/wpt/metadata/cssom-view/elementsFromPoint-svg.html.ini
new file mode 100644
index 00000000000..5978838f235
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/elementsFromPoint-svg.html.ini
@@ -0,0 +1,14 @@
+[elementsFromPoint-svg.html]
+ type: testharness
+ [elementsFromPoint for a point inside two rects]
+ expected: FAIL
+
+ [elementsFromPoint for a point inside two rects that are inside a <g>]
+ expected: FAIL
+
+ [elementsFromPoint for a point inside two images]
+ expected: FAIL
+
+ [elementsFromPoint for a point inside transformed rects and <g>]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/elementsFromPoint-table.html.ini b/tests/wpt/metadata/cssom-view/elementsFromPoint-table.html.ini
new file mode 100644
index 00000000000..a80abdadc34
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/elementsFromPoint-table.html.ini
@@ -0,0 +1,9 @@
+[elementsFromPoint-table.html]
+ type: testharness
+ expected: ERROR
+ [elementsFromPoint for points inside table cells]
+ expected: FAIL
+
+ [elementsFromPoint for points between table cells]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/interfaces.html.ini b/tests/wpt/metadata/cssom-view/interfaces.html.ini
new file mode 100644
index 00000000000..2525f56bb71
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/interfaces.html.ini
@@ -0,0 +1,329 @@
+[interfaces.html]
+ type: testharness
+ [Element interface: document.createElement('div') must inherit property "scrollIntoView()" with the proper type]
+ expected: FAIL
+
+ [Element interface: document.createElement('div') must inherit property "scrollIntoView([object Object\],[object Object\])" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling scrollIntoView([object Object\],[object Object\]) on document.createElement('div') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElement('div') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling getBoxQuads(BoxQuadOptions) on document.createElement('div') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElement('div') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('div') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElement('div') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createElement('div') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElement('div') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('div') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLImageElement interface: attribute x]
+ expected: FAIL
+
+ [HTMLImageElement interface: attribute y]
+ expected: FAIL
+
+ [HTMLImageElement interface: document.createElement('img') must inherit property "x" with the proper type]
+ expected: FAIL
+
+ [HTMLImageElement interface: document.createElement('img') must inherit property "y" with the proper type]
+ expected: FAIL
+
+ [Element interface: document.createElement('img') must inherit property "scrollIntoView()" with the proper type]
+ expected: FAIL
+
+ [Element interface: document.createElement('img') must inherit property "scrollIntoView([object Object\],[object Object\])" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling scrollIntoView([object Object\],[object Object\]) on document.createElement('img') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElement('img') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling getBoxQuads(BoxQuadOptions) on document.createElement('img') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElement('img') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('img') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElement('img') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createElement('img') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElement('img') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createElement('img') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: attribute screen]
+ expected: FAIL
+
+ [Window interface: attribute innerWidth]
+ expected: FAIL
+
+ [Window interface: attribute innerHeight]
+ expected: FAIL
+
+ [Window interface: attribute scrollX]
+ expected: FAIL
+
+ [Window interface: attribute pageXOffset]
+ expected: FAIL
+
+ [Window interface: attribute scrollY]
+ expected: FAIL
+
+ [Window interface: attribute pageYOffset]
+ expected: FAIL
+
+ [Window interface: attribute screenX]
+ expected: FAIL
+
+ [Window interface: attribute screenY]
+ expected: FAIL
+
+ [Window interface: attribute outerWidth]
+ expected: FAIL
+
+ [Window interface: attribute outerHeight]
+ expected: FAIL
+
+ [Window interface: attribute devicePixelRatio]
+ expected: FAIL
+
+ [Document interface: operation caretPositionFromPoint(double, double)]
+ expected: FAIL
+
+ [Document interface: attribute scrollingElement]
+ expected: FAIL
+
+ [Document interface: operation getBoxQuads(BoxQuadOptions)]
+ expected: FAIL
+
+ [Document interface: operation convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)]
+ expected: FAIL
+
+ [Document interface: operation convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)]
+ expected: FAIL
+
+ [Document interface: operation convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)]
+ expected: FAIL
+
+ [Document interface: document must inherit property "caretPositionFromPoint(double, double)" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling caretPositionFromPoint(double, double) on document with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: document must inherit property "scrollingElement" with the proper type]
+ expected: FAIL
+
+ [Document interface: document must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling getBoxQuads(BoxQuadOptions) on document with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: document must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: document must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Document interface: document must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Document interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: operation scrollIntoView()]
+ expected: FAIL
+
+ [Element interface: operation scrollIntoView([object Object\],[object Object\])]
+ expected: FAIL
+
+ [Element interface: operation getBoxQuads(BoxQuadOptions)]
+ expected: FAIL
+
+ [Element interface: operation convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)]
+ expected: FAIL
+
+ [Element interface: operation convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)]
+ expected: FAIL
+
+ [Element interface: operation convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)]
+ expected: FAIL
+
+ [Element interface: document.createElementNS('x', 'y') must inherit property "scrollIntoView()" with the proper type]
+ expected: FAIL
+
+ [Element interface: document.createElementNS('x', 'y') must inherit property "scrollIntoView([object Object\],[object Object\])" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling scrollIntoView([object Object\],[object Object\]) on document.createElementNS('x', 'y') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElementNS('x', 'y') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling getBoxQuads(BoxQuadOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElementNS('x', 'y') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElementNS('x', 'y') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Element interface: document.createElementNS('x', 'y') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Element interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createElementNS('x', 'y') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Text interface: operation getBoxQuads(BoxQuadOptions)]
+ expected: FAIL
+
+ [Text interface: operation convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)]
+ expected: FAIL
+
+ [Text interface: operation convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)]
+ expected: FAIL
+
+ [Text interface: operation convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)]
+ expected: FAIL
+
+ [Text interface: document.createTextNode('x') must inherit property "getBoxQuads(BoxQuadOptions)" with the proper type]
+ expected: FAIL
+
+ [Text interface: calling getBoxQuads(BoxQuadOptions) on document.createTextNode('x') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Text interface: document.createTextNode('x') must inherit property "convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Text interface: calling convertQuadFromNode(DOMQuadInit, GeometryNode, ConvertCoordinateOptions) on document.createTextNode('x') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Text interface: document.createTextNode('x') must inherit property "convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Text interface: calling convertRectFromNode(DOMRectReadOnly, GeometryNode, ConvertCoordinateOptions) on document.createTextNode('x') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Text interface: document.createTextNode('x') must inherit property "convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions)" with the proper type]
+ expected: FAIL
+
+ [Text interface: calling convertPointFromNode(DOMPointInit, GeometryNode, ConvertCoordinateOptions) on document.createTextNode('x') with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Range interface: operation getClientRects()]
+ expected: FAIL
+
+ [Range interface: operation getBoundingClientRect()]
+ expected: FAIL
+
+ [Range interface: new Range() must inherit property "getClientRects()" with the proper type]
+ expected: FAIL
+
+ [Range interface: new Range() must inherit property "getBoundingClientRect()" with the proper type]
+ expected: FAIL
+
+ [Screen interface: attribute availWidth]
+ expected: FAIL
+
+ [Screen interface: attribute availHeight]
+ expected: FAIL
+
+ [Screen interface: attribute width]
+ expected: FAIL
+
+ [Screen interface: attribute height]
+ expected: FAIL
+
+ [Screen interface: screen must inherit property "availWidth" with the proper type]
+ expected: FAIL
+
+ [Screen interface: screen must inherit property "availHeight" with the proper type]
+ expected: FAIL
+
+ [Screen interface: screen must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [Screen interface: screen must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [CaretPosition interface: existence and properties of interface object]
+ expected: FAIL
+
+ [CaretPosition interface object length]
+ expected: FAIL
+
+ [CaretPosition interface object name]
+ expected: FAIL
+
+ [CaretPosition interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [CaretPosition interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [CaretPosition interface: attribute offsetNode]
+ expected: FAIL
+
+ [CaretPosition interface: attribute offset]
+ expected: FAIL
+
+ [CaretPosition interface: operation getClientRect()]
+ expected: FAIL
+
+ [CaretPosition must be primary interface of document.caretPositionFromPoint(5, 5)]
+ expected: FAIL
+
+ [Stringification of document.caretPositionFromPoint(5, 5)]
+ expected: FAIL
+
+ [CaretPosition interface: document.caretPositionFromPoint(5, 5) must inherit property "offsetNode" with the proper type]
+ expected: FAIL
+
+ [CaretPosition interface: document.caretPositionFromPoint(5, 5) must inherit property "offset" with the proper type]
+ expected: FAIL
+
+ [CaretPosition interface: document.caretPositionFromPoint(5, 5) must inherit property "getClientRect()" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/scrollIntoView-empty-args.html.ini b/tests/wpt/metadata/cssom-view/scrollIntoView-empty-args.html.ini
index d981842773e..c7addcc1db4 100644
--- a/tests/wpt/metadata/cssom-view/scrollIntoView-empty-args.html.ini
+++ b/tests/wpt/metadata/cssom-view/scrollIntoView-empty-args.html.ini
@@ -3,3 +3,21 @@
[scrollIntoView should behave correctly when the arg is not fully specified as ScrollIntoViewOptions]
expected: FAIL
+ [scrollIntoView should behave correctly when the arg is omitted]
+ expected: FAIL
+
+ [scrollIntoView should behave correctly when the arg is true]
+ expected: FAIL
+
+ [scrollIntoView should behave correctly when the arg is false]
+ expected: FAIL
+
+ [scrollIntoView should behave correctly when the arg is [object Object\]]
+ expected: FAIL
+
+ [scrollIntoView should behave correctly when the arg is null]
+ expected: FAIL
+
+ [scrollIntoView should behave correctly when the arg is undefined]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/scrollintoview.html.ini b/tests/wpt/metadata/cssom-view/scrollintoview.html.ini
new file mode 100644
index 00000000000..889a1524f16
--- /dev/null
+++ b/tests/wpt/metadata/cssom-view/scrollintoview.html.ini
@@ -0,0 +1,122 @@
+[scrollintoview.html]
+ type: testharness
+ [scrollIntoView() starting at left,top]
+ expected: FAIL
+
+ [scrollIntoView() starting at left,bottom]
+ expected: FAIL
+
+ [scrollIntoView() starting at right,top]
+ expected: FAIL
+
+ [scrollIntoView() starting at right,bottom]
+ expected: FAIL
+
+ [scrollIntoView(true) starting at left,top]
+ expected: FAIL
+
+ [scrollIntoView(true) starting at left,bottom]
+ expected: FAIL
+
+ [scrollIntoView(true) starting at right,top]
+ expected: FAIL
+
+ [scrollIntoView(true) starting at right,bottom]
+ expected: FAIL
+
+ [scrollIntoView(false) starting at left,top]
+ expected: FAIL
+
+ [scrollIntoView(false) starting at left,bottom]
+ expected: FAIL
+
+ [scrollIntoView(false) starting at right,top]
+ expected: FAIL
+
+ [scrollIntoView(false) starting at right,bottom]
+ expected: FAIL
+
+ [scrollIntoView(undefined) starting at left,top]
+ expected: FAIL
+
+ [scrollIntoView(undefined) starting at left,bottom]
+ expected: FAIL
+
+ [scrollIntoView(undefined) starting at right,top]
+ expected: FAIL
+
+ [scrollIntoView(undefined) starting at right,bottom]
+ expected: FAIL
+
+ [scrollIntoView(null) starting at left,top]
+ expected: FAIL
+
+ [scrollIntoView(null) starting at left,bottom]
+ expected: FAIL
+
+ [scrollIntoView(null) starting at right,top]
+ expected: FAIL
+
+ [scrollIntoView(null) starting at right,bottom]
+ expected: FAIL
+
+ [scrollIntoView({}) starting at left,top]
+ expected: FAIL
+
+ [scrollIntoView({}) starting at left,bottom]
+ expected: FAIL
+
+ [scrollIntoView({}) starting at right,top]
+ expected: FAIL
+
+ [scrollIntoView({}) starting at right,bottom]
+ expected: FAIL
+
+ [scrollIntoView({block: "center", inline: "center"}) starting at left,top]
+ expected: FAIL
+
+ [scrollIntoView({block: "center", inline: "center"}) starting at left,bottom]
+ expected: FAIL
+
+ [scrollIntoView({block: "center", inline: "center"}) starting at right,top]
+ expected: FAIL
+
+ [scrollIntoView({block: "center", inline: "center"}) starting at right,bottom]
+ expected: FAIL
+
+ [scrollIntoView({block: "start", inline: "start"}) starting at left,top]
+ expected: FAIL
+
+ [scrollIntoView({block: "start", inline: "start"}) starting at left,bottom]
+ expected: FAIL
+
+ [scrollIntoView({block: "start", inline: "start"}) starting at right,top]
+ expected: FAIL
+
+ [scrollIntoView({block: "start", inline: "start"}) starting at right,bottom]
+ expected: FAIL
+
+ [scrollIntoView({block: "end", inline: "end"}) starting at left,top]
+ expected: FAIL
+
+ [scrollIntoView({block: "end", inline: "end"}) starting at left,bottom]
+ expected: FAIL
+
+ [scrollIntoView({block: "end", inline: "end"}) starting at right,top]
+ expected: FAIL
+
+ [scrollIntoView({block: "end", inline: "end"}) starting at right,bottom]
+ expected: FAIL
+
+ [scrollIntoView({block: "nearest", inline: "nearest"}) starting at left,top]
+ expected: FAIL
+
+ [scrollIntoView({block: "nearest", inline: "nearest"}) starting at left,bottom]
+ expected: FAIL
+
+ [scrollIntoView({block: "nearest", inline: "nearest"}) starting at right,top]
+ expected: FAIL
+
+ [scrollIntoView({block: "nearest", inline: "nearest"}) starting at right,bottom]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom-view/ttwf-scrollintoview.html.ini b/tests/wpt/metadata/cssom-view/ttwf-scrollintoview.html.ini
deleted file mode 100644
index d34cce1b6e4..00000000000
--- a/tests/wpt/metadata/cssom-view/ttwf-scrollintoview.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[ttwf-scrollintoview.html]
- type: testharness
- [check scrollIntoView]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/cssom/MediaList.xhtml.ini b/tests/wpt/metadata/cssom/MediaList.xhtml.ini
deleted file mode 100644
index 4a38b8e3e91..00000000000
--- a/tests/wpt/metadata/cssom/MediaList.xhtml.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[MediaList.xhtml]
- type: testharness
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/cssom/MediaList2.xhtml.ini b/tests/wpt/metadata/cssom/MediaList2.xhtml.ini
new file mode 100644
index 00000000000..658a82191b4
--- /dev/null
+++ b/tests/wpt/metadata/cssom/MediaList2.xhtml.ini
@@ -0,0 +1,3 @@
+[MediaList2.xhtml]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/cssom/cssom-ruleTypeAndOrder.html.ini b/tests/wpt/metadata/cssom/cssom-ruleTypeAndOrder.html.ini
new file mode 100644
index 00000000000..22d72e03e3e
--- /dev/null
+++ b/tests/wpt/metadata/cssom/cssom-ruleTypeAndOrder.html.ini
@@ -0,0 +1,5 @@
+[cssom-ruleTypeAndOrder.html]
+ type: testharness
+ [Type of #s-6 is expected to be page rule]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom/getComputedStyle-pseudo.html.ini b/tests/wpt/metadata/cssom/getComputedStyle-pseudo.html.ini
index 3991ddbb2e8..8a71d1c334d 100644
--- a/tests/wpt/metadata/cssom/getComputedStyle-pseudo.html.ini
+++ b/tests/wpt/metadata/cssom/getComputedStyle-pseudo.html.ini
@@ -3,3 +3,9 @@
[Resolution of width is correct for ::before and ::after pseudo-elements of display: contents elements]
expected: FAIL
+ [Resolution of nonexistent pseudo-element styles]
+ expected: FAIL
+
+ [Item-based blockification of nonexistent pseudo-elements]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/cssom/index-003.html.ini b/tests/wpt/metadata/cssom/index-003.html.ini
deleted file mode 100644
index 4ac80d65a61..00000000000
--- a/tests/wpt/metadata/cssom/index-003.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[index-003.html]
- type: testharness
- [page rule is expected to be @page :first]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/cssom/interfaces.html.ini b/tests/wpt/metadata/cssom/interfaces.html.ini
index 0b9d9c1b706..49e36e1c06f 100644
--- a/tests/wpt/metadata/cssom/interfaces.html.ini
+++ b/tests/wpt/metadata/cssom/interfaces.html.ini
@@ -117,3 +117,432 @@
[CSSStyleDeclaration interface: attribute parentRule]
expected: FAIL
+ [ProcessingInstruction interface: xmlss_pi must inherit property "sheet" with the proper type]
+ expected: FAIL
+
+ [SVGElement interface: svg_element must inherit property "style" with the proper type]
+ expected: FAIL
+
+ [MediaList must be primary interface of style_element.sheet.media]
+ expected: FAIL
+
+ [Stringification of style_element.sheet.media]
+ expected: FAIL
+
+ [MediaList interface: style_element.sheet.media must inherit property "mediaText" with the proper type]
+ expected: FAIL
+
+ [MediaList interface: style_element.sheet.media must inherit property "length" with the proper type]
+ expected: FAIL
+
+ [MediaList interface: style_element.sheet.media must inherit property "item(unsigned long)" with the proper type]
+ expected: FAIL
+
+ [MediaList interface: calling item(unsigned long) on style_element.sheet.media with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [MediaList interface: style_element.sheet.media must inherit property "appendMedium(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [MediaList interface: calling appendMedium(CSSOMString) on style_element.sheet.media with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [MediaList interface: style_element.sheet.media must inherit property "deleteMedium(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [MediaList interface: calling deleteMedium(CSSOMString) on style_element.sheet.media with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleSheet interface: operation insertRule(CSSOMString, unsigned long)]
+ expected: FAIL
+
+ [CSSStyleSheet interface: style_element.sheet must inherit property "ownerRule" with the proper type]
+ expected: FAIL
+
+ [StyleSheet interface: style_element.sheet must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [StyleSheet interface: style_element.sheet must inherit property "ownerNode" with the proper type]
+ expected: FAIL
+
+ [StyleSheet interface: style_element.sheet must inherit property "parentStyleSheet" with the proper type]
+ expected: FAIL
+
+ [StyleSheet interface: style_element.sheet must inherit property "media" with the proper type]
+ expected: FAIL
+
+ [CSSStyleRule must be primary interface of style_element.sheet.cssRules[4\]]
+ expected: FAIL
+
+ [Stringification of style_element.sheet.cssRules[4\]]
+ expected: FAIL
+
+ [CSSStyleRule interface: style_element.sheet.cssRules[4\] must inherit property "selectorText" with the proper type]
+ expected: FAIL
+
+ [CSSStyleRule interface: style_element.sheet.cssRules[4\] must inherit property "style" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "STYLE_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "CHARSET_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "IMPORT_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "MEDIA_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "FONT_FACE_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "PAGE_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "MARGIN_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "NAMESPACE_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "cssText" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[4\] must inherit property "parentStyleSheet" with the proper type]
+ expected: FAIL
+
+ [CSSImportRule interface: style_element.sheet.cssRules[0\] must inherit property "href" with the proper type]
+ expected: FAIL
+
+ [CSSImportRule interface: style_element.sheet.cssRules[0\] must inherit property "media" with the proper type]
+ expected: FAIL
+
+ [CSSImportRule interface: style_element.sheet.cssRules[0\] must inherit property "styleSheet" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[0\] must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
+ [CSSGroupingRule interface: operation insertRule(CSSOMString, unsigned long)]
+ expected: FAIL
+
+ [CSSPageRule must be primary interface of style_element.sheet.cssRules[2\]]
+ expected: FAIL
+
+ [Stringification of style_element.sheet.cssRules[2\]]
+ expected: FAIL
+
+ [CSSPageRule interface: style_element.sheet.cssRules[2\] must inherit property "selectorText" with the proper type]
+ expected: FAIL
+
+ [CSSPageRule interface: style_element.sheet.cssRules[2\] must inherit property "style" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\] must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
+ [CSSMarginRule must be primary interface of style_element.sheet.cssRules[2\].cssRules[0\]]
+ expected: FAIL
+
+ [Stringification of style_element.sheet.cssRules[2\].cssRules[0\]]
+ expected: FAIL
+
+ [CSSMarginRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [CSSMarginRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "style" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "STYLE_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "CHARSET_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "IMPORT_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "MEDIA_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "FONT_FACE_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "PAGE_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "MARGIN_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "NAMESPACE_RULE" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "cssText" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[2\].cssRules[0\] must inherit property "parentStyleSheet" with the proper type]
+ expected: FAIL
+
+ [CSSRule interface: style_element.sheet.cssRules[1\] must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration must be primary interface of style_element.sheet.cssRules[4\].style]
+ expected: FAIL
+
+ [Stringification of style_element.sheet.cssRules[4\].style]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "cssText" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "length" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "item(unsigned long)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling item(unsigned long) on style_element.sheet.cssRules[4\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "getPropertyValue(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.sheet.cssRules[4\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.sheet.cssRules[4\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.sheet.cssRules[4\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.sheet.cssRules[4\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.sheet.cssRules[4\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "removeProperty(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.sheet.cssRules[4\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[4\].style must inherit property "cssFloat" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration must be primary interface of style_element.sheet.cssRules[2\].style]
+ expected: FAIL
+
+ [Stringification of style_element.sheet.cssRules[2\].style]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "cssText" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "length" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "item(unsigned long)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling item(unsigned long) on style_element.sheet.cssRules[2\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "getPropertyValue(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.sheet.cssRules[2\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.sheet.cssRules[2\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.sheet.cssRules[2\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "removeProperty(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.sheet.cssRules[2\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].style must inherit property "cssFloat" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration must be primary interface of style_element.sheet.cssRules[2\].cssRules[0\].style]
+ expected: FAIL
+
+ [Stringification of style_element.sheet.cssRules[2\].cssRules[0\].style]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "cssText" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "length" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "item(unsigned long)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling item(unsigned long) on style_element.sheet.cssRules[2\].cssRules[0\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "getPropertyValue(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on style_element.sheet.cssRules[2\].cssRules[0\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "getPropertyPriority(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on style_element.sheet.cssRules[2\].cssRules[0\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on style_element.sheet.cssRules[2\].cssRules[0\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2\].cssRules[0\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on style_element.sheet.cssRules[2\].cssRules[0\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "removeProperty(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on style_element.sheet.cssRules[2\].cssRules[0\].style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.sheet.cssRules[2\].cssRules[0\].style must inherit property "cssFloat" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: style_element.style must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration must be primary interface of svg_element.style]
+ expected: FAIL
+
+ [Stringification of svg_element.style]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "cssText" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "length" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "item(unsigned long)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling item(unsigned long) on svg_element.style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyValue(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling getPropertyValue(CSSOMString) on svg_element.style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "getPropertyPriority(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling getPropertyPriority(CSSOMString) on svg_element.style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "setProperty(CSSOMString, CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setProperty(CSSOMString, CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "setPropertyValue(CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setPropertyValue(CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "setPropertyPriority(CSSOMString, CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling setPropertyPriority(CSSOMString, CSSOMString) on svg_element.style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "removeProperty(CSSOMString)" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: calling removeProperty(CSSOMString) on svg_element.style with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: svg_element.style must inherit property "cssFloat" with the proper type]
+ expected: FAIL
+
+ [CSSStyleDeclaration interface: getComputedStyle(svg_element) must inherit property "parentRule" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/abort/event.any.js.ini b/tests/wpt/metadata/dom/abort/event.any.js.ini
new file mode 100644
index 00000000000..b2330c67e73
--- /dev/null
+++ b/tests/wpt/metadata/dom/abort/event.any.js.ini
@@ -0,0 +1,11 @@
+[event.any.html]
+ type: testharness
+ [AbortController() basics]
+ expected: FAIL
+
+
+[event.any.worker.html]
+ type: testharness
+ [AbortController() basics]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/events/Event-timestamp-high-resolution.html.ini b/tests/wpt/metadata/dom/events/Event-timestamp-high-resolution.html.ini
new file mode 100644
index 00000000000..3eb403727f6
--- /dev/null
+++ b/tests/wpt/metadata/dom/events/Event-timestamp-high-resolution.html.ini
@@ -0,0 +1,5 @@
+[Event-timestamp-high-resolution.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/events/Event-timestamp-safe-resolution.html.ini b/tests/wpt/metadata/dom/events/Event-timestamp-safe-resolution.html.ini
new file mode 100644
index 00000000000..f2a67345d6c
--- /dev/null
+++ b/tests/wpt/metadata/dom/events/Event-timestamp-safe-resolution.html.ini
@@ -0,0 +1,5 @@
+[Event-timestamp-safe-resolution.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/events/EventTarget-constructible.any.js.ini b/tests/wpt/metadata/dom/events/EventTarget-constructible.any.js.ini
new file mode 100644
index 00000000000..5d2f463627d
--- /dev/null
+++ b/tests/wpt/metadata/dom/events/EventTarget-constructible.any.js.ini
@@ -0,0 +1,17 @@
+[EventTarget-constructible.any.worker.html]
+ type: testharness
+ [A constructed EventTarget can be used as expected]
+ expected: FAIL
+
+ [EventTarget can be subclassed]
+ expected: FAIL
+
+
+[EventTarget-constructible.any.html]
+ type: testharness
+ [A constructed EventTarget can be used as expected]
+ expected: FAIL
+
+ [EventTarget can be subclassed]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/interface-objects.html.ini b/tests/wpt/metadata/dom/interface-objects.html.ini
new file mode 100644
index 00000000000..d36a5594af1
--- /dev/null
+++ b/tests/wpt/metadata/dom/interface-objects.html.ini
@@ -0,0 +1,8 @@
+[interface-objects.html]
+ type: testharness
+ [Should be able to delete AbortController.]
+ expected: FAIL
+
+ [Should be able to delete AbortSignal.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/interfaces.html.ini b/tests/wpt/metadata/dom/interfaces.html.ini
index b382f65e2a5..f523e4876e2 100644
--- a/tests/wpt/metadata/dom/interfaces.html.ini
+++ b/tests/wpt/metadata/dom/interfaces.html.ini
@@ -480,3 +480,327 @@
[CustomEvent interface: operation initCustomEvent(DOMString,boolean,boolean,any)]
expected: FAIL
+ [Event interface: operation initEvent(DOMString, boolean, boolean)]
+ expected: FAIL
+
+ [CustomEvent interface: operation initCustomEvent(DOMString, boolean, boolean, any)]
+ expected: FAIL
+
+ [EventTarget must be primary interface of new EventTarget()]
+ expected: FAIL
+
+ [Stringification of new EventTarget()]
+ expected: FAIL
+
+ [EventTarget interface: new EventTarget() must inherit property "addEventListener(DOMString, EventListener, [object Object\],[object Object\])" with the proper type]
+ expected: FAIL
+
+ [EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object\],[object Object\]) on new EventTarget() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [EventTarget interface: new EventTarget() must inherit property "removeEventListener(DOMString, EventListener, [object Object\],[object Object\])" with the proper type]
+ expected: FAIL
+
+ [EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object\],[object Object\]) on new EventTarget() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [EventTarget interface: new EventTarget() must inherit property "dispatchEvent(Event)" with the proper type]
+ expected: FAIL
+
+ [EventTarget interface: calling dispatchEvent(Event) on new EventTarget() with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [AbortController interface: existence and properties of interface object]
+ expected: FAIL
+
+ [AbortController interface object length]
+ expected: FAIL
+
+ [AbortController interface object name]
+ expected: FAIL
+
+ [AbortController interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [AbortController interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [AbortController interface: attribute signal]
+ expected: FAIL
+
+ [AbortController interface: operation abort()]
+ expected: FAIL
+
+ [AbortController must be primary interface of new AbortController()]
+ expected: FAIL
+
+ [Stringification of new AbortController()]
+ expected: FAIL
+
+ [AbortController interface: new AbortController() must inherit property "signal" with the proper type]
+ expected: FAIL
+
+ [AbortController interface: new AbortController() must inherit property "abort()" with the proper type]
+ expected: FAIL
+
+ [AbortSignal interface: existence and properties of interface object]
+ expected: FAIL
+
+ [AbortSignal interface object length]
+ expected: FAIL
+
+ [AbortSignal interface object name]
+ expected: FAIL
+
+ [AbortSignal interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [AbortSignal interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [AbortSignal interface: attribute aborted]
+ expected: FAIL
+
+ [AbortSignal interface: attribute onabort]
+ expected: FAIL
+
+ [AbortSignal must be primary interface of new AbortController().signal]
+ expected: FAIL
+
+ [Stringification of new AbortController().signal]
+ expected: FAIL
+
+ [AbortSignal interface: new AbortController().signal must inherit property "aborted" with the proper type]
+ expected: FAIL
+
+ [AbortSignal interface: new AbortController().signal must inherit property "onabort" with the proper type]
+ expected: FAIL
+
+ [EventTarget interface: new AbortController().signal must inherit property "addEventListener(DOMString, EventListener, [object Object\],[object Object\])" with the proper type]
+ expected: FAIL
+
+ [EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object\],[object Object\]) on new AbortController().signal with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [EventTarget interface: new AbortController().signal must inherit property "removeEventListener(DOMString, EventListener, [object Object\],[object Object\])" with the proper type]
+ expected: FAIL
+
+ [EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object\],[object Object\]) on new AbortController().signal with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [EventTarget interface: new AbortController().signal must inherit property "dispatchEvent(Event)" with the proper type]
+ expected: FAIL
+
+ [EventTarget interface: calling dispatchEvent(Event) on new AbortController().signal with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [MutationObserver interface: operation observe(Node, MutationObserverInit)]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "origin" with the proper type]
+ expected: FAIL
+
+ [Document interface: new Document() must inherit property "createCDATASection(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Node interface: new Document() must inherit property "isConnected" with the proper type]
+ expected: FAIL
+
+ [Document interface: xmlDoc must inherit property "origin" with the proper type]
+ expected: FAIL
+
+ [Document interface: xmlDoc must inherit property "createCDATASection(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Node interface: xmlDoc must inherit property "isConnected" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.doctype must inherit property "isConnected" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.createDocumentFragment() must inherit property "isConnected" with the proper type]
+ expected: FAIL
+
+ [Element interface: element must inherit property "slot" with the proper type]
+ expected: FAIL
+
+ [Element interface: element must inherit property "attachShadow(ShadowRootInit)" with the proper type]
+ expected: FAIL
+
+ [Element interface: element must inherit property "shadowRoot" with the proper type]
+ expected: FAIL
+
+ [Element interface: element must inherit property "assignedSlot" with the proper type]
+ expected: FAIL
+
+ [Node interface: element must inherit property "isConnected" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "ELEMENT_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "ATTRIBUTE_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "TEXT_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "CDATA_SECTION_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "ENTITY_REFERENCE_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "ENTITY_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "PROCESSING_INSTRUCTION_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "COMMENT_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "DOCUMENT_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "DOCUMENT_TYPE_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "DOCUMENT_FRAGMENT_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "NOTATION_NODE" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "nodeType" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "baseURI" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "isConnected" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "ownerDocument" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "getRootNode(GetRootNodeOptions)" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "parentNode" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "parentElement" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "hasChildNodes()" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "childNodes" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "firstChild" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "lastChild" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "previousSibling" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "nextSibling" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "normalize()" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "cloneNode(boolean)" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "isEqualNode(Node)" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "isSameNode(Node)" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "DOCUMENT_POSITION_DISCONNECTED" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "DOCUMENT_POSITION_PRECEDING" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "DOCUMENT_POSITION_FOLLOWING" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "DOCUMENT_POSITION_CONTAINS" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "DOCUMENT_POSITION_CONTAINED_BY" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "compareDocumentPosition(Node)" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "contains(Node)" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "lookupPrefix(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "lookupNamespaceURI(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "isDefaultNamespace(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "insertBefore(Node, Node)" with the proper type]
+ expected: FAIL
+
+ [Node interface: calling insertBefore(Node, Node) on document.querySelector("[id\]").attributes[0\] with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "appendChild(Node)" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "replaceChild(Node, Node)" with the proper type]
+ expected: FAIL
+
+ [Node interface: calling replaceChild(Node, Node) on document.querySelector("[id\]").attributes[0\] with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Node interface: document.querySelector("[id\]").attributes[0\] must inherit property "removeChild(Node)" with the proper type]
+ expected: FAIL
+
+ [EventTarget interface: document.querySelector("[id\]").attributes[0\] must inherit property "addEventListener(DOMString, EventListener, [object Object\],[object Object\])" with the proper type]
+ expected: FAIL
+
+ [EventTarget interface: calling addEventListener(DOMString, EventListener, [object Object\],[object Object\]) on document.querySelector("[id\]").attributes[0\] with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [EventTarget interface: document.querySelector("[id\]").attributes[0\] must inherit property "removeEventListener(DOMString, EventListener, [object Object\],[object Object\])" with the proper type]
+ expected: FAIL
+
+ [EventTarget interface: calling removeEventListener(DOMString, EventListener, [object Object\],[object Object\]) on document.querySelector("[id\]").attributes[0\] with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [EventTarget interface: document.querySelector("[id\]").attributes[0\] must inherit property "dispatchEvent(Event)" with the proper type]
+ expected: FAIL
+
+ [Text interface: document.createTextNode("abc") must inherit property "assignedSlot" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.createTextNode("abc") must inherit property "isConnected" with the proper type]
+ expected: FAIL
+
+ [Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isConnected" with the proper type]
+ expected: FAIL
+
+ [Node interface: document.createComment("abc") must inherit property "isConnected" with the proper type]
+ expected: FAIL
+
+ [DOMTokenList interface: document.body.classList must inherit property "supports(DOMString)" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html.ini b/tests/wpt/metadata/dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html.ini
deleted file mode 100644
index fd78368b14c..00000000000
--- a/tests/wpt/metadata/dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[contenttype_datauri_01.html]
- type: testharness
- [Data URI document.contentType === 'text/plain' when data URI MIME type is not set]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/dom/nodes/Document-createEvent.html.ini b/tests/wpt/metadata/dom/nodes/Document-createEvent.html.ini
index c47fbec27f9..36f25ed6a30 100644
--- a/tests/wpt/metadata/dom/nodes/Document-createEvent.html.ini
+++ b/tests/wpt/metadata/dom/nodes/Document-createEvent.html.ini
@@ -220,3 +220,18 @@
[Should throw NOT_SUPPORTED_ERR for non-legacy event interface "ProgressEvent"]
expected: FAIL
+ [Should throw NOT_SUPPORTED_ERR for non-legacy event interface "CloseEvent"]
+ expected: FAIL
+
+ [Should throw NOT_SUPPORTED_ERR for non-legacy event interface "ErrorEvent"]
+ expected: FAIL
+
+ [Should throw NOT_SUPPORTED_ERR for non-legacy event interface "PageTransitionEvent"]
+ expected: FAIL
+
+ [Should throw NOT_SUPPORTED_ERR for non-legacy event interface "PopStateEvent"]
+ expected: FAIL
+
+ [Should throw NOT_SUPPORTED_ERR for non-legacy event interface "WebGLContextEvent"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/traversal/NodeIterator.html.ini b/tests/wpt/metadata/dom/traversal/NodeIterator.html.ini
new file mode 100644
index 00000000000..e6d8f6eb579
--- /dev/null
+++ b/tests/wpt/metadata/dom/traversal/NodeIterator.html.ini
@@ -0,0 +1,5 @@
+[NodeIterator.html]
+ type: testharness
+ [Recursive filters need to throw]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/dom/traversal/TreeWalker.html.ini b/tests/wpt/metadata/dom/traversal/TreeWalker.html.ini
new file mode 100644
index 00000000000..254681666cb
--- /dev/null
+++ b/tests/wpt/metadata/dom/traversal/TreeWalker.html.ini
@@ -0,0 +1,5 @@
+[TreeWalker.html]
+ type: testharness
+ [Recursive filters need to throw]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/domparsing/XMLSerializer-serializeToString.html.ini b/tests/wpt/metadata/domparsing/XMLSerializer-serializeToString.html.ini
index 8adcd02d010..c11898eb2f0 100644
--- a/tests/wpt/metadata/domparsing/XMLSerializer-serializeToString.html.ini
+++ b/tests/wpt/metadata/domparsing/XMLSerializer-serializeToString.html.ini
@@ -3,3 +3,12 @@
[check XMLSerializer.serializeToString method could parsing xmldoc to string]
expected: FAIL
+ [check XMLSerializer.serializeToString method could parsing xmldoc to string]
+ expected: FAIL
+
+ [Check if the default namespace is correctly reset.]
+ expected: FAIL
+
+ [Check if there is no redundant empty namespace declaration.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/domparsing/xml-serialization.xhtml.ini b/tests/wpt/metadata/domparsing/xml-serialization.xhtml.ini
index e35d218f819..b1bd8c2f837 100644
--- a/tests/wpt/metadata/domparsing/xml-serialization.xhtml.ini
+++ b/tests/wpt/metadata/domparsing/xml-serialization.xhtml.ini
@@ -45,3 +45,9 @@
[ProcessingInstruction: target contains a 'COLON' (U+003A)]
expected: FAIL
+ [Element: href attributes are not percent-encoded]
+ expected: FAIL
+
+ [Element: query parts in href attributes are not percent-encoded]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/encoding/idlharness.html.ini b/tests/wpt/metadata/encoding/idlharness.html.ini
index f06e556e736..ed1d61cc78d 100644
--- a/tests/wpt/metadata/encoding/idlharness.html.ini
+++ b/tests/wpt/metadata/encoding/idlharness.html.ini
@@ -8,3 +8,6 @@
bug: https://github.com/servo/servo/issues/5600
expected: FAIL
+ [TextDecoder interface: new TextDecoder() must inherit property "ignoreBOM" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/encoding/iso-2022-jp-decoder.html.ini b/tests/wpt/metadata/encoding/iso-2022-jp-decoder.html.ini
index cb04667fae2..b2d42b895b6 100644
--- a/tests/wpt/metadata/encoding/iso-2022-jp-decoder.html.ini
+++ b/tests/wpt/metadata/encoding/iso-2022-jp-decoder.html.ini
@@ -4,9 +4,6 @@
[iso-2022-jp decoder: Error ESC]
expected: FAIL
- [iso-2022-jp decoder: ASCII ESC, character]
- expected: FAIL
-
[iso-2022-jp decoder: Double ASCII ESC, character]
expected: FAIL
diff --git a/tests/wpt/metadata/encoding/replacement-encodings.html.ini b/tests/wpt/metadata/encoding/replacement-encodings.html.ini
new file mode 100644
index 00000000000..7e3ea9188d0
--- /dev/null
+++ b/tests/wpt/metadata/encoding/replacement-encodings.html.ini
@@ -0,0 +1,20 @@
+[replacement-encodings.html]
+ type: testharness
+ [csiso2022kr - non-empty input decodes to one replacement character.]
+ expected: FAIL
+
+ [hz-gb-2312 - non-empty input decodes to one replacement character.]
+ expected: FAIL
+
+ [iso-2022-cn - non-empty input decodes to one replacement character.]
+ expected: FAIL
+
+ [iso-2022-cn-ext - non-empty input decodes to one replacement character.]
+ expected: FAIL
+
+ [iso-2022-kr - non-empty input decodes to one replacement character.]
+ expected: FAIL
+
+ [replacement - non-empty input decodes to one replacement character.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/encoding/unsupported-encodings.html.ini b/tests/wpt/metadata/encoding/unsupported-encodings.html.ini
new file mode 100644
index 00000000000..a646e98cb25
--- /dev/null
+++ b/tests/wpt/metadata/encoding/unsupported-encodings.html.ini
@@ -0,0 +1,20 @@
+[unsupported-encodings.html]
+ type: testharness
+ [UTF-32 with BOM should decode as UTF-16LE]
+ expected: FAIL
+
+ [utf-32 with BOM should decode as UTF-16LE]
+ expected: FAIL
+
+ [UTF-32LE with BOM should decode as UTF-16LE]
+ expected: FAIL
+
+ [utf-32le with BOM should decode as UTF-16LE]
+ expected: FAIL
+
+ [UTF-32be with BOM should decode as windows-1252]
+ expected: FAIL
+
+ [utf-32be with BOM should decode as windows-1252]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/encoding/utf-32.html.ini b/tests/wpt/metadata/encoding/utf-32.html.ini
new file mode 100644
index 00000000000..e765bc39ad0
--- /dev/null
+++ b/tests/wpt/metadata/encoding/utf-32.html.ini
@@ -0,0 +1,26 @@
+[utf-32.html]
+ type: testharness
+ [Expect resources/utf-32-big-endian-bom.html to parse as windows-1252]
+ expected: FAIL
+
+ [Expect resources/utf-32-big-endian-bom.xml to parse as windows-1252]
+ expected: FAIL
+
+ [Expect resources/utf-32-big-endian-nobom.html to parse as windows-1252]
+ expected: FAIL
+
+ [Expect resources/utf-32-big-endian-nobom.xml to parse as windows-1252]
+ expected: FAIL
+
+ [Expect resources/utf-32-little-endian-bom.html to parse as UTF-16LE]
+ expected: FAIL
+
+ [Expect resources/utf-32-little-endian-bom.xml to parse as UTF-16LE]
+ expected: FAIL
+
+ [Expect resources/utf-32-little-endian-nobom.html to parse as windows-1252]
+ expected: FAIL
+
+ [Expect resources/utf-32-little-endian-nobom.xml to parse as windows-1252]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/eventsource/format-field-id-null.htm.ini b/tests/wpt/metadata/eventsource/format-field-id-null.htm.ini
new file mode 100644
index 00000000000..c6d26911739
--- /dev/null
+++ b/tests/wpt/metadata/eventsource/format-field-id-null.htm.ini
@@ -0,0 +1,5 @@
+[format-field-id-null.htm]
+ type: testharness
+ [EventSource: U+0000 in id field]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/abort/cache.https.html.ini b/tests/wpt/metadata/fetch/api/abort/cache.https.html.ini
new file mode 100644
index 00000000000..dbd86e8a836
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/abort/cache.https.html.ini
@@ -0,0 +1,5 @@
+[cache.https.html]
+ type: testharness
+ [Request signals & the cache API]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/abort/general-serviceworker.https.html.ini b/tests/wpt/metadata/fetch/api/abort/general-serviceworker.https.html.ini
new file mode 100644
index 00000000000..255f1d956c5
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/abort/general-serviceworker.https.html.ini
@@ -0,0 +1,5 @@
+[general-serviceworker.https.html]
+ type: testharness
+ [General fetch abort tests in a service worker]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/abort/general-sharedworker.html.ini b/tests/wpt/metadata/fetch/api/abort/general-sharedworker.html.ini
new file mode 100644
index 00000000000..8bce567bf90
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/abort/general-sharedworker.html.ini
@@ -0,0 +1,5 @@
+[general-sharedworker.html]
+ type: testharness
+ [General fetch abort tests - shared worker]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/abort/general.any.js.ini b/tests/wpt/metadata/fetch/api/abort/general.any.js.ini
new file mode 100644
index 00000000000..8825bef8a9a
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/abort/general.any.js.ini
@@ -0,0 +1,11 @@
+[general.any.worker.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
+
+[general.any.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/abort/serviceworker-intercepted.https.html.ini b/tests/wpt/metadata/fetch/api/abort/serviceworker-intercepted.https.html.ini
new file mode 100644
index 00000000000..ef09369f8f9
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/abort/serviceworker-intercepted.https.html.ini
@@ -0,0 +1,5 @@
+[serviceworker-intercepted.https.html]
+ type: testharness
+ [Aborting fetch when intercepted by a service worker]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/basic/integrity-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/integrity-worker.html.ini
index ac2c3309cd9..b0388b78fe4 100644
--- a/tests/wpt/metadata/fetch/api/basic/integrity-worker.html.ini
+++ b/tests/wpt/metadata/fetch/api/basic/integrity-worker.html.ini
@@ -12,3 +12,9 @@
[CORS invalid integrity]
expected: FAIL
+ [Empty string integrity for opaque response]
+ expected: FAIL
+
+ [SHA-* integrity for opaque response]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/basic/integrity.html.ini b/tests/wpt/metadata/fetch/api/basic/integrity.html.ini
index caefc524dc1..9bdd3c7398e 100644
--- a/tests/wpt/metadata/fetch/api/basic/integrity.html.ini
+++ b/tests/wpt/metadata/fetch/api/basic/integrity.html.ini
@@ -12,3 +12,9 @@
[CORS invalid integrity]
expected: FAIL
+ [Empty string integrity for opaque response]
+ expected: FAIL
+
+ [SHA-* integrity for opaque response]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-expose-star-worker.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-expose-star-worker.html.ini
index 29c5c9ab4b7..e0712fc68d6 100644
--- a/tests/wpt/metadata/fetch/api/cors/cors-expose-star-worker.html.ini
+++ b/tests/wpt/metadata/fetch/api/cors/cors-expose-star-worker.html.ini
@@ -6,3 +6,9 @@
[Cannot use * for credentialed fetches]
expected: FAIL
+ [* for credentialed fetches only matches literally]
+ expected: FAIL
+
+ [* can be one of several values]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-expose-star.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-expose-star.html.ini
index ca034df2169..2dcee9d9ad6 100644
--- a/tests/wpt/metadata/fetch/api/cors/cors-expose-star.html.ini
+++ b/tests/wpt/metadata/fetch/api/cors/cors-expose-star.html.ini
@@ -3,3 +3,6 @@
[Basic Access-Control-Expose-Headers: * support]
expected: FAIL
+ [* can be one of several values]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-filtering-worker.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-filtering-worker.html.ini
index 67cc3928cc3..9d4c18999c2 100644
--- a/tests/wpt/metadata/fetch/api/cors/cors-filtering-worker.html.ini
+++ b/tests/wpt/metadata/fetch/api/cors/cors-filtering-worker.html.ini
@@ -3,6 +3,6 @@
[CORS filter on Set-Cookie header]
expected: FAIL
- [CORS filter on Set-Cookie2 header, header is forbidden]
+ [CORS filter on Set-Cookie header, header is forbidden]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-filtering.html.ini b/tests/wpt/metadata/fetch/api/cors/cors-filtering.html.ini
index 0c704314113..d2e48109f68 100644
--- a/tests/wpt/metadata/fetch/api/cors/cors-filtering.html.ini
+++ b/tests/wpt/metadata/fetch/api/cors/cors-filtering.html.ini
@@ -1,5 +1,8 @@
[cors-filtering.html]
type: testharness
- [CORS filter on Set-Cookie2 header, header is forbidden]
+ [CORS filter on Set-Cookie header]
+ expected: FAIL
+
+ [CORS filter on Set-Cookie header, header is forbidden]
expected: FAIL
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-preflight-cache.any.js.ini b/tests/wpt/metadata/fetch/api/cors/cors-preflight-cache.any.js.ini
new file mode 100644
index 00000000000..b258f6fc49d
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/cors/cors-preflight-cache.any.js.ini
@@ -0,0 +1,11 @@
+[cors-preflight-cache.any.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
+
+[cors-preflight-cache.any.worker.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/cors/cors-preflight-star.any.js.ini b/tests/wpt/metadata/fetch/api/cors/cors-preflight-star.any.js.ini
index 80e5531ccfe..385bc215a33 100644
--- a/tests/wpt/metadata/fetch/api/cors/cors-preflight-star.any.js.ini
+++ b/tests/wpt/metadata/fetch/api/cors/cors-preflight-star.any.js.ini
@@ -12,6 +12,12 @@
[CORS that fails with credentials: true; method: GET (allowed: *); header: X-Test,1 (allowed: *)]
expected: FAIL
+ [CORS that succeeds with credentials: true; method: PUT (allowed: PUT); header: (allowed: *)]
+ expected: FAIL
+
+ [CORS that succeeds with credentials: true; method: * (allowed: *); header: *,1 (allowed: *)]
+ expected: FAIL
+
[cors-preflight-star.any.worker.html]
type: testharness
@@ -24,3 +30,9 @@
[CORS that succeeds with credentials: false; method: GET (allowed: get); header: X-Test,1 (allowed: x-test)]
expected: FAIL
+ [CORS that succeeds with credentials: true; method: PUT (allowed: PUT); header: (allowed: *)]
+ expected: FAIL
+
+ [CORS that succeeds with credentials: true; method: * (allowed: *); header: *,1 (allowed: *)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/headers/headers-combine.html.ini b/tests/wpt/metadata/fetch/api/headers/headers-combine.html.ini
index f12bddcc5c9..3ecf3b576f7 100644
--- a/tests/wpt/metadata/fetch/api/headers/headers-combine.html.ini
+++ b/tests/wpt/metadata/fetch/api/headers/headers-combine.html.ini
@@ -6,3 +6,9 @@
[Check append methods when called with already used name]
expected: FAIL
+ [Iterate combined values]
+ expected: FAIL
+
+ [Iterate combined values in sorted order]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/request/request-error.html.ini b/tests/wpt/metadata/fetch/api/request/request-error.html.ini
new file mode 100644
index 00000000000..927d8bc675b
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/request/request-error.html.ini
@@ -0,0 +1,5 @@
+[request-error.html]
+ type: testharness
+ [Request error]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/request/request-idl.html.ini b/tests/wpt/metadata/fetch/api/request/request-idl.html.ini
index fbcb94902e6..dec37325cb8 100644
--- a/tests/wpt/metadata/fetch/api/request/request-idl.html.ini
+++ b/tests/wpt/metadata/fetch/api/request/request-idl.html.ini
@@ -27,3 +27,9 @@
[Request interface: new Request("") must inherit property "arrayBuffer" with the proper type (15)]
expected: FAIL
+ [Request interface: new Request("") must inherit property "body" with the proper type]
+ expected: FAIL
+
+ [Request interface: new Request("") must inherit property "arrayBuffer()" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/request/request-type-attribute-historical.html.ini b/tests/wpt/metadata/fetch/api/request/request-type-attribute-historical.html.ini
new file mode 100644
index 00000000000..38d61a7f7cc
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/request/request-type-attribute-historical.html.ini
@@ -0,0 +1,5 @@
+[request-type-attribute-historical.html]
+ type: testharness
+ ['type' getter should not exist on Request objects]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/response/response-cancel-stream.html.ini b/tests/wpt/metadata/fetch/api/response/response-cancel-stream.html.ini
index 772b1b6822a..e5bd06a3de3 100644
--- a/tests/wpt/metadata/fetch/api/response/response-cancel-stream.html.ini
+++ b/tests/wpt/metadata/fetch/api/response/response-cancel-stream.html.ini
@@ -18,3 +18,6 @@
[Cancelling a closed Response stream]
expected: FAIL
+ [Response consume blob and http bodies]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/response/response-idl.html.ini b/tests/wpt/metadata/fetch/api/response/response-idl.html.ini
index 45d7ab91c23..d94659d4f16 100644
--- a/tests/wpt/metadata/fetch/api/response/response-idl.html.ini
+++ b/tests/wpt/metadata/fetch/api/response/response-idl.html.ini
@@ -39,3 +39,12 @@
[Response interface: new Response() must inherit property "arrayBuffer" with the proper type (12)]
expected: FAIL
+ [Response interface: new Response() must inherit property "trailer" with the proper type]
+ expected: FAIL
+
+ [Response interface: new Response() must inherit property "body" with the proper type]
+ expected: FAIL
+
+ [Response interface: new Response() must inherit property "arrayBuffer()" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/api/response/response-stream-disturbed-6.html.ini b/tests/wpt/metadata/fetch/api/response/response-stream-disturbed-6.html.ini
new file mode 100644
index 00000000000..5004396f961
--- /dev/null
+++ b/tests/wpt/metadata/fetch/api/response/response-stream-disturbed-6.html.ini
@@ -0,0 +1,17 @@
+[response-stream-disturbed-6.html]
+ type: testharness
+ [A non-closed stream on which read() has been called]
+ expected: FAIL
+
+ [A non-closed stream on which cancel() has been called]
+ expected: FAIL
+
+ [A closed stream on which read() has been called]
+ expected: FAIL
+
+ [An errored stream on which read() has been called]
+ expected: FAIL
+
+ [An errored stream on which cancel() has been called]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html.ini b/tests/wpt/metadata/fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html.ini
new file mode 100644
index 00000000000..3906138abaf
--- /dev/null
+++ b/tests/wpt/metadata/fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html.ini
@@ -0,0 +1,45 @@
+[dangling-markup-mitigation-data-url.tentative.sub.html]
+ type: testharness
+ expected: TIMEOUT
+ [<img id="dangling" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">]
+ expected: FAIL
+
+ [<img id="dangling" src="data:image/png;base64,&#10;iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">]
+ expected: FAIL
+
+ [<img id="dangling" src="data:image/png;base64,i&#10;VBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">]
+ expected: FAIL
+
+ [<img id="dangling" src="data:image/svg+xml;utf8,\\n <svg width='1' height='1' xmlns='http://www.w3.org/2000/svg'>\\n <rect width='100%' height='100%' fill='rebeccapurple'/>\\n <rect x='10%' y='10%' width='80%' height='80%' fill='lightgreen'/>\\n </svg>">]
+ expected: FAIL
+
+ [<iframe id="dangling"\\n src="data:text/html,\\n <img\\n onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'\\n onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'\\n src='http://web-platform.test:8000/images/gr&#10;een-256x256.png'>\\n ">\\n </iframe>]
+ expected: TIMEOUT
+
+ [<iframe id="dangling"\\n src="data:text/html,\\n <img\\n onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'\\n onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'\\n src='http://web-platform.test:8000/images/green-256x256.png?&lt;'>\\n ">\\n </iframe>]
+ expected: TIMEOUT
+
+ [<iframe id="dangling"\\n src="data:text/html,\\n <img\\n onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'\\n onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'\\n src='http://web-platform.test:8000/images/gr&#10;een-256x256.png?&amp;amp;lt;'>\\n ">\\n </iframe>]
+ expected: TIMEOUT
+
+ [<iframe id="dangling"\\n src="data:text/html,\\n <img\\n onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'\\n onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'\\n src='http://web-platform.test:8000/images/green-256x256.png?&amp;amp;#10;&lt;'>\\n ">\\n </iframe>]
+ expected: TIMEOUT
+
+ [<iframe id="dangling"\\n src="data:text/html,\\n <img\\n onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'\\n onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'\\n src='http://web-platform.test:8000/images/gr&#10;een-256x256.png?&lt;'>\\n ">\\n </iframe>]
+ expected: TIMEOUT
+
+ [<iframe id="dangling"\\n src=" data:text/html,\\n <img\\n onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'\\n onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'\\n src='http://web-platform.test:8000/images/gr&#10;een-256x256.png?&lt;'>\\n ">\\n </iframe>]
+ expected: TIMEOUT
+
+ [<iframe id="dangling"\\n src="\\ndata:text/html,\\n <img\\n onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'\\n onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'\\n src='http://web-platform.test:8000/images/gr&#10;een-256x256.png?&lt;'>\\n ">\\n </iframe>]
+ expected: TIMEOUT
+
+ [<iframe id="dangling"\\n src="&#10;data:text/html,\\n <img\\n onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'\\n onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'\\n src='http://web-platform.test:8000/images/gr&#10;een-256x256.png?&lt;'>\\n ">\\n </iframe>]
+ expected: TIMEOUT
+
+ [<iframe id="dangling"\\n src="\\tdata:text/html,\\n <img\\n onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'\\n onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'\\n src='http://web-platform.test:8000/images/gr&#10;een-256x256.png?&lt;'>\\n ">\\n </iframe>]
+ expected: TIMEOUT
+
+ [<iframe id="dangling"\\n src="\\rdata:text/html,\\n <img\\n onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'\\n onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'\\n src='http://web-platform.test:8000/images/gr&#10;een-256x256.png?&lt;'>\\n ">\\n </iframe>]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html.ini b/tests/wpt/metadata/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html.ini
new file mode 100644
index 00000000000..2fc8b31f6c0
--- /dev/null
+++ b/tests/wpt/metadata/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html.ini
@@ -0,0 +1,15 @@
+[document-fullscreen-enabled-cross-origin.sub.html]
+ type: testharness
+ expected: TIMEOUT
+ [Fullscreen enabled test: same-origin-default]
+ expected: NOTRUN
+
+ [Fullscreen enabled test: same-origin-allow]
+ expected: NOTRUN
+
+ [Fullscreen enabled test: cross-origin-default]
+ expected: NOTRUN
+
+ [Fullscreen enabled test: cross-origin-allow]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/fullscreen/interfaces.html.ini b/tests/wpt/metadata/fullscreen/interfaces.html.ini
index 208654a6624..ae41b376b2f 100644
--- a/tests/wpt/metadata/fullscreen/interfaces.html.ini
+++ b/tests/wpt/metadata/fullscreen/interfaces.html.ini
@@ -30,3 +30,9 @@
[Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenerror" with the proper type (36)]
expected: FAIL
+ [Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenchange" with the proper type]
+ expected: FAIL
+
+ [Element interface: document.createElementNS(null, "test") must inherit property "onfullscreenerror" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/hr-time/idlharness.html.ini b/tests/wpt/metadata/hr-time/idlharness.html.ini
index fb20250b14f..028cee6abc5 100644
--- a/tests/wpt/metadata/hr-time/idlharness.html.ini
+++ b/tests/wpt/metadata/hr-time/idlharness.html.ini
@@ -6,3 +6,18 @@
[Performance interface: existence and properties of interface prototype object]
expected: FAIL
+ [Performance interface: attribute timeOrigin]
+ expected: FAIL
+
+ [Performance interface: operation toJSON()]
+ expected: FAIL
+
+ [Performance interface: [object Performance\] must inherit property "timeOrigin" with the proper type]
+ expected: FAIL
+
+ [Performance interface: [object Performance\] must inherit property "toJSON()" with the proper type]
+ expected: FAIL
+
+ [Test default toJSON operation of Performance]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/hr-time/timeOrigin.html.ini b/tests/wpt/metadata/hr-time/timeOrigin.html.ini
new file mode 100644
index 00000000000..0ac417723d6
--- /dev/null
+++ b/tests/wpt/metadata/hr-time/timeOrigin.html.ini
@@ -0,0 +1,11 @@
+[timeOrigin.html]
+ type: testharness
+ [Window timeOrigin is close to Date.now() when there is no system clock adjustment.]
+ expected: FAIL
+
+ [Window and worker timeOrigins are close when created one after another.]
+ expected: FAIL
+
+ [Window and worker timeOrigins differ when worker is created after a delay.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/hr-time/window-worker-timeOrigin.window.js.ini b/tests/wpt/metadata/hr-time/window-worker-timeOrigin.window.js.ini
new file mode 100644
index 00000000000..ed7a2abc933
--- /dev/null
+++ b/tests/wpt/metadata/hr-time/window-worker-timeOrigin.window.js.ini
@@ -0,0 +1,5 @@
+[window-worker-timeOrigin.window.html]
+ type: testharness
+ [timeOrigin and now() should be correctly ordered between window and worker]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html.ini
new file mode 100644
index 00000000000..99ceba7dc39
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html.ini
@@ -0,0 +1,6 @@
+[window-name-after-cross-origin-aux-frame-navigation.sub.html]
+ type: testharness
+ expected: ERROR
+ [Test that the window name is correct]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html.ini
new file mode 100644
index 00000000000..e845bbb5ca0
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html.ini
@@ -0,0 +1,3 @@
+[window-name-after-cross-origin-main-frame-navigation.sub.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html.ini
new file mode 100644
index 00000000000..4aee46d8f3b
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html.ini
@@ -0,0 +1,6 @@
+[window-name-after-cross-origin-sub-frame-navigation.sub.html]
+ type: testharness
+ expected: TIMEOUT
+ [Test that the window name is correct]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html.ini
new file mode 100644
index 00000000000..51401a84708
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html.ini
@@ -0,0 +1,6 @@
+[window-name-after-same-origin-aux-frame-navigation.sub.html]
+ type: testharness
+ expected: ERROR
+ [Test that the window name is correct]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html.ini
new file mode 100644
index 00000000000..ba6fc505ce8
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html.ini
@@ -0,0 +1,3 @@
+[window-name-after-same-origin-main-frame-navigation.sub.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html.ini
new file mode 100644
index 00000000000..7f5b039093c
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html.ini
@@ -0,0 +1,6 @@
+[window-name-after-same-origin-sub-frame-navigation.sub.html]
+ type: testharness
+ expected: TIMEOUT
+ [Test that the window name is correct]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html.ini
new file mode 100644
index 00000000000..01d3096e84a
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html.ini
@@ -0,0 +1,5 @@
+[forward-triggers-hashchange.html]
+ type: testharness
+ [Navigating forward after replace() should still trigger hashchange]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html.ini
new file mode 100644
index 00000000000..6d7012d4444
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html.ini
@@ -0,0 +1,5 @@
+[replacement-enabled.html]
+ type: testharness
+ [Navigating to a fragment should not clear forward history]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html.ini b/tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html.ini
new file mode 100644
index 00000000000..86f6db6e6e5
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html.ini
@@ -0,0 +1,5 @@
+[scroll-frag-percent-encoded.html]
+ type: testharness
+ [Fragment Navigation: fragment id should be percent-decoded]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/history/the-history-interface/history_properties_only_fully_active.html.ini b/tests/wpt/metadata/html/browsers/history/the-history-interface/history_properties_only_fully_active.html.ini
new file mode 100644
index 00000000000..d4e7acd2878
--- /dev/null
+++ b/tests/wpt/metadata/html/browsers/history/the-history-interface/history_properties_only_fully_active.html.ini
@@ -0,0 +1,5 @@
+[history_properties_only_fully_active.html]
+ type: testharness
+ [history properties should throw SecurityError when not in a fully active Document]
+ expected: FAIL
+
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 81f700cd881..4b1075dca87 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
@@ -18,3 +18,6 @@
[Check if window['a'\] contains all applet, embed, form, img, and object elements, and their order]
expected: FAIL
+ [Check if window['a'\] contains all embed, form, img, and object elements, and their order]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/browsers/the-window-object/window-indexed-properties.html.ini b/tests/wpt/metadata/html/browsers/the-window-object/window-indexed-properties.html.ini
index 3d24389f80e..fcb46bc7250 100644
--- a/tests/wpt/metadata/html/browsers/the-window-object/window-indexed-properties.html.ini
+++ b/tests/wpt/metadata/html/browsers/the-window-object/window-indexed-properties.html.ini
@@ -3,3 +3,6 @@
[Indexed properties of the window object (non-strict mode) 1]
expected: FAIL
+ [Ensure indexed properties have the correct configuration]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/nameditem-03.html.ini b/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/nameditem-03.html.ini
new file mode 100644
index 00000000000..2958573f6ca
--- /dev/null
+++ b/tests/wpt/metadata/html/dom/documents/dom-tree-accessors/nameditem-03.html.ini
@@ -0,0 +1,5 @@
+[nameditem-03.html]
+ type: testharness
+ [applet elements are (mostly) gone]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/historical.html.ini b/tests/wpt/metadata/html/dom/historical.html.ini
new file mode 100644
index 00000000000..461ce9164b9
--- /dev/null
+++ b/tests/wpt/metadata/html/dom/historical.html.ini
@@ -0,0 +1,17 @@
+[historical.html]
+ type: testharness
+ [document.applets is always empty]
+ expected: FAIL
+
+ [HTMLAppletElement is no more]
+ expected: FAIL
+
+ [document.all cannot find applet]
+ expected: FAIL
+
+ [document cannot find applet]
+ expected: FAIL
+
+ [applet is not styled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini
index e380802f1ce..8cfae61d852 100644
--- a/tests/wpt/metadata/html/dom/interfaces.html.ini
+++ b/tests/wpt/metadata/html/dom/interfaces.html.ini
@@ -10125,1515 +10125,4185 @@
[HTMLMenuElement interface: document.createElement("menu") must inherit property "compact" with the proper type (0)]
expected: FAIL
- [Window interface: internal [[SetPrototypeOf\]\] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false]
+ [Window interface: operation postMessage(any,DOMString,[object Object\])]
expected: FAIL
- [Window interface: existence and properties of interface prototype object's "constructor" property]
+ [Window interface: attribute onloadend]
expected: FAIL
- [Window interface: attribute self]
+ [Window interface: attribute onmessageerror]
expected: FAIL
- [Window interface: attribute history]
+ [Window interface: operation setTimeout(TimerHandler,long,any)]
expected: FAIL
- [Window interface: attribute status]
+ [Window interface: operation setInterval(TimerHandler,long,any)]
expected: FAIL
- [Window interface: operation close()]
+ [Window interface: window must inherit property "self" with the proper type (1)]
expected: FAIL
- [Window interface: attribute closed]
+ [Window interface: window must inherit property "history" with the proper type (5)]
expected: FAIL
- [Window interface: attribute frames]
+ [Window interface: window must inherit property "status" with the proper type (12)]
expected: FAIL
- [Window interface: attribute frameElement]
+ [Window interface: window must inherit property "close" with the proper type (13)]
expected: FAIL
- [Window interface: attribute navigator]
+ [Window interface: window must inherit property "closed" with the proper type (14)]
expected: FAIL
- [Window interface: operation alert()]
+ [Window interface: window must inherit property "frames" with the proper type (18)]
expected: FAIL
- [Window interface: operation postMessage(any,DOMString,[object Object\])]
+ [Window interface: window must inherit property "parent" with the proper type (22)]
expected: FAIL
- [Window interface: operation captureEvents()]
+ [Window interface: window must inherit property "frameElement" with the proper type (23)]
expected: FAIL
- [Window interface: operation releaseEvents()]
+ [Window interface: window must inherit property "navigator" with the proper type (27)]
expected: FAIL
- [Window interface: attribute onabort]
+ [Window interface: window must inherit property "alert" with the proper type (30)]
expected: FAIL
- [Window interface: attribute onblur]
+ [Window interface: window must inherit property "postMessage" with the proper type (34)]
expected: FAIL
- [Window interface: attribute oncancel]
+ [Window interface: calling postMessage(any,DOMString,[object Object\]) on window with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: attribute oncanplay]
+ [Window interface: window must inherit property "captureEvents" with the proper type (35)]
expected: FAIL
- [Window interface: attribute oncanplaythrough]
+ [Window interface: window must inherit property "releaseEvents" with the proper type (36)]
expected: FAIL
- [Window interface: attribute onchange]
+ [Window interface: window must inherit property "onabort" with the proper type (37)]
expected: FAIL
- [Window interface: attribute onclick]
+ [Window interface: window must inherit property "onauxclick" with the proper type (38)]
expected: FAIL
- [Window interface: attribute onclose]
+ [Window interface: window must inherit property "onblur" with the proper type (39)]
expected: FAIL
- [Window interface: attribute oncontextmenu]
+ [Window interface: window must inherit property "oncancel" with the proper type (40)]
expected: FAIL
- [Window interface: attribute oncuechange]
+ [Window interface: window must inherit property "oncanplay" with the proper type (41)]
expected: FAIL
- [Window interface: attribute ondblclick]
+ [Window interface: window must inherit property "oncanplaythrough" with the proper type (42)]
expected: FAIL
- [Window interface: attribute ondrag]
+ [Window interface: window must inherit property "onchange" with the proper type (43)]
expected: FAIL
- [Window interface: attribute ondragend]
+ [Window interface: window must inherit property "onclick" with the proper type (44)]
expected: FAIL
- [Window interface: attribute ondragenter]
+ [Window interface: window must inherit property "onclose" with the proper type (45)]
expected: FAIL
- [Window interface: attribute ondragexit]
+ [Window interface: window must inherit property "oncontextmenu" with the proper type (46)]
expected: FAIL
- [Window interface: attribute ondragleave]
+ [Window interface: window must inherit property "oncuechange" with the proper type (47)]
expected: FAIL
- [Window interface: attribute ondragover]
+ [Window interface: window must inherit property "ondblclick" with the proper type (48)]
expected: FAIL
- [Window interface: attribute ondragstart]
+ [Window interface: window must inherit property "ondrag" with the proper type (49)]
expected: FAIL
- [Window interface: attribute ondrop]
+ [Window interface: window must inherit property "ondragend" with the proper type (50)]
expected: FAIL
- [Window interface: attribute ondurationchange]
+ [Window interface: window must inherit property "ondragenter" with the proper type (51)]
expected: FAIL
- [Window interface: attribute onemptied]
+ [Window interface: window must inherit property "ondragexit" with the proper type (52)]
expected: FAIL
- [Window interface: attribute onended]
+ [Window interface: window must inherit property "ondragleave" with the proper type (53)]
expected: FAIL
- [Window interface: attribute onerror]
+ [Window interface: window must inherit property "ondragover" with the proper type (54)]
expected: FAIL
- [Window interface: attribute onfocus]
+ [Window interface: window must inherit property "ondragstart" with the proper type (55)]
expected: FAIL
- [Window interface: attribute oninput]
+ [Window interface: window must inherit property "ondrop" with the proper type (56)]
expected: FAIL
- [Window interface: attribute oninvalid]
+ [Window interface: window must inherit property "ondurationchange" with the proper type (57)]
expected: FAIL
- [Window interface: attribute onkeydown]
+ [Window interface: window must inherit property "onemptied" with the proper type (58)]
expected: FAIL
- [Window interface: attribute onkeypress]
+ [Window interface: window must inherit property "onended" with the proper type (59)]
expected: FAIL
- [Window interface: attribute onkeyup]
+ [Window interface: window must inherit property "onerror" with the proper type (60)]
expected: FAIL
- [Window interface: attribute onload]
+ [Window interface: window must inherit property "onfocus" with the proper type (61)]
expected: FAIL
- [Window interface: attribute onloadeddata]
+ [Window interface: window must inherit property "oninput" with the proper type (62)]
expected: FAIL
- [Window interface: attribute onloadedmetadata]
+ [Window interface: window must inherit property "oninvalid" with the proper type (63)]
expected: FAIL
- [Window interface: attribute onloadend]
+ [Window interface: window must inherit property "onkeydown" with the proper type (64)]
expected: FAIL
- [Window interface: attribute onloadstart]
+ [Window interface: window must inherit property "onkeypress" with the proper type (65)]
expected: FAIL
- [Window interface: attribute onmousedown]
+ [Window interface: window must inherit property "onkeyup" with the proper type (66)]
expected: FAIL
- [Window interface: attribute onmouseenter]
+ [Window interface: window must inherit property "onload" with the proper type (67)]
expected: FAIL
- [Window interface: attribute onmouseleave]
+ [Window interface: window must inherit property "onloadeddata" with the proper type (68)]
expected: FAIL
- [Window interface: attribute onmousemove]
+ [Window interface: window must inherit property "onloadedmetadata" with the proper type (69)]
expected: FAIL
- [Window interface: attribute onmouseout]
+ [Window interface: window must inherit property "onloadend" with the proper type (70)]
expected: FAIL
- [Window interface: attribute onmouseover]
+ [Window interface: window must inherit property "onloadstart" with the proper type (71)]
expected: FAIL
- [Window interface: attribute onmouseup]
+ [Window interface: window must inherit property "onmousedown" with the proper type (72)]
expected: FAIL
- [Window interface: attribute onwheel]
+ [Window interface: window must inherit property "onmouseenter" with the proper type (73)]
expected: FAIL
- [Window interface: attribute onpause]
+ [Window interface: window must inherit property "onmouseleave" with the proper type (74)]
expected: FAIL
- [Window interface: attribute onplay]
+ [Window interface: window must inherit property "onmousemove" with the proper type (75)]
expected: FAIL
- [Window interface: attribute onplaying]
+ [Window interface: window must inherit property "onmouseout" with the proper type (76)]
expected: FAIL
- [Window interface: attribute onprogress]
+ [Window interface: window must inherit property "onmouseover" with the proper type (77)]
expected: FAIL
- [Window interface: attribute onratechange]
+ [Window interface: window must inherit property "onmouseup" with the proper type (78)]
expected: FAIL
- [Window interface: attribute onreset]
+ [Window interface: window must inherit property "onwheel" with the proper type (79)]
expected: FAIL
- [Window interface: attribute onresize]
+ [Window interface: window must inherit property "onpause" with the proper type (80)]
expected: FAIL
- [Window interface: attribute onscroll]
+ [Window interface: window must inherit property "onplay" with the proper type (81)]
expected: FAIL
- [Window interface: attribute onseeked]
+ [Window interface: window must inherit property "onplaying" with the proper type (82)]
expected: FAIL
- [Window interface: attribute onseeking]
+ [Window interface: window must inherit property "onprogress" with the proper type (83)]
expected: FAIL
- [Window interface: attribute onselect]
+ [Window interface: window must inherit property "onratechange" with the proper type (84)]
expected: FAIL
- [Window interface: attribute onstalled]
+ [Window interface: window must inherit property "onreset" with the proper type (85)]
expected: FAIL
- [Window interface: attribute onsubmit]
+ [Window interface: window must inherit property "onresize" with the proper type (86)]
expected: FAIL
- [Window interface: attribute onsuspend]
+ [Window interface: window must inherit property "onscroll" with the proper type (87)]
expected: FAIL
- [Window interface: attribute ontimeupdate]
+ [Window interface: window must inherit property "onseeked" with the proper type (88)]
expected: FAIL
- [Window interface: attribute ontoggle]
+ [Window interface: window must inherit property "onseeking" with the proper type (89)]
expected: FAIL
- [Window interface: attribute onvolumechange]
+ [Window interface: window must inherit property "onselect" with the proper type (90)]
expected: FAIL
- [Window interface: attribute onwaiting]
+ [Window interface: window must inherit property "onstalled" with the proper type (91)]
expected: FAIL
- [Window interface: attribute onafterprint]
+ [Window interface: window must inherit property "onsubmit" with the proper type (92)]
expected: FAIL
- [Window interface: attribute onbeforeprint]
+ [Window interface: window must inherit property "onsuspend" with the proper type (93)]
expected: FAIL
- [Window interface: attribute onbeforeunload]
+ [Window interface: window must inherit property "ontimeupdate" with the proper type (94)]
expected: FAIL
- [Window interface: attribute onhashchange]
+ [Window interface: window must inherit property "ontoggle" with the proper type (95)]
expected: FAIL
- [Window interface: attribute onlanguagechange]
+ [Window interface: window must inherit property "onvolumechange" with the proper type (96)]
expected: FAIL
- [Window interface: attribute onmessage]
+ [Window interface: window must inherit property "onwaiting" with the proper type (97)]
expected: FAIL
- [Window interface: attribute onmessageerror]
+ [Window interface: window must inherit property "onafterprint" with the proper type (98)]
expected: FAIL
- [Window interface: attribute onoffline]
+ [Window interface: window must inherit property "onbeforeprint" with the proper type (99)]
expected: FAIL
- [Window interface: attribute ononline]
+ [Window interface: window must inherit property "onbeforeunload" with the proper type (100)]
expected: FAIL
- [Window interface: attribute onpagehide]
+ [Window interface: window must inherit property "onhashchange" with the proper type (101)]
expected: FAIL
- [Window interface: attribute onpageshow]
+ [Window interface: window must inherit property "onlanguagechange" with the proper type (102)]
expected: FAIL
- [Window interface: attribute onpopstate]
+ [Window interface: window must inherit property "onmessage" with the proper type (103)]
expected: FAIL
- [Window interface: attribute onrejectionhandled]
+ [Window interface: window must inherit property "onmessageerror" with the proper type (104)]
expected: FAIL
- [Window interface: attribute onstorage]
+ [Window interface: window must inherit property "onoffline" with the proper type (105)]
expected: FAIL
- [Window interface: attribute onunhandledrejection]
+ [Window interface: window must inherit property "ononline" with the proper type (106)]
expected: FAIL
- [Window interface: attribute onunload]
+ [Window interface: window must inherit property "onpagehide" with the proper type (107)]
expected: FAIL
- [Window interface: operation btoa(DOMString)]
+ [Window interface: window must inherit property "onpageshow" with the proper type (108)]
expected: FAIL
- [Window interface: operation atob(DOMString)]
+ [Window interface: window must inherit property "onpopstate" with the proper type (109)]
expected: FAIL
- [Window interface: operation setTimeout(TimerHandler,long,any)]
+ [Window interface: window must inherit property "onrejectionhandled" with the proper type (110)]
expected: FAIL
- [Window interface: operation clearTimeout(long)]
+ [Window interface: window must inherit property "onstorage" with the proper type (111)]
expected: FAIL
- [Window interface: operation setInterval(TimerHandler,long,any)]
+ [Window interface: window must inherit property "onunhandledrejection" with the proper type (112)]
expected: FAIL
- [Window interface: operation clearInterval(long)]
+ [Window interface: window must inherit property "onunload" with the proper type (113)]
expected: FAIL
- [Window interface: attribute sessionStorage]
+ [Window interface: window must inherit property "origin" with the proper type (114)]
expected: FAIL
- [Window interface: attribute localStorage]
+ [Window interface: window must inherit property "btoa" with the proper type (115)]
expected: FAIL
- [Stringification of window]
+ [Window interface: window must inherit property "atob" with the proper type (116)]
expected: FAIL
- [Window interface: window must have own property "window"]
+ [Window interface: window must inherit property "setTimeout" with the proper type (117)]
expected: FAIL
- [Window interface: window must inherit property "self" with the proper type (1)]
+ [Window interface: calling setTimeout(TimerHandler,long,any) on window with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: window must have own property "document"]
+ [Window interface: window must inherit property "clearTimeout" with the proper type (118)]
expected: FAIL
- [Window interface: window must inherit property "history" with the proper type (5)]
+ [Window interface: window must inherit property "setInterval" with the proper type (119)]
expected: FAIL
- [Window interface: window must inherit property "status" with the proper type (12)]
+ [Window interface: calling setInterval(TimerHandler,long,any) on window with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: window must inherit property "close" with the proper type (13)]
+ [Window interface: window must inherit property "clearInterval" with the proper type (120)]
expected: FAIL
- [Window interface: window must inherit property "closed" with the proper type (14)]
+ [Window interface: window must inherit property "createImageBitmap" with the proper type (121)]
expected: FAIL
- [Window interface: window must inherit property "frames" with the proper type (18)]
+ [Window interface: window must inherit property "sessionStorage" with the proper type (123)]
expected: FAIL
- [Window interface: window must have own property "top"]
+ [Window interface: window must inherit property "localStorage" with the proper type (124)]
expected: FAIL
- [Window interface: window must inherit property "parent" with the proper type (22)]
+ [WebSocket interface: operation close(unsigned short,USVString)]
expected: FAIL
- [Window interface: window must inherit property "frameElement" with the proper type (23)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type (0)]
expected: FAIL
- [Window interface: window must inherit property "navigator" with the proper type (27)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type (1)]
expected: FAIL
- [Window interface: window must inherit property "alert" with the proper type (30)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type (2)]
expected: FAIL
- [Window interface: window must inherit property "postMessage" with the proper type (34)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type (3)]
expected: FAIL
- [Window interface: calling postMessage(any,DOMString,[object Object\]) on window with too few arguments must throw TypeError]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type (4)]
expected: FAIL
- [Window interface: window must inherit property "captureEvents" with the proper type (35)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type (5)]
expected: FAIL
- [Window interface: window must inherit property "releaseEvents" with the proper type (36)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type (6)]
expected: FAIL
- [Window interface: window must inherit property "onabort" with the proper type (37)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type (7)]
expected: FAIL
- [Window interface: window must inherit property "onauxclick" with the proper type (38)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type (8)]
expected: FAIL
- [Window interface: window must inherit property "onblur" with the proper type (39)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type (9)]
expected: FAIL
- [Window interface: window must inherit property "oncancel" with the proper type (40)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type (11)]
expected: FAIL
- [Window interface: window must inherit property "oncanplay" with the proper type (41)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "close" with the proper type (12)]
expected: FAIL
- [Window interface: window must inherit property "oncanplaythrough" with the proper type (42)]
+ [WebSocket interface: calling close(unsigned short,USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: window must inherit property "onchange" with the proper type (43)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type (13)]
expected: FAIL
- [Window interface: window must inherit property "onclick" with the proper type (44)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type (14)]
expected: FAIL
- [Window interface: window must inherit property "onclose" with the proper type (45)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (15)]
expected: FAIL
- [Window interface: window must inherit property "oncontextmenu" with the proper type (46)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (16)]
expected: FAIL
- [Window interface: window must inherit property "oncuechange" with the proper type (47)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (17)]
expected: FAIL
- [Window interface: window must inherit property "ondblclick" with the proper type (48)]
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (18)]
expected: FAIL
- [Window interface: window must inherit property "ondrag" with the proper type (49)]
+ [MessagePort interface: attribute onmessageerror]
expected: FAIL
- [Window interface: window must inherit property "ondragend" with the proper type (50)]
+ [BroadcastChannel interface: attribute onmessageerror]
expected: FAIL
- [Window interface: window must inherit property "ondragenter" with the proper type (51)]
+ [Worker interface: operation postMessage(any,[object Object\])]
expected: FAIL
- [Window interface: window must inherit property "ondragexit" with the proper type (52)]
+ [Storage interface: operation setItem(DOMString,DOMString)]
expected: FAIL
- [Window interface: window must inherit property "ondragleave" with the proper type (53)]
+ [Stringification of document.createElement("applet")]
expected: FAIL
- [Window interface: window must inherit property "ondragover" with the proper type (54)]
+ [HTMLAppletElement interface: document.createElement("applet") must inherit property "name" with the proper type (7)]
expected: FAIL
- [Window interface: window must inherit property "ondragstart" with the proper type (55)]
+ [HTMLFrameSetElement interface: attribute onmessageerror]
expected: FAIL
- [Window interface: window must inherit property "ondrop" with the proper type (56)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onafterprint" with the proper type (2)]
expected: FAIL
- [Window interface: window must inherit property "ondurationchange" with the proper type (57)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeprint" with the proper type (3)]
expected: FAIL
- [Window interface: window must inherit property "onemptied" with the proper type (58)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeunload" with the proper type (4)]
expected: FAIL
- [Window interface: window must inherit property "onended" with the proper type (59)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onhashchange" with the proper type (5)]
expected: FAIL
- [Window interface: window must inherit property "onerror" with the proper type (60)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onlanguagechange" with the proper type (6)]
expected: FAIL
- [Window interface: window must inherit property "onfocus" with the proper type (61)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessage" with the proper type (7)]
expected: FAIL
- [Window interface: window must inherit property "oninput" with the proper type (62)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessageerror" with the proper type (8)]
expected: FAIL
- [Window interface: window must inherit property "oninvalid" with the proper type (63)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onoffline" with the proper type (9)]
expected: FAIL
- [Window interface: window must inherit property "onkeydown" with the proper type (64)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "ononline" with the proper type (10)]
expected: FAIL
- [Window interface: window must inherit property "onkeypress" with the proper type (65)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagehide" with the proper type (11)]
expected: FAIL
- [Window interface: window must inherit property "onkeyup" with the proper type (66)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageshow" with the proper type (12)]
expected: FAIL
- [Window interface: window must inherit property "onload" with the proper type (67)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpopstate" with the proper type (13)]
expected: FAIL
- [Window interface: window must inherit property "onloadeddata" with the proper type (68)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onrejectionhandled" with the proper type (14)]
expected: FAIL
- [Window interface: window must inherit property "onloadedmetadata" with the proper type (69)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onstorage" with the proper type (15)]
expected: FAIL
- [Window interface: window must inherit property "onloadend" with the proper type (70)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunhandledrejection" with the proper type (16)]
expected: FAIL
- [Window interface: window must inherit property "onloadstart" with the proper type (71)]
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunload" with the proper type (17)]
expected: FAIL
- [Window interface: window must inherit property "onmousedown" with the proper type (72)]
+ [HTMLFontElement interface: document.createElement("font") must inherit property "color" with the proper type (0)]
expected: FAIL
- [Window interface: window must inherit property "onmouseenter" with the proper type (73)]
+ [HTMLFontElement interface: document.createElement("font") must inherit property "face" with the proper type (1)]
expected: FAIL
- [Window interface: window must inherit property "onmouseleave" with the proper type (74)]
+ [HTMLFontElement interface: document.createElement("font") must inherit property "size" with the proper type (2)]
expected: FAIL
- [Window interface: window must inherit property "onmousemove" with the proper type (75)]
+ [Document interface: operation execCommand(DOMString, boolean, DOMString)]
expected: FAIL
- [Window interface: window must inherit property "onmouseout" with the proper type (76)]
+ [Document interface: attribute onsecuritypolicyviolation]
expected: FAIL
- [Window interface: window must inherit property "onmouseover" with the proper type (77)]
+ [Document interface: iframe.contentDocument must inherit property "dir" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onmouseup" with the proper type (78)]
+ [Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onwheel" with the proper type (79)]
+ [Document interface: iframe.contentDocument must inherit property "designMode" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onpause" with the proper type (80)]
+ [Document interface: iframe.contentDocument must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onplay" with the proper type (81)]
+ [Document interface: calling execCommand(DOMString, boolean, DOMString) on iframe.contentDocument with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: window must inherit property "onplaying" with the proper type (82)]
+ [Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onprogress" with the proper type (83)]
+ [Document interface: iframe.contentDocument must inherit property "queryCommandIndeterm(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onratechange" with the proper type (84)]
+ [Document interface: iframe.contentDocument must inherit property "queryCommandState(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onreset" with the proper type (85)]
+ [Document interface: iframe.contentDocument must inherit property "queryCommandSupported(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onresize" with the proper type (86)]
+ [Document interface: iframe.contentDocument must inherit property "queryCommandValue(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onscroll" with the proper type (87)]
+ [Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onseeked" with the proper type (88)]
+ [Document interface: iframe.contentDocument must inherit property "vlinkColor" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onseeking" with the proper type (89)]
+ [Document interface: iframe.contentDocument must inherit property "alinkColor" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onselect" with the proper type (90)]
+ [Document interface: iframe.contentDocument must inherit property "all" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onstalled" with the proper type (91)]
+ [Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onsubmit" with the proper type (92)]
+ [Document interface: iframe.contentDocument must inherit property "onloadend" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onsuspend" with the proper type (93)]
+ [Document interface: iframe.contentDocument must inherit property "onsecuritypolicyviolation" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "ontimeupdate" with the proper type (94)]
+ [Document interface: new Document() must inherit property "dir" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "ontoggle" with the proper type (95)]
+ [Document interface: new Document() must inherit property "designMode" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onvolumechange" with the proper type (96)]
+ [Document interface: new Document() must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onwaiting" with the proper type (97)]
+ [Document interface: calling execCommand(DOMString, boolean, DOMString) on new Document() with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: window must inherit property "onafterprint" with the proper type (98)]
+ [Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onbeforeprint" with the proper type (99)]
+ [Document interface: new Document() must inherit property "queryCommandIndeterm(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onbeforeunload" with the proper type (100)]
+ [Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onhashchange" with the proper type (101)]
+ [Document interface: new Document() must inherit property "queryCommandSupported(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onlanguagechange" with the proper type (102)]
+ [Document interface: new Document() must inherit property "queryCommandValue(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onmessage" with the proper type (103)]
+ [Document interface: new Document() must inherit property "linkColor" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onmessageerror" with the proper type (104)]
+ [Document interface: new Document() must inherit property "vlinkColor" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onoffline" with the proper type (105)]
+ [Document interface: new Document() must inherit property "alinkColor" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "ononline" with the proper type (106)]
+ [Document interface: new Document() must inherit property "all" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onpagehide" with the proper type (107)]
+ [Document interface: new Document() must inherit property "onauxclick" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onpageshow" with the proper type (108)]
+ [Document interface: new Document() must inherit property "onloadend" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onpopstate" with the proper type (109)]
+ [Document interface: new Document() must inherit property "onsecuritypolicyviolation" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onrejectionhandled" with the proper type (110)]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "dir" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onstorage" with the proper type (111)]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "designMode" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onunhandledrejection" with the proper type (112)]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "onunload" with the proper type (113)]
+ [Document interface: calling execCommand(DOMString, boolean, DOMString) on document.implementation.createDocument(null, "", null) with too few arguments must throw TypeError]
expected: FAIL
- [Window interface: window must inherit property "origin" with the proper type (114)]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandEnabled(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "btoa" with the proper type (115)]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandIndeterm(DOMString)" with the proper type]
expected: FAIL
- [Window interface: calling btoa(DOMString) on window with too few arguments must throw TypeError]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandState(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "atob" with the proper type (116)]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandSupported(DOMString)" with the proper type]
expected: FAIL
- [Window interface: calling atob(DOMString) on window with too few arguments must throw TypeError]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "queryCommandValue(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "setTimeout" with the proper type (117)]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "linkColor" with the proper type]
expected: FAIL
- [Window interface: calling setTimeout(TimerHandler,long,any) on window with too few arguments must throw TypeError]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "vlinkColor" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "clearTimeout" with the proper type (118)]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "alinkColor" with the proper type]
expected: FAIL
- [Window interface: calling clearTimeout(long) on window with too few arguments must throw TypeError]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "all" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "setInterval" with the proper type (119)]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onauxclick" with the proper type]
expected: FAIL
- [Window interface: calling setInterval(TimerHandler,long,any) on window with too few arguments must throw TypeError]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onloadend" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "clearInterval" with the proper type (120)]
+ [Document interface: document.implementation.createDocument(null, "", null) must inherit property "onsecuritypolicyviolation" with the proper type]
expected: FAIL
- [Window interface: calling clearInterval(long) on window with too few arguments must throw TypeError]
+ [HTMLAllCollection interface: document.all must inherit property "length" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "createImageBitmap" with the proper type (121)]
+ [HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "sessionStorage" with the proper type (123)]
+ [HTMLAllCollection interface: document.all must inherit property "item(DOMString)" with the proper type]
expected: FAIL
- [Window interface: window must inherit property "localStorage" with the proper type (124)]
+ [DOMStringList interface: existence and properties of interface object]
expected: FAIL
- [History interface: existence and properties of interface object]
+ [DOMStringList interface object length]
expected: FAIL
- [History interface object length]
+ [DOMStringList interface object name]
expected: FAIL
- [History interface object name]
+ [DOMStringList interface: existence and properties of interface prototype object]
expected: FAIL
- [History interface: existence and properties of interface prototype object]
+ [DOMStringList interface: existence and properties of interface prototype object's "constructor" property]
expected: FAIL
- [History interface: existence and properties of interface prototype object's "constructor" property]
+ [DOMStringList interface: attribute length]
expected: FAIL
- [History interface: attribute length]
+ [DOMStringList interface: operation item(unsigned long)]
expected: FAIL
- [History interface: operation go(long)]
+ [DOMStringList interface: operation contains(DOMString)]
expected: FAIL
- [History interface: operation back()]
+ [HTMLElement interface: attribute onsecuritypolicyviolation]
expected: FAIL
- [History interface: operation forward()]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "translate" with the proper type]
expected: FAIL
- [History must be primary interface of window.history]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "dir" with the proper type]
expected: FAIL
- [Location interface: existence and properties of interface object]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "tabIndex" with the proper type]
expected: FAIL
- [Location interface object length]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "accessKey" with the proper type]
expected: FAIL
- [Location interface object name]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "accessKeyLabel" with the proper type]
expected: FAIL
- [Location interface: existence and properties of interface prototype object]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "draggable" with the proper type]
expected: FAIL
- [Location interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type]
expected: FAIL
- [Location must be primary interface of window.location]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "innerText" with the proper type]
expected: FAIL
- [PopStateEvent interface: existence and properties of interface object]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type]
expected: FAIL
- [PopStateEvent interface object length]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onloadend" with the proper type]
expected: FAIL
- [PopStateEvent interface object name]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "onsecuritypolicyviolation" with the proper type]
expected: FAIL
- [PopStateEvent interface: existence and properties of interface prototype object]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "contentEditable" with the proper type]
expected: FAIL
- [PopStateEvent interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type]
expected: FAIL
- [PopStateEvent interface: attribute state]
+ [HTMLHtmlElement interface: document.createElement("html") must inherit property "version" with the proper type]
expected: FAIL
- [PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })]
+ [HTMLBaseElement interface: document.createElement("base") must inherit property "target" with the proper type]
expected: FAIL
- [HashChangeEvent interface: existence and properties of interface object]
+ [HTMLLinkElement interface: attribute scope]
expected: FAIL
- [HashChangeEvent interface object length]
+ [HTMLLinkElement interface: attribute workerType]
expected: FAIL
- [HashChangeEvent interface object name]
+ [HTMLLinkElement interface: attribute updateViaCache]
expected: FAIL
- [HashChangeEvent interface: existence and properties of interface prototype object]
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "as" with the proper type]
expected: FAIL
- [HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "nonce" with the proper type]
expected: FAIL
- [HashChangeEvent interface: attribute oldURL]
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type]
expected: FAIL
- [HashChangeEvent interface: attribute newURL]
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type]
expected: FAIL
- [PageTransitionEvent interface: existence and properties of interface object]
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "scope" with the proper type]
expected: FAIL
- [PageTransitionEvent interface object length]
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "workerType" with the proper type]
expected: FAIL
- [PageTransitionEvent interface object name]
+ [HTMLLinkElement interface: document.createElement("link") must inherit property "updateViaCache" with the proper type]
expected: FAIL
- [PageTransitionEvent interface: existence and properties of interface prototype object]
+ [HTMLMetaElement interface: document.createElement("meta") must inherit property "httpEquiv" with the proper type]
expected: FAIL
- [PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLMetaElement interface: document.createElement("meta") must inherit property "scheme" with the proper type]
expected: FAIL
- [PageTransitionEvent interface: attribute persisted]
+ [HTMLStyleElement interface: document.createElement("style") must inherit property "media" with the proper type]
expected: FAIL
- [BeforeUnloadEvent interface: existence and properties of interface object]
+ [HTMLStyleElement interface: document.createElement("style") must inherit property "nonce" with the proper type]
expected: FAIL
- [BeforeUnloadEvent interface object length]
+ [HTMLStyleElement interface: document.createElement("style") must inherit property "type" with the proper type]
expected: FAIL
- [BeforeUnloadEvent interface object name]
+ [HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type]
expected: FAIL
- [BeforeUnloadEvent interface: existence and properties of interface prototype object]
+ [HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type]
expected: FAIL
- [BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type]
expected: FAIL
- [BeforeUnloadEvent interface: attribute returnValue]
+ [HTMLBodyElement interface: document.createElement("body") must inherit property "onmessageerror" with the proper type]
expected: FAIL
- [ErrorEvent interface: existence and properties of interface object]
+ [HTMLHeadingElement interface: document.createElement("h1") must inherit property "align" with the proper type]
expected: FAIL
- [ErrorEvent interface object length]
+ [HTMLParagraphElement interface: document.createElement("p") must inherit property "align" with the proper type]
expected: FAIL
- [ErrorEvent interface object name]
+ [HTMLHRElement interface: document.createElement("hr") must inherit property "noShade" with the proper type]
expected: FAIL
- [ErrorEvent interface: existence and properties of interface prototype object]
+ [HTMLHRElement interface: document.createElement("hr") must inherit property "size" with the proper type]
expected: FAIL
- [ErrorEvent interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLPreElement interface: document.createElement("pre") must inherit property "width" with the proper type]
expected: FAIL
- [ErrorEvent interface: attribute message]
+ [HTMLPreElement interface: document.createElement("listing") must inherit property "width" with the proper type]
expected: FAIL
- [ErrorEvent interface: attribute filename]
+ [HTMLPreElement interface: document.createElement("xmp") must inherit property "width" with the proper type]
expected: FAIL
- [ErrorEvent interface: attribute lineno]
+ [HTMLQuoteElement interface: document.createElement("blockquote") must inherit property "cite" with the proper type]
expected: FAIL
- [ErrorEvent interface: attribute colno]
+ [HTMLQuoteElement interface: document.createElement("q") must inherit property "cite" with the proper type]
expected: FAIL
- [ErrorEvent interface: attribute error]
+ [HTMLMenuElement interface: document.createElement("menu") must inherit property "compact" with the proper type]
expected: FAIL
- [Navigator interface: existence and properties of interface object]
+ [HTMLLIElement interface: document.createElement("li") must inherit property "type" with the proper type]
expected: FAIL
- [Navigator interface object length]
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "download" with the proper type]
expected: FAIL
- [Navigator interface object name]
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "ping" with the proper type]
expected: FAIL
- [Navigator interface: existence and properties of interface prototype object]
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "hreflang" with the proper type]
expected: FAIL
- [Navigator interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "type" with the proper type]
expected: FAIL
- [Navigator interface: attribute appCodeName]
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "referrerPolicy" with the proper type]
expected: FAIL
- [Navigator interface: attribute appName]
+ [HTMLAnchorElement interface: document.createElement("a") must inherit property "charset" with the proper type]
expected: FAIL
- [Navigator interface: attribute appVersion]
+ [HTMLBRElement interface: document.createElement("br") must inherit property "clear" with the proper type]
expected: FAIL
- [Navigator interface: attribute platform]
+ [HTMLModElement interface: document.createElement("ins") must inherit property "cite" with the proper type]
expected: FAIL
- [Navigator interface: attribute product]
+ [HTMLModElement interface: document.createElement("ins") must inherit property "dateTime" with the proper type]
expected: FAIL
- [Navigator interface: attribute userAgent]
+ [HTMLModElement interface: document.createElement("del") must inherit property "cite" with the proper type]
expected: FAIL
- [Navigator interface: attribute language]
+ [HTMLModElement interface: document.createElement("del") must inherit property "dateTime" with the proper type]
expected: FAIL
- [Navigator interface: attribute cookieEnabled]
+ [HTMLSourceElement interface: document.createElement("source") must inherit property "src" with the proper type]
expected: FAIL
- [Navigator interface: attribute plugins]
+ [HTMLSourceElement interface: document.createElement("source") must inherit property "type" with the proper type]
expected: FAIL
- [Navigator interface: attribute mimeTypes]
+ [HTMLSourceElement interface: document.createElement("source") must inherit property "srcset" with the proper type]
expected: FAIL
- [Navigator interface: operation javaEnabled()]
+ [HTMLSourceElement interface: document.createElement("source") must inherit property "sizes" with the proper type]
expected: FAIL
- [Navigator must be primary interface of window.navigator]
+ [HTMLSourceElement interface: document.createElement("source") must inherit property "media" with the proper type]
expected: FAIL
- [PluginArray interface: existence and properties of interface object]
+ [HTMLImageElement interface: operation decode()]
expected: FAIL
- [PluginArray interface object length]
+ [HTMLImageElement interface: document.createElement("img") must inherit property "srcset" with the proper type]
expected: FAIL
- [PluginArray interface object name]
+ [HTMLImageElement interface: document.createElement("img") must inherit property "sizes" with the proper type]
expected: FAIL
- [PluginArray interface: existence and properties of interface prototype object]
+ [HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type]
expected: FAIL
- [PluginArray interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLImageElement interface: document.createElement("img") must inherit property "decode()" with the proper type]
expected: FAIL
- [PluginArray interface: operation refresh(boolean)]
+ [HTMLImageElement interface: document.createElement("img") must inherit property "lowsrc" with the proper type]
expected: FAIL
- [PluginArray interface: attribute length]
+ [HTMLImageElement interface: new Image() must inherit property "srcset" with the proper type]
expected: FAIL
- [PluginArray interface: operation item(unsigned long)]
+ [HTMLImageElement interface: new Image() must inherit property "sizes" with the proper type]
expected: FAIL
- [PluginArray interface: operation namedItem(DOMString)]
+ [HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type]
expected: FAIL
- [MimeTypeArray interface: existence and properties of interface object]
+ [HTMLImageElement interface: new Image() must inherit property "decode()" with the proper type]
expected: FAIL
- [MimeTypeArray interface object length]
+ [HTMLImageElement interface: new Image() must inherit property "lowsrc" with the proper type]
expected: FAIL
- [MimeTypeArray interface object name]
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "src" with the proper type]
expected: FAIL
- [MimeTypeArray interface: existence and properties of interface prototype object]
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "type" with the proper type]
expected: FAIL
- [MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "width" with the proper type]
expected: FAIL
- [MimeTypeArray interface: attribute length]
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "height" with the proper type]
expected: FAIL
- [MimeTypeArray interface: operation item(unsigned long)]
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "getSVGDocument()" with the proper type]
expected: FAIL
- [MimeTypeArray interface: operation namedItem(DOMString)]
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "align" with the proper type]
expected: FAIL
- [Plugin interface: existence and properties of interface object]
+ [HTMLEmbedElement interface: document.createElement("embed") must inherit property "name" with the proper type]
expected: FAIL
- [Plugin interface object length]
+ [HTMLObjectElement interface: operation getSVGDocument()]
expected: FAIL
- [Plugin interface object name]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "data" with the proper type]
expected: FAIL
- [Plugin interface: existence and properties of interface prototype object]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "typeMustMatch" with the proper type]
expected: FAIL
- [Plugin interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "name" with the proper type]
expected: FAIL
- [Plugin interface: attribute name]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "useMap" with the proper type]
expected: FAIL
- [Plugin interface: attribute description]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "width" with the proper type]
expected: FAIL
- [Plugin interface: attribute filename]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "height" with the proper type]
expected: FAIL
- [Plugin interface: attribute length]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "contentDocument" with the proper type]
expected: FAIL
- [Plugin interface: operation item(unsigned long)]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "contentWindow" with the proper type]
expected: FAIL
- [Plugin interface: operation namedItem(DOMString)]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "getSVGDocument()" with the proper type]
expected: FAIL
- [MimeType interface: existence and properties of interface object]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "willValidate" with the proper type]
expected: FAIL
- [MimeType interface object length]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "validationMessage" with the proper type]
expected: FAIL
- [MimeType interface object name]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "checkValidity()" with the proper type]
expected: FAIL
- [MimeType interface: existence and properties of interface prototype object]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "reportValidity()" with the proper type]
expected: FAIL
- [MimeType interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "setCustomValidity(DOMString)" with the proper type]
expected: FAIL
- [MimeType interface: attribute type]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "align" with the proper type]
expected: FAIL
- [MimeType interface: attribute description]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "archive" with the proper type]
expected: FAIL
- [MimeType interface: attribute suffixes]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "code" with the proper type]
expected: FAIL
- [MimeType interface: attribute enabledPlugin]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "declare" with the proper type]
expected: FAIL
- [MessageEvent interface: existence and properties of interface object]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "hspace" with the proper type]
expected: FAIL
- [MessageEvent interface object length]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "standby" with the proper type]
expected: FAIL
- [MessageEvent interface object name]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type]
expected: FAIL
- [MessageEvent interface: existence and properties of interface prototype object]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "codeBase" with the proper type]
expected: FAIL
- [MessageEvent interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "codeType" with the proper type]
expected: FAIL
- [MessageEvent interface: attribute data]
+ [HTMLObjectElement interface: document.createElement("object") must inherit property "border" with the proper type]
expected: FAIL
- [MessageEvent interface: attribute origin]
+ [HTMLParamElement interface: document.createElement("param") must inherit property "name" with the proper type]
expected: FAIL
- [MessageEvent interface: attribute lastEventId]
+ [HTMLParamElement interface: document.createElement("param") must inherit property "value" with the proper type]
expected: FAIL
- [MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })]
+ [HTMLParamElement interface: document.createElement("param") must inherit property "type" with the proper type]
expected: FAIL
- [EventSource interface: existence and properties of interface object]
+ [HTMLParamElement interface: document.createElement("param") must inherit property "valueType" with the proper type]
expected: FAIL
- [EventSource interface object length]
+ [HTMLVideoElement interface: attribute playsInline]
expected: FAIL
- [EventSource interface object name]
+ [HTMLVideoElement interface: document.createElement("video") must inherit property "width" with the proper type]
expected: FAIL
- [EventSource interface: existence and properties of interface prototype object]
+ [HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type]
expected: FAIL
- [EventSource interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLVideoElement interface: document.createElement("video") must inherit property "videoWidth" with the proper type]
expected: FAIL
- [EventSource interface: attribute url]
+ [HTMLVideoElement interface: document.createElement("video") must inherit property "videoHeight" with the proper type]
expected: FAIL
- [EventSource interface: attribute withCredentials]
+ [HTMLVideoElement interface: document.createElement("video") must inherit property "poster" with the proper type]
expected: FAIL
- [EventSource interface: constant CONNECTING on interface object]
+ [HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type]
expected: FAIL
- [EventSource interface: constant CONNECTING on interface prototype object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "srcObject" with the proper type]
expected: FAIL
- [EventSource interface: constant OPEN on interface object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "crossOrigin" with the proper type]
expected: FAIL
- [EventSource interface: constant OPEN on interface prototype object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "buffered" with the proper type]
expected: FAIL
- [EventSource interface: constant CLOSED on interface object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "seeking" with the proper type]
expected: FAIL
- [EventSource interface: constant CLOSED on interface prototype object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "currentTime" with the proper type]
expected: FAIL
- [EventSource interface: attribute readyState]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "fastSeek(double)" with the proper type]
expected: FAIL
- [EventSource interface: attribute onopen]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "duration" with the proper type]
expected: FAIL
- [EventSource interface: attribute onmessage]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "getStartDate()" with the proper type]
expected: FAIL
- [EventSource interface: attribute onerror]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "defaultPlaybackRate" with the proper type]
expected: FAIL
- [EventSource interface: operation close()]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "playbackRate" with the proper type]
expected: FAIL
- [WebSocket interface: existence and properties of interface object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "played" with the proper type]
expected: FAIL
- [WebSocket interface object length]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "seekable" with the proper type]
expected: FAIL
- [WebSocket interface object name]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "ended" with the proper type]
expected: FAIL
- [WebSocket interface: existence and properties of interface prototype object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "loop" with the proper type]
expected: FAIL
- [WebSocket interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "controls" with the proper type]
expected: FAIL
- [WebSocket interface: attribute url]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "volume" with the proper type]
expected: FAIL
- [WebSocket interface: constant CONNECTING on interface object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "muted" with the proper type]
expected: FAIL
- [WebSocket interface: constant CONNECTING on interface prototype object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "defaultMuted" with the proper type]
expected: FAIL
- [WebSocket interface: constant OPEN on interface object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type]
expected: FAIL
- [WebSocket interface: constant OPEN on interface prototype object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type]
expected: FAIL
- [WebSocket interface: constant CLOSING on interface object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "textTracks" with the proper type]
expected: FAIL
- [WebSocket interface: constant CLOSING on interface prototype object]
+ [HTMLMediaElement interface: document.createElement("video") must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type]
expected: FAIL
- [WebSocket interface: constant CLOSED on interface object]
+ [HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on document.createElement("video") with too few arguments must throw TypeError]
expected: FAIL
- [WebSocket interface: constant CLOSED on interface prototype object]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "srcObject" with the proper type]
expected: FAIL
- [WebSocket interface: attribute readyState]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "crossOrigin" with the proper type]
expected: FAIL
- [WebSocket interface: attribute bufferedAmount]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "buffered" with the proper type]
expected: FAIL
- [WebSocket interface: attribute onopen]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "seeking" with the proper type]
expected: FAIL
- [WebSocket interface: attribute onerror]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "currentTime" with the proper type]
expected: FAIL
- [WebSocket interface: attribute onclose]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "fastSeek(double)" with the proper type]
expected: FAIL
- [WebSocket interface: attribute protocol]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "duration" with the proper type]
expected: FAIL
- [WebSocket interface: operation close(unsigned short,USVString)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate()" with the proper type]
expected: FAIL
- [WebSocket interface: attribute onmessage]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultPlaybackRate" with the proper type]
expected: FAIL
- [WebSocket interface: attribute binaryType]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "playbackRate" with the proper type]
expected: FAIL
- [WebSocket interface: operation send(USVString)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "played" with the proper type]
expected: FAIL
- [WebSocket interface: operation send(Blob)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "seekable" with the proper type]
expected: FAIL
- [WebSocket interface: operation send(ArrayBuffer)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "ended" with the proper type]
expected: FAIL
- [WebSocket interface: operation send(ArrayBufferView)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "loop" with the proper type]
expected: FAIL
- [Stringification of new WebSocket("ws://foo")]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "controls" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "url" with the proper type (0)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "volume" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "CONNECTING" with the proper type (1)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "muted" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "OPEN" with the proper type (2)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultMuted" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSING" with the proper type (3)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "audioTracks" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "CLOSED" with the proper type (4)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "videoTracks" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "readyState" with the proper type (5)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "textTracks" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "bufferedAmount" with the proper type (6)]
+ [HTMLMediaElement interface: document.createElement("audio") must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "onopen" with the proper type (7)]
+ [HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on document.createElement("audio") with too few arguments must throw TypeError]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "onerror" with the proper type (8)]
+ [HTMLMediaElement interface: new Audio() must inherit property "error" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "onclose" with the proper type (9)]
+ [HTMLMediaElement interface: new Audio() must inherit property "src" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type (11)]
+ [HTMLMediaElement interface: new Audio() must inherit property "srcObject" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "close" with the proper type (12)]
+ [HTMLMediaElement interface: new Audio() must inherit property "currentSrc" with the proper type]
expected: FAIL
- [WebSocket interface: calling close(unsigned short,USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError]
+ [HTMLMediaElement interface: new Audio() must inherit property "crossOrigin" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "onmessage" with the proper type (13)]
+ [HTMLMediaElement interface: new Audio() must inherit property "NETWORK_EMPTY" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type (14)]
+ [HTMLMediaElement interface: new Audio() must inherit property "NETWORK_IDLE" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (15)]
+ [HTMLMediaElement interface: new Audio() must inherit property "NETWORK_LOADING" with the proper type]
expected: FAIL
- [WebSocket interface: calling send(USVString) on new WebSocket("ws://foo") with too few arguments must throw TypeError]
+ [HTMLMediaElement interface: new Audio() must inherit property "NETWORK_NO_SOURCE" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (16)]
+ [HTMLMediaElement interface: new Audio() must inherit property "networkState" with the proper type]
expected: FAIL
- [WebSocket interface: calling send(Blob) on new WebSocket("ws://foo") with too few arguments must throw TypeError]
+ [HTMLMediaElement interface: new Audio() must inherit property "preload" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (17)]
+ [HTMLMediaElement interface: new Audio() must inherit property "buffered" with the proper type]
expected: FAIL
- [WebSocket interface: calling send(ArrayBuffer) on new WebSocket("ws://foo") with too few arguments must throw TypeError]
+ [HTMLMediaElement interface: new Audio() must inherit property "load()" with the proper type]
expected: FAIL
- [WebSocket interface: new WebSocket("ws://foo") must inherit property "send" with the proper type (18)]
+ [HTMLMediaElement interface: new Audio() must inherit property "canPlayType(DOMString)" with the proper type]
expected: FAIL
- [WebSocket interface: calling send(ArrayBufferView) on new WebSocket("ws://foo") with too few arguments must throw TypeError]
+ [HTMLMediaElement interface: new Audio() must inherit property "HAVE_NOTHING" with the proper type]
expected: FAIL
- [CloseEvent interface: existence and properties of interface object]
+ [HTMLMediaElement interface: new Audio() must inherit property "HAVE_METADATA" with the proper type]
expected: FAIL
- [CloseEvent interface object length]
+ [HTMLMediaElement interface: new Audio() must inherit property "HAVE_CURRENT_DATA" with the proper type]
expected: FAIL
- [CloseEvent interface object name]
+ [HTMLMediaElement interface: new Audio() must inherit property "HAVE_FUTURE_DATA" with the proper type]
expected: FAIL
- [CloseEvent interface: existence and properties of interface prototype object]
+ [HTMLMediaElement interface: new Audio() must inherit property "HAVE_ENOUGH_DATA" with the proper type]
expected: FAIL
- [CloseEvent interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLMediaElement interface: new Audio() must inherit property "readyState" with the proper type]
expected: FAIL
- [CloseEvent interface: attribute wasClean]
+ [HTMLMediaElement interface: new Audio() must inherit property "seeking" with the proper type]
expected: FAIL
- [CloseEvent interface: attribute code]
+ [HTMLMediaElement interface: new Audio() must inherit property "currentTime" with the proper type]
expected: FAIL
- [CloseEvent interface: attribute reason]
+ [HTMLMediaElement interface: new Audio() must inherit property "fastSeek(double)" with the proper type]
expected: FAIL
- [CloseEvent must be primary interface of new CloseEvent("close")]
+ [HTMLMediaElement interface: new Audio() must inherit property "duration" with the proper type]
expected: FAIL
- [MessagePort interface: attribute onmessageerror]
+ [HTMLMediaElement interface: new Audio() must inherit property "getStartDate()" with the proper type]
expected: FAIL
- [BroadcastChannel interface: attribute onmessageerror]
+ [HTMLMediaElement interface: new Audio() must inherit property "paused" with the proper type]
expected: FAIL
- [Worker interface: existence and properties of interface object]
+ [HTMLMediaElement interface: new Audio() must inherit property "defaultPlaybackRate" with the proper type]
expected: FAIL
- [Worker interface object length]
+ [HTMLMediaElement interface: new Audio() must inherit property "playbackRate" with the proper type]
expected: FAIL
- [Worker interface object name]
+ [HTMLMediaElement interface: new Audio() must inherit property "played" with the proper type]
expected: FAIL
- [Worker interface: existence and properties of interface prototype object]
+ [HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type]
expected: FAIL
- [Worker interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLMediaElement interface: new Audio() must inherit property "ended" with the proper type]
expected: FAIL
- [Worker interface: operation terminate()]
+ [HTMLMediaElement interface: new Audio() must inherit property "autoplay" with the proper type]
expected: FAIL
- [Worker interface: operation postMessage(any,[object Object\])]
+ [HTMLMediaElement interface: new Audio() must inherit property "loop" with the proper type]
expected: FAIL
- [Worker interface: attribute onmessage]
+ [HTMLMediaElement interface: new Audio() must inherit property "play()" with the proper type]
expected: FAIL
- [Worker interface: attribute onerror]
+ [HTMLMediaElement interface: new Audio() must inherit property "pause()" with the proper type]
expected: FAIL
- [Storage interface: existence and properties of interface object]
+ [HTMLMediaElement interface: new Audio() must inherit property "controls" with the proper type]
expected: FAIL
- [Storage interface object length]
+ [HTMLMediaElement interface: new Audio() must inherit property "volume" with the proper type]
expected: FAIL
- [Storage interface object name]
+ [HTMLMediaElement interface: new Audio() must inherit property "muted" with the proper type]
expected: FAIL
- [Storage interface: existence and properties of interface prototype object]
+ [HTMLMediaElement interface: new Audio() must inherit property "defaultMuted" with the proper type]
expected: FAIL
- [Storage interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLMediaElement interface: new Audio() must inherit property "audioTracks" with the proper type]
expected: FAIL
- [Storage interface: attribute length]
+ [HTMLMediaElement interface: new Audio() must inherit property "videoTracks" with the proper type]
expected: FAIL
- [Storage interface: operation key(unsigned long)]
+ [HTMLMediaElement interface: new Audio() must inherit property "textTracks" with the proper type]
expected: FAIL
- [Storage interface: operation getItem(DOMString)]
+ [HTMLMediaElement interface: new Audio() must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type]
expected: FAIL
- [Storage interface: operation setItem(DOMString,DOMString)]
+ [HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on new Audio() with too few arguments must throw TypeError]
expected: FAIL
- [Storage interface: operation removeItem(DOMString)]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "kind" with the proper type]
expected: FAIL
- [Storage interface: operation clear()]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "src" with the proper type]
expected: FAIL
- [StorageEvent interface: existence and properties of interface object]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "srclang" with the proper type]
expected: FAIL
- [StorageEvent interface object length]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "label" with the proper type]
expected: FAIL
- [StorageEvent interface object name]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "default" with the proper type]
expected: FAIL
- [StorageEvent interface: existence and properties of interface prototype object]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "NONE" with the proper type]
expected: FAIL
- [StorageEvent interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "LOADING" with the proper type]
expected: FAIL
- [StorageEvent interface: attribute key]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "LOADED" with the proper type]
expected: FAIL
- [StorageEvent interface: attribute oldValue]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "ERROR" with the proper type]
expected: FAIL
- [StorageEvent interface: attribute newValue]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "readyState" with the proper type]
expected: FAIL
- [StorageEvent interface: attribute url]
+ [HTMLTrackElement interface: document.createElement("track") must inherit property "track" with the proper type]
expected: FAIL
- [StorageEvent interface: attribute storageArea]
+ [HTMLMediaElement interface: operation addTextTrack(TextTrackKind, DOMString, DOMString)]
expected: FAIL
- [HTMLAppletElement interface: existence and properties of interface object]
+ [TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type]
expected: FAIL
- [HTMLAppletElement interface object length]
+ [TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type]
expected: FAIL
- [HTMLAppletElement interface object name]
+ [TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type]
expected: FAIL
- [HTMLAppletElement interface: existence and properties of interface prototype object]
+ [TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type]
expected: FAIL
- [HTMLAppletElement interface: existence and properties of interface prototype object's "constructor" property]
+ [TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type]
expected: FAIL
- [HTMLAppletElement interface: attribute name]
+ [TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type]
expected: FAIL
- [Stringification of document.createElement("applet")]
+ [TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type]
expected: FAIL
- [HTMLAppletElement interface: document.createElement("applet") must inherit property "name" with the proper type (7)]
+ [TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: existence and properties of interface object]
+ [TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface object length]
+ [TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface object name]
+ [TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: existence and properties of interface prototype object]
+ [TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: existence and properties of interface prototype object's "constructor" property]
+ [TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onafterprint]
+ [TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onbeforeprint]
+ [TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onbeforeunload]
+ [TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onhashchange]
+ [TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onlanguagechange]
+ [TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onmessage]
+ [TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onmessageerror]
+ [TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onoffline]
+ [TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute ononline]
+ [TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onpagehide]
+ [HTMLMapElement interface: document.createElement("map") must inherit property "name" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onpageshow]
+ [HTMLMapElement interface: document.createElement("map") must inherit property "areas" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onpopstate]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "alt" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onrejectionhandled]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onstorage]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "shape" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onunhandledrejection]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "target" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: attribute onunload]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "download" with the proper type]
expected: FAIL
- [Stringification of document.createElement("frameset")]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "ping" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onafterprint" with the proper type (2)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "rel" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeprint" with the proper type (3)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "referrerPolicy" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeunload" with the proper type (4)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onhashchange" with the proper type (5)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onlanguagechange" with the proper type (6)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessage" with the proper type (7)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessageerror" with the proper type (8)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onoffline" with the proper type (9)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "ononline" with the proper type (10)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagehide" with the proper type (11)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageshow" with the proper type (12)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpopstate" with the proper type (13)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onrejectionhandled" with the proper type (14)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onstorage" with the proper type (15)]
+ [HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunhandledrejection" with the proper type (16)]
+ [HTMLTableElement interface: document.createElement("table") must inherit property "align" with the proper type]
expected: FAIL
- [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunload" with the proper type (17)]
+ [HTMLTableElement interface: document.createElement("table") must inherit property "border" with the proper type]
expected: FAIL
- [HTMLFrameElement interface: existence and properties of interface object]
+ [HTMLTableElement interface: document.createElement("table") must inherit property "frame" with the proper type]
expected: FAIL
- [HTMLFrameElement interface object length]
+ [HTMLTableElement interface: document.createElement("table") must inherit property "rules" with the proper type]
expected: FAIL
- [HTMLFrameElement interface object name]
+ [HTMLTableElement interface: document.createElement("table") must inherit property "summary" with the proper type]
expected: FAIL
- [HTMLFrameElement interface: existence and properties of interface prototype object]
+ [HTMLTableElement interface: document.createElement("table") must inherit property "cellPadding" with the proper type]
expected: FAIL
- [HTMLFrameElement interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLTableElement interface: document.createElement("table") must inherit property "cellSpacing" with the proper type]
expected: FAIL
- [Stringification of document.createElement("frame")]
+ [HTMLTableCaptionElement interface: document.createElement("caption") must inherit property "align" with the proper type]
expected: FAIL
- [HTMLDirectoryElement interface: existence and properties of interface object]
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "span" with the proper type]
expected: FAIL
- [HTMLDirectoryElement interface object length]
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "align" with the proper type]
expected: FAIL
- [HTMLDirectoryElement interface object name]
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "ch" with the proper type]
expected: FAIL
- [HTMLDirectoryElement interface: existence and properties of interface prototype object]
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "chOff" with the proper type]
expected: FAIL
- [HTMLDirectoryElement interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "vAlign" with the proper type]
expected: FAIL
- [Stringification of document.createElement("dir")]
+ [HTMLTableColElement interface: document.createElement("colgroup") must inherit property "width" with the proper type]
expected: FAIL
- [HTMLFontElement interface: existence and properties of interface object]
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "span" with the proper type]
expected: FAIL
- [HTMLFontElement interface object length]
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "align" with the proper type]
expected: FAIL
- [HTMLFontElement interface object name]
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "ch" with the proper type]
expected: FAIL
- [HTMLFontElement interface: existence and properties of interface prototype object]
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "chOff" with the proper type]
expected: FAIL
- [HTMLFontElement interface: existence and properties of interface prototype object's "constructor" property]
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "vAlign" with the proper type]
expected: FAIL
- [HTMLFontElement interface: attribute color]
+ [HTMLTableColElement interface: document.createElement("col") must inherit property "width" with the proper type]
expected: FAIL
- [HTMLFontElement interface: attribute face]
+ [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "align" with the proper type]
expected: FAIL
- [HTMLFontElement interface: attribute size]
+ [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "ch" with the proper type]
expected: FAIL
- [Stringification of document.createElement("font")]
+ [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "chOff" with the proper type]
expected: FAIL
- [HTMLFontElement interface: document.createElement("font") must inherit property "color" with the proper type (0)]
+ [HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "vAlign" with the proper type]
expected: FAIL
- [HTMLFontElement interface: document.createElement("font") must inherit property "face" with the proper type (1)]
+ [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type]
expected: FAIL
- [HTMLFontElement interface: document.createElement("font") must inherit property "size" with the proper type (2)]
+ [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("thead") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: document.createElement("tr") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: document.createElement("tr") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: document.createElement("tr") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLTableRowElement interface: document.createElement("tr") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "headers" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "scope" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "abbr" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "axis" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "noWrap" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("td") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "headers" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "scope" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "abbr" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "axis" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "ch" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "noWrap" with the proper type]
+ expected: FAIL
+
+ [HTMLTableCellElement interface: document.createElement("th") must inherit property "vAlign" with the proper type]
+ expected: FAIL
+
+ [HTMLFormElement interface: document.createElement("form") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLFormElement interface: document.createElement("form") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: attribute files]
+ expected: FAIL
+
+ [HTMLInputElement interface: operation setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on document.createElement("input") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: document.createElement("input") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("text") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("hidden") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("hidden") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("search") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("search") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("tel") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("tel") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("url") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("url") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("email") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("email") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("password") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("date") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("date") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("month") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("month") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("week") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("week") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("time") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("time") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("datetime-local") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("datetime-local") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("number") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("number") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("range") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("range") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("color") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("color") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("checkbox") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("checkbox") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("radio") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("file") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("file") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("submit") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("submit") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("image") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("image") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("reset") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("reset") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "list" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "valueAsDate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "valueAsNumber" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "stepUp(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "stepDown(long)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("button") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [HTMLInputElement interface: createInput("button") must inherit property "useMap" with the proper type]
+ expected: FAIL
+
+ [HTMLButtonElement interface: document.createElement("button") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLButtonElement interface: document.createElement("button") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLButtonElement interface: document.createElement("button") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLButtonElement interface: document.createElement("button") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLButtonElement interface: document.createElement("button") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLButtonElement interface: document.createElement("button") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "required" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "selectedOptions" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLSelectElement interface: document.createElement("select") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "label" with the proper type]
+ expected: FAIL
+
+ [HTMLOptionElement interface: document.createElement("option") must inherit property "index" with the proper type]
+ expected: FAIL
+
+ [HTMLOptionElement interface: new Option() must inherit property "disabled" with the proper type]
+ expected: FAIL
+
+ [HTMLOptionElement interface: new Option() must inherit property "form" with the proper type]
+ expected: FAIL
+
+ [HTMLOptionElement interface: new Option() must inherit property "label" with the proper type]
+ expected: FAIL
+
+ [HTMLOptionElement interface: new Option() must inherit property "defaultSelected" with the proper type]
+ expected: FAIL
+
+ [HTMLOptionElement interface: new Option() must inherit property "selected" with the proper type]
+ expected: FAIL
+
+ [HTMLOptionElement interface: new Option() must inherit property "value" with the proper type]
+ expected: FAIL
+
+ [HTMLOptionElement interface: new Option() must inherit property "text" with the proper type]
+ expected: FAIL
+
+ [HTMLOptionElement interface: new Option() must inherit property "index" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: operation setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autofocus" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "dirName" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "inputMode" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "maxLength" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "minLength" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "textLength" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validity" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "select()" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type]
+ expected: FAIL
+
+ [HTMLTextAreaElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on document.createElement("textarea") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "htmlFor" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "defaultValue" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "value" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "willValidate" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "validationMessage" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "checkValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "reportValidity()" with the proper type]
+ expected: FAIL
+
+ [HTMLOutputElement interface: document.createElement("output") must inherit property "setCustomValidity(DOMString)" with the proper type]
+ expected: FAIL
+
+ [HTMLProgressElement interface: document.createElement("progress") must inherit property "value" with the proper type]
+ expected: FAIL
+
+ [HTMLProgressElement interface: document.createElement("progress") must inherit property "max" with the proper type]
+ expected: FAIL
+
+ [HTMLProgressElement interface: document.createElement("progress") must inherit property "position" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "value" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "min" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "max" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "low" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "high" with the proper type]
+ expected: FAIL
+
+ [HTMLMeterElement interface: document.createElement("meter") must inherit property "optimum" with the proper type]
+ expected: FAIL
+
+ [HTMLLegendElement interface: document.createElement("legend") must inherit property "align" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type]
+ expected: FAIL
+
+ [ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type]
+ expected: FAIL
+
+ [HTMLScriptElement interface: document.createElement("script") must inherit property "noModule" with the proper type]
+ expected: FAIL
+
+ [HTMLScriptElement interface: document.createElement("script") must inherit property "nonce" with the proper type]
+ expected: FAIL
+
+ [HTMLSlotElement interface: document.createElement("slot") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedNodes(AssignedNodesOptions)" with the proper type]
+ expected: FAIL
+
+ [HTMLCanvasElement interface: operation toBlob(BlobCallback, DOMString, any)]
+ expected: FAIL
+
+ [HTMLCanvasElement interface: operation transferControlToOffscreen()]
+ expected: FAIL
+
+ [HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob(BlobCallback, DOMString, any)" with the proper type]
+ expected: FAIL
+
+ [HTMLCanvasElement interface: calling toBlob(BlobCallback, DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [HTMLCanvasElement interface: document.createElement("canvas") must inherit property "transferControlToOffscreen()" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetClip()" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object\])" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type]
+ expected: FAIL
+
+ [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type]
+ expected: FAIL
+
+ [CanvasPattern interface: operation setTransform(DOMMatrix2DInit)]
+ expected: FAIL
+
+ [Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)]
+ expected: FAIL
+
+ [Path2D interface: operation moveTo(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [Path2D interface: operation lineTo(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)]
+ expected: FAIL
+
+ [Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: existence and properties of interface object]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface object length]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface object name]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: attribute canvas]
+ expected: FAIL
+
+ [ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)]
+ expected: FAIL
+
+ [OffscreenCanvas interface: existence and properties of interface object]
+ expected: FAIL
+
+ [OffscreenCanvas interface object length]
+ expected: FAIL
+
+ [OffscreenCanvas interface object name]
+ expected: FAIL
+
+ [OffscreenCanvas interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [OffscreenCanvas interface: attribute width]
+ expected: FAIL
+
+ [OffscreenCanvas interface: attribute height]
+ expected: FAIL
+
+ [OffscreenCanvas interface: operation getContext(OffscreenRenderingContextType, any)]
+ expected: FAIL
+
+ [OffscreenCanvas interface: operation transferToImageBitmap()]
+ expected: FAIL
+
+ [OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: existence and properties of interface object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface object length]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface object name]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation commit()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute canvas]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation save()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation restore()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation getTransform()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation resetTransform()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute globalAlpha]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute strokeStyle]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute fillStyle]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute shadowBlur]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute shadowColor]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute filter]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation beginPath()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation stroke()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation resetClip()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute lineWidth]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute lineCap]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute lineJoin]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute miterLimit]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object\])]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation getLineDash()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation closePath()]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)]
+ expected: FAIL
+
+ [OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)]
+ expected: FAIL
+
+ [CustomElementRegistry interface: operation whenDefined(DOMString)]
+ expected: FAIL
+
+ [DataTransfer interface: operation setDragImage(Element, long, long)]
+ expected: FAIL
+
+ [DataTransfer interface: operation setData(DOMString, DOMString)]
+ expected: FAIL
+
+ [DataTransferItemList interface: operation add(DOMString, DOMString)]
+ expected: FAIL
+
+ [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError]
+ expected: FAIL
+
+ [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError]
+ expected: FAIL
+
+ [Window interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false]
+ expected: FAIL
+
+ [Window interface: operation open(USVString, DOMString, DOMString)]
+ expected: FAIL
+
+ [Window interface: operation prompt(DOMString, DOMString)]
+ expected: FAIL
+
+ [Window interface: attribute onsecuritypolicyviolation]
+ expected: FAIL
+
+ [Window interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions)]
+ expected: FAIL
+
+ [Window interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)]
+ expected: FAIL
+
+ [Window interface: internal [[SetPrototypeOf\]\] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw]
+ expected: FAIL
+
+ [Window interface: internal [[SetPrototypeOf\]\] method of global platform object - setting to its original value via __proto__ should not throw]
+ expected: FAIL
+
+ [Window interface: internal [[SetPrototypeOf\]\] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true]
+ expected: FAIL
+
+ [Window interface: window must inherit property "self" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "locationbar" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "menubar" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "personalbar" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "scrollbars" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "statusbar" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "toolbar" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "stop()" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "focus()" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "blur()" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "frames" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "length" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "opener" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "parent" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "open(USVString, DOMString, DOMString)" with the proper type]
+ expected: FAIL
+
+ [Window interface: calling open(USVString, DOMString, DOMString) on window with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: window must inherit property "applicationCache" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "confirm(DOMString)" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "prompt(DOMString, DOMString)" with the proper type]
+ expected: FAIL
+
+ [Window interface: calling prompt(DOMString, DOMString) on window with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: window must inherit property "print()" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "external" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onauxclick" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onloadend" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onsecuritypolicyviolation" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "onmessageerror" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "origin" with the proper type]
+ expected: FAIL
+
+ [Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, ImageBitmapOptions)" with the proper type]
+ expected: FAIL
+
+ [Window interface: calling createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on window with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)" with the proper type]
+ expected: FAIL
+
+ [Window interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on window with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [History interface: operation pushState(any, DOMString, USVString)]
+ expected: FAIL
+
+ [History interface: operation replaceState(any, DOMString, USVString)]
+ expected: FAIL
+
+ [History interface: window.history must inherit property "scrollRestoration" with the proper type]
+ expected: FAIL
+
+ [History interface: window.history must inherit property "state" with the proper type]
+ expected: FAIL
+
+ [History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type]
+ expected: FAIL
+
+ [History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type]
+ expected: FAIL
+
+ [History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type]
+ expected: FAIL
+
+ [ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type]
+ expected: FAIL
+
+ [PromiseRejectionEvent interface: existence and properties of interface object]
+ expected: FAIL
+
+ [PromiseRejectionEvent interface object length]
+ expected: FAIL
+
+ [PromiseRejectionEvent interface object name]
+ expected: FAIL
+
+ [PromiseRejectionEvent interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [PromiseRejectionEvent interface: attribute promise]
+ expected: FAIL
+
+ [PromiseRejectionEvent interface: attribute reason]
+ expected: FAIL
+
+ [Navigator interface: attribute oscpu]
+ expected: FAIL
+
+ [Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)]
+ expected: FAIL
+
+ [Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "productSub" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "vendor" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "vendorSub" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "oscpu" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "languages" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "onLine" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type]
+ expected: FAIL
+
+ [Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type]
+ expected: FAIL
+
+ [ImageBitmap interface: operation close()]
+ expected: FAIL
+
+ [MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object\])]
+ expected: FAIL
+
+ [MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type]
+ expected: FAIL
+
+ [MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type]
+ expected: FAIL
+
+ [MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object\])" with the proper type]
+ expected: FAIL
+
+ [MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object\]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [WebSocket interface: new WebSocket("ws://foo") must inherit property "extensions" with the proper type]
+ expected: FAIL
+
+ [MessagePort interface: operation postMessage(any, [object Object\])]
+ expected: FAIL
+
+ [Worker interface: attribute onmessageerror]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "behavior" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "bgColor" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "direction" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "height" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "loop" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollDelay" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "vspace" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "width" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onbounce" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onfinish" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onstart" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "start()" with the proper type]
+ expected: FAIL
+
+ [HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "stop()" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessageerror" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "scrolling" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "src" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "longDesc" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "noResize" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "contentDocument" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "contentWindow" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "marginHeight" with the proper type]
+ expected: FAIL
+
+ [HTMLFrameElement interface: document.createElement("frame") must inherit property "marginWidth" with the proper type]
+ expected: FAIL
+
+ [HTMLDirectoryElement interface: document.createElement("dir") must inherit property "compact" with the proper type]
+ expected: FAIL
+
+ [External interface: window.external must inherit property "AddSearchProvider()" with the proper type]
+ expected: FAIL
+
+ [External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type]
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 f01c5b1cadb..886ddb659db 100644
--- a/tests/wpt/metadata/html/dom/reflection-forms.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-forms.html.ini
@@ -23982,3 +23982,609 @@
[textarea.inputMode: IDL set to "KataKana"]
expected: FAIL
+ [input.autocomplete: typeof IDL attribute]
+ expected: FAIL
+
+ [input.autocomplete: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to ""]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.autocomplete: IDL set to undefined]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to 7]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to 1.5]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to true]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to false]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to NaN]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to Infinity]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to -Infinity]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to "\\0"]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to null]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [input.autocomplete: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [input.height: typeof IDL attribute]
+ expected: FAIL
+
+ [input.height: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [input.height: IDL set to 0]
+ expected: FAIL
+
+ [input.height: IDL set to 1]
+ expected: FAIL
+
+ [input.height: IDL set to 257]
+ expected: FAIL
+
+ [input.height: IDL set to 2147483647]
+ expected: FAIL
+
+ [input.height: IDL set to "-0"]
+ expected: FAIL
+
+ [input.height: IDL set to 2147483648]
+ expected: FAIL
+
+ [input.height: IDL set to 4294967295]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "kana-name"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "xkana-name"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "kana-name\\0"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "ana-name"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "KANA-NAME"]
+ expected: FAIL
+
+ [input.inputMode: setAttribute() to "Kana-name"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "kana-name"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "xkana-name"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "kana-name\\0"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "ana-name"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "KANA-NAME"]
+ expected: FAIL
+
+ [input.inputMode: IDL set to "Kana-name"]
+ expected: FAIL
+
+ [input.width: typeof IDL attribute]
+ expected: FAIL
+
+ [input.width: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [input.width: IDL set to 0]
+ expected: FAIL
+
+ [input.width: IDL set to 1]
+ expected: FAIL
+
+ [input.width: IDL set to 257]
+ expected: FAIL
+
+ [input.width: IDL set to 2147483647]
+ expected: FAIL
+
+ [input.width: IDL set to "-0"]
+ expected: FAIL
+
+ [input.width: IDL set to 2147483648]
+ expected: FAIL
+
+ [input.width: IDL set to 4294967295]
+ expected: FAIL
+
+ [select.autocomplete: typeof IDL attribute]
+ expected: FAIL
+
+ [select.autocomplete: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to ""]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.autocomplete: IDL set to undefined]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to 7]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to 1.5]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to true]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to false]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to NaN]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to Infinity]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to -Infinity]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to "\\0"]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to null]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [select.autocomplete: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.autocomplete: typeof IDL attribute]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to ""]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.autocomplete: IDL set to undefined]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to 7]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to 1.5]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to true]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to false]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to NaN]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to Infinity]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to -Infinity]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to "\\0"]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to null]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [textarea.autocomplete: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "kana-name"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "xkana-name"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "kana-name\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "ana-name"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "KANA-NAME"]
+ expected: FAIL
+
+ [textarea.inputMode: setAttribute() to "Kana-name"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "kana-name"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "xkana-name"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "kana-name\\0"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "ana-name"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "KANA-NAME"]
+ expected: FAIL
+
+ [textarea.inputMode: IDL set to "Kana-name"]
+ expected: FAIL
+
+ [textarea.minLength: typeof IDL attribute]
+ expected: FAIL
+
+ [textarea.minLength: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to -2147483649]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to -36]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to -1]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to -0]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to 0]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to 1]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to 2147483648]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to 4294967295]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to 4294967296]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to ""]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "-1"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "-0"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "0"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "1"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.minLength: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "\\v7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "
7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "
7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "᠎7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to " 7"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to undefined]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to 1.5]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to true]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to false]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to NaN]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to Infinity]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to object "2"]
+ expected: FAIL
+
+ [textarea.minLength: setAttribute() to object "3"]
+ expected: FAIL
+
+ [textarea.minLength: IDL set to -2147483648]
+ expected: FAIL
+
+ [textarea.minLength: IDL set to -36]
+ expected: FAIL
+
+ [textarea.minLength: IDL set to -1]
+ expected: FAIL
+
+ [textarea.minLength: IDL set to 0]
+ expected: FAIL
+
+ [textarea.minLength: IDL set to 1]
+ expected: FAIL
+
+ [textarea.minLength: IDL set to 2147483647]
+ expected: FAIL
+
+ [meter.value: typeof IDL attribute]
+ expected: FAIL
+
+ [meter.value: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [meter.value: IDL set to -10000000000]
+ expected: FAIL
+
+ [meter.value: IDL set to -1]
+ expected: FAIL
+
+ [meter.value: IDL set to -0]
+ expected: FAIL
+
+ [meter.value: IDL set to 0]
+ expected: FAIL
+
+ [meter.value: IDL set to 1]
+ expected: FAIL
+
+ [meter.value: IDL set to 10000000000]
+ expected: FAIL
+
+ [meter.min: typeof IDL attribute]
+ expected: FAIL
+
+ [meter.min: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [meter.min: IDL set to -10000000000]
+ expected: FAIL
+
+ [meter.min: IDL set to -1]
+ expected: FAIL
+
+ [meter.min: IDL set to -0]
+ expected: FAIL
+
+ [meter.min: IDL set to 0]
+ expected: FAIL
+
+ [meter.min: IDL set to 1]
+ expected: FAIL
+
+ [meter.min: IDL set to 10000000000]
+ expected: FAIL
+
+ [meter.max: typeof IDL attribute]
+ expected: FAIL
+
+ [meter.max: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [meter.max: IDL set to -10000000000]
+ expected: FAIL
+
+ [meter.max: IDL set to -1]
+ expected: FAIL
+
+ [meter.max: IDL set to -0]
+ expected: FAIL
+
+ [meter.max: IDL set to 0]
+ expected: FAIL
+
+ [meter.max: IDL set to 1]
+ expected: FAIL
+
+ [meter.max: IDL set to 10000000000]
+ expected: FAIL
+
+ [meter.low: typeof IDL attribute]
+ expected: FAIL
+
+ [meter.low: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [meter.low: IDL set to -10000000000]
+ expected: FAIL
+
+ [meter.low: IDL set to -1]
+ expected: FAIL
+
+ [meter.low: IDL set to -0]
+ expected: FAIL
+
+ [meter.low: IDL set to 0]
+ expected: FAIL
+
+ [meter.low: IDL set to 1]
+ expected: FAIL
+
+ [meter.low: IDL set to 10000000000]
+ expected: FAIL
+
+ [meter.high: typeof IDL attribute]
+ expected: FAIL
+
+ [meter.high: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [meter.high: IDL set to -10000000000]
+ expected: FAIL
+
+ [meter.high: IDL set to -1]
+ expected: FAIL
+
+ [meter.high: IDL set to -0]
+ expected: FAIL
+
+ [meter.high: IDL set to 0]
+ expected: FAIL
+
+ [meter.high: IDL set to 1]
+ expected: FAIL
+
+ [meter.high: IDL set to 10000000000]
+ expected: FAIL
+
+ [meter.optimum: typeof IDL attribute]
+ expected: FAIL
+
+ [meter.optimum: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [meter.optimum: IDL set to -10000000000]
+ expected: FAIL
+
+ [meter.optimum: IDL set to -1]
+ expected: FAIL
+
+ [meter.optimum: IDL set to -0]
+ expected: FAIL
+
+ [meter.optimum: IDL set to 0]
+ expected: FAIL
+
+ [meter.optimum: IDL set to 1]
+ expected: FAIL
+
+ [meter.optimum: IDL set to 10000000000]
+ 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 7c7c6733eaa..68a2c71d7db 100644
--- a/tests/wpt/metadata/html/dom/reflection-metadata.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-metadata.html.ini
@@ -10926,3 +10926,540 @@
[link.as: IDL set to "XSLT"]
expected: FAIL
+ [base.href: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [link.scope: typeof IDL attribute]
+ expected: FAIL
+
+ [link.scope: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [link.scope: setAttribute() to ""]
+ expected: FAIL
+
+ [link.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
+
+ [link.scope: setAttribute() to undefined]
+ expected: FAIL
+
+ [link.scope: setAttribute() to 7]
+ expected: FAIL
+
+ [link.scope: setAttribute() to 1.5]
+ expected: FAIL
+
+ [link.scope: setAttribute() to true]
+ expected: FAIL
+
+ [link.scope: setAttribute() to false]
+ expected: FAIL
+
+ [link.scope: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [link.scope: setAttribute() to NaN]
+ expected: FAIL
+
+ [link.scope: setAttribute() to Infinity]
+ expected: FAIL
+
+ [link.scope: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [link.scope: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [link.scope: setAttribute() to null]
+ expected: FAIL
+
+ [link.scope: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [link.scope: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [link.scope: IDL set to ""]
+ expected: FAIL
+
+ [link.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
+
+ [link.scope: IDL set to undefined]
+ expected: FAIL
+
+ [link.scope: IDL set to 7]
+ expected: FAIL
+
+ [link.scope: IDL set to 1.5]
+ expected: FAIL
+
+ [link.scope: IDL set to true]
+ expected: FAIL
+
+ [link.scope: IDL set to false]
+ expected: FAIL
+
+ [link.scope: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [link.scope: IDL set to NaN]
+ expected: FAIL
+
+ [link.scope: IDL set to Infinity]
+ expected: FAIL
+
+ [link.scope: IDL set to -Infinity]
+ expected: FAIL
+
+ [link.scope: IDL set to "\\0"]
+ expected: FAIL
+
+ [link.scope: IDL set to null]
+ expected: FAIL
+
+ [link.scope: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [link.scope: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [link.workerType: typeof IDL attribute]
+ expected: FAIL
+
+ [link.workerType: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to ""]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.workerType: setAttribute() to undefined]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to 7]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to 1.5]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to true]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to false]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to NaN]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to Infinity]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to null]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "classic"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "xclassic"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "classic\\0"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "lassic"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "CLASSIC"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "module"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "xmodule"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "module\\0"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "odule"]
+ expected: FAIL
+
+ [link.workerType: setAttribute() to "MODULE"]
+ expected: FAIL
+
+ [link.workerType: IDL set to ""]
+ expected: FAIL
+
+ [link.workerType: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.workerType: IDL set to undefined]
+ expected: FAIL
+
+ [link.workerType: IDL set to 7]
+ expected: FAIL
+
+ [link.workerType: IDL set to 1.5]
+ expected: FAIL
+
+ [link.workerType: IDL set to true]
+ expected: FAIL
+
+ [link.workerType: IDL set to false]
+ expected: FAIL
+
+ [link.workerType: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [link.workerType: IDL set to NaN]
+ expected: FAIL
+
+ [link.workerType: IDL set to Infinity]
+ expected: FAIL
+
+ [link.workerType: IDL set to -Infinity]
+ expected: FAIL
+
+ [link.workerType: IDL set to "\\0"]
+ expected: FAIL
+
+ [link.workerType: IDL set to null]
+ expected: FAIL
+
+ [link.workerType: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [link.workerType: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [link.workerType: IDL set to "classic"]
+ expected: FAIL
+
+ [link.workerType: IDL set to "xclassic"]
+ expected: FAIL
+
+ [link.workerType: IDL set to "classic\\0"]
+ expected: FAIL
+
+ [link.workerType: IDL set to "lassic"]
+ expected: FAIL
+
+ [link.workerType: IDL set to "CLASSIC"]
+ expected: FAIL
+
+ [link.workerType: IDL set to "module"]
+ expected: FAIL
+
+ [link.workerType: IDL set to "xmodule"]
+ expected: FAIL
+
+ [link.workerType: IDL set to "module\\0"]
+ expected: FAIL
+
+ [link.workerType: IDL set to "odule"]
+ expected: FAIL
+
+ [link.workerType: IDL set to "MODULE"]
+ expected: FAIL
+
+ [link.updateViaCache: typeof IDL attribute]
+ expected: FAIL
+
+ [link.updateViaCache: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to ""]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.updateViaCache: setAttribute() to undefined]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to 7]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to 1.5]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to true]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to false]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to NaN]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to Infinity]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to null]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "imports"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "ximports"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "imports\\0"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "mports"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "IMPORTS"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "all"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "xall"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "all\\0"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "ll"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "ALL"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "none"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "xnone"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "none\\0"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "one"]
+ expected: FAIL
+
+ [link.updateViaCache: setAttribute() to "NONE"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to ""]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.updateViaCache: IDL set to undefined]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to 7]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to 1.5]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to true]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to false]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to NaN]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to Infinity]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to -Infinity]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "\\0"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to null]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "imports"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "ximports"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "imports\\0"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "mports"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "IMPORTS"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "all"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "xall"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "all\\0"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "ll"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "ALL"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "none"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "xnone"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "none\\0"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "one"]
+ expected: FAIL
+
+ [link.updateViaCache: IDL set to "NONE"]
+ expected: FAIL
+
+ [style.nonce: typeof IDL attribute]
+ expected: FAIL
+
+ [style.nonce: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to ""]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.nonce: setAttribute() to undefined]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to 7]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to 1.5]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to true]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to false]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to NaN]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to Infinity]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to null]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [style.nonce: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [style.nonce: IDL set to ""]
+ expected: FAIL
+
+ [style.nonce: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.nonce: IDL set to undefined]
+ expected: FAIL
+
+ [style.nonce: IDL set to 7]
+ expected: FAIL
+
+ [style.nonce: IDL set to 1.5]
+ expected: FAIL
+
+ [style.nonce: IDL set to true]
+ expected: FAIL
+
+ [style.nonce: IDL set to false]
+ expected: FAIL
+
+ [style.nonce: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [style.nonce: IDL set to NaN]
+ expected: FAIL
+
+ [style.nonce: IDL set to Infinity]
+ expected: FAIL
+
+ [style.nonce: IDL set to -Infinity]
+ expected: FAIL
+
+ [style.nonce: IDL set to "\\0"]
+ expected: FAIL
+
+ [style.nonce: IDL set to null]
+ expected: FAIL
+
+ [style.nonce: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [style.nonce: 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 52f5e8ad123..91808fec6d2 100644
--- a/tests/wpt/metadata/html/dom/reflection-misc.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-misc.html.ini
@@ -17736,3 +17736,807 @@
[menu.type: IDL set to "CONTEXT"]
expected: FAIL
+ [template.dir: typeof IDL attribute]
+ expected: FAIL
+
+ [template.dir: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [template.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [template.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
+
+ [template.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [template.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [template.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [template.dir: setAttribute() to true]
+ expected: FAIL
+
+ [template.dir: setAttribute() to false]
+ expected: FAIL
+
+ [template.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [template.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [template.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to null]
+ expected: FAIL
+
+ [template.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [template.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [template.dir: IDL set to ""]
+ expected: FAIL
+
+ [template.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
+
+ [template.dir: IDL set to undefined]
+ expected: FAIL
+
+ [template.dir: IDL set to 7]
+ expected: FAIL
+
+ [template.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [template.dir: IDL set to true]
+ expected: FAIL
+
+ [template.dir: IDL set to false]
+ expected: FAIL
+
+ [template.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [template.dir: IDL set to NaN]
+ expected: FAIL
+
+ [template.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [template.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [template.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [template.dir: IDL set to null]
+ expected: FAIL
+
+ [template.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [template.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [template.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [template.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [template.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [template.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [template.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [template.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [template.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [template.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [template.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [template.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [template.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [template.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [template.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [template.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [template.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [template.accessKey: typeof IDL attribute]
+ expected: FAIL
+
+ [template.accessKey: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [template.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
+
+ [template.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [template.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [template.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [template.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
+
+ [template.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [template.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [template.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [template.accessKey: IDL set to true]
+ expected: FAIL
+
+ [template.accessKey: IDL set to false]
+ expected: FAIL
+
+ [template.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [template.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [template.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [template.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [template.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [template.accessKey: IDL set to null]
+ expected: FAIL
+
+ [template.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [template.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [template.tabIndex: typeof IDL attribute]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [template.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [template.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [template.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [template.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [template.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [template.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [template.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [slot.dir: typeof IDL attribute]
+ expected: FAIL
+
+ [slot.dir: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to ""]
+ expected: FAIL
+
+ [slot.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
+
+ [slot.dir: setAttribute() to undefined]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to 7]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to 1.5]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to true]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to false]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to NaN]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to Infinity]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to null]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "ltr"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "xltr"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "ltr\\0"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "tr"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "LTR"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "rtl"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "xrtl"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "rtl\\0"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "tl"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "RTL"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "auto"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "xauto"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "auto\\0"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "uto"]
+ expected: FAIL
+
+ [slot.dir: setAttribute() to "AUTO"]
+ expected: FAIL
+
+ [slot.dir: IDL set to ""]
+ expected: FAIL
+
+ [slot.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
+
+ [slot.dir: IDL set to undefined]
+ expected: FAIL
+
+ [slot.dir: IDL set to 7]
+ expected: FAIL
+
+ [slot.dir: IDL set to 1.5]
+ expected: FAIL
+
+ [slot.dir: IDL set to true]
+ expected: FAIL
+
+ [slot.dir: IDL set to false]
+ expected: FAIL
+
+ [slot.dir: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [slot.dir: IDL set to NaN]
+ expected: FAIL
+
+ [slot.dir: IDL set to Infinity]
+ expected: FAIL
+
+ [slot.dir: IDL set to -Infinity]
+ expected: FAIL
+
+ [slot.dir: IDL set to "\\0"]
+ expected: FAIL
+
+ [slot.dir: IDL set to null]
+ expected: FAIL
+
+ [slot.dir: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [slot.dir: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "ltr"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "xltr"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "ltr\\0"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "tr"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "LTR"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "rtl"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "xrtl"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "rtl\\0"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "tl"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "RTL"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "auto"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "xauto"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "auto\\0"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "uto"]
+ expected: FAIL
+
+ [slot.dir: IDL set to "AUTO"]
+ expected: FAIL
+
+ [slot.accessKey: typeof IDL attribute]
+ expected: FAIL
+
+ [slot.accessKey: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to ""]
+ expected: FAIL
+
+ [slot.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
+
+ [slot.accessKey: setAttribute() to undefined]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to 7]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to 1.5]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to true]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to false]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to NaN]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to Infinity]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to null]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [slot.accessKey: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to ""]
+ expected: FAIL
+
+ [slot.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
+
+ [slot.accessKey: IDL set to undefined]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to 7]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to 1.5]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to true]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to false]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to NaN]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to Infinity]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to -Infinity]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to "\\0"]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to null]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [slot.accessKey: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [slot.tabIndex: typeof IDL attribute]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to -36]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to -1]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to 0]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to 1]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to 2147483647]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to -2147483648]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to "-1"]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to "-0"]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to "0"]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to "1"]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to "\\t7"]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to "\\f7"]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to " 7"]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to "\\n7"]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to "\\r7"]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to 1.5]
+ expected: FAIL
+
+ [slot.tabIndex: setAttribute() to object "2"]
+ expected: FAIL
+
+ [slot.tabIndex: IDL set to -36]
+ expected: FAIL
+
+ [slot.tabIndex: IDL set to -1]
+ expected: FAIL
+
+ [slot.tabIndex: IDL set to 0]
+ expected: FAIL
+
+ [slot.tabIndex: IDL set to 1]
+ expected: FAIL
+
+ [slot.tabIndex: IDL set to 2147483647]
+ expected: FAIL
+
+ [slot.tabIndex: IDL set to -2147483648]
+ expected: FAIL
+
+ [slot.name: typeof IDL attribute]
+ expected: FAIL
+
+ [slot.name: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [slot.name: setAttribute() to ""]
+ expected: FAIL
+
+ [slot.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
+
+ [slot.name: setAttribute() to undefined]
+ expected: FAIL
+
+ [slot.name: setAttribute() to 7]
+ expected: FAIL
+
+ [slot.name: setAttribute() to 1.5]
+ expected: FAIL
+
+ [slot.name: setAttribute() to true]
+ expected: FAIL
+
+ [slot.name: setAttribute() to false]
+ expected: FAIL
+
+ [slot.name: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [slot.name: setAttribute() to NaN]
+ expected: FAIL
+
+ [slot.name: setAttribute() to Infinity]
+ expected: FAIL
+
+ [slot.name: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [slot.name: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [slot.name: setAttribute() to null]
+ expected: FAIL
+
+ [slot.name: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [slot.name: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [slot.name: IDL set to ""]
+ expected: FAIL
+
+ [slot.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
+
+ [slot.name: IDL set to undefined]
+ expected: FAIL
+
+ [slot.name: IDL set to 7]
+ expected: FAIL
+
+ [slot.name: IDL set to 1.5]
+ expected: FAIL
+
+ [slot.name: IDL set to true]
+ expected: FAIL
+
+ [slot.name: IDL set to false]
+ expected: FAIL
+
+ [slot.name: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [slot.name: IDL set to NaN]
+ expected: FAIL
+
+ [slot.name: IDL set to Infinity]
+ expected: FAIL
+
+ [slot.name: IDL set to -Infinity]
+ expected: FAIL
+
+ [slot.name: IDL set to "\\0"]
+ expected: FAIL
+
+ [slot.name: IDL set to null]
+ expected: FAIL
+
+ [slot.name: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [slot.name: 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 b7159b771ca..3866ee7acf9 100644
--- a/tests/wpt/metadata/html/dom/reflection-tabular.html.ini
+++ b/tests/wpt/metadata/html/dom/reflection-tabular.html.ini
@@ -25755,3 +25755,195 @@
[th.rowSpan: IDL set to 65535]
expected: FAIL
+ [td.headers: typeof IDL attribute]
+ expected: FAIL
+
+ [td.headers: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [td.headers: setAttribute() to ""]
+ expected: FAIL
+
+ [td.headers: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.headers: setAttribute() to undefined]
+ expected: FAIL
+
+ [td.headers: setAttribute() to 7]
+ expected: FAIL
+
+ [td.headers: setAttribute() to 1.5]
+ expected: FAIL
+
+ [td.headers: setAttribute() to true]
+ expected: FAIL
+
+ [td.headers: setAttribute() to false]
+ expected: FAIL
+
+ [td.headers: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [td.headers: setAttribute() to NaN]
+ expected: FAIL
+
+ [td.headers: setAttribute() to Infinity]
+ expected: FAIL
+
+ [td.headers: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [td.headers: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [td.headers: setAttribute() to null]
+ expected: FAIL
+
+ [td.headers: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [td.headers: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [td.headers: IDL set to ""]
+ expected: FAIL
+
+ [td.headers: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.headers: IDL set to undefined]
+ expected: FAIL
+
+ [td.headers: IDL set to 7]
+ expected: FAIL
+
+ [td.headers: IDL set to 1.5]
+ expected: FAIL
+
+ [td.headers: IDL set to true]
+ expected: FAIL
+
+ [td.headers: IDL set to false]
+ expected: FAIL
+
+ [td.headers: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [td.headers: IDL set to NaN]
+ expected: FAIL
+
+ [td.headers: IDL set to Infinity]
+ expected: FAIL
+
+ [td.headers: IDL set to -Infinity]
+ expected: FAIL
+
+ [td.headers: IDL set to "\\0"]
+ expected: FAIL
+
+ [td.headers: IDL set to null]
+ expected: FAIL
+
+ [td.headers: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [td.headers: IDL set to object "test-valueOf"]
+ expected: FAIL
+
+ [th.headers: typeof IDL attribute]
+ expected: FAIL
+
+ [th.headers: IDL get with DOM attribute unset]
+ expected: FAIL
+
+ [th.headers: setAttribute() to ""]
+ expected: FAIL
+
+ [th.headers: setAttribute() to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.headers: setAttribute() to undefined]
+ expected: FAIL
+
+ [th.headers: setAttribute() to 7]
+ expected: FAIL
+
+ [th.headers: setAttribute() to 1.5]
+ expected: FAIL
+
+ [th.headers: setAttribute() to true]
+ expected: FAIL
+
+ [th.headers: setAttribute() to false]
+ expected: FAIL
+
+ [th.headers: setAttribute() to object "[object Object\]"]
+ expected: FAIL
+
+ [th.headers: setAttribute() to NaN]
+ expected: FAIL
+
+ [th.headers: setAttribute() to Infinity]
+ expected: FAIL
+
+ [th.headers: setAttribute() to -Infinity]
+ expected: FAIL
+
+ [th.headers: setAttribute() to "\\0"]
+ expected: FAIL
+
+ [th.headers: setAttribute() to null]
+ expected: FAIL
+
+ [th.headers: setAttribute() to object "test-toString"]
+ expected: FAIL
+
+ [th.headers: setAttribute() to object "test-valueOf"]
+ expected: FAIL
+
+ [th.headers: IDL set to ""]
+ expected: FAIL
+
+ [th.headers: IDL set to " \\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07 \\b\\t\\n\\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.headers: IDL set to undefined]
+ expected: FAIL
+
+ [th.headers: IDL set to 7]
+ expected: FAIL
+
+ [th.headers: IDL set to 1.5]
+ expected: FAIL
+
+ [th.headers: IDL set to true]
+ expected: FAIL
+
+ [th.headers: IDL set to false]
+ expected: FAIL
+
+ [th.headers: IDL set to object "[object Object\]"]
+ expected: FAIL
+
+ [th.headers: IDL set to NaN]
+ expected: FAIL
+
+ [th.headers: IDL set to Infinity]
+ expected: FAIL
+
+ [th.headers: IDL set to -Infinity]
+ expected: FAIL
+
+ [th.headers: IDL set to "\\0"]
+ expected: FAIL
+
+ [th.headers: IDL set to null]
+ expected: FAIL
+
+ [th.headers: IDL set to object "test-toString"]
+ expected: FAIL
+
+ [th.headers: IDL set to object "test-valueOf"]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.html.ini b/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.html.ini
index 76fea8a7c80..51f27d185ef 100644
--- a/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.html.ini
+++ b/tests/wpt/metadata/html/infrastructure/common-dom-interfaces/collections/domstringlist-interface.html.ini
@@ -45,3 +45,12 @@
[DOMStringList interface: calling contains(DOMString) on location.ancestorOrigins with too few arguments must throw TypeError]
expected: FAIL
+ [DOMStringList interface: location.ancestorOrigins must inherit property "length" with the proper type]
+ expected: FAIL
+
+ [DOMStringList interface: location.ancestorOrigins must inherit property "item(unsigned long)" with the proper type]
+ expected: FAIL
+
+ [DOMStringList interface: location.ancestorOrigins must inherit property "contains(DOMString)" with the proper type]
+ 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 ad7d4ea8ad6..4a120ac404d 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
@@ -129,3 +129,30 @@
[collections are new live HTMLCollection instances]
expected: FAIL
+ [named property getter with undefined]
+ expected: FAIL
+
+ [named property getter with null]
+ expected: FAIL
+
+ [namedItem method with undefined]
+ expected: FAIL
+
+ [namedItem method with null]
+ expected: FAIL
+
+ [legacy caller with undefined]
+ expected: FAIL
+
+ [legacy caller with null]
+ expected: FAIL
+
+ [legacy caller with arbitrary this value]
+ expected: FAIL
+
+ [item method with undefined]
+ expected: FAIL
+
+ [item method with null]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html.ini b/tests/wpt/metadata/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html.ini
new file mode 100644
index 00000000000..8ffcefa18d9
--- /dev/null
+++ b/tests/wpt/metadata/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html.ini
@@ -0,0 +1,8 @@
+[structuredclone_0.html]
+ type: testharness
+ [ImageData object can be cloned]
+ expected: FAIL
+
+ [ImageData expandos are not cloned]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html.ini
deleted file mode 100644
index 07dd3f915c2..00000000000
--- a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[moving-documents.html]
- type: testharness
- expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html.ini
new file mode 100644
index 00000000000..b9381ec8c38
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html.ini
@@ -0,0 +1,3 @@
+[remove-from-document.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_media_change.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_media_change.html.ini
new file mode 100644
index 00000000000..910515ef752
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_media_change.html.ini
@@ -0,0 +1,8 @@
+[style_media_change.html]
+ type: testharness
+ [change media value dynamically]
+ expected: FAIL
+
+ [removing media attribute]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_type.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_type.html.ini
new file mode 100644
index 00000000000..03cd84bae40
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_type.html.ini
@@ -0,0 +1,8 @@
+[style_type.html]
+ type: testharness
+ [With a whitespace-surrounded type attribute, the style should not apply]
+ expected: FAIL
+
+ [With a charset parameter in the type attribute, the style should not apply]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_type_change.html.ini b/tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_type_change.html.ini
new file mode 100644
index 00000000000..ce4ccd87646
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/document-metadata/the-style-element/style_type_change.html.ini
@@ -0,0 +1,11 @@
+[style_type_change.html]
+ type: testharness
+ [Check initial styleSheets length type]
+ expected: FAIL
+
+ [Change type from invalid type to valid type]
+ expected: FAIL
+
+ [Change type from valid type to invalid type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html.ini
index 73933f83bf2..666997e01de 100644
--- a/tests/wpt/metadata/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html.ini
+++ b/tests/wpt/metadata/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html.ini
@@ -7,3 +7,21 @@
[setting playbackRate]
expected: TIMEOUT
+ [playbackRate set to small positive value]
+ expected: TIMEOUT
+
+ [playbackRate set to large positive value]
+ expected: TIMEOUT
+
+ [playbackRate set to small negative value]
+ expected: TIMEOUT
+
+ [playbackRate set to large negative value]
+ expected: TIMEOUT
+
+ [playbackRate set to 0]
+ expected: TIMEOUT
+
+ [playbackRate set to -1]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/security.reset.cross.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/security.reset.cross.html.ini
new file mode 100644
index 00000000000..8b4f684d8e6
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/security.reset.cross.html.ini
@@ -0,0 +1,5 @@
+[security.reset.cross.html]
+ type: testharness
+ [Resetting the canvas state resets the origin-clean flag]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/security.reset.redirect.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/security.reset.redirect.html.ini
new file mode 100644
index 00000000000..1de8170d39d
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/security.reset.redirect.html.ini
@@ -0,0 +1,5 @@
+[security.reset.redirect.html]
+ type: testharness
+ [Resetting the canvas state resets the origin-clean flag]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html.ini
new file mode 100644
index 00000000000..b17c9667a66
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html.ini
@@ -0,0 +1,5 @@
+[iframe_sandbox_allow_top_navigation-1.html]
+ type: testharness
+ [Check that sandboxed iframe can perform navigation on the top frame\n when allow-top-navigation is set]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html.ini
new file mode 100644
index 00000000000..f5edfc06313
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html.ini
@@ -0,0 +1,5 @@
+[iframe_sandbox_allow_top_navigation-2.html]
+ type: testharness
+ [Check that sandboxed iframe cannot perform navigation on the top\n frame when allow-top-navigation is not set]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html.ini
new file mode 100644
index 00000000000..2defbd51c27
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html.ini
@@ -0,0 +1,5 @@
+[iframe_sandbox_allow_top_navigation-3.html]
+ type: testharness
+ [Check that sandboxed iframe can perform navigation on the top frame\n when allow-top-navigation is set (even when\n allow-top-navigation-by-user-activation is set)]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html.ini
new file mode 100644
index 00000000000..9abfb1ab7ad
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html.ini
@@ -0,0 +1,5 @@
+[iframe_sandbox_navigate_descendants.html]
+ type: testharness
+ [Check that sandboxed iframe can navigate their descendants]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_005.htm.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_005.htm.ini
new file mode 100644
index 00000000000..916f8f2955e
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_005.htm.ini
@@ -0,0 +1,5 @@
+[sandbox_005.htm]
+ type: testharness
+ [Block script execution inside iframe with sandbox attribute.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_023.htm.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_023.htm.ini
new file mode 100644
index 00000000000..bfbedc693e9
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_023.htm.ini
@@ -0,0 +1,5 @@
+[sandbox_023.htm]
+ type: testharness
+ [Allow sandbox iframe to access other content from the same origin if sandbox='allow-same-origin']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_025.htm.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_025.htm.ini
new file mode 100644
index 00000000000..515a2ab2bd2
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_025.htm.ini
@@ -0,0 +1,5 @@
+[sandbox_025.htm]
+ type: testharness
+ [Allow parent content to access sandbox child iframe content when sandbox='allow-same-origin']
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_029.htm.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_029.htm.ini
new file mode 100644
index 00000000000..217b765c736
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_029.htm.ini
@@ -0,0 +1,5 @@
+[sandbox_029.htm]
+ type: testharness
+ [Block document.cookie inside iframe with the sandbox attribute.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_031.htm.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_031.htm.ini
new file mode 100644
index 00000000000..6b9e929646c
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-iframe-element/sandbox_031.htm.ini
@@ -0,0 +1,5 @@
+[sandbox_031.htm]
+ type: testharness
+ [Block localStorage and sessionStorage inside iframe with the sandbox attribute.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/adoption.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/adoption.html.ini
new file mode 100644
index 00000000000..28a4f9efd7c
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/adoption.html.ini
@@ -0,0 +1,27 @@
+[adoption.html]
+ type: testharness
+ expected: TIMEOUT
+ [img (src only)]
+ expected: FAIL
+
+ [img (src only), parent is picture]
+ expected: FAIL
+
+ [img (src only), previous sibling is source]
+ expected: FAIL
+
+ [img (srcset 1 cand)]
+ expected: TIMEOUT
+
+ [img (srcset 1 cand), parent is picture]
+ expected: TIMEOUT
+
+ [img (srcset 1 cand), previous sibling is source]
+ expected: TIMEOUT
+
+ [adopt a cloned img in template]
+ expected: FAIL
+
+ [adoption is from appendChild]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html.ini
new file mode 100644
index 00000000000..91879dfa2c4
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html.ini
@@ -0,0 +1,12 @@
+[image-decode-iframe.html]
+ type: testharness
+ expected: TIMEOUT
+ [HTMLImageElement.prototype.decode(), iframe tests. Decode from removed iframe fails (loaded img)]
+ expected: TIMEOUT
+
+ [HTMLImageElement.prototype.decode(), iframe tests. Decode from removed iframe fails (img not loaded)]
+ expected: NOTRUN
+
+ [HTMLImageElement.prototype.decode(), iframe tests. Decode from iframe, later removed, fails (img not loaded)]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html.ini
new file mode 100644
index 00000000000..550cfb6f326
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html.ini
@@ -0,0 +1,20 @@
+[image-decode-path-changes-svg.tentative.html]
+ type: testharness
+ [SVGImageElement.prototype.decode(), href mutation tests. xlink:href changes fail decode.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), href mutation tests. href changes fail decode.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), href mutation tests. xlink:href changes fail decode; following good decode succeeds.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), href mutation tests. href changes fail decode; following good decode succeeds.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), href mutation tests. xlink:href changes fail decode; following bad decode fails.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), href mutation tests. href changes fail decode; following bad decode fails.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html.ini
new file mode 100644
index 00000000000..ef5c0e07d74
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html.ini
@@ -0,0 +1,26 @@
+[image-decode-path-changes.html]
+ type: testharness
+ [HTMLImageElement.prototype.decode(), src/srcset mutation tests. src changes fail decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), src/srcset mutation tests. src changes fail decode; following good png decode succeeds.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), src/srcset mutation tests. src changes fail decode; following good svg decode succeeds.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), src/srcset mutation tests. src changes fail decode; following bad decode fails.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), src/srcset mutation tests. src changes to the same path succeed.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), src/srcset mutation tests. srcset changes fail decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), src/srcset mutation tests. srcset changes fail decode; following good decode succeeds.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), src/srcset mutation tests. srcset changes fail decode; following bad decode fails.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html.ini
new file mode 100644
index 00000000000..e12814d7f38
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html.ini
@@ -0,0 +1,26 @@
+[image-decode-picture.html]
+ type: testharness
+ [HTMLImageElement.prototype.decode(), picture tests. Image with PNG source decodes with undefined.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), picture tests. Image with multiple sources decodes with undefined.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), picture tests. Image with PNG data URL source decodes with undefined.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), picture tests. Image with SVG source decodes with undefined.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), picture tests. Non-existent source fails decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), picture tests. Corrupt image in src fails decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), picture tests. Image without srcset fails decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), picture tests. Multiple decodes for images with src succeed.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html.ini
new file mode 100644
index 00000000000..134c9ba2b48
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html.ini
@@ -0,0 +1,41 @@
+[image-decode-svg.tentative.html]
+ type: testharness
+ [SVGImageElement.prototype.decode(), basic tests. Image with PNG xlink:href decodes with undefined.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Image with PNG href decodes with undefined.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Image with PNG data URL xlink:href decodes with undefined.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Image with PNG data URL href decodes with undefined.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Image with SVG xlink:href decodes with undefined.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Image with SVG href decodes with undefined.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Non-existent xlink:href fails decode.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Non-existent href fails decode.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Corrupt image in xlink:href fails decode.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Corrupt image in href fails decode.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Image without xlink:href or href fails decode.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Multiple decodes with a xlink:href succeed.]
+ expected: FAIL
+
+ [SVGImageElement.prototype.decode(), basic tests. Multiple decodes with a href succeed.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode.html.ini
new file mode 100644
index 00000000000..9c27df71eb3
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/decode/image-decode.html.ini
@@ -0,0 +1,44 @@
+[image-decode.html]
+ type: testharness
+ [HTMLImageElement.prototype.decode(), basic tests. Image with PNG src decodes with undefined.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Image with PNG data URL src decodes with undefined.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Image with SVG src decodes with undefined.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Non-existent src fails decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Inactive document fails decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Adopted active image into inactive document fails decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Adopted inactive image into active document succeeds.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Corrupt image in src fails decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Image without src/srcset fails decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Multiple decodes for images with src succeed.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Image with PNG srcset decodes with undefined.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Image with SVG srcset decodes with undefined.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Non-existent srcset fails decode.]
+ expected: FAIL
+
+ [HTMLImageElement.prototype.decode(), basic tests. Multiple decodes for images with srcset succeed.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini
new file mode 100644
index 00000000000..6dc30b21283
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/non-active-document.html.ini
@@ -0,0 +1,11 @@
+[non-active-document.html]
+ type: testharness
+ [DOMParser]
+ expected: FAIL
+
+ [createHTMLDocument]
+ expected: FAIL
+
+ [<template>]
+ expected: FAIL
+
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
index 1da261971d2..f0424be0231 100644
--- 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
@@ -3,9 +3,3 @@
[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/forms/attributes-common-to-form-controls/formAction_document_address.html.ini b/tests/wpt/metadata/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address.html.ini
new file mode 100644
index 00000000000..8820e0fbda8
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address.html.ini
@@ -0,0 +1,3 @@
+[formAction_document_address.html]
+ type: testharness
+ expected: ERROR
diff --git a/tests/wpt/metadata/html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html.ini b/tests/wpt/metadata/html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html.ini
new file mode 100644
index 00000000000..3c5a2a98e6b
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html.ini
@@ -0,0 +1,5 @@
+[form_owner_and_table_3.html]
+ type: testharness
+ [parser inserted flag is not reset by insertions with the owner form, but reset by by removal from the owner form]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/form-submission-0/submission-checks.window.js.ini b/tests/wpt/metadata/html/semantics/forms/form-submission-0/submission-checks.window.js.ini
new file mode 100644
index 00000000000..98bf6052cdb
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/form-submission-0/submission-checks.window.js.ini
@@ -0,0 +1,3 @@
+[submission-checks.window.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/forms/textfieldselection/selection-value-interactions.html.ini b/tests/wpt/metadata/html/semantics/forms/textfieldselection/selection-value-interactions.html.ini
index a5ae0c88251..d2c0149cf61 100644
--- a/tests/wpt/metadata/html/semantics/forms/textfieldselection/selection-value-interactions.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/textfieldselection/selection-value-interactions.html.ini
@@ -30,3 +30,9 @@
[value dirty flag behavior after setRangeText on focused then blurred input]
expected: FAIL
+ [selection is always collapsed to the end after setting values on input]
+ expected: FAIL
+
+ [selection is always collapsed to the end after setting values on textarea]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-button-element/button-checkvalidity.html.ini b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-checkvalidity.html.ini
new file mode 100644
index 00000000000..8aa484ad6f5
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-checkvalidity.html.ini
@@ -0,0 +1,5 @@
+[button-checkvalidity.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-button-element/button-setcustomvalidity.html.ini b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-setcustomvalidity.html.ini
new file mode 100644
index 00000000000..4752ab781b4
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-setcustomvalidity.html.ini
@@ -0,0 +1,5 @@
+[button-setcustomvalidity.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-button-element/button-validationmessage.html.ini b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-validationmessage.html.ini
new file mode 100644
index 00000000000..69e70885a3a
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-validationmessage.html.ini
@@ -0,0 +1,5 @@
+[button-validationmessage.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-button-element/button-willvalidate.html.ini b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-willvalidate.html.ini
new file mode 100644
index 00000000000..f13db81048c
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-button-element/button-willvalidate.html.ini
@@ -0,0 +1,5 @@
+[button-willvalidate.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html.ini b/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html.ini
new file mode 100644
index 00000000000..2ac6c197a9e
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html.ini
@@ -0,0 +1,5 @@
+[fieldset-checkvalidity.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html.ini b/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html.ini
new file mode 100644
index 00000000000..7e82d38494b
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html.ini
@@ -0,0 +1,5 @@
+[fieldset-setcustomvalidity.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html.ini b/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html.ini
new file mode 100644
index 00000000000..77550ddf1fe
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html.ini
@@ -0,0 +1,5 @@
+[fieldset-validationmessage.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html.ini b/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html.ini
new file mode 100644
index 00000000000..bd2756bbb2c
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html.ini
@@ -0,0 +1,5 @@
+[fieldset-willvalidate.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-form-element/form-checkvalidity.html.ini b/tests/wpt/metadata/html/semantics/forms/the-form-element/form-checkvalidity.html.ini
new file mode 100644
index 00000000000..5ebdf7e6471
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-form-element/form-checkvalidity.html.ini
@@ -0,0 +1,5 @@
+[form-checkvalidity.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-form-element/form-elements-filter.html.ini b/tests/wpt/metadata/html/semantics/forms/the-form-element/form-elements-filter.html.ini
index a5301ca8ef5..d64290800cc 100644
--- a/tests/wpt/metadata/html/semantics/forms/the-form-element/form-elements-filter.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/the-form-element/form-elements-filter.html.ini
@@ -3,3 +3,6 @@
[form.elements must contain all listed elements with the form owner]
expected: FAIL
+ [form.elements only includes elements from the same shadow tree]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/files.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/files.html.ini
new file mode 100644
index 00000000000..3d38ccb36d6
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/files.html.ini
@@ -0,0 +1,5 @@
+[files.html]
+ type: testharness
+ [setting <input type=file>.files]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-checkvalidity.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-checkvalidity.html.ini
new file mode 100644
index 00000000000..ad624c4aeb1
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-checkvalidity.html.ini
@@ -0,0 +1,5 @@
+[input-checkvalidity.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-setcustomvalidity.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-setcustomvalidity.html.ini
new file mode 100644
index 00000000000..2d9b5ec59b0
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-setcustomvalidity.html.ini
@@ -0,0 +1,5 @@
+[input-setcustomvalidity.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-stepdown.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-stepdown.html.ini
new file mode 100644
index 00000000000..46ddfb1b695
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-stepdown.html.ini
@@ -0,0 +1,5 @@
+[input-stepdown.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-stepup.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-stepup.html.ini
new file mode 100644
index 00000000000..f0162971327
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-stepup.html.ini
@@ -0,0 +1,5 @@
+[input-stepup.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-validationmessage.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-validationmessage.html.ini
new file mode 100644
index 00000000000..d3c0edf19c6
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-validationmessage.html.ini
@@ -0,0 +1,5 @@
+[input-validationmessage.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-validity.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-validity.html.ini
new file mode 100644
index 00000000000..13197e24a67
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-validity.html.ini
@@ -0,0 +1,5 @@
+[input-validity.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html.ini
new file mode 100644
index 00000000000..5dcb0e1e44e
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html.ini
@@ -0,0 +1,5 @@
+[input-valueasdate-invalidstateerr.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html.ini
new file mode 100644
index 00000000000..bcaaafade5e
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html.ini
@@ -0,0 +1,3 @@
+[input-valueasnumber-invalidstateerr.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/forms/the-input-element/input-willvalidate.html.ini b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-willvalidate.html.ini
new file mode 100644
index 00000000000..b700919c03c
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-input-element/input-willvalidate.html.ini
@@ -0,0 +1,5 @@
+[input-willvalidate.html]
+ type: testharness
+ [Forms]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.html.ini b/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.html.ini
index 9caf6fc4cf7..56a5d5286d1 100644
--- a/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/the-label-element/label-attributes.html.ini
@@ -3,3 +3,30 @@
[A non-control follows by a control with same ID.]
expected: FAIL
+ [The labeled control for a label element that has no 'for' attribute is the first labelable element which is a descendant of that label element.]
+ expected: FAIL
+
+ [A labelable element is moved to outside of nested associated labels.]
+ expected: FAIL
+
+ [A labelable element is moved to inside of nested associated labels.]
+ expected: FAIL
+
+ [A labelable element which is a descendant of non-labelable element is moved to outside of associated label.]
+ expected: FAIL
+
+ [A labelable element is moved to iframe.]
+ expected: FAIL
+
+ [A div element which contains labelable element is removed.]
+ expected: FAIL
+
+ [A labelable element not in a document can label element in the same tree.]
+ expected: FAIL
+
+ [A labelable element inside the shadow DOM.]
+ expected: FAIL
+
+ [A form control has an implicit label.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-progress-element/progress.window.js.ini b/tests/wpt/metadata/html/semantics/forms/the-progress-element/progress.window.js.ini
new file mode 100644
index 00000000000..63a0690d30f
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-progress-element/progress.window.js.ini
@@ -0,0 +1,8 @@
+[progress.window.html]
+ type: testharness
+ [If value > max, then current value = max]
+ expected: FAIL
+
+ [If value < max, then current value = value]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml.ini b/tests/wpt/metadata/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml.ini
new file mode 100644
index 00000000000..f384e3e7936
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml.ini
@@ -0,0 +1,5 @@
+[value-defaultValue-textContent-xhtml.xhtml]
+ type: testharness
+ [defaultValue and value include CDATASection Text nodes]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html.ini b/tests/wpt/metadata/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html.ini
index f91c8f0c17e..9377d122a79 100644
--- a/tests/wpt/metadata/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html.ini
+++ b/tests/wpt/metadata/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html.ini
@@ -6,3 +6,12 @@
[tests for the value setter]
expected: FAIL
+ [defaultValue and value are affected by textContent in combination with appending a DocumentFragment]
+ expected: FAIL
+
+ [defaultValue and value reflect child text content, not textContent]
+ expected: FAIL
+
+ [value normalizes CRLF even spread over multiple text nodes]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html.ini
new file mode 100644
index 00000000000..cdd2eaef1a2
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html.ini
@@ -0,0 +1,6 @@
+[dialog-autofocus-multiple-times.html]
+ type: testharness
+ expected: TIMEOUT
+ [autofocus is run every time a dialog is opened]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html.ini
new file mode 100644
index 00000000000..5db995348a2
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html.ini
@@ -0,0 +1,6 @@
+[dialog-autofocus.html]
+ type: testharness
+ expected: TIMEOUT
+ [autofocus when a modal dialog is opened]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html.ini b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html.ini
index bf65460360f..bf3f3c12b32 100644
--- a/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html.ini
+++ b/tests/wpt/metadata/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html.ini
@@ -21,3 +21,9 @@
[opening dialog with multiple focusable children, one having the autofocus attribute]
expected: FAIL
+ [showModal() on a <dialog> after initial showModal() and removing the open attribute]
+ expected: FAIL
+
+ [when opening multiple dialogs, the most recently opened is rendered on top]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/interfaces.html.ini b/tests/wpt/metadata/html/semantics/interfaces.html.ini
index 2ebff96f036..1993c6141ed 100644
--- a/tests/wpt/metadata/html/semantics/interfaces.html.ini
+++ b/tests/wpt/metadata/html/semantics/interfaces.html.ini
@@ -72,3 +72,9 @@
[Interfaces for TH]
expected: FAIL
+ [Interfaces for applet]
+ expected: FAIL
+
+ [Interfaces for APPLET]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini b/tests/wpt/metadata/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini
new file mode 100644
index 00000000000..7d7eac7f422
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/links/following-hyperlinks/activation-behavior.window.js.ini
@@ -0,0 +1,3 @@
+[activation-behavior.window.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/035.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/035.html.ini
index 1f668433485..1f668433485 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/035.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/035.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/040.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/040.html.ini
index 01208d5bb42..01208d5bb42 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/040.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/040.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/042.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/042.html.ini
index 9a2d58fe39b..9a2d58fe39b 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/042.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/042.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/043.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/043.html.ini
index be2fbd3b460..be2fbd3b460 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/043.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/043.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/044.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/044.html.ini
index 1e6f0d681d1..1e6f0d681d1 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/044.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/044.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/045.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/045.html.ini
index 60286828854..60286828854 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/045.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/045.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/054.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/054.html.ini
index 3e7b70542bf..3e7b70542bf 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/054.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/054.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/055.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/055.html.ini
index 9600b104f9d..9600b104f9d 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/055.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/055.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/077.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/077.html.ini
index b0dc9cdab83..b0dc9cdab83 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/077.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/077.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/079.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/079.html.ini
index 27a1d473162..27a1d473162 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/079.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/079.html.ini
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/080.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/080.html.ini
new file mode 100644
index 00000000000..a6b47a6c767
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/080.html.ini
@@ -0,0 +1,5 @@
+[080.html]
+ type: testharness
+ [scheduler: IFRAMEs added with DOM (appendChild), javascript: URL]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/083.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/083.html.ini
index 9272fa0716d..9272fa0716d 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/083.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/083.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/084.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/084.html.ini
index 6268eb738fb..6268eb738fb 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/084.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/084.html.ini
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/099.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/099.html.ini
new file mode 100644
index 00000000000..6015d05e4b6
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/099.html.ini
@@ -0,0 +1,5 @@
+[099.html]
+ type: testharness
+ [ scheduler: defer adding iframe containing script]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/108.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/108.html.ini
index 590c920a3d8..590c920a3d8 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/108.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/108.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/109.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/109.html.ini
index 1292ebc1fc4..1292ebc1fc4 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/109.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/109.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/116.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/116.html.ini
index 1a984804ce6..1a984804ce6 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/116.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/116.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/131.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/131.html.ini
index 91f628fdb7b..91f628fdb7b 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/131.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/131.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/132.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/132.html.ini
index e5c91b0e530..e5c91b0e530 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/132.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/132.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/133.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/133.html.ini
index 91c80df2d42..91c80df2d42 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/133.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/133.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/134.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/134.html.ini
index a01a182559d..a01a182559d 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/134.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/134.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/135.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/135.html.ini
index 377501f7778..377501f7778 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/135.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/135.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/136.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/136.html.ini
index 1b004e27442..1b004e27442 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/136.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/136.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/138.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/138.html.ini
index 9ed9fac3f38..9ed9fac3f38 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/138.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/138.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/139.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/139.html.ini
index e25521e5d78..e25521e5d78 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/139.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/139.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/140.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/140.html.ini
index 0adde53fa01..0adde53fa01 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/140.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/140.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/141.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/141.html.ini
index 3a624abf612..3a624abf612 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/141.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/141.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/142.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/142.html.ini
index ccbb572791f..ccbb572791f 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/142.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/142.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/143.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/143.html.ini
index 7d5beedc6c0..7d5beedc6c0 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/143.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/143.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/144.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/144.html.ini
index 3ecec584b46..3ecec584b46 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/144.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/144.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/145.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/145.html.ini
index b4836dc60d5..b4836dc60d5 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/145.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/145.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/146.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/146.html.ini
index c5cde10199c..c5cde10199c 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/146.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/146.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/147.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/147.html.ini
index a25122a5700..a25122a5700 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/147.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/147.html.ini
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/148.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/148.html.ini
index ba194bd5e8a..ba194bd5e8a 100644
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/148.html.ini
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/execution-timing/148.html.ini
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini
new file mode 100644
index 00000000000..d958b30d7f4
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-01.html.ini
@@ -0,0 +1,3 @@
+[charset-01.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini
new file mode 100644
index 00000000000..a919b698590
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-02.html.ini
@@ -0,0 +1,3 @@
+[charset-02.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini
new file mode 100644
index 00000000000..16b43178406
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/charset-03.html.ini
@@ -0,0 +1,3 @@
+[charset-03.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini
new file mode 100644
index 00000000000..2e41efe9ac7
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/credentials.sub.html.ini
@@ -0,0 +1,5 @@
+[credentials.sub.html]
+ type: testharness
+ [Modules should be loaded with or without the credentials based on the same-origin-ness and the crossOrigin attribute]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini
new file mode 100644
index 00000000000..4a87a4b2bba
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html.ini
@@ -0,0 +1,5 @@
+[custom-element-exception.html]
+ type: testharness
+ [Test that exceptions from the constructor of a custom element inside a module are propagated as expected.\n]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html.ini
new file mode 100644
index 00000000000..e7cc3d494f1
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html.ini
@@ -0,0 +1,3 @@
+[dynamic-imports-error.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html.ini
new file mode 100644
index 00000000000..3b16d646749
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html.ini
@@ -0,0 +1,3 @@
+[dynamic-imports.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html.ini
new file mode 100644
index 00000000000..e9888844a48
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html.ini
@@ -0,0 +1,6 @@
+[inline-event-handler.html]
+ type: testharness
+ expected: TIMEOUT
+ [dynamic import should work when triggered from inline event handlers]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini
new file mode 100644
index 00000000000..8e5a893687f
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html.ini
@@ -0,0 +1,5 @@
+[propagate-nonce-external-classic.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini
new file mode 100644
index 00000000000..c92b9617ae2
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html.ini
@@ -0,0 +1,3 @@
+[propagate-nonce-external-module.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini
new file mode 100644
index 00000000000..d3648a27d9a
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html.ini
@@ -0,0 +1,5 @@
+[propagate-nonce-inline-classic.html]
+ type: testharness
+ [Untitled]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini
new file mode 100644
index 00000000000..de1c058cbe0
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html.ini
@@ -0,0 +1,3 @@
+[propagate-nonce-inline-module.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html.ini
new file mode 100644
index 00000000000..01ce266ac9e
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html.ini
@@ -0,0 +1,5 @@
+[string-compilation-base-url-classic.html]
+ type: testharness
+ [import() inside compiled strings uses the document base URL inside a classic script]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html.ini
new file mode 100644
index 00000000000..d5cadc8673b
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html.ini
@@ -0,0 +1,3 @@
+[string-compilation-base-url-module.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html.ini
new file mode 100644
index 00000000000..1c8d631e3d7
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html.ini
@@ -0,0 +1,5 @@
+[string-compilation-classic.html]
+ type: testharness
+ [import() inside compiled strings inside a classic script]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html.ini
new file mode 100644
index 00000000000..8752aaa7d35
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html.ini
@@ -0,0 +1,3 @@
+[string-compilation-module.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini
new file mode 100644
index 00000000000..3e63cc081c9
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html.ini
@@ -0,0 +1,5 @@
+[instantiation-error-4.html]
+ type: testharness
+ [Test that loading a graph in which a module is already errored results in that module's error.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini
new file mode 100644
index 00000000000..d9bb17db2ce
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html.ini
@@ -0,0 +1,5 @@
+[instantiation-error-5.html]
+ type: testharness
+ [Test that loading a graph in which a module is already errored results in that module's error.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini
new file mode 100644
index 00000000000..c1729535a19
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html.ini
@@ -0,0 +1,5 @@
+[instantiation-error-6.html]
+ type: testharness
+ [Test that ambiguous star exports lead to an instantiation error and that the correct module is blamed.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini
new file mode 100644
index 00000000000..152942c5092
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html.ini
@@ -0,0 +1,5 @@
+[instantiation-error-7.html]
+ type: testharness
+ [Test that ambiguous star exports lead to an instantiation error, even when discovered through a star export, and that the correct module is blamed.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini
new file mode 100644
index 00000000000..693c8174ed9
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html.ini
@@ -0,0 +1,6 @@
+[instantiation-error-8.html]
+ type: testharness
+ expected: TIMEOUT
+ [Instantiate attempt on a tree w/ previously instantiate-failed tree as a sub-tree shouldn't crash.]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini
new file mode 100644
index 00000000000..5bcd6c0a462
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/integrity.html.ini
@@ -0,0 +1,3 @@
+[integrity.html]
+ type: testharness
+ expected: TIMEOUT
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini
new file mode 100644
index 00000000000..e911f6b7fb9
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html.ini
@@ -0,0 +1,27 @@
+[load-error-events-inline.html]
+ type: testharness
+ expected: TIMEOUT
+ [src, 200, parser-inserted, defer, no async]
+ expected: NOTRUN
+
+ [src, 200, parser-inserted, no defer, async]
+ expected: NOTRUN
+
+ [src, 200, not parser-inserted, no defer, no async, no non-blocking]
+ expected: NOTRUN
+
+ [src, 200, not parser-inserted, no defer, async]
+ expected: NOTRUN
+
+ [src, 404, parser-inserted, defer, no async]
+ expected: NOTRUN
+
+ [src, 404, parser-inserted, no defer, async]
+ expected: NOTRUN
+
+ [src, 404, not parser-inserted, no defer, no async, no non-blocking]
+ expected: NOTRUN
+
+ [src, 404, not parser-inserted, no defer, async]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini
new file mode 100644
index 00000000000..b0a60904841
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/load-error-events.html.ini
@@ -0,0 +1,27 @@
+[load-error-events.html]
+ type: testharness
+ expected: TIMEOUT
+ [src, 200, parser-inserted, defer, no async]
+ expected: NOTRUN
+
+ [src, 200, parser-inserted, no defer, async]
+ expected: NOTRUN
+
+ [src, 200, not parser-inserted, no defer, no async, no non-blocking]
+ expected: NOTRUN
+
+ [src, 200, not parser-inserted, no defer, async]
+ expected: NOTRUN
+
+ [src, 404, parser-inserted, defer, no async]
+ expected: NOTRUN
+
+ [src, 404, parser-inserted, no defer, async]
+ expected: NOTRUN
+
+ [src, 404, not parser-inserted, no defer, no async, no non-blocking]
+ expected: NOTRUN
+
+ [src, 404, not parser-inserted, no defer, async]
+ expected: NOTRUN
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini
new file mode 100644
index 00000000000..ad0ec28d799
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml.ini
@@ -0,0 +1,5 @@
+[module-in-xhtml.xhtml]
+ type: testharness
+ [module script in XHTML documents should be evaluated.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html.ini b/tests/wpt/metadata/html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html.ini
new file mode 100644
index 00000000000..4f86aedfbbb
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html.ini
@@ -0,0 +1,8 @@
+[template-content-hierarcy.html]
+ type: testharness
+ [Template content should throw when its ancestor is being appended.]
+ expected: FAIL
+
+ [Template content should throw exception when its ancestor in a different document but connected via host is being append.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/checked-type-change.html.ini b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/checked-type-change.html.ini
new file mode 100644
index 00000000000..ec26c51f47f
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/checked-type-change.html.ini
@@ -0,0 +1,5 @@
+[checked-type-change.html]
+ type: testharness
+ [Evaluation of :checked changes on input type change.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/indeterminate-type-change.html.ini b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/indeterminate-type-change.html.ini
new file mode 100644
index 00000000000..54e02798506
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/indeterminate-type-change.html.ini
@@ -0,0 +1,5 @@
+[indeterminate-type-change.html]
+ type: testharness
+ [Evaluation of :indeterminate changes on input type change.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html.ini b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html.ini
new file mode 100644
index 00000000000..371a99b7ea8
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html.ini
@@ -0,0 +1,8 @@
+[inrange-outofrange-type-change.html]
+ type: testharness
+ [Evaluation of :in-range changes for input type change.]
+ expected: FAIL
+
+ [Evaluation of :out-of-range changes for input type change.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html.ini b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html.ini
new file mode 100644
index 00000000000..667f1f58139
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html.ini
@@ -0,0 +1,5 @@
+[placeholder-shown-type-change.html]
+ type: testharness
+ [Evaluation of :placeholder-shown changes for input type change.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html.ini b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html.ini
new file mode 100644
index 00000000000..fe4bd42e6c0
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html.ini
@@ -0,0 +1,5 @@
+[readwrite-readonly-type-change.html]
+ type: testharness
+ [Evaluation of :required and :optional changes for input type change.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/required-optional-hidden.html.ini b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/required-optional-hidden.html.ini
new file mode 100644
index 00000000000..f34f11249ca
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/selectors/pseudo-classes/required-optional-hidden.html.ini
@@ -0,0 +1,5 @@
+[required-optional-hidden.html]
+ type: testharness
+ [Evaluation of :required and :optional changes for input type change.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html.ini b/tests/wpt/metadata/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html.ini
new file mode 100644
index 00000000000..f69644f7477
--- /dev/null
+++ b/tests/wpt/metadata/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html.ini
@@ -0,0 +1,3 @@
+[a-download-click-404.html]
+ type: testharness
+ expected: ERROR
diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/basic.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/basic.html.ini
deleted file mode 100644
index 3dc6bf39d61..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/basic.html.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-[basic.html]
- type: testharness
- [window.requestIdleCallback is defined]
- expected: FAIL
-
- [window.cancelIdleCallback is defined]
- expected: FAIL
-
- [window.requestIdleCallback() returns a number]
- expected: FAIL
-
- [window.cancelIdleCallback() returns undefined]
- expected: FAIL
-
- [requestIdleCallback schedules callbacks]
- expected: FAIL
-
- [cancelIdleCallback cancels callbacks]
- 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
deleted file mode 100644
index 16eab64d467..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-exception.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[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-idle-periods.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-idle-periods.html.ini
deleted file mode 100644
index ac23a24ab20..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-idle-periods.html.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[callback-idle-periods.html]
- type: testharness
- expected: ERROR
- [requestIdleCallback can run multiple different requestIdleCallback callbacks in the same idle period.]
- expected: FAIL
-
- [Check that if an idle callback calls requestIdleCallback the new callback doesn't run in the current idle period.]
- expected: TIMEOUT
-
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
deleted file mode 100644
index a03d6526f51..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-iframe.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[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
deleted file mode 100644
index 1845bd519ec..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-invoked.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[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
deleted file mode 100644
index c3b83c83b4d..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-multiple-calls.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[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-removed-frame.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-removed-frame.html.ini
deleted file mode 100644
index fdede33f8a0..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-removed-frame.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[callback-removed-frame.html]
- type: testharness
- [calling requestIdleCallback on a contentWindow from a removed iframe should not trigger the callback]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-suspended.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-suspended.html.ini
deleted file mode 100644
index 8388db3bcab..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-suspended.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[callback-suspended.html]
- type: testharness
- [Dispatching idle callbacks should be able to be suspended and then resumed]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout-with-raf.html.ini b/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout-with-raf.html.ini
deleted file mode 100644
index d5f94e35b64..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout-with-raf.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[callback-timeout-with-raf.html]
- type: testharness
- [requestIdleCallback not scheduled when event loop is busy.]
- expected: FAIL
-
- [requestIdleCallback scheduled with timeout when event loop is busy.]
- 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
deleted file mode 100644
index e445252fcc5..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/callback-timeout.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[callback-timeout.html]
- type: testharness
- [requestIdleCallback callback should time out]
- expected: FAIL
-
- [requestIdleCallback callback should not 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
deleted file mode 100644
index 5520840073d..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/cancel-invoked.html.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-[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
-
- [Cancelling the currently executing idle callback should be allowed]
- 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
deleted file mode 100644
index 7abbe7ccb3f..00000000000
--- a/tests/wpt/metadata/html/webappapis/idle-callbacks/idlharness.html.ini
+++ /dev/null
@@ -1,20 +0,0 @@
-[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/mozilla-sync b/tests/wpt/metadata/mozilla-sync
index 8b81e6646c6..7d52e70ccad 100644
--- a/tests/wpt/metadata/mozilla-sync
+++ b/tests/wpt/metadata/mozilla-sync
@@ -1,2 +1,2 @@
-local: 4ecddb0622dcb6fdb7a7bd5025dd12be293b30e1
-upstream: a46616a5b18e83587ddbbed756c7b96cbb4b015d
+local: 462c2723806b91e4a0a888d2521a5ce778433949
+upstream: ecf0f624705ba2f9a6046bf33bb67e4898849f65
diff --git a/tests/wpt/metadata/navigation-timing/idlharness.html.ini b/tests/wpt/metadata/navigation-timing/idlharness.html.ini
index b7742007a20..3abacf64d64 100644
--- a/tests/wpt/metadata/navigation-timing/idlharness.html.ini
+++ b/tests/wpt/metadata/navigation-timing/idlharness.html.ini
@@ -177,3 +177,168 @@
[EventTarget interface: calling dispatchEvent(Event) on window.performance with too few arguments must throw TypeError]
expected: FAIL
+ [PerformanceNavigationTiming interface: existence and properties of interface object]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface object length]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface object name]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute unloadEventStart]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute unloadEventEnd]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute domInteractive]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute domContentLoadedEventStart]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute domContentLoadedEventEnd]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute domComplete]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute loadEventStart]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute loadEventEnd]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: attribute redirectCount]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: operation toJSON()]
+ expected: FAIL
+
+ [PerformanceNavigationTiming must be primary interface of window.performance.getEntriesByType('navigation')[0\]]
+ expected: FAIL
+
+ [Stringification of window.performance.getEntriesByType('navigation')[0\]]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "unloadEventStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "unloadEventEnd" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "domInteractive" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "domContentLoadedEventStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "domContentLoadedEventEnd" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "domComplete" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "loadEventStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "loadEventEnd" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "redirectCount" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigationTiming interface: window.performance.getEntriesByType('navigation')[0\] must inherit property "toJSON()" with the proper type]
+ expected: FAIL
+
+ [Test default toJSON operation of PerformanceNavigationTiming]
+ expected: FAIL
+
+ [PerformanceTiming interface: operation toJSON()]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "unloadEventStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "unloadEventEnd" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "redirectStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "redirectEnd" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "fetchStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "domainLookupStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "domainLookupEnd" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "connectStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "connectEnd" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "secureConnectionStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "requestStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "responseStart" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "responseEnd" with the proper type]
+ expected: FAIL
+
+ [PerformanceTiming interface: window.performance.timing must inherit property "toJSON()" with the proper type]
+ expected: FAIL
+
+ [Test default toJSON operation of PerformanceTiming]
+ expected: FAIL
+
+ [PerformanceNavigation interface: operation toJSON()]
+ expected: FAIL
+
+ [PerformanceNavigation interface: window.performance.navigation must inherit property "TYPE_NAVIGATE" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigation interface: window.performance.navigation must inherit property "TYPE_RELOAD" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigation interface: window.performance.navigation must inherit property "TYPE_BACK_FORWARD" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigation interface: window.performance.navigation must inherit property "TYPE_RESERVED" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigation interface: window.performance.navigation must inherit property "type" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigation interface: window.performance.navigation must inherit property "redirectCount" with the proper type]
+ expected: FAIL
+
+ [PerformanceNavigation interface: window.performance.navigation must inherit property "toJSON()" with the proper type]
+ expected: FAIL
+
+ [Test default toJSON operation of PerformanceNavigation]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/navigation-timing/nav2_idlharness.html.ini b/tests/wpt/metadata/navigation-timing/nav2_idlharness.html.ini
index 5654187aafc..26cb01e49bd 100644
--- a/tests/wpt/metadata/navigation-timing/nav2_idlharness.html.ini
+++ b/tests/wpt/metadata/navigation-timing/nav2_idlharness.html.ini
@@ -45,3 +45,6 @@
[PerformanceNavigationTiming interface: attribute redirectCount]
expected: FAIL
+ [PerformanceNavigationTiming interface: operation toJSON()]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/030.html.ini b/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/030.html.ini
deleted file mode 100644
index 3024520ff0f..00000000000
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/030.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[030.html]
- type: testharness
- disabled: flaky
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/080.html.ini b/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/080.html.ini
deleted file mode 100644
index eec03d6e781..00000000000
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/080.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[080.html]
- type: testharness
- disabled: flaky
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/099.html.ini b/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/099.html.ini
deleted file mode 100644
index f6dd8734342..00000000000
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/099.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[099.html]
- type: testharness
- disabled: flaky
diff --git a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/100.html.ini b/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/100.html.ini
deleted file mode 100644
index d0b686d15b6..00000000000
--- a/tests/wpt/metadata/old-tests/submission/Opera/script_scheduling/100.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[100.html]
- type: testharness
- [ scheduler: defer adding iframe containing script]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/performance-timeline/idlharness.html.ini b/tests/wpt/metadata/performance-timeline/idlharness.html.ini
new file mode 100644
index 00000000000..66e1aae7c8e
--- /dev/null
+++ b/tests/wpt/metadata/performance-timeline/idlharness.html.ini
@@ -0,0 +1,11 @@
+[idlharness.html]
+ type: testharness
+ [PerformanceEntry interface: [object PerformanceMark\] must inherit property "toJSON()" with the proper type]
+ expected: FAIL
+
+ [Test default toJSON operation of PerformanceEntry]
+ expected: FAIL
+
+ [PerformanceEntry interface: operation toJSON()]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/performance-timeline/po-callback-mutate.any.js.ini b/tests/wpt/metadata/performance-timeline/po-callback-mutate.any.js.ini
new file mode 100644
index 00000000000..4d80c38a5cb
--- /dev/null
+++ b/tests/wpt/metadata/performance-timeline/po-callback-mutate.any.js.ini
@@ -0,0 +1,11 @@
+[po-callback-mutate.any.worker.html]
+ type: testharness
+ [PerformanceObserver modifications inside callback should update filtering and not clear buffer]
+ expected: FAIL
+
+
+[po-callback-mutate.any.html]
+ type: testharness
+ [PerformanceObserver modifications inside callback should update filtering and not clear buffer]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/performance-timeline/po-disconnect.any.js.ini b/tests/wpt/metadata/performance-timeline/po-disconnect.any.js.ini
new file mode 100644
index 00000000000..c8809176a86
--- /dev/null
+++ b/tests/wpt/metadata/performance-timeline/po-disconnect.any.js.ini
@@ -0,0 +1,11 @@
+[po-disconnect.any.html]
+ type: testharness
+ [An observer disconnected after a mark must not have its callback invoked]
+ expected: FAIL
+
+
+[po-disconnect.any.worker.html]
+ type: testharness
+ [An observer disconnected after a mark must not have its callback invoked]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/performance-timeline/po-observe.any.js.ini b/tests/wpt/metadata/performance-timeline/po-observe.any.js.ini
new file mode 100644
index 00000000000..c5a0ff722eb
--- /dev/null
+++ b/tests/wpt/metadata/performance-timeline/po-observe.any.js.ini
@@ -0,0 +1,23 @@
+[po-observe.any.worker.html]
+ type: testharness
+ [Empty sequence entryTypes is a no-op]
+ expected: FAIL
+
+ [Unknown entryTypes are no-op]
+ expected: FAIL
+
+ [Check observer callback parameter and this values]
+ expected: FAIL
+
+
+[po-observe.any.html]
+ type: testharness
+ [Empty sequence entryTypes is a no-op]
+ expected: FAIL
+
+ [Unknown entryTypes are no-op]
+ expected: FAIL
+
+ [Check observer callback parameter and this values]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/referrer-policy/generic/link-rel-prefetch.html.ini b/tests/wpt/metadata/referrer-policy/generic/link-rel-prefetch.html.ini
new file mode 100644
index 00000000000..ec3f6a1d8d7
--- /dev/null
+++ b/tests/wpt/metadata/referrer-policy/generic/link-rel-prefetch.html.ini
@@ -0,0 +1,5 @@
+[link-rel-prefetch.html]
+ type: testharness
+ [Prefetched image.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/subresource-integrity/subresource-css-ed25519.tentative.html.ini b/tests/wpt/metadata/subresource-integrity/subresource-css-ed25519.tentative.html.ini
new file mode 100644
index 00000000000..accc807f3e3
--- /dev/null
+++ b/tests/wpt/metadata/subresource-integrity/subresource-css-ed25519.tentative.html.ini
@@ -0,0 +1,14 @@
+[subresource-css-ed25519.tentative.html]
+ type: testharness
+ [Style: Fails, because the key is malformed.]
+ expected: FAIL
+
+ [Style: Fails because of wrong key.]
+ expected: FAIL
+
+ [Style: Fails, because of missing key.]
+ expected: FAIL
+
+ [Style: Fails, because of wrong key.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/subresource-integrity/subresource-ed25519-with-csp.tentative.html.ini b/tests/wpt/metadata/subresource-integrity/subresource-ed25519-with-csp.tentative.html.ini
new file mode 100644
index 00000000000..fef32b3eae1
--- /dev/null
+++ b/tests/wpt/metadata/subresource-integrity/subresource-ed25519-with-csp.tentative.html.ini
@@ -0,0 +1,5 @@
+[subresource-ed25519-with-csp.tentative.html]
+ type: testharness
+ [Subresource Integrity with Ed25519 plus Content Security Policy]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/subresource-integrity/subresource-ed25519.tentative.html.ini b/tests/wpt/metadata/subresource-integrity/subresource-ed25519.tentative.html.ini
new file mode 100644
index 00000000000..18761d9a750
--- /dev/null
+++ b/tests/wpt/metadata/subresource-integrity/subresource-ed25519.tentative.html.ini
@@ -0,0 +1,14 @@
+[subresource-ed25519.tentative.html]
+ type: testharness
+ [Script: Ed255519 signature, fails because key is malformed.]
+ expected: FAIL
+
+ [Script: Ed255519 signature, fails because wrong key.]
+ expected: FAIL
+
+ [Script: Ed255519 signature, fails because no signature in response header.]
+ expected: FAIL
+
+ [Script: Ed255519 signature, fails because incorrect signature in response.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/uievents/interfaces.html.ini b/tests/wpt/metadata/uievents/interfaces.html.ini
new file mode 100644
index 00000000000..3e131426f15
--- /dev/null
+++ b/tests/wpt/metadata/uievents/interfaces.html.ini
@@ -0,0 +1,188 @@
+[interfaces.html]
+ type: testharness
+ [UIEvent interface: attribute which]
+ expected: FAIL
+
+ [UIEvent interface: new UIEvent("event") must inherit property "which" with the proper type]
+ expected: FAIL
+
+ [UIEvent interface: new FocusEvent("event") must inherit property "which" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: attribute buttons]
+ expected: FAIL
+
+ [MouseEvent interface: operation getModifierState(DOMString)]
+ expected: FAIL
+
+ [MouseEvent interface: new MouseEvent("event") must inherit property "buttons" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new MouseEvent("event") must inherit property "getModifierState(DOMString)" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: calling getModifierState(DOMString) on new MouseEvent("event") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [UIEvent interface: new MouseEvent("event") must inherit property "which" with the proper type]
+ expected: FAIL
+
+ [WheelEvent interface: existence and properties of interface object]
+ expected: FAIL
+
+ [WheelEvent interface object length]
+ expected: FAIL
+
+ [WheelEvent interface object name]
+ expected: FAIL
+
+ [WheelEvent interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [WheelEvent interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [WheelEvent interface: constant DOM_DELTA_PIXEL on interface object]
+ expected: FAIL
+
+ [WheelEvent interface: constant DOM_DELTA_PIXEL on interface prototype object]
+ expected: FAIL
+
+ [WheelEvent interface: constant DOM_DELTA_LINE on interface object]
+ expected: FAIL
+
+ [WheelEvent interface: constant DOM_DELTA_LINE on interface prototype object]
+ expected: FAIL
+
+ [WheelEvent interface: constant DOM_DELTA_PAGE on interface object]
+ expected: FAIL
+
+ [WheelEvent interface: constant DOM_DELTA_PAGE on interface prototype object]
+ expected: FAIL
+
+ [WheelEvent interface: attribute deltaX]
+ expected: FAIL
+
+ [WheelEvent interface: attribute deltaY]
+ expected: FAIL
+
+ [WheelEvent interface: attribute deltaZ]
+ expected: FAIL
+
+ [WheelEvent interface: attribute deltaMode]
+ expected: FAIL
+
+ [WheelEvent must be primary interface of new WheelEvent("event")]
+ expected: FAIL
+
+ [Stringification of new WheelEvent("event")]
+ expected: FAIL
+
+ [WheelEvent interface: new WheelEvent("event") must inherit property "DOM_DELTA_PIXEL" with the proper type]
+ expected: FAIL
+
+ [WheelEvent interface: new WheelEvent("event") must inherit property "DOM_DELTA_LINE" with the proper type]
+ expected: FAIL
+
+ [WheelEvent interface: new WheelEvent("event") must inherit property "DOM_DELTA_PAGE" with the proper type]
+ expected: FAIL
+
+ [WheelEvent interface: new WheelEvent("event") must inherit property "deltaX" with the proper type]
+ expected: FAIL
+
+ [WheelEvent interface: new WheelEvent("event") must inherit property "deltaY" with the proper type]
+ expected: FAIL
+
+ [WheelEvent interface: new WheelEvent("event") must inherit property "deltaZ" with the proper type]
+ expected: FAIL
+
+ [WheelEvent interface: new WheelEvent("event") must inherit property "deltaMode" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "screenX" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "screenY" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "clientX" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "clientY" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "ctrlKey" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "shiftKey" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "altKey" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "metaKey" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "button" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "buttons" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "relatedTarget" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: new WheelEvent("event") must inherit property "getModifierState(DOMString)" with the proper type]
+ expected: FAIL
+
+ [MouseEvent interface: calling getModifierState(DOMString) on new WheelEvent("event") with too few arguments must throw TypeError]
+ expected: FAIL
+
+ [UIEvent interface: new WheelEvent("event") must inherit property "view" with the proper type]
+ expected: FAIL
+
+ [UIEvent interface: new WheelEvent("event") must inherit property "detail" with the proper type]
+ expected: FAIL
+
+ [UIEvent interface: new WheelEvent("event") must inherit property "which" with the proper type]
+ expected: FAIL
+
+ [UIEvent interface: new InputEvent("event") must inherit property "which" with the proper type]
+ expected: FAIL
+
+ [CompositionEvent interface: existence and properties of interface object]
+ expected: FAIL
+
+ [CompositionEvent interface object length]
+ expected: FAIL
+
+ [CompositionEvent interface object name]
+ expected: FAIL
+
+ [CompositionEvent interface: existence and properties of interface prototype object]
+ expected: FAIL
+
+ [CompositionEvent interface: existence and properties of interface prototype object's "constructor" property]
+ expected: FAIL
+
+ [CompositionEvent interface: attribute data]
+ expected: FAIL
+
+ [CompositionEvent must be primary interface of new CompositionEvent("event")]
+ expected: FAIL
+
+ [Stringification of new CompositionEvent("event")]
+ expected: FAIL
+
+ [CompositionEvent interface: new CompositionEvent("event") must inherit property "data" with the proper type]
+ expected: FAIL
+
+ [UIEvent interface: new CompositionEvent("event") must inherit property "view" with the proper type]
+ expected: FAIL
+
+ [UIEvent interface: new CompositionEvent("event") must inherit property "detail" with the proper type]
+ expected: FAIL
+
+ [UIEvent interface: new CompositionEvent("event") must inherit property "which" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/uievents/legacy/Event-subclasses-init.html.ini b/tests/wpt/metadata/uievents/legacy/Event-subclasses-init.html.ini
new file mode 100644
index 00000000000..70ee70eb4a7
--- /dev/null
+++ b/tests/wpt/metadata/uievents/legacy/Event-subclasses-init.html.ini
@@ -0,0 +1,5 @@
+[Event-subclasses-init.html]
+ type: testharness
+ [Call initCompositionEvent without parameters]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini b/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini
index 581dc831e38..eba0144be8a 100644
--- a/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini
+++ b/tests/wpt/metadata/url/a-element-xhtml.xhtml.ini
@@ -186,3 +186,21 @@
[Parsing: <C|> against <file://host/dir/file>]
expected: FAIL
+ [Parsing: </c:/foo/bar> against <file:///c:/baz/qux>]
+ expected: FAIL
+
+ [Parsing: </c|/foo/bar> against <file:///c:/baz/qux>]
+ expected: FAIL
+
+ [Parsing: <file:\\c:\\foo\\bar> against <file:///c:/baz/qux>]
+ expected: FAIL
+
+ [Parsing: <test-a.html> against <a>]
+ expected: FAIL
+
+ [Parsing: <test-a-slash.html> against <a/>]
+ expected: FAIL
+
+ [Parsing: <test-a-slash-slash.html> against <a//>]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/a-element.html.ini b/tests/wpt/metadata/url/a-element.html.ini
index 91dc03be939..e6457fb970f 100644
--- a/tests/wpt/metadata/url/a-element.html.ini
+++ b/tests/wpt/metadata/url/a-element.html.ini
@@ -186,3 +186,21 @@
[Parsing: <C|> against <file://host/dir/file>]
expected: FAIL
+ [Parsing: </c:/foo/bar> against <file:///c:/baz/qux>]
+ expected: FAIL
+
+ [Parsing: </c|/foo/bar> against <file:///c:/baz/qux>]
+ expected: FAIL
+
+ [Parsing: <file:\\c:\\foo\\bar> against <file:///c:/baz/qux>]
+ expected: FAIL
+
+ [Parsing: <test-a.html> against <a>]
+ expected: FAIL
+
+ [Parsing: <test-a-slash.html> against <a/>]
+ expected: FAIL
+
+ [Parsing: <test-a-slash-slash.html> against <a//>]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/interfaces.any.js.ini b/tests/wpt/metadata/url/interfaces.any.js.ini
index e96fdc895ab..0e63a5eb53a 100644
--- a/tests/wpt/metadata/url/interfaces.any.js.ini
+++ b/tests/wpt/metadata/url/interfaces.any.js.ini
@@ -18,6 +18,15 @@
[URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort" with the proper type (6)]
expected: FAIL
+ [URL interface: new URL("http://foo") must inherit property "toJSON()" with the proper type]
+ expected: FAIL
+
+ [Test toJSON operation of URL]
+ expected: FAIL
+
+ [URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort()" with the proper type]
+ expected: FAIL
+
[interfaces.any.worker.html]
type: testharness
@@ -36,3 +45,12 @@
[URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort" with the proper type (6)]
expected: FAIL
+ [URL interface: new URL("http://foo") must inherit property "toJSON()" with the proper type]
+ expected: FAIL
+
+ [Test toJSON operation of URL]
+ expected: FAIL
+
+ [URLSearchParams interface: new URLSearchParams("hi=there&thank=you") must inherit property "sort()" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/url-constructor.html.ini b/tests/wpt/metadata/url/url-constructor.html.ini
index 1d178cc3dd0..d3b940f3387 100644
--- a/tests/wpt/metadata/url/url-constructor.html.ini
+++ b/tests/wpt/metadata/url/url-constructor.html.ini
@@ -186,3 +186,12 @@
[Parsing: <C|> against <file://host/dir/file>]
expected: FAIL
+ [Parsing: </c:/foo/bar> against <file:///c:/baz/qux>]
+ expected: FAIL
+
+ [Parsing: </c|/foo/bar> against <file:///c:/baz/qux>]
+ expected: FAIL
+
+ [Parsing: <file:\\c:\\foo\\bar> against <file:///c:/baz/qux>]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/url-setters.html.ini b/tests/wpt/metadata/url/url-setters.html.ini
index d4a279df447..61a674954d6 100644
--- a/tests/wpt/metadata/url/url-setters.html.ini
+++ b/tests/wpt/metadata/url/url-setters.html.ini
@@ -975,3 +975,9 @@
[<area>: Setting <javascript:alert(1)>.hash = 'castle']
expected: FAIL
+ [URL: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.]
+ expected: FAIL
+
+ [<area>: Setting <http://foo.com:443/>.protocol = 'https' Port is set to null if it is the default for new scheme.]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/urlsearchparams-constructor.html.ini b/tests/wpt/metadata/url/urlsearchparams-constructor.html.ini
index d8822497d5f..aa0865c367b 100644
--- a/tests/wpt/metadata/url/urlsearchparams-constructor.html.ini
+++ b/tests/wpt/metadata/url/urlsearchparams-constructor.html.ini
@@ -24,3 +24,6 @@
[Construct with object with NULL, non-ASCII, and surrogate keys]
expected: FAIL
+ [URLSearchParams constructor, DOMException as argument]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/urlsearchparams-delete.html.ini b/tests/wpt/metadata/url/urlsearchparams-delete.html.ini
new file mode 100644
index 00000000000..652ca72c2a0
--- /dev/null
+++ b/tests/wpt/metadata/url/urlsearchparams-delete.html.ini
@@ -0,0 +1,8 @@
+[urlsearchparams-delete.html]
+ type: testharness
+ [Deleting all params removes ? from URL]
+ expected: FAIL
+
+ [Removing non-existent param removes ? from URL]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/url/urlsearchparams-sort.html.ini b/tests/wpt/metadata/url/urlsearchparams-sort.html.ini
index 83ff37af7e9..eb03d41a860 100644
--- a/tests/wpt/metadata/url/urlsearchparams-sort.html.ini
+++ b/tests/wpt/metadata/url/urlsearchparams-sort.html.ini
@@ -30,3 +30,6 @@
[URL parse and sort: z=z&a=a&z=y&a=b&z=x&a=c&z=w&a=d&z=v&a=e&z=u&a=f&z=t&a=g]
expected: FAIL
+ [Sorting non-existent params removes ? from URL]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/canvas/rapid-resizing.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/canvas/rapid-resizing.html.ini
deleted file mode 100644
index cadaf86fba1..00000000000
--- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/canvas/rapid-resizing.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[rapid-resizing.html]
- type: testharness
- expected: TIMEOUT
- [Overall test]
- expected: NOTRUN
-
diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-creation-and-destruction.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-creation-and-destruction.html.ini
deleted file mode 100644
index 99c77fb76d5..00000000000
--- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-creation-and-destruction.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[context-creation-and-destruction.html]
- type: testharness
- expected: TIMEOUT
- [Overall test]
- expected: NOTRUN
-
diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-creation.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-creation.html.ini
deleted file mode 100644
index 0dc670dc417..00000000000
--- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-creation.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[context-creation.html]
- type: testharness
- expected: TIMEOUT
- [Overall test]
- expected: NOTRUN
-
diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-release-upon-reload.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-release-upon-reload.html.ini
deleted file mode 100644
index 3f715cd8df3..00000000000
--- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-release-upon-reload.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[context-release-upon-reload.html]
- type: testharness
- expected: TIMEOUT
- [Overall test]
- expected: NOTRUN
-
diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-release-with-workers.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-release-with-workers.html.ini
deleted file mode 100644
index 09522bb510e..00000000000
--- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/context/context-release-with-workers.html.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[context-release-with-workers.html]
- type: testharness
- expected: TIMEOUT
- [Overall test]
- expected: NOTRUN
-
diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/glsl/misc/shader-with-non-reserved-words.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/glsl/misc/shader-with-non-reserved-words.html.ini
index d8d7a1897d8..c508ae3ae71 100644
--- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/glsl/misc/shader-with-non-reserved-words.html.ini
+++ b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/glsl/misc/shader-with-non-reserved-words.html.ini
@@ -1,6 +1,146 @@
[shader-with-non-reserved-words.html]
type: testharness
- expected: TIMEOUT
- [Overall test]
- expected: NOTRUN
+ [WebGL test #1696: shader with: 'dmat2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1698: shader with: 'dmat2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1700: shader with: 'dmat2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1702: shader with: 'dmat2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1704: shader with: 'dmat3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1706: shader with: 'dmat3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1708: shader with: 'dmat3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1710: shader with: 'dmat3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1712: shader with: 'dmat4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1714: shader with: 'dmat4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1716: shader with: 'dmat4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1718: shader with: 'dmat4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1744: shader with: 'dmat2x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1746: shader with: 'dmat2x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1748: shader with: 'dmat2x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1750: shader with: 'dmat2x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1752: shader with: 'dmat2x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1754: shader with: 'dmat2x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1756: shader with: 'dmat2x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1758: shader with: 'dmat2x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1760: shader with: 'dmat2x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1762: shader with: 'dmat2x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1764: shader with: 'dmat2x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1766: shader with: 'dmat2x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1792: shader with: 'dmat3x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1794: shader with: 'dmat3x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1796: shader with: 'dmat3x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1798: shader with: 'dmat3x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1800: shader with: 'dmat3x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1802: shader with: 'dmat3x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1804: shader with: 'dmat3x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1806: shader with: 'dmat3x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1808: shader with: 'dmat3x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1810: shader with: 'dmat3x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1812: shader with: 'dmat3x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1814: shader with: 'dmat3x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1840: shader with: 'dmat4x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1842: shader with: 'dmat4x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1844: shader with: 'dmat4x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1846: shader with: 'dmat4x2' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1848: shader with: 'dmat4x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1850: shader with: 'dmat4x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1852: shader with: 'dmat4x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1854: shader with: 'dmat4x3' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1856: shader with: 'dmat4x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1858: shader with: 'dmat4x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1860: shader with: 'dmat4x4' failed to compile]
+ expected: FAIL
+
+ [WebGL test #1862: shader with: 'dmat4x4' failed to compile]
+ expected: FAIL
diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/textures/texture-size.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/textures/texture-size.html.ini
deleted file mode 100644
index 0363f3ad91d..00000000000
--- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/textures/texture-size.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[texture-size.html]
- type: testharness
- expected:
- if os == "linux": TIMEOUT
- [Overall test]
- expected:
- if os == "linux": NOTRUN
-
diff --git a/tests/wpt/metadata/websockets/constructor/010.html.ini b/tests/wpt/metadata/websockets/constructor/010.html.ini
deleted file mode 100644
index f286708818e..00000000000
--- a/tests/wpt/metadata/websockets/constructor/010.html.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-[010.html]
- type: testharness
- [WebSockets: protocol in response but no requested protocol]
- expected: FAIL
-
-
-[010.html?wss]
- type: testharness
- [WebSockets: protocol in response but no requested protocol]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/websockets/constructor/011.html.ini b/tests/wpt/metadata/websockets/constructor/011.html.ini
index c03be6a5ae0..fc62c3a7ec7 100644
--- a/tests/wpt/metadata/websockets/constructor/011.html.ini
+++ b/tests/wpt/metadata/websockets/constructor/011.html.ini
@@ -1,8 +1,8 @@
[011.html]
type: testharness
-
-[011.html?wss]
- type: testharness
[WebSockets: protocol mismatch]
expected: FAIL
+
+[011.html?wss]
+ type: testharness
diff --git a/tests/wpt/metadata/webstorage/storage_enumerate.html.ini b/tests/wpt/metadata/webstorage/storage_enumerate.html.ini
deleted file mode 100644
index e9c308dcb55..00000000000
--- a/tests/wpt/metadata/webstorage/storage_enumerate.html.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[storage_enumerate.html]
- type: testharness
- [localStorage: enumerate a Storage object and get only the keys as a result and the built-in properties of the Storage object should be ignored]
- expected: FAIL
-
- [sessionStorage: enumerate a Storage object and get only the keys as a result and the built-in properties of the Storage object should be ignored]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/webstorage/storage_session_window_noopener.html.ini b/tests/wpt/metadata/webstorage/storage_session_window_noopener.html.ini
new file mode 100644
index 00000000000..8fddefe59f0
--- /dev/null
+++ b/tests/wpt/metadata/webstorage/storage_session_window_noopener.html.ini
@@ -0,0 +1,5 @@
+[storage_session_window_noopener.html]
+ type: testharness
+ [A new noopener window to make sure there is a not copy of the previous window's sessionStorage]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/workers/WorkerLocation-origin.sub.window.js.ini b/tests/wpt/metadata/workers/WorkerLocation-origin.sub.window.js.ini
new file mode 100644
index 00000000000..e8e64b41496
--- /dev/null
+++ b/tests/wpt/metadata/workers/WorkerLocation-origin.sub.window.js.ini
@@ -0,0 +1,5 @@
+[WorkerLocation-origin.sub.window.html]
+ type: testharness
+ [workerLocation.origin must use ASCII code points]
+ expected: FAIL
+
diff --git a/tests/wpt/metadata/workers/interfaces.worker.js.ini b/tests/wpt/metadata/workers/interfaces.worker.js.ini
index 176000c5486..41824ed7587 100644
--- a/tests/wpt/metadata/workers/interfaces.worker.js.ini
+++ b/tests/wpt/metadata/workers/interfaces.worker.js.ini
@@ -1,5 +1,6 @@
[interfaces.worker.html]
type: testharness
+ expected: ERROR
[WorkerGlobalScope interface: operation close()]
expected: FAIL
@@ -240,3 +241,33 @@
[WorkerLocation must be primary interface of self.location]
expected: FAIL
+ [WorkerGlobalScope interface: attribute self]
+ expected: TIMEOUT
+
+ [WorkerGlobalScope interface: attribute location]
+ expected: TIMEOUT
+
+ [WorkerGlobalScope interface: attribute navigator]
+ expected: TIMEOUT
+
+ [WorkerGlobalScope interface: attribute onerror]
+ expected: TIMEOUT
+
+ [WorkerGlobalScope interface: attribute onrejectionhandled]
+ expected: FAIL
+
+ [WorkerGlobalScope interface: attribute onunhandledrejection]
+ expected: FAIL
+
+ [WorkerGlobalScope interface: attribute origin]
+ expected: FAIL
+
+ [WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions)]
+ expected: FAIL
+
+ [WorkerGlobalScope interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)]
+ expected: FAIL
+
+ [DedicatedWorkerGlobalScope interface: internal [[SetPrototypeOf\]\] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError]
+ expected: TIMEOUT
+
diff --git a/tests/wpt/metadata/workers/name-property.html.ini b/tests/wpt/metadata/workers/name-property.html.ini
index 9f28275f818..2a70cfcb1a3 100644
--- a/tests/wpt/metadata/workers/name-property.html.ini
+++ b/tests/wpt/metadata/workers/name-property.html.ini
@@ -1,5 +1,6 @@
[name-property.html]
type: testharness
+ expected: ERROR
[Test the name property of shared and dedicated workers via the name constructor option]
expected: FAIL
diff --git a/tests/wpt/metadata/workers/worker-performance.worker.js.ini b/tests/wpt/metadata/workers/worker-performance.worker.js.ini
new file mode 100644
index 00000000000..49f33b3ec9a
--- /dev/null
+++ b/tests/wpt/metadata/workers/worker-performance.worker.js.ini
@@ -0,0 +1,3 @@
+[worker-performance.worker.html]
+ type: testharness
+ expected: CRASH
diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json
index 79db318a4cf..d93a257b8d7 100644
--- a/tests/wpt/mozilla/meta/MANIFEST.json
+++ b/tests/wpt/mozilla/meta/MANIFEST.json
@@ -21660,7 +21660,7 @@
},
"paths": {
"./lint.whitelist": [
- "05d60cf6c75b15a18cbd0b0526ea9edea7d933f9",
+ "28c20b33fcbd818a46005dcbf53473f8b8346c89",
"support"
],
"bluetooth/advertisingEvent/watchAdvertisements-succeeds.html": [
@@ -28012,7 +28012,7 @@
"testharness"
],
"mozilla/htmlfontelement_size_attribute.html": [
- "54fe6bbc1a7a35ceb14a3bf33f81ebed55beaf72",
+ "0747a4b45f19f7afbd3fa102b32d8db231dccadb",
"testharness"
],
"mozilla/htmlimageelement.html": [
diff --git a/tests/wpt/mozilla/meta/bluetooth/interfaces.html.ini b/tests/wpt/mozilla/meta/bluetooth/interfaces.html.ini
index 643242afa2b..bbc560e68f1 100644
--- a/tests/wpt/mozilla/meta/bluetooth/interfaces.html.ini
+++ b/tests/wpt/mozilla/meta/bluetooth/interfaces.html.ini
@@ -420,3 +420,180 @@
[BluetoothRemoteGATTDescriptor interface: calling writeValue(BufferSource) on bluetooth_descriptor with too few arguments must throw TypeError]
expected: FAIL
+ [Bluetooth interface: window.navigator.bluetooth must inherit property "referringDevice" with the proper type]
+ expected: FAIL
+
+ [Bluetooth interface: window.navigator.bluetooth must inherit property "ongattserverdisconnected" with the proper type]
+ expected: FAIL
+
+ [Bluetooth interface: window.navigator.bluetooth must inherit property "oncharacteristicvaluechanged" with the proper type]
+ expected: FAIL
+
+ [Bluetooth interface: window.navigator.bluetooth must inherit property "onserviceadded" with the proper type]
+ expected: FAIL
+
+ [Bluetooth interface: window.navigator.bluetooth must inherit property "onservicechanged" with the proper type]
+ expected: FAIL
+
+ [Bluetooth interface: window.navigator.bluetooth must inherit property "onserviceremoved" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "id" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "name" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "gatt" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "watchAdvertisements()" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "unwatchAdvertisements()" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "watchingAdvertisements" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "ongattserverdisconnected" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "oncharacteristicvaluechanged" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "onserviceadded" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "onservicechanged" with the proper type]
+ expected: FAIL
+
+ [BluetoothDevice interface: bluetooth_device must inherit property "onserviceremoved" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTServer interface: bluetooth_server must inherit property "device" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTServer interface: bluetooth_server must inherit property "connected" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTServer interface: bluetooth_server must inherit property "connect()" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTServer interface: bluetooth_server must inherit property "disconnect()" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTServer interface: bluetooth_server must inherit property "getPrimaryService(BluetoothServiceUUID)" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTServer interface: bluetooth_server must inherit property "getPrimaryServices(BluetoothServiceUUID)" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "device" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "uuid" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "isPrimary" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "getCharacteristic(BluetoothCharacteristicUUID)" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "getCharacteristics(BluetoothCharacteristicUUID)" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "getIncludedService(BluetoothServiceUUID)" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "getIncludedServices(BluetoothServiceUUID)" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "oncharacteristicvaluechanged" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "onserviceadded" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "onservicechanged" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTService interface: bluetooth_service must inherit property "onserviceremoved" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "service" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "uuid" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "properties" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "value" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "getDescriptor(BluetoothDescriptorUUID)" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "getDescriptors(BluetoothDescriptorUUID)" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "readValue()" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "writeValue(BufferSource)" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "startNotifications()" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "stopNotifications()" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTCharacteristic interface: bluetooth_characteristic must inherit property "oncharacteristicvaluechanged" with the proper type]
+ expected: FAIL
+
+ [BluetoothCharacteristicProperties interface: bluetooth_properties must inherit property "broadcast" with the proper type]
+ expected: FAIL
+
+ [BluetoothCharacteristicProperties interface: bluetooth_properties must inherit property "read" with the proper type]
+ expected: FAIL
+
+ [BluetoothCharacteristicProperties interface: bluetooth_properties must inherit property "writeWithoutResponse" with the proper type]
+ expected: FAIL
+
+ [BluetoothCharacteristicProperties interface: bluetooth_properties must inherit property "write" with the proper type]
+ expected: FAIL
+
+ [BluetoothCharacteristicProperties interface: bluetooth_properties must inherit property "notify" with the proper type]
+ expected: FAIL
+
+ [BluetoothCharacteristicProperties interface: bluetooth_properties must inherit property "indicate" with the proper type]
+ expected: FAIL
+
+ [BluetoothCharacteristicProperties interface: bluetooth_properties must inherit property "authenticatedSignedWrites" with the proper type]
+ expected: FAIL
+
+ [BluetoothCharacteristicProperties interface: bluetooth_properties must inherit property "reliableWrite" with the proper type]
+ expected: FAIL
+
+ [BluetoothCharacteristicProperties interface: bluetooth_properties must inherit property "writableAuxiliaries" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTDescriptor interface: bluetooth_descriptor must inherit property "characteristic" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTDescriptor interface: bluetooth_descriptor must inherit property "uuid" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTDescriptor interface: bluetooth_descriptor must inherit property "value" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTDescriptor interface: bluetooth_descriptor must inherit property "readValue()" with the proper type]
+ expected: FAIL
+
+ [BluetoothRemoteGATTDescriptor interface: bluetooth_descriptor must inherit property "writeValue(BufferSource)" with the proper type]
+ expected: FAIL
+
diff --git a/tests/wpt/mozilla/meta/bluetooth/readValue/characteristic/event-is-fired.html.ini b/tests/wpt/mozilla/meta/bluetooth/readValue/characteristic/event-is-fired.html.ini
new file mode 100644
index 00000000000..72160d4dd0c
--- /dev/null
+++ b/tests/wpt/mozilla/meta/bluetooth/readValue/characteristic/event-is-fired.html.ini
@@ -0,0 +1,5 @@
+[event-is-fired.html]
+ type: testharness
+ [Reading a characteristic should fire an event.]
+ expected: FAIL
+
diff --git a/tests/wpt/mozilla/tests/lint.whitelist b/tests/wpt/mozilla/tests/lint.whitelist
index 0fe88a1e08f..1bd7f2d23df 100644
--- a/tests/wpt/mozilla/tests/lint.whitelist
+++ b/tests/wpt/mozilla/tests/lint.whitelist
@@ -24,6 +24,7 @@ PATH LENGTH:*
PRINT STATEMENT:*
SET TIMEOUT:*
TRAILING WHITESPACE:*
+LAYOUTTESTS APIS:*
## CSSWG-only checks ##
diff --git a/tests/wpt/mozilla/tests/mozilla/htmlfontelement_size_attribute.html b/tests/wpt/mozilla/tests/mozilla/htmlfontelement_size_attribute.html
index 823e8e28c4f..9db2ded5f97 100644
--- a/tests/wpt/mozilla/tests/mozilla/htmlfontelement_size_attribute.html
+++ b/tests/wpt/mozilla/tests/mozilla/htmlfontelement_size_attribute.html
@@ -31,9 +31,9 @@ var args = [];
for (var i = 0; i < modes.length; i++) {
for (var j = 0; j < sizes.length; j++) {
var sizeAttrValue = modes[i] + sizes[j];
- args.push(["size=" + sizeAttrValue, sizeAttrValue]);
+ test(function() {
+ testSize(sizeAttrValue)
+ }, "size=" + sizeAttrValue);
}
}
-
-generate_tests(testSize, args);
</script>
diff --git a/tests/wpt/web-platform-tests/.gitignore b/tests/wpt/web-platform-tests/.gitignore
index e92e0808d4f..ad1e88ef593 100644
--- a/tests/wpt/web-platform-tests/.gitignore
+++ b/tests/wpt/web-platform-tests/.gitignore
@@ -15,3 +15,4 @@ webdriver/.idea
.DS_Store
*.rej
_venv
+webdriver/.cache
diff --git a/tests/wpt/web-platform-tests/.travis.yml b/tests/wpt/web-platform-tests/.travis.yml
index 05c97d9bccc..1cdc87ec4c5 100644
--- a/tests/wpt/web-platform-tests/.travis.yml
+++ b/tests/wpt/web-platform-tests/.travis.yml
@@ -15,12 +15,9 @@ addons:
jwt:
secure: N9lvgkqUPtFlz6Vpa6qTPFhymEsDCsbaCsT64/hj3vlHRxK94r5+ugVJ3zm99zC0q2j1ish8yJC7mN/W4wRfBE4sAwmdxrlowxF1DDGCkaLE9i/GWW92s0fBVGJmXLh8kwNkQ31hMOsaGfHIMpeLFS7Se741te7YqsHIzmBCdQs=
before_install:
- - git submodule update --init --recursive
- - export DISPLAY=:99.0
- - sh -e /etc/init.d/xvfb start
+ - . ./tools/ci/before_install.sh
install:
- - pip install -U setuptools
- - pip install -U requests
+ - ./tools/ci/install.sh
env: # required at the top-level for allow_failures to work below
global:
- SAUCE_USERNAME=w3c-ttwf
@@ -29,13 +26,13 @@ matrix:
include:
- os: linux
python: "2.7"
- env: SCRIPT=ci_lint.sh
+ env: JOB=lint SCRIPT=tools/ci/ci_lint.sh
- os: linux
python: "2.7"
- env: SCRIPT=ci_built_diff.sh
+ env: JOB=update_built SCRIPT=tools/ci/ci_built_diff.sh
- os: linux
python: "2.7"
- env: SCRIPT=css/build-css-testsuites.sh
+ env: JOB=build_css SCRIPT=css/build-css-testsuites.sh
- os: linux
python: "2.7"
addons:
@@ -44,7 +41,7 @@ matrix:
- libnss3-tools
env:
- secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
- - SCRIPT=ci_stability.sh PRODUCT=firefox:nightly
+ - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=firefox:nightly
- os: linux
sudo: required
python: "2.7"
@@ -55,42 +52,52 @@ matrix:
- fonts-liberation
env:
- secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
- - SCRIPT=ci_stability.sh PRODUCT=chrome:unstable
+ - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=chrome:unstable
- os: linux
python: "2.7"
env:
- secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
- - SCRIPT=ci_stability.sh PRODUCT=sauce:safari:10.0 PLATFORM='macOS 10.12'
+ - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=sauce:safari:10.0 PLATFORM='macOS 10.12'
- os: linux
python: "2.7"
env:
- secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
- - SCRIPT=ci_stability.sh PRODUCT=sauce:MicrosoftEdge:14.14393 PLATFORM='Windows 10'
+ - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=sauce:MicrosoftEdge:14.14393 PLATFORM='Windows 10'
- python: 2.7
- env: TOXENV=py27 HYPOTHESIS_PROFILE=ci SCRIPT=ci_unittest.sh
- - python: 3.5
- env: TOXENV=py35 HYPOTHESIS_PROFILE=ci SCRIPT=ci_unittest.sh
+ env: JOB=tools_unittest TOXENV=py27 HYPOTHESIS_PROFILE=ci SCRIPT=tools/ci/ci_tools_unittest.sh
- python: 3.6
- env: TOXENV=py36 HYPOTHESIS_PROFILE=ci SCRIPT=ci_unittest.sh
- - python: pypy
- env: TOXENV=pypy HYPOTHESIS_PROFILE=ci SCRIPT=ci_unittest.sh
+ env: JOB=tools_unittest TOXENV=py36 HYPOTHESIS_PROFILE=ci SCRIPT=tools/ci/ci_tools_unittest.sh
+ - python: pypy-5.4
+ env: JOB=tools_unittest TOXENV=pypy HYPOTHESIS_PROFILE=ci SCRIPT=tools/ci/ci_tools_unittest.sh
+ - python: 2.7
+ env: JOB=resources_unittest TOXENV=py27 SCRIPT=tools/ci/ci_resources_unittest.sh
+ - python: 2.7
+ addons:
+ apt:
+ packages:
+ - libnss3-tools
+ env: JOB=wpt_integration TOXENV=py27 SCRIPT=tools/ci/ci_wpt.sh
exclude:
- env: # exclude empty env from the top-level above
allow_failures:
- - env: SCRIPT=css/build-css-testsuites.sh
+ - env: JOB=build_css SCRIPT=css/build-css-testsuites.sh
+ - env:
+ - secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
+ - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=chrome:unstable
- env:
- secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
- - SCRIPT=ci_stability.sh PRODUCT=chrome:unstable
+ - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=sauce:MicrosoftEdge:14.14393 PLATFORM='Windows 10'
- env:
- secure: "YTSXPwI0DyCA1GhYrLT9KMEV6b7QQKuEeaQgeFDP38OTzJ1+cIj3CC4SRNqbnJ/6SJwPGcdqSxLuV8m4e5HFFnyCcQnJe6h8EMsTehZ7W3j/fP9UYrJqYqvGpe3Vj3xblO5pwBYmq7sg3jAmmuCgAgOW6VGf7cRMucrsmFeo7VM="
- - SCRIPT=ci_stability.sh PRODUCT=sauce:MicrosoftEdge:14.14393 PLATFORM='Windows 10'
+ - JOB=stability SCRIPT=tools/ci/ci_stability.sh PRODUCT=sauce:safari:10.0 PLATFORM='macOS 10.12'
script:
- - bash $SCRIPT
+ - ./tools/ci/run.sh
cache:
directories:
- $HOME/.cache/pip
+ - $HOME/meta
notifications:
email:
on_success: never
on_failure: always
- webhooks: https://w3c-test.org/prbuildbot.py
+ webhooks: https://pulls.web-platform-tests.org/api/build
diff --git a/tests/wpt/web-platform-tests/.well-known/README.md b/tests/wpt/web-platform-tests/.well-known/README.md
new file mode 100644
index 00000000000..dde8aa232e3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/.well-known/README.md
@@ -0,0 +1,9 @@
+Well-Known URI Testing
+======================
+
+This directory is used for testing resources that are loaded based on the
+well-known URI standard. [[RFC5785](https://tools.ietf.org/html/rfc5785)]
+
+For other kinds of resource files, they should either be placed at
+[/common](../common) or the respective subdirectories for the
+particular standard.
diff --git a/tests/wpt/web-platform-tests/.well-known/idp-proxy/README.md b/tests/wpt/web-platform-tests/.well-known/idp-proxy/README.md
new file mode 100644
index 00000000000..dc5795cf818
--- /dev/null
+++ b/tests/wpt/web-platform-tests/.well-known/idp-proxy/README.md
@@ -0,0 +1,12 @@
+Identity Provider Proxy
+=======================
+
+This directory is used for hosting the mock identity provider proxy script
+for testing the identity provider feature in WebRTC.
+[[ietf-rtcweb-security-arch](https://tools.ietf.org/html/draft-ietf-rtcweb-security-arch-12#section-5.6.5)]
+[[webrtc-pc](https://w3c.github.io/webrtc-pc/#sec.identity-proxy)]
+
+The script for identity provider proxy must be hosted at /.well-known/idp-proxy
+instead of the usual [/webrtc](../../webrtc) directory as it follows the
+well-known URI standard that derives the script URI from a given domain name.
+[[RFC5785](https://tools.ietf.org/html/rfc5785)]
diff --git a/tests/wpt/web-platform-tests/.well-known/idp-proxy/mock-idp.js b/tests/wpt/web-platform-tests/.well-known/idp-proxy/mock-idp.js
new file mode 100644
index 00000000000..242b4ef56f6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/.well-known/idp-proxy/mock-idp.js
@@ -0,0 +1,198 @@
+'use strict';
+
+// Code is based on the following editor draft:
+// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+/*
+ mock-idp.js is a naive IdP that provides absolutely no
+ security for authentication. It can generate identity
+ assertion for whatever identity that is requested.
+
+ mock-idp.js validates identity assertion by simply decoding
+ the JSON and return whatever that is inside, with no integrity
+ protection and thus can be spoofed by anyone.
+
+ While being not practical at all, mock-idp.js allows us
+ to test various aspects of the identity API and allow tests
+ to manipulate the IdP at will.
+ */
+
+// We pass around test options as query string to instruct
+// the test IdP proxy script on what actions to perform.
+// This hack is based on the fact that query string is allowed
+// when specifying the IdP protocol.
+function parseQueryString(urlStr) {
+ const url = new URL(urlStr);
+ const result = {};
+ for(const [key, value] of url.searchParams) {
+ result[key] = value;
+ }
+ return result;
+}
+
+/*
+ 9.2.1. Interface Exposed by Identity Providers
+ callback GenerateAssertionCallback =
+ Promise<RTCIdentityAssertionResult> (
+ DOMString contents,
+ DOMString origin,
+ RTCIdentityProviderOptions options);
+
+ dictionary RTCIdentityProviderOptions {
+ DOMString protocol = "default";
+ DOMString usernameHint;
+ DOMString peerIdentity;
+ };
+
+ dictionary RTCIdentityAssertionResult {
+ required RTCIdentityProviderDetails idp;
+ required DOMString assertion;
+ };
+
+ dictionary RTCIdentityProviderDetails {
+ required DOMString domain;
+ DOMString protocol = "default";
+ };
+ */
+
+// In RTCIdentityProviderGlobalScope, global is self
+const global = self;
+const query = parseQueryString(global.location);
+
+// Generate a naive identity assertion. The result assertion
+// is a JSON string that report the various parameters
+// received by this function.
+// watermark - a special mark to make sure the result is returned
+// from this function
+// args - the function arguments received
+// env - some global variable values when this function is called
+// query - the parsed query string of the script URL
+function generateAssertion(contents, origin, options) {
+ const args = {
+ contents, origin, options
+ };
+
+ const env = {
+ origin: global.origin,
+ location: global.location
+ };
+
+ const assertion = {
+ watermark: 'mock-idp.js.watermark',
+ args,
+ env,
+ query
+ };
+
+ const idp = {
+ domain: global.location.host,
+ protocol: 'mock-idp.js'
+ };
+
+ const assertionStr = JSON.stringify(assertion);
+
+ const { generatorAction } = query;
+
+ if(generatorAction === 'throw-error') {
+ const err = new Error('Mock Internal IdP Error');
+ err.idpErrorInfo = query.errorInfo;
+ throw err;
+
+ } else if(generatorAction === 'require-login') {
+ const err = new RTCError('idp-need-login');
+ err.idpLoginUrl = `${self.origin}/login`;
+ err.idpErrorInfo = 'login required';
+ throw err;
+
+ } else if(generatorAction === 'return-custom-idp') {
+ const { domain, protocol } = query;
+
+ return {
+ idp: {
+ domain,
+ protocol
+ },
+ assertion: assertionStr
+ };
+
+ } else if(generatorAction === 'return-invalid-result') {
+ return 'invalid-result';
+
+ } else {
+ return {
+ idp,
+ assertion: assertionStr
+ };
+ }
+}
+
+/*
+ 9.2.1. Interface Exposed by Identity Providers
+ callback ValidateAssertionCallback =
+ Promise<RTCIdentityValidationResult> (
+ DOMString assertion,
+ DOMString origin);
+
+ dictionary RTCIdentityValidationResult {
+ required DOMString identity;
+ required DOMString contents;
+ };
+ */
+function validateAssertion(assertionStr, origin) {
+ const assertion = JSON.parse(assertionStr);
+
+ const { param, query } = assertion;
+ const { contents, options } = param;
+
+ const identity = options.usernameHint;
+
+ const {
+ validatorAction
+ } = query;
+
+ if(validatorAction === 'throw-error') {
+ const err = new Error('Mock Internal IdP Error');
+ err.idpErrorInfo = query.errorInfo;
+ throw err;
+
+ } else if(validatorAction === 'return-custom-contents') {
+ const { contents } = query;
+ return {
+ identity,
+ contents
+ };
+
+ } else {
+ return {
+ identity, contents
+ };
+ }
+}
+
+/*
+ 9.2. Registering an IdP Proxy
+ [Global,
+ Exposed=RTCIdentityProviderGlobalScope]
+ interface RTCIdentityProviderGlobalScope : WorkerGlobalScope {
+ readonly attribute RTCIdentityProviderRegistrar rtcIdentityProvider;
+ };
+
+ [Exposed=RTCIdentityProviderGlobalScope]
+ interface RTCIdentityProviderRegistrar {
+ void register(RTCIdentityProvider idp);
+ };
+
+ dictionary RTCIdentityProvider {
+ required GenerateAssertionCallback generateAssertion;
+ required ValidateAssertionCallback validateAssertion;
+ };
+ */
+
+// if global.rtcIdentityProvider is defined, and the caller do not ask
+// to not register through query string, register our assertion callbacks.
+if(global.rtcIdentityProvider && query.action !== 'do-not-register') {
+ global.rtcIdentityProvider.register({
+ generateAssertion,
+ validateAssertion
+ });
+}
diff --git a/tests/wpt/web-platform-tests/2dcontext/2x2.png b/tests/wpt/web-platform-tests/2dcontext/2x2.png
index 276791c4348..9be31562b3f 100644
--- a/tests/wpt/web-platform-tests/2dcontext/2x2.png
+++ b/tests/wpt/web-platform-tests/2dcontext/2x2.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/2dcontext/conformance-requirements/2d.missingargs.html b/tests/wpt/web-platform-tests/2dcontext/conformance-requirements/2d.missingargs.html
index 2c89cf2ac18..de3d920dd56 100644
--- a/tests/wpt/web-platform-tests/2dcontext/conformance-requirements/2d.missingargs.html
+++ b/tests/wpt/web-platform-tests/2dcontext/conformance-requirements/2d.missingargs.html
@@ -33,7 +33,6 @@ if (ctx.transform) { // (avoid spurious failures, since the aim here is not to t
assert_throws(new TypeError(), function() { ctx.transform(1, 0, 0, 1, 0); });
}
if (ctx.setTransform) {
- assert_throws(new TypeError(), function() { ctx.setTransform(); });
assert_throws(new TypeError(), function() { ctx.setTransform(1); });
assert_throws(new TypeError(), function() { ctx.setTransform(1, 0); });
assert_throws(new TypeError(), function() { ctx.setTransform(1, 0, 0); });
diff --git a/tests/wpt/web-platform-tests/2dcontext/conformance-requirements/2d.voidreturn.html b/tests/wpt/web-platform-tests/2dcontext/conformance-requirements/2d.voidreturn.html
index b23595c174c..a1697c60087 100644
--- a/tests/wpt/web-platform-tests/2dcontext/conformance-requirements/2d.voidreturn.html
+++ b/tests/wpt/web-platform-tests/2dcontext/conformance-requirements/2d.voidreturn.html
@@ -29,6 +29,7 @@ if (ctx.transform) { // (avoid spurious failures, since the aim here is not to t
}
if (ctx.setTransform) {
_assertSame(ctx.setTransform(1, 0, 0, 1, 0, 0), undefined, "ctx.setTransform(1, 0, 0, 1, 0, 0)", "undefined");
+ _assertSame(ctx.setTransform(), undefined, "ctx.setTransform()", "undefined");
}
_assertSame(ctx.clearRect(0, 0, 0, 0), undefined, "ctx.clearRect(0, 0, 0, 0)", "undefined");
_assertSame(ctx.fillRect(0, 0, 0, 0), undefined, "ctx.fillRect(0, 0, 0, 0)", "undefined");
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html
new file mode 100644
index 00000000000..36bd085136d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas.html
@@ -0,0 +1,203 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceCanvasWidth = sourceCanvasHeight = 50;
+var destCanvasWidth = destCanvasHeight = 100;
+var blueRect = {x: 0, y: 0, w: 50, h: 50};
+var blackRect = {x: 5, y: 5, w: 40, h: 40};
+var redPixel = [255, 0, 0, 255];
+var bluePixel = [0, 0, 255, 255];
+var blackPixel = [0, 0, 0, 255];
+var transparentBlackPixel = [0, 0, 0, 0];
+
+var destCanvas = document.getElementById('dest');
+var destCtx = destCanvas.getContext('2d');
+destCtx.imageSmoothingEnabled = false;
+
+function checkPixel(location, expected) {
+ var actual = destCtx.getImageData(location[0], location[1], 1, 1).data;
+ assert_array_equals(actual, expected);
+}
+
+function PreparePixelTests(blueCheck, blackCheck, redCheck, testDescription) {
+ var pixelTests = [];
+ for (var i = 0; i < blueCheck.length; i++) {
+ var message = testDescription + 'Pixel ' + blueCheck[i][0] + ',' + blueCheck[i][1] + ' should be blue.';
+ pixelTests.push([message, blueCheck[i], bluePixel]);
+ }
+ for (var i = 0; i < blackCheck.length; i++) {
+ var message = testDescription + 'Pixel ' + blackCheck[i][0] + ',' + blackCheck[i][1] + ' should be black.';
+ pixelTests.push([message, blackCheck[i], blackPixel]);
+ }
+ for (var i = 0; i < redCheck.length; i++) {
+ var message = testDescription + 'Pixel ' + redCheck[i][0] + ',' + redCheck[i][1] + ' should be red.';
+ pixelTests.push([message, redCheck[i], redPixel]);
+ }
+ pixelTests.push([testDescription + 'Pixel outside canvas should be transparent black.\n', [100, 100], transparentBlackPixel]);
+ return pixelTests;
+}
+
+function drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription) {
+ destCtx.fillStyle = 'red';
+ destCtx.fillRect(0, 0, destCanvasWidth, destCanvasHeight);
+
+ var sourceCanvas = document.createElement('canvas');
+ sourceCanvas.width = sourceCanvasWidth;
+ sourceCanvas.height = sourceCanvasHeight;
+ var sourceCtx = sourceCanvas.getContext('2d');
+ sourceCtx.fillStyle = 'blue';
+ sourceCtx.fillRect(blueRect.x, blueRect.y, blueRect.w, blueRect.h);
+ sourceCtx.fillStyle = 'black';
+ sourceCtx.fillRect(blackRect.x, blackRect.y, blackRect.w, blackRect.h);
+ if (typeof sourceRect.x !== 'undefined')
+ destCtx.drawImage(sourceCanvas, sourceRect.x, sourceRect.y, sourceRect.w, sourceRect.h,
+ destRect.x, destRect.y, destRect.w, destRect.h);
+ else if (typeof destRect.w !== 'undefined')
+ destCtx.drawImage(sourceCanvas, destRect.x, destRect.y, destRect.w, destRect.h);
+ else
+ destCtx.drawImage(sourceCanvas, destRect.x, destRect.y);
+ var pixelTests = PreparePixelTests(blueCheck, blackCheck, redCheck, testDescription);
+ generate_tests(checkPixel, pixelTests);
+}
+
+var testDescription;
+var sourceRect = {}, destRect = {};
+var blueCheck, blackCheck, redCheck;
+
+// 2 arguments, the dest origin is 0,0
+// The source canvas will be copied to the 0,0 position of the destination canvas
+testDescription = 'Test scenario 1: dx = 0, dy = 0 --- ';
+destRect = {x: 0, y: 0};
+blueCheck = [[0,0], [0,49], [49,0], [49,49]];
+blackCheck = [[5,5], [5,44], [44,5], [44,44]];
+redCheck = [[50,0], [0,50], [50,50], [99,99]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// 2 arguments, the dest origin is not 0,0
+// The source canvas will copied to the 25, 25 position of the destination canvas
+testDescription = 'Test scenario 2: dx = 25, dy = 25 --- ';
+destRect = {x: 25, y: 25};
+blueCheck = [[25,25], [25,74], [74,25], [74,74]];
+blackCheck = [[30,30], [30,69], [69,30], [69,69]];
+redCheck = [[24,24], [24,75], [75,24], [75,75]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// 4 arguments, the source origin is not 0,0, the dest size is provided
+// The source canvas will copied to the 50, 50 position of the destination canvas and
+// on an area of 50x50 pixels
+testDescription = 'Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- ';
+destRect = {x: 50, y: 50, w: 50, h: 50};
+blueCheck = [[50,50], [50,99], [99,50], [99,99]];
+blackCheck = [[55,55], [55,94], [94,55], [94,94]];
+redCheck = [[0,0], [49,49], [49,99], [99,49]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// 4 arguments, the dest origin is not 0,0 and the dest size is provided but
+// does not match the size of the source. The image will be distorted
+// The source canvas will copied to the 50,50 position of the destination canvas
+// and it will be shrunk to a and area of 20x20
+testDescription = 'Test scenario 4: dx = 50, dy = 50, dw = 20, dh = 20 --- ';
+destRect = {x: 50, y: 50, w: 20, h: 20};
+blueCheck = [[50,50], [50,69], [69,50], [69,69]];
+blackCheck = [[52,52], [52,67], [67,52], [67,67]];
+redCheck = [[49,49], [49,70], [70,49], [70,70]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// The source canvas will copied to the 50,50 position of the destination canvas
+// over an area of 50x25 pixels
+// The copied image will be distorted along the x axis
+testDescription = 'Test scenario 5: dx = 50, dy = 50, dw = 50, dh = 20 --- ';
+destRect = {x: 50, y: 50, w: 50, h: 20};
+blueCheck = [[50,50], [50,69], [99,50], [99,69]];
+blackCheck = [[55,52], [55,67], [94,52], [94,67]];
+redCheck = [[49,49], [49, 69], [99,49], [99,70]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// 8 arguments, both destination and source origins are 0, 0
+// An area of 25x25 pixels of the source image will be copied to
+// an area of 25x25 pixels of the destination canvas
+// destCtx.drawImage(sourceCanvas, 0, 0, 25, 25, 0, 0, 25, 25);
+testDescription = 'Test scenario 6: sx = 0, sy = 0, sw = 25, sh = 25, dx = 0, dy = 0, dw = 25, dh = 25 --- ';
+sourceRect = {x: 0, y: 0, w: 25, h: 25};
+destRect = {x: 0, y: 0, w: 25, h: 25};
+blueCheck = [[0,0], [4,4], [0,24], [24,0]];
+blackCheck = [[5,5], [5,24], [24,5], [24,24]];
+redCheck = [[25,25], [25, 99], [99,25], [99,99]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// 8 arguments the destination origin is not 0,0
+// An area of 25x25 pixels of the source image will be copied to
+// an area of 25x25 pixels of the destination canvas in the position 25,25
+testDescription = 'Test scenario 7: sx = 0, sy = 0, sw = 25, sh = 25, dx = 25, dy = 25, dw = 25, dh = 25 --- ';
+sourceRect = {x: 0, y: 0, w: 25, h: 25};
+destRect = {x: 25, y: 25, w: 25, h: 25};
+blueCheck = [[25,25], [25,49], [49,25], [29,29]];
+blackCheck = [[30,30], [30,49], [49,30], [49,49]];
+redCheck = [[24,24], [24, 50], [50,24], [50,50]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// The source rectangle overflows the source image
+// The source area is clipped to fit the source image
+// and the destination are is clipped in the same proportion
+testDescription = 'Test scenario 8: sx = 25, sy = 25, sw = 50, sh = 50, dx = 0, dy = 0, dw = 50, dh = 50 --- ';
+sourceRect = {x: 25, y: 25, w: 50, h: 50};
+destRect = {x: 0, y: 0, w: 50, h: 50};
+blueCheck = [[0,20], [20,0], [20,20], [24,24]];
+blackCheck = [[0,0], [0,19], [19,0], [19,19]];
+redCheck = [[0,25], [25, 0], [25,25], [99,99]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// The destination rectangle has negative width and height. When the source
+// rectangle is outside the source image, the source rectangle must be clipped
+// to the source image and the destination rectangle must be clipped in the same
+// proportion.
+testDescription = 'Test scenario 9: sx = 0, sy = 0, sw = 50, sh = 50, dx = 100, dy = 100, dw = -50, dh = -50 --- ';
+sourceRect = {x: 0, y: 0, w: 50, h: 50};
+destRect = {x: 100, y: 100, w: -50, h: -50};
+blueCheck = [[50,50], [50,99], [99,50], [99,99]];
+blackCheck = [[55,55], [55,94], [94,55], [94,94]];
+redCheck = [[0,0], [49,49], [0,99], [99,0]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// The destination rectangle is larger than the destination canvas
+// When the destination rectangle is outside the destination image (the scratch bitmap),
+// the pixels that land outside the scratch bitmap are discarded,
+// as if the destination was an infinite canvas whose rendering was
+// clipped to the dimensions of the scratch bitmap.
+testDescription = 'Test scenario 10: sx = 0, sy = 0, sw = 50, sh = 50, dx = 0, dy = 0, dw = 200, dh = 200 --- ';
+sourceRect = {x: 0, y: 0, w: 50, h: 50};
+destRect = {x: 0, y: 0, w: 200, h: 200};
+blueCheck = [[0,0], [0,99], [99,0], [19,19]];
+blackCheck = [[20,20], [20,99], [99,20], [99,99]];
+redCheck = [];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// The source rectangle is larger than the source canvas
+// The source area is clipped to fit the source image
+// and the destination are is clipped in the same proportion
+testDescription = 'Test scenario 11: sx = 0, sy = 0, sw = 100, sh = 100, dx = 0, dy = 0, dw = 50, dh = 50 --- ';
+sourceRect = {x: 0, y: 0, w: 100, h: 100};
+destRect = {x: 0, y: 0, w: 50, h: 50};
+blueCheck = [[0,0], [1,1], [23,23], [24,24]];
+blackCheck = [[3,3], [3,21], [21,3], [21,21]];
+redCheck = [[0,25], [25, 0], [25,25], [99,99]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+// Negative coordinates of the source rectangle.
+// The source area is clipped to fit the source image and the destination area
+// is clipped in the same proportion. In this specific test:
+// - source is clipped by 20 from top and left.
+// - destination will get proportionally clipped by 50 from top and left as we
+// are scaling the source image 2.5 times.
+// - the rect will be drawn from 70,70 to 100,100.
+testDescription = 'Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- ';
+sourceRect = {x: -20, y: -20, w: 50, h: 50};
+destRect = {x: 20, y: 20, w: 125, h: 125};
+blueCheck = [[70,70], [70,99], [99,70], [82,82]];
+blackCheck = [[84,84], [84,99], [99,84], [99,99]];
+redCheck = [[0,69], [69, 0], [69,69]];
+drawCanvasOnCanvasUsingDrawImage(sourceRect, destRect, blueCheck, blackCheck, redCheck, testDescription);
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1.html
deleted file mode 100644
index 871e279ac55..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_1_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-// 2 arguments, the dest origin is 0,0
-// The source canvas will copied to the 0,0 position of the destination canvas
-destCtx.drawImage(sourceCanvas, 0, 0);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10.html
deleted file mode 100644
index 14e15ffc3f8..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_10_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// The destination rectangle is larger than the destination canvas
-// When the destination rectangle is outside the destination image (the scratch bitmap),
-// the pixels that land outside the scratch bitmap are discarded,
-// as if the destination was an infinite canvas whose rendering was
-// clipped to the dimensions of the scratch bitmap.
-destCtx.drawImage(sourceCanvas, 0, 0, 50, 50, 0, 0, 200, 200);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10_ref.html
deleted file mode 100644
index cd05233b8f7..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_10_ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(0, 0, 100, 100);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(20, 20, 80, 80);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11.html
deleted file mode 100644
index e06dfc0df7e..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_11_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// The source rectangle is larger than the source canvas
-// The source area is clipped to fit the source image
-// and the destination are is clipped in the same proportion
-destCtx.drawImage(sourceCanvas, 0, 0, 100, 100, 0, 0, 50, 50);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11_ref.html
deleted file mode 100644
index 970f626dfbd..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_11_ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(0, 0, 25, 25);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(2, 2, 20, 20);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12.html
deleted file mode 100644
index 47debc796ec..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_12_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// Negative coordinates of the source rectangle
-// The source area is clipped to fit the source image
-// and the destination area is clipped in the same proportion
-destCtx.drawImage(sourceCanvas, -25, -25, 50, 50, 0, 0, 50, 50);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12_ref.html
deleted file mode 100644
index 190f74f93ef..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_12_ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(0, 0, 25, 25);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(5, 5, 20, 20);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1_ref.html
deleted file mode 100644
index d0bac45ed5b..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_1_ref.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- canvas {
- display: block;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(5, 5, 40, 40);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2.html
deleted file mode 100644
index b169d3743c4..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_2_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// 2 arguments, the dest origin is not 0,0
-// The source canvas will copied to the 25, 25 position of the destination canvas
-destCtx.drawImage(sourceCanvas, 25, 25);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2_ref.html
deleted file mode 100644
index 72ec289f714..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_2_ref.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- canvas {
- display: block;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(25, 25, sourceWidth, sourceHeight);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(30, 30, 40, 40);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3.html
deleted file mode 100644
index e59e5d352de..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_3_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// 4 arguments, the source origin is not 0,0, the dest size is provided
-// The source canvas will copied to the 50, 50 position of the destination canvas and
-// on an area of 50x50 pixels
-destCtx.drawImage(sourceCanvas, 50, 50, 50, 50);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3_ref.html
deleted file mode 100644
index 3e153f1ca65..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_3_ref.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- canvas {
- display: block;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(50, 50, sourceWidth, sourceHeight);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(55, 55, 40, 40);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4.html
deleted file mode 100644
index f3dd84e2a35..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_4_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// 4 arguments, the dest origin is not 0,0 and the dest size is provided but
-// does not match the size of the source. The image will be distorted
-// The source canvas will copied to the 50,50 position of the destination canvas
-// and it will be shrunk to a and area of 20x20
-destCtx.drawImage(sourceCanvas, 50, 50, 20, 20);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4_ref.html
deleted file mode 100644
index 9a8cc99371c..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_4_ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(50, 50, 20, 20);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(52, 52, 16, 16);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5.html
deleted file mode 100644
index 2190847f8be..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_5_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// The source canvas will copied to the 50,50 position of the destination canvas
-// over an area of 50x25 pixels
-// The copied image will be distorted along the x axis
-destCtx.drawImage(sourceCanvas, 50, 50, 50, 20);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5_ref.html
deleted file mode 100644
index 47dd63ee2b3..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_5_ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(50, 50, 50, 20);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(55, 52, 40, 16);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6.html
deleted file mode 100644
index 2ce48d8fafd..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_6_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// 8 arguments, both destination and source origins are 0, 0
-// An area of 25x25 pixels of the source image will be copied to
-// an area of 25x25 pixels of the destination canvas
-destCtx.drawImage(sourceCanvas, 0, 0, 25, 25, 0, 0, 25, 25);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6_ref.html
deleted file mode 100644
index 190f74f93ef..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_6_ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(0, 0, 25, 25);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(5, 5, 20, 20);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7.html
deleted file mode 100644
index 1952909211d..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_7_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// 8 arguments the destination origin is not 0,0
-// An area of 25x25 pixels of the source image will be copied to
-// an area of 25x25 pixels of the destination canvas in the position 25,25
-destCtx.drawImage(sourceCanvas, 0, 0, 25, 25, 25, 25, 25, 25);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7_ref.html
deleted file mode 100644
index 51b2b276cad..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_7_ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(25, 25, 25, 25);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(30, 30, 20, 20);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8.html
deleted file mode 100644
index c47a5b55ce9..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_8_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// The source rectangle overflows the source image
-// The source area is clipped to fit the source image
-// and the destination are is clipped in the same proportion
-destCtx.drawImage(sourceCanvas, 25, 25, 50, 50, 0, 0, 50, 50);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8_ref.html
deleted file mode 100644
index 652bf6eb994..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_8_ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.fillStyle = "#00FFFF";
-destCtx.fillRect(0, 0, 25, 25);
-destCtx.fillStyle = "#000000";
-destCtx.fillRect(0, 0, 20, 20);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9.html
deleted file mode 100644
index 8b48e644fb8..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_canvas_9_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 50;
-var sourceHeight = 50;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceCanvas = document.createElement('canvas');
-sourceCanvas.width = sourceWidth;
-sourceCanvas.height = sourceHeight;
-
-var sourceCtx = sourceCanvas.getContext('2d');
-sourceCtx.fillStyle = "#00FFFF";
-sourceCtx.fillRect(0, 0, sourceWidth, sourceHeight);
-sourceCtx.fillStyle = "#000000";
-sourceCtx.fillRect(5,5,40,40);
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// The destination rectangle has negative width and height
-// An exception is raised and nothing is drawn
-try {
- destCtx.drawImage(sourceCanvas, 25, 50, 50, 0, 0, -100, -100);
- // It makes the test fail if the exception is not thrown
- destCtx.fillStyle = "#0000FF";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-}
-catch(err) {
-}
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9_ref.html
deleted file mode 100644
index b9be7e514f1..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_canvas_9_ref.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<body>
-<canvas id="dest" height="100" width="100"></canvas>
-<script type="text/javascript">
-
-var destCanvas = document.getElementById('dest');
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html
new file mode 100644
index 00000000000..a94cfdcd2d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html
@@ -0,0 +1,268 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = sourceHeight = 100;
+var destCanvasWidth = destCanvasHeight = 100;
+var redPixel = [255, 0, 0, 255];
+var lightPixel = [253, 140, 245, 255];
+var grayPixel = [41, 122, 115, 255];
+var transparentBlackPixel = [0, 0, 0, 0];
+
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElement('img');
+sourceImg.src = '../2x2.png';
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+destCtx.imageSmoothingEnabled = false;
+
+function checkPixel(location, expected) {
+ var actual = destCtx.getImageData(location[0], location[1], 1, 1).data;
+ assert_array_equals(actual, expected);
+}
+
+function PreparePixelTests(lightPixelCheck, grayPixelCheck, redCheck, testDescription) {
+ var pixelTests = [];
+ for (var i = 0; i < lightPixelCheck.length; i++) {
+ var message = testDescription + 'Pixel ' + lightPixelCheck[i][0] + ',' + lightPixelCheck[i][1] + ' should be light purple.';
+ pixelTests.push([message, lightPixelCheck[i], lightPixel]);
+ }
+ for (var i = 0; i < grayPixelCheck.length; i++) {
+ var message = testDescription + 'Pixel ' + grayPixelCheck[i][0] + ',' + grayPixelCheck[i][1] + ' should be gray.';
+ pixelTests.push([message, grayPixelCheck[i], grayPixel]);
+ }
+ for (var i = 0; i < redCheck.length; i++) {
+ var message = testDescription + 'Pixel ' + redCheck[i][0] + ',' + redCheck[i][1] + ' should be red.';
+ pixelTests.push([message, redCheck[i], redPixel]);
+ }
+ pixelTests.push([testDescription + 'Pixel outside canvas should be transparent black.\n', [100, 100], transparentBlackPixel]);
+ return pixelTests;
+}
+
+function drawCustomImageOnCanvas(sourceImage, sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription) {
+ destCtx.fillStyle = 'red';
+ destCtx.fillRect(0, 0, destCanvasWidth, destCanvasHeight);
+ if (typeof sourceRect.x !== 'undefined')
+ destCtx.drawImage(sourceImage, sourceRect.x, sourceRect.y, sourceRect.w, sourceRect.h,
+ destRect.x, destRect.y, destRect.w, destRect.h);
+ else if (typeof destRect.w !== 'undefined')
+ destCtx.drawImage(sourceImage, destRect.x, destRect.y, destRect.w, destRect.h);
+ else
+ destCtx.drawImage(sourceImage, destRect.x, destRect.y);
+ var pixelTests = PreparePixelTests(lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+ generate_tests(checkPixel, pixelTests);
+}
+
+function drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription) {
+ drawCustomImageOnCanvas(sourceImg, sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+var testDescription;
+var sourceRect = {}, destRect = {};
+var lightPixelCheck, grayPixelCheck, redCheck;
+
+// 2 arguments, the dest origin is 0,0
+// The source image will copied to the 0,0 position of the destination canvas
+function runDrawImageTest_dX0_dY0() {
+ testDescription = 'Test scenario 1: dx = 0, dy = 0 --- ';
+ destRect = {x: 0, y: 0};
+ lightPixelCheck = [[0,0], [0,99], [99,0], [99,99]];
+ grayPixelCheck = [];
+ redCheck = [];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// 2 arguments, the dest origin is not 0,0
+// The source canvas will copied to the 25,25 position of the destination canvas
+function runDrawImageTest_dX25_dY25() {
+ testDescription = 'Test scenario 2: dx = 25, dy = 25 --- ';
+ destRect = {x: 25, y: 25};
+ lightPixelCheck = [[25,25], [25,99], [99,25], [99,99]];
+ grayPixelCheck = [];
+ redCheck = [[0,0], [24,24], [0,25], [25,0], [0,99], [99,0]];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// 4 arguments, the source origin is not 0,0, the dest size is provided
+// The source canvas will copied to the 50, 50 position of the destination canvas and
+// on an area of 50x50 pixels
+function runDrawImageTest_dX50_dY50_dW50_dH50() {
+ testDescription = 'Test scenario 3: dx = 50, dy = 50, dw = 50, dh = 50 --- ';
+ destRect = {x: 50, y: 50, w: 50, h: 50};
+ lightPixelCheck = [[50,50], [99,99]];
+ grayPixelCheck = [[50,99], [99,50]];
+ redCheck = [[0,0], [49,49], [0,50], [50,0], [0,99], [99,0]];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// 4 arguments, the dest origin is not 0,0 and the dest size is provided but
+// does not match the size of the source. The image will be distorted
+// The source canvas will copied to the 50,50 position of the destination canvas
+// and it will be shrunk to a and area of 16x16
+function runDrawImageTest_dX50_dY50_dW16_dH16() {
+ testDescription = 'Test scenario 4: dx = 50, dy = 50, dw = 16, dh = 16 --- ';
+ destRect = {x: 50, y: 50, w: 16, h: 16};
+ lightPixelCheck = [[50,50], [65,65]];
+ grayPixelCheck = [[50,65], [65,50]];
+ redCheck = [[0,0], [49,49], [49,66], [66,49], [66,66], [99,99]];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// The source canvas will copied to the 50,50 position of the destination canvas
+// over an area of 64x32 pixels
+// The copied image will be distorted along the x axis
+function runDrawImageTest_dX50_dY50_dW64_dH32() {
+ testDescription = 'Test scenario 5: dx = 50, dy = 50, dw = 64, dh = 32 --- ';
+ destRect = {x: 50, y: 50, w: 64, h: 32};
+ lightPixelCheck = [[50,50], [99,81]];
+ grayPixelCheck = [[50,81], [99,50]];
+ redCheck = [[0,0], [49,49], [49,82], [99,49], [99,82], [99,99]];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// 8 arguments, both destination and source origins are 0, 0
+// An area of 32x32 pixels of the source image will be copied to
+// an area of 32x32 pixels of the destination canvas
+function runDrawImageTest_sX0_sY0_sW32_sH32_dX0_dY0_dW32_dH32() {
+ testDescription = 'Test scenario 6: sx = 0, sy = 0, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- ';
+ sourceRect = {x: 0, y: 0, w: 32, h: 32};
+ destRect = {x: 0, y: 0, w: 32, h: 32};
+ lightPixelCheck = [[0,0], [0,31], [31,0], [31,31]];
+ grayPixelCheck = [];
+ redCheck = [[0,32], [32,0], [32,32], [99,99]];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// 8 arguments the destination origin is not 0,0
+// An area of 32x32 pixels of the source image will be copied to
+// an area of 32x32 pixels of the destination canvas in the position 32,32
+function runDrawImageTest_sX0_sY0_sW32_sH32_dX32_dY32_dW32_dH32() {
+ testDescription = 'Test scenario 7: sx = 0, sy = 0, sw = 32, sh = 32, dx = 32, dy = 32, dw = 32, dh = 32 --- ';
+ sourceRect = {x: 0, y: 0, w: 32, h: 32};
+ destRect = {x: 32, y: 32, w: 32, h: 32};
+ lightPixelCheck = [[32,32], [32,63], [63,32], [63,63]];
+ grayPixelCheck = [];
+ redCheck = [[0,0], [31,31], [31,64], [64,31], [64,64], [99,99]];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// The source rectangle overflows the source image
+// The source area is clipped to fit the source image
+// and the destination are is clipped in the same proportion
+function runDrawImageTest_sX32_sY32_sW32_sH32_dX0_dY0_dW32_dH32() {
+ testDescription = 'Test scenario 8: sx = 32, sy = 32, sw = 32, sh = 32, dx = 0, dy = 0, dw = 32, dh = 32 --- ';
+ sourceRect = {x: 32, y: 32, w: 32, h: 32};
+ destRect = {x: 0, y: 0, w: 32, h: 32};
+ lightPixelCheck = [[0,0], [0,31], [31,0], [31,31]];
+ grayPixelCheck = [];
+ redCheck = [[0,32], [32,0], [32,32], [99,99]];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// The destination rectangle has negative width and height. When the source
+// rectangle is outside the source image, the source rectangle must be clipped
+// to the source image and the destination rectangle must be clipped in the same
+// proportion.
+function runDrawImageTest_sX0_sY0_sW32_sH32_dX32_dY32_dWm32_dHm32() {
+ testDescription = 'Test scenario 9: sx = 32, sy = 32, sw = 32, sh = 32, dx = 32, dy = 32, dw = -32, dh = -32 --- ';
+ sourceRect = {x: 32, y: 32, w: 32, h: 32};
+ destRect = {x: 0, y: 0, w: 32, h: 32};
+ lightPixelCheck = [[0,0], [0,31], [31,0], [31,31]];
+ grayPixelCheck = [];
+ redCheck = [[0,32], [32,0], [32,32], [99,99]];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// The destination rectangle is larger than the destination canvas.
+// When the destination rectangle is outside the destination image (the scratch bitmap),
+// the pixels that land outside the scratch bitmap are discarded,
+// as if the destination was an infinite canvas
+// whose rendering was clipped to the dimensions of the scratch bitmap.
+function runDrawImageTest_sX0_sY0_sW512_sH512_dX0_dY0_dW256_dH256() {
+ testDescription = 'Test scenario 10: sx = 0, sy = 0, sw = 512, sh = 512, dx = 0, dy = 0, dw = 256, dh = 256 --- ';
+ sourceRect = {x: 0, y: 0, w: 512, h: 512};
+ destRect = {x: 0, y: 0, w: 256, h: 256};
+ lightPixelCheck = [[0,0], [0,99], [99,0], [99,99]];
+ grayPixelCheck = [];
+ redCheck = [];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// The source rectangle is larger than the source canvas
+// The source area is clipped to fit the source image
+// and the destination area is clipped in the same proportion
+function runDrawImageTest_sX0_sY0_sW2048_sH2048_dX0_dY0_dW800_dH800() {
+ testDescription = 'Test scenario 11: sx = 0, sy = 0, sw = 2048, sh = 2048, dx = 0, dy = 0, dw = 800, dh = 800 --- ';
+ sourceRect = {x: 0, y: 0, w: 2048, h: 2048};
+ destRect = {x: 0, y: 0, w: 800, h: 800};
+ lightPixelCheck = [[0,0], [0,99], [99,0], [99,99]];
+ grayPixelCheck = [];
+ redCheck = [];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// Negative coordinates of the source rectangle
+// The source area is clipped to fit the source image
+// and the destination area is clipped in the same proportion
+function runDrawImageTest_sXm20_sYm20_sW50_sH50_dX20_dY20_dW125_dH125() {
+ testDescription = 'Test scenario 12: sx = -20, sy = -20, sw = 50, sh = 50, dx = 20, dy = 20, dw = 125, dh = 125 --- ';
+ sourceRect = {x: -20, y: -20, w: 50, h: 50};
+ destRect = {x: 20, y: 20, w: 125, h: 125};
+ lightPixelCheck = [[70,70], [70,99], [99,70], [99,99]];
+ grayPixelCheck = [];
+ redCheck = [[0,0], [0,99], [99,0], [69,69], [69, 99], [99,69]];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// The source Image doesn't have a src url defined.
+// No exception is thrown and nothing is drawn.
+function runDrawImageTestImageWithuotSource() {
+ testDescription = 'Test scenario 13: draw an image element that does not have a source --- ';
+ var sourceImage = document.createElement('img');
+ sourceRect = {x: 0, y: 0, w: 50, h: 50};
+ destRect = {x: 0, y: 0, w: 100, h: 100};
+ lightPixelCheck = [];
+ grayPixelCheck = [];
+ redCheck = [[0,0], [0,99], [99,0], [99,69]];
+ drawCustomImageOnCanvas(sourceImage, sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+// Clipping the source and down scaling to the destination
+function runDrawImageTest_sX64_sY64_sW384_sH384_dX0_dY0_dW32_dH64() {
+ testDescription = 'Test scenario 14: sx = 64, sy = 64, sw = 384, sh = 384, dx = 0, dy = 0, dw = 32, dh = 64 --- ';
+ sourceRect = {x: 64, y: 64, w: 384, h: 384};
+ destRect = {x: 0, y: 0, w: 32, h: 64};
+ lightPixelCheck = [[0,0], [15,31], [17,33], [31,63]];
+ grayPixelCheck = [[16,0], [31,31], [0, 33], [15,63]];
+ redCheck = [[0,64], [32,0], [32,64], [99,99]];
+ drawImageOnCanvas(sourceRect, destRect, lightPixelCheck, grayPixelCheck, redCheck, testDescription);
+}
+
+
+function runDrawImageTests() {
+ runDrawImageTest_dX0_dY0();
+ runDrawImageTest_dX25_dY25();
+ runDrawImageTest_dX50_dY50_dW50_dH50();
+ runDrawImageTest_dX50_dY50_dW16_dH16();
+ runDrawImageTest_dX50_dY50_dW64_dH32();
+ runDrawImageTest_sX0_sY0_sW32_sH32_dX0_dY0_dW32_dH32();
+ runDrawImageTest_sX0_sY0_sW32_sH32_dX32_dY32_dW32_dH32();
+ runDrawImageTest_sX32_sY32_sW32_sH32_dX0_dY0_dW32_dH32();
+ runDrawImageTest_sX0_sY0_sW32_sH32_dX32_dY32_dWm32_dHm32();
+ runDrawImageTest_sX0_sY0_sW512_sH512_dX0_dY0_dW256_dH256();
+ runDrawImageTest_sX0_sY0_sW2048_sH2048_dX0_dY0_dW800_dH800();
+ runDrawImageTest_sXm20_sYm20_sW50_sH50_dX20_dY20_dW125_dH125();
+ runDrawImageTestImageWithuotSource();
+ runDrawImageTest_sX64_sY64_sW384_sH384_dX0_dY0_dW32_dH64();
+}
+
+async_test(t => {
+ window.onload = function() {
+ t.step(runDrawImageTests);
+ t.done();
+ }
+}, 'Draw 100x100 image to 100x100 canvas at 0,0.');
+
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1.html
deleted file mode 100644
index b9de85a9774..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_1_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 100;
-var sourceHeight = 100;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
- // 2 arguments, the dest origin is 0,0
- // The source canvas will copied to the 0,0 position of the destination canvas
- destCtx.drawImage(sourceImg, 0, 0);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10.html
deleted file mode 100644
index 3b11b730fba..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_10_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 128;
-var sourceHeight = 128;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
-
- // The destination rectangle is larger than the destination canvas.
- // When the destination rectangle is outside the destination image (the scratch bitmap),
- // the pixels that land outside the scratch bitmap are discarded,
- // as if the destination was an infinite canvas
- // whose rendering was clipped to the dimensions of the scratch bitmap.
- destCtx.drawImage(sourceImg, 0, 0, 512, 512, 0, 0, 256, 256);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_ref.html
deleted file mode 100644
index 60545df17ff..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_10_ref.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- #destination {
- width: 100px;
- height: 100px;
- background-image: url("../2x2.png");
- }
-</style>
-<body>
-<div id="destination"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html
deleted file mode 100644
index dd1a6149bb0..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_11_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 128;
-var sourceHeight = 128;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
-
- // The source rectangle is larger than the source canvas
- // The source area is clipped to fit the source image
- // and the destination are is clipped in the same proportion
- destCtx.drawImage(sourceImg, 0, 0, 2048, 2048, 0, 0, 800, 800);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11_ref.html
deleted file mode 100644
index 10d8885f2b0..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11_ref.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- #destination {
- width: 100px;
- height: 100px;
- background-color: #FA6FF2;
- }
-</style>
-<body>
-<div id="destination" height="100" width="100"></canvas>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12.html
deleted file mode 100644
index 402a661f9f7..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_12_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 128;
-var sourceHeight = 128;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
-
- // Negative coordinates of the source rectangle
- // The source area is clipped to fit the source image
- // and the destination area is clipped in the same proportion
- destCtx.drawImage(sourceImg, -25, -25, 50, 50, 0, 0, 50, 50);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12_ref.html
deleted file mode 100644
index 5f6f22111da..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_12_ref.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- }
-
- #img {
- position: relative;
- top: 0;
- left: 0;
- width: 25px;
- height: 25px;
- background-color: #FA6FF2;
- }
-
-</style>
-<body>
-<div id="destination">
- <div id="img"><div>
-</div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13.html
deleted file mode 100644
index 1faecc32577..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_13_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 128;
-var sourceHeight = 128;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// The source Image doesn't have a src url defined
-// It should throw an exception because the HTMLImageElement is
-// in the broken state
-// https://html.spec.whatwg.org/multipage/scripting.html#check-the-usability-of-the-image-argument
-try {
- destCtx.drawImage(sourceImg, 0, 0);
- // It makes the test fail if the exception is not thrown
- destCtx.fillStyle = "#0000FF";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-}
-catch(err) {
-}
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13_ref.html
deleted file mode 100644
index 9ac306a5cc6..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_13_ref.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- }
-</style>
-<body>
-<div id="destination"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14.html
deleted file mode 100644
index 0a28aa46283..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<meta charset="utf-8">
-<title>Canvas test: 2d.drawImage.crop.2x4</title>
-<link rel="match" href="drawimage_html_image_14_ref.html">
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 256;
-var sourceHeight = 512;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x4.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
-
- destCtx.drawImage(sourceImg, 64, 64, 192, 448, 0, 0, 30, 70);
- document.documentElement.classList.remove('reftest-wait');
-}
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14_ref.html
deleted file mode 100644
index f682f87cc6f..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_14_ref.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- background-image: url("../2x4.png");
- background-position: -10px -10px;
- background-size: 40px 80px;
- background-repeat: no-repeat;
- }
-
-</style>
-<body>
-<div id="destination"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15.html
deleted file mode 100644
index 507ff31eb9d..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<meta charset="utf-8">
-<title>Canvas test: 2d.drawImage.crop.4x2</title>
-<link rel="match" href="drawimage_html_image_15_ref.html">
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 512;
-var sourceHeight = 256;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../4x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
-
- destCtx.drawImage(sourceImg, 64, 64, 448, 192, 0, 0, 70, 30);
- document.documentElement.classList.remove('reftest-wait');
-}
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15_ref.html
deleted file mode 100644
index a7abc3cb28a..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_15_ref.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- background-image: url("../4x2.png");
- background-position: -10px -10px;
- background-size: 80px 40px;
- background-repeat: no-repeat;
- }
-
-</style>
-<body>
-<div id="destination"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_ref.html
deleted file mode 100644
index 60545df17ff..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_1_ref.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- #destination {
- width: 100px;
- height: 100px;
- background-image: url("../2x2.png");
- }
-</style>
-<body>
-<div id="destination"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2.html
deleted file mode 100644
index e20ea97e2a8..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_2_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 100;
-var sourceHeight = 100;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
-
- // 2 arguments, the dest origin is not 0,0
- // The source image will copied to the 25, 25 position of the destination canvas
- destCtx.drawImage(sourceImg, 25, 25);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_ref.html
deleted file mode 100644
index c4535283500..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_2_ref.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- background-image: url("../2x2.png");
- background-position: 25px 25px;
- background-repeat: no-repeat;
- }
-</style>
-<body>
-<div id="destination"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3.html
deleted file mode 100644
index e09c2ab0015..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_3_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 100;
-var sourceHeight = 100;
-var smoothingEnabled = true;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
- // 4 arguments, the source origin is not 0,0, the dest size is provided
- // The source canvas will copied to the 50, 50 position of the destination canvas and
- // on an area of 50x50 pixels
- destCtx.drawImage(sourceImg, 50, 50, 50, 50);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_ref.html
deleted file mode 100644
index b72687a8ace..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_3_ref.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- background-image: url("../2x2.png");
- background-position: 50px 50px;
- background-repeat: no-repeat;
- background-size: 50px 50px;
- }
-</style>
-<body>
-<div id="destination"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4.html
deleted file mode 100644
index 7f029ab0a28..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_4_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 100;
-var sourceHeight = 100;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
- // 4 arguments, the dest origin is not 0,0 and the dest size is provided but
- // does not match the size of the source. The image will be distorted
- // The source canvas will copied to the 50,50 position of the destination canvas
- // and it will be shrunk to a and area of 16x16
- destCtx.drawImage(sourceImg, 50, 50, 16, 16);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_ref.html
deleted file mode 100644
index baa6591a220..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_4_ref.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- }
-
- #destination img{
- position: absolute;
- top: 50px;
- left: 50px;
- width: 16px;
- height: 16px;
- }
-</style>
-<body>
-<div id="destination">
- <img src="../2x2.png" />
-</div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5.html
deleted file mode 100644
index d221176adcb..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_5_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 100;
-var sourceHeight = 100;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
- // The source canvas will copied to the 50,50 position of the destination canvas
- // over an area of 64x32 pixels
- // The copied image will be distorted along the x axis
- destCtx.drawImage(sourceImg, 50, 50, 64, 32);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_ref.html
deleted file mode 100644
index 66b7cc194ac..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_5_ref.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- overflow: hidden;
- }
-
- #destination .img{
- position: relative;
- top: 50px;
- left: 50px;
- width: 64px;
- height: 32px;
- overflow: hidden;
- }
-
- #destination .img img{
- width: 100%;
- height: 100%;
- }
-
-</style>
-<body>
-<div id="destination">
- <div class="img">
- <img src="../2x2.png" />
- </div>
-</div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6.html
deleted file mode 100644
index a32162a4640..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_6_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 100;
-var sourceHeight = 100;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
-
- // 8 arguments, both destination and source origins are 0, 0
- // An area of 32x32 pixels of the source image will be copied to
- // an area of 32x32 pixels of the destination canvas
- destCtx.drawImage(sourceImg, 0, 0, 32, 32, 0, 0, 32, 32);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_ref.html
deleted file mode 100644
index d7343375508..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_6_ref.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- background-color: red;
- background-image: url("../2x2.png");
- background-position: -32px -32px;
- background-size: 64px 64px;
- background-repeat: no-repeat;
- }
-
-</style>
-<body>
-<div id="destination"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7.html
deleted file mode 100644
index b902df0c24d..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_7_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 100;
-var sourceHeight = 100;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
-
- // 8 arguments the destination origin is not 0,0
- // An area of 32x32 pixels of the source image will be copied to
- // an area of 32x32 pixels of the destination canvas in the position 32,32
- destCtx.drawImage(sourceImg, 0, 0, 32, 32, 32, 32, 32, 32);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_ref.html
deleted file mode 100644
index e823ffbb75a..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_7_ref.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- }
-
- #img {
- position: relative;
- top: 32px;
- left: 32px;
- width: 32px;
- height: 32px;
- background-image: url("../2x2.png");
- background-position: -32px -32px;
- background-size: 64px 64px;
- background-repeat: no-repeat;
- }
-
-</style>
-<body>
-<div id="destination">
- <div id="img"><div>
-</div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8.html
deleted file mode 100644
index 9b2301e2993..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_8_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 100;
-var sourceHeight = 100;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-sourceImg.onload = function() {
- var destCtx = destCanvas.getContext('2d');
- destCtx.fillStyle = "#FF0000";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
- destCtx.imageSmoothingEnabled = smoothingEnabled;
-
- // The source rectangle overflows the source image
- // The source area is clipped to fit the source image
- // and the destination are is clipped in the same proportion
- destCtx.drawImage(sourceImg, 32, 32, 32, 32, 0, 0, 32, 32);
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_ref.html
deleted file mode 100644
index 1a025d26d99..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_8_ref.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
-
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- }
-
- #img {
- position: relative;
- top: 0px;
- left: 0px;
- width: 32px;
- height: 32px;
- background-image: url("../2x2.png");
- background-position: -32px -32px;
- background-size: 64px 64px;
- background-repeat: no-repeat;
- }
-
-</style>
-<body>
-<div id="destination">
- <div id="img"><div>
-</div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9.html
deleted file mode 100644
index 73a872f0c55..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel=match href=drawimage_html_image_9_ref.html>
-<style>
- html, body {
- margin: 0;
- }
-</style>
-<canvas id="dest" height="100" width="100"></canvas>
-<script>
-
-var sourceWidth = 100;
-var sourceHeight = 100;
-var smoothingEnabled = false;
-var destCanvas = document.getElementById('dest');
-var sourceImg = document.createElement('img');
-sourceImg.src = '../2x2.png'
-sourceImg.width = sourceWidth;
-sourceImg.height = sourceHeight;
-
-var destCtx = destCanvas.getContext('2d');
-destCtx.fillStyle = "#FF0000";
-destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-destCtx.imageSmoothingEnabled = smoothingEnabled;
-
-// The destination rectangle has negative width and height
-// An exception is raised and nothing is drawn
-try {
- destCtx.drawImage(sourceImg, 25, 50, 50, 0, 0, -100, -100);
- // It makes the test fail if the exception is not thrown
- destCtx.fillStyle = "#0000FF";
- destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
-}
-catch(err) {
-}
-
-</script>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9_ref.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9_ref.html
deleted file mode 100644
index 5341e05c1e1..00000000000
--- a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_9_ref.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-</head>
-<style>
- html, body {
- margin: 0;
- }
- #destination {
- width: 100px;
- height: 100px;
- background-color: red;
- }
-</style>
-<body>
-<div id="destination"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html
new file mode 100644
index 00000000000..385f1a5568e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/drawing-images-to-the-canvas/drawimage_svg_image_1.html
@@ -0,0 +1,46 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="dest" height="100" width="100"></canvas>
+
+<script>
+var sourceWidth = 100;
+var sourceHeight = 100;
+var smoothingEnabled = false;
+var destCanvas = document.getElementById('dest');
+var sourceImg = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+sourceImg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', '../2x2.png');
+sourceImg.width = sourceWidth;
+sourceImg.height = sourceHeight;
+var destCtx = destCanvas.getContext('2d');
+
+function checkPixel(x, y, expected, epsilon) {
+ var actual = destCtx.getImageData(x, y, 1, 1).data;
+ assert_true(actual.length === expected.length);
+ for (var i=0; i < actual.length; i++)
+ assert_approx_equals(actual[i], expected[i], epsilon);
+}
+
+var pixelTests = [
+ ['Pixel Top Left Image', 0, 0, [253, 140, 245, 255], 1],
+ ['Pixel Top Right Image', 0, 99, [253, 140, 245, 255], 1],
+ ['Pixel Bottom Left Image', 99, 0, [253, 140, 245, 255], 1],
+ ['Pixel Bottom Right Image', 99, 99, [253, 140, 245, 255], 1],
+];
+
+function runTest() {
+ destCtx.fillStyle = "#FF0000";
+ destCtx.fillRect(0, 0, destCanvas.width, destCanvas.height);
+ destCtx.imageSmoothingEnabled = smoothingEnabled;
+ // 2 arguments, the dest origin is 0,0
+ // The source canvas will copied to the 0,0 position of the destination canvas
+ destCtx.drawImage(sourceImg, 0, 0);
+ generate_tests(checkPixel, pixelTests);
+}
+
+async_test(t => {
+ window.onload = function() {
+ t.step(runTest);
+ t.done();
+ }
+}, 'Load a 100x100 image to a SVG image and draw it to a 100x100 canvas.');
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-drawImage.html b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-drawImage.html
index 5c6904190b1..39c5ac1c3e4 100644
--- a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-drawImage.html
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-drawImage.html
@@ -37,7 +37,7 @@
promise_test(function() {
var testCanvas = document.createElement("canvas");
initializeTestCanvas(testCanvas);
- testDrawImageBitmap(testCanvas);
+ return testDrawImageBitmap(testCanvas);
}, "createImageBitmap from a HTMLCanvasElement, and drawImage on the created ImageBitmap");
promise_test(function() {
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-invalid-args.html b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-invalid-args.html
new file mode 100644
index 00000000000..a0bcf48fb6c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-invalid-args.html
@@ -0,0 +1,187 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+
+function makeCanvas() {
+ return new Promise(resolve => {
+ let canvas = document.createElement('canvas');
+ canvas.setAttribute('width', '10');
+ canvas.setAttribute('height', '10');
+ resolve(canvas);
+ });
+}
+
+function makeOffscreenCanvas() {
+ return new Promise(resolve => {
+ let canvas = new OffscreenCanvas(10, 10);
+ resolve(canvas);
+ });
+}
+
+function makeOversizedCanvas() {
+
+ return new Promise(resolve => {
+ let canvas = document.createElement('canvas');
+ canvas.setAttribute('width', '100000000');
+ canvas.setAttribute('height', '100000000');
+ resolve(canvas);
+ });
+}
+
+function makeOversizedOffscreenCanvas() {
+ return new Promise(resolve =>{
+ let canvas = new OffscreenCanvas(100000000, 100000000);
+ resolve(canvas);
+ });
+}
+
+function makeVideo() {
+ return new Promise(resolve => {
+ let video = document.createElement('video');
+ video.addEventListener('canplaythrough', resolve.bind(undefined, video), false);
+ video.src = '/media/A4.ogv';
+ });
+}
+
+function makeImage() {
+ return makeCanvas().then(canvas => {
+ let image = new Image();
+ image.src = canvas.toDataURL();
+ return new Promise(resolve => {
+ image.onload = resolve.bind(undefined, image);
+ });
+ });
+}
+
+function makeImageData() {
+ return makeCanvas().then(canvas => {
+ return new Promise(function(resolve, reject) {
+ resolve(canvas.getContext('2d').getImageData(0, 0, 10, 10));
+ });
+ });
+}
+
+function makeImageBitmap() {
+ return makeCanvas().then(canvas => {
+ return createImageBitmap(canvas);
+ });
+}
+
+function makeBlob() {
+ return makeCanvas().then(canvas => {
+ return new Promise(resolve => {
+ canvas.toBlob(resolve);
+ });
+ });
+}
+
+function makeInvalidBlob() {
+ return new Promise(resolve => {
+ resolve(new Blob()); // Blob with no data cannot be decoded.
+ });
+}
+
+imageSourceTypes = [
+ { name: 'HTMLImageElement', factory: makeImage },
+ { name: 'HTMLVideoElement', factory: makeVideo },
+ { name: 'HTMLCanvasElement', factory: makeCanvas },
+ { name: 'OffscreenCanvas', factory: makeOffscreenCanvas },
+ { name: 'ImageData', factory: makeImageData },
+ { name: 'ImageBitmap', factory: makeImageBitmap },
+ { name: 'Blob', factory: makeBlob },
+];
+
+testCases = [
+ {
+ description: 'createImageBitmap with a <sourceType> source and sw set to ' +
+ '0 rejects with a RangeError.',
+ promiseTestFunction:
+ (source, t) => {
+ return promise_rejects(t, new RangeError(),
+ createImageBitmap(source, 0, 0, 0, 10));
+ }
+ },
+ {
+ description: 'createImageBitmap with a <sourceType> source and sh set to ' +
+ '0 rejects with a RangeError.',
+ promiseTestFunction:
+ (source, t) => {
+ return promise_rejects(t, new RangeError(),
+ createImageBitmap(source, 0, 0, 10, 0));
+ }
+ },
+ {
+ // This case is not explicitly documented in the specification for
+ // createImageBitmap, but it is expected that internal failures cause
+ //
+ description: 'createImageBitmap with a <sourceType> source and oversized ' +
+ '(unallocatable) crop region rejects with an InvalidStateError ' +
+ 'DOMException.',
+ promiseTestFunction:
+ (source, t) => {
+ return promise_rejects(t, new DOMException('', 'InvalidStateError'),
+ createImageBitmap(source, 0, 0, 100000000, 100000000));
+ }
+ },
+];
+
+// Generate the test matrix for each sourceType + testCase combo.
+imageSourceTypes.forEach(imageSourceType => {
+ testCases.forEach(testCase => {
+ let description = testCase.description.replace('<sourceType>',
+ imageSourceType.name);
+ promise_test( t => {
+ return imageSourceType.factory().then(source => {
+ return testCase.promiseTestFunction(source, t);
+ });
+ }, description);
+ });
+});
+
+promise_test( t => {
+ return promise_rejects(t, new TypeError(), createImageBitmap(undefined));
+}, "createImageBitmap with undefined image source rejects with a TypeError.");
+
+promise_test( t => {
+ return promise_rejects(t, new TypeError(), createImageBitmap(null));
+}, "createImageBitmap with null image source rejects with a TypeError.");
+
+promise_test( t => {
+ return promise_rejects(t, new DOMException('', 'InvalidStateError'),
+ createImageBitmap(new Image()));
+}, "createImageBitmap with empty image source rejects with a InvalidStateError.");
+
+promise_test( t => {
+ return promise_rejects(t, new DOMException('', 'InvalidStateError'),
+ createImageBitmap(document.createElement('video')));
+}, "createImageBitmap with empty video source rejects with a InvalidStateError.");
+
+promise_test( t => {
+ return makeOversizedCanvas().then(canvas => {
+ return promise_rejects(t, new DOMException('', 'InvalidStateError'),
+ createImageBitmap(canvas));
+ });
+}, "createImageBitmap with an oversized canvas source rejects with a RangeError.");
+
+promise_test( t => {
+ return makeOversizedOffscreenCanvas().then(offscreenCanvas => {
+ return promise_rejects(t, new DOMException('', 'InvalidStateError'),
+ createImageBitmap(offscreenCanvas));
+ });
+}, "createImageBitmap with an invalid OffscreenCanvas source rejects with a RangeError.");
+
+promise_test( t => {
+ return makeInvalidBlob().then(blob => {
+ return promise_rejects(t, new DOMException('', 'InvalidStateError'),
+ createImageBitmap(blob));
+ });
+}, "createImageBitmap with an undecodable blob source rejects with an InvalidStateError.");
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html
new file mode 100644
index 00000000000..f58825cc371
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/imagebitmap/createImageBitmap-sizeOverflow.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<title>createImageBitmap with size overflow</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+promise_test(function() {
+ var imgData = new ImageData(20, 20);
+ return new Promise(function(resolve, reject) {
+ createImageBitmap(imgData, 4294967400, 10, 10, 10).then(resolve, reject);
+ });
+}, "createImageBitmap does not crash or reject the promise when passing very large sx");
+
+promise_test(function() {
+ var imgData = new ImageData(20, 20);
+ return new Promise(function(resolve, reject) {
+ createImageBitmap(imgData, 10, 4294967400, 10, 10).then(resolve, reject);
+ });
+}, "createImageBitmap does not crash or reject the promise when passing very large sy");
+
+promise_test(function() {
+ var imgData = new ImageData(20, 20);
+ return new Promise(function(resolve, reject) {
+ createImageBitmap(imgData, 10, 10, 4294967400, 10).then(resolve, reject);
+ });
+}, "createImageBitmap does not crash or reject the promise when passing very large sw");
+
+promise_test(function() {
+ var imgData = new ImageData(20, 20);
+ return new Promise(function(resolve, reject) {
+ createImageBitmap(imgData, 10, 10, 10, 4294967400).then(resolve, reject);
+ });
+}, "createImageBitmap does not crash or reject the promise when passing very large sh");
+
+promise_test(function() {
+ var imgData = new ImageData(20, 20);
+ return new Promise(function(resolve, reject) {
+ createImageBitmap(imgData, 4294967400, 4294967400, 4294967400, 4294967400).then(resolve, reject);
+ });
+}, "createImageBitmap does not crash or reject the promise when passing very large sx, sy, sw and sh");
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/text-styles/2d.text.font.parse.tiny.html b/tests/wpt/web-platform-tests/2dcontext/text-styles/2d.text.font.parse.tiny.html
new file mode 100644
index 00000000000..f668e8a4ccf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/2dcontext/text-styles/2d.text.font.parse.tiny.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by tools/gentest.py. -->
+<title>Canvas test: 2d.text.font.parse.tiny</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.text.font.parse.tiny</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>
+
+<ul id="d"></ul>
+<script>
+var t = async_test("");
+_addTest(function(canvas, ctx) {
+
+ctx.font = '1px sans-serif';
+_assertSame(ctx.font, '1px sans-serif', "ctx.font", "'1px sans-serif'");
+
+
+});
+</script>
+
diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/current-work-canvas.xhtml b/tests/wpt/web-platform-tests/2dcontext/tools/current-work-canvas.xhtml
index b41ad7d4d62..1baf354028c 100644
--- a/tests/wpt/web-platform-tests/2dcontext/tools/current-work-canvas.xhtml
+++ b/tests/wpt/web-platform-tests/2dcontext/tools/current-work-canvas.xhtml
@@ -1,42 +1,67 @@
-<?xml version="1.0" encoding="UTF-8"?><html xml:lang="en-US-x-hixie" xmlns="http://www.w3.org/1999/xhtml"><head><title>HTML Standard</title><link href="http://www.whatwg.org/style/specification" rel="stylesheet"/><link href="http://www.whatwg.org/images/icon" rel="icon"/><style>
- .proposal { border: blue solid; padding: 1em; }
- .bad, .bad *:not(.XXX) { color: gray; border-color: gray; background: transparent; }
- #updatesStatus { display: none; }
- #updatesStatus.relevant { display: block; position: fixed; right: 1em; top: 1em; padding: 0.5em; font: bold small sans-serif; min-width: 25em; width: 30%; max-width: 40em; height: auto; border: ridge 4px gray; background: #EEEEEE; color: black; }
- div.head .logo { width: 11em; margin-bottom: 20em; }
- #configUI { position: absolute; z-index: 20; top: 10em; right: 0; width: 11em; padding: 0 0.5em 0 0.5em; font-size: small; background: gray; background: rgba(32,32,32,0.9); color: white; border-radius: 1em 0 0 1em; -moz-border-radius: 1em 0 0 1em; }
- #configUI p { margin: 0.75em 0; padding: 0.3em; }
- #configUI p label { display: block; }
- #configUI #updateUI, #configUI .loginUI { text-align: center; }
- #configUI input[type=button] { display: block; margin: auto; }
- #configUI :link, #configUI :visited { color: white; }
- #configUI :link:hover, #configUI :visited:hover { background: transparent; }
- #reviewer { position: fixed; bottom: 0; right: 0; padding: 0.15em 0.25em 0em 0.5em; white-space: nowrap; overflow: hidden; z-index: 30; background: gray; background: rgba(32,32,32,0.9); color: white; border-radius: 1em 0 0 0; -moz-border-radius: 1em 0 0 0; max-width: 90%; }
- #reviewer input { max-width: 50%; }
- #reviewer * { font-size: small; }
- #reviewer.off &gt; :not(:first-child) { display: none; }
- #alert { position: fixed; top: 20%; left: 20%; right: 20%; font-size: 2em; padding: 0.5em; z-index: 40; background: gray; background: rgba(32,32,32,0.9); color: white; border-radius: 1em; -moz-border-radius: 1em; -webkit-transition: opacity 1s linear; }
- #alert.closed { opacity: 0; }
- #alert button { position: absolute; top: -1em; right: 2em; border-radius: 1em 1em 0 0; border: none; line-height: 0.9; color: white; background: rgb(64,64,64); font-size: 0.6em; font-weight: 900; cursor: pointer; }
- #alert :link, #alert :visited { color: white; }
- #alert :link:hover, #alert :visited:hover { background: transparent; }
- @media print { #configUI { display: none; } }
- .rfc2119 { font-variant: small-caps; text-shadow: 0 0 0.5em yellow; position: static; }
- .rfc2119::after { position: absolute; left: 0; width: 25px; text-align: center; color: yellow; text-shadow: 0.075em 0.075em 0.2em black; }
- .rfc2119.m\ust::after { content: '\2605'; }
- .rfc2119.s\hould::after { content: '\2606'; }
+<?xml version="1.0" encoding="UTF-8"?><html class="split" lang="en-US-x-hixie" xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="utf-8"/><meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"/><title>HTML Standard</title><meta content="#3c790a" name="theme-color"/><link href="https://resources.whatwg.org/standard.css" rel="stylesheet"/><link href="https://resources.whatwg.org/logo.svg" rel="icon"/><style>
+ .status { min-height: 0.6em; font: 1em sans-serif; width: 9em; padding: 0.3em; position: absolute; z-index: 8; right: 0.3em; background: #EEE; color: black; box-shadow: 0 0 3px #999; overflow: hidden; margin: -2em 0 0 0; border-collapse: initial; border-spacing: initial; }
+ .status:hover { z-index: 9; }
+ .status:focus-within { z-index: 9; }
+ .status.wrapped &gt; :not(input) { display: none; }
+ .status &gt; input { position: absolute; left: 0; top: 0; width: 1em; height: 1em; border: none; background: transparent; padding: 0; margin: 0; }
+ .status &gt; p { font-size: 0.6em; margin: 0; padding: 0; }
+ .status &gt; p + p { padding-top: 0.5em; }
+ .status &gt; p &gt; strong { margin-left: 1.5em; }
+ .status &gt; .support { display: block; }
+ .status &gt; .support &gt; span { padding: 0.2em 0; display: block; display: table; }
+ .status &gt; .support &gt; span.partial { color: #666666; filter: grayscale(50%); }
+ .status &gt; .support &gt; span.no { color: #CCCCCC; filter: grayscale(100%); }
+ .status &gt; .support &gt; span.no::before { opacity: 0.5; }
+ .status &gt; .support &gt; span:first-of-type { padding-top: 0.5em; }
+ .status &gt; .support &gt; span &gt; span { padding: 0 0.5em; display: table-cell; vertical-align: top; }
+ .status &gt; .support &gt; span &gt; span:first-child { width: 100%; }
+ .status &gt; .support &gt; span &gt; span:last-child { width: 100%; white-space: pre; padding: 0; }
+ .status &gt; .support &gt; span::before { content: ' '; display: table-cell; min-width: 1.5em; height: 1.5em; background: no-repeat center center; background-size: contain; text-align: right; font-size: 0.75em; font-weight: bold; }
+ .status &gt; .support &gt; .and_chr::before { background-image: url(https://resources.whatwg.org/browser-logos/chrome.svg); }
+ .status &gt; .support &gt; .and_ff::before { background-image: url(https://resources.whatwg.org/browser-logos/firefox.png); }
+ .status &gt; .support &gt; .and_uc::before { background-image: url(https://resources.whatwg.org/browser-logos/uc.png); } /* UC Browser for Android */
+ .status &gt; .support &gt; .android::before { background-image: url(https://resources.whatwg.org/browser-logos/android.svg); }
+ .status &gt; .support &gt; .bb::before { background-image: url(https://resources.whatwg.org/browser-logos/bb.jpg); } /* Blackberry Browser */
+ .status &gt; .support &gt; .chrome::before { background-image: url(https://resources.whatwg.org/browser-logos/chrome.svg); }
+ .status &gt; .support &gt; .edge::before { background-image: url(https://resources.whatwg.org/browser-logos/edge.svg); }
+ .status &gt; .support &gt; .firefox::before { background-image: url(https://resources.whatwg.org/browser-logos/firefox.png); }
+ .status &gt; .support &gt; .ie::before { background-image: url(https://resources.whatwg.org/browser-logos/ie.png); }
+ .status &gt; .support &gt; .ie_mob::before { background-image: url(https://resources.whatwg.org/browser-logos/ie-mobile.svg); }
+ .status &gt; .support &gt; .ios_saf::before { background-image: url(https://resources.whatwg.org/browser-logos/safari-ios.svg); }
+ .status &gt; .support &gt; .op_mini::before { background-image: url(https://resources.whatwg.org/browser-logos/opera-mini.png); }
+ .status &gt; .support &gt; .op_mob::before { background-image: url(https://resources.whatwg.org/browser-logos/opera.png); }
+ .status &gt; .support &gt; .opera::before { background-image: url(https://resources.whatwg.org/browser-logos/opera.png); }
+ .status &gt; .support &gt; .safari::before { background-image: url(https://resources.whatwg.org/browser-logos/safari.png); }
+ .status &gt; .support &gt; .samsung::before { background-image: url(https://resources.whatwg.org/browser-logos/samsung.png); }
+ .status &gt; .caniuse { text-align: right; font-style: italic; width: 100%; }
+ .status &gt; .caniuse + p { margin-top: 0.5em; border-top: 1px solid silver; }
+
+ @media (max-width: 767px) {
+ .status { right: -9em; }
+ }
+ </style><style>
[hidden] { display: none; }
- </style><style type="text/css">
+
+ .bad, .bad *:not(.X\58X) { color: gray; border-color: gray; background: transparent; }
+
+ .fingerprint { position: absolute; right: 0; z-index: 5; }
+ @media (max-width: 767px) {
+ .fingerprint { max-width: 35px; }
+ }
+
+ .applies .yes, .yesno .yes { background: yellow; }
+ .yesno .yes, .yesno .no { text-align: center; }
.applies thead th &gt; * { display: block; }
.applies thead code { display: block; }
- .applies tbody th { whitespace: nowrap; }
.applies td { text-align: center; }
- .applies .yes { background: yellow; }
.matrix, .matrix td { border: hidden; text-align: right; }
.matrix { margin-left: 2em; }
+ .vertical-summary-table tr &gt; th[rowspan=&quot;2&quot;]:first-child + th,
+ .vertical-summary-table tr &gt; td[rowspan=&quot;2&quot;]:first-child + td { border-bottom: hidden; }
+
.dice-example { border-collapse: collapse; border-style: hidden solid solid hidden; border-width: thin; margin-left: 3em; }
.dice-example caption { width: 30em; font-size: smaller; font-style: italic; padding: 0.75em 0; text-align: left; }
.dice-example td, .dice-example th { border: solid thin; width: 1.35em; height: 1.05em; text-align: center; padding: 0; }
@@ -44,7 +69,6 @@
td.eg { border-width: thin; text-align: center; }
#table-example-1 { border: solid thin; border-collapse: collapse; margin-left: 3em; }
- #table-example-1 * { font-family: &quot;Essays1743&quot;, serif; line-height: 1.01em; }
#table-example-1 caption { padding-bottom: 0.5em; }
#table-example-1 thead, #table-example-1 tbody { border: none; }
#table-example-1 th, #table-example-1 td { border: solid thin; }
@@ -73,25 +97,13 @@
.apple-table-examples.e2 th[scope=row] { padding-left: 1em; }
.apple-table-examples sup { line-height: 0; }
+ .three-column-nowrap tr &gt; td:first-child,
+ .three-column-nowrap tr &gt; td:first-child + td,
+ .three-column-nowrap tr &gt; td:first-child + td + td { white-space: nowrap; }
+
.details-example img { vertical-align: top; }
- #base64-table {
- white-space: nowrap;
- font-size: 0.6em;
- column-width: 6em;
- column-count: 5;
- column-gap: 1em;
- -moz-column-width: 6em;
- -moz-column-count: 5;
- -moz-column-gap: 1em;
- -webkit-column-width: 6em;
- -webkit-column-count: 5;
- -webkit-column-gap: 1em;
- }
- #base64-table thead { display: none; }
- #base64-table * { border: none; }
- #base64-table tbody td:first-child:after { content: ':'; }
- #base64-table tbody td:last-child { text-align: right; }
+ .parse-error-table td &gt; p:first-child { margin-top: 0; }
#named-character-references-table {
white-space: nowrap;
@@ -110,3220 +122,3178 @@
.glyph.control { color: red; }
+ #table-example-1 * { font-family: &quot;Essays1743&quot;, serif; line-height: 1.01em; }
@font-face {
font-family: 'Essays1743';
- src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743.ttf');
+ src: url('/fonts/Essays1743.ttf');
}
@font-face {
font-family: 'Essays1743';
font-weight: bold;
- src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-Bold.ttf');
+ src: url('/fonts/Essays1743-Bold.ttf');
}
@font-face {
font-family: 'Essays1743';
font-style: italic;
- src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-Italic.ttf');
+ src: url('/fonts/Essays1743-Italic.ttf');
}
@font-face {
font-family: 'Essays1743';
font-style: italic;
font-weight: bold;
- src: url('http://www.whatwg.org/specs/web-apps/current-work/fonts/Essays1743-BoldItalic.ttf');
+ src: url('/fonts/Essays1743-BoldItalic.ttf');
}
- </style><style>
- .domintro:before { display: table; margin: -1em -0.5em -0.5em auto; width: auto; content: 'This box is non-normative. Implementation requirements are given below this box.'; color: black; font-style: italic; border: solid 2px; background: white; padding: 0 0.25em; }
- </style><link href="data:text/css," id="complete" rel="stylesheet" title="Complete specification"/><link href="data:text/css,.impl%20{%20display:%20none;%20}%0Ahtml%20{%20border:%20solid%20yellow;%20}%20.domintro:before%20{%20display:%20none;%20}" id="author" rel="alternate stylesheet" title="Author documentation only"/><link href="data:text/css,.impl%20{%20background:%20%23FFEEEE;%20}%20.domintro:before%20{%20background:%20%23FFEEEE;%20}" id="highlight" rel="alternate stylesheet" title="Highlight implementation requirements"/><link href="http://www.whatwg.org/specs/web-apps/current-work/status.css" rel="stylesheet"/></head><body class="draft" onload="init()"><header class="head" id="head"><p><a class="logo" href="http://www.whatwg.org/"><img alt="WHATWG" height="101" src="http://www.whatwg.org/images/logo" width="101"/></a></p>
- <hgroup><h1 class="allcaps">HTML</h1>
- <h2 class="no-num no-toc">Living Standard — Last Updated 8 August 2011</h2>
- </hgroup><p class="copyright">© Copyright 2004-2011 Apple Computer, Inc.,
- Mozilla Foundation, and Opera Software ASA.</p>
- <p class="copyright">You are granted a license to use, reproduce
- and create derivative works of this document.</p>
-
- </header><h4 id="the-canvas-element"><span class="secno">4.8.11 </span>The <dfn id="canvas"><code>canvas</code></dfn> element</h4>
-
- <dl class="element"><dt>Categories</dt>
- <dd><a href="#flow-content">Flow content</a>.</dd>
- <dd><a href="#phrasing-content">Phrasing content</a>.</dd>
- <dd><a href="#embedded-content">Embedded content</a>.</dd>
- <dt>Contexts in which this element can be used:</dt>
- <dd>Where <a href="#embedded-content">embedded content</a> is expected.</dd>
- <dt>Content model:</dt>
- <dd><a href="#transparent">Transparent</a>.</dd>
- <dd><a href="#transparent">Transparent</a><!--
---><!--FORK--><!--
--->, but with no <a href="#interactive-content">interactive content</a> descendants except for <code><a href="#the-a-element">a</a></code> elements, <code><a href="#the-button-element">button</a></code> elements, <code><a href="#the-input-element">input</a></code> elements whose <code title="attr-input-type"><a href="#attr-input-type">type</a></code> attribute are in the <a href="#checkbox-state" title="attr-input-type-checkbox">Checkbox</a> or <a href="#radio-button-state" title="attr-input-type-radio">Radio Button</a> states, and <code><a href="#the-input-element">input</a></code> elements that are <a href="#concept-button" title="concept-button">buttons</a><!--
---><!--FORK--><!--
--->.</dd> <!-- and maybe <select>, I guess? I've left it in for now, since I guess authors might make accessible selects if they're simple enough, and it's not obvious how to distinguish the simple ones from the complex ones... -->
- <dt>Content attributes:</dt>
- <dd><a href="#global-attributes">Global attributes</a></dd>
- <dd><code title="attr-canvas-width"><a href="#attr-canvas-width">width</a></code></dd>
- <dd><code title="attr-canvas-height"><a href="#attr-canvas-height">height</a></code></dd>
- <dt>DOM interface:</dt>
- <dd>
- <pre class="idl">interface <dfn id="htmlcanvaselement">HTMLCanvasElement</dfn> : <a href="#htmlelement">HTMLElement</a> {
- attribute unsigned long <a href="#dom-canvas-width" title="dom-canvas-width">width</a>;
- attribute unsigned long <a href="#dom-canvas-height" title="dom-canvas-height">height</a>;
-
- DOMString <a href="#dom-canvas-todataurl" title="dom-canvas-toDataURL">toDataURL</a>(in optional DOMString type, in any... args);
- void <a href="#dom-canvas-toblob" title="dom-canvas-toBlob">toBlob</a>(in <span>FileCallback</span>? callback, in optional DOMString type, in any... args);
-
- object? <a href="#dom-canvas-getcontext" title="dom-canvas-getContext">getContext</a>(in DOMString contextId, in any... args);
-};</pre>
- </dd>
- </dl><p>The <code><a href="#the-canvas-element">canvas</a></code> element provides scripts with a
- resolution-dependent bitmap canvas, which can be used for rendering
- graphs, game graphics, or other visual images on the fly.</p>
-
- <p>Authors should not use the <code><a href="#the-canvas-element">canvas</a></code> element in a
- document when a more suitable element is available. For example, it
- is inappropriate to use a <code><a href="#the-canvas-element">canvas</a></code> element to render a
- page heading: if the desired presentation of the heading is
- graphically intense, it should be marked up using appropriate
- elements (typically <code><a href="#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements">h1</a></code>) and then styled using CSS and
- supporting technologies such as XBL.</p>
-
- <p>When authors use the <code><a href="#the-canvas-element">canvas</a></code> element, they must also
- provide content that, when presented to the user, conveys
- essentially the same function or purpose as the bitmap canvas. This
- content may be placed as content of the <code><a href="#the-canvas-element">canvas</a></code>
- element. The contents of the <code><a href="#the-canvas-element">canvas</a></code> element, if any,
- are the element's <a href="#fallback-content">fallback content</a>.</p>
-
- <p>In interactive visual media, if <a href="#concept-n-script" title="concept-n-script">scripting is enabled</a> for the
- <code><a href="#the-canvas-element">canvas</a></code> element, and if support for <code><a href="#the-canvas-element">canvas</a></code>
- elements has been enabled, the <code><a href="#the-canvas-element">canvas</a></code> element
- <a href="#represents">represents</a> <a href="#embedded-content">embedded content</a> consisting of
- a dynamically created image.</p>
-
- <p>In non-interactive, static, visual media, if the
- <code><a href="#the-canvas-element">canvas</a></code> element has been previously painted on (e.g. if
- the page was viewed in an interactive visual medium and is now being
- printed, or if some script that ran during the page layout process
- painted on the element), then the <code><a href="#the-canvas-element">canvas</a></code> element
- <a href="#represents">represents</a> <a href="#embedded-content">embedded content</a> with the
- current image and size. Otherwise, the element represents its
- <a href="#fallback-content">fallback content</a> instead.</p>
-
- <p>In non-visual media, and in visual media if <a href="#concept-n-noscript" title="concept-n-noscript">scripting is disabled</a> for the
- <code><a href="#the-canvas-element">canvas</a></code> element or if support for <code><a href="#the-canvas-element">canvas</a></code>
- elements has been disabled, the <code><a href="#the-canvas-element">canvas</a></code> element
- <a href="#represents">represents</a> its <a href="#fallback-content">fallback content</a>
- instead.</p>
+ @media (max-width: 767px) {
+ #abstractimg { width: 100%; }
+ }
+ #abstractimg, #abstractimg text { font: inherit; }
+ #abstractimg rect { fill: #424242; }
+ #abstractimg text { fill: #ffffff; font-size: 18px }
+ #abstractimg .top { word-spacing: 50px; text-anchor: middle; }
+ #abstractimg .left, #abstractimg .bottom { word-spacing: 12px; }
+ #abstractimg .right { font-size: 25px; }
+ </style></head><body><header class="head with-buttons" id="head">
+ <a class="logo" href="https://whatwg.org/"><img alt="WHATWG" height="100" src="https://resources.whatwg.org/logo.svg" width="100"/></a>
+ <hgroup><h1 class="allcaps">HTML</h1><h2 class="no-num no-toc" id="living-standard">Living Standard — Last Updated <span class="pubdate">31 August 2017</span></h2></hgroup>
+
+
+
+
+ <p class="copyright">Parts of this specification are © Copyright 2004-2014 Apple Inc., Mozilla Foundation, and Opera Software ASA. You are granted a license to use, reproduce and create derivative works of this document.</p></header><h4 id="the-canvas-element"><span class="secno">4.12.5</span> The <dfn id="canvas"><code>canvas</code></dfn> element<a class="self-link" href="#the-canvas-element"/></h4><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="support"><strong>Support:</strong> canvas<span class="and_chr yes"><span>Chrome for Android</span> <span>59+</span></span><span class="chrome yes"><span>Chrome</span> <span>4+</span></span><span class="and_uc yes"><span>UC Browser for Android</span> <span>11.4+</span></span><span class="ios_saf yes"><span>iOS Safari</span> <span>3.2+</span></span><span class="firefox yes"><span>Firefox</span> <span>3.6+</span></span><span class="ie yes"><span>IE</span> <span>9+</span></span><span class="samsung yes"><span>Samsung Internet</span> <span>4+</span></span><span class="op_mini partial"><span>Opera Mini (limited)</span> <span>all+</span></span><span class="safari yes"><span>Safari</span> <span>4+</span></span><span class="android yes"><span>Android Browser</span> <span>3+</span></span><span class="opera yes"><span>Opera</span> <span>9+</span></span><span class="edge yes"><span>Edge</span> <span>12+</span></span></p><p class="caniuse">Source: <a href="https://caniuse.com/#feat=canvas">caniuse.com</a></p></div>
+
+ <dl class="element"><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-categories" id="the-canvas-element:concept-element-categories">Categories</a>:</dt><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#flow-content-2" id="the-canvas-element:flow-content-2">Flow content</a>.</dd><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#phrasing-content-2" id="the-canvas-element:phrasing-content-2">Phrasing content</a>.</dd><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category">Embedded content</a>.</dd><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#palpable-content-2" id="the-canvas-element:palpable-content-2">Palpable content</a>.</dd><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-contexts" id="the-canvas-element:concept-element-contexts">Contexts in which this element can be used</a>:</dt><dd>Where <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-2">embedded content</a> is expected.</dd><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-content-model" id="the-canvas-element:concept-element-content-model">Content model</a>:</dt><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#transparent" id="the-canvas-element:transparent">Transparent</a>, but with no <a href="https://html.spec.whatwg.org/multipage/dom.html#interactive-content-2" id="the-canvas-element:interactive-content-2">interactive content</a> descendants except
+ for <code id="the-canvas-element:the-a-element"><a href="https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element">a</a></code> elements, <code id="the-canvas-element:the-img-element"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> elements with
+ <code id="the-canvas-element:attr-hyperlink-usemap"><a href="https://html.spec.whatwg.org/multipage/image-maps.html#attr-hyperlink-usemap">usemap</a></code> attributes, <code id="the-canvas-element:the-button-element"><a href="https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element">button</a></code> elements,
+ <code id="the-canvas-element:the-input-element"><a href="https://html.spec.whatwg.org/multipage/input.html#the-input-element">input</a></code> elements whose <code id="the-canvas-element:attr-input-type"><a href="https://html.spec.whatwg.org/multipage/input.html#attr-input-type">type</a></code> attribute are in
+ the <a href="https://html.spec.whatwg.org/multipage/input.html#checkbox-state-(type=checkbox)" id="the-canvas-element:checkbox-state-(type=checkbox)">Checkbox</a> or <a href="https://html.spec.whatwg.org/multipage/input.html#radio-button-state-(type=radio)" id="the-canvas-element:radio-button-state-(type=radio)">Radio Button</a> states, <code id="the-canvas-element:the-input-element-2"><a href="https://html.spec.whatwg.org/multipage/input.html#the-input-element">input</a></code> elements that are
+ <a href="https://html.spec.whatwg.org/multipage/forms.html#concept-button" id="the-canvas-element:concept-button">buttons</a>, <code id="the-canvas-element:the-select-element"><a href="https://html.spec.whatwg.org/multipage/form-elements.html#the-select-element">select</a></code> elements with a <code id="the-canvas-element:attr-select-multiple"><a href="https://html.spec.whatwg.org/multipage/form-elements.html#attr-select-multiple">multiple</a></code> attribute or a <a href="https://html.spec.whatwg.org/multipage/form-elements.html#concept-select-size" id="the-canvas-element:concept-select-size">display size</a> greater than 1, and elements that would not be
+ <a href="https://html.spec.whatwg.org/multipage/dom.html#interactive-content-2" id="the-canvas-element:interactive-content-2-2">interactive content</a> except for having the <code id="the-canvas-element:attr-tabindex"><a href="https://html.spec.whatwg.org/multipage/interaction.html#attr-tabindex">tabindex</a></code> attribute specified.</dd><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-tag-omission" id="the-canvas-element:concept-element-tag-omission">Tag omission in text/html</a>:</dt><dd>Neither tag is omissible.</dd><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-attributes" id="the-canvas-element:concept-element-attributes">Content attributes</a>:</dt><dd><a href="https://html.spec.whatwg.org/multipage/dom.html#global-attributes" id="the-canvas-element:global-attributes">Global attributes</a></dd><dd><code id="the-canvas-element:attr-canvas-width"><a href="#attr-canvas-width">width</a></code> — Horizontal dimension</dd><dd><code id="the-canvas-element:attr-canvas-height"><a href="#attr-canvas-height">height</a></code> — Vertical dimension</dd><dt><a href="https://html.spec.whatwg.org/multipage/dom.html#concept-element-dom" id="the-canvas-element:concept-element-dom">DOM interface</a>:</dt><dd>
+ <pre class="idl">typedef (<a href="#canvasrenderingcontext2d" id="the-canvas-element:canvasrenderingcontext2d">CanvasRenderingContext2D</a> or <a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext" id="the-canvas-element:webglrenderingcontext">WebGLRenderingContext</a>) <dfn id="renderingcontext">RenderingContext</dfn>;
+
+[Exposed=Window,
+ <a href="https://html.spec.whatwg.org/multipage/dom.html#htmlconstructor" id="the-canvas-element:htmlconstructor">HTMLConstructor</a>]
+interface <dfn id="htmlcanvaselement">HTMLCanvasElement</dfn> : <a href="https://html.spec.whatwg.org/multipage/dom.html#htmlelement" id="the-canvas-element:htmlelement">HTMLElement</a> {
+ [<a href="https://html.spec.whatwg.org/multipage/custom-elements.html#cereactions" id="the-canvas-element:cereactions">CEReactions</a>] attribute unsigned long <a href="#dom-canvas-width" id="the-canvas-element:dom-canvas-width">width</a>;
+ [<a href="https://html.spec.whatwg.org/multipage/custom-elements.html#cereactions" id="the-canvas-element:cereactions-2">CEReactions</a>] attribute unsigned long <a href="#dom-canvas-height" id="the-canvas-element:dom-canvas-height">height</a>;
+
+ <a href="#renderingcontext" id="the-canvas-element:renderingcontext">RenderingContext</a>? <a href="#dom-canvas-getcontext-2" id="the-canvas-element:dom-canvas-getcontext-2">getContext</a>(DOMString contextId, any... arguments);
+
+ USVString <a href="#dom-canvas-todataurl-2" id="the-canvas-element:dom-canvas-todataurl-2">toDataURL</a>(optional DOMString type, optional any quality);
+ void <a href="#dom-canvas-toblob-2" id="the-canvas-element:dom-canvas-toblob-2">toBlob</a>(<a href="#blobcallback" id="the-canvas-element:blobcallback">BlobCallback</a> _callback, optional DOMString type, optional any quality);
+ <a href="#offscreencanvas" id="the-canvas-element:offscreencanvas">OffscreenCanvas</a> <a href="#dom-canvas-transfercontroltooffscreen-2" id="the-canvas-element:dom-canvas-transfercontroltooffscreen-2">transferControlToOffscreen</a>();
+};
- <!-- CANVAS-FOCUS-FALLBACK -->
- <p>When a <code><a href="#the-canvas-element">canvas</a></code> element <a href="#represents">represents</a>
- <a href="#embedded-content">embedded content</a>, the user can still focus descendants
- of the <code><a href="#the-canvas-element">canvas</a></code> element (in the <a href="#fallback-content">fallback
- content</a>). When an element is focused, it is the target of
- keyboard interaction events (even though the element itself is not
- visible). This allows authors to make an interactive canvas
- keyboard-accessible: authors should have a one-to-one mapping of
- interactive regions to focusable elements in the <a href="#fallback-content">fallback
- content</a>. (Focus has no effect on mouse interaction
- events.) <a href="#DOMEVENTS">[DOMEVENTS]</a></p>
-
- <p>The <code><a href="#the-canvas-element">canvas</a></code> element has two attributes to control the
- size of the coordinate space: <dfn id="attr-canvas-width" title="attr-canvas-width"><code>width</code></dfn> and <dfn id="attr-canvas-height" title="attr-canvas-height"><code>height</code></dfn>. These
- attributes, when specified, must have values that are <a href="#valid-non-negative-integer" title="valid non-negative integer">valid non-negative
- integers</a>. <span class="impl">The <a href="#rules-for-parsing-non-negative-integers">rules for parsing
- non-negative integers</a> must be used to obtain their numeric
- values. If an attribute is missing, or if parsing its value returns
- an error, then the default value must be used instead.</span> The
- <code title="attr-canvas-width"><a href="#attr-canvas-width">width</a></code> attribute defaults to
- 300, and the <code title="attr-canvas-height"><a href="#attr-canvas-height">height</a></code>
- attribute defaults to 150.</p>
-
- <p>The intrinsic dimensions of the <code><a href="#the-canvas-element">canvas</a></code> element equal
- the size of the coordinate space, with the numbers interpreted in
- CSS pixels. However, the element can be sized arbitrarily by a
- style sheet. During rendering, the image is scaled to fit this layout
- size.</p>
-
- <div class="impl">
-
- <p>The size of the coordinate space does not necessarily represent
- the size of the actual bitmap that the user agent will use
- internally or during rendering. On high-definition displays, for
- instance, the user agent may internally use a bitmap with two device
- pixels per unit in the coordinate space, so that the rendering
- remains at high quality throughout.</p>
-
- <p>When the <code><a href="#the-canvas-element">canvas</a></code> element is created, and subsequently
- whenever the <code title="attr-canvas-width"><a href="#attr-canvas-width">width</a></code> and <code title="attr-canvas-height"><a href="#attr-canvas-height">height</a></code> attributes are set (whether
- to a new value or to the previous value), the bitmap and any
- associated contexts must be cleared back to their initial state and
- reinitialized with the newly specified coordinate space
- dimensions.</p>
-
- <p>When the canvas is initialized, its bitmap must be cleared to
- transparent black.</p>
-
- <p>The <dfn id="dom-canvas-width" title="dom-canvas-width"><code>width</code></dfn> and
- <dfn id="dom-canvas-height" title="dom-canvas-height"><code>height</code></dfn> IDL
- attributes must <a href="#reflect">reflect</a> the respective content
- attributes of the same name, with the same defaults.</p>
+callback <dfn id="blobcallback">BlobCallback</dfn> = void (<a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob" id="the-canvas-element:blob">Blob</a>? blob);</pre>
+ </dd></dl>
+
+ <p>The <code id="the-canvas-element:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element provides scripts with a resolution-dependent bitmap canvas,
+ which can be used for rendering graphs, game graphics, art, or other visual images on the fly.</p>
+
+ <p>Authors should not use the <code id="the-canvas-element:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element in a document when a more suitable
+ element is available. For example, it is inappropriate to use a <code id="the-canvas-element:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element to
+ render a page heading: if the desired presentation of the heading is graphically intense, it
+ should be marked up using appropriate elements (typically <code id="the-canvas-element:the-h1,-h2,-h3,-h4,-h5,-and-h6-elements"><a href="https://html.spec.whatwg.org/multipage/sections.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements">h1</a></code>) and then styled using
+ CSS and supporting technologies such as Web Components.</p>
+
+ <p>When authors use the <code id="the-canvas-element:the-canvas-element-4"><a href="#the-canvas-element">canvas</a></code> element, they must also provide content that, when
+ presented to the user, conveys essentially the same function or purpose as the
+ <code id="the-canvas-element:the-canvas-element-5"><a href="#the-canvas-element">canvas</a></code>'s bitmap. This content may be placed as content of the <code id="the-canvas-element:the-canvas-element-6"><a href="#the-canvas-element">canvas</a></code>
+ element. The contents of the <code id="the-canvas-element:the-canvas-element-7"><a href="#the-canvas-element">canvas</a></code> element, if any, are the element's <a href="https://html.spec.whatwg.org/multipage/dom.html#fallback-content" id="the-canvas-element:fallback-content">fallback
+ content</a>.</p>
+
+ <hr/>
+
+ <p>In interactive visual media, if <a href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-n-script" id="the-canvas-element:concept-n-script">scripting is enabled</a> for
+ the <code id="the-canvas-element:the-canvas-element-8"><a href="#the-canvas-element">canvas</a></code> element, and if support for <code id="the-canvas-element:the-canvas-element-9"><a href="#the-canvas-element">canvas</a></code> elements has been enabled,
+ then the <code id="the-canvas-element:the-canvas-element-10"><a href="#the-canvas-element">canvas</a></code> element <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents">represents</a> <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-3">embedded content</a>
+ consisting of a dynamically created image, the element's bitmap.</p>
+
+ <p>In non-interactive, static, visual media, if the <code id="the-canvas-element:the-canvas-element-11"><a href="#the-canvas-element">canvas</a></code> element has been
+ previously associated with a rendering context (e.g. if the page was viewed in an interactive
+ visual medium and is now being printed, or if some script that ran during the page layout process
+ painted on the element), then the <code id="the-canvas-element:the-canvas-element-12"><a href="#the-canvas-element">canvas</a></code> element <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents-2">represents</a>
+ <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-4">embedded content</a> with the element's current bitmap and size. Otherwise, the element
+ represents its <a href="https://html.spec.whatwg.org/multipage/dom.html#fallback-content" id="the-canvas-element:fallback-content-2">fallback content</a> instead.</p>
+
+ <p>In non-visual media, and in visual media if <a href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-n-noscript" id="the-canvas-element:concept-n-noscript">scripting is
+ disabled</a> for the <code id="the-canvas-element:the-canvas-element-13"><a href="#the-canvas-element">canvas</a></code> element or if support for <code id="the-canvas-element:the-canvas-element-14"><a href="#the-canvas-element">canvas</a></code> elements
+ has been disabled, the <code id="the-canvas-element:the-canvas-element-15"><a href="#the-canvas-element">canvas</a></code> element <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents-3">represents</a> its <a href="https://html.spec.whatwg.org/multipage/dom.html#fallback-content" id="the-canvas-element:fallback-content-3">fallback
+ content</a> instead.</p>
+
+
+ <p>When a <code id="the-canvas-element:the-canvas-element-16"><a href="#the-canvas-element">canvas</a></code> element <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents-4">represents</a> <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-5">embedded content</a>, the
+ user can still focus descendants of the <code id="the-canvas-element:the-canvas-element-17"><a href="#the-canvas-element">canvas</a></code> element (in the <a href="https://html.spec.whatwg.org/multipage/dom.html#fallback-content" id="the-canvas-element:fallback-content-4">fallback
+ content</a>). When an element is <a href="https://html.spec.whatwg.org/multipage/interaction.html#focused" id="the-canvas-element:focused">focused</a>, it is the target of keyboard interaction
+ events (even though the element itself is not visible). This allows authors to make an interactive
+ canvas keyboard-accessible: authors should have a one-to-one mapping of interactive regions to <i id="the-canvas-element:focusable-area"><a href="https://html.spec.whatwg.org/multipage/interaction.html#focusable-area">focusable areas</a></i> in the <a href="https://html.spec.whatwg.org/multipage/dom.html#fallback-content" id="the-canvas-element:fallback-content-5">fallback content</a>. (Focus has no
+ effect on mouse interaction events.) <a href="https://html.spec.whatwg.org/multipage/references.html#refsUIEVENTS">[UIEVENTS]</a></p>
+
+ <p>An element whose nearest <code id="the-canvas-element:the-canvas-element-18"><a href="#the-canvas-element">canvas</a></code> element ancestor is <a href="https://html.spec.whatwg.org/multipage/rendering.html#being-rendered" id="the-canvas-element:being-rendered">being rendered</a>
+ and <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents-5">represents</a> <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-6">embedded content</a> is an element that is <dfn id="being-used-as-relevant-canvas-fallback-content">being used as
+ relevant canvas fallback content</dfn>.</p>
+
+ <hr/>
+
+ <p>The <code id="the-canvas-element:the-canvas-element-19"><a href="#the-canvas-element">canvas</a></code> element has two attributes to control the size of the element's bitmap:
+ <dfn id="attr-canvas-width"><code>width</code></dfn> and <dfn id="attr-canvas-height"><code>height</code></dfn>. These attributes, when specified, must have
+ values that are <a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-non-negative-integer" id="the-canvas-element:valid-non-negative-integer">valid non-negative integers</a>. The <a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#rules-for-parsing-non-negative-integers" id="the-canvas-element:rules-for-parsing-non-negative-integers">rules for parsing non-negative integers</a> must be used to obtain their
+ numeric values. If an attribute is missing, or if parsing its value returns an error, then the
+ default value must be used instead. The <code id="the-canvas-element:attr-canvas-width-2"><a href="#attr-canvas-width">width</a></code>
+ attribute defaults to 300, and the <code id="the-canvas-element:attr-canvas-height-2"><a href="#attr-canvas-height">height</a></code> attribute
+ defaults to 150.</p>
+
+ <p>The <a data-x-internal="intrinsic-dimensions" href="https://drafts.csswg.org/css2/conform.html#intrinsic" id="the-canvas-element:intrinsic-dimensions">intrinsic dimensions</a> of the <code id="the-canvas-element:the-canvas-element-20"><a href="#the-canvas-element">canvas</a></code> element when it
+ <a href="https://html.spec.whatwg.org/multipage/dom.html#represents" id="the-canvas-element:represents-6">represents</a> <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-7">embedded content</a> are equal to the dimensions of the
+ element's bitmap.</p>
+
+ <p>The user agent must use a square pixel density consisting of one pixel of image data per
+ coordinate space unit for the bitmaps of a <code id="the-canvas-element:the-canvas-element-21"><a href="#the-canvas-element">canvas</a></code> and its rendering contexts.</p>
+
+ <p class="note">A <code id="the-canvas-element:the-canvas-element-22"><a href="#the-canvas-element">canvas</a></code> element can be sized arbitrarily by a style sheet, its
+ bitmap is then subject to the <a data-x-internal="'object-fit'" href="https://drafts.csswg.org/css-images/#the-object-fit" id="the-canvas-element:'object-fit'">'object-fit'</a> CSS property.</p>
+
+
+
+ <hr/>
+
+ <p>The bitmaps of <code id="the-canvas-element:the-canvas-element-23"><a href="#the-canvas-element">canvas</a></code> elements, the bitmaps of <code id="the-canvas-element:imagebitmap"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> objects,
+ as well as some of the bitmaps of rendering contexts, such as those described in the sections on
+ the <code id="the-canvas-element:canvasrenderingcontext2d-2"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> and <code id="the-canvas-element:imagebitmaprenderingcontext"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> objects
+ below, have an <dfn id="concept-canvas-origin-clean">origin-clean</dfn> flag, which can be
+ set to true or false. Initially, when the <code id="the-canvas-element:the-canvas-element-24"><a href="#the-canvas-element">canvas</a></code> element or <code id="the-canvas-element:imagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code>
+ object is created, its bitmap's <a href="#concept-canvas-origin-clean" id="the-canvas-element:concept-canvas-origin-clean">origin-clean</a>
+ flag must be set to true.</p>
+
+ <p>A <code id="the-canvas-element:the-canvas-element-25"><a href="#the-canvas-element">canvas</a></code> element can have a rendering context bound to it. Initially, it does not
+ have a bound rendering context. To keep track of whether it has a rendering context or not, and
+ what kind of rendering context it is, a <code id="the-canvas-element:the-canvas-element-26"><a href="#the-canvas-element">canvas</a></code> also has a <dfn id="concept-canvas-context-mode">canvas context mode</dfn>, which is initially <dfn id="concept-canvas-none">none</dfn> but can be changed to either <dfn id="concept-canvas-placeholder">placeholder</dfn>, <dfn id="concept-canvas-2d">2d</dfn>, <dfn id="concept-canvas-bitmaprenderer">bitmaprenderer</dfn>, or <dfn id="concept-canvas-webgl">webgl</dfn> by algorithms defined in this specification.</p>
+
+ <p>When its <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode">canvas context mode</a> is <a href="#concept-canvas-none" id="the-canvas-element:concept-canvas-none">none</a>, a <code id="the-canvas-element:the-canvas-element-27"><a href="#the-canvas-element">canvas</a></code> element has no rendering context,
+ and its bitmap must be fully transparent black with an <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-width" id="the-canvas-element:intrinsic-width">intrinsic width</a> equal to the
+ numeric value of the element's <code id="the-canvas-element:attr-canvas-width-3"><a href="#attr-canvas-width">width</a></code> attribute and an
+ <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-height" id="the-canvas-element:intrinsic-height">intrinsic height</a> equal to the numeric value of the element's <code id="the-canvas-element:attr-canvas-height-3"><a href="#attr-canvas-height">height</a></code> attribute, those values being interpreted in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="the-canvas-element:'px'">CSS pixels</a>, and being updated as the attributes are set, changed, or
+ removed.</p>
+
+ <p>When its <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-2">canvas context mode</a> is <a href="#concept-canvas-placeholder" id="the-canvas-element:concept-canvas-placeholder">placeholder</a>, a <code id="the-canvas-element:the-canvas-element-28"><a href="#the-canvas-element">canvas</a></code> element has no
+ rendering context. It serves as a placeholder for an <code id="the-canvas-element:offscreencanvas-2"><a href="#offscreencanvas">OffscreenCanvas</a></code> object, and
+ the content of the <code id="the-canvas-element:the-canvas-element-29"><a href="#the-canvas-element">canvas</a></code> element is updated by calling the <code id="the-canvas-element:offscreencontext-commit"><a href="#offscreencontext-commit">commit()</a></code> method of the <code id="the-canvas-element:offscreencanvas-3"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+ object's rendering context.</p>
+
+ <p>When a <code id="the-canvas-element:the-canvas-element-30"><a href="#the-canvas-element">canvas</a></code> element represents <a href="https://html.spec.whatwg.org/multipage/dom.html#embedded-content-category" id="the-canvas-element:embedded-content-category-8">embedded content</a>, it provides a
+ <a data-x-internal="paint-source" href="https://drafts.csswg.org/css-images-4/#paint-source" id="the-canvas-element:paint-source">paint source</a> whose width is the element's <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-width" id="the-canvas-element:intrinsic-width-2">intrinsic width</a>, whose height
+ is the element's <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-height" id="the-canvas-element:intrinsic-height-2">intrinsic height</a>, and whose appearance is the element's bitmap.</p>
+
+ <p>Whenever the <code id="the-canvas-element:attr-canvas-width-4"><a href="#attr-canvas-width">width</a></code> and <code id="the-canvas-element:attr-canvas-height-4"><a href="#attr-canvas-height">height</a></code> content attributes are set, removed, changed, or
+ redundantly set to the value they already have, then the user agent must perform the action
+ from the row of the following table that corresponds to the <code id="the-canvas-element:the-canvas-element-31"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-3">context mode</a>.</p>
+
+ <table><thead><tr><th>
+ <p><a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-4">Context Mode</a></p>
+ </th><th>
+ <p>Action</p>
+
+ </th></tr></thead><tbody><tr><th>
+ <p><a href="#concept-canvas-2d" id="the-canvas-element:concept-canvas-2d">2d</a></p>
+ </th><td>
+ <p>Follow the steps to <a href="#concept-canvas-set-bitmap-dimensions" id="the-canvas-element:concept-canvas-set-bitmap-dimensions">set bitmap
+ dimensions</a> to the numeric values of the <code id="the-canvas-element:attr-canvas-width-5"><a href="#attr-canvas-width">width</a></code>
+ and <code id="the-canvas-element:attr-canvas-height-5"><a href="#attr-canvas-height">height</a></code> content attributes.</p>
+
+ </td></tr><tr><th>
+ <p><a href="#concept-canvas-webgl" id="the-canvas-element:concept-canvas-webgl">webgl</a></p>
+ </th><td>
+ <p>Follow the behavior defined in the WebGL specification. <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a></p>
+
+ </td></tr><tr><th>
+ <p><a href="#concept-canvas-bitmaprenderer" id="the-canvas-element:concept-canvas-bitmaprenderer">bitmaprenderer</a></p>
+ </th><td>
+ <p>If the context's <a href="#concept-imagebitmaprenderingcontext-bitmap-mode" id="the-canvas-element:concept-imagebitmaprenderingcontext-bitmap-mode">bitmap
+ mode</a> is set to <a href="#concept-imagebitmaprenderingcontext-blank" id="the-canvas-element:concept-imagebitmaprenderingcontext-blank">blank</a>,
+ run the steps to <a href="#set-an-imagebitmaprenderingcontext's-output-bitmap" id="the-canvas-element:set-an-imagebitmaprenderingcontext's-output-bitmap">set an <code>ImageBitmapRenderingContext</code>'s output bitmap</a>,
+ passing the <code id="the-canvas-element:the-canvas-element-32"><a href="#the-canvas-element">canvas</a></code> element's rendering context.</p>
+
+ </td></tr><tr><th>
+ <p><a href="#concept-canvas-placeholder" id="the-canvas-element:concept-canvas-placeholder-2">placeholder</a></p>
+ </th><td>
+ <p>Do nothing.</p>
+
+ </td></tr><tr><th>
+ <p><a href="#concept-canvas-none" id="the-canvas-element:concept-canvas-none-2">none</a></p>
+ </th><td>
+ <p>Do nothing.</p>
+ </td></tr></tbody></table>
+
+ <p>The <dfn id="dom-canvas-width"><code>width</code></dfn> and <dfn id="dom-canvas-height"><code>height</code></dfn> IDL attributes must <a href="https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#reflect" id="the-canvas-element:reflect">reflect</a> the
+ respective content attributes of the same name, with the same defaults.</p>
+
+
+
+ <hr/>
+
+
+ <dl class="domintro"><dt><var>context</var> = <var>canvas</var> . <code id="dom-canvas-getcontext"><a href="#dom-canvas-getcontext-2">getContext</a></code>(<var>contextId</var> [, ... ] )</dt><dd>
+
+ <p>Returns an object that exposes an API for drawing on the canvas. The first argument
+ specifies the desired API, either &quot;<code id="the-canvas-element:canvas-context-2d"><a href="#canvas-context-2d">2d</a></code>&quot;, &quot;<code id="the-canvas-element:canvas-context-bitmaprenderer"><a href="#canvas-context-bitmaprenderer">bitmaprenderer</a></code>&quot; or &quot;<code id="the-canvas-element:canvas-context-webgl"><a href="#canvas-context-webgl">webgl</a></code>&quot;. Subsequent arguments are handled by that API.</p>
+
+ <p>This specification defines the &quot;<code id="the-canvas-element:canvas-context-2d-2"><a href="#canvas-context-2d">2d</a></code>&quot; and &quot;<code id="the-canvas-element:canvas-context-bitmaprenderer-2"><a href="#canvas-context-bitmaprenderer">bitmaprenderer</a></code>&quot; contexts below. There is also a
+ specification that defines a &quot;<code id="the-canvas-element:canvas-context-webgl-2"><a href="#canvas-context-webgl">webgl</a></code>&quot; context.
+ <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a></p>
+
+ <p>Returns null if the given context ID is not supported, or if the canvas has already been
+ initialized with another context type (e.g. trying to get a &quot;<code id="the-canvas-element:canvas-context-2d-3"><a href="#canvas-context-2d">2d</a></code>&quot; context after getting a &quot;<code id="the-canvas-element:canvas-context-webgl-3"><a href="#canvas-context-webgl">webgl</a></code>&quot; context).</p>
+
+ </dd></dl>
+
+
+
+ <p>The <dfn id="dom-canvas-getcontext-2"><code>getContext(<var>contextId</var>,
+ <var>arguments...</var>)</code></dfn> method of the <code id="the-canvas-element:the-canvas-element-33"><a href="#the-canvas-element">canvas</a></code> element, when invoked,
+ must run the steps in the cell of the following table whose column header describes the
+ <code id="the-canvas-element:the-canvas-element-34"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-5">canvas context
+ mode</a> and whose row header describes the method's first argument.</p>
+
+ <table><thead><tr><td>
+ </td><th><a href="#concept-canvas-none" id="the-canvas-element:concept-canvas-none-3">none</a>
+ </th><th><a href="#concept-canvas-2d" id="the-canvas-element:concept-canvas-2d-2">2d</a>
+ </th><th><a href="#concept-canvas-bitmaprenderer" id="the-canvas-element:concept-canvas-bitmaprenderer-2">bitmaprenderer</a>
+ </th><th><a href="#concept-canvas-webgl" id="the-canvas-element:concept-canvas-webgl-2">webgl</a>
+ </th><th><a href="#concept-canvas-placeholder" id="the-canvas-element:concept-canvas-placeholder-3">placeholder</a>
+ </th></tr></thead><tbody><tr><th>&quot;<dfn id="canvas-context-2d"><code>2d</code></dfn>&quot;
+ </th><td>
+
+ Follow the <a href="#2d-context-creation-algorithm" id="the-canvas-element:2d-context-creation-algorithm">2D context creation algorithm</a> defined in the section below, passing
+ it the <code id="the-canvas-element:the-canvas-element-35"><a href="#the-canvas-element">canvas</a></code> element and the method's <var>arguments...</var>, to obtain a
+ <code id="the-canvas-element:canvasrenderingcontext2d-3"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object; if this does not throw an exception, then
+ set the <code id="the-canvas-element:the-canvas-element-36"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-6">context
+ mode</a> to <a href="#concept-canvas-2d" id="the-canvas-element:concept-canvas-2d-3">2d</a>, and return the
+ <code id="the-canvas-element:canvasrenderingcontext2d-4"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object.
+
+ </td><td>
+ Return the same object as was returned the last time the method was invoked with this same
+ first argument.
+ </td><td>
+ Return null.
+ </td><td>
+ Return null.
+ </td><td>
+ Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-canvas-element:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-canvas-element:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+ </td></tr><tr><th>&quot;<dfn id="canvas-context-bitmaprenderer"><code>bitmaprenderer</code></dfn>&quot;
+ </th><td>
+
+ Follow the <a href="#imagebitmaprenderingcontext-creation-algorithm" id="the-canvas-element:imagebitmaprenderingcontext-creation-algorithm"><code>ImageBitmapRenderingContext</code> creation algorithm</a> defined
+ in the section below, passing it the <code id="the-canvas-element:the-canvas-element-37"><a href="#the-canvas-element">canvas</a></code> element and the method's
+ <var>arguments...</var>, to obtain an <code id="the-canvas-element:imagebitmaprenderingcontext-2"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object; then
+ set the <code id="the-canvas-element:the-canvas-element-38"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-7">context
+ mode</a> to <a href="#concept-canvas-bitmaprenderer" id="the-canvas-element:concept-canvas-bitmaprenderer-3">bitmaprenderer</a>, and return the
+ <code id="the-canvas-element:imagebitmaprenderingcontext-3"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object.
+
+ </td><td>
+ Return null.
+ </td><td>
+ Return the same object as was returned the last time the method was invoked with this same
+ first argument.
+ </td><td>
+ Return null.
+ </td><td>
+ Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-canvas-element:invalidstateerror-2">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-canvas-element:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+ </td></tr><tr><th>&quot;<dfn id="canvas-context-webgl"><code>webgl</code></dfn>&quot;, if the user agent supports the WebGL feature in its current configuration
+ </th><td>
+
+ Follow the instructions given in the WebGL specification's <i>Context Creation</i> section to
+ obtain either a <code id="the-canvas-element:webglrenderingcontext-2"><a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext">WebGLRenderingContext</a></code> or null; if the returned value is null,
+ then return null and abort these steps, otherwise, set the <code id="the-canvas-element:the-canvas-element-39"><a href="#the-canvas-element">canvas</a></code> element's
+ <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-8">context mode</a> to <a href="#concept-canvas-webgl" id="the-canvas-element:concept-canvas-webgl-3">webgl</a>, and return the <code id="the-canvas-element:webglrenderingcontext-3"><a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext">WebGLRenderingContext</a></code>
+ object <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a>
+
+ </td><td>
+ Return null.
+ </td><td>
+ Return null.
+ </td><td>
+ Return the same object as was returned the last time the method was invoked with this same
+ first argument.
+ </td><td>
+ Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-canvas-element:invalidstateerror-3">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-canvas-element:domexception-3"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+ </td></tr><tr><th>An unsupported value*
+ </th><td>
+ Return null.
+ </td><td>
+ Return null.
+ </td><td>
+ Return null.
+ </td><td>
+ Return null.
+ </td><td>
+ Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-canvas-element:invalidstateerror-4">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-canvas-element:domexception-4"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+ </td></tr></tbody></table>
+
+ <p class="tablenote"><small>* For example, the &quot;<code id="the-canvas-element:canvas-context-webgl-4"><a href="#canvas-context-webgl">webgl</a></code>&quot;
+ value in the case of a user agent having exhausted the graphics hardware's abilities and having no
+ software fallback implementation.</small></p>
+
+ <hr/>
+
+
+
+ <dl class="domintro"><dt><var>url</var> = <var>canvas</var> . <code id="dom-canvas-todataurl"><a href="#dom-canvas-todataurl-2">toDataURL</a></code>( [ <var>type</var> [, <var>quality</var> ] ] )</dt><dd>
+
+ <p>Returns a <a data-x-internal="data-protocol" href="https://tools.ietf.org/html/rfc2397#section-2" id="the-canvas-element:data-protocol"><code>data:</code> URL</a> for the image in the
+ canvas.</p>
+
+ <p>The first argument, if provided, controls the type of the image to be returned (e.g. PNG or
+ JPEG). The default is &quot;<code id="the-canvas-element:image/png"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot;; that type is also used if the given type isn't
+ supported. The second argument applies if the type is an image format that supports variable
+ quality (such as &quot;<code id="the-canvas-element:image/jpeg"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/jpeg">image/jpeg</a></code>&quot;), and is a number in the range 0.0 to 1.0 inclusive
+ indicating the desired quality level for the resulting image.</p>
+
+ <p>When trying to use types other than &quot;<code id="the-canvas-element:image/png-2"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot;, authors can check if the image
+ was really returned in the requested format by checking to see if the returned string starts
+ with one of the exact strings &quot;<code>data:image/png,</code>&quot; or &quot;<code>data:image/png;</code>&quot;. If it does, the image is PNG, and thus the requested type was
+ not supported. (The one exception to this is if the canvas has either no height or no width, in
+ which case the result might simply be &quot;<code>data:,</code>&quot;.)</p>
+
+ </dd><dt><var>canvas</var> . <code id="dom-canvas-toblob"><a href="#dom-canvas-toblob-2">toBlob</a></code>(<var>callback</var> [, <var>type</var> [, quality ] ] )</dt><dd>
+
+ <p>Creates a <code id="the-canvas-element:blob-2"><a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob">Blob</a></code> object representing a file containing the image in the canvas,
+ and invokes a callback with a handle to that object.</p>
+
+ <p>The second argument, if provided, controls the type of the image to be returned (e.g. PNG or
+ JPEG). The default is &quot;<code id="the-canvas-element:image/png-3"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot;; that type is also used if the given type isn't
+ supported. The third argument applies if the type is an image format that supports variable
+ quality (such as &quot;<code id="the-canvas-element:image/jpeg-2"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/jpeg">image/jpeg</a></code>&quot;), and is a number in the range 0.0 to 1.0 inclusive
+ indicating the desired quality level for the resulting image.</p>
+
+ </dd><dt><var>canvas</var> . <code id="dom-canvas-transfercontroltooffscreen"><a href="#dom-canvas-transfercontroltooffscreen-2">transferControlToOffscreen</a></code>()</dt><dd>
+ <p>Returns a newly created <code id="the-canvas-element:offscreencanvas-4"><a href="#offscreencanvas">OffscreenCanvas</a></code> object that uses the
+ <code id="the-canvas-element:the-canvas-element-40"><a href="#the-canvas-element">canvas</a></code> element as a placeholder. Once the <code id="the-canvas-element:the-canvas-element-41"><a href="#the-canvas-element">canvas</a></code> element has become a
+ placeholder for an <code id="the-canvas-element:offscreencanvas-5"><a href="#offscreencanvas">OffscreenCanvas</a></code> object, its intrinsic size can no longer be
+ changed, and it cannot have a rendering context. The content of the placeholder canvas is
+ updated by calling the <code id="the-canvas-element:offscreencontext-commit-2"><a href="#offscreencontext-commit">commit()</a></code> method of the
+ <code id="the-canvas-element:offscreencanvas-6"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's rendering context.
+ </p>
+ </dd></dl>
+
+
+
+ <p>The <dfn id="dom-canvas-todataurl-2"><code>toDataURL(<var>type</var>,
+ <var>quality</var>)</code></dfn> method, when invoked, must run these steps:</p>
+
+ <ol><li><p>If this <code id="the-canvas-element:the-canvas-element-42"><a href="#the-canvas-element">canvas</a></code> element's bitmap's <a href="#concept-canvas-origin-clean" id="the-canvas-element:concept-canvas-origin-clean-2">origin-clean</a> flag is set to false, then throw a
+ <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="the-canvas-element:securityerror">&quot;<code>SecurityError</code>&quot;</a> <code id="the-canvas-element:domexception-5"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p>
+
+
+ </li><li><p>If this <code id="the-canvas-element:the-canvas-element-43"><a href="#the-canvas-element">canvas</a></code> element's bitmap has no pixels (i.e. either its horizontal
+ dimension or its vertical dimension is zero) then return the string &quot;<code>data:,</code>&quot; and abort these steps. (This is the shortest <a data-x-internal="data-protocol" href="https://tools.ietf.org/html/rfc2397#section-2" id="the-canvas-element:data-protocol-2"><code>data:</code> URL</a>; it represents the empty string in a <code>text/plain</code> resource.)</p></li><li><p>Let <var>file</var> be <a href="#a-serialisation-of-the-bitmap-as-a-file" id="the-canvas-element:a-serialisation-of-the-bitmap-as-a-file">a
+ serialization of this <code>canvas</code> element's bitmap as a file</a>, passing
+ <var>type</var> and <var>quality</var> if they were given.</p></li><li><p>If <var>file</var> is null then return &quot;<code>data:,</code>&quot;.</p></li><li><p>Return a <a data-x-internal="data-protocol" href="https://tools.ietf.org/html/rfc2397#section-2" id="the-canvas-element:data-protocol-3"><code>data:</code> URL</a> representing
+ <var>file</var>. <a href="https://html.spec.whatwg.org/multipage/references.html#refsRFC2397">[RFC2397]</a></p>
+
+
+
+ </li></ol>
- </div>
+ <p>The <dfn id="dom-canvas-toblob-2"><code>toBlob(<var>callback</var>, <var>type</var>,
+ <var>quality</var>)</code></dfn> method, when invoked, must run these steps:</p>
+
+ <ol><li><p>If this <code id="the-canvas-element:the-canvas-element-44"><a href="#the-canvas-element">canvas</a></code> element's bitmap's <a href="#concept-canvas-origin-clean" id="the-canvas-element:concept-canvas-origin-clean-3">origin-clean</a> flag is set to false, then throw a
+ <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="the-canvas-element:securityerror-2">&quot;<code>SecurityError</code>&quot;</a> <code id="the-canvas-element:domexception-6"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p>
+
+
+ </li><li>
+ <p>If this <code id="the-canvas-element:the-canvas-element-45"><a href="#the-canvas-element">canvas</a></code> element's bitmap has no pixels (i.e. either its horizontal
+ dimension or its vertical dimension is zero) then let <var>result</var> be null.</p>
- <div class="example">
- <p>Only one square appears to be drawn in the following example:</p>
- <pre> // canvas is a reference to a &lt;canvas&gt; element
- var context = canvas.getContext('2d');
- context.fillRect(0,0,50,50);
- canvas.setAttribute('width', '300'); // clears the canvas
- context.fillRect(0,100,50,50);
- canvas.width = canvas.width; // clears the canvas
- context.fillRect(100,0,50,50); // only this square remains</pre>
- </div>
+ <p>Otherwise, let <var>result</var> be a <code id="the-canvas-element:blob-3"><a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob">Blob</a></code> object representing <a href="#a-serialisation-of-the-bitmap-as-a-file" id="the-canvas-element:a-serialisation-of-the-bitmap-as-a-file-2">a serialization of this <code>canvas</code> element's
+ bitmap as a file</a>, passing <var>type</var> and <var>quality</var> if they were given. <a href="https://html.spec.whatwg.org/multipage/references.html#refsFILEAPI">[FILEAPI]</a></p>
+ </li><li><p>Return, but continue running these steps <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel" id="the-canvas-element:in-parallel">in parallel</a>.</p></li><li><p><a href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="the-canvas-element:queue-a-task">Queue a task</a> to <a data-x-internal="es-invoking-callback-functions" href="https://heycam.github.io/webidl/#invoke-a-callback-function" id="the-canvas-element:es-invoking-callback-functions">invoke</a>
+ the <code id="the-canvas-element:blobcallback-2"><a href="#blobcallback">BlobCallback</a></code> <var>callback</var> with <var>result</var> as its argument. The
+ <a href="https://html.spec.whatwg.org/multipage/webappapis.html#task-source" id="the-canvas-element:task-source">task source</a> for this task is the
+ <dfn id="canvas-blob-serialisation-task-source">canvas blob serialization task
+ source</dfn>.</p></li></ol>
- <hr/><dl class="domintro"><dt><var title="">context</var> = <var title="">canvas</var> . <code title="dom-canvas-getContext"><a href="#dom-canvas-getcontext">getContext</a></code>(<var title="">contextId</var> [, ... ])</dt>
+ <p>The <dfn id="dom-canvas-transfercontroltooffscreen-2"><code>transferControlToOffscreen()</code></dfn> method,
+ when invoked, must run these steps:</p>
- <dd>
+ <ol><li><p>If this <code id="the-canvas-element:the-canvas-element-46"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-9">context
+ mode</a> is not set to <a href="#concept-canvas-none" id="the-canvas-element:concept-canvas-none-4">none</a>, throw an
+ <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-canvas-element:invalidstateerror-5">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-canvas-element:domexception-7"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+ steps.</p></li><li><p>Let <var>offscreenCanvas</var> be a new <code id="the-canvas-element:offscreencanvas-7"><a href="#offscreencanvas">OffscreenCanvas</a></code> object with its
+ width and height equal to the values of the <code id="the-canvas-element:attr-canvas-width-6"><a href="#attr-canvas-width">width</a></code>
+ and <code id="the-canvas-element:attr-canvas-height-6"><a href="#attr-canvas-height">height</a></code> content attributes of this
+ <code id="the-canvas-element:the-canvas-element-47"><a href="#the-canvas-element">canvas</a></code> element.</p></li><li><p>Set the <a href="#offscreencanvas-placeholder" id="the-canvas-element:offscreencanvas-placeholder">placeholder <code>canvas</code>
+ element</a> of <var>offscreenCanvas</var> to be a weak reference to this <code id="the-canvas-element:the-canvas-element-48"><a href="#the-canvas-element">canvas</a></code>
+ element.</p></li><li><p>Set this <code id="the-canvas-element:the-canvas-element-49"><a href="#the-canvas-element">canvas</a></code> element's <a href="#concept-canvas-context-mode" id="the-canvas-element:concept-canvas-context-mode-10">context
+ mode</a> to <a href="#concept-canvas-placeholder" id="the-canvas-element:concept-canvas-placeholder-4">placeholder</a>.</p></li><li><p>Return <var>offscreenCanvas</var>.</p></li></ol>
- <p>Returns an object that exposes an API for drawing on the
- canvas. The first argument specifies the desired API. Subsequent
- arguments are handled by that API.</p>
+
-<!--2DCONTEXT-->
+
- <p>This specification defines the &quot;<code title="canvas-context-2d"><a href="#canvas-context-2d">2d</a></code>&quot; context below. There is also
- a specification that defines a &quot;<code title="canvas-context-webgl">webgl</code>&quot; context. <a href="#refsWEBGL">[WEBGL]</a></p>
+ <h5 id="2dcontext"><span class="secno">4.12.5.1</span> The 2D rendering context<a class="self-link" href="#2dcontext"/></h5>
-<!--2DCONTEXT-->
+
- <p>The list of defined contexts is given on the <a href="http://wiki.whatwg.org/wiki/CanvasContexts">WHATWG Wiki
- CanvasContexts page</a>. <a href="#refsWHATWGWIKI">[WHATWGWIKI]</a>
+ <pre class="idl">typedef (<a href="https://html.spec.whatwg.org/multipage/embedded-content.html#htmlimageelement" id="2dcontext:htmlimageelement">HTMLImageElement</a> or
+ <a data-x-internal="svgimageelement" href="https://www.w3.org/TR/SVG11/struct.html#InterfaceSVGImageElement" id="2dcontext:svgimageelement">SVGImageElement</a>) <dfn id="htmlorsvgimageelement">HTMLOrSVGImageElement</dfn>;
- </p><p>Returns null if the given context ID is not supported or if the
- canvas has already been initialized with some other (incompatible)
- context type (e.g. trying to get a &quot;<code title="canvas-context-2d"><a href="#canvas-context-2d">2d</a></code>&quot; context after getting a
- &quot;<code title="canvas-context-webgl">webgl</code>&quot; context).</p>
+typedef (<a href="#htmlorsvgimageelement" id="2dcontext:htmlorsvgimageelement">HTMLOrSVGImageElement</a> or
+ <a href="https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement" id="2dcontext:htmlvideoelement">HTMLVideoElement</a> or
+ <a href="#htmlcanvaselement" id="2dcontext:htmlcanvaselement">HTMLCanvasElement</a> or
+ <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap" id="2dcontext:imagebitmap">ImageBitmap</a> or
+ <a href="#offscreencanvas" id="2dcontext:offscreencanvas">OffscreenCanvas</a>) <dfn id="canvasimagesource">CanvasImageSource</dfn>;
- </dd>
+enum <dfn id="canvasfillrule">CanvasFillRule</dfn> { &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero">nonzero</a>&quot;, &quot;<a href="#dom-context-2d-fillrule-evenodd" id="2dcontext:dom-context-2d-fillrule-evenodd">evenodd</a>&quot; };
- </dl><div class="impl">
+dictionary <dfn id="canvasrenderingcontext2dsettings">CanvasRenderingContext2DSettings</dfn> {
+ boolean <a href="#dom-canvasrenderingcontext2dsettings-alpha" id="2dcontext:dom-canvasrenderingcontext2dsettings-alpha">alpha</a> = true;
+};
- <p>A <code><a href="#the-canvas-element">canvas</a></code> element can have a <dfn id="primary-context">primary
- context</dfn>, which is the first context to have been obtained for
- that element. When created, a <code><a href="#the-canvas-element">canvas</a></code> element must not
- have a <a href="#primary-context">primary context</a>.</p>
+enum <dfn id="imagesmoothingquality">ImageSmoothingQuality</dfn> { &quot;<a href="#dom-context-2d-imagesmoothingquality-low" id="2dcontext:dom-context-2d-imagesmoothingquality-low">low</a>&quot;, &quot;<a href="#dom-context-2d-imagesmoothingquality-medium" id="2dcontext:dom-context-2d-imagesmoothingquality-medium">medium</a>&quot;, &quot;<a href="#dom-context-2d-imagesmoothingquality-high" id="2dcontext:dom-context-2d-imagesmoothingquality-high">high</a>&quot; };
+interface <dfn id="canvasrenderingcontext2d">CanvasRenderingContext2D</dfn> {
+ // back-reference to the canvas
+ readonly attribute <a href="#htmlcanvaselement" id="2dcontext:htmlcanvaselement-2">HTMLCanvasElement</a> <a href="#dom-context-2d-canvas-2" id="2dcontext:dom-context-2d-canvas-2">canvas</a>;
+};
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d">CanvasRenderingContext2D</a> implements <a href="#canvasstate" id="2dcontext:canvasstate">CanvasState</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-2">CanvasRenderingContext2D</a> implements <a href="#canvastransform" id="2dcontext:canvastransform">CanvasTransform</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-3">CanvasRenderingContext2D</a> implements <a href="#canvascompositing" id="2dcontext:canvascompositing">CanvasCompositing</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-4">CanvasRenderingContext2D</a> implements <a href="#canvasimagesmoothing" id="2dcontext:canvasimagesmoothing">CanvasImageSmoothing</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-5">CanvasRenderingContext2D</a> implements <a href="#canvasfillstrokestyles" id="2dcontext:canvasfillstrokestyles">CanvasFillStrokeStyles</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-6">CanvasRenderingContext2D</a> implements <a href="#canvasshadowstyles" id="2dcontext:canvasshadowstyles">CanvasShadowStyles</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-7">CanvasRenderingContext2D</a> implements <a href="#canvasfilters" id="2dcontext:canvasfilters">CanvasFilters</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-8">CanvasRenderingContext2D</a> implements <a href="#canvasrect" id="2dcontext:canvasrect">CanvasRect</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-9">CanvasRenderingContext2D</a> implements <a href="#canvasdrawpath" id="2dcontext:canvasdrawpath">CanvasDrawPath</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-10">CanvasRenderingContext2D</a> implements <a href="#canvasuserinterface" id="2dcontext:canvasuserinterface">CanvasUserInterface</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-11">CanvasRenderingContext2D</a> implements <a href="#canvastext" id="2dcontext:canvastext">CanvasText</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-12">CanvasRenderingContext2D</a> implements <a href="#canvasdrawimage" id="2dcontext:canvasdrawimage">CanvasDrawImage</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-13">CanvasRenderingContext2D</a> implements <a href="#canvasimagedata" id="2dcontext:canvasimagedata">CanvasImageData</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-14">CanvasRenderingContext2D</a> implements <a href="#canvaspathdrawingstyles" id="2dcontext:canvaspathdrawingstyles">CanvasPathDrawingStyles</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-15">CanvasRenderingContext2D</a> implements <a href="#canvastextdrawingstyles" id="2dcontext:canvastextdrawingstyles">CanvasTextDrawingStyles</a>;
+<a href="#canvasrenderingcontext2d" id="2dcontext:canvasrenderingcontext2d-16">CanvasRenderingContext2D</a> implements <a href="#canvaspath" id="2dcontext:canvaspath">CanvasPath</a>;
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasstate">CanvasState</dfn> {
+ // state
+ void <a href="#dom-context-2d-save-2" id="2dcontext:dom-context-2d-save-2">save</a>(); // push state on state stack
+ void <a href="#dom-context-2d-restore-2" id="2dcontext:dom-context-2d-restore-2">restore</a>(); // pop state stack and restore state
+};
- <p>The <dfn id="dom-canvas-getcontext" title="dom-canvas-getContext"><code>getContext(<var title="">contextId</var>, <var title="">args...</var>)</code></dfn>
- method of the <code><a href="#the-canvas-element">canvas</a></code> element, when invoked, must run
- the following steps:</p>
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvastransform">CanvasTransform</dfn> {
+ // transformations (default transform is the identity matrix)
+ void <a href="#dom-context-2d-scale-2" id="2dcontext:dom-context-2d-scale-2">scale</a>(unrestricted double x, unrestricted double y);
+ void <a href="#dom-context-2d-rotate-2" id="2dcontext:dom-context-2d-rotate-2">rotate</a>(unrestricted double angle);
+ void <a href="#dom-context-2d-translate-2" id="2dcontext:dom-context-2d-translate-2">translate</a>(unrestricted double x, unrestricted double y);
+ void <a href="#dom-context-2d-transform-2" id="2dcontext:dom-context-2d-transform-2">transform</a>(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
- <ol><li><p>Let <var title="">contextId</var> be the first argument to
- the method.</p></li>
+ [NewObject] <a data-x-internal="dommatrix" href="https://drafts.fxtf.org/geometry/#dommatrix" id="2dcontext:dommatrix">DOMMatrix</a> <a href="#dom-context-2d-gettransform-2" id="2dcontext:dom-context-2d-gettransform-2">getTransform</a>();
+ void <a href="#dom-context-2d-settransform-2" id="2dcontext:dom-context-2d-settransform-2">setTransform</a>(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
+ void <a href="#dom-context-2d-settransform-2" id="2dcontext:dom-context-2d-settransform-2-2">setTransform</a>(optional <a data-x-internal="dommatrix2dinit" href="https://drafts.fxtf.org/geometry/#dictdef-dommatrix2dinit" id="2dcontext:dommatrix2dinit">DOMMatrix2DInit</a> transform);
+ void <a href="#dom-context-2d-resettransform-2" id="2dcontext:dom-context-2d-resettransform-2">resetTransform</a>();
- <li>
+};
- <p>If <var title="">contextId</var> is not the name of a context
- supported by the user agent, return null and abort these
- steps.</p>
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvascompositing">CanvasCompositing</dfn> {
+ // compositing
+ attribute unrestricted double <a href="#dom-context-2d-globalalpha-2" id="2dcontext:dom-context-2d-globalalpha-2">globalAlpha</a>; // (default 1.0)
+ attribute DOMString <a href="#dom-context-2d-globalcompositeoperation-2" id="2dcontext:dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a>; // (default source-over)
+};
- <p class="note">An example of this would be a user agent that
- theoretically supports the &quot;<code title="canvas-context-webgl">webgl</code>&quot; 3D context, in the case
- where the platform does not have hardware support for OpenGL and
- the user agent does not have a software OpenGL implementation.
- Despite the user agent recognising the &quot;<code title="canvas-context-webgl">webgl</code>&quot; name, it would return
- null at this step because that context is not, in practice,
- supported at the time of the call.</p>
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasimagesmoothing">CanvasImageSmoothing</dfn> {
+ // image smoothing
+ attribute boolean <a href="#dom-context-2d-imagesmoothingenabled-2" id="2dcontext:dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a>; // (default true)
+ attribute <a href="#imagesmoothingquality" id="2dcontext:imagesmoothingquality">ImageSmoothingQuality</a> <a href="#dom-context-2d-imagesmoothingquality-2" id="2dcontext:dom-context-2d-imagesmoothingquality-2">imageSmoothingQuality</a>; // (default low)
- </li>
+};
- <li><p>If the element has a <a href="#primary-context">primary context</a> and that
- context's entry in the <a href="http://wiki.whatwg.org/wiki/CanvasContexts">WHATWG Wiki
- CanvasContexts page</a> does not list <var title="">contextId</var>
- as a context with which it is compatible, return null and abort
- these steps. <a href="#refsWHATWGWIKI">[WHATWGWIKI]</a></p></li>
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasfillstrokestyles">CanvasFillStrokeStyles</dfn> {
+ // colors and styles (see also the <a href="#canvaspathdrawingstyles" id="2dcontext:canvaspathdrawingstyles-2">CanvasPathDrawingStyles</a> and <a href="#canvastextdrawingstyles" id="2dcontext:canvastextdrawingstyles-2">CanvasTextDrawingStyles</a> interfaces)
+ attribute (DOMString or CanvasGradient or CanvasPattern) <a href="#dom-context-2d-strokestyle-2" id="2dcontext:dom-context-2d-strokestyle-2">strokeStyle</a>; // (default black)
+ attribute (DOMString or CanvasGradient or CanvasPattern) <a href="#dom-context-2d-fillstyle-2" id="2dcontext:dom-context-2d-fillstyle-2">fillStyle</a>; // (default black)
+ <a href="#canvasgradient" id="2dcontext:canvasgradient">CanvasGradient</a> <a href="#dom-context-2d-createlineargradient-2" id="2dcontext:dom-context-2d-createlineargradient-2">createLinearGradient</a>(double x0, double y0, double x1, double y1);
+ <a href="#canvasgradient" id="2dcontext:canvasgradient-2">CanvasGradient</a> <a href="#dom-context-2d-createradialgradient-2" id="2dcontext:dom-context-2d-createradialgradient-2">createRadialGradient</a>(double x0, double y0, double r0, double x1, double y1, double r1);
+ <a href="#canvaspattern" id="2dcontext:canvaspattern">CanvasPattern</a>? <a href="#dom-context-2d-createpattern-2" id="2dcontext:dom-context-2d-createpattern-2">createPattern</a>(<a href="#canvasimagesource" id="2dcontext:canvasimagesource">CanvasImageSource</a> image, [TreatNullAs=EmptyString] DOMString repetition);
- <li><p>If the element does not have a <a href="#primary-context">primary context</a>,
- let the element's <a href="#primary-context">primary context</a> be <var title="">contextId</var>.</p></li>
+};
- <li><p>If the <code title="dom-canvas-getContext"><a href="#dom-canvas-getcontext">getContext()</a></code> method has
- already been invoked on this element for the same <var title="">contextId</var>, return the same object as was returned
- that time, and abort these steps. The additional arguments are
- ignored.</p></li>
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasshadowstyles">CanvasShadowStyles</dfn> {
+ // shadows
+ attribute unrestricted double <a href="#dom-context-2d-shadowoffsetx-2" id="2dcontext:dom-context-2d-shadowoffsetx-2">shadowOffsetX</a>; // (default 0)
+ attribute unrestricted double <a href="#dom-context-2d-shadowoffsety-2" id="2dcontext:dom-context-2d-shadowoffsety-2">shadowOffsetY</a>; // (default 0)
+ attribute unrestricted double <a href="#dom-context-2d-shadowblur-2" id="2dcontext:dom-context-2d-shadowblur-2">shadowBlur</a>; // (default 0)
+ attribute DOMString <a href="#dom-context-2d-shadowcolor-2" id="2dcontext:dom-context-2d-shadowcolor-2">shadowColor</a>; // (default transparent black)
+};
- <li><p><dfn id="getcontext-return" title="getContext-return">Return a new object for <var title="">contextId</var></dfn>, as defined by the specification
- given for <var title="">contextId</var>'s entry in the <a href="http://wiki.whatwg.org/wiki/CanvasContexts">WHATWG Wiki
- CanvasContexts page</a>. <a href="#refsWHATWGWIKI">[WHATWGWIKI]</a></p></li>
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasfilters">CanvasFilters</dfn> {
+ // filters
+ attribute DOMString <a href="#dom-context-2d-filter" id="2dcontext:dom-context-2d-filter">filter</a>; // (default &quot;none&quot;)
+};
- </ol><p>New context types may be registered in the <a href="http://wiki.whatwg.org/wiki/CanvasContexts">WHATWG Wiki
- CanvasContexts page</a>. <a href="#refsWHATWGWIKI">[WHATWGWIKI]</a></p>
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasrect">CanvasRect</dfn> {
+ // rects
+ void <a href="#dom-context-2d-clearrect-2" id="2dcontext:dom-context-2d-clearrect-2">clearRect</a>(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
+ void <a href="#dom-context-2d-fillrect-2" id="2dcontext:dom-context-2d-fillrect-2">fillRect</a>(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
+ void <a href="#dom-context-2d-strokerect-2" id="2dcontext:dom-context-2d-strokerect-2">strokeRect</a>(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
+};
- <p>Anyone is free to edit the WHATWG Wiki CanvasContexts page at any
- time to add a new context type. These new context types must be
- specified with the following information:</p>
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasdrawpath">CanvasDrawPath</dfn> {
+ // path API (see also <a href="#canvaspath" id="2dcontext:canvaspath-2">CanvasPath</a>)
+ void <a href="#dom-context-2d-beginpath-2" id="2dcontext:dom-context-2d-beginpath-2">beginPath</a>();
+ void <a href="#dom-context-2d-fill-2" id="2dcontext:dom-context-2d-fill-2">fill</a>(optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-2">nonzero</a>&quot;);
+ void <a href="#dom-context-2d-fill-2" id="2dcontext:dom-context-2d-fill-2-2">fill</a>(<a href="#path2d" id="2dcontext:path2d">Path2D</a> path, optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-2">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-3">nonzero</a>&quot;);
+ void <a href="#dom-context-2d-stroke-2" id="2dcontext:dom-context-2d-stroke-2">stroke</a>();
+ void <a href="#dom-context-2d-stroke-2" id="2dcontext:dom-context-2d-stroke-2-2">stroke</a>(<a href="#path2d" id="2dcontext:path2d-2">Path2D</a> path);
+ void <a href="#dom-context-2d-clip-2" id="2dcontext:dom-context-2d-clip-2">clip</a>(optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-3">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-4">nonzero</a>&quot;);
+ void <a href="#dom-context-2d-clip-2" id="2dcontext:dom-context-2d-clip-2-2">clip</a>(<a href="#path2d" id="2dcontext:path2d-3">Path2D</a> path, optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-4">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-5">nonzero</a>&quot;);
+ void <a href="#dom-context-2d-resetclip-2" id="2dcontext:dom-context-2d-resetclip-2">resetClip</a>();
+ boolean <a href="#dom-context-2d-ispointinpath-2" id="2dcontext:dom-context-2d-ispointinpath-2">isPointInPath</a>(unrestricted double x, unrestricted double y, optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-5">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-6">nonzero</a>&quot;);
+ boolean <a href="#dom-context-2d-ispointinpath-2" id="2dcontext:dom-context-2d-ispointinpath-2-2">isPointInPath</a>(<a href="#path2d" id="2dcontext:path2d-4">Path2D</a> path, unrestricted double x, unrestricted double y, optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-6">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-7">nonzero</a>&quot;);
+ boolean <a href="#dom-context-2d-ispointinstroke-2" id="2dcontext:dom-context-2d-ispointinstroke-2">isPointInStroke</a>(unrestricted double x, unrestricted double y);
+ boolean <a href="#dom-context-2d-ispointinstroke-2" id="2dcontext:dom-context-2d-ispointinstroke-2-2">isPointInStroke</a>(<a href="#path2d" id="2dcontext:path2d-5">Path2D</a> path, unrestricted double x, unrestricted double y);
+};
- <dl><dt>Keyword</dt>
+[Exposed=Window,
+ NoInterfaceObject]
+interface <dfn id="canvasuserinterface">CanvasUserInterface</dfn> {
+ void <a href="#dom-context-2d-drawfocusifneeded-2" id="2dcontext:dom-context-2d-drawfocusifneeded-2">drawFocusIfNeeded</a>(<a data-x-internal="element" href="https://dom.spec.whatwg.org/#interface-element" id="2dcontext:element">Element</a> element);
+ void <a href="#dom-context-2d-drawfocusifneeded-2" id="2dcontext:dom-context-2d-drawfocusifneeded-2-2">drawFocusIfNeeded</a>(<a href="#path2d" id="2dcontext:path2d-6">Path2D</a> path, <a data-x-internal="element" href="https://dom.spec.whatwg.org/#interface-element" id="2dcontext:element-2">Element</a> element);
+ void <a href="#dom-context-2d-scrollpathintoview-2" id="2dcontext:dom-context-2d-scrollpathintoview-2">scrollPathIntoView</a>();
+ void <a href="#dom-context-2d-scrollpathintoview-2" id="2dcontext:dom-context-2d-scrollpathintoview-2-2">scrollPathIntoView</a>(<a href="#path2d" id="2dcontext:path2d-7">Path2D</a> path);
+};
- <dd><p>The value of <var title="">contextID</var> that will return
- the object for the new API.</p></dd>
+[Exposed=Window,
+ NoInterfaceObject]
+interface <dfn id="canvastext">CanvasText</dfn> {
+ // text (see also the <a href="#canvaspathdrawingstyles" id="2dcontext:canvaspathdrawingstyles-3">CanvasPathDrawingStyles</a> and <a href="#canvastextdrawingstyles" id="2dcontext:canvastextdrawingstyles-3">CanvasTextDrawingStyles</a> interfaces)
+ void <a href="#dom-context-2d-filltext-2" id="2dcontext:dom-context-2d-filltext-2">fillText</a>(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth);
+ void <a href="#dom-context-2d-stroketext-2" id="2dcontext:dom-context-2d-stroketext-2">strokeText</a>(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth);
+ <a href="#textmetrics" id="2dcontext:textmetrics">TextMetrics</a> <a href="#dom-context-2d-measuretext-2" id="2dcontext:dom-context-2d-measuretext-2">measureText</a>(DOMString text);
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasdrawimage">CanvasDrawImage</dfn> {
+ // drawing images
+ void <a href="#dom-context-2d-drawimage" id="2dcontext:dom-context-2d-drawimage">drawImage</a>(<a href="#canvasimagesource" id="2dcontext:canvasimagesource-2">CanvasImageSource</a> image, unrestricted double dx, unrestricted double dy);
+ void <a href="#dom-context-2d-drawimage" id="2dcontext:dom-context-2d-drawimage-2">drawImage</a>(<a href="#canvasimagesource" id="2dcontext:canvasimagesource-3">CanvasImageSource</a> image, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
+ void <a href="#dom-context-2d-drawimage" id="2dcontext:dom-context-2d-drawimage-3">drawImage</a>(<a href="#canvasimagesource" id="2dcontext:canvasimagesource-4">CanvasImageSource</a> image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
+};
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvasimagedata">CanvasImageData</dfn> {
+ // <a href="#pixel-manipulation" id="2dcontext:pixel-manipulation">pixel manipulation</a>
+ <a href="#imagedata" id="2dcontext:imagedata">ImageData</a> <a href="#dom-context-2d-createimagedata-2" id="2dcontext:dom-context-2d-createimagedata-2">createImageData</a>(long sw, long sh);
+ <a href="#imagedata" id="2dcontext:imagedata-2">ImageData</a> <a href="#dom-context-2d-createimagedata-2" id="2dcontext:dom-context-2d-createimagedata-2-2">createImageData</a>(<a href="#imagedata" id="2dcontext:imagedata-3">ImageData</a> imagedata);
+ <a href="#imagedata" id="2dcontext:imagedata-4">ImageData</a> <a href="#dom-context-2d-getimagedata-2" id="2dcontext:dom-context-2d-getimagedata-2">getImageData</a>(long sx, long sy, long sw, long sh);
+ void <a href="#dom-context-2d-putimagedata-2" id="2dcontext:dom-context-2d-putimagedata-2">putImageData</a>(<a href="#imagedata" id="2dcontext:imagedata-5">ImageData</a> imagedata, long dx, long dy);
+ void <a href="#dom-context-2d-putimagedata-2" id="2dcontext:dom-context-2d-putimagedata-2-2">putImageData</a>(<a href="#imagedata" id="2dcontext:imagedata-6">ImageData</a> imagedata, long dx, long dy, long dirtyX, long dirtyY, long dirtyWidth, long dirtyHeight);
+};
- <dt>Specification</dt>
+enum <dfn id="canvaslinecap">CanvasLineCap</dfn> { &quot;butt&quot;, &quot;round&quot;, &quot;square&quot; };
+enum <dfn id="canvaslinejoin">CanvasLineJoin</dfn> { &quot;round&quot;, &quot;bevel&quot;, &quot;miter&quot; };
+enum <dfn id="canvastextalign">CanvasTextAlign</dfn> { &quot;<a href="#dom-context-2d-textalign-start" id="2dcontext:dom-context-2d-textalign-start">start</a>&quot;, &quot;<a href="#dom-context-2d-textalign-end" id="2dcontext:dom-context-2d-textalign-end">end</a>&quot;, &quot;<a href="#dom-context-2d-textalign-left" id="2dcontext:dom-context-2d-textalign-left">left</a>&quot;, &quot;<a href="#dom-context-2d-textalign-right" id="2dcontext:dom-context-2d-textalign-right">right</a>&quot;, &quot;<a href="#dom-context-2d-textalign-center" id="2dcontext:dom-context-2d-textalign-center">center</a>&quot; };
+enum <dfn id="canvastextbaseline">CanvasTextBaseline</dfn> { &quot;<a href="#dom-context-2d-textbaseline-top" id="2dcontext:dom-context-2d-textbaseline-top">top</a>&quot;, &quot;<a href="#dom-context-2d-textbaseline-hanging" id="2dcontext:dom-context-2d-textbaseline-hanging">hanging</a>&quot;, &quot;<a href="#dom-context-2d-textbaseline-middle" id="2dcontext:dom-context-2d-textbaseline-middle">middle</a>&quot;, &quot;<a href="#dom-context-2d-textbaseline-alphabetic" id="2dcontext:dom-context-2d-textbaseline-alphabetic">alphabetic</a>&quot;, &quot;<a href="#dom-context-2d-textbaseline-ideographic" id="2dcontext:dom-context-2d-textbaseline-ideographic">ideographic</a>&quot;, &quot;<a href="#dom-context-2d-textbaseline-bottom" id="2dcontext:dom-context-2d-textbaseline-bottom">bottom</a>&quot; };
+enum <dfn id="canvasdirection">CanvasDirection</dfn> { &quot;<a href="#dom-context-2d-direction-ltr" id="2dcontext:dom-context-2d-direction-ltr">ltr</a>&quot;, &quot;<a href="#dom-context-2d-direction-rtl" id="2dcontext:dom-context-2d-direction-rtl">rtl</a>&quot;, &quot;<a href="#dom-context-2d-direction-inherit" id="2dcontext:dom-context-2d-direction-inherit">inherit</a>&quot; };
- <dd><p>A link to a formal specification of the context type's
- API. It could be another page on the Wiki, or a link to an external
- page. If the type does not have a formal specification, an informal
- description can be substituted until such time as a formal
- specification is available.</p></dd>
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvaspathdrawingstyles">CanvasPathDrawingStyles</dfn> {
+ // line caps/joins
+ attribute unrestricted double <a href="#dom-context-2d-linewidth-2" id="2dcontext:dom-context-2d-linewidth-2">lineWidth</a>; // (default 1)
+ attribute <a href="#canvaslinecap" id="2dcontext:canvaslinecap">CanvasLineCap</a> <a href="#dom-context-2d-linecap-2" id="2dcontext:dom-context-2d-linecap-2">lineCap</a>; // (default &quot;butt&quot;)
+ attribute <a href="#canvaslinejoin" id="2dcontext:canvaslinejoin">CanvasLineJoin</a> <a href="#dom-context-2d-linejoin-2" id="2dcontext:dom-context-2d-linejoin-2">lineJoin</a>; // (default &quot;miter&quot;)
+ attribute unrestricted double <a href="#dom-context-2d-miterlimit-2" id="2dcontext:dom-context-2d-miterlimit-2">miterLimit</a>; // (default 10)
+
+ // dashed lines
+ void <a href="#dom-context-2d-setlinedash-2" id="2dcontext:dom-context-2d-setlinedash-2">setLineDash</a>(sequence&lt;unrestricted double&gt; segments); // default empty
+ sequence&lt;unrestricted double&gt; <a href="#dom-context-2d-getlinedash-2" id="2dcontext:dom-context-2d-getlinedash-2">getLineDash</a>();
+ attribute unrestricted double <a href="#dom-context-2d-linedashoffset-2" id="2dcontext:dom-context-2d-linedashoffset-2">lineDashOffset</a>;
+};
+[Exposed=Window,
+ NoInterfaceObject]
+interface <dfn id="canvastextdrawingstyles">CanvasTextDrawingStyles</dfn> {
+ // text
+ attribute DOMString <a href="#dom-context-2d-font-2" id="2dcontext:dom-context-2d-font-2">font</a>; // (default 10px sans-serif)
+ attribute <a href="#canvastextalign" id="2dcontext:canvastextalign">CanvasTextAlign</a> <a href="#dom-context-2d-textalign-2" id="2dcontext:dom-context-2d-textalign-2">textAlign</a>; // (default: &quot;start&quot;)
+ attribute <a href="#canvastextbaseline" id="2dcontext:canvastextbaseline">CanvasTextBaseline</a> <a href="#dom-context-2d-textbaseline-2" id="2dcontext:dom-context-2d-textbaseline-2">textBaseline</a>; // (default: &quot;alphabetic&quot;)
+ attribute <a href="#canvasdirection" id="2dcontext:canvasdirection">CanvasDirection</a> <a href="#dom-context-2d-direction-2" id="2dcontext:dom-context-2d-direction-2">direction</a>; // (default: &quot;inherit&quot;)
+};
- <dt>Compatible with</dt>
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface <dfn id="canvaspath">CanvasPath</dfn> {
+ // shared path API methods
+ void <a href="#dom-context-2d-closepath-2" id="2dcontext:dom-context-2d-closepath-2">closePath</a>();
+ void <a href="#dom-context-2d-moveto-2" id="2dcontext:dom-context-2d-moveto-2">moveTo</a>(unrestricted double x, unrestricted double y);
+ void <a href="#dom-context-2d-lineto-2" id="2dcontext:dom-context-2d-lineto-2">lineTo</a>(unrestricted double x, unrestricted double y);
+ void <a href="#dom-context-2d-quadraticcurveto-2" id="2dcontext:dom-context-2d-quadraticcurveto-2">quadraticCurveTo</a>(unrestricted double cpx, unrestricted double cpy, unrestricted double x, unrestricted double y);
+ void <a href="#dom-context-2d-beziercurveto-2" id="2dcontext:dom-context-2d-beziercurveto-2">bezierCurveTo</a>(unrestricted double cp1x, unrestricted double cp1y, unrestricted double cp2x, unrestricted double cp2y, unrestricted double x, unrestricted double y);
+ void <a href="#dom-context-2d-arcto-2" id="2dcontext:dom-context-2d-arcto-2">arcTo</a>(unrestricted double x1, unrestricted double y1, unrestricted double x2, unrestricted double y2, unrestricted double radius);
+ void <a href="#dom-context-2d-arcto-2" id="2dcontext:dom-context-2d-arcto-2-2">arcTo</a>(unrestricted double x1, unrestricted double y1, unrestricted double x2, unrestricted double y2, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation);
+ void <a href="#dom-context-2d-rect-2" id="2dcontext:dom-context-2d-rect-2">rect</a>(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
+ void <a href="#dom-context-2d-arc-2" id="2dcontext:dom-context-2d-arc-2">arc</a>(unrestricted double x, unrestricted double y, unrestricted double radius, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise = false);
+ void <a href="#dom-context-2d-ellipse-2" id="2dcontext:dom-context-2d-ellipse-2">ellipse</a>(unrestricted double x, unrestricted double y, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise = false);
+};
- <dd><p>The list of context types that are compatible with this one
- (i.e. that operate on the same underlying bitmap). This list must
- be transitive and symmetric; if one context type is defined as
- compatible with another, then all types it is compatible with must
- be compatible with all types the other is compatible with.</p></dd>
+[Exposed=(Window,Worker)]
+interface <dfn id="canvasgradient">CanvasGradient</dfn> {
+ // opaque object
+ void <a href="#dom-canvasgradient-addcolorstop-2" id="2dcontext:dom-canvasgradient-addcolorstop-2">addColorStop</a>(double offset, DOMString color);
+};
- </dl><p>Vendors may also define experimental contexts using the syntax
- <code><var title="">vendorname</var>-<var title="">context</var></code>, for example,
- <code>moz-3d</code>. Such contexts should be registered in the
- WHATWG Wiki CanvasContexts page.</p>
+[Exposed=(Window,Worker)]
+interface <dfn id="canvaspattern">CanvasPattern</dfn> {
+ // opaque object
+ void <a href="#dom-canvaspattern-settransform-2" id="2dcontext:dom-canvaspattern-settransform-2">setTransform</a>(optional <a data-x-internal="dommatrix2dinit" href="https://drafts.fxtf.org/geometry/#dictdef-dommatrix2dinit" id="2dcontext:dommatrix2dinit-2">DOMMatrix2DInit</a> transform);
+};
- </div>
+[Exposed=Window]
+interface <dfn id="textmetrics">TextMetrics</dfn> {
+ // x-direction
+ readonly attribute double <a href="#dom-textmetrics-width-2" id="2dcontext:dom-textmetrics-width-2">width</a>; // advance width
+ readonly attribute double <a href="#dom-textmetrics-actualboundingboxleft-2" id="2dcontext:dom-textmetrics-actualboundingboxleft-2">actualBoundingBoxLeft</a>;
+ readonly attribute double <a href="#dom-textmetrics-actualboundingboxright-2" id="2dcontext:dom-textmetrics-actualboundingboxright-2">actualBoundingBoxRight</a>;
+
+ // y-direction
+ readonly attribute double <a href="#dom-textmetrics-fontboundingboxascent-2" id="2dcontext:dom-textmetrics-fontboundingboxascent-2">fontBoundingBoxAscent</a>;
+ readonly attribute double <a href="#dom-textmetrics-fontboundingboxdescent-2" id="2dcontext:dom-textmetrics-fontboundingboxdescent-2">fontBoundingBoxDescent</a>;
+ readonly attribute double <a href="#dom-textmetrics-actualboundingboxascent-2" id="2dcontext:dom-textmetrics-actualboundingboxascent-2">actualBoundingBoxAscent</a>;
+ readonly attribute double <a href="#dom-textmetrics-actualboundingboxdescent-2" id="2dcontext:dom-textmetrics-actualboundingboxdescent-2">actualBoundingBoxDescent</a>;
+ readonly attribute double <a href="#dom-textmetrics-emheightascent-2" id="2dcontext:dom-textmetrics-emheightascent-2">emHeightAscent</a>;
+ readonly attribute double <a href="#dom-textmetrics-emheightdescent-2" id="2dcontext:dom-textmetrics-emheightdescent-2">emHeightDescent</a>;
+ readonly attribute double <a href="#dom-textmetrics-hangingbaseline-2" id="2dcontext:dom-textmetrics-hangingbaseline-2">hangingBaseline</a>;
+ readonly attribute double <a href="#dom-textmetrics-alphabeticbaseline-2" id="2dcontext:dom-textmetrics-alphabeticbaseline-2">alphabeticBaseline</a>;
+ readonly attribute double <a href="#dom-textmetrics-ideographicbaseline-2" id="2dcontext:dom-textmetrics-ideographicbaseline-2">ideographicBaseline</a>;
+};
- <hr/><dl class="domintro"><dt><var title="">url</var> = <var title="">canvas</var> . <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL</a></code>( [ <var title="">type</var>, ... ])</dt>
+[<a href="#dom-imagedata" id="2dcontext:dom-imagedata">Constructor</a>(unsigned long sw, unsigned long sh),
+ <a href="#dom-imagedata" id="2dcontext:dom-imagedata-2">Constructor</a>(<a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray" id="2dcontext:idl-uint8clampedarray">Uint8ClampedArray</a> data, unsigned long sw, optional unsigned long sh),
+ Exposed=(Window,Worker),
+ <a href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable" id="2dcontext:serializable">Serializable</a>]
+interface <dfn id="imagedata">ImageData</dfn> {
+ readonly attribute unsigned long <a href="#dom-imagedata-width-2" id="2dcontext:dom-imagedata-width-2">width</a>;
+ readonly attribute unsigned long <a href="#dom-imagedata-height-2" id="2dcontext:dom-imagedata-height-2">height</a>;
+ readonly attribute <a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray" id="2dcontext:idl-uint8clampedarray-2">Uint8ClampedArray</a> <a href="#dom-imagedata-data-2" id="2dcontext:dom-imagedata-data-2">data</a>;
+};
- <dd>
+[<a href="#dom-path2d" id="2dcontext:dom-path2d">Constructor</a>,
+ <a href="#dom-path2d-copy" id="2dcontext:dom-path2d-copy">Constructor</a>(<a href="#path2d" id="2dcontext:path2d-8">Path2D</a> path),
+ <a href="#dom-path2d-merge" id="2dcontext:dom-path2d-merge">Constructor</a>(sequence&lt;<a href="#path2d" id="2dcontext:path2d-9">Path2D</a>&gt; paths, optional <a href="#canvasfillrule" id="2dcontext:canvasfillrule-7">CanvasFillRule</a> fillRule = &quot;<a href="#dom-context-2d-fillrule-nonzero" id="2dcontext:dom-context-2d-fillrule-nonzero-8">nonzero</a>&quot;),
+ <a href="#dom-path2d-withdata" id="2dcontext:dom-path2d-withdata">Constructor</a>(DOMString d),
+ Exposed=(Window,Worker)]
+interface <dfn id="path2d">Path2D</dfn> {
+ void <a href="#dom-path2d-addpath-2" id="2dcontext:dom-path2d-addpath-2">addPath</a>(<a href="#path2d" id="2dcontext:path2d-10">Path2D</a> path, optional <a data-x-internal="dommatrix2dinit" href="https://drafts.fxtf.org/geometry/#dictdef-dommatrix2dinit" id="2dcontext:dommatrix2dinit-3">DOMMatrix2DInit</a> transform);
+};
+<a href="#path2d" id="2dcontext:path2d-11">Path2D</a> implements <a href="#canvaspath" id="2dcontext:canvaspath-3">CanvasPath</a>;</pre>
- <p>Returns a <a href="#data-protocol" title="data protocol"><code title="">data:</code> URL</a> for the image in the canvas.</p>
+
- <p>The first argument, if provided, controls the type of the image
- to be returned (e.g. PNG or JPEG). The default is <code title="">image/png</code>; that type is also used if the given
- type isn't supported. The other arguments are specific to the
- type, and control the way that the image is generated, as given in
- the table below.</p>
+ <p class="note">To maintain compatibility with existing Web content, user agents need to
+ enumerate methods defined in <code id="2dcontext:canvasuserinterface-2"><a href="#canvasuserinterface">CanvasUserInterface</a></code> immediately after the <code id="2dcontext:dom-context-2d-stroke-2-3"><a href="#dom-context-2d-stroke-2">stroke()</a></code> method on <code id="2dcontext:canvasrenderingcontext2d-17"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>
+ objects.</p>
- <p>When trying to use types other than &quot;<code>image/png</code>&quot;,
- authors can check if the image was really returned in the
- requested format by checking to see if the returned string starts
- with one of the exact strings &quot;<code title="">data:image/png,</code>&quot; or &quot;<code title="">data:image/png;</code>&quot;. If it does, the image is PNG,
- and thus the requested type was not supported. (The one exception
- to this is if the canvas has either no height or no width, in
- which case the result might simply be &quot;<code title="">data:,</code>&quot;.)</p>
+ <dl class="domintro"><dt><var>context</var> = <var>canvas</var> . <code id="2dcontext:dom-canvas-getcontext-2"><a href="#dom-canvas-getcontext-2">getContext</a></code>('2d' [, { [ <code id="2dcontext:dom-canvasrenderingcontext2dsettings-alpha-2"><a href="#dom-canvasrenderingcontext2dsettings-alpha">alpha</a></code>: false ] } ] )</dt><dd>
- </dd>
+ <p>Returns a <code id="2dcontext:canvasrenderingcontext2d-18"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object that is permanently bound to a
+ particular <code id="2dcontext:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element.</p>
- <dt><var title="">canvas</var> . <code title="dom-canvas-toBlob"><a href="#dom-canvas-toblob">toBlob</a></code>(<var title="">callback</var> [, <var title="">type</var>, ... ])</dt>
+ <p>If the <code id="2dcontext:dom-canvasrenderingcontext2dsettings-alpha-3"><a href="#dom-canvasrenderingcontext2dsettings-alpha">alpha</a></code> setting is
+ provided and set to false, then the canvas is forced to always be opaque.</p>
- <dd>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-canvas"><a href="#dom-context-2d-canvas-2">canvas</a></code></dt><dd>
- <p>Creates a <code><a href="#blob">Blob</a></code> object representing a file
- containing the image in the canvas, and invokes a callback with a
- handle to that object.</p>
+ <p>Returns the <code id="2dcontext:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element.</p>
- <p>The second argument, if provided, controls the type of the
- image to be returned (e.g. PNG or JPEG). The default is <code title="">image/png</code>; that type is also used if the given
- type isn't supported. The other arguments are specific to the
- type, and control the way that the image is generated, as given in
- the table below.</p>
+ </dd></dl>
- </dd>
+
- </dl><div class="impl">
+ <p>A <code id="2dcontext:canvasrenderingcontext2d-19"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object has an <dfn id="output-bitmap">output bitmap</dfn> that
+ is initialized when the object is created.</p>
- <p>The <dfn id="dom-canvas-todataurl" title="dom-canvas-toDataURL"><code>toDataURL()</code></dfn> method
- must run the following steps:</p>
- <ol><li><p>If the canvas has no pixels (i.e. either its horizontal
- dimension or its vertical dimension is zero) then return the string
- &quot;<code title="">data:,</code>&quot; and abort these steps. (This is the
- shortest <a href="#data-protocol" title="data protocol"><code title="">data:</code>
- URL</a>; it represents the empty string in a <code title="">text/plain</code> resource.)</p></li>
+ <p>The <a href="#output-bitmap" id="2dcontext:output-bitmap">output bitmap</a> has an <a href="#concept-canvas-origin-clean" id="2dcontext:concept-canvas-origin-clean">origin-clean</a> flag, which can be set to true or false.
+ Initially, when one of these bitmaps is created, its <a href="#concept-canvas-origin-clean" id="2dcontext:concept-canvas-origin-clean-2">origin-clean</a> flag must be set to true.</p>
- <li><p>Let <var title="">file</var> be <a href="#a-serialization-of-the-image-as-a-file">a serialization of the
- image as a file</a>, using the method's arguments (if any) as
- the <var title="">arguments</var>.</p></li>
- <li><p>Return a <a href="#data-protocol" title="data protocol"><code title="">data:</code> URL</a> representing <var title="">file</var>. <a href="#refsRFC2397">[RFC2397]</a></p>
+ <p>The <code id="2dcontext:canvasrenderingcontext2d-20"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object also has an <dfn id="concept-canvas-alpha">alpha</dfn> flag, which can be set to true or false. Initially,
+ when the context is created, its <a href="#concept-canvas-alpha" id="2dcontext:concept-canvas-alpha">alpha</a> flag must be
+ set to true. When a <code id="2dcontext:canvasrenderingcontext2d-21"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object has its <a href="#concept-canvas-alpha" id="2dcontext:concept-canvas-alpha-2">alpha</a> flag set to false, then its alpha channel must be
+ fixed to 1.0 (fully opaque) for all pixels, and attempts to change the alpha component of any
+ pixel must be silently ignored.</p>
- <!-- should we explicitly require the URL to be base64-encoded and
- not have any parameters, to ensure the same exact URL is generated
- in each browser? -->
+ <p class="note">Thus, the bitmap of such a context starts off as fully-opaque black instead of
+ fully-transparent black; <code id="2dcontext:dom-context-2d-clearrect-2-2"><a href="#dom-context-2d-clearrect-2">clearRect()</a></code> always
+ results in fully-opaque black pixels, every fourth byte from <code id="2dcontext:dom-context-2d-getimagedata-2-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code> is always 255, the <code id="2dcontext:dom-context-2d-putimagedata-2-3"><a href="#dom-context-2d-putimagedata-2">putImageData()</a></code> method effectively ignores every
+ fourth byte in its input, and so on. However, the alpha component of styles and images drawn
+ onto the canvas are still honoured up to the point where they would impact the <a href="#output-bitmap" id="2dcontext:output-bitmap-2">output
+ bitmap</a>'s alpha channel; for instance, drawing a 50% transparent white square on a freshly
+ created <a href="#output-bitmap" id="2dcontext:output-bitmap-3">output bitmap</a> with its <a href="#concept-canvas-alpha" id="2dcontext:concept-canvas-alpha-3">alpha</a>
+ flag set to false will result in a fully-opaque gray square.</p>
- </li></ol><p>The <dfn id="dom-canvas-toblob" title="dom-canvas-toBlob"><code>toBlob()</code></dfn> method
- must run the following steps:</p>
+ <hr/>
- <ol><li><p>Let <var title="">callback</var> be the first
- argument.</p></li>
+ <p>The <code id="2dcontext:canvasrenderingcontext2d-22"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> 2D rendering context represents a flat linear
+ Cartesian surface whose origin (0,0) is at the top left corner, with the coordinate space having
+ <var>x</var> values increasing when going right, and <var>y</var> values increasing when going
+ down. The <var>x</var>-coordinate of the right-most edge is equal to the width of the rendering
+ context's <a href="#output-bitmap" id="2dcontext:output-bitmap-4">output bitmap</a> in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="2dcontext:'px'">CSS pixels</a>; similarly, the
+ <var>y</var>-coordinate of the bottom-most edge is equal to the height of the rendering context's
+ <a href="#output-bitmap" id="2dcontext:output-bitmap-5">output bitmap</a> in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="2dcontext:'px'-2">CSS pixels</a>.</p>
- <li><p>Let <var title="">arguments</var> be the second and
- subsequent arguments to the method, if any.</p></li>
+ <p>The size of the coordinate space does not necessarily represent the size of the actual bitmaps
+ that the user agent will use internally or during rendering. On high-definition displays, for
+ instance, the user agent may internally use bitmaps with two device pixels per unit in the
+ coordinate space, so that the rendering remains at high quality throughout. Anti-aliasing can
+ similarly be implemented using over-sampling with bitmaps of a higher resolution than the final
+ image on the display.</p>
- <li><p>Let <var title="">file</var> be <a href="#a-serialization-of-the-image-as-a-file">a serialization of the
- image as a file</a>, using <var title="">arguments</var>.</p></li>
+ <hr/>
- <li><p>Return, but continue running these steps
- asynchronously.</p></li>
+ <p>The <dfn id="2d-context-creation-algorithm">2D context creation algorithm</dfn>, which is passed a <var>target</var> (a
+ <code id="2dcontext:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element) and optionally some arguments, consists of running the following
+ steps:</p>
- <li><p>If <var title="">callback</var> is null, abort these
- steps.</p></li>
+ <ol><li><p>If the algorithm was passed some arguments, then let <var>arg</var> be the first such
+ argument. Otherwise, let <var>arg</var> be undefined.</p></li><li><p>Let <var>settings</var> be the result of <a href="#coerce-context-arguments-for-2d" id="2dcontext:coerce-context-arguments-for-2d">coercing the <var>arg</var> context arguments for 2D</a>.</p></li><li><p>Create a new <code id="2dcontext:canvasrenderingcontext2d-23"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object.</p></li><li><p>Initialize its <code id="2dcontext:dom-context-2d-canvas-2-2"><a href="#dom-context-2d-canvas-2">canvas</a></code> attribute to point to
+ <var>target</var>.</p></li><li><p>Let the new <code id="2dcontext:canvasrenderingcontext2d-24"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#output-bitmap" id="2dcontext:output-bitmap-6">output bitmap</a> be
+ the same bitmap as <var>target</var>'s bitmap (so that they are shared).</p></li><li><p><a href="#concept-canvas-set-bitmap-dimensions" id="2dcontext:concept-canvas-set-bitmap-dimensions">Set bitmap dimensions</a> to the
+ numeric values of <var>target</var>'s <code id="2dcontext:attr-canvas-width"><a href="#attr-canvas-width">width</a></code> and
+ <code id="2dcontext:attr-canvas-height"><a href="#attr-canvas-height">height</a></code> content attributes.</p></li><li>
- <li><p><a href="#queue-a-task">Queue a task</a> to invoke the
- <code>FileCallback</code> <var title="">callback</var> with a
- <code><a href="#blob">Blob</a></code> object representing <var title="">file</var> as
- its argument. The <a href="#task-source">task source</a> for this task is the
- <dfn id="canvas-blob-serialization-task-source">canvas blob serialization task source</dfn>. <a href="#refsFILESYSTEMAPI">[FILESYSTEMAPI]</a> <a href="#refsFILEAPI">[FILEAPI]</a> </p></li>
+ <p>Process each of the members of <var>settings</var> as follows:</p>
- </ol><p>When a user agent is to create <dfn id="a-serialization-of-the-image-as-a-file">a serialization of the image
- as a file</dfn>, optionally with some given <var title="">arguments</var>, it must create an image file in the format
- given by the first value of <var title="">arguments</var>, or, if
- there are no <var title="">arguments</var>, in the PNG format. <a href="#refsPNG">[PNG]</a></p>
+ <dl><dt><dfn id="dom-canvasrenderingcontext2dsettings-alpha"><code>alpha</code></dfn></dt><dd>If false, then set the new <code id="2dcontext:canvasrenderingcontext2d-25"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#concept-canvas-alpha" id="2dcontext:concept-canvas-alpha-4">alpha</a> flag to false.</dd></dl>
- <p>If <var title="">arguments</var> is not empty, the first value
- must be interpreted as a <a href="#mime-type" title="MIME type">MIME type</a>
- giving the format to use. If the type has any parameters, it must be
- treated as not supported.</p>
+ </li><li><p>Return the new <code id="2dcontext:canvasrenderingcontext2d-26"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object.</p></li></ol>
- <p class="example">For example, the value &quot;<code>image/png</code>&quot; would
- mean to generate a PNG image, the value &quot;<code>image/jpeg</code>&quot;
- would mean to generate a JPEG image, and the value
- &quot;<code>image/svg+xml</code>&quot; would mean to generate an SVG image
- (which would probably require that the implementation actually keep
- enough information to reliably render an SVG image from the canvas).</p>
+ <hr/>
- <p>User agents must support PNG (&quot;<code>image/png</code>&quot;). User
- agents may support other types. If the user agent does not support
- the requested type, it must create the file using the PNG format. <a href="#refsPNG">[PNG]</a></p>
+ <hr/>
- <p>User agents must <a href="#converted-to-ascii-lowercase" title="converted to ASCII
- lowercase">convert the provided type to ASCII lowercase</a>
- before establishing if they support that type.</p>
+ <p>When a user agent is required to <dfn id="coerce-context-arguments-for-2d">coerce context arguments for 2D</dfn>, it must run these
+ steps:</p>
- <p>For image types that do not support an alpha channel, the
- serialized image must be the canvas image composited onto a solid
- black background using the source-over operator.</p>
+ <ol><li><p>Let <var>input</var> be the argument to coerce.</p></li><li><p>Let <var>jsval</var> be the result of <a data-x-internal="concept-idl-convert" href="https://heycam.github.io/webidl/#es-type-mapping" id="2dcontext:concept-idl-convert">converting</a>
+ <var>input</var> to a JavaScript value. (This can throw an exception.)</p></li><li><p>Let <var>dict</var> be the result of <a data-x-internal="concept-idl-convert" href="https://heycam.github.io/webidl/#es-type-mapping" id="2dcontext:concept-idl-convert-2">converting</a>
+ <var>jsval</var> to the dictionary type <code id="2dcontext:canvasrenderingcontext2dsettings"><a href="#canvasrenderingcontext2dsettings">CanvasRenderingContext2DSettings</a></code>. (This can
+ throw an exception.)</p></li><li><p>Return <var>dict</var>.</p></li></ol>
- <p>If the first argument in <var title="">arguments</var> gives a
- type corresponding to one of the types given in the first column of
- the following table, and the user agent supports that type, then the
- subsequent arguments, if any, must be treated as described in the
- second cell of that row.</p>
+ <hr/>
- </div>
+ <p>When the user agent is to <dfn id="concept-canvas-set-bitmap-dimensions">set bitmap
+ dimensions</dfn> to <var>width</var> and <var>height</var>, it must run these steps:</p>
- <table><thead><tr><th> Type </th><th> Other arguments </th><th> Reference
- </th></tr></thead><tbody><tr><td> <code>image/jpeg</code>
- </td><td> The second argument<span class="impl">, if it</span> is a
- number in the range 0.0 to 1.0 inclusive<span class="impl">, must
- be</span> treated as the desired quality level. <span class="impl">If it is not a number or is outside that range, the
- user agent must use its default value, as if the argument had
- been omitted.</span>
- </td><td> <a href="#refsJPEG">[JPEG]</a>
- </td></tr></tbody></table><div class="impl">
-
- <p>For the purposes of these rules, an argument is considered to be
- a number if it is converted to an IDL double value by the rules for
- handling arguments of type <code title="">any</code> in the Web IDL
- specification. <a href="#refsWEBIDL">[WEBIDL]</a></p>
-
- <p>Other arguments must be ignored and must not cause the user agent
- to raise an exception. A future version of this specification will
- probably define other parameters to be passed to these methods to
- allow authors to more carefully control compression settings, image
- metadata, etc.</p>
+ <ol><li><p><a href="#reset-the-rendering-context-to-its-default-state" id="2dcontext:reset-the-rendering-context-to-its-default-state">Reset the rendering context to its default state</a>.</p></li><li><p>Resize the <a href="#output-bitmap" id="2dcontext:output-bitmap-7">output bitmap</a> to the new <var>width</var> and <var>height</var>
+ and clear it to fully transparent black.</p></li><li><p>Let <var>canvas</var> be the <code id="2dcontext:the-canvas-element-4"><a href="#the-canvas-element">canvas</a></code> element to which the rendering
+ context's <code id="2dcontext:dom-context-2d-canvas-2-3"><a href="#dom-context-2d-canvas-2">canvas</a></code> attribute was initialized.</p></li><li><p>If the numeric value of <var>canvas</var>'s <code id="2dcontext:attr-canvas-width-2"><a href="#attr-canvas-width">width</a></code>
+ content attribute differs from <var>width</var>, then set <var>canvas</var>'s <code id="2dcontext:attr-canvas-width-3"><a href="#attr-canvas-width">width</a></code> content attribute to the shortest possible string
+ representing <var>width</var> as a <a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-non-negative-integer" id="2dcontext:valid-non-negative-integer">valid non-negative integer</a>.</p></li><li><p>If the numeric value of <var>canvas</var>'s <code id="2dcontext:attr-canvas-height-2"><a href="#attr-canvas-height">height</a></code>
+ content attribute differs from <var>height</var>, then set <var>canvas</var>'s <code id="2dcontext:attr-canvas-height-3"><a href="#attr-canvas-height">height</a></code> content attribute to the shortest possible string
+ representing <var>height</var> as a <a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#valid-non-negative-integer" id="2dcontext:valid-non-negative-integer-2">valid non-negative integer</a>.</p></li></ol>
+ <div class="example">
+ <p>Only one square appears to be drawn in the following example:</p>
+ <pre>// canvas is a reference to a &lt;canvas&gt; element
+var context = canvas.getContext('2d');
+context.fillRect(0,0,50,50);
+canvas.setAttribute('width', '300'); // clears the canvas
+context.fillRect(0,100,50,50);
+canvas.width = canvas.width; // clears the canvas
+context.fillRect(100,0,50,50); // only this square remains</pre>
</div>
- <!--2DCONTEXT-->
+ <hr/>
- <div data-component="HTML Canvas 2D Context (editor: Ian Hickson)">
+ <p>When the user agent is to run the <dfn id="concept-canvas-unbinding-steps">unbinding
+ steps</dfn> for a rendering context, it must run these steps:</p>
- <h5 id="2dcontext"><span class="secno">4.8.11.1 </span>The 2D context</h5>
+ <ol><li><p><a href="#reset-the-rendering-context-to-its-default-state" id="2dcontext:reset-the-rendering-context-to-its-default-state-2">Reset the rendering context to its default state</a>.</p></li><li><p>Clear the <code id="2dcontext:canvasrenderingcontext2d-27"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#output-bitmap" id="2dcontext:output-bitmap-8">output bitmap</a> to a
+ transparent black.</p></li><li><p>Set the <code id="2dcontext:canvasrenderingcontext2d-28"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#concept-canvas-origin-clean" id="2dcontext:concept-canvas-origin-clean-3">origin-clean</a> flag to true.</p></li><li><p>Let the <code id="2dcontext:canvasrenderingcontext2d-29"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object have no <a href="#output-bitmap" id="2dcontext:output-bitmap-9">output
+ bitmap</a>.</p></li></ol>
- <!-- v2: we're on v4.1. suggestions for next version are marked v5, v6. -->
+ <p>When the user agent is to run the <dfn id="concept-canvas-binding-steps">binding
+ steps</dfn> to bind the rendering context to the <code id="2dcontext:the-canvas-element-5"><a href="#the-canvas-element">canvas</a></code> element <var>target</var>, it
+ must run these steps:</p>
+ <ol><li><p><a href="#reset-the-rendering-context-to-its-default-state" id="2dcontext:reset-the-rendering-context-to-its-default-state-3">Reset the rendering context to its default state</a>.</p></li><li><p>Resize the <code id="2dcontext:canvasrenderingcontext2d-30"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#output-bitmap" id="2dcontext:output-bitmap-10">output bitmap</a> to
+ the dimensions of <var>target</var>'s bitmap and clear it to fully transparent black.</p></li><li><p>Set the <code id="2dcontext:canvasrenderingcontext2d-31"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#concept-canvas-origin-clean" id="2dcontext:concept-canvas-origin-clean-4">origin-clean</a> flag to true.</p></li><li><p>Let the <code id="2dcontext:canvasrenderingcontext2d-32"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object's <a href="#output-bitmap" id="2dcontext:output-bitmap-11">output bitmap</a> be <var>target</var>'s bitmap.</p></li></ol>
+ <hr/>
- <p>This specification defines the <dfn id="canvas-context-2d" title="canvas-context-2d"><code>2d</code></dfn> context type, whose
- API is implemented using the <code><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>
- interface.</p>
+ <p>The <dfn id="dom-context-2d-canvas-2"><code>canvas</code></dfn> attribute must return the
+ value it was initialized to when the object was created.</p>
- <div class="impl">
+ <hr/>
- <p>When the <code title="dom-canvas-getContext"><a href="#dom-canvas-getcontext">getContext()</a></code>
- method of a <code><a href="#the-canvas-element">canvas</a></code> element is to <a href="#getcontext-return" title="getContext-return">return a new object for the <var title="">contextId</var></a> <code title="canvas-context-2d"><a href="#canvas-context-2d">2d</a></code>, the user agent must return a
- new <code><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> object. Any additional
- arguments are ignored.</p>
+ <p id="canvasrenderingcontext2d-currentcolor">Whenever the CSS value <code>currentColor</code> is used as a color in the <code id="2dcontext:canvasrenderingcontext2d-33"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>
+ API, the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="2dcontext:computed-value">computed value</a> of the <code>currentColor</code> keyword is
+ the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="2dcontext:computed-value-2">computed value</a> of the <a data-x-internal="'color'" href="https://drafts.csswg.org/css-color/#the-color-property" id="2dcontext:'color'">'color'</a> property on the <code id="2dcontext:the-canvas-element-6"><a href="#the-canvas-element">canvas</a></code>
+ element at the time that the color is specified (e.g. when the appropriate attribute is set, or
+ when the method is called; not when the color is rendered or otherwise used). If the computed
+ value of the <a data-x-internal="'color'" href="https://drafts.csswg.org/css-color/#the-color-property" id="2dcontext:'color'-2">'color'</a> property is undefined for a particular case (e.g. because the element is
+ not in a document), then the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="2dcontext:computed-value-3">computed value</a> of the <a data-x-internal="'color'" href="https://drafts.csswg.org/css-color/#the-color-property" id="2dcontext:'color'-3">'color'</a> property
+ for the purposes of determining the computed value of the <code>currentColor</code>
+ keyword is fully opaque black. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSCOLOR">[CSSCOLOR]</a></p>
- </div>
+ <p>In the case of <code id="2dcontext:dom-canvasgradient-addcolorstop-2-2"><a href="#dom-canvasgradient-addcolorstop-2">addColorStop()</a></code> on
+ <code id="2dcontext:canvasgradient-3"><a href="#canvasgradient">CanvasGradient</a></code>, the &quot;<a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="2dcontext:computed-value-4">computed value</a> of the <a data-x-internal="'color'" href="https://drafts.csswg.org/css-color/#the-color-property" id="2dcontext:'color'-4">'color'</a>
+ property&quot; for the purposes of determining the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="2dcontext:computed-value-5">computed value</a> of the <code>currentColor</code> keyword is always fully opaque black (there is no associated
+ element). <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSCOLOR">[CSSCOLOR]</a></p>
- <p>The 2D context represents a flat Cartesian surface whose origin
- (0,0) is at the top left corner, with the coordinate space having
- <var title="">x</var> values increasing when going right, and <var title="">y</var> values increasing when going down.</p>
+ <p class="note">This is because <code id="2dcontext:canvasgradient-4"><a href="#canvasgradient">CanvasGradient</a></code> objects are
+ <code id="2dcontext:the-canvas-element-7"><a href="#the-canvas-element">canvas</a></code>-neutral — a <code id="2dcontext:canvasgradient-5"><a href="#canvasgradient">CanvasGradient</a></code> object created by one
+ <code id="2dcontext:the-canvas-element-8"><a href="#the-canvas-element">canvas</a></code> can be used by another, and there is therefore no way to know which is the
+ &quot;element in question&quot; at the time that the color is specified.</p>
- <pre class="idl">interface <dfn id="canvasrenderingcontext2d">CanvasRenderingContext2D</dfn> {
+ <p class="note">Similar concerns exist with font-related properties; the rules for those are
+ described in detail in the relevant section below.</p>
- // back-reference to the canvas
- readonly attribute <a href="#htmlcanvaselement">HTMLCanvasElement</a> <a href="#dom-context-2d-canvas" title="dom-context-2d-canvas">canvas</a>;
+
- // state
- void <a href="#dom-context-2d-save" title="dom-context-2d-save">save</a>(); // push state on state stack
- void <a href="#dom-context-2d-restore" title="dom-context-2d-restore">restore</a>(); // pop state stack and restore state
-<!--
- // v6 we've also received requests for:
- attribute boolean <span title="dom-context-2d-forceHighQuality">forceHighQuality</span> // (default false)
- // when enabled, it would prevent the UA from falling back on lower-quality but faster rendering routines
- // useful e.g. for when an image manipulation app uses <canvas> both for UI previews and the actual work
--->
- // transformations (default transform is the identity matrix)
- void <a href="#dom-context-2d-scale" title="dom-context-2d-scale">scale</a>(in double x, in double y);
- void <a href="#dom-context-2d-rotate" title="dom-context-2d-rotate">rotate</a>(in double angle);
- void <a href="#dom-context-2d-translate" title="dom-context-2d-translate">translate</a>(in double x, in double y);
- void <a href="#dom-context-2d-transform" title="dom-context-2d-transform">transform</a>(in double a, in double b, in double c, in double d, in double e, in double f);
- void <a href="#dom-context-2d-settransform" title="dom-context-2d-setTransform">setTransform</a>(in double a, in double b, in double c, in double d, in double e, in double f);
-<!--
- // v6 we've also received requests for:
- void skew(...);
- void reflect(...); // or mirror(...)
--->
- // compositing
- attribute double <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">globalAlpha</a>; // (default 1.0)
- attribute DOMString <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">globalCompositeOperation</a>; // (default source-over)
-<!--
- // v6 we've also received requests for:
- - turning off antialiasing to avoid seams when patterns are painted next to each other
- - might be better to overdraw?
- - might be better to just draw at a higher res then downsample, like for 3d?
- - nested layers
- - the ability to composite an entire set of drawing operations with one shadow all at once
- http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2008-August/015567.html
--->
- // colors and styles
- attribute any <a href="#dom-context-2d-strokestyle" title="dom-context-2d-strokeStyle">strokeStyle</a>; // (default black)
- attribute any <a href="#dom-context-2d-fillstyle" title="dom-context-2d-fillStyle">fillStyle</a>; // (default black)
- <a href="#canvasgradient">CanvasGradient</a> <a href="#dom-context-2d-createlineargradient" title="dom-context-2d-createLinearGradient">createLinearGradient</a>(in double x0, in double y0, in double x1, in double y1);
- <a href="#canvasgradient">CanvasGradient</a> <a href="#dom-context-2d-createradialgradient" title="dom-context-2d-createRadialGradient">createRadialGradient</a>(in double x0, in double y0, in double r0, in double x1, in double y1, in double r1);
- <a href="#canvaspattern">CanvasPattern</a> <a href="#dom-context-2d-createpattern" title="dom-context-2d-createPattern">createPattern</a>(in <a href="#htmlimageelement">HTMLImageElement</a> image, in DOMString repetition);
- <a href="#canvaspattern">CanvasPattern</a> <a href="#dom-context-2d-createpattern" title="dom-context-2d-createPattern">createPattern</a>(in <a href="#htmlcanvaselement">HTMLCanvasElement</a> image, in DOMString repetition);
- <a href="#canvaspattern">CanvasPattern</a> <a href="#dom-context-2d-createpattern" title="dom-context-2d-createPattern">createPattern</a>(in <a href="#htmlvideoelement">HTMLVideoElement</a> image, in DOMString repetition);
+ <hr/>
- // line caps/joins
- attribute double <a href="#dom-context-2d-linewidth" title="dom-context-2d-lineWidth">lineWidth</a>; // (default 1)
- attribute DOMString <a href="#dom-context-2d-linecap" title="dom-context-2d-lineCap">lineCap</a>; // &quot;butt&quot;, &quot;round&quot;, &quot;square&quot; (default &quot;butt&quot;)
- attribute DOMString <a href="#dom-context-2d-linejoin" title="dom-context-2d-lineJoin">lineJoin</a>; // &quot;round&quot;, &quot;bevel&quot;, &quot;miter&quot; (default &quot;miter&quot;)
- attribute double <a href="#dom-context-2d-miterlimit" title="dom-context-2d-miterLimit">miterLimit</a>; // (default 10)
+ <p>The <code id="2dcontext:canvasfillrule-8"><a href="#canvasfillrule">CanvasFillRule</a></code> enumeration is used to select the <dfn id="fill-rule">fill rule</dfn>
+ algorithm by which to determine if a point is inside or outside a path.</p>
- // shadows
- attribute double <a href="#dom-context-2d-shadowoffsetx" title="dom-context-2d-shadowOffsetX">shadowOffsetX</a>; // (default 0)
- attribute double <a href="#dom-context-2d-shadowoffsety" title="dom-context-2d-shadowOffsetY">shadowOffsetY</a>; // (default 0)
- attribute double <a href="#dom-context-2d-shadowblur" title="dom-context-2d-shadowBlur">shadowBlur</a>; // (default 0)
- attribute DOMString <a href="#dom-context-2d-shadowcolor" title="dom-context-2d-shadowColor">shadowColor</a>; // (default transparent black)
+ <p>The value &quot;<dfn id="dom-context-2d-fillrule-nonzero"><code>nonzero</code></dfn>&quot; value
+ indicates the non-zero winding rule, wherein
- // rects
- void <a href="#dom-context-2d-clearrect" title="dom-context-2d-clearRect">clearRect</a>(in double x, in double y, in double w, in double h);
- void <a href="#dom-context-2d-fillrect" title="dom-context-2d-fillRect">fillRect</a>(in double x, in double y, in double w, in double h);
- void <a href="#dom-context-2d-strokerect" title="dom-context-2d-strokeRect">strokeRect</a>(in double x, in double y, in double w, in double h);
-
- // path API
- void <a href="#dom-context-2d-beginpath" title="dom-context-2d-beginPath">beginPath</a>();
- void <a href="#dom-context-2d-closepath" title="dom-context-2d-closePath">closePath</a>();
- void <a href="#dom-context-2d-moveto" title="dom-context-2d-moveTo">moveTo</a>(in double x, in double y);
- void <a href="#dom-context-2d-lineto" title="dom-context-2d-lineTo">lineTo</a>(in double x, in double y);
- void <a href="#dom-context-2d-quadraticcurveto" title="dom-context-2d-quadraticCurveTo">quadraticCurveTo</a>(in double cpx, in double cpy, in double x, in double y);
- void <a href="#dom-context-2d-beziercurveto" title="dom-context-2d-bezierCurveTo">bezierCurveTo</a>(in double cp1x, in double cp1y, in double cp2x, in double cp2y, in double x, in double y);
- void <a href="#dom-context-2d-arcto" title="dom-context-2d-arcTo">arcTo</a>(in double x1, in double y1, in double x2, in double y2, in double radius);
- void <a href="#dom-context-2d-rect" title="dom-context-2d-rect">rect</a>(in double x, in double y, in double w, in double h);
- void <a href="#dom-context-2d-arc" title="dom-context-2d-arc">arc</a>(in double x, in double y, in double radius, in double startAngle, in double endAngle, in optional boolean anticlockwise);
- void <a href="#dom-context-2d-fill" title="dom-context-2d-fill">fill</a>();
- void <a href="#dom-context-2d-stroke" title="dom-context-2d-stroke">stroke</a>();
- void <a href="#dom-context-2d-drawsystemfocusring" title="dom-context-2d-drawSystemFocusRing">drawSystemFocusRing</a>(in <a href="#element">Element</a> element);
- boolean <a href="#dom-context-2d-drawcustomfocusring" title="dom-context-2d-drawCustomFocusRing">drawCustomFocusRing</a>(in <a href="#element">Element</a> element);
- void <a href="#dom-context-2d-scrollpathintoview" title="dom-context-2d-scrollPathIntoView">scrollPathIntoView</a>();
- void <a href="#dom-context-2d-clip" title="dom-context-2d-clip">clip</a>();
- boolean <a href="#dom-context-2d-ispointinpath" title="dom-context-2d-isPointInPath">isPointInPath</a>(in double x, in double y);
+ a point is considered to be outside a shape if the number of times a half-infinite straight
+ line drawn from that point crosses the shape's path going in one direction is equal to the
+ number of times it crosses the path going in the other direction.
- // text
- attribute DOMString <a href="#dom-context-2d-font" title="dom-context-2d-font">font</a>; // (default 10px sans-serif)
- attribute DOMString <a href="#dom-context-2d-textalign" title="dom-context-2d-textAlign">textAlign</a>; // &quot;start&quot;, &quot;end&quot;, &quot;left&quot;, &quot;right&quot;, &quot;center&quot; (default: &quot;start&quot;)
- attribute DOMString <a href="#dom-context-2d-textbaseline" title="dom-context-2d-textBaseline">textBaseline</a>; // &quot;top&quot;, &quot;hanging&quot;, &quot;middle&quot;, &quot;alphabetic&quot;, &quot;ideographic&quot;, &quot;bottom&quot; (default: &quot;alphabetic&quot;)
- void <a href="#dom-context-2d-filltext" title="dom-context-2d-fillText">fillText</a>(in DOMString text, in double x, in double y, in optional double maxWidth);
- void <a href="#dom-context-2d-stroketext" title="dom-context-2d-strokeText">strokeText</a>(in DOMString text, in double x, in double y, in optional double maxWidth);<!-- v6DVT
- void <span title="dom-context-2d-fillVerticalText">fillVerticalText</span>(in DOMString text, in double x, in double y, in optional double maxHeight);
- void <span title="dom-context-2d-strokeVerticalText">strokeVerticalText</span>(in DOMString text, in double x, in double y, in optional double maxHeight); -->
- <a href="#textmetrics">TextMetrics</a> <a href="#dom-context-2d-measuretext" title="dom-context-2d-measureText">measureText</a>(in DOMString text);
+ </p>
- // drawing images
- void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlimageelement">HTMLImageElement</a> image, in double dx, in double dy);
- void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlimageelement">HTMLImageElement</a> image, in double dx, in double dy, in double dw, in double dh);
- void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlimageelement">HTMLImageElement</a> image, in double sx, in double sy, in double sw, in double sh, in double dx, in double dy, in double dw, in double dh);
- void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlcanvaselement">HTMLCanvasElement</a> image, in double dx, in double dy);
- void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlcanvaselement">HTMLCanvasElement</a> image, in double dx, in double dy, in double dw, in double dh);
- void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlcanvaselement">HTMLCanvasElement</a> image, in double sx, in double sy, in double sw, in double sh, in double dx, in double dy, in double dw, in double dh);
- void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlvideoelement">HTMLVideoElement</a> image, in double dx, in double dy);
- void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlvideoelement">HTMLVideoElement</a> image, in double dx, in double dy, in double dw, in double dh);
- void <a href="#dom-context-2d-drawimage" title="dom-context-2d-drawImage">drawImage</a>(in <a href="#htmlvideoelement">HTMLVideoElement</a> image, in double sx, in double sy, in double sw, in double sh, in double dx, in double dy, in double dw, in double dh);
-
- // pixel manipulation
- <a href="#imagedata">ImageData</a> <a href="#dom-context-2d-createimagedata" title="dom-context-2d-createImageData">createImageData</a>(in double sw, in double sh);
- <a href="#imagedata">ImageData</a> <a href="#dom-context-2d-createimagedata" title="dom-context-2d-createImageData">createImageData</a>(in <a href="#imagedata">ImageData</a> imagedata);
- <a href="#imagedata">ImageData</a> <a href="#dom-context-2d-getimagedata" title="dom-context-2d-getImageData">getImageData</a>(in double sx, in double sy, in double sw, in double sh);
- void <a href="#dom-context-2d-putimagedata" title="dom-context-2d-putImageData">putImageData</a>(in <a href="#imagedata">ImageData</a> imagedata, in double dx, in double dy);
- void <a href="#dom-context-2d-putimagedata" title="dom-context-2d-putImageData">putImageData</a>(in <a href="#imagedata">ImageData</a> imagedata, in double dx, in double dy, in double dirtyX, in double dirtyY, in double dirtyWidth, in double dirtyHeight);
-};
-interface <dfn id="canvasgradient">CanvasGradient</dfn> {
- // opaque object
- void <a href="#dom-canvasgradient-addcolorstop" title="dom-canvasgradient-addColorStop">addColorStop</a>(in double offset, in DOMString color);
-};
+ <p>The &quot;<dfn id="dom-context-2d-fillrule-evenodd"><code>evenodd</code></dfn>&quot; value indicates
+ the even-odd rule, wherein
-interface <dfn id="canvaspattern">CanvasPattern</dfn> {
- // opaque object
-};
+ a point is considered to be outside a shape if the number of times a half-infinite straight
+ line drawn from that point crosses the shape's path is even.
-interface <dfn id="textmetrics">TextMetrics</dfn> {
- readonly attribute double <a href="#dom-textmetrics-width" title="dom-textmetrics-width">width</a>;
-};
+ </p>
-interface <dfn id="imagedata">ImageData</dfn> {
- readonly attribute unsigned long <a href="#dom-imagedata-width" title="dom-imagedata-width">width</a>;
- readonly attribute unsigned long <a href="#dom-imagedata-height" title="dom-imagedata-height">height</a>;
- readonly attribute <a href="#canvaspixelarray">CanvasPixelArray</a> <a href="#dom-imagedata-data" title="dom-imagedata-data">data</a>;
-};
+ <p>If a point is not outside a shape, it is inside the shape.</p>
-interface <dfn id="canvaspixelarray">CanvasPixelArray</dfn> {
- readonly attribute unsigned long <a href="#dom-canvaspixelarray-length" title="dom-canvaspixelarray-length">length</a>;
- <a href="#dom-canvaspixelarray-get" title="dom-CanvasPixelArray-get">getter</a> octet (in unsigned long index);
- <a href="#dom-canvaspixelarray-set" title="dom-CanvasPixelArray-set">setter</a> void (in unsigned long index, [Clamp] in octet value);
-};</pre>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-canvas"><a href="#dom-context-2d-canvas">canvas</a></code></dt>
-
- <dd>
-
- <p>Returns the <code><a href="#the-canvas-element">canvas</a></code> element.</p>
-
- </dd>
-
- </dl><div class="impl">
-
- <p>The <dfn id="dom-context-2d-canvas" title="dom-context-2d-canvas"><code>canvas</code></dfn>
- attribute must return the <code><a href="#the-canvas-element">canvas</a></code> element that the
- context paints on.</p>
-
- <p>Except where otherwise specified, for the 2D context interface,
- any method call with a numeric argument whose value is infinite or a
- NaN value must be ignored.</p>
-
- <!--
- Philip Taylor wrote:
- > My experience with some 3d canvas code is that infinities come up in
- > naturally harmless places, e.g. having a function that scales by x then
- > translates by 1/x and wanting it to work when x=0 (which ought to draw
- > nothing, since anything it draws is zero pixels wide), and it's a bit
- > annoying to track down and fix those issues, so I'd probably like it if
- > they were harmless in canvas methods. Opera appears to silently not draw
- > anything if the transformation matrix is not finite, but Firefox throws
- > exceptions when passing in non-finite arguments.
- -->
-
- <p>Whenever the CSS value <code title="">currentColor</code> is used
- as a color in this API, the &quot;computed value of the 'color' property&quot;
- for the purposes of determining the computed value of the <code title="">currentColor</code> keyword is the computed value of the
- 'color' property on the element in question at the time that the
- color is specified (e.g. when the appropriate attribute is set, or
- when the method is called; not when the color is rendered or
- otherwise used). If the computed value of the 'color' property is
- undefined for a particular case (e.g. because the element is not
- <a href="#in-a-document">in a <code>Document</code></a>), then the &quot;computed value
- of the 'color' property&quot; for the purposes of determining the
- computed value of the <code title="">currentColor</code> keyword is
- fully opaque black. <a href="#refsCSSCOLOR">[CSSCOLOR]</a></p>
-
- <p>In the case of <code title="dom-canvasgradient-addColorStop"><a href="#dom-canvasgradient-addcolorstop">addColorStop()</a></code> on
- <code><a href="#canvasgradient">CanvasGradient</a></code>, the &quot;computed value of the 'color'
- property&quot; for the purposes of determining the computed value of the
- <code title="">currentColor</code> keyword is always fully opaque
- black (there is no associated element). <a href="#refsCSSCOLOR">[CSSCOLOR]</a></p>
-
- <p class="note">This is because <code><a href="#canvasgradient">CanvasGradient</a></code> objects
- are <code><a href="#the-canvas-element">canvas</a></code>-neutral — a
- <code><a href="#canvasgradient">CanvasGradient</a></code> object created by one
- <code><a href="#the-canvas-element">canvas</a></code> can be used by another, and there is therefore
- no way to know which is the &quot;element in question&quot; at the time that
- the color is specified.</p>
+ <hr/>
- </div>
+ <p>The <code id="2dcontext:imagesmoothingquality-2"><a href="#imagesmoothingquality">ImageSmoothingQuality</a></code> enumeration is used to express a preference for the
+ interpolation quality to use when smoothing images.</p>
+
+ <p>The &quot;<dfn id="dom-context-2d-imagesmoothingquality-low"><code>low</code></dfn>&quot; value
+ indicates a preference for a low level of image interpolation quality. Low-quality image
+ interpolation may be more computationally efficient than higher settings.</p>
+ <p>The &quot;<dfn id="dom-context-2d-imagesmoothingquality-medium"><code>medium</code></dfn>&quot; value
+ indicates a preference for a medium level of image interpolation quality.</p>
+ <p>The &quot;<dfn id="dom-context-2d-imagesmoothingquality-high"><code>high</code></dfn>&quot; value
+ indicates a preference for a high level of image interpolation quality. High-quality image
+ interpolation may be more computationally expensive than lower settings.</p>
- <h6 id="the-canvas-state"><span class="secno">4.8.11.1.1 </span>The canvas state</h6>
+ <p class="note">Bilinear scaling is an example of a relatively fast, lower-quality image-smoothing
+ algorithm. Bicubic or Lanczos scaling are examples of image-smoothing algorithms that produce
+ higher-quality output. This specification does not mandate that specific interpolation algorithms
+ be used.</p>
- <p>Each context maintains a stack of drawing states. <dfn id="drawing-state" title="drawing state">Drawing states</dfn> consist of:</p>
- <ul class="brief"><li>The current <a href="#transformations" title="dom-context-2d-transformation">transformation matrix</a>.</li>
- <li>The current <a href="#clipping-region">clipping region</a>.</li>
- <li>The current values of the following attributes: <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code>, <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code>, <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code>, <code title="dom-context-2d-lineWidth"><a href="#dom-context-2d-linewidth">lineWidth</a></code>, <code title="dom-context-2d-lineCap"><a href="#dom-context-2d-linecap">lineCap</a></code>, <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code>, <code title="dom-context-2d-miterLimit"><a href="#dom-context-2d-miterlimit">miterLimit</a></code>, <code title="dom-context-2d-shadowOffsetX"><a href="#dom-context-2d-shadowoffsetx">shadowOffsetX</a></code>, <code title="dom-context-2d-shadowOffsetY"><a href="#dom-context-2d-shadowoffsety">shadowOffsetY</a></code>, <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code>, <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code>, <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code>, <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code>, <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code>, <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code>.</li>
- </ul><p class="note">The current path and the current bitmap are not part
- of the drawing state. The current path is persistent, and can only
- be reset using the <code title="dom-context-2d-beginPath"><a href="#dom-context-2d-beginpath">beginPath()</a></code> method. The
- current bitmap is a property of the canvas, not the context.</p>
+ <h6 id="implementation-notes"><span class="secno">4.12.5.1.1</span> Implementation notes<a class="self-link" href="#implementation-notes"/></h6>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-save"><a href="#dom-context-2d-save">save</a></code>()</dt>
+ <p><i>This section is non-normative.</i></p>
- <dd>
+ <p>The <a href="#output-bitmap" id="implementation-notes:output-bitmap">output bitmap</a>, when it is not directly displayed by the user agent,
+ implementations can, instead of updating this bitmap, merely remember the sequence of drawing
+ operations that have been applied to it until such time as the bitmap's actual data is needed
+ (for example because of a call to <code id="implementation-notes:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage()</a></code>, or
+ the <code id="implementation-notes:dom-createimagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#dom-createimagebitmap-2">createImageBitmap()</a></code> factory method). In many
+ cases, this will be more memory efficient.</p>
- <p>Pushes the current state onto the stack.</p>
+ <p>The bitmap of a <code id="implementation-notes:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element is the one bitmap that's pretty much always going
+ to be needed in practice. The <a href="#output-bitmap" id="implementation-notes:output-bitmap-2">output bitmap</a> of a rendering context, when it has one,
+ is always just an alias to a <code id="implementation-notes:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element's bitmap.</p>
- </dd>
+ <p>Additional bitmaps are sometimes needed, e.g. to enable fast drawing when the canvas is being
+ painted at a different size than its <a data-x-internal="intrinsic-dimensions" href="https://drafts.csswg.org/css2/conform.html#intrinsic" id="implementation-notes:intrinsic-dimensions">intrinsic size</a>,
+ or to enable double buffering so that graphics updates, like page scrolling for example, can be
+ processed concurrently while canvas draw commands are being executed.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-restore"><a href="#dom-context-2d-restore">restore</a></code>()</dt>
+ <h6 id="the-canvas-state"><span class="secno">4.12.5.1.2</span> The canvas state<a class="self-link" href="#the-canvas-state"/></h6>
- <dd>
+ <p>Objects that implement the <code id="the-canvas-state:canvasstate"><a href="#canvasstate">CanvasState</a></code> interface maintain a stack of drawing
+ states. <dfn id="drawing-state">Drawing states</dfn> consist of:</p>
+
+ <ul class="brief"><li>The current <a href="#transformations" id="the-canvas-state:transformations">transformation matrix</a>.</li><li>The current <a href="#clipping-region" id="the-canvas-state:clipping-region">clipping region</a>.</li><li>The current values of the following attributes: <code id="the-canvas-state:dom-context-2d-strokestyle-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code>, <code id="the-canvas-state:dom-context-2d-fillstyle-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code>, <code id="the-canvas-state:dom-context-2d-globalalpha-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code>, <code id="the-canvas-state:dom-context-2d-linewidth-2"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code>, <code id="the-canvas-state:dom-context-2d-linecap-2"><a href="#dom-context-2d-linecap-2">lineCap</a></code>, <code id="the-canvas-state:dom-context-2d-linejoin-2"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code>, <code id="the-canvas-state:dom-context-2d-miterlimit-2"><a href="#dom-context-2d-miterlimit-2">miterLimit</a></code>, <code id="the-canvas-state:dom-context-2d-linedashoffset-2"><a href="#dom-context-2d-linedashoffset-2">lineDashOffset</a></code>, <code id="the-canvas-state:dom-context-2d-shadowoffsetx-2"><a href="#dom-context-2d-shadowoffsetx-2">shadowOffsetX</a></code>, <code id="the-canvas-state:dom-context-2d-shadowoffsety-2"><a href="#dom-context-2d-shadowoffsety-2">shadowOffsetY</a></code>, <code id="the-canvas-state:dom-context-2d-shadowblur-2"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code>, <code id="the-canvas-state:dom-context-2d-shadowcolor-2"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code>, <code id="the-canvas-state:dom-context-2d-filter"><a href="#dom-context-2d-filter">filter</a></code>, <code id="the-canvas-state:dom-context-2d-globalcompositeoperation-2"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code>, <code id="the-canvas-state:dom-context-2d-font-2"><a href="#dom-context-2d-font-2">font</a></code>, <code id="the-canvas-state:dom-context-2d-textalign-2"><a href="#dom-context-2d-textalign-2">textAlign</a></code>, <code id="the-canvas-state:dom-context-2d-textbaseline-2"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code>, <code id="the-canvas-state:dom-context-2d-direction-2"><a href="#dom-context-2d-direction-2">direction</a></code>, <code id="the-canvas-state:dom-context-2d-imagesmoothingenabled-2"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code>, <code id="the-canvas-state:dom-context-2d-imagesmoothingquality-2"><a href="#dom-context-2d-imagesmoothingquality-2">imageSmoothingQuality</a></code>.</li><li>The current <a href="#dash-list" id="the-canvas-state:dash-list">dash list</a>.</li></ul>
+
+ <p class="note">The <a href="#current-default-path" id="the-canvas-state:current-default-path">current default path</a> and the rendering context's bitmaps are not
+ part of the drawing state. The <a href="#current-default-path" id="the-canvas-state:current-default-path-2">current default path</a> is persistent, and can only be
+ reset using the <code id="the-canvas-state:dom-context-2d-beginpath-2"><a href="#dom-context-2d-beginpath-2">beginPath()</a></code> method. The bitmaps
+ depend on whether and how the rendering context is bound to a <code id="the-canvas-state:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element.</p>
+
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-save"><a href="#dom-context-2d-save-2">save</a></code>()</dt><dd>
+
+ <p>Pushes the current state onto the stack.</p>
+
+ </dd><dt><var>context</var> . <code id="dom-context-2d-restore"><a href="#dom-context-2d-restore-2">restore</a></code>()</dt><dd>
<p>Pops the top state on the stack, restoring the context to that state.</p>
- </dd>
-
- </dl><div class="impl">
-
- <p>The <dfn id="dom-context-2d-save" title="dom-context-2d-save"><code>save()</code></dfn>
- method must push a copy of the current drawing state onto the
- drawing state stack.</p>
-
- <p>The <dfn id="dom-context-2d-restore" title="dom-context-2d-restore"><code>restore()</code></dfn> method
- must pop the top entry in the drawing state stack, and reset the
- drawing state it describes. If there is no saved state, the method
- must do nothing.</p>
-
- <!-- v6
-idea from Mihai:
-> 5. Drawing states should be saveable with IDs, and for easier restoring.
->
-> save(id)
-> restore(id)
->
-> If id is not provided, then save() works as defined now. The same for
-> restore().
->
-> Currently, it's not trivial to save and restore a specific state.
-...and from Philip:
-> I think a more convenient syntax would be:
-> var state = ctx.save();
-> ctx.restore(state);
-> But how would it interact with normal calls to ctx.restore()?
- -->
+ </dd></dl>
- </div>
+
+ <p>The <dfn id="dom-context-2d-save-2"><code>save()</code></dfn> method, when invoked, must push
+ a copy of the current drawing state onto the drawing state stack.</p>
- <h6 id="transformations"><span class="secno">4.8.11.1.2 </span><dfn title="dom-context-2d-transformation">Transformations</dfn></h6>
+ <p>The <dfn id="dom-context-2d-restore-2"><code>restore()</code></dfn> method, when invoked,
+ must pop the top entry in the drawing state stack, and reset the drawing state it describes. If
+ there is no saved state, then the method must do nothing.</p>
- <p>The transformation matrix is applied to coordinates when creating
- shapes and paths.</p> <!-- conformance criteria for actual drawing
- are described in the various sections below -->
+ <p>When the user agent is to <dfn id="reset-the-rendering-context-to-its-default-state">reset the rendering context to its default state</dfn>, it must
+ clear the drawing state stack and everything that <a href="#drawing-state" id="the-canvas-state:drawing-state">drawing state</a> consists of to
+ initial values.</p>
- <div class="impl">
+
- <p>When the context is created, the transformation matrix must
- initially be the identity transform. It may then be adjusted using
- the transformation methods.</p>
+
- <p>The transformations must be performed in reverse order. For
- instance, if a scale transformation that doubles the width is
- applied, followed by a rotation transformation that rotates drawing
- operations by a quarter turn, and a rectangle twice as wide as it is
- tall is then drawn on the canvas, the actual result will be a
- square.</p>
- </div>
+ <h6 id="line-styles"><span class="secno">4.12.5.1.3</span> Line styles<a class="self-link" href="#line-styles"/></h6>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-scale"><a href="#dom-context-2d-scale">scale</a></code>(<var title="">x</var>, <var title="">y</var>)</dt>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-linewidth"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-linewidth-2"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> [ = <var>value</var> ]</dt><dd>
- <dd>
+ <p>Returns the current line width.</p>
- <p>Changes the transformation matrix to apply a scaling transformation with the given characteristics.</p>
+ <p>Can be set, to change the line width. Values that are not finite values greater than zero are
+ ignored.</p>
- </dd>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-linecap"><a href="#dom-context-2d-linecap-2">lineCap</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-linecap-2"><a href="#dom-context-2d-linecap-2">lineCap</a></code> [ = <var>value</var> ]</dt><dd>
- <dt><var title="">context</var> . <code title="dom-context-2d-rotate"><a href="#dom-context-2d-rotate">rotate</a></code>(<var title="">angle</var>)</dt>
+ <p>Returns the current line cap style.</p>
- <dd>
+ <p>Can be set, to change the line cap style.</p>
- <p>Changes the transformation matrix to apply a rotation transformation with the given characteristics. The angle is in radians.</p>
+ <p>The possible line cap styles are &quot;<code>butt</code>&quot;, &quot;<code>round</code>&quot;, and &quot;<code>square</code>&quot;. Other values are ignored.</p>
- </dd>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-linejoin"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-linejoin-2"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code> [ = <var>value</var> ]</dt><dd>
- <dt><var title="">context</var> . <code title="dom-context-2d-translate"><a href="#dom-context-2d-translate">translate</a></code>(<var title="">x</var>, <var title="">y</var>)</dt>
+ <p>Returns the current line join style.</p>
- <dd>
+ <p>Can be set, to change the line join style.</p>
- <p>Changes the transformation matrix to apply a translation transformation with the given characteristics.</p>
+ <p>The possible line join styles are &quot;<code>bevel</code>&quot;, &quot;<code>round</code>&quot;, and &quot;<code>miter</code>&quot;. Other values are ignored.</p>
- </dd>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-miterlimit"><a href="#dom-context-2d-miterlimit-2">miterLimit</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-miterlimit-2"><a href="#dom-context-2d-miterlimit-2">miterLimit</a></code> [ = <var>value</var> ]</dt><dd>
- <dt><var title="">context</var> . <code title="dom-context-2d-transform"><a href="#dom-context-2d-transform">transform</a></code>(<var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>, <var title="">f</var>)</dt>
+ <p>Returns the current miter limit ratio.</p>
- <dd>
+ <p>Can be set, to change the miter limit ratio. Values that are not finite values greater than
+ zero are ignored.</p>
- <p>Changes the transformation matrix to apply the matrix given by the arguments as described below.</p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-setlinedash"><a href="#dom-context-2d-setlinedash-2">setLineDash</a></code>(<var>segments</var>)</dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-setlinedash-2"><a href="#dom-context-2d-setlinedash-2">setLineDash</a></code>(<var>segments</var>)</dt><dd>
- </dd>
+ <p>Sets the current line dash pattern (as used when stroking). The argument is a list of
+ distances for which to alternately have the line on and the line off.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-setTransform"><a href="#dom-context-2d-settransform">setTransform</a></code>(<var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>, <var title="">f</var>)</dt>
+ </dd><dt><var>segments</var> = <var>context</var> . <code id="dom-context-2d-getlinedash"><a href="#dom-context-2d-getlinedash-2">getLineDash</a></code>()</dt><dt><var>segments</var> = <var>styles</var> . <code id="line-styles:dom-context-2d-getlinedash-2"><a href="#dom-context-2d-getlinedash-2">getLineDash</a></code>()</dt><dd>
- <dd>
+ <p>Returns a copy of the current line dash pattern. The array returned will always have an even
+ number of entries (i.e. the pattern is normalized).</p>
- <p>Changes the transformation matrix <em>to</em> the matrix given by the arguments as described below.</p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-linedashoffset"><a href="#dom-context-2d-linedashoffset-2">lineDashOffset</a></code></dt><dt><var>styles</var> . <code id="line-styles:dom-context-2d-linedashoffset-2"><a href="#dom-context-2d-linedashoffset-2">lineDashOffset</a></code></dt><dd>
- </dd>
+ <p>Returns the phase offset (in the same units as the line dash pattern).</p>
- </dl><div class="impl">
+ <p>Can be set, to change the phase offset. Values that are not finite values are ignored.</p>
- <p>The <dfn id="dom-context-2d-scale" title="dom-context-2d-scale"><code>scale(<var title="">x</var>, <var title="">y</var>)</code></dfn> method must
- add the scaling transformation described by the arguments to the
- transformation matrix. The <var title="">x</var> argument represents
- the scale factor in the horizontal direction and the <var title="">y</var> argument represents the scale factor in the
- vertical direction. The factors are multiples.</p>
+ </dd></dl>
- <p>The <dfn id="dom-context-2d-rotate" title="dom-context-2d-rotate"><code>rotate(<var title="">angle</var>)</code></dfn> method must add the rotation
- transformation described by the argument to the transformation
- matrix. The <var title="">angle</var> argument represents a
- clockwise rotation angle expressed in radians.</p>
+
- <p>The <dfn id="dom-context-2d-translate" title="dom-context-2d-translate"><code>translate(<var title="">x</var>, <var title="">y</var>)</code></dfn> method must
- add the translation transformation described by the arguments to the
- transformation matrix. The <var title="">x</var> argument represents
- the translation distance in the horizontal direction and the <var title="">y</var> argument represents the translation distance in the
- vertical direction. The arguments are in coordinate space units.</p>
+ <p>Objects that implement the <code id="line-styles:canvaspathdrawingstyles"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface have attributes and
+ methods (defined in this section) that control how lines are treated by the object.</p>
- <p>The <dfn id="dom-context-2d-transform" title="dom-context-2d-transform"><code>transform(<var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>, <var title="">f</var>)</code></dfn> method must replace the current
- transformation matrix with the result of multiplying the current
- transformation matrix with the matrix described by:</p>
+ <p>The <dfn id="dom-context-2d-linewidth-2"><code>lineWidth</code></dfn> attribute gives the
+ width of lines, in coordinate space units. On getting, it must return the current value. On
+ setting, zero, negative, infinite, and NaN values must be ignored, leaving the value unchanged;
+ other values must change the current value to the new value.</p>
- </div>
+ <p>When the object implementing the <code id="line-styles:canvaspathdrawingstyles-2"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface is created, the
+ <code id="line-styles:dom-context-2d-linewidth-2-2"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> attribute must initially have the value
+ 1.0.</p>
- <table class="matrix"><tbody><tr><td><var title="">a</var></td>
- <td><var title="">c</var></td>
- <td><var title="">e</var></td>
- </tr><tr><td><var title="">b</var></td>
- <td><var title="">d</var></td>
- <td><var title="">f</var></td>
- </tr><tr><td>0</td>
- <td>0</td>
- <td>1</td>
- </tr></tbody></table><p class="note">The arguments <var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>, and <var title="">f</var> are sometimes called
- <var title="">m11</var>, <var title="">m12</var>, <var title="">m21</var>, <var title="">m22</var>, <var title="">dx</var>,
- and <var title="">dy</var> or <var title="">m11</var>, <var title="">m21</var>, <var title="">m12</var>, <var title="">m22</var>, <var title="">dx</var>, and <var title="">dy</var>. Care should be taken in particular with the order
- of the second and third arguments (<var title="">b</var> and <var title="">c</var>) as their order varies from API to API and APIs
- sometimes use the notation <var title="">m12</var>/<var title="">m21</var> and sometimes <var title="">m21</var>/<var title="">m12</var> for those positions.</p>
-
- <div class="impl">
-
- <p>The <dfn id="dom-context-2d-settransform" title="dom-context-2d-setTransform"><code>setTransform(<var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>,
- <var title="">f</var>)</code></dfn> method must reset the current
- transform to the identity matrix, and then invoke the <code><a href="#dom-context-2d-transform" title="dom-context-2d-transform">transform</a>(<var title="">a</var>, <var title="">b</var>, <var title="">c</var>, <var title="">d</var>, <var title="">e</var>,
- <var title="">f</var>)</code> method with the same arguments.</p>
+ <hr/>
- </div>
+ <p>The <dfn id="dom-context-2d-linecap-2"><code>lineCap</code></dfn> attribute defines the type
+ of endings that UAs will place on the end of lines. The three valid values are &quot;<code>butt</code>&quot;, &quot;<code>round</code>&quot;, and &quot;<code>square</code>&quot;.</p>
+ <p>On getting, it must return the current value. On setting, the current value must be changed
+ to the new value.</p>
- <h6 id="compositing"><span class="secno">4.8.11.1.3 </span>Compositing</h6>
+ <p>When the object implementing the <code id="line-styles:canvaspathdrawingstyles-3"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface is created, the
+ <code id="line-styles:dom-context-2d-linecap-2-2"><a href="#dom-context-2d-linecap-2">lineCap</a></code> attribute must initially have the value
+ &quot;<code>butt</code>&quot;.</p>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code> [ = <var title="">value</var> ]</dt>
+ <hr/>
- <dd>
+ <p>The <dfn id="dom-context-2d-linejoin-2"><code>lineJoin</code></dfn> attribute defines the type
+ of corners that UAs will place where two lines meet. The three valid values are
+ &quot;<code>bevel</code>&quot;, &quot;<code>round</code>&quot;, and &quot;<code>miter</code>&quot;.</p>
- <p>Returns the current alpha value applied to rendering operations.</p>
+ <p>On getting, it must return the current value. On setting, the current value must be changed
+ to the new value.</p>
- <p>Can be set, to change the alpha value. Values outside of the
- range 0.0 .. 1.0 are ignored.</p>
+ <p>When the object implementing the <code id="line-styles:canvaspathdrawingstyles-4"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface is created, the
+ <code id="line-styles:dom-context-2d-linejoin-2-2"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code> attribute must initially have the value
+ &quot;<code>miter</code>&quot;.</p>
- </dd>
+ <hr/>
+ <p>When the <code id="line-styles:dom-context-2d-linejoin-2-3"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code> attribute has the value &quot;<code>miter</code>&quot;, strokes use the miter limit ratio to decide how to render joins. The
+ miter limit ratio can be explicitly set using the <dfn id="dom-context-2d-miterlimit-2"><code>miterLimit</code></dfn> attribute. On getting, it must return
+ the current value. On setting, zero, negative, infinite, and NaN values must be ignored, leaving
+ the value unchanged; other values must change the current value to the new value.</p>
+
- <dt><var title="">context</var> . <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code> [ = <var title="">value</var> ]</dt>
+ <p>When the object implementing the <code id="line-styles:canvaspathdrawingstyles-5"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface is created, the
+ <code id="line-styles:dom-context-2d-miterlimit-2-2"><a href="#dom-context-2d-miterlimit-2">miterLimit</a></code> attribute must initially have the value
+ 10.0.</p>
- <dd>
+ <hr/>
- <p>Returns the current composition operation, from the list below.</p>
+ <p>Each <code id="line-styles:canvaspathdrawingstyles-6"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> object has a <dfn id="dash-list">dash list</dfn>, which is either
+ empty or consists of an even number of non-negative numbers. Initially, the <a href="#dash-list" id="line-styles:dash-list">dash list</a>
+ must be empty.</p>
- <p>Can be set, to change the composition operation. Unknown values
- are ignored.</p>
+ <p>The <dfn id="dom-context-2d-setlinedash-2"><code>setLineDash()</code></dfn> method, when
+ invoked, must run these steps:</p>
- </dd>
+ <ol><li><p>Let <var>a</var> be the argument.</p></li><li><p>If any value in <var>a</var> is not finite (e.g. an Infinity or a NaN value), or
+ if any value is negative (less than zero), then abort these steps (without throwing an exception;
+ user agents could show a message on a developer console, though, as that would be helpful for
+ debugging).</p></li><li><p>If the number of elements in <var>a</var> is odd, then let <var>a</var>
+ be the concatenation of two copies of <var>a</var>.</p></li><li><p>Let the object's <a href="#dash-list" id="line-styles:dash-list-2">dash list</a> be <var>a</var>.</p></li></ol>
- </dl><div class="impl">
+ <p>When the <dfn id="dom-context-2d-getlinedash-2"><code>getLineDash()</code></dfn> method is
+ invoked, it must return a sequence whose values are the values of the object's <a href="#dash-list" id="line-styles:dash-list-3">dash
+ list</a>, in the same order.</p>
- <p>All drawing operations are affected by the global compositing
- attributes, <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code> and <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code>.</p>
+ <p>It is sometimes useful to change the &quot;phase&quot; of the dash pattern, e.g. to achieve a &quot;marching
+ ants&quot; effect. The phase can be set using the <dfn id="dom-context-2d-linedashoffset-2"><code>lineDashOffset</code></dfn> attribute. On getting, it must
+ return the current value. On setting, infinite and NaN values must be ignored, leaving the value
+ unchanged; other values must change the current value to the new value.</p>
- <!-- conformance criteria for painting are described in the "drawing
- model" section below -->
+ <p>When the object implementing the <code id="line-styles:canvaspathdrawingstyles-7"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface is created, the
+ <code id="line-styles:dom-context-2d-linedashoffset-2-2"><a href="#dom-context-2d-linedashoffset-2">lineDashOffset</a></code> attribute must initially have
+ the value 0.0.</p>
- <p>The <dfn id="dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha"><code>globalAlpha</code></dfn>
- attribute gives an alpha value that is applied to shapes and images
- before they are composited onto the canvas. The value must be in the
- range from 0.0 (fully transparent) to 1.0 (no additional
- transparency). If an attempt is made to set the attribute to a value
- outside this range, including Infinity and Not-a-Number (NaN)
- values, the attribute must retain its previous value. When the
- context is created, the <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code> attribute must
- initially have the value 1.0.</p>
+ <hr/>
- <p>The <dfn id="dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation"><code>globalCompositeOperation</code></dfn>
- attribute sets how shapes and images are drawn onto the existing
- bitmap, once they have had <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code> and the
- current transformation matrix applied. It must be set to a value
- from the following list. In the descriptions below, the source
- image, <var title="">A</var>, is the shape or image being rendered,
- and the destination image, <var title="">B</var>, is the current
- state of the bitmap.</p>
+ <p>When a user agent is to <dfn id="trace-a-path">trace a path</dfn>, given an object <var>style</var>
+ that implements the <code id="line-styles:canvaspathdrawingstyles-8"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface, it must run the following
+ algorithm. This algorithm returns a new <a href="#concept-path" id="line-styles:concept-path">path</a>.</p>
- </div>
+ <ol><li><p>Let <var>path</var> be a copy of the path being traced.</p></li><li><p>Prune all zero-length <a href="#line-segments" id="line-styles:line-segments">line segments</a> from <var>path</var>.</p></li><li><p>Remove from <var>path</var> any subpaths containing no lines (i.e. subpaths with
+ just one point).</p></li><li><p>Replace each point in each subpath of <var>path</var> other than the first point
+ and the last point of each subpath by a <i>join</i> that joins the line leading to that point to
+ the line leading out of that point, such that the subpaths all consist of two points (a starting
+ point with a line leading out of it, and an ending point with a line leading into it), one or
+ more lines (connecting the points and the joins), and zero or more joins (each connecting one
+ line to another), connected together such that each subpath is a series of one or more lines with
+ a join between each one and a point on each end.</p></li><li><p>Add a straight closing line to each closed subpath in <var>path</var> connecting
+ the last point and the first point of that subpath; change the last point to a join (from the
+ previously last line to the newly added closing line), and change the first point to a join (from
+ the newly added closing line to the first line).</p>
+
+ </li><li><p>If the <var>styles</var> <a href="#dash-list" id="line-styles:dash-list-4">dash list</a> is empty, then jump to the step
+ labeled <i>convert</i>.</p></li><li><p>Let <var>pattern width</var> be the concatenation of all the entries of the <var>styles</var> <a href="#dash-list" id="line-styles:dash-list-5">dash list</a>, in coordinate space units.</p>
+
+ </li><li><p>For each subpath <var>subpath</var> in <var>path</var>, run the
+ following substeps. These substeps mutate the subpaths in <var>path</var> <i>in
+ vivo</i>.</p>
- <dl><dt><dfn id="gcop-source-atop" title="gcop-source-atop"><code>source-atop</code></dfn></dt>
+ <ol><li><p>Let <var>subpath width</var> be the length of all the lines of <var>subpath</var>, in coordinate space units.</p>
- <dd><var title="">A</var> atop <var title="">B</var>. <span class="note">Display the
- source image wherever both images are opaque. Display the
- destination image wherever the destination image is opaque but the
- source image is transparent. Display transparency elsewhere.</span></dd>
+ </li><li><p>Let <var>offset</var> be the value of the <var>styles</var> <code id="line-styles:dom-context-2d-linedashoffset-2-3"><a href="#dom-context-2d-linedashoffset-2">lineDashOffset</a></code>, in coordinate space
+ units.</p></li><li>
- <dt><dfn id="gcop-source-in" title="gcop-source-in"><code>source-in</code></dfn></dt>
+ <p>While <var>offset</var> is greater than <var>pattern width</var>,
+ decrement it by <var>pattern width</var>.</p>
- <dd><var title="">A</var> in <var title="">B</var>. <span class="note">Display the
- source image wherever both the source image and destination image
- are opaque. Display transparency elsewhere.</span></dd>
+ <p>While <var>offset</var> is less than zero, increment it by <var>pattern
+ width</var>.</p>
- <dt><dfn id="gcop-source-out" title="gcop-source-out"><code>source-out</code></dfn></dt>
+ </li><li><p>Define <var>L</var> to be a linear coordinate line defined along all lines in
+ <var>subpath</var>, such that the start of the first line in the subpath is defined
+ as coordinate 0, and the end of the last line in the subpath is defined as coordinate <var>subpath width</var>.</p></li><li><p>Let <var>position</var> be zero minus <var>offset</var>.</p></li><li><p>Let <var>index</var> be 0.</p></li><li><p>Let <var>current state</var> be <i>off</i> (the other states being <i>on</i>
+ and <i>zero-on</i>).</p></li><li><p><i>Dash on</i>: Let <var>segment length</var> be
+ the value of the <var>styles</var> <a href="#dash-list" id="line-styles:dash-list-6">dash
+ list</a>'s <var>index</var>th entry.</p></li><li><p>Increment <var>position</var> by <var>segment length</var>.</p></li><li><p>If <var>position</var> is greater than <var>subpath width</var>,
+ then end these substeps for this subpath and start them again for the next subpath; if there
+ are no more subpaths, then jump to the step labeled <i>convert</i> instead.</p></li><li><p>If <var>segment length</var> is non-zero, then let <var>current state</var> be
+ <i>on</i>.</p></li><li><p>Increment <var>index</var> by one.</p></li><li><p><i>Dash off</i>: Let <var>segment
+ length</var> be the value of the <var>styles</var> <a href="#dash-list" id="line-styles:dash-list-7">dash list</a>'s <var>index</var>th entry.</p></li><li><p>Let <var>start</var> be the offset <var>position</var> on <var>L</var>.</p></li><li><p>Increment <var>position</var> by <var>segment length</var>.</p></li><li><p>If <var>position</var> is less than zero, then jump to the step labeled
+ <i>post-cut</i>.</p></li><li><p>If <var>start</var> is less than zero, then let <var>start</var> be
+ zero.</p></li><li><p>If <var>position</var> is greater than <var>subpath width</var>,
+ then let <var>end</var> be the offset <var>subpath width</var> on <var>L</var>. Otherwise, let <var>end</var> be the offset <var>position</var> on <var>L</var>.</p></li><li>
+
+ <p>Jump to the first appropriate step:</p>
- <dd><var title="">A</var> out <var title="">B</var>. <span class="note">Display the
- source image wherever the source image is opaque and the
- destination image is transparent. Display transparency
- elsewhere.</span></dd>
+ <dl class="switch"><dt>If <var>segment length</var> is zero and <var>current state</var> is
+ <i>off</i></dt><dd>
+
+ <p>Do nothing, just continue to the next step.</p>
+
+ </dd><dt>If <var>current state</var> is <i>off</i></dt><dd>
+
+ <p>Cut the line on which <var>end</var> finds itself short at <var>end</var> and place a point there, cutting the subpath that it was in in two;
+ remove all line segments, joins, points, and subpaths that are between <var>start</var> and <var>end</var>; and finally place a single point at <var>start</var> with no lines connecting to it.</p>
+
+ <p>The point has a <i>directionality</i> for the purposes of drawing line caps (see below).
+ The directionality is the direction that the original line had at that point (i.e. when <var>L</var> was defined above).</p>
+
+ </dd><dt>Otherwise</dt><dd>
+
+ <p>Cut the line on which <var>start</var> finds itself into two at <var>start</var> and place a point there, cutting the subpath that it was in in two, and
+ similarly cut the line on which <var>end</var> finds itself short at <var>end</var> and place a point there, cutting the subpath that <em>it</em> was in in
+ two, and then remove all line segments, joins, points, and subpaths that are between <var>start</var> and <var>end</var>.</p>
+
+ <p>If <var>start</var> and <var>end</var> are the same point, then this
+ results in just the line being cut in two and two points being inserted there, with nothing
+ being removed, unless a join also happens to be at that point, in which case the join must
+ be removed.</p>
+
+ </dd></dl>
+
+ </li><li><p><i>Post-cut</i>: If <var>position</var> is greater than <var>subpath width</var>, then jump to the step labeled <i>convert</i>.</p></li><li><p>If <var>segment length</var> is greater than zero, then let
+ <var>positioned-at-on-dash</var> be false.</p></li><li><p>Increment <var>index</var> by one. If it is equal to the number of entries in
+ the <var>styles</var> <a href="#dash-list" id="line-styles:dash-list-8">dash list</a>, then let <var>index</var> be
+ 0.</p></li><li><p>Return to the step labeled <i>dash on</i>.</p></li></ol>
+
+ </li><li>
+
+ <p><i>Convert</i>: This is the step that converts the path to a new path that represents its
+ stroke.</p>
+
+ <p>Create a new <a href="#concept-path" id="line-styles:concept-path-2">path</a> that describes the edge of the areas
+ that would be covered if a straight line of length equal to the <var>styles</var>
+ <code id="line-styles:dom-context-2d-linewidth-2-3"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> was swept along each subpath in <var>path</var> while being kept at an angle such that the line is orthogonal to the path
+ being swept, replacing each point with the end cap necessary to satisfy the <var>styles</var> <code id="line-styles:dom-context-2d-linecap-2-3"><a href="#dom-context-2d-linecap-2">lineCap</a></code> attribute as
+ described previously and elaborated below, and replacing each join with the join necessary to
+ satisfy the <var>styles</var> <code id="line-styles:dom-context-2d-linejoin-2-4"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code>
+ type, as defined below.</p>
- <dt><dfn id="gcop-source-over" title="gcop-source-over"><code>source-over</code></dfn> (default)</dt>
+ <p><strong>Caps</strong>: Each point has a flat edge perpendicular to the direction of the line
+ coming out of it. This is then augmented according to the value of the <var>styles</var> <code id="line-styles:dom-context-2d-linecap-2-4"><a href="#dom-context-2d-linecap-2">lineCap</a></code>. The &quot;<code>butt</code>&quot; value means that no additional line cap is added. The &quot;<code>round</code>&quot; value means that a semi-circle with the diameter equal to the <var>styles</var> <code id="line-styles:dom-context-2d-linewidth-2-4"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> width must
+ additionally be placed on to the line coming out of each point. The &quot;<code>square</code>&quot; value means that a rectangle with the length of the <var>styles</var> <code id="line-styles:dom-context-2d-linewidth-2-5"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> width and the
+ width of half the <var>styles</var> <code id="line-styles:dom-context-2d-linewidth-2-6"><a href="#dom-context-2d-linewidth-2">lineWidth</a></code> width, placed flat against the edge
+ perpendicular to the direction of the line coming out of the point, must be added at each
+ point.</p>
+
+ <p>Points with no lines coming out of them must have two caps placed back-to-back as if it was
+ really two points connected to each other by an infinitesimally short straight line in the
+ direction of the point's <i>directionality</i> (as defined above).</p>
+
+ <p><strong>Joins</strong>: In addition to the point where a join occurs, two additional points
+ are relevant to each join, one for each line: the two corners found half the line width away
+ from the join point, one perpendicular to each line, each on the side furthest from the other
+ line.</p>
+
+ <p>A triangle connecting these two opposite corners with a straight line, with the third point
+ of the triangle being the join point, must be added at all joins. The <code id="line-styles:dom-context-2d-linejoin-2-5"><a href="#dom-context-2d-linejoin-2">lineJoin</a></code> attribute controls whether anything else is
+ rendered. The three aforementioned values have the following meanings:</p>
- <dd><var title="">A</var> over <var title="">B</var>. <span class="note">Display the
- source image wherever the source image is opaque. Display the
- destination image elsewhere.</span></dd>
+ <p>The &quot;<code>bevel</code>&quot; value means that this is all that is rendered at
+ joins.</p>
+ <p>The &quot;<code>round</code>&quot; value means that an arc connecting the two aforementioned
+ corners of the join, abutting (and not overlapping) the aforementioned triangle, with the
+ diameter equal to the line width and the origin at the point of the join, must be added at
+ joins.</p>
- <dt><dfn id="gcop-destination-atop" title="gcop-destination-atop"><code>destination-atop</code></dfn></dt>
+ <p>The &quot;<code>miter</code>&quot; value means that a second triangle must (if it can given
+ the miter length) be added at the join, with one line being the line between the two
+ aforementioned corners, abutting the first triangle, and the other two being continuations of
+ the outside edges of the two joining lines, as long as required to intersect without going over
+ the miter length.</p>
- <dd><var title="">B</var> atop <var title="">A</var>. <span class="note">Same as <code title="gcop-source-atop"><a href="#gcop-source-atop">source-atop</a></code> but using the
- destination image instead of the source image and vice versa.</span></dd>
+ <p>The miter length is the distance from the point where the join occurs to the intersection of
+ the line edges on the outside of the join. The miter limit ratio is the maximum allowed ratio of
+ the miter length to half the line width. If the miter length would cause the miter limit ratio
+ (as set by the <var>style</var> <code id="line-styles:dom-context-2d-miterlimit-2-3"><a href="#dom-context-2d-miterlimit-2">miterLimit</a></code> attribute) to be exceeded, then this second
+ triangle must not be added.</p>
- <dt><dfn id="gcop-destination-in" title="gcop-destination-in"><code>destination-in</code></dfn></dt>
- <dd><var title="">B</var> in <var title="">A</var>. <span class="note">Same as <code title="gcop-source-in"><a href="#gcop-source-in">source-in</a></code> but using the destination
- image instead of the source image and vice versa.</span></dd>
- <dt><dfn id="gcop-destination-out" title="gcop-destination-out"><code>destination-out</code></dfn></dt>
+ <p>The subpaths in the newly created path must be oriented such that for any point, the number
+ of times a half-infinite straight line drawn from that point crosses a subpath is even if and
+ only if the number of times a half-infinite straight line drawn from that same point crosses a
+ subpath going in one direction is equal to the number of times it crosses a subpath going in the
+ other direction.</p>
- <dd><var title="">B</var> out <var title="">A</var>. <span class="note">Same as <code title="gcop-source-out"><a href="#gcop-source-out">source-out</a></code> but using the destination
- image instead of the source image and vice versa.</span></dd>
+ </li><li><p>Return the newly created path.</p></li></ol>
- <dt><dfn id="gcop-destination-over" title="gcop-destination-over"><code>destination-over</code></dfn></dt>
- <dd><var title="">B</var> over <var title="">A</var>. <span class="note">Same as <code title="gcop-source-over"><a href="#gcop-source-over">source-over</a></code> but using the
- destination image instead of the source image and vice versa.</span></dd>
+
-<!-- no clear definition of this operator (doesn't correspond to a PorterDuff operator)
- <dt><dfn title="gcop-darker"><code>darker</code></dfn></dt>
- <dd><span class="note">Display the sum of the source image and destination image,
- with color values approaching 0 as a limit.</span></dd>
--->
+ <h6 id="text-styles"><span class="secno">4.12.5.1.4</span> Text styles<a class="self-link" href="#text-styles"/></h6>
- <dt><dfn id="gcop-lighter" title="gcop-lighter"><code>lighter</code></dfn></dt>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-font"><a href="#dom-context-2d-font-2">font</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="text-styles:dom-context-2d-font-2"><a href="#dom-context-2d-font-2">font</a></code> [ = <var>value</var> ]</dt><dd>
- <dd><var title="">A</var> plus <var title="">B</var>. <span class="note">Display the
- sum of the source image and destination image, with color values
- approaching 255 (100%) as a limit.</span></dd>
+ <p>Returns the current font settings.</p>
+ <p>Can be set, to change the font. The syntax is the same as for the CSS <a data-x-internal="'font'" href="https://drafts.csswg.org/css-fonts/#font-prop" id="text-styles:'font'">'font'</a>
+ property; values that cannot be parsed as CSS font values are ignored.</p>
- <dt><dfn id="gcop-copy" title="gcop-copy"><code>copy</code></dfn></dt>
+ <p>Relative keywords and lengths are computed relative to the font of the <code id="text-styles:the-canvas-element"><a href="#the-canvas-element">canvas</a></code>
+ element.</p>
- <dd><var title="">A</var> (<var title="">B</var> is
- ignored). <span class="note">Display the source image instead of the destination
- image.</span></dd>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-textalign"><a href="#dom-context-2d-textalign-2">textAlign</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="text-styles:dom-context-2d-textalign-2"><a href="#dom-context-2d-textalign-2">textAlign</a></code> [ = <var>value</var> ]</dt><dd>
+
+ <p>Returns the current text alignment settings.</p>
+
+ <p>Can be set, to change the alignment. The possible values are and their meanings are given
+ below. Other values are ignored. The default is &quot;<code>start</code>&quot;.</p>
+
+ </dd><dt><var>context</var> . <code id="dom-context-2d-textbaseline"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="text-styles:dom-context-2d-textbaseline-2"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> [ = <var>value</var> ]</dt><dd>
+
+ <p>Returns the current baseline alignment settings.</p>
+ <p>Can be set, to change the baseline alignment. The possible values and their meanings are
+ given below. Other values are ignored. The default is &quot;<code id="text-styles:dom-context-2d-textbaseline-alphabetic"><a href="#dom-context-2d-textbaseline-alphabetic">alphabetic</a></code>&quot;.</p>
- <dt><dfn id="gcop-xor" title="gcop-xor"><code>xor</code></dfn></dt>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-direction"><a href="#dom-context-2d-direction-2">direction</a></code> [ = <var>value</var> ]</dt><dt><var>styles</var> . <code id="text-styles:dom-context-2d-direction-2"><a href="#dom-context-2d-direction-2">direction</a></code> [ = <var>value</var> ]</dt><dd>
- <dd><var title="">A</var> xor <var title="">B</var>. <span class="note">Exclusive OR
- of the source image and destination image.</span></dd>
+ <p>Returns the current directionality.</p>
+ <p>Can be set, to change the directionality. The possible values and their meanings are given
+ below. Other values are ignored. The default is &quot;<code id="text-styles:dom-context-2d-direction-inherit"><a href="#dom-context-2d-direction-inherit">inherit</a></code>&quot;.</p>
- <dt class="impl"><code><var title="">vendorName</var>-<var title="">operationName</var></code></dt>
+ </dd></dl>
- <dd class="impl">Vendor-specific extensions to the list of
- composition operators should use this syntax.</dd>
+
- </dl><div class="impl">
+ <p>Objects that implement the <code id="text-styles:canvastextdrawingstyles"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interface have attributes
+ (defined in this section) that control how text is laid out (rasterized or outlined) by the
+ object. Such objects can also have a <dfn id="font-style-source-object">font style source object</dfn>. For
+ <code id="text-styles:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> objects, this is the <code id="text-styles:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element
+ referenced by the context's canvas property.</p>
- <p>The operators in the above list must be treated as described by
- the Porter-Duff operator given at the start of their description
- (e.g. <var title="">A</var> over <var title="">B</var>). They are to
- be applied as part of the <a href="#drawing-model">drawing model</a>, at which point the
- <a href="#clipping-region">clipping region</a> is also applied. (Without a clipping
- region, these operators act on the whole bitmap with every
- operation.) <a href="#refsPORTERDUFF">[PORTERDUFF]</a></p>
+
- <p>These values are all case-sensitive — they must be used
- exactly as shown. User agents must not recognize values that are not
- a <a href="#case-sensitive">case-sensitive</a> match for one of the values given
- above.</p>
+ <p>The <dfn id="dom-context-2d-font-2"><code>font</code></dfn> IDL attribute, on setting, must
+ be <a data-x-internal="parse-something-according-to-a-css-grammar" href="https://drafts.csswg.org/css-syntax/#parse-grammar" id="text-styles:parse-something-according-to-a-css-grammar">parsed as a CSS &lt;'font'&gt;
+ value</a> (but without supporting property-independent style sheet syntax like 'inherit'), and
+ the resulting font must be assigned to the context, with the <a data-x-internal="'line-height'" href="https://drafts.csswg.org/css2/visudet.html#propdef-line-height" id="text-styles:'line-height'">'line-height'</a> component
+ forced to 'normal', with the <a data-x-internal="'font-size'" href="https://drafts.csswg.org/css-fonts/#font-size-prop" id="text-styles:'font-size'">'font-size'</a> component converted to <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="text-styles:'px'">CSS pixels</a>, and with system fonts being computed to explicit values. If the
+ new value is syntactically incorrect (including using property-independent style sheet syntax like
+ 'inherit' or 'initial'), then it must be ignored, without assigning a new font value. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSS">[CSS]</a></p>
- <p>On setting, if the user agent does not recognize the specified
- value, it must be ignored, leaving the value of <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code>
- unaffected.</p>
+ <p>Font family names must be interpreted in the context of the <a href="#font-style-source-object" id="text-styles:font-style-source-object">font style source
+ object</a> when the font is to be used; any fonts embedded using <code>@font-face</code> or loaded using <code id="text-styles:fontface"><a href="https://html.spec.whatwg.org/multipage/infrastructure.html#fontface">FontFace</a></code> objects that are visible to the
+ <a href="#font-style-source-object" id="text-styles:font-style-source-object-2">font style source object</a> must therefore be available once they are loaded. (Each <a href="#font-style-source-object" id="text-styles:font-style-source-object-3">font style source
+ object</a> has a <a data-x-internal="font-source" href="https://drafts.csswg.org/css-font-loading/#font-source" id="text-styles:font-source">font source</a>, which determines what fonts are available.) If a font
+ is used before it is fully loaded, or if the <a href="#font-style-source-object" id="text-styles:font-style-source-object-4">font style source object</a> does not have
+ that font in scope at the time the font is to be used, then it must be treated as if it was an
+ unknown font, falling back to another as described by the relevant CSS specifications. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSFONTS">[CSSFONTS]</a> <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSFONTLOAD">[CSSFONTLOAD]</a></p>
- <p>When the context is created, the <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code>
- attribute must initially have the value
- <code>source-over</code>.</p>
+ <p>On getting, the <code id="text-styles:dom-context-2d-font-2-2"><a href="#dom-context-2d-font-2">font</a></code> attribute must return the <a data-x-internal="serializing-a-css-value" href="https://drafts.csswg.org/cssom/#serialize-a-css-value" id="text-styles:serializing-a-css-value">serialized form</a> of the current font of the context (with
+ no <a data-x-internal="'line-height'" href="https://drafts.csswg.org/css2/visudet.html#propdef-line-height" id="text-styles:'line-height'-2">'line-height'</a> component). <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSOM">[CSSOM]</a></p>
+
+ <div class="example">
+
+ <p>For example, after the following statement:</p>
+
+ <pre>context.font = 'italic 400 12px/2 Unknown Font, sans-serif';</pre>
+
+ <p>...the expression <code>context.font</code> would evaluate to the string &quot;<code>italic 12px &quot;Unknown Font&quot;, sans-serif</code>&quot;. The &quot;400&quot;
+ font-weight doesn't appear because that is the default value. The line-height doesn't appear
+ because it is forced to &quot;normal&quot;, the default value.</p>
</div>
+ <p>When the object implementing the <code id="text-styles:canvastextdrawingstyles-2"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interface is created, the
+ font of the context must be set to 10px sans-serif. When the <a data-x-internal="'font-size'" href="https://drafts.csswg.org/css-fonts/#font-size-prop" id="text-styles:'font-size'-2">'font-size'</a> component is
+ set to lengths using percentages, <a data-x-internal="'em'" href="https://drafts.csswg.org/css-values/#em" id="text-styles:'em'">'em'</a> or <a data-x-internal="'ex'" href="https://drafts.csswg.org/css-values/#ex" id="text-styles:'ex'">'ex'</a> units, or the 'larger' or
+ 'smaller' keywords, these must be interpreted relative to the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="text-styles:computed-value">computed value</a> of the
+ <a data-x-internal="'font-size'" href="https://drafts.csswg.org/css-fonts/#font-size-prop" id="text-styles:'font-size'-3">'font-size'</a> property of the <a href="#font-style-source-object" id="text-styles:font-style-source-object-5">font style source object</a> at the time that
+ the attribute is set, if it is an element. When the <a data-x-internal="'font-weight'" href="https://drafts.csswg.org/css-fonts/#font-weight-prop" id="text-styles:'font-weight'">'font-weight'</a> component is set to
+ the relative values 'bolder' and 'lighter', these must be interpreted relative to the
+ <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="text-styles:computed-value-2">computed value</a> of the <a data-x-internal="'font-weight'" href="https://drafts.csswg.org/css-fonts/#font-weight-prop" id="text-styles:'font-weight'-2">'font-weight'</a> property of the <a href="#font-style-source-object" id="text-styles:font-style-source-object-6">font style
+ source object</a> at the time that the attribute is set, if it is an element. If the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="text-styles:computed-value-3">computed values</a> are undefined for a particular case (e.g. because
+ the <a href="#font-style-source-object" id="text-styles:font-style-source-object-7">font style source object</a> is not an element or is not <a href="https://html.spec.whatwg.org/multipage/rendering.html#being-rendered" id="text-styles:being-rendered">being
+ rendered</a>), then the relative keywords must be interpreted relative to the normal-weight
+ 10px sans-serif default.</p>
+
+ <p>The <dfn id="dom-context-2d-textalign-2"><code>textAlign</code></dfn> IDL attribute, on
+ getting, must return the current value. On setting, the current value must be changed to the new
+ value. When the object implementing the <code id="text-styles:canvastextdrawingstyles-3"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interface is
+ created, the <code id="text-styles:dom-context-2d-textalign-2-2"><a href="#dom-context-2d-textalign-2">textAlign</a></code> attribute must initially
+ have the value <code id="text-styles:dom-context-2d-textalign-start"><a href="#dom-context-2d-textalign-start">start</a></code>.</p>
+
+ <p>The <dfn id="dom-context-2d-textbaseline-2"><code>textBaseline</code></dfn> IDL attribute, on
+ getting, must return the current value. On setting, the current value must be changed to the new
+ value. When the object implementing the <code id="text-styles:canvastextdrawingstyles-4"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interface is
+ created, the <code id="text-styles:dom-context-2d-textbaseline-2-2"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute must
+ initially have the value <code id="text-styles:dom-context-2d-textbaseline-alphabetic-2"><a href="#dom-context-2d-textbaseline-alphabetic">alphabetic</a></code>.</p>
+
+ <p>The <dfn id="dom-context-2d-direction-2"><code>direction</code></dfn> IDL attribute, on
+ getting, must return the current value. On setting, the current value must be changed to the new
+ value. When the object implementing the <code id="text-styles:canvastextdrawingstyles-5"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interface is
+ created, the <code id="text-styles:dom-context-2d-direction-2-2"><a href="#dom-context-2d-direction-2">direction</a></code> attribute must initially
+ have the value &quot;<code id="text-styles:dom-context-2d-direction-inherit-2"><a href="#dom-context-2d-direction-inherit">inherit</a></code>&quot;.</p>
+
+
+
+ <p>The <code id="text-styles:dom-context-2d-textalign-2-3"><a href="#dom-context-2d-textalign-2">textAlign</a></code> attribute's allowed keywords are
+ as follows:</p>
+
+ <dl><dt><dfn id="dom-context-2d-textalign-start"><code>start</code></dfn>
+ </dt><dd><p>Align to the start edge of the text (left side in left-to-right text, right side in
+ right-to-left text).</p></dd><dt><dfn id="dom-context-2d-textalign-end"><code>end</code></dfn>
+ </dt><dd><p>Align to the end edge of the text (right side in left-to-right text, left side in
+ right-to-left text).</p></dd><dt><dfn id="dom-context-2d-textalign-left"><code>left</code></dfn>
+ </dt><dd><p>Align to the left.</p></dd><dt><dfn id="dom-context-2d-textalign-right"><code>right</code></dfn>
+ </dt><dd><p>Align to the right.</p></dd><dt><dfn id="dom-context-2d-textalign-center"><code>center</code></dfn>
+ </dt><dd><p>Align to the center.</p></dd></dl>
+
+ <p>The <code id="text-styles:dom-context-2d-textbaseline-2-3"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code>
+ attribute's allowed keywords correspond to alignment points in the
+ font:</p>
- <h6 id="colors-and-styles"><span class="secno">4.8.11.1.4 </span>Colors and styles</h6>
+ <p><img alt="The top of the em square is roughly at the top of the glyphs in a font, the hanging baseline is where some glyphs like आ are anchored, the middle is half-way between the top of the em square and the bottom of the em square, the alphabetic baseline is where characters like Á, ÿ, f, and Ω are anchored, the ideographic baseline is where glyphs like 私 and 達 are anchored, and the bottom of the em square is roughly at the bottom of the glyphs in a font. The top and bottom of the bounding box can be far from these baselines, due to glyphs extending far outside the em square." height="300" src="https://html.spec.whatwg.org/images/baselines.png" width="738"/></p>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> [ = <var title="">value</var> ]</dt>
+ <p>The keywords map to these alignment points as follows:</p>
- <dd>
+ <dl><dt><dfn id="dom-context-2d-textbaseline-top"><code>top</code></dfn>
+ </dt><dd>The top of the em square</dd><dt><dfn id="dom-context-2d-textbaseline-hanging"><code>hanging</code></dfn>
+ </dt><dd>The hanging baseline</dd><dt><dfn id="dom-context-2d-textbaseline-middle"><code>middle</code></dfn>
+ </dt><dd>The middle of the em square</dd><dt><dfn id="dom-context-2d-textbaseline-alphabetic"><code>alphabetic</code></dfn>
+ </dt><dd>The alphabetic baseline</dd><dt><dfn id="dom-context-2d-textbaseline-ideographic"><code>ideographic</code></dfn>
+ </dt><dd>The ideographic baseline</dd><dt><dfn id="dom-context-2d-textbaseline-bottom"><code>bottom</code></dfn>
+ </dt><dd>The bottom of the em square</dd></dl>
+
+ <p>The <code id="text-styles:dom-context-2d-direction-2-3"><a href="#dom-context-2d-direction-2">direction</a></code> attribute's allowed keywords are
+ as follows:</p>
+
+ <dl><dt><dfn id="dom-context-2d-direction-ltr"><code>ltr</code></dfn>
+
+ </dt><dd><p>Treat input to the <a href="#text-preparation-algorithm" id="text-styles:text-preparation-algorithm">text preparation algorithm</a> as left-to-right text.</p></dd><dt><dfn id="dom-context-2d-direction-rtl"><code>rtl</code></dfn>
+
+ </dt><dd><p>Treat input to the <a href="#text-preparation-algorithm" id="text-styles:text-preparation-algorithm-2">text preparation algorithm</a> as right-to-left text.</p></dd><dt><dfn id="dom-context-2d-direction-inherit"><code>inherit</code></dfn>
+
+ </dt><dd><p>Default to the directionality of the <code id="text-styles:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element or <code id="text-styles:document"><a href="https://html.spec.whatwg.org/multipage/dom.html#document">Document</a></code>
+ as appropriate.</p></dd></dl>
+
+ <p>The <dfn id="text-preparation-algorithm">text preparation algorithm</dfn> is as follows. It takes as input a string <var>text
+ </var>, a <code id="text-styles:canvastextdrawingstyles-6"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> object <var>target</var>, and an optional length
+ <var>maxWidth</var>. It returns an array of glyph shapes, each positioned on a common coordinate
+ space, a <var>physical alignment</var> whose value is one of <i>left</i>, <i>right</i>, and
+ <i>center</i>, and an <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box">inline box</a>. (Most callers of this algorithm ignore the
+ <var>physical alignment</var> and the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-2">inline box</a>.)</p>
+
+ <ol><li><p>If <var>maxWidth</var> was provided but is less than or equal to zero or equal to NaN,
+ then return an empty array.</p></li><li><p>Replace all <a data-x-internal="space-characters" href="https://infra.spec.whatwg.org/#ascii-whitespace" id="text-styles:space-characters">ASCII whitespace</a> in <var>text</var> with U+0020 SPACE
+ characters.</p></li><li><p>Let <var>font</var> be the current font of <var>target</var>, as given
+ by that object's <code id="text-styles:dom-context-2d-font-2-3"><a href="#dom-context-2d-font-2">font</a></code> attribute.</p></li><li>
+
+ <p>Apply the appropriate step from the following list to determine the value of <var>direction</var>:</p>
+
+ <dl class="switch"><dt>If the <var>target</var> object's <code id="text-styles:dom-context-2d-direction-2-4"><a href="#dom-context-2d-direction-2">direction</a></code> attribute has the value &quot;<code id="text-styles:dom-context-2d-direction-ltr"><a href="#dom-context-2d-direction-ltr">ltr</a></code>&quot;</dt><dd>Let <var>direction</var> be '<a href="https://html.spec.whatwg.org/multipage/dom.html#concept-ltr" id="text-styles:concept-ltr">ltr</a>'.</dd><dt>If the <var>target</var> object's <code id="text-styles:dom-context-2d-direction-2-5"><a href="#dom-context-2d-direction-2">direction</a></code> attribute has the value &quot;<code id="text-styles:dom-context-2d-direction-rtl"><a href="#dom-context-2d-direction-rtl">rtl</a></code>&quot;</dt><dd>Let <var>direction</var> be '<a href="https://html.spec.whatwg.org/multipage/dom.html#concept-rtl" id="text-styles:concept-rtl">rtl</a>'.</dd><dt>If the <var>target</var> object's <a href="#font-style-source-object" id="text-styles:font-style-source-object-8">font style source object</a> is an
+ element</dt><dd>Let <var>direction</var> be <a href="https://html.spec.whatwg.org/multipage/dom.html#the-directionality" id="text-styles:the-directionality">the directionality</a> of the <var>target</var> object's <a href="#font-style-source-object" id="text-styles:font-style-source-object-9">font style source object</a>.</dd><dt>If the <var>target</var> object's <a href="#font-style-source-object" id="text-styles:font-style-source-object-10">font style source object</a> is a
+ <code id="text-styles:document-2"><a href="https://html.spec.whatwg.org/multipage/dom.html#document">Document</a></code> with a non-null <a data-x-internal="document-element" href="https://dom.spec.whatwg.org/#document-element" id="text-styles:document-element">document element</a></dt><dd>Let <var>direction</var> be <a href="https://html.spec.whatwg.org/multipage/dom.html#the-directionality" id="text-styles:the-directionality-2">the directionality</a> of the <var>target</var>
+ object's <a href="#font-style-source-object" id="text-styles:font-style-source-object-11">font style source object</a>'s <a data-x-internal="document-element" href="https://dom.spec.whatwg.org/#document-element" id="text-styles:document-element-2">document element</a>.</dd><dt>Otherwise</dt><dd>Let <var>direction</var> be '<a href="https://html.spec.whatwg.org/multipage/dom.html#concept-ltr" id="text-styles:concept-ltr-2">ltr</a>'.</dd></dl>
+
+ </li><li><p>Form a hypothetical infinitely-wide CSS <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="text-styles:line-box">line box</a> containing a single
+ <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-3">inline box</a> containing the text <var>text</var>, with all the properties at their
+ initial values except the <a data-x-internal="'font'" href="https://drafts.csswg.org/css-fonts/#font-prop" id="text-styles:'font'-2">'font'</a> property of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-4">inline box</a> set to
+ <var>font</var>, the <a data-x-internal="'direction'" href="https://drafts.csswg.org/css-writing-modes/#direction" id="text-styles:'direction'">'direction'</a> property of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-5">inline box</a> set to
+ <var>direction</var>, and the <a data-x-internal="'white-space'" href="https://drafts.csswg.org/css-text/#white-space-property" id="text-styles:'white-space'">'white-space'</a> property set to 'pre'. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSS">[CSS]</a></p></li><li><p>If <var>maxWidth</var> was provided and the hypothetical width of the
+ <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-6">inline box</a> in the hypothetical <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="text-styles:line-box-2">line box</a> is greater than
+ <var>maxWidth</var> <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="text-styles:'px'-2">CSS pixels</a>, then change <var>font</var> to have a
+ more condensed font (if one is available or if a reasonably readable one can be synthesized by
+ applying a horizontal scale factor to the font) or a smaller font, and return to the previous
+ step.</p></li><li>
+
+ <p>The <var>anchor point</var> is a point on the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-7">inline box</a>, and the <var>physical
+ alignment</var> is one of the values <i>left</i>, <i>right</i>, and <i>center</i>. These
+ variables are determined by the <code id="text-styles:dom-context-2d-textalign-2-4"><a href="#dom-context-2d-textalign-2">textAlign</a></code> and
+ <code id="text-styles:dom-context-2d-textbaseline-2-4"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> values as follows:</p>
- <p>Returns the current style used for stroking shapes.</p>
+ <p>Horizontal position:</p>
- <p>Can be set, to change the stroke style.</p>
+ <dl><dt>If <code id="text-styles:dom-context-2d-textalign-2-5"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-left"><a href="#dom-context-2d-textalign-left">left</a></code></dt><dt>If <code id="text-styles:dom-context-2d-textalign-2-6"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-start-2"><a href="#dom-context-2d-textalign-start">start</a></code> and <var>direction</var> is
+ 'ltr'</dt><dt>If <code id="text-styles:dom-context-2d-textalign-2-7"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-end"><a href="#dom-context-2d-textalign-end">end</a></code> and <var>direction</var> is 'rtl'</dt><dd>Let the <var>anchor point</var>'s horizontal position be the left edge of the
+ <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-8">inline box</a>, and let <var>physical alignment</var> be <i>left</i>.</dd><dt>If <code id="text-styles:dom-context-2d-textalign-2-8"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-right"><a href="#dom-context-2d-textalign-right">right</a></code></dt><dt>If <code id="text-styles:dom-context-2d-textalign-2-9"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-end-2"><a href="#dom-context-2d-textalign-end">end</a></code> and <var>direction</var> is 'ltr'</dt><dt>If <code id="text-styles:dom-context-2d-textalign-2-10"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-start-3"><a href="#dom-context-2d-textalign-start">start</a></code> and <var>direction</var> is
+ 'rtl'</dt><dd>Let the <var>anchor point</var>'s horizontal position be the right edge of the
+ <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-9">inline box</a>, and let <var>physical alignment</var> be <i>right</i>.</dd><dt>If <code id="text-styles:dom-context-2d-textalign-2-11"><a href="#dom-context-2d-textalign-2">textAlign</a></code> is <code id="text-styles:dom-context-2d-textalign-center"><a href="#dom-context-2d-textalign-center">center</a></code></dt><dd>Let the <var>anchor point</var>'s horizontal position be half way between the left
+ and right edges of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-10">inline box</a>, and let <var>physical alignment</var> be
+ <i>center</i>.</dd></dl>
- <p>The style can be either a string containing a CSS color, or a
- <code><a href="#canvasgradient">CanvasGradient</a></code> or <code><a href="#canvaspattern">CanvasPattern</a></code>
- object. Invalid values are ignored.</p>
+ <p>Vertical position:</p>
- </dd>
+ <dl><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-5"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-top"><a href="#dom-context-2d-textbaseline-top">top</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be the top of the em box of
+ the first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-11">inline box</a>.</dd><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-6"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-hanging"><a href="#dom-context-2d-textbaseline-hanging">hanging</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be the hanging baseline of the
+ first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-12">inline box</a>.</dd><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-7"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-middle"><a href="#dom-context-2d-textbaseline-middle">middle</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be half way between the bottom
+ and the top of the em box of the first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-13">inline box</a>.</dd><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-8"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-alphabetic-3"><a href="#dom-context-2d-textbaseline-alphabetic">alphabetic</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be the alphabetic baseline of
+ the first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-14">inline box</a>.</dd><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-9"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-ideographic"><a href="#dom-context-2d-textbaseline-ideographic">ideographic</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be the ideographic baseline of
+ the first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-15">inline box</a>.</dd><dt>If <code id="text-styles:dom-context-2d-textbaseline-2-10"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> is <code id="text-styles:dom-context-2d-textbaseline-bottom"><a href="#dom-context-2d-textbaseline-bottom">bottom</a></code></dt><dd>Let the <var>anchor point</var>'s vertical position be the bottom of the em box of
+ the first available font of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-16">inline box</a>.</dd></dl>
- <dt><var title="">context</var> . <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> [ = <var title="">value</var> ]</dt>
+ </li><li>
- <dd>
+ <p>Let <var>result</var> be an array constructed by iterating over each glyph in the
+ <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-17">inline box</a> from left to right (if any), adding to the array, for each glyph, the
+ shape of the glyph as it is in the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="text-styles:inline-box-18">inline box</a>, positioned on a coordinate space
+ using <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="text-styles:'px'-3">CSS pixels</a> with its origin is at the <var>anchor
+ point</var>.</p>
- <p>Returns the current style used for filling shapes.</p>
+ </li><li><p>Return <var>result</var>, <var>physical alignment</var>, and the inline
+ box.</p></li></ol>
- <p>Can be set, to change the fill style.</p>
- <p>The style can be either a string containing a CSS color, or a
- <code><a href="#canvasgradient">CanvasGradient</a></code> or <code><a href="#canvaspattern">CanvasPattern</a></code>
- object. Invalid values are ignored.</p>
-
- </dd>
-
- </dl><div class="impl">
-
- <!-- v6 feature requests:
-
- * Getting and setting colours by component to bypass the CSS value parsing.
-
- Either:
- context.fillStyle.red += 1;
-
- Or:
- var array = context.fillStyle;
- array[1] += 1;
- context.fillStyle = array;
-
- * A more performant way of setting colours in general, e.g.:
-
- context.setFillColor(r,g,b,a) // already supported by webkit
-
- Or:
-
- context.fillStyle = 0xRRGGBBAA; // set a 32bit int directly
-
- * fill rule for deciding between winding and even-odd algorithms.
- SVG has fill-rule: nonzero | evenodd
- http://www.w3.org/TR/SVG/painting.html#FillProperties
-
- -->
-
- <p>The <dfn id="dom-context-2d-strokestyle" title="dom-context-2d-strokeStyle"><code>strokeStyle</code></dfn>
- attribute represents the color or style to use for the lines around
- shapes, and the <dfn id="dom-context-2d-fillstyle" title="dom-context-2d-fillStyle"><code>fillStyle</code></dfn>
- attribute represents the color or style to use inside the
- shapes.</p>
-
- <p>Both attributes can be either strings,
- <code><a href="#canvasgradient">CanvasGradient</a></code>s, or <code><a href="#canvaspattern">CanvasPattern</a></code>s. On
- setting, strings must be <a href="#parsed-as-a-css-color-value" title="parsed as a CSS &lt;color&gt;
- value">parsed as CSS &lt;color&gt; values</a> and the color
- assigned, and <code><a href="#canvasgradient">CanvasGradient</a></code> and
- <code><a href="#canvaspattern">CanvasPattern</a></code> objects must be assigned themselves. <a href="#refsCSSCOLOR">[CSSCOLOR]</a> If the value is a string but
- cannot be <a href="#parsed-as-a-css-color-value">parsed as a CSS &lt;color&gt; value</a>, or is
- neither a string, a <code><a href="#canvasgradient">CanvasGradient</a></code>, nor a
- <code><a href="#canvaspattern">CanvasPattern</a></code>, then it must be ignored, and the
- attribute must retain its previous value.</p>
-
- <p>When set to a <code><a href="#canvaspattern">CanvasPattern</a></code> or
- <code><a href="#canvasgradient">CanvasGradient</a></code> object, the assignment is
- <a href="#live">live</a>, meaning that changes made to the object after the
- assignment do affect subsequent stroking or filling of shapes.</p>
-
- <p>On getting, if the value is a color, then the <a href="#serialization-of-a-color" title="serialization of a color">serialization of the color</a>
- must be returned. Otherwise, if it is not a color but a
- <code><a href="#canvasgradient">CanvasGradient</a></code> or <code><a href="#canvaspattern">CanvasPattern</a></code>, then the
- respective object must be returned. (Such objects are opaque and
- therefore only useful for assigning to other attributes or for
- comparison to other gradients or patterns.)</p>
-
- <p>The <dfn id="serialization-of-a-color">serialization of a color</dfn> for a color value is a
- string, computed as follows: if it has alpha equal to 1.0, then the
- string is a lowercase six-digit hex value, prefixed with a &quot;#&quot;
- character (U+0023 NUMBER SIGN), with the first two digits
- representing the red component, the next two digits representing the
- green component, and the last two digits representing the blue
- component, the digits being in the range 0-9 a-f (U+0030 to U+0039
- and U+0061 to U+0066). Otherwise, the color value has alpha less
- than 1.0, and the string is the color value in the CSS <code title="">rgba()</code> functional-notation format: the literal
- string <code title="">rgba</code> (U+0072 U+0067 U+0062 U+0061)
- followed by a U+0028 LEFT PARENTHESIS, a base-ten integer in the
- range 0-255 representing the red component (using digits 0-9, U+0030
- to U+0039, in the shortest form possible), a literal U+002C COMMA
- and U+0020 SPACE, an integer for the green component, a comma and a
- space, an integer for the blue component, another comma and space, a
- U+0030 DIGIT ZERO, if the alpha value is greater than zero then a
- U+002E FULL STOP (representing the decimal point), if the alpha
- value is greater than zero then one or more digits in the range 0-9
- (U+0030 to U+0039) representing the fractional part of the alpha
- value, and finally a U+0029 RIGHT PARENTHESIS.</p> <!-- if people
- complain this is unreadable, expand it into a <dl> with two nested
- <ol>s -->
-
- <p>When the context is created, the <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> and <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> attributes must
- initially have the string value <code title="">#000000</code>.</p>
+ <h6 id="building-paths"><span class="secno">4.12.5.1.5</span> Building paths<a class="self-link" href="#building-paths"/></h6>
- </div>
+ <p>Objects that implement the <code id="building-paths:canvaspath"><a href="#canvaspath">CanvasPath</a></code> interface have a <a href="#concept-path" id="building-paths:concept-path">path</a>. A <dfn id="concept-path">path</dfn> has a list of zero or
+ more subpaths. Each subpath consists of a list of one or more points, connected by straight or
+ curved <dfn id="line-segments">line segments</dfn>, and a flag indicating whether the subpath is closed or not. A
+ closed subpath is one where the last point of the subpath is connected to the first point of the
+ subpath by a straight line. Subpaths with only one point are ignored when painting the path.</p>
- <hr/><p>There are two types of gradients, linear gradients and radial
- gradients, both represented by objects implementing the opaque
- <code><a href="#canvasgradient">CanvasGradient</a></code> interface.</p>
+ <p><a href="#concept-path" id="building-paths:concept-path-2">Paths</a> have a <dfn id="need-new-subpath">need new subpath</dfn> flag. When this
+ flag is set, certain APIs create a new subpath rather than extending the previous one. When a
+ <a href="#concept-path" id="building-paths:concept-path-3">path</a> is created, its <a href="#need-new-subpath" id="building-paths:need-new-subpath">need new subpath</a> flag must be
+ set.</p>
- <p id="interpolation">Once a gradient has been created (see below),
- stops are placed along it to define how the colors are distributed
- along the gradient. <span class="impl">The color of the gradient at
- each stop is the color specified for that stop. Between each such
- stop, the colors and the alpha component must be linearly
- interpolated over the RGBA space without premultiplying the alpha
- value to find the color to use at that offset. Before the first
- stop, the color must be the color of the first stop. After the last
- stop, the color must be the color of the last stop. When there are
- no stops, the gradient is transparent black.</span></p>
+ <p>When an object implementing the <code id="building-paths:canvaspath-2"><a href="#canvaspath">CanvasPath</a></code> interface is created, its <a href="#concept-path" id="building-paths:concept-path-4">path</a> must be initialized to zero subpaths.</p>
- <dl class="domintro"><dt><var title="">gradient</var> . <code title="dom-canvasgradient-addColorStop"><a href="#dom-canvasgradient-addcolorstop">addColorStop</a></code>(<var title="">offset</var>, <var title="">color</var>)</dt>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-moveto"><a href="#dom-context-2d-moveto-2">moveTo</a></code>(<var>x</var>, <var>y</var>)</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-moveto-2"><a href="#dom-context-2d-moveto-2">moveTo</a></code>(<var>x</var>, <var>y</var>)</dt><dd>
- <dd>
+ <p>Creates a new subpath with the given point.</p>
- <p>Adds a color stop with the given color to the gradient at the
- given offset. 0.0 is the offset at one end of the gradient, 1.0 is
- the offset at the other end.</p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-closepath"><a href="#dom-context-2d-closepath-2">closePath</a></code>()</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-closepath-2"><a href="#dom-context-2d-closepath-2">closePath</a></code>()</dt><dd>
- <p>Throws an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception if the offset
- is out of range. Throws a <code><a href="#syntax_err">SYNTAX_ERR</a></code> exception if the
- color cannot be parsed.</p>
+ <p>Marks the current subpath as closed, and starts a new subpath with a point the same as the
+ start and end of the newly closed subpath.</p>
- </dd>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-lineto"><a href="#dom-context-2d-lineto-2">lineTo</a></code>(<var>x</var>, <var>y</var>)</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-lineto-2"><a href="#dom-context-2d-lineto-2">lineTo</a></code>(<var>x</var>, <var>y</var>)</dt><dd>
- <dt><var title="">gradient</var> = <var title="">context</var> . <code title="dom-context-2d-createLinearGradient"><a href="#dom-context-2d-createlineargradient">createLinearGradient</a></code>(<var title="">x0</var>, <var title="">y0</var>, <var title="">x1</var>, <var title="">y1</var>)</dt>
+ <p>Adds the given point to the current subpath, connected to the previous one by a straight
+ line.</p>
- <dd>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-quadraticcurveto"><a href="#dom-context-2d-quadraticcurveto-2">quadraticCurveTo</a></code>(<var>cpx</var>, <var>cpy</var>, <var>x</var>, <var>y</var>)</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-quadraticcurveto-2"><a href="#dom-context-2d-quadraticcurveto-2">quadraticCurveTo</a></code>(<var>cpx</var>, <var>cpy</var>, <var>x</var>, <var>y</var>)</dt><dd>
- <p>Returns a <code><a href="#canvasgradient">CanvasGradient</a></code> object that represents a
- linear gradient that paints along the line given by the
- coordinates represented by the arguments.</p>
+ <p>Adds the given point to the current subpath, connected to the previous one by a quadratic
+ Bézier curve with the given control point.</p>
- <p>If any of the arguments are not finite numbers, throws a
- <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception.</p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-beziercurveto"><a href="#dom-context-2d-beziercurveto-2">bezierCurveTo</a></code>(<var>cp1x</var>, <var>cp1y</var>, <var>cp2x</var>, <var>cp2y</var>, <var>x</var>, <var>y</var>)</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-beziercurveto-2"><a href="#dom-context-2d-beziercurveto-2">bezierCurveTo</a></code>(<var>cp1x</var>, <var>cp1y</var>, <var>cp2x</var>, <var>cp2y</var>, <var>x</var>, <var>y</var>)</dt><dd>
- </dd>
+ <p>Adds the given point to the current subpath, connected to the previous one by a cubic
+ Bézier curve with the given control points.</p>
- <dt><var title="">gradient</var> = <var title="">context</var> . <code title="dom-context-2d-createRadialGradient"><a href="#dom-context-2d-createradialgradient">createRadialGradient</a></code>(<var title="">x0</var>, <var title="">y0</var>, <var title="">r0</var>, <var title="">x1</var>, <var title="">y1</var>, <var title="">r1</var>)</dt>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-arcto"><a href="#dom-context-2d-arcto-2">arcTo</a></code>(<var>x1</var>, <var>y1</var>, <var>x2</var>, <var>y2</var>, <var>radiusX</var> [, <var>radiusY</var>, <var>rotation</var> ] )</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-arcto-2"><a href="#dom-context-2d-arcto-2">arcTo</a></code>(<var>x1</var>, <var>y1</var>, <var>x2</var>, <var>y2</var>, <var>radiusX</var> [, <var>radiusY</var>, <var>rotation</var> ] )</dt><dd>
- <dd>
+ <p>Adds an arc with the given control points and radius to the current subpath, connected to the
+ previous point by a straight line.</p>
- <p>Returns a <code><a href="#canvasgradient">CanvasGradient</a></code> object that represents a
- radial gradient that paints along the cone given by the circles
- represented by the arguments.</p>
+ <p>If two radii are provided, then the first controls the width of the arc's ellipse, and the
+ second controls the height. If only one is provided, or if they are the same, then the arc is
+ from a circle. In the case of an ellipse, the rotation argument controls the clockwise
+ inclination of the ellipse relative to the x-axis.</p>
- <p>If any of the arguments are not finite numbers, throws a
- <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception. If either of the radii
- are negative, throws an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception.</p>
-
- </dd>
-
- </dl><div class="impl">
-
- <p>The <dfn id="dom-canvasgradient-addcolorstop" title="dom-canvasgradient-addColorStop"><code>addColorStop(<var title="">offset</var>, <var title="">color</var>)</code></dfn>
- method on the <code><a href="#canvasgradient">CanvasGradient</a></code> interface adds a new stop
- to a gradient. If the <var title="">offset</var> is less than 0,
- greater than 1, infinite, or NaN, then an
- <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception must be raised. If the <var title="">color</var> cannot be <a href="#parsed-as-a-css-color-value">parsed as a CSS &lt;color&gt;
- value</a>, then a <code><a href="#syntax_err">SYNTAX_ERR</a></code> exception must be
- raised. Otherwise, the gradient must have a new stop placed, at
- offset <var title="">offset</var> relative to the whole gradient,
- and with the color obtained by parsing <var title="">color</var> as
- a CSS &lt;color&gt; value. If multiple stops are added at the same
- offset on a gradient, they must be placed in the order added, with
- the first one closest to the start of the gradient, and each
- subsequent one infinitesimally further along towards the end point
- (in effect causing all but the first and last stop added at each
- point to be ignored).</p>
-
- <p>The <dfn id="dom-context-2d-createlineargradient" title="dom-context-2d-createLinearGradient"><code>createLinearGradient(<var title="">x0</var>, <var title="">y0</var>, <var title="">x1</var>,
- <var title="">y1</var>)</code></dfn> method takes four arguments
- that represent the start point (<var title="">x0</var>, <var title="">y0</var>) and end point (<var title="">x1</var>, <var title="">y1</var>) of the gradient. If any of the arguments to <code title="dom-context-2d-createLinearGradient"><a href="#dom-context-2d-createlineargradient">createLinearGradient()</a></code>
- are infinite or NaN, the method must raise a
- <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception. Otherwise, the method must
- return a linear <code><a href="#canvasgradient">CanvasGradient</a></code> initialized with the
- specified line.</p>
-
- <p>Linear gradients must be rendered such that all points on a line
- perpendicular to the line that crosses the start and end points have
- the color at the point where those two lines cross (with the colors
- coming from the <a href="#interpolation">interpolation and
- extrapolation</a> described above). The points in the linear
- gradient must be transformed as described by the <a href="#transformations" title="dom-context-2d-transformation">current transformation
- matrix</a> when rendering.</p>
-
- <p>If <span title=""><var title="">x0</var> = <var title="">x1</var></span> and <span title=""><var title="">y0</var> = <var title="">y1</var></span>, then
- the linear gradient must paint nothing.</p>
-
- <p>The <dfn id="dom-context-2d-createradialgradient" title="dom-context-2d-createRadialGradient"><code>createRadialGradient(<var title="">x0</var>, <var title="">y0</var>, <var title="">r0</var>,
- <var title="">x1</var>, <var title="">y1</var>, <var title="">r1</var>)</code></dfn> method takes six arguments, the
- first three representing the start circle with origin (<var title="">x0</var>, <var title="">y0</var>) and radius <var title="">r0</var>, and the last three representing the end circle
- with origin (<var title="">x1</var>, <var title="">y1</var>) and
- radius <var title="">r1</var>. The values are in coordinate space
- units. If any of the arguments are infinite or NaN, a
- <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception must be raised. If either
- of <var title="">r0</var> or <var title="">r1</var> are negative, an
- <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception must be raised. Otherwise,
- the method must return a radial <code><a href="#canvasgradient">CanvasGradient</a></code>
- initialized with the two specified circles.</p>
+ <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="building-paths:indexsizeerror">&quot;<code>IndexSizeError</code>&quot;</a> <code id="building-paths:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the given
+ radius is negative.</p>
- <p>Radial gradients must be rendered by following these steps:</p>
+ <figure class="diagrams">
+
+ <img alt="" height="254" src="https://html.spec.whatwg.org/images/arcTo1.png" width="357"/>
+ <img alt="" height="310" src="https://html.spec.whatwg.org/images/arcTo2.png" width="468"/>
+ <img alt="" height="233" src="https://html.spec.whatwg.org/images/arcTo3.png" width="513"/>
+ </figure>
- <ol><li><p>If <span title=""><var title="">x<sub>0</sub></var> = <var title="">x<sub>1</sub></var></span> and <span title=""><var title="">y<sub>0</sub></var> = <var title="">y<sub>1</sub></var></span> and <span title=""><var title="">r<sub>0</sub></var> = <var title="">r<sub>1</sub></var></span>, then the radial gradient must
- paint nothing. Abort these steps.</p></li>
- <li>
- <p>Let <span title="">x(<var title="">ω</var>) = (<var title="">x<sub>1</sub></var>-<var title="">x<sub>0</sub></var>)<var title="">ω</var> + <var title="">x<sub>0</sub></var></span></p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-arc"><a href="#dom-context-2d-arc-2">arc</a></code>(<var>x</var>, <var>y</var>, <var>radius</var>, <var>startAngle</var>, <var>endAngle</var> [, <var>anticlockwise</var> ] )</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-arc-2"><a href="#dom-context-2d-arc-2">arc</a></code>(<var>x</var>, <var>y</var>, <var>radius</var>, <var>startAngle</var>, <var>endAngle</var> [, <var>anticlockwise</var> ] )</dt><dd>
- <p>Let <span title="">y(<var title="">ω</var>) = (<var title="">y<sub>1</sub></var>-<var title="">y<sub>0</sub></var>)<var title="">ω</var> + <var title="">y<sub>0</sub></var></span></p>
+ <p>Adds points to the subpath such that the arc described by the circumference of the circle
+ described by the arguments, starting at the given start angle and ending at the given end angle,
+ going in the given direction (defaulting to clockwise), is added to the path, connected to the
+ previous point by a straight line.</p>
- <p>Let <span title="">r(<var title="">ω</var>) = (<var title="">r<sub>1</sub></var>-<var title="">r<sub>0</sub></var>)<var title="">ω</var> + <var title="">r<sub>0</sub></var></span></p>
+ <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="building-paths:indexsizeerror-2">&quot;<code>IndexSizeError</code>&quot;</a> <code id="building-paths:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the given
+ radius is negative.</p>
- <p>Let the color at <var title="">ω</var> be the color at
- that position on the gradient (with the colors coming from the <a href="#interpolation">interpolation and extrapolation</a>
- described above).</p>
+ <figure class="diagrams">
+
+ <img alt="" height="255" src="https://html.spec.whatwg.org/images/arc1.png" width="590"/>
+ </figure>
- </li>
-
- <li><p>For all values of <var title="">ω</var> where <span title="">r(<var title="">ω</var>) &gt; 0</span>,
- starting with the value of <var title="">ω</var> nearest to
- positive infinity and ending with the value of <var title="">ω</var> nearest to negative infinity, draw the
- circumference of the circle with radius <span title="">r(<var title="">ω</var>)</span> at position (<span title="">x(<var title="">ω</var>)</span>, <span title="">y(<var title="">ω</var>)</span>), with the color at <var title="">ω</var>, but only painting on the parts of the
- canvas that have not yet been painted on by earlier circles in this
- step for this rendering of the gradient.</p></li>
-
- </ol><p class="note">This effectively creates a cone, touched by the two
- circles defined in the creation of the gradient, with the part of
- the cone before the start circle (0.0) using the color of the first
- offset, the part of the cone after the end circle (1.0) using the
- color of the last offset, and areas outside the cone untouched by
- the gradient (transparent black).</p>
-
- <p>The points in the radial gradient must be transformed as
- described by the <a href="#transformations" title="dom-context-2d-transformation">current
- transformation matrix</a> when rendering.</p>
-
- <p>Gradients must be painted only where the relevant stroking or
- filling effects requires that they be drawn.</p>
-
-<!--
- <p>Support for actually painting gradients is optional. Instead of
- painting the gradients, user agents may instead just paint the first
- stop's color. However, <code
- title="dom-context-2d-createLinearGradient">createLinearGradient()</code>
- and <code
- title="dom-context-2d-createRadialGradient">createRadialGradient()</code>
- must always return objects when passed valid arguments.</p>
--->
- </div>
- <hr/><p>Patterns are represented by objects implementing the opaque
- <code><a href="#canvaspattern">CanvasPattern</a></code> interface.</p>
-
- <dl class="domintro"><dt><var title="">pattern</var> = <var title="">context</var> . <code title="dom-context-2d-createPattern"><a href="#dom-context-2d-createpattern">createPattern</a></code>(<var title="">image</var>, <var title="">repetition</var>)</dt>
-
- <dd>
-
- <p>Returns a <code><a href="#canvaspattern">CanvasPattern</a></code> object that uses the given image
- and repeats in the direction(s) given by the <var title="">repetition</var> argument.</p>
-
- <p>The allowed values for <var title="">repetition</var> are <code title="">repeat</code> (both directions), <code title="">repeat-x</code> (horizontal only), <code title="">repeat-y</code> (vertical only), and <code title="">no-repeat</code> (neither). If the <var title="">repetition</var> argument is empty, the value <code title="">repeat</code> is used.</p>
-
- <p>If the image has no image data, throws an
- <code><a href="#invalid_state_err">INVALID_STATE_ERR</a></code> exception. If the second argument
- isn't one of the allowed values, throws a <code><a href="#syntax_err">SYNTAX_ERR</a></code>
- exception. If the image isn't yet fully decoded, then the method
- returns null.</p>
-
- </dd>
-
- </dl><div class="impl">
-
- <p>To create objects of this type, the <dfn id="dom-context-2d-createpattern" title="dom-context-2d-createPattern"><code>createPattern(<var title="">image</var>, <var title="">repetition</var>)</code></dfn>
- method is used. The first argument gives the image to use as the
- pattern (either an <code><a href="#htmlimageelement">HTMLImageElement</a></code>,
- <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, or <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>
- object). Modifying this image after calling the <code title="dom-context-2d-createPattern"><a href="#dom-context-2d-createpattern">createPattern()</a></code> method
- must not affect the pattern. The second argument must be a string
- with one of the following values: <code title="">repeat</code>,
- <code title="">repeat-x</code>, <code title="">repeat-y</code>,
- <code title="">no-repeat</code>. If the empty string is specified,
- <code title="">repeat</code> must be assumed. If an unrecognized value
- is given, then the user agent must raise a <code><a href="#syntax_err">SYNTAX_ERR</a></code>
- exception. User agents must recognize the four values described above
- exactly (e.g. they must not do case folding). Except as specified
- below, the method must return a <code><a href="#canvaspattern">CanvasPattern</a></code> object
- suitably initialized.</p>
-
- <p>The <var title="">image</var> argument is an instance of either
- <code><a href="#htmlimageelement">HTMLImageElement</a></code>, <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, or
- <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>.</p> <!-- drawImage() has an equivalent
- paragraph -->
-
- <p>If the <var title="">image</var> argument is an
- <code><a href="#htmlimageelement">HTMLImageElement</a></code> object that is not <a href="#img-good" title="img-good">fully decodable</a>, or if the <var title="">image</var> argument is an <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>
- object whose <code title="dom-media-readyState"><a href="#dom-media-readystate">readyState</a></code>
- attribute is either <code title="dom-media-HAVE_NOTHING"><a href="#dom-media-have_nothing">HAVE_NOTHING</a></code> or <code title="dom-media-HAVE_METADATA"><a href="#dom-media-have_metadata">HAVE_METADATA</a></code>, then the
- implementation must return null.</p> <!-- drawImage() has an
- equivalent paragraph -->
-
- <p>If the <var title="">image</var> argument is an
- <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> object with either a horizontal
- dimension or a vertical dimension equal to zero, then the
- implementation must raise an <code><a href="#invalid_state_err">INVALID_STATE_ERR</a></code>
- exception.</p>
- <!-- drawImage() has an equivalent paragraph -->
-
- <p>Patterns must be painted so that the top left of the first image
- is anchored at the origin of the coordinate space, and images are
- then repeated horizontally to the left and right (if the
- <code>repeat-x</code> string was specified) or vertically up and
- down (if the <code>repeat-y</code> string was specified) or in all
- four directions all over the canvas (if the <code>repeat</code>
- string was specified). The images are not scaled by this process;
- one CSS pixel of the image must be painted on one coordinate space
- unit. Of course, patterns must actually be painted only where the
- stroking or filling effect requires that they be drawn, and are
- affected by the current transformation matrix.</p>
-
- <p>If the original image data is a bitmap image, the value painted
- at a point in the area of the repetitions is computed by filtering
- the original image data. The user agent may use any filtering
- algorithm (for example bilinear interpolation or nearest-neighbor).
- When the filtering algorithm requires a pixel value from outside the
- original image data, it must instead use the value from wrapping the
- pixel's coordinates to the original image's dimensions. (That is,
- the filter uses 'repeat' behavior, regardless of the value of
- <var title="">repetition</var>.)
- <!-- drawImage() has a similar paragraph with different rules -->
-
- </p><p>When the <code title="dom-context-2d-createPattern"><a href="#dom-context-2d-createpattern">createPattern()</a></code> method
- is passed an animated image as its <var title="">image</var>
- argument, the user agent must use the poster frame of the animation,
- or, if there is no poster frame, the first frame of the
- animation.</p>
- <!-- drawImage() has an equivalent paragraph -->
-
- <p>When the <var title="">image</var> argument is an
- <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>, then the frame at the <a href="#current-playback-position">current
- playback position</a> must be used as the source image, and the
- source image's dimensions must be the <a href="#concept-video-intrinsic-width" title="concept-video-intrinsic-width">intrinsic width</a> and
- <a href="#concept-video-intrinsic-height" title="concept-video-intrinsic-height">intrinsic height</a>
- of the <a href="#media-resource">media resource</a> (i.e. after any aspect-ratio
- correction has been applied).</p>
- <!-- drawImage() has an equivalent paragraph -->
-
- <!--
- Requests for v6 features:
- * apply transforms to patterns, so you don't have to create
- transformed patterns manually by rendering them to an off-screen
- canvas then using that canvas as the pattern.
- -->
+ </dd><dt><var>context</var> . <code id="dom-context-2d-ellipse"><a href="#dom-context-2d-ellipse-2">ellipse</a></code>(<var>x</var>, <var>y</var>, <var>radiusX</var>, <var>radiusY</var>, <var>rotation</var>, <var>startAngle</var>, <var>endAngle</var> [, <var>anticlockwise</var>] )</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-ellipse-2"><a href="#dom-context-2d-ellipse-2">ellipse</a></code>(<var>x</var>, <var>y</var>, <var>radiusX</var>, <var>radiusY</var>, <var>rotation</var>, <var>startAngle</var>, <var>endAngle</var> [, <var>anticlockwise</var>] )</dt><dd>
- </div>
+ <p>Adds points to the subpath such that the arc described by the circumference of the ellipse
+ described by the arguments, starting at the given start angle and ending at the given end angle,
+ going in the given direction (defaulting to clockwise), is added to the path, connected to the
+ previous point by a straight line.</p>
+ <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="building-paths:indexsizeerror-3">&quot;<code>IndexSizeError</code>&quot;</a> <code id="building-paths:domexception-3"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the given
+ radius is negative.</p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-rect"><a href="#dom-context-2d-rect-2">rect</a></code>(<var>x</var>, <var>y</var>, <var>w</var>, <var>h</var>)</dt><dt><var>path</var> . <code id="building-paths:dom-context-2d-rect-2"><a href="#dom-context-2d-rect-2">rect</a></code>(<var>x</var>, <var>y</var>, <var>w</var>, <var>h</var>)</dt><dd>
- <h6 id="line-styles"><span class="secno">4.8.11.1.5 </span>Line styles</h6>
+ <p>Adds a new closed subpath to the path, representing the given rectangle.</p>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-lineWidth"><a href="#dom-context-2d-linewidth">lineWidth</a></code> [ = <var title="">value</var> ]</dt>
+ </dd></dl>
- <dd>
+
+
+ <p>The following methods allow authors to manipulate the <a href="#concept-path" id="building-paths:concept-path-5">paths</a>
+ of objects implementing the <code id="building-paths:canvaspath-3"><a href="#canvaspath">CanvasPath</a></code> interface.</p>
+
+ <p>For objects implementing the <code id="building-paths:canvasdrawpath"><a href="#canvasdrawpath">CanvasDrawPath</a></code> and <code id="building-paths:canvastransform"><a href="#canvastransform">CanvasTransform</a></code>
+ interfaces, the points passed to the methods, and the resulting lines added to <a href="#current-default-path" id="building-paths:current-default-path">current
+ default path</a> by these methods, must be transformed according to the <a href="#transformations" id="building-paths:transformations">current transformation matrix</a> before being added to
+ the path.</p>
+
+ <p>The <dfn id="dom-context-2d-moveto-2"><code>moveTo(<var>x</var>, <var>y</var>)</code></dfn>
+ method, when invoked, must run these steps:</p>
+
+ <ol><li><p>If either of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Create a new subpath with the specified point as its first (and only) point.</p></li></ol>
+
+ <p>When the user agent is to <dfn id="ensure-there-is-a-subpath">ensure there is a subpath</dfn> for a coordinate (<var>x</var>,
+ <var>y</var>) on a <a href="#concept-path" id="building-paths:concept-path-6">path</a>, the user agent must check to see if
+ the <a href="#concept-path" id="building-paths:concept-path-7">path</a> has its <a href="#need-new-subpath" id="building-paths:need-new-subpath-2">need new subpath</a> flag set. If it
+ does, then the user agent must create a new subpath with the point (<var>x</var>, <var>y</var>) as
+ its first (and only) point, as if the <code id="building-paths:dom-context-2d-moveto-2-2"><a href="#dom-context-2d-moveto-2">moveTo()</a></code> method
+ had been called, and must then unset the <a href="#concept-path" id="building-paths:concept-path-8">path</a>'s <a href="#need-new-subpath" id="building-paths:need-new-subpath-3">need new
+ subpath</a> flag.</p>
+
+
+ <p>The <dfn id="dom-context-2d-closepath-2"><code>closePath()</code></dfn> method, when invoked,
+ must do nothing if the object's path has no subpaths. Otherwise, it must mark the last subpath as
+ closed, create a new subpath whose first point is the same as the previous subpath's first point,
+ and finally add this new subpath to the path.</p>
+
+ <p class="note">If the last subpath had more than one point in its list of points, then this is
+ equivalent to adding a straight line connecting the last point back to the first point, thus
+ &quot;closing&quot; the shape, and then repeating the last (possibly implied) <code id="building-paths:dom-context-2d-moveto-2-3"><a href="#dom-context-2d-moveto-2">moveTo()</a></code> call.</p>
+
+
+ <p>New points and the lines connecting them are added to subpaths using the methods described
+ below. In all cases, the methods only modify the last subpath in the object's path.</p>
+
+
+ <p>The <dfn id="dom-context-2d-lineto-2"><code>lineTo(<var>x</var>, <var>y</var>)</code></dfn>
+ method, when invoked, must run these steps:</p>
+
+ <ol><li><p>If either of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>If the object's path has no subpaths, then <a href="#ensure-there-is-a-subpath" id="building-paths:ensure-there-is-a-subpath">ensure there is a subpath</a> for
+ <span>(<var>x</var>, <var>y</var>)</span>.</p></li><li><p>Otherwise, connect the last point in the subpath to the given point (<var>x</var>,
+ <var>y</var>) using a straight line, and then add the given point (<var>x</var>, <var>y</var>) to
+ the subpath.</p></li></ol>
+
+ <p>The <dfn id="dom-context-2d-quadraticcurveto-2"><code>quadraticCurveTo(<var>cpx</var>,
+ <var>cpy</var>, <var>x</var>, <var>y</var>)</code></dfn> method, when invoked, must run these
+ steps:</p>
- <p>Returns the current line width.</p>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p><a href="#ensure-there-is-a-subpath" id="building-paths:ensure-there-is-a-subpath-2">Ensure there is a subpath</a> for <span>(<var>cpx</var>,
+ <var>cpy</var>)</span></p></li><li><p>Connect the last point in the subpath to the given point (<var>x</var>, <var>y</var>)
+ using a quadratic Bézier curve with control point (<var>cpx</var>, <var>cpy</var>). <a href="https://html.spec.whatwg.org/multipage/references.html#refsBEZIER">[BEZIER]</a></p></li><li><p>Add the given point (<var>x</var>, <var>y</var>) to the subpath.</p></li></ol>
- <p>Can be set, to change the line width. Values that are not
- finite values greater than zero are ignored.</p>
+ <p>The <dfn id="dom-context-2d-beziercurveto-2"><code>bezierCurveTo(<var>cp1x</var>,
+ <var>cp1y</var>, <var>cp2x</var>, <var>cp2y</var>, <var>x</var>, <var>y</var>)</code></dfn>
+ method, when invoked, must run these steps:</p>
- </dd>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p><a href="#ensure-there-is-a-subpath" id="building-paths:ensure-there-is-a-subpath-3">Ensure there is a subpath</a> for <span>(<var>cp1x</var>,
+ <var>cp1y</var>)</span>.</p></li><li><p>Connect the last point in the subpath to the given point (<var>x</var>, <var>y</var>)
+ using a cubic Bézier curve with control points (<var>cp1x</var>, <var>cp1y</var>) and
+ (<var>cp2x</var>, <var>cp2y</var>). <a href="https://html.spec.whatwg.org/multipage/references.html#refsBEZIER">[BEZIER]</a></p></li><li><p>Add the point (<var>x</var>, <var>y</var>) to the subpath.</p></li></ol>
- <dt><var title="">context</var> . <code title="dom-context-2d-lineCap"><a href="#dom-context-2d-linecap">lineCap</a></code> [ = <var title="">value</var> ]</dt>
+ <hr/>
- <dd>
+ <p>The <dfn id="dom-context-2d-arcto-2"><code>arcTo(<var>x1</var>, <var>y1</var>, <var>x2</var>,
+ <var>y2</var>, <var>radiusX</var>, <var>radiusY</var>, <var>rotation</var>)</code></dfn> method,
+ when invoked, must run these steps:</p>
- <p>Returns the current line cap style.</p>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p><a href="#ensure-there-is-a-subpath" id="building-paths:ensure-there-is-a-subpath-4">Ensure there is a subpath</a> for <span>(<var>x1</var>,
+ <var>y1</var>)</span>.</p></li><li><p>If either <var>radiusX</var> or <var>radiusY</var> are negative, then throw an
+ <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="building-paths:indexsizeerror-4">&quot;<code>IndexSizeError</code>&quot;</a> <code id="building-paths:domexception-4"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p></li><li><p>If <var>radiusY</var> is omitted, then set <var>radiusY</var> to
+ <var>radiusX</var>.</p></li><li><p>Let the point (<var>x0</var>, <var>y0</var>) be the last point in the subpath, transformed
+ by the inverse of the <a href="#transformations" id="building-paths:transformations-2">current transformation
+ matrix</a> (so that it is in the same coordinate system as the points passed to the
+ method).</p></li><li><p>If the point (<var>x0</var>, <var>y0</var>) is equal to the point (<var>x1</var>,
+ <var>y1</var>), or if the point (<var>x1</var>, <var>y1</var>) is equal to the point
+ (<var>x2</var>, <var>y2</var>), or if both <var>radiusX</var> and <var>radiusY</var> are zero,
+ then add the point (<var>x1</var>, <var>y1</var>) to the subpath, and connect that point to the
+ previous point (<var>x0</var>, <var>y0</var>) by a straight line.</p></li><li><p>Otherwise, if the points (<var>x0</var>, <var>y0</var>), (<var>x1</var>, <var>y1</var>),
+ and (<var>x2</var>, <var>y2</var>) all lie on a single straight line, then add the point
+ (<var>x1</var>, <var>y1</var>) to the subpath, and connect that point to the previous point
+ (<var>x0</var>, <var>y0</var>) by a straight line.</p></li><li><p>Otherwise, let <var>The Arc</var> be the shortest arc given by circumference of the
+ ellipse that has radius <var>radiusX</var> on the major axis and radius <var>radiusY</var> on the
+ minor axis, and whose semi-major axis is rotated <var>rotation</var> radians clockwise from the
+ positive x-axis, and that has one point tangent to the half-infinite line that crosses the point
+ (<var>x0</var>, <var>y0</var>) and ends at the point (<var>x1</var>, <var>y1</var>), and that has
+ a different point tangent to the half-infinite line that ends at the point (<var>x1</var>,
+ <var>y1</var>) and crosses the point (<var>x2</var>, <var>y2</var>). The points at which this
+ ellipse touches these two lines are called the start and end tangent points respectively. Connect
+ the point (<var>x0</var>, <var>y0</var>) to the start tangent point by a straight line, adding
+ the start tangent point to the subpath, and then connect the start tangent point to the end
+ tangent point by <var>The Arc</var>, adding the end tangent point to the subpath.</p></li></ol>
- <p>Can be set, to change the line cap style.</p>
+ <hr/>
- <p>The possible line cap styles are <code>butt</code>,
- <code>round</code>, and <code>square</code>. Other values are
- ignored.</p>
+ <p>The <dfn id="dom-context-2d-arc-2"><code>arc(<var>x</var>, <var>y</var>,
+ <var>radius</var>, <var>startAngle</var>, <var>endAngle</var>, <var>anticlockwise</var>)</code></dfn> and <dfn id="dom-context-2d-ellipse-2"><code>ellipse(<var>x</var>, <var>y</var>, <var>radiusX</var>, <var>radiusY</var>, <var>rotation</var>, <var>startAngle</var>, <var>endAngle</var>, <var>anticlockwise</var>)</code></dfn> methods draw arcs.</p>
- </dd>
+ <p>The <code id="building-paths:dom-context-2d-arc-2-2"><a href="#dom-context-2d-arc-2">arc()</a></code> method is equivalent to the <code id="building-paths:dom-context-2d-ellipse-2-2"><a href="#dom-context-2d-ellipse-2">ellipse()</a></code> method in the case where the two radii are equal.
+ When the <code id="building-paths:dom-context-2d-arc-2-3"><a href="#dom-context-2d-arc-2">arc()</a></code> method is invoked, it must act as if the
+ <code id="building-paths:dom-context-2d-ellipse-2-3"><a href="#dom-context-2d-ellipse-2">ellipse()</a></code> method had been invoked with the <var>radiusX</var> and <var>radiusY</var> arguments set to the value of the <var>radius</var> argument, the <var>rotation</var> argument set to zero, and the
+ other arguments set to the same values as their identically named arguments on the <code id="building-paths:dom-context-2d-arc-2-4"><a href="#dom-context-2d-arc-2">arc()</a></code> method.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code> [ = <var title="">value</var> ]</dt>
+ <p>The <code id="building-paths:dom-context-2d-ellipse-2-4"><a href="#dom-context-2d-ellipse-2">ellipse()</a></code> method, when invoked, must run these
+ steps:</p>
- <dd>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>If either <var>radiusX</var> or <var>radiusY</var> are negative, then throw an
+ <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="building-paths:indexsizeerror-5">&quot;<code>IndexSizeError</code>&quot;</a> <code id="building-paths:domexception-5"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p></li><li><p>If the object's path has any subpaths, then add a straight line from the last point in the
+ subpath to the start point of the arc.</p></li><li>
+ <p>Add the start and end points of the arc to the subpath, and connect them with an arc. The arc
+ and its start and end points are defined as follows:</p>
- <p>Returns the current line join style.</p>
+ <p>Consider an ellipse that has its origin at (<var>x</var>, <var>y</var>), that has a
+ major-axis radius <var>radiusX</var> and a minor-axis radius <var>radiusY</var>, and that is
+ rotated about its origin such that its semi-major axis is inclined <var>rotation</var> radians
+ clockwise from the x-axis.</p>
- <p>Can be set, to change the line join style.</p>
+ <p>If <var>anticlockwise</var> is false and <span><var>endAngle</var>-<var>startAngle</var></span> is equal to or greater than <span>2π</span>, or, if <var>anticlockwise</var> is <em>true</em> and <span><var>startAngle</var>-<var>endAngle</var></span> is equal to or greater than <span>2π</span>, then the arc is the whole circumference of this ellipse, and the point
+ at <var>startAngle</var> along this circle's circumference, measured in radians clockwise from
+ the ellipse's semi-major axis, acts as both the start point and the end point.</p>
- <p>The possible line join styles are <code>bevel</code>,
- <code>round</code>, and <code>miter</code>. Other values are
- ignored.</p>
+ <p>Otherwise, the points at <var>startAngle</var> and <var>endAngle</var> along this circle's
+ circumference, measured in radians clockwise from the ellipse's semi-major axis, are the start
+ and end points respectively, and the arc is the path along the circumference of this ellipse
+ from the start point to the end point, going anti-clockwise if <var>anticlockwise</var> is true,
+ and clockwise otherwise. Since the points are on the ellipse, as opposed to being simply angles
+ from zero, the arc can never cover an angle greater than <span>2π</span>
+ radians.</p>
- </dd>
+ <p class="note">Even if the arc covers the entire circumference of the ellipse and there are no
+ other points in the subpath, the path is not closed unless the <code id="building-paths:dom-context-2d-closepath-2-2"><a href="#dom-context-2d-closepath-2">closePath()</a></code> method is appropriately invoked.</p>
+ </li></ol>
- <dt><var title="">context</var> . <code title="dom-context-2d-miterLimit"><a href="#dom-context-2d-miterlimit">miterLimit</a></code> [ = <var title="">value</var> ]</dt>
+ <hr/>
- <dd>
+ <p>The <dfn id="dom-context-2d-rect-2"><code>rect(<var>x</var>, <var>y</var>, <var>w</var>,
+ <var>h</var>)</code></dfn> method, when invoked, must run these steps:</p>
- <p>Returns the current miter limit ratio.</p>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Create a new subpath containing just the four points (<var>x</var>, <var>y</var>),
+ (<var>x</var>+<var>w</var>, <var>y</var>), (<var>x</var>+<var>w</var>,
+ <var>y</var>+<var>h</var>), (<var>x</var>, <var>y</var>+<var>h</var>), in that order, with those
+ four points connected by straight lines.</p></li><li><p>Mark the subpath as closed.</p></li><li><p>Create a new subpath with the point (<var>x</var>, <var>y</var>) as the only point in the
+ subpath.</p></li></ol>
- <p>Can be set, to change the miter limit ratio. Values that are
- not finite values greater than zero are ignored.</p>
-
- </dd>
-
- </dl><div class="impl">
-
- <p>The <dfn id="dom-context-2d-linewidth" title="dom-context-2d-lineWidth"><code>lineWidth</code></dfn>
- attribute gives the width of lines, in coordinate space units. On
- getting, it must return the current value. On setting, zero,
- negative, infinite, and NaN values must be ignored, leaving the
- value unchanged; other values must change the current value to the
- new value.</p>
-
- <p>When the context is created, the <code title="dom-context-2d-lineWidth"><a href="#dom-context-2d-linewidth">lineWidth</a></code> attribute must
- initially have the value <code>1.0</code>.</p>
-
- <hr/><p>The <dfn id="dom-context-2d-linecap" title="dom-context-2d-lineCap"><code>lineCap</code></dfn> attribute
- defines the type of endings that UAs will place on the end of
- lines. The three valid values are <code>butt</code>,
- <code>round</code>, and <code>square</code>. The <code>butt</code>
- value means that the end of each line has a flat edge perpendicular
- to the direction of the line (and that no additional line cap is
- added). The <code>round</code> value means that a semi-circle with
- the diameter equal to the width of the line must then be added on to
- the end of the line. The <code>square</code> value means that a
- rectangle with the length of the line width and the width of half
- the line width, placed flat against the edge perpendicular to the
- direction of the line, must be added at the end of each line.</p>
-
- <p>On getting, it must return the current value. On setting, if the
- new value is one of the literal strings <code>butt</code>,
- <code>round</code>, and <code>square</code>, then the current value
- must be changed to the new value; other values must ignored, leaving
- the value unchanged.</p>
-
- <p>When the context is created, the <code title="dom-context-2d-lineCap"><a href="#dom-context-2d-linecap">lineCap</a></code> attribute must
- initially have the value <code>butt</code>.</p>
-
- <hr/><p>The <dfn id="dom-context-2d-linejoin" title="dom-context-2d-lineJoin"><code>lineJoin</code></dfn>
- attribute defines the type of corners that UAs will place where two
- lines meet. The three valid values are <code>bevel</code>,
- <code>round</code>, and <code>miter</code>.</p>
-
- <p>On getting, it must return the current value. On setting, if the
- new value is one of the literal strings <code>bevel</code>,
- <code>round</code>, and <code>miter</code>, then the current value
- must be changed to the new value; other values must be ignored,
- leaving the value unchanged.</p>
-
- <p>When the context is created, the <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code> attribute must
- initially have the value <code>miter</code>.</p>
-
- <hr/><p>A join exists at any point in a subpath shared by two consecutive
- lines. When a subpath is closed, then a join also exists at its
- first point (equivalent to its last point) connecting the first and
- last lines in the subpath.</p>
-
- <p>In addition to the point where the join occurs, two additional
- points are relevant to each join, one for each line: the two corners
- found half the line width away from the join point, one
- perpendicular to each line, each on the side furthest from the other
- line.</p>
-
- <p>A filled triangle connecting these two opposite corners with a
- straight line, with the third point of the triangle being the join
- point, must be rendered at all joins. The <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code> attribute controls
- whether anything else is rendered. The three aforementioned values
- have the following meanings:</p>
-
- <p>The <code>bevel</code> value means that this is all that is
- rendered at joins.</p>
-
- <p>The <code>round</code> value means that a filled arc connecting
- the two aforementioned corners of the join, abutting (and not
- overlapping) the aforementioned triangle, with the diameter equal to
- the line width and the origin at the point of the join, must be
- rendered at joins.</p>
-
- <p>The <code>miter</code> value means that a second filled triangle
- must (if it can given the miter length) be rendered at the join,
- with one line being the line between the two aforementioned corners,
- abutting the first triangle, and the other two being continuations of
- the outside edges of the two joining lines, as long as required to
- intersect without going over the miter length.</p>
-
- <p>The miter length is the distance from the point where the join
- occurs to the intersection of the line edges on the outside of the
- join. The miter limit ratio is the maximum allowed ratio of the
- miter length to half the line width. If the miter length would cause
- the miter limit ratio to be exceeded, this second triangle must not
- be rendered.</p>
-
- <p>The miter limit ratio can be explicitly set using the <dfn id="dom-context-2d-miterlimit" title="dom-context-2d-miterLimit"><code>miterLimit</code></dfn>
- attribute. On getting, it must return the current value. On setting,
- zero, negative, infinite, and NaN values must be ignored, leaving
- the value unchanged; other values must change the current value to
- the new value.</p>
-
- <p>When the context is created, the <code title="dom-context-2d-miterLimit"><a href="#dom-context-2d-miterlimit">miterLimit</a></code> attribute must
- initially have the value <code>10.0</code>.</p>
-
- <!--
-v6: dashed lines have been requested. Philip Taylor provides these
-notes on what would need to be defined for dashed lines:
-> I don't think it's entirely trivial to add, to the detail that's
-> necessary in a specification. The common graphics APIs (at least
-> Cairo, Quartz and java.awt.Graphics, and any SVG implementation) all
-> have dashes specified by passing an array of dash lengths (alternating
-> on/off), so that should be alright as long as you define what units
-> it's measured in and what happens when you specify an odd number of
-> values and how errors are handled and what happens if you update the
-> array later. But after that, what does it do when stroking multiple
-> subpaths, in terms of offsetting the dashes? When you use strokeRect,
-> where is offset 0? Does moveTo reset the offset? How does it interact
-> with lineCap/lineJoin? All the potential issues need test cases too,
-> and the implementations need to make sure they handle any edge cases
-> that the underlying graphics library does differently. (SVG Tiny 1.2
-> appears to skip some of the problems by leaving things undefined and
-> allowing whatever behavior the graphics library has.)
-
-Another request has been for hairline width lines, that remain
-hairline width with transform. ack Shaun Morris.
- -->
+
- </div>
+
- <h6 id="shadows"><span class="secno">4.8.11.1.6 </span><dfn>Shadows</dfn></h6>
- <p>All drawing operations are affected by the four global shadow
- attributes.</p>
+ <h6 id="path2d-objects"><span class="secno">4.12.5.1.6</span> <code id="path2d-objects:path2d"><a href="#path2d">Path2D</a></code> objects<a class="self-link" href="#path2d-objects"/></h6>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code> [ = <var title="">value</var> ]</dt>
+ <p><code id="path2d-objects:path2d-2"><a href="#path2d">Path2D</a></code> objects can be used to declare paths that are then later used on
+ objects implementing the <code id="path2d-objects:canvasdrawpath"><a href="#canvasdrawpath">CanvasDrawPath</a></code> interface. In addition to many of the APIs
+ described in earlier sections, <code id="path2d-objects:path2d-3"><a href="#path2d">Path2D</a></code> objects have methods to combine paths, and to
+ add text to paths.</p>
- <dd>
+ <dl class="domintro"><dt><var>path</var> = new <code id="path2d-objects:dom-path2d"><a href="#dom-path2d">Path2D</a></code>()</dt><dd>
- <p>Returns the current shadow color.</p>
+ <p>Creates a new empty <code id="path2d-objects:path2d-4"><a href="#path2d">Path2D</a></code> object.</p>
- <p>Can be set, to change the shadow color. Values that cannot be parsed as CSS colors are ignored.</p>
+ </dd><dt><var>path</var> = new <code id="path2d-objects:dom-path2d-copy"><a href="#dom-path2d-copy">Path2D</a></code>(<var>path</var>)</dt><dd>
- </dd>
+ <p>Creates a new <code id="path2d-objects:path2d-5"><a href="#path2d">Path2D</a></code> object that is a copy of the argument.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-shadowOffsetX"><a href="#dom-context-2d-shadowoffsetx">shadowOffsetX</a></code> [ = <var title="">value</var> ]</dt>
- <dt><var title="">context</var> . <code title="dom-context-2d-shadowOffsetY"><a href="#dom-context-2d-shadowoffsety">shadowOffsetY</a></code> [ = <var title="">value</var> ]</dt>
+ </dd><dt><var>path</var> = new <code id="path2d-objects:dom-path2d-merge"><a href="#dom-path2d-merge">Path2D</a></code>(<var>paths</var> [, <var>fillRule</var> ] )</dt><dd>
- <dd>
+ <p>Creates a new <code id="path2d-objects:path2d-6"><a href="#path2d">Path2D</a></code> object that describes a path that outlines the given <var>paths</var>, using the given fill rule.</p>
- <p>Returns the current shadow offset.</p>
+ </dd><dt><var>path</var> = new <code id="path2d-objects:dom-path2d-withdata"><a href="#dom-path2d-withdata">Path2D</a></code>(<var>d</var>)</dt><dd>
- <p>Can be set, to change the shadow offset. Values that are not finite numbers are ignored.</p>
+ <p>Creates a new path with the path described by the argument, interpreted as SVG path data. <a href="https://html.spec.whatwg.org/multipage/references.html#refsSVG">[SVG]</a></p>
- </dd>
+ </dd><dt><var>path</var> . <code id="dom-path2d-addpath"><a href="#dom-path2d-addpath-2">addPath</a></code>(<var>path</var> [, <var>transform</var> ] )</dt><dd>
- <dt><var title="">context</var> . <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code> [ = <var title="">value</var> ]</dt>
+ <p>Adds to the path the path given by the argument.</p>
- <dd>
+ </dd></dl>
- <p>Returns the current level of blur applied to shadows.</p>
+
- <p>Can be set, to change the blur level. Values that are not finite numbers greater than or equal to zero are ignored.</p>
+ <p>The <dfn id="dom-path2d"><code>Path2D()</code></dfn> constructor, when invoked, must return a
+ newly created <code id="path2d-objects:path2d-7"><a href="#path2d">Path2D</a></code> object.</p>
- </dd>
+ <hr/>
- </dl><div class="impl">
+ <p>The <dfn id="dom-path2d-copy"><code>Path2D(<var>path</var>)</code></dfn>
+ constructor, when invoked, must return a newly created <code id="path2d-objects:path2d-8"><a href="#path2d">Path2D</a></code> object, to which the
+ subpaths of the argument are added. (In other words, it returns a copy of the argument.)</p>
- <p>The <dfn id="dom-context-2d-shadowcolor" title="dom-context-2d-shadowColor"><code>shadowColor</code></dfn>
- attribute sets the color of the shadow.</p>
+ <hr/>
- <p>When the context is created, the <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code> attribute
- initially must be fully-transparent black.</p>
+ <p>The <dfn id="dom-path2d-merge"><code>Path2D(<var>paths</var>,
+ <var>fillRule</var>)</code></dfn> constructor, when invoked, must run these steps:</p>
- <p>On getting, the <a href="#serialization-of-a-color" title="serialization of a
- color">serialization of the color</a> must be returned.</p>
+ <ol><li>
- <p>On setting, the new value must be <a href="#parsed-as-a-css-color-value">parsed as a CSS
- &lt;color&gt; value</a> and the color assigned. If the value
- cannot be parsed as a CSS &lt;color&gt; value then it must be
- ignored, and the attribute must retain its previous value. <a href="#refsCSSCOLOR">[CSSCOLOR]</a></p>
+ <p>Run the appropriate step from the following list, based on the constructor's second
+ argument:</p>
- <p>The <dfn id="dom-context-2d-shadowoffsetx" title="dom-context-2d-shadowOffsetX"><code>shadowOffsetX</code></dfn>
- and <dfn id="dom-context-2d-shadowoffsety" title="dom-context-2d-shadowOffsetY"><code>shadowOffsetY</code></dfn>
- attributes specify the distance that the shadow will be offset in
- the positive horizontal and positive vertical distance
- respectively. Their values are in coordinate space units. They are
- not affected by the current transformation matrix.</p>
+ <dl class="switch"><dt>If it is &quot;nonzero&quot;</dt><dd>
- <p>When the context is created, the shadow offset attributes must
- initially have the value <code>0</code>.</p>
+ <p>Let <var>merged path</var> be a <a href="#concept-path" id="path2d-objects:concept-path">path</a> that
+ consists of a set of non-overlapping subpaths that exactly outline the points from which, in
+ any of the <a href="#concept-path" id="path2d-objects:concept-path-2">paths</a> provided in the constructor's first
+ argument, the number of times a half-infinite straight line drawn from that point crosses a
+ subpath going in one direction is not equal to the number of times it crosses a subpath going
+ in the other direction.</p>
- <p>On getting, they must return their current value. On setting, the
- attribute being set must be set to the new value, except if the
- value is infinite or NaN, in which case the new value must be
- ignored.</p>
+ </dd><dt>If it is &quot;evenodd&quot;</dt><dd>
- <p>The <dfn id="dom-context-2d-shadowblur" title="dom-context-2d-shadowBlur"><code>shadowBlur</code></dfn>
- attribute specifies the level of the blurring effect. (The units do
- not map to coordinate space units, and are not affected by the
- current transformation matrix.)</p>
+ <p>Let <var>merged path</var> be a <a href="#concept-path" id="path2d-objects:concept-path-3">path</a> that
+ consists of a set of non-overlapping subpaths that exactly outline the points from which, in
+ any of the <a href="#concept-path" id="path2d-objects:concept-path-4">paths</a> provided in the constructor's first
+ argument, the number of times a half-infinite straight line drawn from that point crosses that
+ path is odd.</p>
- <p>When the context is created, the <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code> attribute must
- initially have the value <code>0</code>.</p>
+ </dd></dl>
- <p>On getting, the attribute must return its current value. On
- setting the attribute must be set to the new value, except if the
- value is negative, infinite or NaN, in which case the new value must
- be ignored.</p>
+ <p>The subpaths in <var>merged path</var> must be oriented such that for any point,
+ the number of times a half-infinite straight line drawn from that point crosses a subpath is
+ even if and only if the number of times a half-infinite straight line drawn from that same point
+ crosses a subpath going in one direction is equal to the number of times it crosses a subpath
+ going in the other direction.</p>
- <p><dfn id="when-shadows-are-drawn" title="when shadows are drawn">Shadows are only drawn
- if</dfn> the opacity component of the alpha component of the color
- of <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code> is
- non-zero and either the <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code> is non-zero, or
- the <code title="dom-context-2d-shadowOffsetX"><a href="#dom-context-2d-shadowoffsetx">shadowOffsetX</a></code>
- is non-zero, or the <code title="dom-context-2d-shadowOffsetY"><a href="#dom-context-2d-shadowoffsety">shadowOffsetY</a></code> is
- non-zero.</p>
+ </li><li><p>Add all the subpaths in <var>merged path</var> to the <code id="path2d-objects:path2d-9"><a href="#path2d">Path2D</a></code>
+ object.</p></li><li><p>Set the <code id="path2d-objects:path2d-10"><a href="#path2d">Path2D</a></code> object's <a href="#need-new-subpath" id="path2d-objects:need-new-subpath">need new subpath</a> flag.</p></li></ol>
- <p class="critical">It is likely that this will change: browser
- vendors have indicated an interest in changing the processing model
- for shadows such that they only draw when the composition operator
- is &quot;source-over&quot; (the default). <a href="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-May/thread.html#31457">Read
- more...</a></p>
+ <hr/>
- <p><a href="#when-shadows-are-drawn">When shadows are drawn</a>, they must be rendered as follows:</p>
+ <p>The <dfn id="dom-path2d-withdata"><code>Path2D(<var>d</var>)</code></dfn>
+ constructor, when invoked, must run these steps:</p>
- <ol><li> <p>Let <var title="">A</var> be an infinite transparent black
- bitmap on which the source image for which a shadow is being
- created has been rendered.</p> </li>
+ <ol><li>
- <li> <p>Let <var title="">B</var> be an infinite transparent black
- bitmap, with a coordinate space and an origin identical to <var title="">A</var>.</p> </li>
+ <p>Parse and interpret the <var>d</var> argument according to the SVG specification's
+ rules for path data, thus obtaining an SVG path. <a href="https://html.spec.whatwg.org/multipage/references.html#refsSVG">[SVG]</a></p>
- <li> <p>Copy the alpha channel of <var title="">A</var> to <var title="">B</var>, offset by <code title="dom-context-2d-shadowOffsetX"><a href="#dom-context-2d-shadowoffsetx">shadowOffsetX</a></code> in the
- positive <var title="">x</var> direction, and <code title="dom-context-2d-shadowOffsetY"><a href="#dom-context-2d-shadowoffsety">shadowOffsetY</a></code> in the
- positive <var title="">y</var> direction.</p> </li>
+ <p class="note">The resulting path could be empty. SVG defines error handling rules for parsing
+ and applying path data.</p>
- <li> <p>If <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code> is greater than
- 0:</p>
+ </li><li><p>Let (<var>x</var>, <var>y</var>) be the last point in the SVG
+ path.</p></li><li><p>Create a new <code id="path2d-objects:path2d-11"><a href="#path2d">Path2D</a></code> object and add all the subpaths in the SVG path, if any,
+ to that <code id="path2d-objects:path2d-12"><a href="#path2d">Path2D</a></code> object. </p>
- <ol><li> <p>Let <var title="">σ</var> be half the value of
- <code title="dom-context-2d-shadowBlur"><a href="#dom-context-2d-shadowblur">shadowBlur</a></code>.</p></li>
+ </li><li><p>Create a new subpath in the <code id="path2d-objects:path2d-13"><a href="#path2d">Path2D</a></code> object with (<var>x</var>, <var>y</var>) as the only point in the subpath.</p></li><li><p>Return the <code id="path2d-objects:path2d-14"><a href="#path2d">Path2D</a></code> object as the constructed object.</p></li></ol>
- <li> <p>Perform a 2D Gaussian Blur on <var title="">B</var>,
- using <var title="">σ</var> as the standard deviation.</p>
- <!-- wish i could find a reference for this --> </li>
+ <hr/>
- </ol><p>User agents may limit values of <var title="">σ</var> to
- an implementation-specific maximum value to avoid exceeding
- hardware limitations during the Gaussian blur operation.</p>
+ <p>The <dfn id="dom-path2d-addpath-2"><code>addPath(<var>b</var>,
+ <var>transform</var>)</code></dfn> method, when invoked on a <code id="path2d-objects:path2d-15"><a href="#path2d">Path2D</a></code> object
+ <var>a</var>, must run these steps:</p>
- </li>
+ <ol><li><p>If the <code id="path2d-objects:path2d-16"><a href="#path2d">Path2D</a></code> object <var>b</var> has no subpaths, then abort these
+ steps.</p></li><li><p>Create a copy of all the subpaths in <var>b</var>. Let this copy be known as <var>c</var>.</p></li><li><p>Let <var>matrix</var> be the result of <a data-x-internal="create-a-dommatrix-from-a-dictionary" href="https://drafts.fxtf.org/geometry/#create-a-dommatrix-from-the-dictionary" id="path2d-objects:create-a-dommatrix-from-a-dictionary">creating a <code>DOMMatrix</code> from a dictionary</a>
+ <var>transform</var>, with <var>ignore3D</var> set to true.</p></li><li><p>Transform all the coordinates and lines in <var>c</var> by the transform matrix
+ <var>matrix</var>.</p></li><li><p>Let (<var>x</var>, <var>y</var>) be the last point in the last subpath
+ of <var>c</var>.</p></li><li><p>Add all the subpaths in <var>c</var> to <var>a</var>.</p></li><li><p>Create a new subpath in <var>a</var> with (<var>x</var>, <var>y</var>) as the only point in the subpath.</p></li></ol>
- <li> <p>Set the red, green, and blue components of every pixel in
- <var title="">B</var> to the red, green, and blue components
- (respectively) of the color of <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code>.</p> </li>
+
- <li> <p>Multiply the alpha component of every pixel in <var title="">B</var> by the alpha component of the color of <code title="dom-context-2d-shadowColor"><a href="#dom-context-2d-shadowcolor">shadowColor</a></code>.</p> </li>
- <li> <p>The shadow is in the bitmap <var title="">B</var>, and is
- rendered as part of the <a href="#drawing-model">drawing model</a> described below.</p> </li>
+ <h6 id="transformations"><span class="secno">4.12.5.1.7</span> <dfn>Transformations</dfn><a class="self-link" href="#transformations"/></h6><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="bugs"><strong>Spec bugs:</strong> <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=28333" title="Show on example how a,b,c,d,e,f affect the point position">28333</a></p></div>
- </ol></div>
+ <p>Objects that implement the <code id="transformations:canvastransform"><a href="#canvastransform">CanvasTransform</a></code> interface have a <dfn id="current-transformation-matrix">current
+ transformation matrix</dfn>, as well as methods (described in this section) to manipulate it. When
+ an object implementing the <code id="transformations:canvastransform-2"><a href="#canvastransform">CanvasTransform</a></code> interface is created, its transformation
+ matrix must be initialized to the identity transform.</p>
- <p>If the current composition operation is <code title="gcop-copy"><a href="#gcop-copy">copy</a></code>, shadows effectively won't render
- (since the shape will overwrite the shadow).</p>
+ <p>The <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix">current transformation matrix</a> is applied to coordinates when creating the
+ <a href="#current-default-path" id="transformations:current-default-path">current default path</a>, and when painting text, shapes, and <code id="transformations:path2d"><a href="#path2d">Path2D</a></code>
+ objects, on objects implementing the <code id="transformations:canvastransform-3"><a href="#canvastransform">CanvasTransform</a></code> interface.</p>
+
+ <p class="note">Most of the API uses <code id="transformations:dommatrix"><a data-x-internal="dommatrix" href="https://drafts.fxtf.org/geometry/#dommatrix">DOMMatrix</a></code> objects rather than this API. This API
+ remains mostly for historical reasons.</p>
- <h6 id="simple-shapes-(rectangles)"><span class="secno">4.8.11.1.7 </span>Simple shapes (rectangles)</h6>
+
- <p>There are three methods that immediately draw rectangles to the
- bitmap. They each take four arguments; the first two give the <var title="">x</var> and <var title="">y</var> coordinates of the top
- left of the rectangle, and the second two give the width <var title="">w</var> and height <var title="">h</var> of the rectangle,
- respectively.</p>
+ <p>The transformations must be performed in reverse order.</p>
- <div class="impl">
+ <p class="note">For instance, if a scale transformation that doubles the width is applied to the
+ canvas, followed by a rotation transformation that rotates drawing operations by a quarter turn,
+ and a rectangle twice as wide as it is tall is then drawn on the canvas, the actual result will be
+ a square.</p>
- <p>The <a href="#transformations" title="dom-context-2d-transformation">current
- transformation matrix</a> must be applied to the following four
- coordinates, which form the path that must then be closed to get the
- specified rectangle: <span title="">(<var title="">x</var>, <var title="">y</var>)</span>, <span title="">(<span title=""><var title="">x</var>+<var title="">w</var></span>, <var title="">y</var>)</span>,
- <span title="">(<span title=""><var title="">x</var>+<var title="">w</var></span>,
- <span title=""><var title="">y</var>+<var title="">h</var></span>)</span>,
- <span title="">(<var title="">x</var>, <span title=""><var title="">y</var>+<var title="">h</var></span>)</span>.</p>
+
- <p>Shapes are painted without affecting the current path, and are
- subject to the <a href="#clipping-region" title="clipping region">clipping region</a>,
- and, with the exception of <code title="dom-context-2d-clearRect"><a href="#dom-context-2d-clearrect">clearRect()</a></code>, also <a href="#shadows" title="shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, and <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
- operators</a>.</p>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-scale"><a href="#dom-context-2d-scale-2">scale</a></code>(<var>x</var>, <var>y</var>)</dt><dd>
- </div>
+ <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-2">current transformation matrix</a> to apply a scaling transformation
+ with the given characteristics.</p>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-clearRect"><a href="#dom-context-2d-clearrect">clearRect</a></code>(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</dt>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-rotate"><a href="#dom-context-2d-rotate-2">rotate</a></code>(<var>angle</var>)</dt><dd>
- <dd>
+ <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-3">current transformation matrix</a> to apply a rotation transformation
+ with the given characteristics. The angle is in radians.</p>
- <p>Clears all pixels on the canvas in the given rectangle to transparent black.</p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-translate"><a href="#dom-context-2d-translate-2">translate</a></code>(<var>x</var>, <var>y</var>)</dt><dd>
- </dd>
+ <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-4">current transformation matrix</a> to apply a translation transformation
+ with the given characteristics.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-fillRect"><a href="#dom-context-2d-fillrect">fillRect</a></code>(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</dt>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-transform"><a href="#dom-context-2d-transform-2">transform</a></code>(<var>a</var>, <var>b</var>, <var>c</var>, <var>d</var>, <var>e</var>, <var>f</var>)</dt><dd>
- <dd>
+ <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-5">current transformation matrix</a> to apply the matrix given by the
+ arguments as described below.</p>
- <p>Paints the given rectangle onto the canvas, using the current fill style.</p>
+ </dd><dt><var>matrix</var> = <var>context</var> . <code id="dom-context-2d-gettransform"><a href="#dom-context-2d-gettransform-2">getTransform</a></code>()</dt><dd>
- </dd>
+ <p>Returns a copy of the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-6">current transformation matrix</a>, as a newly created
+ <code id="transformations:dommatrix-2"><a data-x-internal="dommatrix" href="https://drafts.fxtf.org/geometry/#dommatrix">DOMMatrix</a></code> object.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-strokeRect"><a href="#dom-context-2d-strokerect">strokeRect</a></code>(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</dt>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-settransform"><a href="#dom-context-2d-settransform-2">setTransform</a></code>(<var>a</var>, <var>b</var>, <var>c</var>, <var>d</var>, <var>e</var>, <var>f</var>)</dt><dd>
- <dd>
+ <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-7">current transformation matrix</a> <em>to</em> the matrix given by the
+ arguments as described below.</p>
- <p>Paints the box that outlines the given rectangle onto the canvas, using the current stroke style.</p>
+ </dd><dt><var>context</var> . <code id="transformations:dom-context-2d-settransform-2"><a href="#dom-context-2d-settransform-2">setTransform</a></code>(<var>transform</var>)</dt><dd>
- </dd>
+ <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-8">current transformation matrix</a> <em>to</em> the matrix represented by
+ the passed <code id="transformations:dommatrix2dinit"><a data-x-internal="dommatrix2dinit" href="https://drafts.fxtf.org/geometry/#dictdef-dommatrix2dinit">DOMMatrix2DInit</a></code> dictionary.</p>
- </dl><div class="impl">
+ </dd><dt><var>context</var> . <code id="dom-context-2d-resettransform"><a href="#dom-context-2d-resettransform-2">resetTransform</a></code>()</dt><dd>
- <p>The <dfn id="dom-context-2d-clearrect" title="dom-context-2d-clearRect"><code>clearRect(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</code></dfn> method must clear the pixels in the
- specified rectangle that also intersect the current clipping region
- to a fully transparent black, erasing any previous image. If either
- height or width are zero, this method has no effect.</p>
+ <p>Changes the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-9">current transformation matrix</a> to the identity transform.</p>
- <p>The <dfn id="dom-context-2d-fillrect" title="dom-context-2d-fillRect"><code>fillRect(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</code></dfn> method must paint the specified
- rectangular area using the <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code>. If either height
- or width are zero, this method has no effect.</p>
+ </dd></dl>
- <p>The <dfn id="dom-context-2d-strokerect" title="dom-context-2d-strokeRect"><code>strokeRect(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</code></dfn> method must stroke the specified
- rectangle's path using the <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code>, <code title="dom-context-2d-lineWidth"><a href="#dom-context-2d-linewidth">lineWidth</a></code>, <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code>, and (if
- appropriate) <code title="dom-context-2d-miterLimit"><a href="#dom-context-2d-miterlimit">miterLimit</a></code> attributes. If
- both height and width are zero, this method has no effect, since
- there is no path to stroke (it's a point). If only one of the two is
- zero, then the method will draw a line instead (the path for the
- outline is just a straight line along the non-zero dimension).</p>
+
- </div>
+ <p>The <dfn id="dom-context-2d-scale-2"><code>scale(<var>x</var>, <var>y</var>)</code></dfn>
+ method, when invoked, must run these steps:</p>
+ <ol><li><p>If either of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Add the scaling transformation described by the arguments to the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-10">current
+ transformation matrix</a>. The <var>x</var> argument represents the scale factor in the
+ horizontal direction and the <var>y</var> argument represents the scale factor in the vertical
+ direction. The factors are multiples.</p></li></ol>
- <h6 id="complex-shapes-(paths)"><span class="secno">4.8.11.1.8 </span>Complex shapes (paths)</h6>
+ <p>The <dfn id="dom-context-2d-rotate-2"><code>rotate(<var>angle</var>)</code></dfn> method,
+ when invoked, must run these steps:</p>
- <p>The context always has a current path. There is only one current
- path, it is not part of the <a href="#drawing-state">drawing state</a>.</p>
+ <ol><li><p>If <var>angle</var> is infinite or NaN, then abort these steps.</p></li><li><p>Add the rotation transformation described by the argument to the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-11">current
+ transformation matrix</a>. The <var>angle</var> argument represents a clockwise rotation angle
+ expressed in radians.</p></li></ol>
- <p>A <dfn id="path">path</dfn> has a list of zero or more subpaths. Each
- subpath consists of a list of one or more points, connected by
- straight or curved lines, and a flag indicating whether the subpath
- is closed or not. A closed subpath is one where the last point of
- the subpath is connected to the first point of the subpath by a
- straight line. Subpaths with fewer than two points are ignored when
- painting the path.</p>
+ <p>The <dfn id="dom-context-2d-translate-2"><code>translate(<var>x</var>,
+ <var>y</var>)</code></dfn> method, when invoked, must run these steps:</p>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-beginPath"><a href="#dom-context-2d-beginpath">beginPath</a></code>()</dt>
+ <ol><li><p>If either of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Add the translation transformation described by the arguments to the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-12">current
+ transformation matrix</a>. The <var>x</var> argument represents the translation distance in
+ the horizontal direction and the <var>y</var> argument represents the translation distance in the
+ vertical direction. The arguments are in coordinate space units.</p></li></ol>
- <dd>
+ <p>The <dfn id="dom-context-2d-transform-2"><code>transform(<var>a</var>, <var>b</var>,
+ <var>c</var>, <var>d</var>, <var>e</var>, <var>f</var>)</code></dfn> method, when invoked, must
+ run these steps:</p>
- <p>Resets the current path.</p>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Replace the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-13">current transformation matrix</a> with the result of multiplying the
+ current transformation matrix with the matrix described by:</p></li></ol>
- </dd>
+
- <dt><var title="">context</var> . <code title="dom-context-2d-moveTo"><a href="#dom-context-2d-moveto">moveTo</a></code>(<var title="">x</var>, <var title="">y</var>)</dt>
+ <table class="matrix"><tbody><tr><td><var>a</var></td><td><var>c</var></td><td><var>e</var></td></tr><tr><td><var>b</var></td><td><var>d</var></td><td><var>f</var></td></tr><tr><td>0</td><td>0</td><td>1</td></tr></tbody></table>
- <dd>
+ <p class="note">The arguments <var>a</var>, <var>b</var>, <var>c</var>, <var>d</var>,
+ <var>e</var>, and <var>f</var> are sometimes called <var>m11</var>, <var>m12</var>,
+ <var>m21</var>, <var>m22</var>, <var>dx</var>, and <var>dy</var> or <var>m11</var>,
+ <var>m21</var>, <var>m12</var>, <var>m22</var>, <var>dx</var>, and <var>dy</var>. Care ought to be
+ taken in particular with the order of the second and third arguments (<var>b</var> and
+ <var>c</var>) as their order varies from API to API and APIs sometimes use the notation
+ <var>m12</var>/<var>m21</var> and sometimes <var>m21</var>/<var>m12</var> for those positions.</p>
- <p>Creates a new subpath with the given point.</p>
+
- </dd>
+ <p>The <dfn id="dom-context-2d-gettransform-2"><code>getTransform()</code></dfn> method, when
+ invoked, must return a newly created <code id="transformations:dommatrix-3"><a data-x-internal="dommatrix" href="https://drafts.fxtf.org/geometry/#dommatrix">DOMMatrix</a></code> representing a copy of the
+ <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-14">current transformation matrix</a> matrix of the context.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-closePath"><a href="#dom-context-2d-closepath">closePath</a></code>()</dt>
+ <p class="note">This returned object is not live, so updating it will not affect the
+ <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-15">current transformation matrix</a>, and updating the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-16">current transformation
+ matrix</a> will not affect an already returned <code id="transformations:dommatrix-4"><a data-x-internal="dommatrix" href="https://drafts.fxtf.org/geometry/#dommatrix">DOMMatrix</a></code>.</p>
- <dd>
+ <p>The <dfn id="dom-context-2d-settransform-2"><code>setTransform(<var>a</var>, <var>b</var>,
+ <var>c</var>, <var>d</var>, <var>e</var>, <var>f</var>)</code></dfn> method, when invoked, must
+ run these steps:</p>
- <p>Marks the current subpath as closed, and starts a new subpath with a point the same as the start and end of the newly closed subpath.</p>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Reset the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-17">current transformation matrix</a> to the identity matrix.</p></li><li><p>Invoke the <code><a href="#dom-context-2d-transform-2" id="transformations:dom-context-2d-transform-2">transform</a>(<var>a</var>, <var>b</var>, <var>c</var>,
+ <var>d</var>, <var>e</var>, <var>f</var>)</code> method with the same arguments.</p></li></ol>
- </dd>
+ <p>The <dfn><code>setTransform(<var>transform</var>)</code></dfn> method, when invoked,
+ must reset the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-18">current transformation matrix</a> to the value represented by the result
+ of <a data-x-internal="create-a-dommatrix-from-a-dictionary" href="https://drafts.fxtf.org/geometry/#create-a-dommatrix-from-the-dictionary" id="transformations:create-a-dommatrix-from-a-dictionary">creating a <code>DOMMatrix</code> from a
+ dictionary</a> <var>transform</var>, with <var>ignore3D</var> set to true.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-lineTo"><a href="#dom-context-2d-lineto">lineTo</a></code>(<var title="">x</var>, <var title="">y</var>)</dt>
+ <p>The <dfn id="dom-context-2d-resettransform-2"><code>resetTransform()</code></dfn> method,
+ when invoked, must reset the <a href="#current-transformation-matrix" id="transformations:current-transformation-matrix-19">current transformation matrix</a> to the identity
+ matrix.</p>
- <dd>
+
- <p>Adds the given point to the current subpath, connected to the previous one by a straight line.</p>
- </dd>
- <dt><var title="">context</var> . <code title="dom-context-2d-quadraticCurveTo"><a href="#dom-context-2d-quadraticcurveto">quadraticCurveTo</a></code>(<var title="">cpx</var>, <var title="">cpy</var>, <var title="">x</var>, <var title="">y</var>)</dt>
+ <h6 id="image-sources-for-2d-rendering-contexts"><span class="secno">4.12.5.1.8</span> Image sources for 2D rendering contexts<a class="self-link" href="#image-sources-for-2d-rendering-contexts"/></h6>
- <dd>
+ <p>Some methods on the <code id="image-sources-for-2d-rendering-contexts:canvasdrawimage"><a href="#canvasdrawimage">CanvasDrawImage</a></code> and <code id="image-sources-for-2d-rendering-contexts:canvasfillstrokestyles"><a href="#canvasfillstrokestyles">CanvasFillStrokeStyles</a></code>
+ interfaces take the union type <code id="image-sources-for-2d-rendering-contexts:canvasimagesource"><a href="#canvasimagesource">CanvasImageSource</a></code> as an argument.</p>
- <p>Adds the given point to the current subpath, connected to the previous one by a quadratic Bézier curve with the given control point.</p>
+ <p>This union type allows objects implementing any of the following interfaces to be used as image
+ sources:</p>
- </dd>
+ <ul><li><code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> (<code id="image-sources-for-2d-rendering-contexts:the-img-element"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> or <a data-x-internal="svg-image" href="https://www.w3.org/TR/SVG11/struct.html#ImageElement" id="image-sources-for-2d-rendering-contexts:svg-image">SVG <code>image</code></a>
+ elements)</li><li><code id="image-sources-for-2d-rendering-contexts:htmlvideoelement"><a href="https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement">HTMLVideoElement</a></code> (<code id="image-sources-for-2d-rendering-contexts:the-video-element"><a href="https://html.spec.whatwg.org/multipage/media.html#the-video-element">video</a></code> elements)</li><li><code id="image-sources-for-2d-rendering-contexts:htmlcanvaselement"><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> (<code id="image-sources-for-2d-rendering-contexts:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> elements)</li><li><code id="image-sources-for-2d-rendering-contexts:imagebitmap"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code></li></ul>
- <dt><var title="">context</var> . <code title="dom-context-2d-bezierCurveTo"><a href="#dom-context-2d-beziercurveto">bezierCurveTo</a></code>(<var title="">cp1x</var>, <var title="">cp1y</var>, <var title="">cp2x</var>, <var title="">cp2y</var>, <var title="">x</var>, <var title="">y</var>)</dt>
+ <p class="note">Although not formally specified as such, <a data-x-internal="svg-image" href="https://www.w3.org/TR/SVG11/struct.html#ImageElement" id="image-sources-for-2d-rendering-contexts:svg-image-2">SVG <code>image</code></a>
+ elements are expected to be implemented nearly identical to <code id="image-sources-for-2d-rendering-contexts:the-img-element-2"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> elements. That is,
+ <a data-x-internal="svg-image" href="https://www.w3.org/TR/SVG11/struct.html#ImageElement" id="image-sources-for-2d-rendering-contexts:svg-image-3">SVG <code>image</code></a> elements share the fundamental concepts and features of
+ <code id="image-sources-for-2d-rendering-contexts:the-img-element-3"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> elements.</p>
- <dd>
+ <p class="note">The <code id="image-sources-for-2d-rendering-contexts:imagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> interface can be created from a number of other
+ image-representing types, including <code id="image-sources-for-2d-rendering-contexts:imagedata"><a href="#imagedata">ImageData</a></code>.</p>
- <p>Adds the given point to the current subpath, connected to the previous one by a cubic Bézier curve with the given control points.</p>
+ <p>When a user agent is required to <dfn id="check-the-usability-of-the-image-argument">check the usability of the <var>image</var>
+ argument</dfn>, where <var>image</var> is a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-2"><a href="#canvasimagesource">CanvasImageSource</a></code> object, the
+ user agent must run these steps, which return either <i>good</i>, <i>bad</i>, or
+ <i>aborted</i>:</p>
- </dd>
+ <ol><li><p>If <var>image</var> is an <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-2"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> object that is in the <a href="https://html.spec.whatwg.org/multipage/images.html#img-error" id="image-sources-for-2d-rendering-contexts:img-error">broken</a> state, then throw an
+ <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="image-sources-for-2d-rendering-contexts:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="image-sources-for-2d-rendering-contexts:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>, return <i>aborted</i>,
+ and abort these steps.</p></li><li><p>If <var>image</var> is an <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-3"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> object that is not <a href="https://html.spec.whatwg.org/multipage/images.html#img-good" id="image-sources-for-2d-rendering-contexts:img-good">fully decodable</a>, or if <var>image</var> is an
+ <code id="image-sources-for-2d-rendering-contexts:htmlvideoelement-2"><a href="https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement">HTMLVideoElement</a></code> object whose <code id="image-sources-for-2d-rendering-contexts:dom-media-readystate-2"><a href="https://html.spec.whatwg.org/multipage/media.html#dom-media-readystate-2">readyState</a></code>
+ attribute is either <code id="image-sources-for-2d-rendering-contexts:dom-media-have_nothing"><a href="https://html.spec.whatwg.org/multipage/media.html#dom-media-have_nothing">HAVE_NOTHING</a></code> or <code id="image-sources-for-2d-rendering-contexts:dom-media-have_metadata"><a href="https://html.spec.whatwg.org/multipage/media.html#dom-media-have_metadata">HAVE_METADATA</a></code>, then return <i>bad</i> and abort these
+ steps.</p></li><li><p>If <var>image</var> is an <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-4"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> object with an
+ <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-width" id="image-sources-for-2d-rendering-contexts:intrinsic-width">intrinsic width</a> or <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-height" id="image-sources-for-2d-rendering-contexts:intrinsic-height">intrinsic height</a> (or both) equal to zero, then
+ return <i>bad</i> and abort these steps.</p></li><li><p>If <var>image</var> is an <code id="image-sources-for-2d-rendering-contexts:htmlcanvaselement-2"><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> object with either a horizontal
+ dimension or a vertical dimension equal to zero, then return <i>bad</i> and abort these
+ steps.</p></li><li><p>If <var>image</var> is an <code id="image-sources-for-2d-rendering-contexts:imagebitmap-3"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> object with its
+ <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="image-sources-for-2d-rendering-contexts:detached">[[Detached]]</a> internal slot value set to true, then throw an
+ <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="image-sources-for-2d-rendering-contexts:invalidstateerror-2">&quot;<code>InvalidStateError</code>&quot;</a> <code id="image-sources-for-2d-rendering-contexts:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>, return <i>aborted</i>,
+ and abort these steps.</p></li><li><p>Return <i>good</i>.</p></li></ol>
- <dt><var title="">context</var> . <code title="dom-context-2d-arcTo"><a href="#dom-context-2d-arcto">arcTo</a></code>(<var title="">x1</var>, <var title="">y1</var>, <var title="">x2</var>, <var title="">y2</var>, <var title="">radius</var>)</dt>
+ <p>When a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-3"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-5"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code>,
+ the element's image must be used as the source image.</p>
- <dd>
+ <p>Specifically, when a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-4"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an animated image in an
+ <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-6"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code>, the user agent must use the default image of the animation
+ (the one that the format defines is to be used when animation is not supported or is disabled),
+ or, if there is no such image, the first frame of the animation, when rendering the image for
+ <code id="image-sources-for-2d-rendering-contexts:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> APIs.</p>
- <p>Adds an arc with the given control points and radius to the
- current subpath, connected to the previous point by a straight
- line.</p>
+ <p>When a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-5"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an <code id="image-sources-for-2d-rendering-contexts:htmlvideoelement-3"><a href="https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement">HTMLVideoElement</a></code>, then
+ the frame at the <a href="https://html.spec.whatwg.org/multipage/media.html#current-playback-position" id="image-sources-for-2d-rendering-contexts:current-playback-position">current playback position</a> when the method with the argument is
+ invoked must be used as the source image when rendering the image for
+ <code id="image-sources-for-2d-rendering-contexts:canvasrenderingcontext2d-2"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> APIs, and the source image's dimensions must be the <a href="https://html.spec.whatwg.org/multipage/media.html#concept-video-intrinsic-width" id="image-sources-for-2d-rendering-contexts:concept-video-intrinsic-width">intrinsic width</a> and <a href="https://html.spec.whatwg.org/multipage/media.html#concept-video-intrinsic-height" id="image-sources-for-2d-rendering-contexts:concept-video-intrinsic-height">intrinsic height</a> of the <a href="https://html.spec.whatwg.org/multipage/media.html#media-resource" id="image-sources-for-2d-rendering-contexts:media-resource">media resource</a>
+ (i.e. after any aspect-ratio correction has been applied).</p>
- <p>Throws an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception if the given
- radius is negative.</p>
+ <p>When a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-6"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an <code id="image-sources-for-2d-rendering-contexts:htmlcanvaselement-3"><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, the
+ element's bitmap must be used as the source image.</p>
- </dd>
+ <p>When a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-7"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an element that is <a href="https://html.spec.whatwg.org/multipage/rendering.html#being-rendered" id="image-sources-for-2d-rendering-contexts:being-rendered">being
+ rendered</a> and that element has been resized, the original image data of the source image
+ must be used, not the image as it is rendered (e.g. <code id="image-sources-for-2d-rendering-contexts:attr-dim-width"><a href="https://html.spec.whatwg.org/multipage/embedded-content-other.html#attr-dim-width">width</a></code> and
+ <code id="image-sources-for-2d-rendering-contexts:attr-dim-height"><a href="https://html.spec.whatwg.org/multipage/embedded-content-other.html#attr-dim-height">height</a></code> attributes on the source element have no effect on how
+ the object is interpreted when rendering the image for <code id="image-sources-for-2d-rendering-contexts:canvasrenderingcontext2d-3"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>
+ APIs).</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-arc"><a href="#dom-context-2d-arc">arc</a></code>(<var title="">x</var>, <var title="">y</var>, <var title="">radius</var>, <var title="">startAngle</var>, <var title="">endAngle</var> [, <var title="">anticlockwise</var> ] )</dt>
+ <p>When a <code id="image-sources-for-2d-rendering-contexts:canvasimagesource-8"><a href="#canvasimagesource">CanvasImageSource</a></code> object represents an <code id="image-sources-for-2d-rendering-contexts:imagebitmap-4"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code>, the
+ object's bitmap image data must be used as the source image.</p>
- <dd>
+ <p><dfn id="the-image-argument-is-not-origin-clean">The <var>image argument</var> is not origin-clean</dfn> if it is an
+ <code id="image-sources-for-2d-rendering-contexts:htmlorsvgimageelement-7"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> or <code id="image-sources-for-2d-rendering-contexts:htmlvideoelement-4"><a href="https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement">HTMLVideoElement</a></code> whose <a href="https://html.spec.whatwg.org/multipage/origin.html#concept-origin" id="image-sources-for-2d-rendering-contexts:concept-origin">origin</a> is
+ not the <a href="https://html.spec.whatwg.org/multipage/origin.html#same-origin" id="image-sources-for-2d-rendering-contexts:same-origin">same</a> as the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-origin" id="image-sources-for-2d-rendering-contexts:concept-settings-object-origin">origin</a> specified by the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#entry-settings-object" id="image-sources-for-2d-rendering-contexts:entry-settings-object">entry settings
+ object</a>, or if it is an <code id="image-sources-for-2d-rendering-contexts:htmlcanvaselement-4"><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> whose bitmap's <a href="#concept-canvas-origin-clean" id="image-sources-for-2d-rendering-contexts:concept-canvas-origin-clean">origin-clean</a> flag is false.</p>
- <p>Adds points to the subpath such that the arc described by the
- circumference of the circle described by the arguments, starting
- at the given start angle and ending at the given end angle, going
- in the given direction (defaulting to clockwise), is added to the
- path, connected to the previous point by a straight line.</p>
- <p>Throws an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception if the given
- radius is negative.</p>
- </dd>
+ <h6 id="fill-and-stroke-styles"><span class="secno">4.12.5.1.9</span> Fill and stroke styles<a class="self-link" href="#fill-and-stroke-styles"/></h6>
- <dt><var title="">context</var> . <code title="dom-context-2d-rect"><a href="#dom-context-2d-rect">rect</a></code>(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</dt>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-fillstyle"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code> [ = <var>value</var> ]</dt><dd>
- <dd>
+ <p>Returns the current style used for filling shapes.</p>
- <p>Adds a new closed subpath to the path, representing the given rectangle.</p>
+ <p>Can be set, to change the fill style.</p>
- </dd>
+ <p>The style can be either a string containing a CSS color, or a <code id="fill-and-stroke-styles:canvasgradient"><a href="#canvasgradient">CanvasGradient</a></code> or
+ <code id="fill-and-stroke-styles:canvaspattern"><a href="#canvaspattern">CanvasPattern</a></code> object. Invalid values are ignored.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-fill"><a href="#dom-context-2d-fill">fill</a></code>()</dt>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-strokestyle"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code> [ = <var>value</var> ]</dt><dd>
- <dd>
+ <p>Returns the current style used for stroking shapes.</p>
- <p>Fills the subpaths with the current fill style.</p>
+ <p>Can be set, to change the stroke style.</p>
- </dd>
+ <p>The style can be either a string containing a CSS color, or a <code id="fill-and-stroke-styles:canvasgradient-2"><a href="#canvasgradient">CanvasGradient</a></code> or
+ <code id="fill-and-stroke-styles:canvaspattern-2"><a href="#canvaspattern">CanvasPattern</a></code> object. Invalid values are ignored.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-stroke"><a href="#dom-context-2d-stroke">stroke</a></code>()</dt>
+ </dd></dl>
- <dd>
+
- <p>Strokes the subpaths with the current stroke style.</p>
+
- </dd>
+ <p>Objects that implement the <code id="fill-and-stroke-styles:canvasfillstrokestyles"><a href="#canvasfillstrokestyles">CanvasFillStrokeStyles</a></code> interface have attributes and
+ methods (defined in this section) that control how shapes are treated by the object.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-drawSystemFocusRing"><a href="#dom-context-2d-drawsystemfocusring">drawSystemFocusRing</a></code>(<var title="">element</var>)</dt>
+ <p>The <dfn id="dom-context-2d-fillstyle-2"><code>fillStyle</code></dfn> attribute represents the
+ color or style to use inside shapes, and the <dfn id="dom-context-2d-strokestyle-2"><code>strokeStyle</code></dfn> attribute represents the color
+ or style to use for the lines around the shapes.</p>
- <dd>
+ <p>Both attributes can be either strings, <code id="fill-and-stroke-styles:canvasgradient-3"><a href="#canvasgradient">CanvasGradient</a></code>s, or
+ <code id="fill-and-stroke-styles:canvaspattern-3"><a href="#canvaspattern">CanvasPattern</a></code>s. On setting, strings must be <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="fill-and-stroke-styles:parsed-as-a-css-color-value">parsed as CSS &lt;color&gt; values</a> and the color assigned, and
+ <code id="fill-and-stroke-styles:canvasgradient-4"><a href="#canvasgradient">CanvasGradient</a></code> and <code id="fill-and-stroke-styles:canvaspattern-4"><a href="#canvaspattern">CanvasPattern</a></code> objects must be assigned themselves. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSCOLOR">[CSSCOLOR]</a> If the value is a string but cannot be <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="fill-and-stroke-styles:parsed-as-a-css-color-value-2">parsed as a CSS
+ &lt;color&gt; value</a>, then it must be ignored, and the attribute must retain its previous
+ value.
- <p>If the given element is focused, draws a focus ring around the
- current path, following the platform conventions for focus
- rings.</p>
+ If the new value is a <code id="fill-and-stroke-styles:canvaspattern-5"><a href="#canvaspattern">CanvasPattern</a></code> object that is marked as <a href="#concept-canvas-pattern-not-origin-clean" id="fill-and-stroke-styles:concept-canvas-pattern-not-origin-clean">not origin-clean</a>, then the
+ <code id="fill-and-stroke-styles:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>'s <a href="#concept-canvas-origin-clean" id="fill-and-stroke-styles:concept-canvas-origin-clean">origin-clean</a> flag must be set to false.
- </dd>
+ </p>
- <dt><var title="">shouldDraw</var> = <var title="">context</var> . <code title="dom-context-2d-drawCustomFocusRing"><a href="#dom-context-2d-drawcustomfocusring">drawCustomFocusRing</a></code>(<var title="">element</var>)</dt>
+ <p>When set to a <code id="fill-and-stroke-styles:canvaspattern-6"><a href="#canvaspattern">CanvasPattern</a></code> or <code id="fill-and-stroke-styles:canvasgradient-5"><a href="#canvasgradient">CanvasGradient</a></code> object, the assignment
+ is <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#live" id="fill-and-stroke-styles:live">live</a>, meaning that changes made to the object after the assignment do affect
+ subsequent stroking or filling of shapes.</p>
- <dd>
+ <p>On getting, if the value is a color, then the <a href="#serialisation-of-a-color" id="fill-and-stroke-styles:serialisation-of-a-color">serialization of the color</a> must be returned. Otherwise, if it is not a color but a
+ <code id="fill-and-stroke-styles:canvasgradient-6"><a href="#canvasgradient">CanvasGradient</a></code> or <code id="fill-and-stroke-styles:canvaspattern-7"><a href="#canvaspattern">CanvasPattern</a></code>, then the respective object must be
+ returned. (Such objects are opaque and therefore only useful for assigning to other attributes or
+ for comparison to other gradients or patterns.)</p>
- <p>If the given element is focused, and the user has configured
- his system to draw focus rings in a particular manner (for
- example, high contrast focus rings), draws a focus ring around the
- current path and returns false.</p>
+ <p>The <dfn id="serialisation-of-a-color">serialization of a color</dfn> for a color
+ value is a string, computed as follows: if it has alpha equal to 1.0, then the string is a
+ lowercase six-digit hex value, prefixed with a &quot;#&quot; character (U+0023 NUMBER SIGN), with the first
+ two digits representing the red component, the next two digits representing the green component,
+ and the last two digits representing the blue component, the digits being <a data-x-internal="lowercase-ascii-hex-digits" href="https://infra.spec.whatwg.org/#ascii-lower-hex-digit" id="fill-and-stroke-styles:lowercase-ascii-hex-digits">ASCII lower hex digits</a>. Otherwise, the color value has alpha less than
+ 1.0, and the string is the color value in the CSS <code>rgba()</code>
+ functional-notation format: the literal string &quot;<code>rgba</code>&quot; (U+0072 U+0067 U+0062
+ U+0061) followed by a U+0028 LEFT PARENTHESIS, a base-ten integer in the range 0-255 representing
+ the red component (using <a data-x-internal="ascii-digits" href="https://infra.spec.whatwg.org/#ascii-digit" id="fill-and-stroke-styles:ascii-digits">ASCII digits</a> in the shortest form possible), a literal
+ U+002C COMMA and U+0020 SPACE, an integer for the green component, a comma and a space, an integer
+ for the blue component, another comma and space, a U+0030 DIGIT ZERO, if the alpha value is
+ greater than zero then a U+002E FULL STOP (representing the decimal point), if the alpha value is
+ greater than zero then one or more <a data-x-internal="ascii-digits" href="https://infra.spec.whatwg.org/#ascii-digit" id="fill-and-stroke-styles:ascii-digits-2">ASCII digits</a> representing the fractional part of
+ the alpha, and finally a U+0029
+ RIGHT PARENTHESIS. User agents must express the fractional part of the alpha value, if any, with
+ the level of precision necessary for the alpha value, when reparsed, to be interpreted as the same
+ alpha value.</p>
+
- <p>Otherwise, returns true if the given element is focused, and
- false otherwise. This can thus be used to determine when to draw a
- focus ring (see <a href="#drawCustomFocusRingExample">the
- example</a> below).</p>
+ <p>When the context is created, the <code id="fill-and-stroke-styles:dom-context-2d-fillstyle-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code> and <code id="fill-and-stroke-styles:dom-context-2d-strokestyle-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code> attributes
+ must initially have the string value <code>#000000</code>.</p>
- </dd>
+ <p>When the value is a color, it must not be affected by the transformation matrix when used to
+ draw on bitmaps.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-scrollPathIntoView"><a href="#dom-context-2d-scrollpathintoview">scrollPathIntoView</a></code>()</dt>
+
- <dd>
+ <hr/>
- <p>Scrolls the current path into view. This is especially useful
- on devices with small screens, where the whole canvas might not be
- visible at once.</p>
+ <p>There are two types of gradients, linear gradients and radial gradients, both represented by
+ objects implementing the opaque <code id="fill-and-stroke-styles:canvasgradient-7"><a href="#canvasgradient">CanvasGradient</a></code> interface.</p>
- </dd>
+ <p id="interpolation">Once a gradient has been created (see below), stops are placed along it to
+ define how the colors are distributed along the gradient. The color of the
+ gradient at each stop is the color specified for that stop. Between each such stop, the colors and
+ the alpha component must be linearly interpolated over the RGBA space without premultiplying the
+ alpha value to find the color to use at that offset. Before the first stop, the color must be the
+ color of the first stop. After the last stop, the color must be the color of the last stop. When
+ there are no stops, the gradient is transparent black.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-clip"><a href="#dom-context-2d-clip">clip</a></code>()</dt>
+ <dl class="domintro"><dt><var>gradient</var> . <code id="dom-canvasgradient-addcolorstop"><a href="#dom-canvasgradient-addcolorstop-2">addColorStop</a></code>(<var>offset</var>, <var>color</var>)</dt><dd>
- <dd>
+ <p>Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset
+ at one end of the gradient, 1.0 is the offset at the other end.</p>
- <p>Further constrains the clipping region to the given path.</p>
+ <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="fill-and-stroke-styles:indexsizeerror">&quot;<code>IndexSizeError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the offset
+ is out of range. Throws a <a data-x-internal="syntaxerror" href="https://heycam.github.io/webidl/#syntaxerror" id="fill-and-stroke-styles:syntaxerror">&quot;<code>SyntaxError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if
+ the color cannot be parsed.</p>
- </dd>
+ </dd><dt><var>gradient</var> = <var>context</var> . <code id="dom-context-2d-createlineargradient"><a href="#dom-context-2d-createlineargradient-2">createLinearGradient</a></code>(<var>x0</var>, <var>y0</var>, <var>x1</var>, <var>y1</var>)</dt><dd>
- <dt><var title="">context</var> . <code title="dom-context-2d-isPointInPath"><a href="#dom-context-2d-ispointinpath">isPointInPath</a></code>(<var title="">x</var>, <var title="">y</var>)</dt>
+ <p>Returns a <code id="fill-and-stroke-styles:canvasgradient-8"><a href="#canvasgradient">CanvasGradient</a></code> object that represents a
+ linear gradient that paints along the line given by the
+ coordinates represented by the arguments.</p>
- <dd>
+ </dd><dt><var>gradient</var> = <var>context</var> . <code id="dom-context-2d-createradialgradient"><a href="#dom-context-2d-createradialgradient-2">createRadialGradient</a></code>(<var>x0</var>, <var>y0</var>, <var>r0</var>, <var>x1</var>, <var>y1</var>, <var>r1</var>)</dt><dd>
- <p>Returns true if the given point is in the current path.</p>
+ <p>Returns a <code id="fill-and-stroke-styles:canvasgradient-9"><a href="#canvasgradient">CanvasGradient</a></code> object that represents a
+ radial gradient that paints along the cone given by the circles
+ represented by the arguments.</p>
- </dd>
+ <p>If either of the radii are negative, throws an
+ <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="fill-and-stroke-styles:indexsizeerror-2">&quot;<code>IndexSizeError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-3"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> exception.</p>
+
+ </dd></dl>
+
+
+
+ <p>The <dfn id="dom-canvasgradient-addcolorstop-2"><code>addColorStop(<var>offset</var>,
+ <var>color</var>)</code></dfn> method on the <code id="fill-and-stroke-styles:canvasgradient-10"><a href="#canvasgradient">CanvasGradient</a></code> interface adds a new stop
+ to a gradient. If the <var>offset</var> is less than 0 or greater than 1 then an
+ <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="fill-and-stroke-styles:indexsizeerror-3">&quot;<code>IndexSizeError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-4"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> must be thrown. If the
+ <var>color</var> cannot be <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="fill-and-stroke-styles:parsed-as-a-css-color-value-3">parsed as a CSS &lt;color&gt; value</a>, then a
+ <a data-x-internal="syntaxerror" href="https://heycam.github.io/webidl/#syntaxerror" id="fill-and-stroke-styles:syntaxerror-2">&quot;<code>SyntaxError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-5"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> must be thrown. Otherwise, the
+ gradient must have a new stop placed, at offset <var>offset</var> relative to the whole gradient,
+ and with the color obtained by <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="fill-and-stroke-styles:parsed-as-a-css-color-value-4">parsing
+ <var>color</var> as a CSS &lt;color&gt; value</a>. If multiple stops are added at the same
+ offset on a gradient, then they must be placed in the order added, with the first one closest to
+ the start of the gradient, and each subsequent one infinitesimally further along towards the end
+ point (in effect causing all but the first and last stop added at each point to be ignored).</p>
+
+ <p>The <dfn id="dom-context-2d-createlineargradient-2"><code>createLinearGradient(<var>x0</var>,
+ <var>y0</var>, <var>x1</var>, <var>y1</var>)</code></dfn> method takes four arguments that
+ represent the start point (<var>x0</var>, <var>y0</var>) and end point (<var>x1</var>,
+ <var>y1</var>) of the gradient. The method, when invoked, must return a linear
+ <code id="fill-and-stroke-styles:canvasgradient-11"><a href="#canvasgradient">CanvasGradient</a></code> initialized with the specified line.</p>
+
+ <p>Linear gradients must be rendered such that all points on a line perpendicular to the line that
+ crosses the start and end points have the color at the point where those two lines cross (with the
+ colors coming from the <a href="#interpolation">interpolation and extrapolation</a> described
+ above). The points in the linear gradient must be transformed as described by the <a href="#transformations" id="fill-and-stroke-styles:transformations">current transformation matrix</a> when rendering.</p>
+
+ <p>If <var>x0</var> = <var>x1</var> and <span><var>y0</var> = <var>y1</var></span>, then the linear
+ gradient must paint nothing.</p>
+
+ <p>The <dfn id="dom-context-2d-createradialgradient-2"><code>createRadialGradient(<var>x0</var>,
+ <var>y0</var>, <var>r0</var>, <var>x1</var>, <var>y1</var>, <var>r1</var>)</code></dfn> method
+ takes six arguments, the first three representing the start circle with origin (<var>x0</var>,
+ <var>y0</var>) and radius <var>r0</var>, and the last three representing the end circle with
+ origin (<var>x1</var>, <var>y1</var>) and radius <var>r1</var>. The values are in coordinate space
+ units. If either of <var>r0</var> or <var>r1</var> are negative, then an
+ <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="fill-and-stroke-styles:indexsizeerror-4">&quot;<code>IndexSizeError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-6"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> must be thrown. Otherwise,
+ the method, when invoked, must return a radial <code id="fill-and-stroke-styles:canvasgradient-12"><a href="#canvasgradient">CanvasGradient</a></code> initialized with the
+ two specified circles.</p>
- </dl><div class="impl">
+ <p>Radial gradients must be rendered by following these steps:</p>
- <p>Initially, the context's path must have zero subpaths.</p>
+ <ol><li><p>If <var>x<sub>0</sub></var> = <var>x<sub>1</sub></var> and <var>y<sub>0</sub></var> = <var>y<sub>1</sub></var> and <var>r<sub>0</sub></var> = <var>r<sub>1</sub></var>, then the radial gradient must
+ paint nothing. Abort these steps.</p></li><li>
- <p>The points and lines added to the path by these methods must be
- transformed according to the <a href="#transformations" title="dom-context-2d-transformation">current transformation
- matrix</a> as they are added.</p>
+ <p>Let <span>x(<var>ω</var>) = (<var>x<sub>1</sub></var>-<var>x<sub>0</sub></var>)<var>ω</var> + <var>x<sub>0</sub></var></span></p>
+ <p>Let <span>y(<var>ω</var>) = (<var>y<sub>1</sub></var>-<var>y<sub>0</sub></var>)<var>ω</var> + <var>y<sub>0</sub></var></span></p>
- <p>The <dfn id="dom-context-2d-beginpath" title="dom-context-2d-beginPath"><code>beginPath()</code></dfn>
- method must empty the list of subpaths so that the context once
- again has zero subpaths.</p>
+ <p>Let <span>r(<var>ω</var>) = (<var>r<sub>1</sub></var>-<var>r<sub>0</sub></var>)<var>ω</var> + <var>r<sub>0</sub></var></span></p>
+ <p>Let the color at <var>ω</var> be the color at that position on the gradient
+ (with the colors coming from the <a href="#interpolation">interpolation and extrapolation</a>
+ described above).</p>
- <p>The <dfn id="dom-context-2d-moveto" title="dom-context-2d-moveTo"><code>moveTo(<var title="">x</var>, <var title="">y</var>)</code></dfn> method must
- create a new subpath with the specified point as its first (and
- only) point.</p>
+ </li><li><p>For all values of <var>ω</var> where <span>r(<var>ω</var>) &gt; 0</span>, starting with the value of <var>ω</var> nearest to positive infinity and ending with the value of <var>ω</var> nearest to negative infinity, draw the circumference of the circle with
+ radius <span>r(<var>ω</var>)</span> at position (<span>x(<var>ω</var>)</span>, <span>y(<var>ω</var>)</span>), with the
+ color at <var>ω</var>, but only painting on the parts of the bitmap that have not
+ yet been painted on by earlier circles in this step for this rendering of the gradient.</p></li></ol>
- <p>When the user agent is to <dfn id="ensure-there-is-a-subpath">ensure there is a subpath</dfn>
- for a coordinate (<var title="">x</var>, <var title="">y</var>), the
- user agent must check to see if the context has any subpaths, and if
- it does not, then the user agent must create a new subpath with the
- point (<var title="">x</var>, <var title="">y</var>) as its first
- (and only) point, as if the <code title="dom-context-2d-moveTo"><a href="#dom-context-2d-moveto">moveTo()</a></code> method had been
- called.</p>
+ <p class="note">This effectively creates a cone, touched by the two circles defined in the
+ creation of the gradient, with the part of the cone before the start circle (0.0) using the color
+ of the first offset, the part of the cone after the end circle (1.0) using the color of the last
+ offset, and areas outside the cone untouched by the gradient (transparent black).</p>
+ <p>The resulting radial gradient must then be transformed as described by the <a href="#transformations" id="fill-and-stroke-styles:transformations-2">current transformation matrix</a> when rendering.</p>
- <p>The <dfn id="dom-context-2d-closepath" title="dom-context-2d-closePath"><code>closePath()</code></dfn>
- method must do nothing if the context has no subpaths. Otherwise, it
- must mark the last subpath as closed, create a new subpath whose
- first point is the same as the previous subpath's first point, and
- finally add this new subpath to the path.</p>
+ <p>Gradients must be painted only where the relevant stroking or filling effects requires that
+ they be drawn.</p>
- <p class="note">If the last subpath had more than one point in its
- list of points, then this is equivalent to adding a straight line
- connecting the last point back to the first point, thus &quot;closing&quot;
- the shape, and then repeating the last (possibly implied) <code title="dom-context-2d-moveTo"><a href="#dom-context-2d-moveto">moveTo()</a></code> call.</p>
+
+ <hr/>
- <p>New points and the lines connecting them are added to subpaths
- using the methods described below. In all cases, the methods only
- modify the last subpath in the context's paths.</p>
+ <p>Patterns are represented by objects implementing the opaque <code id="fill-and-stroke-styles:canvaspattern-8"><a href="#canvaspattern">CanvasPattern</a></code>
+ interface.</p>
+ <dl class="domintro"><dt><var>pattern</var> = <var>context</var> . <code id="dom-context-2d-createpattern"><a href="#dom-context-2d-createpattern-2">createPattern</a></code>(<var>image</var>, <var>repetition</var>)</dt><dd>
- <p>The <dfn id="dom-context-2d-lineto" title="dom-context-2d-lineTo"><code>lineTo(<var title="">x</var>, <var title="">y</var>)</code></dfn> method must
- <a href="#ensure-there-is-a-subpath">ensure there is a subpath</a> for <span title="">(<var title="">x</var>, <var title="">y</var>)</span> if the context has
- no subpaths. Otherwise, it must connect the last point in the
- subpath to the given point (<var title="">x</var>, <var title="">y</var>) using a straight line, and must then add the given
- point (<var title="">x</var>, <var title="">y</var>) to the
- subpath.</p>
+ <p>Returns a <code id="fill-and-stroke-styles:canvaspattern-9"><a href="#canvaspattern">CanvasPattern</a></code> object that uses the given image and repeats in the
+ direction(s) given by the <var>repetition</var> argument.</p>
+ <p>The allowed values for <var>repetition</var> are <code>repeat</code> (both
+ directions), <code>repeat-x</code> (horizontal only), <code>repeat-y</code>
+ (vertical only), and <code>no-repeat</code> (neither). If the <var>repetition</var> argument is empty, the value <code>repeat</code> is used.</p>
- <p>The <dfn id="dom-context-2d-quadraticcurveto" title="dom-context-2d-quadraticCurveTo"><code>quadraticCurveTo(<var title="">cpx</var>, <var title="">cpy</var>, <var title="">x</var>,
- <var title="">y</var>)</code></dfn> method must <a href="#ensure-there-is-a-subpath">ensure there
- is a subpath</a> for <span title="">(<var title="">cpx</var>,
- <var title="">cpy</var>)</span>, and then must connect the last
- point in the subpath to the given point (<var title="">x</var>, <var title="">y</var>) using a quadratic Bézier curve with control
- point (<var title="">cpx</var>, <var title="">cpy</var>), and must
- then add the given point (<var title="">x</var>, <var title="">y</var>) to the subpath. <a href="#refsBEZIER">[BEZIER]</a></p>
+ <p>If the image isn't yet fully decoded, then nothing is drawn. If the image is a canvas with no
+ data, throws an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="fill-and-stroke-styles:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-7"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p>
+ </dd><dt><var>pattern</var> . <code id="dom-canvaspattern-settransform"><a href="#dom-canvaspattern-settransform-2">setTransform</a></code>(<var>transform</var>)</dt><dd>
- <p>The <dfn id="dom-context-2d-beziercurveto" title="dom-context-2d-bezierCurveTo"><code>bezierCurveTo(<var title="">cp1x</var>, <var title="">cp1y</var>, <var title="">cp2x</var>, <var title="">cp2y</var>, <var title="">x</var>, <var title="">y</var>)</code></dfn> method must
- <a href="#ensure-there-is-a-subpath">ensure there is a subpath</a> for <span title="">(<var title="">cp1x</var>, <var title="">cp1y</var>)</span>, and then must
- connect the last point in the subpath to the given point (<var title="">x</var>, <var title="">y</var>) using a cubic Bézier
- curve with control points (<var title="">cp1x</var>, <var title="">cp1y</var>) and (<var title="">cp2x</var>, <var title="">cp2y</var>). Then, it must add the point (<var title="">x</var>, <var title="">y</var>) to the subpath. <a href="#refsBEZIER">[BEZIER]</a></p>
+ <p>Sets the transformation matrix that will be used when rendering the pattern during a fill or
+ stroke painting operation.</p>
- <hr/><p>The <dfn id="dom-context-2d-arcto" title="dom-context-2d-arcTo"><code>arcTo(<var title="">x1</var>, <var title="">y1</var>, <var title="">x2</var>,
- <var title="">y2</var>, <var title="">radius</var>)</code></dfn>
- method must first <a href="#ensure-there-is-a-subpath">ensure there is a subpath</a> for <span title="">(<var title="">x1</var>, <var title="">y1</var>)</span>. Then, the behavior depends on the
- arguments and the last point in the subpath, as described below.</p>
+ </dd></dl>
- <p>Negative values for <var title="">radius</var> must cause the
- implementation to raise an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code>
- exception.</p>
-
- <p>Let the point (<var title="">x0</var>, <var title="">y0</var>) be
- the last point in the subpath.</p>
-
- <p>If the point (<var title="">x0</var>, <var title="">y0</var>) is
- equal to the point (<var title="">x1</var>, <var title="">y1</var>),
- or if the point (<var title="">x1</var>, <var title="">y1</var>) is
- equal to the point (<var title="">x2</var>, <var title="">y2</var>),
- or if the radius <var title="">radius</var> is zero, then the method
- must add the point (<var title="">x1</var>, <var title="">y1</var>)
- to the subpath, and connect that point to the previous point (<var title="">x0</var>, <var title="">y0</var>) by a straight line.</p>
-
- <p>Otherwise, if the points (<var title="">x0</var>, <var title="">y0</var>), (<var title="">x1</var>, <var title="">y1</var>), and (<var title="">x2</var>, <var title="">y2</var>) all lie on a single straight line, then the
- method must add the point (<var title="">x1</var>, <var title="">y1</var>) to the subpath, and connect that point to the
- previous point (<var title="">x0</var>, <var title="">y0</var>) by a
- straight line.</p>
-
- <p>Otherwise, let <var title="">The Arc</var> be the shortest arc
- given by circumference of the circle that has radius <var title="">radius</var>, and that has one point tangent to the
- half-infinite line that crosses the point (<var title="">x0</var>,
- <var title="">y0</var>) and ends at the point (<var title="">x1</var>, <var title="">y1</var>), and that has a different
- point tangent to the half-infinite line that ends at the point (<var title="">x1</var>, <var title="">y1</var>) and crosses the point
- (<var title="">x2</var>, <var title="">y2</var>). The points at
- which this circle touches these two lines are called the start and
- end tangent points respectively. The method must connect the point
- (<var title="">x0</var>, <var title="">y0</var>) to the start
- tangent point by a straight line, adding the start tangent point to
- the subpath, and then must connect the start tangent point to the
- end tangent point by <var title="">The Arc</var>, adding the end
- tangent point to the subpath.</p>
-
- <hr/><p>The <dfn id="dom-context-2d-arc" title="dom-context-2d-arc"><code>arc(<var title="">x</var>, <var title="">y</var>, <var title="">radius</var>,
- <var title="">startAngle</var>, <var title="">endAngle</var>, <var title="">anticlockwise</var>)</code></dfn> method draws an arc. If
- the context has any subpaths, then the method must add a straight
- line from the last point in the subpath to the start point of the
- arc. In any case, it must draw the arc between the start point of
- the arc and the end point of the arc, and add the start and end
- points of the arc to the subpath. The arc and its start and end
- points are defined as follows:</p>
-
- <p>Consider a circle that has its origin at (<var title="">x</var>,
- <var title="">y</var>) and that has radius <var title="">radius</var>. The points at <var title="">startAngle</var>
- and <var title="">endAngle</var> along this circle's circumference,
- measured in radians clockwise from the positive x-axis, are the
- start and end points respectively.</p>
-
- <p>If the <var title="">anticlockwise</var> argument is omitted or
- false and <span title=""><var title="">endAngle</var>-<var title="">startAngle</var></span> is equal to or greater than <span title="">2π</span>, or, if the <var title="">anticlockwise</var>
- argument is <em>true</em> and <span title=""><var title="">startAngle</var>-<var title="">endAngle</var></span> is
- equal to or greater than <span title="">2π</span>, then the arc
- is the whole circumference of this circle.</p>
-
- <p>Otherwise, the arc is the path along the circumference of this
- circle from the start point to the end point, going anti-clockwise
- if the <var title="">anticlockwise</var> argument is true, and
- clockwise otherwise. Since the points are on the circle, as opposed
- to being simply angles from zero, the arc can never cover an angle
- greater than <span title="">2π</span> radians. If the two points are the
- same, or if the radius is zero, then the arc is defined as being of
- zero length in both directions.</p>
-
- <p>Negative values for <var title="">radius</var> must cause the
- implementation to raise an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code>
- exception.</p>
-
- <hr/><p>The <dfn id="dom-context-2d-rect" title="dom-context-2d-rect"><code>rect(<var title="">x</var>, <var title="">y</var>, <var title="">w</var>, <var title="">h</var>)</code></dfn> method must create a new subpath
- containing just the four points (<var title="">x</var>, <var title="">y</var>), (<var title="">x</var>+<var title="">w</var>,
- <var title="">y</var>), (<var title="">x</var>+<var title="">w</var>, <var title="">y</var>+<var title="">h</var>),
- (<var title="">x</var>, <var title="">y</var>+<var title="">h</var>), with those four points connected by straight
- lines, and must then mark the subpath as closed. It must then create
- a new subpath with the point (<var title="">x</var>, <var title="">y</var>) as the only point in the subpath.</p>
-
-
- <!-- v6 feature request:
- * points as a primitive shape
- http://home.comcast.net/~urbanjost/canvas/vogle4.html
- -->
-
-
- <p>The <dfn id="dom-context-2d-fill" title="dom-context-2d-fill"><code>fill()</code></dfn>
- method must fill all the subpaths of the current path, using
- <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code>, and using
- the non-zero winding number rule. Open subpaths must be implicitly
- closed when being filled (without affecting the actual
- subpaths).</p>
-
- <p class="note">Thus, if two overlapping but otherwise independent
- subpaths have opposite windings, they cancel out and result in no
- fill. If they have the same winding, that area just gets painted
- once.</p>
-
- <p>The <dfn id="dom-context-2d-stroke" title="dom-context-2d-stroke"><code>stroke()</code></dfn> method
- must calculate the strokes of all the subpaths of the current path,
- using the <code title="dom-context-2d-lineWidth"><a href="#dom-context-2d-linewidth">lineWidth</a></code>,
- <code title="dom-context-2d-lineCap"><a href="#dom-context-2d-linecap">lineCap</a></code>, <code title="dom-context-2d-lineJoin"><a href="#dom-context-2d-linejoin">lineJoin</a></code>, and (if
- appropriate) <code title="dom-context-2d-miterLimit"><a href="#dom-context-2d-miterlimit">miterLimit</a></code> attributes, and
- then fill the combined stroke area using the <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code>
- attribute.</p>
+
- <p class="note">Since the subpaths are all stroked as one,
- overlapping parts of the paths in one stroke operation are treated
- as if their union was what was painted.</p>
+ <p>The <dfn id="dom-context-2d-createpattern-2"><code>createPattern(<var>image</var>,
+ <var>repetition</var>)</code></dfn> method, when invoked, must run these steps:</p>
- <p>Paths, when filled or stroked, must be painted without affecting
- the current path, and must be subject to <a href="#shadows" title="shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, the <a href="#clipping-region" title="clipping region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
- operators</a>. (Transformations affect the path when the path is
- created, not when it is painted, though the stroke <em>style</em> is
- still affected by the transformation during painting.)</p>
+ <ol><li><p>Let <var>image</var> be the first argument and <var>repetition</var> be
+ the second argument.</p></li><li><p><a href="#check-the-usability-of-the-image-argument" id="fill-and-stroke-styles:check-the-usability-of-the-image-argument">Check the usability of the <var>image</var> argument</a>. If this
+ returns <i>aborted</i>, then an exception has been thrown and the method doesn't return anything;
+ abort these steps. If it returns <i>bad</i>, then return null and abort these steps. Otherwise it
+ returns <i>good</i>; continue with these steps.</p></li><li><p>If <var>repetition</var> is the empty string, then set it to &quot;<code>repeat</code>&quot;.</p>
- <p>Zero-length line segments must be pruned before stroking a
- path. Empty subpaths must be ignored.</p>
+ </li><li><p>If <var>repetition</var> is not a <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#case-sensitive" id="fill-and-stroke-styles:case-sensitive">case-sensitive</a> match for one of
+ &quot;<code>repeat</code>&quot;, &quot;<code>repeat-x</code>&quot;, &quot;<code>repeat-y</code>&quot;, or &quot;<code>no-repeat</code>&quot;, then throw a
+ <a data-x-internal="syntaxerror" href="https://heycam.github.io/webidl/#syntaxerror" id="fill-and-stroke-styles:syntaxerror-3">&quot;<code>SyntaxError</code>&quot;</a> <code id="fill-and-stroke-styles:domexception-8"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p></li><li><p>Create a new <code id="fill-and-stroke-styles:canvaspattern-10"><a href="#canvaspattern">CanvasPattern</a></code> object with the image <var>image</var>
+ and the repetition behavior given by <var>repetition</var>.</p></li><li><p>If <a href="#the-image-argument-is-not-origin-clean" id="fill-and-stroke-styles:the-image-argument-is-not-origin-clean">the <var>image argument</var> is not origin-clean</a>, then mark the
+ <code id="fill-and-stroke-styles:canvaspattern-11"><a href="#canvaspattern">CanvasPattern</a></code> object as <dfn id="concept-canvas-pattern-not-origin-clean">not
+ origin-clean</dfn>.</p></li><li><p>Return the <code id="fill-and-stroke-styles:canvaspattern-12"><a href="#canvaspattern">CanvasPattern</a></code> object.</p></li></ol>
- <hr/><p id="dom-context-2d-drawosfocusring">The <dfn id="dom-context-2d-drawsystemfocusring" title="dom-context-2d-drawSystemFocusRing"><code>drawSystemFocusRing(<var title="">element</var>)</code></dfn> method, when invoked, must run
- the following steps:</p>
+ <p>Modifying the <var>image</var> used when creating a <code id="fill-and-stroke-styles:canvaspattern-13"><a href="#canvaspattern">CanvasPattern</a></code> object
+ after calling the <code id="fill-and-stroke-styles:dom-context-2d-createpattern-2"><a href="#dom-context-2d-createpattern-2">createPattern()</a></code> method must
+ not affect the pattern(s) rendered by the <code id="fill-and-stroke-styles:canvaspattern-14"><a href="#canvaspattern">CanvasPattern</a></code> object.</p>
- <ol><li><p>If <var title="">element</var> is not focused or is not a
- descendant of the element with whose context the method is
- associated, then abort these steps.</p></li>
+ <p>Patterns have a transformation matrix, which controls how the pattern is used when it is
+ painted. Initially, a pattern's transformation matrix must be the identity transform.</p>
- <li>
+ <p>The <dfn id="dom-canvaspattern-settransform-2"><code>setTransform(<var>transform</var>)</code></dfn> method,
+ when invoked, must reset the pattern's transformation matrix to the value represented by the
+ result of <a data-x-internal="create-a-dommatrix-from-a-dictionary" href="https://drafts.fxtf.org/geometry/#create-a-dommatrix-from-the-dictionary" id="fill-and-stroke-styles:create-a-dommatrix-from-a-dictionary">creating a <code>DOMMatrix</code>
+ from a dictionary</a> <var>transform</var>, with <var>ignore3D</var> set to true.</p>
- <p>If the user has requested the use of particular focus rings
- (e.g. high-contrast focus rings), or if the <var title="">element</var> would have a focus ring drawn around it,
- then draw a focus ring of the appropriate style along the path,
- following platform conventions, and abort these steps.</p>
+ <p>When a pattern is to be rendered within an area, the user agent must run the following steps to
+ determine what is rendered:</p>
- <p class="note">Some platforms only draw focus rings around
- elements that have been focused from the keyboard, and not those
- focused from the mouse. Other platforms simply don't draw focus
- rings around some elements at all unless relevant accessibility
- features are enabled. This API is intended to follow these
- conventions. User agents that implement distinctions based on the
- manner in which the element was focused are encouraged to classify
- focus driven by the <code title="dom-focus"><a href="#dom-focus">focus()</a></code> method
- based on the kind of user interaction event from which the call
- was triggered (if any).</p>
+ <ol><li><p>Create an infinite transparent black bitmap.</p></li><li>
- <p>The focus ring should not be subject to the <a href="#shadows" title="shadows">shadow effects</a>, the <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, or the <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
- operators</a>, but <em>should</em> be subject to the <a href="#clipping-region" title="clipping region">clipping region</a>.</p>
+ <p>Place a copy of the image on the bitmap, anchored such that its top left corner is at the
+ origin of the coordinate space, with one coordinate space unit per <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="fill-and-stroke-styles:'px'">CSS
+ pixel</a> of the image, then place repeated copies of this image horizontally to the left and
+ right, if the repetition behavior is &quot;<code>repeat-x</code>&quot;, or vertically up and
+ down, if the repetition behavior is &quot;<code>repeat-y</code>&quot;, or in all four
+ directions all over the bitmap, if the repetition behavior is &quot;<code>repeat</code>&quot;.</p>
- </li>
+ <p>If the original image data is a bitmap image, then the value painted at a point in the area
+ of the repetitions is computed by filtering the original image data. When scaling up, if the
+ <code id="fill-and-stroke-styles:dom-context-2d-imagesmoothingenabled-2"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code> attribute is
+ set to false, then the image must be rendered using nearest-neighbor interpolation. Otherwise,
+ the user agent may use any filtering algorithm (for example bilinear interpolation or
+ nearest-neighbor). User agents which support multiple filtering algorithms may use the value of
+ the <code id="fill-and-stroke-styles:dom-context-2d-imagesmoothingquality-2"><a href="#dom-context-2d-imagesmoothingquality-2">imageSmoothingQuality</a></code> attribute
+ to guide the choice of filtering algorithm. When such a filtering algorithm requires a pixel
+ value from outside the original image data, it must instead use the value from wrapping the
+ pixel's coordinates to the original image's dimensions. (That is, the filter uses 'repeat'
+ behavior, regardless of the value of the pattern's repetition behavior.)</p>
- <li>
+ </li><li><p>Transform the resulting bitmap according to the pattern's transformation matrix.</p></li><li><p>Transform the resulting bitmap again, this time according to the <a href="#transformations" id="fill-and-stroke-styles:transformations-3">current transformation matrix</a>.</p></li><li><p>Replace any part of the image outside the area in which the pattern is to be rendered with
+ transparent black.</p></li><li><p>The resulting bitmap is what is to be rendered, with the same origin and same
+ scale.</p></li></ol>
- <p>Optionally, <a href="#inform">inform the user</a> that the
- focus is at the location given by the path. User agents may wait
- until the next time the <a href="#event-loop">event loop</a> reaches its
- &quot;update the rendering&quot; step to optionally inform the user.</p>
+ <hr/>
- </li>
+ <p>If a radial gradient or repeated pattern is used when the transformation matrix is singular,
+ then the resulting style must be transparent black (otherwise the gradient or pattern would be
+ collapsed to a point or line, leaving the other pixels undefined). Linear gradients and solid
+ colors always define all points even with singular transformation matrices.</p>
- </ol><p>The <dfn id="dom-context-2d-drawcustomfocusring" title="dom-context-2d-drawCustomFocusRing"><code>drawCustomFocusRing(<var title="">element</var>)</code></dfn> method, when invoked, must run
- the following steps:</p>
+
- <ol><li><p>If <var title="">element</var> is not focused or is not a
- descendant of the element with whose context the method is
- associated, then return false and abort these steps.</p></li>
- <li>
- <p>If the user has requested the use of particular focus rings
- (e.g. high-contrast focus rings), then draw a focus ring of the
- appropriate style along the path, return false, and abort these
- steps.</p>
- <p>The focus ring should not be subject to the <a href="#shadows" title="shadows">shadow effects</a>, the <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, or the <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
- operators</a>, but <em>should</em> be subject to the <a href="#clipping-region" title="clipping region">clipping region</a>.</p>
+ <h6 id="drawing-rectangles-to-the-bitmap"><span class="secno">4.12.5.1.10</span> Drawing rectangles to the bitmap<a class="self-link" href="#drawing-rectangles-to-the-bitmap"/></h6>
- </li>
+ <p>Objects that implement the <code id="drawing-rectangles-to-the-bitmap:canvasrect"><a href="#canvasrect">CanvasRect</a></code> interface provide the following methods for
+ immediately drawing rectangles to the bitmap. The methods each take four arguments; the first two
+ give the <var>x</var> and <var>y</var> coordinates of the top left of the rectangle, and the
+ second two give the width <var>w</var> and height <var>h</var> of the rectangle, respectively.</p>
- <li>
+
- <p>Optionally, <a href="#inform">inform the user</a> that the
- focus is at the location given by the path. User agents may wait
- until the next time the <a href="#event-loop">event loop</a> reaches its
- &quot;update the rendering&quot; step to optionally inform the user.</p>
+ <p>The <a href="#transformations" id="drawing-rectangles-to-the-bitmap:transformations">current transformation matrix</a> must be
+ applied to the following four coordinates, which form the path that must then be closed to get the
+ specified rectangle: <span>(<var>x</var>, <var>y</var>)</span>, <span>(<var>x</var>+<var>w</var>, <var>y</var>)</span>, <span>(<var>x</var>+<var>w</var>, <var>y</var>+<var>h</var>)</span>, <span>(<var>x</var>, <var>y</var>+<var>h</var>)</span>.</p>
- </li>
+ <p>Shapes are painted without affecting the <a href="#current-default-path" id="drawing-rectangles-to-the-bitmap:current-default-path">current default path</a>, and are subject to
+ the <a href="#clipping-region" id="drawing-rectangles-to-the-bitmap:clipping-region">clipping region</a>, and, with the exception of <code id="drawing-rectangles-to-the-bitmap:dom-context-2d-clearrect-2"><a href="#dom-context-2d-clearrect-2">clearRect()</a></code>, also <a href="#shadows" id="drawing-rectangles-to-the-bitmap:shadows">shadow
+ effects</a>, <a href="#dom-context-2d-globalalpha-2" id="drawing-rectangles-to-the-bitmap:dom-context-2d-globalalpha-2">global alpha</a>, and <a href="#dom-context-2d-globalcompositeoperation-2" id="drawing-rectangles-to-the-bitmap:dom-context-2d-globalcompositeoperation-2">global composition operators</a>.</p>
- <li><p>Return true.</p></li>
+
- </ol><p>The <dfn id="dom-context-2d-scrollpathintoview" title="dom-context-2d-scrollPathIntoView"><code>scrollPathIntoView()</code></dfn>
- method, when invoked, must run the following steps:</p>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-clearrect"><a href="#dom-context-2d-clearrect-2">clearRect</a></code>(<var>x</var>, <var>y</var>, <var>w</var>, <var>h</var>)</dt><dd>
- <ol><li><p>Let <var title="">notional child</var> be a hypothetical
- element that is a rendered child of the <code><a href="#the-canvas-element">canvas</a></code> element
- whose dimensions are exactly the rectangle of the bounding box of
- the current path.</p></li>
+ <p>Clears all pixels on the bitmap in the given rectangle to transparent black.</p>
- <li><p><span title="scroll an element into view">Scroll <var title="">notional child</var> into view</span> with the <var title="">align to top flag</var> set.</p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-fillrect"><a href="#dom-context-2d-fillrect-2">fillRect</a></code>(<var>x</var>, <var>y</var>, <var>w</var>, <var>h</var>)</dt><dd>
- </li><li><p>Optionally, <a href="#inform">inform the user</a> that the
- caret and/or selection cover <var title="">the specified
- rectangle</var> of the canvas. User agents may wait until the next
- time the <a href="#event-loop">event loop</a> reaches its &quot;update the rendering&quot;
- step to optionally inform the user.</p></li>
+ <p>Paints the given rectangle onto the bitmap, using the current fill style.</p>
- </ol><p class="note" id="inform">&quot;Inform the user&quot;, as used in this
- section, could mean calling a system accessibility API, which would
- notify assistive technologies such as magnification tools. To
- properly drive magnification based on a focus change, a system
- accessibility API driving a screen magnifier needs the bounds for
- the newly focused object. The methods above are intended to enable
- this by allowing the user agent to report the bounding box of the
- path used to render the focus ring as the bounds of the <var title="">element</var> element passed as an argument, if that
- element is focused, and the bounding box of the area to which the
- user agent is scrolling as the bounding box of the current
- selection.</p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-strokerect"><a href="#dom-context-2d-strokerect-2">strokeRect</a></code>(<var>x</var>, <var>y</var>, <var>w</var>, <var>h</var>)</dt><dd>
- <hr/><p>The <dfn id="dom-context-2d-clip" title="dom-context-2d-clip"><code>clip()</code></dfn>
- method must create a new <dfn id="clipping-region">clipping region</dfn> by calculating
- the intersection of the current clipping region and the area
- described by the current path, using the non-zero winding number
- rule. Open subpaths must be implicitly closed when computing the
- clipping region, without affecting the actual subpaths. The new
- clipping region replaces the current clipping region.</p>
+ <p>Paints the box that outlines the given rectangle onto the bitmap, using the current stroke
+ style.</p>
- <p>When the context is initialized, the clipping region must be set
- to the rectangle with the top left corner at (0,0) and the width and
- height of the coordinate space.</p>
-
- <!-- v6
- Jordan OSETE suggests:
- * support ways of extending the clipping region (union instead of intersection)
- - also "add", "subtract", "replace", "intersect" and "xor"
- * support ways of resetting the clipping region without save/restore
- -->
-
- <hr/><p>The <dfn id="dom-context-2d-ispointinpath" title="dom-context-2d-isPointInPath"><code>isPointInPath(<var title="">x</var>, <var title="">y</var>)</code></dfn> method must
- return true if the point given by the <var title="">x</var> and <var title="">y</var> coordinates passed to the method, when treated as
- coordinates in the canvas coordinate space unaffected by the current
- transformation, is inside the current path as determined by the
- non-zero winding number rule; and must return false
- otherwise. Points on the path itself are considered to be inside the
- path. If either of the arguments is infinite or NaN, then the method
- must return false.</p>
+ </dd></dl>
- </div>
+
+ <p>The <dfn id="dom-context-2d-clearrect-2"><code>clearRect(<var>x</var>, <var>y</var>,
+ <var>w</var>, <var>h</var>)</code></dfn> method, when invoked, must run these steps:</p>
- <div class="example" id="drawCustomFocusRingExample">
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Let <var>pixels</var> be the set of pixels in the specified rectangle that also
+ intersect the current <a href="#clipping-region" id="drawing-rectangles-to-the-bitmap:clipping-region-2">clipping region</a>.</p></li><li><p>Clear the pixels in <var>pixels</var> to a fully transparent black, erasing any
+ previous image.</p></li></ol>
- <p>This <code><a href="#the-canvas-element">canvas</a></code> element has a couple of checkboxes. The
- path-related commands are highlighted:</p>
+ <p class="note">If either height or width are zero, this method has no effect, since the set of
+ pixels would be empty.</p>
- <pre>&lt;canvas height=400 width=750&gt;
- &lt;label&gt;&lt;input type=checkbox id=showA&gt; Show As&lt;/label&gt;
- &lt;label&gt;&lt;input type=checkbox id=showB&gt; Show Bs&lt;/label&gt;
- &lt;!-- ... --&gt;
-&lt;/canvas&gt;
-&lt;script&gt;
- function drawCheckbox(context, element, x, y, paint) {
- context.save();
- context.font = '10px sans-serif';
- context.textAlign = 'left';
- context.textBaseline = 'middle';
- var metrics = context.measureText(element.labels[0].textContent);
- if (paint) {
-<strong> context.beginPath();
- context.strokeStyle = 'black';
- context.rect(x-5, y-5, 10, 10);
- context.stroke();
-</strong> if (element.checked) {
-<strong> context.fillStyle = 'black';
- context.fill();
-</strong> }
- context.fillText(element.labels[0].textContent, x+5, y);
- }
-<strong> context.beginPath();
- context.rect(x-7, y-7, 12 + metrics.width+2, 14);
- if (paint &amp;&amp; context.drawCustomFocusRing(element)) {
- context.strokeStyle = 'silver';
- context.stroke();
- }
-</strong> context.restore();
- }
- function drawBase() { /* ... */ }
- function drawAs() { /* ... */ }
- function drawBs() { /* ... */ }
- function redraw() {
- var canvas = document.getElementsByTagName('canvas')[0];
- var context = canvas.getContext('2d');
- context.clearRect(0, 0, canvas.width, canvas.height);
- drawCheckbox(context, document.getElementById('showA'), 20, 40, true);
- drawCheckbox(context, document.getElementById('showB'), 20, 60, true);
- drawBase();
- if (document.getElementById('showA').checked)
- drawAs();
- if (document.getElementById('showB').checked)
- drawBs();
- }
- function processClick(event) {
- var canvas = document.getElementsByTagName('canvas')[0];
- var context = canvas.getContext('2d');
- var x = event.clientX;
- var y = event.clientY;
- while (node) {
- x -= node.offsetLeft - node.scrollLeft;
- y -= node.offsetTop - node.scrollTop;
- node = node.offsetParent;
- }
- drawCheckbox(context, document.getElementById('showA'), 20, 40, false);
- if (<strong>context.isPointInPath(x, y)</strong>)
- document.getElementById('showA').checked = !(document.getElementById('showA').checked);
- drawCheckbox(context, document.getElementById('showB'), 20, 60, false);
- if (<strong>context.isPointInPath(x, y)</strong>)
- document.getElementById('showB').checked = !(document.getElementById('showB').checked);
- redraw();
- }
- document.getElementsByTagName('canvas')[0].addEventListener('focus', redraw, true);
- document.getElementsByTagName('canvas')[0].addEventListener('blur', redraw, true);
- document.getElementsByTagName('canvas')[0].addEventListener('change', redraw, true);
- document.getElementsByTagName('canvas')[0].addEventListener('click', processClick, false);
- redraw();
-&lt;/script&gt;</pre>
-<!-- http://software.hixie.ch/utilities/js/live-dom-viewer/saved/340 -->
+ <p>The <dfn id="dom-context-2d-fillrect-2"><code>fillRect(<var>x</var>, <var>y</var>,
+ <var>w</var>, <var>h</var>)</code></dfn> method, when invoked, must must run these steps:</p>
- </div>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>If either <var>w</var> or <var>h</var> are zero, then abort these steps.</p></li><li><p>Paint the specified rectangular area using the <code id="drawing-rectangles-to-the-bitmap:dom-context-2d-fillstyle-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code>.</p>
+ </li></ol>
+ <p>The <dfn id="dom-context-2d-strokerect-2"><code>strokeRect(<var>x</var>, <var>y</var>,
+ <var>w</var>, <var>h</var>)</code></dfn> method, when invoked, must run these steps:</p>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Take the result of <a href="#trace-a-path" id="drawing-rectangles-to-the-bitmap:trace-a-path">tracing the path</a> described below,
+ using the <code id="drawing-rectangles-to-the-bitmap:canvaspathdrawingstyles"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface's line styles, and fill it with the
+ <code id="drawing-rectangles-to-the-bitmap:dom-context-2d-strokestyle-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code>.</p></li></ol>
+ <p>If both <var>w</var> and <var>h</var> are zero, the path has a single subpath
+ with just one point (<var>x</var>, <var>y</var>), and no lines, and this method
+ thus has no effect (the <a href="#trace-a-path" id="drawing-rectangles-to-the-bitmap:trace-a-path-2">trace a path</a> algorithm returns an empty path in that
+ case).</p>
- <h6 id="text-0"><span class="secno">4.8.11.1.9 </span>Text</h6> <!-- a v3 feature -->
+ <p>If just one of either <var>w</var> or <var>h</var> is zero, then the path has
+ a single subpath consisting of two points, with coordinates (<var>x</var>, <var>y</var>) and (<var>x</var>+<var>w</var>, <var>y</var>+<var>h</var>), in that order, connected by a single straight line.</p>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code> [ = <var title="">value</var> ]</dt>
+ <p>Otherwise, the path has a single subpath consisting of four points, with coordinates (<span><var>x</var></span>, <var>y</var>), (<span><var>x</var>+<var>w</var></span>, <var>y</var>), (<var>x</var>+<var>w</var>,
+ <var>y</var>+<var>h</var>), and (<var>x</var>, <var>y</var>+<var>h</var>),
+ connected to each other in that order by straight lines.</p>
- <dd>
+
- <p>Returns the current font settings.</p>
- <p>Can be set, to change the font. The syntax is the same as for
- the CSS 'font' property; values that cannot be parsed as CSS font
- values are ignored.</p>
- <p>Relative keywords and lengths are computed relative to the font
- of the <code><a href="#the-canvas-element">canvas</a></code> element.</p>
+ <h6 id="drawing-text-to-the-bitmap"><span class="secno">4.12.5.1.11</span> Drawing text to the bitmap<a class="self-link" href="#drawing-text-to-the-bitmap"/></h6><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="support"><strong>Support:</strong> canvas-text<span class="and_chr yes"><span>Chrome for Android</span> <span>59+</span></span><span class="chrome yes"><span>Chrome</span> <span>4+</span></span><span class="and_uc yes"><span>UC Browser for Android</span> <span>11.4+</span></span><span class="ios_saf yes"><span>iOS Safari</span> <span>3.2+</span></span><span class="firefox yes"><span>Firefox</span> <span>3.5+</span></span><span class="ie yes"><span>IE</span> <span>9+</span></span><span class="samsung yes"><span>Samsung Internet</span> <span>4+</span></span><span class="op_mini no"><span>Opera Mini</span> <span>None</span></span><span class="safari yes"><span>Safari</span> <span>4+</span></span><span class="android yes"><span>Android Browser</span> <span>2.1+</span></span><span class="opera yes"><span>Opera</span> <span>10.5+</span></span><span class="edge yes"><span>Edge</span> <span>12+</span></span></p><p class="caniuse">Source: <a href="https://caniuse.com/#feat=canvas-text">caniuse.com</a></p></div>
- </dd>
+ <dl class="domintro" id="text-0"><dt><var>context</var> . <code id="dom-context-2d-filltext"><a href="#dom-context-2d-filltext-2">fillText</a></code>(<var>text</var>, <var>x</var>, <var>y</var> [, <var>maxWidth</var> ] )</dt><dt><var>context</var> . <code id="dom-context-2d-stroketext"><a href="#dom-context-2d-stroketext-2">strokeText</a></code>(<var>text</var>, <var>x</var>, <var>y</var> [, <var>maxWidth</var> ] )</dt><dd>
- <dt><var title="">context</var> . <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> [ = <var title="">value</var> ]</dt>
+ <p>Fills or strokes (respectively) the given text at the given position. If a maximum width is
+ provided, the text will be scaled to fit that width if necessary.</p>
- <dd>
+ </dd><dt><var>metrics</var> = <var>context</var> . <code id="dom-context-2d-measuretext"><a href="#dom-context-2d-measuretext-2">measureText</a></code>(<var>text</var>)</dt><dd>
- <p>Returns the current text alignment settings.</p>
+ <p>Returns a <code id="drawing-text-to-the-bitmap:textmetrics"><a href="#textmetrics">TextMetrics</a></code> object with the metrics of the given text in the current
+ font.</p>
- <p>Can be set, to change the alignment. The possible values are
- <code title="">start</code>, <code title="">end</code>, <code title="">left</code>, <code title="">right</code>, and <code title="">center</code>. Other values are ignored. The default is
- <code title="">start</code>.</p>
+ </dd><dt><var>metrics</var> . <code id="dom-textmetrics-width"><a href="#dom-textmetrics-width-2">width</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-actualboundingboxleft"><a href="#dom-textmetrics-actualboundingboxleft-2">actualBoundingBoxLeft</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-actualboundingboxright"><a href="#dom-textmetrics-actualboundingboxright-2">actualBoundingBoxRight</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-fontboundingboxascent"><a href="#dom-textmetrics-fontboundingboxascent-2">fontBoundingBoxAscent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-fontboundingboxdescent"><a href="#dom-textmetrics-fontboundingboxdescent-2">fontBoundingBoxDescent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-actualboundingboxascent"><a href="#dom-textmetrics-actualboundingboxascent-2">actualBoundingBoxAscent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-actualboundingboxdescent"><a href="#dom-textmetrics-actualboundingboxdescent-2">actualBoundingBoxDescent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-emheightascent"><a href="#dom-textmetrics-emheightascent-2">emHeightAscent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-emheightdescent"><a href="#dom-textmetrics-emheightdescent-2">emHeightDescent</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-hangingbaseline"><a href="#dom-textmetrics-hangingbaseline-2">hangingBaseline</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-alphabeticbaseline"><a href="#dom-textmetrics-alphabeticbaseline-2">alphabeticBaseline</a></code></dt><dt><var>metrics</var> . <code id="dom-textmetrics-ideographicbaseline"><a href="#dom-textmetrics-ideographicbaseline-2">ideographicBaseline</a></code></dt><dd>
- </dd>
+ <p>Returns the measurement described below.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> [ = <var title="">value</var> ]</dt>
+ </dd></dl>
- <dd>
+
- <p>Returns the current baseline alignment settings.</p>
+ <p>Objects that implement the <code id="drawing-text-to-the-bitmap:canvastext"><a href="#canvastext">CanvasText</a></code> interface provide the following methods for
+ rendering text.</p>
- <p>Can be set, to change the baseline alignment. The possible
- values and their meanings are given below. Other values are
- ignored. The default is <code title="">alphabetic</code>.</p>
+ <p>The <dfn id="dom-context-2d-filltext-2"><code>fillText()</code></dfn> and <dfn id="dom-context-2d-stroketext-2"><code>strokeText()</code></dfn> methods take three or four arguments,
+ <var>text</var>, <var>x</var>, <var>y</var>, and optionally <var>maxWidth</var>, and render the
+ given <var>text</var> at the given (<var>x</var>, <var>y</var>) coordinates ensuring that the text
+ isn't wider than <var>maxWidth</var> if specified, using the current <code id="drawing-text-to-the-bitmap:dom-context-2d-font-2"><a href="#dom-context-2d-font-2">font</a></code>, <code id="drawing-text-to-the-bitmap:dom-context-2d-textalign-2"><a href="#dom-context-2d-textalign-2">textAlign</a></code>, and <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> values. Specifically, when the methods
+ are invoked, the user agent must run these steps:</p>
- </dd>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p>Run the <a href="#text-preparation-algorithm" id="drawing-text-to-the-bitmap:text-preparation-algorithm">text preparation algorithm</a>, passing it <var>text</var>, the object
+ implementing the <code id="drawing-text-to-the-bitmap:canvastext-2"><a href="#canvastext">CanvasText</a></code> interface, and, if the <var>maxWidth</var> argument was
+ provided, that argument. Let <var>glyphs</var> be the result.</p>
- <dt><var title="">context</var> . <code title="dom-context-2d-fillText"><a href="#dom-context-2d-filltext">fillText</a></code>(<var title="">text</var>, <var title="">x</var>, <var title="">y</var> [, <var title="">maxWidth</var> ] )</dt>
- <dt><var title="">context</var> . <code title="dom-context-2d-strokeText"><a href="#dom-context-2d-stroketext">strokeText</a></code>(<var title="">text</var>, <var title="">x</var>, <var title="">y</var> [, <var title="">maxWidth</var> ] )</dt>
+ </li><li><p>Move all the shapes in <var>glyphs</var> to the right by <var>x</var>
+ <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'">CSS pixels</a> and down by <var>y</var> <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-2">CSS
+ pixels</a>.</p></li><li>
- <dd>
+ <p>Paint the shapes given in <var>glyphs</var>, as transformed by the <a href="#transformations" id="drawing-text-to-the-bitmap:transformations">current transformation matrix</a>, with each <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-3">CSS pixel</a> in the coordinate space of <var>glyphs</var> mapped to one
+ coordinate space unit.</p>
- <p>Fills or strokes (respectively) the given text at the given
- position. If a maximum width is provided, the text will be scaled
- to fit that width if necessary.</p>
+ <p>For <code id="drawing-text-to-the-bitmap:dom-context-2d-filltext-2"><a href="#dom-context-2d-filltext-2">fillText()</a></code>, <code id="drawing-text-to-the-bitmap:dom-context-2d-fillstyle-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code> must be applied to the shapes and <code id="drawing-text-to-the-bitmap:dom-context-2d-strokestyle-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code> must be ignored. For <code id="drawing-text-to-the-bitmap:dom-context-2d-stroketext-2"><a href="#dom-context-2d-stroketext-2">strokeText()</a></code>, the reverse holds: <code id="drawing-text-to-the-bitmap:dom-context-2d-strokestyle-2-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code> must be applied to the result of <a href="#trace-a-path" id="drawing-text-to-the-bitmap:trace-a-path">tracing</a> the shapes using the object implementing the
+ <code id="drawing-text-to-the-bitmap:canvastext-3"><a href="#canvastext">CanvasText</a></code> interface for the line styles, and <code id="drawing-text-to-the-bitmap:dom-context-2d-fillstyle-2-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code> must be ignored.</p>
- </dd>
+ <p>These shapes are painted without affecting the current path, and are subject to <a href="#shadows" id="drawing-text-to-the-bitmap:shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha-2" id="drawing-text-to-the-bitmap:dom-context-2d-globalalpha-2">global
+ alpha</a>, the <a href="#clipping-region" id="drawing-text-to-the-bitmap:clipping-region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation-2" id="drawing-text-to-the-bitmap:dom-context-2d-globalcompositeoperation-2">global composition operators</a>.</p>
- <dt><var title="">metrics</var> = <var title="">context</var> . <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText</a></code>(<var title="">text</var>)</dt>
+ </li></ol>
- <dd>
- <p>Returns a <code><a href="#textmetrics">TextMetrics</a></code> object with the metrics of the given text in the current font.</p>
- </dd>
+ <p>The <dfn id="dom-context-2d-measuretext-2"><code>measureText()</code></dfn> method takes one
+ argument, <var>text</var>. When the method is invoked, the user agent must run the
+ <a href="#text-preparation-algorithm" id="drawing-text-to-the-bitmap:text-preparation-algorithm-2">text preparation algorithm</a>, passing it <var>text</var> and the object implementing
+ the <code id="drawing-text-to-the-bitmap:canvastext-4"><a href="#canvastext">CanvasText</a></code> interface, and then using the returned <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="drawing-text-to-the-bitmap:inline-box">inline box</a> must
+ create a new <code id="drawing-text-to-the-bitmap:textmetrics-2"><a href="#textmetrics">TextMetrics</a></code> object with its attributes set as described in the following
+ list.
- <dt><var title="">metrics</var> . <code title="dom-textmetrics-width"><a href="#dom-textmetrics-width">width</a></code></dt>
+ If doing these measurements requires using a font that has an <a href="https://html.spec.whatwg.org/multipage/origin.html#concept-origin" id="drawing-text-to-the-bitmap:concept-origin">origin</a> that is not the
+ <a href="https://html.spec.whatwg.org/multipage/origin.html#same-origin" id="drawing-text-to-the-bitmap:same-origin">same</a> as that of the <code id="drawing-text-to-the-bitmap:document"><a href="https://html.spec.whatwg.org/multipage/dom.html#document">Document</a></code> object that owns the
+ <code id="drawing-text-to-the-bitmap:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element (even if &quot;using a font&quot; means just checking if that font has a
+ particular glyph in it before falling back to another font), then the method, when invoked, must
+ throw a <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="drawing-text-to-the-bitmap:securityerror">&quot;<code>SecurityError</code>&quot;</a> <code id="drawing-text-to-the-bitmap:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
- <dd>
+ Otherwise, it must return the new <code id="drawing-text-to-the-bitmap:textmetrics-3"><a href="#textmetrics">TextMetrics</a></code> object.
+ <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSS">[CSS]</a>
+ <a class="fingerprint" href="https://html.spec.whatwg.org/multipage/introduction.html#fingerprinting-vector" id="drawing-text-to-the-bitmap:fingerprinting-vector" title="There is a potential fingerprinting vector here."><img alt="(This is a fingerprinting vector.)" height="64" src="https://html.spec.whatwg.org/images/fingerprint.png" width="46"/></a>
+ </p>
- <p>Returns the advance width of the text that was passed to the
- <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText()</a></code>
- method.</p>
+
- </dd>
+ <dl><dt><dfn id="dom-textmetrics-width-2"><code>width</code></dfn> attribute</dt><dd><p>The width of that <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="drawing-text-to-the-bitmap:inline-box-2">inline box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-4">CSS pixels</a>. (The
+ text's advance width.)</p></dd><dt><dfn id="dom-textmetrics-actualboundingboxleft-2"><code>actualBoundingBoxLeft</code></dfn> attribute</dt><dd>
- </dl><div class="impl">
+ <p>The distance parallel to the baseline from the alignment point given by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textalign-2-2"><a href="#dom-context-2d-textalign-2">textAlign</a></code> attribute to the left side of the bounding
+ rectangle of the given text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-5">CSS pixels</a>; positive numbers
+ indicating a distance going left from the given alignment point.
- <p>The <dfn id="dom-context-2d-font" title="dom-context-2d-font"><code>font</code></dfn> IDL
- attribute, on setting, must be parsed the same way as the 'font'
- property of CSS (but without supporting property-independent style
- sheet syntax like 'inherit'), and the resulting font must be
- assigned to the context, with the 'line-height' component forced to
- 'normal', with the 'font-size' component converted to CSS pixels,
- and with system fonts being computed to explicit values. If the new
- value is syntactically incorrect (including using
- property-independent style sheet syntax like 'inherit' or
- 'initial'), then it must be ignored, without assigning a new font
- value. <a href="#refsCSS">[CSS]</a></p>
+ </p><p class="note">The sum of this value and the next (<code id="drawing-text-to-the-bitmap:dom-textmetrics-actualboundingboxright-2"><a href="#dom-textmetrics-actualboundingboxright-2">actualBoundingBoxRight</a></code>) can be wider than
+ the width of the <a data-x-internal="inline-box" href="https://drafts.csswg.org/css2/visuren.html#inline-box" id="drawing-text-to-the-bitmap:inline-box-3">inline box</a> (<code id="drawing-text-to-the-bitmap:dom-textmetrics-width-2"><a href="#dom-textmetrics-width-2">width</a></code>), in
+ particular with slanted fonts where characters overhang their advance width.</p>
- <p>Font names must be interpreted in the context of the
- <code><a href="#the-canvas-element">canvas</a></code> element's stylesheets; any fonts embedded using
- <code title="">@font-face</code> must therefore be available once
- they are loaded. (If a font is referenced before it is fully loaded,
- then it must be treated as if it was an unknown font, falling back
- to another as described by the relevant CSS specifications.) <a href="#refsCSSFONTS">[CSSFONTS]</a></p>
+ </dd><dt><dfn id="dom-textmetrics-actualboundingboxright-2"><code>actualBoundingBoxRight</code></dfn> attribute</dt><dd>
- <p>Only vector fonts should be used by the user agent; if a user
- agent were to use bitmap fonts then transformations would likely
- make the font look very ugly.</p>
+ <p>The distance parallel to the baseline from the alignment point given by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textalign-2-3"><a href="#dom-context-2d-textalign-2">textAlign</a></code> attribute to the right side of the bounding
+ rectangle of the given text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-6">CSS pixels</a>; positive numbers
+ indicating a distance going right from the given alignment point.</p>
- <p>On getting, the <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code>
- attribute must return the <span title="serializing a CSS
- value">serialized form</span> of the current font of the context
- (with no 'line-height' component). <a href="#refsCSSOM">[CSSOM]</a></p>
+ </dd><dt><dfn id="dom-textmetrics-fontboundingboxascent-2"><code>fontBoundingBoxAscent</code></dfn> attribute</dt><dd>
- <div class="example">
+ <p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-2"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the top of the highest
+ bounding rectangle of all the fonts used to render the text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-7">CSS
+ pixels</a>; positive numbers indicating a distance going up from the given baseline.</p>
- <p>For example, after the following statement:</p>
+ <p class="note">This value and the next are useful when rendering a background that have to have
+ a consistent height even if the exact text being rendered changes. The <code id="drawing-text-to-the-bitmap:dom-textmetrics-actualboundingboxascent-2"><a href="#dom-textmetrics-actualboundingboxascent-2">actualBoundingBoxAscent</a></code> attribute (and
+ its corresponding attribute for the descent) are useful when drawing a bounding box around
+ specific text.</p>
- <pre>context.font = 'italic 400 12px/2 Unknown Font, sans-serif';</pre>
+ </dd><dt><dfn id="dom-textmetrics-fontboundingboxdescent-2"><code>fontBoundingBoxDescent</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-3"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the bottom of the lowest
+ bounding rectangle of all the fonts used to render the text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-8">CSS
+ pixels</a>; positive numbers indicating a distance going down from the given
+ baseline.</p></dd><dt><dfn id="dom-textmetrics-actualboundingboxascent-2"><code>actualBoundingBoxAscent</code></dfn> attribute</dt><dd>
- <p>...the expression <code title="">context.font</code> would
- evaluate to the string &quot;<code title="">italic 12px &quot;Unknown Font&quot;, sans-serif</code>&quot;. The
- &quot;400&quot; font-weight doesn't appear because that is the default
- value. The line-height doesn't appear because it is forced to
- &quot;normal&quot;, the default value.</p>
+ <p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-4"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the top of the bounding
+ rectangle of the given text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-9">CSS pixels</a>; positive numbers
+ indicating a distance going up from the given baseline.
- </div>
+ </p><p class="note">This number can vary greatly based on the input text, even if the first font
+ specified covers all the characters in the input. For example, the <code id="drawing-text-to-the-bitmap:dom-textmetrics-actualboundingboxascent-2-2"><a href="#dom-textmetrics-actualboundingboxascent-2">actualBoundingBoxAscent</a></code> of a lowercase
+ &quot;o&quot; from an alphabetic baseline would be less than that of an uppercase &quot;F&quot;. The value can
+ easily be negative; for example, the distance from the top of the em box (<code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-5"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> value &quot;<code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-top"><a href="#dom-context-2d-textbaseline-top">top</a></code>&quot;) to the top of the bounding rectangle when
+ the given text is just a single comma &quot;<code>,</code>&quot; would likely (unless the font is
+ quite unusual) be negative.</p>
- <p>When the context is created, the font of the context must be set
- to 10px sans-serif. When the 'font-size' component is set to lengths
- using percentages, 'em' or 'ex' units, or the 'larger' or 'smaller'
- keywords, these must be interpreted relative to the computed value
- of the 'font-size' property of the corresponding <code><a href="#the-canvas-element">canvas</a></code>
- element at the time that the attribute is set. When the
- 'font-weight' component is set to the relative values 'bolder' and
- 'lighter', these must be interpreted relative to the computed value
- of the 'font-weight' property of the corresponding
- <code><a href="#the-canvas-element">canvas</a></code> element at the time that the attribute is
- set. If the computed values are undefined for a particular case
- (e.g. because the <code><a href="#the-canvas-element">canvas</a></code> element is not <a href="#in-a-document">in a
- <code>Document</code></a>), then the relative keywords must be
- interpreted relative to the normal-weight 10px sans-serif
- default.</p>
-
- <p>The <dfn id="dom-context-2d-textalign" title="dom-context-2d-textAlign"><code>textAlign</code></dfn> IDL
- attribute, on getting, must return the current value. On setting, if
- the value is one of <code title="">start</code>, <code title="">end</code>, <code title="">left</code>, <code title="">right</code>, or <code title="">center</code>, then the
- value must be changed to the new value. Otherwise, the new value
- must be ignored. When the context is created, the <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> attribute must
- initially have the value <code title="">start</code>.</p>
-
- <p>The <dfn id="dom-context-2d-textbaseline" title="dom-context-2d-textBaseline"><code>textBaseline</code></dfn>
- IDL attribute, on getting, must return the current value. On
- setting, if the value is one of <code title="dom-context-2d-textBaseline-top"><a href="#dom-context-2d-textbaseline-top">top</a></code>, <code title="dom-context-2d-textBaseline-hanging"><a href="#dom-context-2d-textbaseline-hanging">hanging</a></code>, <code title="dom-context-2d-textBaseline-middle"><a href="#dom-context-2d-textbaseline-middle">middle</a></code>, <code title="dom-context-2d-textBaseline-alphabetic"><a href="#dom-context-2d-textbaseline-alphabetic">alphabetic</a></code>,
- <code title="dom-context-2d-textBaseline-ideographic"><a href="#dom-context-2d-textbaseline-ideographic">ideographic</a></code>,
- or <code title="dom-context-2d-textBaseline-bottom"><a href="#dom-context-2d-textbaseline-bottom">bottom</a></code>,
- then the value must be changed to the new value. Otherwise, the new
- value must be ignored. When the context is created, the <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> attribute
- must initially have the value <code title="">alphabetic</code>.</p>
+ </dd><dt><dfn id="dom-textmetrics-actualboundingboxdescent-2"><code>actualBoundingBoxDescent</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-6"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the bottom of the bounding
+ rectangle of the given text, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-10">CSS pixels</a>; positive numbers
+ indicating a distance going down from the given baseline.</p></dd><dt><dfn id="dom-textmetrics-emheightascent-2"><code>emHeightAscent</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-7"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the highest top of the em
+ squares in the <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="drawing-text-to-the-bitmap:line-box">line box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-11">CSS pixels</a>; positive numbers
+ indicating that the given baseline is below the top of that em square (so this value will usually
+ be positive). Zero if the given baseline is the top of that em square; half the font size if the
+ given baseline is the middle of that em square.</p></dd><dt><dfn id="dom-textmetrics-emheightdescent-2"><code>emHeightDescent</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-8"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the lowest bottom of the em
+ squares in the <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="drawing-text-to-the-bitmap:line-box-2">line box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-12">CSS pixels</a>; positive numbers
+ indicating that the given baseline is below the bottom of that em square (so this value will
+ usually be negative). (Zero if the given baseline is the bottom of that em square.)</p></dd><dt><dfn id="dom-textmetrics-hangingbaseline-2"><code>hangingBaseline</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-9"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the hanging baseline of the
+ <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="drawing-text-to-the-bitmap:line-box-3">line box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-13">CSS pixels</a>; positive numbers indicating that
+ the given baseline is below the hanging baseline. (Zero if the given baseline is the hanging
+ baseline.)</p></dd><dt><dfn id="dom-textmetrics-alphabeticbaseline-2"><code>alphabeticBaseline</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-10"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the alphabetic baseline of
+ the <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="drawing-text-to-the-bitmap:line-box-4">line box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-14">CSS pixels</a>; positive numbers indicating
+ that the given baseline is below the alphabetic baseline. (Zero if the given baseline is the
+ alphabetic baseline.)</p></dd><dt><dfn id="dom-textmetrics-ideographicbaseline-2"><code>ideographicBaseline</code></dfn> attribute</dt><dd><p>The distance from the horizontal line indicated by the <code id="drawing-text-to-the-bitmap:dom-context-2d-textbaseline-2-11"><a href="#dom-context-2d-textbaseline-2">textBaseline</a></code> attribute to the ideographic baseline of
+ the <a data-x-internal="line-box" href="https://drafts.csswg.org/css2/visuren.html#line-box" id="drawing-text-to-the-bitmap:line-box-5">line box</a>, in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-text-to-the-bitmap:'px'-15">CSS pixels</a>; positive numbers indicating
+ that the given baseline is below the ideographic baseline. (Zero if the given baseline is the
+ ideographic baseline.)</p></dd></dl>
- </div>
+ <p class="note">Glyphs rendered using <code id="drawing-text-to-the-bitmap:dom-context-2d-filltext-2-2"><a href="#dom-context-2d-filltext-2">fillText()</a></code> and
+ <code id="drawing-text-to-the-bitmap:dom-context-2d-stroketext-2-2"><a href="#dom-context-2d-stroketext-2">strokeText()</a></code> can spill out of the box given by the
+ font size (the em square size) and the width returned by <code id="drawing-text-to-the-bitmap:dom-context-2d-measuretext-2"><a href="#dom-context-2d-measuretext-2">measureText()</a></code> (the text width). Authors are encouraged
+ to use the bounding box values described above if this is an issue.</p>
- <p>The <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code>
- attribute's allowed keywords correspond to alignment points in the
- font:</p>
+ <p class="note">A future version of the 2D context API might provide a way to render fragments of
+ documents, rendered using CSS, straight to the canvas. This would be provided in preference to a
+ dedicated way of doing multiline layout.</p>
- <p><img alt="The top of the em square is roughly at the top of the glyphs in a font, the hanging baseline is where some glyphs like आ are anchored, the middle is half-way between the top of the em square and the bottom of the em square, the alphabetic baseline is where characters like Á, ÿ, f, and Ω are anchored, the ideographic baseline is where glyphs like 私 and 達 are anchored, and the bottom of the em square is roughly at the bottom of the glyphs in a font. The top and bottom of the bounding box can be far from these baselines, due to glyphs extending far outside the em square." height="300" src="http://www.whatwg.org/specs/web-apps/current-work/http://images.whatwg.org/baselines.png" width="738"/></p>
- <p>The keywords map to these alignment points as follows:</p>
- <dl><dt><dfn id="dom-context-2d-textbaseline-top" title="dom-context-2d-textBaseline-top"><code>top</code></dfn>
- </dt><dd>The top of the em square</dd>
+ <h6 id="drawing-paths-to-the-canvas"><span class="secno">4.12.5.1.12</span> Drawing paths to the canvas<a class="self-link" href="#drawing-paths-to-the-canvas"/></h6>
- <dt><dfn id="dom-context-2d-textbaseline-hanging" title="dom-context-2d-textBaseline-hanging"><code>hanging</code></dfn>
- </dt><dd>The hanging baseline</dd>
+ <p>Objects that implement the <code id="drawing-paths-to-the-canvas:canvasdrawpath"><a href="#canvasdrawpath">CanvasDrawPath</a></code> interface have a <dfn id="current-default-path">current default
+ path</dfn>. There is only one <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path">current default path</a>, it is not part of the
+ <a href="#drawing-state" id="drawing-paths-to-the-canvas:drawing-state">drawing state</a>. The <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-2">current default path</a> is a <a href="#concept-path" id="drawing-paths-to-the-canvas:concept-path">path</a>, as described above.</p>
- <dt><dfn id="dom-context-2d-textbaseline-middle" title="dom-context-2d-textBaseline-middle"><code>middle</code></dfn>
- </dt><dd>The middle of the em square</dd>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-beginpath"><a href="#dom-context-2d-beginpath-2">beginPath</a></code>()</dt><dd>
- <dt><dfn id="dom-context-2d-textbaseline-alphabetic" title="dom-context-2d-textBaseline-alphabetic"><code>alphabetic</code></dfn>
- </dt><dd>The alphabetic baseline</dd>
+ <p>Resets the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-3">current default path</a>.</p>
- <dt><dfn id="dom-context-2d-textbaseline-ideographic" title="dom-context-2d-textBaseline-ideographic"><code>ideographic</code></dfn>
- </dt><dd>The ideographic baseline</dd>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-fill"><a href="#dom-context-2d-fill-2">fill</a></code>( [ <var>fillRule</var> ] )</dt><dt><var>context</var> . <code id="drawing-paths-to-the-canvas:dom-context-2d-fill-2"><a href="#dom-context-2d-fill-2">fill</a></code>(<var>path</var> [, <var>fillRule</var> ] )</dt><dd>
- <dt><dfn id="dom-context-2d-textbaseline-bottom" title="dom-context-2d-textBaseline-bottom"><code>bottom</code></dfn>
- </dt><dd>The bottom of the em square</dd>
+ <p>Fills the subpaths of the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-4">current default path</a> or the given path with the
+ current fill style, obeying the given fill rule.</p>
- </dl><div class="impl">
+ </dd><dt><var>context</var> . <code id="dom-context-2d-stroke"><a href="#dom-context-2d-stroke-2">stroke</a></code>()</dt><dt><var>context</var> . <code id="drawing-paths-to-the-canvas:dom-context-2d-stroke-2"><a href="#dom-context-2d-stroke-2">stroke</a></code>(<var>path</var>)</dt><dd>
- <p>The <dfn id="dom-context-2d-filltext" title="dom-context-2d-fillText"><code>fillText()</code></dfn> and
- <dfn id="dom-context-2d-stroketext" title="dom-context-2d-strokeText"><code>strokeText()</code></dfn>
- methods take three or four arguments, <var title="">text</var>, <var title="">x</var>, <var title="">y</var>, and optionally <var title="">maxWidth</var>, and render the given <var title="">text</var> at the given (<var title="">x</var>, <var title="">y</var>) coordinates ensuring that the text isn't wider
- than <var title="">maxWidth</var> if specified, using the current
- <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code>, <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code>, and <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code>
- values. Specifically, when the methods are called, the user agent
- must run the following steps:</p>
+ <p>Strokes the subpaths of the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-5">current default path</a> or the given path with the
+ current stroke style.</p>
- <ol><li><p>If <var title="">maxWidth</var> is present but less than or
- equal to zero, return without doing anything; abort these
- steps.</p></li>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-clip"><a href="#dom-context-2d-clip-2">clip</a></code>( [ <var>fillRule</var> ] )</dt><dt><var>context</var> . <code id="drawing-paths-to-the-canvas:dom-context-2d-clip-2"><a href="#dom-context-2d-clip-2">clip</a></code>(<var>path</var> [, <var>fillRule</var> ] )</dt><dd>
- <li><p>Let <var title="">font</var> be the current font of the
- context, as given by the <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code> attribute.</p></li>
+ <p>Further constrains the clipping region to the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-6">current default path</a> or the given
+ path, using the given fill rule to determine what points are in the path.</p>
- <li><p>Replace all the <a href="#space-character" title="space character">space
- characters</a> in <var title="">text</var> with U+0020 SPACE
- characters.</p></li>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-resetclip"><a href="#dom-context-2d-resetclip-2">resetClip</a></code>()</dt><dd>
- <li><p>Form a hypothetical infinitely wide CSS line box containing
- a single inline box containing the text <var title="">text</var>,
- with all the properties at their initial values except the 'font'
- property of the inline box set to <var title="">font</var>, the
- 'direction' property of the inline box set to <a href="#the-directionality">the
- directionality</a> of the <code><a href="#the-canvas-element">canvas</a></code> element, and the
- 'white-space' property set to 'pre'. <a href="#refsCSS">[CSS]</a></p></li>
+ <p>Unconstrains the clipping region.</p>
- <!-- if you insert a step here, make sure to adjust the next step's
- final words -->
+ </dd><dt><var>context</var> . <code id="dom-context-2d-ispointinpath"><a href="#dom-context-2d-ispointinpath-2">isPointInPath</a></code>(<var>x</var>, <var>y</var> [, <var>fillRule</var> ] )</dt><dt><var>context</var> . <code id="drawing-paths-to-the-canvas:dom-context-2d-ispointinpath-2"><a href="#dom-context-2d-ispointinpath-2">isPointInPath</a></code>(<var>path</var>, <var>x</var>, <var>y</var> [, <var>fillRule</var> ] )</dt><dd>
- <li><p>If the <var title="">maxWidth</var> argument was specified
- and the hypothetical width of the inline box in the hypothetical
- line box is greater than <var title="">maxWidth</var> CSS pixels,
- then change <var title="">font</var> to have a more condensed font
- (if one is available or if a reasonably readable one can be
- synthesized by applying a horizontal scale factor to the font) or a
- smaller font, and return to the previous step.</p></li>
+ <p>Returns true if the given point is in the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-7">current default path</a> or the given
+ path, using the given fill rule to determine what points are in the path.</p>
- <li>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-ispointinstroke"><a href="#dom-context-2d-ispointinstroke-2">isPointInStroke</a></code>(<var>x</var>, <var>y</var>)</dt><dt><var>context</var> . <code id="drawing-paths-to-the-canvas:dom-context-2d-ispointinstroke-2"><a href="#dom-context-2d-ispointinstroke-2">isPointInStroke</a></code>(<var>path</var>, <var>x</var>, <var>y</var>)</dt><dd>
- <p>Let the <var title="">anchor point</var> be a point on the
- inline box, determined by the <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> and <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> values, as
- follows:</p>
+ <p>Returns true if the given point would be in the region covered by the stroke of the
+ <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-8">current default path</a> or the given path, given the current stroke style.</p>
- <p>Horizontal position:</p>
+ </dd></dl><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="bugs"><strong>Spec bugs:</strong> <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=28217" title="&lt;canvas&gt;: not clear if two polygon paths with a common edge should have no line visible">28217</a></p></div>
- <dl><dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">left</code></dt>
- <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">start</code> and <a href="#the-directionality">the directionality</a> of the
- <code><a href="#the-canvas-element">canvas</a></code> element is 'ltr'</dt>
- <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">end</code> and <a href="#the-directionality">the directionality</a> of the
- <code><a href="#the-canvas-element">canvas</a></code> element is 'rtl'</dt>
+
- <dd>Let the <var title="">anchor point</var>'s horizontal
- position be the left edge of the inline box.</dd>
+ <p>The <dfn id="dom-context-2d-beginpath-2"><code>beginPath()</code></dfn> method, when invoked,
+ must empty the list of subpaths in the context's <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-9">current default path</a> so that the it
+ once again has zero subpaths.</p>
+ <p>Where the following method definitions use the term <i>intended path</i>, it means the
+ <code id="drawing-paths-to-the-canvas:path2d"><a href="#path2d">Path2D</a></code> argument, if one was provided, or the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-10">current default path</a>
+ otherwise.</p>
- <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">right</code></dt>
- <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">end</code> and <a href="#the-directionality">the directionality</a> of the
- <code><a href="#the-canvas-element">canvas</a></code> element is 'ltr'</dt>
- <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">start</code> and <a href="#the-directionality">the directionality</a> of the
- <code><a href="#the-canvas-element">canvas</a></code> element is 'rtl'</dt>
+ <p>When the intended path is a <code id="drawing-paths-to-the-canvas:path2d-2"><a href="#path2d">Path2D</a></code> object, the coordinates and lines of its
+ subpaths must be transformed according to the <a href="#transformations" id="drawing-paths-to-the-canvas:transformations">
+ current transformation matrix</a> on the object implementing the
+ <code id="drawing-paths-to-the-canvas:canvastransform"><a href="#canvastransform">CanvasTransform</a></code> interface when used by these methods (without affecting the
+ <code id="drawing-paths-to-the-canvas:path2d-3"><a href="#path2d">Path2D</a></code> object itself). When the intended path is the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-11">current default
+ path</a>, it is not affected by the transform. (This is because transformations already affect
+ the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-12">current default path</a> when it is constructed, so applying it when it is painted as
+ well would result in a double transformation.)</p>
- <dd>Let the <var title="">anchor point</var>'s horizontal
- position be the right edge of the inline box.</dd>
+ <p>The <dfn id="dom-context-2d-fill-2"><code>fill()</code></dfn> method, when invoked, must fill
+ all the subpaths of the intended path, using <code id="drawing-paths-to-the-canvas:dom-context-2d-fillstyle-2"><a href="#dom-context-2d-fillstyle-2">fillStyle</a></code>, and using the <a href="#fill-rule" id="drawing-paths-to-the-canvas:fill-rule">fill rule</a> indicated
+ by the <var>fillRule</var> argument. Open subpaths must be implicitly closed when being filled
+ (without affecting the actual subpaths).</p>
+ <p>The <dfn id="dom-context-2d-stroke-2"><code>stroke()</code></dfn> method, when invoked, must
+ <a href="#trace-a-path" id="drawing-paths-to-the-canvas:trace-a-path">trace</a> the intended path, using this
+ <code id="drawing-paths-to-the-canvas:canvaspathdrawingstyles"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> object for the line styles, and then fill the resulting path
+ using the <code id="drawing-paths-to-the-canvas:dom-context-2d-strokestyle-2"><a href="#dom-context-2d-strokestyle-2">strokeStyle</a></code> attribute, using the <a href="#dom-context-2d-fillrule-nonzero" id="drawing-paths-to-the-canvas:dom-context-2d-fillrule-nonzero">non-zero winding rule</a>.</p>
- <dt> If <code title="dom-context-2d-textAlign"><a href="#dom-context-2d-textalign">textAlign</a></code> is <code title="">center</code></dt>
+ <p class="note">As a result of how the algorithm to <a href="#trace-a-path" id="drawing-paths-to-the-canvas:trace-a-path-2">trace a path</a> is defined,
+ overlapping parts of the paths in one stroke operation are treated as if their union was what was
+ painted.</p>
- <dd>Let the <var title="">anchor point</var>'s horizontal
- position be half way between the left and right edges of the
- inline box.</dd>
+ <p class="note">The stroke <em>style</em> is affected by the transformation during painting, even
+ if the intended path is the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-13">current default path</a>.</p>
- </dl><p>Vertical position:</p>
+ <p>Paths, when filled or stroked, must be painted without affecting the <a href="#current-default-path" id="drawing-paths-to-the-canvas:current-default-path-14">current default
+ path</a> or any <code id="drawing-paths-to-the-canvas:path2d-4"><a href="#path2d">Path2D</a></code> objects, and must be subject to <a href="#shadows" id="drawing-paths-to-the-canvas:shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha-2" id="drawing-paths-to-the-canvas:dom-context-2d-globalalpha-2">global
+ alpha</a>, the <a href="#clipping-region" id="drawing-paths-to-the-canvas:clipping-region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation-2" id="drawing-paths-to-the-canvas:dom-context-2d-globalcompositeoperation-2">global composition operators</a>. (The effect
+ of transformations is described above and varies based on which path is being used.)</p>
- <dl><dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-top"><a href="#dom-context-2d-textbaseline-top">top</a></code></dt>
+ <hr/>
- <dd>Let the <var title="">anchor point</var>'s vertical position
- be the top of the em box of the first available font of the
- inline box.</dd>
+ <p>The <dfn id="dom-context-2d-clip-2"><code>clip()</code></dfn> method, when invoked, must
+ create a new <dfn id="clipping-region">clipping region</dfn> by calculating the intersection of the current clipping
+ region and the area described by the intended path, using the <a href="#fill-rule" id="drawing-paths-to-the-canvas:fill-rule-2">fill rule</a> indicated by
+ the <var>fillRule</var> argument. Open subpaths must be implicitly closed when computing the
+ clipping region, without affecting the actual subpaths. The new clipping region replaces the
+ current clipping region.</p>
+ <p>When the context is initialized, the clipping region must be set to the largest infinite
+ surface (i.e. by default, no clipping occurs).</p>
- <dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-hanging"><a href="#dom-context-2d-textbaseline-hanging">hanging</a></code></dt>
+
- <dd>Let the <var title="">anchor point</var>'s vertical position
- be the hanging baseline of the first available font of the inline
- box.</dd>
+ <p>The <dfn id="dom-context-2d-resetclip-2"><code>resetClip()</code></dfn> method, when invoked,
+ must create a new <a href="#clipping-region" id="drawing-paths-to-the-canvas:clipping-region-2">clipping region</a> that is the largest infinite surface. The new
+ clipping region replaces the current clipping region.</p>
+ <hr/>
- <dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-middle"><a href="#dom-context-2d-textbaseline-middle">middle</a></code></dt>
+ <p>The <dfn id="dom-context-2d-ispointinpath-2"><code>isPointInPath()</code></dfn> method, when
+ invoked, must return true if the point given by the <var>x</var> and <var>y</var> coordinates
+ passed to the method, when treated as coordinates in the canvas coordinate space unaffected by the
+ current transformation, is inside the intended path as determined by the <a href="#fill-rule" id="drawing-paths-to-the-canvas:fill-rule-3">fill rule</a>
+ indicated by the <var>fillRule</var> argument; and must return false otherwise. Open subpaths must
+ be implicitly closed when computing the area inside the path, without affecting the actual
+ subpaths. Points on the path itself must be considered to be inside the path. If either of the
+ arguments are infinite or NaN, then the method must return false.</p>
- <dd>Let the <var title="">anchor point</var>'s vertical position
- be half way between the bottom and the top of the em box of the
- first available font of the inline box.</dd>
+ <hr/>
+ <p>The <dfn id="dom-context-2d-ispointinstroke-2"><code>isPointInStroke()</code></dfn> method,
+ when invoked, must return true if the point given by the <var>x</var> and <var>y</var> coordinates
+ passed to the method, when treated as coordinates in the canvas coordinate space unaffected by the
+ current transformation, is inside the path that results from <a href="#trace-a-path" id="drawing-paths-to-the-canvas:trace-a-path-3">tracing</a> the intended path, using the <a href="#dom-context-2d-fillrule-nonzero" id="drawing-paths-to-the-canvas:dom-context-2d-fillrule-nonzero-2">non-zero winding rule</a>, and using the
+ <code id="drawing-paths-to-the-canvas:canvaspathdrawingstyles-2"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code> interface for the line styles; and must return false
+ otherwise. Points on the resulting path must be considered to be inside the path. If either of the
+ arguments are infinite or NaN, then the method must return false.</p>
- <dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-alphabetic"><a href="#dom-context-2d-textbaseline-alphabetic">alphabetic</a></code></dt>
+ <hr/>
- <dd>Let the <var title="">anchor point</var>'s vertical position
- be the alphabetic baseline of the first available font of the inline
- box.</dd>
+
+ <div class="example" id="drawCustomFocusRingExample">
- <dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-ideographic"><a href="#dom-context-2d-textbaseline-ideographic">ideographic</a></code></dt>
+ <p>This <code id="drawing-paths-to-the-canvas:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element has a couple of checkboxes. The path-related commands are
+ highlighted:</p>
- <dd>Let the <var title="">anchor point</var>'s vertical position
- be the ideographic baseline of the first available font of the inline
- box.</dd>
+ <pre>&lt;canvas height=400 width=750&gt;
+ &lt;label&gt;&lt;input type=checkbox id=showA&gt; Show As&lt;/label&gt;
+ &lt;label&gt;&lt;input type=checkbox id=showB&gt; Show Bs&lt;/label&gt;
+ &lt;!-- ... --&gt;
+&lt;/canvas&gt;
+&lt;script&gt;
+ function drawCheckbox(context, element, x, y, paint) {
+ context.save();
+ context.font = '10px sans-serif';
+ context.textAlign = 'left';
+ context.textBaseline = 'middle';
+ var metrics = context.measureText(element.labels[0].textContent);
+ if (paint) {
+<strong> context.beginPath();
+ context.strokeStyle = 'black';
+ context.rect(x-5, y-5, 10, 10);
+ context.stroke();
+</strong> if (element.checked) {
+<strong> context.fillStyle = 'black';
+ context.fill();
+</strong> }
+ context.fillText(element.labels[0].textContent, x+5, y);
+ }
+<strong> context.beginPath();
+ context.rect(x-7, y-7, 12 + metrics.width+2, 14);
+</strong>
+ context.drawFocusIfNeeded(element);
+ context.restore();
+ }
+ function drawBase() { /* ... */ }
+ function drawAs() { /* ... */ }
+ function drawBs() { /* ... */ }
+ function redraw() {
+ var canvas = document.getElementsByTagName('canvas')[0];
+ var context = canvas.getContext('2d');
+ context.clearRect(0, 0, canvas.width, canvas.height);
+ drawCheckbox(context, document.getElementById('showA'), 20, 40, true);
+ drawCheckbox(context, document.getElementById('showB'), 20, 60, true);
+ drawBase();
+ if (document.getElementById('showA').checked)
+ drawAs();
+ if (document.getElementById('showB').checked)
+ drawBs();
+ }
+ function processClick(event) {
+ var canvas = document.getElementsByTagName('canvas')[0];
+ var context = canvas.getContext('2d');
+ var x = event.clientX;
+ var y = event.clientY;
+ var node = event.target;
+ while (node) {
+ x -= node.offsetLeft - node.scrollLeft;
+ y -= node.offsetTop - node.scrollTop;
+ node = node.offsetParent;
+ }
+ drawCheckbox(context, document.getElementById('showA'), 20, 40, false);
+ if (<strong>context.isPointInPath(x, y)</strong>)
+ document.getElementById('showA').checked = !(document.getElementById('showA').checked);
+ drawCheckbox(context, document.getElementById('showB'), 20, 60, false);
+ if (<strong>context.isPointInPath(x, y)</strong>)
+ document.getElementById('showB').checked = !(document.getElementById('showB').checked);
+ redraw();
+ }
+ document.getElementsByTagName('canvas')[0].addEventListener('focus', redraw, true);
+ document.getElementsByTagName('canvas')[0].addEventListener('blur', redraw, true);
+ document.getElementsByTagName('canvas')[0].addEventListener('change', redraw, true);
+ document.getElementsByTagName('canvas')[0].addEventListener('click', processClick, false);
+ redraw();
+&lt;/script&gt;</pre>
- <dt> If <code title="dom-context-2d-textBaseline"><a href="#dom-context-2d-textbaseline">textBaseline</a></code> is <code title="dom-context-2d-textBaseline-bottom"><a href="#dom-context-2d-textbaseline-bottom">bottom</a></code></dt>
+ </div>
- <dd>Let the <var title="">anchor point</var>'s vertical position
- be the bottom of the em box of the first available font of the
- inline box.</dd>
+ <h6 id="drawing-focus-rings-and-scrolling-paths-into-view"><span class="secno">4.12.5.1.13</span> Drawing focus rings and scrolling paths into view<a class="self-link" href="#drawing-focus-rings-and-scrolling-paths-into-view"/></h6>
- </dl></li>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-drawfocusifneeded"><a href="#dom-context-2d-drawfocusifneeded-2">drawFocusIfNeeded</a></code>(<var>element</var>)</dt><dt><var>context</var> . <code id="drawing-focus-rings-and-scrolling-paths-into-view:dom-context-2d-drawfocusifneeded-2"><a href="#dom-context-2d-drawfocusifneeded-2">drawFocusIfNeeded</a></code>(<var>path</var>, <var>element</var>)</dt><dd>
- <li>
+ <p>If the given element is <a href="https://html.spec.whatwg.org/multipage/interaction.html#focused" id="drawing-focus-rings-and-scrolling-paths-into-view:focused">focused</a>, draws a focus ring around the <a href="#current-default-path" id="drawing-focus-rings-and-scrolling-paths-into-view:current-default-path">current
+ default path</a> or the given path, following the platform conventions for focus rings.</p>
- <p>Paint the hypothetical inline box as the shape given by the
- text's glyphs, as transformed by the <a href="#transformations" title="dom-context-2d-transformation">current transformation
- matrix</a>, and anchored and sized so that before applying the
- <a href="#transformations" title="dom-context-2d-transformation">current transformation
- matrix</a>, the <var title="">anchor point</var> is at (<var title="">x</var>, <var title="">y</var>) and each CSS pixel is
- mapped to one coordinate space unit.</p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-scrollpathintoview"><a href="#dom-context-2d-scrollpathintoview-2">scrollPathIntoView</a></code>()</dt><dt><var>context</var> . <code id="drawing-focus-rings-and-scrolling-paths-into-view:dom-context-2d-scrollpathintoview-2"><a href="#dom-context-2d-scrollpathintoview-2">scrollPathIntoView</a></code>(<var>path</var>)</dt><dd>
- <p>For <code title="dom-context-2d-fillText"><a href="#dom-context-2d-filltext">fillText()</a></code>
- <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> must be
- applied to the glyphs and <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> must be
- ignored. For <code title="dom-context-2d-strokeText"><a href="#dom-context-2d-stroketext">strokeText()</a></code> the reverse
- holds and <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> must be
- applied to the glyph outlines and <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> must be
- ignored.</p>
+ <p>Scrolls the <a href="#current-default-path" id="drawing-focus-rings-and-scrolling-paths-into-view:current-default-path-2">current default path</a> or the given path into view. This is especially
+ useful on devices with small screens, where the whole canvas might not be visible at once.</p>
- <p>Text is painted without affecting the current path, and is
- subject to <a href="#shadows" title="shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, the <a href="#clipping-region" title="clipping region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
- operators</a>.</p>
-
- </li>
-
- </ol><!--v6DVT - this is commented out until CSS can get its act together
-enough to actual specify vertical text rendering (how long have we
-been waiting now?)
-
-WHEN EDITING THIS, FIX THE PARTS MARKED "&#x0058;&#x0058;&#x0058;" BELOW
-
- <p>The <dfn
- title="dom-context-2d-fillVerticalText"><code>fillVerticalText()</code></dfn>
- and <dfn
- title="dom-context-2d-strokeVerticalText"><code>strokeVerticalText()</code></dfn>
- methods take three or four arguments, <var title="">text</var>, <var
- title="">x</var>, <var title="">y</var>, and optionally <var
- title="">maxHeight</var>, and render the given <var
- title="">text</var> as vertical text at the given (<var
- title="">x</var>, <var title="">y</var>) coordinates ensuring that
- the text isn't taller than <var title="">maxHeight</var> if
- specified, using the current <code
- title="dom-context-2d-font">font</code> and <code
- title="dom-context-2d-textAlign">textAlign</code>
- values. Specifically, when the methods are called, the user agent
- must run the following steps:</p>
+ </dd></dl>
- <ol>
+
- <li><p>If <var title="">maxHeight</var> is present but less than or
- equal to zero, return without doing anything; abort these
- steps.</p></li>
+ Objects that implement the <code id="drawing-focus-rings-and-scrolling-paths-into-view:canvasuserinterface"><a href="#canvasuserinterface">CanvasUserInterface</a></code> interface provide the following
+ methods to control drawing focus rings and scrolling paths into view.
- <li><p>Let <var title="">font</var> be the current font of the
- context, as given by the <code
- title="dom-context-2d-font">font</code> attribute.</p></li>
+ <hr/>
- <li><p>Replace all the <span title="space character">space
- characters</span> in <var title="">text</var> with U+0020 SPACE
- characters.</p></li>
+ <p id="dom-context-2d-drawosfocusring">The <dfn id="dom-context-2d-drawfocusifneeded-2"><code>drawFocusIfNeeded(<var>element</var>)</code></dfn>
+ method, when invoked, must run these steps:</p>
- <li><p>Form a <em class="&#x0058;&#x0058;&#x0058;">whatever CSS ends up calling
- vertical line boxes and inline boxes</em> containing the text <var
- title="">text</var>, with all the properties at their initial
- values except the 'font' property of the inline box set to <var
- title="">font</var> and the 'direction' property of the inline
- box set to <span>the directionality</span> of the <code>canvas</code>
- element.</p></li>
+ <ol><li><p>If <var>element</var> is not <a href="https://html.spec.whatwg.org/multipage/interaction.html#focused" id="drawing-focus-rings-and-scrolling-paths-into-view:focused-2">focused</a> or is not a descendant of the element with
+ whose context the method is associated, then abort these steps.</p></li><li>
- <!- - if you insert a step here, make sure to adjust the next step's
- final words - ->
+ <p>Draw a focus ring of the appropriate style along the intended path, following platform
+ conventions.</p>
- <li><p>If the <var title="">maxHeight</var> argument was specified
- and the hypothetical height of the <em class="&#x0058;&#x0058;&#x0058;">box</em>
- in the hypothetical line box is greater than <var
- title="">maxHeight</var> CSS pixels, then change <var
- title="">font</var> to have a more condensed font (if one is
- available or if a reasonably readable one can be synthesized by
- applying an appropriate scale factor to the font) or a smaller
- font, and return to the previous step.</p></li>
+ <p class="note">Some platforms only draw focus rings around elements that have been focused from
+ the keyboard, and not those focused from the mouse. Other platforms simply don't draw focus
+ rings around some elements at all unless relevant accessibility features are enabled. This API
+ is intended to follow these conventions. User agents that implement distinctions based on the
+ manner in which the element was focused are encouraged to classify focus driven by the <code id="drawing-focus-rings-and-scrolling-paths-into-view:dom-focus-2"><a href="https://html.spec.whatwg.org/multipage/interaction.html#dom-focus-2">focus()</a></code> method based on the kind of user interaction event from which
+ the call was triggered (if any).</p>
- <li>
+ <p>The focus ring should not be subject to the <a href="#shadows" id="drawing-focus-rings-and-scrolling-paths-into-view:shadows">shadow effects</a>, the
+ <a href="#dom-context-2d-globalalpha-2" id="drawing-focus-rings-and-scrolling-paths-into-view:dom-context-2d-globalalpha-2">global alpha</a>, the <a href="#dom-context-2d-globalcompositeoperation-2" id="drawing-focus-rings-and-scrolling-paths-into-view:dom-context-2d-globalcompositeoperation-2">global composition operators</a>, or any of
+ the members in the <code id="drawing-focus-rings-and-scrolling-paths-into-view:canvasfillstrokestyles"><a href="#canvasfillstrokestyles">CanvasFillStrokeStyles</a></code>, <code id="drawing-focus-rings-and-scrolling-paths-into-view:canvaspathdrawingstyles"><a href="#canvaspathdrawingstyles">CanvasPathDrawingStyles</a></code>,
+ <code id="drawing-focus-rings-and-scrolling-paths-into-view:canvastextdrawingstyles"><a href="#canvastextdrawingstyles">CanvasTextDrawingStyles</a></code> interfaces, but <em>should</em> be subject to the
+ <a href="#clipping-region" id="drawing-focus-rings-and-scrolling-paths-into-view:clipping-region">clipping region</a>. (The effect of transformations is described above and varies based
+ on which path is being used.)</p>
- <p>Let the <var title="">anchor point</var> be a point on the <em
- class="&#x0058;&#x0058;&#x0058;">inline box</var>, determined by the <code
- title="dom-context-2d-textAlign">textAlign</code>, as follows:</p>
+ </li><li><p><a href="#inform">Inform the user</a> that the focus is at the location given by the
+ intended path. User agents may wait until the next time the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop" id="drawing-focus-rings-and-scrolling-paths-into-view:event-loop">event loop</a> reaches its
+ <a href="https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering" id="drawing-focus-rings-and-scrolling-paths-into-view:update-the-rendering">update the rendering</a> step to optionally inform the user.</p></li></ol>
- <p>Vertical position:</p>
+ <p>User agents should not implicitly close open subpaths in the intended path when drawing the
+ focus ring.</p>
- <dl>
-
- <dt> If <code
- title="dom-context-2d-textAlign">textAlign</code> is <code
- title="">start</code></dt>
- <dt> If <code
- title="dom-context-2d-textAlign">textAlign</code> is <code
- title="">left</code> and <span>the directionality</span> of the
- <code>canvas</code> element is 'ltr'</dt>
- <dt> If <code
- title="dom-context-2d-textAlign">textAlign</code> is <code
- title="">right</code> and <span>the directionality</span> of the
- <code>canvas</code> element is 'rtl'</dt>
-
- <dd>Let the <var title="">anchor point</var>'s vertical
- position be the top edge of the <em class="&#x0058;&#x0058;&#x0058;">inline
- box</em>.</dd>
-
- <dt> If <code
- title="dom-context-2d-textAlign">textAlign</code> is <code
- title="">end</code></dt>
- <dt> If <code
- title="dom-context-2d-textAlign">textAlign</code> is <code
- title="">right</code> and <span>the directionality</span> of the
- <code>canvas</code> element is 'ltr'</dt>
- <dt> If <code
- title="dom-context-2d-textAlign">textAlign</code> is <code
- title="">left</code> and <span>the directionality</span> of the
- <code>canvas</code> element is 'rtl'</dt>
-
- <dd>Let the <var title="">anchor point</var>'s vertical
- position be the bottom edge of the <em class="&#x0058;&#x0058;&#x0058;">inline
- box</em>.</dd>
-
-
- <dt> If <code
- title="dom-context-2d-textAlign">textAlign</code> is <code
- title="">center</code></dt>
-
- <dd>Let the <var title="">anchor point</var>'s vertical position
- be half way between the top and bottom edges of the <em
- class="&#x0058;&#x0058;&#x0058;">inline box</em>.</dd>
-
- </dl>
-
- <p>Let the horizontal position be half way between the left and
- right edges of the em box of the first available font of the <em
- class="&#x0058;&#x0058;&#x0058;">inline box</em>.</p>
-
- </li>
-
- <li>
-
- <p>Paint the hypothetical inline box as the shape given by the
- text's glyphs, as transformed by the <span
- title="dom-context-2d-transformation">current transformation
- matrix</span>, and anchored and sized so that before applying the
- <span title="dom-context-2d-transformation">current transformation
- matrix</span>, the <var title="">anchor point</var> is at (<var
- title="">x</var>, <var title="">y</var>) and each CSS pixel is
- mapped to one coordinate space unit.</p>
-
- <p>For <code
- title="dom-context-2d-fillVerticalText">fillVerticalText()</code>
- <code title="dom-context-2d-fillStyle">fillStyle</code> must be
- applied and <code
- title="dom-context-2d-strokeStyle">strokeStyle</code> must be
- ignored. For <code
- title="dom-context-2d-strokeVerticalText">strokeVerticalText()</code>
- the reverse holds and <code
- title="dom-context-2d-strokeStyle">strokeStyle</code> must be
- applied and <code
- title="dom-context-2d-fillStyle">fillStyle</code> must be
- ignored.</p>
+ <p class="note">This might be a moot point, however. For example, if the focus ring is drawn as an
+ axis-aligned bounding rectangle around the points in the intended path, then whether the subpaths
+ are closed or not has no effect. This specification intentionally does not specify precisely how
+ focus rings are to be drawn: user agents are expected to honor their platform's native
+ conventions.</p>
- <p>Text is painted without affecting the current path, and is
- subject to <span title="shadows">shadow effects</span>, <span
- title="dom-context-2d-globalAlpha">global alpha</span>, the <span
- title="clipping region">clipping region</span>, and <span
- title="dom-context-2d-globalCompositeOperation">global composition
- operators</span>.</p>
-
- </li>
-
- </ol>
-
-v6DVT (also check for '- -' bits in the part above) --><p>The <dfn id="dom-context-2d-measuretext" title="dom-context-2d-measureText"><code>measureText()</code></dfn>
- method takes one argument, <var title="">text</var>. When the method
- is invoked, the user agent must replace all the <a href="#space-character" title="space
- character">space characters</a> in <var title="">text</var> with
- U+0020 SPACE characters, and then must form a hypothetical
- infinitely wide CSS line box containing a single inline box
- containing the text <var title="">text</var>, with all the
- properties at their initial values except the 'white-space' property
- of the inline element set to 'pre' and the 'font' property of the
- inline element set to the current font of the context as given by
- the <code title="dom-context-2d-font"><a href="#dom-context-2d-font">font</a></code> attribute, and
- must then return a new <code><a href="#textmetrics">TextMetrics</a></code> object with its
- <code title="dom-textmetrics-width"><a href="#dom-textmetrics-width">width</a></code> attribute set to
- the width of that inline box, in CSS pixels. <a href="#refsCSS">[CSS]</a></p>
-
- <p>The <code><a href="#textmetrics">TextMetrics</a></code> interface is used for the objects
- returned from <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText()</a></code>. It has one
- attribute, <dfn id="dom-textmetrics-width" title="dom-textmetrics-width"><code>width</code></dfn>, which is set
- by the <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText()</a></code>
- method.</p>
+ <hr/>
- <p class="note">Glyphs rendered using <code title="dom-context-2d-fillText"><a href="#dom-context-2d-filltext">fillText()</a></code> and <code title="dom-context-2d-strokeText"><a href="#dom-context-2d-stroketext">strokeText()</a></code> can spill out
- of the box given by the font size (the em square size) and the width
- returned by <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText()</a></code> (the text
- width). This version of the specification does not provide a way to
- obtain the bounding box dimensions of the text. If the text is to be
- rendered and removed, care needs to be taken to replace the entire
- area of the canvas that the clipping region covers, not just the box
- given by the em square height and measured text width.</p>
+ <p>The <dfn id="dom-context-2d-scrollpathintoview-2"><code>scrollPathIntoView()</code></dfn>
+ method, when invoked, must run these steps:</p>
- <!-- v6: Drawing text along a given path -->
- <!-- v6: Adding text to a path -->
- <!-- see also: http://www.w3.org/TR/SVG11/text.html#TextpathLayoutRules -->
- <!-- see also: http://developer.mozilla.org/en/docs/Drawing_text_using_a_canvas -->
+ <ol><li><p>Let <var>the specified rectangle</var> be the rectangle of the bounding box of
+ the intended path.</p></li><li><p>Let <var>notional child</var> be a hypothetical element that is a rendered child
+ of the <code id="drawing-focus-rings-and-scrolling-paths-into-view:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element whose dimensions are those of <var>the specified
+ rectangle</var>.</p></li><li><p><a data-x-internal="scroll-an-element-into-view" href="https://drafts.csswg.org/cssom-view/#scroll-an-element-into-view" id="drawing-focus-rings-and-scrolling-paths-into-view:scroll-an-element-into-view">Scroll <var>notional child</var> into
+ view</a> with the <var>align to top flag</var> set.</p>
- </div>
+ </li><li><p>Optionally, <a href="#inform">inform the user</a> that the caret or selection (or both)
+ cover <var>the specified rectangle</var> of the canvas. The user agent may wait until the next
+ time the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop" id="drawing-focus-rings-and-scrolling-paths-into-view:event-loop-2">event loop</a> reaches its <a href="https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering" id="drawing-focus-rings-and-scrolling-paths-into-view:update-the-rendering-2">update the rendering</a> step to
+ optionally inform the user.</p></li></ol>
- <p class="note">A future version of the 2D context API may provide a
- way to render fragments of documents, rendered using CSS, straight
- to the canvas. This would be provided in preference to a dedicated
- way of doing multiline layout.</p>
+ <p id="inform">&quot;Inform the user&quot;, as used in this section, does not imply any persistent state
+ change. It could mean, for instance, calling a system accessibility API to notify assistive
+ technologies such as magnification tools so that the user's magnifier moves to the given area of
+ the canvas. However, it does not associate the path with the element, or provide a region for
+ tactile feedback, etc.</p>
+
+ <h6 id="drawing-images"><span class="secno">4.12.5.1.14</span> Drawing images<a class="self-link" href="#drawing-images"/></h6>
- <h6 id="images"><span class="secno">4.8.11.1.10 </span>Images</h6>
+ <p>Objects that implement the <code id="drawing-images:canvasdrawimage"><a href="#canvasdrawimage">CanvasDrawImage</a></code> interface have the <dfn id="dom-context-2d-drawimage"><code>drawImage</code></dfn> method to draw images.</p>
- <p>To draw images onto the canvas, the <dfn id="dom-context-2d-drawimage" title="dom-context-2d-drawImage"><code>drawImage</code></dfn> method
- can be used.</p>
+
<p>This method can be invoked with three different sets of arguments:</p>
- <ul class="brief"><li><code title="">drawImage(<var title="">image</var>, <var title="">dx</var>, <var title="">dy</var>)</code>
- </li><li><code title="">drawImage(<var title="">image</var>, <var title="">dx</var>, <var title="">dy</var>, <var title="">dw</var>, <var title="">dh</var>)</code>
- </li><li><code title="">drawImage(<var title="">image</var>, <var title="">sx</var>, <var title="">sy</var>, <var title="">sw</var>, <var title="">sh</var>, <var title="">dx</var>, <var title="">dy</var>, <var title="">dw</var>, <var title="">dh</var>)</code>
- </li></ul><!-- v3: drawImage() of an ImageData object might make sense (when resizing as well as filtering) - ack Charles Pritchard --><p>Each of those three can take either an
- <code><a href="#htmlimageelement">HTMLImageElement</a></code>, an <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, or
- an <code><a href="#htmlvideoelement">HTMLVideoElement</a></code> for the <var title="">image</var>
- argument.</p>
+ <ul class="brief"><li><code>drawImage(<var>image</var>, <var>dx</var>, <var>dy</var>)</code>
+ </li><li><code>drawImage(<var>image</var>, <var>dx</var>, <var>dy</var>, <var>dw</var>, <var>dh</var>)</code>
+ </li><li><code>drawImage(<var>image</var>, <var>sx</var>, <var>sy</var>, <var>sw</var>, <var>sh</var>, <var>dx</var>, <var>dy</var>, <var>dw</var>, <var>dh</var>)</code>
+ </li></ul>
- <dl class="domintro"><dt><var title="">context</var> . <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var title="">image</var>, <var title="">dx</var>, <var title="">dy</var>)</dt>
- <dt><var title="">context</var> . <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var title="">image</var>, <var title="">dx</var>, <var title="">dy</var>, <var title="">dw</var>, <var title="">dh</var>)</dt>
- <dt><var title="">context</var> . <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var title="">image</var>, <var title="">sx</var>, <var title="">sy</var>, <var title="">sw</var>, <var title="">sh</var>, <var title="">dx</var>, <var title="">dy</var>, <var title="">dw</var>, <var title="">dh</var>)</dt>
+
- <dd>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-drawimage-2"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var>image</var>, <var>dx</var>, <var>dy</var>)</dt><dt><var>context</var> . <code id="drawing-images:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var>image</var>, <var>dx</var>, <var>dy</var>, <var>dw</var>, <var>dh</var>)</dt><dt><var>context</var> . <code id="drawing-images:dom-context-2d-drawimage-2"><a href="#dom-context-2d-drawimage">drawImage</a></code>(<var>image</var>, <var>sx</var>, <var>sy</var>, <var>sw</var>, <var>sh</var>, <var>dx</var>, <var>dy</var>, <var>dw</var>, <var>dh</var>)</dt><dd>
<p>Draws the given image onto the canvas. The arguments are
interpreted as follows:</p>
- <p><img alt="The sx and sy parameters give the x and y coordinates of the source rectangle; the sw and sh arguments give the width and height of the source rectangle; the dx and dy give the x and y coordinates of the destination rectangle; and the dw and dh arguments give the width and height of the destination rectangle." height="356" src="http://www.whatwg.org/specs/web-apps/current-work/http://images.whatwg.org/drawImage.png" width="356"/></p>
-
- <p>If the first argument isn't an <code><a href="#the-img-element">img</a></code>,
- <code><a href="#the-canvas-element">canvas</a></code>, or <code><a href="#the-video-element">video</a></code> element, throws a
- <code><a href="#type_mismatch_err">TYPE_MISMATCH_ERR</a></code> exception. If the image has no
- image data, throws an <code><a href="#invalid_state_err">INVALID_STATE_ERR</a></code> exception. If
- the one of the source rectangle dimensions is zero, throws an
- <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception. If the image isn't yet
- fully decoded, then nothing is drawn.</p>
-
- </dd>
-
- </dl><div class="impl">
-
- <p>If not specified, the <var title="">dw</var> and <var title="">dh</var> arguments must default to the values of <var title="">sw</var> and <var title="">sh</var>, interpreted such that
- one CSS pixel in the image is treated as one unit in the canvas
- coordinate space. If the <var title="">sx</var>, <var title="">sy</var>, <var title="">sw</var>, and <var title="">sh</var> arguments are omitted, they must default to 0, 0,
- the image's intrinsic width in image pixels, and the image's
- intrinsic height in image pixels, respectively. If the image has no
- intrinsic dimensions, the <i>concrete object size</i> must be used
- instead, as determined using the CSS &quot;<a href="http://dev.w3.org/csswg/css3-images/#default-sizing">Concrete
- Object Size Resolution</a>&quot; algorithm, with the <i>specified
- size</i> having neither a definite width nor height, nor any
- additional contraints, the object's intrinsic properties being those
- of the <var title="">image</var> argument, and the <i>default object
- size</i> being the size of the <code><a href="#the-canvas-element">canvas</a></code> element. <a href="#refsCSSIMAGES">[CSSIMAGES]</a></p>
-
- <p>The <var title="">image</var> argument is an instance of either
- <code><a href="#htmlimageelement">HTMLImageElement</a></code>, <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, or
- <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>.</p> <!-- createPattern() has an
- equivalent paragraph -->
-
- <p>If the <var title="">image</var> argument is an
- <code><a href="#htmlimageelement">HTMLImageElement</a></code> object that is not <a href="#img-good" title="img-good">fully decodable</a>, or if the <var title="">image</var> argument is an <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>
- object whose <code title="dom-media-readyState"><a href="#dom-media-readystate">readyState</a></code>
- attribute is either <code title="dom-media-HAVE_NOTHING"><a href="#dom-media-have_nothing">HAVE_NOTHING</a></code> or <code title="dom-media-HAVE_METADATA"><a href="#dom-media-have_metadata">HAVE_METADATA</a></code>, then the
- implementation must return without drawing anything.</p> <!--
- createPattern() has an equivalent paragraph -->
-
- <p>If the <var title="">image</var> argument is an
- <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> object with either a horizontal
- dimension or a vertical dimension equal to zero, then the
- implementation must raise an <code><a href="#invalid_state_err">INVALID_STATE_ERR</a></code>
- exception.</p>
- <!-- createPattern() has an equivalent paragraph -->
-
- <p>The source rectangle is the rectangle whose corners are the four
- points (<var title="">sx</var>, <var title="">sy</var>), (<span title=""><var title="">sx</var>+<var title="">sw</var></span>, <var title="">sy</var>), (<span title=""><var title="">sx</var>+<var title="">sw</var></span>, <span title=""><var title="">sy</var>+<var title="">sh</var></span>), (<var title="">sx</var>, <span title=""><var title="">sy</var>+<var title="">sh</var></span>).</p>
-
- <p>If one of the <var title="">sw</var> or <var title="">sh</var>
- arguments is zero, the implementation must raise an
- <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code> exception.</p>
-
- <p>The destination rectangle is the rectangle whose corners are the
- four points (<var title="">dx</var>, <var title="">dy</var>),
- (<span title=""><var title="">dx</var>+<var title="">dw</var></span>, <var title="">dy</var>), (<span title=""><var title="">dx</var>+<var title="">dw</var></span>, <span title=""><var title="">dy</var>+<var title="">dh</var></span>), (<var title="">dx</var>, <span title=""><var title="">dy</var>+<var title="">dh</var></span>).</p>
-
- <p>When <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> is
- invoked, the region of the image specified by the source rectangle
- must be painted on the region of the canvas specified by the
- destination rectangle, after applying the <a href="#transformations" title="dom-context-2d-transformation">current transformation
- matrix</a> to the points of the destination rectangle.</p>
-
- <p>The original image data of the source image must be used, not the
- image as it is rendered (e.g. <code title="attr-dim-width"><a href="#attr-dim-width">width</a></code> and <code title="attr-dim-height"><a href="#attr-dim-height">height</a></code> attributes on the source
- element have no effect). The image data must be processed in the
- original direction, even if the dimensions given are negative. <!--
- remove that last sentence if it causes confusion. Someone once
- suggested that 5,5,-2,-2 was different than 3,3,2,2; this is trying
- to clarify that this is no the case. --></p>
-
- <p class="note">This specification does not define the algorithm to
- use when scaling the image, if necessary.</p>
-
- <p class="note">When a canvas is drawn onto itself, the <a href="#drawing-model">drawing
- model</a> requires the source to be copied before the image is drawn
- back onto the canvas, so it is possible to copy parts of a canvas
- onto overlapping parts of itself.</p>
-
- <p>If the original image data is a bitmap image, the value painted
- at a point in the destination rectangle is computed by filtering the
- original image data. The user agent may use any filtering algorithm
- (for example bilinear interpolation or nearest-neighbor). When the
- filtering algorithm requires a pixel value from outside the original
- image data, it must instead use the value from the nearest edge
- pixel. (That is, the filter uses 'clamp-to-edge' behavior.)</p>
- <!-- see CORE-32111 and:
- http://krijnhoetmer.nl/irc-logs/whatwg/20100818#l-737
- http://www.w3.org/Bugs/Public/show_bug.cgi?id=10799#c11
- -->
- <!-- createPattern() has a similar paragraph with different rules -->
-
- <p>When the <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method
- is passed an animated image as its <var title="">image</var>
- argument, the user agent must use the poster frame of the animation,
- or, if there is no poster frame, the first frame of the
- animation.</p>
- <!-- createPattern() has an equivalent paragraph -->
-
- <p>When the <var title="">image</var> argument is an
- <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>, then the frame at the <a href="#current-playback-position">current
- playback position</a> must be used as the source image, and the
- source image's dimensions must be the <a href="#concept-video-intrinsic-width" title="concept-video-intrinsic-width">intrinsic width</a> and
- <a href="#concept-video-intrinsic-height" title="concept-video-intrinsic-height">intrinsic height</a>
- of the <a href="#media-resource">media resource</a> (i.e. after any aspect-ratio
- correction has been applied).</p>
- <!-- createPattern() has an equivalent paragraph -->
-
- <p>Images are painted without affecting the current path, and are
- subject to <a href="#shadows" title="shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, the <a href="#clipping-region" title="clipping region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
- operators</a>.</p>
+ <p><img alt="The sx and sy parameters give the x and y coordinates of the source rectangle; the sw and sh arguments give the width and height of the source rectangle; the dx and dy give the x and y coordinates of the destination rectangle; and the dw and dh arguments give the width and height of the destination rectangle." height="356" src="https://html.spec.whatwg.org/images/drawImage.png" width="356"/></p>
- </div>
+ <p>If the image isn't yet fully decoded, then nothing is drawn. If the image is a canvas with no
+ data, throws an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="drawing-images:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="drawing-images:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p>
+ </dd></dl>
+
- <h6 id="pixel-manipulation"><span class="secno">4.8.11.1.11 </span><dfn>Pixel manipulation</dfn></h6>
+ <p>When the <code id="drawing-images:dom-context-2d-drawimage-3"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method is invoked, the user
+ agent must run these steps:</p>
- <dl class="domintro"><dt><var title="">imagedata</var> = <var title="">context</var> . <code title="dom-context-2d-createImageData"><a href="#dom-context-2d-createimagedata">createImageData</a></code>(<var title="">sw</var>, <var title="">sh</var>)</dt>
+ <ol><li><p>If any of the arguments are infinite or NaN, then abort these steps.</p></li><li><p><a href="#check-the-usability-of-the-image-argument" id="drawing-images:check-the-usability-of-the-image-argument">Check the usability of the <var>image</var> argument</a>. If this
+ returns <i>aborted</i>, then an exception has been thrown and the method doesn't return anything;
+ abort these steps. If it returns <i>bad</i>, then abort these steps without drawing anything.
+ Otherwise it returns <i>good</i>; continue with these steps.</p></li><li>
- <dd>
+ <p>Establish the source and destination rectangles as follows:</p>
- <p>Returns an <code><a href="#imagedata">ImageData</a></code> object with the given
- dimensions in CSS pixels (which might map to a different number of
- actual device pixels exposed by the object itself). All the pixels
- in the returned object are transparent black.</p>
+ <p>If not specified, the <var>dw</var> and <var>dh</var> arguments must default to the values of
+ <var>sw</var> and <var>sh</var>, interpreted such that one <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="drawing-images:'px'">CSS pixel</a>
+ in the image is treated as one unit in the <a href="#output-bitmap" id="drawing-images:output-bitmap">output bitmap</a>'s coordinate space. If the
+ <var>sx</var>, <var>sy</var>, <var>sw</var>, and <var>sh</var> arguments are omitted, then they
+ must default to 0, 0, the image's <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-width" id="drawing-images:intrinsic-width">intrinsic width</a> in image pixels, and the image's
+ <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-height" id="drawing-images:intrinsic-height">intrinsic height</a> in image pixels, respectively. If the image has no <a data-x-internal="intrinsic-dimensions" href="https://drafts.csswg.org/css2/conform.html#intrinsic" id="drawing-images:intrinsic-dimensions">intrinsic
+ dimensions</a>, then the <i>concrete object size</i> must be used instead, as determined
+ using the CSS &quot;<a href="https://drafts.csswg.org/css-images/#default-sizing">Concrete Object
+ Size Resolution</a>&quot; algorithm, with the <i>specified size</i> having neither a definite width
+ nor height, nor any additional constraints, the object's intrinsic properties being those of the
+ <var>image</var> argument, and the <a data-x-internal="default-object-size" href="https://drafts.csswg.org/css-images/#default-object-size" id="drawing-images:default-object-size">default object size</a> being the size of the
+ <a href="#output-bitmap" id="drawing-images:output-bitmap-2">output bitmap</a>. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSIMAGES">[CSSIMAGES]</a></p>
- </dd>
+ <p>The source rectangle is the rectangle whose corners are the four points (<var>sx</var>, <var>sy</var>), (<var>sx</var>+<var>sw</var>, <var>sy</var>), (<var>sx</var>+<var>sw</var>, <var>sy</var>+<var>sh</var>),
+ (<var>sx</var>, <var>sy</var>+<var>sh</var>).</p>
- <dt><var title="">imagedata</var> = <var title="">context</var> . <code title="dom-context-2d-createImageData"><a href="#dom-context-2d-createimagedata">createImageData</a></code>(<var title="">imagedata</var>)</dt>
+ <p>The destination rectangle is the rectangle whose corners are the four points (<var>dx</var>, <var>dy</var>), (<var>dx</var>+<var>dw</var>, <var>dy</var>), (<var>dx</var>+<var>dw</var>, <var>dy</var>+<var>dh</var>),
+ (<var>dx</var>, <var>dy</var>+<var>dh</var>).</p>
- <dd>
+ <p>When the source rectangle is outside the source image, the source rectangle must be clipped
+ to the source image and the destination rectangle must be clipped in the same proportion.</p>
- <p>Returns an <code><a href="#imagedata">ImageData</a></code> object with the same
- dimensions as the argument. All the pixels in the returned object
- are transparent black.</p>
+ <p class="note">When the destination rectangle is outside the destination image (the
+ <a href="#output-bitmap" id="drawing-images:output-bitmap-3">output bitmap</a>), the pixels that land outside the <a href="#output-bitmap" id="drawing-images:output-bitmap-4">output bitmap</a> are
+ discarded, as if the destination was an infinite canvas whose rendering was clipped to the
+ dimensions of the <a href="#output-bitmap" id="drawing-images:output-bitmap-5">output bitmap</a>.</p>
- </dd>
+ </li><li><p>If one of the <var>sw</var> or <var>sh</var> arguments is zero, then abort
+ these steps. Nothing is painted.</p></li><li>
- <dt><var title="">imagedata</var> = <var title="">context</var> . <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData</a></code>(<var title="">sx</var>, <var title="">sy</var>, <var title="">sw</var>, <var title="">sh</var>)</dt>
+ <p>Paint the region of the <var>image</var> argument specified by the source rectangle
+ on the region of the rendering context's <a href="#output-bitmap" id="drawing-images:output-bitmap-6">output bitmap</a> specified by the
+ destination rectangle, after applying the <a href="#transformations" id="drawing-images:transformations">current
+ transformation matrix</a> to the destination rectangle.</p>
- <dd>
+ <p>The image data must be processed in the original direction, even if the dimensions given are
+ negative. </p>
- <p>Returns an <code><a href="#imagedata">ImageData</a></code> object containing the image
- data for the given rectangle of the canvas.</p>
+ <p>When scaling up, if the <code id="drawing-images:dom-context-2d-imagesmoothingenabled-2"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code> attribute is set to
+ true, the user agent should attempt to apply a smoothing algorithm to the image data when it is
+ scaled. User agents which support multiple filtering algorithms may use the value of the <code id="drawing-images:dom-context-2d-imagesmoothingquality-2"><a href="#dom-context-2d-imagesmoothingquality-2">imageSmoothingQuality</a></code> attribute to guide
+ the choice of filtering algorithm when the <code id="drawing-images:dom-context-2d-imagesmoothingenabled-2-2"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code> attribute is set to
+ true. Otherwise, the image must be rendered using nearest-neighbor interpolation.</p>
- <p>Throws a <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception if any of the
- arguments are not finite. Throws an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code>
- exception if the either of the width or height arguments are
- zero.</p>
+ <p class="note">This specification does not define the precise algorithm to use when scaling an
+ image down, or when scaling an image up when the <code id="drawing-images:dom-context-2d-imagesmoothingenabled-2-3"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code> attribute is set to
+ true.</p>
- </dd>
+ <p class="note">When a <code id="drawing-images:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element is drawn onto itself, the <a href="#drawing-model" id="drawing-images:drawing-model">drawing
+ model</a> requires the source to be copied before the image is drawn, so it is possible to
+ copy parts of a <code id="drawing-images:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element onto overlapping parts of itself.</p>
- <dt><var title="">imagedata</var> . <code title="dom-imagedata-width"><a href="#dom-imagedata-width">width</a></code></dt>
- <dt><var title="">imagedata</var> . <code title="dom-imagedata-height"><a href="#dom-imagedata-height">height</a></code></dt>
+ <p>If the original image data is a bitmap image, then the value painted at a point in the
+ destination rectangle is computed by filtering the original image data. The user agent may use
+ any filtering algorithm (for example bilinear interpolation or nearest-neighbor). When the
+ filtering algorithm requires a pixel value from outside the original image data, it must instead
+ use the value from the nearest edge pixel. (That is, the filter uses 'clamp-to-edge' behavior.)
+ When the filtering algorithm requires a pixel value from outside the source rectangle but inside
+ the original image data, then the value from the original image data must be used.</p>
+
+
- <dd>
+ <p class="note">Thus, scaling an image in parts or in whole will have the same effect. This does
+ mean that when sprites coming from a single sprite sheet are to be scaled, adjacent images in
+ the sprite sheet can interfere. This can be avoided by ensuring each sprite in the sheet is
+ surrounded by a border of transparent black, or by copying sprites to be scaled into temporary
+ <code id="drawing-images:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> elements and drawing the scaled sprites from there.</p>
- <p>Returns the actual dimensions of the data in the <code><a href="#imagedata">ImageData</a></code> object, in device pixels.</p>
+ <p>Images are painted without affecting the current path, and are subject to <a href="#shadows" id="drawing-images:shadows">shadow effects</a>, <a href="#dom-context-2d-globalalpha-2" id="drawing-images:dom-context-2d-globalalpha-2">global
+ alpha</a>, the <a href="#clipping-region" id="drawing-images:clipping-region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation-2" id="drawing-images:dom-context-2d-globalcompositeoperation-2">global composition operators</a>.</p>
- </dd>
+ </li><li><p>If <a href="#the-image-argument-is-not-origin-clean" id="drawing-images:the-image-argument-is-not-origin-clean">the <var>image argument</var> is not origin-clean</a>, then set the
+ <code id="drawing-images:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>'s <a href="#concept-canvas-origin-clean" id="drawing-images:concept-canvas-origin-clean">origin-clean</a> flag to false.</p></li></ol>
- <dt><var title="">imagedata</var> . <code title="dom-imagedata-data"><a href="#dom-imagedata-data">data</a></code></dt>
+
- <dd>
- <p>Returns the one-dimensional array containing the data in RGBA order, as integers in the range 0 to 255.</p>
+ <h6 id="pixel-manipulation"><span class="secno">4.12.5.1.15</span> <dfn>Pixel manipulation</dfn><a class="self-link" href="#pixel-manipulation"/></h6>
- </dd>
+ <dl class="domintro"><dt><var>imagedata</var> = new <code id="pixel-manipulation:dom-imagedata"><a href="#dom-imagedata">ImageData</a></code>(<var>sw</var>, <var>sh</var>)</dt><dt><var>imagedata</var> = <var>context</var> . <code id="dom-context-2d-createimagedata"><a href="#dom-context-2d-createimagedata-2">createImageData</a></code>(<var>sw</var>, <var>sh</var>)</dt><dd>
- <dt><var title="">context</var> . <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData</a></code>(<var title="">imagedata</var>, <var title="">dx</var>, <var title="">dy</var> [, <var title="">dirtyX</var>, <var title="">dirtyY</var>, <var title="">dirtyWidth</var>, <var title="">dirtyHeight</var> ])</dt>
+ <p>Returns an <code id="pixel-manipulation:imagedata"><a href="#imagedata">ImageData</a></code> object with the given dimensions. All the pixels in the
+ returned object are transparent black.</p>
- <dd>
+ <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if either of
+ the width or height arguments are zero.</p>
- <p>Paints the data from the given <code><a href="#imagedata">ImageData</a></code> object
- onto the canvas. If a dirty rectangle is provided, only the pixels
- from that rectangle are painted.</p>
+ </dd><dt><var>imagedata</var> = <var>context</var> . <code id="pixel-manipulation:dom-context-2d-createimagedata-2"><a href="#dom-context-2d-createimagedata-2">createImageData</a></code>(<var>imagedata</var>)</dt><dd>
- <p>The <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code>
- and <code title="dom-context-2d-globalCompositeOperation"><a href="#dom-context-2d-globalcompositeoperation">globalCompositeOperation</a></code>
- attributes, as well as the shadow attributes, are ignored for the
- purposes of this method call; pixels in the canvas are replaced
- wholesale, with no composition, alpha blending, no shadows,
- etc.</p>
+ <p>Returns an <code id="pixel-manipulation:imagedata-2"><a href="#imagedata">ImageData</a></code> object with the same dimensions as the argument. All the
+ pixels in the returned object are transparent black.</p>
- <p>If the first argument is null, throws a
- <code><a href="#type_mismatch_err">TYPE_MISMATCH_ERR</a></code> exception. Throws a
- <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception if any of the other
- arguments are not finite.</p>
+ </dd><dt><var>imagedata</var> = new <code id="pixel-manipulation:dom-imagedata-2"><a href="#dom-imagedata">ImageData</a></code>(<var>data</var>, <var>sw</var> [, <var>sh</var> ] )</dt><dd>
- </dd>
+ <p>Returns an <code id="pixel-manipulation:imagedata-3"><a href="#imagedata">ImageData</a></code> object using the data provided in the <code id="pixel-manipulation:idl-uint8clampedarray"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> argument, interpreted using the given
+ dimensions.</p>
- </dl><div class="impl">
+ <p>As each pixel in the data is represented by four numbers, the length of the data needs to be
+ a multiple of four times the given width. If the height is provided as well, then the length
+ needs to be exactly the width times the height times 4.</p>
- <p>The <dfn id="dom-context-2d-createimagedata" title="dom-context-2d-createImageData"><code>createImageData()</code></dfn>
- method is used to instantiate new blank <code><a href="#imagedata">ImageData</a></code>
- objects. When the method is invoked with two arguments <var title="">sw</var> and <var title="">sh</var>, it must return an
- <code><a href="#imagedata">ImageData</a></code> object representing a rectangle with a width
- in CSS pixels equal to the absolute magnitude of <var title="">sw</var> and a height in CSS pixels equal to the absolute
- magnitude of <var title="">sh</var>. When invoked with a single <var title="">imagedata</var> argument, it must return an
- <code><a href="#imagedata">ImageData</a></code> object representing a rectangle with the same
- dimensions as the <code><a href="#imagedata">ImageData</a></code> object passed as the
- argument. The <code><a href="#imagedata">ImageData</a></code> object returned must be filled
- with transparent black.</p>
+ <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-2">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the given
+ data and dimensions can't be interpreted consistently, or if either dimension is zero.</p>
- <p>The <dfn id="dom-context-2d-getimagedata" title="dom-context-2d-getImageData"><code>getImageData(<var title="">sx</var>, <var title="">sy</var>, <var title="">sw</var>,
- <var title="">sh</var>)</code></dfn> method must return an
- <code><a href="#imagedata">ImageData</a></code> object representing the underlying pixel data
- for the area of the canvas denoted by the rectangle whose corners are
- the four points (<var title="">sx</var>, <var title="">sy</var>),
- (<span title=""><var title="">sx</var>+<var title="">sw</var></span>, <var title="">sy</var>), (<span title=""><var title="">sx</var>+<var title="">sw</var></span>, <span title=""><var title="">sy</var>+<var title="">sh</var></span>), (<var title="">sx</var>, <span title=""><var title="">sy</var>+<var title="">sh</var></span>), in canvas
- coordinate space units. Pixels outside the canvas must be returned
- as transparent black. Pixels must be returned as non-premultiplied
- alpha values.</p>
+ </dd><dt><var>imagedata</var> = <var>context</var> . <code id="dom-context-2d-getimagedata"><a href="#dom-context-2d-getimagedata-2">getImageData</a></code>(<var>sx</var>, <var>sy</var>, <var>sw</var>, <var>sh</var>)</dt><dd>
- <p>If any of the arguments to <code title="dom-context-2d-createImageData"><a href="#dom-context-2d-createimagedata">createImageData()</a></code> or
- <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code>
- are infinite or NaN, the method must instead raise a
- <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception. If either the <var title="">sw</var> or <var title="">sh</var> arguments are zero,
- the method must instead raise an <code><a href="#index_size_err">INDEX_SIZE_ERR</a></code>
- exception.</p>
+ <p>Returns an <code id="pixel-manipulation:imagedata-4"><a href="#imagedata">ImageData</a></code> object containing the image data for the given rectangle of
+ the bitmap.</p>
- <p><code><a href="#imagedata">ImageData</a></code> objects must be initialized so that their
- <dfn id="dom-imagedata-width" title="dom-imagedata-width"><code>width</code></dfn> attribute
- is set to <var title="">w</var>, the number of physical device
- pixels per row in the image data, their <dfn id="dom-imagedata-height" title="dom-imagedata-height"><code>height</code></dfn> attribute is
- set to <var title="">h</var>, the number of rows in the image data,
- and their <dfn id="dom-imagedata-data" title="dom-imagedata-data"><code>data</code></dfn>
- attribute is initialized to a <code><a href="#canvaspixelarray">CanvasPixelArray</a></code> object
- holding the image data. At least one pixel's worth of image data
- must be returned.</p>
+ <p>Throws an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-3">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception-3"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the either
+ of the width or height arguments are zero.</p>
- <p>The <code><a href="#canvaspixelarray">CanvasPixelArray</a></code> object provides ordered,
- indexed access to the color components of each pixel of the image
- data. The data must be represented in left-to-right order, row by
- row top to bottom, starting with the top left, with each pixel's
- red, green, blue, and alpha components being given in that order for
- each pixel. Each component of each device pixel represented in this
- array must be in the range 0..255, representing the 8 bit value for
- that component. The components must be assigned consecutive indices
- starting with 0 for the top left pixel's red component.</p>
+ </dd><dt><var>imagedata</var> . <code id="dom-imagedata-width"><a href="#dom-imagedata-width-2">width</a></code></dt><dt><var>imagedata</var> . <code id="dom-imagedata-height"><a href="#dom-imagedata-height-2">height</a></code></dt><dd>
- <p>The <code><a href="#canvaspixelarray">CanvasPixelArray</a></code> object thus represents <var title="">h</var>×<var title="">w</var>×4 integers. The
- <dfn id="dom-canvaspixelarray-length" title="dom-canvaspixelarray-length"><code>length</code></dfn>
- attribute of a <code><a href="#canvaspixelarray">CanvasPixelArray</a></code> object must return this
- number.</p>
+ <p>Returns the actual dimensions of the data in the <code id="pixel-manipulation:imagedata-5"><a href="#imagedata">ImageData</a></code> object, in
+ pixels.</p>
- <p>The object's <a href="#supported-property-indices">supported property indices</a> are the
- numbers in the range 0 .. <span title=""><var title="">h</var>×<var title="">w</var>×4-1</span>.</p>
+ </dd><dt><var>imagedata</var> . <code id="dom-imagedata-data"><a href="#dom-imagedata-data-2">data</a></code></dt><dd>
- <p>To <dfn id="dom-canvaspixelarray-get" title="dom-CanvasPixelArray-get">determine the value of
- an indexed property</dfn> <var title="">index</var>, the user agent
- must return the value of the <var title="">index</var>th component
- in the array.</p>
+ <p>Returns the one-dimensional array containing the data in RGBA order, as integers in the range
+ 0 to 255.</p>
- <p>To <dfn id="dom-canvaspixelarray-set" title="dom-CanvasPixelArray-set">set the value of an
- existing indexed property</dfn> <var title="">index</var> to value
- <var title="">value</var>, the value of the <var title="">index</var>th component in the array must be set to <var title="">value</var>.</p>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-putimagedata"><a href="#dom-context-2d-putimagedata-2">putImageData</a></code>(<var>imagedata</var>, <var>dx</var>, <var>dy</var> [, <var>dirtyX</var>, <var>dirtyY</var>, <var>dirtyWidth</var>, <var>dirtyHeight</var> ] )</dt><dd>
- <p class="note">The width and height (<var title="">w</var> and <var title="">h</var>) might be different from the <var title="">sw</var>
- and <var title="">sh</var> arguments to the above methods, e.g. if
- the canvas is backed by a high-resolution bitmap, or if the <var title="">sw</var> and <var title="">sh</var> arguments are
- negative.</p>
+ <p>Paints the data from the given <code id="pixel-manipulation:imagedata-6"><a href="#imagedata">ImageData</a></code> object onto the bitmap. If a dirty
+ rectangle is provided, only the pixels from that rectangle are painted.</p>
- <p>The <dfn id="dom-context-2d-putimagedata" title="dom-context-2d-putImageData"><code>putImageData(<var title="">imagedata</var>, <var title="">dx</var>, <var title="">dy</var>, <var title="">dirtyX</var>, <var title="">dirtyY</var>, <var title="">dirtyWidth</var>, <var title="">dirtyHeight</var>)</code></dfn> method writes data from
- <code><a href="#imagedata">ImageData</a></code> structures back to the canvas.</p>
+ <p>The <code id="pixel-manipulation:dom-context-2d-globalalpha-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code> and <code id="pixel-manipulation:dom-context-2d-globalcompositeoperation-2"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code> attributes, as
+ well as the shadow attributes, are ignored for the purposes of this method call; pixels in the
+ canvas are replaced wholesale, with no composition, alpha blending, no shadows, etc.</p>
- <p>If any of the arguments to the method are infinite or NaN, the
- method must raise a <code><a href="#not_supported_err">NOT_SUPPORTED_ERR</a></code> exception.</p>
+ <p>Throws an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="pixel-manipulation:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="pixel-manipulation:domexception-4"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> if the
+ <var>imagedata</var> object's data's <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="pixel-manipulation:detached">[[Detached]]</a> internal slot value is true.</p>
- <p>When the last four arguments are omitted, they must be assumed to
- have the values 0, 0, the <code title="dom-imagedata-width"><a href="#dom-imagedata-width">width</a></code> member of the <var title="">imagedata</var> structure, and the <code title="dom-imagedata-height"><a href="#dom-imagedata-height">height</a></code> member of the <var title="">imagedata</var> structure, respectively.</p>
+ </dd></dl>
- <p>When invoked with arguments that do not, per the last few
- paragraphs, cause an exception to be raised, the <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData()</a></code> method
- must act as follows:</p>
+
- <ol><li>
+ <p>Objects that implement the <code id="pixel-manipulation:canvasimagedata"><a href="#canvasimagedata">CanvasImageData</a></code> interface provide the following methods
+ for reading and writing pixel data to the bitmap.</p>
- <p>Let <var title="">dx<sub>device</sub></var> be the x-coordinate
- of the device pixel in the underlying pixel data of the canvas
- corresponding to the <var title="">dx</var> coordinate in the
- canvas coordinate space.</p>
+ <p>The <dfn id="dom-imagedata"><code>ImageData()</code></dfn> constructors and the
+ <dfn id="dom-context-2d-createimagedata-2"><code>createImageData()</code></dfn> methods are
+ used to instantiate new <code id="pixel-manipulation:imagedata-7"><a href="#imagedata">ImageData</a></code> objects.</p>
- <p>Let <var title="">dy<sub>device</sub></var> be the y-coordinate
- of the device pixel in the underlying pixel data of the canvas
- corresponding to the <var title="">dy</var> coordinate in the
- canvas coordinate space.</p>
+ <p>When the <code id="pixel-manipulation:dom-imagedata-3"><a href="#dom-imagedata">ImageData()</a></code> constructor is invoked with two
+ numeric arguments <var>sw</var> and <var>sh</var>, it must <a href="#create-an-imagedata-object" id="pixel-manipulation:create-an-imagedata-object">create an <code>ImageData</code>
+ object</a> with parameter <var>pixelsPerRow</var> set to <var>sw</var>, and <var>rows</var> set
+ to <var>sh</var>. The image data of the newly created <code id="pixel-manipulation:imagedata-8"><a href="#imagedata">ImageData</a></code> object must be
+ initialized to transparent black. If both <var>sw</var> and <var>sh</var> are non-zero, then
+ return the new <code id="pixel-manipulation:imagedata-9"><a href="#imagedata">ImageData</a></code> object. If one or both of <var>sw</var> and <var>sh</var>
+ are zero, then the constructor must throw an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-4">&quot;<code>IndexSizeError</code>&quot;</a>
+ <code id="pixel-manipulation:domexception-5"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> instead.</p>
- </li>
+ <p>When the <code id="pixel-manipulation:dom-imagedata-4"><a href="#dom-imagedata">ImageData()</a></code> constructor is invoked with its first
+ argument being an <code id="pixel-manipulation:idl-uint8clampedarray-2"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> <var>source</var>
+ and its second and optional third arguments being numeric arguments <var>sw</var> and
+ <var>sh</var>, it must run these steps:</p>
- <li>
+ <ol><li><p>Let <var>length</var> be the number of bytes in <var>source</var>.</p></li><li><p>If <var>length</var> is not a non-zero integral multiple of four, then throw an
+ <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="pixel-manipulation:invalidstateerror-2">&quot;<code>InvalidStateError</code>&quot;</a> <code id="pixel-manipulation:domexception-6"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+ steps.</p></li><li><p>Let <var>length</var> be <var>length</var> divided by four.</p>
- <p>If <var title="">dirtyWidth</var> is negative, let <var title="">dirtyX</var> be <span title=""><var title="">dirtyX</var>+<var title="">dirtyWidth</var></span>, and let <var title="">dirtyWidth</var> be equal to the absolute magnitude of
- <var title="">dirtyWidth</var>.</p>
+ </li><li>
- <p>If <var title="">dirtyHeight</var> is negative, let <var title="">dirtyY</var> be <span title=""><var title="">dirtyY</var>+<var title="">dirtyHeight</var></span>, and let <var title="">dirtyHeight</var> be equal to the absolute magnitude of
- <var title="">dirtyHeight</var>.</p>
+ <p>If <var>length</var> is not an integral multiple of <var>sw</var>, then throw an
+ <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-5">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception-7"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p>
- </li>
+ <p class="note">At this step, the length is guaranteed to be greater than zero (otherwise the
+ second step above would have aborted the steps), so if <var>sw</var> is zero, this
+ step will throw the exception and abort these steps.</p>
- <li>
+ </li><li><p>Let <var>height</var> be <var>length</var> divided by <var>sw</var>.</p></li><li><p>If the <var>sh</var> argument was not omitted, and its value is not equal to
+ <var>height</var>, then throw an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-6">&quot;<code>IndexSizeError</code>&quot;</a>
+ <code id="pixel-manipulation:domexception-8"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p></li><li>
- <p>If <var title="">dirtyX</var> is negative, let <var title="">dirtyWidth</var> be <span title=""><var title="">dirtyWidth</var>+<var title="">dirtyX</var></span>, and
- let <var title="">dirtyX</var> be zero.</p>
+ <p><a href="#create-an-imagedata-object" id="pixel-manipulation:create-an-imagedata-object-2">Create an <code>ImageData</code> object</a>, with parameter <var>pixelsPerRow</var>
+ set to <var>sw</var>, <var>rows</var> set to <var>sh</var>, and using <var>source</var>.
+ Return the newly created <code id="pixel-manipulation:imagedata-10"><a href="#imagedata">ImageData</a></code> object.</p>
- <p>If <var title="">dirtyY</var> is negative, let <var title="">dirtyHeight</var> be <span title=""><var title="">dirtyHeight</var>+<var title="">dirtyY</var></span>, and
- let <var title="">dirtyY</var> be zero.</p>
+ <p class="note">The resulting object's data is not a <em>copy</em> of <var>source</var>, it's
+ the actual <code id="pixel-manipulation:idl-uint8clampedarray-3"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> object passed as the
+ first argument to the constructor.</p>
- </li>
+ </li></ol>
- <li>
+ <p>When the <code id="pixel-manipulation:dom-context-2d-createimagedata-2-2"><a href="#dom-context-2d-createimagedata-2">createImageData()</a></code> method is
+ invoked with two numeric arguments <var>sw</var> and <var>sh</var>, it must <a href="#create-an-imagedata-object" id="pixel-manipulation:create-an-imagedata-object-3">create an
+ <code>ImageData</code> object</a>, with parameter <var>pixelsPerRow</var> set to the
+ absolute magnitude of <var>sw</var>, and parameter <var>rows</var> set to the absolute magnitude
+ of <var>sh</var>. Initialize the image data of the new <code id="pixel-manipulation:imagedata-11"><a href="#imagedata">ImageData</a></code> object to
+ transparent black. If both <var>sw</var> and <var>sh</var> are non-zero, then return
+ the new <code id="pixel-manipulation:imagedata-12"><a href="#imagedata">ImageData</a></code> object. If one or both of <var>sw</var> and <var>sh</var> are
+ zero, then throw an <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-7">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception-9"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>
+ instead.</p>
- <p>If <span title=""><var title="">dirtyX</var>+<var title="">dirtyWidth</var></span> is greater than the <code title="dom-imagedata-width"><a href="#dom-imagedata-width">width</a></code> attribute of the <var title="">imagedata</var> argument, let <var title="">dirtyWidth</var> be the value of that <code title="dom-imagedata-width"><a href="#dom-imagedata-width">width</a></code> attribute, minus the
- value of <var title="">dirtyX</var>.</p>
+ <p>When the <code id="pixel-manipulation:dom-context-2d-createimagedata-2-3"><a href="#dom-context-2d-createimagedata-2">createImageData()</a></code> method is
+ invoked with a single <var>imagedata</var> argument, it must <a href="#create-an-imagedata-object" id="pixel-manipulation:create-an-imagedata-object-4">create an
+ <code>ImageData</code> object</a>, with parameter <var>pixelsPerRow</var> set to the value of
+ the <code id="pixel-manipulation:dom-imagedata-width-2"><a href="#dom-imagedata-width-2">width</a></code> attribute of the <code id="pixel-manipulation:imagedata-13"><a href="#imagedata">ImageData</a></code>
+ object passed as the argument, and the <var>rows</var> parameter set to the value of the
+ <code id="pixel-manipulation:dom-imagedata-height-2"><a href="#dom-imagedata-height-2">height</a></code> attribute.
+ Initialize the image data of the new <code id="pixel-manipulation:imagedata-14"><a href="#imagedata">ImageData</a></code> object to transparent black. Return
+ the newly created <code id="pixel-manipulation:imagedata-15"><a href="#imagedata">ImageData</a></code> object.</p>
+
+ <p>The <dfn id="dom-context-2d-getimagedata-2"><code>getImageData(<var>sx</var>,
+ <var>sy</var>, <var>sw</var>, <var>sh</var>)</code></dfn> method, when invoked, must,
+ if either the <var>sw</var> or <var>sh</var> arguments are zero, throw an
+ <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="pixel-manipulation:indexsizeerror-8">&quot;<code>IndexSizeError</code>&quot;</a> <code id="pixel-manipulation:domexception-10"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>; otherwise,
+
+ if the <code id="pixel-manipulation:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>'s <a href="#concept-canvas-origin-clean" id="pixel-manipulation:concept-canvas-origin-clean">origin-clean</a> flag is set to false, it must throw a
+ <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="pixel-manipulation:securityerror">&quot;<code>SecurityError</code>&quot;</a> <code id="pixel-manipulation:domexception-11"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>;
+
+ otherwise, it must <a href="#create-an-imagedata-object" id="pixel-manipulation:create-an-imagedata-object-5">create an <code>ImageData</code> object</a>, with parameter
+ <var>pixelsPerRow</var> set to <var>sw</var>, and parameter <var>rows</var> set to <var>sh</var>.
+ Set the pixel values of the image data of the newly created <code id="pixel-manipulation:imagedata-16"><a href="#imagedata">ImageData</a></code> object to
+ represent the <a href="#output-bitmap" id="pixel-manipulation:output-bitmap">output bitmap</a> for the area of that bitmap denoted by the rectangle
+ whose corners are the four points (<var>sx</var>, <var>sy</var>), (<span><var>sx</var>+<var>sw</var></span>, <var>sy</var>), (<span><var>sx</var>+<var>sw</var></span>, <span><var>sy</var>+<var>sh</var></span>), (<var>sx</var>,
+ <var>sy</var>+<var>sh</var>), in the bitmap's coordinate space units.
+ Pixels outside the <a href="#output-bitmap" id="pixel-manipulation:output-bitmap-2">output bitmap</a> must be set to transparent black. Pixel values
+ must not be premultiplied by alpha.</p>
+
+ <p>When the user agent is required to <dfn id="create-an-imagedata-object">create an <code>ImageData</code> object</dfn>, given a
+ positive integer number of rows <var>rows</var>, a positive integer number of pixels per row
+ <var>pixelsPerRow</var>, and an optional <code id="pixel-manipulation:idl-uint8clampedarray-4"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> <var>source</var>, it must run these
+ steps:</p>
+
+ <ol><li><p>Let <var>imageData</var> be a new uninitialized <code id="pixel-manipulation:imagedata-17"><a href="#imagedata">ImageData</a></code> object.</p></li><li><p>If <var>source</var> is specified, then assign the <dfn id="dom-imagedata-data-2"><code>data</code></dfn> attribute of <var>imageData</var> to
+ <var>source</var>.</p></li><li>
+ <p>If <var>source</var> is not specified, then initialize the <code id="pixel-manipulation:dom-imagedata-data-2"><a href="#dom-imagedata-data-2">data</a></code> attribute of <var>imageData</var> to a new <code id="pixel-manipulation:idl-uint8clampedarray-5"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> object. The <code id="pixel-manipulation:idl-uint8clampedarray-6"><a data-x-internal="idl-uint8clampedarray" href="https://heycam.github.io/webidl/#idl-Uint8ClampedArray">Uint8ClampedArray</a></code> object must use a new <a href="#canvas-pixel-arraybuffer" id="pixel-manipulation:canvas-pixel-arraybuffer">Canvas
+ Pixel <code>ArrayBuffer</code></a> for its storage, and must have a
+ zero start offset and a length equal to the length of its storage, in bytes. The <a href="#canvas-pixel-arraybuffer" id="pixel-manipulation:canvas-pixel-arraybuffer-2">Canvas
+ Pixel <code>ArrayBuffer</code></a> must have the correct size to
+ store <var>rows</var> × <var>pixelsPerRow</var> pixels.</p>
+
+ <p>If the <a href="#canvas-pixel-arraybuffer" id="pixel-manipulation:canvas-pixel-arraybuffer-3">Canvas Pixel <code>ArrayBuffer</code></a> cannot be
+ allocated, then rethrow the <code id="pixel-manipulation:js-rangeerror"><a data-x-internal="js-rangeerror" href="https://tc39.github.io/ecma262/#sec-native-error-types-used-in-this-standard-rangeerror">RangeError</a></code> thrown by JavaScript,
+ and abort these steps.</p>
+ </li><li><p>Initialize the <dfn id="dom-imagedata-width-2"><code>width</code></dfn> attribute of
+ <var>imageData</var> to <var>pixelsPerRow</var>.</p></li><li><p>Initialize the <dfn id="dom-imagedata-height-2"><code>height</code></dfn> attribute of
+ <var>imageData</var> to <var>rows</var>.</p></li><li><p>Return <var>imageData</var>.</p></li></ol>
+
+ <p><code id="pixel-manipulation:imagedata-18"><a href="#imagedata">ImageData</a></code> objects are <a href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable-objects" id="pixel-manipulation:serializable-objects">serializable objects</a>. Their <a href="https://html.spec.whatwg.org/multipage/structured-data.html#serialization-steps" id="pixel-manipulation:serialization-steps">serialization
+ steps</a>, given <var>value</var> and <var>serialized</var>, are:</p>
+
+ <ol><li><p>Set <var>serialized</var>.[[Data]] to the <a href="https://html.spec.whatwg.org/multipage/structured-data.html#sub-serialization" id="pixel-manipulation:sub-serialization">sub-serialization</a> of the value of
+ <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-data-2-2"><a href="#dom-imagedata-data-2">data</a></code> attribute.</p></li><li><p>Set <var>serialized</var>.[[Width]] to the value of <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-width-2-2"><a href="#dom-imagedata-width-2">width</a></code> attribute.</p></li><li><p>Set <var>serialized</var>.[[Height]] to the value of <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-height-2-2"><a href="#dom-imagedata-height-2">height</a></code> attribute.</p></li></ol>
+
+ <p>Their <a href="https://html.spec.whatwg.org/multipage/structured-data.html#deserialization-steps" id="pixel-manipulation:deserialization-steps">deserialization steps</a>, given <var>serialized</var> and <var>value</var>,
+ are:</p>
+
+ <ol><li><p>Initialize <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-data-2-3"><a href="#dom-imagedata-data-2">data</a></code> attribute
+ to the <a href="https://html.spec.whatwg.org/multipage/structured-data.html#sub-deserialization" id="pixel-manipulation:sub-deserialization">sub-deserialization</a> of <var>serialized</var>.[[Data]].</p></li><li><p>Initialize <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-width-2-3"><a href="#dom-imagedata-width-2">width</a></code> attribute
+ to <var>serialized</var>.[[Width]].</p></li><li><p>Initialize <var>value</var>'s <code id="pixel-manipulation:dom-imagedata-height-2-3"><a href="#dom-imagedata-height-2">height</a></code> attribute
+ to <var>serialized</var>.[[Height]].</p></li></ol>
+
+ <p>A <dfn id="canvas-pixel-arraybuffer">Canvas Pixel <code>ArrayBuffer</code></dfn> is an <code id="pixel-manipulation:idl-arraybuffer"><a data-x-internal="idl-arraybuffer" href="https://heycam.github.io/webidl/#idl-ArrayBuffer">ArrayBuffer</a></code> whose data is represented in left-to-right order, row
+ by row top to bottom, starting with the top left, with each pixel's red, green, blue, and alpha
+ components being given in that order for each pixel. Each component of each pixel represented in
+ this array must be in the range 0..255, representing the 8 bit value for that component. The
+ components must be assigned consecutive indices starting with 0 for the top left pixel's red
+ component.</p>
+
+ <p>The <dfn id="dom-context-2d-putimagedata-2"><code>putImageData()</code></dfn> method writes
+ data from <code id="pixel-manipulation:imagedata-19"><a href="#imagedata">ImageData</a></code> structures back to the rendering context's <a href="#output-bitmap" id="pixel-manipulation:output-bitmap-3">output
+ bitmap</a>. Its arguments are: <var>imagedata</var>, <var>dx</var>, <var>dy</var>,
+ <var>dirtyX</var>, <var>dirtyY</var>, <var>dirtyWidth</var>, and <var>dirtyHeight</var>.</p>
+
+ <p>When the last four arguments to this method are omitted, they must be assumed to have the
+ values 0, 0, the <code id="pixel-manipulation:dom-imagedata-width-2-4"><a href="#dom-imagedata-width-2">width</a></code> member of the <var>imagedata</var> structure, and the <code id="pixel-manipulation:dom-imagedata-height-2-4"><a href="#dom-imagedata-height-2">height</a></code>
+ member of the <var>imagedata</var> structure, respectively.</p>
+
+ <p>The method, when invoked, must act as follows:</p>
- <p>If <span title=""><var title="">dirtyY</var>+<var title="">dirtyHeight</var></span> is greater than the <code title="dom-imagedata-height"><a href="#dom-imagedata-height">height</a></code> attribute of the <var title="">imagedata</var> argument, let <var title="">dirtyHeight</var> be the value of that <code title="dom-imagedata-height"><a href="#dom-imagedata-height">height</a></code> attribute, minus the
- value of <var title="">dirtyY</var>.</p>
+ <ol><li>
- </li>
+ <p>If <var>imagedata</var>'s <code id="pixel-manipulation:dom-imagedata-data-2-4"><a href="#dom-imagedata-data-2">data</a></code> attribute value's
+ <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="pixel-manipulation:detached-2">[[Detached]]</a> internal slot value is true, then throw an
+ <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="pixel-manipulation:invalidstateerror-3">&quot;<code>InvalidStateError</code>&quot;</a> <code id="pixel-manipulation:domexception-12"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+ steps.</p>
- <li>
+ </li><li>
- <p>If, after those changes, either <var title="">dirtyWidth</var>
- or <var title="">dirtyHeight</var> is negative or zero, stop these
- steps without affecting the canvas.</p>
+ <p>If <var>dirtyWidth</var> is negative, then let <var>dirtyX</var> be <span><var>dirtyX</var>+<var>dirtyWidth</var></span>, and let <var>dirtyWidth</var> be equal
+ to the absolute magnitude of <var>dirtyWidth</var>.</p>
- </li>
+ <p>If <var>dirtyHeight</var> is negative, then let <var>dirtyY</var> be <span><var>dirtyY</var>+<var>dirtyHeight</var></span>, and let <var>dirtyHeight</var> be
+ equal to the absolute magnitude of <var>dirtyHeight</var>.</p>
- <li><p>Otherwise, for all integer values of <var title="">x</var>
- and <var title="">y</var> where <span title=""><var title="">dirtyX</var> ≤ <var title="">x</var> &lt; <span title=""><var title="">dirtyX</var>+<var title="">dirtyWidth</var></span></span>
- and <span title=""><var title="">dirtyY</var> ≤ <var title="">y</var> &lt; <span title=""><var title="">dirtyY</var>+<var title="">dirtyHeight</var></span></span>, copy the four channels of
- the pixel with coordinate (<var title="">x</var>, <var title="">y</var>) in the <var title="">imagedata</var> data
- structure to the pixel with coordinate (<span title=""><var title="">dx<sub>device</sub></var>+<var title="">x</var></span>,
- <span title=""><var title="">dy<sub>device</sub></var>+<var title="">y</var></span>) in the underlying pixel data of the
- canvas.</p></li>
+ </li><li>
- </ol><p>The handling of pixel rounding when the specified coordinates do
- not exactly map to the device coordinate space is not defined by
- this specification, except that the following must result in no
- visible changes to the rendering:</p>
+ <p>If <var>dirtyX</var> is negative, then let <var>dirtyWidth</var> be <span><var>dirtyWidth</var>+<var>dirtyX</var></span>, and let <var>dirtyX</var> be zero.</p>
- <pre>context.putImageData(context.getImageData(x, y, w, h), p, q);</pre>
+ <p>If <var>dirtyY</var> is negative, then let <var>dirtyHeight</var> be <span><var>dirtyHeight</var>+<var>dirtyY</var></span>, and let <var>dirtyY</var> be zero.</p>
- <p>...for any value of <var title="">x</var>, <var title="">y</var>,
- <var title="">w</var>, and <var title="">h</var> and where <var title="">p</var> is the smaller of <var title="">x</var> and the sum
- of <var title="">x</var> and <var title="">w</var>, and <var title="">q</var> is the smaller of <var title="">y</var> and the sum
- of <var title="">y</var> and <var title="">h</var>; and except that
- the following two calls:</p>
+ </li><li>
- <pre>context.createImageData(w, h);
-context.getImageData(0, 0, w, h);</pre>
+ <p>If <var>dirtyX</var>+<var>dirtyWidth</var> is greater than the <code id="pixel-manipulation:dom-imagedata-width-2-5"><a href="#dom-imagedata-width-2">width</a></code> attribute of the <var>imagedata</var> argument, then
+ let <var>dirtyWidth</var> be the value of that <code id="pixel-manipulation:dom-imagedata-width-2-6"><a href="#dom-imagedata-width-2">width</a></code>
+ attribute, minus the value of <var>dirtyX</var>.</p>
- <p>...must return <code><a href="#imagedata">ImageData</a></code> objects with the same
- dimensions, for any value of <var title="">w</var> and <var title="">h</var>. In other words, while user agents may round the
- arguments of these methods so that they map to device pixel
- boundaries, any rounding performed must be performed consistently
- for all of the <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">createImageData()</a></code>, <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> and <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData()</a></code>
- operations.</p>
+ <p>If <var>dirtyY</var>+<var>dirtyHeight</var> is greater than the <code id="pixel-manipulation:dom-imagedata-height-2-5"><a href="#dom-imagedata-height-2">height</a></code> attribute of the <var>imagedata</var> argument, then
+ let <var>dirtyHeight</var> be the value of that <code id="pixel-manipulation:dom-imagedata-height-2-6"><a href="#dom-imagedata-height-2">height</a></code> attribute, minus the value of <var>dirtyY</var>.</p>
- <p class="note">Due to the lossy nature of converting to and from
- premultiplied alpha color values, pixels that have just been set
- using <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData()</a></code> might be
- returned to an equivalent <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> as
- different values.</p>
+ </li><li>
- <p>The current path, <a href="#transformations" title="dom-context-2d-transformation">transformation matrix</a>,
- <a href="#shadows" title="shadows">shadow attributes</a>, <a href="#dom-context-2d-globalalpha" title="dom-context-2d-globalAlpha">global alpha</a>, the <a href="#clipping-region" title="clipping region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation" title="dom-context-2d-globalCompositeOperation">global composition
- operator</a> must not affect the <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> and <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData()</a></code>
- methods.</p>
+ <p>If, after those changes, either <var>dirtyWidth</var> or <var>dirtyHeight</var> are negative
+ or zero, then abort these steps without affecting any bitmaps.</p>
- </div>
+ </li><li><p>For all integer values of <var>x</var> and <var>y</var> where <span><var>dirtyX</var> ≤ <var>x</var> &lt; <span><var>dirtyX</var>+<var>dirtyWidth</var></span></span> and <span><var>dirtyY</var> ≤ <var>y</var> &lt; <span><var>dirtyY</var>+<var>dirtyHeight</var></span></span>, copy the
+ four channels of the pixel with coordinate (<var>x</var>, <var>y</var>) in
+ the <var>imagedata</var> data structure's <a href="#canvas-pixel-arraybuffer" id="pixel-manipulation:canvas-pixel-arraybuffer-4">Canvas Pixel
+ <code>ArrayBuffer</code></a> to the pixel with coordinate (<span><var>dx</var>+<var>x</var></span>, <var>dy</var>+<var>y</var>)
+ in the rendering context's <a href="#output-bitmap" id="pixel-manipulation:output-bitmap-4">output bitmap</a>.</p></li></ol>
- <div class="example">
+ <p class="note">Due to the lossy nature of converting to and from premultiplied alpha color
+ values, pixels that have just been set using <code id="pixel-manipulation:dom-context-2d-putimagedata-2"><a href="#dom-context-2d-putimagedata-2">putImageData()</a></code> might be returned to an equivalent
+ <code id="pixel-manipulation:dom-context-2d-getimagedata-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code> as different values.</p>
+
+ <p>The current path, <a href="#transformations" id="pixel-manipulation:transformations">transformation matrix</a>,
+ <a href="#shadows" id="pixel-manipulation:shadows">shadow attributes</a>, <a href="#dom-context-2d-globalalpha-2" id="pixel-manipulation:dom-context-2d-globalalpha-2-2">global
+ alpha</a>, the <a href="#clipping-region" id="pixel-manipulation:clipping-region">clipping region</a>, and <a href="#dom-context-2d-globalcompositeoperation-2" id="pixel-manipulation:dom-context-2d-globalcompositeoperation-2-2">global composition operator</a> must not
+ affect the methods described in this section.</p>
- <p>The data returned by <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> is at the
- resolution of the canvas backing store, which is likely to not be
- one device pixel to each CSS pixel if the display used is a high
- resolution display.</p>
+
+
+ <div class="example">
- <p>In the following example, the script generates an
- <code><a href="#imagedata">ImageData</a></code> object so that it can draw onto it.</p>
+ <p>In the following example, the script generates an <code id="pixel-manipulation:imagedata-20"><a href="#imagedata">ImageData</a></code> object so that it can
+ draw onto it.</p>
<pre>// canvas is a reference to a &lt;canvas&gt; element
var context = canvas.getContext('2d');
@@ -3348,11 +3318,11 @@ function AddCloud(data, x, y) { ... }</pre>
<div class="example">
- <p>Here is an example of using <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> and <code title="dom-context-2d-putImageData"><a href="#dom-context-2d-putimagedata">putImageData()</a></code> to
- implement an edge detection filter.</p>
+ <p>Here is an example of using <code id="pixel-manipulation:dom-context-2d-getimagedata-2-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code> and <code id="pixel-manipulation:dom-context-2d-putimagedata-2-2"><a href="#dom-context-2d-putimagedata-2">putImageData()</a></code> to implement an edge detection
+ filter.</p>
<pre>&lt;!DOCTYPE HTML&gt;
-&lt;html&gt;
+&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
&lt;title&gt;Edge detection demo&lt;/title&gt;
&lt;script&gt;
@@ -3375,9 +3345,9 @@ function AddCloud(data, x, y) { ... }</pre>
var output = context.createImageData(canvas.width, canvas.height);
// alias some variables for convenience
- // notice that we are using input.width and input.height here
- // as they might not be the same as canvas.width and canvas.height
- // (in particular, they might be different on high-res displays)
+ // In this case input.width and input.height
+ // match canvas.width and canvas.height
+ // but we'll use the former to keep the code generic.
var w = input.width, h = input.height;
var inputData = input.data;
var outputData = output.data;
@@ -3408,102 +3378,322 @@ function AddCloud(data, x, y) { ... }</pre>
</div>
- <div class="impl">
- <h6 id="drawing-model"><span class="secno">4.8.11.1.12 </span><dfn>Drawing model</dfn></h6>
- <p>When a shape or image is painted, user agents must follow these
- steps, in the order given (or act as if they do):</p>
+ <h6 id="compositing"><span class="secno">4.12.5.1.16</span> Compositing<a class="self-link" href="#compositing"/></h6>
- <ol><li><p>Render the shape or image onto an infinite transparent black
- bitmap, creating image <var title="">A</var>, as described in the
- previous sections. For shapes, the current fill, stroke, and line
- styles must be honored, and the stroke must itself also be
- subjected to the current transformation matrix.</p></li>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-globalalpha"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code> [ = <var>value</var> ]</dt><dd>
- <li><p><a href="#when-shadows-are-drawn">When shadows are drawn</a>, render the shadow from
- image <var title="">A</var>, using the current shadow styles,
- creating image <var title="">B</var>.</p></li>
+ <p>Returns the current alpha value applied to rendering operations.</p>
- <li><p><a href="#when-shadows-are-drawn">When shadows are drawn</a>, multiply the alpha
- component of every pixel in <var title="">B</var> by <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code>.</p></li>
+ <p>Can be set, to change the alpha value. Values outside of the range 0.0 .. 1.0 are
+ ignored.</p>
- <li><p><a href="#when-shadows-are-drawn">When shadows are drawn</a>, composite <var title="">B</var> within the <a href="#clipping-region">clipping region</a> over the
- current canvas bitmap using the current composition
- operator.</p></li>
+ </dd><dt><var>context</var> . <code id="dom-context-2d-globalcompositeoperation"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code> [ = <var>value</var> ]</dt><dd>
- <li><p>Multiply the alpha component of every pixel in <var title="">A</var> by <code title="dom-context-2d-globalAlpha"><a href="#dom-context-2d-globalalpha">globalAlpha</a></code>.</p></li>
+ <p>Returns the current composition operation, from the values defined in the Compositing and
+ Blending specification. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCOMPOSITE">[COMPOSITE]</a>.</p>
- <li><p>Composite <var title="">A</var> within the <a href="#clipping-region">clipping
- region</a> over the current canvas bitmap using the current
- composition operator.</p></li>
+ <p>Can be set, to change the composition operation. Unknown values are ignored.</p>
- </ol></div>
+ </dd></dl><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="bugs"><strong>Spec bugs:</strong> <a href="https://www.w3.org/Bugs/Public/show_bug.cgi?id=27313" title="It seems like this should be defined in terms of an IDL enum. If not, please clarify the relationshi [...]">27313</a></p></div>
+
- <h6 id="best-practices"><span class="secno">4.8.11.1.13 </span>Best practices</h6>
+ <p>All drawing operations on an object which implements the <code id="compositing:canvascompositing"><a href="#canvascompositing">CanvasCompositing</a></code>
+ interface are affected by the global compositing attributes, <code id="compositing:dom-context-2d-globalalpha-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code> and <code id="compositing:dom-context-2d-globalcompositeoperation-2"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code>.</p>
- <p><i>This section is non-normative.</i></p>
+
- <p>When a canvas is interactive, authors should include focusable
- elements in the element's fallback content corresponding to each
- focusable part of the canvas, as in the <a href="#drawCustomFocusRingExample">example above</a>.</p>
+ <p>The <dfn id="dom-context-2d-globalalpha-2"><code>globalAlpha</code></dfn> attribute gives an
+ alpha value that is applied to shapes and images before they are composited onto the <a href="#output-bitmap" id="compositing:output-bitmap">output
+ bitmap</a>. The value must be in the range from 0.0 (fully transparent) to 1.0 (no additional
+ transparency). If an attempt is made to set the attribute to a value outside this range, including
+ Infinity and Not-a-Number (NaN) values, then the attribute must retain its previous value. When
+ the context is created, the <code id="compositing:dom-context-2d-globalalpha-2-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code> attribute
+ must initially have the value 1.0.</p>
- <p>To indicate which focusable part of the canvas is currently
- focused, authors should use the <code title="dom-context-2d-drawSystemFocusRing"><a href="#dom-context-2d-drawsystemfocusring">drawSystemFocusRing()</a></code>
- method, passing it the element for which a ring is being drawn. This
- method only draws the focus ring if the element is focused, so that
- it can simply be called whenever drawing the element, without
- checking whether the element is focused or not first.</p>
+ <p>The <dfn id="dom-context-2d-globalcompositeoperation-2"><code>globalCompositeOperation</code></dfn> attribute
+ sets the <dfn id="current-composition-operator">current composition operator</dfn>, which controls how shapes and images are drawn onto the
+ <a href="#output-bitmap" id="compositing:output-bitmap-2">output bitmap</a>, once they have had <code id="compositing:dom-context-2d-globalalpha-2-3"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code> and the current transformation matrix
+ applied. The possible values are those defined in the Compositing and Blending specification, and
+ include the values <dfn id="gcop-source-over"><code>source-over</code></dfn>
+ and <dfn id="gcop-copy"><code>copy</code></dfn>.
+ <a href="https://html.spec.whatwg.org/multipage/references.html#refsCOMPOSITE">[COMPOSITE]</a></p>
+
+ <p>These values are all case-sensitive — they must be used exactly as defined. User agents
+ must not recognize values that are not a <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#case-sensitive" id="compositing:case-sensitive">case-sensitive</a> match for one of the values
+ given in the Compositing and Blending specification. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCOMPOSITE">[COMPOSITE]</a></p>
+
+ <p>On setting, if the user agent does not recognize the specified value, it must be ignored,
+ leaving the value of <code id="compositing:dom-context-2d-globalcompositeoperation-2-2"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code> unaffected.
+ Otherwise, the attribute must be set to the given new value.</p>
+
+ <p>When the context is created, the <code id="compositing:dom-context-2d-globalcompositeoperation-2-3"><a href="#dom-context-2d-globalcompositeoperation-2">globalCompositeOperation</a></code> attribute must
+ initially have the value <code id="compositing:gcop-source-over"><a href="#gcop-source-over">source-over</a></code>.</p>
+
+
+
+
+
+ <h6 id="image-smoothing"><span class="secno">4.12.5.1.17</span> Image smoothing<a class="self-link" href="#image-smoothing"/></h6>
+
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-imagesmoothingenabled"><a href="#dom-context-2d-imagesmoothingenabled-2">imageSmoothingEnabled</a></code> [ = <var>value</var> ]</dt><dd>
+
+ <p>Returns whether pattern fills and the <code id="image-smoothing:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method will attempt to smooth images if
+ their pixels don't line up exactly with the display, when scaling images up.</p>
+
+ <p>Can be set, to change whether images are smoothed (true) or not (false).</p>
+
+ </dd><dt><var>context</var> . <code id="dom-context-2d-imagesmoothingquality"><a href="#dom-context-2d-imagesmoothingquality-2">imageSmoothingQuality</a></code> [ = <var>value</var> ]</dt><dd>
+
+ <p>Returns the current image-smoothing-quality preference.</p>
+
+ <p>Can be set, to change the preferred quality of image smoothing. The possible values are
+ &quot;<code id="image-smoothing:dom-context-2d-imagesmoothingquality-low"><a href="#dom-context-2d-imagesmoothingquality-low">low</a></code>&quot;, &quot;<code id="image-smoothing:dom-context-2d-imagesmoothingquality-medium"><a href="#dom-context-2d-imagesmoothingquality-medium">medium</a></code>&quot; and &quot;<code id="image-smoothing:dom-context-2d-imagesmoothingquality-high"><a href="#dom-context-2d-imagesmoothingquality-high">high</a></code>&quot;. Unknown values are ignored.</p>
+
+ </dd></dl>
+
+
+
+ <p>Objects that implement the <code id="image-smoothing:canvasimagesmoothing"><a href="#canvasimagesmoothing">CanvasImageSmoothing</a></code> interface have attributes that
+ control how image smoothing is performed.</p>
+
+ <p>The <dfn id="dom-context-2d-imagesmoothingenabled-2"><code>imageSmoothingEnabled</code></dfn>
+ attribute, on getting, must return the last value it was set to. On setting, it must be set to the
+ new value. When the object implementing the <code id="image-smoothing:canvasimagesmoothing-2"><a href="#canvasimagesmoothing">CanvasImageSmoothing</a></code> interface is
+ created, the attribute must be set to true.</p>
+
+ <p>The <dfn id="dom-context-2d-imagesmoothingquality-2"><code>imageSmoothingQuality</code></dfn>
+ attribute, on getting, must return the last value it was set to. On setting, it must be set to the
+ new value. When the object implementing the <code id="image-smoothing:canvasimagesmoothing-3"><a href="#canvasimagesmoothing">CanvasImageSmoothing</a></code> interface is
+ created, the attribute must be set to &quot;<code id="image-smoothing:dom-context-2d-imagesmoothingquality-low-2"><a href="#dom-context-2d-imagesmoothingquality-low">low</a></code>&quot;.</p>
+
+
+
+
+ <h6 id="shadows"><span class="secno">4.12.5.1.18</span> <dfn>Shadows</dfn><a class="self-link" href="#shadows"/></h6>
+
+ <p>All drawing operations on an object which implements the <code id="shadows:canvasshadowstyles"><a href="#canvasshadowstyles">CanvasShadowStyles</a></code>
+ interface are affected by the four global shadow attributes.</p>
+
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-shadowcolor"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code> [ = <var>value</var> ]</dt><dd>
+
+ <p>Returns the current shadow color.</p>
+
+ <p>Can be set, to change the shadow color. Values that cannot be parsed as CSS colors are ignored.</p>
+
+ </dd><dt><var>context</var> . <code id="dom-context-2d-shadowoffsetx"><a href="#dom-context-2d-shadowoffsetx-2">shadowOffsetX</a></code> [ = <var>value</var> ]</dt><dt><var>context</var> . <code id="dom-context-2d-shadowoffsety"><a href="#dom-context-2d-shadowoffsety-2">shadowOffsetY</a></code> [ = <var>value</var> ]</dt><dd>
+
+ <p>Returns the current shadow offset.</p>
+
+ <p>Can be set, to change the shadow offset. Values that are not finite numbers are ignored.</p>
+
+ </dd><dt><var>context</var> . <code id="dom-context-2d-shadowblur"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code> [ = <var>value</var> ]</dt><dd>
+
+ <p>Returns the current level of blur applied to shadows.</p>
+
+ <p>Can be set, to change the blur level. Values that are not finite numbers greater than or
+ equal to zero are ignored.</p>
+
+ </dd></dl>
+
+
+
+ <p>The <dfn id="dom-context-2d-shadowcolor-2"><code>shadowColor</code></dfn> attribute sets the
+ color of the shadow.</p>
+
+ <p>When the context is created, the <code id="shadows:dom-context-2d-shadowcolor-2"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code>
+ attribute initially must be fully-transparent black.</p>
+
+ <p>On getting, the <a href="#serialisation-of-a-color" id="shadows:serialisation-of-a-color">serialization of the color</a>
+ must be returned.</p>
- <p>Authors should avoid implementing text editing controls using the
- <code><a href="#the-canvas-element">canvas</a></code> element. Doing so has a large number of
- disadvantages:</p>
+ <p>On setting, the new value must be <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="shadows:parsed-as-a-css-color-value">parsed as a CSS &lt;color&gt; value</a> and the
+ color assigned. If the value cannot be <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#parsed-as-a-css-color-value" id="shadows:parsed-as-a-css-color-value-2">parsed as a CSS &lt;color&gt; value</a> then it
+ must be ignored, and the attribute must retain its previous value. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCSSCOLOR">[CSSCOLOR]</a></p>
- <ul><li>Mouse placement of the caret has to be reimplemented.</li>
+ <p>The <dfn id="dom-context-2d-shadowoffsetx-2"><code>shadowOffsetX</code></dfn> and <dfn id="dom-context-2d-shadowoffsety-2"><code>shadowOffsetY</code></dfn> attributes specify the distance
+ that the shadow will be offset in the positive horizontal and positive vertical distance
+ respectively. Their values are in coordinate space units. They are not affected by the current
+ transformation matrix.</p>
- <li>Keyboard movement of the caret has to be reimplemented (possibly across lines, for multiline text input).</li>
+ <p>When the context is created, the shadow offset attributes must initially have the value
+ 0.</p>
- <li>Scrolling of the text field has to be implemented (horizontally for long lines, vertically for multiline input).</li>
+ <p>On getting, they must return their current value. On setting, the attribute being set must be
+ set to the new value, except if the value is infinite or NaN, in which case the new value must be
+ ignored.</p>
- <li>Native features such as copy-and-paste have to be reimplemented.</li>
+ <p>The <dfn id="dom-context-2d-shadowblur-2"><code>shadowBlur</code></dfn> attribute specifies
+ the level of the blurring effect. (The units do not map to coordinate space units, and are not
+ affected by the current transformation matrix.)</p>
- <li>Native features such as spell-checking have to be reimplemented.</li>
+ <p>When the context is created, the <code id="shadows:dom-context-2d-shadowblur-2"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code>
+ attribute must initially have the value 0.</p>
- <li>Native features such as drag-and-drop have to be reimplemented.</li>
+ <p>On getting, the attribute must return its current value. On setting the attribute must be set
+ to the new value, except if the value is negative, infinite or NaN, in which case the new value
+ must be ignored.</p>
- <li>Native features such as page-wide text search have to be reimplemented.</li>
+ <p><dfn id="when-shadows-are-drawn">Shadows are only drawn if</dfn> the opacity component of
+ the alpha component of the color of <code id="shadows:dom-context-2d-shadowcolor-2-2"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code> is
+ non-zero and either the <code id="shadows:dom-context-2d-shadowblur-2-2"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code> is non-zero, or
+ the <code id="shadows:dom-context-2d-shadowoffsetx-2"><a href="#dom-context-2d-shadowoffsetx-2">shadowOffsetX</a></code> is non-zero, or the <code id="shadows:dom-context-2d-shadowoffsety-2"><a href="#dom-context-2d-shadowoffsety-2">shadowOffsetY</a></code> is non-zero.</p>
- <li>Native features specific to the user, for example custom text
- services, have to be reimplemented. This is close to impossible
- since each user might have different services installed, and there
- is an unbounded set of possible such services.</li>
+ <p><a href="#when-shadows-are-drawn" id="shadows:when-shadows-are-drawn">When shadows are drawn</a>, they must be rendered as follows:</p>
- <li>Bidirectional text editing has to be reimplemented.</li>
+ <ol><li><p>Let <var>A</var> be an infinite transparent black bitmap on which the source
+ image for which a shadow is being created has been rendered.</p></li><li><p>Let <var>B</var> be an infinite transparent black bitmap, with a coordinate
+ space and an origin identical to <var>A</var>.</p></li><li><p>Copy the alpha channel of <var>A</var> to <var>B</var>, offset by <code id="shadows:dom-context-2d-shadowoffsetx-2-2"><a href="#dom-context-2d-shadowoffsetx-2">shadowOffsetX</a></code> in the positive <var>x</var>
+ direction, and <code id="shadows:dom-context-2d-shadowoffsety-2-2"><a href="#dom-context-2d-shadowoffsety-2">shadowOffsetY</a></code> in the positive
+ <var>y</var> direction.</p></li><li>
- <li>For multiline text editing, line wrapping has to be implemented for all relevant languages.</li>
+ <p>If <code id="shadows:dom-context-2d-shadowblur-2-3"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code> is greater than 0:</p>
- <li>Text selection has to be reimplemented.</li>
+ <ol><li> <p>Let <var>σ</var> be half the value of <code id="shadows:dom-context-2d-shadowblur-2-4"><a href="#dom-context-2d-shadowblur-2">shadowBlur</a></code>.</p></li><li> <p>Perform a 2D Gaussian Blur on <var>B</var>, using <var>σ</var>
+ as the standard deviation.</p> </li></ol>
- <li>Dragging of bidirectional text selections has to be reimplemented.</li>
+ <p>User agents may limit values of <var>σ</var> to an implementation-specific
+ maximum value to avoid exceeding hardware limitations during the Gaussian blur operation.</p>
- <li>Platform-native keyboard shortcuts have to be reimplemented.</li>
+ </li><li><p>Set the red, green, and blue components of every pixel in <var>B</var> to the
+ red, green, and blue components (respectively) of the color of <code id="shadows:dom-context-2d-shadowcolor-2-3"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code>.</p></li><li><p>Multiply the alpha component of every pixel in <var>B</var> by the alpha
+ component of the color of <code id="shadows:dom-context-2d-shadowcolor-2-4"><a href="#dom-context-2d-shadowcolor-2">shadowColor</a></code>.</p></li><li><p>The shadow is in the bitmap <var>B</var>, and is rendered as part of the
+ <a href="#drawing-model" id="shadows:drawing-model">drawing model</a> described below.</p></li></ol>
- <li>Platform-native input method editors (IMEs) have to be reimplemented.</li>
+
- <li>Undo and redo functionality has to be reimplemented.</li>
+ <p>If the current composition operation is <code id="shadows:gcop-copy"><a href="#gcop-copy">copy</a></code>, then shadows
+ effectively won't render (since the shape will overwrite the shadow).</p>
- <li>Accessibility features such as magnification following the
- caret or selection have to be reimplemented.</li>
+ <h6 id="filters"><span class="secno">4.12.5.1.19</span> Filters<a class="self-link" href="#filters"/></h6>
- </ul><p>This is a huge amount of work, and authors are most strongly
- encouraged to avoid doing any of it by instead using the
- <code><a href="#the-input-element">input</a></code> element, the <code><a href="#the-textarea-element">textarea</a></code> element, or
- the <code title="attr-contenteditable"><a href="#attr-contenteditable">contenteditable</a></code>
+ <p>All drawing operations on an object which implements the <code id="filters:canvasfilters"><a href="#canvasfilters">CanvasFilters</a></code>
+ interface are affected by the global <dfn id="dom-context-2d-filter"><code>filter</code></dfn>
attribute.</p>
+ <dl class="domintro"><dt><var>context</var> . <code id="dom-context-2d-filter-2"><a href="#dom-context-2d-filter">filter</a></code> [ = <var>value</var> ]</dt><dd>
+
+ <p>Returns the current filter.</p>
+
+ <p>Can be set, to change the filter. Values that cannot be parsed as a
+ <a data-x-internal="filter-function-list" href="https://drafts.fxtf.org/filters/#typedef-filter-function-list" id="filters:filter-function-list">&lt;filter-function-list&gt;</a> value are ignored.</p>
+
+ </dd></dl>
+
+
+
+ <p>The <code id="filters:dom-context-2d-filter"><a href="#dom-context-2d-filter">filter</a></code> attribute, on getting, must
+ return the last value it was successfully set to. The value must not be re-serialized. On setting,
+ if the new value is 'none' (not the empty string, null, or undefined), filters must be disabled
+ for the context. Otherwise, the value must be parsed as a
+ <a data-x-internal="filter-function-list" href="https://drafts.fxtf.org/filters/#typedef-filter-function-list" id="filters:filter-function-list-2">&lt;filter-function-list&gt;</a> value. If the value cannot be parsed as a
+ <a data-x-internal="filter-function-list" href="https://drafts.fxtf.org/filters/#typedef-filter-function-list" id="filters:filter-function-list-3">&lt;filter-function-list&gt;</a> value, where using property-independent style sheet
+ syntax like 'inherit' or 'initial' is considered an invalid value, then it must be ignored, and
+ the attribute must retain its previous value. When creating the object implementing the
+ <code id="filters:canvasfilters-2"><a href="#canvasfilters">CanvasFilters</a></code> interface, the attribute must be set to 'none'.</p>
+
+ <p>A <a data-x-internal="filter-function-list" href="https://drafts.fxtf.org/filters/#typedef-filter-function-list" id="filters:filter-function-list-4">&lt;filter-function-list&gt;</a> value consists of a sequence of one or more
+ filter functions or references to SVG filters. The input to the filter is used as the input
+ to the first item in the list. Subsequent items take the output of the previous item as
+ their input. <a href="https://html.spec.whatwg.org/multipage/references.html#refsFILTERS">[FILTERS]</a></p>
+
+ <p>Coordinates used in the value of the <code id="filters:dom-context-2d-filter-2"><a href="#dom-context-2d-filter">filter</a></code> attribute are interpreted such that one pixel is
+ equivalent to one SVG user space unit and to one canvas coordinate space unit. Filter coordinates
+ are not affected by the <a href="#transformations" id="filters:transformations">current transformation
+ matrix</a>. The current transformation matrix affects only the input to the filter. Filters
+ are applied in the <a href="#output-bitmap" id="filters:output-bitmap">output bitmap</a>'s coordinate space.</p>
+
+ <p>When the value of the <code id="filters:dom-context-2d-filter-3"><a href="#dom-context-2d-filter">filter</a></code> attribute defines
+ lengths using percentages or using <a data-x-internal="'em'" href="https://drafts.csswg.org/css-values/#em" id="filters:'em'">'em'</a> or <a data-x-internal="'ex'" href="https://drafts.csswg.org/css-values/#ex" id="filters:'ex'">'ex'</a> units, these must be
+ interpreted relative to the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="filters:computed-value">computed value</a> of the <a data-x-internal="'font-size'" href="https://drafts.csswg.org/css-fonts/#font-size-prop" id="filters:'font-size'">'font-size'</a> property
+ of the <a href="#font-style-source-object" id="filters:font-style-source-object">font style source object</a> at the time that the attribute is set, if it is an
+ element. If the <a data-x-internal="computed-value" href="https://drafts.csswg.org/css-cascade/#computed-value" id="filters:computed-value-2">computed values</a> are undefined for a
+ particular case (e.g. because the <a href="#font-style-source-object" id="filters:font-style-source-object-2">font style source object</a> is not an element or is
+ not <a href="https://html.spec.whatwg.org/multipage/rendering.html#being-rendered" id="filters:being-rendered">being rendered</a>), then the relative keywords must be interpreted relative to the
+ default value of the <code id="filters:dom-context-2d-font-2"><a href="#dom-context-2d-font-2">font</a></code> attribute. The 'larger' and
+ 'smaller' keywords are not supported.</p>
- <h6 id="examples"><span class="secno">4.8.11.1.14 </span>Examples</h6>
+ <p>If the value of the <code id="filters:dom-context-2d-filter-4"><a href="#dom-context-2d-filter">filter</a></code> attribute refers to an
+ SVG filter in the same document, and this SVG filter changes, then the changed filter is used for
+ the next draw operation.</p>
+
+ <p>If the value of the <code id="filters:dom-context-2d-filter-5"><a href="#dom-context-2d-filter">filter</a></code> attribute refers to an
+ SVG filter in an external resource document and that document is not loaded when a drawing
+ operation is invoked, then the drawing operation must proceed with no filtering.</p>
+
+
+
+ <h6 id="working-with-externally-defined-svg-filters"><span class="secno">4.12.5.1.20</span> Working with externally-defined SVG filters<a class="self-link" href="#working-with-externally-defined-svg-filters"/></h6>
+
+ <p><i>This section is non-normative.</i></p>
+
+ <p>Since drawing is performed using filter value 'none' until an externally-defined
+ filter has finished loading, authors might wish to determine whether such a filter
+ has finished loading before proceeding with a drawing operation. One way to accomplish
+ this is to load the externally-defined filter elsewhere within the same page in some
+ element that sends a <code>load</code> event (for example, an <a data-x-internal="svg-use" href="https://www.w3.org/TR/SVG11/struct.html#UseElement" id="working-with-externally-defined-svg-filters:svg-use">SVG
+ <code>use</code></a> element), and wait for the <code>load</code> event to be
+ dispatched.</p>
+
+
+
+ <h6 id="drawing-model"><span class="secno">4.12.5.1.21</span> <dfn>Drawing model</dfn><a class="self-link" href="#drawing-model"/></h6>
+
+ <p>When a shape or image is painted, user agents must follow these steps, in the order given (or
+ act as if they do):</p>
+
+ <ol><li><p>Render the shape or image onto an infinite transparent black bitmap, creating image <var>A</var>, as described in the previous sections. For shapes, the current fill, stroke,
+ and line styles must be honored, and the stroke must itself also be subjected to the current
+ transformation matrix.</p></li><li><p>When the filter attribute is set to a value other than 'none' and all the
+ externally-defined filters it references, if any, are in documents that are currently loaded,
+ then use image <var>A</var> as the input to the <code id="drawing-model:dom-context-2d-filter"><a href="#dom-context-2d-filter">filter</a></code>, creating image <var>B</var>. Otherwise, let
+ <var>B</var> be an alias for <var>A</var>.</p></li><li><p><a href="#when-shadows-are-drawn" id="drawing-model:when-shadows-are-drawn">When shadows are drawn</a>, render the shadow from image <var>B</var>,
+ using the current shadow styles, creating image <var>C</var>.</p></li><li><p><a href="#when-shadows-are-drawn" id="drawing-model:when-shadows-are-drawn-2">When shadows are drawn</a>, multiply the alpha component of every pixel in <var>C</var> by <code id="drawing-model:dom-context-2d-globalalpha-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code>.</p></li><li><p><a href="#when-shadows-are-drawn" id="drawing-model:when-shadows-are-drawn-3">When shadows are drawn</a>, composite <var>C</var> within the
+ <a href="#clipping-region" id="drawing-model:clipping-region">clipping region</a> over the current <a href="#output-bitmap" id="drawing-model:output-bitmap">output bitmap</a> using the <a href="#current-composition-operator" id="drawing-model:current-composition-operator">current
+ composition operator</a>.</p></li><li><p>Multiply the alpha component of every pixel in <var>B</var> by <code id="drawing-model:dom-context-2d-globalalpha-2-2"><a href="#dom-context-2d-globalalpha-2">globalAlpha</a></code>.</p></li><li><p>Composite <var>B</var> within the <a href="#clipping-region" id="drawing-model:clipping-region-2">clipping region</a> over the current
+ <a href="#output-bitmap" id="drawing-model:output-bitmap-2">output bitmap</a> using the <a href="#current-composition-operator" id="drawing-model:current-composition-operator-2">current composition operator</a>.</p></li></ol>
+
+ <p>When compositing onto the <a href="#output-bitmap" id="drawing-model:output-bitmap-3">output bitmap</a>, pixels that would fall outside of the
+ <a href="#output-bitmap" id="drawing-model:output-bitmap-4">output bitmap</a> must be discarded.</p>
+
+
+
+
+
+
+ <h6 id="best-practices"><span class="secno">4.12.5.1.22</span> Best practices<a class="self-link" href="#best-practices"/></h6>
+
+ <p>When a canvas is interactive, authors should include focusable elements in the element's
+ fallback content corresponding to each focusable part of the canvas, as in the <a href="#drawCustomFocusRingExample">example above</a>.</p>
+
+ <p>When rendering focus rings, to ensure that focus rings have the appearance of native focus
+ rings, authors should use the <code id="best-practices:dom-context-2d-drawfocusifneeded-2"><a href="#dom-context-2d-drawfocusifneeded-2">drawFocusIfNeeded()</a></code> method, passing it the
+ element for which a ring is being drawn. This method only draws the focus ring if the element is
+ <a href="https://html.spec.whatwg.org/multipage/interaction.html#focused" id="best-practices:focused">focused</a>, so that it can simply be called whenever drawing the element, without
+ checking whether the element is focused or not first.</p>
+
+ <p>In addition to drawing focus rings, authors should use the <code id="best-practices:dom-context-2d-scrollpathintoview-2"><a href="#dom-context-2d-scrollpathintoview-2">scrollPathIntoView()</a></code> method when an element in
+ the canvas is focused, to make sure it is visible on the screen (if applicable).</p>
+
+ <p id="no-text-editing-in-canvas-please">Authors should avoid implementing text editing controls
+ using the <code id="best-practices:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element. Doing so has a large number of disadvantages:</p>
+
+ <ul><li>Mouse placement of the caret has to be reimplemented.</li><li>Keyboard movement of the caret has to be reimplemented (possibly across lines, for multiline
+ text input).</li><li>Scrolling of the text control has to be implemented (horizontally for long lines, vertically
+ for multiline input).</li><li>Native features such as copy-and-paste have to be reimplemented.</li><li>Native features such as spell-checking have to be reimplemented.</li><li>Native features such as drag-and-drop have to be reimplemented.</li><li>Native features such as page-wide text search have to be reimplemented.</li><li>Native features specific to the user, for example custom text services, have to be
+ reimplemented. This is close to impossible since each user might have different services
+ installed, and there is an unbounded set of possible such services.</li><li>Bidirectional text editing has to be reimplemented.</li><li>For multiline text editing, line wrapping has to be implemented for all relevant
+ languages.</li><li>Text selection has to be reimplemented.</li><li>Dragging of bidirectional text selections has to be reimplemented.</li><li>Platform-native keyboard shortcuts have to be reimplemented.</li><li>Platform-native input method editors (IMEs) have to be reimplemented.</li><li>Undo and redo functionality has to be reimplemented.</li><li>Accessibility features such as magnification following the caret or selection have to be
+ reimplemented.</li></ul>
+
+ <p>This is a huge amount of work, and authors are most strongly encouraged to avoid doing any of
+ it by instead using the <code id="best-practices:the-input-element"><a href="https://html.spec.whatwg.org/multipage/input.html#the-input-element">input</a></code> element, the <code id="best-practices:the-textarea-element"><a href="https://html.spec.whatwg.org/multipage/form-elements.html#the-textarea-element">textarea</a></code> element, or the
+ <code id="best-practices:attr-contenteditable"><a href="https://html.spec.whatwg.org/multipage/interaction.html#attr-contenteditable">contenteditable</a></code> attribute.</p>
+
+
+ <h6 id="examples"><span class="secno">4.12.5.1.23</span> Examples<a class="self-link" href="#examples"/></h6>
<p><i>This section is non-normative.</i></p>
@@ -3554,140 +3744,835 @@ function AddCloud(data, x, y) { ... }</pre>
</div>
+ <div class="example">
+ <p>The 2D rendering context for <code id="examples:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> is often used for sprite-based games. The
+ following example demonstrates this:</p>
- </div><!--data-component-->
+ <iframe height="216" src="https://html.spec.whatwg.org/demos/canvas/blue-robot/index-idle.html" width="396"/>
- <!--2DCONTEXT-->
+ <p>Here is the source for this example:</p>
- <div class="impl">
+ <pre>&lt;!DOCTYPE HTML&gt;
+&lt;meta charset=&quot;utf-8&quot;&gt;
+&lt;title&gt;Blue Robot Demo&lt;/title&gt;
+&lt;style&gt;
+ html { overflow: hidden; min-height: 200px; min-width: 380px; }
+ body { height: 200px; position: relative; margin: 8px; }
+ .buttons { position: absolute; bottom: 0px; left: 0px; margin: 4px; }
+&lt;/style&gt;
+&lt;canvas width=&quot;380&quot; height=&quot;200&quot;&gt;&lt;/canvas&gt;
+&lt;script&gt;
+ var Landscape = function (context, width, height) {
+ this.offset = 0;
+ this.width = width;
+ this.advance = function (dx) {
+ this.offset += dx;
+ };
+ this.horizon = height * 0.7;
+ // This creates the sky gradient (from a darker blue to white at the bottom)
+ this.sky = context.createLinearGradient(0, 0, 0, this.horizon);
+ this.sky.addColorStop(0.0, 'rgb(55,121,179)');
+ this.sky.addColorStop(0.7, 'rgb(121,194,245)');
+ this.sky.addColorStop(1.0, 'rgb(164,200,214)');
+ // this creates the grass gradient (from a darker green to a lighter green)
+ this.earth = context.createLinearGradient(0, this.horizon, 0, height);
+ this.earth.addColorStop(0.0, 'rgb(81,140,20)');
+ this.earth.addColorStop(1.0, 'rgb(123,177,57)');
+ this.paintBackground = function (context, width, height) {
+ // first, paint the sky and grass rectangles
+ context.fillStyle = this.sky;
+ context.fillRect(0, 0, width, this.horizon);
+ context.fillStyle = this.earth;
+ context.fillRect(0, this.horizon, width, height-this.horizon);
+ // then, draw the cloudy banner
+ // we make it cloudy by having the draw text off the top of the
+ // canvas, and just having the blurred shadow shown on the canvas
+ context.save();
+ context.translate(width-((this.offset+(this.width*3.2)) % (this.width*4.0))+0, 0);
+ context.shadowColor = 'white';
+ context.shadowOffsetY = 30+this.horizon/3; // offset down on canvas
+ context.shadowBlur = '5';
+ context.fillStyle = 'white';
+ context.textAlign = 'left';
+ context.textBaseline = 'top';
+ context.font = '20px sans-serif';
+ context.fillText('WHATWG ROCKS', 10, -30); // text up above canvas
+ context.restore();
+ // then, draw the background tree
+ context.save();
+ context.translate(width-((this.offset+(this.width*0.2)) % (this.width*1.5))+30, 0);
+ context.beginPath();
+ context.fillStyle = 'rgb(143,89,2)';
+ context.lineStyle = 'rgb(10,10,10)';
+ context.lineWidth = 2;
+ context.rect(0, this.horizon+5, 10, -50); // trunk
+ context.fill();
+ context.stroke();
+ context.beginPath();
+ context.fillStyle = 'rgb(78,154,6)';
+ context.arc(5, this.horizon-60, 30, 0, Math.PI*2); // leaves
+ context.fill();
+ context.stroke();
+ context.restore();
+ };
+ this.paintForeground = function (context, width, height) {
+ // draw the box that goes in front
+ context.save();
+ context.translate(width-((this.offset+(this.width*0.7)) % (this.width*1.1))+0, 0);
+ context.beginPath();
+ context.rect(0, this.horizon - 5, 25, 25);
+ context.fillStyle = 'rgb(220,154,94)';
+ context.lineStyle = 'rgb(10,10,10)';
+ context.lineWidth = 2;
+ context.fill();
+ context.stroke();
+ context.restore();
+ };
+ };
+&lt;/script&gt;
+&lt;script&gt;
+ var BlueRobot = function () {
+ this.sprites = new Image();
+ this.sprites.src = 'blue-robot.png'; // this sprite sheet has 8 cells
+ this.targetMode = 'idle';
+ this.walk = function () {
+ this.targetMode = 'walk';
+ };
+ this.stop = function () {
+ this.targetMode = 'idle';
+ };
+ this.frameIndex = {
+ 'idle': [0], // first cell is the idle frame
+ 'walk': [1,2,3,4,5,6], // the walking animation is cells 1-6
+ 'stop': [7], // last cell is the stopping animation
+ };
+ this.mode = 'idle';
+ this.frame = 0; // index into frameIndex
+ this.tick = function () {
+ // this advances the frame and the robot
+ // the return value is how many pixels the robot has moved
+ this.frame += 1;
+ if (this.frame &gt;= this.frameIndex[this.mode].length) {
+ // we've reached the end of this animation cycle
+ this.frame = 0;
+ if (this.mode != this.targetMode) {
+ // switch to next cycle
+ if (this.mode == 'walk') {
+ // we need to stop walking before we decide what to do next
+ this.mode = 'stop';
+ } else if (this.mode == 'stop') {
+ if (this.targetMode == 'walk')
+ this.mode = 'walk';
+ else
+ this.mode = 'idle';
+ } else if (this.mode == 'idle') {
+ if (this.targetMode == 'walk')
+ this.mode = 'walk';
+ }
+ }
+ }
+ if (this.mode == 'walk')
+ return 8;
+ return 0;
+ },
+ this.paint = function (context, x, y) {
+ if (!this.sprites.complete) return;
+ // draw the right frame out of the sprite sheet onto the canvas
+ // we assume each frame is as high as the sprite sheet
+ // the x,y coordinates give the position of the bottom center of the sprite
+ context.drawImage(this.sprites,
+ this.frameIndex[this.mode][this.frame] * this.sprites.height, 0, this.sprites.height, this.sprites.height,
+ x-this.sprites.height/2, y-this.sprites.height, this.sprites.height, this.sprites.height);
+ };
+ };
+&lt;/script&gt;
+&lt;script&gt;
+ var canvas = document.getElementsByTagName('canvas')[0];
+ var context = canvas.getContext('2d');
+ var landscape = new Landscape(context, canvas.width, canvas.height);
+ var blueRobot = new BlueRobot();
+ // paint when the browser wants us to, using requestAnimationFrame()
+ function paint() {
+ context.clearRect(0, 0, canvas.width, canvas.height);
+ landscape.paintBackground(context, canvas.width, canvas.height);
+ blueRobot.paint(context, canvas.width/2, landscape.horizon*1.1);
+ landscape.paintForeground(context, canvas.width, canvas.height);
+ requestAnimationFrame(paint);
+ }
+ paint();
+ // but tick every 150ms, so that we don't slow down when we don't paint
+ setInterval(function () {
+ var dx = blueRobot.tick();
+ landscape.advance(dx);
+ }, 100);
+&lt;/script&gt;
+&lt;p class=&quot;buttons&quot;&gt;
+ &lt;input type=button value=&quot;Walk&quot; onclick=&quot;blueRobot.walk()&quot;&gt;
+ &lt;input type=button value=&quot;Stop&quot; onclick=&quot;blueRobot.stop()&quot;&gt;
+&lt;footer&gt;
+ &lt;small&gt; Blue Robot Player Sprite by &lt;a href=&quot;https://johncolburn.deviantart.com/&quot;&gt;JohnColburn&lt;/a&gt;.
+ Licensed under the terms of the Creative Commons Attribution Share-Alike 3.0 Unported license.&lt;/small&gt;
+ &lt;small&gt; This work is itself licensed under a &lt;a rel=&quot;license&quot; href=&quot;https://creativecommons.org/licenses/by-sa/3.0/&quot;&gt;Creative
+ Commons Attribution-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;/small&gt;
+&lt;/footer&gt;
+</pre>
+
+ </div>
- <h5 id="color-spaces-and-color-correction"><span class="secno">4.8.11.2 </span>Color spaces and color correction</h5>
- <p>The <code><a href="#the-canvas-element">canvas</a></code> APIs must perform color correction at
- only two points: when rendering images with their own gamma
- correction and color space information onto the canvas, to convert
- the image to the color space used by the canvas (e.g. using the 2D
- Context's <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code>
- method with an <code><a href="#htmlimageelement">HTMLImageElement</a></code> object), and when
- rendering the actual canvas bitmap to the output device.</p>
- <p class="note">Thus, in the 2D context, colors used to draw shapes
- onto the canvas will exactly match colors obtained through the <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code>
- method.</p>
- <p>The <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL()</a></code> method
- must not include color space information in the resource
- returned. Where the output format allows it, the color of pixels in
- resources created by <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL()</a></code> must match those
- returned by the <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code>
- method.</p>
+ <h5 id="the-imagebitmap-rendering-context"><span class="secno">4.12.5.2</span> The <code id="the-imagebitmap-rendering-context:imagebitmap"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> rendering context<a class="self-link" href="#the-imagebitmap-rendering-context"/></h5>
- <p>In user agents that support CSS, the color space used by a
- <code><a href="#the-canvas-element">canvas</a></code> element must match the color space used for
- processing any colors for that element in CSS.</p>
+ <h6 id="introduction-6"><span class="secno">4.12.5.2.1</span> Introduction<a class="self-link" href="#introduction-6"/></h6>
- <p>The gamma correction and color space information of images must
- be handled in such a way that an image rendered directly using an
- <code><a href="#the-img-element">img</a></code> element would use the same colors as one painted on
- a <code><a href="#the-canvas-element">canvas</a></code> element that is then itself
- rendered. Furthermore, the rendering of images that have no color
- correction information (such as those returned by the <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL()</a></code> method) must be
- rendered with no color correction.</p>
+ <p><code id="introduction-6:imagebitmaprenderingcontext"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> is a performance-oriented interface that provides a
+ low overhead method for displaying the contents of <code id="introduction-6:imagebitmap"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> objects. It uses
+ transfer semantics to reduce overall memory consumption. It also streamlines performance by
+ avoiding intermediate compositing, unlike the <code id="introduction-6:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method of
+ <code id="introduction-6:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>.</p>
- <p class="note">Thus, in the 2D context, calling the <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method to render
- the output of the <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL()</a></code> method to the
- canvas, given the appropriate dimensions, has no visible effect.</p>
+ <p>Using an <code id="introduction-6:the-img-element"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> element as an intermediate for getting an image resource into a
+ canvas, for example, would result in two copies of the decoded image existing in memory at the
+ same time: the <code id="introduction-6:the-img-element-2"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> element's copy, and the one in the canvas's backing store. This
+ memory cost can be prohibitive when dealing with extremely large images. This can be avoided by
+ using <code id="introduction-6:imagebitmaprenderingcontext-2"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code>.</p>
+ <div class="example">
+ <p>Using <code id="introduction-6:imagebitmaprenderingcontext-3"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code>, here is how to transcode an image to the JPEG
+ format in a memory- and CPU-efficient way:</p>
+
+ <pre>createImageBitmap(inputImageBlob).then(image =&gt; {
+ const canvas = document.createElement('canvas');
+ const context = canvas.getContext('bitmaprenderer');
+ context.transferFromImageBitmap(image);
+
+ canvas.toBlob(outputJPEGBlob =&gt; {
+ // Do something with outputJPEGBlob.
+ }, 'image/jpeg');
+});</pre>
</div>
+ <h6 id="the-imagebitmaprenderingcontext-interface"><span class="secno">4.12.5.2.2</span> The <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> interface<a class="self-link" href="#the-imagebitmaprenderingcontext-interface"/></h6>
- <div class="impl">
-
- <h5 id="security-with-canvas-elements"><span class="secno">4.8.11.3 </span>Security with <code><a href="#the-canvas-element">canvas</a></code> elements</h5>
-
- <p><strong>Information leakage</strong> can occur if scripts from
- one <a href="#origin">origin</a> can access information (e.g. read pixels)
- from images from another origin (one that isn't the <a href="#same-origin" title="same origin">same</a>).</p>
-
- <p>To mitigate this, <code><a href="#the-canvas-element">canvas</a></code> elements are defined to
- have a flag indicating whether they are <i>origin-clean</i>. All
- <code><a href="#the-canvas-element">canvas</a></code> elements must start with their
- <i>origin-clean</i> set to true. The flag must be set to false if
- any of the following actions occur:</p>
-
- <ul><li><p>The element's 2D context's <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method is
- called with an <code><a href="#htmlimageelement">HTMLImageElement</a></code> or an
- <code><a href="#htmlvideoelement">HTMLVideoElement</a></code> whose <a href="#origin">origin</a> is not the
- <a href="#same-origin" title="same origin">same</a> as that of the
- <code><a href="#document">Document</a></code> object that owns the <code><a href="#the-canvas-element">canvas</a></code>
- element.</p></li>
-
- <li><p>The element's 2D context's <code title="dom-context-2d-drawImage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method is
- called with an <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> whose
- <i>origin-clean</i> flag is false.</p></li>
-
- <li><p>The element's 2D context's <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> attribute is set
- to a <code><a href="#canvaspattern">CanvasPattern</a></code> object that was created from an
- <code><a href="#htmlimageelement">HTMLImageElement</a></code> or an <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>
- whose <a href="#origin">origin</a> was not the <a href="#same-origin" title="same
- origin">same</a> as that of the <code><a href="#document">Document</a></code> object
- that owns the <code><a href="#the-canvas-element">canvas</a></code> element when the pattern was
- created.</p></li>
-
- <li><p>The element's 2D context's <code title="dom-context-2d-fillStyle"><a href="#dom-context-2d-fillstyle">fillStyle</a></code> attribute is set
- to a <code><a href="#canvaspattern">CanvasPattern</a></code> object that was created from an
- <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> whose <i>origin-clean</i> flag was
- false when the pattern was created.</p></li>
-
- <li><p>The element's 2D context's <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> attribute is
- set to a <code><a href="#canvaspattern">CanvasPattern</a></code> object that was created from an
- <code><a href="#htmlimageelement">HTMLImageElement</a></code> or an <code><a href="#htmlvideoelement">HTMLVideoElement</a></code>
- whose <a href="#origin">origin</a> was not the <a href="#same-origin" title="same
- origin">same</a> as that of the <code><a href="#document">Document</a></code> object
- that owns the <code><a href="#the-canvas-element">canvas</a></code> element when the pattern was
- created.</p></li>
-
- <li><p>The element's 2D context's <code title="dom-context-2d-strokeStyle"><a href="#dom-context-2d-strokestyle">strokeStyle</a></code> attribute is
- set to a <code><a href="#canvaspattern">CanvasPattern</a></code> object that was created from an
- <code><a href="#htmlcanvaselement">HTMLCanvasElement</a></code> whose <i>origin-clean</i> flag was
- false when the pattern was created.</p></li>
-
- <li><p>The element's 2D context's <code title="dom-context-2d-fillText"><a href="#dom-context-2d-filltext">fillText()</a></code> or <code title="dom-context-2d-fillText"><a href="#dom-context-2d-filltext">strokeText()</a></code> methods are
- invoked and consider using a font that has an <a href="#origin">origin</a>
- that is not the <a href="#same-origin" title="same origin">same</a> as that of
- the <code><a href="#document">Document</a></code> object that owns the <code><a href="#the-canvas-element">canvas</a></code>
- element. (The font doesn't even have to be used; all that matters
- is whether the font was considered for any of the glyphs
- drawn.)</p></li> <!-- because fonts could consider sensitive
- material, I guess; and because that sensitivity could extend to
- whether or not a particular glyph is in the font in the first
- place. -->
-
- </ul><p>Whenever the <code title="dom-canvas-toDataURL"><a href="#dom-canvas-todataurl">toDataURL()</a></code> method of a
- <code><a href="#the-canvas-element">canvas</a></code> element whose <i>origin-clean</i> flag is set to
- false is called, the method must raise a <code><a href="#security_err">SECURITY_ERR</a></code>
- exception.</p>
-
- <p>Whenever the <code title="dom-context-2d-getImageData"><a href="#dom-context-2d-getimagedata">getImageData()</a></code> method of
- the 2D context of a <code><a href="#the-canvas-element">canvas</a></code> element whose
- <i>origin-clean</i> flag is set to false is called with otherwise
- correct arguments, the method must raise a <code><a href="#security_err">SECURITY_ERR</a></code>
- exception.</p>
-
- <p>Whenever the <code title="dom-context-2d-measureText"><a href="#dom-context-2d-measuretext">measureText()</a></code> method of
- the 2D context of a <code><a href="#the-canvas-element">canvas</a></code> element ends up using a font
- that has an <a href="#origin">origin</a> that is not the <a href="#same-origin" title="same
- origin">same</a> as that of the <code><a href="#document">Document</a></code> object that
- owns the <code><a href="#the-canvas-element">canvas</a></code> element, the method must raise a
- <code><a href="#security_err">SECURITY_ERR</a></code> exception.</p>
-
- <p class="note">Even resetting the canvas state by changing its
- <code title="attr-canvas-width"><a href="#attr-canvas-width">width</a></code> or <code title="attr-canvas-height"><a href="#attr-canvas-height">height</a></code> attributes doesn't reset
- the <i>origin-clean</i> flag.</p>
+ <pre class="idl">[Exposed=Window]
+interface <dfn id="imagebitmaprenderingcontext">ImageBitmapRenderingContext</dfn> {
+ readonly attribute <a href="#htmlcanvaselement" id="the-imagebitmaprenderingcontext-interface:htmlcanvaselement">HTMLCanvasElement</a> <a href="#dom-imagebitmaprenderingcontext-canvas-2" id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontext-canvas-2">canvas</a>;
+ void <a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2" id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap</a>(ImageBitmap? bitmap);
+};
- </div>
+dictionary <dfn id="imagebitmaprenderingcontextsettings">ImageBitmapRenderingContextSettings</dfn> {
+ boolean <a href="#dom-imagebitmaprenderingcontextsettings-alpha" id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontextsettings-alpha">alpha</a> = true;
+};</pre>
+
+ <dl class="domintro"><dt><var>context</var> = <var>canvas</var> . <code id="the-imagebitmaprenderingcontext-interface:dom-canvas-getcontext-2"><a href="#dom-canvas-getcontext-2">getContext</a></code>('bitmaprenderer' [, { [ <code id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontextsettings-alpha-2"><a href="#dom-imagebitmaprenderingcontextsettings-alpha">alpha</a></code>: false ] } ] )</dt><dd>
+
+ <p>Returns an <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-2"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object that is permanently bound to a
+ particular <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element.</p>
+
+ <p>If the <code id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontextsettings-alpha-3"><a href="#dom-imagebitmaprenderingcontextsettings-alpha">alpha</a></code> setting is
+ provided and set to false, then the canvas is forced to always be opaque.</p>
+
+ </dd><dt><var>context</var> . <code id="dom-imagebitmaprenderingcontext-canvas"><a href="#dom-imagebitmaprenderingcontext-canvas-2">canvas</a></code></dt><dd>
+
+ <p>Returns the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element that the context is bound to.</p>
+
+ </dd><dt><var>context</var> . <code id="dom-imagebitmaprenderingcontext-transferfromimagebitmap"><a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap</a></code>(imageBitmap)</dt><dd>
+
+ <p>Transfers the underlying <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data">bitmap data</a>
+ from <var>imageBitmap</var> to <var>context</var>, and the bitmap becomes the contents of the
+ <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element to which <var>context</var> is bound.</p>
+
+ </dd><dt><var>context</var> . <code id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontext-transferfromimagebitmap-2-2"><a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap</a></code>(
+ null)</dt><dd>
+
+ <p>Replaces contents of the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-4"><a href="#the-canvas-element">canvas</a></code> element to which <var>context</var>
+ is bound with a transparent black bitmap whose size corresponds to the <code id="the-imagebitmaprenderingcontext-interface:attr-canvas-width"><a href="#attr-canvas-width">width</a></code> and <code id="the-imagebitmaprenderingcontext-interface:attr-canvas-height"><a href="#attr-canvas-height">height</a></code>
+ content attributes of the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-5"><a href="#the-canvas-element">canvas</a></code> element.</p>
+
+ </dd></dl>
+
+
+
+ <p>The <dfn id="dom-imagebitmaprenderingcontext-canvas-2"><code>canvas</code></dfn> attribute
+ must return the value it was initialized to when the object was created.</p>
+
+ <p>An <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-3"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object has an <dfn id="concept-imagebitmaprenderingcontext-output-bitmap">output bitmap</dfn>, which is a
+ reference to <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data-2">bitmap data</a>.</p>
+
+ <p>An <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-4"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object has a <dfn id="concept-imagebitmaprenderingcontext-bitmap-mode">bitmap mode</dfn>, which can be set to
+ <dfn id="concept-imagebitmaprenderingcontext-valid">valid</dfn> or <dfn id="concept-imagebitmaprenderingcontext-blank">blank</dfn>. A value of <a href="#concept-imagebitmaprenderingcontext-valid" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-valid">valid</a> indicates that the context's
+ <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap">output bitmap</a> refers to
+ <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data-3">bitmap data</a> that was acquired via <code id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontext-transferfromimagebitmap-2-3"><a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap()</a></code>.
+ A value <a href="#concept-imagebitmaprenderingcontext-blank" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-blank">blank</a> indicates that the
+ context's <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-2">output
+ bitmap</a> is a default transparent bitmap.</p>
+
+ <p>An <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-5"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object also has an <dfn id="concept-imagebitmaprenderingcontext-alpha">alpha</dfn> flag, which can be set to true or
+ false. When an <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-6"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object has its <a href="#concept-imagebitmaprenderingcontext-alpha" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-alpha">alpha</a> flag set to false, the contents
+ of the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-6"><a href="#the-canvas-element">canvas</a></code> element to which the context is bound are obtained by
+ compositing the context's <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-3">output bitmap</a> onto an opaque
+ black bitmap of the same size using the source-over composite operation. If the <a href="#concept-imagebitmaprenderingcontext-alpha" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-alpha-2">alpha</a> flag is set to true, then the
+ <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-4">output bitmap</a> is used
+ as the contents of the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-7"><a href="#the-canvas-element">canvas</a></code> element to which the context is bound. <a href="https://html.spec.whatwg.org/multipage/references.html#refsCOMPOSITE">[COMPOSITE]</a></p>
+
+ <p class="note">The step of compositing over an opaque black bitmap ought to be elided whenever
+ equivalent results can be obtained more efficiently by other means.</p>
+
+ <hr/>
+
+ <p>When a user agent is required to <dfn id="set-an-imagebitmaprenderingcontext's-output-bitmap">set an <code>ImageBitmapRenderingContext</code>'s output
+ bitmap</dfn>, with a <var>context</var> argument that is an
+ <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-7"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object and an optional argument <var>bitmap</var> that
+ refers to <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data-4">bitmap data</a>, it must run these
+ steps:</p>
+
+ <ol><li><p>If a <var>bitmap</var> argument was not provided, then:</p>
+
+ <ol><li><p>Set <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-bitmap-mode" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-bitmap-mode">bitmap mode</a> to <a href="#concept-imagebitmaprenderingcontext-blank" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-blank-2">blank</a>.</p></li><li><p>Let <var>canvas</var> be the <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-8"><a href="#the-canvas-element">canvas</a></code> element to which <var>context</var>
+ is bound.</p></li><li><p>Set <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-5">output bitmap</a> to be fully
+ transparent black with an <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-width" id="the-imagebitmaprenderingcontext-interface:intrinsic-width">intrinsic width</a> equal to the numeric value of
+ <var>canvas</var>'s <code id="the-imagebitmaprenderingcontext-interface:attr-canvas-width-2"><a href="#attr-canvas-width">width</a></code> attribute and an
+ <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#intrinsic-height" id="the-imagebitmaprenderingcontext-interface:intrinsic-height">intrinsic height</a> equal to the numeric value of <var>canvas</var>'s <code id="the-imagebitmaprenderingcontext-interface:attr-canvas-height-2"><a href="#attr-canvas-height">height</a></code> attribute, those values being interpreted in <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="the-imagebitmaprenderingcontext-interface:'px'">CSS pixels</a>.</p></li><li><p>Set the <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-6">output bitmap</a>'s <a href="#concept-canvas-origin-clean" id="the-imagebitmaprenderingcontext-interface:concept-canvas-origin-clean">origin-clean</a> flag to true.</p></li></ol>
+
+ </li><li><p>If a <var>bitmap</var> argument was provided, then:</p>
+
+ <ol><li><p>Set <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-bitmap-mode" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-bitmap-mode-2">bitmap mode</a> to <a href="#concept-imagebitmaprenderingcontext-valid" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-valid-2">valid</a>.</p></li><li>
+ <p>Set <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-7">output bitmap</a> to refer
+ to the same underlying bitmap data as <var>bitmap</var>, without making a copy.</p>
+
+ <p class="note">The <a href="#concept-canvas-origin-clean" id="the-imagebitmaprenderingcontext-interface:concept-canvas-origin-clean-2">origin-clean</a> flag of
+ <var>bitmap</var> is included in the bitmap data to be referenced by <var>context</var>'s
+ <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-8">output bitmap</a>.</p>
+ </li></ol>
+
+ </li></ol>
+
+ <hr/>
+
+ <p>The <dfn id="imagebitmaprenderingcontext-creation-algorithm"><code>ImageBitmapRenderingContext</code> creation algorithm</dfn>, which is passed a
+ <var>target</var> (a <code id="the-imagebitmaprenderingcontext-interface:the-canvas-element-9"><a href="#the-canvas-element">canvas</a></code> element) and optionally some arguments, consists of
+ running the following steps:</p>
+
+ <ol><li><p>If the algorithm was passed some arguments, then let <var>arg</var> be the first such
+ argument. Otherwise, let <var>arg</var> be undefined.</p></li><li><p>Let <var>settings</var> be the result of <a href="#coerce-context-arguments-for-imagebitmaprenderingcontext" id="the-imagebitmaprenderingcontext-interface:coerce-context-arguments-for-imagebitmaprenderingcontext">coercing the <var>arg</var> context arguments for
+ <code>ImageBitmapRenderingContext</code></a>.</p></li><li><p>Create a new <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-8"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object.</p></li><li><p>Initialize its <code id="the-imagebitmaprenderingcontext-interface:dom-context-2d-canvas-2"><a href="#dom-context-2d-canvas-2">canvas</a></code> attribute to point to
+ <var>target</var>.</p></li><li><p>Let the new <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-9"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object's <a href="#concept-imagebitmaprenderingcontext-output-bitmap" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-output-bitmap-9">output bitmap</a> and
+ <var>target</var>'s bitmap be a shared reference to the same bitmap.</p></li><li><p>Run the steps to <a href="#set-an-imagebitmaprenderingcontext's-output-bitmap" id="the-imagebitmaprenderingcontext-interface:set-an-imagebitmaprenderingcontext's-output-bitmap">set an <code>ImageBitmapRenderingContext</code>'s output
+ bitmap</a>, using the new <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-10"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object as the
+ <var>context</var> argument, and with no <var>bitmap</var> argument.</p></li><li><p>Initialize <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-alpha" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-alpha-3">alpha</a> flag to true.
+
+ </p></li><li>
+
+ <p>Process each of the members of <var>settings</var> as follows:</p>
+
+ <dl><dt><dfn id="dom-imagebitmaprenderingcontextsettings-alpha"><code>alpha</code></dfn></dt><dd>If false, then set <var>context</var>'s <a href="#concept-imagebitmaprenderingcontext-alpha" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmaprenderingcontext-alpha-4">alpha</a> flag to false.</dd></dl>
+
+ </li><li><p>Return the new <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-11"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object.</p></li></ol>
+
+ <hr/>
+
+ <p>When a user agent is required to <dfn id="coerce-context-arguments-for-imagebitmaprenderingcontext">coerce context arguments for
+ <code>ImageBitmapRenderingContext</code></dfn>, it must run these steps:</p>
+
+ <ol><li><p>Let <var>input</var> be the argument to coerce.</p></li><li><p>Let <var>jsval</var> be the result of <a data-x-internal="concept-idl-convert" href="https://heycam.github.io/webidl/#es-type-mapping" id="the-imagebitmaprenderingcontext-interface:concept-idl-convert">converting</a> <var>input</var> to a JavaScript value. (This can
+ throw an exception.)</p></li><li><p>Let <var>dict</var> be the result of <a data-x-internal="concept-idl-convert" href="https://heycam.github.io/webidl/#es-type-mapping" id="the-imagebitmaprenderingcontext-interface:concept-idl-convert-2">converting</a>
+ <var>jsval</var> to the dictionary type <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontextsettings"><a href="#imagebitmaprenderingcontextsettings">ImageBitmapRenderingContextSettings</a></code>. (This
+ can throw an exception.)</p></li><li><p>Return <var>dict</var>.</p></li></ol>
+
+ <hr/>
+
+ <p>The <dfn id="dom-imagebitmaprenderingcontext-transferfromimagebitmap-2"><code>transferFromImageBitmap(<var>imageBitmap</var>)</code></dfn>
+ method, when invoked, must run these steps:</p>
+
+ <ol><li><p>Let <var>bitmapContext</var> be the <code id="the-imagebitmaprenderingcontext-interface:imagebitmaprenderingcontext-12"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code> object on
+ which the <code id="the-imagebitmaprenderingcontext-interface:dom-imagebitmaprenderingcontext-transferfromimagebitmap-2-4"><a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap()</a></code>
+ method was called.</p></li><li><p>If <var>imageBitmap</var> is null, then run the steps to <a href="#set-an-imagebitmaprenderingcontext's-output-bitmap" id="the-imagebitmaprenderingcontext-interface:set-an-imagebitmaprenderingcontext's-output-bitmap-2">set an
+ ImageBitmapRenderingContext's output bitmap</a>, with <var>bitmapContext</var> as the
+ <var>context</var> argument and no <var>bitmap</var> argument, then abort these steps.</p></li><li><p>If the value of <var>imageBitmap</var>'s <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="the-imagebitmaprenderingcontext-interface:detached">[[Detached]]</a> internal slot is set to
+ true, then throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-imagebitmaprenderingcontext-interface:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-imagebitmaprenderingcontext-interface:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and
+ abort these steps.</p></li><li><p>Run the steps to <a href="#set-an-imagebitmaprenderingcontext's-output-bitmap" id="the-imagebitmaprenderingcontext-interface:set-an-imagebitmaprenderingcontext's-output-bitmap-3">set an <code>ImageBitmapRenderingContext</code>'s output
+ bitmap</a>, with the <var>context</var> argument equal to <var>bitmapContext</var>, and the
+ <var>bitmap</var> argument referring to <var>imageBitmap</var>'s underlying <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data-5">bitmap data</a>.
+
+ </p></li><li><p>Set the value of <var>imageBitmap</var>'s <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="the-imagebitmaprenderingcontext-interface:detached-2">[[Detached]]</a> internal slot to
+ true.</p></li><li><p>Unset <var>imageBitmap's</var> <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#concept-imagebitmap-bitmap-data" id="the-imagebitmaprenderingcontext-interface:concept-imagebitmap-bitmap-data-6">bitmap
+ data</a>.</p></li></ol>
+
+
+
+
+
+
+ <h5 id="the-offscreencanvas-interface"><span class="secno">4.12.5.3</span> The <code id="the-offscreencanvas-interface:offscreencanvas"><a href="#offscreencanvas">OffscreenCanvas</a></code> interface<a class="self-link" href="#the-offscreencanvas-interface"/></h5><div class="status"><input onclick="toggleStatus(this)" type="button" value="⋰"/><p class="support"><strong>Support:</strong> offscreencanvas<span class="and_chr no"><span>Chrome for Android</span> <span>None</span></span><span class="chrome no"><span>Chrome</span> <span>None</span></span><span class="and_uc no"><span>UC Browser for Android</span> <span>None</span></span><span class="ios_saf no"><span>iOS Safari</span> <span>None</span></span><span class="firefox no"><span>Firefox</span> <span>None</span></span><span class="ie no"><span>IE</span> <span>None</span></span><span class="samsung no"><span>Samsung Internet</span> <span>None</span></span><span class="op_mini no"><span>Opera Mini</span> <span>None</span></span><span class="safari no"><span>Safari</span> <span>None</span></span><span class="android no"><span>Android Browser</span> <span>None</span></span><span class="opera no"><span>Opera</span> <span>None</span></span><span class="edge no"><span>Edge</span> <span>None</span></span></p><p class="caniuse">Source: <a href="https://caniuse.com/#feat=offscreencanvas">caniuse.com</a></p></div>
+
+ <pre class="idl">typedef (<a href="#offscreencanvasrenderingcontext2d" id="the-offscreencanvas-interface:offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a> or
+ <a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext" id="the-offscreencanvas-interface:webglrenderingcontext">WebGLRenderingContext</a>) <dfn id="offscreenrenderingcontext">OffscreenRenderingContext</dfn>;
+
+dictionary <dfn id="imageencodeoptions">ImageEncodeOptions</dfn> {
+ DOMString <a href="#image-encode-options-type" id="the-offscreencanvas-interface:image-encode-options-type">type</a> = &quot;image/png&quot;;
+ unrestricted double <a href="#image-encode-options-quality" id="the-offscreencanvas-interface:image-encode-options-quality">quality</a> = 1.0;
+};
+
+enum <dfn id="offscreenrenderingcontexttype">OffscreenRenderingContextType</dfn> { &quot;<a href="#offscreen-context-type-2d" id="the-offscreencanvas-interface:offscreen-context-type-2d">2d</a>&quot;, &quot;<a href="#offscreen-context-type-webgl" id="the-offscreencanvas-interface:offscreen-context-type-webgl">webgl</a>&quot; };
+
+[<a href="#dom-offscreencanvas-2" id="the-offscreencanvas-interface:dom-offscreencanvas-2">Constructor</a>([EnforceRange] unsigned long long width, [EnforceRange] unsigned long long height), Exposed=(Window,Worker), <a href="https://html.spec.whatwg.org/multipage/structured-data.html#transferable" id="the-offscreencanvas-interface:transferable">Transferable</a>]
+interface <dfn id="offscreencanvas">OffscreenCanvas</dfn> : <a data-x-internal="eventtarget" href="https://dom.spec.whatwg.org/#interface-eventtarget" id="the-offscreencanvas-interface:eventtarget">EventTarget</a> {
+ attribute unsigned long long <a href="#dom-offscreencanvas-width-2" id="the-offscreencanvas-interface:dom-offscreencanvas-width-2">width</a>;
+ attribute unsigned long long <a href="#dom-offscreencanvas-height-2" id="the-offscreencanvas-interface:dom-offscreencanvas-height-2">height</a>;
+
+ <a href="#offscreenrenderingcontext" id="the-offscreencanvas-interface:offscreenrenderingcontext">OffscreenRenderingContext</a>? <a href="#dom-offscreencanvas-getcontext-2" id="the-offscreencanvas-interface:dom-offscreencanvas-getcontext-2">getContext</a>(<a href="#offscreenrenderingcontexttype" id="the-offscreencanvas-interface:offscreenrenderingcontexttype">OffscreenRenderingContextType</a> contextType, any... arguments);
+ <a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap" id="the-offscreencanvas-interface:imagebitmap">ImageBitmap</a> <a href="#dom-offscreencanvas-transfertoimagebitmap-2" id="the-offscreencanvas-interface:dom-offscreencanvas-transfertoimagebitmap-2">transferToImageBitmap</a>();
+ Promise&lt;<a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob" id="the-offscreencanvas-interface:blob">Blob</a>&gt; <a href="#dom-offscreencanvas-converttoblob-2" id="the-offscreencanvas-interface:dom-offscreencanvas-converttoblob-2">convertToBlob</a>(optional <a href="#imageencodeoptions" id="the-offscreencanvas-interface:imageencodeoptions">ImageEncodeOptions</a> options);
+};
+</pre>
+
+ <p><code id="the-offscreencanvas-interface:offscreencanvas-2"><a href="#offscreencanvas">OffscreenCanvas</a></code> objects are used to create rendering contexts, much like an
+ <code id="the-offscreencanvas-interface:htmlcanvaselement"><a href="#htmlcanvaselement">HTMLCanvasElement</a></code>, but with no connection to the DOM. This makes it possible to
+ use canvas rendering contexts in <a href="https://html.spec.whatwg.org/multipage/workers.html#workers">workers</a>.</p>
+
+ <p>An <code id="the-offscreencanvas-interface:offscreencanvas-3"><a href="#offscreencanvas">OffscreenCanvas</a></code> object may hold a weak reference to a <dfn id="offscreencanvas-placeholder">placeholder <code>canvas</code> element</dfn>, which is
+ typically in the DOM, whose embedded content is provided by the <code id="the-offscreencanvas-interface:offscreencanvas-4"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+ object. The bitmap of the <code id="the-offscreencanvas-interface:offscreencanvas-5"><a href="#offscreencanvas">OffscreenCanvas</a></code> object is pushed to the <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder">placeholder <code>canvas</code> element</a> by
+ calling the <dfn id="offscreencontext-commit"><code>commit()</code></dfn> method of the
+ <code id="the-offscreencanvas-interface:offscreencanvas-6"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's rendering context. All rendering context types that
+ can be created by an <code id="the-offscreencanvas-interface:offscreencanvas-7"><a href="#offscreencanvas">OffscreenCanvas</a></code> object must implement a <code id="the-offscreencanvas-interface:offscreencontext-commit"><a href="#offscreencontext-commit">commit()</a></code> method. The exact behavior of the commit
+ method (e.g. whether it copies or transfers bitmaps) may vary, as defined by the rendering
+ contexts' respective specifications. Only the <a href="#offscreencanvasrenderingcontext2d" id="the-offscreencanvas-interface:offscreencanvasrenderingcontext2d-2">2D context for offscreen canvases</a> is defined
+ in this specification.</p>
+
+ <dl class="domintro"><dt><var>offscreenCanvas</var> = new <code id="dom-offscreencanvas"><a href="#dom-offscreencanvas-2">OffscreenCanvas</a></code>(<var>width</var>,
+ <var>height</var>)</dt><dt>
+
+ </dt><dd>
+
+ <p>Returns a new <code id="the-offscreencanvas-interface:offscreencanvas-8"><a href="#offscreencanvas">OffscreenCanvas</a></code> object that is not linked to a <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder-2">placeholder <code>canvas</code> element</a>, and
+ whose bitmap's size is determined by the <var>width</var> and <var>height</var> arguments.</p>
+
+ </dd><dt><var>context</var> = <var>offscreenCanvas</var> . <code id="dom-offscreencanvas-getcontext"><a href="#dom-offscreencanvas-getcontext-2">getContext</a></code>(<var>contextType</var> [, ... ] )</dt><dd>
+
+ <p>Returns an object that exposes an API for drawing on the <code id="the-offscreencanvas-interface:offscreencanvas-9"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+ object. The first argument specifies the desired API, either &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-2d-2"><a href="#offscreen-context-type-2d">2d</a></code>&quot;, or &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-webgl-2"><a href="#offscreen-context-type-webgl">webgl</a></code>&quot;. Subsequent arguments are handled by that
+ API.</p>
+
+ <p>This specification defines the &quot;<code id="the-offscreencanvas-interface:canvas-context-2d"><a href="#canvas-context-2d">2d</a></code>&quot; context below,
+ which is similar but distinct from the &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-2d-3"><a href="#offscreen-context-type-2d">2d</a></code>&quot;
+ context that is created from a <code id="the-offscreencanvas-interface:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element. There is also a specification that
+ defines a &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-webgl-3"><a href="#offscreen-context-type-webgl">webgl</a></code>&quot; context.
+ <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a></p>
+
+ <p>Returns null if the canvas has already been initialized with another context type (e.g.
+ trying to get a &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-2d-4"><a href="#offscreen-context-type-2d">2d</a></code>&quot; context after getting a
+ &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-webgl-4"><a href="#offscreen-context-type-webgl">webgl</a></code>&quot; context).</p>
+
+ </dd></dl>
+
+
+
+ <p>An <code id="the-offscreencanvas-interface:offscreencanvas-10"><a href="#offscreencanvas">OffscreenCanvas</a></code> object has an internal <dfn id="offscreencanvas-bitmap">bitmap</dfn> that is initialized when the object
+ is created. The width and height of the <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap">bitmap</a> are
+ equal to the values of the <code id="the-offscreencanvas-interface:dom-offscreencanvas-width-2-2"><a href="#dom-offscreencanvas-width-2">width</a></code> and <code id="the-offscreencanvas-interface:dom-offscreencanvas-height-2-2"><a href="#dom-offscreencanvas-height-2">height</a></code> attributes of the <code id="the-offscreencanvas-interface:offscreencanvas-11"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+ object. Initially, all the bitmap's pixels are transparent black.</p>
+
+ <p>An <code id="the-offscreencanvas-interface:offscreencanvas-12"><a href="#offscreencanvas">OffscreenCanvas</a></code> object can have a rendering context bound to it. Initially,
+ it does not have a bound rendering context. To keep track of whether it has a rendering context
+ or not, and what kind of rendering context it is, an <code id="the-offscreencanvas-interface:offscreencanvas-13"><a href="#offscreencanvas">OffscreenCanvas</a></code> object also
+ has a <dfn id="offscreencanvas-context-mode">context mode</dfn>, which is initially <dfn id="offscreencanvas-context-none">none</dfn> but can be changed to either <dfn id="offscreencanvas-context-2d">2d</dfn>, <dfn id="offscreencanvas-context-webgl">webgl</dfn> or <dfn id="offscreencanvas-context-detached">detached</dfn> by algorithms defined in this
+ specification.</p>
+
+ <p>The constructor <dfn id="dom-offscreencanvas-2"><code>OffscreenCanvas(<var>width</var>,
+ <var>height</var>)</code></dfn>, when invoked, must create a new <code id="the-offscreencanvas-interface:offscreencanvas-14"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+ object with its <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-2">bitmap</a> initialized to a rectangular
+ array of transparent black pixels of the dimensions specified by <var>width</var> and
+ <var>height</var>; and its <code id="the-offscreencanvas-interface:dom-offscreencanvas-width-2-3"><a href="#dom-offscreencanvas-width-2">width</a></code> and <code id="the-offscreencanvas-interface:dom-offscreencanvas-height-2-3"><a href="#dom-offscreencanvas-height-2">height</a></code> attributes initialized to <var>width</var> and
+ <var>height</var> respectively.</p>
+
+ <hr/>
+
+ <p><code id="the-offscreencanvas-interface:offscreencanvas-15"><a href="#offscreencanvas">OffscreenCanvas</a></code> objects are <a href="https://html.spec.whatwg.org/multipage/structured-data.html#transferable-objects" id="the-offscreencanvas-interface:transferable-objects">transferable</a>. Their <a href="https://html.spec.whatwg.org/multipage/structured-data.html#transfer-steps" id="the-offscreencanvas-interface:transfer-steps">transfer steps</a>, given <var>value</var> and
+ <var>dataHolder</var>, are as follows:</p>
+
+ <ol><li><p>If <var>value</var>'s <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode">context mode</a> is
+ not equal to <a href="#offscreencanvas-context-none" id="the-offscreencanvas-interface:offscreencanvas-context-none">none</a>, then throw an
+ <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p></li><li><p>Set <var>value</var>'s <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-2">context mode</a> to
+ <a href="#offscreencanvas-context-detached" id="the-offscreencanvas-interface:offscreencanvas-context-detached">detached</a>.</p></li><li><p>Let <var>width</var> and <var>height</var> be the dimensions of <var>value</var>'s <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-3">bitmap</a>.</p></li><li><p>Unset <var>value</var>'s <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-4">bitmap</a>.</p></li><li><p>Set <var>dataHolder</var>.[[With]] to <var>width</var>, and
+ <var>dataHolder</var>.[[Height]] to <var>height</var>.</p></li><li><p>Set <var>dataHolder</var>.[[PlaceholderCanvas]] to be a weak reference to
+ <var>value</var>'s <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder-3">placeholder <code>canvas</code>
+ element</a>, if <var>value</var> has one, or null if it does not.</p></li></ol>
+
+ <p>Their <a href="https://html.spec.whatwg.org/multipage/structured-data.html#transfer-receiving-steps" id="the-offscreencanvas-interface:transfer-receiving-steps">transfer-receiving steps</a>, given <var>dataHolder</var> and <var>value</var>,
+ are:</p>
+
+ <ol><li><p>Initialize <var>value</var>'s <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-5">bitmap</a> to a
+ rectangular array of transparent black pixels with width given by <var>dataHolder</var>.[[Width]]
+ and height given by <var>dataHolder</var>.[[Height]].</p></li><li><p>If <var>dataHolder</var>.[[PlaceholderCanvas]] is not null, set <var>value</var>'s <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder-4">placeholder <code>canvas</code> element</a> to
+ <var>dataHolder</var>.[[PlaceholderCanvas]] (while maintaining the weak reference
+ semantics).</p></li></ol>
+
+ <hr/>
+
+ <p>The <dfn id="dom-offscreencanvas-getcontext-2"><code>getContext(<var>contextId</var>,
+ <var>arguments...</var>)</code></dfn> method of an <code id="the-offscreencanvas-interface:offscreencanvas-16"><a href="#offscreencanvas">OffscreenCanvas</a></code> object, when
+ invoked, must run the steps in the cell of the following table whose column header describes the
+ <code id="the-offscreencanvas-interface:offscreencanvas-17"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-3">context
+ mode</a> and whose row header describes the method's first argument.</p>
+
+ <table><thead><tr><td>
+ </td><th><a href="#offscreencanvas-context-none" id="the-offscreencanvas-interface:offscreencanvas-context-none-2">none</a>
+ </th><th><a href="#offscreencanvas-context-2d" id="the-offscreencanvas-interface:offscreencanvas-context-2d">2d</a>
+ </th><th><a href="#offscreencanvas-context-webgl" id="the-offscreencanvas-interface:offscreencanvas-context-webgl">webgl</a>
+ </th><th><a href="#offscreencanvas-context-detached" id="the-offscreencanvas-interface:offscreencanvas-context-detached-2">detached</a>
+ </th></tr></thead><tbody><tr><th>&quot;<dfn id="offscreen-context-type-2d"><code>2d</code></dfn>&quot;
+ </th><td>
+ Follow the steps to <a href="#offscreen-2d-context-creation-algorithm" id="the-offscreencanvas-interface:offscreen-2d-context-creation-algorithm">create an
+ offscreen 2D context</a> defined in the section below, passing it the
+ <code id="the-offscreencanvas-interface:offscreencanvas-18"><a href="#offscreencanvas">OffscreenCanvas</a></code> object and the method's <var>arguments...</var>, to obtain
+ an <code id="the-offscreencanvas-interface:offscreencanvasrenderingcontext2d-3"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object; if this does not throw an
+ exception, then set the <code id="the-offscreencanvas-interface:offscreencanvas-19"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-4">context mode</a> to <a href="#offscreencanvas-context-2d" id="the-offscreencanvas-interface:offscreencanvas-context-2d-2">2d</a>, and return the new
+ <code id="the-offscreencanvas-interface:offscreencanvasrenderingcontext2d-4"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object.
+ </td><td>
+ Return the same object as was returned the last time the method was invoked with this same
+ first argument.
+ </td><td>
+ Return null.
+ </td><td>
+ Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror-2">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-2"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+ </td></tr><tr><th>&quot;<dfn id="offscreen-context-type-webgl"><code>webgl</code></dfn>&quot;
+ </th><td>
+ Follow the instructions given in the WebGL specification's <i>Context Creation</i> section to
+ obtain either a <code id="the-offscreencanvas-interface:webglrenderingcontext-2"><a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext">WebGLRenderingContext</a></code> or null; if the returned value is null,
+ then return null and abort these steps, otherwise, set the <code id="the-offscreencanvas-interface:offscreencanvas-20"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+ object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-5">context mode</a> to <a href="#offscreencanvas-context-webgl" id="the-offscreencanvas-interface:offscreencanvas-context-webgl-2">webgl</a>, and return the
+ <code id="the-offscreencanvas-interface:webglrenderingcontext-3"><a data-x-internal="webglrenderingcontext" href="https://www.khronos.org/registry/webgl/specs/latest/1.0/#WebGLRenderingContext">WebGLRenderingContext</a></code> object. <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a>
+ </td><td>
+ Return null.
+ </td><td>
+ Return the same value as was returned the last time the method was invoked with this same
+ first argument.
+ </td><td>
+ Throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror-3">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-3"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.
+
+ </td></tr></tbody></table>
+
+ <hr/>
+
+
+
+ <dl class="domintro"><dt><var>offscreenCanvas</var> . <code id="dom-offscreencanvas-width"><a href="#dom-offscreencanvas-width-2">width</a></code> [
+ = <var>value</var> ]</dt><dt><var>offscreenCanvas</var> . <code id="dom-offscreencanvas-height"><a href="#dom-offscreencanvas-height-2">height</a></code> [
+ = <var>value</var> ]</dt><dd>
+ <p>These attributes return the dimensions of the <code id="the-offscreencanvas-interface:offscreencanvas-21"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-6">bitmap</a>.</p>
+
+ <p>They can be set, to replace the <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-7">bitmap</a> with a
+ new, transparent black bitmap of the specified dimensions (effectively resizing it).</p>
+ </dd></dl>
+
+
+
+ <p>If either the <dfn id="dom-offscreencanvas-width-2"><code>width</code></dfn> or <dfn id="dom-offscreencanvas-height-2"><code>height</code></dfn> attributes of an
+ <code id="the-offscreencanvas-interface:offscreencanvas-22"><a href="#offscreencanvas">OffscreenCanvas</a></code> object are set (to a new value or to the same value as before) and
+ the <code id="the-offscreencanvas-interface:offscreencanvas-23"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-6">context
+ mode</a> is <a href="#offscreencanvas-context-2d" id="the-offscreencanvas-interface:offscreencanvas-context-2d-3">2d</a>, then replace the
+ <code id="the-offscreencanvas-interface:offscreencanvas-24"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-8">bitmap</a> with a
+ new transparent black bitmap and <a href="#reset-the-rendering-context-to-its-default-state" id="the-offscreencanvas-interface:reset-the-rendering-context-to-its-default-state">reset the rendering context to its default state</a>.
+ The new bitmap's dimensions are equal to the new values of the <code id="the-offscreencanvas-interface:dom-offscreencanvas-width-2-4"><a href="#dom-offscreencanvas-width-2">width</a></code> and <code id="the-offscreencanvas-interface:dom-offscreencanvas-height-2-4"><a href="#dom-offscreencanvas-height-2">height</a></code> attributes.</p>
+
+ <p>The resizing behavior for &quot;<code id="the-offscreencanvas-interface:offscreen-context-type-webgl-5"><a href="#offscreen-context-type-webgl">webgl</a></code>&quot;
+ contexts is defined in the WebGL specification. <a href="https://html.spec.whatwg.org/multipage/references.html#refsWEBGL">[WEBGL]</a></p>
+
+
+
+ <p class="note">If an <code id="the-offscreencanvas-interface:offscreencanvas-25"><a href="#offscreencanvas">OffscreenCanvas</a></code> object whose dimensions were changed has
+ a <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder-5">placeholder <code>canvas</code> element</a>, then
+ the <a href="#offscreencanvas-placeholder" id="the-offscreencanvas-interface:offscreencanvas-placeholder-6">placeholder <code>canvas</code> element</a>'s
+ <a data-x-internal="intrinsic-dimensions" href="https://drafts.csswg.org/css2/conform.html#intrinsic" id="the-offscreencanvas-interface:intrinsic-dimensions">intrinsic size</a> will only be updated via the <code id="the-offscreencanvas-interface:offscreencontext-commit-2"><a href="#offscreencontext-commit">commit()</a></code> method of the <code id="the-offscreencanvas-interface:offscreencanvas-26"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+ object's rendering context.</p>
+
+ <dl class="domintro"><dt><var>promise</var> = <var>offscreenCanvas</var> . <code id="dom-offscreencanvas-converttoblob"><a href="#dom-offscreencanvas-converttoblob-2">convertToBlob</a></code>( [<var>options</var>] )</dt><dd>
+ <p>Returns a promise that will fulfill with a new <code id="the-offscreencanvas-interface:blob-2"><a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob">Blob</a></code> object representing a file
+ containing the image in the <code id="the-offscreencanvas-interface:offscreencanvas-27"><a href="#offscreencanvas">OffscreenCanvas</a></code> object.</p>
+
+ <p>The argument, if provided, is a dictionary that controls the encoding options of the image
+ file to be created. The <code id="the-offscreencanvas-interface:image-encode-options-type-2"><a href="#image-encode-options-type">type</a></code>
+ field specifies the file format and has a default value of &quot;<code id="the-offscreencanvas-interface:image/png"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot;; that type
+ is also used if the requested type isn't supported. If the image format supports variable
+ quality (such as &quot;<code id="the-offscreencanvas-interface:image/jpeg"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/jpeg">image/jpeg</a></code>&quot;), then the <code id="the-offscreencanvas-interface:image-encode-options-quality-2"><a href="#image-encode-options-quality">quality</a></code> field is a number in the range 0.0
+ to 1.0 inclusive indicating the desired quality level for the resulting image.</p>
+ </dd><dt><var>canvas</var> . <code id="dom-offscreencanvas-transfertoimagebitmap"><a href="#dom-offscreencanvas-transfertoimagebitmap-2">transferToImageBitmap</a></code>()</dt><dd>
+ <p>Returns a newly created <code id="the-offscreencanvas-interface:imagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> object with the image in the
+ <code id="the-offscreencanvas-interface:offscreencanvas-28"><a href="#offscreencanvas">OffscreenCanvas</a></code> object. The image in the <code id="the-offscreencanvas-interface:offscreencanvas-29"><a href="#offscreencanvas">OffscreenCanvas</a></code> object is
+ replaced with a new blank image.</p>
+ </dd></dl>
+
+
+
+ <p>The <dfn id="dom-offscreencanvas-converttoblob-2"><code>convertToBlob(<var>options</var>)</code></dfn> method,
+ when invoked, must run the following steps:</p>
+
+ <ol><li><p>If the value of this <code id="the-offscreencanvas-interface:offscreencanvas-30"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="the-offscreencanvas-interface:detached">[[Detached]]</a>
+ internal slot is set to true, then return a promise rejected with an
+ <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror-4">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-4"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+ steps.</p></li><li><p>If this <code id="the-offscreencanvas-interface:offscreencanvas-31"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-7">context mode</a> is <a href="#offscreencanvas-context-2d" id="the-offscreencanvas-interface:offscreencanvas-context-2d-4">2d</a> and the rendering context's <a href="#offscreencontext2d-bitmap" id="the-offscreencanvas-interface:offscreencontext2d-bitmap">bitmap</a>'s <a href="#offscreencontext2d-origin-clean" id="the-offscreencanvas-interface:offscreencontext2d-origin-clean">origin-clean</a> flag is set to false, then return a
+ promise rejected with a <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="the-offscreencanvas-interface:securityerror">&quot;<code>SecurityError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-5"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and
+ abort these steps.</p>
+
+ </li><li><p>If this <code id="the-offscreencanvas-interface:offscreencanvas-32"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-9">bitmap</a> has no pixels (i.e. either its
+ horizontal dimension or its vertical dimension is zero) then return a promise rejected with an
+ <a data-x-internal="indexsizeerror" href="https://heycam.github.io/webidl/#indexsizeerror" id="the-offscreencanvas-interface:indexsizeerror">&quot;<code>IndexSizeError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-6"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+ steps.</p></li><li><p>Let <var>result</var> be a new promise object.</p></li><li><p>Return <var>result</var>, and <a href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="the-offscreencanvas-interface:queue-a-task">queue a task</a> to run the remaining steps
+ <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel" id="the-offscreencanvas-interface:in-parallel">in parallel</a>.</p></li><li><p>Let <var>blob</var> be a <code id="the-offscreencanvas-interface:blob-3"><a data-x-internal="blob" href="https://w3c.github.io/FileAPI/#blob">Blob</a></code> object, created in the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-realm" id="the-offscreencanvas-interface:concept-relevant-realm">relevant Realm</a> of this <code id="the-offscreencanvas-interface:offscreencanvas-33"><a href="#offscreencanvas">OffscreenCanvas</a></code>
+ object, representing <a href="#a-serialisation-of-the-bitmap-as-a-file" id="the-offscreencanvas-interface:a-serialisation-of-the-bitmap-as-a-file">a serialization of
+ this <code>OffscreenCanvas</code> object's <span>bitmap</span> as
+ a file</a>, passing the values of the <dfn id="image-encode-options-type"><code>type</code></dfn> and <dfn id="image-encode-options-quality"><code>quality</code></dfn> fields of <var>options</var>, if
+ <var>options</var> was specified. <a href="https://html.spec.whatwg.org/multipage/references.html#refsFILEAPI">[FILEAPI]</a></p></li><li><p>If <var>blob</var> is null, then reject <var>result</var> with an
+ <a data-x-internal="encodingerror" href="https://heycam.github.io/webidl/#encodingerror" id="the-offscreencanvas-interface:encodingerror">&quot;<code>EncodingError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-7"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code>.</p></li><li><p>Otherwise, resolve <var>result</var> with <var>blob</var>.</p></li></ol>
+
+ <p>The <dfn id="dom-offscreencanvas-transfertoimagebitmap-2"><code>transferToImageBitmap()</code></dfn> method,
+ when invoked, must run the following steps:</p>
+ <ol><li><p>If the value of this <code id="the-offscreencanvas-interface:offscreencanvas-34"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="https://html.spec.whatwg.org/multipage/structured-data.html#detached" id="the-offscreencanvas-interface:detached-2">[[Detached]]</a>
+ internal slot is set to true, then throw an <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror-5">&quot;<code>InvalidStateError</code>&quot;</a>
+ <code id="the-offscreencanvas-interface:domexception-8"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these steps.</p></li><li><p>If this <code id="the-offscreencanvas-interface:offscreencanvas-35"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-context-mode" id="the-offscreencanvas-interface:offscreencanvas-context-mode-8">context mode</a> is set to <a href="#offscreencanvas-context-none" id="the-offscreencanvas-interface:offscreencanvas-context-none-3">none</a>, then throw an
+ <a data-x-internal="invalidstateerror" href="https://heycam.github.io/webidl/#invalidstateerror" id="the-offscreencanvas-interface:invalidstateerror-6">&quot;<code>InvalidStateError</code>&quot;</a> <code id="the-offscreencanvas-interface:domexception-9"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> and abort these
+ steps.</p></li><li><p>Let <var>image</var> be a newly created <code id="the-offscreencanvas-interface:imagebitmap-3"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> object that references
+ the same underlying bitmap data as this <code id="the-offscreencanvas-interface:offscreencanvas-36"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-10">bitmap</a>.</p></li><li><p>Set this <code id="the-offscreencanvas-interface:offscreencanvas-37"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-bitmap" id="the-offscreencanvas-interface:offscreencanvas-bitmap-11">bitmap</a> to reference a newly created bitmap of the
+ same dimensions as the previous bitmap, and with its pixels initialized to transparent black,
+ or opaque black if the rendering context's <a href="#offscreencontext2d-alpha" id="the-offscreencanvas-interface:offscreencontext2d-alpha">alpha</a> flag is set to false.</p></li><li><p>Return <var>image</var>.</p></li></ol>
+
+
+ <h6 id="the-offscreen-2d-rendering-context"><span class="secno">4.12.5.3.1</span> The offscreen 2D rendering context<a class="self-link" href="#the-offscreen-2d-rendering-context"/></h6>
+
+ <pre class="idl">[Exposed=(Window,Worker)]
+interface <a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a> {
+ void <a href="#offscreencontext2d-commit-2" id="the-offscreen-2d-rendering-context:offscreencontext2d-commit-2">commit</a>();
+ readonly attribute <a href="#offscreencanvas" id="the-offscreen-2d-rendering-context:offscreencanvas">OffscreenCanvas</a> <a href="#offscreencontext2d-canvas-2" id="the-offscreen-2d-rendering-context:offscreencontext2d-canvas-2">canvas</a>;
+};
+
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-2">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasstate" id="the-offscreen-2d-rendering-context:canvasstate">CanvasState</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-3">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvastransform" id="the-offscreen-2d-rendering-context:canvastransform">CanvasTransform</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-4">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvascompositing" id="the-offscreen-2d-rendering-context:canvascompositing">CanvasCompositing</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-5">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasimagesmoothing" id="the-offscreen-2d-rendering-context:canvasimagesmoothing">CanvasImageSmoothing</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-6">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasfillstrokestyles" id="the-offscreen-2d-rendering-context:canvasfillstrokestyles">CanvasFillStrokeStyles</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-7">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasshadowstyles" id="the-offscreen-2d-rendering-context:canvasshadowstyles">CanvasShadowStyles</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-8">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasfilters" id="the-offscreen-2d-rendering-context:canvasfilters">CanvasFilters</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-9">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasrect" id="the-offscreen-2d-rendering-context:canvasrect">CanvasRect</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-10">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasdrawpath" id="the-offscreen-2d-rendering-context:canvasdrawpath">CanvasDrawPath</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-11">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasdrawimage" id="the-offscreen-2d-rendering-context:canvasdrawimage">CanvasDrawImage</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-12">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvasimagedata" id="the-offscreen-2d-rendering-context:canvasimagedata">CanvasImageData</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-13">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvaspathdrawingstyles" id="the-offscreen-2d-rendering-context:canvaspathdrawingstyles">CanvasPathDrawingStyles</a>;
+<a href="#offscreencanvasrenderingcontext2d" id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-14">OffscreenCanvasRenderingContext2D</a> implements <a href="#canvaspath" id="the-offscreen-2d-rendering-context:canvaspath">CanvasPath</a>;
+</pre>
+
+ <p>The <dfn id="offscreencanvasrenderingcontext2d"><code>OffscreenCanvasRenderingContext2D</code></dfn> is a rendering context
+ interface for drawing to the <a href="#offscreencanvas-bitmap" id="the-offscreen-2d-rendering-context:offscreencanvas-bitmap">bitmap</a> of an
+ <code id="the-offscreen-2d-rendering-context:offscreencanvas-2"><a href="#offscreencanvas">OffscreenCanvas</a></code> object. It is similar to <code id="the-offscreen-2d-rendering-context:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code>,
+ with the following differences:</p>
+ <ul><li><p><a href="#canvastext" id="the-offscreen-2d-rendering-context:canvastext">text rendering</a> is not supported;</p></li><li><p>there is no support for <a href="#canvasuserinterface" id="the-offscreen-2d-rendering-context:canvasuserinterface">user interface</a>
+ features;</p></li><li><p>its <code id="the-offscreen-2d-rendering-context:offscreencontext2d-canvas-2-2"><a href="#offscreencontext2d-canvas-2">canvas</a></code> attribute refers to an
+ <code id="the-offscreen-2d-rendering-context:offscreencanvas-3"><a href="#offscreencanvas">OffscreenCanvas</a></code> object rather than a <code id="the-offscreen-2d-rendering-context:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> element;</p></li><li><p>it has a <code id="the-offscreen-2d-rendering-context:offscreencontext2d-commit-2-2"><a href="#offscreencontext2d-commit-2">commit()</a></code> method for pushing the
+ rendered image to the context's <code id="the-offscreen-2d-rendering-context:offscreencanvas-4"><a href="#offscreencanvas">OffscreenCanvas</a></code> object's <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder">placeholder <code>canvas</code> element</a>.</p></li></ul>
+
+ <p>An <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-15"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object has a <dfn id="offscreencontext2d-bitmap">bitmap</dfn> that is initialized when the object is
+ created.</p>
+
+ <p>The <a href="#offscreencontext2d-bitmap" id="the-offscreen-2d-rendering-context:offscreencontext2d-bitmap">bitmap</a> has an <dfn id="offscreencontext2d-origin-clean">origin-clean</dfn> flag, which can be set to true or
+ false. Initially, when one of these bitmaps is created, its <a href="#offscreencontext2d-origin-clean" id="the-offscreen-2d-rendering-context:offscreencontext2d-origin-clean">origin-clean</a> flag must be set to true.</p>
+
+ <p>An <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-16"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object also has an <dfn id="offscreencontext2d-alpha">alpha</dfn> flag, which can be set to true or false. Initially,
+ when the context is created, its alpha flag must be set to true. When an
+ <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-17"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object has its <a href="#offscreencontext2d-alpha" id="the-offscreen-2d-rendering-context:offscreencontext2d-alpha">alpha</a> flag set to false, then its alpha channel must be
+ fixed to 1.0 (fully opaque) for all pixels, and attempts to change the alpha component of any pixel
+ must be silently ignored.</p>
+
+ <p>An <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-18"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object has an <dfn id="associated-offscreencanvas-object">associated
+ <code>OffscreenCanvas</code> object</dfn>, which is the <code id="the-offscreen-2d-rendering-context:offscreencanvas-5"><a href="#offscreencanvas">OffscreenCanvas</a></code> object
+ from which the <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-19"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code> object was created.
+
+ </p><dl class="domintro"><dt><var>offscreenCanvasRenderingContext2D</var> . <code id="offscreencontext2d-commit"><a href="#offscreencontext2d-commit-2">commit</a></code>()</dt><dd>
+ <p>Copies the rendering context's <a href="#offscreencontext2d-bitmap" id="the-offscreen-2d-rendering-context:offscreencontext2d-bitmap-2">bitmap</a> to
+ the bitmap of the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-2">placeholder <code>canvas</code>
+ element</a> of the <a href="#associated-offscreencanvas-object" id="the-offscreen-2d-rendering-context:associated-offscreencanvas-object">associated <code>OffscreenCanvas</code> object</a>. The copy
+ operation is asynchronous.</p>
+ </dd><dt><var>offscreenCanvas</var> = <var>offscreenCanvasRenderingContext2D</var> . <code id="offscreencontext2d-canvas"><a href="#offscreencontext2d-canvas-2">canvas</a></code></dt><dd>
+ <p>Returns the <a href="#associated-offscreencanvas-object" id="the-offscreen-2d-rendering-context:associated-offscreencanvas-object-2">associated <code>OffscreenCanvas</code> object</a>.</p>
+ </dd></dl>
+
+
+
+ <p>The <dfn id="offscreen-2d-context-creation-algorithm">offscreen 2D context creation algorithm</dfn>, which is passed a
+ <var>target</var> (an <code id="the-offscreen-2d-rendering-context:offscreencanvas-6"><a href="#offscreencanvas">OffscreenCanvas</a></code> object) and optionally some arguments,
+ consists of running the following steps:</p>
+
+ <ol><li><p>If the algorithm was passed some arguments, let <var>arg</var> be the first such
+ argument. Otherwise, let <var>arg</var> be undefined.</p></li><li><p>Let <var>settings</var> be the result of <a href="#coerce-context-arguments-for-2d" id="the-offscreen-2d-rendering-context:coerce-context-arguments-for-2d">coercing the <var>arg</var> context arguments
+ for 2D</a>.</p></li><li><p>Let <var>context</var> be a new <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-20"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code>
+ object.</p></li><li><p>Set <var>context</var>'s <a href="#associated-offscreencanvas-object" id="the-offscreen-2d-rendering-context:associated-offscreencanvas-object-3">associated <code>OffscreenCanvas</code> object</a> to
+ <var>target</var>.</p></li><li><p>Process each of the members of <var>settings</var> as follows:</p>
+ <dl><dt><code id="the-offscreen-2d-rendering-context:dom-canvasrenderingcontext2dsettings-alpha"><a href="#dom-canvasrenderingcontext2dsettings-alpha">alpha</a></code></dt><dd>If false, set <var>context</var>'s <a href="#offscreencontext2d-alpha" id="the-offscreen-2d-rendering-context:offscreencontext2d-alpha-2">alpha</a>
+ flag to false.</dd></dl>
+ </li><li><p>Set <var>context</var>'s <a href="#offscreencontext2d-bitmap" id="the-offscreen-2d-rendering-context:offscreencontext2d-bitmap-3">bitmap</a> to a newly
+ created bitmap with the dimensions specified by the <code id="the-offscreen-2d-rendering-context:dom-offscreencanvas-width-2"><a href="#dom-offscreencanvas-width-2">width</a></code> and <code id="the-offscreen-2d-rendering-context:dom-offscreencanvas-height-2"><a href="#dom-offscreencanvas-height-2">height</a></code> attributes of <var>target</var>, and set
+ <var>target</var>'s bitmap to the same bitmap (so that they are shared).</p></li><li><p>If <var>context</var>'s <a href="#offscreencontext2d-alpha" id="the-offscreen-2d-rendering-context:offscreencontext2d-alpha-3">alpha</a> flag is set
+ to true, initialize all the pixels of <var>context</var>'s <a href="#offscreencontext2d-bitmap" id="the-offscreen-2d-rendering-context:offscreencontext2d-bitmap-4">bitmap</a> to transparent black. Otherwise, initialize
+ the pixels to opaque black.</p></li><li><p>Return <var>context</var>.</p></li></ol>
+
+ <p>The <dfn id="offscreencontext2d-commit-2"><code>commit()</code></dfn> method, when invoked,
+ must run the following steps:</p>
+
+ <ol><li><p>If this <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-21"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code>'s <a href="#associated-offscreencanvas-object" id="the-offscreen-2d-rendering-context:associated-offscreencanvas-object-4">associated
+ <code>OffscreenCanvas</code> object</a> does not have a <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-3">placeholder <code>canvas</code> element</a>, abort
+ these steps.</p></li><li><p>Let <var>image</var> be a copy of this <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-22"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code>'s
+ <a href="#offscreencontext2d-bitmap" id="the-offscreen-2d-rendering-context:offscreencontext2d-bitmap-5">bitmap</a>, including the value of its <a href="#offscreencontext2d-origin-clean" id="the-offscreen-2d-rendering-context:offscreencontext2d-origin-clean-2">origin-clean</a> flag.</p></li><li>
+ <p><a href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="the-offscreen-2d-rendering-context:queue-a-task">Queue a task</a> in the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-4">placeholder <code>canvas</code> element</a>'s
+ <a href="https://html.spec.whatwg.org/multipage/webappapis.html#relevant-settings-object" id="the-offscreen-2d-rendering-context:relevant-settings-object">relevant settings object</a>'s <a href="https://html.spec.whatwg.org/multipage/webappapis.html#responsible-event-loop" id="the-offscreen-2d-rendering-context:responsible-event-loop">responsible event loop</a> (which will be a
+ <a href="https://html.spec.whatwg.org/multipage/browsers.html#browsing-context" id="the-offscreen-2d-rendering-context:browsing-context">browsing context</a> <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop" id="the-offscreen-2d-rendering-context:event-loop">event loop</a>) to set the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-5">placeholder <code>canvas</code> element</a>'s
+ <a href="#output-bitmap" id="the-offscreen-2d-rendering-context:output-bitmap">output bitmap</a> to be a reference to <var>image</var>.</p>
+
+ <p class="note">If <var>image</var> has different dimensions than the bitmap previously
+ referenced as the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-6">placeholder <code>canvas</code>
+ element</a>'s <a href="#output-bitmap" id="the-offscreen-2d-rendering-context:output-bitmap-2">output bitmap</a>, then this task will result in a change in
+ the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-7">placeholder <code>canvas</code>
+ element</a>'s <a data-x-internal="intrinsic-dimensions" href="https://drafts.csswg.org/css2/conform.html#intrinsic" id="the-offscreen-2d-rendering-context:intrinsic-dimensions">intrinsic size</a>, which can affect
+ document layout.</p>
+ </li></ol>
+
+ <p class="note">Implementations are encouraged to short-circuit the graphics update steps of
+ the <a href="https://html.spec.whatwg.org/multipage/browsers.html#browsing-context" id="the-offscreen-2d-rendering-context:browsing-context-2">browsing context</a> <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop" id="the-offscreen-2d-rendering-context:event-loop-2">event loop</a> for the purposes of updating the
+ contents of a <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-8">placeholder <code>canvas</code>
+ element</a> to the display. This could mean, for example, that the <code id="the-offscreen-2d-rendering-context:offscreencontext2d-commit-2-3"><a href="#offscreencontext2d-commit-2">commit()</a></code> method can copy the bitmap contents directly
+ to a graphics buffer that is mapped to the physical display location of the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-9">placeholder <code>canvas</code> element</a>. This or
+ similar short-circuiting approaches can significantly reduce display latency, especially in cases
+ where the <code id="the-offscreen-2d-rendering-context:offscreencontext2d-commit-2-4"><a href="#offscreencontext2d-commit-2">commit()</a></code> method is invoked from a worker
+ and the <a href="https://html.spec.whatwg.org/multipage/webappapis.html#event-loop" id="the-offscreen-2d-rendering-context:event-loop-3">event loop</a> of the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-10">placeholder <code>canvas</code> element</a>'s
+ <a href="https://html.spec.whatwg.org/multipage/browsers.html#browsing-context" id="the-offscreen-2d-rendering-context:browsing-context-3">browsing context</a> is busy. However, such shortcuts can not have any
+ script-observable side-effects. This means that the committed bitmap still needs to be sent to
+ the <a href="#offscreencanvas-placeholder" id="the-offscreen-2d-rendering-context:offscreencanvas-placeholder-11">placeholder <code>canvas</code> element</a>, in
+ case the element is used as a <code id="the-offscreen-2d-rendering-context:canvasimagesource"><a href="#canvasimagesource">CanvasImageSource</a></code>, as an
+ <code id="the-offscreen-2d-rendering-context:imagebitmapsource"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmapsource">ImageBitmapSource</a></code>, or in case <code id="the-offscreen-2d-rendering-context:dom-canvas-todataurl-2"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code>
+ or <code id="the-offscreen-2d-rendering-context:dom-canvas-toblob-2"><a href="#dom-canvas-toblob-2">toBlob()</a></code> are called on it.</p>
+
+ <p>The <dfn id="offscreencontext2d-canvas-2"><code>canvas</code></dfn> attribute, on getting,
+ must return this <code id="the-offscreen-2d-rendering-context:offscreencanvasrenderingcontext2d-23"><a href="#offscreencanvasrenderingcontext2d">OffscreenCanvasRenderingContext2D</a></code>'s <a href="#associated-offscreencanvas-object" id="the-offscreen-2d-rendering-context:associated-offscreencanvas-object-5">associated
+ <code>OffscreenCanvas</code> object</a>.
+
+ </p>
+
+
+
+ <h5 id="colour-spaces-and-colour-correction"><span class="secno">4.12.5.4</span> Color spaces and color correction<a class="self-link" href="#colour-spaces-and-colour-correction"/></h5>
+
+ <p>The <code id="colour-spaces-and-colour-correction:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> APIs must perform color correction at only two points: when rendering
+ images with their own gamma correction and color space information onto a bitmap, to convert the
+ image to the color space used by the bitmaps (e.g. using the 2D Context's <code id="colour-spaces-and-colour-correction:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method with an
+ <code id="colour-spaces-and-colour-correction:htmlorsvgimageelement"><a href="#htmlorsvgimageelement">HTMLOrSVGImageElement</a></code> object), and when rendering the actual canvas bitmap to the
+ output device.</p>
+
+ <p class="note">Thus, in the 2D context, colors used to draw shapes onto the canvas will exactly
+ match colors obtained through the <code id="colour-spaces-and-colour-correction:dom-context-2d-getimagedata-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code> method.</p>
+
+ <p>The <code id="colour-spaces-and-colour-correction:dom-canvas-todataurl-2"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code> method, when invoked, must not
+ include color space information in the resources they return. Where the output format allows it,
+ the color of pixels in resources created by <code id="colour-spaces-and-colour-correction:dom-canvas-todataurl-2-2"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code>
+ must match those returned by the <code id="colour-spaces-and-colour-correction:dom-context-2d-getimagedata-2-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code>
+ method.</p>
+
+ <p>In user agents that support CSS, the color space used by a <code id="colour-spaces-and-colour-correction:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> element must
+ match the color space used for processing any colors for that element in CSS.</p>
+
+ <p>The gamma correction and color space information of images must be handled in such a way that
+ an image rendered directly using an <code id="colour-spaces-and-colour-correction:the-img-element"><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element">img</a></code> element would use the same colors as one
+ painted on a <code id="colour-spaces-and-colour-correction:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element that is then itself rendered. Furthermore, the rendering
+ of images that have no color correction information (such as those returned by the <code id="colour-spaces-and-colour-correction:dom-canvas-todataurl-2-3"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code> method) must be rendered with no color
+ correction.</p>
+
+ <p class="note">Thus, in the 2D context, calling the <code id="colour-spaces-and-colour-correction:dom-context-2d-drawimage-2"><a href="#dom-context-2d-drawimage">drawImage()</a></code> method to render the output of the <code id="colour-spaces-and-colour-correction:dom-canvas-todataurl-2-4"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code> method to the canvas, given the appropriate
+ dimensions, has no visible effect.</p>
+
+
+
+
+
+ <h5 id="serialising-bitmaps-to-a-file"><span class="secno">4.12.5.5</span> Serializing bitmaps to a file<a class="self-link" href="#serialising-bitmaps-to-a-file"/></h5>
+
+
+
+ <p>When a user agent is to create <dfn id="a-serialisation-of-the-bitmap-as-a-file">a
+ serialization of the bitmap as a file</dfn>, given an optional <var>type</var> and
+ <var>quality</var>, it must create an image file in the format given by <var>type</var>, or if
+ <var>type</var> was not supplied, in the PNG format. If an error occurs during the creation of
+ the image file (e.g. an internal encoder error), then the result of the serialization is null.
+ <a href="https://html.spec.whatwg.org/multipage/references.html#refsPNG">[PNG]</a></p>
+
+ <p>The image file's pixel data must be the bitmap's pixel data scaled to one image pixel per
+ coordinate space unit, and if the file format used supports encoding resolution metadata, the
+ resolution must be given as 96dpi (one image pixel per <a data-x-internal="'px'" href="https://drafts.csswg.org/css-values/#px" id="serialising-bitmaps-to-a-file:'px'">CSS pixel</a>).</p>
+
+ <p>If <var>type</var> is supplied, then it must be interpreted as a <a data-x-internal="mime-type" href="https://mimesniff.spec.whatwg.org/#mime-type" id="serialising-bitmaps-to-a-file:mime-type">MIME
+ type</a> giving the format to use. If the type has any parameters, then it must be treated as
+ not supported.</p>
+
+ <p class="example">For example, the value &quot;<code id="serialising-bitmaps-to-a-file:image/png"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot; would mean to generate a PNG
+ image, the value &quot;<code id="serialising-bitmaps-to-a-file:image/jpeg"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/jpeg">image/jpeg</a></code>&quot; would mean to generate a JPEG image, and the value
+ &quot;<code id="serialising-bitmaps-to-a-file:image/svg+xml"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/svg+xml">image/svg+xml</a></code>&quot; would mean to generate an SVG image (which would require that the
+ user agent track how the bitmap was generated, an unlikely, though potentially awesome,
+ feature).</p>
+
+ <p>User agents must support PNG (&quot;<code id="serialising-bitmaps-to-a-file:image/png-2"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/png">image/png</a></code>&quot;). User agents may support other types.
+ If the user agent does not support the requested type, then it must create the file using the PNG
+ format. <a href="https://html.spec.whatwg.org/multipage/references.html#refsPNG">[PNG]</a></p>
+
+ <p>User agents must <a data-x-internal="converted-to-ascii-lowercase" href="https://infra.spec.whatwg.org/#ascii-lowercase" id="serialising-bitmaps-to-a-file:converted-to-ascii-lowercase">convert the provided type to ASCII
+ lowercase</a> before establishing if they support that type.</p>
+
+ <p>For image types that do not support an alpha channel, the serialized image must be the bitmap
+ image composited onto a solid black background using the source-over operator.</p>
+
+ <p>If <var>type</var> is an image format that supports variable quality (such as
+ &quot;<code id="serialising-bitmaps-to-a-file:image/jpeg-2"><a href="https://html.spec.whatwg.org/multipage/indices.html#image/jpeg">image/jpeg</a></code>&quot;) and <var>quality</var> is given, then, if <a data-x-internal="js-type" href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values" id="serialising-bitmaps-to-a-file:js-type">Type</a>(<var>quality</var>) is Number, and <var>quality</var> is in the range
+ 0.0 to 1.0 inclusive, the user agent must treat <var>quality</var> as the desired quality level.
+ If <a data-x-internal="js-type" href="https://tc39.github.io/ecma262/#sec-ecmascript-data-types-and-values" id="serialising-bitmaps-to-a-file:js-type-2">Type</a>(<var>quality</var>) is not Number, or if <var>quality</var>
+ is outside that range, the user agent must use its default quality value, as if the
+ <var>quality</var> argument had not been given.</p>
+
+ <p class="note">The use of type-testing here, instead of simply declaring <var>quality</var> as
+ a Web IDL <code>double</code>, is a historical artifact.</p>
+
+
+
+
+
+
+ <h5 id="security-with-canvas-elements"><span class="secno">4.12.5.6</span> Security with <code id="security-with-canvas-elements:the-canvas-element"><a href="#the-canvas-element">canvas</a></code> elements<a class="self-link" href="#security-with-canvas-elements"/></h5>
+
+ <p><i>This section is non-normative.</i></p>
+
+ <p><strong>Information leakage</strong> can occur if scripts from one <a href="https://html.spec.whatwg.org/multipage/origin.html#concept-origin" id="security-with-canvas-elements:concept-origin">origin</a> can
+ access information (e.g. read pixels) from images from another origin (one that isn't the <a href="https://html.spec.whatwg.org/multipage/origin.html#same-origin" id="security-with-canvas-elements:same-origin">same</a>).</p>
+
+ <p>To mitigate this, bitmaps used with <code id="security-with-canvas-elements:the-canvas-element-2"><a href="#the-canvas-element">canvas</a></code> elements and <code id="security-with-canvas-elements:imagebitmap"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code>
+ objects are defined to have a flag indicating whether they are <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean">origin-clean</a>. All bitmaps start with their <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-2">origin-clean</a> set to true. The flag is set to false
+ when cross-origin images are used.</p>
+
+ <p>The <code id="security-with-canvas-elements:dom-canvas-todataurl-2"><a href="#dom-canvas-todataurl-2">toDataURL()</a></code>, <code id="security-with-canvas-elements:dom-canvas-toblob-2"><a href="#dom-canvas-toblob-2">toBlob()</a></code>, and <code id="security-with-canvas-elements:dom-context-2d-getimagedata-2"><a href="#dom-context-2d-getimagedata-2">getImageData()</a></code> methods check the flag and will
+ throw a <a data-x-internal="securityerror" href="https://heycam.github.io/webidl/#securityerror" id="security-with-canvas-elements:securityerror">&quot;<code>SecurityError</code>&quot;</a> <code id="security-with-canvas-elements:domexception"><a data-x-internal="domexception" href="https://heycam.github.io/webidl/#dfn-DOMException">DOMException</a></code> rather than leak
+ cross-origin data.</p>
+
+ <p>The value of the <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-3">origin-clean</a> flag is
+ propagated from a source <code id="security-with-canvas-elements:the-canvas-element-3"><a href="#the-canvas-element">canvas</a></code> element's bitmap to a new <code id="security-with-canvas-elements:imagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code>
+ object by <code id="security-with-canvas-elements:dom-createimagebitmap-2"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#dom-createimagebitmap-2">createImageBitmap()</a></code>. Conversely, a
+ destination <code id="security-with-canvas-elements:the-canvas-element-4"><a href="#the-canvas-element">canvas</a></code> element's bitmap will have its <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-4">origin-clean</a> flags set to false by <code id="security-with-canvas-elements:dom-context-2d-drawimage"><a href="#dom-context-2d-drawimage">drawImage</a></code> if the source image is an
+ <code id="security-with-canvas-elements:imagebitmap-3"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> object whose bitmap has its <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-5">origin-clean</a> flag set to false.</p>
+
+ <p>The flag can be reset in certain situations; for example, when changing the value of the
+ <code id="security-with-canvas-elements:attr-canvas-width"><a href="#attr-canvas-width">width</a></code> or the <code id="security-with-canvas-elements:attr-canvas-height"><a href="#attr-canvas-height">height</a></code> content attribute of the <code id="security-with-canvas-elements:the-canvas-element-5"><a href="#the-canvas-element">canvas</a></code> element
+ to which a <code id="security-with-canvas-elements:canvasrenderingcontext2d"><a href="#canvasrenderingcontext2d">CanvasRenderingContext2D</a></code> is bound, the bitmap is
+ cleared and its <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-6">origin-clean</a> flag is reset.</p>
+ <p>When using an <code id="security-with-canvas-elements:imagebitmaprenderingcontext"><a href="#imagebitmaprenderingcontext">ImageBitmapRenderingContext</a></code>, the value of the <a href="#concept-canvas-origin-clean" id="security-with-canvas-elements:concept-canvas-origin-clean-7">origin-clean</a> flag is propagated from
+ <code id="security-with-canvas-elements:imagebitmap-4"><a href="https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#imagebitmap">ImageBitmap</a></code> objects when they are transferred to the <code id="security-with-canvas-elements:the-canvas-element-6"><a href="#the-canvas-element">canvas</a></code>
+ via <a href="#dom-imagebitmaprenderingcontext-transferfromimagebitmap-2" id="security-with-canvas-elements:dom-imagebitmaprenderingcontext-transferfromimagebitmap-2">transferFromImageBitmap()</a>.</p>
+
- </body></html>
+ </body></html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/gentestutils.py b/tests/wpt/web-platform-tests/2dcontext/tools/gentestutils.py
index 030cd8e766d..400a27e83ad 100644
--- a/tests/wpt/web-platform-tests/2dcontext/tools/gentestutils.py
+++ b/tests/wpt/web-platform-tests/2dcontext/tools/gentestutils.py
@@ -9,12 +9,9 @@
# It has been adapted for use with the Web Platform Test Suite suite at
# https://github.com/w3c/web-platform-tests/
#
-# The W3C version excludes a number of features (multiple versions of each test
-# case of varying verbosity, Mozilla mochitests, semi-automated test harness)
-# to focus on simply providing reviewable test cases. It also expects a different
-# directory structure.
-# This code attempts to support both versions, but the non-W3C version hasn't
-# been tested recently and is probably broken.
+# The original version had a number of now-removed features (multiple versions of
+# each test case of varying verbosity, Mozilla mochitests, semi-automated test
+# harness). It also had a different directory structure.
# To update or add test cases:
#
@@ -28,9 +25,8 @@
# (100x50 images in both cases), or a string 'size 100 50' (or any other size)
# followed by Python code using Pycairo to generate the image.
#
-# * Run "python gentest.py".
+# * Run "./build.sh".
# This requires a few Python modules which might not be ubiquitous.
-# It has only been tested on Linux.
# It will usually emit some warnings, which ideally should be fixed but can
# generally be safely ignored.
#
@@ -57,16 +53,10 @@ except ImportError:
def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOFFSCREENCANVAS):
- # Default mode is for the W3C test suite; the --standalone option
- # generates various extra files that aren't needed there
- W3CMODE = True
- if '--standalone' in sys.argv:
- W3CMODE = False
-
MISCOUTPUTDIR = './output'
- SPECOUTPUTDIR = '../../annotated-spec'
+ SPECOUTPUTDIR = '../'
- SPECOUTPUTPATH = '../annotated-spec' # relative to TESTOUTPUTDIR
+ SPECOUTPUTPATH = './' # relative to TESTOUTPUTDIR
def simpleEscapeJS(str):
return str.replace('\\', '\\\\').replace('"', '\\"')
@@ -186,17 +176,26 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
# Ensure the test output directories exist
testdirs = [TESTOUTPUTDIR, IMAGEOUTPUTDIR, MISCOUTPUTDIR]
- if not W3CMODE: testdirs.append('%s/mochitests' % MISCOUTPUTDIR)
- else:
- for map_dir in set(name_mapping.values()):
- testdirs.append("%s/%s" % (TESTOUTPUTDIR, map_dir))
+ for map_dir in set(name_mapping.values()):
+ testdirs.append("%s/%s" % (TESTOUTPUTDIR, map_dir))
for d in testdirs:
try: os.mkdir(d)
except: pass # ignore if it already exists
- mochitests = []
used_images = {}
+ def map_name(name):
+ mapped_name = None
+ for mn in sorted(name_mapping.keys(), key=len, reverse=True):
+ if name.startswith(mn):
+ mapped_name = "%s/%s" % (name_mapping[mn], name)
+ break
+ if not mapped_name:
+ print "LIKELY ERROR: %s has no defined target directory mapping" % name
+ if 'manual' in test:
+ mapped_name += "-manual"
+ return mapped_name
+
def expand_test_code(code):
code = re.sub(r'@nonfinite ([^(]+)\(([^)]+)\)(.*)', lambda m: expand_nonfinite(m.group(1), m.group(2), m.group(3)), code) # must come before '@assert throws'
@@ -265,66 +264,6 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
return code
- def expand_mochitest_code(code):
- code = re.sub(r'@nonfinite ([^(]+)\(([^)]+)\)(.*)', lambda m: expand_nonfinite(m.group(1), m.group(2), m.group(3)), code)
-
- code = re.sub(r'@assert pixel (\d+,\d+) == (\d+,\d+,\d+,\d+);',
- r'isPixel(ctx, \1, \2, "\1", "\2", 0);',
- code)
-
- code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+);',
- r'isPixel(ctx, \1, \2, "\1", "\2", 2);',
- code)
-
- code = re.sub(r'@assert pixel (\d+,\d+) ==~ (\d+,\d+,\d+,\d+) \+/- (\d+);',
- r'isPixel(ctx, \1, \2, "\1", "\2", \3);',
- code)
-
- code = re.sub(r'@assert throws (\S+_ERR) (.*);',
- lambda m: 'var _thrown = undefined; try {\n %s;\n} catch (e) { _thrown = e }; ok(_thrown && _thrown.code == DOMException.%s, "should throw %s");'
- % (m.group(2), m.group(1), m.group(1))
- , code)
-
- code = re.sub(r'@assert throws (\S+Error) (.*);',
- lambda m: 'var _thrown = undefined; try {\n %s;\n} catch (e) { _thrown = e }; ok(_thrown && (_thrown instanceof %s), "should throw %s");'
- % (m.group(2), m.group(1), m.group(1))
- , code)
-
- code = re.sub(r'@assert throws (.*);',
- lambda m: 'try { var _thrown = false;\n %s;\n} catch (e) { _thrown = true; } finally { ok(_thrown, "should throw exception"); }'
- % (m.group(1))
- , code)
-
- code = re.sub(r'@assert (.*) =~ (.*);',
- lambda m: 'ok(%s.match(%s), "%s.match(%s)");'
- % (m.group(1), m.group(2), escapeJS(m.group(1)), escapeJS(m.group(2)))
- , code)
-
- code = re.sub(r'@assert (.*);',
- lambda m: 'ok(%s, "%s");'
- % (m.group(1), escapeJS(m.group(1)))
- , code)
-
- code = re.sub(r'((?:^|\n|;)\s*)ok(.*;) @moz-todo',
- lambda m: '%stodo%s'
- % (m.group(1), m.group(2))
- , code)
-
- code = re.sub(r'((?:^|\n|;)\s*)(is.*;) @moz-todo',
- lambda m: '%stodo_%s'
- % (m.group(1), m.group(2))
- , code)
-
- code = re.sub(r'@moz-UniversalBrowserRead;',
- "netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');"
- , code)
-
- code = code.replace('../images/', 'image_')
-
- assert '@' not in code, '@ not in code:\n%s' % code
-
- return code
-
used_tests = {}
for i in range(len(tests)):
test = tests[i]
@@ -336,19 +275,13 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
print "Test %s is defined twice" % name
used_tests[name] = 1
- mapped_name = None
- for mn in sorted(name_mapping.keys(), key=len, reverse=True):
- if name.startswith(mn):
- mapped_name = "%s/%s" % (name_mapping[mn], name)
- break
+ mapped_name = map_name(name)
if not mapped_name:
- print "LIKELY ERROR: %s has no defined target directory mapping" % name
if ISOFFSCREENCANVAS:
continue
else:
mapped_name = name
- if 'manual' in test:
- mapped_name += "-manual"
+
cat_total = ''
for cat_part in [''] + name.split('.')[:-1]:
@@ -361,7 +294,7 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
if ref not in spec_ids:
print "Test %s uses nonexistent spec point %s" % (name, ref)
spec_refs.setdefault(ref, []).append(name)
- #if not (len(test.get('testing', [])) or 'mozilla' in test):
+
if not test.get('testing', []):
print "Test %s doesn't refer to any spec points" % name
@@ -370,51 +303,14 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
code = expand_test_code(test['code'])
- mochitest = not (W3CMODE or 'manual' in test or 'disabled' in test.get('mozilla', {}))
- if mochitest:
- mochi_code = expand_mochitest_code(test['code'])
-
- mochi_name = name
- if 'mozilla' in test:
- if 'throws' in test['mozilla']:
- mochi_code = templates['mochitest.exception'] % mochi_code
- if 'bug' in test['mozilla']:
- mochi_name = "%s - bug %s" % (name, test['mozilla']['bug'])
-
- if 'desc' in test:
- mochi_desc = '<!-- Testing: %s -->\n' % test['desc']
- else:
- mochi_desc = ''
-
- if 'deferTest' in mochi_code:
- mochi_setup = ''
- mochi_footer = ''
- else:
- mochi_setup = ''
- mochi_footer = 'SimpleTest.finish();\n'
-
- for f in ['isPixel', 'todo_isPixel', 'deferTest', 'wrapFunction']:
- if f in mochi_code:
- mochi_setup += templates['mochitest.%s' % f]
- else:
- if not W3CMODE:
- print "Skipping mochitest for %s" % name
- mochi_name = ''
- mochi_desc = ''
- mochi_code = ''
- mochi_setup = ''
- mochi_footer = ''
-
expectation_html = ''
if 'expected' in test and test['expected'] is not None:
expected = test['expected']
expected_img = None
if expected == 'green':
- expected_img = make_flat_image('green-100x50.png', 100, 50, 0,1,0,1)
- if W3CMODE: expected_img = "/images/" + expected_img
+ expected_img = "/images/" + make_flat_image('green-100x50.png', 100, 50, 0,1,0,1)
elif expected == 'clear':
- expected_img = make_flat_image('clear-100x50.png', 100, 50, 0,0,0,0)
- if W3CMODE: expected_img = "/images/" + expected_img
+ expected_img = "/images/" + make_flat_image('clear-100x50.png', 100, 50, 0,0,0,0)
else:
if ';' in expected: print "Found semicolon in %s" % name
expected = re.sub(r'^size (\d+) (\d+)',
@@ -438,11 +334,9 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
prev = tests[i-1]['name'] if i != 0 else 'index'
next = tests[i+1]['name'] if i != len(tests)-1 else 'index'
- name_wrapped = name.replace('.', '.&#8203;') # (see https://bugzilla.mozilla.org/show_bug.cgi?id=376188)
+ name_wrapped = name.replace('.', '.&#8203;')
- refs = ''.join('<li><a href="%s/canvas.html#testrefs.%s">%s</a>\n' % (SPECOUTPUTPATH, n,n) for n in test.get('testing', []))
- if not W3CMODE and 'mozilla' in test and 'bug' in test['mozilla']:
- refs += '<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=%d">Bugzilla</a>' % test['mozilla']['bug']
+ refs = ''.join('<li><a href="%s/annotated-spec.html#testrefs.%s">%s</a>\n' % (SPECOUTPUTPATH, n,n) for n in test.get('testing', []))
notes = '<p class="notes">%s' % test['notes'] if 'notes' in test else ''
@@ -462,8 +356,7 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
used_images[i] = 1
i = '../images/%s' % i
images += '<img src="%s" id="%s" class="resource">\n' % (i,id)
- mochi_images = images.replace('../images/', 'image_')
- if W3CMODE: images = images.replace("../images/", "/images/")
+ images = images.replace("../images/", "/images/")
fonts = ''
fonthack = ''
@@ -492,135 +385,17 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
'fonts':fonts, 'fonthack':fonthack,
'canvas':canvas, 'expected':expectation_html, 'code':code,
'scripts':scripts + extra_script,
- 'mochi_name':mochi_name, 'mochi_desc':mochi_desc, 'mochi_code':mochi_code,
- 'mochi_setup':mochi_setup, 'mochi_footer':mochi_footer, 'mochi_images':mochi_images,
'fallback':fallback
}
- if W3CMODE:
- f = codecs.open('%s/%s%s.html' % (TESTOUTPUTDIR, mapped_name, name_variant), 'w', 'utf-8')
- f.write(templates['w3c'] % template_params)
- if ISOFFSCREENCANVAS:
- f = codecs.open('%s/%s%s.worker.js' % (TESTOUTPUTDIR, mapped_name, name_variant), 'w', 'utf-8')
- f.write(templates['w3cworker'] % template_params)
- else:
- f = codecs.open('%s/%s%s.html' % (TESTOUTPUTDIR, name, name_variant), 'w', 'utf-8')
- f.write(templates['standalone'] % template_params)
-
- f = codecs.open('%s/framed.%s%s.html' % (TESTOUTPUTDIR, name, name_variant), 'w', 'utf-8')
- f.write(templates['framed'] % template_params)
-
- f = codecs.open('%s/minimal.%s%s.html' % (TESTOUTPUTDIR, name, name_variant), 'w', 'utf-8')
- f.write(templates['minimal'] % template_params)
-
- if mochitest:
- mochitests.append(name)
- f = codecs.open('%s/mochitests/test_%s%s.html' % (MISCOUTPUTDIR, name, name_variant), 'w', 'utf-8')
- f.write(templates['mochitest'] % template_params)
-
- def write_mochitest_makefile():
- f = open('%s/mochitests/Makefile.in' % MISCOUTPUTDIR, 'w')
- f.write(templates['mochitest.Makefile'])
- files = ['test_%s.html' % n for n in mochitests] + ['image_%s' % n for n in used_images]
- chunksize = 100
- chunks = []
- for i in range(0, len(files), chunksize):
- chunk = files[i:i+chunksize]
- name = '_TEST_FILES_%d' % (i / chunksize)
- chunks.append(name)
- f.write('%s = \\\n' % name)
- for file in chunk: f.write('\t%s \\\n' % file)
- f.write('\t$(NULL)\n\n')
- f.write('# split up into groups to work around command-line length limits\n')
- for name in chunks:
- f.write('libs:: $(%s)\n\t$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)\n\n' % name)
-
- if not W3CMODE:
- for i in used_images:
- shutil.copyfile("../../images/%s" % i, "%s/mochitests/image_%s" % (MISCOUTPUTDIR, i))
- write_mochitest_makefile()
+ f = codecs.open('%s/%s%s.html' % (TESTOUTPUTDIR, mapped_name, name_variant), 'w', 'utf-8')
+ f.write(templates['w3c'] % template_params)
+ if ISOFFSCREENCANVAS:
+ f = codecs.open('%s/%s%s.worker.js' % (TESTOUTPUTDIR, mapped_name, name_variant), 'w', 'utf-8')
+ f.write(templates['w3cworker'] % template_params)
print
- def write_index():
- f = open('%s/index.html' % TESTOUTPUTDIR, 'w')
- f.write(templates['index.w3c' if W3CMODE else 'index'] % { 'updated':time.strftime('%Y-%m-%d', time.gmtime()) })
- f.write('\n<ul class="testlist">\n')
- depth = 1
- for category in category_names:
- name = category[1:-1] or ''
- count = len(category_contents_all[category])
- new_depth = category.count('.')
- while new_depth < depth: f.write(' '*(depth-1) + '</ul>\n'); depth -= 1
- f.write(' '*depth + templates['index.w3c.category.item' if W3CMODE else 'index.category.item'] % (name or 'all', name, count, '' if count==1 else 's'))
- while new_depth+1 > depth: f.write(' '*depth + '<ul>\n'); depth += 1
- for item in category_contents_direct.get(category, []):
- f.write(' '*depth + '<li><a href="%s.html">%s</a>\n' % (item, item) )
- while 0 < depth: f.write(' '*(depth-1) + '</ul>\n'); depth -= 1
-
- def write_category_indexes():
- for category in category_names:
- name = (category[1:-1] or 'all')
-
- f = open('%s/index.%s.html' % (TESTOUTPUTDIR, name), 'w')
- f.write(templates['index.w3c.frame' if W3CMODE else 'index.frame'] % { 'backrefs':backref_html(name), 'category':name })
- for item in category_contents_all[category]:
- f.write(templates['index.w3c.frame.item' if W3CMODE else 'index.frame.item'] % item)
-
- def write_reportgen():
- f = open('%s/reportgen.html' % MISCOUTPUTDIR, 'w')
- items_text = ',\n'.join(('"%s"' % item) for item in category_contents_all['.'])
- f.write(templates['reportgen'] % {'items':items_text })
-
- def write_results():
- results = {}
- uas = []
- uastrings = {}
- for item in category_contents_all['.']: results[item] = {}
-
- f = open('%s/results.html' % MISCOUTPUTDIR, 'w')
- f.write(templates['results'])
-
- if not os.path.exists('results.yaml'):
- print "Can't find results.yaml"
- else:
- for resultset in yaml.load(open('results.yaml', "r").read()):
- #title = "%s (%s)" % (resultset['ua'], resultset['time'])
- title = resultset['name']
- #assert title not in uas # don't allow repetitions
- if title not in uas:
- uas.append(title)
- uastrings[title] = resultset['ua']
- else:
- assert uastrings[title] == resultset['ua']
- for r in resultset['results']:
- if r['id'] not in results:
- print 'Skipping results for removed test %s' % r['id']
- continue
- results[r['id']][title] = (
- r['status'].lower(),
- re.sub(r'%(..)', lambda m: chr(int(m.group(1), 16)),
- re.sub(r'%u(....)', lambda m: unichr(int(m.group(1), 16)),
- r['notes'])).encode('utf8')
- )
-
- passes = {}
- for ua in uas:
- f.write('<th title="%s">%s\n' % (uastrings[ua], ua))
- passes[ua] = 0
- for id in category_contents_all['.']:
- f.write('<tr><td><a href="#%s" id="%s">#</a> <a href="%s.html">%s</a>\n' % (id, id, id, id))
- for ua in uas:
- status, details = results[id].get(ua, ('', ''))
- f.write('<td class="r %s"><ul class="d">%s</ul>\n' % (status, details))
- if status == 'pass': passes[ua] += 1
- f.write('<tr><th>Passes\n')
- for ua in uas:
- f.write('<td>%.1f%%\n' % ((100.0 * passes[ua]) / len(category_contents_all['.'])))
- f.write('<tr><td>\n')
- for ua in uas:
- f.write('<td>%s\n' % ua)
- f.write('</table>\n')
def getNodeText(node):
t, offsets = '', []
@@ -687,7 +462,7 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
# Insert our new stylesheet
n = doc.getElementsByTagName('head')[0].appendChild(doc.createElement('link'))
n.setAttribute('rel', 'stylesheet')
- n.setAttribute('href', '../common/canvas-spec.css' if W3CMODE else '../spectest.css')
+ n.setAttribute('href', '../common/canvas-spec.css')
n.setAttribute('type', 'text/css')
spec_assertion_patterns = []
@@ -734,11 +509,6 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
matched_assertions = {}
def process_element(e):
- if e.nodeType == e.ELEMENT_NODE and (e.getAttribute('class') == 'impl' or e.hasAttribute('data-component')):
- for c in e.childNodes:
- process_element(c)
- return
-
t, offsets = getNodeText(e)
for id, pattern, keyword, previously in spec_assertion_patterns:
m = pattern.search(t)
@@ -786,7 +556,7 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
n1.appendChild(doc.createTextNode(' '))
for test_id in spec_refs.get(id, []):
n = n1.appendChild(doc.createElement('a'))
- n.setAttribute('href', '../canvas/%s.html' % test_id)
+ n.setAttribute('href', '%s.html' % map_name(test_id))
n.appendChild(doc.createTextNode(test_id))
n1.appendChild(doc.createTextNode(' '))
n0 = doc.createTextNode(end_node.nodeValue[:end])
@@ -808,17 +578,13 @@ def genTestUtils(TESTOUTPUTDIR, IMAGEOUTPUTDIR, TEMPLATEFILE, NAME2DIRFILE, ISOF
# Convert from XHTML back to HTML
doc.documentElement.removeAttribute('xmlns')
- doc.documentElement.setAttribute('lang', doc.documentElement.getAttribute('xml:lang'))
head = doc.documentElement.getElementsByTagName('head')[0]
head.insertBefore(doc.createElement('meta'), head.firstChild).setAttribute('charset', 'UTF-8')
- f = codecs.open('%s/canvas.html' % SPECOUTPUTDIR, 'w', 'utf-8')
+ f = codecs.open('%s/annotated-spec.html' % SPECOUTPUTDIR, 'w', 'utf-8')
f.write(htmlSerializer(doc))
- if not W3CMODE:
- write_index()
- write_category_indexes()
- write_reportgen()
- write_results()
+
+ if not ISOFFSCREENCANVAS:
write_annotated_spec()
diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/name2dir.yaml b/tests/wpt/web-platform-tests/2dcontext/tools/name2dir.yaml
index c0508ddca9c..2c2eecdba3d 100644
--- a/tests/wpt/web-platform-tests/2dcontext/tools/name2dir.yaml
+++ b/tests/wpt/web-platform-tests/2dcontext/tools/name2dir.yaml
@@ -32,15 +32,15 @@
2d.text.draw.space.collapse.space: "text-styles"
2d.text.draw.space.collapse.start: "text-styles"
2d.state: "the-canvas-state"
-2d.canvas: "../html/semantics/embedded-content/the-canvas-element/"
-2d.getcontext: "../html/semantics/embedded-content/the-canvas-element/"
-2d.scaled: "../html/semantics/embedded-content/the-canvas-element/"
-2d.type: "../html/semantics/embedded-content/the-canvas-element/"
-context: "../html/semantics/embedded-content/the-canvas-element/"
-fallback: "../html/semantics/embedded-content/the-canvas-element/"
-initial: "../html/semantics/embedded-content/the-canvas-element/"
-security: "../html/semantics/embedded-content/the-canvas-element/"
-size: "../html/semantics/embedded-content/the-canvas-element/"
-toBlob: "../html/semantics/embedded-content/the-canvas-element/"
-toDataURL: "../html/semantics/embedded-content/the-canvas-element/"
-type: "../html/semantics/embedded-content/the-canvas-element/"
+2d.canvas: "../html/semantics/embedded-content/the-canvas-element"
+2d.getcontext: "../html/semantics/embedded-content/the-canvas-element"
+2d.scaled: "../html/semantics/embedded-content/the-canvas-element"
+2d.type: "../html/semantics/embedded-content/the-canvas-element"
+context: "../html/semantics/embedded-content/the-canvas-element"
+fallback: "../html/semantics/embedded-content/the-canvas-element"
+initial: "../html/semantics/embedded-content/the-canvas-element"
+security: "../html/semantics/embedded-content/the-canvas-element"
+size: "../html/semantics/embedded-content/the-canvas-element"
+toBlob: "../html/semantics/embedded-content/the-canvas-element"
+toDataURL: "../html/semantics/embedded-content/the-canvas-element"
+type: "../html/semantics/embedded-content/the-canvas-element"
diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/spec.yaml b/tests/wpt/web-platform-tests/2dcontext/tools/spec.yaml
index eb462067ad2..278dc95bd0d 100644
--- a/tests/wpt/web-platform-tests/2dcontext/tools/spec.yaml
+++ b/tests/wpt/web-platform-tests/2dcontext/tools/spec.yaml
@@ -1,6 +1,6 @@
-# Extracts from http://www.whatwg.org/specs/web-apps/current-work/
+# Extracts from https://html.spec.whatwg.org/
#
-# (c) Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and Opera Software ASA.
+# Parts of this specification are © Copyright 2004-2014 Apple Inc., Mozilla Foundation, and Opera Software ASA.
# You are granted a license to use, reproduce and create derivative works of this document.
assertions:
diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/specextract.py b/tests/wpt/web-platform-tests/2dcontext/tools/specextract.py
index 042c0bd8404..c3b4a071eed 100644
--- a/tests/wpt/web-platform-tests/2dcontext/tools/specextract.py
+++ b/tests/wpt/web-platform-tests/2dcontext/tools/specextract.py
@@ -1,15 +1,16 @@
import html5lib
import html5lib.treebuilders.dom
+import re
# Expected use:
-# curl --compressed http://www.whatwg.org/specs/web-apps/current-work/ >current-work
+# curl --compressed https://html.spec.whatwg.org/multipage/canvas.html >current-work
# python specextract.py
#
# Generates current-work-canvas.xhtml, for use by gentest.py to create the annotated spec document
def extract():
- parser = html5lib.html5parser.HTMLParser(tree=html5lib.treebuilders.dom.TreeBuilder)
- doc = parser.parse(open('current-work', "r"), encoding='utf-8')
+ parser = html5lib.html5parser.HTMLParser(tree=html5lib.getTreeBuilder("dom"))
+ doc = parser.parse(open('current-work', "r"), transport_encoding='utf-8')
head = doc.getElementsByTagName('head')[0]
for n in head.childNodes:
@@ -20,9 +21,15 @@ def extract():
#thecanvas = doc.getElementById('the-canvas') # doesn't work (?!)
thecanvas = [ n for n in doc.getElementsByTagName('h4') if n.getAttribute('id') == 'the-canvas-element' ][0]
+ # Add copyright from https://html.spec.whatwg.org/multipage/acknowledgements.html#acknowledgments
+ copy = doc.createElement('p')
+ copy.setAttribute('class', 'copyright')
+ copy.appendChild(doc.createTextNode(u'Parts of this specification are \xA9 Copyright 2004-2014 Apple Inc., Mozilla Foundation, and Opera Software ASA. You are granted a license to use, reproduce and create derivative works of this document.'))
+ header.appendChild(copy)
+
keep = [header, thecanvas]
node = thecanvas.nextSibling
- while node.nodeName != 'h4':
+ while node.nodeName != 'nav':
keep.append(node)
node = node.nextSibling
p = thecanvas.parentNode
@@ -33,23 +40,27 @@ def extract():
for n in header.childNodes[3:-4]:
header.removeChild(n)
- def make_absolute(uri):
- if uri.startswith('data:'):
- return uri
- elif uri[0] == '/':
- return 'http://www.whatwg.org' + uri
+ def make_absolute(url):
+ match = re.match(r'(\w+:|#)', url)
+ if match:
+ return url
+ elif url[0] == '/':
+ return 'https://html.spec.whatwg.org' + url
else:
- return 'http://www.whatwg.org/specs/web-apps/current-work/' + uri
+ return 'https://html.spec.whatwg.org/multipage/' + url
- # Fix the stylesheet, icon and image references
- for e in doc.getElementsByTagName('link'):
+ # Fix relative URLs
+ for e in doc.getElementsByTagName('script'):
+ e.setAttribute('src', make_absolute(e.getAttribute('src')))
+ for e in doc.getElementsByTagName('iframe'):
+ e.setAttribute('src', make_absolute(e.getAttribute('src')))
+ for e in doc.getElementsByTagName('img'):
+ e.setAttribute('src', make_absolute(e.getAttribute('src')))
+ for e in doc.getElementsByTagName('a'):
e.setAttribute('href', make_absolute(e.getAttribute('href')))
- for img in doc.getElementsByTagName('img'):
- img.setAttribute('src', make_absolute(img.getAttribute('src')))
# Convert to XHTML, because it's quicker to re-parse than HTML5
doc.documentElement.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml')
- doc.documentElement.setAttribute('xml:lang', doc.documentElement.getAttribute('lang'))
doc.removeChild(doc.firstChild) # remove the DOCTYPE
open('current-work-canvas.xhtml', 'w').write(doc.toxml(encoding = 'UTF-8'))
diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/tests.yaml b/tests/wpt/web-platform-tests/2dcontext/tools/tests.yaml
index 955640392ec..a11d7c0f35b 100644
--- a/tests/wpt/web-platform-tests/2dcontext/tools/tests.yaml
+++ b/tests/wpt/web-platform-tests/2dcontext/tools/tests.yaml
@@ -1057,7 +1057,7 @@
expected: green
- name: security.reset
- desc: Resetting the canvas state does not reset the origin-clean flag
+ desc: Resetting the canvas state resets the origin-clean flag
mozilla: { disabled } # relies on external resources
testing:
- initial.reset
@@ -1071,4 +1071,6 @@
ctx.drawImage(document.getElementById('yellow.png'), 0, 0);
@assert throws SECURITY_ERR canvas.toDataURL();
canvas.width = 100;
- @assert throws SECURITY_ERR canvas.toDataURL();
+ canvas.toDataURL();
+ ctx.getImageData(0, 0, 1, 1);
+ @assert true; // okay if there was no exception
diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml b/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml
index caae293bf30..63ffe9d5db8 100644
--- a/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml
+++ b/tests/wpt/web-platform-tests/2dcontext/tools/tests2d.yaml
@@ -118,6 +118,7 @@
}
if (ctx.setTransform) {
@assert ctx.setTransform(1, 0, 0, 1, 0, 0) === undefined;
+ @assert ctx.setTransform() === undefined;
}
@assert ctx.clearRect(0, 0, 0, 0) === undefined;
@assert ctx.fillRect(0, 0, 0, 0) === undefined;
@@ -162,7 +163,6 @@
@assert throws TypeError ctx.transform(1, 0, 0, 1, 0);
}
if (ctx.setTransform) {
- @assert throws TypeError ctx.setTransform();
@assert throws TypeError ctx.setTransform(1);
@assert throws TypeError ctx.setTransform(1, 0);
@assert throws TypeError ctx.setTransform(1, 0, 0);
@@ -871,6 +871,7 @@
ctx.fillRect(0, 0, 100, 50);
ctx.setTransform(1/2,0, 0,1/2, 0,0);
+ ctx.setTransform();
ctx.setTransform(2,0, 0,2, 0,0);
ctx.fillStyle = '#0f0';
ctx.fillRect(0, 0, 50, 25);
diff --git a/tests/wpt/web-platform-tests/2dcontext/tools/tests2dtext.yaml b/tests/wpt/web-platform-tests/2dcontext/tools/tests2dtext.yaml
index 9b168e996da..336e3cf38b4 100644
--- a/tests/wpt/web-platform-tests/2dcontext/tools/tests2dtext.yaml
+++ b/tests/wpt/web-platform-tests/2dcontext/tools/tests2dtext.yaml
@@ -12,6 +12,14 @@
ctx.font = '20PX SERIF';
@assert ctx.font === '20px serif'; @moz-todo
+- name: 2d.text.font.parse.tiny
+ testing:
+ - 2d.text.font.parse
+ - 2d.text.font.get
+ code: |
+ ctx.font = '1px sans-serif';
+ @assert ctx.font === '1px sans-serif';
+
- name: 2d.text.font.parse.complex
testing:
- 2d.text.font.parse
diff --git a/tests/wpt/web-platform-tests/2dcontext/transformations/2d.transformation.setTransform.multiple.html b/tests/wpt/web-platform-tests/2dcontext/transformations/2d.transformation.setTransform.multiple.html
index 79caa63080e..0e126566ecd 100644
--- a/tests/wpt/web-platform-tests/2dcontext/transformations/2d.transformation.setTransform.multiple.html
+++ b/tests/wpt/web-platform-tests/2dcontext/transformations/2d.transformation.setTransform.multiple.html
@@ -23,6 +23,7 @@ ctx.fillStyle = '#f00';
ctx.fillRect(0, 0, 100, 50);
ctx.setTransform(1/2,0, 0,1/2, 0,0);
+ctx.setTransform();
ctx.setTransform(2,0, 0,2, 0,0);
ctx.fillStyle = '#0f0';
ctx.fillRect(0, 0, 50, 25);
diff --git a/tests/wpt/web-platform-tests/FileAPI/OWNERS b/tests/wpt/web-platform-tests/FileAPI/OWNERS
index a84e2ab73d5..feec67b46ca 100644
--- a/tests/wpt/web-platform-tests/FileAPI/OWNERS
+++ b/tests/wpt/web-platform-tests/FileAPI/OWNERS
@@ -1,5 +1,4 @@
@inexorabletash
@zqzhang
-@zcorpan
@jdm
@mkruisselbrink
diff --git a/tests/wpt/web-platform-tests/FileAPI/idlharness.html b/tests/wpt/web-platform-tests/FileAPI/idlharness.html
index 0ef37000d31..b88a7521688 100644
--- a/tests/wpt/web-platform-tests/FileAPI/idlharness.html
+++ b/tests/wpt/web-platform-tests/FileAPI/idlharness.html
@@ -32,11 +32,10 @@ setup(function() {
idl_array.add_untested_idls("[PrimaryGlobal] interface Window { };");
- idl_array.add_untested_idls("interface ArrayBuffer {};");
- idl_array.add_untested_idls("interface ArrayBufferView {};");
+ idl_array.add_untested_idls("[Exposed=(Window,Worker)] interface ArrayBuffer {};");
idl_array.add_untested_idls("interface URL {};");
- idl_array.add_untested_idls("interface EventTarget {};");
- idl_array.add_untested_idls("interface Event {};");
+ idl_array.add_untested_idls("[Exposed=(Window,Worker)] interface EventTarget {};");
+ idl_array.add_untested_idls("[Exposed=(Window,Worker)] interface Event {};");
idl_array.add_untested_idls("[TreatNonCallableAsNull] callback EventHandlerNonNull = any (Event event);");
idl_array.add_untested_idls("typedef EventHandlerNonNull? EventHandler;");
diff --git a/tests/wpt/web-platform-tests/FileAPI/idlharness.worker.js b/tests/wpt/web-platform-tests/FileAPI/idlharness.worker.js
index 3243e34049a..138325b249f 100644
--- a/tests/wpt/web-platform-tests/FileAPI/idlharness.worker.js
+++ b/tests/wpt/web-platform-tests/FileAPI/idlharness.worker.js
@@ -10,11 +10,10 @@ request.onload = function() {
idl_array.add_untested_idls("[Global] interface Window { };");
- idl_array.add_untested_idls("interface ArrayBuffer {};");
- idl_array.add_untested_idls("interface ArrayBufferView {};");
+ idl_array.add_untested_idls("[Exposed=(Window,Worker)] interface ArrayBuffer {};");
idl_array.add_untested_idls("interface URL {};");
- idl_array.add_untested_idls("interface EventTarget {};");
- idl_array.add_untested_idls("interface Event {};");
+ idl_array.add_untested_idls("[Exposed=(Window,Worker)] interface EventTarget {};");
+ idl_array.add_untested_idls("[Exposed=(Window,Worker)] interface Event {};");
idl_array.add_untested_idls("[TreatNonCallableAsNull] callback EventHandlerNonNull = any (Event event);");
idl_array.add_untested_idls("typedef EventHandlerNonNull? EventHandler;");
diff --git a/tests/wpt/web-platform-tests/IndexedDB/idb-binary-key-detached.htm b/tests/wpt/web-platform-tests/IndexedDB/idb-binary-key-detached.htm
index ab672fa8bbe..26afcfb1cd0 100644
--- a/tests/wpt/web-platform-tests/IndexedDB/idb-binary-key-detached.htm
+++ b/tests/wpt/web-platform-tests/IndexedDB/idb-binary-key-detached.htm
@@ -14,13 +14,14 @@ indexeddb_test(
const tx = db.transaction('store', 'readwrite');
const store = tx.objectStore('store');
- const buffer = new Uint8Array([1,2,3,4]).buffer;
- assert_equals(buffer.byteLength, 4);
+ const array = new Uint8Array([1,2,3,4]);
+ const buffer = array.buffer;
+ assert_equals(array.byteLength, 4);
// Detach the ArrayBuffer by transferring it to a worker.
const worker = new Worker(URL.createObjectURL(new Blob([])));
worker.postMessage('', [buffer]);
- assert_equals(buffer.byteLength, 0);
+ assert_equals(array.byteLength, 0);
assert_throws(new TypeError, () => { store.put('', buffer); });
t.done();
diff --git a/tests/wpt/web-platform-tests/IndexedDB/interfaces.html b/tests/wpt/web-platform-tests/IndexedDB/interfaces.html
index 033ea7b6246..6fb37f88e51 100644
--- a/tests/wpt/web-platform-tests/IndexedDB/interfaces.html
+++ b/tests/wpt/web-platform-tests/IndexedDB/interfaces.html
@@ -33,6 +33,9 @@ async_test(function(t) {
// https://dom.spec.whatwg.org/#interface-eventtarget
idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface EventTarget { };");
+ // https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#domstringlist
+ idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface DOMStringList { };");
+
// 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 f34061997a0..3c993c3319f 100644
--- a/tests/wpt/web-platform-tests/IndexedDB/interfaces.idl
+++ b/tests/wpt/web-platform-tests/IndexedDB/interfaces.idl
@@ -201,11 +201,3 @@ enum IDBTransactionMode {
"readwrite",
"versionchange"
};
-
-interface DOMStringList {
- readonly attribute unsigned long length;
- getter DOMString (unsigned long index);
- DOMString? item(unsigned long index);
-
- boolean contains(DOMString str);
-};
diff --git a/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js b/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js
index 42da53ba462..22aa386cb40 100644
--- a/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js
+++ b/tests/wpt/web-platform-tests/IndexedDB/interfaces.worker.js
@@ -25,6 +25,9 @@ async_test(function(t) {
// https://dom.spec.whatwg.org/#interface-eventtarget
idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface EventTarget { };");
+ // https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#domstringlist
+ idlArray.add_untested_idls("[Exposed=(Window,Worker)] interface DOMStringList { };");
+
// From Indexed DB:
idlArray.add_idls(idls);
diff --git a/tests/wpt/web-platform-tests/IndexedDB/keypath-exceptions.htm b/tests/wpt/web-platform-tests/IndexedDB/keypath-exceptions.htm
index d37a20aa2e5..6d7937c522f 100644
--- a/tests/wpt/web-platform-tests/IndexedDB/keypath-exceptions.htm
+++ b/tests/wpt/web-platform-tests/IndexedDB/keypath-exceptions.htm
@@ -248,7 +248,7 @@ indexeddb_test(
const array = [];
array[99] = 1;
- const getter_called = 0;
+ let getter_called = 0;
const prop = '50';
Object.defineProperty(Object.prototype, prop, {
enumerable: true, configurable: true,
diff --git a/tests/wpt/web-platform-tests/IndexedDB/large-nested-cloning.html b/tests/wpt/web-platform-tests/IndexedDB/large-nested-cloning.html
deleted file mode 100644
index c955f0247dc..00000000000
--- a/tests/wpt/web-platform-tests/IndexedDB/large-nested-cloning.html
+++ /dev/null
@@ -1,288 +0,0 @@
-<!doctype html>
-<meta charset="utf8">
-<meta name="timeout" content="long">
-<title>IndexedDB: large nested objects are cloned correctly</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>
-'use strict';
-
-// Should be large enough to trigger large value handling in the IndexedDB
-// engines that have special code paths for large values.
-const wrapThreshold = 128 * 1024;
-
-// Returns an IndexedDB value created from a descriptor.
-//
-// See the bottom of the file for descriptor samples.
-function createValue(descriptor) {
- if (typeof(descriptor) != 'object')
- return descriptor;
-
- if (Array.isArray(descriptor))
- return descriptor.map((element) => createValue(element));
-
- if (!descriptor.hasOwnProperty('type')) {
- const value = {};
- for (let property of Object.getOwnPropertyNames(descriptor))
- value[property] = createValue(descriptor[property]);
- return value;
- }
-
- switch (descriptor.type) {
- case 'blob':
- return new Blob(
- [largeValue(descriptor.size, descriptor.seed)],
- { type: descriptor.mimeType });
- case 'buffer':
- return largeValue(descriptor.size, descriptor.seed);
- }
-}
-
-// Checks an IndexedDB value against a descriptor.
-//
-// Returns a Promise that resolves if the value passes the check.
-//
-// See the bottom of the file for descriptor samples.
-function checkValue(testCase, value, descriptor) {
- if (typeof(descriptor) != 'object') {
- assert_equals(
- descriptor, value,
- 'IndexedDB result should match put() argument');
- return Promise.resolve();
- }
-
- if (Array.isArray(descriptor)) {
- assert_true(
- Array.isArray(value),
- 'IndexedDB result type should match put() argument');
- assert_equals(
- descriptor.length, value.length,
- 'IndexedDB result array size should match put() argument');
-
- const subChecks = [];
- for (let i = 0; i < descriptor.length; ++i)
- subChecks.push(checkValue(testCase, value[i], descriptor[i]));
- return Promise.all(subChecks);
- }
-
- if (!descriptor.hasOwnProperty('type')) {
- assert_array_equals(
- Object.getOwnPropertyNames(value).sort(),
- Object.getOwnPropertyNames(descriptor).sort(),
- 'IndexedDB result object properties should match put() argument');
- const subChecks = [];
- return Promise.all(Object.getOwnPropertyNames(descriptor).map(property =>
- checkValue(testCase, value[property], descriptor[property])));
- }
-
- switch (descriptor.type) {
- case 'blob':
- assert_class_string(
- value, 'Blob',
- 'IndexedDB result class should match put() argument');
- assert_equals(
- descriptor.mimeType, value.type,
- 'IndexedDB result Blob MIME type should match put() argument');
- assert_equals(descriptor.size, value.size, 'incorrect Blob size');
- return new Promise((resolve, reject) => {
- const reader = new FileReader();
- reader.onloadend = testCase.step_func(() => {
- if (reader.error) {
- reject(reader.error);
- return;
- }
- const view = new Uint8Array(reader.result);
- assert_equals(
- view.join(','),
- largeValue(descriptor.size, descriptor.seed).join(','),
- 'IndexedDB result Blob content should match put() argument');
- resolve();
- });
- reader.readAsArrayBuffer(value);
- });
-
- case 'buffer':
- assert_class_string(
- value, 'Uint8Array',
- 'IndexedDB result type should match put() argument');
- assert_equals(
- value.join(','),
- largeValue(descriptor.size, descriptor.seed).join(','),
- 'IndexedDB result typed array content should match put() argument');
- return Promise.resolve();
- }
-}
-
-// Performs a series of put()s and verifies that get()s and getAll() match.
-//
-// Each element of the valueDescriptors array is fed into createValue(), and the
-// resulting value is written to IndexedDB via a put() request. After the writes
-// complete, the values are read in the same order in which they were written.
-// Last, all the results are read one more time via a getAll().
-//
-// The test verifies that the get() / getAll() results match the arguments to
-// put() and that the order in which the get() result events are fired matches
-// the order of the get() requests.
-function cloningTest(label, valueDescriptors) {
- promise_test(testCase => {
- return createDatabase(testCase, (database, transaction) => {
- const store = database.createObjectStore('test-store');
- for (let i = 0; i < valueDescriptors.length; ++i) {
- store.put(createValue(valueDescriptors[i]), i);
- }
- }).then(database => {
- const transaction = database.transaction(['test-store'], 'readonly');
- const store = transaction.objectStore('test-store');
- const subChecks = [];
- let resultIndex = 0;
- for (let i = 0; i < valueDescriptors.length; ++i) {
- subChecks.push(new Promise((resolve, reject) => {
- const requestIndex = i;
- const request = store.get(requestIndex);
- request.onerror =
- testCase.step_func(() => { reject(request.error); });
- request.onsuccess = testCase.step_func(() => {
- assert_equals(
- resultIndex, requestIndex,
- 'IDBRequest success events should be fired in request order');
- ++resultIndex;
- resolve(checkValue(
- testCase, request.result, valueDescriptors[requestIndex]));
- });
- }));
- }
-
- subChecks.push(new Promise((resolve, reject) => {
- const requestIndex = valueDescriptors.length;
- const request = store.getAll();
- request.onerror =
- testCase.step_func(() => { reject(request.error); });
- request.onsuccess = testCase.step_func(() => {
- assert_equals(
- resultIndex, requestIndex,
- 'IDBRequest success events should be fired in request order');
- ++resultIndex;
- resolve(checkValue(
- testCase, request.result, valueDescriptors));
- });
- }));
-
- return Promise.all(subChecks);
- });
- }, label);
-}
-
-cloningTest('small typed array', [
- { type: 'buffer', size: 64, seed: 1 },
-]);
-
-cloningTest('large typed array', [
- { type: 'buffer', size: wrapThreshold, seed: 1 },
-])
-
-cloningTest('blob', [
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-1', seed: 1 },
-]);
-
-cloningTest('blob with small typed array', [
- {
- blob: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-01',
- seed: 1 },
- buffer: { type: 'buffer', size: 64, seed: 2 },
- },
-]);
-
-cloningTest('blob with large typed array', [
- {
- blob: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-01',
- seed: 1 },
- buffer: { type: 'buffer', size: wrapThreshold, seed: 2 },
- },
-]);
-
-cloningTest('blob array', [
- [
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-1', seed: 1 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-2', seed: 2 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-3', seed: 3 },
- ],
-]);
-
-cloningTest('array of blobs and small typed arrays', [
- [
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-01', seed: 1 },
- { type: 'buffer', size: 64, seed: 2 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-03', seed: 3 },
- { type: 'buffer', size: 64, seed: 4 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-05', seed: 5 },
- ],
-]);
-
-cloningTest('array of blobs and large typed arrays', [
- [
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-01', seed: 1 },
- { type: 'buffer', size: wrapThreshold, seed: 2 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-03', seed: 3 },
- { type: 'buffer', size: wrapThreshold, seed: 4 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-05', seed: 5 },
- ],
-]);
-
-cloningTest('object with blobs and large typed arrays', [
- {
- blob: { type: 'blob', size: wrapThreshold,
- mimeType: 'text/x-blink1', seed: 1 },
- more: [
- { type: 'buffer', size: wrapThreshold, seed: 2 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink3', seed: 3 },
- { type: 'buffer', size: wrapThreshold, seed: 4 },
- ],
- blob2: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink5',
- seed: 5 },
- },
-]);
-
-cloningTest('multiple requests of objects with blobs and large typed arrays', [
- {
- blob: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink1',
- seed: 1 },
- more: [
- { type: 'buffer', size: wrapThreshold, seed: 2 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink3', seed: 3 },
- { type: 'buffer', size: wrapThreshold, seed: 4 },
- ],
- blob2: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink5',
- seed: 5 },
- },
- [
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink06', seed: 6 },
- { type: 'buffer', size: wrapThreshold, seed: 7 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink08', seed: 8 },
- { type: 'buffer', size: wrapThreshold, seed: 9 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink10', seed: 10 },
- ],
- {
- data: [
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-11',
- seed: 11 },
- { type: 'buffer', size: wrapThreshold, seed: 12 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-13',
- seed: 13 },
- { type: 'buffer', size: wrapThreshold, seed: 14 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-15',
- seed: 15 },
- ],
- },
- [
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink16', seed: 16 },
- { type: 'buffer', size: wrapThreshold, seed: 17 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink18', seed: 18 },
- { type: 'buffer', size: wrapThreshold, seed: 19 },
- { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink20', seed: 20 },
- ],
-]);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-common.js b/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-common.js
new file mode 100644
index 00000000000..db5f710ceb5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-common.js
@@ -0,0 +1,211 @@
+'use strict';
+
+// Should be large enough to trigger large value handling in the IndexedDB
+// engines that have special code paths for large values.
+const wrapThreshold = 128 * 1024;
+
+// Returns an IndexedDB value created from a descriptor.
+//
+// See the bottom of the file for descriptor samples.
+function createValue(descriptor) {
+ if (typeof(descriptor) != 'object')
+ return descriptor;
+
+ if (Array.isArray(descriptor))
+ return descriptor.map((element) => createValue(element));
+
+ if (!descriptor.hasOwnProperty('type')) {
+ const value = {};
+ for (let property of Object.getOwnPropertyNames(descriptor))
+ value[property] = createValue(descriptor[property]);
+ return value;
+ }
+
+ switch (descriptor.type) {
+ case 'blob':
+ return new Blob(
+ [largeValue(descriptor.size, descriptor.seed)],
+ { type: descriptor.mimeType });
+ case 'buffer':
+ return largeValue(descriptor.size, descriptor.seed);
+ }
+}
+
+// Checks an IndexedDB value against a descriptor.
+//
+// Returns a Promise that resolves if the value passes the check.
+//
+// See the bottom of the file for descriptor samples.
+function checkValue(testCase, value, descriptor) {
+ if (typeof(descriptor) != 'object') {
+ assert_equals(
+ descriptor, value,
+ 'IndexedDB result should match put() argument');
+ return Promise.resolve();
+ }
+
+ if (Array.isArray(descriptor)) {
+ assert_true(
+ Array.isArray(value),
+ 'IndexedDB result type should match put() argument');
+ assert_equals(
+ descriptor.length, value.length,
+ 'IndexedDB result array size should match put() argument');
+
+ const subChecks = [];
+ for (let i = 0; i < descriptor.length; ++i)
+ subChecks.push(checkValue(testCase, value[i], descriptor[i]));
+ return Promise.all(subChecks);
+ }
+
+ if (!descriptor.hasOwnProperty('type')) {
+ assert_array_equals(
+ Object.getOwnPropertyNames(value).sort(),
+ Object.getOwnPropertyNames(descriptor).sort(),
+ 'IndexedDB result object properties should match put() argument');
+ const subChecks = [];
+ return Promise.all(Object.getOwnPropertyNames(descriptor).map(property =>
+ checkValue(testCase, value[property], descriptor[property])));
+ }
+
+ switch (descriptor.type) {
+ case 'blob':
+ assert_class_string(
+ value, 'Blob',
+ 'IndexedDB result class should match put() argument');
+ assert_equals(
+ descriptor.mimeType, value.type,
+ 'IndexedDB result Blob MIME type should match put() argument');
+ assert_equals(descriptor.size, value.size, 'incorrect Blob size');
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader();
+ reader.onloadend = testCase.step_func(() => {
+ if (reader.error) {
+ reject(reader.error);
+ return;
+ }
+ const view = new Uint8Array(reader.result);
+ assert_equals(
+ view.join(','),
+ largeValue(descriptor.size, descriptor.seed).join(','),
+ 'IndexedDB result Blob content should match put() argument');
+ resolve();
+ });
+ reader.readAsArrayBuffer(value);
+ });
+
+ case 'buffer':
+ assert_class_string(
+ value, 'Uint8Array',
+ 'IndexedDB result type should match put() argument');
+ assert_equals(
+ value.join(','),
+ largeValue(descriptor.size, descriptor.seed).join(','),
+ 'IndexedDB result typed array content should match put() argument');
+ return Promise.resolve();
+ }
+}
+
+function cloningTestInternal(label, valueDescriptors, options) {
+ promise_test(testCase => {
+ return createDatabase(testCase, (database, transaction) => {
+ let store;
+ if (options.useKeyGenerator) {
+ store = database.createObjectStore(
+ 'test-store', { keyPath: 'primaryKey', autoIncrement: true });
+ } else {
+ store = database.createObjectStore('test-store');
+ }
+ for (let i = 0; i < valueDescriptors.length; ++i) {
+ if (options.useKeyGenerator) {
+ store.put(createValue(valueDescriptors[i]));
+ } else {
+ store.put(createValue(valueDescriptors[i]), i + 1);
+ }
+ }
+ }).then(database => {
+ const transaction = database.transaction(['test-store'], 'readonly');
+ const store = transaction.objectStore('test-store');
+ const subChecks = [];
+ let resultIndex = 0;
+ for (let i = 0; i < valueDescriptors.length; ++i) {
+ subChecks.push(new Promise((resolve, reject) => {
+ const requestIndex = i;
+ const primaryKey = requestIndex + 1;
+ const request = store.get(primaryKey);
+ request.onerror =
+ testCase.step_func(() => { reject(request.error); });
+ request.onsuccess = testCase.step_func(() => {
+ assert_equals(
+ resultIndex, requestIndex,
+ 'IDBRequest success events should be fired in request order');
+ ++resultIndex;
+
+ const result = request.result;
+ if (options.useKeyGenerator) {
+ assert_equals(
+ result.primaryKey, primaryKey,
+ 'IndexedDB result should have auto-incremented primary key');
+ delete result.primaryKey;
+ }
+ resolve(checkValue(
+ testCase, result, valueDescriptors[requestIndex]));
+ });
+ }));
+ }
+
+ subChecks.push(new Promise((resolve, reject) => {
+ const requestIndex = valueDescriptors.length;
+ const request = store.getAll();
+ request.onerror =
+ testCase.step_func(() => { reject(request.error); });
+ request.onsuccess = testCase.step_func(() => {
+ assert_equals(
+ resultIndex, requestIndex,
+ 'IDBRequest success events should be fired in request order');
+ ++resultIndex;
+ const result = request.result;
+ if (options.useKeyGenerator) {
+ for (let i = 0; i < valueDescriptors.length; ++i) {
+ const primaryKey = i + 1;
+ assert_equals(
+ result[i].primaryKey, primaryKey,
+ 'IndexedDB result should have auto-incremented primary key');
+ delete result[i].primaryKey;
+ }
+ }
+ resolve(checkValue(testCase, result, valueDescriptors));
+ });
+ }));
+
+ return Promise.all(subChecks);
+ });
+ }, label);
+}
+
+// Performs a series of put()s and verifies that get()s and getAll() match.
+//
+// Each element of the valueDescriptors array is fed into createValue(), and the
+// resulting value is written to IndexedDB via a put() request. After the writes
+// complete, the values are read in the same order in which they were written.
+// Last, all the results are read one more time via a getAll().
+//
+// The test verifies that the get() / getAll() results match the arguments to
+// put() and that the order in which the get() result events are fired matches
+// the order of the get() requests.
+function cloningTest(label, valueDescriptors) {
+ cloningTestInternal(label, valueDescriptors, { useKeyGenerator: false });
+}
+
+// cloningTest, with coverage for key generators.
+//
+// This creates two tests. One test performs a series of put()s and verifies
+// that get()s and getAll() match, exactly like cloningTestWithoutKeyGenerator.
+// The other test performs the same put()s in an object store with a key
+// generator, and checks that the key generator works properly.
+function cloningTestWithKeyGenerator(label, valueDescriptors) {
+ cloningTestInternal(label, valueDescriptors, { useKeyGenerator: false });
+ cloningTestInternal(
+ label + " with key generator", valueDescriptors,
+ { useKeyGenerator: true });
+}
diff --git a/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-large-multiple.html b/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-large-multiple.html
new file mode 100644
index 00000000000..f263efbcf6d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-large-multiple.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<meta charset="utf8">
+<meta name="timeout" content="long">
+<title>IndexedDB: large nested objects are cloned correctly</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 src="nested-cloning-common.js"></script>
+<script>
+
+cloningTestWithKeyGenerator(
+ 'multiple requests of objects with blobs and large typed arrays', [
+ {
+ blob: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink1',
+ seed: 1 },
+ more: [
+ { type: 'buffer', size: wrapThreshold, seed: 2 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink3', seed: 3 },
+ { type: 'buffer', size: wrapThreshold, seed: 4 },
+ ],
+ blob2: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink5',
+ seed: 5 },
+ },
+ [
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink06', seed: 6 },
+ { type: 'buffer', size: wrapThreshold, seed: 7 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink08', seed: 8 },
+ { type: 'buffer', size: wrapThreshold, seed: 9 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink10', seed: 10 },
+ ],
+ {
+ data: [
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-11',
+ seed: 11 },
+ { type: 'buffer', size: wrapThreshold, seed: 12 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-13',
+ seed: 13 },
+ { type: 'buffer', size: wrapThreshold, seed: 14 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-15',
+ seed: 15 },
+ ],
+ },
+ [
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink16', seed: 16 },
+ { type: 'buffer', size: wrapThreshold, seed: 17 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink18', seed: 18 },
+ { type: 'buffer', size: wrapThreshold, seed: 19 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink20', seed: 20 },
+ ],
+]);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-large.html b/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-large.html
new file mode 100644
index 00000000000..6e4f9be2ee6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-large.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<meta charset="utf8">
+<meta name="timeout" content="long">
+<title>IndexedDB: large nested objects are cloned correctly</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 src="nested-cloning-common.js"></script>
+<script>
+
+cloningTest('large typed array', [
+ { type: 'buffer', size: wrapThreshold, seed: 1 },
+])
+
+cloningTestWithKeyGenerator('blob with large typed array', [
+ {
+ blob: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-01',
+ seed: 1 },
+ buffer: { type: 'buffer', size: wrapThreshold, seed: 2 },
+ },
+]);
+
+cloningTestWithKeyGenerator('array of blobs and large typed arrays', [
+ [
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-01', seed: 1 },
+ { type: 'buffer', size: wrapThreshold, seed: 2 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-03', seed: 3 },
+ { type: 'buffer', size: wrapThreshold, seed: 4 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-05', seed: 5 },
+ ],
+]);
+
+cloningTestWithKeyGenerator('object with blobs and large typed arrays', [
+ {
+ blob: { type: 'blob', size: wrapThreshold,
+ mimeType: 'text/x-blink1', seed: 1 },
+ more: [
+ { type: 'buffer', size: wrapThreshold, seed: 2 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink3', seed: 3 },
+ { type: 'buffer', size: wrapThreshold, seed: 4 },
+ ],
+ blob2: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink5',
+ seed: 5 },
+ },
+]);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-small.html b/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-small.html
new file mode 100644
index 00000000000..558415f2342
--- /dev/null
+++ b/tests/wpt/web-platform-tests/IndexedDB/nested-cloning-small.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<meta charset="utf8">
+<meta name="timeout" content="long">
+<title>IndexedDB: small nested objects are cloned correctly</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 src="nested-cloning-common.js"></script>
+<script>
+
+cloningTest('small typed array', [
+ { type: 'buffer', size: 64, seed: 1 },
+]);
+
+cloningTest('blob', [
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-1', seed: 1 },
+]);
+
+cloningTestWithKeyGenerator('blob with small typed array', [
+ {
+ blob: { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-01',
+ seed: 1 },
+ buffer: { type: 'buffer', size: 64, seed: 2 },
+ },
+]);
+
+cloningTestWithKeyGenerator('blob array', [
+ [
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-1', seed: 1 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-2', seed: 2 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-3', seed: 3 },
+ ],
+]);
+
+cloningTestWithKeyGenerator('array of blobs and small typed arrays', [
+ [
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-01', seed: 1 },
+ { type: 'buffer', size: 64, seed: 2 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-03', seed: 3 },
+ { type: 'buffer', size: 64, seed: 4 },
+ { type: 'blob', size: wrapThreshold, mimeType: 'text/x-blink-05', seed: 5 },
+ ],
+]);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/README.md b/tests/wpt/web-platform-tests/README.md
index d83facf7a78..1f713ba2075 100644
--- a/tests/wpt/web-platform-tests/README.md
+++ b/tests/wpt/web-platform-tests/README.md
@@ -12,12 +12,16 @@ the promise of working across browsers and devices without needing extra
layers of abstraction to paper over the gaps left by specification
editors and implementors.
+Setting Up the Repo
+===================
+
+Clone or otherwise get https://github.com/w3c/web-platform-tests.
+
Running the Tests
=================
The tests are designed to be run from your local computer. The test
environment requires [Python 2.7+](http://www.python.org/downloads) (but not Python 3.x).
-You will also need a copy of OpenSSL.
On Windows, be sure to add the Python directory (`c:\python2x`, by default) to
your `%Path%` [Environment Variable](http://www.computerhope.com/issues/ch000549.htm),
@@ -40,9 +44,13 @@ following entries are required:
If you are behind a proxy, you also need to make sure the domains above are
excluded from your proxy lookups.
-The test environment can then be started using
- ./serve
+Running Tests Manually
+======================
+
+The test server can be started using
+
+ ./wpt serve
This will start HTTP servers on two ports and a websockets server on
one port. By default one web server starts on port 8000 and the other
@@ -61,37 +69,28 @@ to some port of your choice e.g.
"http": [1234, "auto"]
```
-If you installed OpenSSL in such a way that running `openssl` at a
-command line doesn't work, you also need to adjust the path to the
-OpenSSL binary. This can be done by adding a section to `config.json`
-like:
-
-```
-"ssl": {"openssl": {"binary": "/path/to/openssl"}}
-```
-
Running Tests Automatically
---------------------------
-Tests can be run automatically in a browser using the `wptrun` script
-in the root of the checkout. This requires the hosts file and OpenSSL
-setup documented above, but you must *not* have the test server
-already running when calling `wptrun`. The basic command line syntax
-is:
+Tests can be run automatically in a browser using the `run` command of
+the `wpt` script in the root of the checkout. This requires the hosts
+file setup documented above, but you must *not* have the
+test server already running when calling `wpt run`. The basic command
+line syntax is:
```
-./wptrun product [tests]
+./wpt run product [tests]
```
-**On Windows**: for technical reasons the above will not work and you
-must instead run `python tools/wptrun.py products [tests]`.
+**On Windows**: You will need to preceed the prior command with
+`python` or the path to the python binary.
where `product` is currently `firefox` or `chrome` and `[tests]` is a
list of paths to tests. This will attempt to automatically locate a
browser instance and install required dependencies. The command is
very configurable; for examaple to specify a particular binary use
-`wptrun --binary=path product`. The full range of options can be see
-with `wptrun --help` and `wptrun --wptrunner-help`.
+`wpt run --binary=path product`. The full range of options can be see
+with `wpt run --help` and `wpt run --wptrunner-help`.
Not all dependencies can be automatically installed; in particular the
`certutil` tool required to run https tests with Firefox must be
@@ -109,6 +108,20 @@ And on macOS with homebrew using:
brew install nss
```
+Command Line Tools
+==================
+
+The `wpt` command provides a frontend to a variety of tools for
+working with and running web-platform-tests. Some of the most useful
+commands are:
+
+* `wpt serve` - For starting the wpt http server
+* `wpt run` - For running tests in a browser
+* `wpt lint` - For running the lint against all tests
+* `wpt manifest` - For updating or generating a `MANIFEST.json` test manifest
+* `wpt install` - For installing the latest release of a browser or
+ webdriver server on the local machine.
+
<span id="submodules">Submodules</span>
=======================================
@@ -161,8 +174,38 @@ then remove the `tools` and `resources` directories, as above.
<span id="windows-notes">Windows Notes</span>
=============================================
-Running wptserve with SSL enabled on Windows typically requires
-installing an OpenSSL distribution.
+On Windows `wpt` commands mut bre prefixed with `python` or the path
+to the python binary (if `python` is not in your `%PATH%`).
+
+Alternatively, you may also use
+[Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/about)
+in the Windows 10 Anniversary Update build, then access your windows
+partition from there to launch `wpt` commands.
+
+Please make sure git and your text editor do not automatically convert
+line endings, as it will cause lint errors. For git, please set
+`git config core.autocrlf false` in your working tree.
+
+Certificates
+============
+
+By default pregenerated certificates for the web-platform.test domain
+are provided in the repository. If you wish to generate new
+certificates for any reason it's possible to use OpenSSL when starting
+the server, or starting a test run, by providing the
+`--ssl-type=openssl` argument to the `wpt serve` or `wpt run`
+commands.
+
+If you installed OpenSSL in such a way that running `openssl` at a
+command line doesn't work, you also need to adjust the path to the
+OpenSSL binary. This can be done by adding a section to `config.json`
+like:
+
+```
+"ssl": {"openssl": {"binary": "/path/to/openssl"}}
+```
+
+On Windows using OpenSSL typically requires installing an OpenSSL distribution.
[Shining Light](https://slproweb.com/products/Win32OpenSSL.html)
provide a convenient installer that is known to work, but requires a
little extra setup, i.e.:
@@ -184,10 +227,6 @@ Then edit the JSON so that the key `ssl/openssl/base_conf_path` has a
value that is the path to the OpenSSL config file (typically this
will be `C:\\OpenSSL-Win32\\bin\\openssl.cfg`).
-Alternatively, you may also use
-[Bash on Ubuntu on Windows](https://msdn.microsoft.com/en-us/commandline/wsl/about)
-in the Windows 10 Anniversary Update build, then access your windows
-partition from there to launch wptserve.
Publication
===========
@@ -262,7 +301,7 @@ can run it manually by starting the `lint` executable from the root of
your local web-platform-tests working directory like this:
```
-./lint
+./wpt lint
```
The lint tool is also run automatically for every submitted pull
diff --git a/tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.js b/tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.js
index 84394ecbd1c..c557d96ac4b 100644
--- a/tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.js
+++ b/tests/wpt/web-platform-tests/WebCryptoAPI/digest/digest.js
@@ -61,11 +61,11 @@ function run_test() {
}, upCase + " with " + size + " source data");
promise_test(function(test) {
- var promise = subtle.digest({name: mixedCase}, sourceData[size])
+ var promise = subtle.digest({name: downCase}, sourceData[size])
.then(function(result) {
assert_true(equalBuffers(result, digestedData[alg][size]), "digest() yielded expected result for " + alg + ":" + size);
}, function(err) {
- assert_unreached("digest() threw an error for " + alg + ":" + size + " - " + err.message);mixedCase
+ assert_unreached("digest() threw an error for " + alg + ":" + size + " - " + err.message);
});
return promise;
diff --git a/tests/wpt/web-platform-tests/WebIDL/current-realm.html b/tests/wpt/web-platform-tests/WebIDL/current-realm.html
index fd24709b3be..e015ec53515 100644
--- a/tests/wpt/web-platform-tests/WebIDL/current-realm.html
+++ b/tests/wpt/web-platform-tests/WebIDL/current-realm.html
@@ -110,8 +110,13 @@
test(function() {
var c = self[0].document.createElement("canvas"),
obj = c.getContext(val)
- assert_global(obj)
+ // WebGL might not be enabled in this environment
+ if (!obj && val === "webgl") {
+ return;
+ }
+
+ assert_global(obj)
obj = HTMLCanvasElement.prototype.getContext.call(c, val)
assert_global(obj)
}, "getContext " + val)
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js
new file mode 100644
index 00000000000..bb846a494eb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.any.js
@@ -0,0 +1,51 @@
+'use strict';
+
+test(function() {
+ // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27732
+ var constants = [
+ "INDEX_SIZE_ERR",
+ "DOMSTRING_SIZE_ERR",
+ "HIERARCHY_REQUEST_ERR",
+ "WRONG_DOCUMENT_ERR",
+ "INVALID_CHARACTER_ERR",
+ "NO_DATA_ALLOWED_ERR",
+ "NO_MODIFICATION_ALLOWED_ERR",
+ "NOT_FOUND_ERR",
+ "NOT_SUPPORTED_ERR",
+ "INUSE_ATTRIBUTE_ERR",
+ "INVALID_STATE_ERR",
+ "SYNTAX_ERR",
+ "INVALID_MODIFICATION_ERR",
+ "NAMESPACE_ERR",
+ "INVALID_ACCESS_ERR",
+ "VALIDATION_ERR",
+ "TYPE_MISMATCH_ERR",
+ "SECURITY_ERR",
+ "NETWORK_ERR",
+ "ABORT_ERR",
+ "URL_MISMATCH_ERR",
+ "QUOTA_EXCEEDED_ERR",
+ "TIMEOUT_ERR",
+ "INVALID_NODE_TYPE_ERR",
+ "DATA_CLONE_ERR"
+ ]
+ var objects = [
+ [DOMException, "DOMException constructor object"],
+ [DOMException.prototype, "DOMException prototype object"]
+ ]
+ constants.forEach(function(name, i) {
+ objects.forEach(function(o) {
+ var object = o[0], description = o[1];
+ test(function() {
+ assert_equals(object[name], i + 1, name)
+ assert_own_property(object, name)
+ var pd = Object.getOwnPropertyDescriptor(object, name)
+ assert_false("get" in pd, "get")
+ assert_false("set" in pd, "set")
+ assert_false(pd.writable, "writable")
+ assert_true(pd.enumerable, "enumerable")
+ assert_false(pd.configurable, "configurable")
+ }, "Constant " + name + " on " + description)
+ })
+ })
+})
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html
deleted file mode 100644
index 450b4b334e6..00000000000
--- a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constants.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>DOMException constants</title>
-<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-constructor-object">
-<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-prototype-object">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-test(function() {
- // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27732
- var constants = [
- "INDEX_SIZE_ERR",
- "DOMSTRING_SIZE_ERR",
- "HIERARCHY_REQUEST_ERR",
- "WRONG_DOCUMENT_ERR",
- "INVALID_CHARACTER_ERR",
- "NO_DATA_ALLOWED_ERR",
- "NO_MODIFICATION_ALLOWED_ERR",
- "NOT_FOUND_ERR",
- "NOT_SUPPORTED_ERR",
- "INUSE_ATTRIBUTE_ERR",
- "INVALID_STATE_ERR",
- "SYNTAX_ERR",
- "INVALID_MODIFICATION_ERR",
- "NAMESPACE_ERR",
- "INVALID_ACCESS_ERR",
- "VALIDATION_ERR",
- "TYPE_MISMATCH_ERR",
- "SECURITY_ERR",
- "NETWORK_ERR",
- "ABORT_ERR",
- "URL_MISMATCH_ERR",
- "QUOTA_EXCEEDED_ERR",
- "TIMEOUT_ERR",
- "INVALID_NODE_TYPE_ERR",
- "DATA_CLONE_ERR"
- ]
- var objects = [
- [DOMException, "DOMException constructor object"],
- [DOMException.prototype, "DOMException prototype object"]
- ]
- constants.forEach(function(name, i) {
- objects.forEach(function(o) {
- var object = o[0], description = o[1];
- test(function() {
- assert_equals(object[name], i + 1, name)
- assert_own_property(object, name)
- var pd = Object.getOwnPropertyDescriptor(object, name)
- assert_false("get" in pd, "property has getter")
- assert_false("set" in pd, "property has setter")
- assert_false(pd.writable, "not writable")
- assert_true(pd.enumerable, "enumerable")
- assert_false(pd.configurable, "not configurable")
- }, "Constant " + name + " on " + description)
- })
- })
-})
-</script>
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js
new file mode 100644
index 00000000000..a015470cad6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-and-prototype.any.js
@@ -0,0 +1,32 @@
+test(function() {
+ assert_own_property(self, "DOMException", "property of global");
+
+ var desc = Object.getOwnPropertyDescriptor(self, "DOMException");
+ assert_false("get" in desc, "get");
+ assert_false("set" in desc, "set");
+ assert_true(desc.writable, "writable");
+ assert_false(desc.enumerable, "enumerable");
+ assert_true(desc.configurable, "configurable");
+}, "existence and property descriptor of DOMException");
+
+test(function() {
+ assert_own_property(self.DOMException, "prototype", "prototype property");
+
+ var desc = Object.getOwnPropertyDescriptor(self.DOMException, "prototype");
+ assert_false("get" in desc, "get");
+ assert_false("set" in desc, "set");
+ assert_false(desc.writable, "writable");
+ assert_false(desc.enumerable, "enumerable");
+ assert_false(desc.configurable, "configurable");
+}, "existence and property descriptor of DOMException.prototype");
+
+test(function() {
+ assert_own_property(self.DOMException.prototype, "constructor", "property of prototype");
+ var desc = Object.getOwnPropertyDescriptor(self.DOMException.prototype, "constructor");
+ assert_false("get" in desc, "get");
+ assert_false("set" in desc, "set");
+ assert_true(desc.writable, "writable");
+ assert_false(desc.enumerable, "enumerable");
+ assert_true(desc.configurable, "configurable");
+ assert_equals(self.DOMException.prototype.constructor, self.DOMException, "equality with actual constructor");
+}, "existence and property descriptor of DOMException.prototype.constructor");
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js
new file mode 100644
index 00000000000..d6e1cdd451c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js
@@ -0,0 +1,121 @@
+'use strict';
+
+test(function() {
+ var ex = new DOMException();
+ assert_equals(ex.name, "Error",
+ "Not passing a name should end up with 'Error' as the name");
+ assert_equals(ex.message, "",
+ "Not passing a message should end up with empty string as the message");
+}, 'new DOMException()');
+
+test(function() {
+ var ex = new DOMException();
+ assert_false(ex.hasOwnProperty("name"),
+ "The name property should be inherited");
+ assert_false(ex.hasOwnProperty("message"),
+ "The message property should be inherited");
+}, 'new DOMException(): inherited-ness');
+
+test(function() {
+ var ex = new DOMException(null);
+ assert_equals(ex.name, "Error",
+ "Not passing a name should end up with 'Error' as the name");
+ assert_equals(ex.message, "null",
+ "Passing null as message should end up with stringified 'null' as the message");
+}, 'new DOMException(null)');
+
+test(function() {
+ var ex = new DOMException(undefined);
+ assert_equals(ex.name, "Error",
+ "Not passing a name should end up with 'Error' as the name");
+ assert_equals(ex.message, "",
+ "Not passing a message should end up with empty string as the message");
+}, 'new DOMException(undefined)');
+
+test(function() {
+ var ex = new DOMException(undefined);
+ assert_false(ex.hasOwnProperty("name"),
+ "The name property should be inherited");
+ assert_false(ex.hasOwnProperty("message"),
+ "The message property should be inherited");
+}, 'new DOMException(undefined): inherited-ness');
+
+test(function() {
+ var ex = new DOMException("foo");
+ assert_equals(ex.name, "Error",
+ "Not passing a name should still end up with 'Error' as the name");
+ assert_equals(ex.message, "foo", "Should be using passed-in message");
+}, 'new DOMException("foo")');
+
+test(function() {
+ var ex = new DOMException("foo");
+ assert_false(ex.hasOwnProperty("name"),
+ "The name property should be inherited");
+ assert_false(ex.hasOwnProperty("message"),
+ "The message property should be inherited");
+}, 'new DOMException("foo"): inherited-ness');
+
+test(function() {
+ var ex = new DOMException("bar", undefined);
+ assert_equals(ex.name, "Error",
+ "Passing undefined for name should end up with 'Error' as the name");
+ assert_equals(ex.message, "bar", "Should still be using passed-in message");
+}, 'new DOMException("bar", undefined)');
+
+test(function() {
+ var ex = new DOMException("bar", "NotSupportedError");
+ assert_equals(ex.name, "NotSupportedError", "Should be using the passed-in name");
+ assert_equals(ex.message, "bar", "Should still be using passed-in message");
+ assert_equals(ex.code, DOMException.NOT_SUPPORTED_ERR,
+ "Should have the right exception code");
+}, 'new DOMException("bar", "NotSupportedError")');
+
+test(function() {
+ var ex = new DOMException("bar", "NotSupportedError");
+ assert_false(ex.hasOwnProperty("name"),
+ "The name property should be inherited");
+ assert_false(ex.hasOwnProperty("message"),
+ "The message property should be inherited");
+}, 'new DOMException("bar", "NotSupportedError"): inherited-ness');
+
+test(function() {
+ var ex = new DOMException("bar", "foo");
+ assert_equals(ex.name, "foo", "Should be using the passed-in name");
+ assert_equals(ex.message, "bar", "Should still be using passed-in message");
+ assert_equals(ex.code, 0,
+ "Should have 0 for code for a name not in the exception names table");
+}, 'new DOMException("bar", "foo")');
+
+[
+ {name: "IndexSizeError", code: 1},
+ {name: "HierarchyRequestError", code: 3},
+ {name: "WrongDocumentError", code: 4},
+ {name: "InvalidCharacterError", code: 5},
+ {name: "NoModificationAllowedError", code: 7},
+ {name: "NotFoundError", code: 8},
+ {name: "NotSupportedError", code: 9},
+ {name: "InUseAttributeError", code: 10},
+ {name: "InvalidStateError", code: 11},
+ {name: "SyntaxError", code: 12},
+ {name: "InvalidModificationError", code: 13},
+ {name: "NamespaceError", code: 14},
+ {name: "InvalidAccessError", code: 15},
+ {name: "SecurityError", code: 18},
+ {name: "NetworkError", code: 19},
+ {name: "AbortError", code: 20},
+ {name: "URLMismatchError", code: 21},
+ {name: "QuotaExceededError", code: 22},
+ {name: "TimeoutError", code: 23},
+ {name: "InvalidNodeTypeError", code: 24},
+ {name: "DataCloneError", code: 25}
+].forEach(function(test_case) {
+ test(function() {
+ var ex = new DOMException("msg", test_case.name);
+ assert_equals(ex.name, test_case.name,
+ "Should be using the passed-in name");
+ assert_equals(ex.message, "msg",
+ "Should be using the passed-in message");
+ assert_equals(ex.code, test_case.code,
+ "Should have matching legacy code from error names table");
+ },'new DOMexception("msg", "' + test_case.name + '")');
+});
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html
deleted file mode 100644
index 0e5ffea7d32..00000000000
--- a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-constructor.html
+++ /dev/null
@@ -1,139 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>DOMException constructor</title>
-<link rel=help href="https://heycam.github.io/webidl/#es-DOMException-constructor-object">
-<link rel=help href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.message">
-<link rel=help href="https://people.mozilla.org/~jorendorff/es6-draft.html#sec-error.prototype.name">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-test(function() {
- var ex = new DOMException();
- assert_equals(ex.name, "Error",
- "Not passing a name should end up with 'Error' as the name");
- assert_equals(ex.message, "",
- "Not passing a message should end up with empty string as the message");
-}, 'new DOMException()');
-
-test(function() {
- var ex = new DOMException();
- assert_false(ex.hasOwnProperty("name"),
- "The name property should be inherited");
- assert_false(ex.hasOwnProperty("message"),
- "The message property should be inherited");
-}, 'new DOMException(): own-ness');
-
-test(function() {
- var ex = new DOMException(null);
- assert_equals(ex.name, "Error",
- "Not passing a name should end up with 'Error' as the name");
- assert_equals(ex.message, "null",
- "Passing null as message should end up with stringified 'null' as the message");
-}, 'new DOMException(null)');
-
-test(function() {
- var ex = new DOMException(undefined);
- assert_equals(ex.name, "Error",
- "Not passing a name should end up with 'Error' as the name");
- assert_equals(ex.message, "",
- "Not passing a message should end up with empty string as the message");
-}, 'new DOMException(undefined)');
-
-test(function() {
- var ex = new DOMException(undefined);
- assert_false(ex.hasOwnProperty("name"),
- "The name property should be inherited");
- assert_false(ex.hasOwnProperty("message"),
- "The message property should be inherited");
-}, 'new DOMException(undefined): own-ness');
-
-test(function() {
- var ex = new DOMException("foo");
- assert_equals(ex.name, "Error",
- "Not passing a name should still end up with 'Error' as the name");
- assert_equals(ex.message, "foo", "Should be using passed-in message");
-}, 'new DOMException("foo")');
-
-test(function() {
- var ex = new DOMException("foo");
- assert_false(ex.hasOwnProperty("name"),
- "The name property should be inherited");
- assert_true(ex.hasOwnProperty("message"),
- "The message property should be own");
-}, 'new DOMException("foo"): own-ness');
-
-test(function() {
- var ex = new DOMException("bar", undefined);
- assert_equals(ex.name, "Error",
- "Passing undefined for name should end up with 'Error' as the name");
- assert_equals(ex.message, "bar", "Should still be using passed-in message");
-}, 'new DOMException("bar", undefined)');
-
-test(function() {
- var ex = new DOMException("bar", "NotSupportedError");
- assert_equals(ex.name, "NotSupportedError", "Should be using the passed-in name");
- assert_equals(ex.message, "bar", "Should still be using passed-in message");
- assert_equals(ex.code, DOMException.NOT_SUPPORTED_ERR,
- "Should have the right exception code");
-}, 'new DOMException("bar", "NotSupportedError")');
-
-test(function() {
- var ex = new DOMException("bar", "NotSupportedError");
- assert_true(ex.hasOwnProperty("name"),
- "The name property should be own");
- assert_true(ex.hasOwnProperty("message"),
- "The message property should be own");
-}, 'new DOMException("bar", "NotSupportedError"): own-ness');
-
-test(function() {
- var ex = new DOMException("bar", "foo");
- assert_equals(ex.name, "foo", "Should be using the passed-in name");
- assert_equals(ex.message, "bar", "Should still be using passed-in message");
- assert_equals(ex.code, 0,
- "Should have 0 for code for a name not in the exception names table");
-}, 'new DOMException("bar", "foo")');
-
-[
- {name: "IndexSizeError", code: 1},
- {name: "HierarchyRequestError", code: 3},
- {name: "WrongDocumentError", code: 4},
- {name: "InvalidCharacterError", code: 5},
- {name: "NoModificationAllowedError", code: 7},
- {name: "NotFoundError", code: 8},
- {name: "NotSupportedError", code: 9},
- {name: "InUseAttributeError", code: 10},
- {name: "InvalidStateError", code: 11},
- {name: "SyntaxError", code: 12},
- {name: "InvalidModificationError", code: 13},
- {name: "NamespaceError", code: 14},
- {name: "InvalidAccessError", code: 15},
- {name: "SecurityError", code: 18},
- {name: "NetworkError", code: 19},
- {name: "AbortError", code: 20},
- {name: "URLMismatchError", code: 21},
- {name: "QuotaExceededError", code: 22},
- {name: "TimeoutError", code: 23},
- {name: "InvalidNodeTypeError", code: 24},
- {name: "DataCloneError", code: 25}
-].forEach(function(test_case) {
- test(function() {
- var ex = new DOMException("msg", test_case.name);
- assert_equals(ex.name, test_case.name,
- "Should be using the passed-in name");
- assert_equals(ex.message, "msg",
- "Should be using the passed-in message");
- assert_equals(ex.code, test_case.code,
- "Should have matching legacy code from error names table");
- },'new DOMexception("msg", "' + test_case.name + '")');
-});
-
-test(function() {
- var ex = new DOMException("bar", "UnknownError");
- assert_equals(ex.name, "UnknownError", "Should be using the passed-in name");
- assert_equals(ex.message, "bar", "Should still be using passed-in message");
- assert_equals(ex.code, 0,
- "Should have 0 for code for a name in the exception names table with no legacy code");
-}, 'new DOMException("bar", "UnknownError")');
-
-</script>
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js
new file mode 100644
index 00000000000..8d69c6e0707
--- /dev/null
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/DOMException-custom-bindings.any.js
@@ -0,0 +1,120 @@
+"use strict";
+
+test(() => {
+ assert_throws(new TypeError(), () => DOMException());
+}, "Cannot construct without new");
+
+test(() => {
+ assert_equals(Object.getPrototypeOf(DOMException.prototype), Error.prototype);
+}, "inherits from Error: prototype-side");
+
+test(() => {
+ assert_equals(Object.getPrototypeOf(DOMException), Function.prototype);
+}, "does not inherit from Error: class-side");
+
+test(() => {
+ const e = new DOMException("message", "name");
+ assert_false(e.hasOwnProperty("message"), "property is not own");
+
+ const propDesc = Object.getOwnPropertyDescriptor(DOMException.prototype, "message");
+ assert_equals(typeof propDesc.get, "function", "property descriptor is a getter");
+ assert_equals(propDesc.set, undefined, "property descriptor is not a setter");
+ assert_true(propDesc.enumerable, "property descriptor enumerable");
+ assert_true(propDesc.configurable, "property descriptor configurable");
+}, "message property descriptor");
+
+test(() => {
+ const getter = Object.getOwnPropertyDescriptor(DOMException.prototype, "message").get;
+
+ assert_throws(new TypeError(), () => getter.apply({}));
+}, "message getter performs brand checks (i.e. is not [LenientThis]");
+
+test(() => {
+ const e = new DOMException("message", "name");
+ assert_false(e.hasOwnProperty("name"), "property is not own");
+
+ const propDesc = Object.getOwnPropertyDescriptor(DOMException.prototype, "name");
+ assert_equals(typeof propDesc.get, "function", "property descriptor is a getter");
+ assert_equals(propDesc.set, undefined, "property descriptor is not a setter");
+ assert_true(propDesc.enumerable, "property descriptor enumerable");
+ assert_true(propDesc.configurable, "property descriptor configurable");
+}, "name property descriptor");
+
+test(() => {
+ const getter = Object.getOwnPropertyDescriptor(DOMException.prototype, "name").get;
+
+ assert_throws(new TypeError(), () => getter.apply({}));
+}, "name getter performs brand checks (i.e. is not [LenientThis]");
+
+test(() => {
+ const e = new DOMException("message", "name");
+ assert_false(e.hasOwnProperty("code"), "property is not own");
+
+ const propDesc = Object.getOwnPropertyDescriptor(DOMException.prototype, "code");
+ assert_equals(typeof propDesc.get, "function", "property descriptor is a getter");
+ assert_equals(propDesc.set, undefined, "property descriptor is not a setter");
+ assert_true(propDesc.enumerable, "property descriptor enumerable");
+ assert_true(propDesc.configurable, "property descriptor configurable");
+}, "code property descriptor");
+
+test(() => {
+ const getter = Object.getOwnPropertyDescriptor(DOMException.prototype, "code").get;
+
+ assert_throws(new TypeError(), () => getter.apply({}));
+}, "code getter performs brand checks (i.e. is not [LenientThis]");
+
+test(() => {
+ const e = new DOMException("message", "InvalidCharacterError");
+ assert_equals(e.code, 5, "Initially the code is set to 5");
+
+ Object.defineProperty(e, "name", {
+ value: "WrongDocumentError"
+ });
+
+ assert_equals(e.code, 5, "The code is still set to 5");
+}, "code property is not affected by shadowing the name property");
+
+test(() => {
+ const e = new DOMException("message", "name");
+ assert_equals(Object.prototype.toString.call(e), "[object DOMException]");
+}, "Object.prototype.toString behavior is like other interfaces");
+
+test(() => {
+ const e = new DOMException("message", "name");
+ assert_false(e.hasOwnProperty("toString"), "toString must not exist on the instance");
+ assert_false(DOMException.prototype.hasOwnProperty("toString"), "toString must not exist on DOMException.prototype");
+ assert_equals(typeof e.toString, "function", "toString must still exist (via Error.prototype)");
+}, "Inherits its toString() from Error.prototype");
+
+test(() => {
+ const e = new DOMException("message", "name");
+ assert_equals(e.toString(), "name: message",
+ "The default Error.prototype.toString() behavior must work on supplied name and message");
+
+ Object.defineProperty(e, "name", { value: "new name" });
+ Object.defineProperty(e, "message", { value: "new message" });
+ assert_equals(e.toString(), "new name: new message",
+ "The default Error.prototype.toString() behavior must work on shadowed names and messages");
+}, "toString() behavior from Error.prototype applies as expected");
+
+test(() => {
+ assert_throws(new TypeError(), () => DOMException.prototype.toString());
+}, "DOMException.prototype.toString() applied to DOMException.prototype throws because of name/message brand checks");
+
+test(() => {
+ let stackOnNormalErrors;
+ try {
+ throw new Error("normal error");
+ } catch (e) {
+ stackOnNormalErrors = e.stack;
+ }
+
+ let stackOnDOMException;
+ try {
+ throw new DOMException("message", "name");
+ } catch (e) {
+ stackOnDOMException = e.stack;
+ }
+
+ assert_equals(typeof stackOnDOMException, typeof stackOnNormalErrors, "The typeof values must match");
+}, "If the implementation has a stack property on normal errors, it also does on DOMExceptions");
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html
deleted file mode 100644
index ddb40f4ddea..00000000000
--- a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>DOMException constructor and prototype object</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src=constructor-object.js></script>
-<div id="log"></div>
-<script>
-setup({ explicit_done: true })
-run_test()
-</script>
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js
deleted file mode 100644
index e539d85dbbb..00000000000
--- a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.js
+++ /dev/null
@@ -1,111 +0,0 @@
-function run_test() {
- test(function() {
- // "There MUST exist a property on the ECMAScript global object whose
- // name is “DOMException” and value is an object called the
- // DOMException constructor object, which provides access to legacy
- // DOMException code constants. The property has the attributes
- // { [[Writable]]: true, [[Enumerable]]: false,
- // [[Configurable]]: true }."
- assert_own_property(self, "DOMException",
- "self does not have own property \"DOMException\"");
- var desc = Object.getOwnPropertyDescriptor(self, "DOMException");
- assert_false("get" in desc, "self's property \"DOMException\" has getter");
- assert_false("set" in desc, "self's property \"DOMException\" has setter");
- assert_true(desc.writable, "self's property \"DOMException\" is not writable");
- assert_false(desc.enumerable, "self's property \"DOMException\" is enumerable");
- assert_true(desc.configurable, "self's property \"DOMException\" is not configurable");
-
- // "The DOMException constructor object MUST be a function object but
- // with a [[Prototype]] value of %Error% ([ECMA-262], section 6.1.7.4)."
- assert_equals(Object.getPrototypeOf(self.DOMException), Error,
- "prototype of self's property \"DOMException\" is not Error");
-
- // "Its [[Get]] internal property is set as described in ECMA-262
- // section 9.1.8."
- // Not much to test for this.
- // "Its [[Construct]] internal property is set as described in ECMA-262
- // section 19.2.2.3."
- // "Its @@hasInstance property is set as described in ECMA-262 section
- // 19.2.3.8, unless otherwise specified."
-
- // String() returns something implementation-dependent, because it
- // calls Function#toString.
- assert_class_string(self.DOMException, "Function",
- "class string of DOMException");
-
- // "For every legacy code listed in the error names table, there MUST
- // be a property on the DOMException constructor object whose name and
- // value are as indicated in the table. The property has attributes
- // { [[Writable]]: false, [[Enumerable]]: true,
- // [[Configurable]]: false }."
- // See DOMException-constants.html.
- }, "existence and properties of DOMException");
-
- test(function() {
- assert_own_property(self, "DOMException",
- "self does not have own property \"DOMException\"");
-
- // "The DOMException constructor object MUST also have a property named
- // “prototype” with attributes { [[Writable]]: false,
- // [[Enumerable]]: false, [[Configurable]]: false } whose value is an
- // object called the DOMException prototype object. This object also
- // provides access to the legacy code values."
- assert_own_property(self.DOMException, "prototype",
- 'exception "DOMException" does not have own property "prototype"');
- var desc = Object.getOwnPropertyDescriptor(self.DOMException, "prototype");
- assert_false("get" in desc, "DOMException.prototype has getter");
- assert_false("set" in desc, "DOMException.prototype has setter");
- assert_false(desc.writable, "DOMException.prototype is writable");
- assert_false(desc.enumerable, "DOMException.prototype is enumerable");
- assert_false(desc.configurable, "DOMException.prototype is configurable");
-
- // "The DOMException prototype object MUST have an internal
- // [[Prototype]] property whose value is %ErrorPrototype% ([ECMA-262],
- // section 6.1.7.4)."
- assert_own_property(self, "Error",
- 'should inherit from Error, but self has no such property');
- assert_own_property(self.Error, "prototype",
- 'should inherit from Error, but that object has no "prototype" property');
- assert_equals(Object.getPrototypeOf(self.DOMException.prototype),
- self.Error.prototype,
- 'prototype of DOMException.prototype is not Error.prototype');
-
- // "The class string of the DOMException prototype object is
- // “DOMExceptionPrototype”."
- assert_class_string(self.DOMException.prototype, "DOMExceptionPrototype",
- "class string of DOMException.prototype");
- }, "existence and properties of DOMException.prototype");
-
- test(function() {
- assert_false(self.DOMException.prototype.hasOwnProperty("name"),
- "DOMException.prototype should not have an own \"name\" " +
- "property.");
- assert_false(self.DOMException.prototype.hasOwnProperty("code"),
- "DOMException.prototype should not have an own \"name\" " +
- "property.");
- }, "existence of name and code properties on DOMException.prototype");
-
- test(function() {
- assert_own_property(self, "DOMException",
- "self does not have own property \"DOMException\"");
- assert_own_property(self.DOMException, "prototype",
- 'interface "DOMException" does not have own property "prototype"');
-
- // "There MUST be a property named “constructor” on the DOMException
- // prototype object with attributes { [[Writable]]: true,
- // [[Enumerable]]: false, [[Configurable]]: true } and whose value is
- // the DOMException constructor object."
- assert_own_property(self.DOMException.prototype, "constructor",
- "DOMException" + '.prototype does not have own property "constructor"');
- var desc = Object.getOwnPropertyDescriptor(self.DOMException.prototype, "constructor");
- assert_false("get" in desc, "DOMException.prototype.constructor has getter");
- assert_false("set" in desc, "DOMException.prototype.constructor has setter");
- assert_true(desc.writable, "DOMException.prototype.constructor is not writable");
- assert_false(desc.enumerable, "DOMException.prototype.constructor is enumerable");
- assert_true(desc.configurable, "DOMException.prototype.constructor in not configurable");
- assert_equals(self.DOMException.prototype.constructor, self.DOMException,
- "DOMException.prototype.constructor is not the same object as DOMException");
- }, "existence and properties of exception interface prototype object's \"constructor\" property");
-
- done();
-}
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js
deleted file mode 100644
index 75149244f59..00000000000
--- a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/constructor-object.worker.js
+++ /dev/null
@@ -1,3 +0,0 @@
-importScripts("/resources/testharness.js")
-importScripts("constructor-object.js")
-run_test();
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html
index 06c196ef845..396d0a4c6c6 100644
--- a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/es-exceptions/exceptions.html
@@ -20,90 +20,31 @@
setup({explicit_done: true});
function testException(exception, global, desc) {
- // https://heycam.github.io/webidl/#es-exception-objects
- // (as of 2015-01-03): "The value of the internal [[Prototype]] property of a
- // DOMException object MUST be the DOMException prototype object from the
- // global environment the exception object is associated with."
test(function() {
assert_equals(global.Object.getPrototypeOf(exception),
global.DOMException.prototype);
}, desc + "Object.getPrototypeOf(exception) === DOMException.prototype");
- // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
- // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
- // passing “name”, Property Descriptor { [[Value]]: /N/, [[Writable]]: true,
- // [[Enumerable]]: true, [[Configurable]]: true }, and false as arguments."
test(function() {
- assert_true(exception.hasOwnProperty("name"));
+ assert_false(exception.hasOwnProperty("name"));
}, desc + "exception.hasOwnProperty(\"name\")");
+ test(function() {
+ assert_false(exception.hasOwnProperty("message"));
+ }, desc + "exception.hasOwnProperty(\"message\")");
test(function() {
assert_equals(exception.name, "HierarchyRequestError");
}, desc + "exception.name === \"HierarchyRequestError\"");
test(function() {
- var desc = global.Object.getOwnPropertyDescriptor(exception, "name");
- assert_true(desc.writable, "must be writable");
- assert_true(desc.enumerable, "must be enumerable");
- assert_true(desc.configurable, "must be configurable");
- }, desc + "Object.getOwnPropertyDescriptor(exception, \"name\")");
-
-
- // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
- // (as of 2015-01-03): "If the optional user agent-defined message /M/ was
- // specified, then this list has a single element whose value is the result
- // of converting /M/ to a String value. Otherwise, the list is empty."
- //
- // https://heycam.github.io/webidl/#es-DOMException-constructor-object
- // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
- // passing “message”, Property Descriptor { [[Value]]: /S/,
- // [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }, and
- // false as arguments."
- test(function() {
- if (exception.hasOwnProperty("message")) {
- var desc = global.Object.getOwnPropertyDescriptor(exception, "message");
- assert_true(desc.writable, "must be writable");
- assert_false(desc.enumerable, "must not be enumerable");
- assert_true(desc.configurable, "must be configurable");
- }
- }, desc + "Object.getOwnPropertyDescriptor(exception, \"message\")");
-
- test(function() {
- if (exception.hasOwnProperty("message")) {
- // Can't test anything more specific, since it's implementation-defined :(
- assert_equals(typeof exception.message, "string");
- } else {
- // Error.prototype.message
- assert_equals(exception.message, "");
- }
- }, desc + "typeof exception.message === \"string\"");
-
+ assert_equals(exception.code, global.DOMException.HIERARCHY_REQUEST_ERR);
+ }, desc + "exception.code === DOMException.HIERARCHY_REQUEST_ERR");
- // https://heycam.github.io/webidl/#es-exception-objects
- // (as of 2015-01-03): "The class string of a DOMException object MUST be
- // “DOMException”."
test(function() {
assert_equals(global.Object.prototype.toString.call(exception),
"[object DOMException]");
}, desc + "Object.prototype.toString.call(exception) === \"[object DOMException]\"");
-
-
- // https://heycam.github.io/webidl/#es-creating-throwing-exceptions
- // (as of 2015-01-03): "Call the [[DefineOwnProperty]] internal method of /O/
- // passing “code”, Property Descriptor { [[Value]]: /code/,
- // [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }, and
- // false as arguments."
- test(function() {
- assert_equals(exception.code, global.DOMException.HIERARCHY_REQUEST_ERR);
- }, desc + "exception.code === DOMException.HIERARCHY_REQUEST_ERR");
-
- test(function() {
- var desc = global.Object.getOwnPropertyDescriptor(exception, "name");
- assert_true(desc.writable, "must be writable");
- assert_true(desc.enumerable, "must be enumerable");
- assert_true(desc.configurable, "must be configurable");
- }, desc + "Object.getOwnPropertyDescriptor(exception, \"code\")");
}
diff --git a/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/legacy-platform-object.html b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/legacy-platform-object.html
new file mode 100644
index 00000000000..a5327e97d04
--- /dev/null
+++ b/tests/wpt/web-platform-tests/WebIDL/ecmascript-binding/legacy-platform-object.html
@@ -0,0 +1,191 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Legacy platform objects</title>
+<link rel="help" href="https://heycam.github.io/webidl/#es-legacy-platform-objects">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+function assert_prop_desc_equals(object, property_key, expected) {
+ let actual = Object.getOwnPropertyDescriptor(object, property_key);
+ if (expected === undefined) {
+ assert_equals(
+ actual, undefined,
+ "(assert_prop_desc_equals: no property descriptor expected)");
+ return;
+ }
+ for (p in actual) {
+ assert_true(
+ expected.hasOwnProperty(p),
+ "(assert_prop_desc_equals: property '" + p + "' is not expected)");
+ assert_equals(
+ actual[p], expected[p],
+ "(assert_prop_desc_equals: property '" + p + "')");
+ }
+ for (p in expected) {
+ assert_true(
+ actual.hasOwnProperty(p),
+ "(assert_prop_desc_equals: expected property '" + p + "' missing)");
+ }
+}
+
+// https://heycam.github.io/webidl/#legacy-platform-object-getownproperty
+// https://heycam.github.io/webidl/#LegacyPlatformObjectGetOwnProperty
+
+test(function() {
+ // DOMTokenList has an indexed property getter, no indexed property setter
+ // and no named property handlers.
+ let div = document.createElement("div");
+ div.classList.add("baz", "quux");
+ const domTokenList = div.classList;
+ assert_prop_desc_equals(
+ domTokenList, "1",
+ {value: "quux", writable: false, enumerable: true, configurable: true},
+ "[[GetOwnProperty]] for indexed properties returns the right descriptor");
+ assert_prop_desc_equals(
+ domTokenList, "42", undefined,
+ "[[GetOwnProperty]] with invalid index returns undefined");
+ assert_array_equals(Object.keys(domTokenList), ["0", "1"]);
+ assert_array_equals(Object.values(domTokenList), ["baz", "quux"]);
+
+ // getElementsByTagName() returns an HTMLCollection.
+ // HTMLCollection has indexed and named property getters, no setters. Its IDL
+ // interface declaration has [LegacyUnenumerableNamedProperties] so its named
+ // properties are not enumerable.
+ let span1 = document.createElement("span");
+ span1.id = "foo";
+ let span2 = document.createElement("span");
+ span2.id = "bar";
+ document.head.appendChild(span1);
+ document.head.appendChild(span2);
+ const elementList = document.getElementsByTagName("span");
+ assert_prop_desc_equals(
+ elementList, "foo",
+ {value: span1, writable: false, enumerable: false, configurable: true},
+ "[[GetOwnProperty]] for named properties returns the right descriptor");
+ assert_prop_desc_equals(
+ elementList, "1",
+ {value: span2, writable: false, enumerable: true, configurable: true},
+ "[[GetOwnProperty]] for indexed properties returns the right descriptor");
+ assert_prop_desc_equals(
+ elementList, "unknown", undefined,
+ "[[GetOwnProperty]] with invalid property name returns undefined");
+ assert_array_equals(Object.keys(elementList), ["0", "1"]);
+ assert_array_equals(Object.values(elementList), [span1, span2]);
+}, "[[GetOwnProperty]] with getters and no setters");
+
+test(function() {
+ // DOMStringMap supports named property getters and setters, but not indexed
+ // properties.
+ let span = document.createElement("span");
+ span.dataset.foo = "bar";
+ assert_prop_desc_equals(
+ span.dataset, "foo",
+ {value: "bar", writable: true, enumerable: true, configurable: true},
+ "[[GetOwnProperty]] for named properties returns the right descriptor");
+ assert_prop_desc_equals(
+ span.dataset, "unknown", undefined,
+ "[[GetOwnProperty]] with invalid property name returns undefined");
+ assert_array_equals(Object.keys(span.dataset), ["foo"]);
+ assert_array_equals(Object.values(span.dataset), ["bar"]);
+}, "[[GetOwnProperty]] with named property getters and setters");
+
+test(function() {
+ // HTMLSelectElement has indexed property getters and setters, but no support
+ // for named properties.
+ let selectElement = document.createElement("select");
+ assert_prop_desc_equals(
+ selectElement, "0", undefined,
+ "[[GetOwnProperty]] with invalid property index returns undefined");
+ let optionElement = document.createElement("option");
+ selectElement.appendChild(optionElement);
+ assert_prop_desc_equals(
+ selectElement, "0",
+ {value: optionElement, writable: true, enumerable: true, configurable: true},
+ "[[GetOwnProperty]] for indexed properties returns the right descriptor");
+ assert_array_equals(Object.keys(selectElement), ["0"]);
+ assert_array_equals(Object.values(selectElement), [optionElement]);
+}, "[[GetOwnProperty]] with indexed property getters and setters");
+
+// https://heycam.github.io/webidl/#legacy-platform-object-defineownproperty
+// 3.9.3. [[DefineOwnProperty]]
+
+test(function() {
+ let span = document.createElement("span");
+ span.className = "foo";
+ // DOMTokenList supports an indexed property getter but not a setter.
+ let domTokenList = span.classList;
+ // Confirm the test settings.
+ assert_equals(domTokenList.length, 1);
+ assert_prop_desc_equals(domTokenList, "0",
+ {value: "foo", writable: false, enumerable: true,
+ configurable: true});
+ assert_prop_desc_equals(domTokenList, "1", undefined);
+ // Actual test
+ assert_throws(new TypeError(), () =>
+ Object.defineProperty(domTokenList, "0", {value: true, writable: true}));
+ assert_throws(new TypeError(), () =>
+ Object.defineProperty(domTokenList, "1", {value: true, writable: true}));
+ assert_throws(new TypeError(), () =>
+ Object.defineProperty(domTokenList, "0", {get: () => {}}));
+ assert_throws(new TypeError(), () =>
+ Object.defineProperty(domTokenList, "0", {set: () => {}}));
+ assert_throws(new TypeError(), () =>
+ Object.defineProperty(domTokenList, "1", {get: () => {}}));
+ assert_throws(new TypeError(), () =>
+ Object.defineProperty(domTokenList, "1", {set: () => {}}));
+ assert_equals(domTokenList[0], "foo");
+ assert_equals(domTokenList[1], undefined);
+ domTokenList[0] = "bar";
+ domTokenList[1] = "bar";
+ assert_equals(domTokenList[0], "foo");
+ assert_equals(domTokenList[1], undefined);
+ assert_throws(new TypeError(), () => {
+ "use strict";
+ domTokenList[0] = "bar";
+ });
+ assert_throws(new TypeError(), () => {
+ "use strict";
+ domTokenList[1] = "bar";
+ });
+ // Nothing must change after all.
+ assert_equals(domTokenList.length, 1);
+ assert_prop_desc_equals(domTokenList, "0",
+ {value: "foo", writable: false, enumerable: true,
+ configurable: true});
+ assert_prop_desc_equals(domTokenList, "1", undefined);
+}, "Test [[DefineOwnProperty]] with no indexed property setter support.");
+
+test(function() {
+ // HTMLSelectElement supports an indexed property setter.
+ let select = document.createElement("select");
+ let option0 = document.createElement("option");
+ let option1 = document.createElement("option");
+ // Confirm the test settings.
+ assert_equals(select.length, 0);
+ assert_prop_desc_equals(select, "0", undefined);
+ // Try to define an accessor property with non supported property index.
+ assert_throws(new TypeError(), () =>
+ Object.defineProperty(select, "0", {get: () => {}}));
+ assert_throws(new TypeError(), () =>
+ Object.defineProperty(select, "0", {set: () => {}}));
+ assert_prop_desc_equals(select, "0", undefined);
+ // writable, enumerable, configurable will be ignored.
+ Object.defineProperty(select, "0", {value: option0, writable: false,
+ enumerable: false, configurable: false});
+ assert_prop_desc_equals(select, "0",
+ {value: option0, writable: true, enumerable: true,
+ configurable: true});
+ select[1] = option1;
+ assert_prop_desc_equals(select, "1",
+ {value: option1, writable: true, enumerable: true,
+ configurable: true});
+ // Try to define an accessor property with a supported property index.
+ assert_throws(new TypeError(), () =>
+ Object.defineProperty(select, "0", {get: () => {}}));
+ assert_throws(new TypeError(), () =>
+ Object.defineProperty(select, "0", {set: () => {}}));
+ assert_prop_desc_equals(select, "0",
+ {value: option0, writable: true, enumerable: true,
+ configurable: true});
+}, "Test [[DefineOwnProperty]] with indexed property setter support.");
+</script>
diff --git a/tests/wpt/web-platform-tests/WebIDL/interfaces.html b/tests/wpt/web-platform-tests/WebIDL/interfaces.html
new file mode 100644
index 00000000000..c3e66952ca6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/WebIDL/interfaces.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>WebIDL IDL tests</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>
+
+<div id=log></div>
+<script>
+"use strict";
+var idlArray = new IdlArray();
+
+function doTest(idl) {
+ idlArray.add_idls(idl);
+ idlArray.add_objects({
+ DOMException: ['new DOMException()',
+ 'new DOMException("my message")',
+ 'new DOMException("my message", "myName")'],
+ });
+ idlArray.test();
+}
+
+promise_test(function() {
+ return fetch("/interfaces/webidl.idl").then(response => response.text())
+ .then(doTest);
+}, "Test driver");
+</script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects-async-same-origin.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects-async-same-origin.htm
new file mode 100644
index 00000000000..24cc80c228f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects-async-same-origin.htm
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that asynchronous XMLHttpRequests handle redirects according to the CORS standard.</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ function runTest(test, path, credentials, expectSuccess) {
+ const xhr = new XMLHttpRequest();
+ xhr.withCredentials = credentials;
+ xhr.open("GET", "resources/redirect.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN + path, true);
+
+ xhr.onload = test.step_func_done(function() {
+ assert_true(expectSuccess);
+ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.");
+ });
+ xhr.onerror = test.step_func_done(function() {
+ assert_false(expectSuccess);
+ assert_equals(xhr.status, 0);
+ });
+ xhr.send(null);
+ }
+
+ const withoutCredentials = false;
+ const withCredentials = true;
+ const succeeds = true;
+ const fails = false;
+
+ // Test simple same origin requests that receive cross origin redirects.
+
+ // The redirect response passes the access check.
+ async_test(t => {
+ runTest(t, "/XMLHttpRequest/resources/access-control-basic-allow-star.py",
+ withoutCredentials, succeeds)
+ }, "Request without credentials is redirected to a cross-origin response with Access-Control-Allow-Origin=* (with star)");
+
+ // The redirect response fails the access check because credentials were sent.
+ async_test(t => {
+ runTest(t, "/XMLHttpRequest/resources/access-control-basic-allow-star.py",
+ withCredentials, fails)
+ }, "Request with credentials is redirected to a cross-origin response with Access-Control-Allow-Origin=* (with star)");
+
+ // The redirect response passes the access check.
+ async_test(t => {
+ runTest(t, "/XMLHttpRequest/resources/access-control-basic-allow.py",
+ withoutCredentials, succeeds)
+ }, "Request without credentials is redirected to a cross-origin response with a specific Access-Control-Allow-Origin");
+
+ // The redirect response passes the access check.
+ async_test(t => {
+ runTest(t, "/XMLHttpRequest/resources/access-control-basic-allow.py",
+ withCredentials, succeeds)
+ }, "Request with credentials is redirected to a cross-origin response with a specific Access-Control-Allow-Origin");
+
+ // forbidding credentials. The redirect response passes the access check.
+ async_test(t => {
+ runTest(t, "/XMLHttpRequest/resources/access-control-basic-allow-no-credentials.py",
+ withoutCredentials, succeeds)
+ }, "Request without credentials is redirected to a cross-origin response with a specific Access-Control-Allow-Origin (no credentials)");
+
+ // forbidding credentials. The redirect response fails the access check.
+ async_test(t => {
+ runTest(t, "/XMLHttpRequest/resources/access-control-basic-allow-no-credentials.py",
+ withCredentials, fails)
+ }, "Request with credentials is redirected to a cross-origin response with a specific Access-Control-Allow-Origin (no credentials)");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects-async.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects-async.htm
new file mode 100644
index 00000000000..bf16c3c8a1c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects-async.htm
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that asynchronous XMLHttpRequests handle redirects according to the CORS standard.</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ function runTest(test, destination, parameters, customHeader, local, expectSuccess) {
+ const xhr = new XMLHttpRequest();
+ const url = (local ? get_host_info().HTTP_ORIGIN : get_host_info().HTTP_REMOTE_ORIGIN) +
+ "/XMLHttpRequest/resources/redirect-cors.py?location=" + destination + "&" + parameters;
+
+ xhr.open("GET", url, true);
+
+ if (customHeader)
+ xhr.setRequestHeader("x-test", "test");
+
+ xhr.onload = test.step_func_done(function() {
+ assert_true(expectSuccess);
+ assert_true(xhr.responseText.startsWith("PASS"));
+ });
+ xhr.onerror = test.step_func_done(function() {
+ assert_false(expectSuccess);
+ assert_equals(xhr.status, 0);
+ });
+ xhr.send();
+ }
+
+ const withCustomHeader = true;
+ const withoutCustomHeader = false;
+ const local = true;
+ const remote = false;
+ const succeeds = true;
+ const fails = false;
+
+ // Test simple cross origin requests that receive redirects.
+
+ // The redirect response fails the access check because the redirect lacks a CORS header.
+ async_test(t => {
+ runTest(t, get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow-star.py", "",
+ withoutCustomHeader, remote, fails)
+ }, "Request is redirected without CORS headers to a response with Access-Control-Allow-Origin=*");
+
+ // The redirect response passes the access check.
+ async_test(t => {
+ runTest(t, get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow-star.py", "allow_origin=true",
+ withoutCustomHeader, remote, succeeds)
+ }, "Request is redirected to a response with Access-Control-Allow-Origin=*");
+
+ // The redirect response fails the access check because user info was sent.
+ async_test(t => {
+ runTest(t, get_host_info().HTTP_REMOTE_ORIGIN.replace("http://", "http://username:password@") +
+ "/XMLHttpRequest/resources/access-control-basic-allow-star.py", "allow_origin=true",
+ withoutCustomHeader, remote, fails)
+ }, "Request with user info is redirected to a response with Access-Control-Allow-Origin=*");
+
+ // The redirect response fails the access check because the URL scheme is unsupported.
+ async_test(t => {
+ runTest(t, "foo://bar.cgi", "allow_origin=true", withoutCustomHeader, remote, fails)
+ }, "Request is redirect to a bad URL");
+
+ // The preflighted redirect response fails the access check because of preflighting.
+ async_test(t => {
+ runTest(t, get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow-star.py",
+ "allow_origin=true&redirect_preflight=true", withCustomHeader, remote, fails)
+ }, "Preflighted request is redirected to a response with Access-Control-Allow-Origin=*");
+
+ // The preflighted redirect response fails the access check after successful preflighting.
+ async_test(t => {
+ runTest(t, get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow-star.py",
+ "allow_origin=true&allow_header=x-test&redirect_preflight=true",
+ withCustomHeader, remote, fails)
+ }, "Preflighted request is redirected to a response with Access-Control-Allow-Origin=* and header allowed");
+
+ // The same-origin redirect response passes the access check.
+ async_test(t => {
+ runTest(t, get_host_info().HTTP_ORIGIN + "/XMLHttpRequest/resources/pass.txt",
+ "", withCustomHeader, local, succeeds)
+ }, "Request is redirected to a same-origin resource file");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects.htm
new file mode 100644
index 00000000000..dcdf40044cb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-and-redirects.htm
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that redirects between origins are allowed when access control is involved.</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ function runSync(test, url)
+ {
+ const xhr = new XMLHttpRequest();
+ xhr.open("GET", url, false);
+ xhr.send();
+ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.");
+ test.done();
+ }
+ function runAsync(test, url)
+ {
+ const xhr = new XMLHttpRequest();
+ xhr.open("GET", url, true);
+ xhr.onload = test.step_func_done(function() {
+ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.");
+ });
+ xhr.onerror = test.unreached_func("Network error");
+ xhr.send();
+ test.done();
+ }
+ test(t => {
+ runSync(t, "resources/redirect-cors.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow.py")
+ }, "Local sync redirect to remote origin");
+ async_test(t => {
+ runAsync(t, "resources/redirect-cors.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow.py")
+ }, "Local async redirect to remote origin");
+ test(t => {
+ runSync(t, get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/redirect-cors.py?location=" + get_host_info().HTTP_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow.py&allow_origin=true")
+ }, "Remote sync redirect to local origin");
+ async_test(t => {
+ runAsync(t, get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/redirect-cors.py?location=" + get_host_info().HTTP_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow.py&allow_origin=true")
+ }, "Remote async redirect to local origin");
+ test(t => {
+ runSync(t, get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/redirect-cors.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow.py&allow_origin=true")
+ }, "Remote sync redirect to same remote origin");
+ async_test(t => {
+ runAsync(t, get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/redirect-cors.py?location=" + get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow.py&allow_origin=true")
+ }, "Remote async redirect to same remote origin");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm
new file mode 100644
index 00000000000..d73f56b017b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-access-control-origin-header-data-url.htm
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that cross-origin access is granted to null-origin embedded iframe</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+const url = get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-origin-header.py";
+async_test(function(test) {
+ window.addEventListener("message", test.step_func(function(evt) {
+ if (evt.data == "ready") {
+ document.getElementById("frame").contentWindow.postMessage(url, "*");
+ } else {
+ assert_equals(evt.data, "PASS: Cross-domain access allowed.\nHTTP_ORIGIN: null");
+ test.done();
+ }
+ }), false);
+}, "Access granted to null-origin iframe");
+ </script>
+ <iframe id="frame" src='data:text/html,
+ <script>
+(function() {
+ parent.postMessage("ready", "*");
+ window.addEventListener("message", function(evt) {
+ try {
+ const url = evt.data;
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", url, false);
+ xhr.send();
+
+ parent.postMessage(xhr.responseText, "*");
+ } catch(e) {
+ parent.postMessage(e.message, "*");
+ }
+ });
+})();
+ </script>'>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-access-control-origin-header.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-access-control-origin-header.htm
new file mode 100644
index 00000000000..87b7e4755f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-access-control-origin-header.htm
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test(function(test) {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-origin-header.py", false);
+ xhr.send();
+
+ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.\n" +
+ "HTTP_ORIGIN: " + get_host_info().HTTP_ORIGIN);
+ test.done();
+ }, "Access control test with origin header");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-async.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-async.htm
new file mode 100644
index 00000000000..d9e03210d0c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-async.htm
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Testing a basic asynchronous CORS XHR request</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test(function(test) {
+ const xhr = new XMLHttpRequest;
+
+ xhr.onreadystatechange = test.step_func(function() {
+ if (xhr.readyState == xhr.DONE) {
+ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.");
+ test.done();
+ }
+ });
+
+ xhr.onerror = test.unreached_func("FAIL: Network error.");
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-allow.py", true);
+ xhr.send();
+ }, "Basic async cross-origin XHR request");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method-async.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method-async.htm
new file mode 100644
index 00000000000..57721aa684b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method-async.htm
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests cross-origin async request with non-CORS-safelisted method</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test((test) => {
+ const xhr = new XMLHttpRequest;
+
+ xhr.onload = test.step_func_done(() => {
+ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.\nPASS: PUT data received");
+ });
+
+ xhr.onerror = test.unreached_func("Unexpected error.");
+
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-put-allow.py");
+ xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
+ xhr.send("PASS: PUT data received");
+ }, "Allow async PUT request");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method.htm
new file mode 100644
index 00000000000..08f41117f87
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-non-cors-safelisted-method.htm
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests cross-origin request with non-CORS-safelisted method</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ test(function() {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-put-allow.py", false);
+
+ xhr.setRequestHeader("Content-Type", "text/plain; charset=UTF-8");
+
+ xhr.send("PASS: PUT data received");
+
+ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.\nPASS: PUT data received");
+ }, "Allow PUT request");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-header.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-header.htm
new file mode 100644
index 00000000000..5a1e396e52f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-header.htm
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Preflight cache should be invalidated in presence of custom header</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ const uuid = token();
+ const xhr = new XMLHttpRequest;
+
+ async_test(function(test) {
+ xhr.onerror = test.unreached_func("FAIL: Network error.");
+ xhr.onload = test.step_func(function() {
+ // Token reset. We can start the test now.
+ assert_equals(xhr.responseText, "PASS");
+ firstRequest();
+ });
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/reset-token.py?token=" + uuid, true);
+ xhr.send();
+
+ function firstRequest() {
+ xhr.onload = test.step_func(function() {
+ assert_equals(xhr.responseText, "PASS: First PUT request.");
+ secondRequest();
+ });
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-preflight-cache-invalidation.py?token=" + uuid, true);
+ xhr.send();
+ }
+
+ function secondRequest() {
+ xhr.onload = test.step_func(function() {
+ assert_equals(xhr.responseText, "PASS: Second OPTIONS request was sent.");
+ test.done();
+ });
+ // Send a header not included in the inital cache.
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-preflight-cache-invalidation.py?token=" + uuid, true);
+ xhr.setRequestHeader("x-test", "headerValue");
+ xhr.send();
+ }
+ }, "Preflight cache should be invalidated in presence of custom header");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-method.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-method.htm
new file mode 100644
index 00000000000..058943e839d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-invalidation-by-method.htm
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Preflight cache should be invalidated by changed method</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ const uuid = token();
+ const xhr = new XMLHttpRequest;
+
+ async_test(function(test) {
+ xhr.onerror = test.unreached_func("FAIL: Network error.");
+ xhr.onload = test.step_func(function() {
+ // Token reset. We can start the test now.
+ assert_equals(xhr.responseText, "PASS");
+ firstRequest();
+ });
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/reset-token.py?token=" + uuid, true);
+ xhr.send();
+
+ function firstRequest() {
+ xhr.onload = test.step_func(function() {
+ assert_equals(xhr.responseText, "PASS: First PUT request.");
+ secondRequest();
+ });
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-preflight-cache-invalidation.py?token=" + uuid, true);
+ xhr.send();
+ }
+
+ function secondRequest() {
+ xhr.onload = test.step_func(function() {
+ assert_equals(xhr.responseText, "PASS: Second OPTIONS request was sent.");
+ test.done();
+ });
+ // Send a header not included in the inital cache.
+ xhr.open("XMETHOD", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-preflight-cache-invalidation.py?token=" + uuid, true);
+ xhr.send();
+ }
+ }, "Preflight cache should be invalidated by changed method");
+
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-timeout.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-timeout.htm
new file mode 100644
index 00000000000..56702c01d0e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache-timeout.htm
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Preflight cache should be invalidated on timeout</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ const uuid = token();
+ let xhr = new XMLHttpRequest;
+
+ async_test(function(test) {
+ xhr.onerror = test.unreached_func("FAIL: Network error.");
+ xhr.onload = test.step_func(function() {
+ // Token reset. We can start the test now.
+ assert_equals(xhr.responseText, "PASS");
+ firstRequest();
+ });
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/reset-token.py?token=" + uuid, true);
+ xhr.send();
+
+ function firstRequest() {
+ xhr.onload = test.step_func(function() {
+ assert_equals(xhr.responseText, "PASS: First PUT request.");
+ step_timeout(secondRequest, 3000); // 3 seconds
+ });
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-preflight-cache-timeout.py?token=" + uuid, true);
+ xhr.send();
+ }
+
+ function secondRequest() {
+ xhr.onload = test.step_func(function() {
+ assert_equals(xhr.responseText, "PASS: Second OPTIONS request was sent.");
+ test.done();
+ });
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-preflight-cache-timeout.py?token=" + uuid, true);
+ xhr.send();
+ }
+ }, "Preflight cache should be invalidated on timeout");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache.htm
new file mode 100644
index 00000000000..ad38a6bdb1d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-preflight-cache.htm
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Preflight cache should allow second request without preflight OPTIONS request</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ const uuid = token();
+
+ async_test(function(test) {
+ const xhr = new XMLHttpRequest;
+ xhr.onerror = test.unreached_func("FAIL: Network error.");
+ xhr.onload = test.step_func(function() {
+ // Token reset. We can start the test now.
+ assert_equals(xhr.responseText, "PASS");
+ firstRequest();
+ });
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/reset-token.py?token=" + uuid, true);
+ xhr.send();
+
+ function firstRequest() {
+ xhr.onload = test.step_func(function() {
+ assert_equals(xhr.responseText, "PASS: First PUT request.");
+ secondRequest();
+ });
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-preflight-cache.py?token=" + uuid, true);
+ xhr.send();
+ }
+
+ function secondRequest() {
+ xhr.onload = test.step_func_done(function() {
+ assert_equals(xhr.responseText, "PASS: Second PUT request. Preflight worked.");
+ });
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-preflight-cache.py?token=" + uuid, true);
+ xhr.send();
+ }
+ }, "Preflight cache should allow second request");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-star.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-star.htm
new file mode 100644
index 00000000000..fac25e297b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow-star.htm
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests "*" setting for Access-Control-Allow-Origin header</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ const xhr = new XMLHttpRequest;
+
+ test(function(test) {
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-allow-star.py", false);
+
+ xhr.send();
+
+ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.");
+ }, "Allow star");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow.htm
new file mode 100644
index 00000000000..f7e67babdf1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-allow.htm
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests CORS with Access-Control-Allow-Origin header</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ test(function() {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-allow.py", false);
+
+ xhr.send();
+
+ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.");
+ }, "Allow basic");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm
new file mode 100644
index 00000000000..1d570a3c93e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-cors-safelisted-request-headers.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that CORS-safelisted request headers are permitted in cross-origin request</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ test(function() {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("POST", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-cors-safelisted-request-headers.py", false);
+
+ xhr.setRequestHeader("Accept", "*");
+ xhr.setRequestHeader("Accept-Language", "ru");
+ xhr.setRequestHeader("Content-Language", "ru");
+ xhr.setRequestHeader("Content-Type", "text/plain");
+ xhr.setRequestHeader("Save-Data", "on");
+
+ xhr.send();
+
+ assert_equals(xhr.responseText,
+ "Accept: *\n" +
+ "Accept-Language: ru\n" +
+ "Content-Language: ru\n" +
+ "Content-Type: text/plain\n");
+ }, "Request with CORS-safelisted headers");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-cors-safelisted-response-headers.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-cors-safelisted-response-headers.htm
new file mode 100644
index 00000000000..c795083ece9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-cors-safelisted-response-headers.htm
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that CORS-safelisted response headers are permitted in cross-origin request</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ test(function() {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-whitelist-response-headers.py", false);
+ xhr.send();
+
+ assert_not_equals(xhr.getResponseHeader("cache-control"), null);
+ assert_not_equals(xhr.getResponseHeader("content-language"), null);
+ assert_not_equals(xhr.getResponseHeader("content-type"), null);
+ assert_not_equals(xhr.getResponseHeader("expires"), null);
+ assert_not_equals(xhr.getResponseHeader("last-modified"), null);
+ assert_not_equals(xhr.getResponseHeader("pragma"), null);
+ assert_equals(xhr.getResponseHeader("x-webkit"), null);
+
+ assert_not_equals(xhr.getAllResponseHeaders().match("en"), null);
+ assert_equals(xhr.getAllResponseHeaders().match("foobar"), null);
+ }, "Response with CORS-safelisted headers");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-denied.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-denied.htm
new file mode 100644
index 00000000000..924bdd55a69
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-denied.htm
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests CORS denying resource without Access-Control-Allow-Origin header</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ const path = "/XMLHttpRequest/resources/access-control-basic-denied.py";
+
+ test(function() {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_ORIGIN + path, false);
+ xhr.send();
+ assert_equals(xhr.status, 200);
+ }, "Same-origin request accepted");
+
+ test(function() {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + path, false);
+ try {
+ xhr.send();
+ assert_unreached("Error should occur here");
+ } catch(e) {
+ assert_equals(xhr.status, 0);
+ }
+ }, "Cross-origin request denied");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-get-fail-non-simple.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-get-fail-non-simple.htm
new file mode 100644
index 00000000000..ccd9f7cab03
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-get-fail-non-simple.htm
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests CORS denying preflighted request to resource without CORS headers for OPTIONS</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ test(function() {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-options-not-supported.py", false);
+
+ // Non-CORS-safelisted header
+ xhr.setRequestHeader("x-test", "foobar");
+
+ // This fails because the server-side script is not prepared for an OPTIONS request
+ try {
+ xhr.send();
+ } catch(e) {
+ assert_equals(xhr.status, 0);
+ return;
+ }
+ assert_unreached("Preflighted request was not denied.");
+ }, "Preflighted cross-origin request denied");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-non-cors-safelisted-content-type.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-non-cors-safelisted-content-type.htm
new file mode 100644
index 00000000000..bff0cf569c5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-non-cors-safelisted-content-type.htm
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests cross-origin request with non-CORS-safelisted content type</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ test(() => {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-put-allow.py", false);
+ xhr.setRequestHeader("Content-Type", "text/plain");
+ xhr.send("PASS: PUT data received");
+
+ assert_equals(xhr.responseText, "PASS: Cross-domain access allowed.\nPASS: PUT data received");
+
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-put-allow.py", false);
+ xhr.setRequestHeader("Content-Type", "application/xml");
+
+ try {
+ xhr.send("FAIL: PUT data received");
+ } catch(e) {
+ assert_equals(xhr.status, 0, "Cross-domain access was denied in 'send'.");
+ return;
+ }
+ assert_unreached("Cross-domain access was not denied in 'send'.");
+ }, "Deny cross-origin request with non-CORS-safelisted content type");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-post-success-no-content-type.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-post-success-no-content-type.htm
new file mode 100644
index 00000000000..8785a44504b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-post-success-no-content-type.htm
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that POST requests with text content and no content-type set explicitly don't generate a preflight request.</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test(function(test) {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("POST", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-basic-options-not-supported.py");
+
+ xhr.onerror = test.unreached_func("Network error.");
+
+ xhr.onload = test.step_func_done(function() {
+ assert_equals(xhr.status, 200);
+ });
+
+ xhr.send("Test");
+ }, "POST request with text content and no Content-Type header");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-post-with-non-cors-safelisted-content-type.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-post-with-non-cors-safelisted-content-type.htm
new file mode 100644
index 00000000000..9867c796d68
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-post-with-non-cors-safelisted-content-type.htm
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Non-CORS-safelisted value in the Content-Type header results in a request preflight</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ test(function() {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("POST", get_host_info().HTTP_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-options-not-supported.py", false);
+
+ xhr.setRequestHeader("Content-Type", "application/xml");
+
+ xhr.send();
+
+ assert_equals(xhr.status, 200, "Same-origin access doesn't issue preflight; not denied.");
+ }, "Same-origin request with non-safelisted content type succeeds");
+
+ test(function() {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("POST", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-options-not-supported.py", false);
+
+ xhr.setRequestHeader("Content-Type", "application/xml");
+
+ try {
+ xhr.send();
+ } catch(e) {
+ assert_equals(xhr.status, 0, "Cross-domain access was denied in 'send'.");
+ return;
+ }
+ assert_unreached("Cross-domain access was not denied in 'send'.");
+ }, "CORS request with non-safelisted content type sends preflight and fails");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-preflight-denied.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-preflight-denied.htm
new file mode 100644
index 00000000000..d02bdf0dcde
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-basic-preflight-denied.htm
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests async XHR preflight denial due to lack of CORS headers</title>
+ <!--The original test addressed a more specific issue involving caching,
+ but that issue has since been resolved.
+ We maintain this test as a basic test of invalid preflight denial.
+ Please refer to the comment in the following link for more information:
+ https://chromium-review.googlesource.com/c/chromium/src/+/630338#message-0280542b95c9b0f82b121dc373320c04fcaece31
+ -->
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test((test) => {
+ const xhr = new XMLHttpRequest;
+ xhr.onerror = test.step_func_done(() => {
+ assert_equals(xhr.status, 0);
+ });
+
+ xhr.onload = test.unreached_func("Request succeeded unexpectedly");
+
+ xhr.open("FOO", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-denied.py");
+ xhr.send();
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-header-denied.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-header-denied.htm
new file mode 100644
index 00000000000..84a60eb6f63
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-header-denied.htm
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Async request denied at preflight because of non-CORS-safelisted header</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ const uuid = token();
+ const url = get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-preflight-denied.py?token=" + uuid;
+
+ async_test((test) => {
+ let xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=reset", false);
+ xhr.send();
+
+ xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=header", true);
+ xhr.setRequestHeader("x-test", "foo");
+
+ xhr.onload = test.unreached_func(
+ "Cross-domain access with custom header allowed without throwing exception");
+
+ xhr.onerror = test.step_func_done(() => {
+ xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=complete", false);
+ xhr.send();
+ assert_equals(xhr.responseText, "Request successfully blocked.");
+ });
+
+ xhr.send();
+ }, "Async request denied at preflight");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-method-denied.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-method-denied.htm
new file mode 100644
index 00000000000..eb36110f496
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-method-denied.htm
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Async request denied at preflight because of non-CORS-safelisted method</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ const uuid = token();
+ const url = get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-preflight-denied.py?token=" + uuid;
+
+ async_test((test) => {
+ let xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=reset", false);
+ xhr.send();
+
+ xhr = new XMLHttpRequest;
+ xhr.open("DELETE", url + "&command=method", true);
+
+ xhr.onload = test.unreached_func(
+ "Cross-domain access with non-CORS-safelisted method allowed without throwing exception");
+
+ xhr.onerror = test.step_func_done(() => {
+ xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=complete", false);
+ xhr.send();
+ assert_equals(xhr.responseText, "Request successfully blocked.");
+ });
+
+ xhr.send();
+ }, "Async request denied at preflight");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-not-supported.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-not-supported.htm
new file mode 100644
index 00000000000..e1607d4389a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-async-not-supported.htm
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Async PUT request denied at preflight</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+const uuid = token();
+const url = get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-preflight-denied.py?token=" + uuid;
+
+async_test((test) => {
+ let xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=reset", false);
+ xhr.send();
+
+ xhr = new XMLHttpRequest;
+ xhr.open("PUT", url, true);
+
+ xhr.onload = test.unreached_func("Cross-domain access allowed unexpectedly.");
+
+ xhr.onerror = test.step_func_done(() => {
+ xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=complete", false);
+ xhr.send();
+ assert_equals(xhr.responseText, "Request successfully blocked.");
+ });
+
+ xhr.send();
+});
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-credential-async.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-credential-async.htm
new file mode 100644
index 00000000000..d9ccc102826
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-credential-async.htm
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests proper handling of cross-origin async request with credentials</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test((test) => {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-auth-basic.py?uid=fooUser",
+ true, "fooUser", "barPass");
+ xhr.withCredentials = true;
+
+ xhr.onerror = test.unreached_func("Unexpected error.");
+
+ xhr.onload = test.step_func_done(() => {
+ assert_equals(xhr.status, 401, "Request raises HTTP 401: Unauthorized error.");
+ });
+
+ xhr.send();
+ }, "CORS async request with URL credentials");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-credential-sync.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-credential-sync.htm
new file mode 100644
index 00000000000..d0b99018160
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-credential-sync.htm
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests proper handling of cross-origin sync request with credentials</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ test(() => {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-auth-basic.py?uid=fooUser", false, "fooUser", "barPass");
+
+ xhr.withCredentials = true;
+
+ xhr.send();
+
+ assert_equals(xhr.status, 401, "Request raises HTTP 401: Unauthorized error.");
+ }, "CORS sync request with URL credentials");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-headers-async.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-headers-async.htm
new file mode 100644
index 00000000000..6e05cfe385c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-headers-async.htm
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Test that async CORS requests with custom headers are sent with OPTIONS preflight</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+async_test((test) => {
+ let xhr = new XMLHttpRequest;
+ const uuid = token();
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/reset-token.py?token=" + uuid, false);
+ xhr.send();
+
+ xhr = new XMLHttpRequest;
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/no-custom-header-on-preflight.py?token=" + uuid);
+ xhr.setRequestHeader("x-test", "foobar");
+
+ xhr.onerror = test.unreached_func("Unexpected error");
+
+ xhr.onload = test.step_func_done(() => {
+ assert_equals(xhr.responseText, "PASS");
+ });
+
+ xhr.send();
+}, "Preflighted async request with custom header");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-headers-sync.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-headers-sync.htm
new file mode 100644
index 00000000000..85fe446ceee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-headers-sync.htm
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Test that sync CORS requests with custom headers are not sent with OPTIONS preflight</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ test(function() {
+ let xhr = new XMLHttpRequest;
+ const uuid = token();
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/reset-token.py?token=" + uuid, false);
+ xhr.send();
+
+ xhr = new XMLHttpRequest;
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/no-custom-header-on-preflight.py?token=" + uuid, false);
+ xhr.setRequestHeader("x-test", "foobar");
+ xhr.send();
+ assert_equals(xhr.responseText, "PASS");
+ }, "Preflighted sync request with custom header");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-header-lowercase.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-header-lowercase.htm
new file mode 100644
index 00000000000..d88cac8f967
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-header-lowercase.htm
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Access-Control-Request-Headers values should be lowercase</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test(function(test) {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-preflight-request-header-lowercase.py");
+
+ xhr.setRequestHeader("X-Test", "foobar");
+
+ xhr.onerror = test.unreached_func("Error occurred.");
+
+ xhr.onload = test.step_func_done(function() {
+ assert_equals(xhr.status, 200);
+ assert_equals(xhr.responseText, "PASS");
+ });
+
+ xhr.send();
+ }, "Request with uppercase header set");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-header-sorted.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-header-sorted.htm
new file mode 100644
index 00000000000..2423b80cd8e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-header-sorted.htm
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Tests that Access-Control-Request-Headers are sorted.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+</head>
+<body>
+<script>
+async_test((test) => {
+ const xhr = new XMLHttpRequest();
+ const url = get_host_info().HTTP_REMOTE_ORIGIN + '/XMLHttpRequest/resources/access-control-preflight-request-header-sorted.py';
+ xhr.open('GET', url);
+ xhr.setRequestHeader("X-Custom-Test", "foobar");
+ xhr.setRequestHeader("X-Custom-ua", "foobar");
+ xhr.setRequestHeader("X-Custom-V", "foobar");
+ xhr.setRequestHeader("X-Custom-s", "foobar");
+ xhr.setRequestHeader("X-Custom-U", "foobar");
+ xhr.onerror = test.unreached_func('xhr failure');
+ xhr.onload = test.step_func_done(() => {
+ assert_equals(xhr.responseText, 'PASS');
+ });
+ xhr.send();
+});
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-headers-origin.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-headers-origin.htm
new file mode 100644
index 00000000000..67aeda9eeee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-headers-origin.htm
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Test that 'Origin' is not included in Access-Control-Request-Headers in a preflight request</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+async_test((test) => {
+ const xhr = new XMLHttpRequest;
+ const url = get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-preflight-request-headers-origin.py";
+
+ xhr.open("GET", url);
+ xhr.setRequestHeader("x-pass", "PASS");
+
+ xhr.onerror = test.unreached_func("Unexpected error");
+
+ xhr.onload = test.step_func_done(() => {
+ assert_equals(xhr.responseText, "PASS");
+ });
+
+ xhr.send();
+}, "'Origin' should not be included in CORS Request-Headers");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-301.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-301.htm
new file mode 100644
index 00000000000..669f7db80d2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-301.htm
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that preflight requests returning invalid 301 status code result in error.</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test((test) => {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-preflight-request-invalid-status.py?code=301");
+
+ xhr.setRequestHeader("x-pass", "pass");
+
+ xhr.onerror = test.step_func_done(function() {
+ assert_equals(xhr.status, 0);
+ });
+
+ xhr.onload = test.unreached_func("Invalid 301 response to preflight should result in error.");
+
+ xhr.send();
+ }, "Request with 301 preflight response");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-400.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-400.htm
new file mode 100644
index 00000000000..38520999783
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-400.htm
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that preflight requests returning invalid 400 status code result in error.</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test((test) => {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-preflight-request-invalid-status.py?code=400");
+
+ xhr.setRequestHeader("x-pass", "pass");
+
+ xhr.onerror = test.step_func_done(function() {
+ assert_equals(xhr.status, 0);
+ });
+
+ xhr.onload = test.unreached_func("Invalid 400 response to preflight should result in error.");
+
+ xhr.send();
+ }, "Request with 400 preflight response");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-501.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-501.htm
new file mode 100644
index 00000000000..5f3c5e62c61
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-invalid-status-501.htm
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that preflight requests returning invalid 501 status code result in error.</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test((test) => {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/access-control-preflight-request-invalid-status.py?code=501");
+
+ xhr.setRequestHeader("x-pass", "pass");
+
+ xhr.onerror = test.step_func_done(function() {
+ assert_equals(xhr.status, 0);
+ });
+
+ xhr.onload = test.unreached_func("Invalid 501 response to preflight should result in error.");
+
+ xhr.send();
+ }, "Request with 501 preflight response");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-must-not-contain-cookie.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-must-not-contain-cookie.htm
new file mode 100644
index 00000000000..c7cb5cde42a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-request-must-not-contain-cookie.htm
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Preflight request must not contain any cookie header</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test((test) => {
+ function setupCookie() {
+ const xhr = new XMLHttpRequest;
+ // Delete all preexisting cookies and set a cookie named "foo"
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-cookie.py?cookie_name=foo");
+ xhr.withCredentials = true;
+ xhr.send();
+ xhr.onerror = test.unreached_func("Unexpected error.");
+ xhr.onload = test.step_func(() => {
+ assert_equals(xhr.status, 200);
+ sendPreflightedRequest();
+ });
+ }
+
+ function sendPreflightedRequest() {
+ const xhr = new XMLHttpRequest;
+ // Request to server-side file fails if cookie is included in preflight
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-preflight-request-must-not-contain-cookie.py");
+ xhr.withCredentials = true;
+ xhr.setRequestHeader("X-Proprietary-Header", "foo");
+ xhr.onerror = test.unreached_func("Unexpected error.");
+ xhr.onload = test.step_func(() => {
+ assert_equals(xhr.status, 200);
+ assert_equals(xhr.responseText, "COOKIE");
+ cleanupCookies();
+ });
+ xhr.send();
+ }
+
+ function cleanupCookies() {
+ const xhr = new XMLHttpRequest;
+ // Delete all cookies
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-cookie.py");
+ xhr.withCredentials = true;
+ xhr.send();
+ xhr.onerror = test.unreached_func("Unexpected error.");
+ xhr.onload = test.step_func_done(() => {});
+ }
+
+ setupCookie();
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-header-denied.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-header-denied.htm
new file mode 100644
index 00000000000..422c625e99c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-header-denied.htm
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Sync request denied at preflight because of non-CORS-safelisted header</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+const uuid = token();
+const url = get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-preflight-denied.py?token=" + uuid;
+
+test(() => {
+ let xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=reset", false);
+ xhr.send();
+
+ xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=header", false);
+ xhr.setRequestHeader("x-test", "foo");
+
+ try {
+ xhr.send();
+ } catch(e) {
+ xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=complete", false);
+ xhr.send();
+ assert_equals(xhr.responseText, "Request successfully blocked.");
+ return;
+ }
+
+ assert_unreached("Cross-domain access with custom header allowed without throwing exception");
+}, "Sync request denied at preflight");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-method-denied.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-method-denied.htm
new file mode 100644
index 00000000000..cd2999a82a5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-method-denied.htm
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Sync request denied at preflight because of non-CORS-safelisted method</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+const uuid = token();
+const url = get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-preflight-denied.py?token=" + uuid;
+
+test(() => {
+ let xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=reset", false);
+ xhr.send();
+
+ xhr = new XMLHttpRequest;
+ xhr.open("DELETE", url + "&command=method", false);
+
+ try {
+ xhr.send();
+ } catch(e) {
+ xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=complete", false);
+ xhr.send();
+ assert_equals(xhr.responseText, "Request successfully blocked.");
+ return;
+ }
+
+ assert_unreached("Cross-domain access with non-CORS-safelisted method allowed without throwing exception");
+});
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-not-supported.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-not-supported.htm
new file mode 100644
index 00000000000..a0b079e0789
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-preflight-sync-not-supported.htm
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Sync PUT request denied at preflight</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/common/utils.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+const uuid = token();
+const url = get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-preflight-denied.py?token=" + uuid;
+
+test(() => {
+ let xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=reset", false);
+ xhr.send();
+
+ xhr = new XMLHttpRequest;
+ xhr.open("PUT", url, false);
+
+ try {
+ xhr.send("");
+ } catch(e) {
+ xhr = new XMLHttpRequest;
+ xhr.open("GET", url + "&command=complete", false);
+ xhr.send();
+ assert_equals(xhr.responseText, "Request successfully blocked.");
+ return;
+ }
+
+ assert_unreached("Cross-domain access allowed without throwing exception");
+});
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-recursive-failed-request.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-recursive-failed-request.htm
new file mode 100644
index 00000000000..e29a34a6d03
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-recursive-failed-request.htm
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Recursively repeated CORS requests with failed preflights should never result in unexpected behavior</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+let requestCount = 0;
+const requestMax = 10;
+
+async_test((test) => {
+ function preflightRequest() {
+ const xhr = new XMLHttpRequest;
+
+ xhr.onload = test.unreached_func("Request succeeded unexpectedly.");
+
+ xhr.onerror = test.step_func(() => {
+ assert_equals(xhr.status, 0);
+ if (++requestCount >= requestMax) {
+ test.done();
+ return;
+ }
+ preflightRequest();
+ });
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-basic-denied.py");
+ xhr.send();
+ }
+
+ preflightRequest();
+});
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-body-sync.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-body-sync.htm
new file mode 100644
index 00000000000..559b7d21ad3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-body-sync.htm
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests body from CORS preflight response and actual response with sync request</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+test(() => {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN+
+ "/XMLHttpRequest/resources/access-control-allow-with-body.py", false);
+ xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ xhr.send();
+
+ assert_equals(xhr.status, 200);
+ assert_equals(xhr.responseText, "PASS");
+});
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-body.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-body.htm
new file mode 100644
index 00000000000..ab89cefd76e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-body.htm
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that XHR doesn't prepend the body from CORS preflight response to the actual response</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+async_test((test) => {
+ const xhr = new XMLHttpRequest;
+
+ xhr.onerror = test.unreached_func("Unexpected error.");
+
+ xhr.onload = test.step_func_done(() => {
+ assert_equals(xhr.status, 200);
+ assert_equals(xhr.responseText, "PASS");
+ });
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/access-control-allow-with-body.py");
+ xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
+ xhr.send();
+});
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-exposed-headers.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-exposed-headers.htm
new file mode 100644
index 00000000000..23cd0fbb1c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-response-with-exposed-headers.htm
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Test CORS response with 'Access-Control-Expose-Headers' header</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+async_test((test) => {
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN +
+ "/XMLHttpRequest/resources/pass.txt?pipe=" +
+ "header(Cache-Control,no-cache)|" +
+ "header(Access-Control-Max-Age,0)|" +
+ "header(Access-Control-Allow-Origin,*)|" +
+ "header(X-foo,BAR)|" +
+ "header(x-test,TEST)|" +
+ "header(Access-Control-Expose-Headers,x-Foo)|",
+ "header(Content-Type,text/html)");
+
+ xhr.onerror = test.unreached_func("Unexpected error");
+
+ xhr.onload = test.step_func_done(() => {
+ assert_equals(xhr.status, 200);
+ assert_equals(xhr.getResponseHeader("X-FOO"), "BAR");
+ assert_equals(xhr.getResponseHeader("x-foo"), "BAR");
+ assert_equals(xhr.getResponseHeader("x-test"), null);
+ assert_equals(xhr.responseText, "PASS\n");
+ });
+
+ xhr.send();
+});
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-allow-origin-null.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-allow-origin-null.htm
new file mode 100644
index 00000000000..5c647dfa270
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-allow-origin-null.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that sandboxed iframe has CORS XHR access to a server that accepts null domain</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+async_test((test) => {
+ window.addEventListener("message", test.step_func((evt) => {
+ if (evt.data === "ready") {
+ document.getElementById("frame").contentWindow.postMessage(
+ get_host_info().HTTP_ORIGIN +
+ "/XMLHttpRequest/resources/pass.txt?pipe=" +
+ "header(Cache-Control,no-store)|" +
+ "header(Content-Type,text/plain)|" +
+ "header(Access-Control-Allow-Credentials,true)|" +
+ "header(Access-Control-Allow-External,true)|" +
+ "header(Access-Control-Allow-Origin,null)", "*");
+ } else {
+ assert_equals(evt.data.trim(), "PASS");
+ test.done();
+ }
+ }), false);
+});
+ </script>
+ <iframe id="frame" sandbox="allow-scripts" src="/XMLHttpRequest/resources/access-control-sandboxed-iframe.html">
+ </iframe>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-allow.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-allow.htm
new file mode 100644
index 00000000000..21413f38663
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-allow.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that sandboxed iframe has CORS XHR access to a server that accepts all domains</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+async_test((test) => {
+ window.addEventListener("message", test.step_func((evt) => {
+ if (evt.data === "ready") {
+ document.getElementById("frame").contentWindow.postMessage(
+ get_host_info().HTTP_ORIGIN +
+ "/XMLHttpRequest/resources/pass.txt?pipe=" +
+ "header(Cache-Control,no-store)|" +
+ "header(Content-Type,text/plain)|" +
+ "header(Access-Control-Allow-Credentials,true)|" +
+ "header(Access-Control-Allow-External,true)|" +
+ "header(Access-Control-Allow-Origin,*)", "*");
+ } else {
+ assert_equals(evt.data.trim(), "PASS");
+ test.done();
+ }
+ }), false);
+});
+ </script>
+ <iframe id="frame" sandbox="allow-scripts" src="/XMLHttpRequest/resources/access-control-sandboxed-iframe.html">
+ </iframe>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm
new file mode 100644
index 00000000000..7c375f60668
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-denied-without-wildcard.htm
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that sandboxed iframe does not have CORS XHR access to server with "Access-Control-Allow-Origin" set to the original origin</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+const path = "/XMLHttpRequest/resources/pass.txt?pipe=" +
+ "header(Cache-Control,no-store)|" +
+ "header(Content-Type,text/plain)" +
+ "header(Access-Control-Allow-Credentials,true)|" +
+ "header(Access-Control-Allow-Origin," + get_host_info().HTTP_ORIGIN + ")";
+
+async_test((test) => {
+ const xhr = new XMLHttpRequest;
+ xhr.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + path);
+ xhr.send();
+ xhr.onerror = test.unreached_func("Unexpected error");
+ xhr.onload = test.step_func_done(() => {
+ assert_equals(xhr.status, 200);
+ assert_equals(xhr.responseText.trim(), "PASS");
+ });
+}, "Check that path exists and is accessible via CORS XHR request");
+
+async_test((test) => {
+ window.addEventListener("message", test.step_func((evt) => {
+ if (evt.data === "ready") {
+ document.getElementById("frame").contentWindow.postMessage(
+ get_host_info().HTTP_REMOTE_ORIGIN + path, "*");
+ } else {
+ assert_equals(evt.data, "Exception thrown. Sandboxed iframe XHR access was denied in 'send'.");
+ test.done();
+ }
+ }), false);
+}, "Sandboxed iframe is denied CORS access to server that allows parent origin");
+ </script>
+ <iframe id="frame" sandbox="allow-scripts" src="/XMLHttpRequest/resources/access-control-sandboxed-iframe.html">
+ </iframe>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-denied.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-denied.htm
new file mode 100644
index 00000000000..a87dd7d1f25
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/access-control-sandboxed-iframe-denied.htm
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Tests that sandboxed iframe does not have CORS XHR access to its server</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+const path = "/XMLHttpRequest/resources/pass.txt?pipe=" +
+ "header(Cache-Control,no-store)|" +
+ "header(Content-Type,text/plain)";
+
+async_test((test) => {
+ const xhr = new XMLHttpRequest;
+ xhr.open("GET", get_host_info().HTTP_ORIGIN + path);
+ xhr.send();
+ xhr.onerror = test.unreached_func("Unexpected error");
+ xhr.onload = test.step_func_done(() => {
+ assert_equals(xhr.status, 200);
+ assert_equals(xhr.responseText.trim(), "PASS");
+ });
+}, "Check that path exists and is accessible via local XHR request");
+
+async_test((test) => {
+ window.addEventListener("message", test.step_func((evt) => {
+ if (evt.data === "ready") {
+ document.getElementById("frame").contentWindow.postMessage(
+ get_host_info().HTTP_ORIGIN + path, "*");
+ } else {
+ assert_equals(evt.data, "Exception thrown. Sandboxed iframe XHR access was denied in 'send'.");
+ test.done();
+ }
+ }), false);
+}, "Sandboxed iframe is denied access to path");
+ </script>
+ <iframe id="frame" sandbox="allow-scripts" src="/XMLHttpRequest/resources/access-control-sandboxed-iframe.html">
+ </iframe>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/allow-lists-starting-with-comma.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/allow-lists-starting-with-comma.htm
new file mode 100644
index 00000000000..4a4e5e2218c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/allow-lists-starting-with-comma.htm
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Allow lists starting with a comma should be parsed correctly</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/common/get-host-info.sub.js"></script>
+ </head>
+ <body>
+ <script type="text/javascript">
+ async_test(function(test) {
+ const client = new XMLHttpRequest();
+ let url = "XMLHttpRequest/resources/access-control-allow-lists.py?headers=,y-lol,x-print,%20,,,y-print&origin=" +
+ get_host_info().HTTP_ORIGIN;
+ client.open("GET", get_host_info().HTTP_REMOTE_ORIGIN + '/' + url, false);
+ client.setRequestHeader('x-print', 'unicorn')
+ client.setRequestHeader('y-print', 'narwhal')
+ // Sending GET request with custom headers
+ assert_equals(client.send(null), undefined);
+ const response = JSON.parse(client.response);
+ assert_equals(response['x-print'], "unicorn");
+ assert_equals(response['y-print'], "narwhal");
+
+ url = "XMLHttpRequest/resources/access-control-allow-lists.py?methods=,,PUT,GET&origin=" +
+ get_host_info().HTTP_ORIGIN;
+ client.open("PUT", get_host_info().HTTP_REMOTE_ORIGIN + '/' + url, false);
+ // Sending PUT request
+ assert_equals(client.send(null), undefined);
+ test.done();
+ }, "Allow lists starting with a comma should be parsed correctly");
+ </script>
+ </body>
+ </html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/data-uri.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/data-uri.htm
index 5123789852a..88a7d78fc59 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/data-uri.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/data-uri.htm
@@ -10,13 +10,13 @@
if (typeof mimeType === 'undefined' || mimeType === null) mimeType = 'text/plain';
var test = async_test("XHR method " + method + " with MIME type " + mimeType + (testNamePostfix||''));
test.step(function() {
- var client = new XMLHttpRequest();
+ var client = new XMLHttpRequest(),
+ body = method === "HEAD" ? "" : "Hello, World!";
client.onreadystatechange = test.step_func(function () {
if (client.readyState !== 4) {
return;
}
-
- assert_equals(client.responseText, "Hello, World!");
+ assert_equals(client.responseText, body);
assert_equals(client.status, 200);
assert_equals(client.getResponseHeader('Content-Type'), mimeType);
var allHeaders = client.getAllResponseHeaders();
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.htm
index 4ca9f7cfc67..293f7bf2b9c 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/event-upload-progress-crossorigin.htm
@@ -4,23 +4,30 @@
<title>XMLHttpRequest: upload progress event for cross-origin requests</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
- <link rel="help" href="https://xhr.spec.whatwg.org/#handler-xhr-onprogress" data-tested-assertations="../.." />
- <link rel="help" href="https://xhr.spec.whatwg.org/#the-send()-method" data-tested-assertations="following::*//a[contains(@href,'#make-upload-progress-notifications')] following::ol[1]/li[8]" />
- <link rel="help" href="https://xhr.spec.whatwg.org/#dom-xmlhttprequest-upload" data-tested-assertations=".." />
-
-<div id="log"></div>
<script src="/common/get-host-info.sub.js"></script>
+<div id="log"></div>
<script>
- var test = async_test();
- test.step(function() {
- var client = new XMLHttpRequest();
- client.upload.onprogress = test.step_func(function() {
- test.done();
- });
- client.onload = test.step_func(function() {
- assert_unreached("onprogress not called.");
- });
- client.open("POST", get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/corsenabled.py");
- client.send("This is a test string.");
- });
+const remote = get_host_info().HTTP_REMOTE_ORIGIN + "/XMLHttpRequest/resources/corsenabled.py",
+ redirect = "resources/redirect.py?code=307&location=" + remote;
+
+[remote, redirect].forEach(url => {
+ async_test(test => {
+ const client = new XMLHttpRequest();
+ client.upload.onprogress = test.step_func_done()
+ client.onload = test.unreached_func()
+ client.open("POST", url)
+ client.send("On time: " + url)
+ }, "Upload events registered on time (" + url + ")");
+});
+
+[remote, redirect].forEach(url => {
+ async_test(test => {
+ const client = new XMLHttpRequest();
+ client.onload = test.step_func_done();
+ client.open("POST", url);
+ client.send("Too late: " + url);
+ client.upload.onloadstart = test.unreached_func(); // registered too late
+ client.upload.onprogress = test.unreached_func(); // registered too late
+ }, "Upload events registered too late (" + url + ")");
+});
</script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/open-url-worker-origin.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/open-url-worker-origin.htm
index 9f7c5c20da8..722a15bb653 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/open-url-worker-origin.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/open-url-worker-origin.htm
@@ -12,8 +12,8 @@
<script type="text/javascript">
var test = async_test() // This "test" does not actually do any assertations. It's just there to have multiple, separate, asyncronous sub-tests.
var expectations = {
- 'Referer header': 'referer: '+(location.href.replace(/[^/]*$/, ''))+"resources/workerxhr-origin-referrer.js\n",
- 'Origin header': 'origin: '+location.protocol+'//'+location.hostname+((location.port === "")?"":":"+location.port)+'\n',
+ 'Referer header': 'Referer: '+(location.href.replace(/[^/]*$/, ''))+"resources/workerxhr-origin-referrer.js\n",
+ 'Origin header': 'Origin: '+location.protocol+'//'+location.hostname+((location.port === "")?"":":"+location.port)+'\n',
'Request URL test' : (location.href.replace(/[^/]*$/, ''))+'resources/requri.py?full'
}
// now start the worker
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/overridemimetype-blob.html b/tests/wpt/web-platform-tests/XMLHttpRequest/overridemimetype-blob.html
index 4094480f9e8..83378a89bd7 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/overridemimetype-blob.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/overridemimetype-blob.html
@@ -59,7 +59,7 @@ async_test(t => {
})
client.open("GET", "resources/status.py")
client.responseType = "blob"
- client.overrideMimeType("HI/x;test")
+ client.overrideMimeType("HI/x;test=test")
client.send()
}, "Valid MIME types need to be normalized")
</script>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-allow-lists.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-allow-lists.py
new file mode 100644
index 00000000000..526d365b311
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-allow-lists.py
@@ -0,0 +1,20 @@
+import json
+
+def main(request, response):
+ if "origin" in request.GET:
+ response.headers.set("Access-Control-Allow-Origin", request.GET["origin"])
+ elif "origins" in request.GET:
+ for origin in request.GET["origins"].split(','):
+ response.headers.set("Access-Control-Allow-Origin", request.GET["origin"])
+
+ if "headers" in request.GET:
+ response.headers.set("Access-Control-Allow-Headers", request.GET["headers"])
+ if "methods" in request.GET:
+ response.headers.set("Access-Control-Allow-Methods", request.GET["methods"])
+
+ headers = dict(request.headers)
+
+ for header in headers:
+ headers[header] = headers[header][0]
+
+ return json.dumps(headers)
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-allow-with-body.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-allow-with-body.py
new file mode 100644
index 00000000000..22134356735
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-allow-with-body.py
@@ -0,0 +1,15 @@
+def main(request, response):
+ headers = {
+ "Cache-Control": "no-store",
+ "Access-Control-Allow-Headers": "X-Requested-With",
+ "Access-Control-Max-Age": 0,
+ "Access-Control-Allow-Origin": "*",
+ "Access-Control-Allow-Methods": "*",
+ "Vary": "Accept-Encoding",
+ "Content-Type": "text/plain"
+ }
+
+ for (name, value) in headers.items():
+ response.headers.set(name, value)
+
+ response.content = "PASS"
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-auth-basic.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-auth-basic.py
new file mode 100644
index 00000000000..af32aab97cd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-auth-basic.py
@@ -0,0 +1,17 @@
+def main(request, response):
+ response.headers.set("Cache-Control", "no-store")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+ uid = request.GET.first("uid", None)
+
+ if request.method == "OPTIONS":
+ response.headers.set("Access-Control-Allow-Methods", "PUT")
+ else:
+ username = request.auth.username
+ password = request.auth.password
+ if (not username) or (username != uid):
+ response.headers.set("WWW-Authenticate", "Basic realm='Test Realm/Cross Origin'")
+ response.status = 401
+ response.content = "Authentication cancelled"
+ else:
+ response.content = "User: " + username + ", Password: " + password
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow-no-credentials.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow-no-credentials.py
new file mode 100755
index 00000000000..12f8660d1fc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow-no-credentials.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+def main(request, response):
+ response.headers.set("Content-Type", "text/plain")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+
+ response.content = "PASS: Cross-domain access allowed."
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow-star.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow-star.py
new file mode 100755
index 00000000000..4557c06b0e3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow-star.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+def main(request, response):
+ response.headers.set("Content-Type", "text/plain")
+ response.headers.set("Access-Control-Allow-Origin", "*")
+
+ response.content = "PASS: Cross-domain access allowed."
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow.py
new file mode 100755
index 00000000000..2325925157c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-allow.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python
+def main(request, response):
+ response.headers.set("Content-Type", "text/plain")
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+
+ response.content = "PASS: Cross-domain access allowed."
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-cors-safelisted-request-headers.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-cors-safelisted-request-headers.py
new file mode 100644
index 00000000000..eba0e7d4c5c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-cors-safelisted-request-headers.py
@@ -0,0 +1,14 @@
+def main(request, response):
+ response.headers.set("Cache-Control", "no-store")
+
+ # This should be a simple request; deny preflight
+ if request.method != "POST":
+ response.status = 400
+ return
+
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+
+ for header in ["Accept", "Accept-Language", "Content-Language", "Content-Type"]:
+ value = request.headers.get(header)
+ response.content += header + ": " + (value if value else "<None>") + '\n'
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-denied.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-denied.py
new file mode 100644
index 00000000000..9f868785459
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-denied.py
@@ -0,0 +1,5 @@
+def main(request, response):
+ response.headers.set("Cache-Control", "no-store")
+ response.headers.set("Content-Type", "text/plain")
+
+ response.text = "FAIL: Cross-domain access allowed."
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-options-not-supported.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-options-not-supported.py
new file mode 100644
index 00000000000..0c69c76293e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-options-not-supported.py
@@ -0,0 +1,9 @@
+def main(request, response):
+ response.headers.set("Cache-Control", "no-store")
+
+ # Allow simple requests, but deny preflight
+ if request.method != "OPTIONS":
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+ else:
+ response.status = 400
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache-invalidation.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache-invalidation.py
new file mode 100644
index 00000000000..6dc8a2a1507
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache-invalidation.py
@@ -0,0 +1,47 @@
+def main(request, response):
+ def fail(message):
+ response.content = "FAIL " + request.method + ": " + str(message)
+
+ def getState(token):
+ server_state = request.server.stash.take(token)
+ if not server_state:
+ return "Uninitialized"
+ return server_state
+
+ def setState(state, token):
+ request.server.stash.put(token, state)
+
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+ token = request.GET.first("token", None)
+ state = getState(token)
+
+ if state == "Uninitialized":
+ if request.method == "OPTIONS":
+ response.headers.set("Access-Control-Allow-Methods", "PUT")
+ response.headers.set("Access-Control-Max-Age", 10)
+ setState("OPTIONSSent", token)
+ else:
+ fail(state)
+ elif state == "OPTIONSSent":
+ if request.method == "PUT":
+ response.content = "PASS: First PUT request."
+ setState("FirstPUTSent", token)
+ else:
+ fail(state)
+ elif state == "FirstPUTSent":
+ if request.method == "OPTIONS":
+ response.headers.set("Access-Control-Allow-Methods", "PUT, XMETHOD")
+ response.headers.set("Access-Control-Allow-Headers", "x-test")
+ setState("SecondOPTIONSSent", token)
+ elif request.method == "PUT":
+ fail("Second PUT request sent without preflight")
+ else:
+ fail(state)
+ elif state == "SecondOPTIONSSent":
+ if request.method == "PUT" or request.method == "XMETHOD":
+ response.content = "PASS: Second OPTIONS request was sent."
+ else:
+ fail(state)
+ else:
+ fail(state)
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache-timeout.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache-timeout.py
new file mode 100644
index 00000000000..a767d8a4a56
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache-timeout.py
@@ -0,0 +1,48 @@
+def main(request, response):
+ def fail(message):
+ response.content = "FAIL " + request.method + ": " + str(message)
+
+ def getState(token):
+ server_state = request.server.stash.take(token)
+ if not server_state:
+ return "Uninitialized"
+ return server_state
+
+ def setState(state, token):
+ request.server.stash.put(token, state)
+
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+ token = request.GET.first("token", None)
+ state = getState(token)
+
+ if state == "Uninitialized":
+ if request.method == "OPTIONS":
+ response.headers.set("Access-Control-Allow-Methods", "PUT")
+ response.headers.set("Access-Control-Allow-Headers", "x-test")
+ response.headers.set("Access-Control-Max-Age", 1)
+ setState("OPTIONSSent", token)
+ else:
+ fail(state)
+ elif state == "OPTIONSSent":
+ if request.method == "PUT":
+ response.content = "PASS: First PUT request."
+ setState("FirstPUTSent", token)
+ else:
+ fail(state)
+ elif state == "FirstPUTSent":
+ if request.method == "OPTIONS":
+ response.headers.set("Access-Control-Allow-Methods", "PUT")
+ response.headers.set("Access-Control-Allow-Headers", "x-test")
+ setState("SecondOPTIONSSent", token)
+ elif request.method == "PUT":
+ fail("Second PUT request sent without preflight")
+ else:
+ fail(state)
+ elif state == "SecondOPTIONSSent":
+ if request.method == "PUT":
+ response.content = "PASS: Second OPTIONS request was sent."
+ else:
+ fail(state)
+ else:
+ fail(state)
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache.py
new file mode 100644
index 00000000000..56892fb6b12
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-preflight-cache.py
@@ -0,0 +1,47 @@
+def main(request, response):
+ def fail(message):
+ response.content = "FAIL " + request.method + ": " + str(message)
+ response.status = 400
+
+ def getState(token):
+ server_state = request.server.stash.take(token)
+ if not server_state:
+ return "Uninitialized"
+ return server_state
+
+ def setState(state, token):
+ request.server.stash.put(token, state)
+
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+ token = request.GET.first("token", None)
+ state = getState(token)
+
+ if state == "Uninitialized":
+ if request.method == "OPTIONS":
+ response.headers.set("Access-Control-Allow-Methods", "PUT")
+ response.headers.set("Access-Control-Max-Age", 10)
+ setState("OPTIONSSent", token)
+ else:
+ fail(state)
+ elif state == "OPTIONSSent":
+ if request.method == "PUT":
+ response.content = "PASS: First PUT request."
+ setState("FirstPUTSent", token)
+ else:
+ fail(state)
+ elif state == "FirstPUTSent":
+ if request.method == "PUT":
+ response.content = "PASS: Second PUT request. Preflight worked."
+ elif request.method == "OPTIONS":
+ response.headers.set("Access-Control-Allow-Methods", "PUT")
+ setState("FAILSecondOPTIONSSent", token)
+ else:
+ fail(state)
+ elif state == "FAILSecondOPTIONSSent":
+ if request.method == "PUT":
+ fail("Second OPTIONS request was sent. Preflight failed.")
+ else:
+ fail(state)
+ else:
+ fail(state)
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-put-allow.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-put-allow.py
new file mode 100644
index 00000000000..65f6466f597
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-put-allow.py
@@ -0,0 +1,20 @@
+def main(request, response):
+ if request.method == "OPTIONS":
+ response.headers.set("Content-Type", "text/plain")
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+ response.headers.set("Access-Control-Allow-Methods", "PUT")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+
+ elif request.method == "PUT":
+ response.headers.set("Content-Type", "text/plain")
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+ response.content = "PASS: Cross-domain access allowed."
+ try:
+ response.content += "\n" + request.body
+ except:
+ response.content += "Could not read in content."
+
+ else:
+ response.headers.set("Content-Type", "text/plain")
+ response.content = "Wrong method: " + request.method
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-whitelist-response-headers.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-whitelist-response-headers.py
new file mode 100644
index 00000000000..e7c15bb8b30
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-basic-whitelist-response-headers.py
@@ -0,0 +1,19 @@
+def main(request, response):
+ headers = {
+ # CORS-safelisted
+ "content-type": "text/plain",
+ "cache-control": "no cache",
+ "content-language": "en",
+ "expires": "Fri, 30 Oct 1998 14:19:41 GMT",
+ "last-modified": "Tue, 15 Nov 1994 12:45:26 GMT",
+ "pragma": "no-cache",
+
+ # Non-CORS-safelisted
+ "x-test": "foobar",
+
+ "Access-Control-Allow-Origin": "*"
+ }
+ for header in headers:
+ response.headers.set(header, headers[header])
+
+ response.content = "PASS: Cross-domain access allowed."
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-cookie.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-cookie.py
new file mode 100644
index 00000000000..1e0d41d22ea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-cookie.py
@@ -0,0 +1,16 @@
+import datetime
+
+def main(request, response):
+ cookie_name = request.GET.first("cookie_name", "")
+
+ response.headers.set("Cache-Control", "no-store")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+
+ for cookie in request.cookies:
+ # Set cookie to expire yesterday
+ response.set_cookie(cookie, "deleted", expires=-datetime.timedelta(days=1))
+
+ if cookie_name:
+ # Set cookie to expire tomorrow
+ response.set_cookie(cookie_name, "COOKIE", expires=datetime.timedelta(days=1))
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-origin-header.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-origin-header.py
new file mode 100755
index 00000000000..e7b95e95fd4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-origin-header.py
@@ -0,0 +1,9 @@
+#!/usr/bin/env python
+def main(request, response):
+ response.headers.set("Content-Type", "text/plain");
+ response.headers.set("Cache-Control", "no-cache, no-store");
+ response.headers.set("Access-Control-Allow-External", "true");
+ response.headers.set("Access-Control-Allow-Origin", "*");
+
+ response.content = "PASS: Cross-domain access allowed.\n"
+ response.content += "HTTP_ORIGIN: " + request.headers.get("origin");
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-denied.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-denied.py
new file mode 100644
index 00000000000..fd221a6248b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-denied.py
@@ -0,0 +1,50 @@
+def main(request, response):
+ def fail(message):
+ response.content = "FAIL: " + str(message)
+ response.status = 400
+
+ def getState(token):
+ server_state = request.server.stash.take(token)
+ if not server_state:
+ return "Uninitialized"
+ return server_state
+
+ def setState(token, state):
+ request.server.stash.put(token, state)
+
+ def resetState(token):
+ setState(token, "")
+
+ response.headers.set("Cache-Control", "no-store")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+ response.headers.set("Access-Control-Max-Age", 1)
+ token = request.GET.first("token", None)
+ state = getState(token)
+ command = request.GET.first("command", None)
+
+ if command == "reset":
+ if request.method == "GET":
+ resetState(token)
+ response.content = "Server state reset"
+ else:
+ fail("Invalid Method.")
+ elif state == "Uninitialized":
+ if request.method == "OPTIONS":
+ response.content = "This request should not be displayed."
+ setState(token, "Denied")
+ else:
+ fail(state)
+ elif state == "Denied":
+ if request.method == "GET" and command == "complete":
+ resetState(token)
+ response.content = "Request successfully blocked."
+ else:
+ setState("Deny Ignored")
+ fail("The request was not denied.")
+ elif state == "Deny Ignored":
+ resetState(token)
+ fail(state)
+ else:
+ resetState(token)
+ fail("Unknown Error.")
+
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-header-lowercase.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-header-lowercase.py
new file mode 100644
index 00000000000..d35b89b9f98
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-header-lowercase.py
@@ -0,0 +1,16 @@
+def main(request, response):
+ response.headers.set("Cache-Control", "no-store")
+ response.headers.set("Access-Control-Allow-Origin", "*")
+ response.headers.set("Access-Control-Max-Age", 0)
+
+ if request.method == "OPTIONS":
+ if "x-test" in [header.strip(" ") for header in
+ request.headers.get("Access-Control-Request-Headers").split(",")]:
+ response.headers.set("Access-Control-Allow-Headers", "X-Test")
+ else:
+ response.status = 400
+ elif request.method == "GET":
+ if request.headers.get("X-Test"):
+ response.content = "PASS"
+ else:
+ response.status = 400
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-header-sorted.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-header-sorted.py
new file mode 100644
index 00000000000..e40da43fe3d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-header-sorted.py
@@ -0,0 +1,18 @@
+def main(request, response):
+ response.headers.set('Cache-Control', 'no-store')
+ response.headers.set('Access-Control-Allow-Origin',
+ request.headers.get('origin'))
+
+ headers = 'x-custom-s,x-custom-test,x-custom-u,x-custom-ua,x-custom-v'
+ if request.method == 'OPTIONS':
+ response.headers.set('Access-Control-Max-Age', '0')
+ response.headers.set('Access-Control-Allow-Headers', headers)
+ # Access-Control-Request-Headers should be sorted.
+ if headers != request.headers.get('Access-Control-Request-Headers'):
+ response.status = 400
+ else:
+ if request.headers.get('x-custom-s'):
+ response.content = 'PASS'
+ else:
+ response.status = 400
+ response.content = 'FAIL'
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-headers-origin.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-headers-origin.py
new file mode 100644
index 00000000000..6fbb96e557b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-headers-origin.py
@@ -0,0 +1,12 @@
+def main(request, response):
+ response.headers.set("Cache-Control", "no-store")
+ response.headers.set("Access-Control-Allow-Origin", "*")
+
+ if request.method == "OPTIONS":
+ if "origin" in request.headers.get("Access-Control-Request-Headers").lower():
+ response.status = 400
+ response.content = "Error: 'origin' included in Access-Control-Request-Headers"
+ else:
+ response.headers.set("Access-Control-Allow-Headers", "x-pass")
+ else:
+ response.content = request.headers.get("x-pass")
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-invalid-status.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-invalid-status.py
new file mode 100644
index 00000000000..e613229eed7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-invalid-status.py
@@ -0,0 +1,16 @@
+def main(request, response):
+ try:
+ code = int(request.GET.first("code", None))
+ except:
+ code = None
+
+ if request.method == "OPTIONS":
+ if code:
+ response.status = code
+ response.headers.set("Access-Control-Max-Age", 1)
+ response.headers.set("Access-Control-Allow-Headers", "x-pass")
+ else:
+ response.status = 200
+
+ response.headers.set("Cache-Control", "no-store")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-must-not-contain-cookie.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-must-not-contain-cookie.py
new file mode 100644
index 00000000000..eb49bf562d1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-preflight-request-must-not-contain-cookie.py
@@ -0,0 +1,12 @@
+def main(request, response):
+ if request.method == "OPTIONS" and request.cookies.get("foo"):
+ response.status = 400
+ else:
+ response.headers.set("Cache-Control", "no-store")
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+ response.headers.set("Access-Control-Allow-Credentials", "true")
+ response.headers.set("Access-Control-Allow-Headers", "X-Proprietary-Header")
+ response.headers.set("Connection", "close")
+
+ if request.cookies.get("foo"):
+ response.content = request.cookies["foo"].value
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-sandboxed-iframe.html b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-sandboxed-iframe.html
new file mode 100644
index 00000000000..7e47275b6ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/access-control-sandboxed-iframe.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+ <body>
+ <script type="text/javascript">
+window.addEventListener("message", (evt) => {
+ const url = evt.data;
+ const xhr = new XMLHttpRequest;
+
+ xhr.open("GET", url, false);
+
+ try {
+ xhr.send();
+ } catch(e) {
+ parent.postMessage("Exception thrown. Sandboxed iframe XHR access was denied in 'send'.", "*");
+ return;
+ }
+
+ parent.postMessage(xhr.responseText, "*");
+}, false);
+
+parent.postMessage("ready", "*");
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/inspect-headers.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/inspect-headers.py
index c87828bac53..a8f1258fa25 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/inspect-headers.py
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/inspect-headers.py
@@ -5,10 +5,12 @@ def get_response(raw_headers, filter_value, filter_name):
return "Syntax error: missing CRLF: " + line
line = line[:-2]
- if ': ' not in line:
- return "Syntax error: no colon and space: " + line
+ if ':' not in line:
+ return "Syntax error: no colon found: " + line
+ name, value = line.split(':', 1)
+ if len(value) > 1 and value[0] == ' ':
+ value = value[1:]
- name, value = line.split(': ', 1)
if filter_value:
if value == filter_value:
result += name + ","
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/no-custom-header-on-preflight.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/no-custom-header-on-preflight.py
new file mode 100644
index 00000000000..f49f9f311fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/no-custom-header-on-preflight.py
@@ -0,0 +1,27 @@
+def main(request, response):
+ def getState(token):
+ server_state = request.server.stash.take(token)
+ if not server_state:
+ return "Uninitialized"
+ return server_state
+
+ def setState(state, token):
+ request.server.stash.put(token, state)
+
+ response.headers.set("Access-Control-Allow-Origin", "*")
+ response.headers.set("Access-Control-Allow-Headers", "x-test")
+ response.headers.set("Access-Control-Max-Age", 0)
+ token = request.GET.first("token", None)
+
+ if request.method == "OPTIONS":
+ if request.headers.get("x-test"):
+ response.content = "FAIL: Invalid header in preflight request."
+ response.status = 400
+ else:
+ setState("PASS", token)
+ else:
+ if request.headers.get("x-test"):
+ response.content = getState(token)
+ else:
+ response.content = "FAIL: X-Test header missing in request"
+ response.status = 400
diff --git a/tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/mmY/index.html b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/pass.txt
index 7ef22e9a431..7ef22e9a431 100644
--- a/tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/mmY/index.html
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/pass.txt
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/redirect-cors.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/redirect-cors.py
new file mode 100644
index 00000000000..27609b8bdb2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/redirect-cors.py
@@ -0,0 +1,20 @@
+def main(request, response):
+ location = request.GET.first("location")
+
+ if request.method == "OPTIONS":
+ if "redirect_preflight" in request.GET:
+ response.status = 302
+ response.headers.set("Location", location)
+ else:
+ response.status = 200
+ response.headers.set("Access-Control-Allow-Methods", "GET")
+ response.headers.set("Access-Control-Max-Age", 1)
+ elif request.method == "GET":
+ response.status = 302
+ response.headers.set("Location", location)
+
+ if "allow_origin" in request.GET:
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+
+ if "allow_header" in request.GET:
+ response.headers.set("Access-Control-Allow-Headers", request.GET.first("allow_header"))
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/reset-token.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/reset-token.py
new file mode 100644
index 00000000000..5c9a577b44c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/reset-token.py
@@ -0,0 +1,5 @@
+def main(request, response):
+ response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin"))
+ token = request.GET["token"]
+ request.server.stash.put(token, "")
+ response.content = "PASS"
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/responseType-document-in-worker.js b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/responseType-document-in-worker.js
new file mode 100644
index 00000000000..37ba9bd13ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/responseType-document-in-worker.js
@@ -0,0 +1,9 @@
+self.importScripts('/resources/testharness.js');
+
+test(function() {
+ let xhr = new XMLHttpRequest();
+ xhr.responseType = "document";
+ assert_not_equals(xhr.responseType, "document");
+}, "Setting XMLHttpRequest responseType to 'document' in a worker should have no effect.");
+
+done();
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/responseXML-unavailable-in-worker.js b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/responseXML-unavailable-in-worker.js
new file mode 100644
index 00000000000..2f3fdf25c33
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/responseXML-unavailable-in-worker.js
@@ -0,0 +1,9 @@
+self.importScripts('/resources/testharness.js');
+
+test(function() {
+ let xhr = new XMLHttpRequest();
+ assert_not_exists(xhr, "responseXML", "responseXML should not be available on instances.");
+ assert_not_exists(XMLHttpRequest.prototype, "responseXML", "responseXML should not be on the prototype.");
+}, "XMLHttpRequest's responseXML property should not be exposed in workers.");
+
+done();
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/win-1252-html.py b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/win-1252-html.py
new file mode 100644
index 00000000000..a4d72d5e275
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/win-1252-html.py
@@ -0,0 +1,5 @@
+def main(request, response):
+ headers = [("Content-type", "text/html;charset=windows-1252")]
+ content = chr(0xff)
+
+ return headers, content
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/responseType-document-in-worker.html b/tests/wpt/web-platform-tests/XMLHttpRequest/responseType-document-in-worker.html
new file mode 100644
index 00000000000..9a04320df92
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/responseType-document-in-worker.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+ fetch_tests_from_worker(new Worker("resources/responseType-document-in-worker.js"));
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/responseXML-unavailable-in-worker.html b/tests/wpt/web-platform-tests/XMLHttpRequest/responseXML-unavailable-in-worker.html
new file mode 100644
index 00000000000..dcb4cb04973
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/responseXML-unavailable-in-worker.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+ fetch_tests_from_worker(new Worker("resources/responseXML-unavailable-in-worker.js"));
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/responsedocument-decoding.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/responsedocument-decoding.htm
new file mode 100644
index 00000000000..321a2ac87a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/responsedocument-decoding.htm
@@ -0,0 +1,39 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>XMLHttpRequest: response document decoding</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <script>
+ function request(type, input, expected) {
+ async_test((test) => {
+ const client = new XMLHttpRequest();
+ client.responseType = 'document';
+ client.open("GET", "resources/status.py?content=" + input + "&type=" + encodeURIComponent(type), true);
+ client.onload = test.step_func_done(() => {
+ assert_equals(client.responseXML.querySelector("x").textContent, expected);
+ })
+ client.send(null);
+ }, document.title + " (" + type + " " + input + ")");
+ }
+
+ const encoded_content = "%e6%a9%9f";
+ const encoded_xml =
+ encodeURIComponent("<?xml version='1.0' encoding='windows-1252'?><x>") + encoded_content + encodeURIComponent("<\/x>");
+ const encoded_html =
+ encodeURIComponent("<!doctype html><meta charset=windows-1252><x>") + encoded_content + encodeURIComponent("<\/x>");
+ const decoded_as_windows_1252 = "\u00e6\u00a9\u0178";
+ const decoded_as_utf_8 = "\u6a5f";
+
+ request("application/xml", encoded_xml, decoded_as_windows_1252);
+ request("application/xml;charset=utf-8", encoded_xml, decoded_as_utf_8);
+ request("application/xml;charset=windows-1252", encoded_xml, decoded_as_windows_1252);
+ request("text/html", encoded_html, decoded_as_windows_1252);
+ request("text/html;charset=utf-8", encoded_html, decoded_as_utf_8);
+ request("text/html;charset=windows-1252", encoded_html, decoded_as_windows_1252);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/responsetext-decoding.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/responsetext-decoding.htm
index ce6bf6e08c8..c7e37832c34 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/responsetext-decoding.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/responsetext-decoding.htm
@@ -1,47 +1,92 @@
<!doctype html>
<html>
<head>
+ <meta charset="utf-8">
<title>XMLHttpRequest: responseText decoding</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
- <link rel="help" href="https://xhr.spec.whatwg.org/#the-responsetext-attribute" data-tested-assertations="following::ol[1]/li[4]" />
- <link rel="help" href="https://xhr.spec.whatwg.org/#text-response-entity-body" data-tested-assertations="following::ol[1]/li[2] following::ol[1]/li[3] following::ol[1]/li[4] following::ol[1]/li[5]" />
</head>
<body>
- <div id="log"></div>
<script>
+ function create_html(content) {
+ return "<!doctype html><meta charset=windows-1252><x>" + content + "</x>";
+ }
+ function create_encoded_html(encoded_content) {
+ return encodeURIComponent("<!doctype html><meta charset=windows-1252><x>") + encoded_content + encodeURIComponent("<\/x>");
+ }
+ function create_xml(content) {
+ return "<?xml version='1.0' encoding='windows-1252'?><x>" + content + "</x>";
+ }
+ function create_encoded_xml(encoded_content) {
+ return encodeURIComponent("<?xml version='1.0' encoding='windows-1252'?><x>") + encoded_content + encodeURIComponent("<\/x>");
+ }
function request(type, input, output, responseType) {
- var test = async_test(document.title + " (" + type + " " + input + ")");
- test.step(function() {
- var client = new XMLHttpRequest()
+ async_test((test) => {
+ const client = new XMLHttpRequest();
if (responseType !== undefined) {
- client.responseType = responseType
+ client.responseType = responseType;
}
- client.open("GET", "resources/status.py?content=" + input + "&type=" + encodeURIComponent(type), true)
+ client.open("GET", "resources/status.py?content=" + input + "&type=" + encodeURIComponent(type), true);
client.onload = test.step_func_done(() => {
- assert_equals(client.responseText, output)
+ assert_equals(client.responseText, output);
})
- client.send(null)
- })
+ client.send(null);
+ }, document.title + " (" + type + " " + input + " " + (responseType ? " " + responseType : "empty") + ")");
}
- request("application/xml", encodeURIComponent("<?xml version='1.0' encoding='windows-1252'?><x>")+'%FF'+encodeURIComponent("<\/x>"), "<?xml version='1.0' encoding='windows-1252'?><x>\u00FF<\/x>")
- request("text/html", encodeURIComponent("<!doctype html><meta charset=windows-1252>")+"%FF", "<!doctype html><meta charset=windows-1252>\uFFFD")
- request("text/plain;charset=windows-1252", "%FF", "\u00FF")
- request("text/plain", "%FF", "\uFFFD")
- request("text/plain", "%FE%FF", "")
- request("text/plain", "%FE%FF%FE%FF", "\uFEFF")
- request("text/plain", "%EF%BB%BF", "")
- request("text/plain", "%EF%BB%BF%EF%BB%BF", "\uFEFF")
- request("text/plain", "%C2", "\uFFFD")
- request("text/xml", "%FE%FF", "")
- request("text/xml", "%FE%FF%FE%FF", "\uFEFF")
- request("text/xml", "%EF%BB%BF", "")
- request("text/xml", "%EF%BB%BF%EF%BB%BF", "\uFEFF")
- request("text/plain", "%E3%81%B2", "\u3072", 'text')
- // the point of the following test: setting responseType=text should (per spec #text-response-entity-body point 3)
- // skip some of the charset detection even for XML resources. The test uses a wilfully mislabelled XMLish response
- // and the pass condition is that the responseType = text makes the decoder fall back to UTF-8
- request("text/xml", encodeURIComponent("<?xml version='1.0' encoding='windows-1252'?><x>")+"%E3%81%B2"+encodeURIComponent("<\/x>"), "<?xml version='1.0' encoding='windows-1252'?><x>\u3072<\/x>", 'text')
+
+ const encoded_content = "%e6%a9%9f";
+ const decoded_as_windows_1252 = "\u00e6\u00a9\u0178";
+ const decoded_as_utf_8 = "\u6a5f";
+ const encoded_xml = create_encoded_xml(encoded_content);
+ const encoded_html = create_encoded_html(encoded_content);
+ const xml_decoded_as_windows_1252 = create_xml(decoded_as_windows_1252);
+ const xml_decoded_as_utf_8 = create_xml(decoded_as_utf_8);
+ const html_decoded_as_windows_1252 = create_html(decoded_as_windows_1252);
+ const html_decoded_as_utf_8 = create_html(decoded_as_utf_8);
+
+ // "default" response type
+ // An XML-ish response is sniffed.
+ request("application/xml", encoded_xml, xml_decoded_as_windows_1252);
+ // An HTML-ish response isn't sniffed.
+ request("text/html", encoded_html, html_decoded_as_utf_8);
+ request("application/xml;charset=utf-8", encoded_xml, xml_decoded_as_utf_8);
+ request("application/xml;charset=windows-1252", encoded_xml, xml_decoded_as_windows_1252);
+ request("text/html;charset=utf-8", encoded_html, html_decoded_as_utf_8);
+ request("text/html;charset=windows-1252", encoded_html, html_decoded_as_windows_1252);
+ request("text/plain;charset=windows-1252", "%FF", "\u00FF");
+ request("text/plain", "%FF", "\uFFFD");
+ request("text/plain", "%FE%FF", "");
+ request("text/plain", "%FE%FF%FE%FF", "\uFEFF");
+ request("text/plain", "%EF%BB%BF", "");
+ request("text/plain", "%EF%BB%BF%EF%BB%BF", "\uFEFF");
+ request("text/plain", "%C2", "\uFFFD");
+ request("text/xml", "%FE%FF", "");
+ request("text/xml", "%FE%FF%FE%FF", "\uFEFF");
+ request("text/xml", "%EF%BB%BF", "");
+ request("text/xml", "%EF%BB%BF%EF%BB%BF", "\uFEFF");
+ request("text/plain", "%E3%81%B2", "\u3072");
+
+ // "text" response type
+ // An XML-ish response isn't sniffed.
+ request("application/xml", encoded_xml, xml_decoded_as_utf_8, "text");
+ // An HTML-ish response isn't sniffed.
+ request("text/html", encoded_html, html_decoded_as_utf_8, "text");
+ request("application/xml;charset=utf-8", encoded_xml, xml_decoded_as_utf_8, "text");
+ request("application/xml;charset=windows-1252", encoded_xml, xml_decoded_as_windows_1252, "text");
+ request("text/html;charset=utf-8", encoded_html, html_decoded_as_utf_8, "text");
+ request("text/html;charset=windows-1252", encoded_html, html_decoded_as_windows_1252, "text");
+ request("text/plain;charset=windows-1252", "%FF", "\u00FF", "text");
+ request("text/plain", "%FF", "\uFFFD", "text");
+ request("text/plain", "%FE%FF", "", "text");
+ request("text/plain", "%FE%FF%FE%FF", "\uFEFF", "text");
+ request("text/plain", "%EF%BB%BF", "", "text");
+ request("text/plain", "%EF%BB%BF%EF%BB%BF", "\uFEFF", "text");
+ request("text/plain", "%C2", "\uFFFD", "text");
+ request("text/xml", "%FE%FF", "", "text");
+ request("text/xml", "%FE%FF%FE%FF", "\uFEFF", "text");
+ request("text/xml", "%EF%BB%BF", "", "text");
+ request("text/xml", "%EF%BB%BF%EF%BB%BF", "\uFEFF", "text");
+ request("text/plain", "%E3%81%B2", "\u3072", "text");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/send-content-type-string.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/send-content-type-string.htm
index 0391ed8b3d1..6c2c00823c6 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/send-content-type-string.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/send-content-type-string.htm
@@ -20,7 +20,7 @@
request("TEST", "text/plain;charset=UTF-8")
function init(fr) { request(fr.contentDocument, fr.getAttribute("data-t")) }
</script>
- <iframe src='data:text/xml;charset=windows-1252,<%FF/>' onload="init(this)" data-t="application/xml;charset=UTF-8"></iframe>
- <iframe src='data:text/html;charset=windows-1252,%FF' onload="init(this)" data-t="text/html;charset=UTF-8"></iframe>
+ <iframe src="resources/win-1252-xml.py" onload="init(this)" data-t="application/xml;charset=UTF-8"></iframe>
+ <iframe src="resources/win-1252-html.py" onload="init(this)" data-t="text/html;charset=UTF-8"></iframe>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/setrequestheader-content-type.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/setrequestheader-content-type.htm
index 0d3ebc4e894..55196d835d8 100644
--- a/tests/wpt/web-platform-tests/XMLHttpRequest/setrequestheader-content-type.htm
+++ b/tests/wpt/web-platform-tests/XMLHttpRequest/setrequestheader-content-type.htm
@@ -21,13 +21,13 @@
}
client.send(toSend)
- const responseType = client.responseText
+ const actual = client.responseText
if (expectedType === undefined || expectedType === null) {
- assert_equals(responseType, "");
+ assert_equals(actual, "");
} else if (expectedType instanceof RegExp) {
- assert_regexp_match(responseType, expectedType);
+ assert_regexp_match(actual, expectedType);
} else {
- assert_equals(responseType, "Content-Type: " + expectedType + "\n");
+ assert_equals(actual, "Content-Type: " + expectedType + "\n");
}
}, title)
}
@@ -123,6 +123,12 @@
)
request(
function _Blob() { return new Blob(["<xml/>"], {type : "application/xml;charset=ASCII"}); },
+ {"Content-Type": ""},
+ "",
+ 'Blob request with set type respects setRequestHeader("") to be specified'
+ )
+ request(
+ function _Blob() { return new Blob(["<xml/>"], {type : "application/xml;charset=ASCII"}); },
{},
"application/xml;charset=ascii", // new Blob lowercases the type argument
"Blob request with set type uses that it for Content-Type unless setRequestHeader()"
diff --git a/tests/wpt/web-platform-tests/accelerometer/Accelerometer.https.html b/tests/wpt/web-platform-tests/accelerometer/Accelerometer.https.html
index 6421ab568d9..58355571797 100644
--- a/tests/wpt/web-platform-tests/accelerometer/Accelerometer.https.html
+++ b/tests/wpt/web-platform-tests/accelerometer/Accelerometer.https.html
@@ -7,8 +7,6 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/generic-sensor/generic-sensor-tests.js"></script>
<div id="log"></div>
-<iframe src="support-iframe.html" id="frame" style="display:none" sandbox="allow-scripts">
-</iframe>
<script>
runGenericSensorTests(Accelerometer);
diff --git a/tests/wpt/web-platform-tests/accelerometer/OWNERS b/tests/wpt/web-platform-tests/accelerometer/OWNERS
index cc7c3879319..eb920ae0f1e 100644
--- a/tests/wpt/web-platform-tests/accelerometer/OWNERS
+++ b/tests/wpt/web-platform-tests/accelerometer/OWNERS
@@ -1,5 +1,6 @@
@zqzhang
@dontcallmedom
-@tobie
@riju
@Honry
+@alexshalamov
+@pozdnyakov
diff --git a/tests/wpt/web-platform-tests/accelerometer/idlharness.https.html b/tests/wpt/web-platform-tests/accelerometer/idlharness.https.html
index 66e228cda15..b6d9ce55994 100644
--- a/tests/wpt/web-platform-tests/accelerometer/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/accelerometer/idlharness.https.html
@@ -8,80 +8,51 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
-<style>
- pre {
- display: none;
- }
-</style>
<div id="log"></div>
-<pre id="idl">
-interface Event {
-};
-
-interface Error {
-};
-
-dictionary EventInit {
-};
-
+<script id="idl" type="text/plain">
interface EventTarget {
};
interface EventHandler {
};
-</pre>
+</script>
-<pre id="generic-idl">
-[SecureContext]
+<script id="accelerometer-idl" type="text/plain">
+// The interface of Sensor is defined in
+// https://www.w3.org/TR/generic-sensor/#idl-index
+[SecureContext, Exposed=Window]
interface Sensor : EventTarget {
readonly attribute boolean activated;
readonly attribute DOMHighResTimeStamp? timestamp;
void start();
void stop();
- attribute EventHandler onchange;
+ attribute EventHandler onreading;
attribute EventHandler onactivate;
attribute EventHandler onerror;
};
-dictionary SensorOptions {
- double? frequency;
-};
-
-[SecureContext, Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)]
-interface SensorErrorEvent : Event {
- readonly attribute Error error;
-};
-
-dictionary SensorErrorEventInit : EventInit {
- required Error error;
-};
-</pre>
-
-<pre id="accelerometer-idl">
-[Constructor(optional SensorOptions options)]
+[Constructor(optional SensorOptions options), Exposed=Window]
interface Accelerometer : Sensor {
readonly attribute unrestricted double? x;
readonly attribute unrestricted double? y;
readonly attribute unrestricted double? z;
};
-[Constructor(optional SensorOptions options)]
+[Constructor(optional SensorOptions options), Exposed=Window]
interface LinearAccelerationSensor : Accelerometer {
};
-[Constructor(optional SensorOptions options)]
+[Constructor(optional SensorOptions options), Exposed=Window]
interface GravitySensor : Accelerometer {
};
-</pre>
+</script>
<script>
-
(() => {
"use strict";
let idl_array = new IdlArray();
idl_array.add_untested_idls(document.getElementById('idl').textContent);
- idl_array.add_untested_idls(document.getElementById('generic-idl').textContent);
idl_array.add_idls(document.getElementById('accelerometer-idl').textContent);
idl_array.add_objects({
@@ -92,5 +63,4 @@ interface GravitySensor : Accelerometer {
idl_array.test();
})();
-
</script>
diff --git a/tests/wpt/web-platform-tests/accelerometer/support-iframe.html b/tests/wpt/web-platform-tests/accelerometer/support-iframe.html
deleted file mode 100644
index a123f486bea..00000000000
--- a/tests/wpt/web-platform-tests/accelerometer/support-iframe.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE HTML>
-<meta charset="utf-8">
-<script>
-try {
- let sensor = new Accelerometer();
- parent.postMessage("sensor.start() can be fired within iframes", '*');
-} catch (e) {
- parent.postMessage(e.name, '*');
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor.https.html b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor.https.html
index 5e2310d0d85..88bb19a96ce 100644
--- a/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor.https.html
+++ b/tests/wpt/web-platform-tests/ambient-light/AmbientLightSensor.https.html
@@ -7,8 +7,6 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/generic-sensor/generic-sensor-tests.js"></script>
<div id="log"></div>
-<iframe src="support-iframe.html" id="frame" style="display:none" sandbox="allow-scripts">
-</iframe>
<script>
runGenericSensorTests(AmbientLightSensor);
diff --git a/tests/wpt/web-platform-tests/ambient-light/OWNERS b/tests/wpt/web-platform-tests/ambient-light/OWNERS
index d0b7f095c90..86b5a458c77 100644
--- a/tests/wpt/web-platform-tests/ambient-light/OWNERS
+++ b/tests/wpt/web-platform-tests/ambient-light/OWNERS
@@ -1,5 +1,7 @@
@zqzhang
@Volker-E
@dontcallmedom
-@tobie
@riju
+@alexshalamov
+@pozdnyakov
+@Honry
diff --git a/tests/wpt/web-platform-tests/ambient-light/idlharness.https.html b/tests/wpt/web-platform-tests/ambient-light/idlharness.https.html
index 2ccc23f598d..cf43d5476e2 100644
--- a/tests/wpt/web-platform-tests/ambient-light/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/ambient-light/idlharness.https.html
@@ -8,70 +8,41 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
-<style>
- pre {
- display: none;
- }
-</style>
<div id="log"></div>
-<pre id="idl">
-interface Event {
-};
-
-interface Error {
-};
-
-dictionary EventInit {
-};
-
+<script id="idl" type="text/plain">
interface EventTarget {
};
interface EventHandler {
};
-</pre>
+</script>
-<pre id="generic-idl">
-[SecureContext]
+<script id="ambient-light-idl" type="text/plain">
+// The interface of Sensor is defined in
+// https://www.w3.org/TR/generic-sensor/#idl-index
+[SecureContext, Exposed=Window]
interface Sensor : EventTarget {
readonly attribute boolean activated;
readonly attribute DOMHighResTimeStamp? timestamp;
void start();
void stop();
- attribute EventHandler onchange;
+ attribute EventHandler onreading;
attribute EventHandler onactivate;
attribute EventHandler onerror;
};
-dictionary SensorOptions {
- double? frequency;
-};
-
-[SecureContext, Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)]
-interface SensorErrorEvent : Event {
- readonly attribute Error error;
-};
-
-dictionary SensorErrorEventInit : EventInit {
- required Error error;
-};
-</pre>
-
-<pre id="ambient-light-idl">
-[Constructor(optional SensorOptions sensorOptions)]
+[Constructor(optional SensorOptions sensorOptions), Exposed=Window]
interface AmbientLightSensor : Sensor {
readonly attribute unrestricted double? illuminance;
};
-</pre>
+</script>
<script>
-
(() => {
"use strict";
let idl_array = new IdlArray();
idl_array.add_untested_idls(document.getElementById('idl').textContent);
- idl_array.add_untested_idls(document.getElementById('generic-idl').textContent);
idl_array.add_idls(document.getElementById('ambient-light-idl').textContent);
idl_array.add_objects({
@@ -80,5 +51,4 @@ interface AmbientLightSensor : Sensor {
idl_array.test();
})();
-
</script>
diff --git a/tests/wpt/web-platform-tests/ambient-light/support-iframe.html b/tests/wpt/web-platform-tests/ambient-light/support-iframe.html
deleted file mode 100644
index 17ff8e7aca2..00000000000
--- a/tests/wpt/web-platform-tests/ambient-light/support-iframe.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE HTML>
-<meta charset="utf-8">
-<script>
-try {
- let sensor = new AmbientLightSensor();
- parent.postMessage("sensor.start() can be fired within iframes", '*');
-} catch (e) {
- parent.postMessage(e.name, '*');
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/annotation-protocol/OWNERS b/tests/wpt/web-platform-tests/annotation-protocol/OWNERS
new file mode 100644
index 00000000000..35ae0f6c00b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/annotation-protocol/OWNERS
@@ -0,0 +1 @@
+@halindrome
diff --git a/tests/wpt/web-platform-tests/app-uri/OWNERS b/tests/wpt/web-platform-tests/app-uri/OWNERS
deleted file mode 100644
index 261dea7df72..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-@happyoungj
diff --git a/tests/wpt/web-platform-tests/app-uri/README.md b/tests/wpt/web-platform-tests/app-uri/README.md
deleted file mode 100644
index a33f0b0b41c..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-app-URI test suite
-==========
-
-Test suites for [app-URI scheme](http://app-uri.sysapps.org/) specification
-
-You can find here:
-
-[app-URI test suite html file](appURI_test.html)
-
-
-If you want to use System application packages there is manifest file on Sysapps github repo:
-
-[Manifest file - can be used for building application](https://github.com/sysapps/testsuites/blob/gh-pages/app-URI/manifest.webapp) \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/app-uri/appURI_test.html b/tests/wpt/web-platform-tests/app-uri/appURI_test.html
deleted file mode 100644
index 722c210b545..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/appURI_test.html
+++ /dev/null
@@ -1,393 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>app:URI compliance tests</title>
- <script src='/resources/testharness.js'></script>
- <script src='/resources/testharnessreport.js'></script>
- <link rel="help" href="http://app-uri.sysapps.org/" data-tested-assertations="following::OL[1]/LI[2]" />
- <style>
- div {padding:5px 5px 10px 5px;}
- </style>
- </head>
- <body>
- <div id="logs"></div>
- <div id="log"></div>
-
-
- <script>
- /**********************************************************************************************
- * This test suite checks your implementation for compliance with the app-URI specification *
- **********************************************************************************************/
-
- /* Check if protocol is "app" */
- if (window.location.protocol === "app:") {
-
- /* Logging current domain */
- var domain = window.location.protocol + "//" + window.location.host + "/";
- document.getElementById("logs").innerHTML = "Current domain: " + domain;
-
- /* Function that will change HOST value if it is equal to currect application host */
- function ChangeHostIfEqCurrent(URI){
- /* Check if URI host is NOT the same as current application host */
- if (URI.substring(6, 35) === window.location.host) {
- if (URI.substring(6, 7) !== 4)
- URI = URI.replace(URI.substring(6, 7), "4");
- else
- URI = URI.replace(URI.substring(6, 7), "5");
- }
- return URI;
- }
-
- /********************************************************
- * 6.1 Synthesizing an app: URI
- *
- * link: http://app-uri.sysapps.org/#synthesizing
- *
- ********************************************************/
-
- /**
- * Syntax-Based Normalization
- *
- * rules for dereferencing an app: URI => 3. Let URI be the value of the [HTTP] Request URI.
- */
-
- var TC_name = "Test: Synthesizing an app:URI. Syntax-Based Normalization";
-
- // variable needed to test scheme-based normalization
- var tmp_domain = window.location.protocol + "//" + window.location.host;
-
- var CaseNormalizationXHRtests = [ /* scheme: [ TC name, URI] */
- [TC_name + " XHR full path: {} => %7b%7d",
- domain + 'resources/ExamPLE/%7bmY%7d/z...z/index.html'],
- [TC_name + " XHR full path: } => %7D",
- domain + 'resources/ExamPLE/%7bmY%7D/z...z/index.html'],
- [TC_name + " XHR full path: {} => %7B%7D",
- domain + 'resources/ExamPLE/%7BmY%7D/z...z/index.html'],
- [TC_name + " XHR full path: Capital letters in patch",
- domain + 'resources/ExamPLE/mmY/index.html'],
- [TC_name + " XHR relative path: {} => %7b%7d",
- 'resources/ExamPLE/%7bmY%7d/z...z/index.html'],
- [TC_name + " XHR relative path: } => %7D",
- 'resources/ExamPLE/%7bmY%7D/z...z/index.html'],
- [TC_name + " XHR relative path: P. => %50%2e",
- 'resources/Exam%50LE/%7bmY%7d/z%2e..z/index.html'],
- [TC_name + " XHR relative path: Capital letters in patch",
- 'resources/ExamPLE/mmY/index.html'],
- [TC_name + " XHR relative path: ~ => ~",
- 'resources/ImaGes/~t/{!a}/~sth.png'],
- [TC_name + " XHR relative path: ~{} => ~%7b%7d",
- 'resources/ImaGes/~t/%7b!a%7d/~sth.png'],
-
- /* Percent-Encoding Normalization*/
- [TC_name + " Percent-Encoding Normalization - XHR full path: c. => %63%2e",
- domain + 'resources/ExamPLE/%7bmY%7d/z%2e..z/index.html'],
- [TC_name + " Percent-Encoding Normalization - XHR full path: P. => %50%2e",
- domain + 'resources/Exam%50LE/%7bmY%7d/z%2e..z/index.html'],
- [TC_name + " Percent-Encoding Normalization - XHR relative path: {} => %7B%7D",
- 'resources/ExamPLE/%7BmY%7D/z...z/index.html'],
- [TC_name + " Percent-Encoding Normalization - XHR relative path: c. => %63%2e",
- 'resources/ExamPLE/%7bmY%7d/z%2e..z/index.html'],
- [TC_name + " XHR relative path: ~{} => ~%7b%7d",
- 'resources/ImaGes/~t/%7b!a%7d/~sth.png'],
-
- /* Path Segment Normalization */
- [TC_name + " Path Segment Normalization: using '../..' in path ",
- 'resources/ExamPLE/mmY/../../ImaGes/~t/%7b!a%7d/~sth.png'],
-
- /* Scheme-Based Normalization */
- [TC_name + " Scheme-Based Normalization: domain:/",
- tmp_domain + ':/resources/ImaGes/~t/%7b!a%7d/~sth.png']
- ];
-
- CaseNormalizationXHRtests.forEach(function (data, i) {
- var name = data[0];
- var URI = data[1];
- var xhrTest = async_test(name + " [case " + i + "]");
- var xhr;
- xhrTest.step(function () {
- xhr = new XMLHttpRequest();
- xhr.open("GET", URI, true);
- xhr.onreadystatechange = xhrTest.step_func(function (ev) {
- if (xhr.readyState === 4 && xhr.status === 200) {
- assert_true(true);
- xhrTest.done();
- }
- if (xhr.readyState !== 4 && xhr.status !== 200 && xhr.status !== 0) {
- assert_true(false,
- "[ Error: readyState=" + xhr.readyState + " satus=" + xhr.status + "] ");
- }
- });
- xhr.send();
- });
- delete name, URI, xhr, xhrTest;
- });
- delete CaseNormalizationXHRtests;
-
-
- /**
- * ContentType response
- *
- * rules for dereferencing an app: URI =>
- 8. Let potential-file be the result of attempting locate the file at path
- */
-
- TC_name = "Test: [HTTP] 200 response status (OK),value of content-type as the [HTTP] ";
- TC_name += "Content-Type header, and the contents of potential-file as the response body";
-
- var ContentTypeResponsetests = [ /* scheme:[ TC name, URI, content-type] */
- [TC_name + ' [text/html]', 'resources/ExamPLE/mmY/index.html', 'text/html'],
- [TC_name + " [image/png]", 'resources/ImaGes/~t/%7b!a%7d/~sth.png', "image/png"],
- [TC_name + " [text/plain]", 'resources/ExamPLE/mmY/sth.txt', "text/plain"]
- ];
-
- ContentTypeResponsetests.forEach(function (data, i) {
- var name = data[0];
- var URI = data[1];
- var content_type = data[2];
- var xhrTest = async_test(name + " [case " + i + "]");
- var xhr;
- xhrTest.step(function () {
- xhr = new XMLHttpRequest();
- xhr.open("GET", URI, true);
- xhr.onreadystatechange = xhrTest.step_func(function (ev) {
- if (xhr.readyState === 4 && xhr.status === 200) {
- assert_true(xhr.getResponseHeader("Content-Type") === content_type,
- "[Content-Type does not mach with expected, it is: "
- + xhr.getResponseHeader("Content-Type") + "]");
-
- xhrTest.done();
- }
- if (xhr.readyState !== 4 && xhr.status !== 200 && xhr.status !== 0) {
- assert_true(false,
- "[ Error: readyState=" + xhr.readyState + " satus=" + xhr.status + "] ");
- }
- });
- xhr.send();
- });
- delete name, URI, xhr, xhrTest, content_type;
- });
- delete ContentTypeResponsetests;
-
-
- /**
- * Case Normalization in Path
- *
- * rules for dereferencing an app: URI =>
- 4. Resolve URI into an absolute URL using the document's origin as the base.
- * rules for dereferencing an app: URI => 7. Let path be the path component of URI.
- *
- * Character Normalization in domain name
- */
-
-
-
- TC_name = "Test: Synthesizing an app:URI. Syntax-Based Normalization: Case Normalization";
- var PathCaseNormalizationtests = [ /* scheme: [ TC name, URI] */
- [TC_name, "resources/ImaGes/{{a}}/Test_1/$a/sth34!.png",
- domain + "resources/ImaGes/%7B%7Ba%7D%7D/Test_1/$a/sth34!.png", true],
- [TC_name, "resources/ImaGes/{{a}}/Test_1/$a/sth34!.png",
- domain + "resources/ImaGes/%7b%7Ba%7D%7D/Test_1/$a/sth34!.png", false],
-
- /* Character Normalization in Domain */
- [TC_name, window.location.protocol + "//" + window.location.host.toUpperCase()
- + "/resources/ImaGes/{{a}}/Test_1/$a/sth34!.png",
- domain + "resources/ImaGes/%7B%7Ba%7D%7D/Test_1/$a/sth34!.png", true]
- ];
-
- PathCaseNormalizationtests.forEach(function (data, i) {
- var name = data[0];
- var elem_path = data[1];
- var path_expected = data[2];
- var expected = data[3];
- test(function () {
- var img = document.createElement("img");
- img.src = elem_path;
- if (expected)
- assert_true(img.src === path_expected,
- "[Error, path=" + img.src + " Expected=" + domain + path_expected + "]");
- else
- assert_false(img.src === path_expected,
- "[Error, path=" + img.src + " Expected=" + domain + path_expected + "]");
- delete img;
-
- }, name + " [case " + i + "]");
- delete elem_path, path_expected, expected, name;
- });
- delete PathCaseNormalizationtests;
-
-
-
-
- /********************************************************************************************
- * 6.4 Dereferencing and retrieval of files from a container
- *
- * link: http://app-uri.sysapps.org/#dereferencing-and-retrieval-of-files-from-a-container
- *
- ********************************************************************************************/
-
-
-
- /**
- * 501 Method Not Implemented error - response body MUST be empty
- *
- * rules for dereferencing an app: URI =>
- 1. If the request is not a [HTTP] GET request,
- return a [HTTP] 501 Not Implemented response and terminate this algorithm.
- */
-
-
- function Get_501_reponse(name, URI, expected_response) {
- var xhrTest = async_test(name);
- xhrTest.step(function () {
- var xhr = new XMLHttpRequest();
- /* on purpose wrong method "gett" instead of "get" was used */
- xhr.open("gett", URI, true);
- xhr.onreadystatechange = xhrTest.step_func(function (ev) {
- if (xhr.readyState !== 4 && xhr.status === 501) {
- assert_true(xhr.response === expected_response,
- "[" + xhr.status + " error, response:[" + xhr.response + "] " + "]");
-
- xhrTest.done();
- }
- if (xhr.readyState === 4 && xhr.status === 200) {
- assert_true(false,
- "[Should get 501 but got 200 OK, "
- +"file found while it should not find it, "
- +" non existing 'gett' method used");
- }
- });
- xhr.send();
- });
- delete xhrTest;
- }
- Get_501_reponse(TC_name + " 501 Method Not Implemented error expected",
- 'resources/ExamPLE/mmY/index.html', "");
-
-
- /**
- * 400 Bad Request error - response body MUST be empty
- *
- * rules for dereferencing an app: URI =>
- 5. If the URI does not conform to the appuri ABNF, return a
- [HTTP] 400 Bad Request response and terminate this algorithm.
- */
-
- function Get_400_reponse(name, URI, expected_response) {
- var xhrTest = async_test(name);
- xhrTest.step(function () {
- var xhr = new XMLHttpRequest();
- //alert(URI);
- xhr.open("GET", URI, true);
- xhr.onreadystatechange = xhrTest.step_func(function (ev) {
- if (xhr.readyState !== 4 && xhr.status === 400) {
- assert_true(xhr.response === expected_response,
- "[" + xhr.status + " error, response:[" + xhr.response + "] " + "]");
-
- xhrTest.done();
- }
- if (xhr.readyState === 4 && xhr.status === 200) {
- assert_true(false,
- "[Should get 400 but got 200 OK, "
- +"file found while it should not find it, "
- +"since no specific file requested]");
- }
- });
- xhr.send();
- });
- delete xhrTest;
- }
- Get_400_reponse(TC_name + " 400 Method Not Implemented error expected, no path",
- tmp_domain, "");
- Get_400_reponse(TC_name + " 400 Method Not Implemented error expected, different domain with no path",
- ChangeHostIfEqCurrent("app://f15a6d20-cefa-13e5-1972-800e20d19a76"), "");
-
-
- /**
- * 403 Forbidden error - response body MUST be empty
- *
- * rules for dereferencing an app: URI =>
- 6. If the URI uses the scheme 'app', but the authority does not match
- the one assigned to this document, return a [HTTP] 403 Forbidden
- response and terminate this algorithm
- (i.e., prevent inter-application content access).
- */
-
- function Get_403_reponse(name, URI, expected_response) {
- var xhrTest = async_test(name);
- xhrTest.step(function () {
- /* Change if URI host is the same as current application host */
- URI = ChangeHostIfEqCurrent(URI);
- var xhr = new XMLHttpRequest();
- xhr.open("GET", URI, true);
- xhr.onreadystatechange = xhrTest.step_func(function (ev) {
- if (xhr.readyState === 4 && xhr.status === 200) {
- assert_true(false, "[403 error expected, got: 200 OK instead]");
- }
- if (xhr.readyState !== 4 && xhr.status === 403) {
- assert_true(xhr.response === expected_response, "["
- + xhr.status + " error, response:[" + xhr.response + "] "
- + "]");
- xhrTest.done();
- }
- });
- xhr.send();
- });
- }
- Get_403_reponse(TC_name + " Access to restricted URI - 403 Forbidden error expected",
- window.location.protocol + "//f15a6d20-cefa-13e5-1972-800e20d19a76/" + 'resources/ExamPLE/mmY/index.html', "");
-
-
- /**
- * 404 Not Found error - response body MUST be empty
- *
- * rules for dereferencing an app: URI =>
- 9. If potential-file is not found at the given path inside the container,
- return a [HTTP] 404 Not Found response.
- */
-
- TC_name = "Test: 6.4 Dereferencing and retrieval of files from a container";
-
- var CompareResponseBodytests = [ /* scheme: [TC name, URI, expected_response]*/
- [TC_name + " 404 Not Found error expected",
- 'resources/ImaGes/~t/%7b!a%7d/~sth11.png', ""]
- ];
-
- CompareResponseBodytests.forEach(function (data, i) {
- var name = data[0];
- var URI = data[1];
- var expected_response = data[2];
- var xhrTest = async_test(name);
- var xhr;
- xhrTest.step(function () {
- xhr = new XMLHttpRequest();
- xhr.open("GET", URI, true);
- xhr.onreadystatechange = xhrTest.step_func(function (ev) {
- if (xhr.readyState !== 4 && xhr.status === 404) {
- assert_true(xhr.response === expected_response,
- "[" + xhr.status + " error, response:[" + xhr.response + "] " + "]");
- xhrTest.done();
- }
- if (xhr.readyState === 4 && xhr.status === 200) {
- assert_true(false, "[404 error expected, got: 200 OK instead]");
- }
- });
- xhr.send();
- });
- delete xhrTest, xhr;
- });
- delete CompareResponseBodytests;
-
-
-
- } else {
- document.getElementById("logs").innerHTML =
- "This is a test suite for app protocol only. Test aborted due to current protocol "
- + window.location.protocol;
- }
-
- </script>
- </body>
-</html>
-
-
-
diff --git a/tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/mmY/sth.txt b/tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/mmY/sth.txt
deleted file mode 100644
index 5e3cbc931a3..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/mmY/sth.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is simple text file
diff --git a/tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/{mY}/z...z/index.html b/tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/{mY}/z...z/index.html
deleted file mode 100644
index 7ef22e9a431..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/resources/ExamPLE/{mY}/z...z/index.html
+++ /dev/null
@@ -1 +0,0 @@
-PASS
diff --git a/tests/wpt/web-platform-tests/app-uri/resources/ImaGes/{{a}}/Test_1/$a/sth34!.png b/tests/wpt/web-platform-tests/app-uri/resources/ImaGes/{{a}}/Test_1/$a/sth34!.png
deleted file mode 100644
index 4a775ded297..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/resources/ImaGes/{{a}}/Test_1/$a/sth34!.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/app-uri/resources/ImaGes/~t/{!a}/corrupted_file.png b/tests/wpt/web-platform-tests/app-uri/resources/ImaGes/~t/{!a}/corrupted_file.png
deleted file mode 100644
index d05eb6ea2b7..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/resources/ImaGes/~t/{!a}/corrupted_file.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/app-uri/resources/ImaGes/~t/{!a}/~sth.png b/tests/wpt/web-platform-tests/app-uri/resources/ImaGes/~t/{!a}/~sth.png
deleted file mode 100644
index 4a775ded297..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/resources/ImaGes/~t/{!a}/~sth.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-128.png b/tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-128.png
deleted file mode 100644
index c010156253d..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-128.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-16.png b/tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-16.png
deleted file mode 100644
index 105194bbad5..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-16.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-48.png b/tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-48.png
deleted file mode 100644
index a19c55d6777..00000000000
--- a/tests/wpt/web-platform-tests/app-uri/resources/icons/w3c-48.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/assumptions/ahem-ref.html b/tests/wpt/web-platform-tests/assumptions/ahem-ref.html
deleted file mode 100644
index 2272bdab66b..00000000000
--- a/tests/wpt/web-platform-tests/assumptions/ahem-ref.html
+++ /dev/null
@@ -1,300 +0,0 @@
-
-<!doctype html>
-<title>Ahem checker</title>
-<style>
-@font-face {
- font-family: Ahem;
- src: url("../css/fonts/ahem/ahem.ttf");
-}
-* {
- padding: 0;
- margin: 0;
- border: none;
-}
-
-table {
- font: 15px/1 Ahem;
- border-collapse: separate;
- border-spacing: 1px;
- table-layout: fixed;
-}
-
-td {
- width: 34px;
-}
-</style>
-<table>
- <tr>
- <td>&#x0020;x <!-- U+0020: SPACE -->
- <td>&#x0021;x <!-- U+0021: EXCLAMATION MARK -->
- <td>&#x0022;x <!-- U+0022: QUOTATION MARK -->
- <td>&#x0023;x <!-- U+0023: NUMBER SIGN -->
- <td>&#x0024;x <!-- U+0024: DOLLAR SIGN -->
- <td>&#x0025;x <!-- U+0025: PERCENT SIGN -->
- <td>&#x0026;x <!-- U+0026: AMPERSAND -->
- <td>&#x0028;x <!-- U+0028: LEFT PARENTHESIS -->
- <td>&#x0029;x <!-- U+0029: RIGHT PARENTHESIS -->
- <td>&#x002A;x <!-- U+002A: ASTERISK -->
- <td>&#x002B;x <!-- U+002B: PLUS SIGN -->
- <td>&#x002C;x <!-- U+002C: COMMA -->
- <td>&#x002D;x <!-- U+002D: HYPHEN-MINUS -->
- <td>&#x002E;x <!-- U+002E: FULL STOP -->
- <td>&#x002F;x <!-- U+002F: SOLIDUS -->
- <td>&#x0030;x <!-- U+0030: DIGIT ZERO -->
- <td>&#x0031;x <!-- U+0031: DIGIT ONE -->
- <tr>
- <td>&#x0032;x <!-- U+0032: DIGIT TWO -->
- <td>&#x0033;x <!-- U+0033: DIGIT THREE -->
- <td>&#x0034;x <!-- U+0034: DIGIT FOUR -->
- <td>&#x0035;x <!-- U+0035: DIGIT FIVE -->
- <td>&#x0036;x <!-- U+0036: DIGIT SIX -->
- <td>&#x0037;x <!-- U+0037: DIGIT SEVEN -->
- <td>&#x0038;x <!-- U+0038: DIGIT EIGHT -->
- <td>&#x0039;x <!-- U+0039: DIGIT NINE -->
- <td>&#x003A;x <!-- U+003A: COLON -->
- <td>&#x003B;x <!-- U+003B: SEMICOLON -->
- <td>&#x003C;x <!-- U+003C: LESS-THAN SIGN -->
- <td>&#x003D;x <!-- U+003D: EQUALS SIGN -->
- <td>&#x003E;x <!-- U+003E: GREATER-THAN SIGN -->
- <td>&#x003F;x <!-- U+003F: QUESTION MARK -->
- <td>&#x0040;x <!-- U+0040: COMMERCIAL AT -->
- <td>&#x0041;x <!-- U+0041: LATIN CAPITAL LETTER A -->
- <td>&#x0042;x <!-- U+0042: LATIN CAPITAL LETTER B -->
- <tr>
- <td>&#x0043;x <!-- U+0043: LATIN CAPITAL LETTER C -->
- <td>&#x0044;x <!-- U+0044: LATIN CAPITAL LETTER D -->
- <td>&#x0045;x <!-- U+0045: LATIN CAPITAL LETTER E -->
- <td>&#x0046;x <!-- U+0046: LATIN CAPITAL LETTER F -->
- <td>&#x0047;x <!-- U+0047: LATIN CAPITAL LETTER G -->
- <td>&#x0048;x <!-- U+0048: LATIN CAPITAL LETTER H -->
- <td>&#x0049;x <!-- U+0049: LATIN CAPITAL LETTER I -->
- <td>&#x004A;x <!-- U+004A: LATIN CAPITAL LETTER J -->
- <td>&#x004B;x <!-- U+004B: LATIN CAPITAL LETTER K -->
- <td>&#x004C;x <!-- U+004C: LATIN CAPITAL LETTER L -->
- <td>&#x004D;x <!-- U+004D: LATIN CAPITAL LETTER M -->
- <td>&#x004E;x <!-- U+004E: LATIN CAPITAL LETTER N -->
- <td>&#x004F;x <!-- U+004F: LATIN CAPITAL LETTER O -->
- <td>&#x0050;x <!-- U+0050: LATIN CAPITAL LETTER P -->
- <td>&#x0051;x <!-- U+0051: LATIN CAPITAL LETTER Q -->
- <td>&#x0052;x <!-- U+0052: LATIN CAPITAL LETTER R -->
- <td>&#x0053;x <!-- U+0053: LATIN CAPITAL LETTER S -->
- <tr>
- <td>&#x0054;x <!-- U+0054: LATIN CAPITAL LETTER T -->
- <td>&#x0055;x <!-- U+0055: LATIN CAPITAL LETTER U -->
- <td>&#x0056;x <!-- U+0056: LATIN CAPITAL LETTER V -->
- <td>&#x0057;x <!-- U+0057: LATIN CAPITAL LETTER W -->
- <td>&#x0058;x <!-- U+0058: LATIN CAPITAL LETTER X -->
- <td>&#x0059;x <!-- U+0059: LATIN CAPITAL LETTER Y -->
- <td>&#x005A;x <!-- U+005A: LATIN CAPITAL LETTER Z -->
- <td>&#x005B;x <!-- U+005B: LEFT SQUARE BRACKET -->
- <td>&#x005C;x <!-- U+005C: REVERSE SOLIDUS -->
- <td>&#x005D;x <!-- U+005D: RIGHT SQUARE BRACKET -->
- <td>&#x005E;x <!-- U+005E: CIRCUMFLEX ACCENT -->
- <td>&#x005F;x <!-- U+005F: LOW LINE -->
- <td>&#x0060;x <!-- U+0060: GRAVE ACCENT -->
- <td>&#x0061;x <!-- U+0061: LATIN SMALL LETTER A -->
- <td>&#x0062;x <!-- U+0062: LATIN SMALL LETTER B -->
- <td>&#x0063;x <!-- U+0063: LATIN SMALL LETTER C -->
- <td>&#x0064;x <!-- U+0064: LATIN SMALL LETTER D -->
- <tr>
- <td>&#x0065;x <!-- U+0065: LATIN SMALL LETTER E -->
- <td>&#x0066;x <!-- U+0066: LATIN SMALL LETTER F -->
- <td>&#x0067;x <!-- U+0067: LATIN SMALL LETTER G -->
- <td>&#x0068;x <!-- U+0068: LATIN SMALL LETTER H -->
- <td>&#x0069;x <!-- U+0069: LATIN SMALL LETTER I -->
- <td>&#x006A;x <!-- U+006A: LATIN SMALL LETTER J -->
- <td>&#x006B;x <!-- U+006B: LATIN SMALL LETTER K -->
- <td>&#x006C;x <!-- U+006C: LATIN SMALL LETTER L -->
- <td>&#x006D;x <!-- U+006D: LATIN SMALL LETTER M -->
- <td>&#x006E;x <!-- U+006E: LATIN SMALL LETTER N -->
- <td>&#x006F;x <!-- U+006F: LATIN SMALL LETTER O -->
- <td>&#x0070;x <!-- U+0070: LATIN SMALL LETTER P -->
- <td>&#x0071;x <!-- U+0071: LATIN SMALL LETTER Q -->
- <td>&#x0072;x <!-- U+0072: LATIN SMALL LETTER R -->
- <td>&#x0073;x <!-- U+0073: LATIN SMALL LETTER S -->
- <td>&#x0074;x <!-- U+0074: LATIN SMALL LETTER T -->
- <td>&#x0075;x <!-- U+0075: LATIN SMALL LETTER U -->
- <tr>
- <td>&#x0076;x <!-- U+0076: LATIN SMALL LETTER V -->
- <td>&#x0077;x <!-- U+0077: LATIN SMALL LETTER W -->
- <td>&#x0078;x <!-- U+0078: LATIN SMALL LETTER X -->
- <td>&#x0079;x <!-- U+0079: LATIN SMALL LETTER Y -->
- <td>&#x007A;x <!-- U+007A: LATIN SMALL LETTER Z -->
- <td>&#x007B;x <!-- U+007B: LEFT CURLY BRACKET -->
- <td>&#x007C;x <!-- U+007C: VERTICAL LINE -->
- <td>&#x007D;x <!-- U+007D: RIGHT CURLY BRACKET -->
- <td>&#x007E;x <!-- U+007E: TILDE -->
- <td>&#x00A0;x <!-- U+00A0: NO-BREAK SPACE -->
- <td>&#x00A1;x <!-- U+00A1: INVERTED EXCLAMATION MARK -->
- <td>&#x00A2;x <!-- U+00A2: CENT SIGN -->
- <td>&#x00A3;x <!-- U+00A3: POUND SIGN -->
- <td>&#x00A4;x <!-- U+00A4: CURRENCY SIGN -->
- <td>&#x00A5;x <!-- U+00A5: YEN SIGN -->
- <td>&#x00A6;x <!-- U+00A6: BROKEN BAR -->
- <td>&#x00A7;x <!-- U+00A7: SECTION SIGN -->
- <tr>
- <td>&#x00A8;x <!-- U+00A8: DIAERESIS -->
- <td>&#x00A9;x <!-- U+00A9: COPYRIGHT SIGN -->
- <td>&#x00AA;x <!-- U+00AA: FEMININE ORDINAL INDICATOR -->
- <td>&#x00AB;x <!-- U+00AB: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -->
- <td>&#x00AC;x <!-- U+00AC: NOT SIGN -->
- <td>&#x00AD;x <!-- U+00AD: SOFT HYPHEN -->
- <td>&#x00AE;x <!-- U+00AE: REGISTERED SIGN -->
- <td>&#x00AF;x <!-- U+00AF: MACRON -->
- <td>&#x00B0;x <!-- U+00B0: DEGREE SIGN -->
- <td>&#x00B1;x <!-- U+00B1: PLUS-MINUS SIGN -->
- <td>&#x00B2;x <!-- U+00B2: SUPERSCRIPT TWO -->
- <td>&#x00B3;x <!-- U+00B3: SUPERSCRIPT THREE -->
- <td>&#x00B4;x <!-- U+00B4: ACUTE ACCENT -->
- <td>&#x00B5;x <!-- U+00B5: MICRO SIGN -->
- <td>&#x00B6;x <!-- U+00B6: PILCROW SIGN -->
- <td>&#x00B7;x <!-- U+00B7: MIDDLE DOT -->
- <td>&#x00B8;x <!-- U+00B8: CEDILLA -->
- <tr>
- <td>&#x00B9;x <!-- U+00B9: SUPERSCRIPT ONE -->
- <td>&#x00BA;x <!-- U+00BA: MASCULINE ORDINAL INDICATOR -->
- <td>&#x00BB;x <!-- U+00BB: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
- <td>&#x00BC;x <!-- U+00BC: VULGAR FRACTION ONE QUARTER -->
- <td>&#x00BD;x <!-- U+00BD: VULGAR FRACTION ONE HALF -->
- <td>&#x00BE;x <!-- U+00BE: VULGAR FRACTION THREE QUARTERS -->
- <td>&#x00BF;x <!-- U+00BF: INVERTED QUESTION MARK -->
- <td>&#x00C0;x <!-- U+00C0: LATIN CAPITAL LETTER A WITH GRAVE -->
- <td>&#x00C1;x <!-- U+00C1: LATIN CAPITAL LETTER A WITH ACUTE -->
- <td>&#x00C2;x <!-- U+00C2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX -->
- <td>&#x00C3;x <!-- U+00C3: LATIN CAPITAL LETTER A WITH TILDE -->
- <td>&#x00C4;x <!-- U+00C4: LATIN CAPITAL LETTER A WITH DIAERESIS -->
- <td>&#x00C5;x <!-- U+00C5: LATIN CAPITAL LETTER A WITH RING ABOVE -->
- <td>&#x00C6;x <!-- U+00C6: LATIN CAPITAL LETTER AE -->
- <td>&#x00C7;x <!-- U+00C7: LATIN CAPITAL LETTER C WITH CEDILLA -->
- <td>&#x00C8;x <!-- U+00C8: LATIN CAPITAL LETTER E WITH GRAVE -->
- <td>&#x00C9;x <!-- U+00C9: LATIN CAPITAL LETTER E WITH ACUTE -->
- <tr>
- <td>&#x00CA;x <!-- U+00CA: LATIN CAPITAL LETTER E WITH CIRCUMFLEX -->
- <td>&#x00CB;x <!-- U+00CB: LATIN CAPITAL LETTER E WITH DIAERESIS -->
- <td>&#x00CC;x <!-- U+00CC: LATIN CAPITAL LETTER I WITH GRAVE -->
- <td>&#x00CD;x <!-- U+00CD: LATIN CAPITAL LETTER I WITH ACUTE -->
- <td>&#x00CE;x <!-- U+00CE: LATIN CAPITAL LETTER I WITH CIRCUMFLEX -->
- <td>&#x00CF;x <!-- U+00CF: LATIN CAPITAL LETTER I WITH DIAERESIS -->
- <td>&#x00D0;x <!-- U+00D0: LATIN CAPITAL LETTER ETH -->
- <td>&#x00D1;x <!-- U+00D1: LATIN CAPITAL LETTER N WITH TILDE -->
- <td>&#x00D2;x <!-- U+00D2: LATIN CAPITAL LETTER O WITH GRAVE -->
- <td>&#x00D3;x <!-- U+00D3: LATIN CAPITAL LETTER O WITH ACUTE -->
- <td>&#x00D4;x <!-- U+00D4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX -->
- <td>&#x00D5;x <!-- U+00D5: LATIN CAPITAL LETTER O WITH TILDE -->
- <td>&#x00D6;x <!-- U+00D6: LATIN CAPITAL LETTER O WITH DIAERESIS -->
- <td>&#x00D7;x <!-- U+00D7: MULTIPLICATION SIGN -->
- <td>&#x00D8;x <!-- U+00D8: LATIN CAPITAL LETTER O WITH STROKE -->
- <td>&#x00D9;x <!-- U+00D9: LATIN CAPITAL LETTER U WITH GRAVE -->
- <td>&#x00DA;x <!-- U+00DA: LATIN CAPITAL LETTER U WITH ACUTE -->
- <tr>
- <td>&#x00DB;x <!-- U+00DB: LATIN CAPITAL LETTER U WITH CIRCUMFLEX -->
- <td>&#x00DC;x <!-- U+00DC: LATIN CAPITAL LETTER U WITH DIAERESIS -->
- <td>&#x00DD;x <!-- U+00DD: LATIN CAPITAL LETTER Y WITH ACUTE -->
- <td>&#x00DE;x <!-- U+00DE: LATIN CAPITAL LETTER THORN -->
- <td>&#x00DF;x <!-- U+00DF: LATIN SMALL LETTER SHARP S -->
- <td>&#x00E0;x <!-- U+00E0: LATIN SMALL LETTER A WITH GRAVE -->
- <td>&#x00E1;x <!-- U+00E1: LATIN SMALL LETTER A WITH ACUTE -->
- <td>&#x00E2;x <!-- U+00E2: LATIN SMALL LETTER A WITH CIRCUMFLEX -->
- <td>&#x00E3;x <!-- U+00E3: LATIN SMALL LETTER A WITH TILDE -->
- <td>&#x00E4;x <!-- U+00E4: LATIN SMALL LETTER A WITH DIAERESIS -->
- <td>&#x00E5;x <!-- U+00E5: LATIN SMALL LETTER A WITH RING ABOVE -->
- <td>&#x00E6;x <!-- U+00E6: LATIN SMALL LETTER AE -->
- <td>&#x00E7;x <!-- U+00E7: LATIN SMALL LETTER C WITH CEDILLA -->
- <td>&#x00E8;x <!-- U+00E8: LATIN SMALL LETTER E WITH GRAVE -->
- <td>&#x00E9;x <!-- U+00E9: LATIN SMALL LETTER E WITH ACUTE -->
- <td>&#x00EA;x <!-- U+00EA: LATIN SMALL LETTER E WITH CIRCUMFLEX -->
- <td>&#x00EB;x <!-- U+00EB: LATIN SMALL LETTER E WITH DIAERESIS -->
- <tr>
- <td>&#x00EC;x <!-- U+00EC: LATIN SMALL LETTER I WITH GRAVE -->
- <td>&#x00ED;x <!-- U+00ED: LATIN SMALL LETTER I WITH ACUTE -->
- <td>&#x00EE;x <!-- U+00EE: LATIN SMALL LETTER I WITH CIRCUMFLEX -->
- <td>&#x00EF;x <!-- U+00EF: LATIN SMALL LETTER I WITH DIAERESIS -->
- <td>&#x00F0;x <!-- U+00F0: LATIN SMALL LETTER ETH -->
- <td>&#x00F1;x <!-- U+00F1: LATIN SMALL LETTER N WITH TILDE -->
- <td>&#x00F2;x <!-- U+00F2: LATIN SMALL LETTER O WITH GRAVE -->
- <td>&#x00F3;x <!-- U+00F3: LATIN SMALL LETTER O WITH ACUTE -->
- <td>&#x00F4;x <!-- U+00F4: LATIN SMALL LETTER O WITH CIRCUMFLEX -->
- <td>&#x00F5;x <!-- U+00F5: LATIN SMALL LETTER O WITH TILDE -->
- <td>&#x00F6;x <!-- U+00F6: LATIN SMALL LETTER O WITH DIAERESIS -->
- <td>&#x00F7;x <!-- U+00F7: DIVISION SIGN -->
- <td>&#x00F8;x <!-- U+00F8: LATIN SMALL LETTER O WITH STROKE -->
- <td>&#x00F9;x <!-- U+00F9: LATIN SMALL LETTER U WITH GRAVE -->
- <td>&#x00FA;x <!-- U+00FA: LATIN SMALL LETTER U WITH ACUTE -->
- <td>&#x00FB;x <!-- U+00FB: LATIN SMALL LETTER U WITH CIRCUMFLEX -->
- <td>&#x00FC;x <!-- U+00FC: LATIN SMALL LETTER U WITH DIAERESIS -->
- <tr>
- <td>&#x00FD;x <!-- U+00FD: LATIN SMALL LETTER Y WITH ACUTE -->
- <td>&#x00FE;x <!-- U+00FE: LATIN SMALL LETTER THORN -->
- <td>&#x00FF;x <!-- U+00FF: LATIN SMALL LETTER Y WITH DIAERESIS -->
- <td>&#x0131;x <!-- U+0131: LATIN SMALL LETTER DOTLESS I -->
- <td>&#x0152;x <!-- U+0152: LATIN CAPITAL LIGATURE OE -->
- <td>&#x0153;x <!-- U+0153: LATIN SMALL LIGATURE OE -->
- <td>&#x0178;x <!-- U+0178: LATIN CAPITAL LETTER Y WITH DIAERESIS -->
- <td>&#x0192;x <!-- U+0192: LATIN SMALL LETTER F WITH HOOK -->
- <td>&#x02C6;x <!-- U+02C6: MODIFIER LETTER CIRCUMFLEX ACCENT -->
- <td>&#x02C7;x <!-- U+02C7: CARON -->
- <td>&#x02C9;x <!-- U+02C9: MODIFIER LETTER MACRON -->
- <td>&#x02D8;x <!-- U+02D8: BREVE -->
- <td>&#x02D9;x <!-- U+02D9: DOT ABOVE -->
- <td>&#x02DA;x <!-- U+02DA: RING ABOVE -->
- <td>&#x02DB;x <!-- U+02DB: OGONEK -->
- <td>&#x02DC;x <!-- U+02DC: SMALL TILDE -->
- <td>&#x02DD;x <!-- U+02DD: DOUBLE ACUTE ACCENT -->
- <tr>
- <td>&#x0394;x <!-- U+0394: GREEK CAPITAL LETTER DELTA -->
- <td>&#x03A9;x <!-- U+03A9: GREEK CAPITAL LETTER OMEGA -->
- <td>&#x03BC;x <!-- U+03BC: GREEK SMALL LETTER MU -->
- <td>&#x03C0;x <!-- U+03C0: GREEK SMALL LETTER PI -->
- <td>&#x2002;x <!-- U+2002: EN SPACE -->
- <td>&#x2003;x <!-- U+2003: EM SPACE -->
- <td>&#x2004;x <!-- U+2004: THREE-PER-EM SPACE -->
- <td>&#x2005;x <!-- U+2005: FOUR-PER-EM SPACE -->
- <td>&#x2006;x <!-- U+2006: SIX-PER-EM SPACE -->
- <td>&#x2009;x <!-- U+2009: THIN SPACE -->
- <td>&#x200A;x <!-- U+200A: HAIR SPACE -->
- <td>&#x200B;x <!-- U+200B: ZERO WIDTH SPACE -->
- <td>&#x200C;x <!-- U+200C: ZERO WIDTH NON-JOINER -->
- <td>&#x200D;x <!-- U+200D: ZERO WIDTH JOINER -->
- <td>&#x2010;x <!-- U+2010: HYPHEN -->
- <td>&#x2013;x <!-- U+2013: EN DASH -->
- <td>&#x2014;x <!-- U+2014: EM DASH -->
- <tr>
- <td>&#x2018;x <!-- U+2018: LEFT SINGLE QUOTATION MARK -->
- <td>&#x2019;x <!-- U+2019: RIGHT SINGLE QUOTATION MARK -->
- <td>&#x201A;x <!-- U+201A: SINGLE LOW-9 QUOTATION MARK -->
- <td>&#x201C;x <!-- U+201C: LEFT DOUBLE QUOTATION MARK -->
- <td>&#x201D;x <!-- U+201D: RIGHT DOUBLE QUOTATION MARK -->
- <td>&#x201E;x <!-- U+201E: DOUBLE LOW-9 QUOTATION MARK -->
- <td>&#x2020;x <!-- U+2020: DAGGER -->
- <td>&#x2021;x <!-- U+2021: DOUBLE DAGGER -->
- <td>&#x2022;x <!-- U+2022: BULLET -->
- <td>&#x2026;x <!-- U+2026: HORIZONTAL ELLIPSIS -->
- <td>&#x2030;x <!-- U+2030: PER MILLE SIGN -->
- <td>&#x2039;x <!-- U+2039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK -->
- <td>&#x203A;x <!-- U+203A: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -->
- <td>&#x2044;x <!-- U+2044: FRACTION SLASH -->
- <td>&#x2122;x <!-- U+2122: TRADE MARK SIGN -->
- <td>&#x2126;x <!-- U+2126: OHM SIGN -->
- <td>&#x2202;x <!-- U+2202: PARTIAL DIFFERENTIAL -->
- <tr>
- <td>&#x2206;x <!-- U+2206: INCREMENT -->
- <td>&#x220F;x <!-- U+220F: N-ARY PRODUCT -->
- <td>&#x2211;x <!-- U+2211: N-ARY SUMMATION -->
- <td>&#x2212;x <!-- U+2212: MINUS SIGN -->
- <td>&#x2219;x <!-- U+2219: BULLET OPERATOR -->
- <td>&#x221A;x <!-- U+221A: SQUARE ROOT -->
- <td>&#x221E;x <!-- U+221E: INFINITY -->
- <td>&#x222B;x <!-- U+222B: INTEGRAL -->
- <td>&#x2248;x <!-- U+2248: ALMOST EQUAL TO -->
- <td>&#x2260;x <!-- U+2260: NOT EQUAL TO -->
- <td>&#x2264;x <!-- U+2264: LESS-THAN OR EQUAL TO -->
- <td>&#x2265;x <!-- U+2265: GREATER-THAN OR EQUAL TO -->
- <td>&#x22F2;x <!-- U+22F2: ELEMENT OF WITH LONG HORIZONTAL STROKE -->
- <td>&#x25CA;x <!-- U+25CA: LOZENGE -->
- <td>&#x3000;x <!-- U+3000: IDEOGRAPHIC SPACE -->
- <td>&#xF000;x <!-- U+F000 -->
- <td>&#xF001;x <!-- U+F001 -->
- <tr>
- <td>&#xF002;x <!-- U+F002 -->
- <td>&#xFEFF;x <!-- U+FEFF: ZERO WIDTH NO-BREAK SPACE -->
-</table>
diff --git a/tests/wpt/web-platform-tests/assumptions/ahem.html b/tests/wpt/web-platform-tests/assumptions/ahem.html
deleted file mode 100644
index dee1b75c590..00000000000
--- a/tests/wpt/web-platform-tests/assumptions/ahem.html
+++ /dev/null
@@ -1,297 +0,0 @@
-
-<!doctype html>
-<title>Ahem checker</title>
-<link rel="match" href="ahem-ref.html">
-<style>
-* {
- padding: 0;
- margin: 0;
- border: none;
-}
-
-table {
- font: 15px/1 Ahem;
- border-collapse: separate;
- border-spacing: 1px;
- table-layout: fixed;
-}
-
-td {
- width: 34px;
-}
-</style>
-<table>
- <tr>
- <td>&#x0020;x <!-- U+0020: SPACE -->
- <td>&#x0021;x <!-- U+0021: EXCLAMATION MARK -->
- <td>&#x0022;x <!-- U+0022: QUOTATION MARK -->
- <td>&#x0023;x <!-- U+0023: NUMBER SIGN -->
- <td>&#x0024;x <!-- U+0024: DOLLAR SIGN -->
- <td>&#x0025;x <!-- U+0025: PERCENT SIGN -->
- <td>&#x0026;x <!-- U+0026: AMPERSAND -->
- <td>&#x0028;x <!-- U+0028: LEFT PARENTHESIS -->
- <td>&#x0029;x <!-- U+0029: RIGHT PARENTHESIS -->
- <td>&#x002A;x <!-- U+002A: ASTERISK -->
- <td>&#x002B;x <!-- U+002B: PLUS SIGN -->
- <td>&#x002C;x <!-- U+002C: COMMA -->
- <td>&#x002D;x <!-- U+002D: HYPHEN-MINUS -->
- <td>&#x002E;x <!-- U+002E: FULL STOP -->
- <td>&#x002F;x <!-- U+002F: SOLIDUS -->
- <td>&#x0030;x <!-- U+0030: DIGIT ZERO -->
- <td>&#x0031;x <!-- U+0031: DIGIT ONE -->
- <tr>
- <td>&#x0032;x <!-- U+0032: DIGIT TWO -->
- <td>&#x0033;x <!-- U+0033: DIGIT THREE -->
- <td>&#x0034;x <!-- U+0034: DIGIT FOUR -->
- <td>&#x0035;x <!-- U+0035: DIGIT FIVE -->
- <td>&#x0036;x <!-- U+0036: DIGIT SIX -->
- <td>&#x0037;x <!-- U+0037: DIGIT SEVEN -->
- <td>&#x0038;x <!-- U+0038: DIGIT EIGHT -->
- <td>&#x0039;x <!-- U+0039: DIGIT NINE -->
- <td>&#x003A;x <!-- U+003A: COLON -->
- <td>&#x003B;x <!-- U+003B: SEMICOLON -->
- <td>&#x003C;x <!-- U+003C: LESS-THAN SIGN -->
- <td>&#x003D;x <!-- U+003D: EQUALS SIGN -->
- <td>&#x003E;x <!-- U+003E: GREATER-THAN SIGN -->
- <td>&#x003F;x <!-- U+003F: QUESTION MARK -->
- <td>&#x0040;x <!-- U+0040: COMMERCIAL AT -->
- <td>&#x0041;x <!-- U+0041: LATIN CAPITAL LETTER A -->
- <td>&#x0042;x <!-- U+0042: LATIN CAPITAL LETTER B -->
- <tr>
- <td>&#x0043;x <!-- U+0043: LATIN CAPITAL LETTER C -->
- <td>&#x0044;x <!-- U+0044: LATIN CAPITAL LETTER D -->
- <td>&#x0045;x <!-- U+0045: LATIN CAPITAL LETTER E -->
- <td>&#x0046;x <!-- U+0046: LATIN CAPITAL LETTER F -->
- <td>&#x0047;x <!-- U+0047: LATIN CAPITAL LETTER G -->
- <td>&#x0048;x <!-- U+0048: LATIN CAPITAL LETTER H -->
- <td>&#x0049;x <!-- U+0049: LATIN CAPITAL LETTER I -->
- <td>&#x004A;x <!-- U+004A: LATIN CAPITAL LETTER J -->
- <td>&#x004B;x <!-- U+004B: LATIN CAPITAL LETTER K -->
- <td>&#x004C;x <!-- U+004C: LATIN CAPITAL LETTER L -->
- <td>&#x004D;x <!-- U+004D: LATIN CAPITAL LETTER M -->
- <td>&#x004E;x <!-- U+004E: LATIN CAPITAL LETTER N -->
- <td>&#x004F;x <!-- U+004F: LATIN CAPITAL LETTER O -->
- <td>&#x0050;x <!-- U+0050: LATIN CAPITAL LETTER P -->
- <td>&#x0051;x <!-- U+0051: LATIN CAPITAL LETTER Q -->
- <td>&#x0052;x <!-- U+0052: LATIN CAPITAL LETTER R -->
- <td>&#x0053;x <!-- U+0053: LATIN CAPITAL LETTER S -->
- <tr>
- <td>&#x0054;x <!-- U+0054: LATIN CAPITAL LETTER T -->
- <td>&#x0055;x <!-- U+0055: LATIN CAPITAL LETTER U -->
- <td>&#x0056;x <!-- U+0056: LATIN CAPITAL LETTER V -->
- <td>&#x0057;x <!-- U+0057: LATIN CAPITAL LETTER W -->
- <td>&#x0058;x <!-- U+0058: LATIN CAPITAL LETTER X -->
- <td>&#x0059;x <!-- U+0059: LATIN CAPITAL LETTER Y -->
- <td>&#x005A;x <!-- U+005A: LATIN CAPITAL LETTER Z -->
- <td>&#x005B;x <!-- U+005B: LEFT SQUARE BRACKET -->
- <td>&#x005C;x <!-- U+005C: REVERSE SOLIDUS -->
- <td>&#x005D;x <!-- U+005D: RIGHT SQUARE BRACKET -->
- <td>&#x005E;x <!-- U+005E: CIRCUMFLEX ACCENT -->
- <td>&#x005F;x <!-- U+005F: LOW LINE -->
- <td>&#x0060;x <!-- U+0060: GRAVE ACCENT -->
- <td>&#x0061;x <!-- U+0061: LATIN SMALL LETTER A -->
- <td>&#x0062;x <!-- U+0062: LATIN SMALL LETTER B -->
- <td>&#x0063;x <!-- U+0063: LATIN SMALL LETTER C -->
- <td>&#x0064;x <!-- U+0064: LATIN SMALL LETTER D -->
- <tr>
- <td>&#x0065;x <!-- U+0065: LATIN SMALL LETTER E -->
- <td>&#x0066;x <!-- U+0066: LATIN SMALL LETTER F -->
- <td>&#x0067;x <!-- U+0067: LATIN SMALL LETTER G -->
- <td>&#x0068;x <!-- U+0068: LATIN SMALL LETTER H -->
- <td>&#x0069;x <!-- U+0069: LATIN SMALL LETTER I -->
- <td>&#x006A;x <!-- U+006A: LATIN SMALL LETTER J -->
- <td>&#x006B;x <!-- U+006B: LATIN SMALL LETTER K -->
- <td>&#x006C;x <!-- U+006C: LATIN SMALL LETTER L -->
- <td>&#x006D;x <!-- U+006D: LATIN SMALL LETTER M -->
- <td>&#x006E;x <!-- U+006E: LATIN SMALL LETTER N -->
- <td>&#x006F;x <!-- U+006F: LATIN SMALL LETTER O -->
- <td>&#x0070;x <!-- U+0070: LATIN SMALL LETTER P -->
- <td>&#x0071;x <!-- U+0071: LATIN SMALL LETTER Q -->
- <td>&#x0072;x <!-- U+0072: LATIN SMALL LETTER R -->
- <td>&#x0073;x <!-- U+0073: LATIN SMALL LETTER S -->
- <td>&#x0074;x <!-- U+0074: LATIN SMALL LETTER T -->
- <td>&#x0075;x <!-- U+0075: LATIN SMALL LETTER U -->
- <tr>
- <td>&#x0076;x <!-- U+0076: LATIN SMALL LETTER V -->
- <td>&#x0077;x <!-- U+0077: LATIN SMALL LETTER W -->
- <td>&#x0078;x <!-- U+0078: LATIN SMALL LETTER X -->
- <td>&#x0079;x <!-- U+0079: LATIN SMALL LETTER Y -->
- <td>&#x007A;x <!-- U+007A: LATIN SMALL LETTER Z -->
- <td>&#x007B;x <!-- U+007B: LEFT CURLY BRACKET -->
- <td>&#x007C;x <!-- U+007C: VERTICAL LINE -->
- <td>&#x007D;x <!-- U+007D: RIGHT CURLY BRACKET -->
- <td>&#x007E;x <!-- U+007E: TILDE -->
- <td>&#x00A0;x <!-- U+00A0: NO-BREAK SPACE -->
- <td>&#x00A1;x <!-- U+00A1: INVERTED EXCLAMATION MARK -->
- <td>&#x00A2;x <!-- U+00A2: CENT SIGN -->
- <td>&#x00A3;x <!-- U+00A3: POUND SIGN -->
- <td>&#x00A4;x <!-- U+00A4: CURRENCY SIGN -->
- <td>&#x00A5;x <!-- U+00A5: YEN SIGN -->
- <td>&#x00A6;x <!-- U+00A6: BROKEN BAR -->
- <td>&#x00A7;x <!-- U+00A7: SECTION SIGN -->
- <tr>
- <td>&#x00A8;x <!-- U+00A8: DIAERESIS -->
- <td>&#x00A9;x <!-- U+00A9: COPYRIGHT SIGN -->
- <td>&#x00AA;x <!-- U+00AA: FEMININE ORDINAL INDICATOR -->
- <td>&#x00AB;x <!-- U+00AB: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -->
- <td>&#x00AC;x <!-- U+00AC: NOT SIGN -->
- <td>&#x00AD;x <!-- U+00AD: SOFT HYPHEN -->
- <td>&#x00AE;x <!-- U+00AE: REGISTERED SIGN -->
- <td>&#x00AF;x <!-- U+00AF: MACRON -->
- <td>&#x00B0;x <!-- U+00B0: DEGREE SIGN -->
- <td>&#x00B1;x <!-- U+00B1: PLUS-MINUS SIGN -->
- <td>&#x00B2;x <!-- U+00B2: SUPERSCRIPT TWO -->
- <td>&#x00B3;x <!-- U+00B3: SUPERSCRIPT THREE -->
- <td>&#x00B4;x <!-- U+00B4: ACUTE ACCENT -->
- <td>&#x00B5;x <!-- U+00B5: MICRO SIGN -->
- <td>&#x00B6;x <!-- U+00B6: PILCROW SIGN -->
- <td>&#x00B7;x <!-- U+00B7: MIDDLE DOT -->
- <td>&#x00B8;x <!-- U+00B8: CEDILLA -->
- <tr>
- <td>&#x00B9;x <!-- U+00B9: SUPERSCRIPT ONE -->
- <td>&#x00BA;x <!-- U+00BA: MASCULINE ORDINAL INDICATOR -->
- <td>&#x00BB;x <!-- U+00BB: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
- <td>&#x00BC;x <!-- U+00BC: VULGAR FRACTION ONE QUARTER -->
- <td>&#x00BD;x <!-- U+00BD: VULGAR FRACTION ONE HALF -->
- <td>&#x00BE;x <!-- U+00BE: VULGAR FRACTION THREE QUARTERS -->
- <td>&#x00BF;x <!-- U+00BF: INVERTED QUESTION MARK -->
- <td>&#x00C0;x <!-- U+00C0: LATIN CAPITAL LETTER A WITH GRAVE -->
- <td>&#x00C1;x <!-- U+00C1: LATIN CAPITAL LETTER A WITH ACUTE -->
- <td>&#x00C2;x <!-- U+00C2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX -->
- <td>&#x00C3;x <!-- U+00C3: LATIN CAPITAL LETTER A WITH TILDE -->
- <td>&#x00C4;x <!-- U+00C4: LATIN CAPITAL LETTER A WITH DIAERESIS -->
- <td>&#x00C5;x <!-- U+00C5: LATIN CAPITAL LETTER A WITH RING ABOVE -->
- <td>&#x00C6;x <!-- U+00C6: LATIN CAPITAL LETTER AE -->
- <td>&#x00C7;x <!-- U+00C7: LATIN CAPITAL LETTER C WITH CEDILLA -->
- <td>&#x00C8;x <!-- U+00C8: LATIN CAPITAL LETTER E WITH GRAVE -->
- <td>&#x00C9;x <!-- U+00C9: LATIN CAPITAL LETTER E WITH ACUTE -->
- <tr>
- <td>&#x00CA;x <!-- U+00CA: LATIN CAPITAL LETTER E WITH CIRCUMFLEX -->
- <td>&#x00CB;x <!-- U+00CB: LATIN CAPITAL LETTER E WITH DIAERESIS -->
- <td>&#x00CC;x <!-- U+00CC: LATIN CAPITAL LETTER I WITH GRAVE -->
- <td>&#x00CD;x <!-- U+00CD: LATIN CAPITAL LETTER I WITH ACUTE -->
- <td>&#x00CE;x <!-- U+00CE: LATIN CAPITAL LETTER I WITH CIRCUMFLEX -->
- <td>&#x00CF;x <!-- U+00CF: LATIN CAPITAL LETTER I WITH DIAERESIS -->
- <td>&#x00D0;x <!-- U+00D0: LATIN CAPITAL LETTER ETH -->
- <td>&#x00D1;x <!-- U+00D1: LATIN CAPITAL LETTER N WITH TILDE -->
- <td>&#x00D2;x <!-- U+00D2: LATIN CAPITAL LETTER O WITH GRAVE -->
- <td>&#x00D3;x <!-- U+00D3: LATIN CAPITAL LETTER O WITH ACUTE -->
- <td>&#x00D4;x <!-- U+00D4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX -->
- <td>&#x00D5;x <!-- U+00D5: LATIN CAPITAL LETTER O WITH TILDE -->
- <td>&#x00D6;x <!-- U+00D6: LATIN CAPITAL LETTER O WITH DIAERESIS -->
- <td>&#x00D7;x <!-- U+00D7: MULTIPLICATION SIGN -->
- <td>&#x00D8;x <!-- U+00D8: LATIN CAPITAL LETTER O WITH STROKE -->
- <td>&#x00D9;x <!-- U+00D9: LATIN CAPITAL LETTER U WITH GRAVE -->
- <td>&#x00DA;x <!-- U+00DA: LATIN CAPITAL LETTER U WITH ACUTE -->
- <tr>
- <td>&#x00DB;x <!-- U+00DB: LATIN CAPITAL LETTER U WITH CIRCUMFLEX -->
- <td>&#x00DC;x <!-- U+00DC: LATIN CAPITAL LETTER U WITH DIAERESIS -->
- <td>&#x00DD;x <!-- U+00DD: LATIN CAPITAL LETTER Y WITH ACUTE -->
- <td>&#x00DE;x <!-- U+00DE: LATIN CAPITAL LETTER THORN -->
- <td>&#x00DF;x <!-- U+00DF: LATIN SMALL LETTER SHARP S -->
- <td>&#x00E0;x <!-- U+00E0: LATIN SMALL LETTER A WITH GRAVE -->
- <td>&#x00E1;x <!-- U+00E1: LATIN SMALL LETTER A WITH ACUTE -->
- <td>&#x00E2;x <!-- U+00E2: LATIN SMALL LETTER A WITH CIRCUMFLEX -->
- <td>&#x00E3;x <!-- U+00E3: LATIN SMALL LETTER A WITH TILDE -->
- <td>&#x00E4;x <!-- U+00E4: LATIN SMALL LETTER A WITH DIAERESIS -->
- <td>&#x00E5;x <!-- U+00E5: LATIN SMALL LETTER A WITH RING ABOVE -->
- <td>&#x00E6;x <!-- U+00E6: LATIN SMALL LETTER AE -->
- <td>&#x00E7;x <!-- U+00E7: LATIN SMALL LETTER C WITH CEDILLA -->
- <td>&#x00E8;x <!-- U+00E8: LATIN SMALL LETTER E WITH GRAVE -->
- <td>&#x00E9;x <!-- U+00E9: LATIN SMALL LETTER E WITH ACUTE -->
- <td>&#x00EA;x <!-- U+00EA: LATIN SMALL LETTER E WITH CIRCUMFLEX -->
- <td>&#x00EB;x <!-- U+00EB: LATIN SMALL LETTER E WITH DIAERESIS -->
- <tr>
- <td>&#x00EC;x <!-- U+00EC: LATIN SMALL LETTER I WITH GRAVE -->
- <td>&#x00ED;x <!-- U+00ED: LATIN SMALL LETTER I WITH ACUTE -->
- <td>&#x00EE;x <!-- U+00EE: LATIN SMALL LETTER I WITH CIRCUMFLEX -->
- <td>&#x00EF;x <!-- U+00EF: LATIN SMALL LETTER I WITH DIAERESIS -->
- <td>&#x00F0;x <!-- U+00F0: LATIN SMALL LETTER ETH -->
- <td>&#x00F1;x <!-- U+00F1: LATIN SMALL LETTER N WITH TILDE -->
- <td>&#x00F2;x <!-- U+00F2: LATIN SMALL LETTER O WITH GRAVE -->
- <td>&#x00F3;x <!-- U+00F3: LATIN SMALL LETTER O WITH ACUTE -->
- <td>&#x00F4;x <!-- U+00F4: LATIN SMALL LETTER O WITH CIRCUMFLEX -->
- <td>&#x00F5;x <!-- U+00F5: LATIN SMALL LETTER O WITH TILDE -->
- <td>&#x00F6;x <!-- U+00F6: LATIN SMALL LETTER O WITH DIAERESIS -->
- <td>&#x00F7;x <!-- U+00F7: DIVISION SIGN -->
- <td>&#x00F8;x <!-- U+00F8: LATIN SMALL LETTER O WITH STROKE -->
- <td>&#x00F9;x <!-- U+00F9: LATIN SMALL LETTER U WITH GRAVE -->
- <td>&#x00FA;x <!-- U+00FA: LATIN SMALL LETTER U WITH ACUTE -->
- <td>&#x00FB;x <!-- U+00FB: LATIN SMALL LETTER U WITH CIRCUMFLEX -->
- <td>&#x00FC;x <!-- U+00FC: LATIN SMALL LETTER U WITH DIAERESIS -->
- <tr>
- <td>&#x00FD;x <!-- U+00FD: LATIN SMALL LETTER Y WITH ACUTE -->
- <td>&#x00FE;x <!-- U+00FE: LATIN SMALL LETTER THORN -->
- <td>&#x00FF;x <!-- U+00FF: LATIN SMALL LETTER Y WITH DIAERESIS -->
- <td>&#x0131;x <!-- U+0131: LATIN SMALL LETTER DOTLESS I -->
- <td>&#x0152;x <!-- U+0152: LATIN CAPITAL LIGATURE OE -->
- <td>&#x0153;x <!-- U+0153: LATIN SMALL LIGATURE OE -->
- <td>&#x0178;x <!-- U+0178: LATIN CAPITAL LETTER Y WITH DIAERESIS -->
- <td>&#x0192;x <!-- U+0192: LATIN SMALL LETTER F WITH HOOK -->
- <td>&#x02C6;x <!-- U+02C6: MODIFIER LETTER CIRCUMFLEX ACCENT -->
- <td>&#x02C7;x <!-- U+02C7: CARON -->
- <td>&#x02C9;x <!-- U+02C9: MODIFIER LETTER MACRON -->
- <td>&#x02D8;x <!-- U+02D8: BREVE -->
- <td>&#x02D9;x <!-- U+02D9: DOT ABOVE -->
- <td>&#x02DA;x <!-- U+02DA: RING ABOVE -->
- <td>&#x02DB;x <!-- U+02DB: OGONEK -->
- <td>&#x02DC;x <!-- U+02DC: SMALL TILDE -->
- <td>&#x02DD;x <!-- U+02DD: DOUBLE ACUTE ACCENT -->
- <tr>
- <td>&#x0394;x <!-- U+0394: GREEK CAPITAL LETTER DELTA -->
- <td>&#x03A9;x <!-- U+03A9: GREEK CAPITAL LETTER OMEGA -->
- <td>&#x03BC;x <!-- U+03BC: GREEK SMALL LETTER MU -->
- <td>&#x03C0;x <!-- U+03C0: GREEK SMALL LETTER PI -->
- <td>&#x2002;x <!-- U+2002: EN SPACE -->
- <td>&#x2003;x <!-- U+2003: EM SPACE -->
- <td>&#x2004;x <!-- U+2004: THREE-PER-EM SPACE -->
- <td>&#x2005;x <!-- U+2005: FOUR-PER-EM SPACE -->
- <td>&#x2006;x <!-- U+2006: SIX-PER-EM SPACE -->
- <td>&#x2009;x <!-- U+2009: THIN SPACE -->
- <td>&#x200A;x <!-- U+200A: HAIR SPACE -->
- <td>&#x200B;x <!-- U+200B: ZERO WIDTH SPACE -->
- <td>&#x200C;x <!-- U+200C: ZERO WIDTH NON-JOINER -->
- <td>&#x200D;x <!-- U+200D: ZERO WIDTH JOINER -->
- <td>&#x2010;x <!-- U+2010: HYPHEN -->
- <td>&#x2013;x <!-- U+2013: EN DASH -->
- <td>&#x2014;x <!-- U+2014: EM DASH -->
- <tr>
- <td>&#x2018;x <!-- U+2018: LEFT SINGLE QUOTATION MARK -->
- <td>&#x2019;x <!-- U+2019: RIGHT SINGLE QUOTATION MARK -->
- <td>&#x201A;x <!-- U+201A: SINGLE LOW-9 QUOTATION MARK -->
- <td>&#x201C;x <!-- U+201C: LEFT DOUBLE QUOTATION MARK -->
- <td>&#x201D;x <!-- U+201D: RIGHT DOUBLE QUOTATION MARK -->
- <td>&#x201E;x <!-- U+201E: DOUBLE LOW-9 QUOTATION MARK -->
- <td>&#x2020;x <!-- U+2020: DAGGER -->
- <td>&#x2021;x <!-- U+2021: DOUBLE DAGGER -->
- <td>&#x2022;x <!-- U+2022: BULLET -->
- <td>&#x2026;x <!-- U+2026: HORIZONTAL ELLIPSIS -->
- <td>&#x2030;x <!-- U+2030: PER MILLE SIGN -->
- <td>&#x2039;x <!-- U+2039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK -->
- <td>&#x203A;x <!-- U+203A: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -->
- <td>&#x2044;x <!-- U+2044: FRACTION SLASH -->
- <td>&#x2122;x <!-- U+2122: TRADE MARK SIGN -->
- <td>&#x2126;x <!-- U+2126: OHM SIGN -->
- <td>&#x2202;x <!-- U+2202: PARTIAL DIFFERENTIAL -->
- <tr>
- <td>&#x2206;x <!-- U+2206: INCREMENT -->
- <td>&#x220F;x <!-- U+220F: N-ARY PRODUCT -->
- <td>&#x2211;x <!-- U+2211: N-ARY SUMMATION -->
- <td>&#x2212;x <!-- U+2212: MINUS SIGN -->
- <td>&#x2219;x <!-- U+2219: BULLET OPERATOR -->
- <td>&#x221A;x <!-- U+221A: SQUARE ROOT -->
- <td>&#x221E;x <!-- U+221E: INFINITY -->
- <td>&#x222B;x <!-- U+222B: INTEGRAL -->
- <td>&#x2248;x <!-- U+2248: ALMOST EQUAL TO -->
- <td>&#x2260;x <!-- U+2260: NOT EQUAL TO -->
- <td>&#x2264;x <!-- U+2264: LESS-THAN OR EQUAL TO -->
- <td>&#x2265;x <!-- U+2265: GREATER-THAN OR EQUAL TO -->
- <td>&#x22F2;x <!-- U+22F2: ELEMENT OF WITH LONG HORIZONTAL STROKE -->
- <td>&#x25CA;x <!-- U+25CA: LOZENGE -->
- <td>&#x3000;x <!-- U+3000: IDEOGRAPHIC SPACE -->
- <td>&#xF000;x <!-- U+F000 -->
- <td>&#xF001;x <!-- U+F001 -->
- <tr>
- <td>&#xF002;x <!-- U+F002 -->
- <td>&#xFEFF;x <!-- U+FEFF: ZERO WIDTH NO-BREAK SPACE -->
-</table>
diff --git a/tests/wpt/web-platform-tests/assumptions/tools/ahem-generate-table.py b/tests/wpt/web-platform-tests/assumptions/tools/ahem-generate-table.py
deleted file mode 100644
index 29b4f0eb1bc..00000000000
--- a/tests/wpt/web-platform-tests/assumptions/tools/ahem-generate-table.py
+++ /dev/null
@@ -1,102 +0,0 @@
-from __future__ import print_function, unicode_literals
-
-import itertools
-import unicodedata
-
-from fontTools.ttLib import TTFont
-
-try:
- chr(0x100)
-except ValueError:
- chr = unichr
-
-def grouper(n, iterable):
- """
- >>> list(grouper(3, 'ABCDEFG'))
- [['A', 'B', 'C'], ['D', 'E', 'F'], ['G']]
- """
- iterable = iter(iterable)
- return iter(lambda: list(itertools.islice(iterable, n)), [])
-
-ttf = TTFont("../../css/fonts/ahem/ahem.ttf")
-
-chars = {char for table in ttf['cmap'].tables for char in table.cmap.keys()}
-
-# exclude chars that can't be represented as HTML numeric character refs
-chars = chars - (set(range(0x80, 0x9F+1)) | {0x00})
-
-chars_sorted = sorted(chars)
-
-per_row = 17
-
-
-def build_header(is_test):
- rv = []
-
- rv.append("""
-<!doctype html>
-<title>Ahem checker</title>""")
-
- if is_test:
- rv.append("""
-<link rel="match" href="ahem-ref.html">""")
-
- rv.append("""
-<style>""")
-
- if not is_test:
- rv.append("""
-@font-face {
- font-family: Ahem;
- src: url("../css/fonts/ahem/ahem.ttf");
-}""")
-
- rv.append("""
-* {
- padding: 0;
- margin: 0;
- border: none;
-}
-
-table {
- font: 15px/1 Ahem;
- border-collapse: separate;
- border-spacing: 1px;
- table-layout: fixed;
-}
-
-td {
- width: 34px;
-}
-</style>
-""")
-
- return "".join(rv)
-
-
-def build_table():
- rv = []
-
- rv.append("<table>\n")
- for row in grouper(per_row, chars_sorted):
- rv.append(" " * 4 + "<tr>\n")
- for codepoint in row:
- assert codepoint <= 0xFFFF
- try:
- name = unicodedata.name(chr(codepoint))
- except ValueError:
- rv.append(" " * 8 + "<td>&#x%04X;x <!-- U+%04X -->\n" % (codepoint, codepoint))
- else:
- rv.append(" " * 8 + "<td>&#x%04X;x <!-- U+%04X: %s -->\n" % (codepoint, codepoint, name))
- rv.append("</table>\n")
-
- return "".join(rv)
-
-
-with open("../ahem.html", "w") as f1:
- f1.write(build_header(True))
- f1.write(build_table())
-
-with open("../ahem-ref.html", "w") as f1:
- f1.write(build_header(False))
- f1.write(build_table())
diff --git a/tests/wpt/web-platform-tests/audio-output/HTMLMediaElement-sinkId-idl.html b/tests/wpt/web-platform-tests/audio-output/HTMLMediaElement-sinkId-idl.html
new file mode 100644
index 00000000000..4260672e90e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/audio-output/HTMLMediaElement-sinkId-idl.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html>
+<head>
+<meta charset=utf-8>
+<title>IDL check of sinkId on HTMLMediaElement</title>
+<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
+<link rel="help" href="https://www.w3.org/TR/audio-output/#htmlmediaelement-extensions">
+</head>
+<body>
+
+<h1 class="instructions">Description</h1>
+<p class="instructions">This test verifies the availability of <code>sinkId</code>/<code>setSinkId</code> on the HTMLMediaElement interface.</p>
+<div id='log'></div>
+<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_idl'>
+
+interface HTMLMediaElement {
+};
+
+interface HTMLAudioElement : HTMLMediaElement {
+};
+
+interface HTMLVideoElement : HTMLMediaElement {
+};
+</script>
+<script type="text/plain" id="idl">
+// The IDL is copied from the 15 December 2016 draft.
+partial interface HTMLMediaElement {
+ readonly attribute DOMString sinkId;
+ Promise<void> setSinkId(DOMString sinkId);
+};</script>
+<script>
+(function() {
+ var idl_array = new IdlArray();
+ idl_array.add_untested_idls(document.getElementById('untested_idl').textContent);
+ idl_array.add_idls(document.getElementById('idl').textContent);
+ window.audio = document.createElement("audio");
+ window.video = document.createElement("video");
+ idl_array.add_objects({"HTMLAudioElement": ["audio"], "HTMLVideoElement": ["video"]});
+ idl_array.test();
+ done();
+})();
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/audio-output/setSinkId-manual.https.html b/tests/wpt/web-platform-tests/audio-output/setSinkId-manual.https.html
new file mode 100644
index 00000000000..a083cdf0923
--- /dev/null
+++ b/tests/wpt/web-platform-tests/audio-output/setSinkId-manual.https.html
@@ -0,0 +1,132 @@
+<!doctype html>
+<html>
+<head>
+<title>Test setSinkId behavior with permissions / device changes</title>
+<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
+<link rel="help" href="https://www.w3.org/TR/audio-output/#dom-htmlmediaelement-setsinkid">
+<meta name="timeout" content="long">
+
+</head>
+<body>
+<h1 class="instructions">Description</h1>
+<p class="instructions">This test checks that <code>setSinkId</code> follows the algorithm, this includes manually checking the proper rendering on new output devices.</p>
+<p class="instructions">When prompted to access microphones, please accept as this is the only current way to get permissions for associated output devices.</p>
+<p class="instructions">For each authorized output device, check that selecting it makes the audio beat rendered on the corresponding device.</p>
+<p>Available but unauthorized devices (only those for which we can gain permission can be selected):</p>
+<ul id="available"></ul>
+<p>Authorized devices:</p>
+<ul id="authorized"></ul>
+<audio controls id="beat" src="/media/sound_5.mp3" loop></audio>
+
+<div id='log'></div>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+"use strict";
+
+const is_output = d => d.kind === "audiooutput";
+const by_id = (id) => d => d.groupId === id;
+const is_input = d => d.kind === "audioinput";
+const audio = document.getElementById("beat");
+const available = document.getElementById("available");
+const authorized = document.getElementById("authorized");
+
+let outputList;
+
+const selectDeviceTester = (t) => (e) => {
+ const groupId = e.target.dataset["groupid"];
+ const device = outputList.find(by_id(groupId));
+ if (audio.paused) audio.play();
+ promise_test(pt => audio.setSinkId(device.deviceId).then(() => {
+ assert_equals(device.deviceId, audio.sinkId);
+
+ const pass = document.createElement("button");
+ const fail = document.createElement("button");
+
+ const result = (bool) => () => {
+ assert_true(bool, "Sound rendered on right device");
+ fail.remove();
+ pass.remove();
+ audio.pause();
+ e.target.checked = false;
+ e.target.disabled = true;
+ t.done();
+ };
+
+ pass.style.backgroundColor = "#0f0";
+ pass.textContent = "\u2713 Sound plays on " + device.label;
+ pass.addEventListener("click", result(true));
+
+ fail.style.backgroundColor = "#f00";
+ fail.textContent = "\u274C Sound doesn't play on " + device.label;
+ fail.addEventListener("click", result(true));
+
+ const container = e.target.parentNode.parentNode;
+ container.appendChild(pass);
+ container.appendChild(fail);
+ }), "setSinkId for " + device.label + " resolves");
+};
+
+const addAuthorizedDevice = (groupId) => {
+ const device = outputList.find(by_id(groupId));
+ const async_t = async_test("Selecting output device " + device.label + " makes the audio rendered on the proper device");
+ const li = document.createElement("li");
+ const label = document.createElement("label");
+ const input = document.createElement("input");
+ input.type = "radio";
+ input.name = "device";
+ input.dataset["groupid"] = device.groupId;
+ input.addEventListener("change", selectDeviceTester(async_t));
+ const span = document.createElement("span");
+ span.textContent = device.label;
+ label.appendChild(input);
+ label.appendChild(span);
+ li.appendChild(label);
+ authorized.appendChild(li);
+};
+
+const authorizeDeviceTester = (t) => (e) => {
+ const groupId = e.target.dataset["groupid"];
+ navigator.mediaDevices.getUserMedia({audio: {groupId}})
+ .then( () => {
+ addAuthorizedDevice(groupId);
+ t.done();
+ });
+};
+
+promise_test(gum =>
+ navigator.mediaDevices.getUserMedia({audio: true}).then(
+ () => {
+ promise_test(t =>
+ navigator.mediaDevices.enumerateDevices().then(list => {
+ assert_not_equals(list.find(is_output), undefined, "media device list includes at least one audio output device");
+ outputList = list.filter(is_output);
+ outputList.forEach(d => {
+ const li = document.createElement("li");
+ assert_not_equals(d.label, "", "Audio Output Device Labels are available after permission grant");
+ li.textContent = d.label;
+ // Check permission
+ promise_test(perm => navigator.permissions.query({name: "speaker", deviceId: d.deviceId}).then(({state}) => {
+ if (state === "granted") {
+ addAuthorizedDevice(d.groupId);
+ } else if (state === "prompt") {
+ const inp = list.find(inp => inp.kind === "audioinput" && inp.groupId === d.groupId);
+ if (inp || true) {
+ const async_t = async_test("Authorizing output devices via permission requests for microphones works");
+ const button = document.createElement("button");
+ button.textContent = "Authorize access";
+ button.dataset["groupid"] = d.groupId;
+ button.addEventListener("click", async_t.step_func_done(authorizeDeviceTester(async_t)));
+ li.appendChild(button);
+ }
+ available.appendChild(li);
+ }
+ }, () => {
+ // if we can't query the permission, we assume it's granted :/
+ addAuthorizedDevice(d.groupId);
+ })
+ , "Query permission to use " + d.label);
+ });
+ }), "List media devices");
+ }), "Authorize mike access");
+</script>
diff --git a/tests/wpt/web-platform-tests/audio-output/setSinkId.https.html b/tests/wpt/web-platform-tests/audio-output/setSinkId.https.html
new file mode 100644
index 00000000000..2ce0b482b7e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/audio-output/setSinkId.https.html
@@ -0,0 +1,45 @@
+<!doctype html>
+<html>
+<head>
+<title>Test setSinkId behavior </title>
+<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
+<link rel="help" href="https://www.w3.org/TR/audio-output/#dom-htmlmediaelement-setsinkid">
+</head>
+<body>
+<h1 class="instructions">Description</h1>
+<p class="instructions">This test checks that <code>setSinkId</code> follows the algorithm (but does not consider actual rendering of the audio which needs to be manual).</p>
+<div id='log'></div>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+"use strict";
+
+const is_output = d => d.kind === "audiooutput";
+const audio = new Audio();
+
+promise_test(t => audio.setSinkId(""), "setSinkId on default audio output should always work");
+
+promise_test(t => promise_rejects(t, "NotFoundError", audio.setSinkId("inexistent_device_id")), "setSinkId fails with NotFoundError on made up deviceid");
+
+promise_test(t =>
+ navigator.mediaDevices.enumerateDevices().then(list => {
+ assert_not_equals(list.find(is_output), undefined, "media device list includes at least one audio output device");
+ // since we haven't gained any specific permission,
+ // for all listed audio output devices, calling setSinkId with device id can
+ // either create a security exception or work and thus reflect the deviceId
+ let acceptedDevice = 0;
+ list.filter(is_output).forEach((d,i) => promise_test(td => audio.setSinkId(d.deviceId).then(r => {
+ assert_equals(r, undefined, "setSinkId resolves with undefined");
+ assert_equals(audio.sinkId, d.deviceId, "when it resolves, setSinkId updates sinkId to the requested deviceId");
+ assert_equals(acceptedDevice, 0, "only one output device can be set without permission");
+ acceptedDevice++;
+ promise_test(t => audio.setSinkId(d.deviceId), "resetting sinkid on same current value should always work");
+ promise_test(t => audio.setSinkId(""), "resetting sinkid on default audio output should always work");
+ }, e => {
+ assert_equals(e.name, "SecurityError", "On known devices, the only possible failure of setSinkId is a securityerror"); // assuming AbortError can't happen in the test environment by default
+ }), "Correctly reacts to setting known deviceid as sinkid " + i));
+ }), "List media devices");
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/auxclick/OWNERS b/tests/wpt/web-platform-tests/auxclick/OWNERS
deleted file mode 100644
index fe0105ee965..00000000000
--- a/tests/wpt/web-platform-tests/auxclick/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-@NavidZ
diff --git a/tests/wpt/web-platform-tests/background-fetch/content-security-policy.https.window.js b/tests/wpt/web-platform-tests/background-fetch/content-security-policy.https.window.js
new file mode 100644
index 00000000000..a6dc7c302c0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/background-fetch/content-security-policy.https.window.js
@@ -0,0 +1,20 @@
+// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
+// META: script=resources/utils.js
+'use strict';
+
+// Tests that requests blocked by Content Security Policy are rejected.
+// https://w3c.github.io/webappsec-csp/#should-block-request
+
+// This is not a comprehensive test of Content Security Policy - it is just
+// intended to check that CSP checks are enabled.
+
+var meta = document.createElement('meta');
+meta.setAttribute('http-equiv', 'Content-Security-Policy');
+meta.setAttribute('content', "connect-src 'none'");
+document.head.appendChild(meta);
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(
+ t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'https://example.com'));
+}, 'fetch blocked by CSP should reject');
diff --git a/tests/wpt/web-platform-tests/background-fetch/credentials-in-url.https.window.js b/tests/wpt/web-platform-tests/background-fetch/credentials-in-url.https.window.js
new file mode 100644
index 00000000000..28b37b340b9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/background-fetch/credentials-in-url.https.window.js
@@ -0,0 +1,32 @@
+// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
+// META: script=resources/utils.js
+'use strict';
+
+// "If parsedURL includes credentials, then throw a TypeError."
+// https://fetch.spec.whatwg.org/#dom-request
+// (Added by https://github.com/whatwg/fetch/issues/26).
+// "A URL includes credentials if its username or password is not the empty
+// string."
+// https://url.spec.whatwg.org/#include-credentials
+
+backgroundFetchTest((t, bgFetch) => {
+ return bgFetch.fetch(uniqueTag(), 'https://example.com');
+}, 'fetch without credentials in URL should register ok');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(
+ t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'https://username:password@example.com'));
+}, 'fetch with username and password in URL should reject');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(
+ t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'https://username:@example.com'));
+}, 'fetch with username and empty password in URL should reject');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(
+ t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'https://:password@example.com'));
+}, 'fetch with empty username and password in URL should reject');
diff --git a/tests/wpt/web-platform-tests/background-fetch/dangling-markup.https.window.js b/tests/wpt/web-platform-tests/background-fetch/dangling-markup.https.window.js
new file mode 100644
index 00000000000..af7c395d751
--- /dev/null
+++ b/tests/wpt/web-platform-tests/background-fetch/dangling-markup.https.window.js
@@ -0,0 +1,17 @@
+// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
+// META: script=resources/utils.js
+'use strict';
+
+// "If request's url's potentially-dangling-markup flag is set, and request's
+// url's scheme is an HTTP(S) scheme, then set response to a network error."
+// https://github.com/whatwg/fetch/pull/519
+// https://github.com/whatwg/fetch/issues/546
+
+// This is not a comprehensive test of dangling markup detection - it is just
+// intended to check that detection is enabled.
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(
+ t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'https://example.com/?\n<'));
+}, 'fetch to URL containing \\n and < should reject');
diff --git a/tests/wpt/web-platform-tests/background-fetch/interfaces.idl b/tests/wpt/web-platform-tests/background-fetch/interfaces.idl
index 56edb5d69d3..77cdfffcf00 100644
--- a/tests/wpt/web-platform-tests/background-fetch/interfaces.idl
+++ b/tests/wpt/web-platform-tests/background-fetch/interfaces.idl
@@ -1,23 +1,32 @@
-// 3.1. Extensions to ServiceWorkerRegistration
+// 4.1. Extensions to ServiceWorkerGlobalScope
+
+partial interface ServiceWorkerGlobalScope {
+ attribute EventHandler onbackgroundfetched;
+ attribute EventHandler onbackgroundfetchfail;
+ attribute EventHandler onbackgroundfetchabort;
+ attribute EventHandler onbackgroundfetchclick;
+};
+
+// 4.2. Extensions to ServiceWorkerRegistration
partial interface ServiceWorkerRegistration {
readonly attribute BackgroundFetchManager backgroundFetch;
};
-// 3.2. BackgroundFetchManager
+// 4.3. BackgroundFetchManager
[Exposed=(Window,Worker)]
interface BackgroundFetchManager {
- Promise<BackgroundFetchRegistration> fetch(DOMString tag, (RequestInfo or sequence<RequestInfo>) requests, optional BackgroundFetchOptions options);
- Promise<BackgroundFetchRegistration?> get(DOMString tag);
- Promise<FrozenArray<DOMString>> getTags();
+ Promise<BackgroundFetchRegistration> fetch(DOMString id, (RequestInfo or sequence<RequestInfo>) requests, optional BackgroundFetchOptions options);
+ Promise<BackgroundFetchRegistration?> get(DOMString id);
+ Promise<FrozenArray<DOMString>> getIds();
// TODO: in future this should become an async iterator for BackgroundFetchRegistration objects
};
dictionary BackgroundFetchOptions {
sequence<IconDefinition> icons;
DOMString title;
- long totalDownloadSize;
+ unsigned long long downloadTotal;
};
// This is taken from https://w3c.github.io/manifest/#icons-member.
@@ -28,82 +37,82 @@ dictionary IconDefinition {
DOMString type;
};
-// 3.3. BackgroundFetchRegistration
+// 4.4. BackgroundFetchRegistration
[Exposed=(Window,Worker)]
-interface BackgroundFetchRegistration {
- readonly attribute DOMString tag;
- readonly attribute FrozenArray<IconDefinition> icons;
- readonly attribute long totalDownloadSize;
- readonly attribute DOMString title;
- readonly attribute FrozenArray<BackgroundFetchActiveFetches> fetches;
+interface BackgroundFetchRegistration : EventTarget {
+ readonly attribute DOMString id;
+ readonly attribute unsigned long long uploadTotal;
+ readonly attribute unsigned long long uploaded;
+ readonly attribute unsigned long long downloadTotal;
+ readonly attribute unsigned long long downloaded;
+ readonly attribute BackgroundFetchActiveFetches activeFetches;
+
+ attribute EventHandler onprogress;
- void abort();
+ Promise<boolean> abort();
};
[Exposed=(Window,Worker)]
-interface BackgroundFetchFetches {
+interface BackgroundFetchFetch {
readonly attribute Request request;
};
[Exposed=(Window,Worker)]
-interface BackgroundFetchActiveFetches : BackgroundFetchFetches {
- readonly attribute Promise<Response> responseReady;
- // TODO: this will include fetch controller/observer objects
+interface BackgroundFetchActiveFetches {
+ Promise<BackgroundFetchActiveFetch> match(RequestInfo request);
+ Promise<FrozenArray<BackgroundFetchActiveFetch>> values();
};
-// 3.4. Events
-
-partial interface ServiceWorkerGlobalScope {
- attribute EventHandler onbackgroundfetched;
- attribute EventHandler onbackgroundfetchfail;
- attribute EventHandler onbackgroundfetchabort;
- attribute EventHandler onbackgroundfetchclick;
+[Exposed=(Window,Worker)]
+interface BackgroundFetchActiveFetch : BackgroundFetchFetch {
+ readonly attribute Promise<Response> responseReady;
+ // In future this will include a fetch observer
};
-// 3.4.1. BackgroundFetchEvent
+// 4.4.3. BackgroundFetchEvent
[Constructor(DOMString type, BackgroundFetchEventInit init), Exposed=ServiceWorker]
interface BackgroundFetchEvent : ExtendableEvent {
- readonly attribute DOMString tag;
+ readonly attribute DOMString id;
};
dictionary BackgroundFetchEventInit : ExtendableEventInit {
- required DOMString tag;
+ required DOMString id;
};
-// 3.4.2. BackgroundFetchEndEvent
+// 4.4.4. BackgroundFetchSettledEvent
-[Constructor(DOMString type, BackgroundFetchEndEventInit init), Exposed=ServiceWorker]
-interface BackgroundFetchEndEvent : BackgroundFetchEvent {
- readonly attribute FrozenArray<BackgroundFetchSettledFetches> completeFetches;
+[Constructor(DOMString type, BackgroundFetchSettledEventInit init), Exposed=ServiceWorker]
+interface BackgroundFetchSettledEvent : BackgroundFetchEvent {
+ readonly attribute BackgroundFetchSettledFetches fetches;
+};
- Promise<void> updateUI(DOMString title);
+dictionary BackgroundFetchSettledEventInit : BackgroundFetchEventInit {
+ required BackgroundFetchSettledFetches fetches;
};
-dictionary BackgroundFetchEndEventInit : BackgroundFetchEventInit {
- required BackgroundFetchSettledFetches completeFetches;
+[Exposed=ServiceWorker]
+interface BackgroundFetchSettledFetches {
+ Promise<BackgroundFetchSettledFetch> match(RequestInfo request);
+ Promise<FrozenArray<BackgroundFetchSettledFetch>> values();
};
[Exposed=ServiceWorker]
-interface BackgroundFetchSettledFetches : BackgroundFetchFetches {
+interface BackgroundFetchSettledFetch : BackgroundFetchFetch {
readonly attribute Response? response;
};
-// 3.4.3. BackgroundFetchFailEvent
+// 4.4.5. BackgroundFetchUpdateEvent
-[Constructor(DOMString type, BackgroundFetchEndEventInit init), Exposed=ServiceWorker]
-interface BackgroundFetchFailEvent : BackgroundFetchEndEvent {
- readonly attribute FrozenArray<BackgroundFetchSettledFetches> failedFetches;
-};
-
-dictionary BackgroundFetchFailEventInit : BackgroundFetchEndEventInit {
- required BackgroundFetchSettledFetches failedFetches;
+[Constructor(DOMString type, BackgroundFetchSettledEventInit init), Exposed=ServiceWorker]
+interface BackgroundFetchUpdateEvent : BackgroundFetchSettledEvent {
+ Promise<void> updateUI(DOMString title);
};
-// 3.4.4. BackgroundFetchClickEvent
+// 4.4.6. BackgroundFetchClickEvent
-[Constructor(DOMString type, BackgroundFetchEndEventInit init), Exposed=ServiceWorker]
+[Constructor(DOMString type, BackgroundFetchClickEventInit init), Exposed=ServiceWorker]
interface BackgroundFetchClickEvent : BackgroundFetchEvent {
readonly attribute BackgroundFetchState state;
};
diff --git a/tests/wpt/web-platform-tests/background-fetch/interfaces.worker.js b/tests/wpt/web-platform-tests/background-fetch/interfaces.worker.js
index d3145b9f6d2..a5fc4ed35fe 100644
--- a/tests/wpt/web-platform-tests/background-fetch/interfaces.worker.js
+++ b/tests/wpt/web-platform-tests/background-fetch/interfaces.worker.js
@@ -14,3 +14,5 @@ promise_test(function() {
idlArray.test();
});
}, 'Exposed interfaces in a Service Worker.');
+
+done();
diff --git a/tests/wpt/web-platform-tests/background-fetch/mixed-content-and-allowed-schemes.https.window.js b/tests/wpt/web-platform-tests/background-fetch/mixed-content-and-allowed-schemes.https.window.js
new file mode 100644
index 00000000000..50614a3565b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/background-fetch/mixed-content-and-allowed-schemes.https.window.js
@@ -0,0 +1,80 @@
+// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
+// META: script=resources/utils.js
+'use strict';
+
+// Tests that Mixed Content requests are blocked.
+// https://w3c.github.io/webappsec-mixed-content/#should-block-fetch
+// https://w3c.github.io/webappsec-mixed-content/#a-priori-authenticated-url
+// https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy
+
+// With an additional restriction that only https:// and loopback http://
+// requests are allowed. Hence the wss:, file:, data:, etc schemes are blocked.
+// https://github.com/WICG/background-fetch/issues/44
+
+// This is not a comprehensive test of mixed content blocking - it is just
+// intended to check that blocking is enabled.
+
+backgroundFetchTest((t, bgFetch) => {
+ return bgFetch.fetch(uniqueTag(), 'https://example.com');
+}, 'https: fetch should register ok');
+
+backgroundFetchTest((t, bgFetch) => {
+ return bgFetch.fetch(uniqueTag(), 'http://127.0.0.1');
+}, 'loopback IPv4 http: fetch should register ok');
+
+backgroundFetchTest((t, bgFetch) => {
+ return bgFetch.fetch(uniqueTag(), 'http://[::1]');
+}, 'loopback IPv6 http: fetch should register ok');
+
+// http://localhost is not tested here since the correct behavior from
+// https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy
+// depends on whether the UA conforms to the name resolution rules in
+// https://tools.ietf.org/html/draft-west-let-localhost-be-localhost
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'http://example.com'));
+}, 'non-loopback http: fetch should reject');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'http://192.0.2.0'));
+}, 'non-loopback IPv4 http: fetch should reject');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'http://[2001:db8::1]'));
+}, 'non-loopback IPv6 http: fetch should reject');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), ['https://example.com',
+ 'http://example.com']));
+}, 'https: and non-loopback http: fetch should reject');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), ['http://example.com',
+ 'https://example.com']));
+}, 'non-loopback http: and https: fetch should reject');
+
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'wss:127.0.0.1'));
+}, 'wss: fetch should reject');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'file:///'));
+}, 'file: fetch should reject');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'data:text/plain,foo'));
+}, 'data: fetch should reject');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'foobar:bazqux'));
+}, 'unknown scheme fetch should reject');
diff --git a/tests/wpt/web-platform-tests/background-fetch/port-blocking.https.window.js b/tests/wpt/web-platform-tests/background-fetch/port-blocking.https.window.js
new file mode 100644
index 00000000000..dbf8a1a4d9f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/background-fetch/port-blocking.https.window.js
@@ -0,0 +1,35 @@
+// META: script=/service-workers/service-worker/resources/test-helpers.sub.js
+// META: script=resources/utils.js
+'use strict';
+
+// Tests that requests to bad ports are blocked.
+// https://fetch.spec.whatwg.org/#port-blocking
+
+// This is not a comprehensive test of blocked ports - it is just intended to
+// check that blocking is enabled.
+
+backgroundFetchTest((t, bgFetch) => {
+ return bgFetch.fetch(uniqueTag(), 'https://example.com');
+}, 'fetch to default https port should register ok');
+
+backgroundFetchTest((t, bgFetch) => {
+ return bgFetch.fetch(uniqueTag(), 'http://127.0.0.1');
+}, 'fetch to default http port should register ok');
+
+backgroundFetchTest((t, bgFetch) => {
+ return bgFetch.fetch(uniqueTag(), 'https://example.com:443');
+}, 'fetch to port 443 should register ok');
+
+backgroundFetchTest((t, bgFetch) => {
+ return bgFetch.fetch(uniqueTag(), 'https://example.com:80');
+}, 'fetch to port 80 should register ok, even over https');
+
+backgroundFetchTest((t, bgFetch) => {
+ return bgFetch.fetch(uniqueTag(), 'https://example.com:8080');
+}, 'fetch to non-default non-bad port (8080) should register ok');
+
+backgroundFetchTest((t, bgFetch) => {
+ return promise_rejects(
+ t, new TypeError(),
+ bgFetch.fetch(uniqueTag(), 'https://example.com:587'));
+}, 'fetch to bad port (SMTP) should reject');
diff --git a/tests/wpt/web-platform-tests/background-fetch/resources/sw.js b/tests/wpt/web-platform-tests/background-fetch/resources/sw.js
new file mode 100644
index 00000000000..d4dc941796a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/background-fetch/resources/sw.js
@@ -0,0 +1 @@
+// Deliberately left empty for now. \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/background-fetch/resources/utils.js b/tests/wpt/web-platform-tests/background-fetch/resources/utils.js
new file mode 100644
index 00000000000..f630f1085d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/background-fetch/resources/utils.js
@@ -0,0 +1,26 @@
+'use strict';
+
+// Depends on /service-workers/service-worker/resources/test-helpers.sub.js
+async function registerAndActivateServiceWorker(test) {
+ const script = 'resources/sw.js';
+ const scope = 'resources/scope' + location.pathname;
+ let serviceWorkerRegistration =
+ await service_worker_unregister_and_register(test, script, scope);
+ add_completion_callback(() => {
+ serviceWorkerRegistration.unregister();
+ });
+ await wait_for_state(test, serviceWorkerRegistration.installing, 'activated');
+ return serviceWorkerRegistration;
+}
+
+function backgroundFetchTest(func, description) {
+ promise_test(async t => {
+ const serviceWorkerRegistration = await registerAndActivateServiceWorker(t);
+ return func(t, serviceWorkerRegistration.backgroundFetch);
+ }, description);
+}
+
+let _nextBackgroundFetchTag = 0;
+function uniqueTag() {
+ return 'tag' + _nextBackgroundFetchTag++;
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/battery-status/battery-interface-idlharness.https.html b/tests/wpt/web-platform-tests/battery-status/battery-interface-idlharness.https.html
index 5abda1971f3..3c587198f97 100644
--- a/tests/wpt/web-platform-tests/battery-status/battery-interface-idlharness.https.html
+++ b/tests/wpt/web-platform-tests/battery-status/battery-interface-idlharness.https.html
@@ -29,6 +29,7 @@ partial interface Navigator {
Promise<BatteryManager> getBattery ();
};
+[Exposed=Window]
interface BatteryManager : EventTarget {
readonly attribute boolean charging;
readonly attribute unrestricted double chargingTime;
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-basic-blob.html b/tests/wpt/web-platform-tests/beacon/beacon-basic-blob.html
new file mode 100644
index 00000000000..805ea63be25
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-basic-blob.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>W3C Beacon Basic Blob Test</title>
+ <meta name="timeout" content="long">
+ <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script src="/common/utils.js"></script>
+ <script src="beacon-common.sub.js"></script>
+ <script>
+ "use strict";
+ runTests(blobTests);
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-basic-blobMax.html b/tests/wpt/web-platform-tests/beacon/beacon-basic-blobMax.html
new file mode 100644
index 00000000000..e18b163d630
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-basic-blobMax.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>W3C Beacon Basic Blob Test - MaxSize</title>
+ <meta name="timeout" content="long">
+ <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script src="/common/utils.js"></script>
+ <script src="beacon-common.sub.js"></script>
+ <script>
+ "use strict";
+ runTests(blobMaxTest);
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-basic-buffersource.html b/tests/wpt/web-platform-tests/beacon/beacon-basic-buffersource.html
new file mode 100644
index 00000000000..14c7a4f30f8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-basic-buffersource.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>W3C Beacon Basic BufferSource Test</title>
+ <meta name="timeout" content="long">
+ <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script src="/common/utils.js"></script>
+ <script src="beacon-common.sub.js"></script>
+ <script>
+ "use strict";
+ runTests(bufferSourceTests);
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-basic-buffersourceMax.html b/tests/wpt/web-platform-tests/beacon/beacon-basic-buffersourceMax.html
new file mode 100644
index 00000000000..5163ecd75a9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-basic-buffersourceMax.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>W3C Beacon Basic BufferSource Test - MaxSize</title>
+ <meta name="timeout" content="long">
+ <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script src="/common/utils.js"></script>
+ <script src="beacon-common.sub.js"></script>
+ <script>
+ "use strict";
+ runTests(bufferSourceMaxTest);
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-basic-formdata.html b/tests/wpt/web-platform-tests/beacon/beacon-basic-formdata.html
new file mode 100644
index 00000000000..9f46cf6a793
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-basic-formdata.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>W3C Beacon Basic FormData Test</title>
+ <meta name="timeout" content="long">
+ <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script src="/common/utils.js"></script>
+ <script src="beacon-common.sub.js"></script>
+ <script>
+ "use strict";
+ runTests(formDataTests);
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-basic-formdataMax.html b/tests/wpt/web-platform-tests/beacon/beacon-basic-formdataMax.html
new file mode 100644
index 00000000000..2c7e0fa805c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-basic-formdataMax.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>W3C Beacon Basic FormData Test</title>
+ <meta name="timeout" content="long">
+ <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script src="/common/utils.js"></script>
+ <script src="beacon-common.sub.js"></script>
+ <script>
+ "use strict";
+ runTests(formDataMaxTest);
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-basic-string.html b/tests/wpt/web-platform-tests/beacon/beacon-basic-string.html
new file mode 100644
index 00000000000..cba65dade98
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-basic-string.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>W3C Beacon Basic String Test</title>
+ <meta name="timeout" content="long">
+ <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script src="/common/utils.js"></script>
+ <script src="beacon-common.sub.js"></script>
+ <script>
+ "use strict";
+ runTests(stringTests);
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-basic-stringMax.html b/tests/wpt/web-platform-tests/beacon/beacon-basic-stringMax.html
new file mode 100644
index 00000000000..005e9f5ce88
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-basic-stringMax.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>W3C Beacon Basic String Test - MaxSize</title>
+ <meta name="timeout" content="long">
+ <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script src="/common/utils.js"></script>
+ <script src="beacon-common.sub.js"></script>
+ <script>
+ "use strict";
+ runTests(stringMaxTest);
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-common.sub.js b/tests/wpt/web-platform-tests/beacon/beacon-common.sub.js
new file mode 100644
index 00000000000..de3846b6cbc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-common.sub.js
@@ -0,0 +1,354 @@
+"use strict";
+
+// Different sizes of payloads to test.
+var smallPayloadSize = 10;
+var mediumPayloadSize = 10000;
+var largePayloadSize = 50000;
+var maxPayloadSize = 65536; // The maximum payload size allowed for a beacon request.
+
+// String payloads of various sizes sent by sendbeacon. The format of the payloads is a string:
+// <numberOfCharacters>:<numberOfCharacters *'s>
+// ex. "10:**********"
+var smallPayload = smallPayloadSize + ":" + Array(smallPayloadSize).fill('*').join("");
+var mediumPayload = mediumPayloadSize + ":" + Array(mediumPayloadSize).fill('*').join("");
+var largePayload = largePayloadSize + ":" + Array(largePayloadSize).fill('*').join("");
+// Subtract 6 from maxPayloadSize because 65536 is 5 digits, plus 1 more for the ':'
+var maxPayload = (maxPayloadSize - 6) + ":" + Array(maxPayloadSize - 6).fill('*').join("")
+
+// Test case definitions.
+// id: String containing the unique name of the test case.
+// data: Payload object to send through sendbeacon.
+var noDataTest = { id: "NoData" };
+var nullDataTest = { id: "NullData", data: null };
+var undefinedDataTest = { id: "UndefinedData", data: undefined };
+var smallStringTest = { id: "SmallString", data: smallPayload };
+var mediumStringTest = { id: "MediumString", data: mediumPayload };
+var largeStringTest = { id: "LargeString", data: largePayload };
+var maxStringTest = { id: "MaxString", data: maxPayload };
+var emptyBlobTest = { id: "EmptyBlob", data: new Blob() };
+var smallBlobTest = { id: "SmallBlob", data: new Blob([smallPayload]) };
+var mediumBlobTest = { id: "MediumBlob", data: new Blob([mediumPayload]) };
+var largeBlobTest = { id: "LargeBlob", data: new Blob([largePayload]) };
+var maxBlobTest = { id: "MaxBlob", data: new Blob([maxPayload]) };
+var emptyBufferSourceTest = { id: "EmptyBufferSource", data: new Uint8Array() };
+var smallBufferSourceTest = { id: "SmallBufferSource", data: CreateArrayBufferFromPayload(smallPayload) };
+var mediumBufferSourceTest = { id: "MediumBufferSource", data: CreateArrayBufferFromPayload(mediumPayload) };
+var largeBufferSourceTest = { id: "LargeBufferSource", data: CreateArrayBufferFromPayload(largePayload) };
+var maxBufferSourceTest = { id: "MaxBufferSource", data: CreateArrayBufferFromPayload(maxPayload) };
+var emptyFormDataTest = { id: "EmptyFormData", data: CreateEmptyFormDataPayload() };
+var smallFormDataTest = { id: "SmallFormData", data: CreateFormDataFromPayload(smallPayload) };
+var mediumFormDataTest = { id: "MediumFormData", data: CreateFormDataFromPayload(mediumPayload) };
+var largeFormDataTest = { id: "LargeFormData", data: CreateFormDataFromPayload(largePayload) };
+// We don't test maxFormData because the extra multipart separators make it difficult to
+// calculate a maxPayload.
+
+// Test case suites.
+// Due to quota limits we split the max payload tests into their own bucket.
+var stringTests = [noDataTest, nullDataTest, undefinedDataTest, smallStringTest, mediumStringTest, largeStringTest];
+var stringMaxTest = [maxStringTest];
+var blobTests = [emptyBlobTest, smallBlobTest, mediumBlobTest, largeBlobTest];
+var blobMaxTest = [maxBlobTest];
+var bufferSourceTests = [emptyBufferSourceTest, smallBufferSourceTest, mediumBufferSourceTest, largeBufferSourceTest];
+var bufferSourceMaxTest = [maxBufferSourceTest];
+var formDataTests = [emptyFormDataTest, smallFormDataTest, mediumFormDataTest, largeFormDataTest];
+var formDataMaxTest = [largeFormDataTest];
+var allTests = [].concat(stringTests, stringMaxTest, blobTests, blobMaxTest, bufferSourceTests, bufferSourceMaxTest, formDataTests, formDataMaxTest);
+
+// This special cross section of test cases is meant to provide a slimmer but reasonably-
+// representative set of tests for parameterization across variables (e.g. redirect codes,
+// cors modes, etc.)
+var sampleTests = [noDataTest, nullDataTest, undefinedDataTest, smallStringTest, smallBlobTest, smallBufferSourceTest, smallFormDataTest];
+
+// Build a test lookup table, which is useful when instructing a web worker or an iframe
+// to run a test, so that we don't have to marshal the entire test case across a process boundary.
+var testLookup = {};
+allTests.forEach(function(testCase) {
+ testLookup[testCase.id] = testCase;
+});
+
+// Helper function to create an ArrayBuffer representation of a string.
+function CreateArrayBufferFromPayload(payload) {
+ var length = payload.length;
+ var buffer = new Uint8Array(length);
+
+ for (var i = 0; i < length; i++) {
+ buffer[i] = payload.charCodeAt(i);
+ }
+
+ return buffer;
+}
+
+// Helper function to create an empty FormData object.
+function CreateEmptyFormDataPayload() {
+ if (self.document === undefined) {
+ return null;
+ }
+
+ return new FormData();
+}
+
+// Helper function to create a FormData representation of a string.
+function CreateFormDataFromPayload(payload) {
+ if (self.document === undefined) {
+ return null;
+ }
+
+ var formData = new FormData();
+ formData.append("payload", payload);
+ return formData;
+}
+
+// Initializes a session with a client-generated SID.
+// A "session" is a run of one or more tests. It is used to batch several beacon
+// tests in a way that isolates the server-side session state and makes it easy
+// to poll the results of the tests in one request.
+// testCases: The array of test cases participating in the session.
+function initSession(testCases) {
+ return {
+ // Provides a unique session identifier to prevent mixing server-side data
+ // with other sessions.
+ id: self.token(),
+ // Dictionary of test name to live testCase object.
+ testCaseLookup: {},
+ // Array of testCase objects for iteration.
+ testCases: [],
+ // Tracks the total number of tests in the session.
+ totalCount: testCases.length,
+ // Tracks the number of tests for which we have sent the beacon.
+ // When it reaches totalCount, we will start polling for results.
+ sentCount: 0,
+ // Tracks the number of tests for which we have verified the results.
+ // When it reaches sentCount, we will stop polling for results.
+ doneCount: 0,
+ // Helper to add a testCase to the session.
+ add: function add(testCase) {
+ this.testCases.push(testCase);
+ this.testCaseLookup[testCase.id] = testCase;
+ }
+ };
+}
+
+// Schedules async_test's for each of the test cases, treating them as a single session,
+// and wires up the continueAfterSendingBeacon() and waitForResults() calls.
+// The method looks for several "extension" functions in the global scope:
+// - self.buildId: if present, can change the display name of a test.
+// - self.buildBaseUrl: if present, can change the base URL of a beacon target URL (this
+// is the scheme, hostname, and port).
+// - self.buildTargetUrl: if present, can modify a beacon target URL (for example wrap it).
+// Parameters:
+// testCases: An array of test cases.
+function runTests(testCases) {
+ var session = initSession(testCases);
+
+ testCases.forEach(function(testCase, testIndex) {
+ // Make a copy of the test case as we'll be storing some metadata on it,
+ // such as which session it belongs to.
+ var testCaseCopy = Object.assign({ session: session }, testCase);
+
+ // Extension point: generate the test id.
+ var testId = testCase.id;
+ if (self.buildId) {
+ testId = self.buildId(testId);
+ }
+ testCaseCopy.origId = testCaseCopy.id;
+ testCaseCopy.id = testId;
+ testCaseCopy.index = testIndex;
+
+ session.add(testCaseCopy);
+
+ // Schedule the sendbeacon in an async test.
+ async_test(function(test) {
+ // Save the testharness.js 'test' object, so that we only have one object
+ // to pass around.
+ testCaseCopy.test = test;
+
+ // Extension point: generate the beacon URL.
+ var baseUrl = "http://{{host}}:{{ports[http][0]}}";
+ if (self.buildBaseUrl) {
+ baseUrl = self.buildBaseUrl(baseUrl);
+ }
+ var targetUrl = `${baseUrl}/beacon/resources/beacon.py?cmd=store&sid=${session.id}&tid=${testId}&tidx=${testIndex}`;
+ if (self.buildTargetUrl) {
+ targetUrl = self.buildTargetUrl(targetUrl);
+ }
+ // Attach the URL to the test object for debugging purposes.
+ testCaseCopy.url = targetUrl;
+
+ // Extension point: send the beacon immediately, or defer.
+ var sendFunc = test.step_func(function sendImmediately(testCase) {
+ var sendResult = sendData(testCase);
+ continueAfterSendingBeacon(sendResult, testCase);
+ });
+ if (self.sendFunc) {
+ sendFunc = test.step_func(self.sendFunc);
+ }
+ sendFunc(testCaseCopy);
+ }, `Verify 'navigator.sendbeacon()' successfully sends for variant: ${testCaseCopy.id}`);
+ });
+}
+
+// Sends the beacon for a single test. This step is factored into its own function so that
+// it can be called from a web worker. It does not check for results.
+// Note: do not assert from this method, as when called from a worker, we won't have the
+// full testharness.js test context. Instead return 'false', and the main scope will fail
+// the test.
+// Returns the result of the 'sendbeacon()' function call, true or false.
+function sendData(testCase) {
+ var sent = false;
+ if (testCase.data) {
+ sent = self.navigator.sendBeacon(testCase.url, testCase.data);
+ } else {
+ sent = self.navigator.sendBeacon(testCase.url)
+ }
+ return sent;
+}
+
+// Continues a single test after the beacon has been sent for that test.
+// Will trigger waitForResults() for the session if this is the last test
+// in the session to send its beacon.
+// Assumption: will be called on the test's step_func so that assert's do
+// not have to be wrapped.
+function continueAfterSendingBeacon(sendResult, testCase) {
+ var session = testCase.session;
+
+ // Recaclulate the sent vs. total counts.
+ if (sendResult) {
+ session.sentCount++;
+ } else {
+ session.totalCount--;
+ }
+
+ // If this was the last test in the session to send its beacon, start polling for results.
+ // Note that we start polling even if just one test in the session sends successfully,
+ // so that if any of the others fail, we still get results from the tests that did send.
+ if (session.sentCount == session.totalCount) {
+ // Exit the current test's execution context in order to run the poll
+ // loop from the harness context.
+ step_timeout(waitForResults.bind(this, session), 0);
+ }
+
+ // Now fail this test if the beacon did not send. It will be excluded from the poll
+ // loop because of the calculation adjustment above.
+ assert_true(sendResult, "'sendbeacon' function call must succeed");
+}
+
+// Kicks off an asynchronous monitor to poll the server for test results. As we
+// verify that the server has received and validated a beacon, we will complete
+// its testharness test.
+function waitForResults(session) {
+ // Poll for status until all of the results come in.
+ fetch(`resources/beacon.py?cmd=stat&sid=${session.id}&tidx_min=0&tidx_max=${session.totalCount-1}`).then(
+ function(response) {
+ // Parse as text(), not json(), so that we can log the raw response if
+ // it's invalid.
+ response.text().then(function(rawResponse) {
+ // Check that we got a response we expect and know how to handle.
+ var results;
+ var failure;
+ try {
+ results = JSON.parse(rawResponse);
+
+ if (results.length === undefined) {
+ failure = `bad validation response schema: rawResponse='${rawResponse}'`;
+ }
+ } catch (e) {
+ failure = `bad validation response: rawResponse='${rawResponse}', got parse error '${e}'`;
+ }
+
+ if (failure) {
+ // At this point we can't deterministically get results for all of the
+ // tests in the session, so fail the entire session.
+ failSession(session, failure);
+ return;
+ }
+
+ // The 'stat' call will return an array of zero or more results
+ // of sendbeacon() calls that the server has received and validated.
+ results.forEach(function(result) {
+ var testCase = session.testCaseLookup[result.id];
+
+ // While stash.take on the server is supposed to honor read-once, since we're
+ // polling so frequently it is possible that we will receive the same test result
+ // more than once.
+ if (!testCase.done) {
+ testCase.done = true;
+ session.doneCount++;
+ }
+
+ // Validate that the sendbeacon() was actually sent to the server.
+ var test = testCase.test;
+ test.step(function() {
+ // null JSON values parse as null, not undefined
+ assert_equals(result.error, null, "'sendbeacon' data must not fail validation");
+ });
+
+ test.done();
+ });
+
+ // Continue polling until all of the results come in.
+ if (session.doneCount < session.sentCount) {
+ // testharness.js frowns upon the use of explicit timeouts, but there is no way
+ // around the need to poll for these tests, and there is no use spamming the server
+ // with requestAnimationFrame() just to avoid the use of step_timeout.
+ step_timeout(waitForResults.bind(this, session), 100);
+ }
+ }).catch(function(error) {
+ failSession(session, `unexpected error reading response, error='${error}'`);
+ });
+ }
+ );
+}
+
+// Fails all of the tests in the session, meant to be called when an infrastructural
+// issue prevents us from deterministically completing the individual tests.
+function failSession(session, reason) {
+ session.testCases.forEach(function(testCase) {
+ var test = testCase.test;
+ test.unreached_func(reason)();
+ });
+}
+
+// Creates an iframe on the document's body and runs the sample tests from the iframe.
+// The iframe is navigated immediately after it sends the data, and the window verifies
+// that the data is still successfully sent.
+// funcName: "beacon" to send the data via navigator.sendBeacon(),
+// "fetch" to send the data via fetch() with the keepalive flag.
+function runSendInIframeAndNavigateTests(funcName) {
+ var iframe = document.createElement("iframe");
+ iframe.id = "iframe";
+ iframe.onload = function() {
+ var tests = Array();
+
+ // Clear our onload handler to prevent re-running the tests as we navigate away.
+ this.onload = null;
+
+ // Implement the self.buildId extension to identify the parameterized
+ // test in the report.
+ self.buildId = function(baseId) {
+ return `${baseId}-${funcName}-NAVIGATE`;
+ };
+
+ window.onmessage = function(e) {
+ // The iframe will execute sendData() for us and return the result.
+ var testCase = tests[e.data];
+ continueAfterSendingBeacon(true /* sendResult */, testCase);
+ };
+
+ // Implement the self.sendFunc extension to send the beacon indirectly,
+ // from an iFrame that we can then navigate.
+ self.sendFunc = function(testCase) {
+ var iframeWindow = document.getElementById("iframe").contentWindow;
+ // We run into problems passing the testCase over the document boundary,
+ // because of structured cloning constraints. Instead we'll send over the
+ // test case id, and the iFrame can load the static test case by including
+ // beacon-common.js.
+ tests[testCase.origId] = testCase;
+ iframeWindow.postMessage([testCase.origId, testCase.url, funcName], "*");
+ };
+
+ runTests(sampleTests);
+ };
+
+ iframe.src = "navigate.iFrame.sub.html";
+ document.body.appendChild(iframe);
+}
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-cors.sub.window.js b/tests/wpt/web-platform-tests/beacon/beacon-cors.sub.window.js
new file mode 100644
index 00000000000..ddfdfbfa0a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-cors.sub.window.js
@@ -0,0 +1,41 @@
+// META: script=/common/utils.js
+// META: script=beacon-common.sub.js
+
+"use strict";
+
+// Execute each sample test with a cross-origin URL. If allowCors is 'true'
+// the beacon handler will return CORS headers. This test ensures that the
+// sendBeacon() succeeds in either case.
+[true, false].forEach(function(allowCors) {
+ // Implement the self.buildId extension to identify the parameterized
+ // test in the report.
+ self.buildId = function(baseId) {
+ return `${baseId}-${allowCors ? "CORS-ALLOW" : "CORS-FORBID"}`;
+ };
+
+ // Implement the self.buildBaseUrl and self.buildTargetUrl extensions
+ // to change the target URL to use a cross-origin domain name.
+ self.buildBaseUrl = function(baseUrl) {
+ return "http://{{domains[www]}}:{{ports[http][0]}}";
+ };
+ // Implement the self.buildTargetUrl extension to append a directive
+ // to the handler, that it should return CORS headers, if 'allowCors'
+ // is true.
+ self.buildTargetUrl = function(targetUrl) {
+ // Note that 'allowCors=true' is not necessary for the sendBeacon() to reach
+ // the server. Beacons use the HTTP POST method, which is a CORS-safelisted
+ // method, and thus they do not trigger preflight. If the server does not
+ // respond with Access-Control-Allow-Origin and Access-Control-Allow-Credentials
+ // headers, an error will be printed to the console, but the request will
+ // already have reached the server. Since beacons are fire-and-forget, the
+ // error will not affect any client script, either -- not even the return
+ // value of the sendBeacon() call, because the underlying fetch is asynchronous.
+ // The "Beacon CORS" tests are merely testing that sendBeacon() to a cross-
+ // origin URL *will* work regardless.
+ return allowCors ? `${targetUrl}&origin=http://{{host}}:{{ports[http][0]}}&credentials=true` : targetUrl;
+ }
+
+ runTests(sampleTests);
+});
+
+done(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-error.window.js b/tests/wpt/web-platform-tests/beacon/beacon-error.window.js
new file mode 100644
index 00000000000..9c037ba34f6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-error.window.js
@@ -0,0 +1,39 @@
+// META: script=/common/utils.js
+// META: script=beacon-common.sub.js
+
+"use strict";
+
+test(function() {
+ // Payload that should cause sendBeacon to return false because it exceeds the maximum payload size.
+ var exceedPayload = Array(maxPayloadSize + 1).fill('z').join("");
+
+ var success = navigator.sendBeacon("http://doesnotmatter", exceedPayload);
+ assert_false(success, "calling 'navigator.sendBeacon()' with payload size exceeding the maximum size must fail");
+}, "Verify calling 'navigator.sendBeacon()' with a large payload returns 'false'.");
+
+test(function() {
+ var invalidUrl = "http://invalid:url";
+ assert_throws(new TypeError(), function() { navigator.sendBeacon(invalidUrl, smallPayload); },
+ `calling 'navigator.sendBeacon()' with an invalid URL '${invalidUrl}' must throw a TypeError`);
+}, "Verify calling 'navigator.sendBeacon()' with an invalid URL throws an exception.");
+
+test(function() {
+ var invalidUrl = "nothttp://invalid.url";
+ assert_throws(new TypeError(), function() { navigator.sendBeacon(invalidUrl, smallPayload); },
+ `calling 'navigator.sendBeacon()' with a non-http(s) URL '${invalidUrl}' must throw a TypeError`);
+}, "Verify calling 'navigator.sendBeacon()' with a URL that is not a http(s) scheme throws an exception.");
+
+// We'll validate that we can send one beacon that uses our entire Quota and then fail to send one that is just one char.
+test(function () {
+ var destinationURL = "/fetch/api/resources/trickle.py?count=1&ms=1000";
+
+ var firstSuccess = navigator.sendBeacon(destinationURL, maxPayload);
+ assert_true(firstSuccess, "calling 'navigator.sendBeacon()' with our max payload size should succeed.");
+
+ // Now we'll send just one character.
+ var secondSuccess = navigator.sendBeacon(destinationURL, "1");
+ assert_false(secondSuccess, "calling 'navigator.sendBeacon()' with just one char should fail while our Quota is used up.");
+
+}, "Verify calling 'navigator.sendBeacon()' with a small payload fails while Quota is completely utilized.");
+
+done();
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-navigate.html b/tests/wpt/web-platform-tests/beacon/beacon-navigate.html
new file mode 100644
index 00000000000..5df13905978
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-navigate.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>W3C Beacon Outliving Navigation Test</title>
+ <meta name="timeout" content="long">
+ <meta name="author" title="Microsoft Edge" href="https://www.microsoft.com">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script src="/common/utils.js"></script>
+ <script src="beacon-common.sub.js"></script>
+ <script>
+ "use strict";
+
+ runSendInIframeAndNavigateTests("beacon");
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/beacon/beacon-redirect.window.js b/tests/wpt/web-platform-tests/beacon/beacon-redirect.window.js
new file mode 100644
index 00000000000..659759baa3f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/beacon-redirect.window.js
@@ -0,0 +1,25 @@
+// META: script=/common/utils.js
+// META: script=beacon-common.sub.js
+
+"use strict";
+
+// Execute each sample test per redirect status code.
+// Note that status codes 307 and 308 are the only codes that will maintain POST data
+// through a redirect.
+[307, 308].forEach(function(status) {
+ // Implement the self.buildId extension to identify the parameterized
+ // test in the report.
+ self.buildId = function(baseId) {
+ return `${baseId}-${status}`;
+ };
+
+ // Implement the self.buildTargetUrl extension to inject a redirect to
+ // the sendBeacon target.
+ self.buildTargetUrl = function(targetUrl) {
+ return `/common/redirect.py?status=${status}&location=${encodeURIComponent(targetUrl)}`;
+ };
+
+ runTests(sampleTests);
+});
+
+done();
diff --git a/tests/wpt/web-platform-tests/beacon/headers/header-content-type.html b/tests/wpt/web-platform-tests/beacon/headers/header-content-type.html
index 4912675b794..2d23adfb712 100644
--- a/tests/wpt/web-platform-tests/beacon/headers/header-content-type.html
+++ b/tests/wpt/web-platform-tests/beacon/headers/header-content-type.html
@@ -27,27 +27,46 @@ function pollResult(test, id) {
}
function testContentTypeHeader(what, contentType, title) {
- var testBase = get_host_info().HTTP_REMOTE_ORIGIN + RESOURCES_DIR;
+ var testBase = RESOURCES_DIR;
var id = self.token();
var testUrl = testBase + "content-type.py?cmd=put&id=" + id;
promise_test(function(test) {
assert_true(navigator.sendBeacon(testUrl, what), "SendBeacon Succeeded");
return pollResult(test, id) .then(result => {
- assert_true(result.startsWith(contentType), "Correct referrer header result");
+ if (contentType == "multipart/form-data") {
+ assert_true(result.startsWith(contentType), "Correct Content-Type header result");
+ } else {
+ assert_equals(result, contentType, "Correct Content-Type header result");
+ }
});
}, "Test content-type header for a body " + title);
}
+function stringToArrayBufferView(input) {
+ var buffer = new ArrayBuffer(input.length * 2);
+ var view = new Uint16Array(buffer);
+
+ // dumbly copy over the bytes
+ for (var i = 0, len = input.length; i < len; i++) {
+ view[i] = input.charCodeAt(i);
+ }
+ return view;
+}
+
function stringToArrayBuffer(input) {
var buffer = new ArrayBuffer(input.length * 2);
- var array = new Uint16Array(buffer);
+ var view = new Uint16Array(buffer);
// dumbly copy over the bytes
for (var i = 0, len = input.length; i < len; i++) {
- array[i] = input.charCodeAt(i);
+ view[i] = input.charCodeAt(i);
}
- return array;
+ return buffer;
+}
+
+function stringToBlob(input) {
+ return new Blob([input], {type: "text/plain"});
}
function stringToFormData(input) {
@@ -56,9 +75,17 @@ function stringToFormData(input) {
return formdata;
}
+function stringToURLSearchParams(input)
+{
+ return new URLSearchParams(input);
+}
+
testContentTypeHeader("hi!", "text/plain;charset=UTF-8", "string");
+testContentTypeHeader(stringToArrayBufferView("123"), "", "ArrayBufferView");
testContentTypeHeader(stringToArrayBuffer("123"), "", "ArrayBuffer");
+testContentTypeHeader(stringToBlob("123"), "text/plain", "Blob");
testContentTypeHeader(stringToFormData("qwerty"), "multipart/form-data", "FormData");
+testContentTypeHeader(stringToURLSearchParams("key1=value1&key2=value2"), "application/x-www-form-urlencoded;charset=UTF-8", "URLSearchParams");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/beacon/navigate.iFrame.sub.html b/tests/wpt/web-platform-tests/beacon/navigate.iFrame.sub.html
new file mode 100644
index 00000000000..f4c7846e522
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/navigate.iFrame.sub.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>W3C Beacon As Fetch (Fetch KeepAlive) Navigate Test</title>
+</head>
+<body>
+ <script src="beacon-common.sub.js"></script>
+ <script>
+ "use strict";
+
+ // An array should be passed through postMessage to this iFrame, where
+ // [0] contains a test case id as defined in beacon-common.js.
+ // [1] is the URL for the keep alive fetch() or sendBeacon().
+ // [2] string indicating the function to call - "fetch" to call fetch() or "beacon" to call sendBeacon().
+ // The testcase id is returned back to the window through postMesage.
+ var tests = 0;
+ window.onmessage = function(e) {
+ var testCaseId = e.data[0];
+ var url = e.data[1];
+ var func = e.data[2];
+ tests++;
+
+ // Reconstruct enough of the test case to send the keep alive fetch (data and url).
+ var testCase = testLookup[testCaseId];
+ testCase.url = url;
+
+ if (func === "beacon") {
+ // sendData calls sendBeacon
+ sendData(testCase);
+ }
+ else {
+ throw new Error(func + " is an invalid function");
+ }
+
+ // Let the main page continue the test if we don't immediately throw an exception.
+ parent.postMessage(testCaseId, "*");
+
+ // Now navigate ourselves.
+ if (tests == sampleTests.length) {
+ window.location = "http://{{host}}:{{ports[http][0]}}/";
+ }
+ }
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/beacon/resources/beacon.py b/tests/wpt/web-platform-tests/beacon/resources/beacon.py
new file mode 100644
index 00000000000..afa522a2a91
--- /dev/null
+++ b/tests/wpt/web-platform-tests/beacon/resources/beacon.py
@@ -0,0 +1,112 @@
+import json
+
+def build_stash_key(session_id, test_num):
+ return "%s_%s" % (session_id, test_num)
+
+def main(request, response):
+ """Helper handler for Beacon tests.
+
+ It handles two forms of requests:
+
+ STORE:
+ A URL with a query string of the form 'cmd=store&sid=<token>&tidx=<test_index>&tid=<test_name>'.
+
+ Stores the receipt of a sendBeacon() request along with its validation result, returning HTTP 200 OK.
+
+ Parameters:
+ tidx - the integer index of the test.
+ tid - a friendly identifier or name for the test, used when returning results.
+
+ STAT:
+ A URL with a query string of the form 'cmd=stat&sid=<token>&tidx_min=<min_test_index>&tidx_max=<max_test_index>'.
+
+ Retrieves the results of test with indices [min_test_index, max_test_index] and returns them as
+ a JSON array and HTTP 200 OK status code. Due to the eventual read-once nature of the stash, results for a given test
+ are only guaranteed to be returned once, though they may be returned multiple times.
+
+ Parameters:
+ tidx_min - the lower-bounding integer test index.
+ tidx_max - the upper-bounding integer test index.
+
+ Example response body:
+ [{"id": "Test1", error: null}, {"id": "Test2", error: "some validation details"}]
+
+ Common parameters:
+ cmd - the command, 'store' or 'stat'.
+ sid - session id used to provide isolation to a test run comprising multiple sendBeacon()
+ tests.
+ """
+
+ session_id = request.GET.first("sid");
+ command = request.GET.first("cmd").lower();
+
+ # Workaround to circumvent the limitation that cache keys
+ # can only be UUID's.
+ def wrap_key(key, path):
+ return (str(path), str(key))
+ request.server.stash._wrap_key = wrap_key
+
+ # Append CORS headers if needed.
+ if "origin" in request.GET:
+ response.headers.set("Access-Control-Allow-Origin", request.GET.first("origin"))
+ if "credentials" in request.GET:
+ response.headers.set("Access-Control-Allow-Credentials", request.GET.first("credentials"))
+
+ # Handle the 'store' and 'stat' commands.
+ if command == "store":
+ # The test id is just used to make the results more human-readable.
+ test_id = request.GET.first("tid")
+ # The test index is used to build a predictable stash key, together
+ # with the unique session id, in order to retrieve a range of results
+ # later knowing the index range.
+ test_idx = request.GET.first("tidx")
+
+ test_data_key = build_stash_key(session_id, test_idx)
+ test_data = { "id": test_id, "error": None }
+
+ payload = ""
+ if "Content-Type" in request.headers and \
+ "form-data" in request.headers["Content-Type"]:
+ if "payload" in request.POST:
+ # The payload was sent as a FormData.
+ payload = request.POST.first("payload")
+ else:
+ # A FormData was sent with an empty payload.
+ pass
+ else:
+ # The payload was sent as either a string, Blob, or BufferSource.
+ payload = request.body
+
+ payload_parts = filter(None, payload.split(":"))
+ if len(payload_parts) > 0:
+ payload_size = int(payload_parts[0])
+
+ # Confirm the payload size sent matches with the number of characters sent.
+ if payload_size != len(payload_parts[1]):
+ test_data["error"] = "expected %d characters but got %d" % (payload_size, len(payload_parts[1]))
+ else:
+ # Confirm the payload contains the correct characters.
+ for i in range(0, payload_size):
+ if payload_parts[1][i] != "*":
+ test_data["error"] = "expected '*' at index %d but got '%s''" % (i, payload_parts[1][i])
+ break
+
+ # Store the result in the stash so that it can be retrieved
+ # later with a 'stat' command.
+ request.server.stash.put(test_data_key, test_data)
+ elif command == "stat":
+ test_idx_min = int(request.GET.first("tidx_min"))
+ test_idx_max = int(request.GET.first("tidx_max"))
+
+ # For each result that has come in, append it to the response.
+ results = []
+ for test_idx in range(test_idx_min, test_idx_max+1): # +1 because end is exclusive
+ test_data_key = build_stash_key(session_id, test_idx)
+ test_data = request.server.stash.take(test_data_key)
+ if test_data:
+ results.append(test_data)
+
+ response.headers.set("Content-Type", "text/plain")
+ response.content = json.dumps(results)
+ else:
+ response.status = 400 # BadRequest \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/check_stability.ini b/tests/wpt/web-platform-tests/check_stability.ini
index cf18896a0b6..f5ec030149b 100644
--- a/tests/wpt/web-platform-tests/check_stability.ini
+++ b/tests/wpt/web-platform-tests/check_stability.ini
@@ -7,3 +7,4 @@ skip_tests: conformance-checkers docs tools
# (particularly in terms of execution time), making it impractical in most
# cases.
ignore_changes: resources
+results_url: https://pulls.web-platform-tests.org/api/stability
diff --git a/tests/wpt/web-platform-tests/check_stability.py b/tests/wpt/web-platform-tests/check_stability.py
deleted file mode 100644
index af8d527834c..00000000000
--- a/tests/wpt/web-platform-tests/check_stability.py
+++ /dev/null
@@ -1,997 +0,0 @@
-from __future__ import print_function
-
-import argparse
-import logging
-import os
-import re
-import stat
-import subprocess
-import sys
-import tarfile
-import zipfile
-from ConfigParser import RawConfigParser, SafeConfigParser
-from abc import ABCMeta, abstractmethod
-from cStringIO import StringIO as CStringIO
-from collections import defaultdict, OrderedDict
-from io import BytesIO, StringIO
-
-import requests
-
-BaseHandler = None
-LogActionFilter = None
-LogHandler = None
-LogLevelFilter = None
-StreamHandler = None
-TbplFormatter = None
-manifest = None
-reader = None
-wptcommandline = None
-wptrunner = None
-wpt_root = None
-wptrunner_root = None
-
-logger = None
-
-
-def do_delayed_imports():
- """Import and set up modules only needed if execution gets to this point."""
- global BaseHandler
- global LogLevelFilter
- global StreamHandler
- global TbplFormatter
- global manifest
- global reader
- global wptcommandline
- global wptrunner
- from mozlog import reader
- from mozlog.formatters import TbplFormatter
- from mozlog.handlers import BaseHandler, LogLevelFilter, StreamHandler
- from tools.manifest import manifest
- from wptrunner import wptcommandline, wptrunner
- setup_log_handler()
- setup_action_filter()
-
-
-def setup_logging():
- """Set up basic debug logger."""
- handler = logging.StreamHandler(sys.stdout)
- formatter = logging.Formatter(logging.BASIC_FORMAT, None)
- handler.setFormatter(formatter)
- logger.addHandler(handler)
- logger.setLevel(logging.DEBUG)
-
-
-def setup_action_filter():
- """Create global LogActionFilter class as part of deferred module load."""
- global LogActionFilter
-
- class LogActionFilter(BaseHandler):
-
- """Handler that filters out messages not of a given set of actions.
-
- Subclasses BaseHandler.
-
- :param inner: Handler to use for messages that pass this filter
- :param actions: List of actions for which to fire the handler
- """
-
- def __init__(self, inner, actions):
- """Extend BaseHandler and set inner and actions props on self."""
- BaseHandler.__init__(self, inner)
- self.inner = inner
- self.actions = actions
-
- def __call__(self, item):
- """Invoke handler if action is in list passed as constructor param."""
- if item["action"] in self.actions:
- return self.inner(item)
-
-
-class TravisFold(object):
-
- """Context for TravisCI folding mechanism. Subclasses object.
-
- See: https://blog.travis-ci.com/2013-05-22-improving-build-visibility-log-folds/
- """
-
- def __init__(self, name):
- """Register TravisCI folding section name."""
- self.name = name
-
- def __enter__(self):
- """Emit fold start syntax."""
- print("travis_fold:start:%s" % self.name, file=sys.stderr)
-
- def __exit__(self, type, value, traceback):
- """Emit fold end syntax."""
- print("travis_fold:end:%s" % self.name, file=sys.stderr)
-
-
-class FilteredIO(object):
- """Wrap a file object, invoking the provided callback for every call to
- `write` and only proceeding with the operation when that callback returns
- True."""
- def __init__(self, original, on_write):
- self.original = original
- self.on_write = on_write
-
- def __getattr__(self, name):
- return getattr(self.original, name)
-
- def disable(self):
- self.write = lambda msg: None
-
- def write(self, msg):
- encoded = msg.encode("utf8", "backslashreplace").decode("utf8")
- if self.on_write(self.original, encoded) is True:
- self.original.write(encoded)
-
-
-def replace_streams(capacity, warning_msg):
- # Value must be boxed to support modification from inner function scope
- count = [0]
- capacity -= 2 + len(warning_msg)
- stderr = sys.stderr
-
- def on_write(handle, msg):
- length = len(msg)
- count[0] += length
-
- if count[0] > capacity:
- wrapped_stdout.disable()
- wrapped_stderr.disable()
- handle.write(msg[0:capacity - count[0]])
- handle.flush()
- stderr.write("\n%s\n" % warning_msg)
- return False
-
- return True
-
- # Store local references to the replaced streams to guard against the case
- # where other code replace the global references.
- sys.stdout = wrapped_stdout = FilteredIO(sys.stdout, on_write)
- sys.stderr = wrapped_stderr = FilteredIO(sys.stderr, on_write)
-
-
-class Browser(object):
- __metaclass__ = ABCMeta
-
- @abstractmethod
- def install(self):
- return NotImplemented
-
- @abstractmethod
- def install_webdriver(self):
- return NotImplemented
-
- @abstractmethod
- def version(self):
- return NotImplemented
-
- @abstractmethod
- def wptrunner_args(self):
- return NotImplemented
-
-
-class Firefox(Browser):
- """Firefox-specific interface.
-
- Includes installation, webdriver installation, and wptrunner setup methods.
- """
-
- product = "firefox"
- binary = "%s/firefox/firefox"
- platform_ini = "%s/firefox/platform.ini"
-
- def __init__(self, **kwargs):
- pass
-
- def install(self):
- """Install Firefox."""
- call("pip", "install", "-r", os.path.join(wptrunner_root, "requirements_firefox.txt"))
- index = get("https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/")
- latest = re.compile("<a[^>]*>(firefox-\d+\.\d(?:\w\d)?.en-US.linux-x86_64\.tar\.bz2)</a>")
- filename = latest.search(index.text).group(1)
- resp = get("https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/%s" %
- filename)
- 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(wptrunner_root, "requirements_firefox.txt"))
-
- def _latest_geckodriver_version(self):
- """Get and return latest version number for geckodriver."""
- # 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):
- """Install latest Geckodriver."""
- 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 version(self, root):
- """Retrieve the release version of the installed browser."""
- platform_info = RawConfigParser()
-
- with open(self.platform_ini % root, "r") as fp:
- platform_info.readfp(BytesIO(fp.read()))
- return "BuildID %s; SourceStamp %s" % (
- platform_info.get("Build", "BuildID"),
- platform_info.get("Build", "SourceStamp"))
-
- def wptrunner_args(self, root):
- """Return Firefox-specific wpt-runner arguments."""
- return {
- "product": "firefox",
- "binary": self.binary % root,
- "certutil_binary": "certutil",
- "webdriver_binary": "%s/geckodriver" % root,
- "prefs_root": "%s/profiles" % root,
- }
-
-
-class Chrome(Browser):
- """Chrome-specific interface.
-
- Includes installation, webdriver installation, and wptrunner setup methods.
- """
-
- product = "chrome"
- binary = "/usr/bin/google-chrome"
-
- def __init__(self, **kwargs):
- pass
-
- def install(self):
- """Install Chrome."""
-
- # Installing the Google Chrome browser requires administrative
- # privileges, so that installation is handled by the invoking script.
-
- call("pip", "install", "-r", os.path.join(wptrunner_root, "requirements_chrome.txt"))
-
- def install_webdriver(self):
- """Install latest Webdriver."""
- 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 version(self, root):
- """Retrieve the release version of the installed browser."""
- output = call(self.binary, "--version")
- return re.search(r"[0-9\.]+( [a-z]+)?$", output.strip()).group(0)
-
- def wptrunner_args(self, root):
- """Return Chrome-specific wpt-runner arguments."""
- return {
- "product": "chrome",
- "binary": self.binary,
- "webdriver_binary": "%s/chromedriver" % root,
- "test_types": ["testharness", "reftest"]
- }
-
-
-class Sauce(Browser):
- """Sauce-specific interface.
-
- Includes installation and wptrunner setup methods.
- """
-
- product = "sauce"
-
- def __init__(self, **kwargs):
- browser = kwargs["product"].split(":")
- self.browser_name = browser[1]
- self.browser_version = browser[2]
- self.sauce_platform = kwargs["sauce_platform"]
- self.sauce_build = kwargs["sauce_build_number"]
- self.sauce_key = kwargs["sauce_key"]
- self.sauce_user = kwargs["sauce_user"]
- self.sauce_build_tags = kwargs["sauce_build_tags"]
- self.sauce_tunnel_id = kwargs["sauce_tunnel_identifier"]
-
- def install(self):
- """Install sauce selenium python deps."""
- call("pip", "install", "-r", os.path.join(wptrunner_root, "requirements_sauce.txt"))
-
- def install_webdriver(self):
- """No need to install webdriver locally."""
- pass
-
- def version(self, root):
- """Retrieve the release version of the browser under test."""
- return self.browser_version
-
- def wptrunner_args(self, root):
- """Return Sauce-specific wptrunner arguments."""
- return {
- "product": "sauce",
- "sauce_browser": self.browser_name,
- "sauce_build": self.sauce_build,
- "sauce_key": self.sauce_key,
- "sauce_platform": self.sauce_platform,
- "sauce_tags": self.sauce_build_tags,
- "sauce_tunnel_id": self.sauce_tunnel_id,
- "sauce_user": self.sauce_user,
- "sauce_version": self.browser_version,
- "test_types": ["testharness", "reftest"]
- }
-
-
-def get(url):
- """Issue GET request to a given URL and return the response."""
- logger.debug("GET %s" % url)
- resp = requests.get(url, stream=True)
- resp.raise_for_status()
- return resp
-
-
-def call(*args):
- """Log terminal command, invoke it as a subprocess.
-
- Returns a bytestring of the subprocess output if no error.
- """
- logger.debug("%s" % " ".join(args))
- try:
- return subprocess.check_output(args)
- except subprocess.CalledProcessError as e:
- logger.critical("%s exited with return code %i" %
- (e.cmd, e.returncode))
- logger.critical(e.output)
- raise
-
-
-def get_git_cmd(repo_path):
- """Create a function for invoking git commands as a subprocess."""
- def git(cmd, *args):
- full_cmd = ["git", cmd] + list(args)
- try:
- logger.debug(" ".join(full_cmd))
- return subprocess.check_output(full_cmd, cwd=repo_path, stderr=subprocess.STDOUT).strip()
- 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):
- """Attempt to use file.seek on given file, with fallbacks."""
- try:
- fileobj.seek(fileobj.tell())
- except Exception:
- return CStringIO(fileobj.read())
- else:
- return fileobj
-
-
-def untar(fileobj):
- """Extract tar archive."""
- logger.debug("untar")
- fileobj = seekable(fileobj)
- with tarfile.open(fileobj=fileobj) as tar_data:
- tar_data.extractall()
-
-
-def unzip(fileobj):
- """Extract zip archive."""
- 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)
-
-
-class pwd(object):
- """Create context for temporarily changing present working directory."""
- 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(user, *args):
- git = get_git_cmd(wpt_root)
- git("fetch", "https://github.com/%s/web-platform-tests.git" % user, *args)
-
-
-def get_sha1():
- """ Get and return sha1 of current git branch HEAD commit."""
- git = get_git_cmd(wpt_root)
- return git("rev-parse", "HEAD").strip()
-
-
-def build_manifest():
- """Build manifest of all files in web-platform-tests"""
- with pwd(wpt_root):
- # TODO: Call the manifest code directly
- call("python", "manifest")
-
-
-def install_wptrunner():
- """Install wptrunner."""
- call("pip", "install", wptrunner_root)
-
-
-def get_branch_point(user):
- git = get_git_cmd(wpt_root)
- if os.environ.get("TRAVIS_PULL_REQUEST", "false") != "false":
- # This is a PR, so the base branch is in TRAVIS_BRANCH
- travis_branch = os.environ.get("TRAVIS_BRANCH")
- assert travis_branch, "TRAVIS_BRANCH environment variable is defined"
- branch_point = git("rev-parse", travis_branch)
- else:
- # Otherwise we aren't on a PR, so we try to find commits that are only in the
- # current branch c.f.
- # http://stackoverflow.com/questions/13460152/find-first-ancestor-commit-in-another-branch
- head = git("rev-parse", "HEAD")
- # To do this we need all the commits in the local copy
- fetch_args = [user, "+refs/heads/*:refs/remotes/origin/*"]
- if os.path.exists(os.path.join(wpt_root, ".git", "shallow")):
- fetch_args.insert(1, "--unshallow")
- fetch_wpt(*fetch_args)
- not_heads = [item for item in git("rev-parse", "--not", "--all").split("\n")
- if item.strip() and not head in item]
- commits = git("rev-list", "HEAD", *not_heads).split("\n")
- branch_point = None
- if len(commits):
- first_commit = commits[-1]
- if first_commit:
- branch_point = git("rev-parse", first_commit + "^")
-
- # The above heuristic will fail in the following cases:
- #
- # - The current branch has fallen behind the version retrieved via the above
- # `fetch` invocation
- # - Changes on the current branch were rebased and therefore do not exist on any
- # other branch. This will result in the selection of a commit that is earlier
- # in the history than desired (as determined by calculating the later of the
- # branch point and the merge base)
- #
- # In either case, fall back to using the merge base as the branch point.
- merge_base = git("merge-base", "HEAD", "origin/master")
- if (branch_point is None or
- (branch_point != merge_base and
- not git("log", "--oneline", "%s..%s" % (merge_base, branch_point)).strip())):
- logger.debug("Using merge-base as the branch point")
- branch_point = merge_base
- else:
- logger.debug("Using first commit on another branch as the branch point")
-
- logger.debug("Branch point from master: %s" % branch_point)
- return branch_point
-
-
-def get_files_changed(branch_point, ignore_changes):
- """Get and return files changed since current branch diverged from master,
- excluding those that are located within any directory specifed by
- `ignore_changes`."""
- root = os.path.abspath(os.curdir)
- git = get_git_cmd(wpt_root)
- files = git("diff", "--name-only", "-z", "%s..." % branch_point)
- if not files:
- return [], []
- assert files[-1] == "\0"
-
- changed = []
- ignored = []
- for item in files[:-1].split("\0"):
- fullpath = os.path.join(wpt_root, item)
- topmost_dir = item.split(os.sep, 1)[0]
- if topmost_dir in ignore_changes:
- ignored.append(fullpath)
- else:
- changed.append(fullpath)
-
- return changed, ignored
-
-
-def _in_repo_root(full_path):
- rel_path = os.path.relpath(full_path, wpt_root)
- path_components = rel_path.split(os.sep)
- return len(path_components) < 2
-
-
-def get_affected_testfiles(files_changed, skip_tests):
- """Determine and return list of test files that reference changed files."""
- affected_testfiles = set()
- # Exclude files that are in the repo root, because
- # they are not part of any test.
- files_changed = [f for f in files_changed if not _in_repo_root(f)]
- nontests_changed = set(files_changed)
- manifest_file = os.path.join(wpt_root, "MANIFEST.json")
- test_types = ["testharness", "reftest", "wdspec"]
-
- wpt_manifest = manifest.load(wpt_root, manifest_file)
-
- support_files = {os.path.join(wpt_root, path)
- for _, path, _ in wpt_manifest.itertypes("support")}
- wdspec_test_files = {os.path.join(wpt_root, path)
- for _, path, _ in wpt_manifest.itertypes("wdspec")}
- test_files = {os.path.join(wpt_root, path)
- for _, path, _ in wpt_manifest.itertypes(*test_types)}
-
- nontests_changed = nontests_changed.intersection(support_files)
-
- nontest_changed_paths = set()
- for full_path in nontests_changed:
- rel_path = os.path.relpath(full_path, wpt_root)
- path_components = rel_path.split(os.sep)
- top_level_subdir = path_components[0]
- if top_level_subdir in skip_tests:
- continue
- repo_path = "/" + os.path.relpath(full_path, wpt_root).replace(os.path.sep, "/")
- nontest_changed_paths.add((full_path, repo_path))
-
- def affected_by_wdspec(test):
- affected = False
- if test in wdspec_test_files:
- for support_full_path, _ in nontest_changed_paths:
- # parent of support file or of "support" directory
- parent = os.path.dirname(support_full_path)
- if os.path.basename(parent) == "support":
- parent = os.path.dirname(parent)
- relpath = os.path.relpath(test, parent)
- if not relpath.startswith(os.pardir):
- # testfile is in subtree of support file
- affected = True
- break
- return affected
-
- for root, dirs, fnames in os.walk(wpt_root):
- # Walk top_level_subdir looking for test files containing either the
- # relative filepath or absolute filepath to the changed files.
- if root == wpt_root:
- for dir_name in skip_tests:
- dirs.remove(dir_name)
- for fname in fnames:
- test_full_path = os.path.join(root, fname)
- # Skip any file that's not a test file.
- if test_full_path not in test_files:
- continue
- if affected_by_wdspec(test_full_path):
- affected_testfiles.add(test_full_path)
- continue
-
- with open(test_full_path, "rb") as fh:
- file_contents = fh.read()
- if file_contents.startswith("\xfe\xff"):
- file_contents = file_contents.decode("utf-16be")
- elif file_contents.startswith("\xff\xfe"):
- file_contents = file_contents.decode("utf-16le")
- for full_path, repo_path in nontest_changed_paths:
- rel_path = os.path.relpath(full_path, root).replace(os.path.sep, "/")
- if rel_path in file_contents or repo_path in file_contents:
- affected_testfiles.add(test_full_path)
- continue
- return affected_testfiles
-
-
-def wptrunner_args(root, files_changed, iterations, browser):
- """Derive and return arguments for wpt-runner."""
- parser = wptcommandline.create_parser([browser.product])
- args = vars(parser.parse_args([]))
- args.update(browser.wptrunner_args(root))
- args.update({
- "tests_root": wpt_root,
- "metadata_root": wpt_root,
- "repeat": iterations,
- "config": "%s//wptrunner.default.ini" % (wptrunner_root),
- "test_list": files_changed,
- "restart_on_unexpected": False,
- "pause_after_test": False
- })
- wptcommandline.check_args(args)
- return args
-
-
-def setup_log_handler():
- """Set up LogHandler class as part of deferred module load."""
- global LogHandler
-
- class LogHandler(reader.LogHandler):
-
- """Handle updating test and subtest status in log.
-
- Subclasses reader.LogHandler.
- """
- def __init__(self):
- self.results = OrderedDict()
-
- def find_or_create_test(self, data):
- test_name = data["test"]
- if self.results.get(test_name):
- return self.results[test_name]
-
- test = {
- "subtests": OrderedDict(),
- "status": defaultdict(int)
- }
- self.results[test_name] = test
- return test
-
- def find_or_create_subtest(self, data):
- test = self.find_or_create_test(data)
- subtest_name = data["subtest"]
-
- if test["subtests"].get(subtest_name):
- return test["subtests"][subtest_name]
-
- subtest = {
- "status": defaultdict(int),
- "messages": set()
- }
- test["subtests"][subtest_name] = subtest
-
- return subtest
-
- def test_status(self, data):
- subtest = self.find_or_create_subtest(data)
- subtest["status"][data["status"]] += 1
- if data.get("message"):
- subtest["messages"].add(data["message"])
-
- def test_end(self, data):
- test = self.find_or_create_test(data)
- test["status"][data["status"]] += 1
-
-
-def is_inconsistent(results_dict, iterations):
- """Return whether or not a single test is inconsistent."""
- return len(results_dict) > 1 or sum(results_dict.values()) != iterations
-
-
-def err_string(results_dict, iterations):
- """Create and return string with errors from test run."""
- 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 ""))
- if total_results < iterations:
- rv.append("MISSING: %s/%s" % (iterations - total_results, iterations))
- rv = ", ".join(rv)
- if is_inconsistent(results_dict, iterations):
- rv = "**%s**" % rv
- return rv
-
-
-def process_results(log, iterations):
- """Process test log and return overall results and list of inconsistent tests."""
- inconsistent = []
- handler = LogHandler()
- reader.handle_log(reader.read(log), handler)
- results = handler.results
- for test_name, test in results.iteritems():
- if is_inconsistent(test["status"], iterations):
- inconsistent.append((test_name, None, test["status"], []))
- for subtest_name, subtest in test["subtests"].iteritems():
- if is_inconsistent(subtest["status"], iterations):
- inconsistent.append((test_name, subtest_name, subtest["status"], subtest["messages"]))
- return results, inconsistent
-
-
-def format_comment_title(product):
- """Produce a Markdown-formatted string based on a given "product"--a string
- containing a browser identifier optionally followed by a colon and a
- release channel. (For example: "firefox" or "chrome:dev".) The generated
- title string is used both to create new comments and to locate (and
- subsequently update) previously-submitted comments."""
- parts = product.split(":")
- title = parts[0].title()
-
- if len(parts) > 1:
- title += " (%s)" % parts[1]
-
- return "# %s #" % title
-
-
-def markdown_adjust(s):
- """Escape problematic markdown sequences."""
- s = s.replace('\t', u'\\t')
- s = s.replace('\n', u'\\n')
- s = s.replace('\r', u'\\r')
- s = s.replace('`', u'')
- s = s.replace('|', u'\\|')
- return s
-
-
-def table(headings, data, log):
- """Create and log data to specified logger in tabular format."""
- 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):
- """Output inconsistent tests to logger.error."""
- logger.error("## Unstable results ##\n")
- strings = [(
- "`%s`" % markdown_adjust(test),
- ("`%s`" % markdown_adjust(subtest)) if subtest else "",
- err_string(results, iterations),
- ("`%s`" % markdown_adjust(";".join(messages))) if len(messages) else ""
- )
- for test, subtest, results, messages in inconsistent]
- table(["Test", "Subtest", "Results", "Messages"], strings, logger.error)
-
-
-def write_results(results, iterations, comment_pr):
- """Output all test results to logger.info."""
- pr_number = None
- if comment_pr:
- try:
- pr_number = int(comment_pr)
- except ValueError:
- pass
- logger.info("## All results ##\n")
- if pr_number:
- logger.info("<details>\n")
- logger.info("<summary>%i %s ran</summary>\n\n" % (len(results),
- "tests" if len(results) > 1
- else "test"))
-
- for test_name, test in results.iteritems():
- baseurl = "http://w3c-test.org/submissions"
- if "https" in os.path.splitext(test_name)[0].split(".")[1:]:
- baseurl = "https://w3c-test.org/submissions"
- if pr_number:
- logger.info("<details>\n")
- logger.info('<summary><a href="%s/%s%s">%s</a></summary>\n\n' %
- (baseurl, pr_number, test_name, test_name))
- else:
- logger.info("### %s ###" % test_name)
- strings = [("", err_string(test["status"], iterations), "")]
-
- strings.extend(((
- ("`%s`" % markdown_adjust(subtest_name)) if subtest else "",
- err_string(subtest["status"], iterations),
- ("`%s`" % markdown_adjust(';'.join(subtest["messages"]))) if len(subtest["messages"]) else ""
- ) for subtest_name, subtest in test["subtests"].items()))
- table(["Subtest", "Results", "Messages"], strings, logger.info)
- if pr_number:
- logger.info("</details>\n")
-
- if pr_number:
- logger.info("</details>\n")
-
-
-def get_parser():
- """Create and return script-specific argument parser."""
- description = """Detect instabilities in new tests by executing tests
- repeatedly and comparing results between executions."""
- parser = argparse.ArgumentParser(description=description)
- 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("--comment-pr",
- action="store",
- default=os.environ.get("TRAVIS_PULL_REQUEST"),
- help="PR to comment on with stability results")
- parser.add_argument("--user",
- action="store",
- # Travis docs say do not depend on USER env variable.
- # This is a workaround to get what should be the same value
- default=os.environ.get("TRAVIS_REPO_SLUG", "w3c").split('/')[0],
- help="Travis user name")
- parser.add_argument("--output-bytes",
- action="store",
- type=int,
- help="Maximum number of bytes to write to standard output/error")
- parser.add_argument("--config-file",
- action="store",
- type=str,
- help="Location of ini-formatted configuration file",
- default="check_stability.ini")
- parser.add_argument("--sauce-platform",
- action="store",
- default=os.environ.get("PLATFORM"),
- help="Sauce Labs OS")
- parser.add_argument("--sauce-build-number",
- action="store",
- default=os.environ.get("TRAVIS_BUILD_NUMBER"),
- help="Sauce Labs build identifier")
- parser.add_argument("--sauce-build-tags",
- action="store", nargs="*",
- default=[os.environ.get("TRAVIS_PYTHON_VERSION")],
- help="Sauce Labs build tag")
- parser.add_argument("--sauce-tunnel-identifier",
- action="store",
- default=os.environ.get("TRAVIS_JOB_NUMBER"),
- help="Sauce Connect tunnel identifier")
- parser.add_argument("--sauce-user",
- action="store",
- default=os.environ.get("SAUCE_USERNAME"),
- help="Sauce Labs user name")
- parser.add_argument("--sauce-key",
- action="store",
- default=os.environ.get("SAUCE_ACCESS_KEY"),
- help="Sauce Labs access key")
- parser.add_argument("product",
- action="store",
- help="Product to run against (`browser-name` or 'browser-name:channel')")
- return parser
-
-
-def main():
- """Perform check_stability functionality and return exit code."""
- global wpt_root
- global wptrunner_root
- global logger
-
- retcode = 0
- parser = get_parser()
- args = parser.parse_args()
-
- with open(args.config_file, 'r') as config_fp:
- config = SafeConfigParser()
- config.readfp(config_fp)
- skip_tests = config.get("file detection", "skip_tests").split()
- ignore_changes = set(config.get("file detection", "ignore_changes").split())
-
- if args.output_bytes is not None:
- replace_streams(args.output_bytes,
- "Log reached capacity (%s bytes); output disabled." % args.output_bytes)
-
- logger = logging.getLogger(os.path.splitext(__file__)[0])
- setup_logging()
-
- wpt_root = os.path.abspath(os.curdir)
- wptrunner_root = os.path.normpath(os.path.join(wpt_root, "tools", "wptrunner"))
-
- if not os.path.exists(args.root):
- logger.critical("Root directory %s does not exist" % args.root)
- return 1
-
- os.chdir(args.root)
- browser_name = args.product.split(":")[0]
-
- if browser_name == "sauce" and not args.sauce_key:
- logger.warning("Cannot run tests on Sauce Labs. No access key.")
- return retcode
-
- with TravisFold("browser_setup"):
- logger.info(format_comment_title(args.product))
-
- browser_cls = {"firefox": Firefox,
- "chrome": Chrome,
- "sauce": Sauce}.get(browser_name)
- if browser_cls is None:
- logger.critical("Unrecognised browser %s" % browser_name)
- return 1
-
- fetch_wpt(args.user, "master:master")
-
- head_sha1 = get_sha1()
- logger.info("Testing web-platform-tests at revision %s" % head_sha1)
-
- branch_point = get_branch_point(args.user)
-
- # 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, files_ignored = get_files_changed(branch_point, ignore_changes)
-
- if files_ignored:
- logger.info("Ignoring %s changed files:\n%s" % (len(files_ignored),
- "".join(" * %s\n" % item for item in files_ignored)))
-
- if not files_changed:
- logger.info("No files changed")
- return 0
-
- build_manifest()
- install_wptrunner()
- do_delayed_imports()
-
- browser = browser_cls(**vars(args))
- browser.install()
- browser.install_webdriver()
-
- try:
- version = browser.version(args.root)
- except Exception, e:
- version = "unknown (error: %s)" % e
- logger.info("Using browser at version %s", version)
-
- logger.debug("Files changed:\n%s" % "".join(" * %s\n" % item for item in files_changed))
-
- affected_testfiles = get_affected_testfiles(files_changed, skip_tests)
-
- logger.debug("Affected tests:\n%s" % "".join(" * %s\n" % item for item in affected_testfiles))
-
- files_changed.extend(affected_testfiles)
-
- 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.")
-
- return retcode
-
-
-if __name__ == "__main__":
- try:
- retcode = main()
- except:
- import traceback
- traceback.print_exc()
- sys.exit(1)
- else:
- sys.exit(retcode)
diff --git a/tests/wpt/web-platform-tests/ci_built_diff.sh b/tests/wpt/web-platform-tests/ci_built_diff.sh
deleted file mode 100644
index 112d169417e..00000000000
--- a/tests/wpt/web-platform-tests/ci_built_diff.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-set -ex
-
-# Diff PNGs based on pixel-for-pixel identity
-echo -e '[diff "img"]\n textconv = identify -quiet -format "%#"' >> .git/config
-echo -e '*.png diff=img' >> .git/info/attributes
-
-# Exclude tests that rely on font rendering
-excluded=(
- '2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.basic.png'
- '2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.large.png'
- '2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.rtl.png'
- '2dcontext/drawing-text-to-the-canvas/2d.text.draw.stroke.basic.png'
-)
-
-./update-built-tests.sh
-git update-index --assume-unchanged ${excluded[*]}
-git diff --exit-code
diff --git a/tests/wpt/web-platform-tests/ci_lint.sh b/tests/wpt/web-platform-tests/ci_lint.sh
deleted file mode 100644
index 644961bbc5b..00000000000
--- a/tests/wpt/web-platform-tests/ci_lint.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-set -ex
-
-./manifest
-./lint
diff --git a/tests/wpt/web-platform-tests/ci_stability.sh b/tests/wpt/web-platform-tests/ci_stability.sh
deleted file mode 100644
index 393e50a074d..00000000000
--- a/tests/wpt/web-platform-tests/ci_stability.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-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"
-}
-
-install_chrome() {
- channel=$1
- deb_archive=google-chrome-${channel}_current_amd64.deb
- wget https://dl.google.com/linux/direct/$deb_archive
-
- # If the environment provides an installation of Google Chrome, the
- # existing binary may take precedence over the one introduced in this
- # script. Remove any previously-existing "alternatives" prior to
- # installation in order to ensure that the new binary is installed as
- # intended.
- if sudo update-alternatives --list google-chrome; then
- sudo update-alternatives --remove-all google-chrome
- fi
-
- # Installation will fail in cases where the package has unmet dependencies.
- # When this occurs, attempt to use the system package manager to fetch the
- # required packages and retry.
- if ! sudo dpkg --install $deb_archive; then
- sudo apt-get install --fix-broken
- sudo dpkg --install $deb_archive
- fi
-}
-
-test_stability() {
- python check_stability.py $PRODUCT --output-bytes $((1024 * 1024 * 3))
-}
-
-main() {
- hosts_fixup
- if [ $(echo $PRODUCT | grep '^chrome:') ]; then
- install_chrome $(echo $PRODUCT | grep --only-matching '\w\+$')
- fi
- test_stability
-}
-
-main
diff --git a/tests/wpt/web-platform-tests/ci_unittest.sh b/tests/wpt/web-platform-tests/ci_unittest.sh
deleted file mode 100755
index 2ad5603a24e..00000000000
--- a/tests/wpt/web-platform-tests/ci_unittest.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash
-set -e
-
-ROOT=$PWD
-
-pip install -U tox codecov
-cd tools
-tox
-
-if [ $TOXENV == "py27" ] || [ $TOXENV == "pypy" ]; then
- cd wptrunner
- tox
-
- cd $ROOT
- pip install --requirement tools/browserutils/requirements.txt
- python tools/browserutils/install.py firefox browser --destination $HOME
- python tools/browserutils/install.py firefox webdriver --destination $HOME/firefox
- export PATH=$HOME/firefox:$PATH
-
- cd $ROOT/resources/test
- tox
-fi
-
-cd $ROOT
-
-coverage combine tools tools/wptrunner
-codecov
diff --git a/tests/wpt/web-platform-tests/clear-site-data/navigation-insecure.html b/tests/wpt/web-platform-tests/clear-site-data/navigation-insecure.html
new file mode 100644
index 00000000000..9ccd712a222
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clear-site-data/navigation-insecure.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="support/test_utils.sub.js"></script>
+ </head>
+
+ <body>
+ <script>
+ /**
+ * @param Array.<Array.<Datatype>> combination A combination of datatypes.
+ * @param Dict.<string, boolean> report A map between a datatype name and
+ * whether it is empty.
+ * @return boolean Whether all datatypes are still nonempty.
+ */
+ function verifyDatatypes(report) {
+ TestUtils.DATATYPES.forEach(function(datatype) {
+ assert_false(
+ report[datatype.name],
+ datatype.name + " should NOT have been cleared.");
+ });
+ }
+
+ TestUtils.COMBINATIONS.forEach(function(combination) {
+ var test_name =
+ "Do not clear datatypes on insecure navigation (header: " +
+ combination.map(function(e) { return e.name; }).join(", ") +
+ ")";
+
+ promise_test(function(test) {
+ return new Promise(function(resolve_test, reject_test) {
+ TestUtils.populateDatatypes()
+ .then(function() {
+ // Navigate to a resource with a Clear-Site-Data header in
+ // an iframe, then verify that no data have been deleted.
+ return new Promise(function(resolve, reject) {
+ window.addEventListener("message", resolve);
+ var iframe = document.createElement("iframe");
+ iframe.src = TestUtils.getClearSiteDataUrl(combination);
+ document.body.appendChild(iframe);
+ }).then(function(messageEvent) {
+ verifyDatatypes(messageEvent.data);
+ resolve_test();
+ });
+ });
+ });
+ }, test_name);
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/clear-site-data/navigation.html b/tests/wpt/web-platform-tests/clear-site-data/navigation.html
deleted file mode 100644
index cd0f83e17f0..00000000000
--- a/tests/wpt/web-platform-tests/clear-site-data/navigation.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="support/test_utils.js"></script>
- </head>
-
- <body>
- <script>
- /** Ensures that all datatypes are nonempty. */
- function populateDatatypes() {
- return Promise.all(TestUtils.DATATYPES.map(function(datatype) {
- return datatype.add().then(datatype.isEmpty().then(function(isEmpty) {
- assert_false(
- isEmpty,
- datatype.name + " has to be nonempty before the test starts.");
- }));
- }));
- }
-
- /**
- * @param Array.<Array.<Datatype>> combination A combination of datatypes.
- * @param Dict.<string, boolean> report A map between a datatype name and
- * whether it is empty.
- * @return boolean Whether all datatypes are empty if and only if they are
- * included in the |combination|.
- */
- function verifyDatatypes(combination, report) {
- TestUtils.DATATYPES.forEach(function(datatype) {
- if (combination.indexOf(datatype) != -1) {
- assert_true(
- report[datatype.name],
- datatype.name + " should have been cleared.");
- } else {
- assert_false(
- report[datatype.name],
- datatype.name + " should NOT have been cleared.");
- }
- })
- }
-
- TestUtils.COMBINATIONS.forEach(function(combination) {
- var test_name =
- "Clear datatypes on navigation: " +
- combination.map(function(e) { return e.name; }).join(", ");
-
- promise_test(function(test) {
- return populateDatatypes()
- .then(function() {
- // Navigate to a resource with a Clear-Site-Data header in an
- // iframe, then verify that the correct types have been deleted.
- return new Promise(function(resolve, reject) {
- window.addEventListener("message", resolve);
- var iframe = document.createElement("iframe");
- iframe.src = TestUtils.getClearSiteDataUrl(combination);
- document.body.appendChild(iframe);
- }).then(function(messageEvent) {
- verifyDatatypes(combination, messageEvent.data);
- });
- });
- }, test_name);
- });
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/clear-site-data/navigation.https.html b/tests/wpt/web-platform-tests/clear-site-data/navigation.https.html
new file mode 100644
index 00000000000..dbddce3c136
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clear-site-data/navigation.https.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="support/test_utils.sub.js"></script>
+ </head>
+
+ <body>
+ <script>
+ /**
+ * @param Array.<Array.<Datatype>> combination A combination of datatypes.
+ * @param Dict.<string, boolean> report A map between a datatype name and
+ * whether it is empty.
+ * @return boolean Whether all datatypes are empty if and only if they are
+ * included in the |combination|.
+ */
+ function verifyDatatypes(combination, report) {
+ TestUtils.DATATYPES.forEach(function(datatype) {
+ if (combination.indexOf(datatype) != -1) {
+ assert_true(
+ report[datatype.name],
+ datatype.name + " should have been cleared.");
+ } else {
+ assert_false(
+ report[datatype.name],
+ datatype.name + " should NOT have been cleared.");
+ }
+ });
+ }
+
+ TestUtils.COMBINATIONS.forEach(function(combination) {
+ var test_name =
+ "Clear datatypes on navigation: " +
+ combination.map(function(e) { return e.name; }).join(", ");
+
+ promise_test(function(test) {
+ return new Promise(function(resolve_test, reject_test) {
+ TestUtils.populateDatatypes()
+ .then(function() {
+ // Navigate to a resource with a Clear-Site-Data header in
+ // an iframe, then verify that the correct types have been
+ // deleted.
+ return new Promise(function(resolve, reject) {
+ window.addEventListener("message", resolve);
+ var iframe = document.createElement("iframe");
+ iframe.src = TestUtils.getClearSiteDataUrl(combination);
+ document.body.appendChild(iframe);
+ }).then(function(messageEvent) {
+ verifyDatatypes(combination, messageEvent.data);
+ resolve_test();
+ });
+ });
+ });
+ }, test_name);
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/clear-site-data/resource.html b/tests/wpt/web-platform-tests/clear-site-data/resource.html
new file mode 100644
index 00000000000..a966cb95aaf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clear-site-data/resource.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="support/test_utils.sub.js"></script>
+ </head>
+
+ <body>
+ <script>
+ /**
+ * @typedef{TestCase}
+ * @type{object}
+ * @property{string} frame The scheme of the url of the iframe.
+ * @property{string} resource The scheme of the resource in the iframe.
+ * @property{boolean} deleted Whether it is expected that Clear-Site-Data
+ * will be respected when loading |resource| in |frame|.
+ */
+ var TestCase;
+
+ /** Array<TestCase> Test cases. */
+ var test_cases = [
+ { "frame": "https", "resource": "https", "deleted": true },
+ { "frame": "http", "resource": "https", "deleted": true },
+ { "frame": "https", "resource": "http", "deleted": false },
+ { "frame": "http", "resource": "http", "deleted": false },
+ ];
+
+ /**
+ * @param TestCase test_case The test case that is tested.
+ * @param Dict.<string, boolean> report A map between a datatype name and
+ * whether it is empty.
+ */
+ function verifyDatatypes(test_case, report) {
+ if (test_case.deleted) {
+ assert_true(
+ report["storage"],
+ "Storage should have been cleared.");
+ } else {
+ assert_false(
+ report["storage"],
+ "Storage should NOT have been cleared.");
+ }
+ }
+
+ test_cases.forEach(function(test_case) {
+ var test_name =
+ test_case.resource + " resource on a " + test_case.frame + " page";
+
+ promise_test(function(test) {
+ return new Promise(function(resolve_test, reject_test) {
+ TestUtils.populateDatatypes()
+ .then(function() {
+ // Navigate to a page with a resource that is loaded with
+ // the Clear-Site-Data header, then verify that storage
+ // has been deleted if and only if the resource was loaded
+ // via HTTPS.
+ return new Promise(function(resolve, reject) {
+ window.addEventListener("message", resolve);
+ var iframe = document.createElement("iframe");
+ iframe.src = TestUtils.getPageWithResourceUrl(
+ test_case.frame, test_case.resource);
+ document.body.appendChild(iframe);
+ }).then(function(messageEvent) {
+ verifyDatatypes(test_case, messageEvent.data);
+ resolve_test();
+ });
+ });
+ });
+ }, test_name);
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/clear-site-data/storage.https.html b/tests/wpt/web-platform-tests/clear-site-data/storage.https.html
new file mode 100644
index 00000000000..35c9fd1a03b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clear-site-data/storage.https.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="support/test_utils.sub.js"></script>
+ </head>
+
+ <body>
+ <script>
+ /** @property{Datatype} The storage datatype. */
+ var storage = TestUtils.DATATYPES.filter(function(datatype) {
+ return datatype.name == "storage";
+ })[0];
+
+ // The tests are set up asynchronously.
+ setup({"explicit_done": true});
+
+ // There must be at least one test added synchronously, otherwise
+ // testharness will complain.
+ // TODO(@msramek): Find a way to avoid this dummy test.
+ test(function() {}, "Populate backends.");
+
+ TestUtils.populateStorage()
+ .then(function() {
+ // Navigate to a resource with a Clear-Site-Data header in
+ // an iframe, then verify that all backends of the "storage"
+ // datatype have been deleted.
+ return new Promise(function(resolve, reject) {
+ window.addEventListener("message", resolve);
+ var iframe = document.createElement("iframe");
+ iframe.src = TestUtils.getClearSiteDataUrl([storage]);
+ document.body.appendChild(iframe);
+ }).then(function() {
+ TestUtils.STORAGE.forEach(function(backend) {
+ var test_name =
+ "Clear backend when 'storage' is deleted: " + backend.name;
+
+ promise_test(function() {
+ return backend.isEmpty().then(function(isEmpty) {
+ assert_true(
+ isEmpty,
+ backend.name + " should have been cleared.");
+ });
+ }, test_name);
+ });
+
+ done();
+ });
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/clear-site-data/support/echo-clear-site-data.py b/tests/wpt/web-platform-tests/clear-site-data/support/echo-clear-site-data.py
index e8ec8d55327..f7c48bb3957 100644
--- a/tests/wpt/web-platform-tests/clear-site-data/support/echo-clear-site-data.py
+++ b/tests/wpt/web-platform-tests/clear-site-data/support/echo-clear-site-data.py
@@ -5,7 +5,7 @@ RESPONSE = """
<html>
<head>
<title>Clear-Site-Data</title>
- <script src="test_utils.js"></script>
+ <script src="test_utils.sub.js"></script>
</head>
<body>
<script>
@@ -34,7 +34,7 @@ RESPONSE = """
# embedder whether the data deletion succeeded.
def main(request, response):
types = [key for key in request.GET.keys()]
- header = json.dumps({ "types": types })
+ header = ",".join("\"" + type + "\"" for type in types)
return ([("Clear-Site-Data", header),
("Content-Type", "text/html")],
RESPONSE)
diff --git a/tests/wpt/web-platform-tests/clear-site-data/support/page_with_resource.sub.html b/tests/wpt/web-platform-tests/clear-site-data/support/page_with_resource.sub.html
new file mode 100644
index 00000000000..703519a2f6f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clear-site-data/support/page_with_resource.sub.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Clear-Site-Data</title>
+ <script src="test_utils.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ var scheme = location.search.match("scheme=([^&$]+)")[1];
+
+ // TODO(@msramek): Move this logic to TestUtils.
+ var base_url = location.origin
+ .replace(/https?/, scheme)
+ .replace(/:[0-9]+/, ":" + (scheme == "https" ? {{ports[https][0]}}
+ : {{ports[http][0]}})) +
+ "/clear-site-data/support/";
+
+ var image = new Image();
+ image.onload = image.onerror = function() {
+ location.href = base_url + "send_report.html";
+ }
+
+ // TODO(@msramek): Move this logic to TestUtils.
+ image.src = base_url + "echo-clear-site-data.py?storage";
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/clear-site-data/support/send_report.html b/tests/wpt/web-platform-tests/clear-site-data/support/send_report.html
new file mode 100644
index 00000000000..6e90c626ea6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clear-site-data/support/send_report.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Clear-Site-Data</title>
+ <script src="test_utils.sub.js"></script>
+ </head>
+ <body>
+ <script>
+ /**
+ * A map between a datatype name and whether it is empty.
+ * @property Object.<string, boolean>
+ */
+ var report = {};
+
+ Promise.all(TestUtils.DATATYPES.map(function(datatype) {
+ return datatype.isEmpty().then(function(isEmpty) {
+ report[datatype.name] = isEmpty;
+ });
+ })).then(function() {
+ window.top.postMessage(report, "*");
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/clear-site-data/support/service_worker.js b/tests/wpt/web-platform-tests/clear-site-data/support/service_worker.js
new file mode 100644
index 00000000000..8504a030ddf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clear-site-data/support/service_worker.js
@@ -0,0 +1 @@
+/* This file is intentionally left blank. */
diff --git a/tests/wpt/web-platform-tests/clear-site-data/support/test_utils.js b/tests/wpt/web-platform-tests/clear-site-data/support/test_utils.js
deleted file mode 100644
index 6aff373f23a..00000000000
--- a/tests/wpt/web-platform-tests/clear-site-data/support/test_utils.js
+++ /dev/null
@@ -1,89 +0,0 @@
-var TestUtils = (function() {
- function randomString() {
- var result = "";
- for (var i = 0; i < 5; i++)
- result += String.fromCharCode(97 + Math.floor(Math.random() * 26));
- return result;
- };
-
- /**
- * Representation of one datatype.
- * @typedef Datatype
- * @type{object}
- * @property{string} name Name of the datatype.
- * @method{function():Void} add A function to add an instance of the datatype.
- * @method{function():boolean} isEmpty A function that tests whether
- * the datatype's storage backend is empty.
- */
- var Datatype;
-
- var TestUtils = {};
-
- /**
- * All datatypes supported by Clear-Site-Data.
- * @param{Array.<Datatype>}
- */
- TestUtils.DATATYPES = [
- {
- "name": "cookies",
- "add": function() {
- return new Promise(function(resolve, reject) {
- document.cookie = randomString() + "=" + randomString();
- resolve();
- });
- },
- "isEmpty": function() {
- return new Promise(function(resolve, reject) {
- resolve(!document.cookie);
- });
- }
- },
- {
- "name": "storage",
- "add": function() {
- return new Promise(function(resolve, reject) {
- localStorage.setItem(randomString(), randomString());
- resolve();
- });
- },
- "isEmpty": function() {
- return new Promise(function(resolve, reject) {
- resolve(!localStorage.length);
- });
- }
- }
- ];
-
- /**
- * All possible combinations of datatypes.
- * @property {Array.<Array.<Datatype>>}
- */
- TestUtils.COMBINATIONS = (function() {
- var combinations = [];
- for (var mask = 0; mask < (1 << TestUtils.DATATYPES.length); mask++) {
- var combination = [];
-
- for (var datatype = 0;
- datatype < TestUtils.DATATYPES.length; datatype++) {
- if (mask & (1 << datatype))
- combination.push(TestUtils.DATATYPES[datatype]);
- }
-
- combinations.push(combination);
- }
- return combinations;
- })();
-
- /**
- * Get the support server URL that returns a Clear-Site-Data header
- * to clear |datatypes|.
- * @param{Array.<Datatype>} datatypes The list of datatypes to be deleted.
- * @return string The URL to be queried.
- */
- TestUtils.getClearSiteDataUrl = function(datatypes) {
- names = datatypes.map(function(e) { return e.name });
- return "support/echo-clear-site-data.py?" + names.join("&");
- }
-
- return TestUtils;
-})();
diff --git a/tests/wpt/web-platform-tests/clear-site-data/support/test_utils.sub.js b/tests/wpt/web-platform-tests/clear-site-data/support/test_utils.sub.js
new file mode 100644
index 00000000000..a1085375db2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clear-site-data/support/test_utils.sub.js
@@ -0,0 +1,277 @@
+var TestUtils = (function() {
+ function randomString() {
+ var result = "";
+ for (var i = 0; i < 5; i++)
+ result += String.fromCharCode(97 + Math.floor(Math.random() * 26));
+ return result;
+ };
+
+ /**
+ * Representation of one datatype.
+ * @typedef Datatype
+ * @type{object}
+ * @property{string} name Name of the datatype.
+ * @property{function():boolean} supported
+ * Whether this datatype is supported by this user agent.
+ * @method{function():Void} add A function to add an instance of the datatype.
+ * @method{function():boolean} isEmpty A function that tests whether
+ * the datatype's storage backend is empty.
+ */
+ var Datatype;
+
+ var TestUtils = {};
+
+ /**
+ * Various storage backends that are part of the 'storage' datatype.
+ * @param{Array.<Datatype>}
+ */
+ TestUtils.STORAGE = [
+ {
+ "name": "local storage",
+ "supported": function() { !!window.localStorage; },
+ "add": function() {
+ return new Promise(function(resolve, reject) {
+ localStorage.setItem(randomString(), randomString());
+ resolve();
+ });
+ },
+ "isEmpty": function() {
+ return new Promise(function(resolve, reject) {
+ resolve(!localStorage.length);
+ });
+ }
+ },
+ {
+ "name": "Indexed DB",
+ "supported": function() { return !!window.indexedDB; },
+ "add": function() {
+ return new Promise(function(resolve, reject) {
+ var request = window.indexedDB.open("database");
+ request.onupgradeneeded = function() {
+ request.result.createObjectStore("store");
+ };
+ request.onsuccess = function() {
+ request.result.close();
+ resolve();
+ }
+ });
+ },
+ "isEmpty": function() {
+ return new Promise(function(resolve, reject) {
+ var request = window.indexedDB.open("database");
+ request.onsuccess = function() {
+ var database = request.result;
+ try {
+ var transaction = database.transaction(["store"]);
+ resolve(false);
+ } catch(error) {
+ // The database is empty. However, by testing that, we have also
+ // created it, which means that |onupgradeneeded| in the "add"
+ // method will not run the next time. Delete the database before
+ // reporting that it was empty.
+ var deletion = window.indexedDB.deleteDatabase("database");
+ deletion.onsuccess = resolve.bind(this, true);
+ } finally {
+ database.close();
+ }
+ };
+ });
+ }
+ },
+ {
+ // TODO(@msramek): We should also test the PERSISTENT filesystem, however,
+ // that might require storage permissions.
+ "name": "filesystems",
+ "supported": function() {
+ return window.requestFileSystem || window.webkitRequestFileSystem;
+ },
+ "add": function() {
+ return new Promise(function(resolve, reject) {
+ var onSuccess = function(fileSystem) {
+ fileSystem.root.getFile('file', {"create": true}, resolve, resolve);
+ }
+ var onFailure = resolve;
+
+ var requestFileSystem =
+ window.requestFileSystem || window.webkitRequestFileSystem;
+ requestFileSystem(window.TEMPORARY, 1 /* 1B */,
+ onSuccess, onFailure);
+ });
+ },
+ "isEmpty": function() {
+ return new Promise(function(resolve, reject) {
+ var onSuccess = function(fileSystem) {
+ fileSystem.root.getFile(
+ 'file', {},
+ resolve.bind(this, false) /* opened successfully */,
+ resolve.bind(this, true) /* failed to open */);
+ }
+ var onFailure = resolve.bind(this, true);
+
+ var requestFileSystem =
+ window.requestFileSystem || window.webkitRequestFileSystem;
+ requestFileSystem(window.TEMPORARY, 1 /* 1B */,
+ onSuccess, onFailure);
+ });
+ }
+ },
+ {
+ "name": "service workers",
+ "supported": function() { return !!navigator.serviceWorker; },
+ "add": function() {
+ return navigator.serviceWorker.register(
+ "support/service_worker.js",
+ { scope: "support/scope-that-does-not-contain-this-test/"});
+ },
+ "isEmpty": function() {
+ return new Promise(function(resolve, reject) {
+ navigator.serviceWorker.getRegistrations()
+ .then(function(registrations) {
+ resolve(!registrations.length);
+ });
+ });
+ }
+ },
+ {
+ "name": "WebSQL",
+ "supported": function() { return !!window.openDatabase; },
+ "add": function() {
+ return new Promise(function(resolve, reject) {
+ var database = window.openDatabase(
+ "database", "1.0", "database", 1024 /* 1 kB */);
+ database.transaction(function(context) {
+ context.executeSql("CREATE TABLE IF NOT EXISTS data (column)");
+ context.executeSql(
+ "INSERT INTO data (column) VALUES (1)", [], resolve);
+ });
+ });
+ },
+ "isEmpty": function() {
+ return new Promise(function(resolve, reject) {
+ var database = window.openDatabase(
+ "database", "1.0", "database", 1024 /* 1 kB */);
+ database.transaction(function(context) {
+ context.executeSql("CREATE TABLE IF NOT EXISTS data (column)");
+ context.executeSql(
+ "SELECT * FROM data", [],
+ function(transaction, result) {
+ resolve(!result.rows.length);
+ });
+ });
+ });
+ }
+ }
+ ].filter(function(backend) { return backend.supported(); });
+
+ /**
+ * All datatypes supported by Clear-Site-Data.
+ * @param{Array.<Datatype>}
+ */
+ TestUtils.DATATYPES = [
+ {
+ "name": "cookies",
+ "supported": function() { return typeof document.cookie == "string"; },
+ "add": function() {
+ return new Promise(function(resolve, reject) {
+ document.cookie = randomString() + "=" + randomString();
+ resolve();
+ });
+ },
+ "isEmpty": function() {
+ return new Promise(function(resolve, reject) {
+ resolve(!document.cookie);
+ });
+ }
+ },
+ {
+ "name": "storage",
+ "supported": TestUtils.STORAGE[0].supported,
+ "add": TestUtils.STORAGE[0].add,
+ "isEmpty": TestUtils.STORAGE[0].isEmpty,
+ }
+ ].filter(function(datatype) { return datatype.supported(); });
+
+ /**
+ * All possible combinations of datatypes.
+ * @property {Array.<Array.<Datatype>>}
+ */
+ TestUtils.COMBINATIONS = (function() {
+ var combinations = [];
+ for (var mask = 0; mask < (1 << TestUtils.DATATYPES.length); mask++) {
+ var combination = [];
+
+ for (var datatype = 0;
+ datatype < TestUtils.DATATYPES.length; datatype++) {
+ if (mask & (1 << datatype))
+ combination.push(TestUtils.DATATYPES[datatype]);
+ }
+
+ combinations.push(combination);
+ }
+ return combinations;
+ })();
+
+ /**
+ * Populates |datatypes| by calling the "add" method on each of them,
+ * and verifies that they are nonempty.
+ * @param {Array.<Datatype>} datatypes to be populated.
+ * @private
+ */
+ function populate(datatypes) {
+ return Promise.all(datatypes.map(function(datatype) {
+ return new Promise(function(resolve, reject) {
+ datatype.add().then(function() {
+ datatype.isEmpty().then(function(isEmpty) {
+ assert_false(
+ isEmpty,
+ datatype.name +
+ " has to be nonempty before the test starts.");
+ resolve();
+ });
+ });
+ });
+ }));
+ };
+
+ /**
+ * Ensures that all datatypes are nonempty. Should be called in the test
+ * setup phase.
+ */
+ TestUtils.populateDatatypes = populate.bind(this, TestUtils.DATATYPES);
+
+ /**
+ * Ensures that all backends of the "storage" datatype are nonempty. Should
+ * be called in the test setup phase.
+ */
+ TestUtils.populateStorage = populate.bind(this, TestUtils.STORAGE);
+
+ /**
+ * Get the support server URL that returns a Clear-Site-Data header
+ * to clear |datatypes|.
+ * @param{Array.<Datatype>} datatypes The list of datatypes to be deleted.
+ * @return string The URL to be queried.
+ */
+ TestUtils.getClearSiteDataUrl = function(datatypes) {
+ names = datatypes.map(function(e) { return e.name });
+ return "support/echo-clear-site-data.py?" + names.join("&");
+ }
+
+ /**
+ * @param{string} page_scheme Scheme of the page. "http" or "https".
+ * @param{string} resource_scheme Scheme of the resource. "http" or "https".
+ * @return The URL of a page that contains a resource requesting the deletion
+ * of storage.
+ */
+ TestUtils.getPageWithResourceUrl = function(page_scheme, resource_scheme) {
+ if (page_scheme != "https" && page_scheme != "http")
+ throw "Unsupported scheme: " + page_scheme;
+ if (resource_scheme != "https" && resource_scheme != "http")
+ throw "Unsupported scheme: " + resource_scheme;
+ return page_scheme + "://web-platform.test:" +
+ (page_scheme == "https" ? {{ports[https][0]}} : {{ports[http][0]}}) +
+ "/clear-site-data/support/page_with_resource.sub.html?scheme=" +
+ resource_scheme;
+ }
+
+ return TestUtils;
+})();
diff --git a/tests/wpt/web-platform-tests/clipboard/OWNERS b/tests/wpt/web-platform-tests/clipboard-apis/OWNERS
index 6332787efaf..6332787efaf 100644
--- a/tests/wpt/web-platform-tests/clipboard/OWNERS
+++ b/tests/wpt/web-platform-tests/clipboard-apis/OWNERS
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-interfaces.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-interfaces.https.html
new file mode 100644
index 00000000000..a82e39fbf39
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-interfaces.https.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Clipboard IDL test</title>
+<link rel="help" href="https://w3c.github.io/clipboard-apis/">
+<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>
+'use strict';
+
+function doTest(idls) {
+ var idl_array = new IdlArray();
+ idl_array.add_untested_idls('interface Navigator {};');
+ idl_array.add_untested_idls('interface EventTarget {};');
+ for (let idl of idls) {
+ idl_array.add_idls(idl);
+ }
+ idl_array.add_objects({
+ Navigator: ['navigator'],
+ Clipboard: ['navigator.clipboard'],
+ });
+ idl_array.test();
+};
+
+function fetchText(url) {
+ return fetch(url).then((response) => response.text());
+}
+
+promise_test(() => {
+ return Promise.all(["/interfaces/clipboard.idl"].map(fetchText))
+ .then(doTest);
+}, "Test driver");
+</script>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-basics.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-basics.https.html
new file mode 100644
index 00000000000..31266556738
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-navigator-clipboard-basics.https.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Async Clipboard basic tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+
+test(function() {
+ assert_not_equals(navigator.clipboard, undefined);
+ assert_true(navigator.clipboard instanceof Clipboard);
+ assert_equals(navigator.clipboard, navigator.clipboard);
+}, "navigator.clipboard exists");
+
+/* clipboard.write() */
+
+promise_test(function() {
+ var dt = new DataTransfer();
+ dt.items.add("Howdy", "text/plain");
+ return navigator.clipboard.write(dt);
+}, "navigator.clipboard.write(DataTransfer) succeeds");
+
+promise_test(function(t) {
+ return promise_rejects(t, new TypeError(),
+ navigator.clipboard.write());
+}, "navigator.clipboard.write() fails (expect DataTransfer)");
+
+promise_test(function(t) {
+ return promise_rejects(t, new TypeError(),
+ navigator.clipboard.write(null));
+}, "navigator.clipboard.write(null) fails (expect DataTransfer)");
+
+promise_test(function(t) {
+ return promise_rejects(t, new TypeError(),
+ navigator.clipboard.write("Bad string"));
+}, "navigator.clipboard.write(DOMString) fails (expect DataTransfer)");
+
+
+/* clipboard.writeText() */
+
+promise_test(function() {
+ return navigator.clipboard.writeText("New clipboard text");
+}, "navigator.clipboard.writeText(DOMString) succeeds");
+
+promise_test(function(t) {
+ return promise_rejects(t, new TypeError(),
+ navigator.clipboard.writeText());
+}, "navigator.clipboard.writeText() fails (expect DOMString)");
+
+
+/* clipboard.read() */
+
+promise_test(function() {
+ return navigator.clipboard.read()
+ .then(function(result) {
+ assert_true(result instanceof DataTransfer);
+ });
+}, "navigator.clipboard.read() succeeds");
+
+
+/* clipboard.readText() */
+
+promise_test(function() {
+ return navigator.clipboard.readText()
+ .then(function(result) {
+ assert_equals(typeof result, "string");
+ });
+}, "navigator.clipboard.readText() succeeds");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-dttext-read-dttext-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-write-dttext-read-dttext-manual.https.html
new file mode 100644
index 00000000000..1fe946ae70a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-write-dttext-read-dttext-manual.https.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Async Clipboard write (dt/text) -> read (dt/text) tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+ var test_data = "Clipboard write (dt/text) -> read (dt/text) test data";
+ var cb = navigator.clipboard;
+ var dt = new DataTransfer();
+ dt.items.add(test_data, "text/plain");
+
+ cb.write(dt).then(t.step_func(() => {
+ cb.read().then(t.step_func((data) => {
+ assert_equals(data.items.length, 1);
+ data.items[0].getAsString(t.step_func((s) => {
+ assert_equals(s, test_data);
+ t.done();
+ }));
+ }), function() {
+ t.unreached_func("clipboard.read() fail");
+ });
+ }), function() {
+ t.unreached_func("clipboard.write() fail");
+ });
+}, "Verify write and read clipboard (DataTransfer/text)");
+</script>
+Note: This is a manual test because it writes/reads to the shared system
+clipboard and thus cannot be run async with other tests that might interact
+with the clipboard.
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-dttext-read-text-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-write-dttext-read-text-manual.https.html
new file mode 100644
index 00000000000..b341d923395
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-write-dttext-read-text-manual.https.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Async Clipboard write (dt/text) -> readText tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+ var test_data = "Clipboard write (dt/text) -> readText test data";
+ var cb = navigator.clipboard;
+ var dt = new DataTransfer();
+ dt.items.add(test_data, "text/plain");
+
+ cb.write(dt).then(t.step_func(() => {
+ cb.readText().then(t.step_func((data) => {
+ assert_equals(data, test_data);
+ t.done();
+ }), function() {
+ t.unreached_func("clipboard.read() fail");
+ });
+ }), function() {
+ t.unreached_func("clipboard.write() fail");
+ });
+}, "Verify write and read clipboard (DataTransfer/text)");
+</script>
+Note: This is a manual test because it writes/reads to the shared system
+clipboard and thus cannot be run async with other tests that might interact
+with the clipboard.
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-dttext-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-dttext-manual.https.html
new file mode 100644
index 00000000000..ab11ab9dfb4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-dttext-manual.https.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Async Clipboard writeText -> read (dt/text) tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+ var test_data = "Clipboard writeText -> read(dt/text) test data";
+ var cb = navigator.clipboard;
+ cb.writeText(test_data).then(t.step_func(() => {
+ cb.read().then(t.step_func((data) => {
+ assert_equals(data.items.length, 1);
+ data.items[0].getAsString(t.step_func((s) => {
+ assert_equals(s, test_data);
+ t.done();
+ }));
+ }), function() {
+ t.unreached_func("clipboard.read() fail");
+ });
+ }), function() {
+ t.unreached_func("clipboard.writeText() fail");
+ });
+}, "Verify write and read clipboard (DOMString)");
+</script>
+Note: This is a manual test because it writes/reads to the shared system
+clipboard and thus cannot be run async with other tests that might interact
+with the clipboard.
diff --git a/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-text-manual.https.html b/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-text-manual.https.html
new file mode 100644
index 00000000000..a5572164f23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/clipboard-apis/async-write-text-read-text-manual.https.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Async Clipboard writeText -> readText tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+async_test(function(t) {
+ var test_data = "Clipboard writeText -> readText test data";
+ var cb = navigator.clipboard;
+ cb.writeText(test_data).then(t.step_func(() => {
+ cb.readText().then(t.step_func((data) => {
+ assert_equals(data, test_data);
+ t.done();
+ }), function() {
+ t.unreached_func("clipboard.readText() fail");
+ });
+ }), function() {
+ t.unreached_func("clipboard.writeText() fail");
+ });
+}, "Verify write and read clipboard (DOMString)");
+</script>
+Note: This is a manual test because it writes/reads to the shared system
+clipboard and thus cannot be run async with other tests that might interact
+with the clipboard.
diff --git a/tests/wpt/web-platform-tests/common/PrefixedLocalStorage.js.headers b/tests/wpt/web-platform-tests/common/PrefixedLocalStorage.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/PrefixedLocalStorage.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/PrefixedPostMessage.js.headers b/tests/wpt/web-platform-tests/common/PrefixedPostMessage.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/PrefixedPostMessage.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/canvas-frame.css.headers b/tests/wpt/web-platform-tests/common/canvas-frame.css.headers
new file mode 100644
index 00000000000..e13897f1572
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/canvas-frame.css.headers
@@ -0,0 +1 @@
+Content-Type: text/css; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/canvas-index.css.headers b/tests/wpt/web-platform-tests/common/canvas-index.css.headers
new file mode 100644
index 00000000000..e13897f1572
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/canvas-index.css.headers
@@ -0,0 +1 @@
+Content-Type: text/css; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/canvas-spec.css.headers b/tests/wpt/web-platform-tests/common/canvas-spec.css.headers
new file mode 100644
index 00000000000..e13897f1572
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/canvas-spec.css.headers
@@ -0,0 +1 @@
+Content-Type: text/css; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/canvas-tests.css.headers b/tests/wpt/web-platform-tests/common/canvas-tests.css.headers
new file mode 100644
index 00000000000..e13897f1572
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/canvas-tests.css.headers
@@ -0,0 +1 @@
+Content-Type: text/css; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/canvas-tests.js.headers b/tests/wpt/web-platform-tests/common/canvas-tests.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/canvas-tests.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/css-paint-tests.js b/tests/wpt/web-platform-tests/common/css-paint-tests.js
index 58a8e649ee1..cd57332758e 100644
--- a/tests/wpt/web-platform-tests/common/css-paint-tests.js
+++ b/tests/wpt/web-platform-tests/common/css-paint-tests.js
@@ -2,11 +2,11 @@
// requestAnimationFrame. In the second frame, we take a screenshot, that makes
// sure that we already have a full frame.
function importPaintWorkletAndTerminateTestAfterAsyncPaint(code) {
- if (typeof paintWorklet == "undefined") {
+ if (typeof CSS.paintWorklet == "undefined") {
takeScreenshot();
} else {
var blob = new Blob([code], {type: 'text/javascript'});
- paintWorklet.addModule(URL.createObjectURL(blob)).then(function() {
+ CSS.paintWorklet.addModule(URL.createObjectURL(blob)).then(function() {
requestAnimationFrame(function() {
requestAnimationFrame(function() {
takeScreenshot();
diff --git a/tests/wpt/web-platform-tests/common/css-paint-tests.js.headers b/tests/wpt/web-platform-tests/common/css-paint-tests.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/css-paint-tests.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/get-host-info.sub.js.headers b/tests/wpt/web-platform-tests/common/get-host-info.sub.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/get-host-info.sub.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/media.js.headers b/tests/wpt/web-platform-tests/common/media.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/media.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/object-association.js.headers b/tests/wpt/web-platform-tests/common/object-association.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/object-association.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/performance-timeline-utils.js b/tests/wpt/web-platform-tests/common/performance-timeline-utils.js
index 268bb114722..3beb28e9bf7 100644
--- a/tests/wpt/web-platform-tests/common/performance-timeline-utils.js
+++ b/tests/wpt/web-platform-tests/common/performance-timeline-utils.js
@@ -31,10 +31,12 @@ function test_equals(value, equals, msg, properties)
function test_entries(actualEntries, expectedEntries) {
test_equals(actualEntries.length, expectedEntries.length)
expectedEntries.forEach(function (expectedEntry) {
- test_true(!!actualEntries.find(function (actualEntry) {
+ var foundEntry = actualEntries.find(function (actualEntry) {
return typeof Object.keys(expectedEntry).find(function (key) {
return actualEntry[key] !== expectedEntry[key]
}) === 'undefined'
- }))
+ })
+ test_true(!!foundEntry)
+ assert_object_equals(foundEntry.toJSON(), expectedEntry)
})
}
diff --git a/tests/wpt/web-platform-tests/common/performance-timeline-utils.js.headers b/tests/wpt/web-platform-tests/common/performance-timeline-utils.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/performance-timeline-utils.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/reftest-wait.js.headers b/tests/wpt/web-platform-tests/common/reftest-wait.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/reftest-wait.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/stringifiers.js.headers b/tests/wpt/web-platform-tests/common/stringifiers.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/stringifiers.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/test-setting-immutable-prototype.js.headers b/tests/wpt/web-platform-tests/common/test-setting-immutable-prototype.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/test-setting-immutable-prototype.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/utils.js.headers b/tests/wpt/web-platform-tests/common/utils.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/utils.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/common/vendor-prefix.js b/tests/wpt/web-platform-tests/common/vendor-prefix.js
deleted file mode 100644
index 1a91632cec2..00000000000
--- a/tests/wpt/web-platform-tests/common/vendor-prefix.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/* Use this script when you want to test APIs that use vendor prefixes
- and define which objects need to be checked for prefixed versions, à la
- <script src="vendor-prefix.js"
- data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'
- data-prefixed-prototypes='[{"ancestors":["HTMLMediaElement"],"name":"srcObject"}]'></script>
- data-prefixed-objects lets prefix objects in the global space
- data-prefixed-prototypes adds prefixes to interfaces, for objects that
- get created during the tests
-
- NB: vendor prefixes are expected to go away in favor of putting
- new features behind flag, so hopefully there will be only limited
- need to use this
-*/
-
-(function () {
- var aliases = {};
- var documentingPrefixUsage = document.createElement('div');
- var vendorPrefixes = ["moz", "ms", "o", "webkit", "Moz", "MS", "O", "WebKit", "op"];
-
- function getParentObject(ancestors) {
- var parent = window;
- var currentName = "";
- ancestors.forEach(function (p) {
- currentName = currentName ? currentName + "." + p : p;
- if (parent[p] === undefined) {
- throw currentName + " is undefined, cannot set prefix alias on child object";
- }
- parent = parent[p];
- });
- return parent;
- }
-
- function prependPrefix(prefix, name) {
- var newName = name[0].toUpperCase() + name.substr(1, name.length);
- return prefix + newName;
- }
-
- function setPrototypeAlias(obj) {
- var parent = getParentObject(obj.ancestors);
- if (!parent.prototype.hasOwnProperty(obj.name)) {
- vendorPrefixes.forEach(function (prefix) {
- if (parent.prototype.hasOwnProperty(prependPrefix(prefix, obj.name))) {
- Object.defineProperty(parent.prototype, obj.name,
- {get: function() {return this[prependPrefix(prefix, obj.name)];},
- set: function(v) {this[prependPrefix(prefix, obj.name)] = v;}
- });
- aliases[obj.ancestors.join(".") + ".prototype." + obj.name] = obj.ancestors.join(".") + ".prototype." + prependPrefix(prefix, obj.name);
- return;
- }
- });
- }
- }
-
- function setAlias(obj) {
- var parent = getParentObject(obj.ancestors);
- if (parent[obj.name] === undefined) {
- vendorPrefixes.forEach(function (prefix) {
- if (parent[prependPrefix(prefix, obj.name)] !== undefined) {
- parent[obj.name] = parent[prependPrefix(prefix, obj.name)];
- aliases[obj.ancestors.join(".") + "." + obj.name] = obj.ancestors.join(".") + "." + prependPrefix(prefix, obj.name);
- return;
- }
- });
- }
- }
-
- if (location.search.indexOf('usePrefixes=1') !== -1) {
- if (document.querySelector("script[data-prefixed-objects]")) {
- var prefixObjectsData = document.querySelector("script[data-prefixed-objects]").dataset["prefixedObjects"];
- try {
- var prefixedObjects = JSON.parse(prefixObjectsData);
- } catch (e) {
- throw "couldn't parse data-prefixed-objects as JSON:" + e;
- }
- prefixedObjects.forEach(setAlias);
- }
- if (document.querySelector("script[data-prefixed-prototypes]")) {
- var prefixProtoData = document.querySelector("script[data-prefixed-prototypes]").dataset["prefixedPrototypes"];
- try {
- var prefixedPrototypes = JSON.parse(prefixProtoData);
- } catch (e) {
- throw "couldn't parse data-prefixed-prototypes as JSON:" + e;
- }
- prefixedPrototypes.forEach(setPrototypeAlias);
- }
- var ul = document.createElement("ul");
- Object.keys(aliases).forEach(function (alias) {
- var li = document.createElement("li");
- li.appendChild(document.createTextNode(alias + " has been set to be an alias of vendor-prefixed " + aliases[alias]));
- ul.appendChild(li);
- });
- documentingPrefixUsage.appendChild(ul);
- } else {
- // Document that the test can be run with prefixes enabled
-
- var a = document.createElement('a');
- var link = "";
- if (location.search) {
- link = location.search + "&usePrefixes=1";
- } else {
- link = "?usePrefixes=1";
- }
- a.setAttribute("href", link);
- a.appendChild(document.createTextNode("with vendor prefixes enabled"));
- documentingPrefixUsage.appendChild(document.createTextNode("The feature(s) tested here are known to have been made available via vendor prefixes; you can run this test "));
- documentingPrefixUsage.appendChild(a);
- documentingPrefixUsage.appendChild(document.createTextNode("."));
- }
- var log = document.getElementById('log');
- if (log) {
- log.parentNode.insertBefore(documentingPrefixUsage, log);
- } else {
- document.body.appendChild(documentingPrefixUsage);
- }
-})();
diff --git a/tests/wpt/web-platform-tests/common/vendor-prefix.js.headers b/tests/wpt/web-platform-tests/common/vendor-prefix.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/common/vendor-prefix.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/compat/OWNERS b/tests/wpt/web-platform-tests/compat/OWNERS
new file mode 100644
index 00000000000..d517a33a54a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/compat/OWNERS
@@ -0,0 +1,3 @@
+@cdumez
+@foolip
+@miketaylr
diff --git a/tests/wpt/web-platform-tests/compat/green-ref.html b/tests/wpt/web-platform-tests/compat/green-ref.html
new file mode 100644
index 00000000000..2671ff6dddb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/compat/green-ref.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>A green 100x100 block</title>
+<link rel="author" title="Xidorn Quan" href="me@upsuper.ort">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<div style="width: 100px; height: 100px; background: green;"></div>
diff --git a/tests/wpt/web-platform-tests/compat/historical.html b/tests/wpt/web-platform-tests/compat/historical.html
new file mode 100644
index 00000000000..a1d80f9fe87
--- /dev/null
+++ b/tests/wpt/web-platform-tests/compat/historical.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<title>Historical non-standard features</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+test(function() {
+ assert_false("getMatchedCSSRules" in window);
+}, "getMatchedCSSRules() should not exist");
+
+test(function() {
+ assert_false("webkitHidden" in window);
+}, "webkitHidden should not exist");
+
+test(function() {
+ assert_false("webkitVisibilityState" in window);
+}, "webkitVisibilityState should not exist");
+</script>
diff --git a/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-bottom.html b/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-bottom.html
new file mode 100644
index 00000000000..21e1c8948bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-bottom.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>-webkit-linear-gradient(bottom)</title>
+<link rel="author" title="Xidorn Quan" href="me@upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient">
+<meta name="assert" content="'bottom' in -webkit-linear-gradient is equivalent to 'to top' in modern syntax">
+<link rel="match" href="green-ref.html">
+<style>
+ #outer {
+ width: 100px;
+ height: 100px;
+ overflow: hidden;
+ }
+ #inner {
+ width: 100px;
+ height: 200px;
+ background-image: -webkit-linear-gradient(bottom, red 50%, green 50%);
+ }
+</style>
+<div id="outer">
+ <div id="inner"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-left.html b/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-left.html
new file mode 100644
index 00000000000..b0e13c13962
--- /dev/null
+++ b/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-left.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>-webkit-linear-gradient(left)</title>
+<link rel="author" title="Xidorn Quan" href="me@upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient">
+<meta name="assert" content="'left' in -webkit-linear-gradient is equivalent to 'to right' in modern syntax">
+<link rel="match" href="green-ref.html">
+<style>
+ #outer {
+ width: 100px;
+ height: 100px;
+ overflow: hidden;
+ }
+ #inner {
+ width: 200px;
+ height: 100px;
+ background-image: -webkit-linear-gradient(left, green 50%, red 50%);
+ }
+</style>
+<div id="outer">
+ <div id="inner"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-right.html b/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-right.html
new file mode 100644
index 00000000000..0f1a4b9500c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-right.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>-webkit-linear-gradient(right)</title>
+<link rel="author" title="Xidorn Quan" href="me@upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient">
+<meta name="assert" content="'right' in -webkit-linear-gradient is equivalent to 'to left' in modern syntax">
+<link rel="match" href="green-ref.html">
+<style>
+ #outer {
+ width: 100px;
+ height: 100px;
+ overflow: hidden;
+ }
+ #inner {
+ width: 200px;
+ height: 100px;
+ background-image: -webkit-linear-gradient(right, red 50%, green 50%);
+ }
+</style>
+<div id="outer">
+ <div id="inner"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-top.html b/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-top.html
new file mode 100644
index 00000000000..579d8822061
--- /dev/null
+++ b/tests/wpt/web-platform-tests/compat/webkit-linear-gradient-line-top.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>-webkit-linear-gradient(top)</title>
+<link rel="author" title="Xidorn Quan" href="me@upsuper.org">
+<link rel="author" title="Mozilla" href="https://www.mozilla.org">
+<link rel="help" href="https://compat.spec.whatwg.org/#css-gradients-webkit-linear-gradient">
+<meta name="assert" content="'top' in -webkit-linear-gradient is equivalent to 'to bottom' in modern syntax">
+<link rel="match" href="green-ref.html">
+<style>
+ #outer {
+ width: 100px;
+ height: 100px;
+ overflow: hidden;
+ }
+ #inner {
+ width: 100px;
+ height: 200px;
+ background-image: -webkit-linear-gradient(top, green 50%, red 50%);
+ }
+</style>
+<div id="outer">
+ <div id="inner"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/config.default.json b/tests/wpt/web-platform-tests/config.default.json
index 47ad74b7eb5..a55b17c3de3 100644
--- a/tests/wpt/web-platform-tests/config.default.json
+++ b/tests/wpt/web-platform-tests/config.default.json
@@ -9,7 +9,7 @@
"check_subdomains": true,
"log_level":"debug",
"bind_hostname": true,
- "ssl": {"type": "openssl",
+ "ssl": {"type": "pregenerated",
"encrypt_after_connect": false,
"openssl": {
"openssl_binary": "openssl",
@@ -18,8 +18,8 @@
"base_conf_path": null
},
"pregenerated": {
- "host_key_path": null,
- "host_cert_path": null
+ "host_key_path": "tools/certs/web-platform.test.key",
+ "host_cert_path": "tools/certs/web-platform.test.pem"
},
"none": {}
},
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/picture/srcset-microsyntax-leading-dot-x-novalid.html b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/picture/srcset-microsyntax-leading-dot-x-valid.html
index 3a9da140b6b..3a9da140b6b 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/html/elements/picture/srcset-microsyntax-leading-dot-x-novalid.html
+++ b/tests/wpt/web-platform-tests/conformance-checkers/html/elements/picture/srcset-microsyntax-leading-dot-x-valid.html
diff --git a/tests/wpt/web-platform-tests/conformance-checkers/messages.json b/tests/wpt/web-platform-tests/conformance-checkers/messages.json
index 92e8da46a31..7c363b35885 100644
--- a/tests/wpt/web-platform-tests/conformance-checkers/messages.json
+++ b/tests/wpt/web-platform-tests/conformance-checkers/messages.json
@@ -5,24 +5,24 @@
"html-aria/combobox-autocomplete-list/div-haswarn.html": "The \u201ctextbox\u201d role is unnecessary for an \u201cinput\u201d element that has no \u201clist\u201d attribute and whose type is \u201ctext\u201d.",
"html-aria/host-language/implicit-semantics-checkbox-disparity-haswarn.html": "The \u201ccheckbox\u201d role is unnecessary for element \u201cinput\u201d whose type is \u201ccheckbox\u201d.",
"html-aria/host-language/implicit-semantics-checkbox-role-haswarn.html": "The \u201ccheckbox\u201d role is unnecessary for element \u201cinput\u201d whose type is \u201ccheckbox\u201d.",
- "html-rdfa/0019-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cdiv\u201d in this context.",
- "html-rdfa/0035-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d in this context.",
- "html-rdfa/0037-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d in this context.",
- "html-rdfa/0039-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d in this context.",
- "html-rdfa/0041-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d in this context.",
- "html-rdfa/0079-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cp\u201d in this context.",
- "html-rdfa/0085-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cp\u201d in this context.",
- "html-rdfa/0109-novalid.html": "Attribute \u201cxml:base\u201d not allowed on element \u201chtml\u201d in this context.",
+ "html-rdfa/0019-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cdiv\u201d at this point.",
+ "html-rdfa/0035-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d at this point.",
+ "html-rdfa/0037-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d at this point.",
+ "html-rdfa/0039-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d at this point.",
+ "html-rdfa/0041-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d at this point.",
+ "html-rdfa/0079-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cp\u201d at this point.",
+ "html-rdfa/0085-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cp\u201d at this point.",
+ "html-rdfa/0109-novalid.html": "Attribute \u201cxml:base\u201d not allowed on element \u201chtml\u201d at this point.",
"html-rdfa/0131-novalid.html": "A numeric character reference expanded to carriage return.",
"html-rdfa/0147-novalid.html": "Attribute \u201cxmlns:xmlzzz\u201d not allowed here.",
"html-rdfa/0179-novalid.html": "Attribute \u201cxmlns:foaf\u201d not allowed here.",
"html-rdfa/0180-novalid.html": "Bad value \u201c: http://xmlns.com/foaf/0.1/\u201d for attribute \u201cprefix\u201d on element \u201cdiv\u201d.",
"html-rdfa/0183-novalid.html": "Attribute \u201cxmlns:foaf\u201d not allowed here.",
- "html-rdfa/0222-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201cstrong\u201d.) Suppressing further errors from this subtree.",
- "html-rdfa/0223-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201cstrong\u201d.) Suppressing further errors from this subtree.",
- "html-rdfa/0226-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201cspan\u201d.) Suppressing further errors from this subtree.",
- "html-rdfa/0227-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201cspan\u201d.) Suppressing further errors from this subtree.",
- "html-rdfa/0230-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d in this context.",
+ "html-rdfa/0222-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201cstrong\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html-rdfa/0223-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201cstrong\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html-rdfa/0226-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201cspan\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html-rdfa/0227-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201cspan\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html-rdfa/0230-novalid.html": "Attribute \u201chref\u201d not allowed on element \u201cimg\u201d at this point.",
"html-rdfa/0234-novalid.html": "Bad value \u201cdescribedby\u201d for attribute \u201crel\u201d on element \u201ca\u201d: Bad list of link-type keywords: The string \u201cdescribedby\u201d is not a registered keyword.",
"html-rdfa/0237-novalid.html": "Bad value \u201c$malformed http://example.com\u201d for attribute \u201cprefix\u201d on element \u201cbody\u201d.",
"html-rdfa/0258-novalid.html": "Attribute \u201cxmlns:_\u201d not allowed here.",
@@ -34,7 +34,7 @@
"html-rdfa/0310-novalid.html": "Bad value \u201cex:somerole someOtherRole http://www.example.com/alternate/role\u201d for attribute \u201crole\u201d on element \u201cdiv\u201d.",
"html-rdfa/0314-novalid.html": "Bad value \u201csection\u201d for attribute \u201crole\u201d on element \u201cdiv\u201d.",
"html-rdfa/0319-novalid.html": "Attribute \u201cxmlns:xpr\u201d not allowed here.",
- "html-rdfa/0320-novalid.html": "Attribute \u201csrc\u201d not allowed on element \u201ca\u201d in this context.",
+ "html-rdfa/0320-novalid.html": "Attribute \u201csrc\u201d not allowed on element \u201ca\u201d at this point.",
"html-rdfalite/0015-novalid.html": "Bad value \u201cdc:source\u201d for attribute \u201crel\u201d on element \u201clink\u201d: Bad list of link-type keywords: The string \u201cdc:source\u201d is not a registered keyword.",
"html-rdfalite/0030-novalid.html": "Bad value \u201ccc:license\u201d for attribute \u201crel\u201d on element \u201ca\u201d: Bad list of link-type keywords: The string \u201ccc:license\u201d is not a registered keyword.",
"html-rdfalite/0071-novalid.html": "Bad value \u201ccc:license\u201d for attribute \u201crel\u201d on element \u201ca\u201d: Bad list of link-type keywords: The string \u201ccc:license\u201d is not a registered keyword.",
@@ -44,44 +44,44 @@
"html-svg/animate-elem-24-t-novalid.html": "Duplicate ID \u201cMyFont\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-dom-01-f-novalid.html": "Attribute \u201cxml:id\u201d not allowed on element \u201crect\u201d at this point.",
+ "html-svg/coords-dom-02-f-novalid.html": "Attribute \u201cxml:id\u201d not allowed on element \u201crect\u201d at this point.",
"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-color-02-b-novalid.html": "Element \u201cfeFuncR\u201d not allowed as child of element \u201cfeComponentTransfer\u201d in this context. (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/masking-filter-01-f-novalid.html": "Attribute \u201cfilterprimitiveunits\u201d not allowed on element \u201cfilter\u201d in this context.",
+ "html-svg/interact-pointer-02-t-novalid.html": "Attribute \u201cx\u201d not allowed on element \u201cclipPath\u201d at this point.",
+ "html-svg/linking-a-09-b-novalid.html": "Element \u201ctspan\u201d not allowed as child of element \u201ca\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html-svg/masking-filter-01-f-novalid.html": "Attribute \u201cfilterprimitiveunits\u201d not allowed on element \u201cfilter\u201d at this point.",
"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/painting-marker-04-f-novalid.html": "Attribute \u201cmarker\u201d not allowed on element \u201cg\u201d at this point.",
"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/pservers-grad-23-f-novalid.html": "Attribute \u201cstop-color\u201d not allowed on element \u201crect\u201d at this point.",
+ "html-svg/script-specify-01-f-novalid.html": "Attribute \u201ccontentscripttype\u201d not allowed on element \u201csvg\u201d at this point.",
+ "html-svg/shapes-rect-03-t-novalid.html": "Attribute \u201cxml:id\u201d not allowed on element \u201crect\u201d at this point.",
"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/struct-use-11-f-novalid.html": "Attribute \u201cfoo\u201d not allowed on element \u201ccircle\u201d at this point.",
+ "html-svg/struct-use-12-f-novalid.html": "Element \u201cuse\u201d not allowed as child of element \u201cuse\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html-svg/styling-pres-02-f-novalid.html": "Attribute \u201cfill\u201d not allowed on element \u201cimage\u201d at this point.",
+ "html-svg/svgdom-over-01-f-novalid.html": "Element \u201cstop\u201d not allowed as child of element \u201cdefs\u201d in this context. (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-svg/text-fonts-05-f-novalid.html": "Attribute \u201cline-height\u201d not allowed on element \u201ctspan\u201d at this point.",
+ "html-svg/types-dom-04-b-novalid.html": "Attribute \u201cexternalresourcesrequired\u201d not allowed on element \u201csvg\u201d at this point.",
"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.",
+ "html/attributes/data/no-characters-after-hyphen-novalid.html": "Attribute \u201cdata-\u201d not allowed on element \u201cp\u201d at this point.",
"html/attributes/data/not-xml-serializable-novalid.html": "\u201cdata-*\u201d attribute names must be XML 1.0 4th ed. plus Namespaces NCNames.",
"html/attributes/lang/deprecated-tag-haswarn.html": "Bad value \u201cmo\u201d for attribute \u201clang\u201d on element \u201cbody\u201d: Bad language tag: The language subtag \u201cmo\u201d is deprecated. Use \u201cro\u201d instead.",
"html/attributes/lang/extlang-bad-novalid.html": "Bad value \u201cbat-smg\u201d for attribute \u201clang\u201d on element \u201cbody\u201d: Bad language tag: Bad extlang subtag \u201csmg\u201d.",
@@ -154,8 +154,8 @@
"html/elements/a/href/userinfo-password-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://foo:\ud83d\udca9@example.com\u201d for attribute \u201chref\u201d on element \u201ca\u201d: Bad URL: Illegal character in user or password: \u201c\ud83d\udca9\u201d is not allowed.",
"html/elements/a/href/userinfo-username-contains-at-sign-novalid.html": "Bad value \u201chttp://::@c@d:2\u201d for attribute \u201chref\u201d on element \u201ca\u201d: Bad URL: User or password contains an at symbol (\"@\") not percent-encoded.",
"html/elements/a/href/userinfo-username-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://\ud83d\udca9:foo@example.com\u201d for attribute \u201chref\u201d on element \u201ca\u201d: Bad URL: Illegal character in user or password: \u201c\ud83d\udca9\u201d is not allowed.",
- "html/elements/a/media-novalid.html": "Attribute \u201cmedia\u201d not allowed on element \u201ca\u201d in this context.",
- "html/elements/a/model-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201ca\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/a/media-novalid.html": "Attribute \u201cmedia\u201d not allowed on element \u201ca\u201d at this point.",
+ "html/elements/a/model-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201ca\u201d in this context. (Suppressing further errors from this subtree.)",
"html/elements/a/name-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201cname\u201d on element \u201ca\u201d: Bad id: An ID must not be the empty string.",
"html/elements/abbr/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
"html/elements/address/model-novalid.html": "The element \u201caddress\u201d must not appear as a descendant of the \u201caddress\u201d element.",
@@ -224,9 +224,9 @@
"html/elements/area/href/userinfo-password-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://foo:\ud83d\udca9@example.com\u201d for attribute \u201chref\u201d on element \u201carea\u201d: Bad URL: Illegal character in user or password: \u201c\ud83d\udca9\u201d is not allowed.",
"html/elements/area/href/userinfo-username-contains-at-sign-novalid.html": "Bad value \u201chttp://::@c@d:2\u201d for attribute \u201chref\u201d on element \u201carea\u201d: Bad URL: User or password contains an at symbol (\"@\") not percent-encoded.",
"html/elements/area/href/userinfo-username-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://\ud83d\udca9:foo@example.com\u201d for attribute \u201chref\u201d on element \u201carea\u201d: Bad URL: Illegal character in user or password: \u201c\ud83d\udca9\u201d is not allowed.",
- "html/elements/area/media-novalid.html": "Attribute \u201cmedia\u201d not allowed on element \u201carea\u201d in this context.",
- "html/elements/area/model-novalid.html": "Attribute \u201ccoords\u201d not allowed on element \u201carea\u201d in this context.",
- "html/elements/audio/model-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201caudio\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/area/media-novalid.html": "Attribute \u201cmedia\u201d not allowed on element \u201carea\u201d at this point.",
+ "html/elements/area/model-novalid.html": "Attribute \u201ccoords\u201d not allowed on element \u201carea\u201d at this point.",
+ "html/elements/audio/model-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201caudio\u201d in this context. (Suppressing further errors from this subtree.)",
"html/elements/audio/src-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201csrc\u201d on element \u201caudio\u201d: Bad URL: Must be non-empty.",
"html/elements/audio/src-whitespace-only-novalid.html": "Bad value \u201c\t \n\u201d for attribute \u201csrc\u201d on element \u201caudio\u201d: Bad URL: Must be non-empty.",
"html/elements/audio/src/fragment-backslash-novalid.html": "Bad value \u201c#\\\u201d for attribute \u201csrc\u201d on element \u201caudio\u201d: Bad URL: Illegal character in fragment: \u201c\\\u201d is not allowed.",
@@ -495,7 +495,7 @@
"html/elements/button/formaction/userinfo-password-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://foo:\ud83d\udca9@example.com\u201d for attribute \u201cformaction\u201d on element \u201cbutton\u201d: Bad URL: Illegal character in user or password: \u201c\ud83d\udca9\u201d is not allowed.",
"html/elements/button/formaction/userinfo-username-contains-at-sign-novalid.html": "Bad value \u201chttp://::@c@d:2\u201d for attribute \u201cformaction\u201d on element \u201cbutton\u201d: Bad URL: User or password contains an at symbol (\"@\") not percent-encoded.",
"html/elements/button/formaction/userinfo-username-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://\ud83d\udca9:foo@example.com\u201d for attribute \u201cformaction\u201d on element \u201cbutton\u201d: Bad URL: Illegal character in user or password: \u201c\ud83d\udca9\u201d is not allowed.",
- "html/elements/canvas/model-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201ccanvas\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/canvas/model-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201ccanvas\u201d in this context. (Suppressing further errors from this subtree.)",
"html/elements/cite/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
"html/elements/code/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
"html/elements/del/cite/fragment-backslash-novalid.html": "Bad value \u201c#\\\u201d for attribute \u201ccite\u201d on element \u201cdel\u201d: Bad URL: Illegal character in fragment: \u201c\\\u201d is not allowed.",
@@ -654,18 +654,18 @@
"html/elements/del/year-novalid.html": "Bad value \u201c2006\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
"html/elements/del/yearless-date-novalid.html": "Bad value \u201c07-15\u201d for attribute \u201cdatetime\u201d on element \u201cdel\u201d: Bad datetime with timezone: The literal did not satisfy the datetime with timezone format. Bad date: The literal did not satisfy the date format.",
"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/dialog/model-novalid.html": "Element \u201cdt\u201d not allowed as child of element \u201cdialog\u201d in this context. (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/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 \u201cdl\u201d is missing one or more of the following child elements: [dd].",
- "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-dl-novalid.html": "Element \u201cdl\u201d not allowed as child of element \u201cdiv\u201d in this context. (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-multiple-groups-novalid.html": "Element \u201cdt\u201d not allowed as child of element \u201cdiv\u201d in this context. (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-dl-novalid.html": "Element \u201cdl\u201d not allowed as child of element \u201cdl\u201d in this context. (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.",
@@ -683,10 +683,10 @@
"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/mixed-div-dt-dd-novalid.html": "Element \u201cdt\u201d not allowed as child of element \u201cdl\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/dl/mixed-dt-dd-div-novalid.html": "Element \u201cdiv\u201d not allowed as child of element \u201cdl\u201d in this context. (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/nested-divs-novalid.html": "Element \u201cdiv\u201d not allowed as child of element \u201cdiv\u201d in this context. (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.",
@@ -1569,7 +1569,7 @@
"html/elements/option/label-novalid.html": "Bad value \u201c\u201d for attribute \u201clabel\u201d on element \u201coption\u201d: Bad non-empty string: Must not be empty.",
"html/elements/option/model-novalid.html": "Element \u201coption\u201d without attribute \u201clabel\u201d must not be empty.",
"html/elements/p/model-novalid.html": "No \u201cp\u201d element in scope but a \u201cp\u201d end tag seen.",
- "html/elements/param/model-novalid.html": "Element \u201cparam\u201d not allowed in this context. (The parent was element \u201cbody\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/param/model-novalid.html": "Element \u201cparam\u201d not allowed as child of element \u201cbody\u201d in this context. (Suppressing further errors from this subtree.)",
"html/elements/picture/always-matching-source-media-all-spaces-with-following-source-srcset-novalid.html": "Value of \u201cmedia\u201d attribute here must not be \u201call\u201d.",
"html/elements/picture/always-matching-source-media-all-with-following-source-srcset-novalid.html": "Value of \u201cmedia\u201d attribute here must not be \u201call\u201d.",
"html/elements/picture/always-matching-source-media-empty-with-following-source-srcset-novalid.html": "Bad value \u201c\u201d for attribute \u201cmedia\u201d on element \u201csource\u201d: Bad media query: Media query ended prematurely.",
@@ -1580,7 +1580,7 @@
"html/elements/picture/always-matching-source-with-following-source-media-novalid.html": "A \u201csource\u201d element that has a following sibling \u201csource\u201d element or \u201cimg\u201d element with a \u201csrcset\u201d attribute must have a \u201cmedia\u201d attribute and/or \u201ctype\u201d attribute.",
"html/elements/picture/always-matching-source-with-following-source-srcset-novalid.html": "A \u201csource\u201d element that has a following sibling \u201csource\u201d element or \u201cimg\u201d element with a \u201csrcset\u201d attribute must have a \u201cmedia\u201d attribute and/or \u201ctype\u201d attribute.",
"html/elements/picture/always-matching-source-with-following-source-type-novalid.html": "A \u201csource\u201d element that has a following sibling \u201csource\u201d element or \u201cimg\u201d element with a \u201csrcset\u201d attribute must have a \u201cmedia\u201d attribute and/or \u201ctype\u201d attribute.",
- "html/elements/picture/audio-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201caudio\u201d in this context.",
+ "html/elements/picture/audio-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201caudio\u201d at this point.",
"html/elements/picture/html-syntax-img-end-tag-novalid.html": "Stray end tag \u201cimg\u201d.",
"html/elements/picture/html-syntax-picture-no-end-tag-novalid.html": "End of file seen and there were open elements.",
"html/elements/picture/html-syntax-picture-slash-no-end-tag-novalid.html": "Self-closing syntax (\u201c/>\u201d) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
@@ -1594,73 +1594,73 @@
"html/elements/picture/img-srcset-no-descriptor-with-sizes-novalid.html": "Bad value \u201cx\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: No width specified for image \u201cx\u201d. (When the \u201csizes\u201d attribute is present, all image candidate strings must specify a width.)",
"html/elements/picture/img-srcset-w-and-x-width-sizes-novalid.html": "Bad value \u201cx 100w, y 2x\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Expected width descriptor but found \u201c2x\u201d at \u201cx 100w, y 2x\u201d. (When the \u201csizes\u201d attribute is present, all image candidate strings must specify a width.)",
"html/elements/picture/img-srcset-w-no-sizes-novalid.html": "When the \u201csrcset\u201d attribute has any image candidate string with a width descriptor, the \u201csizes\u201d attribute must also be present.",
- "html/elements/picture/img-type-novalid.html": "Attribute \u201ctype\u201d not allowed on element \u201cimg\u201d in this context.",
- "html/elements/picture/img-type-with-picture-novalid.html": "Attribute \u201ctype\u201d not allowed on element \u201cimg\u201d in this context.",
+ "html/elements/picture/img-type-novalid.html": "Attribute \u201ctype\u201d not allowed on element \u201cimg\u201d at this point.",
+ "html/elements/picture/img-type-with-picture-novalid.html": "Attribute \u201ctype\u201d not allowed on element \u201cimg\u201d at this point.",
"html/elements/picture/img-with-sizes-no-srcset-novalid.html": "The \u201csizes\u201d attribute may be specified only if the \u201csrcset\u201d attribute is also present.",
- "html/elements/picture/input-type-image-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201cinput\u201d in this context.",
- "html/elements/picture/junk-br-after-img-novalid.html": "Element \u201cbr\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-br-after-source-novalid.html": "Element \u201cbr\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-br-before-img-novalid.html": "Element \u201cbr\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-br-before-source-novalid.html": "Element \u201cbr\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-figure-wrapping-novalid.html": "Element \u201cfigure\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-input-type-hidden-novalid.html": "Element \u201cinput\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-math-nog-img-novalid.html": "Element \u201cmath\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-noscript-after-source-no-img-novalid.html": "Element \u201cnoscript\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-noscript-novalid.html": "Element \u201cnoscript\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-p-after-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-p-before-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-p-wrapping-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-picture-before-novalid.html": "Element \u201cpicture\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-picture-wrapping-novalid.html": "Element \u201cpicture\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-span-after-novalid.html": "Element \u201cspan\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-span-before-novalid.html": "Element \u201cspan\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-span-wrapping-novalid.html": "Element \u201cspan\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-style-scroped-novalid.html": "Element \u201cstyle\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-svg-no-img-novalid.html": "Element \u201csvg\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-svg-novalid.html": "Element \u201csvg\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/picture/input-type-image-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201cinput\u201d at this point.",
+ "html/elements/picture/junk-br-after-img-novalid.html": "Element \u201cbr\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-br-after-source-novalid.html": "Element \u201cbr\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-br-before-img-novalid.html": "Element \u201cbr\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-br-before-source-novalid.html": "Element \u201cbr\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-figure-wrapping-novalid.html": "Element \u201cfigure\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-input-type-hidden-novalid.html": "Element \u201cinput\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-math-nog-img-novalid.html": "Element \u201cmath\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-noscript-after-source-no-img-novalid.html": "Element \u201cnoscript\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-noscript-novalid.html": "Element \u201cnoscript\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-p-after-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-p-before-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-p-wrapping-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-picture-before-novalid.html": "Element \u201cpicture\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-picture-wrapping-novalid.html": "Element \u201cpicture\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-span-after-novalid.html": "Element \u201cspan\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-span-before-novalid.html": "Element \u201cspan\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-span-wrapping-novalid.html": "Element \u201cspan\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-style-scroped-novalid.html": "Element \u201cstyle\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-svg-no-img-novalid.html": "Element \u201csvg\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-svg-novalid.html": "Element \u201csvg\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
"html/elements/picture/junk-text-after-img-novalid.html": "Text not allowed in element \u201cpicture\u201d in this context.",
"html/elements/picture/junk-text-after-source-novalid.html": "Text not allowed in element \u201cpicture\u201d in this context.",
"html/elements/picture/junk-text-before-img-novalid.html": "Text not allowed in element \u201cpicture\u201d in this context.",
"html/elements/picture/junk-text-before-source-novalid.html": "Text not allowed in element \u201cpicture\u201d in this context.",
- "html/elements/picture/junk-video-before-novalid.html": "Element \u201cvideo\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/junk-video-no-img-novalid.html": "Element \u201cvideo\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/link-rel-icon-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201clink\u201d in this context.",
+ "html/elements/picture/junk-video-before-novalid.html": "Element \u201cvideo\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/junk-video-no-img-novalid.html": "Element \u201cvideo\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/link-rel-icon-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201clink\u201d at this point.",
"html/elements/picture/missing-img-empty-picture-novalid.html": "Element \u201cpicture\u201d is missing required child element \u201cimg\u201d.",
"html/elements/picture/missing-img-only-script-novalid.html": "Element \u201cpicture\u201d is missing required child element \u201cimg\u201d.",
"html/elements/picture/missing-img-only-source-novalid.html": "Element \u201cpicture\u201d is missing required child element \u201cimg\u201d.",
"html/elements/picture/missing-img-script-and-source-novalid.html": "Element \u201cpicture\u201d is missing required child element \u201cimg\u201d.",
"html/elements/picture/missing-img-source-and-script-novalid.html": "Element \u201cpicture\u201d is missing required child element \u201cimg\u201d.",
- "html/elements/picture/multiple-img-novalid.html": "Element \u201cimg\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/multiple-img-with-script-novalid.html": "Element \u201cimg\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/multiple-img-with-source-and-script-novalid.html": "Element \u201cimg\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/multiple-img-with-source-novalid.html": "Element \u201cimg\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/object-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201cobject\u201d in this context.",
- "html/elements/picture/parent-dl-novalid.html": "Element \u201cpicture\u201d not allowed in this context. (The parent was element \u201cdl\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/parent-hgroup-novalid.html": "Element \u201cpicture\u201d not allowed in this context. (The parent was element \u201chgroup\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/picture/multiple-img-novalid.html": "Element \u201cimg\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/multiple-img-with-script-novalid.html": "Element \u201cimg\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/multiple-img-with-source-and-script-novalid.html": "Element \u201cimg\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/multiple-img-with-source-novalid.html": "Element \u201cimg\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/object-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201cobject\u201d at this point.",
+ "html/elements/picture/parent-dl-novalid.html": "Element \u201cpicture\u201d not allowed as child of element \u201cdl\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/parent-hgroup-novalid.html": "Element \u201cpicture\u201d not allowed as child of element \u201chgroup\u201d in this context. (Suppressing further errors from this subtree.)",
"html/elements/picture/parent-noscript-in-head-novalid.html": "Bad start tag in \u201cpicture\u201d in \u201chead\u201d.",
- "html/elements/picture/parent-ul-novalid.html": "Element \u201cpicture\u201d not allowed in this context. (The parent was element \u201cul\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/picture-align-novalid.html": "Attribute \u201calign\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-alt-novalid.html": "Attribute \u201calt\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-aria-role-application-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-aria-role-button-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-aria-role-img-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-aria-role-presentation-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-aria-role-region-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-border-novalid.html": "Attribute \u201cborder\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-crossorigin-novalid.html": "Attribute \u201ccrossorigin\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-height-novalid.html": "Attribute \u201cheight\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-hspace-novalid.html": "Attribute \u201chspace\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-ismap-novalid.html": "Attribute \u201cismap\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-longdesc-novalid.html": "Attribute \u201clongdesc\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-lowsrc-novalid.html": "Attribute \u201clowsrc\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-media-novalid.html": "Attribute \u201cmedia\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-name-novalid.html": "Attribute \u201cname\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-sizes-novalid.html": "Attribute \u201csizes\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-src-novalid.html": "Attribute \u201csrc\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-usemap-novalid.html": "Attribute \u201cusemap\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-vspace-novalid.html": "Attribute \u201cvspace\u201d not allowed on element \u201cpicture\u201d in this context.",
- "html/elements/picture/picture-width-novalid.html": "Attribute \u201cwidth\u201d not allowed on element \u201cpicture\u201d in this context.",
+ "html/elements/picture/parent-ul-novalid.html": "Element \u201cpicture\u201d not allowed as child of element \u201cul\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/picture-align-novalid.html": "Attribute \u201calign\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-alt-novalid.html": "Attribute \u201calt\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-aria-role-application-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-aria-role-button-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-aria-role-img-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-aria-role-presentation-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-aria-role-region-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-border-novalid.html": "Attribute \u201cborder\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-crossorigin-novalid.html": "Attribute \u201ccrossorigin\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-height-novalid.html": "Attribute \u201cheight\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-hspace-novalid.html": "Attribute \u201chspace\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-ismap-novalid.html": "Attribute \u201cismap\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-longdesc-novalid.html": "Attribute \u201clongdesc\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-lowsrc-novalid.html": "Attribute \u201clowsrc\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-media-novalid.html": "Attribute \u201cmedia\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-name-novalid.html": "Attribute \u201cname\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-sizes-novalid.html": "Attribute \u201csizes\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-src-novalid.html": "Attribute \u201csrc\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-usemap-novalid.html": "Attribute \u201cusemap\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-vspace-novalid.html": "Attribute \u201cvspace\u201d not allowed on element \u201cpicture\u201d at this point.",
+ "html/elements/picture/picture-width-novalid.html": "Attribute \u201cwidth\u201d not allowed on element \u201cpicture\u201d at this point.",
"html/elements/picture/sizes-microsyntax-auto-source-size-value-novalid.html": "Bad value \u201cauto\u201d for attribute \u201csizes\u201d on element \u201cimg\u201d: Bad source size list: Bad CSS number token: Expected a minus sign or a digit but saw \u201ca\u201d instead at \u201cauto\u201d.",
"html/elements/picture/sizes-microsyntax-comma-novalid.html": "Bad value \u201c,\u201d for attribute \u201csizes\u201d on element \u201cimg\u201d: Bad source size list: Starts with empty source size.",
"html/elements/picture/sizes-microsyntax-css-comment-after-plus-novalid.html": "Bad value \u201c+/**/50vw\u201d for attribute \u201csizes\u201d on element \u201cimg\u201d: Bad source size list: Expected number but found \u201c+/\u201d at \u201c+/**/50vw\u201d.",
@@ -1697,33 +1697,33 @@
"html/elements/picture/sizes-microsyntax-trailing-junk-novalid.html": "Bad value \u201c(min-width:500px) 500px, 100vw, foo bar\u201d for attribute \u201csizes\u201d on element \u201cimg\u201d: Bad source size list: Expected media condition before \u201c\u201d at \u201c\u2026idth:500px) 500px, 100vw,\u201d.",
"html/elements/picture/sizes-microsyntax-turn-source-size-value-novalid.html": "Bad value \u201c1turn\u201d for attribute \u201csizes\u201d on element \u201cimg\u201d: Bad source size list: Expected units (one of \u201cem\u201d, \u201cex\u201d, \u201cch\u201d, \u201crem\u201d, \u201cvw\u201d, \u201cvh\u201d, \u201cvmin\u201d, \u201cvmax\u201d, \u201ccm\u201d, \u201cmm\u201d, \u201cq\u201d, \u201cin\u201d, \u201cpc\u201d, \u201cpt\u201d, \u201cpx\u201d) but found \u201cturn\u201d at \u201c1turn\u201d.",
"html/elements/picture/sizes-microsyntax-two-defaults-novalid.html": "Bad value \u201c500px, 100vw\u201d for attribute \u201csizes\u201d on element \u201cimg\u201d: Bad source size list: Expected media condition before \u201c\u201d at \u201c500px,\u201d.",
- "html/elements/picture/source-after-img-novalid.html": "Element \u201csource\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/source-align-novalid.html": "Attribute \u201calign\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-alt-novalid.html": "Attribute \u201calt\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-aria-role-img-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-aria-role-presentation-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-before-and-after-img-novalid.html": "Element \u201csource\u201d not allowed in this context. (The parent was element \u201cpicture\u201d.) Suppressing further errors from this subtree.",
- "html/elements/picture/source-border-novalid.html": "Attribute \u201cborder\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-crossorigin-novalid.html": "Attribute \u201ccrossorigin\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-height-novalid.html": "Attribute \u201cheight\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-hspace-novalid.html": "Attribute \u201chspace\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-ismap-novalid.html": "Attribute \u201cismap\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-longdesc-novalid.html": "Attribute \u201clongdesc\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-name-novalid.html": "Attribute \u201ccrossorigin\u201d not allowed on element \u201csource\u201d in this context.",
+ "html/elements/picture/source-after-img-novalid.html": "Element \u201csource\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/source-align-novalid.html": "Attribute \u201calign\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-alt-novalid.html": "Attribute \u201calt\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-aria-role-img-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-aria-role-presentation-novalid.html": "Attribute \u201crole\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-before-and-after-img-novalid.html": "Element \u201csource\u201d not allowed as child of element \u201cpicture\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/picture/source-border-novalid.html": "Attribute \u201cborder\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-crossorigin-novalid.html": "Attribute \u201ccrossorigin\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-height-novalid.html": "Attribute \u201cheight\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-hspace-novalid.html": "Attribute \u201chspace\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-ismap-novalid.html": "Attribute \u201cismap\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-longdesc-novalid.html": "Attribute \u201clongdesc\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-name-novalid.html": "Attribute \u201ccrossorigin\u201d not allowed on element \u201csource\u201d at this point.",
"html/elements/picture/source-no-srcset-novalid.html": "Element \u201csource\u201d is missing required attribute \u201csrcset\u201d.",
"html/elements/picture/source-no-srcset-with-media-novalid.html": "Element \u201csource\u201d is missing required attribute \u201csrcset\u201d.",
"html/elements/picture/source-no-srcset-with-sizes-novalid.html": "Element \u201csource\u201d is missing required attribute \u201csrcset\u201d.",
"html/elements/picture/source-no-srcset-with-type-novalid.html": "Element \u201csource\u201d is missing required attribute \u201csrcset\u201d.",
- "html/elements/picture/source-src-novalid.html": "Attribute \u201csrc\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-src-srcset-novalid.html": "Attribute \u201csrc\u201d not allowed on element \u201csource\u201d in this context.",
+ "html/elements/picture/source-src-novalid.html": "Attribute \u201csrc\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-src-srcset-novalid.html": "Attribute \u201csrc\u201d not allowed on element \u201csource\u201d at this point.",
"html/elements/picture/source-srcset-h-with-sizes-novalid.html": "Bad value \u201cx 100h, y 200h\u201d for attribute \u201csrcset\u201d on element \u201csource\u201d: Expected width descriptor but found \u201c100h\u201d at \u201cx 100h,\u201d. (When the \u201csizes\u201d attribute is present, all image candidate strings must specify a width.)",
"html/elements/picture/source-srcset-w-and-x-with-sizes-novalid.html": "Bad value \u201cx 100w, y 2x\u201d for attribute \u201csrcset\u201d on element \u201csource\u201d: Expected width descriptor but found \u201c2x\u201d at \u201cx 100w, y 2x\u201d. (When the \u201csizes\u201d attribute is present, all image candidate strings must specify a width.)",
"html/elements/picture/source-srcset-w-no-sizes-novalid.html": "When the \u201csrcset\u201d attribute has any image candidate string with a width descriptor, the \u201csizes\u201d attribute must also be present.",
"html/elements/picture/source-srcset-x-with-sizes-novalid.html": "Bad value \u201cx 1x, y 2x\u201d for attribute \u201csrcset\u201d on element \u201csource\u201d: Expected width descriptor but found \u201c1x\u201d at \u201cx 1x,\u201d. (When the \u201csizes\u201d attribute is present, all image candidate strings must specify a width.)",
"html/elements/picture/source-type-srcset-w-novalid.html": "When the \u201csrcset\u201d attribute has any image candidate string with a width descriptor, the \u201csizes\u201d attribute must also be present.",
- "html/elements/picture/source-usemap-novalid.html": "Attribute \u201cusemap\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-vspace-novalid.html": "Attribute \u201cvspace\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/source-width-novalid.html": "Attribute \u201cwidth\u201d not allowed on element \u201csource\u201d in this context.",
+ "html/elements/picture/source-usemap-novalid.html": "Attribute \u201cusemap\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-vspace-novalid.html": "Attribute \u201cvspace\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/source-width-novalid.html": "Attribute \u201cwidth\u201d not allowed on element \u201csource\u201d at this point.",
"html/elements/picture/srcset-microsyntax-broken-url-novalid.html": "Bad value \u201chttp: 1x\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Bad image-candidate URL: \u201chttp:\u201d: Expected a slash (\"/\").",
"html/elements/picture/srcset-microsyntax-comma-novalid.html": "Bad value \u201c,\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Starts with empty image-candidate string.",
"html/elements/picture/srcset-microsyntax-css-comment-after-descriptor-novalid.html": "Bad value \u201cx 2x/**/\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Expected number followed by \u201cw\u201d or \u201cx\u201d but found \u201c2x/**/\u201d at \u201cx 2x/**/\u201d.",
@@ -1734,7 +1734,6 @@
"html/elements/picture/srcset-microsyntax-infinity-x-novalid.html": "Bad value \u201cx Infinityx\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Bad positive floating point number: Expected a digit but saw \u201cI\u201d instead at \u201cx Infinityx\u201d.",
"html/elements/picture/srcset-microsyntax-leading-comma-multiple-novalid.html": "Bad value \u201c,,,x\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Starts with empty image-candidate string.",
"html/elements/picture/srcset-microsyntax-leading-comma-novalid.html": "Bad value \u201c,x\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Starts with empty image-candidate string.",
- "html/elements/picture/srcset-microsyntax-leading-dot-x-novalid.html": "Bad value \u201cx .5x\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Bad positive floating point number: Expected a digit but saw \u201c.\u201d instead at \u201cx .5x\u201d.",
"html/elements/picture/srcset-microsyntax-nan-x-novalid.html": "Bad value \u201cx NaNx\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Bad positive floating point number: Expected a digit but saw \u201cN\u201d instead at \u201cx NaNx\u201d.",
"html/elements/picture/srcset-microsyntax-negative-w-novalid.html": "Bad value \u201cx -1w\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Expected number greater than zero but found \u201c-1\u201d at \u201cx -1w\u201d.",
"html/elements/picture/srcset-microsyntax-negative-x-novalid.html": "Bad value \u201cx -1x\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Expected number greater than zero but found \u201c-1\u201d at \u201cx -1x\u201d.",
@@ -1760,13 +1759,13 @@
"html/elements/picture/srcset-microsyntax-x-and-w-novalid.html": "Bad value \u201cx 1x 1w\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Expected width descriptor but found \u201c1x\u201d at \u201cx 1x \u201d. (When the \u201csizes\u201d attribute is present, all image candidate strings must specify a width.)",
"html/elements/picture/srcset-microsyntax-zero-w-novalid.html": "Bad value \u201cx 0w\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Expected number greater than zero but found \u201c0\u201d at \u201cx 0w\u201d.",
"html/elements/picture/srcset-microsyntax-zero-x-novalid.html": "Bad value \u201cx 0x\u201d for attribute \u201csrcset\u201d on element \u201cimg\u201d: Bad positive floating point number: Zero is not a valid positive floating point number at \u201cx 0x\u201d.",
- "html/elements/picture/svg-image-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201cimage\u201d in this context.",
- "html/elements/picture/track-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201ctrack\u201d in this context.",
- "html/elements/picture/video-source-media-src-novalid.html": "Attribute \u201cmedia\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/video-source-sizes-srcset-novalid.html": "Attribute \u201csizes\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/video-source-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/video-source-srcset-src-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201csource\u201d in this context.",
- "html/elements/picture/video-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201cvideo\u201d in this context.",
+ "html/elements/picture/svg-image-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201cimage\u201d at this point.",
+ "html/elements/picture/track-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201ctrack\u201d at this point.",
+ "html/elements/picture/video-source-media-src-novalid.html": "Attribute \u201cmedia\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/video-source-sizes-srcset-novalid.html": "Attribute \u201csizes\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/video-source-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/video-source-srcset-src-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201csource\u201d at this point.",
+ "html/elements/picture/video-srcset-novalid.html": "Attribute \u201csrcset\u201d not allowed on element \u201cvideo\u201d at this point.",
"html/elements/pre/model-novalid.html": "No \u201cp\u201d element in scope but a \u201cp\u201d end tag seen.",
"html/elements/q/cite/fragment-backslash-novalid.html": "Bad value \u201c#\\\u201d for attribute \u201ccite\u201d on element \u201cq\u201d: Bad URL: Illegal character in fragment: \u201c\\\u201d is not allowed.",
"html/elements/q/cite/fragment-contains-hash-novalid.html": "Bad value \u201chttp://foo/path#f#g\u201d for attribute \u201ccite\u201d on element \u201cq\u201d: Bad URL: Illegal character in fragment: \u201c#\u201d is not allowed.",
@@ -1975,12 +1974,12 @@
"html/elements/source/src/userinfo-username-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://\ud83d\udca9:foo@example.com\u201d for attribute \u201csrc\u201d on element \u201csource\u201d: Bad URL: Illegal character in user or password: \u201c\ud83d\udca9\u201d is not allowed.",
"html/elements/span/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
"html/elements/strong/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
- "html/elements/style/scoped-as-div-child-novalid.html": "Element \u201cstyle\u201d not allowed in this context. (The parent was element \u201cdiv\u201d.) Suppressing further errors from this subtree.",
- "html/elements/style/scoped-as-p-child-novalid.html": "Element \u201cstyle\u201d not allowed in this context. (The parent was element \u201cp\u201d.) Suppressing further errors from this subtree.",
- "html/elements/style/scoped-in-head-novalid.html": "Attribute \u201cscoped\u201d not allowed on element \u201cstyle\u201d in this context.",
- "html/elements/style/scoped-model-novalid.html": "Element \u201cstyle\u201d not allowed in this context. (The parent was element \u201cdiv\u201d.) Suppressing further errors from this subtree.",
- "html/elements/style/scoped-multiple-adjacent-novalid.html": "Element \u201cstyle\u201d not allowed in this context. (The parent was element \u201cdiv\u201d.) Suppressing further errors from this subtree.",
- "html/elements/style/scoped-novalid.html": "Element \u201cstyle\u201d not allowed in this context. (The parent was element \u201cdiv\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/style/scoped-as-div-child-novalid.html": "Element \u201cstyle\u201d not allowed as child of element \u201cdiv\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/style/scoped-as-p-child-novalid.html": "Element \u201cstyle\u201d not allowed as child of element \u201cp\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/style/scoped-in-head-novalid.html": "Attribute \u201cscoped\u201d not allowed on element \u201cstyle\u201d at this point.",
+ "html/elements/style/scoped-model-novalid.html": "Element \u201cstyle\u201d not allowed as child of element \u201cdiv\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/style/scoped-multiple-adjacent-novalid.html": "Element \u201cstyle\u201d not allowed as child of element \u201cdiv\u201d in this context. (Suppressing further errors from this subtree.)",
+ "html/elements/style/scoped-novalid.html": "Element \u201cstyle\u201d not allowed as child of element \u201cdiv\u201d in this context. (Suppressing further errors from this subtree.)",
"html/elements/sub/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
"html/elements/sup/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
"html/elements/table/integrity/Alexis_of_Russia-novalid.html": "Bad value \u201ccopyright\u201d for attribute \u201crel\u201d on element \u201clink\u201d: Bad list of link-type keywords: The keyword \u201ccopyright\u201d for the \u201crel\u201d attribute should not be used. Consider using \u201clicense\u201d instead.",
@@ -2061,7 +2060,7 @@
"html/elements/track/src/userinfo-username-contains-pile-of-poo-novalid.html": "Bad value \u201chttp://\ud83d\udca9:foo@example.com\u201d for attribute \u201csrc\u201d on element \u201ctrack\u201d: Bad URL: Illegal character in user or password: \u201c\ud83d\udca9\u201d is not allowed.",
"html/elements/ul/model-novalid.html": "Duplicate ID \u201cid\u201d.",
"html/elements/var/model-novalid.html": "End tag \u201cp\u201d implied, but there were open elements.",
- "html/elements/video/model-novalid.html": "Element \u201cp\u201d not allowed in this context. (The parent was element \u201cvideo\u201d.) Suppressing further errors from this subtree.",
+ "html/elements/video/model-novalid.html": "Element \u201cp\u201d not allowed as child of element \u201cvideo\u201d in this context. (Suppressing further errors from this subtree.)",
"html/elements/video/poster-empty-novalid.html": "Bad value \u201c\u201d for attribute \u201cposter\u201d on element \u201cvideo\u201d: Bad URL: Must be non-empty.",
"html/elements/video/poster-whitespace-only-novalid.html": "Bad value \u201c\t \n\u201d for attribute \u201cposter\u201d on element \u201cvideo\u201d: Bad URL: Must be non-empty.",
"html/elements/video/poster/fragment-backslash-novalid.html": "Bad value \u201c#\\\u201d for attribute \u201cposter\u201d on element \u201cvideo\u201d: Bad URL: Illegal character in fragment: \u201c\\\u201d is not allowed.",
@@ -2379,7 +2378,7 @@
"html/obsolete/strike-novalid.html": "The \u201cstrike\u201d element is obsolete. Use CSS instead.",
"html/obsolete/tt-novalid.html": "The \u201ctt\u201d element is obsolete. Use CSS instead.",
"html/other/applet-novalid.html": "The \u201capplet\u201d element is obsolete. Use the \u201cobject\u201d element instead.",
- "html/other/obj-novalid.html": "Element \u201cobj\u201d not allowed in this context. (The parent was element \u201cp\u201d.) Suppressing further errors from this subtree.",
+ "html/other/obj-novalid.html": "Element \u201cobj\u201d not allowed as child of element \u201cp\u201d in this context. (Suppressing further errors from this subtree.)",
"html/parser/cr-charref-novalid.html": "A numeric character reference expanded to carriage return.",
"html/parser/range-charref-novalid.html": "Character reference outside the permissible Unicode range.",
"html/parser/u000b-charref-novalid.html": "Character reference expands to a control character (U+000b).",
@@ -2395,16 +2394,16 @@
"xhtml/attributes/spellcheck/350-novalid.xhtml": "Bad value \u201cbadvalue\u201d for attribute \u201cspellcheck\u201d on element \u201cp\u201d.",
"xhtml/elements/a/100-novalid.xhtml": "Bad value \u201c\u201d for attribute \u201cname\u201d on element \u201ca\u201d: Bad id: An ID must not be the empty string.",
"xhtml/elements/base/001-novalid.xhtml": "Element \u201cbase\u201d is missing one or more of the following attributes: [href, target].",
- "xhtml/elements/dialog/001-novalid.xhtml": "Element \u201cdt\u201d not allowed in this context. (The parent was element \u201cdialog\u201d.) Suppressing further errors from this subtree.",
+ "xhtml/elements/dialog/001-novalid.xhtml": "Element \u201cdt\u201d not allowed as child of element \u201cdialog\u201d in this context. (Suppressing further errors from this subtree.)",
"xhtml/elements/embed/001-novalid.xhtml": "Bad value \u201c20%\u201d for attribute \u201cheight\u201d on element \u201cembed\u201d: Bad non-negative integer: Expected a digit but saw \u201c%\u201d instead.",
"xhtml/elements/embed/002-novalid.xhtml": "Bad value \u201cfoo\u201d for attribute \u201ctype\u201d on element \u201cembed\u201d: Bad MIME type: Subtype missing.",
"xhtml/elements/embed/003-novalid.xhtml": "Bad value \u201c20%\u201d for attribute \u201cwidth\u201d on element \u201cembed\u201d: Bad non-negative integer: Expected a digit but saw \u201c%\u201d instead.",
"xhtml/elements/figure/002-novalid.xhtml": "Text not allowed in element \u201cfigure\u201d in this context.",
- "xhtml/elements/figure/101-novalid.xhtml": "Element \u201cimg\u201d not allowed in this context. (The parent was element \u201cfigure\u201d.) Suppressing further errors from this subtree.",
+ "xhtml/elements/figure/101-novalid.xhtml": "Element \u201cimg\u201d not allowed as child of element \u201cfigure\u201d in this context. (Suppressing further errors from this subtree.)",
"xhtml/elements/figure/102-novalid.xhtml": "Text not allowed in element \u201cfigure\u201d in this context.",
"xhtml/elements/figure/103-novalid.xhtml": "Text not allowed in element \u201cfigure\u201d in this context.",
- "xhtml/elements/figure/104-novalid.xhtml": "Element \u201cimg\u201d not allowed in this context. (The parent was element \u201cfigure\u201d.) Suppressing further errors from this subtree.",
- "xhtml/elements/figure/304-novalid.xhtml": "Element \u201cimg\u201d not allowed in this context. (The parent was element \u201cfigure\u201d.) Suppressing further errors from this subtree.",
+ "xhtml/elements/figure/104-novalid.xhtml": "Element \u201cimg\u201d not allowed as child of element \u201cfigure\u201d in this context. (Suppressing further errors from this subtree.)",
+ "xhtml/elements/figure/304-novalid.xhtml": "Element \u201cimg\u201d not allowed as child of element \u201cfigure\u201d in this context. (Suppressing further errors from this subtree.)",
"xhtml/elements/footer/001-novalid.xhtml": "The element \u201cfooter\u201d must not appear as a descendant of the \u201cfooter\u201d element.",
"xhtml/elements/footer/003-novalid.xhtml": "The element \u201cheader\u201d must not appear as a descendant of the \u201cfooter\u201d element.",
"xhtml/elements/header/001-novalid.xhtml": "The element \u201cfooter\u201d must not appear as a descendant of the \u201cheader\u201d element.",
@@ -2433,8 +2432,15 @@
"xhtml/elements/keygen/361-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ",
"xhtml/elements/keygen/keygen-novalid.xhtml": "The \u201ckeygen\u201d element is obsolete. ",
"xhtml/elements/link/001-novalid.xhtml": "Element \u201clink\u201d is missing required attribute \u201chref\u201d.",
- "xhtml/elements/menu/001-haswarn.xhtml": "The \u201ccontextmenu\u201d attribute is not supported in all browsers. Please be sure to test, and consider using a polyfill.",
- "xhtml/elements/menu/001-novalid.xhtml": "The \u201ccontextmenu\u201d attribute must refer to a \u201cmenu\u201d element.",
+ "xhtml/elements/menu/menu-containing-hr-novalid.xhtml": "Element \u201chr\u201d not allowed as child of element \u201cmenu\u201d in this context. (Suppressing further errors from this subtree.)",
+ "xhtml/elements/menu/menu-containing-menu-novalid.xhtml": "Element \u201cmenu\u201d not allowed as child of element \u201cmenu\u201d in this context. (Suppressing further errors from this subtree.)",
+ "xhtml/elements/menu/menu-containing-text-novalid.xhtml": "Text not allowed in element \u201cmenu\u201d in this context.",
+ "xhtml/elements/menu/menu-type-context-novalid.xhtml": "Attribute \u201ctype\u201d not allowed on element \u201cmenu\u201d at this point.",
+ "xhtml/elements/menu/menu-type-popup-novalid.xhtml": "Attribute \u201ctype\u201d not allowed on element \u201cmenu\u201d at this point.",
+ "xhtml/elements/menu/menu-type-toolbar-novalid.xhtml": "Attribute \u201ctype\u201d not allowed on element \u201cmenu\u201d at this point.",
+ "xhtml/elements/menu/menuitem-children-novalid.xhtml": "Element \u201cmenuitem\u201d not allowed as child of element \u201cmenu\u201d in this context. (Suppressing further errors from this subtree.)",
+ "xhtml/elements/menu/menuitem-label-novalid.xhtml": "Element \u201cmenuitem\u201d not allowed as child of element \u201cmenu\u201d in this context. (Suppressing further errors from this subtree.)",
+ "xhtml/elements/menu/p-contextmenu-novalid.xhtml": "Attribute \u201ccontextmenu\u201d not allowed on element \u201cp\u201d at this point.",
"xhtml/elements/meter/010-novalid.xhtml": "The value of the \u201cmin\u201d attribute must be less than or equal to the value of the \u201cvalue\u201d attribute.",
"xhtml/elements/meter/011-novalid.xhtml": "Element \u201cmeter\u201d is missing required attribute \u201cvalue\u201d.",
"xhtml/elements/meter/012-novalid.xhtml": "Element \u201cmeter\u201d is missing required attribute \u201cvalue\u201d.",
@@ -2452,6 +2458,6 @@
"xhtml/elements/table/202-novalid.xhtml": "Table cell is overlapped by later table cell.",
"xhtml/elements/table/203-novalid.xhtml": "Table column 3 established by element \u201ctd\u201d has no cells beginning in it.",
"xhtml/elements/table/204-novalid.xhtml": "Row 3 of an implicit row group has no cells beginning on it.",
- "xhtml/elements/table/205-novalid.xhtml": "Element \u201ccol\u201d not allowed in this context. (The parent was element \u201ctable\u201d.) Suppressing further errors from this subtree.",
+ "xhtml/elements/table/205-novalid.xhtml": "Element \u201ccol\u201d not allowed as child of element \u201ctable\u201d in this context. (Suppressing further errors from this subtree.)",
"xhtml/other/045-novalid.xhtml": "The \u201capplet\u201d element is obsolete. Use the \u201cobject\u201d element instead."
}
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/manifest-src-allowed.sub.html b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/manifest-src-allowed.sub.html
deleted file mode 100644
index fe6d2b1c2c6..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/manifest-src-allowed.sub.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<link rel="manifest" href="manifest.test/manifest.json">
-<script>
- {
- testRunner.getManifestThen(function() {
- alert_assert("Pass");
- });
- }
-
-</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/manifest-src-blocked.sub.html b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/manifest-src-blocked.sub.html
deleted file mode 100644
index fe6d2b1c2c6..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/manifest-src-blocked.sub.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<link rel="manifest" href="manifest.test/manifest.json">
-<script>
- {
- testRunner.getManifestThen(function() {
- alert_assert("Pass");
- });
- }
-
-</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html
deleted file mode 100644
index d770278401f..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
- <!-- Programmatically converted from a WebKit Reftest, please forgive resulting idiosyncracies.-->
- <title>object-src-applet-archive-codebase</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src='../support/logTest.sub.js?logs=["PASS"]'></script>
- <script src="../support/alertAssert.sub.js?alerts=[]"></script>
- <!-- enforcing policy:
-object-src 'none'; script-src 'self' 'unsafe-inline'; connect-src 'self';
--->
-
-</head>
-
-<body>
- <script>
- var len = navigator.mimeTypes.length;
- var allTypes = "";
- var appletMimeType = "application/x-java-applet";
- for (var i = 0; i < len; i++) {
- allTypes += navigator.mimeTypes[i].type + ';';
- }
- if (allTypes.indexOf(appletMimeType) == -1) {
- t_log.set_status(t_log.NOTRUN, "No Java Plugin, cannot run test.");
- t_log.phase = t_log.phases.HAS_RESULT;
- t_log.done();
- } else {
- var s = document.createElement('script');
- s.src = "../support/checkReport.sub.js?reportExists=true&amp;reportField=violated-directive&amp;reportValue=object-src%20&apos;none&apos;";
- document.body.appendChild(s);
- }
-
- </script>
- This test passes if there is a CSP violation saying the plugin was blocked.
- <applet code="TestThingie" archive="archive.jar" codebase="/plugins/codebase/" id="appletObject" onload="log('FAIL')" onerror="log('PASS')"></applet>
- <div id="log"></div>
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html.sub.headers
deleted file mode 100644
index 0b71a188bab..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive-codebase.sub.html.sub.headers
+++ /dev/null
@@ -1,6 +0,0 @@
-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
-Set-Cookie: object-src-applet-archive-codebase={{$id:uuid()}}; Path=/content-security-policy/blink-contrib
-Content-Security-Policy: object-src 'none'; script-src 'self' 'unsafe-inline'; connect-src 'self'; report-uri /content-security-policy/support/report.py?op=put&reportID={{$id}}
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive.sub.html b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive.sub.html
deleted file mode 100644
index 69c71986e9f..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive.sub.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
- <!-- Programmatically converted from a WebKit Reftest, please forgive resulting idiosyncracies.-->
- <title>object-src-applet-archive</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src='../support/logTest.sub.js?logs=["PASS"]'></script>
- <script src="../support/alertAssert.sub.js?alerts=[]"></script>
- <!-- enforcing policy:
-object-src 'none'; script-src 'self' 'unsafe-inline'; connect-src 'self';
--->
-
-</head>
-
-<body>
- <script>
- var len = navigator.mimeTypes.length;
- var allTypes = "";
- var appletMimeType = "application/x-java-applet";
- for (var i = 0; i < len; i++) {
- allTypes += navigator.mimeTypes[i].type + ';';
- }
- if (allTypes.indexOf(appletMimeType) == -1) {
- t_log.set_status(t_log.NOTRUN, "No Java Plugin, cannot run test.");
- t_log.phase = t_log.phases.HAS_RESULT;
- t_log.done();
- } else {
- var s = document.createElement('script');
- s.src = "../support/checkReport.sub.js?reportExists=true&amp;reportField=violated-directive&amp;reportValue=object-src%20&apos;none&apos;";
- document.body.appendChild(s);
- }
-
- </script>
- This test passes if there is a CSP violation saying the plugin was blocked.
- <applet code="TestThingie" archive="/plugins/archive.jar" id="appletObject" onload="log('FAIL')" onerror="log('PASS')"></applet>
- <div id="log"></div>
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive.sub.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive.sub.html.sub.headers
deleted file mode 100644
index 4bd5ec149f6..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-archive.sub.html.sub.headers
+++ /dev/null
@@ -1,6 +0,0 @@
-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
-Set-Cookie: object-src-applet-archive={{$id:uuid()}}; Path=/content-security-policy/blink-contrib
-Content-Security-Policy: object-src 'none'; script-src 'self' 'unsafe-inline'; connect-src 'self'; report-uri /content-security-policy/support/report.py?op=put&reportID={{$id}}
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html
deleted file mode 100644
index 6121dad56b2..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
- <!-- Programmatically converted from a WebKit Reftest, please forgive resulting idiosyncracies.-->
- <title>object-src-applet-archive-code-codebase</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src='../support/logTest.sub.js?logs=["PASS"]'></script>
- <script src="../support/alertAssert.sub.js?alerts=[]"></script>
- <!-- enforcing policy:
-object-src 'none'; script-src 'self' 'unsafe-inline'; connect-src 'self';
--->
-
-</head>
-
-<body>
- <script>
- var len = navigator.mimeTypes.length;
- var allTypes = "";
- var appletMimeType = "application/x-java-applet";
- for (var i = 0; i < len; i++) {
- allTypes += navigator.mimeTypes[i].type + ';';
- }
- if (allTypes.indexOf(appletMimeType) == -1) {
- t_log.set_status(t_log.NOTRUN, "No Java Plugin, cannot run test.");
- t_log.phase = t_log.phases.HAS_RESULT;
- t_log.done();
- } else {
- var s = document.createElement('script');
- s.src = "../support/checkReport.sub.js?reportExists=true&amp;reportField=violated-directive&amp;reportValue=object-src%20&apos;none&apos;";
- document.body.appendChild(s);
- }
-
- </script>
- This test passes if there is a CSP violation saying the plugin was blocked.
- <applet code="code.class" codebase="/plugins/codebase/"></applet>
- <div id="log"></div>
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html.sub.headers
deleted file mode 100644
index 1ced1a8e2c0..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code-codebase.sub.html.sub.headers
+++ /dev/null
@@ -1,6 +0,0 @@
-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
-Set-Cookie: object-src-applet-code-codebase={{$id:uuid()}}; Path=/content-security-policy/blink-contrib
-Content-Security-Policy: object-src 'none'; script-src 'self' 'unsafe-inline'; connect-src 'self'; report-uri /content-security-policy/support/report.py?op=put&reportID={{$id}}
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code.sub.html b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code.sub.html
deleted file mode 100644
index af598bfd180..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code.sub.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<html>
-
-<head>
- <!-- Programmatically converted from a WebKit Reftest, please forgive resulting idiosyncracies.-->
- <title>object-src-applet-code</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src='../support/logTest.sub.js?logs=["PASS"]'></script>
- <script src="../support/alertAssert.sub.js?alerts=[]"></script>
- <!-- enforcing policy:
-object-src 'none'; script-src 'self' 'unsafe-inline'; connect-src 'self';
--->
-
-</head>
-
-<body>
- <script>
- var len = navigator.mimeTypes.length;
- var allTypes = "";
- var appletMimeType = "application/x-java-applet";
- for (var i = 0; i < len; i++) {
- allTypes += navigator.mimeTypes[i].type + ';';
- }
- if (allTypes.indexOf(appletMimeType) == -1) {
- t_log.set_status(t_log.NOTRUN, "No Java Plugin, cannot run test.");
- t_log.phase = t_log.phases.HAS_RESULT;
- t_log.done();
- } else {
- var s = document.createElement('script');
- s.src = "../support/checkReport.sub.js?reportExists=true&amp;reportField=violated-directive&amp;reportValue=object-src%20&apos;none&apos;";
- document.body.appendChild(s);
- }
-
- </script>
- This test passes if there is a CSP violation saying the plugin was blocked.
- <applet code="/plugins/code.class"></applet>
- <div id="log"></div>
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code.sub.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code.sub.html.sub.headers
deleted file mode 100644
index 44bd725f817..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/object-src-applet-code.sub.html.sub.headers
+++ /dev/null
@@ -1,6 +0,0 @@
-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
-Set-Cookie: object-src-applet-code={{$id:uuid()}}; Path=/content-security-policy/blink-contrib
-Content-Security-Policy: object-src 'none'; script-src 'self' 'unsafe-inline'; connect-src 'self'; report-uri /content-security-policy/support/report.py?op=put&reportID={{$id}}
diff --git a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/resources/go-to-echo-report.js b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/resources/go-to-echo-report.js
index e220f2a47e3..6dae030e009 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/resources/go-to-echo-report.js
+++ b/tests/wpt/web-platform-tests/content-security-policy/blink-contrib/resources/go-to-echo-report.js
@@ -1,8 +1,3 @@
-if (window.testRunner) {
- testRunner.dumpAsText();
- testRunner.waitUntilDone();
-}
-
window.onload = function() {
var test = window.location.pathname.replace(/^.+\//, '');
var match = window.location.search.match(/^\?test=([^&]+)/);
diff --git a/tests/wpt/web-platform-tests/content-security-policy/connect-src/connect-src-beacon-blocked.sub.html b/tests/wpt/web-platform-tests/content-security-policy/connect-src/connect-src-beacon-blocked.sub.html
index df80cbb71e2..c7f7e383d26 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/connect-src/connect-src-beacon-blocked.sub.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/connect-src/connect-src-beacon-blocked.sub.html
@@ -13,4 +13,15 @@
assert_true(navigator.sendBeacon("http://{{domains[www]}}:{{ports[http][0]}}/common/text-plain.txt"));
}, "sendBeacon should not throw.");
+
+ async_test(t => {
+ document.addEventListener("securitypolicyviolation", t.step_func_done(e => {
+ if (e.blockedURI != "http://{{domains[www]}}:{{ports[http][0]}}/common/text-plain.txt")
+ return;
+
+ assert_equals(e.violatedDirective, "connect-src");
+ }));
+
+ assert_true(navigator.sendBeacon("common/redirect-opt-in.py?status=307&location=http://{{domains[www]}}:{{ports[http][0]}}/common/text-plain.txt"));
+ }, "redirect case");
</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-match-allowed.sub.html b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-match-allowed.sub.html
index 650b21c8e8d..ebba1e0096c 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-match-allowed.sub.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-match-allowed.sub.html
@@ -14,7 +14,7 @@
var link = document.createElement('link');
link.rel="preload";
link.as="font";
- link.href="http://{{domains[www1]}}:{{ports[http][0]}}/content-security-policy/support/Ahem.ttf";
+ link.href="http://{{domains[www1]}}:{{ports[http][0]}}/fonts/Ahem.ttf?font-match-allowed";
link.onload = t.step_func_done();
link.onerror = t.unreached_func("Should have loaded the font.");
document.getElementsByTagName('head')[0].appendChild(link);
diff --git a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-mismatch-blocked.sub.html b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-mismatch-blocked.sub.html
index 229d5dffb5b..b164cf0f172 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-mismatch-blocked.sub.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-mismatch-blocked.sub.html
@@ -13,7 +13,7 @@
var link = document.createElement('link');
link.rel="preload";
link.as="font";
- link.href="http://{{domains[www2]}}:{{ports[http][0]}}/content-security-policy/support/Ahem.ttf";
+ link.href="http://{{domains[www2]}}:{{ports[http][0]}}/fonts/Ahem.ttf?font-mismatch-blocked";
link.onload = t.unreached_func("Should not have loaded the font.");
link.onerror = t.step_func_done();
document.getElementsByTagName('head')[0].appendChild(link);
diff --git a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-none-blocked.sub.html b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-none-blocked.sub.html
index 8169bd55604..eae1b4986d9 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-none-blocked.sub.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-none-blocked.sub.html
@@ -13,7 +13,7 @@
var link = document.createElement('link');
link.rel="preload";
link.as="font";
- link.href="http://{{domains[www]}}:{{ports[http][0]}}/content-security-policy/support/Ahem.ttf";
+ link.href="http://{{domains[www]}}:{{ports[http][0]}}/fonts/Ahem.ttf?font-none-blocked";
link.onload = t.unreached_func("Should not have loaded the font.");
link.onerror = t.step_func_done();
document.getElementsByTagName('head')[0].appendChild(link);
diff --git a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-self-allowed.html b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-self-allowed.html
index 099302727cb..b8d46e5c987 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/font-src/font-self-allowed.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/font-src/font-self-allowed.html
@@ -14,7 +14,7 @@
var link = document.createElement('link');
link.rel="preload";
link.as="font";
- link.href="/content-security-policy/support/Ahem.ttf";
+ link.href="/fonts/Ahem.ttf?font-self-allowed";
link.onload = t.step_func_done();
link.onerror = t.unreached_func("Should have loaded the font.");
document.getElementsByTagName('head')[0].appendChild(link);
diff --git a/tests/wpt/web-platform-tests/content-security-policy/inheritance/iframe.html b/tests/wpt/web-platform-tests/content-security-policy/inheritance/iframe.html
new file mode 100644
index 00000000000..6f5d0f75260
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/inheritance/iframe.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<meta http-equiv="Content-Security-Policy" content="img-src 'none'">
+
+<body>
+
+<script>
+ function wait_for_error_from_frame(frame, test) {
+ window.addEventListener('message', test.step_func(e => {
+ if (e.source != frame.contentWindow)
+ return;
+ assert_equals(e.data, "error");
+ frame.remove();
+ test.done();
+ }));
+ }
+
+ async_test(t => {
+ var i = document.createElement('iframe');
+ document.body.appendChild(i);
+
+ var img = document.createElement('img');
+ img.onerror = t.step_func_done(_ => i.remove());
+ img.onload = t.unreached_func();
+ i.contentDocument.body.appendChild(img);
+ img.src = "/images/red-16x16.png";
+ }, "<iframe>'s about:blank inherits policy.");
+
+ async_test(t => {
+ var i = document.createElement('iframe');
+ i.srcdoc = `
+ <img src='/images/red-16x16.png'
+ onload='window.top.postMessage("load", "*");'
+ onerror='window.top.postMessage("error", "*");'
+ >
+ `;
+
+ wait_for_error_from_frame(i, t);
+
+ document.body.appendChild(i);
+ }, "<iframe srcdoc>'s inherits policy.");
+
+ async_test(t => {
+ var i = document.createElement('iframe');
+ var b = new Blob(
+ [`
+ <img src='${window.origin}/images/red-16x16.png'
+ onload='window.top.postMessage("load", "*");'
+ onerror='window.top.postMessage("error", "*");'
+ >
+ `], {type:"text/html"});
+ i.src = URL.createObjectURL(b);
+
+ wait_for_error_from_frame(i, t);
+
+ document.body.appendChild(i);
+ }, "<iframe src='blob:...'>'s inherits policy.");
+
+ async_test(t => {
+ var i = document.createElement('iframe');
+ i.src = `data:text/html,<img src='${window.origin}/images/red-16x16.png'
+ onload='window.top.postMessage("load", "*");'
+ onerror='window.top.postMessage("error", "*");'
+ >`;
+
+ wait_for_error_from_frame(i, t);
+
+ document.body.appendChild(i);
+ }, "<iframe src='data:...'>'s inherits policy.");
+
+ async_test(t => {
+ var i = document.createElement('iframe');
+ i.src = `javascript:"<img src='${window.origin}/images/red-16x16.png'
+ onload='window.top.postMessage(\\"load\\", \\"*\\");'
+ onerror='window.top.postMessage(\\"error\\", \\"*\\");'
+ >"`;
+
+ wait_for_error_from_frame(i, t);
+
+ document.body.appendChild(i);
+ }, "<iframe src='javascript:...'>'s inherits policy.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/inheritance/window.html b/tests/wpt/web-platform-tests/content-security-policy/inheritance/window.html
new file mode 100644
index 00000000000..86f2e4bc13f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/inheritance/window.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<meta http-equiv="Content-Security-Policy" content="img-src 'none'">
+
+<body>
+
+<script>
+ function wait_for_error_from_window(w, test) {
+ window.addEventListener('message', test.step_func(e => {
+ if (e.source != w)
+ return;
+ assert_equals(e.data, "error");
+ w.close();
+ test.done();
+ }));
+ }
+
+ async_test(t => {
+ var w = window.open();
+
+ var img = document.createElement('img');
+ img.onerror = t.step_func_done(_ => w.close());
+ img.onload = t.unreached_func();
+ w.document.body.appendChild(img);
+ img.src = "/images/red-16x16.png";
+ }, "window.open() inherits policy.");
+
+ async_test(t => {
+ var w = window.open();
+
+ wait_for_error_from_window(w, t);
+
+ w.document.write(`
+ <img src='/images/red-16x16.png'
+ onload='window.opener.postMessage("load", "*");'
+ onerror='window.opener.postMessage("error", "*");'
+ >
+ `);
+ }, "`document.write` into `window.open()` inherits policy.");
+
+ async_test(t => {
+ var b = new Blob(
+ [`
+ <img src='${window.origin}/images/red-16x16.png'
+ onload='window.opener.postMessage("load", "*");'
+ onerror='window.opener.postMessage("error", "*");'
+ >
+ `], {type:"text/html"});
+
+ wait_for_error_from_window(window.open(URL.createObjectURL(b)), t);
+ }, "window.open('blob:...') inherits policy.");
+
+ // Navigation to top-level `data:` is blocked.
+
+ async_test(t => {
+ var url =
+ `javascript:"<img src='${window.origin}/images/red-16x16.png'
+ onload='window.opener.postMessage(\\"load\\", \\"*\\");'
+ onerror='window.opener.postMessage(\\"error\\", \\"*\\");'
+ >"`;
+
+ wait_for_error_from_window(window.open(url), t);
+ }, "window.open('javascript:...') inherits policy.");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/navigation/javascript-url-navigation-inherits-csp.html b/tests/wpt/web-platform-tests/content-security-policy/navigation/javascript-url-navigation-inherits-csp.html
new file mode 100644
index 00000000000..21c4fb33ce2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/navigation/javascript-url-navigation-inherits-csp.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+ var window_url = encodeURIComponent("javascript:'<iframe src=/content-security-policy/support/fail.js />'");
+ var report_cookie_name = encodeURIComponent("javascript-url-navigation-inherits-csp");
+ window.open("support/test_csp_self_window.sub.html?window_url=" + window_url + "&report_cookie_name=" + report_cookie_name);
+ setTimeout(function() {
+ var s = document.createElement('script');
+ s.async = true;
+ s.defer = true;
+ s.src = "../support/checkReport.sub.js?reportField=violated-directive&reportValue=frame-src%20%27none%27";
+ document.body.appendChild(s);
+ }, 2000);
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/navigation/support/test_csp_self_window.sub.html b/tests/wpt/web-platform-tests/content-security-policy/navigation/support/test_csp_self_window.sub.html
new file mode 100644
index 00000000000..ab0f8f82e39
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/navigation/support/test_csp_self_window.sub.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+ var window_url = decodeURIComponent("{{GET[window_url]}}").replace('&lt;', '<').replace('&gt;', '>');
+ window.open(window_url, "_self");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/navigation/support/test_csp_self_window.sub.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/navigation/support/test_csp_self_window.sub.html.sub.headers
new file mode 100644
index 00000000000..dd418ec7648
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/navigation/support/test_csp_self_window.sub.html.sub.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
+Set-Cookie: {{GET[report_cookie_name]}}={{$id:uuid()}}; Path=/content-security-policy/navigation/
+Content-Security-Policy: default-src 'none'; script-src 'self' 'unsafe-inline'; report-uri ../../support/report.py?op=put&reportID={{$id}}
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/javascript-window-open-blocked.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/javascript-window-open-blocked.html
new file mode 100644
index 00000000000..a8dd14f1c89
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/javascript-window-open-blocked.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Window.open should not open javascript url if not allowed.</title>
+ <script nonce='abc' src='/resources/testharness.js'></script>
+ <script nonce='abc' src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script nonce='abc'>
+ var t = async_test("Check that a securitypolicyviolation event is fired");
+ window.addEventListener('securitypolicyviolation', t.step_func_done(function(e) {
+ assert_equals(e.blockedURI, "inline");
+ assert_equals(e.violatedDirective, "script-src");
+ }));
+
+ window.open('javascript:test(function() { assert_unreached("FAIL")});', 'new');
+ </script>
+
+ <script nonce='abc' async defer src='../support/checkReport.sub.js?reportField=violated-directive&reportValue=script-src%20%27nonce-abc%27'></script>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/javascript-window-open-blocked.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/javascript-window-open-blocked.html.sub.headers
new file mode 100644
index 00000000000..32fc4d54a32
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/javascript-window-open-blocked.html.sub.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
+Set-Cookie: javascript-window-open-blocked={{$id:uuid()}}; Path=/content-security-policy/script-src/
+Content-Security-Policy: script-src 'nonce-abc'; report-uri ../support/report.py?op=put&reportID={{$id}} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html
new file mode 100644
index 00000000000..75ff3424c05
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Multiple policies with different hashing algorithms still work.</title>
+ <!-- nonces are here just to let all of our scripts run -->
+ <script nonce="abc" src='/resources/testharness.js'></script>
+ <script nonce="abc" src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script nonce="abc">
+ var t = async_test("Test that script executes if allowed by proper hash values");
+ document.addEventListener("securitypolicyviolation", t.unreached_func("Should not have triggered a security event"));
+ var executed = false;
+ </script>
+
+ <!-- test will fail if this script is not allowed to run -->
+ <script>executed = true;</script>
+
+ <script nonce="abc">
+ t.step(function() {
+ assert_true(executed);
+ t.done();
+ });
+ </script>
+
+ <script nonce="abc" async defer src='../support/checkReport.sub.js?reportExists=false'></script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers
new file mode 100644
index 00000000000..36203b7643a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers
@@ -0,0 +1,7 @@
+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
+Set-Cookie: script-src-multiple-policies-multiple-hashing-algorithms={{$id:uuid()}}; Path=/content-security-policy/script-src/
+Content-Security-Policy: script-src 'sha256-EpVP4fTImWaRzBRBw/wrdfLhGTe/1U+CaBP1LNeKUIE=' 'nonce-abc'; report-uri ../support/report.py?op=put&reportID={{$id}}
+Content-Security-Policy: script-src 'sha384-skw7BVxHbmE2umPGMd1kX+ye6qBeHAb875erPoD8ilKv1LkjKR+WFi7N85ORMdhS' 'nonce-abc'; report-uri ../support/report.py?op=put&reportID={{$id}} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html
new file mode 100644
index 00000000000..34fed6d94b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html
@@ -0,0 +1,28 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Multiple policies some using hashes some not using hashes still work.</title>
+ <!-- nonces are here just to let all of our scripts run -->
+ <script nonce="abc" src='/resources/testharness.js'></script>
+ <script nonce="abc" src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script nonce="abc">
+ var t = async_test("Test that script executes if allowed by proper hash values");
+ document.addEventListener("securitypolicyviolation", t.unreached_func("Should not have triggered a security event"));
+ var executed = false;
+ </script>
+
+ <!-- test will fail if this script is not allowed to run -->
+ <script>executed = true;</script>
+
+ <script nonce="abc">
+ t.step(function() {
+ assert_true(executed);
+ t.done();
+ });
+ </script>
+
+ <script nonce="abc" async defer src='../support/checkReport.sub.js?reportExists=false'></script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html.sub.headers
new file mode 100644
index 00000000000..114c560b28c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-multiple-policies-one-using-hashing-algorithms.html.sub.headers
@@ -0,0 +1,7 @@
+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
+Set-Cookie: script-src-multiple-policies-multiple-hashing-algorithms-work={{$id:uuid()}}; Path=/content-security-policy/script-src/
+Content-Security-Policy: script-src 'sha256-EpVP4fTImWaRzBRBw/wrdfLhGTe/1U+CaBP1LNeKUIE=' 'nonce-abc'; report-uri ../support/report.py?op=put&reportID={{$id}}
+Content-Security-Policy: script-src 'self' 'unsafe-inline'; report-uri ../support/report.py?op=put&reportID={{$id}} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html
new file mode 100644
index 00000000000..f0f7bcb7a04
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>A report-only policy that does not allow a script should not affect an enforcing policy using hashes.</title>
+ <!-- nonces are here just to let all of our scripts run -->
+ <script nonce="abc" src='/resources/testharness.js'></script>
+ <script nonce="abc" src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script nonce="abc">
+ var externalRan = false;
+ </script>
+ <script src='./externalScript.js'
+ integrity="sha256-wIc3KtqOuTFEu6t17sIBuOswgkV406VJvhSk79Gw6U0="></script>
+ <script nonce="abc">
+ test(function() {
+ assert_true(externalRan, 'External script ran.');
+ }, 'External script in a script tag with matching SRI hash should run.');
+ </script>
+
+ <script nonce="abc" async defer src='../support/checkReport.sub.js?reportField=violated-directive&reportValue=script-src%20%27nonce-abc%27'></script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html.sub.headers
new file mode 100644
index 00000000000..0ccfd507f65
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html.sub.headers
@@ -0,0 +1,7 @@
+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
+Set-Cookie: script-src-report-only-policy-works-with-external-hash-policy={{$id:uuid()}}; Path=/content-security-policy/script-src/
+Content-Security-Policy: script-src 'sha256-wIc3KtqOuTFEu6t17sIBuOswgkV406VJvhSk79Gw6U0=' 'nonce-abc'
+Content-Security-Policy-Report-Only: script-src 'nonce-abc'; report-uri ../support/report.py?op=put&reportID={{$id}} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html
new file mode 100644
index 00000000000..82a88791bd5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>A report-only policy that does not allow a script should not affect an enforcing policy using hashes.</title>
+ <!-- nonces are here just to let all of our scripts run -->
+ <script nonce="abc" src='/resources/testharness.js'></script>
+ <script nonce="abc" src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script nonce="abc">
+ var t = async_test("Test that script executes if allowed by proper hash values");
+ var t_spv = async_test("Test that the securitypolicyviolation event is fired");
+ document.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) {
+ assert_equals(e.violatedDirective, "script-src");
+ assert_equals(e.disposition, "report");
+ assert_equals(e.blockedURI, "inline");
+ }));
+ var executed = false;
+ </script>
+
+ <!-- test will fail if this script is not allowed to run -->
+ <script>executed = true;</script>
+
+ <script nonce="abc">
+ t.step(function() {
+ assert_true(executed);
+ t.done();
+ });
+ </script>
+
+ <script nonce="abc" async defer src='../support/checkReport.sub.js?reportField=violated-directive&reportValue=script-src%20%27nonce-abc%27'></script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html.sub.headers
new file mode 100644
index 00000000000..eaf175a8785
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-report-only-policy-works-with-hash-policy.html.sub.headers
@@ -0,0 +1,7 @@
+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
+Set-Cookie: script-src-report-only-policy-works-with-hash-policy={{$id:uuid()}}; Path=/content-security-policy/script-src/
+Content-Security-Policy: script-src 'sha256-EpVP4fTImWaRzBRBw/wrdfLhGTe/1U+CaBP1LNeKUIE=' 'nonce-abc'
+Content-Security-Policy-Report-Only: script-src 'nonce-abc'; report-uri ../support/report.py?op=put&reportID={{$id}} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_worker-importScripts.https.html b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_worker-importScripts.https.html
new file mode 100644
index 00000000000..681e19547ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/script-src/script-src-strict_dynamic_worker-importScripts.https.html
@@ -0,0 +1,18 @@
+<!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="script-src 'nonce-abc' 'strict-dynamic'">
+
+<script nonce="abc">
+ async_test(t => {
+ assert_no_csp_event_for_url(t, "../support/import-scripts.js");
+ var w = new Worker("../support/import-scripts.js");
+ assert_no_event(t, w, "error");
+ waitUntilEvent(w, "message")
+ .then(t.step_func_done(e => {
+ assert_true(e.data.executed);
+ }));
+ }, "`importScripts(...)` is allowed by 'strict-dynamic'");
+</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/script-sample-no-opt-in.html b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/script-sample-no-opt-in.html
index 36104d4ee4d..eada073dd77 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/script-sample-no-opt-in.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/script-sample-no-opt-in.html
@@ -51,17 +51,30 @@
}, "JavaScript URLs in iframes should not have a sample.");
async_test(t => {
+ var violations = 0;
document.addEventListener('securitypolicyviolation', t.step_func(e => {
if (e.blockedURI != "eval")
return;
assert_equals(e.sample, "");
- t.done();
+ violations++
+ if (violations == 3)
+ t.done();
}));
try {
eval("assert_unreached('eval')");
assert_unreached('eval');
} catch (e) {
}
- }, "eval() should not have a sample.");
+ try {
+ setInterval("assert_unreached('interval')", 1000);
+ assert_unreached('interval');
+ } catch (e) {
+ }
+ try {
+ setTimeout("assert_unreached('timeout')", 1000);
+ assert_unreached('timeout');
+ } catch (e) {
+ }
+ }, "eval()-alikes should not have a sample.");
</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/script-sample.html b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/script-sample.html
index 2087f46be2b..551978ffb41 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/script-sample.html
+++ b/tests/wpt/web-platform-tests/content-security-policy/securitypolicyviolation/script-sample.html
@@ -52,16 +52,43 @@
async_test(t => {
document.addEventListener('securitypolicyviolation', t.step_func(e => {
- if (e.blockedURI != "eval")
- return;
-
- assert_equals(e.sample, "");
- t.done();
+ if (e.blockedURI == "eval" &&
+ e.sample == "assert_unreached('eval')") {
+ t.done();
+ }
}));
try {
eval("assert_unreached('eval')");
assert_unreached('eval');
} catch (e) {
}
- }, "eval() should not have a sample.");
+ }, "eval() should have a sample.");
+
+ async_test(t => {
+ document.addEventListener('securitypolicyviolation', t.step_func(e => {
+ if (e.blockedURI == "eval" &&
+ e.sample == "assert_unreached('interval')") {
+ t.done();
+ }
+ }));
+ try {
+ setInterval("assert_unreached('interval')", 1000);
+ assert_unreached('interval');
+ } catch (e) {
+ }
+ }, "setInterval() should have a sample.");
+
+ async_test(t => {
+ document.addEventListener('securitypolicyviolation', t.step_func(e => {
+ if (e.blockedURI == "eval" &&
+ e.sample == "assert_unreached('timeout')") {
+ t.done();
+ }
+ }));
+ try {
+ setTimeout("assert_unreached('timeout')", 1000);
+ assert_unreached('timeout');
+ } catch (e) {
+ }
+ }, "setTimeout() should have a sample.");
</script>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html
new file mode 100644
index 00000000000..1575cd6c523
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>Multiple policies with different hashing algorithms still work.</title>
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script>
+ var t = async_test("Test that style loads if allowed by proper hash values");
+ document.addEventListener("securitypolicyviolation", t.unreached_func("Should not have triggered a security event"));
+ </script>
+
+ <!-- test will time out if this style is not allowed to load -->
+ <style onload="t.done();" onerror="t.unreached_func('Should have loaded the style');">p {color:blue;}</style>
+
+ <script async defer src='../support/checkReport.sub.js?reportExists=false'></script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers
new file mode 100644
index 00000000000..8d83a347513
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/style-src/style-src-multiple-policies-multiple-hashing-algorithms.html.sub.headers
@@ -0,0 +1,7 @@
+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
+Set-Cookie: style-src-multiple-policies-multiple-hashing-algorithms={{$id:uuid()}}; Path=/content-security-policy/style-src/
+Content-Security-Policy: style-src 'sha256-rB6kiow2O3eFUeTNyyLeK3wV0+l7vNB90J1aqllKvjg='; script-src 'unsafe-inline' 'self'; report-uri ../support/report.py?op=put&reportID={{$id}}
+Content-Security-Policy: style-src 'sha384-DAShdG5sejEaOdWfT+TQMRP5mHssKiUNjFggNnElIvIoj048XQlacVRs+za2AM1a'; script-src 'unsafe-inline' 'self'; report-uri ../support/report.py?op=put&reportID={{$id}} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/Ahem.ttf b/tests/wpt/web-platform-tests/content-security-policy/support/Ahem.ttf
deleted file mode 100644
index ac81cb03165..00000000000
--- a/tests/wpt/web-platform-tests/content-security-policy/support/Ahem.ttf
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/fonts.css b/tests/wpt/web-platform-tests/content-security-policy/support/fonts.css
index 8bddaca3749..848961c8dce 100644
--- a/tests/wpt/web-platform-tests/content-security-policy/support/fonts.css
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/fonts.css
@@ -1,6 +1,6 @@
@font-face {
font-family: 'Ahem';
- src: url('/content-security-policy/support/Ahem.ttf');
+ src: url('/fonts/Ahem.ttf');
}
body {
diff --git a/tests/wpt/web-platform-tests/content-security-policy/support/import-scripts.js b/tests/wpt/web-platform-tests/content-security-policy/support/import-scripts.js
new file mode 100644
index 00000000000..8325ebb3fba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/support/import-scripts.js
@@ -0,0 +1,3 @@
+self.a = false;
+importScripts('/content-security-policy/support/var-a.js');
+postMessage({ 'executed': self.a });
diff --git a/tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_allowed.html b/tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_allowed.html
new file mode 100644
index 00000000000..17f19384dad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_allowed.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <meta http-equiv="Content-Security-Policy" content="script-src 'unsafe-hashed-attributes' 'nonce-abc' 'sha256-wmuLCpoj8EMqfQlPnt5NIMgKkCK62CxAkAiewI0zZps='; img-src *;">
+ <title>Event handlers should be allowed if a matching hash and 'unsafe-hashed-attributes' are present</title>
+ <script src='/resources/testharness.js' nonce='abc'></script>
+ <script src='/resources/testharnessreport.js' nonce='abc'></script>
+</head>
+
+<body>
+ <div id='log'></div>
+ <script nonce='abc'>
+ var t1 = async_test("Test that the inline event handler is allowed to run");
+
+ window.addEventListener('securitypolicyviolation', t1.unreached_func("Should have not raised any event"));
+ </script>
+ <img src='../support/pass.png'
+ onload='t1.done();'>
+</body>
+
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_matching_hash_no_unsafe_inline_attribute.html b/tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_matching_hash_no_unsafe_inline_attribute.html
new file mode 100644
index 00000000000..1dae30cbbdd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_matching_hash_no_unsafe_inline_attribute.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <meta http-equiv="Content-Security-Policy" content="script-src 'nonce-abc' 'sha256-Cb9N8BP42Neca22vQ9VaXlPU8oPF8HPxZHxRVcnLZJ4='; img-src *;">
+ <title>Event handlers should not be allowed if a matching hash is present without 'unsafe-hashed-attributes'</title>
+ <script src='/resources/testharness.js' nonce='abc'></script>
+ <script src='/resources/testharnessreport.js' nonce='abc'></script>
+
+</head>
+
+<body>
+ <div id='log'></div>
+ <script nonce='abc'>
+ var t1 = async_test("Test that the inline event handler is not allowed to run");
+
+ window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) {
+ assert_equals(e.violatedDirective, 'script-src');
+ assert_equals(e.blockedURI, 'inline');
+ }));
+ </script>
+ <img src='../support/pass.png'
+ onload='t1.unreached_func("Should not have executed handler");'>
+</body>
+
+</html>
diff --git a/tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_not_matching_hash.html b/tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_not_matching_hash.html
new file mode 100644
index 00000000000..993ed550d4e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/content-security-policy/unsafe-hashed-attributes/script_event_handlers_denied_not_matching_hash.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+
+<head>
+ <meta http-equiv="Content-Security-Policy" content="script-src 'unsafe-hashed-attributes' 'nonce-abc' 'sha256-thisdoesnotmatch'; img-src *;">
+ <title>Event handlers should be not allowed if a matching hash is not present</title>
+ <script src='/resources/testharness.js' nonce='abc'></script>
+ <script src='/resources/testharnessreport.js' nonce='abc'></script>
+</head>
+
+<body>
+ <div id='log'></div>
+ <script nonce='abc'>
+ var t1 = async_test("Test that the inline event handler is not allowed to run");
+
+ window.addEventListener('securitypolicyviolation', t1.step_func_done(function(e) {
+ assert_equals(e.violatedDirective, 'script-src');
+ assert_equals(e.blockedURI, 'inline');
+ }));
+ </script>
+ <img src='../support/pass.png'
+ onload='t1.unreached_func("Should not have executed handler");'>
+</body>
+
+</html>
diff --git a/tests/wpt/web-platform-tests/cookies/secure/set-from-dom.sub.html b/tests/wpt/web-platform-tests/cookies/secure/set-from-dom.sub.html
new file mode 100644
index 00000000000..91aa8fff3b7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cookies/secure/set-from-dom.sub.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset=utf-8>
+ <title>Set 'secure' cookie from `document.cookie` on a non-secure page</title>
+ <meta name=help href="https://tools.ietf.org/html/draft-west-leave-secure-cookies-alone">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/cookies/resources/testharness-helpers.js"></script>
+</head>
+<body>
+<div id=log></div>
+<script>
+ var tests = [
+ [
+ "'secure' cookie not set in `document.cookie`",
+ function () {
+ var originalCookie = document.cookie;
+ document.cookie = "secure_from_nonsecure_dom=1; secure; path=/";
+ assert_equals(document.cookie, originalCookie);
+ this.done();
+ }
+ ],
+ [
+ "'secure' cookie not sent in HTTP request",
+ function () {
+ document.cookie = "secure_from_nonsecure_dom=1; secure; path=/";
+ fetch("https://{{host}}:{{ports[https][0]}}/cookies/resources/echo-json.py", { "credentials": "include" })
+ .then(this.step_func(function (r) {
+ return r.json();
+ }))
+ .then(this.step_func_done(function (j) {
+ assert_equals(j["secure_from_nonsecure_dom"], undefined);
+ }));
+ }
+ ]
+ ];
+
+ function clearKnownCookie() {
+ document.cookie = "secure_from_nonsecure_dom=0; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/";
+ }
+
+ executeTestsSerially(tests, clearKnownCookie, clearKnownCookie);
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/cookies/secure/set-from-http.sub.html b/tests/wpt/web-platform-tests/cookies/secure/set-from-http.sub.html
new file mode 100644
index 00000000000..c80cc341017
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cookies/secure/set-from-http.sub.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<html>
+<head>
+ <meta charset=utf-8>
+ <title>Set 'secure' cookie from `Set-Cookie` HTTP header on a non-secure page</title>
+ <meta name=help href="https://tools.ietf.org/html/draft-west-leave-secure-cookies-alone">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/cookies/resources/testharness-helpers.js"></script>
+</head>
+<body>
+<div id=log></div>
+<script>
+ function clearKnownCookie() {
+ document.cookie = "secure_from_nonsecure_http=0; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/";
+ }
+
+ test(function () {
+ assert_equals(document.cookie.match(/secure_from_nonsecure_http=1/), null);
+ }, "'secure' cookie not present in `document.cookie`");
+
+ promise_test(function (t) {
+ t.add_cleanup(clearKnownCookie);
+ return fetch("https://{{host}}:{{ports[https][0]}}/cookies/resources/echo-json.py",
+ { "credentials": "include" })
+ .then(function (r) {
+ return r.json();
+ })
+ .then(function (j) {
+ assert_equals(j["secure_from_nonsecure_http"], undefined);
+ });
+ }, "'secure' cookie not sent in HTTP request");
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/core-aam/OWNERS b/tests/wpt/web-platform-tests/core-aam/OWNERS
new file mode 100644
index 00000000000..2a4c47ed4df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/OWNERS
@@ -0,0 +1,2 @@
+@halindrome
+@joanmarie
diff --git a/tests/wpt/web-platform-tests/core-aam/README.md b/tests/wpt/web-platform-tests/core-aam/README.md
new file mode 100644
index 00000000000..8728628a6dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/README.md
@@ -0,0 +1,59 @@
+core-aam: Tests for the Core Accessibility API Mappings Recommendation
+======================================================================
+
+The [Core Accessibility API Mappings Recommendation](https://www.w3.org/TR/core-aam-1.1/)
+describes how user agents should expose semantics of web content languages to accessibility
+APIs. This helps users with disabilities to obtain and interact with information using
+assistive technologies. Documenting these mappings promotes interoperable exposure of roles,
+states, properties, and events implemented by accessibility APIs and helps to ensure that
+this information appears in a manner consistent with author intent.
+
+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, select the core-aam tests to be run,
+ and 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 will proceed
+ without user intervention. In a manual test, some user input or verification
+ may be required.
+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.
diff --git a/tests/wpt/web-platform-tests/core-aam/alert-manual.html b/tests/wpt/web-platform-tests/core-aam/alert-manual.html
new file mode 100644
index 00000000000..938da434939
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/alert-manual.html
@@ -0,0 +1,95 @@
+<!doctype html>
+<html>
+ <head>
+ <title>alert</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_ALERT"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXApplicationAlert"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "alert"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_ALERT"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "alert"
+ ],
+ [
+ "property",
+ "LiveSetting",
+ "is",
+ "Assertive (2)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "alert"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for alert.</p>
+ <div role='alert' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/alertdialog-manual.html b/tests/wpt/web-platform-tests/core-aam/alertdialog-manual.html
new file mode 100644
index 00000000000..98d3b1acb0f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/alertdialog-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>alertdialog</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_DIALOG"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXApplicationAlertDialog"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "web alert dialog"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_DIALOG"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Pane"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "alertdialog"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for alertdialog.</p>
+ <div role='alertdialog' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/application-manual.html b/tests/wpt/web-platform-tests/core-aam/application-manual.html
new file mode 100644
index 00000000000..3d22162eba2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/application-manual.html
@@ -0,0 +1,89 @@
+<!doctype html>
+<html>
+ <head>
+ <title>application</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_EMBEDDED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXWebApplication"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "web application"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_APPLICATION"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Pane"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "application"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "application"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for application.</p>
+ <div role='application' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-atomic_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-atomic_false-manual.html
new file mode 100644
index 00000000000..61b7b00c4b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-atomic_false-manual.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-atomic=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "atomic:true"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "container-atomic:true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIAAtomic",
+ "is",
+ "NO"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "atomic:true"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "container-atomic:true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.atomic",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-atomic=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-atomic=false.</p>
+ <div role='group' id='test' aria-atomic='false' aria-live='polite'>
+ <div role='group' id='child'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-atomic_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-atomic_true-manual.html
new file mode 100644
index 00000000000..9462c0acd9a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-atomic_true-manual.html
@@ -0,0 +1,120 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-atomic=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "atomic:true"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-atomic:true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIAAtomic",
+ "is",
+ "YES"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "atomic:true"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-atomic:true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.atomic",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "child",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-atomic:true"
+ ],
+ [
+ "relation",
+ "RELATION_MEMBER_OF",
+ "is",
+ "[test]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-atomic:true"
+ ],
+ [
+ "relation",
+ "IA2_RELATION_MEMBER_OF",
+ "is",
+ "[test]"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-atomic=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-atomic=true.</p>
+ <div role='group' id='test' aria-atomic='true' aria-live='polite'>
+ <div role='group' id='child'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-autocomplete_both-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-autocomplete_both-manual.html
new file mode 100644
index 00000000000..6fea23024cc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-autocomplete_both-manual.html
@@ -0,0 +1,69 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-autocomplete=both</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "autocomplete:both"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SUPPORTS_AUTOCOMPLETION"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "autocomplete:both"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_SUPPORTS_AUTOCOMPLETION"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-autocomplete=both"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-autocomplete=both.</p>
+ <div role='combobox' id='test' aria-autocomplete='both'>
+ <div role='textbox'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-autocomplete_inline-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-autocomplete_inline-manual.html
new file mode 100644
index 00000000000..32e45dd3af8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-autocomplete_inline-manual.html
@@ -0,0 +1,69 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-autocomplete=inline</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "autocomplete:inline"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SUPPORTS_AUTOCOMPLETION"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "autocomplete:inline"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_SUPPORTS_AUTOCOMPLETION"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-autocomplete=inline"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-autocomplete=inline.</p>
+ <div role='combobox' id='test' aria-autocomplete='inline'>
+ <div role='textbox'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-autocomplete_list-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-autocomplete_list-manual.html
new file mode 100644
index 00000000000..b74f39670f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-autocomplete_list-manual.html
@@ -0,0 +1,69 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-autocomplete=list</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "autocomplete:list"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SUPPORTS_AUTOCOMPLETION"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "autocomplete:list"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_SUPPORTS_AUTOCOMPLETION"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-autocomplete=list"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-autocomplete=list.</p>
+ <div role='combobox' id='test' aria-autocomplete='list'>
+ <div role='textbox'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-busy_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-busy_false-manual.html
new file mode 100644
index 00000000000..0601b60e644
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-busy_false-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-busy=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_BUSY"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXElementBusy",
+ "is",
+ "NO"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SYSTEM_BUSY"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.busy",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-busy=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-busy=false.</p>
+ <div role='group' id='test' aria-busy='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-busy_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-busy_true-manual.html
new file mode 100644
index 00000000000..1d0781caabc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-busy_true-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-busy=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_BUSY"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXElementBusy",
+ "is",
+ "YES"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_BUSY"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.busy",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-busy=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-busy=true.</p>
+ <div role='group' id='test' aria-busy='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-busy_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-busy_value_changes-manual.html
new file mode 100644
index 00000000000..d39fd2fdb62
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-busy_value_changes-manual.html
@@ -0,0 +1,136 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-busy value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-busy",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:busy"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "1"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXElementBusyChanged"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "PropertyChangedEvent"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ },
+ {
+ "attribute" : "aria-busy",
+ "element" : "test",
+ "title" : "step 3",
+ "type" : "attribute",
+ "value" : "false"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:busy"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "0"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXElementBusyChanged"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "PropertyChangedEvent"
+ ]
+ ]
+ },
+ "title" : "step 4",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-busy value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-busy value changes.</p>
+ <div role='group' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-checked_false_on_checkbox-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-checked_false_on_checkbox-manual.html
new file mode 100644
index 00000000000..657e4b0229c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-checked_false_on_checkbox-manual.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-checked=false on checkbox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_CHECKABLE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_CHECKED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValue",
+ "is",
+ "0"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "checkable:true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SYSTEM_CHECKED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Toggle.ToggleState",
+ "is",
+ "Off (0)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-checked=false on checkbox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-checked=false on checkbox.</p>
+ <div role='checkbox' id='test' aria-checked='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-checked_false_on_menuitemradio-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-checked_false_on_menuitemradio-manual.html
new file mode 100644
index 00000000000..3b9cceddae5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-checked_false_on_menuitemradio-manual.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-checked=false on menuitemradio</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_CHECKABLE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_CHECKED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValue",
+ "is",
+ "0"
+ ],
+ [
+ "property",
+ "AXMenuItemMarkChar",
+ "is",
+ "<nil>"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "checkable:true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SYSTEM_CHECKED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Toggle.ToggleState",
+ "is",
+ "Off (0)"
+ ],
+ [
+ "property",
+ "SelectionItem.IsSelected",
+ "is",
+ "False"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-checked=false on menuitemradio"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-checked=false on menuitemradio.</p>
+ <div role='menu'>
+ <div role='menuitemradio' id='test' aria-checked='false'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-checked_mixed-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-checked_mixed-manual.html
new file mode 100644
index 00000000000..cb876d76c90
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-checked_mixed-manual.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-checked=mixed</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_INDETERMINATE"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_CHECKABLE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_CHECKED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValue",
+ "is",
+ "2"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "checkable:true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_MIXED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Toggle.ToggleState",
+ "is",
+ "Indeterminate (2)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-checked=mixed"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-checked=mixed.</p>
+ <div role='checkbox' id='test' aria-checked='mixed'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-checked_true_on_checkbox-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-checked_true_on_checkbox-manual.html
new file mode 100644
index 00000000000..72c45db5edf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-checked_true_on_checkbox-manual.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-checked=true on checkbox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_CHECKABLE"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_CHECKED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValue",
+ "is",
+ "1"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "checkable:true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_CHECKED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Toggle.ToggleState",
+ "is",
+ "On (1)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-checked=true on checkbox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-checked=true on checkbox.</p>
+ <div role='checkbox' id='test' aria-checked='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-checked_true_on_menuitemradio-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-checked_true_on_menuitemradio-manual.html
new file mode 100644
index 00000000000..224bc0912a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-checked_true_on_menuitemradio-manual.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-checked=true on menuitemradio</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_CHECKABLE"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_CHECKED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValue",
+ "is",
+ "1"
+ ],
+ [
+ "property",
+ "AXMenuItemMarkChar",
+ "is",
+ "✓"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "checkable:true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_CHECKED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Toggle.ToggleState",
+ "is",
+ "On (1)"
+ ],
+ [
+ "property",
+ "SelectionItem.IsSelected",
+ "is",
+ "True"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-checked=true on menuitemradio"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-checked=true on menuitemradio.</p>
+ <div role='menu'>
+ <div role='menuitemradio' id='test' aria-checked='true'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-checked_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-checked_value_changes-manual.html
new file mode 100644
index 00000000000..e3fb3335739
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-checked_value_changes-manual.html
@@ -0,0 +1,136 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-checked value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-checked",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:checked"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "1"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXValueChanged"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "TBD"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ },
+ {
+ "attribute" : "aria-checked",
+ "element" : "test",
+ "title" : "step 3",
+ "type" : "attribute",
+ "value" : "false"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:checked"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "0"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXValueChanged"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "TBD"
+ ]
+ ]
+ },
+ "title" : "step 4",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-checked value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-checked value changes.</p>
+ <div role='checkbox' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-colcount_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-colcount_new-manual.html
new file mode 100644
index 00000000000..60b797b3b57
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-colcount_new-manual.html
@@ -0,0 +1,96 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-colcount NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "colcount:3"
+ ],
+ [
+ "result",
+ "atk_table_get_n_columns()",
+ "is",
+ "3"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIAColumnCount",
+ "is",
+ "3"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "colcount:3"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Grid.ColumnCount",
+ "is",
+ "3"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "cell",
+ "test" : {
+ "IAccessible2" : [
+ [
+ "property",
+ "groupPosition",
+ "contains",
+ "similarItemsInGroup:3"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-colcount NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-colcount NEW.</p>
+ <div role='table' id='test' aria-colcount='3'>
+ <div role='row'>
+ <div role='cell' id='cell'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-colindex_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-colindex_new-manual.html
new file mode 100644
index 00000000000..3a0cead8ca6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-colindex_new-manual.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-colindex NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "colindex:3"
+ ],
+ [
+ "result",
+ "atk_table_cell_get_position()",
+ "contains",
+ "column=2"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIAColumnIndex",
+ "is",
+ "3"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "colindex:3"
+ ],
+ [
+ "property",
+ "groupPosition",
+ "contains",
+ "positionInGroup:3"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "GridItem.Column",
+ "is",
+ "2"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-colindex NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-colindex NEW.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='cell' id='test' aria-colindex='3'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-colspan_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-colspan_new-manual.html
new file mode 100644
index 00000000000..d9148f6a598
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-colspan_new-manual.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-colspan NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "colspan:3"
+ ],
+ [
+ "result",
+ "atk_table_cell_get_row_column_span()",
+ "contains",
+ "column_span=3"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXColumnIndexRange.length",
+ "is",
+ "3"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "colspan:3"
+ ],
+ [
+ "property",
+ "columnExtent",
+ "is",
+ "3"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "GridItem.ColumnSpan",
+ "is",
+ "3"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-colspan NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-colspan NEW.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='cell' id='test' aria-colspan='3'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-controls-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-controls-manual.html
new file mode 100644
index 00000000000..29355eba68f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-controls-manual.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-controls</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_CONTROLLER_FOR",
+ "is",
+ "[list]"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXLinkedUIElements",
+ "is",
+ "[list]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_CONTROLLER_FOR",
+ "is",
+ "[list]"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControllerFor",
+ "is",
+ "[list]"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "list",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_CONTROLLED_BY",
+ "is",
+ "[test]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_CONTROLLED_BY",
+ "is",
+ "[test]"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-controls"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-controls.</p>
+ <div role='combobox' id='test' aria-controls='list'>
+ <div role='textbox'>content</div>
+ </div>
+ <div role='listbox' id='list'>
+ <div role='option'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-current_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-current_value_changes-manual.html
new file mode 100644
index 00000000000..57c65cbfe66
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-current_value_changes-manual.html
@@ -0,0 +1,123 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-current value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-current",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:active"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "1"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "event",
+ "type",
+ "is",
+ "IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "PropertyChangedEvent"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ },
+ {
+ "attribute" : "aria-current",
+ "element" : "test",
+ "title" : "step 3",
+ "type" : "attribute",
+ "value" : "false"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:active"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "0"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "event",
+ "type",
+ "is",
+ "IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "PropertyChangedEvent"
+ ]
+ ]
+ },
+ "title" : "step 4",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-current value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-current value changes.</p>
+ <div role="list">
+ <div id="test" role="listitem">1</li>
+ <div role="listitem">2</li>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-current_with_non-false_allowed_value_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-current_with_non-false_allowed_value_new-manual.html
new file mode 100644
index 00000000000..23f79265ac0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-current_with_non-false_allowed_value_new-manual.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-current with non-false allowed value NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "current:step"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_ACTIVE"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIACurrent",
+ "is",
+ "step"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "current:step"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.current",
+ "is",
+ "step"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-current with non-false allowed value NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-current with non-false allowed value NEW.</p>
+ <div role='group' id='test' aria-current='step'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-current_with_unrecognized_value_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-current_with_unrecognized_value_new-manual.html
new file mode 100644
index 00000000000..ad1e7f6bf66
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-current_with_unrecognized_value_new-manual.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-current with unrecognized value NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "current:true"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_ACTIVE"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIACurrent",
+ "is",
+ "true"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "current:true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.current",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-current with unrecognized value NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-current with unrecognized value NEW.</p>
+ <div role='group' id='test' aria-current='foo'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-describedby-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-describedby-manual.html
new file mode 100644
index 00000000000..473b5554915
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-describedby-manual.html
@@ -0,0 +1,113 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-describedby</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "description",
+ "is",
+ "hello world"
+ ],
+ [
+ "relation",
+ "RELATION_DESCRIBED_BY",
+ "is",
+ "[description]"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXHelp",
+ "is",
+ "hello world"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "accDescription",
+ "is",
+ "hello world"
+ ],
+ [
+ "relation",
+ "IA2_RELATION_DESCRIBED_BY",
+ "is",
+ "[description]"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "FullDescription",
+ "is",
+ "hello world"
+ ],
+ [
+ "property",
+ "DescribedBy",
+ "is",
+ "[description]"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "description",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_DESCRIPTION_FOR",
+ "is",
+ "[test]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_DESCRIPTION_FOR",
+ "is",
+ "[test]"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-describedby"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-describedby.</p>
+ <div role='group' id='test' aria-describedby='description'>content</div>
+ <div id='description'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-details_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-details_new-manual.html
new file mode 100644
index 00000000000..cbce3c93159
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-details_new-manual.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-details NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_DETAILS",
+ "is",
+ "[details]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_DETAILS",
+ "is",
+ "[details]"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "DescribedBy",
+ "is",
+ "[details]"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "details",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_DETAILS_FOR",
+ "is",
+ "[test]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_DETAILS_FOR",
+ "is",
+ "[test]"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-details NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-details NEW.</p>
+ <div role='group' id='test' aria-details='details'>content</div>
+ <div id='details'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-disabled_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-disabled_false-manual.html
new file mode 100644
index 00000000000..078271ce128
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-disabled_false-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-disabled=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_ENABLED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXEnabled",
+ "is",
+ "YES"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SYSTEM_UNAVAILABLE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "IsEnabled",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-disabled=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-disabled=false.</p>
+ <div role='group' id='test' aria-disabled='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-disabled_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-disabled_true-manual.html
new file mode 100644
index 00000000000..bc469f7c711
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-disabled_true-manual.html
@@ -0,0 +1,88 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-disabled=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_ENABLED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXEnabled",
+ "is",
+ "NO"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_UNAVAILABLE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "IsEnabled",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "checkbox",
+ "test" : {
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_UNAVAILABLE"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-disabled=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-disabled=true.</p>
+ <div role='group' id='test' aria-disabled='true'>
+ <div role='checkbox' id='checkbox' tabindex='0'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-disabled_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-disabled_value_changes-manual.html
new file mode 100644
index 00000000000..93249342629
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-disabled_value_changes-manual.html
@@ -0,0 +1,80 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-disabled value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-disabled",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:enabled"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "0"
+ ],
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:sensitive"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "0"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-disabled value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-disabled value changes.</p>
+ <div role='checkbox' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_copy-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_copy-manual.html
new file mode 100644
index 00000000000..8848d17faa4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_copy-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-dropeffect=copy</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:copy"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXDropEffects",
+ "is",
+ "[copy]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:copy"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.dropeffect",
+ "is",
+ "copy"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-dropeffect=copy"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-dropeffect=copy.</p>
+ <div role='group' id='test' aria-dropeffect='copy'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_execute-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_execute-manual.html
new file mode 100644
index 00000000000..ec3432bbe51
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_execute-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-dropeffect=execute</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:execute"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXDropEffects",
+ "is",
+ "[execute]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:execute"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.dropeffect",
+ "is",
+ "execute"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-dropeffect=execute"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-dropeffect=execute.</p>
+ <div role='group' id='test' aria-dropeffect='execute'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_link-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_link-manual.html
new file mode 100644
index 00000000000..2dbbd178163
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_link-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-dropeffect=link</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:link"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXDropEffects",
+ "is",
+ "[link]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:link"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.dropeffect",
+ "is",
+ "link"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-dropeffect=link"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-dropeffect=link.</p>
+ <div role='group' id='test' aria-dropeffect='link'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_move-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_move-manual.html
new file mode 100644
index 00000000000..332b838d9b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_move-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-dropeffect=move</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:move"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXDropEffects",
+ "is",
+ "[move]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:move"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.dropeffect",
+ "is",
+ "move"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-dropeffect=move"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-dropeffect=move.</p>
+ <div role='group' id='test' aria-dropeffect='move'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_none-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_none-manual.html
new file mode 100644
index 00000000000..41cd08074b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_none-manual.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-dropeffect=none</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:none"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:none"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-dropeffect=none"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-dropeffect=none.</p>
+ <div role='group' id='test' aria-dropeffect='none'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_popup-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_popup-manual.html
new file mode 100644
index 00000000000..8f1b84fa32a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_popup-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-dropeffect=popup</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:popup"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXDropEffects",
+ "is",
+ "[popup]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "dropeffect:popup"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.dropeffect",
+ "is",
+ "popup"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-dropeffect=popup"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-dropeffect=popup.</p>
+ <div role='group' id='test' aria-dropeffect='popup'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_value_changes-manual.html
new file mode 100644
index 00000000000..9302b3b1f78
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-dropeffect_value_changes-manual.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-dropeffect value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-dropeffect",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "copy"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:property-change"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "event",
+ "type",
+ "is",
+ "IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-dropeffect value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-dropeffect value changes.</p>
+ <div role='group' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-errormessage-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-errormessage-manual.html
new file mode 100644
index 00000000000..128d93f6c07
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-errormessage-manual.html
@@ -0,0 +1,95 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-errormessage</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_ERROR_MESSAGE",
+ "is",
+ "[error]"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValidationError",
+ "is",
+ "hello world"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_ERROR",
+ "is",
+ "[error]"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControllerFor",
+ "is",
+ "error"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "error",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_ERROR_FOR",
+ "is",
+ "[test]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_ERROR_FOR",
+ "is",
+ "[test]"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-errormessage"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-errormessage.</p>
+ <div role='group' id='test' aria-errormessage='error' aria-invalid='true'>content</div>
+ <div id='error'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-expanded_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-expanded_false-manual.html
new file mode 100644
index 00000000000..c0b8bd68a70
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-expanded_false-manual.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-expanded=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_EXPANDABLE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_EXPANDED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXExpanded",
+ "is",
+ "NO"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_COLLAPSED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ExpandCollapse.ExpandCollapseState",
+ "is",
+ "Collapsed"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-expanded=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-expanded=false.</p>
+ <div role='button' id='test' aria-expanded='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-expanded_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-expanded_true-manual.html
new file mode 100644
index 00000000000..0cbdffaeb7c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-expanded_true-manual.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-expanded=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_EXPANDABLE"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_EXPANDED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXExpanded",
+ "is",
+ "YES"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_EXPANDED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ExpandCollapse.ExpandCollapseState",
+ "is",
+ "Expanded"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-expanded=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-expanded=true.</p>
+ <div role='button' id='test' aria-expanded='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-expanded_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-expanded_value_changes-manual.html
new file mode 100644
index 00000000000..873094b47ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-expanded_value_changes-manual.html
@@ -0,0 +1,150 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-expanded value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-expanded",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:expanded"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "1"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXRowExpanded"
+ ],
+ [
+ "event",
+ "type",
+ "is",
+ "AXRowCountChanged"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "TBD"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ },
+ {
+ "attribute" : "aria-expanded",
+ "element" : "test",
+ "title" : "step 3",
+ "type" : "attribute",
+ "value" : "false"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:expanded"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "0"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXRowCollapsed"
+ ],
+ [
+ "event",
+ "type",
+ "is",
+ "AXRowCountChanged"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "TBD"
+ ]
+ ]
+ },
+ "title" : "step 4",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-expanded value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-expanded value changes.</p>
+ <div role='menu' id='test'>
+ <div role='menuitem'>content</div>
+ </div>then emit the platform accessibility events for changes to the value of aria-expanded.
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-flowto-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-flowto-manual.html
new file mode 100644
index 00000000000..f8e55a4b05f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-flowto-manual.html
@@ -0,0 +1,95 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-flowto</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_FLOWS_TO",
+ "is",
+ "[next]"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXLinkedUIElements",
+ "is",
+ "[next]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_FLOW_TO",
+ "is",
+ "[next]"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "FlowsTo",
+ "is",
+ "[next]"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "next",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_FLOWS_FROM",
+ "is",
+ "[test]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_FLOW_FROM",
+ "is",
+ "[test]"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-flowto"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-flowto.</p>
+ <div role='group' id='test' aria-flowto='next'>content</div>
+ <div role='group' id='next'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-grabbed_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-grabbed_false-manual.html
new file mode 100644
index 00000000000..006914e32a1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-grabbed_false-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-grabbed=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "grabbed:false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXGrabbed",
+ "is",
+ "NO"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "grabbed:false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.grabbed",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-grabbed=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-grabbed=false.</p>
+ <div role='group' id='test' aria-grabbed='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-grabbed_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-grabbed_true-manual.html
new file mode 100644
index 00000000000..aaec8e150e2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-grabbed_true-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-grabbed=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "grabbed:true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXGrabbed",
+ "is",
+ "YES"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "grabbed:true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.grabbed",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-grabbed=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-grabbed=true.</p>
+ <div role='group' id='test' aria-grabbed='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-grabbed_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-grabbed_value_changes-manual.html
new file mode 100644
index 00000000000..645d80dc22a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-grabbed_value_changes-manual.html
@@ -0,0 +1,70 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-grabbed value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-grabbed",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:property-change"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "event",
+ "type",
+ "is",
+ "IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_SELECTION"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-grabbed value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-grabbed value changes.</p>
+ <div role='group' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-haspopup_dialog_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_dialog_new-manual.html
new file mode 100644
index 00000000000..747113fbe58
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_dialog_new-manual.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-haspopup=dialog NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_HAS_POPUP"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:dialog"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "actions",
+ "contains",
+ "AXShowMenu"
+ ],
+ [
+ "property",
+ "actions",
+ "doesNotContain",
+ "AXPress"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:dialog"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_HASPOPUP"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "ExpandCollapse"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-haspopup=dialog NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-haspopup=dialog NEW.</p>
+ <div role='group' id='test' aria-haspopup='dialog'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-haspopup_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_false-manual.html
new file mode 100644
index 00000000000..2eb81ee0199
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_false-manual.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-haspopup=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SYSTEM_HASPOPUP"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-haspopup=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-haspopup=false.</p>
+ <div role='group' id='test' aria-haspopup='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-haspopup_listbox_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_listbox_new-manual.html
new file mode 100644
index 00000000000..4311592bbd3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_listbox_new-manual.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-haspopup=listbox NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_HAS_POPUP"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:listbox"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "actions",
+ "contains",
+ "AXShowMenu"
+ ],
+ [
+ "property",
+ "actions",
+ "doesNotContain",
+ "AXPress"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:listbox"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_HASPOPUP"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "ExpandCollapse"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-haspopup=listbox NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-haspopup=listbox NEW.</p>
+ <div role='group' id='test' aria-haspopup='listbox'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-haspopup_menu_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_menu_new-manual.html
new file mode 100644
index 00000000000..966a5bcce37
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_menu_new-manual.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-haspopup=menu NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_HAS_POPUP"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:menu"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "actions",
+ "contains",
+ "AXShowMenu"
+ ],
+ [
+ "property",
+ "actions",
+ "doesNotContain",
+ "AXPress"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:menu"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_HASPOPUP"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "ExpandCollapse"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-haspopup=menu NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-haspopup=menu NEW.</p>
+ <div role='group' id='test' aria-haspopup='menu'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-haspopup_tree_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_tree_new-manual.html
new file mode 100644
index 00000000000..7a048fbbf55
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_tree_new-manual.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-haspopup=tree NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_HAS_POPUP"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:tree"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "actions",
+ "contains",
+ "AXShowMenu"
+ ],
+ [
+ "property",
+ "actions",
+ "doesNotContain",
+ "AXPress"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:tree"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_HASPOPUP"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "ExpandCollapse"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-haspopup=tree NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-haspopup=tree NEW.</p>
+ <div role='group' id='test' aria-haspopup='tree'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-haspopup_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_true-manual.html
new file mode 100644
index 00000000000..8ee14bf1a34
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-haspopup_true-manual.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-haspopup=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_HAS_POPUP"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "actions",
+ "contains",
+ "AXShowMenu"
+ ],
+ [
+ "property",
+ "actions",
+ "doesNotContain",
+ "AXPress"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_HASPOPUP"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "ExpandCollapse"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-haspopup=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-haspopup=true.</p>
+ <div role='group' id='test' aria-haspopup='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-hidden_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-hidden_true-manual.html
new file mode 100644
index 00000000000..f9ffcf9adfc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-hidden_true-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-hidden=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-hidden=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-hidden=true.</p>
+ <div id='test' aria-hidden='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-hidden_true_when_element_is_focused_or_fires_event_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-hidden_true_when_element_is_focused_or_fires_event_new-manual.html
new file mode 100644
index 00000000000..81f19f1fc0b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-hidden_true_when_element_is_focused_or_fires_event_new-manual.html
@@ -0,0 +1,97 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-hidden=true when element is focused or fires event NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "event" : "focus",
+ "title" : "step 1",
+ "type" : "event"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "hidden:true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "hidden:true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ],
+ [
+ "property",
+ "AriaProperties.hidden",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-hidden=true when element is focused or fires event NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-hidden=true when element is focused or fires event NEW.</p>
+ <div id='test' aria-hidden='true' tabindex='0'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-hidden_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-hidden_value_changes-manual.html
new file mode 100644
index 00000000000..445a942025e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-hidden_value_changes-manual.html
@@ -0,0 +1,124 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-hidden value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-hidden",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:property-change"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXUIElementDestroyed"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "event",
+ "type",
+ "is",
+ "IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "StructureChangedEvent"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ },
+ {
+ "attribute" : "aria-hidden",
+ "element" : "test",
+ "title" : "step 3",
+ "type" : "attribute",
+ "value" : "false"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:property-change"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXUIElementCreated"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "event",
+ "type",
+ "is",
+ "IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "StructureChangedEvent"
+ ]
+ ]
+ },
+ "title" : "step 4",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-hidden value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-hidden value changes.</p>
+ <div role='checkbox' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-invalid_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-invalid_false-manual.html
new file mode 100644
index 00000000000..c7fbb2c4475
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-invalid_false-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-invalid=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_INVALID_ENTRY"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXInvalid",
+ "is",
+ "false"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_INVALID_ENTRY"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "IsDataValidForForm",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-invalid=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-invalid=false.</p>
+ <div role='group' id='test' aria-invalid='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-invalid_grammar-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-invalid_grammar-manual.html
new file mode 100644
index 00000000000..60bc5d7a6f0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-invalid_grammar-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-invalid=grammar</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_INVALID_ENTRY"
+ ],
+ [
+ "property",
+ "textAttributes",
+ "contains",
+ "invalid:grammar"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXInvalid",
+ "is",
+ "grammar"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_INVALID_ENTRY"
+ ],
+ [
+ "property",
+ "textAttributes",
+ "contains",
+ "invalid:grammar"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "IsDataValidForForm",
+ "is",
+ "grammar"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-invalid=grammar"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-invalid=grammar.</p>
+ <div role='group' id='test' aria-invalid='grammar'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-invalid_spelling-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-invalid_spelling-manual.html
new file mode 100644
index 00000000000..a176221b239
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-invalid_spelling-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-invalid=spelling</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_INVALID_ENTRY"
+ ],
+ [
+ "property",
+ "textAttributes",
+ "contains",
+ "invalid:spelling"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXInvalid",
+ "is",
+ "spelling"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_INVALID_ENTRY"
+ ],
+ [
+ "property",
+ "textAttributes",
+ "contains",
+ "invalid:spelling"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "IsDataValidForForm",
+ "is",
+ "spelling"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-invalid=spelling"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-invalid=spelling.</p>
+ <div role='group' id='test' aria-invalid='spelling'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-invalid_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-invalid_true-manual.html
new file mode 100644
index 00000000000..196af9ba7c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-invalid_true-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-invalid=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_INVALID_ENTRY"
+ ],
+ [
+ "property",
+ "textAttributes",
+ "contains",
+ "invalid:true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXInvalid",
+ "is",
+ "true"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_INVALID_ENTRY"
+ ],
+ [
+ "property",
+ "textAttributes",
+ "contains",
+ "invalid:true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "IsDataValidForForm",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-invalid=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-invalid=true.</p>
+ <div role='group' id='test' aria-invalid='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-invalid_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-invalid_value_changes-manual.html
new file mode 100644
index 00000000000..96b33260aa7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-invalid_value_changes-manual.html
@@ -0,0 +1,120 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-invalid value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-invalid",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:invalid-entry"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "1"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXInvalidStatusChanged"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ },
+ {
+ "attribute" : "aria-invalid",
+ "element" : "test",
+ "title" : "step 3",
+ "type" : "attribute",
+ "value" : "false"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:invalid-entry"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "0"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXInvalidStatusChanged"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ]
+ },
+ "title" : "step 4",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-invalid value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-invalid value changes.</p>
+ <div role='textbox' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-invalid_with_unrecognized_value_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-invalid_with_unrecognized_value_new-manual.html
new file mode 100644
index 00000000000..dd10bafe70e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-invalid_with_unrecognized_value_new-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-invalid with unrecognized value NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_INVALID_ENTRY"
+ ],
+ [
+ "property",
+ "textAttributes",
+ "contains",
+ "invalid:true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXInvalid",
+ "is",
+ "true"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_INVALID_ENTRY"
+ ],
+ [
+ "property",
+ "textAttributes",
+ "contains",
+ "invalid:true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "IsDataValidForForm",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-invalid with unrecognized value NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-invalid with unrecognized value NEW.</p>
+ <div role='group' id='test' aria-invalid='foo'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts_new-manual.html
new file mode 100644
index 00000000000..f8dbdb0b55e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-keyshortcuts_new-manual.html
@@ -0,0 +1,63 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-keyshortcuts NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "keyshortcuts:Shift+Space"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "accKeyboardShortcut",
+ "is",
+ "Shift+Space"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AcceleratorKey",
+ "is",
+ "Shift+Space"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-keyshortcuts NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-keyshortcuts NEW.</p>
+ <div role='group' id='test' aria-keyshortcuts='Shift+Space'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-label-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-label-manual.html
new file mode 100644
index 00000000000..00c7e1e0d95
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-label-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-label</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "name",
+ "is",
+ "hello world"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXDescription",
+ "is",
+ "hello world"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "accName",
+ "is",
+ "hello world"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Name",
+ "is",
+ "hello world"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-label"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-label.</p>
+ <div role='group' id='test' aria-label='hello world'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-labelledby-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-labelledby-manual.html
new file mode 100644
index 00000000000..557bba94927
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-labelledby-manual.html
@@ -0,0 +1,119 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-labelledby</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "name",
+ "is",
+ "hello world"
+ ],
+ [
+ "relation",
+ "RELATION_LABELLED_BY",
+ "is",
+ "[label]"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXDescription",
+ "is",
+ "hello world"
+ ],
+ [
+ "property",
+ "AXTitleUIElement",
+ "is",
+ "label"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "accName",
+ "is",
+ "hello world"
+ ],
+ [
+ "relation",
+ "IA2_RELATION_LABELLED_BY",
+ "is",
+ "[label]"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Name",
+ "is",
+ "hello world"
+ ],
+ [
+ "property",
+ "LabeledBy",
+ "is",
+ "[label]"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "label",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_LABEL_FOR",
+ "is",
+ "[test]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_LABEL_FOR",
+ "is",
+ "[test]"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-labelledby"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-labelledby.</p>
+ <div role='group' id='test' aria-labelledby='label'>content</div>
+ <div id='label'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-level_on_heading-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-level_on_heading-manual.html
new file mode 100644
index 00000000000..950c406cf61
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-level_on_heading-manual.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-level on heading</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "level:2"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValue",
+ "is",
+ "2"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "level:2"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.level",
+ "is",
+ "2"
+ ],
+ [
+ "property",
+ "StyleId_Heading",
+ "is",
+ "2"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-level on heading"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-level on heading.</p>
+ <div role='heading' id='test' aria-level='2'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-level_on_non-heading-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-level_on_non-heading-manual.html
new file mode 100644
index 00000000000..2698040bb74
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-level_on_non-heading-manual.html
@@ -0,0 +1,79 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-level on non-heading</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "level:5"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXDisclosureLevel",
+ "is",
+ "4"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "level:5"
+ ],
+ [
+ "property",
+ "groupPosition",
+ "contains",
+ "groupLevel:5"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.level",
+ "is",
+ "5"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-level on non-heading"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-level on non-heading.</p>
+ <div role='tree'>
+ <div role='treeitem' id='test' aria-level='5'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-live_assertive-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-live_assertive-manual.html
new file mode 100644
index 00000000000..3e6ebae3eeb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-live_assertive-manual.html
@@ -0,0 +1,108 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-live=assertive</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:assertive"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:assertive"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIALive",
+ "is",
+ "assertive"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:assertive"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:assertive"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "LiveSetting",
+ "is",
+ "assertive"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "child",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:assertive"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:assertive"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-live=assertive"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-live=assertive.</p>
+ <div role='group' id='test' aria-live='assertive'>
+ <div role='group' id='child'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-live_off-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-live_off-manual.html
new file mode 100644
index 00000000000..958ecad4fa8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-live_off-manual.html
@@ -0,0 +1,108 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-live=off</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:off"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:off"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIALive",
+ "is",
+ "off"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:off"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:off"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "LiveSetting",
+ "is",
+ "off"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "child",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:off"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:off"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-live=off"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-live=off.</p>
+ <div role='group' id='test' aria-live='off'>
+ <div role='group' id='child'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-live_polite-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-live_polite-manual.html
new file mode 100644
index 00000000000..95d672be811
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-live_polite-manual.html
@@ -0,0 +1,108 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-live=polite</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:polite"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIALive",
+ "is",
+ "polite"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:polite"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "LiveSetting",
+ "is",
+ "polite"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "child",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:polite"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:polite"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-live=polite"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-live=polite.</p>
+ <div role='group' id='test' aria-live='polite'>
+ <div role='group' id='child'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-modal_false_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-modal_false_new-manual.html
new file mode 100644
index 00000000000..f32b5c1fb10
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-modal_false_new-manual.html
@@ -0,0 +1,79 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-modal=false NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_MODAL"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_MODAL"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Window.IsModal",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "group",
+ "test" : {
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-modal=false NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-modal=false NEW.</p>
+ <div role='group' id='group'>content</div>
+ <div role='dialog' id='test' aria-modal='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-modal_true_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-modal_true_new-manual.html
new file mode 100644
index 00000000000..5eb8e893ad7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-modal_true_new-manual.html
@@ -0,0 +1,79 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-modal=true NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_MODAL"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_MODAL"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Window.IsModal",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "group",
+ "test" : {
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-modal=true NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-modal=true NEW.</p>
+ <div role='group' id='group'>content</div>
+ <div role='dialog' id='test' aria-modal='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-multiline_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-multiline_false-manual.html
new file mode 100644
index 00000000000..cf4750e3e14
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-multiline_false-manual.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-multiline=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SINGLE_LINE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_MULTI_LINE"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_SINGLE_LINE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_MULTI_LINE"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-multiline=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-multiline=false.</p>
+ <div role='textbox' id='test' aria-multiline='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-multiline_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-multiline_true-manual.html
new file mode 100644
index 00000000000..d3af0a3d90b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-multiline_true-manual.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-multiline=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_MULTI_LINE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SINGLE_LINE"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_MULTI_LINE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_SINGLE_LINE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.multiline",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-multiline=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-multiline=true.</p>
+ <div role='textbox' id='test' aria-multiline='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-multiselectable_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-multiselectable_false-manual.html
new file mode 100644
index 00000000000..d8ef9a36b4c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-multiselectable_false-manual.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-multiselectable=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_MULTISELECTABLE"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SYSTEM_MULTISELECTABLE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SYSTEM_EXTSELECTABLE"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-multiselectable=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-multiselectable=false.</p>
+ <div role='grid' id='test' aria-multiselectable='false'>
+ <div role='row'>
+ <div role='cell'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-multiselectable_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-multiselectable_true-manual.html
new file mode 100644
index 00000000000..a87cf5296dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-multiselectable_true-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-multiselectable=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_MULTISELECTABLE"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_MULTISELECTABLE"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_EXTSELECTABLE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Selection.CanSelectMultiple",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-multiselectable=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-multiselectable=true.</p>
+ <div role='grid' id='test' aria-multiselectable='true'>
+ <div role='row'>
+ <div role='cell'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-orientation_horizontal-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-orientation_horizontal-manual.html
new file mode 100644
index 00000000000..e12292d9408
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-orientation_horizontal-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-orientation=horizontal</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_HORIZONTAL"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_VERTICAL"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXOrientation",
+ "is",
+ "AXHorizontalOrientation"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_HORIZONTAL"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_VERTICAL"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Orientation",
+ "is",
+ "horizontal"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-orientation=horizontal"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-orientation=horizontal.</p>
+ <div role='scrollbar' id='test' aria-orientation='horizontal'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-orientation_undefined_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-orientation_undefined_new-manual.html
new file mode 100644
index 00000000000..2fa22c93e73
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-orientation_undefined_new-manual.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-orientation=undefined NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_VERTICAL"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_HORIZONTAL"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXOrientation",
+ "is",
+ "AXUnknownOrientation"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-orientation=undefined NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-orientation=undefined NEW.</p>
+ <div role='scrollbar' id='test' aria-orientation='undefined'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-orientation_vertical-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-orientation_vertical-manual.html
new file mode 100644
index 00000000000..bf6f41d9db2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-orientation_vertical-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-orientation=vertical</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_VERTICAL"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_HORIZONTAL"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXOrientation",
+ "is",
+ "AXVerticalOrientation"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_VERTICAL"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_HORIZONTAL"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Orientation",
+ "is",
+ "vertical"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-orientation=vertical"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-orientation=vertical.</p>
+ <div role='scrollbar' id='test' aria-orientation='vertical'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-owns_may_need_manual_verification-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-owns_may_need_manual_verification-manual.html
new file mode 100644
index 00000000000..9510432fa54
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-owns_may_need_manual_verification-manual.html
@@ -0,0 +1,141 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-owns may need manual verification</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_NODE_PARENT_OF",
+ "is",
+ "[owned1, owned2]"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXOwns",
+ "is",
+ "[owned1, owned2]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_NODE_PARENT_OF",
+ "is",
+ "[owned1, owned2]"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "TBD",
+ "is",
+ "owned1"
+ ],
+ [
+ "property",
+ "TBD",
+ "is",
+ "owned2"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "owned1",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_NODE_CHILD_OF",
+ "is",
+ "[test]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_NODE_CHILD_OF",
+ "is",
+ "[test]"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Parent",
+ "is",
+ "test"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ },
+ {
+ "element" : "owned2",
+ "test" : {
+ "ATK" : [
+ [
+ "relation",
+ "RELATION_NODE_CHILD_OF",
+ "is",
+ "[test]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "relation",
+ "IA2_RELATION_NODE_CHILD_OF",
+ "is",
+ "[test]"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Parent",
+ "is",
+ "test"
+ ]
+ ]
+ },
+ "title" : "step 3",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-owns may need manual verification"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-owns may need manual verification.</p>
+ <div role='group' id='test' aria-owns='owned1 owned2'>content</div>
+ <div role='group' id='owned1'>content</div>
+ <div role='group' id='owned2'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-placeholder_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-placeholder_new-manual.html
new file mode 100644
index 00000000000..69f8cf94575
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-placeholder_new-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-placeholder NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "placeholder-text:hello world"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXPlaceholderValue",
+ "is",
+ "hello world"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "placeholder-text:hello world"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.placeholder",
+ "is",
+ "hello world"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-placeholder NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-placeholder NEW.</p>
+ <div role='textbox' id='test' aria-placeholder='hello world'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-posinset-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-posinset-manual.html
new file mode 100644
index 00000000000..14d46b042de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-posinset-manual.html
@@ -0,0 +1,79 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-posinset</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "posinset:2"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIAPosInSet",
+ "is",
+ "2"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "posinset:2"
+ ],
+ [
+ "property",
+ "groupPosition",
+ "contains",
+ "positionInGroup:2"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.posinset",
+ "is",
+ "2"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-posinset"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-posinset.</p>
+ <div role='list'>
+ <div role='listitem' id='test' aria-posinset='2'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-pressed_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-pressed_false-manual.html
new file mode 100644
index 00000000000..4d2c9dc0f98
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-pressed_false-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-pressed=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_PRESSED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValue",
+ "is",
+ "0"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SYSTEM_PRESSED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Toggle.ToggleState",
+ "is",
+ "Off (3)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-pressed=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-pressed=false.</p>
+ <div role='button' id='test' aria-pressed='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-pressed_mixed-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-pressed_mixed-manual.html
new file mode 100644
index 00000000000..09ed8c85ff0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-pressed_mixed-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-pressed=mixed</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_INDETERMINATE"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValue",
+ "is",
+ "2"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_MIXED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Toggle.ToggleState",
+ "is",
+ "Indeterminate (2)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-pressed=mixed"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-pressed=mixed.</p>
+ <div role='button' id='test' aria-pressed='mixed'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-pressed_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-pressed_true-manual.html
new file mode 100644
index 00000000000..3345977d18b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-pressed_true-manual.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-pressed=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_PRESSED"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "checkable:true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValue",
+ "is",
+ "1"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "checkable:true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_PRESSED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Toggle.ToggleState",
+ "is",
+ "On (1)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-pressed=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-pressed=true.</p>
+ <div role='button' id='test' aria-pressed='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-pressed_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-pressed_value_changes-manual.html
new file mode 100644
index 00000000000..e8c88b5da9c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-pressed_value_changes-manual.html
@@ -0,0 +1,104 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-pressed value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-pressed",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:pressed"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "1"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ },
+ {
+ "attribute" : "aria-pressed",
+ "element" : "test",
+ "title" : "step 3",
+ "type" : "attribute",
+ "value" : "false"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:pressed"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "0"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ]
+ },
+ "title" : "step 4",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-pressed value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-pressed value changes.</p>
+ <div role='button' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-readonly_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-readonly_false-manual.html
new file mode 100644
index 00000000000..44675b66ce3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-readonly_false-manual.html
@@ -0,0 +1,79 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-readonly=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_READ_ONLY"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "result",
+ "AXUIElementIsAttributeSettable(AXValue)",
+ "is",
+ "YES"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_EDITABLE"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SYSTEM_READONLY"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Value.IsReadOnly",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-readonly=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-readonly=false.</p>
+ <div role='checkbox' id='test' aria-readonly='false'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-readonly_is_unspecified_on_gridcell_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-readonly_is_unspecified_on_gridcell_new-manual.html
new file mode 100644
index 00000000000..721a6644a79
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-readonly_is_unspecified_on_gridcell_new-manual.html
@@ -0,0 +1,81 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-readonly is unspecified on gridcell NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_READ_ONLY"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_EDITABLE"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "result",
+ "AXUIElementIsAttributeSettable(AXValue)",
+ "is",
+ "NO"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Value.IsReadOnly",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-readonly is unspecified on gridcell NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-readonly is unspecified on gridcell NEW.</p>
+ <div role='grid' aria-readonly='true'>
+ <div role='row'>
+ <div role='gridcell' id='test'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_checkbox-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_checkbox-manual.html
new file mode 100644
index 00000000000..8b01a200174
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_checkbox-manual.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-readonly=true on checkbox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_READ_ONLY"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_CHECKABLE"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "result",
+ "AXUIElementIsAttributeSettable(AXValue)",
+ "is",
+ "NO"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Value.IsReadOnly",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-readonly=true on checkbox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-readonly=true on checkbox.</p>
+ <div role='checkbox' id='test' aria-readonly='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_radiogroup-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_radiogroup-manual.html
new file mode 100644
index 00000000000..bb4fbc47ee2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_radiogroup-manual.html
@@ -0,0 +1,88 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-readonly=true on radiogroup</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_READ_ONLY"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "result",
+ "AXUIElementIsAttributeSettable(AXValue)",
+ "is",
+ "NO"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Value.IsReadOnly",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "radio",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_CHECKABLE"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-readonly=true on radiogroup"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-readonly=true on radiogroup.</p>
+ <div role='radiogroup' id='test' aria-readonly='true'>
+ <div role='radio' id='radio'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_textbox-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_textbox-manual.html
new file mode 100644
index 00000000000..3b9663118b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-readonly_true_on_textbox-manual.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-readonly=true on textbox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_READ_ONLY"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_EDITABLE"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "result",
+ "AXUIElementIsAttributeSettable(AXValue)",
+ "is",
+ "NO"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Value.IsReadOnly",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-readonly=true on textbox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-readonly=true on textbox.</p>
+ <div role='textbox' id='test' aria-readonly='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-readonly_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-readonly_value_changes-manual.html
new file mode 100644
index 00000000000..d9cac765cfc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-readonly_value_changes-manual.html
@@ -0,0 +1,104 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-readonly value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-readonly",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:read-only"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "1"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ },
+ {
+ "attribute" : "aria-readonly",
+ "element" : "test",
+ "title" : "step 3",
+ "type" : "attribute",
+ "value" : "false"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:read-only"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "0"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ]
+ },
+ "title" : "step 4",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-readonly value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-readonly value changes.</p>
+ <div role='textbox' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-relevant-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-relevant-manual.html
new file mode 100644
index 00000000000..be0d2921184
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-relevant-manual.html
@@ -0,0 +1,108 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-relevant</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "relevant:additions"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-relevant:additions"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIARelevant",
+ "is",
+ "additions"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "relevant:additions"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-relevant:additions"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.relevant",
+ "is",
+ "additions"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "child",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-relevant:additions"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-relevant:additions"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-relevant"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-relevant.</p>
+ <div role='group' id='test' aria-relevant='additions' aria-live='polite'>
+ <div role='group' id='child'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-required_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-required_true-manual.html
new file mode 100644
index 00000000000..052395b31d9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-required_true-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-required=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_REQUIRED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRequired",
+ "is",
+ "YES"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_REQUIRED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "IsRequiredForForm",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-required=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-required=true.</p>
+ <div role='combobox' id='test' aria-required='true'>
+ <div role='textbox'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-required_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-required_value_changes-manual.html
new file mode 100644
index 00000000000..c38eb91d060
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-required_value_changes-manual.html
@@ -0,0 +1,104 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-required value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-required",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "true"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:required"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "1"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ },
+ {
+ "attribute" : "aria-required",
+ "element" : "test",
+ "title" : "step 3",
+ "type" : "attribute",
+ "value" : "false"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:state-changed:required"
+ ],
+ [
+ "event",
+ "detail1",
+ "is",
+ "0"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_STATECHANGE"
+ ]
+ ]
+ },
+ "title" : "step 4",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-required value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-required value changes.</p>
+ <div role='textbox' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-roledescription_is_empty_or_whitespace_characters_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-roledescription_is_empty_or_whitespace_characters_new-manual.html
new file mode 100644
index 00000000000..0703399e4d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-roledescription_is_empty_or_whitespace_characters_new-manual.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-roledescription is empty or whitespace characters NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "AXAPI" : [
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "group"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Localized Control Type",
+ "is",
+ "Group"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-roledescription is empty or whitespace characters NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-roledescription is empty or whitespace characters NEW.</p>
+ <div role='group' id='test' aria-roledescription=' '>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-roledescription_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-roledescription_new-manual.html
new file mode 100644
index 00000000000..b137f4e1615
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-roledescription_new-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-roledescription NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "roledescription:hello world"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "hello world"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "localizedExtendedRole",
+ "is",
+ "hello world"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "hello world"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-roledescription NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-roledescription NEW.</p>
+ <div role='group' id='test' aria-roledescription='hello world'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-rowcount_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-rowcount_new-manual.html
new file mode 100644
index 00000000000..12ab12a04e0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-rowcount_new-manual.html
@@ -0,0 +1,96 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-rowcount NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "rowcount:3"
+ ],
+ [
+ "result",
+ "atk_table_get_n_rows()",
+ "is",
+ "3"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIARowCount",
+ "is",
+ "3"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "rowcount:3"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Grid.RowCount",
+ "is",
+ "3"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "row",
+ "test" : {
+ "IAccessible2" : [
+ [
+ "property",
+ "groupPosition",
+ "contains",
+ "similarItemsInGroup:3"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-rowcount NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-rowcount NEW.</p>
+ <div role='table' id='test' aria-rowcount='3'>
+ <div role='row' id='row'>
+ <div role='cell'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-rowindex_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-rowindex_new-manual.html
new file mode 100644
index 00000000000..f3310e90179
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-rowindex_new-manual.html
@@ -0,0 +1,96 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-rowindex NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "rowindex:3"
+ ],
+ [
+ "result",
+ "atk_table_cell_get_position()",
+ "contains",
+ "row=2"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIARowIndex",
+ "is",
+ "3"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "rowindex:3"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "GridItem.Row",
+ "is",
+ "2"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ },
+ {
+ "element" : "row",
+ "test" : {
+ "IAccessible2" : [
+ [
+ "property",
+ "groupPosition",
+ "contains",
+ "positionInGroup:3"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-rowindex NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-rowindex NEW.</p>
+ <div role='grid'>
+ <div role='row' id='row'>
+ <div role='cell' id='test' aria-rowindex='3'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-rowspan_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-rowspan_new-manual.html
new file mode 100644
index 00000000000..199cccdb103
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-rowspan_new-manual.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-rowspan NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "rowspan:2"
+ ],
+ [
+ "result",
+ "atk_table_cell_get_row_column_span()",
+ "contains",
+ "row_span=2"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRowIndexRange.length",
+ "is",
+ "2"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "rowspan:2"
+ ],
+ [
+ "property",
+ "rowExtent",
+ "is",
+ "2"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "GridItem.RowSpan",
+ "is",
+ "2"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-rowspan NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-rowspan NEW.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='cell' id='test' aria-rowspan='2'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-selected_false-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-selected_false-manual.html
new file mode 100644
index 00000000000..1d8d88f5f49
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-selected_false-manual.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-selected=false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SELECTABLE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SELECTED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXSelected",
+ "is",
+ "NO"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_SELECTABLE"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_SYSTEM_SELECTED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "SelectionItem.IsSelected",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-selected=false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-selected=false.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='gridcell' id='test' aria-selected='false'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-selected_true-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-selected_true-manual.html
new file mode 100644
index 00000000000..64c609ad311
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-selected_true-manual.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-selected=true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SELECTABLE"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SELECTED"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXSelected",
+ "is",
+ "YES"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_SELECTABLE"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_SELECTED"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "SelectionItem.IsSelected",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-selected=true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-selected=true.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='gridcell' id='test' aria-selected='true'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-setsize_-1_new-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-setsize_-1_new-manual.html
new file mode 100644
index 00000000000..35e7d851228
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-setsize_-1_new-manual.html
@@ -0,0 +1,80 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-setsize=-1 NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "setsize:2"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_INDETERMINATE"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIASetSize",
+ "is",
+ "-1"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "setsize:-1"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.setsize",
+ "is",
+ "-1"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-setsize=-1 NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-setsize=-1 NEW.</p>
+ <div role='list'>
+ <div role='listitem' id='test' aria-setsize='-1'>content</div>
+ <div role='listitem' aria-setsize='-1'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-setsize_3-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-setsize_3-manual.html
new file mode 100644
index 00000000000..54730724b22
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-setsize_3-manual.html
@@ -0,0 +1,80 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-setsize=3</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "setsize:3"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "STATE_INDETERMINATE"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXARIASetSize",
+ "is",
+ "3"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "setsize:3"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.setsize",
+ "is",
+ "3"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-setsize=3"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-setsize=3.</p>
+ <div role='list'>
+ <div role='listitem' id='test' aria-setsize='3'>content</div>
+ <div role='listitem' aria-setsize='3'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-sort_ascending-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-sort_ascending-manual.html
new file mode 100644
index 00000000000..9d13defbaad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-sort_ascending-manual.html
@@ -0,0 +1,81 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-sort=ascending</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "sort:ascending"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXSortDirection",
+ "is",
+ "AXAscendingSortDirection"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "sort:ascending"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.sort",
+ "is",
+ "ascending"
+ ],
+ [
+ "property",
+ "ItemStatus",
+ "is",
+ "ascending"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-sort=ascending"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-sort=ascending.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='columnheader' id='test' aria-sort='ascending'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-sort_descending-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-sort_descending-manual.html
new file mode 100644
index 00000000000..423dc9b3ec2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-sort_descending-manual.html
@@ -0,0 +1,81 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-sort=descending</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "sort:descending"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXSortDirection",
+ "is",
+ "AXDescendingSortDirection"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "sort:descending"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.sort",
+ "is",
+ "descending"
+ ],
+ [
+ "property",
+ "ItemStatus",
+ "is",
+ "descending"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-sort=descending"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-sort=descending.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='columnheader' id='test' aria-sort='descending'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-sort_none-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-sort_none-manual.html
new file mode 100644
index 00000000000..cbc0c87b0d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-sort_none-manual.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-sort=none</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "sort:none"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "sort:none"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-sort=none"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-sort=none.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='columnheader' id='test' aria-sort='none'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-sort_other-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-sort_other-manual.html
new file mode 100644
index 00000000000..bd7d0928277
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-sort_other-manual.html
@@ -0,0 +1,81 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-sort=other</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "sort:other"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXSortDirection",
+ "is",
+ "AXUnknownSortDirection"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "sort:other"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "AriaProperties.sort",
+ "is",
+ "other"
+ ],
+ [
+ "property",
+ "ItemStatus",
+ "is",
+ "other"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-sort=other"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-sort=other.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='columnheader' id='test' aria-sort='other'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-valuemax-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-valuemax-manual.html
new file mode 100644
index 00000000000..f92332cfeeb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-valuemax-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-valuemax</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "result",
+ "atk_value_get_maximum_value()",
+ "is",
+ "10"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXMaxValue",
+ "is",
+ "10"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "maximumValue",
+ "is",
+ "10"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "RangeValue.Maximum",
+ "is",
+ "10"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-valuemax"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-valuemax.</p>
+ <div role='scrollbar' id='test' aria-valuemax='10'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-valuemin-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-valuemin-manual.html
new file mode 100644
index 00000000000..2f5fd07d300
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-valuemin-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-valuemin</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "result",
+ "atk_value_get_minimum_value()",
+ "is",
+ "2"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXMinValue",
+ "is",
+ "2"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "minimumValue",
+ "is",
+ "2"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "RangeValue.Minimum",
+ "is",
+ "2"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-valuemin"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-valuemin.</p>
+ <div role='scrollbar' id='test' aria-valuemin='2'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-valuenow-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-valuenow-manual.html
new file mode 100644
index 00000000000..5aa9b94d7db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-valuenow-manual.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-valuenow</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "result",
+ "atk_value_get_current_value()",
+ "is",
+ "5"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValue",
+ "is",
+ "5"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "currentValue",
+ "is",
+ "5"
+ ],
+ [
+ "property",
+ "accValue",
+ "is",
+ "5"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "RangeValue.Value",
+ "is",
+ "5"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-valuenow"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-valuenow.</p>
+ <div role='scrollbar' id='test' aria-valuenow='5'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-valuenow_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-valuenow_value_changes-manual.html
new file mode 100644
index 00000000000..ad3d18693e8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-valuenow_value_changes-manual.html
@@ -0,0 +1,78 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-valuenow value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-valuenow",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "10"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:property-change:accessible-value"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXValueChanged"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_VALUECHANGE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "TBD"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-valuenow value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-valuenow value changes.</p>
+ <div role='slider' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-valuetext-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-valuetext-manual.html
new file mode 100644
index 00000000000..031fc60f3f7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-valuetext-manual.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-valuetext</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "valuetext:hello world"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXValueDescription",
+ "is",
+ "hello world"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "accValue",
+ "is",
+ "hello world"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "valuetext:hello world"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Value.Value",
+ "is",
+ "hello world"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-valuetext"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-valuetext.</p>
+ <div role='slider' id='test' aria-valuetext='hello world'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/aria-valuetext_value_changes-manual.html b/tests/wpt/web-platform-tests/core-aam/aria-valuetext_value_changes-manual.html
new file mode 100644
index 00000000000..bf601714d7c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/aria-valuetext_value_changes-manual.html
@@ -0,0 +1,70 @@
+<!doctype html>
+<html>
+ <head>
+ <title>aria-valuetext value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "attribute" : "aria-valuetext",
+ "element" : "test",
+ "title" : "step 1",
+ "type" : "attribute",
+ "value" : "great"
+ },
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "event",
+ "type",
+ "is",
+ "object:property-change:accessible-value"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXValueChanged"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "event",
+ "type",
+ "is",
+ "EVENT_OBJECT_VALUECHANGE"
+ ]
+ ]
+ },
+ "title" : "step 2",
+ "type" : "test"
+ }
+ ],
+ "title" : "aria-valuetext value changes"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for aria-valuetext value changes.</p>
+ <div role='slider' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/article-manual.html b/tests/wpt/web-platform-tests/core-aam/article-manual.html
new file mode 100644
index 00000000000..f60a7bd50f3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/article-manual.html
@@ -0,0 +1,109 @@
+<!doctype html>
+<html>
+ <head>
+ <title>article</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_ARTICLE"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:article"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXDocumentArticle"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "article"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:article"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_DOCUMENT"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "article"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "article"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for article.</p>
+ <div role='article' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/banner-manual.html b/tests/wpt/web-platform-tests/core-aam/banner-manual.html
new file mode 100644
index 00000000000..4c8ad33da45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/banner-manual.html
@@ -0,0 +1,113 @@
+<!doctype html>
+<html>
+ <head>
+ <title>banner</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:banner"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXLandmarkBanner"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "banner"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:banner"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "banner"
+ ],
+ [
+ "property",
+ "Landmark Type",
+ "is",
+ "Custom"
+ ],
+ [
+ "property",
+ "LocalizedLandmarkType",
+ "is",
+ "banner"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "banner"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for banner.</p>
+ <div role='banner' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/button_with_aria-haspopup_dialog_new-manual.html b/tests/wpt/web-platform-tests/core-aam/button_with_aria-haspopup_dialog_new-manual.html
new file mode 100644
index 00000000000..7ef0a2e6dd2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/button_with_aria-haspopup_dialog_new-manual.html
@@ -0,0 +1,89 @@
+<!doctype html>
+<html>
+ <head>
+ <title>button with aria-haspopup="dialog" NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PUSH_BUTTON"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXPopUpButton"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "pop up button"
+ ],
+ [
+ "property",
+ "actions",
+ "contains",
+ "AXShowMenu"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_BUTTONMENU"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Button"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "button with aria-haspopup=\"dialog\" NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for button with aria-haspopup="dialog" NEW.</p>
+ <div role='button' id='test' aria-haspopup='dialog'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/button_with_aria-haspopup_true-manual.html b/tests/wpt/web-platform-tests/core-aam/button_with_aria-haspopup_true-manual.html
new file mode 100644
index 00000000000..682179a0cf6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/button_with_aria-haspopup_true-manual.html
@@ -0,0 +1,89 @@
+<!doctype html>
+<html>
+ <head>
+ <title>button with aria-haspopup="true"</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PUSH_BUTTON"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXPopUpButton"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "pop up button"
+ ],
+ [
+ "property",
+ "actions",
+ "contains",
+ "AXShowMenu"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_BUTTONMENU"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Button"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "button with aria-haspopup=\"true\""
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for button with aria-haspopup="true".</p>
+ <div role='button' id='test' aria-haspopup='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/button_with_default_values_for_aria-pressed_and_aria-haspopup-manual.html b/tests/wpt/web-platform-tests/core-aam/button_with_default_values_for_aria-pressed_and_aria-haspopup-manual.html
new file mode 100644
index 00000000000..b36bb46822f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/button_with_default_values_for_aria-pressed_and_aria-haspopup-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>button with default values for aria-pressed and aria-haspopup</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PUSH_BUTTON"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXButton"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "button"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Button"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "button with default values for aria-pressed and aria-haspopup"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for button with default values for aria-pressed and aria-haspopup.</p>
+ <div role='button' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/button_with_defined_value_for_aria-pressed-manual.html b/tests/wpt/web-platform-tests/core-aam/button_with_defined_value_for_aria-pressed-manual.html
new file mode 100644
index 00000000000..20c9287ee12
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/button_with_defined_value_for_aria-pressed-manual.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+ <head>
+ <title>button with defined value for aria-pressed</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TOGGLE_BUTTON"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXCheckBox"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXToggle"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "toggle button"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_TOGGLE_BUTTON"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Button"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "button with defined value for aria-pressed"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for button with defined value for aria-pressed.</p>
+ <div role='button' id='test' aria-pressed='true'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/cell_new-manual.html b/tests/wpt/web-platform-tests/core-aam/cell_new-manual.html
new file mode 100644
index 00000000000..c6992e8ba65
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/cell_new-manual.html
@@ -0,0 +1,113 @@
+<!doctype html>
+<html>
+ <head>
+ <title>cell NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TABLE_CELL"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "TableCell"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXCell"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "cell"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_CELL"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "DataItem"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "cell"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "TableItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "cell NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for cell NEW.</p>
+ <div role='table'>
+ <div role='row'>
+ <div role='cell' id='test'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/checkbox-manual.html b/tests/wpt/web-platform-tests/core-aam/checkbox-manual.html
new file mode 100644
index 00000000000..f92ab488921
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/checkbox-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>checkbox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_CHECK_BOX"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXCheckBox"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "checkbox"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_CHECKBUTTON"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Checkbox"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "checkbox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for checkbox.</p>
+ <div role='checkbox' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/columnheader-manual.html b/tests/wpt/web-platform-tests/core-aam/columnheader-manual.html
new file mode 100644
index 00000000000..017ebe92aa4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/columnheader-manual.html
@@ -0,0 +1,101 @@
+<!doctype html>
+<html>
+ <head>
+ <title>columnheader</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_COLUMN_HEADER"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "TableCell"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXCell"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "cell"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_COLUMNHEADER"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "HeaderItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "columnheader"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for columnheader.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='columnheader' id='test'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/combobox-manual.html b/tests/wpt/web-platform-tests/core-aam/combobox-manual.html
new file mode 100644
index 00000000000..9d5b08c8438
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/combobox-manual.html
@@ -0,0 +1,111 @@
+<!doctype html>
+<html>
+ <head>
+ <title>combobox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_COMBO_BOX"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_EXPANDABLE"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_HAS_POPUP"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXComboBox"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "combo box"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_HASPOPUP"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_COLLAPSED"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_COMBOBOX"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Combobox"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "combobox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for combobox.</p>
+ <div role='combobox' aria-expanded='false' id='test'>
+ <div role='textbox'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/complementary-manual.html b/tests/wpt/web-platform-tests/core-aam/complementary-manual.html
new file mode 100644
index 00000000000..a7e79c25fb4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/complementary-manual.html
@@ -0,0 +1,113 @@
+<!doctype html>
+<html>
+ <head>
+ <title>complementary</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:complementary"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXLandmarkComplementary"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "complementary"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:complementary"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "complementary"
+ ],
+ [
+ "property",
+ "Landmark Type",
+ "is",
+ "Custom"
+ ],
+ [
+ "property",
+ "LocalizedLandmarkType",
+ "is",
+ "complementary"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "complementary"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for complementary.</p>
+ <div role='complementary' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/contentinfo-manual.html b/tests/wpt/web-platform-tests/core-aam/contentinfo-manual.html
new file mode 100644
index 00000000000..6288c8ffa40
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/contentinfo-manual.html
@@ -0,0 +1,113 @@
+<!doctype html>
+<html>
+ <head>
+ <title>contentinfo</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:contentinfo"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXLandmarkContentInfo"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "content information"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:contentinfo"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "content information"
+ ],
+ [
+ "property",
+ "Landmark Type",
+ "is",
+ "Custom"
+ ],
+ [
+ "property",
+ "LocalizedLandmarkType",
+ "is",
+ "content information"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "contentinfo"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for contentinfo.</p>
+ <div role='contentinfo' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/definition-manual.html b/tests/wpt/web-platform-tests/core-aam/definition-manual.html
new file mode 100644
index 00000000000..5564542db51
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/definition-manual.html
@@ -0,0 +1,95 @@
+<!doctype html>
+<html>
+ <head>
+ <title>definition</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_DESCRIPTION_VALUE"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:definition"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXDefinition"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "definition"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:definition"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "definition"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "definition"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for definition.</p>
+ <div role='definition' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/dialog-manual.html b/tests/wpt/web-platform-tests/core-aam/dialog-manual.html
new file mode 100644
index 00000000000..f7aa26c69fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/dialog-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>dialog</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_DIALOG"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXApplicationDialog"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "web dialog"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_DIALOG"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Pane"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "dialog"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for dialog.</p>
+ <div role='dialog' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/directory-manual.html b/tests/wpt/web-platform-tests/core-aam/directory-manual.html
new file mode 100644
index 00000000000..1dcc0ed8614
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/directory-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>directory</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LIST"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXList"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXContentList"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "content list"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LIST"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "List"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "directory"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for directory.</p>
+ <div role='directory' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/document-manual.html b/tests/wpt/web-platform-tests/core-aam/document-manual.html
new file mode 100644
index 00000000000..6c37547c899
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/document-manual.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+ <head>
+ <title>document</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_DOCUMENT_FRAME"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXDocument"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "document"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_DOCUMENT"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Document"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "document"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for document.</p>
+ <div role='document' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_css_display_none-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_css_display_none-manual.html
new file mode 100644
index 00000000000..2c6a355ea10
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_css_display_none-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude element hidden with CSS display:none</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude element hidden with CSS display:none"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude element hidden with CSS display:none.</p>
+ <div role='button' style='display:none;'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_css_visibility_hidden-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_css_visibility_hidden-manual.html
new file mode 100644
index 00000000000..0ebf066e9cb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_css_visibility_hidden-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude element hidden with CSS visibility:hidden</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude element hidden with CSS visibility:hidden"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude element hidden with CSS visibility:hidden.</p>
+ <div role='button' style='visibility:hidden;'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_html5_hidden-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_html5_hidden-manual.html
new file mode 100644
index 00000000000..6d3723112d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_element_hidden_with_html5_hidden-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude element hidden with HTML5 hidden</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude element hidden with HTML5 hidden"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude element hidden with HTML5 hidden.</p>
+ <div role='button' hidden>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_button-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_button-manual.html
new file mode 100644
index 00000000000..27c218eac1a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_button-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of button</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of button"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of button.</p>
+ <div role='button'>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_checkbox_new-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_checkbox_new-manual.html
new file mode 100644
index 00000000000..0bea0e6367a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_checkbox_new-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of checkbox NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of checkbox NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of checkbox NEW.</p>
+ <div role='checkbox'>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_img-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_img-manual.html
new file mode 100644
index 00000000000..24c95828bf7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_img-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of img</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of img"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of img.</p>
+ <div role='img'>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_math-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_math-manual.html
new file mode 100644
index 00000000000..e2b86bc529e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_math-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of math</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of math"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of math.</p>
+ <div role='math'>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_menuitemcheckbox_new-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_menuitemcheckbox_new-manual.html
new file mode 100644
index 00000000000..3c69d07f063
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_menuitemcheckbox_new-manual.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of menuitemcheckbox NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of menuitemcheckbox NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of menuitemcheckbox NEW.</p>
+ <div role='menu'>
+ <div role='menuitemcheckbox'>
+ <div id='test'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_menuitemradio_new-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_menuitemradio_new-manual.html
new file mode 100644
index 00000000000..78b408c7c2e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_menuitemradio_new-manual.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of menuitemradio NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of menuitemradio NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of menuitemradio NEW.</p>
+ <div role='menu'>
+ <div role='menuitemradio'>
+ <div id='test'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_option_new-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_option_new-manual.html
new file mode 100644
index 00000000000..e6aafc7b735
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_option_new-manual.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of option NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of option NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of option NEW.</p>
+ <div role='listbox'>
+ <div role='option'>
+ <div id='test'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_progressbar-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_progressbar-manual.html
new file mode 100644
index 00000000000..553d0cf3abd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_progressbar-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of progressbar</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of progressbar"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of progressbar.</p>
+ <div role='progressbar'>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_radio_new-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_radio_new-manual.html
new file mode 100644
index 00000000000..856b1e8f0d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_radio_new-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of radio NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of radio NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of radio NEW.</p>
+ <div role='radio'>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_scrollbar-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_scrollbar-manual.html
new file mode 100644
index 00000000000..71d5ca5b521
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_scrollbar-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of scrollbar</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of scrollbar"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of scrollbar.</p>
+ <div role='scrollbar'>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_separator-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_separator-manual.html
new file mode 100644
index 00000000000..a5ce3349968
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_separator-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of separator</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of separator"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of separator.</p>
+ <div role='separator'>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_slider-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_slider-manual.html
new file mode 100644
index 00000000000..59637656fab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_slider-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of slider</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of slider"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of slider.</p>
+ <div role='slider'>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_switch_new-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_switch_new-manual.html
new file mode 100644
index 00000000000..89db6be0ac2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_switch_new-manual.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of switch NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of switch NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of switch NEW.</p>
+ <div role='switch'>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_tab_new-manual.html b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_tab_new-manual.html
new file mode 100644
index 00000000000..5424288fcb4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/exclude_presentational_children_of_tab_new-manual.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Exclude presentational children of tab NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Exclude presentational children of tab NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Exclude presentational children of tab NEW.</p>
+ <div role='tablist'>
+ <div role='tab'>
+ <div id='test'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/feed_new-manual.html b/tests/wpt/web-platform-tests/core-aam/feed_new-manual.html
new file mode 100644
index 00000000000..71f8c9045ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/feed_new-manual.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<html>
+ <head>
+ <title>feed NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PANEL"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:feed"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXApplicationGroup"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "feed"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:feed"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_GROUPING"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "feed"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "feed NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for feed NEW.</p>
+ <div role='feed' id='test'>
+ <div role='article'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/figure_new-manual.html b/tests/wpt/web-platform-tests/core-aam/figure_new-manual.html
new file mode 100644
index 00000000000..c2bbd39a7ca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/figure_new-manual.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html>
+ <head>
+ <title>figure NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PANEL"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:figure"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "figure"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:figure"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_GROUPING"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "figure"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "figure NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for figure NEW.</p>
+ <div role='figure' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/form-manual.html b/tests/wpt/web-platform-tests/core-aam/form-manual.html
new file mode 100644
index 00000000000..0664713d67f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/form-manual.html
@@ -0,0 +1,107 @@
+<!doctype html>
+<html>
+ <head>
+ <title>form</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:form"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "group"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_FORM"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:form"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "form"
+ ],
+ [
+ "property",
+ "Landmark Type",
+ "is",
+ "Form"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "form"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for form.</p>
+ <div role='form' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/grid-manual.html b/tests/wpt/web-platform-tests/core-aam/grid-manual.html
new file mode 100644
index 00000000000..829f3d8614c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/grid-manual.html
@@ -0,0 +1,164 @@
+<!doctype html>
+<html>
+ <head>
+ <title>grid</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TABLE"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:grid"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Table"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Selection"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXTable"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "table"
+ ],
+ [
+ "property",
+ "AXColumnHeaderUIElements",
+ "is",
+ "[colheader1, colheader2]"
+ ],
+ [
+ "property",
+ "AXHeader",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXRowHeaderUIElements",
+ "is",
+ "[rowheader1, rowheader2]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:grid"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTable2"
+ ],
+ [
+ "result",
+ "IAccessible::accSelect()",
+ "is",
+ "TBD"
+ ],
+ [
+ "result",
+ "IAccessible::get_accSelection()",
+ "is",
+ "TBD"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TABLE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "DataGrid"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Selection"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "grid"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for grid.</p>
+ <div role='grid' id='test'>
+ <div role='row' id='headerrow'>
+ <div role='columnheader' id='colheader1'>content</div>
+ <div role='columnheader' id='colheader2'>content</div>
+ </div>
+ <div role='row'>
+ <div role='rowheader' id='rowheader1'>content</div>
+ <div role='gridcell'>content</div>
+ </div>
+ <div role='row'>
+ <div role='rowheader' id='rowheader2'>content</div>
+ <div role='gridcell'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/gridcell-manual.html b/tests/wpt/web-platform-tests/core-aam/gridcell-manual.html
new file mode 100644
index 00000000000..c698032a4b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/gridcell-manual.html
@@ -0,0 +1,119 @@
+<!doctype html>
+<html>
+ <head>
+ <title>gridcell</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TABLE_CELL"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "TableCell"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXCell"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "cell"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_CELL"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "DataItem"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "gridcell"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "SelectionItem"
+ ],
+ [
+ "property",
+ "SelectionItem.SelectionContainer",
+ "is",
+ "the containing grid"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "gridcell"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for gridcell.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='gridcell' id='test'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/group-manual.html b/tests/wpt/web-platform-tests/core-aam/group-manual.html
new file mode 100644
index 00000000000..da825176649
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/group-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>group</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PANEL"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXApplicationGroup"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "group"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_GROUPING"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "group"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for group.</p>
+ <div role='group' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/heading-manual.html b/tests/wpt/web-platform-tests/core-aam/heading-manual.html
new file mode 100644
index 00000000000..d68bb5325ed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/heading-manual.html
@@ -0,0 +1,95 @@
+<!doctype html>
+<html>
+ <head>
+ <title>heading</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_HEADING"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXHeading"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "heading"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_HEADING"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:heading"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Text"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "heading"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "heading"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for heading.</p>
+ <div role='heading' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/img-manual.html b/tests/wpt/web-platform-tests/core-aam/img-manual.html
new file mode 100644
index 00000000000..baa4f177af3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/img-manual.html
@@ -0,0 +1,97 @@
+<!doctype html>
+<html>
+ <head>
+ <title>img</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_IMAGE"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Image"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXImage"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "image"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleImage"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_GRAPHIC"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Image"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "img"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for img.</p>
+ <div role='img' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-controls-manual.html b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-controls-manual.html
new file mode 100644
index 00000000000..127fcb77174
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-controls-manual.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Include element referenced by global aria-controls</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Include element referenced by global aria-controls"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Include element referenced by global aria-controls.</p>
+ <div role='group' aria-controls='test'>content</div>
+ <div id='test'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-describedby-manual.html b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-describedby-manual.html
new file mode 100644
index 00000000000..9cf18620d67
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-describedby-manual.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Include element referenced by global aria-describedby</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Include element referenced by global aria-describedby"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Include element referenced by global aria-describedby.</p>
+ <div role='group' aria-describedby='test'>content</div>
+ <div id='test'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-details_new-manual.html b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-details_new-manual.html
new file mode 100644
index 00000000000..397ded19f32
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-details_new-manual.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Include element referenced by global aria-details NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Include element referenced by global aria-details NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Include element referenced by global aria-details NEW.</p>
+ <div role='group' aria-details='test'>content</div>
+ <div id='test'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-errormessage_new-manual.html b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-errormessage_new-manual.html
new file mode 100644
index 00000000000..f279cddde2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-errormessage_new-manual.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Include element referenced by global aria-errormessage NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Include element referenced by global aria-errormessage NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Include element referenced by global aria-errormessage NEW.</p>
+ <div role='group' aria-errormessage='test' aria-invalid='true'>content</div>
+ <div id='test'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-flowto-manual.html b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-flowto-manual.html
new file mode 100644
index 00000000000..173d702564e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-flowto-manual.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Include element referenced by global aria-flowto</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Include element referenced by global aria-flowto"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Include element referenced by global aria-flowto.</p>
+ <div role='group' aria-flowto='test'>content</div>
+ <div id='test'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-labelledby-manual.html b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-labelledby-manual.html
new file mode 100644
index 00000000000..86a09cb7f20
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-labelledby-manual.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Include element referenced by global aria-labelledby</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Include element referenced by global aria-labelledby"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Include element referenced by global aria-labelledby.</p>
+ <div role='group' aria-labelledby='test'>content</div>
+ <div id='test'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-owns-manual.html b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-owns-manual.html
new file mode 100644
index 00000000000..baf2c17b3bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/include_element_referenced_by_global_aria-owns-manual.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Include element referenced by global aria-owns</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Include element referenced by global aria-owns"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Include element referenced by global aria-owns.</p>
+ <div role='group' aria-owns='test'>content</div>
+ <div id='test'>hello world</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/include_element_that_is_focusable-manual.html b/tests/wpt/web-platform-tests/core-aam/include_element_that_is_focusable-manual.html
new file mode 100644
index 00000000000..c3e95405f12
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/include_element_that_is_focusable-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Include element that is focusable</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Include element that is focusable"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Include element that is focusable.</p>
+ <div id='test' tabindex='0'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/include_element_with_id_inside_element_with_aria-activedescendant-manual.html b/tests/wpt/web-platform-tests/core-aam/include_element_with_id_inside_element_with_aria-activedescendant-manual.html
new file mode 100644
index 00000000000..cbae28e6003
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/include_element_with_id_inside_element_with_aria-activedescendant-manual.html
@@ -0,0 +1,74 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Include element with ID inside element with aria-activedescendant</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "Include element with ID inside element with aria-activedescendant"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for Include element with ID inside element with aria-activedescendant.</p>
+ <div role='group' aria-activedescendant='child' tabindex='0'>
+ <div id='child'>content</div>
+ <div id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/link-manual.html b/tests/wpt/web-platform-tests/core-aam/link-manual.html
new file mode 100644
index 00000000000..d83d0cf1a6c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/link-manual.html
@@ -0,0 +1,115 @@
+<!doctype html>
+<html>
+ <head>
+ <title>link</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LINK"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Hyperlink"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXLink"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "link"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_LINKED"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_LINKED"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleHypertext"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LINK"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "HyperLink"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Value"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "link"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for link.</p>
+ <div role='link' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/list-manual.html b/tests/wpt/web-platform-tests/core-aam/list-manual.html
new file mode 100644
index 00000000000..81e8b2dc153
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/list-manual.html
@@ -0,0 +1,93 @@
+<!doctype html>
+<html>
+ <head>
+ <title>list</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LIST"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXList"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXContentList"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "content list"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LIST"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "List"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "list"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for list.</p>
+ <div role='list' id='test'>
+ <div role='listitem'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/listbox_not_owned_by_or_child_of_combobox-manual.html b/tests/wpt/web-platform-tests/core-aam/listbox_not_owned_by_or_child_of_combobox-manual.html
new file mode 100644
index 00000000000..58b302139f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/listbox_not_owned_by_or_child_of_combobox-manual.html
@@ -0,0 +1,111 @@
+<!doctype html>
+<html>
+ <head>
+ <title>listbox not owned by or child of combobox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LIST_BOX"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Selection"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXList"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "list"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "result",
+ "IAccessible::accSelect()",
+ "is",
+ "TBD"
+ ],
+ [
+ "result",
+ "IAccessible::get_accSelection()",
+ "is",
+ "TBD"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LIST"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "List"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Selection"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "listbox not owned by or child of combobox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for listbox not owned by or child of combobox.</p>
+ <div role='listbox' id='test'>
+ <div role='option'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/listbox_owned_by_or_child_of_combobox-manual.html b/tests/wpt/web-platform-tests/core-aam/listbox_owned_by_or_child_of_combobox-manual.html
new file mode 100644
index 00000000000..62a233ab73b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/listbox_owned_by_or_child_of_combobox-manual.html
@@ -0,0 +1,114 @@
+<!doctype html>
+<html>
+ <head>
+ <title>listbox owned by or child of combobox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_MENU"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Selection"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXList"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "list"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "result",
+ "IAccessible::accSelect()",
+ "is",
+ "TBD"
+ ],
+ [
+ "result",
+ "IAccessible::get_accSelection()",
+ "is",
+ "TBD"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LIST"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "List"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Selection"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "listbox owned by or child of combobox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for listbox owned by or child of combobox.</p>
+ <div role='combobox'>
+ <div role='textbox'>content</div>
+ <div role='listbox' id='test'>
+ <div role='option'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/listitem-manual.html b/tests/wpt/web-platform-tests/core-aam/listitem-manual.html
new file mode 100644
index 00000000000..14dbec9230d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/listitem-manual.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<html>
+ <head>
+ <title>listitem</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LIST_ITEM"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "group"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LISTITEM"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "ListItem"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "SelectionItem"
+ ],
+ [
+ "property",
+ "SelectionItem.SelectionContainer",
+ "is",
+ "the containing list"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "listitem"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for listitem.</p>
+ <div role='list'>
+ <div role='listitem' id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/log-manual.html b/tests/wpt/web-platform-tests/core-aam/log-manual.html
new file mode 100644
index 00000000000..d997b95940e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/log-manual.html
@@ -0,0 +1,137 @@
+<!doctype html>
+<html>
+ <head>
+ <title>log</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LOG"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:log"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live-role:log"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXApplicationLog"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "log"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:log"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live-role:log"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "log"
+ ],
+ [
+ "property",
+ "LiveSetting",
+ "is",
+ "Polite (1)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "log"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for log.</p>
+ <div role='log' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/main-manual.html b/tests/wpt/web-platform-tests/core-aam/main-manual.html
new file mode 100644
index 00000000000..8d8e6ff7ee1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/main-manual.html
@@ -0,0 +1,107 @@
+<!doctype html>
+<html>
+ <head>
+ <title>main</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:main"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXLandmarkMain"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "main"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:main"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "main"
+ ],
+ [
+ "property",
+ "Landmark Type",
+ "is",
+ "Main"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "main"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for main.</p>
+ <div role='main' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/marquee-manual.html b/tests/wpt/web-platform-tests/core-aam/marquee-manual.html
new file mode 100644
index 00000000000..064c8d25684
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/marquee-manual.html
@@ -0,0 +1,127 @@
+<!doctype html>
+<html>
+ <head>
+ <title>marquee</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_MARQUEE"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:off"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:off"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXApplicationMarquee"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "marquee"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:marquee"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:off"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:off"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_ANIMATION"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "marquee"
+ ],
+ [
+ "property",
+ "LiveSetting",
+ "is",
+ "Off (0)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "marquee"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for marquee.</p>
+ <div role='marquee' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/math-manual.html b/tests/wpt/web-platform-tests/core-aam/math-manual.html
new file mode 100644
index 00000000000..5fc96729a95
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/math-manual.html
@@ -0,0 +1,89 @@
+<!doctype html>
+<html>
+ <head>
+ <title>math</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_MATH"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXDocumentMath"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "math"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_EQUATION"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "math"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "math"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for math.</p>
+ <div role='math' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/menu-manual.html b/tests/wpt/web-platform-tests/core-aam/menu-manual.html
new file mode 100644
index 00000000000..0407d3ad508
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/menu-manual.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<html>
+ <head>
+ <title>menu</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_MENU"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Selection"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXMenu"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "menu"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "result",
+ "IAccessible::accSelect()",
+ "is",
+ "TBD"
+ ],
+ [
+ "result",
+ "IAccessible::get_accSelection()",
+ "is",
+ "TBD"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_MENUPOPUP"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Menu"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "menu"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for menu.</p>
+ <div role='menu' id='test'>
+ <div role='menuitemradio'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/menu_child_of_menu_item-manual.html b/tests/wpt/web-platform-tests/core-aam/menu_child_of_menu_item-manual.html
new file mode 100644
index 00000000000..723d2dfa103
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/menu_child_of_menu_item-manual.html
@@ -0,0 +1,109 @@
+<!doctype html>
+<html>
+ <head>
+ <title>menu child of menu item</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_MENU"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Selection"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXMenu"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "menu"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "result",
+ "IAccessible::accSelect()",
+ "is",
+ "TBD"
+ ],
+ [
+ "result",
+ "IAccessible::get_accSelection()",
+ "is",
+ "TBD"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_MENUPOPUP"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Menu"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "menu child of menu item"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for menu child of menu item.</p>
+ <div role='menu'>
+ <div role='menuitem'>
+ <div role='menu' id='test'>
+ <div role='menuitemradio'>content</div>
+ </div>
+ <div role='menuitem'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/menubar-manual.html b/tests/wpt/web-platform-tests/core-aam/menubar-manual.html
new file mode 100644
index 00000000000..88f323894e0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/menubar-manual.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<html>
+ <head>
+ <title>menubar</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_MENU_BAR"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Selection"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXMenuBar"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "menu bar"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "result",
+ "IAccessible::accSelect()",
+ "is",
+ "TBD"
+ ],
+ [
+ "result",
+ "IAccessible::get_accSelection()",
+ "is",
+ "TBD"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_MENUBAR"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "MenuBar"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "menubar"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for menubar.</p>
+ <div role='menubar' id='test'>
+ <div role='menuitemradio'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html b/tests/wpt/web-platform-tests/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html
new file mode 100644
index 00000000000..f42d81fa05e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+ <head>
+ <title>menuitem not owned by or child of group</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_MENU_ITEM"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXMenuItem"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "menu item"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_MENUITEM"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "MenuItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "menuitem not owned by or child of group"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for menuitem not owned by or child of group.</p>
+ <div role='menu'>
+ <div role='menuitem' id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/menuitem_owned_by_or_child_of_group-manual.html b/tests/wpt/web-platform-tests/core-aam/menuitem_owned_by_or_child_of_group-manual.html
new file mode 100644
index 00000000000..11d216fb514
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/menuitem_owned_by_or_child_of_group-manual.html
@@ -0,0 +1,88 @@
+<!doctype html>
+<html>
+ <head>
+ <title>menuitem owned by or child of group</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_MENU_ITEM"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXMenuButton"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "menu button"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_MENUITEM"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "MenuItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "menuitem owned by or child of group"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for menuitem owned by or child of group.</p>
+ <div role='menu'>
+ <div role='group'>
+ <div role='menuitem' id='test'>content 1</div>
+ </div>
+ <div role='menuitem'>content 2</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/menuitemcheckbox-manual.html b/tests/wpt/web-platform-tests/core-aam/menuitemcheckbox-manual.html
new file mode 100644
index 00000000000..1e13e5ae86c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/menuitemcheckbox-manual.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<html>
+ <head>
+ <title>menuitemcheckbox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_CHECK_MENU_ITEM"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXMenuItem"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "menu item"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_CHECK_MENU_ITEM"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_CHECKBUTTON or ROLE_SYSTEM_MENUITEM"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "MenuItem"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Toggle"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "menuitemcheckbox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for menuitemcheckbox.</p>
+ <div role='menu'>
+ <div role='menuitemcheckbox' id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/menuitemradio-manual.html b/tests/wpt/web-platform-tests/core-aam/menuitemradio-manual.html
new file mode 100644
index 00000000000..6d0832191df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/menuitemradio-manual.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<html>
+ <head>
+ <title>menuitemradio</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_RADIO_MENU_ITEM"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXMenuItem"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "menu item"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_RADIO_MENU_ITEM"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_RADIOBUTTON or ROLE_SYSTEM_MENUITEM"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "MenuItem"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Toggle"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "SelectionItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "menuitemradio"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for menuitemradio.</p>
+ <div role='menu'>
+ <div role='menuitemradio' id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/navigation-manual.html b/tests/wpt/web-platform-tests/core-aam/navigation-manual.html
new file mode 100644
index 00000000000..23994824662
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/navigation-manual.html
@@ -0,0 +1,107 @@
+<!doctype html>
+<html>
+ <head>
+ <title>navigation</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:navigation"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXLandmarkNavigation"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "navigation"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:navigation"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "navigation"
+ ],
+ [
+ "property",
+ "Landmark Type",
+ "is",
+ "Navigation"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "navigation"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for navigation.</p>
+ <div role='navigation' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/none_new-manual.html b/tests/wpt/web-platform-tests/core-aam/none_new-manual.html
new file mode 100644
index 00000000000..deef5fb1ab6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/none_new-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>none NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "none NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for none NEW.</p>
+ <div role='none' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/none_used_on_element_that_is_focused_or_fires_event-manual.html b/tests/wpt/web-platform-tests/core-aam/none_used_on_element_that_is_focused_or_fires_event-manual.html
new file mode 100644
index 00000000000..06a3b078fc2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/none_used_on_element_that_is_focused_or_fires_event-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>none used on element that is focused or fires event</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "none used on element that is focused or fires event"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for none used on element that is focused or fires event.</p>
+ <div id='test' role='none' tabindex='0'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/none_used_on_table_element_with_td_children_new-manual.html b/tests/wpt/web-platform-tests/core-aam/none_used_on_table_element_with_td_children_new-manual.html
new file mode 100644
index 00000000000..9004348b76e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/none_used_on_table_element_with_td_children_new-manual.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+ <head>
+ <title>none used on table element with td children NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SECTION"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "group"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_SECTION"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Control Type",
+ "is",
+ "Group"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "none used on table element with td children NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for none used on table element with td children NEW.</p>
+ <table role='none'>
+ <tr><td id='test' aria-label='name to force inclusion'>row 1, col 1</td><td>row 1, col 2</td></tr>
+ </table>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/none_used_on_ul_element_with_li_children_new-manual.html b/tests/wpt/web-platform-tests/core-aam/none_used_on_ul_element_with_li_children_new-manual.html
new file mode 100644
index 00000000000..c6fdaf791e7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/none_used_on_ul_element_with_li_children_new-manual.html
@@ -0,0 +1,86 @@
+<!doctype html>
+<html>
+ <head>
+ <title>none used on ul element with li children NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SECTION"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "group"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_SECTION"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Control Type",
+ "is",
+ "Group"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "none used on ul element with li children NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for none used on ul element with li children NEW.</p>
+ <ul role='none'>
+ <li id='test' aria-label='name to force inclusion'>item 1</li>
+ <li>item 2</li>
+ </ul>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/note-manual.html b/tests/wpt/web-platform-tests/core-aam/note-manual.html
new file mode 100644
index 00000000000..37504d76540
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/note-manual.html
@@ -0,0 +1,89 @@
+<!doctype html>
+<html>
+ <head>
+ <title>note</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_COMMENT"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXDocumentNote"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "note"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_NOTE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "note"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "note"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for note.</p>
+ <div role='note' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/option_inside_combobox-manual.html b/tests/wpt/web-platform-tests/core-aam/option_inside_combobox-manual.html
new file mode 100644
index 00000000000..e692d9fcab3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/option_inside_combobox-manual.html
@@ -0,0 +1,94 @@
+<!doctype html>
+<html>
+ <head>
+ <title>option inside combobox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_MENU_ITEM"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXStaticText"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "text"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LISTITEM"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "ListItem"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Invoke"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "option inside combobox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for option inside combobox.</p>
+ <div role='combobox'>
+ <div role='textbox'>content</div>
+ <div role='listbox'>
+ <div role='option' id='test'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/option_not_inside_combobox-manual.html b/tests/wpt/web-platform-tests/core-aam/option_not_inside_combobox-manual.html
new file mode 100644
index 00000000000..15f966b4588
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/option_not_inside_combobox-manual.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html>
+ <head>
+ <title>option not inside combobox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LIST_ITEM"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXStaticText"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "text"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LISTITEM"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "ListItem"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Invoke"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "option not inside combobox"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for option not inside combobox.</p>
+ <div role='listbox'>
+ <div role='option' id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/presentation-manual.html b/tests/wpt/web-platform-tests/core-aam/presentation-manual.html
new file mode 100644
index 00000000000..4abbe838294
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/presentation-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>presentation</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "presentation"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for presentation.</p>
+ <div role='presentation' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/presentation_used_on_element_that_is_focused_or_fires_event-manual.html b/tests/wpt/web-platform-tests/core-aam/presentation_used_on_element_that_is_focused_or_fires_event-manual.html
new file mode 100644
index 00000000000..f7021f8117b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/presentation_used_on_element_that_is_focused_or_fires_event-manual.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<html>
+ <head>
+ <title>presentation used on element that is focused or fires event</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "true"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "presentation used on element that is focused or fires event"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for presentation used on element that is focused or fires event.</p>
+ <div id='test' role='presentation' tabindex='0'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/presentation_used_on_table_element_with_td_children_new-manual.html b/tests/wpt/web-platform-tests/core-aam/presentation_used_on_table_element_with_td_children_new-manual.html
new file mode 100644
index 00000000000..cd0b19d620a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/presentation_used_on_table_element_with_td_children_new-manual.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+ <head>
+ <title>presentation used on table element with td children NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SECTION"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "group"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_SECTION"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Control Type",
+ "is",
+ "Group"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "presentation used on table element with td children NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for presentation used on table element with td children NEW.</p>
+ <table role='presentation'>
+ <tr><td id='test' aria-label='name to force inclusion'>row 1, col 1</td><td>row 1, col 2</td></tr>
+ </table>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/presentation_used_on_ul_element_with_li_children_new-manual.html b/tests/wpt/web-platform-tests/core-aam/presentation_used_on_ul_element_with_li_children_new-manual.html
new file mode 100644
index 00000000000..b00e183204f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/presentation_used_on_ul_element_with_li_children_new-manual.html
@@ -0,0 +1,86 @@
+<!doctype html>
+<html>
+ <head>
+ <title>presentation used on ul element with li children NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SECTION"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "group"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_SECTION"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Control Type",
+ "is",
+ "Group"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "presentation used on ul element with li children NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for presentation used on ul element with li children NEW.</p>
+ <ul role='presentation'>
+ <li id='test' aria-label='name to force inclusion'>item 1</li>
+ <li>item 2</li>
+ </ul>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/progressbar-manual.html b/tests/wpt/web-platform-tests/core-aam/progressbar-manual.html
new file mode 100644
index 00000000000..a336fa08607
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/progressbar-manual.html
@@ -0,0 +1,109 @@
+<!doctype html>
+<html>
+ <head>
+ <title>progressbar</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PROGRESS_BAR"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Value"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXProgressIndicator"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "progress indicator"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAcesssibleValue"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PROGRESSBAR"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "ProgressBar"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "RangeValue"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "progressbar"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for progressbar.</p>
+ <div role='progressbar' aria-valuenow='20' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/radio-manual.html b/tests/wpt/web-platform-tests/core-aam/radio-manual.html
new file mode 100644
index 00000000000..9f191a4b0ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/radio-manual.html
@@ -0,0 +1,95 @@
+<!doctype html>
+<html>
+ <head>
+ <title>radio</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_RADIO_BUTTON"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXRadioButton"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "radio button"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_RADIOBUTTON"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "RadioButton"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Toggle"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "SelectionItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "radio"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for radio.</p>
+ <div role='radio' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/radiogroup-manual.html b/tests/wpt/web-platform-tests/core-aam/radiogroup-manual.html
new file mode 100644
index 00000000000..b91cf469732
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/radiogroup-manual.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+ <head>
+ <title>radiogroup</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PANEL"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXRadioGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "radio group"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_GROUPING"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "List"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "radiogroup"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for radiogroup.</p>
+ <div role='radiogroup' id='test'>
+ <div role='radio'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/region_with_an_accessible_name_new-manual.html b/tests/wpt/web-platform-tests/core-aam/region_with_an_accessible_name_new-manual.html
new file mode 100644
index 00000000000..f09e4ff2122
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/region_with_an_accessible_name_new-manual.html
@@ -0,0 +1,113 @@
+<!doctype html>
+<html>
+ <head>
+ <title>region with an accessible name NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:region"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXLandmarkRegion"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "region"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:region"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "region"
+ ],
+ [
+ "property",
+ "Landmark Type",
+ "is",
+ "Custom"
+ ],
+ [
+ "property",
+ "LocalizedLandmarkType",
+ "is",
+ "region"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "region with an accessible name NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for region with an accessible name NEW.</p>
+ <div role='region' aria-label='name for region' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/region_without_an_accessible_name_new-manual.html b/tests/wpt/web-platform-tests/core-aam/region_without_an_accessible_name_new-manual.html
new file mode 100644
index 00000000000..05ca5e7b080
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/region_without_an_accessible_name_new-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>region without an accessible name NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SECTION"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "group"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_SECTION"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "Control Type",
+ "is",
+ "Group"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "region without an accessible name NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for region without an accessible name NEW.</p>
+ <div role='region' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/row_inside_treegrid-manual.html b/tests/wpt/web-platform-tests/core-aam/row_inside_treegrid-manual.html
new file mode 100644
index 00000000000..8add16b431c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/row_inside_treegrid-manual.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<html>
+ <head>
+ <title>row inside treegrid</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TABLE_ROW"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXRow"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "row"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_OUTLINEITEM"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "DataItem"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "row"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "SelectionItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "row inside treegrid"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for row inside treegrid.</p>
+ <div role='treegrid'>
+ <div role='row' id='test'>
+ <div role='gridcell'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/row_not_inside_treegrid-manual.html b/tests/wpt/web-platform-tests/core-aam/row_not_inside_treegrid-manual.html
new file mode 100644
index 00000000000..eb0cdff17c2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/row_not_inside_treegrid-manual.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<html>
+ <head>
+ <title>row not inside treegrid</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TABLE_ROW"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXRow"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "row"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_ROW"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "DataItem"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "row"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "SelectionItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "row not inside treegrid"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for row not inside treegrid.</p>
+ <div role='grid'>
+ <div role='row' id='test'>
+ <div role='gridcell'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/rowgroup-manual.html b/tests/wpt/web-platform-tests/core-aam/rowgroup-manual.html
new file mode 100644
index 00000000000..556647f34bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/rowgroup-manual.html
@@ -0,0 +1,80 @@
+<!doctype html>
+<html>
+ <head>
+ <title>rowgroup</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PANEL"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "accessible",
+ "is",
+ "false"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_GROUPING"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "rowgroup"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for rowgroup.</p>
+ <div role='grid'>
+ <div role='rowgroup' id='test'>
+ <div role='row'>
+ <div role='cell'>content</div>
+ </div>
+ <div role='row'>
+ <div role='cell'>content</div>
+ </div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/rowheader-manual.html b/tests/wpt/web-platform-tests/core-aam/rowheader-manual.html
new file mode 100644
index 00000000000..324d92c28a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/rowheader-manual.html
@@ -0,0 +1,101 @@
+<!doctype html>
+<html>
+ <head>
+ <title>rowheader</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_ROW_HEADER"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "TableCell"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXCell"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "cell"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_ROWHEADER"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "HeaderItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "rowheader"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for rowheader.</p>
+ <div role='grid'>
+ <div role='row'>
+ <div role='rowheader' id='test'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/scrollbar-manual.html b/tests/wpt/web-platform-tests/core-aam/scrollbar-manual.html
new file mode 100644
index 00000000000..3b4b5ff1725
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/scrollbar-manual.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html>
+ <head>
+ <title>scrollbar</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SCROLL_BAR"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Value"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXScrollBar"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "scroll bar"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAcesssibleValue"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SCROLLBAR"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "ScrollBar"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "RangeValue"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "scrollbar"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for scrollbar.</p>
+ <div role='scrollbar' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/search-manual.html b/tests/wpt/web-platform-tests/core-aam/search-manual.html
new file mode 100644
index 00000000000..dee7fb31e84
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/search-manual.html
@@ -0,0 +1,107 @@
+<!doctype html>
+<html>
+ <head>
+ <title>search</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:search"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXLandmarkSearch"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "search"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_LANDMARK"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:search"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "search"
+ ],
+ [
+ "property",
+ "Landmark Type",
+ "is",
+ "Search"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "search"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for search.</p>
+ <div role='search' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/searchbox_new-manual.html b/tests/wpt/web-platform-tests/core-aam/searchbox_new-manual.html
new file mode 100644
index 00000000000..ba59e739561
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/searchbox_new-manual.html
@@ -0,0 +1,109 @@
+<!doctype html>
+<html>
+ <head>
+ <title>searchbox NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_ENTRY"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:searchbox"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "EditableText"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXTextField"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXSearchField"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "search text field"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "text-input-type:search"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TEXT"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Edit"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "search box"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "searchbox NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for searchbox NEW.</p>
+ <div role='searchbox' contenteditable id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/separator_focusable_new-manual.html b/tests/wpt/web-platform-tests/core-aam/separator_focusable_new-manual.html
new file mode 100644
index 00000000000..d94c06d7652
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/separator_focusable_new-manual.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html>
+ <head>
+ <title>separator focusable NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SEPARATOR"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Value"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXSplitter"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "splitter"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleValue"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SEPARATOR"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Thumb"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "RangeValue"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "separator focusable NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for separator focusable NEW.</p>
+ <div role='separator' tabindex='0' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/separator_non-focusable-manual.html b/tests/wpt/web-platform-tests/core-aam/separator_non-focusable-manual.html
new file mode 100644
index 00000000000..78c21ae62ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/separator_non-focusable-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>separator non-focusable</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SEPARATOR"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXSplitter"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "splitter"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SEPARATOR"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Separator"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "separator non-focusable"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for separator non-focusable.</p>
+ <div role='separator' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/slider-manual.html b/tests/wpt/web-platform-tests/core-aam/slider-manual.html
new file mode 100644
index 00000000000..d0613e65a84
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/slider-manual.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html>
+ <head>
+ <title>slider</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SLIDER"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Value"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXSlider"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "slider"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAcesssibleValue"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SLIDER"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Slider"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "RangeValue"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "slider"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for slider.</p>
+ <div role='slider' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/spinbutton-manual.html b/tests/wpt/web-platform-tests/core-aam/spinbutton-manual.html
new file mode 100644
index 00000000000..80f3f24dece
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/spinbutton-manual.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html>
+ <head>
+ <title>spinbutton</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SPIN_BUTTON"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Value"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXIncrementor"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "stepper"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAcesssibleValue"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SPINBUTTON"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Spinner"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "RangeValue"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "spinbutton"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for spinbutton.</p>
+ <div role='spinbutton' id='test'>10</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/status-manual.html b/tests/wpt/web-platform-tests/core-aam/status-manual.html
new file mode 100644
index 00000000000..25803645436
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/status-manual.html
@@ -0,0 +1,133 @@
+<!doctype html>
+<html>
+ <head>
+ <title>status</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_STATUSBAR"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live-role:status"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXApplicationStatus"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "application status"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live-role:status"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_STATUSBAR"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "status"
+ ],
+ [
+ "property",
+ "LiveSetting",
+ "is",
+ "Polite (1)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "status"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for status.</p>
+ <div role='status' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/switch_new-manual.html b/tests/wpt/web-platform-tests/core-aam/switch_new-manual.html
new file mode 100644
index 00000000000..b7c6d33743e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/switch_new-manual.html
@@ -0,0 +1,115 @@
+<!doctype html>
+<html>
+ <head>
+ <title>switch NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TOGGLE_BUTTON"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:switch"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXCheckBox"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXSwitch"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "switch"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_TOGGLE_BUTTON"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:switch"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_CHECKBUTTON"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Button"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "toggleswitch"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Toggle"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "switch NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for switch NEW.</p>
+ <div role='switch' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/tab-manual.html b/tests/wpt/web-platform-tests/core-aam/tab-manual.html
new file mode 100644
index 00000000000..7b749e842b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/tab-manual.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+ <head>
+ <title>tab</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PAGE_TAB"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXRadioButton"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "tab"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PAGETAB"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "TabItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "tab"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for tab.</p>
+ <div role='tablist'>
+ <div role='tab' id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/table_new-manual.html b/tests/wpt/web-platform-tests/core-aam/table_new-manual.html
new file mode 100644
index 00000000000..463c4707595
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/table_new-manual.html
@@ -0,0 +1,152 @@
+<!doctype html>
+<html>
+ <head>
+ <title>table NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TABLE"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:table"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Table"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXTable"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "table"
+ ],
+ [
+ "property",
+ "AXColumnHeaderUIElements",
+ "is",
+ "[colheader1, colheader2]"
+ ],
+ [
+ "property",
+ "AXHeader",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXRowHeaderUIElements",
+ "is",
+ "[rowheader1, rowheader2]"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:table"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTable2"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TABLE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Table"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Grid"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Table"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "table NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for table NEW.</p>
+ <div role='table' id='test'>
+ <div role='row' id='headerrow'>
+ <div role='columnheader' id='colheader1'>content</div>
+ <div role='columnheader' id='colheader2'>content</div>
+ </div>
+ <div role='row'>
+ <div role='rowheader' id='rowheader1'>content</div>
+ <div role='cell'>content</div>
+ </div>
+ <div role='row'>
+ <div role='rowheader' id='rowheader2'>content</div>
+ <div role='cell'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/tablist-manual.html b/tests/wpt/web-platform-tests/core-aam/tablist-manual.html
new file mode 100644
index 00000000000..71c7f3fb1d8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/tablist-manual.html
@@ -0,0 +1,147 @@
+<!doctype html>
+<html>
+ <head>
+ <title>tablist</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_PAGE_TAB_LIST"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Selection"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "container-live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "container-live-role:tablist"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXTabGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "tab group"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "result",
+ "IAccessible::accSelect()",
+ "is",
+ "TBD"
+ ],
+ [
+ "result",
+ "IAccessible::get_accSelection()",
+ "is",
+ "TBD"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "container-live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "live:polite"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "doesNotContain",
+ "container-live-role:tablist"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PAGETABLIST"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Tab"
+ ],
+ [
+ "property",
+ "Control Pattern",
+ "is",
+ "Selection"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "tablist"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for tablist.</p>
+ <div role='tablist' id='test'>
+ <div role='tab'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/tabpanel-manual.html b/tests/wpt/web-platform-tests/core-aam/tabpanel-manual.html
new file mode 100644
index 00000000000..dd00381761b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/tabpanel-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>tabpanel</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SCROLL_PANE"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXTabPanel"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "tab panel"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PANE or ROLE_SYSTEM_PROPERTYPAGE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Pane"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "tabpanel"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for tabpanel.</p>
+ <div role='tabpanel' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/term_new-manual.html b/tests/wpt/web-platform-tests/core-aam/term_new-manual.html
new file mode 100644
index 00000000000..a09cc8c5175
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/term_new-manual.html
@@ -0,0 +1,95 @@
+<!doctype html>
+<html>
+ <head>
+ <title>term NEW</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_DESCRIPTION_TERM"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXTerm"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "term"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "IA2_ROLE_TEXT_FRAME"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:term"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Text"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "term"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "term NEW"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for term NEW.</p>
+ <div role='term' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/textbox_when_aria-multiline_is_false-manual.html b/tests/wpt/web-platform-tests/core-aam/textbox_when_aria-multiline_is_false-manual.html
new file mode 100644
index 00000000000..662dfab377b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/textbox_when_aria-multiline_is_false-manual.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html>
+ <head>
+ <title>textbox when aria-multiline is false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_ENTRY"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SINGLE_LINE"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "EditableText"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXTextField"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "text field"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_SINGLE_LINE"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TEXT"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Edit"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "textbox when aria-multiline is false"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for textbox when aria-multiline is false.</p>
+ <div role='textbox' contenteditable aria-multiline='false' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/textbox_when_aria-multiline_is_true-manual.html b/tests/wpt/web-platform-tests/core-aam/textbox_when_aria-multiline_is_true-manual.html
new file mode 100644
index 00000000000..766a886b9dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/textbox_when_aria-multiline_is_true-manual.html
@@ -0,0 +1,103 @@
+<!doctype html>
+<html>
+ <head>
+ <title>textbox when aria-multiline is true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_ENTRY"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_MULTI_LINE"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "EditableText"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXTextArea"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "text entry area"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_MULTI_LINE"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TEXT"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Edit"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "textbox when aria-multiline is true"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for textbox when aria-multiline is true.</p>
+ <div role='textbox' contenteditable aria-multiline='true' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/timer-manual.html b/tests/wpt/web-platform-tests/core-aam/timer-manual.html
new file mode 100644
index 00000000000..bea80520121
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/timer-manual.html
@@ -0,0 +1,131 @@
+<!doctype html>
+<html>
+ <head>
+ <title>timer</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TIMER"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:off"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:off"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live-role:timer"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXApplicationTimer"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "timer"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "xml-roles:timer"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live:off"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "live:off"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "container-live-role:timer"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Group"
+ ],
+ [
+ "property",
+ "LocalizedControlType",
+ "is",
+ "timer"
+ ],
+ [
+ "property",
+ "LiveSetting",
+ "is",
+ "Off (0)"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "timer"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for timer.</p>
+ <div role='timer' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/toolbar-manual.html b/tests/wpt/web-platform-tests/core-aam/toolbar-manual.html
new file mode 100644
index 00000000000..b0e8a46abf5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/toolbar-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>toolbar</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TOOL_BAR"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXToolbar"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "toolbar"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TOOLBAR"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "ToolBar"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "toolbar"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for toolbar.</p>
+ <div role='toolbar' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/tooltip-manual.html b/tests/wpt/web-platform-tests/core-aam/tooltip-manual.html
new file mode 100644
index 00000000000..066f30d223a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/tooltip-manual.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<html>
+ <head>
+ <title>tooltip</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TOOL_TIP"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXGroup"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXUserInterfaceTooltip"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "tooltip"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TOOLTIP"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "ToolTip"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "tooltip"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for tooltip.</p>
+ <div role='tooltip' id='test'>content</div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/tree-manual.html b/tests/wpt/web-platform-tests/core-aam/tree-manual.html
new file mode 100644
index 00000000000..ba347dcc0b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/tree-manual.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<html>
+ <head>
+ <title>tree</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TREE"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Selection"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXOutline"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "outline"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "result",
+ "IAccessible::accSelect()",
+ "is",
+ "TBD"
+ ],
+ [
+ "result",
+ "IAccessible::get_accSelection()",
+ "is",
+ "TBD"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_OUTLINE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "Tree"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "tree"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for tree.</p>
+ <div role='tree' id='test'>
+ <div role='treeitem'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/treegrid-manual.html b/tests/wpt/web-platform-tests/core-aam/treegrid-manual.html
new file mode 100644
index 00000000000..44440b4f033
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/treegrid-manual.html
@@ -0,0 +1,119 @@
+<!doctype html>
+<html>
+ <head>
+ <title>treegrid</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TREE_TABLE"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Table"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "Selection"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXTable"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "<nil>"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "table"
+ ]
+ ],
+ "IAccessible2" : [
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTable2"
+ ],
+ [
+ "result",
+ "IAccessible::accSelect()",
+ "is",
+ "TBD"
+ ],
+ [
+ "result",
+ "IAccessible::get_accSelection()",
+ "is",
+ "TBD"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_OUTLINE"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "DataGrid"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "treegrid"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for treegrid.</p>
+ <div role='treegrid' id='test'>
+ <div role='row'>
+ <div role='gridcell'>content</div>
+ </div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/core-aam/treeitem-manual.html b/tests/wpt/web-platform-tests/core-aam/treeitem-manual.html
new file mode 100644
index 00000000000..64d738b5589
--- /dev/null
+++ b/tests/wpt/web-platform-tests/core-aam/treeitem-manual.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<html>
+ <head>
+ <title>treeitem</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
+ <link rel="stylesheet" href="/resources/testharness.css">
+ <link rel="stylesheet" href="/wai-aria/scripts/manual.css">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/wai-aria/scripts/ATTAcomm.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true });
+
+ var theTest = new ATTAcomm(
+ {
+ "steps" : [
+ {
+ "element" : "test",
+ "test" : {
+ "ATK" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_TREE_ITEM"
+ ]
+ ],
+ "AXAPI" : [
+ [
+ "property",
+ "AXRole",
+ "is",
+ "AXRow"
+ ],
+ [
+ "property",
+ "AXSubrole",
+ "is",
+ "AXOutlineRow"
+ ],
+ [
+ "property",
+ "AXRoleDescription",
+ "is",
+ "outline row"
+ ]
+ ],
+ "MSAA" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_OUTLINEITEM"
+ ]
+ ],
+ "UIA" : [
+ [
+ "property",
+ "ControlType",
+ "is",
+ "TreeItem"
+ ]
+ ]
+ },
+ "title" : "step 1",
+ "type" : "test"
+ }
+ ],
+ "title" : "treeitem"
+}
+
+ ) ;
+ </script>
+ </head>
+ <body>
+ <p>This test examines the ARIA properties for treeitem.</p>
+ <div role='tree'>
+ <div role='treeitem' id='test'>content</div>
+ </div>
+
+ <div id="manualMode"></div>
+ <div id="log"></div>
+ <div id="ATTAmessages"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/credential-management/credentialscontainer-create-basics.https.html b/tests/wpt/web-platform-tests/credential-management/credentialscontainer-create-basics.https.html
index 89ae784d7ec..af304e23bbb 100644
--- a/tests/wpt/web-platform-tests/credential-management/credentialscontainer-create-basics.https.html
+++ b/tests/wpt/web-platform-tests/credential-management/credentialscontainer-create-basics.https.html
@@ -73,6 +73,40 @@ promise_test(function(t) {
}, "navigator.credentials.create() with bogus federated data");
promise_test(function(t) {
+ return promise_rejects(t, new TypeError(),
+ navigator.credentials.create({publicKey: "bogus publicKey data"}));
+}, "navigator.credentials.create() with bogus publicKey data");
+
+promise_test(function(t) {
+ var publicKey = {
+ challenge: new TextEncoder().encode("climb a mountain"),
+ rp: {
+ id: "1098237235409872",
+ name: "Acme"
+ },
+
+ user: {
+ id: "1098237235409872",
+ name: "avery.a.jones@example.com",
+ displayName: "Avery A. Jones",
+ icon: "https://pics.acme.com/00/p/aBjjjpqPb.png"
+ },
+
+ parameters: [{
+ type: "public-key",
+ algorithm: "ES256",
+ },],
+
+ timeout: 60000, // 1 minute
+ excludeList: [], // No excludeList
+ };
+
+ return navigator.credentials.create({publicKey}).then(r => {
+ assert_true(r instanceof PublicKeyCredential);
+ });
+}, "navigator.credentials.create() returns PublicKeyCredential");
+
+promise_test(function(t) {
var credential_data = {
id: 'id',
password: 'pencil',
@@ -99,6 +133,31 @@ promise_test(function(t) {
}, "navigator.credentials.create() with bogus password and federated data");
promise_test(function(t) {
+ return promise_rejects(t, new TypeError(),
+ navigator.credentials.create({
+ federated: "bogus federated data",
+ publicKey: "bogus publicKey data",
+ }));
+}, "navigator.credentials.create() with bogus federated and publicKey data");
+
+promise_test(function(t) {
+ return promise_rejects(t, new TypeError(),
+ navigator.credentials.create({
+ password: "bogus password data",
+ publicKey: "bogus publicKey data",
+ }));
+}, "navigator.credentials.create() with bogus password and publicKey data");
+
+promise_test(function(t) {
+ return promise_rejects(t, new TypeError(),
+ navigator.credentials.create({
+ password: "bogus password data",
+ federated: "bogus federated data",
+ publicKey: "bogus publicKey data",
+ }));
+}, "navigator.credentials.create() with bogus password, federated, and publicKey data");
+
+promise_test(function(t) {
return promise_rejects(t, "NotSupportedError",
navigator.credentials.create({bogus_key: "bogus data"}));
}, "navigator.credentials.create() with bogus data");
diff --git a/tests/wpt/web-platform-tests/credential-management/idl.https.html b/tests/wpt/web-platform-tests/credential-management/idl.https.html
index 92f489ef571..8754b5a30b6 100644
--- a/tests/wpt/web-platform-tests/credential-management/idl.https.html
+++ b/tests/wpt/web-platform-tests/credential-management/idl.https.html
@@ -101,4 +101,3 @@
});
idl_array.test();
</script>
-
diff --git a/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-ref.html b/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-ref.html
new file mode 100644
index 00000000000..0bd414cd067
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-ref.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<style>
+ .refSquare {
+ margin: 10px;
+ width: 30px;
+ height: 30px;
+ background-color: green;
+ }
+</style>
+<p>There should be three green 30x30 px squares below.</p>
+<div>border-box</div>
+<div class="refSquare"></div>
+<div>padding-box</div>
+<div class="refSquare"></div>
+<duv>content-box</div>
+<div class="refSquare"></div>
diff --git a/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-repaint-ref.html b/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-repaint-ref.html
new file mode 100644
index 00000000000..81e95173e8a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-repaint-ref.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<p>There should be a green square below.</p>
+<div style="background-color:green;width:150px;height:150px"></div>
diff --git a/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-repaint.html b/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-repaint.html
new file mode 100644
index 00000000000..6052db526a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color-repaint.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Backgrounds and Borders: background-clip color background repaint</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="match" href="background-clip-color-repaint-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#the-background-clip">
+<style>
+ #outer {
+ width: 150px;
+ height: 150px;
+ background-color: red;
+ }
+ #inner {
+ border: 30px dashed green;
+ padding: 30px;
+ width: 30px;
+ height: 30px;
+ background-color: green;
+ background-clip: content-box;
+ }
+</style>
+<p>There should be a green square below.</p>
+<div id="outer">
+ <div id="inner"></div>
+</div>
+<script>
+ requestAnimationFrame(function(){
+ requestAnimationFrame(function(){
+ inner.style.backgroundClip = "border-box";
+ document.documentElement.classList.remove("reftest-wait");
+ });
+ });
+ inner.style.backgroundClip = "border-box";
+</script>
diff --git a/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color.html b/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color.html
new file mode 100644
index 00000000000..b09d8086ecc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-backgrounds/background-clip-color.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Backgrounds and Borders: background-clip color backgrounds</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="match" href="background-clip-color-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-backgrounds/#the-background-clip">
+<style>
+ #borderBoxHelper {
+ margin: 10px;
+ width: 30px;
+ height: 30px;
+ background-color: red;
+ }
+ #borderBox {
+ border: 6px dashed green;
+ padding: 6px;
+ width: 6px;
+ height: 6px;
+ background-color: green;
+ background-clip: border-box;
+ }
+ #paddingBoxHelper {
+ width: 30px;
+ height: 30px;
+ background-color: red;
+ }
+ #paddingBox {
+ border: 10px dashed white;
+ padding: 10px;
+ width: 10px;
+ height: 10px;
+ background-color: green;
+ background-clip: padding-box;
+ }
+ #contentBoxHelper {
+ width: 30px;
+ height: 30px;
+ background-color: red;
+ }
+ #contentBox {
+ padding: 10px;
+ width: 30px;
+ height: 30px;
+ background-color: green;
+ background-clip: content-box;
+ }
+</style>
+<p>There should be three green 30x30 px squares below.</p>
+<div>border-box</div>
+<div id="borderBoxHelper">
+ <div id="borderBox"></div>
+</div>
+<div>padding-box</div>
+<div class="paddingBoxHelper">
+ <div id="paddingBox"></div>
+</div>
+<div>content-box</div>
+<div class="contentgBoxHelper">
+ <div id="contentBox"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css-cascade/inherit-initial.html b/tests/wpt/web-platform-tests/css-cascade/inherit-initial.html
new file mode 100644
index 00000000000..8d8dfef38d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-cascade/inherit-initial.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>CSS Cascading and Inheritance test: Root element inherits from initial values</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://www.w3.org/TR/css3-cascade/#inheriting">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+html {
+ z-index: inherit;
+ position: inherit;
+ overflow: inherit;
+ background-color: inherit;
+}
+body {
+ overflow: scroll;
+ background-color: pink;
+}
+</style>
+<script>
+ test(function() {
+ assert_equals(getComputedStyle(document.documentElement).zIndex, "auto");
+ }, "z-index:inherit on root element should compute to 'auto'.");
+
+ test(function() {
+ assert_equals(getComputedStyle(document.documentElement).position, "static");
+ }, "position:inherit on root element should compute to 'static'.");
+
+ test(function() {
+ assert_equals(getComputedStyle(document.documentElement).overflow, "visible");
+ }, "overflow:inherit on root element should compute to 'visible'.");
+
+ test(function() {
+ assert_equals(getComputedStyle(document.documentElement).backgroundColor, "rgba(0, 0, 0, 0)");
+ }, "background-color:inherit on root element should compute to 'rgba(0, 0, 0, 0)'.");
+</script>
diff --git a/tests/wpt/web-platform-tests/css-font-display/font-display.html b/tests/wpt/web-platform-tests/css-font-display/font-display.html
deleted file mode 100644
index 019a88a9b7c..00000000000
--- a/tests/wpt/web-platform-tests/css-font-display/font-display.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<title>Test for font-display @font-face descriptor</title>
-<link rel="match" href="font-display-ref.html">
-<style>
-.hidden { display: none; }
-</style>
-<p>Tests how text with a font that takes <i>delay</i> seconds to load look like after <i>T</i> seconds from load start.</p>
-<table id="container">
- <tr>
- <th>T[sec]</th>
- <th>delay[sec]</th>
- <th>auto</th>
- <th>block</th>
- <th>swap</th>
- <th>fallback</th>
- <th>optional</th>
- </tr>
-</table>
-<script>
-var fontDisplayValues = ['auto', 'block', 'swap', 'fallback', 'optional'];
-var configs = [{time: 0, delay: 1000},
- {time: 1000, delay: 0},
- {time: 1000, delay: 500},
- {time: 1000, delay: 3000},
- {time: 5000, delay: 2000},
- {time: 5000, delay: 4000},
- {time: 5000, delay: 8000}];
-
-function makeFontFaceDeclaration(family, config, display) {
- url = 'resources/slow-ahem-loading.py?ms=' + config.delay;
- return '@font-face { font-family: ' + family + '; src: url(' + url + '); font-display: ' + display + '; }';
-}
-
-
-var maxTime = Math.max.apply(null, configs.map((config) => config.time));
-var table = document.getElementById('container');
-
-window.onload = function() {
- for (var config, i = 0; config = configs[i]; i++) {
- var tr = document.createElement('tr');
- tr.classList.add('hidden');
- var td1 = document.createElement('td');
- td1.textContent = config.time / 1000;
- tr.appendChild(td1);
- var td2 = document.createElement('td');
- td2.textContent = config.delay / 1000;
- tr.appendChild(td2);
-
- for (var display, j = 0; display = fontDisplayValues[j]; j++) {
- var family = [display, config.time, config.delay].join('-');
- var rule = makeFontFaceDeclaration(family, config, display);
- document.styleSheets[0].insertRule(rule, 0);
- var td = document.createElement('td');
- td.textContent = 'a';
- td.style.fontFamily = family + ', Arial';
- tr.appendChild(td);
- }
- table.appendChild(tr);
- if (config.time == 0) {
- setTimeout((function(tr){
- tr.classList.remove('hidden');
- document.documentElement.classList.remove("reftest-wait");
- }).bind(null, tr), maxTime);
- } else {
- setTimeout((function(tr){tr.classList.remove('hidden')}).bind(null, tr), maxTime - config.time);
- }
- }
-}
-
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css-font-display/resources/slow-ahem-loading.py b/tests/wpt/web-platform-tests/css-font-display/resources/slow-ahem-loading.py
deleted file mode 100644
index 45989505cee..00000000000
--- a/tests/wpt/web-platform-tests/css-font-display/resources/slow-ahem-loading.py
+++ /dev/null
@@ -1,16 +0,0 @@
-import os
-import time
-
-def main(request, response):
- body = open(os.path.join(os.path.dirname(__file__), "../../css/fonts/ahem/ahem.ttf"), "rb").read()
- delay = float(request.GET.first("ms", 500))
- if delay > 0:
- time.sleep(delay / 1E3);
-
- response.add_required_headers = False
- response.writer.write_status(200)
- response.writer.write_header("content-length", len(body))
- response.writer.write_header("content-type", "application/octet-stream")
- response.writer.end_headers()
-
- response.writer.write(body)
diff --git a/tests/wpt/web-platform-tests/css-font-display/font-display-ref.html b/tests/wpt/web-platform-tests/css-fonts/font-display/font-display-ref.html
index 1d8410b4ed6..1d8410b4ed6 100644
--- a/tests/wpt/web-platform-tests/css-font-display/font-display-ref.html
+++ b/tests/wpt/web-platform-tests/css-fonts/font-display/font-display-ref.html
diff --git a/tests/wpt/web-platform-tests/css-fonts/font-display/font-display.html b/tests/wpt/web-platform-tests/css-fonts/font-display/font-display.html
new file mode 100644
index 00000000000..9336377e88a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/font-display/font-display.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>Test for font-display @font-face descriptor</title>
+<link rel="match" href="font-display-ref.html">
+<style>
+.hidden { display: none; }
+</style>
+<p>Tests how text with a font that takes <i>delay</i> seconds to load look like after <i>T</i> seconds from load start.</p>
+<table id="container">
+ <tr>
+ <th>T[sec]</th>
+ <th>delay[sec]</th>
+ <th>auto</th>
+ <th>block</th>
+ <th>swap</th>
+ <th>fallback</th>
+ <th>optional</th>
+ </tr>
+</table>
+<script>
+var fontDisplayValues = ['auto', 'block', 'swap', 'fallback', 'optional'];
+var configs = [{time: 0, delay: 1000},
+ {time: 1000, delay: 0},
+ {time: 1000, delay: 500},
+ {time: 1000, delay: 3000},
+ {time: 5000, delay: 2000},
+ {time: 5000, delay: 4000},
+ {time: 5000, delay: 8000}];
+
+function makeFontFaceDeclaration(family, config, display) {
+ url = '/fonts/Ahem.ttf?pipe=trickle(d' + config.delay / 1000 + ')';
+ return '@font-face { font-family: ' + family + '; src: url("' + url + '"); font-display: ' + display + '; }';
+}
+
+
+var maxTime = Math.max.apply(null, configs.map((config) => config.time));
+var table = document.getElementById('container');
+
+window.onload = function() {
+ for (var config, i = 0; config = configs[i]; i++) {
+ var tr = document.createElement('tr');
+ tr.classList.add('hidden');
+ var td1 = document.createElement('td');
+ td1.textContent = config.time / 1000;
+ tr.appendChild(td1);
+ var td2 = document.createElement('td');
+ td2.textContent = config.delay / 1000;
+ tr.appendChild(td2);
+
+ for (var display, j = 0; display = fontDisplayValues[j]; j++) {
+ var family = [display, config.time, config.delay].join('-');
+ var rule = makeFontFaceDeclaration(family, config, display);
+ document.styleSheets[0].insertRule(rule, 0);
+ var td = document.createElement('td');
+ td.textContent = 'a';
+ td.style.fontFamily = family + ', Arial';
+ tr.appendChild(td);
+ }
+ table.appendChild(tr);
+ if (config.time == 0) {
+ setTimeout((function(tr){
+ tr.classList.remove('hidden');
+ document.documentElement.classList.remove("reftest-wait");
+ }).bind(null, tr), maxTime);
+ } else {
+ setTimeout((function(tr){tr.classList.remove('hidden')}).bind(null, tr), maxTime - config.time);
+ }
+ }
+}
+
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/matching/OWNERS b/tests/wpt/web-platform-tests/css-fonts/matching/OWNERS
new file mode 100644
index 00000000000..c61158582e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/matching/OWNERS
@@ -0,0 +1,4 @@
+@drott
+@fantasai
+@litherum
+@nattokirai
diff --git a/tests/wpt/web-platform-tests/css-fonts/matching/README.md b/tests/wpt/web-platform-tests/css-fonts/matching/README.md
new file mode 100644
index 00000000000..0d760752059
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/matching/README.md
@@ -0,0 +1,50 @@
+# Stretch, Style, Weight Matching Tests
+This directory contains a set of tests for [the font style matching algorithm, section 5.2](https://drafts.csswg.org/css-fonts-4/#font-style-matching) of the [CSS Fonts Module Level 4](https://drafts.csswg.org/css-fonts-4/) specification.
+
+In Level 4 of the spec, the font style matching algorithm has been extended to
+support [OpenType Variations](https://www.microsoft.com/typography/otspec/otvaroverview.htm). This means, the
+`@font-face` property descriptors accept ranges for `font-style`, `font-stretch` and `font-weight` and the matching
+algorithm has been modified to take these into account, and to set variable fonts axis parameters accordingly.
+
+## Test Font
+
+For testing font matching with Variations support a test font called **Variable Test Axis Matching** was created (`variabletest_matching.ttf`).
+
+The design goal for this font is to match variable glyphs against non-variable, static reference glyphs. The variable glyphs are
+scaled according to variation axes for stretch, style, weight. The reference glyphs are not subject to variation interpolation.
+
+### Test Glyphs
+The test font contains glyphs M, N, O, P which scale according to the `wdth`, `slnt`, `ital`, and `wght` registered axes respectively. Glyphs M, N, O have zero advance width. When they are combined with the last, the P glyph, which has a width of 2000 FUnits, they form a full "test grapheme". The glyphs M, N, O, P line up vertically to form something resembling a bar chart of the applied axis parameters. For example, when the `wdth` design space coordinate is set to 100, the M bar glyph is 200 FUnits wide, when it is set to 500, the M bar glyph is 1000 FUnits wide.
+
+### Reference Glyphs
+
+The **Variable Test Axis Matching** font contains reference glyphs 0-9 to match different stops in the design coordinates space of the `wdth` axis, from 0 matching 200 FUnits to 9 matching 2000 FUnits. Analogously, glyphs p, q, w, e, r, t, y, u (the row between the numbers on a QWERTY keyboard) line up to match the N glyph at various stops for `slnt`. Glyphs ;, a, s, d, e, f, g, h, j, k, l match the O glyph for `ital`, and finally /, z, x, c, v, b, n, m match the P glyph for `wdth`.
+
+
+### Building reference tests
+
+Using the **Variable Test Axis Matching** font, [reference tests](http://web-platform-tests.org/writing-tests/reftests.html) in this directory are created as follows:
+
+ 1. Define `@font-face`s with range expressions, which trigger variation axes to be applied to the variable font.
+ 2. Use CSS style definitions to request font faces from the set of declared `@font-face`s and use blocks of the glyph sequence MNOP.
+ 3. To avoid flakiness, add reftest-wait to the html root element and use JS to remove it once font loading is complete.
+ 4. When the test is run, a screenshot is generated from the resulting output rendering.
+ 5. Define a reference rendering in a *-ref.html file, using only the non-variable reference glyphs q-p, a-;, z-/.
+ 6. When the test is run, a screenshot for the reference rendering is generated.
+ 7. For the test to pass the screenshot from 4. using OpenType Variations is compared to the reference screenshot from 6. (which is no using OpenType variations).
+
+## Font Glyphs Reference
+
+The following table explains the relationship between the M, N, O, P variation axis controlled glyphs and the non-scaled glyphs used as references.
+
+| Bar Length in FUnits | 200 | 400 | 600 | 800 | 1000 | 1200 | 1400 | 1600 | 1800
+| :---: | :---: |:---: |:---: |:---: |:---: |:---: |:---: |:---: |:---: |
+| Glyph **N**, Style, `slnt` | -90.00% | -67.50% | -45.00% | -20.00% | 0.00% | 20.00% | 45.00% | 67.50% | 90.00%
+| Glyph **M**, Stretch Axis `wdth` | 50% | 62.50% | 75% | 87.50% | 100% | 112.50% | 125% | 150% | 200%
+| Glyph **O**, Style, `ital` | 0 | 0.125 | 0.25 | 0.375 | 0.5 | 0.625 | 0.75 | 0.875 | 1
+| Glyph **P**, Weight, `wght` | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900
+| **Ref Glyphs for:** | | | | | | | | |
+| **M** | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8
+| **N** | p | q | w | e | r | t | y | u | i
+| **O** | ; | a | s | d | f | g | h | j | k
+| **P** | / | z | x | c | v | b | n | m | ,
diff --git a/tests/wpt/web-platform-tests/css-fonts/matching/fixed-stretch-style-over-weight-ref.html b/tests/wpt/web-platform-tests/css-fonts/matching/fixed-stretch-style-over-weight-ref.html
new file mode 100644
index 00000000000..ccbd4efaee5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/matching/fixed-stretch-style-over-weight-ref.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<style>
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ }
+
+ body {
+ font-family: variable_axes, sans-serif;
+ font-size: 80px;
+ }
+</style>
+<span>4q;n</span>
+ <span>4q;n</span>
+ <span>4w;n</span>
+ <span>4w;n</span>
+ <span>4y;x</span>
+ <span>4y;x</span>
+ <span>4y;x</span>
+ <span>4u;x</span>
+ <span>4u;x</span>
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/matching/fixed-stretch-style-over-weight.html b/tests/wpt/web-platform-tests/css-fonts/matching/fixed-stretch-style-over-weight.html
new file mode 100644
index 00000000000..8b177618a7c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/matching/fixed-stretch-style-over-weight.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="stylesheet" href="font-matching.css">
+<!-- Tests CSS Fonts Level 4, section 5.2. font matching algorithm. Precedence
+ of properties (stretch over style, style over weight) and style over weight
+ priority. -->
+<style>
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ font-stretch: 100%;
+ font-style: oblique -67.5deg -45deg;
+ font-weight: 700 800;
+ }
+
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ font-stretch: 100%;
+ font-style: oblique 45deg 67.5deg;
+ font-weight: 200 300;
+ }
+</style>
+<link rel="match" href="fixed-stretch-style-over-weight-ref.html">
+<span id="stretch_style_weight_1">MNOP</span>
+ <span id="stretch_style_weight_2">MNOP</span>
+ <span id="stretch_style_weight_3">MNOP</span>
+ <span id="stretch_style_weight_4">MNOP</span>
+ <span id="stretch_style_weight_5">MNOP</span>
+ <span id="stretch_style_weight_6">MNOP</span>
+ <span id="stretch_style_weight_7">MNOP</span>
+ <span id="stretch_style_weight_8">MNOP</span>
+ <span id="stretch_style_weight_9">MNOP</span>
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/matching/font-matching.css b/tests/wpt/web-platform-tests/css-fonts/matching/font-matching.css
new file mode 100644
index 00000000000..19825008757
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/matching/font-matching.css
@@ -0,0 +1,59 @@
+body {
+ font-family: variable_axes, sans-serif;
+ font-size: 80px;
+}
+
+#stretch_style_weight_1 {
+ font-stretch: 50%;
+ font-style: oblique -90deg;
+ font-weight: 100;
+}
+
+#stretch_style_weight_2 {
+ font-stretch: 62.50%;
+ font-style: oblique -67.5deg;
+ font-weight: 200;
+}
+
+#stretch_style_weight_3 {
+ font-stretch: 75%;
+ font-style: oblique -45deg;
+ font-weight: 300;
+}
+
+#stretch_style_weight_4 {
+ font-stretch: 87.50%;
+ font-style: oblique -20deg;
+ font-weight: 400;
+}
+
+#stretch_style_weight_5 {
+ font-stretch: 100%;
+ font-style: oblique 0deg;
+ font-weight: 500;
+}
+
+#stretch_style_weight_6 {
+ font-stretch: 112.50%;
+ font-style: oblique 20deg;
+ font-weight: 600;
+}
+
+#stretch_style_weight_7 {
+ font-stretch: 125%;
+ font-style: oblique 45deg;
+ font-weight: 700;
+}
+
+#stretch_style_weight_8 {
+ font-stretch: 150%;
+ font-style: oblique 67.5deg;
+ font-weight: 800;
+}
+
+#stretch_style_weight_9 {
+ font-stretch: 200%;
+ font-style: oblique 90deg;
+ font-weight: 900;
+}
+
diff --git a/tests/wpt/web-platform-tests/css-fonts/matching/resources/variabletest_matching.ttf b/tests/wpt/web-platform-tests/css-fonts/matching/resources/variabletest_matching.ttf
new file mode 100644
index 00000000000..307af4926cb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/matching/resources/variabletest_matching.ttf
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css-fonts/matching/stretch-distance-over-weight-distance-ref.html b/tests/wpt/web-platform-tests/css-fonts/matching/stretch-distance-over-weight-distance-ref.html
new file mode 100644
index 00000000000..3e6edda0da8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/matching/stretch-distance-over-weight-distance-ref.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<style>
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ }
+
+ body {
+ font-family: variable_axes, sans-serif;
+ font-size: 80px;
+ }
+</style>
+<span>1y;n</span>
+ <span>1y;n</span>
+ <span>2y;n</span>
+ <span>2y;n</span>
+ <span>2y;n</span>
+ <span>6w;x</span>
+ <span>6w;x</span>
+ <span>7w;x</span>
+ <span>7w;x</span>
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/matching/stretch-distance-over-weight-distance.html b/tests/wpt/web-platform-tests/css-fonts/matching/stretch-distance-over-weight-distance.html
new file mode 100644
index 00000000000..770efa99bae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/matching/stretch-distance-over-weight-distance.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="stylesheet" href="font-matching.css">
+<!-- Tests CSS Fonts Level 4, section 5.2. font matching algorithm. Precedence
+ of properties (stretch over style, style over weight) and distance of stretch . -->
+<style>
+ /* Matches 2 & 3 in stretch, but style and weight at the other end of the
+ spectrum, choosen for 1-5. */
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ font-stretch: 62.5% 75%;
+ font-style: oblique 45deg 67.5deg;
+ font-weight: 700 800;
+ }
+
+ /* Same stretch as above, and better weight match for 2 & 3, but must not
+ get choosen since worse style distance. */
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ font-stretch: 62.5% 75%;
+ font-style: oblique 90deg;
+ font-weight: 200 300;
+ }
+
+ /* Matches 7 & 8 in stretch, but style and weight at the opposite end of the
+ spectrum, choosen for 6-9. */
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ font-stretch: 125% 150%;
+ font-style: oblique -67.5deg -45deg;
+ font-weight: 200 300;
+ }
+
+
+ /* Same stretch as previous, and better weight match for 7 & 8 but most not
+ get choosen because of worse style distance. */
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ font-stretch: 125% 150%;
+ font-style: oblique -90deg;
+ font-weight: 700 800;
+ }
+</style>
+<link rel="match" href="stretch-distance-over-weight-distance-ref.html">
+<span id="stretch_style_weight_1">MNOP</span>
+ <span id="stretch_style_weight_2">MNOP</span>
+ <span id="stretch_style_weight_3">MNOP</span>
+ <span id="stretch_style_weight_4">MNOP</span>
+ <span id="stretch_style_weight_5">MNOP</span>
+ <span id="stretch_style_weight_6">MNOP</span>
+ <span id="stretch_style_weight_7">MNOP</span>
+ <span id="stretch_style_weight_8">MNOP</span>
+ <span id="stretch_style_weight_9">MNOP</span>
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/matching/style-ranges-over-weight-direction-ref.html b/tests/wpt/web-platform-tests/css-fonts/matching/style-ranges-over-weight-direction-ref.html
new file mode 100644
index 00000000000..d1b235c77f1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/matching/style-ranges-over-weight-direction-ref.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<style>
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ }
+
+ body {
+ font-family: variable_axes, sans-serif;
+ font-size: 80px;
+ }
+</style>
+<span>1p;c</span>
+ <span>1p;c</span>
+ <span>2p;c</span>
+ <span>2e;x</span>
+ <span>2e;x</span>
+ <span>6t;n</span>
+ <span>6i;v</span>
+ <span>7i;v</span>
+ <span>7i;v</span>
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/matching/style-ranges-over-weight-direction.html b/tests/wpt/web-platform-tests/css-fonts/matching/style-ranges-over-weight-direction.html
new file mode 100644
index 00000000000..5cb21495ac5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/matching/style-ranges-over-weight-direction.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="stylesheet" href="font-matching.css">
+<!-- Tests CSS Fonts Level 4, section 5.2. font matching algorithm. Precedence
+ of properties (stretch over style, style over weight) and search
+ direction for style. -->
+<style>
+ /* Matches, 2 & 3 in stretch, has wrong style, but in the right search
+ direction, so weight 400 gets chosen for 1-3. */
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ font-stretch: 62.5% 75%;
+ font-style: oblique -90deg;
+ font-weight: 400;
+ }
+
+ /* Matches 2 & 3 in stretch and weight but has wrong style and in the wrong
+ search direction, chosen for 4 and 5. */
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ font-stretch: 62.5% 75%;
+ font-style: oblique -20deg;
+ font-weight: 200 300;
+ }
+
+
+ /* Matches 7 & 8 in stretch, has wrong style, but in the right search
+ direction from 7 and above, so weight 600 gets chosen for 7-9. */
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ font-stretch: 125% 150%;
+ font-style: oblique 90deg;
+ font-weight: 500;
+ }
+
+
+ /* Matches 7 & 8 in stretch and weight, but has wrong style and in the wrong
+ search direction for 7 and above, gets chosen for 6. */
+ @font-face {
+ font-family: variable_axes;
+ src: url("resources/variabletest_matching.ttf");
+ font-stretch: 125% 150%;
+ font-style: oblique 20deg;
+ font-weight: 700 800;
+ }
+</style>
+<link rel="match" href="style-ranges-over-weight-direction-ref.html">
+<span id="stretch_style_weight_1">MNOP</span>
+ <span id="stretch_style_weight_2">MNOP</span>
+ <span id="stretch_style_weight_3">MNOP</span>
+ <span id="stretch_style_weight_4">MNOP</span>
+ <span id="stretch_style_weight_5">MNOP</span>
+ <span id="stretch_style_weight_6">MNOP</span>
+ <span id="stretch_style_weight_7">MNOP</span>
+ <span id="stretch_style_weight_8">MNOP</span>
+ <span id="stretch_style_weight_9">MNOP</span>
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/variations/OWNERS b/tests/wpt/web-platform-tests/css-fonts/variations/OWNERS
new file mode 100644
index 00000000000..c61158582e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/variations/OWNERS
@@ -0,0 +1,4 @@
+@drott
+@fantasai
+@litherum
+@nattokirai
diff --git a/tests/wpt/web-platform-tests/css-fonts/variations/font-parse-numeric-stretch-style-weight.html b/tests/wpt/web-platform-tests/css-fonts/variations/font-parse-numeric-stretch-style-weight.html
new file mode 100644
index 00000000000..5152424a71d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/variations/font-parse-numeric-stretch-style-weight.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+
+</script>
+</head>
+<body>
+<script>
+setup({explicit_done : true});
+
+var styleValidTests = {
+ 'weight': [
+ 'bold',
+ '700',
+ '900',
+ '850',
+ '850.3',
+ 'calc(100 + 300)',
+ 'calc(0.2 + 205.5)',
+ ],
+ 'stretch': ['51%', '199%', 'calc(10% + 20%)'],
+ 'style' : [ 'normal', 'italic', 'oblique', 'oblique 50deg', 'oblique -90deg', 'oblique 90deg',
+ 'oblique calc(30deg + 20deg)' ]
+};
+
+var styleInvalidTests = {
+ 'weight': ['100 400', 'calc(0 - 100)', 'calc(200 + 801)'],
+ 'stretch': ['100% 110%', '0%', '100% 150%', 'calc(1 + 10%)'],
+ 'style' : [ 'normal 10deg', 'italic 10deg', 'oblique -91deg', 'oblique 91deg', 'oblique calc(90deg + 20deg)']
+};
+
+function testParseStyle() {
+ for (validStyleTestCategory of Object.keys(styleValidTests)) {
+ for (validStyleTest of styleValidTests[validStyleTestCategory]) {
+ test(
+ function() {
+ assert_true(
+ CSS.supports('font-' + validStyleTestCategory, validStyleTest));
+ },
+ 'Valid value ' + validStyleTest + ' for font property ' +
+ validStyleTestCategory + ' used for styling.')
+ }
+ }
+ for (invalidStyleTestCategory of Object.keys(styleInvalidTests)) {
+ for (invalidStyleTest of styleInvalidTests[invalidStyleTestCategory]) {
+ test(
+ function() {
+ assert_false(CSS.supports(
+ 'font-' + invalidStyleTestCategory, invalidStyleTest));
+ },
+ 'Invalid value ' + invalidStyleTest + ' for font property ' +
+ invalidStyleTestCategory + ' used for styling.')
+ }
+ }
+}
+
+var faceTests = {
+ 'weight': [
+ ['100', '100'], ['700', '700'], ['900', '900'], ['bold', 'bold'],
+ ['normal', 'normal'], ['100 400', '100 400'], ['100 101.5', '100 101.5'],
+ ['999.8 999.9', '999.8 999.9']
+ ],
+ 'stretch': [
+ ['100%', '100%'],
+ ['110%', '110%'],
+ ['111.5%', '111.5%'],
+ [ "50% 200%", "50% 200%" ],
+ [ "0.1% 1%", "0.1% 1%" ],
+ [ "900% 901%", "900% 901%" ],
+ ['ultra-condensed', 'ultra-condensed'],
+ ['ultra-expanded', 'ultra-expanded'],
+ ],
+ 'style' : [
+ [ "normal", "normal" ],
+ [ "italic", "italic" ],
+ [ "oblique", "oblique" ],
+ [ "oblique 10deg", "oblique 10deg" ],
+ [ "oblique 10deg 20deg", "oblique 10deg 20deg" ]
+ ]
+};
+
+var faceInvalidTests = {
+ 'weight': [
+ '0',
+ '0.9',
+ '-100 200',
+ '100 -200',
+ '500 400',
+ '100 1001',
+ '1001',
+ '1000.5',
+ '100 200 300',
+ 'a',
+ 'a b c',
+ ],
+ 'stretch': [
+ '-0.5%', '-1%', '0%', 'calc(0% - 10%)', '60% 70% 80%', 'a%', 'a b c', '0.1',
+ '-60% 80%', 'ultra-expannnned', '50% 0'
+ ],
+ 'style' : [ 'oblique 100deg', 'oblique italic', 'oblique -91deg', 'oblique 0',
+ 'oblique 10', 'iiitalic', '90deg', '11', 'italic 90deg' ]
+};
+
+function testParseFace() {
+ for (var theProperty of Object.keys(faceTests)) {
+ for (var faceTest of faceTests[theProperty]) {
+ test(
+ () => {
+ var fontFace = new FontFace('testfont', 'url()');
+ assert_equals(fontFace[theProperty], 'normal');
+ fontFace[theProperty] = faceTest[0];
+ assert_equals(fontFace[theProperty], faceTest[1]);
+ },
+ 'Valid value ' + faceTest[0] + ' matches ' + faceTest[1] + ' for ' +
+ theProperty + ' in @font-face.');
+ }
+ }
+
+ for (var theProperty of Object.keys(faceInvalidTests)) {
+ for (var faceTest of faceInvalidTests[theProperty]) {
+ test(
+ () => {
+ var fontFace = new FontFace('testfont', 'url()');
+ assert_throws('SyntaxError', () => {
+ fontFace[theProperty] = faceTest;
+ }, 'Value must not be accepted as weight value.');
+ },
+ 'Value ' + faceTest + ' must not be accepted as ' + theProperty +
+ ' in @font-face.')
+ }
+ }
+}
+
+window.addEventListener('load', function() {
+ testParseStyle();
+ testParseFace();
+ done();
+});
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/variations/resources/variabletest_box.ttf b/tests/wpt/web-platform-tests/css-fonts/variations/resources/variabletest_box.ttf
new file mode 100644
index 00000000000..53b5b24233d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/variations/resources/variabletest_box.ttf
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css-fonts/variations/variable-box-font-ref.html b/tests/wpt/web-platform-tests/css-fonts/variations/variable-box-font-ref.html
new file mode 100644
index 00000000000..142b0aa46b6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/variations/variable-box-font-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<style>
+ @font-face {
+ font-family: variabletest_box;
+ src: url(resources/variabletest_box.ttf);
+ }
+
+ body {
+ font-family: variabletest_box, sans-serif;
+ font-size: 200px;
+ }
+</style>
+▄ ▀
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+
diff --git a/tests/wpt/web-platform-tests/css-fonts/variations/variable-box-font.html b/tests/wpt/web-platform-tests/css-fonts/variations/variable-box-font.html
new file mode 100644
index 00000000000..a9023fabe5a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/variations/variable-box-font.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="variable-box-font-ref.html">
+<meta charset="utf-8">
+<style>
+ @font-face {
+ font-family: variabletest_box;
+ src: url(resources/variabletest_box.ttf);
+ }
+
+ body {
+ font-family: variabletest_box,
+ sans-serif;
+ font-size: 200px;
+ }
+
+ .a_up {
+ font-variation-settings: "UPWD" 350;
+ }
+</style>
+<!-- The variabletest_box font has an A glyph that looks like a lower half box,
+ with deltas on the 'UPWD' variation axis that allow shifting the box up. At
+ 350, the box is at the top. The font also has two glyphs for UPPER HALF BLOCK
+ and LOWER HALF BLOCK, which look identical to the respective variations of A.
+-->
+A <span class="a_up">A</span>
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/variations/variable-gpos-m2b-ref.html b/tests/wpt/web-platform-tests/css-fonts/variations/variable-gpos-m2b-ref.html
new file mode 100644
index 00000000000..c6b80b1b116
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/variations/variable-gpos-m2b-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<style>
+ @font-face {
+ font-family: variabletest_box;
+ src: url(resources/variabletest_box.ttf);
+ }
+
+ body {
+ font-family: variabletest_box, sans-serif;
+ sans-serif;
+ font-size: 100px;
+ }
+</style>
+M&#x033B; N&#x033B; O&#x033B;
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/variations/variable-gpos-m2b.html b/tests/wpt/web-platform-tests/css-fonts/variations/variable-gpos-m2b.html
new file mode 100644
index 00000000000..9b976e1892a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/variations/variable-gpos-m2b.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="variable-gpos-m2b-ref.html">
+<meta charset="utf-8">
+<style>
+ @font-face {
+ font-family: variabletest_box;
+ src: url(resources/variabletest_box.ttf);
+ }
+
+ body {
+ font-family: variabletest_box, sans-serif;
+ sans-serif;
+ font-size: 100px;
+ }
+
+ .gpos_m2b_left {
+ font-variation-settings: "VM2B" 0;
+ }
+
+ .gpos_m2b_middle {
+ font-variation-settings: "VM2B" 500;
+ }
+
+ .gpos_m2b_right {
+ font-variation-settings: "VM2B" 1000;
+ }
+</style>
+<!-- The variabletest_box font has an M glyph saying "m2b pos" that combines
+ with the combining box below. And it has a glyph for combining box below
+ whose mark anchor can be shifted horizontally using the VM2B axis. The font
+ also has N and O glyphs which have fixed shifted base anchor points at the
+ middle and at the right position. In this ref test we check whether
+ applying the VM2B axis works as expected and shifts the mark anchor point
+ left so that the combining mark is placed correctly at the middle and at
+ the right position. The VM2B rendering must be identical to the
+ conventional rendering with the fixed base anchor points. -->
+<span class="gpos_m2b_left">M&#x033B;</span>
+<span class="gpos_m2b_middle">M&#x033B;</span>
+<span class="gpos_m2b_right">M&#x033B;</span>
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/variations/variable-gsub-ref.html b/tests/wpt/web-platform-tests/css-fonts/variations/variable-gsub-ref.html
new file mode 100644
index 00000000000..3b1f7f435c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/variations/variable-gsub-ref.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<style>
+ @font-face {
+ font-family: variabletest_box;
+ src: url(resources/variabletest_box.ttf);
+ }
+
+ body {
+ font-family: variabletest_box, sans-serif;
+ sans-serif;
+ font-size: 100px;
+ }
+</style>
+r R
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-fonts/variations/variable-gsub.html b/tests/wpt/web-platform-tests/css-fonts/variations/variable-gsub.html
new file mode 100644
index 00000000000..ed432f65ebf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-fonts/variations/variable-gsub.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="variable-gsub-ref.html">
+<meta charset="utf-8">
+<style>
+ @font-face {
+ font-family: variabletest_box;
+ src: url(resources/variabletest_box.ttf);
+ }
+
+ body {
+ font-family: variabletest_box, sans-serif;
+ sans-serif;
+ font-size: 100px;
+ }
+
+ .rvrn_replaced {
+ font-variation-settings: "FVTT" 10;
+ }
+</style>
+<!-- The variabletest_box font has an r glyph that says "rvrn base" and has
+ this as a name as well. And it has a glyph for R that says "rvrn subst"
+ where rvrn stands for the required Required Variation Alternates
+ feature. The font has an 'FVTT' axis ranging from 0 to 10, where it uses
+ a single substitution glyph lookup table for axis values starting from
+ 5, which then replaces the rvrn_base glyph with the rvrn_subst
+ glyph. So in this reftest the substituted glyph for lowercase r
+ should visually match the uppercase R glyph, both show "rvrn subst". -->
+r <span class="rvrn_replaced">r</span>
+<script>
+ document.fonts.ready.then(
+ () => { document.documentElement.classList.remove("reftest-wait"); });
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/background-image-alpha.html b/tests/wpt/web-platform-tests/css-paint-api/background-image-alpha.html
index ac69aa0749c..de8a0d7c7fb 100644
--- a/tests/wpt/web-platform-tests/css-paint-api/background-image-alpha.html
+++ b/tests/wpt/web-platform-tests/css-paint-api/background-image-alpha.html
@@ -30,7 +30,7 @@
<script id="code" type="text/worklet">
registerPaint('opaque', class {
- static get alpha() { return false; }
+ static get contextOptions() { return {alpha: false}; }
paint(ctx, geom) {
ctx.strokeStyle = 'blue';
ctx.lineWidth = 4;
@@ -39,7 +39,7 @@ registerPaint('opaque', class {
});
registerPaint('nonOpaque', class {
- static get alpha() { return true; }
+ static get contextOptions() { return {alpha: true}; }
paint(ctx, geom) {
ctx.strokeStyle = 'blue';
ctx.lineWidth = 4;
diff --git a/tests/wpt/web-platform-tests/css-paint-api/background-image-tiled-ref.html b/tests/wpt/web-platform-tests/css-paint-api/background-image-tiled-ref.html
index a0151d84cba..fe12f163827 100644
--- a/tests/wpt/web-platform-tests/css-paint-api/background-image-tiled-ref.html
+++ b/tests/wpt/web-platform-tests/css-paint-api/background-image-tiled-ref.html
@@ -5,12 +5,9 @@
<canvas id ="two" width="100" height="100"></canvas>
<script>
function drawCircle(ctx, geom) {
- var x = geom.width / 2;
- var y = geom.height / 2;
-
ctx.fillStyle = 'green';
ctx.beginPath();
- ctx.ellipse(x, y, x - 1, y - 1, 0, 0, 2 * Math.PI);
+ ctx.rect(0, 0, geom.width, geom.height);
ctx.fill();
}
diff --git a/tests/wpt/web-platform-tests/css-paint-api/background-image-tiled.html b/tests/wpt/web-platform-tests/css-paint-api/background-image-tiled.html
index 95d8c123007..0497acf2230 100644
--- a/tests/wpt/web-platform-tests/css-paint-api/background-image-tiled.html
+++ b/tests/wpt/web-platform-tests/css-paint-api/background-image-tiled.html
@@ -29,12 +29,9 @@
<script id="code" type="text/worklet">
registerPaint('ellipse', class {
paint(ctx, geom) {
- var x = geom.width / 2;
- var y = geom.height / 2;
-
ctx.fillStyle = 'green';
ctx.beginPath();
- ctx.ellipse(x, y, x - 1, y - 1, 0, 0, 2 * Math.PI);
+ ctx.rect(0, 0, geom.width, geom.height);
ctx.fill();
}
});
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-001-ref.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-001-ref.html
new file mode 100644
index 00000000000..83edae100ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-001-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<style>
+html, body { margin: 0; padding: 0; }
+</style>
+<body>
+<canvas id ="canvas" width="100" height="100"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+context.strokeStyle = 'green';
+context.lineWidth = 4;
+context.strokeRect(0, 0, 100, 100);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-001.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-001.html
new file mode 100644
index 00000000000..d1207e0bdc4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-001.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="geometry-background-image-001-ref.html">
+<style>
+html, body { margin: 0; padding: 0; }
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ ctx.strokeStyle = 'green';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-002-ref.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-002-ref.html
new file mode 100644
index 00000000000..ab964dbf8d7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-002-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<style>
+html, body { margin: 0; padding: 0; }
+</style>
+<body>
+<canvas id ="canvas" width="200" height="200"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+context.strokeStyle = 'green';
+context.lineWidth = 4;
+context.strokeRect(0, 0, 200, 200);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-002.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-002.html
new file mode 100644
index 00000000000..47455ba232c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-002.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="geometry-background-image-002-ref.html">
+<style>
+html, body { margin: 0; padding: 0; }
+.container {
+ width: 200px;
+ height: 200px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ ctx.strokeStyle = 'green';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-001-ref.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-001-ref.html
new file mode 100644
index 00000000000..ce7988ffd0d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-001-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<style>
+html, body { margin: 0; padding: 0; }
+</style>
+<body>
+<canvas id ="canvas" width="100" height="50"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+context.fillStyle = 'green';
+context.fillRect(0, 0, 100, 50);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-001.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-001.html
new file mode 100644
index 00000000000..5cf8eb79ed5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-001.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="geometry-background-image-tiled-001-ref.html">
+<style>
+html, body { margin: 0; padding: 0; }
+.container {
+ width: 100px;
+ height: 100px;
+ background: paint(geometry) top left/50% 50% repeat-x;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ ctx.fillStyle = 'green';
+ ctx.beginPath();
+ ctx.rect(0, 0, geom.width, geom.height);
+ ctx.fill();
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-002-ref.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-002-ref.html
new file mode 100644
index 00000000000..f3c65e6776d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-002-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<style>
+html, body { margin: 0; padding: 0; }
+</style>
+<body>
+<canvas id ="canvas" width="50" height="20" style="position:relative; top:40px; left:50px"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+context.strokeStyle = 'green';
+context.lineWidth = 4;
+context.strokeRect(0, 0, 50, 20);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-002.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-002.html
new file mode 100644
index 00000000000..491abd117da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-002.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="geometry-background-image-tiled-002-ref.html">
+<style>
+html, body { margin: 0; padding: 0; }
+.container {
+ width: 100px;
+ height: 100px;
+ background: paint(geometry) center right/50% 20% no-repeat;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ ctx.strokeStyle = 'green';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-003-ref.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-003-ref.html
new file mode 100644
index 00000000000..8e1eb027658
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-003-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<style>
+html, body { margin: 0; padding: 0; }
+</style>
+<body>
+<canvas id ="canvas" width="60" height="80" style="position:relative; top:10px; left:20px"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+context.strokeStyle = 'green';
+context.lineWidth = 4;
+context.strokeRect(0, 0, 60, 80);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-003.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-003.html
new file mode 100644
index 00000000000..9a29c30ffbd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-background-image-tiled-003.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="geometry-background-image-tiled-003-ref.html">
+<style>
+html, body { margin: 0; padding: 0; }
+.container {
+ width: 100px;
+ height: 100px;
+ background: paint(geometry) center center/60px 80px no-repeat;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ ctx.strokeStyle = 'green';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-001-ref.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-001-ref.html
new file mode 100644
index 00000000000..bb0aa409374
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-001-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<style>
+html, body { margin: 0; padding: 0; }
+</style>
+<body>
+<canvas id ="canvas" width="200" height="200" style="position:relative; top:10px; left:10px"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+// The test geometry-border-image1.html has a paint canvas with width=200 and
+// height=200, as well as a border-width=10 and border-image-slice: fill. All of
+// them combined meaning that it draws to the (200+10*2)*(200+10*2) area, but
+// stretch it to fit into the 200*200 area.
+// So in this ref test, we create a 200*200 canvas. We draw to a 220*220 area
+// and scale it to fit the 200*200 canvas.
+context.scale(200/220, 200/220);
+context.strokeStyle = 'green';
+context.lineWidth = 4;
+context.strokeRect(0, 0, 220, 220);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-001.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-001.html
new file mode 100644
index 00000000000..54249d34808
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-001.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="geometry-border-image-001-ref.html">
+<style>
+html, body { margin: 0; padding: 0; }
+.container {
+ width: 200px;
+ height: 200px;
+}
+
+#canvas-geometry {
+ border: solid 0;
+ border-image: paint(geometry);
+ border-image-slice: 0 fill;
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (geom.width == 220 && geom.height == 220)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ document.getElementById('canvas-geometry').style.borderWidth = '10px';
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-002-ref.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-002-ref.html
new file mode 100644
index 00000000000..0eb84ec0400
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-002-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<style>
+html, body { margin: 0; padding: 0; }
+</style>
+<body>
+<canvas id ="canvas" width="90" height="90" style="position:relative; left:-20px; top:-20px"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+context.strokeStyle = 'green';
+context.lineWidth = 4;
+context.strokeRect(0, 0, 90, 90);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-002.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-002.html
new file mode 100644
index 00000000000..4759886d073
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-002.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="geometry-border-image-002-ref.html">
+<style>
+html, body { margin: 0; padding: 0; }
+.container {
+ width: 50px;
+ height: 50px;
+}
+
+#canvas-geometry {
+ border: solid 0;
+ border-image: paint(geometry);
+ border-image-slice: 0 fill;
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (geom.width == 90 && geom.height == 90)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ document.getElementById('canvas-geometry').style.borderImageOutset = '20px';
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-003-ref.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-003-ref.html
new file mode 100644
index 00000000000..b17c9ffce2a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-003-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+<style>
+html, body { margin: 0; padding: 0; }
+</style>
+<body>
+<canvas id ="canvas" width="80" height="120" style="position:relative; left:-10px; top:-10px"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+context.strokeStyle = 'green';
+context.lineWidth = 4;
+context.strokeRect(0, 0, 80, 120);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-003.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-003.html
new file mode 100644
index 00000000000..1ce6ac98615
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-003.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="geometry-border-image-003-ref.html">
+<style>
+html, body { margin: 0; padding: 0; }
+.container {
+ width: 60px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ border: solid 0;
+ border-image: paint(geometry);
+ border-image-slice: 0 fill;
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (geom.width == 80 && geom.height == 120)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ document.getElementById('canvas-geometry').style.borderImageOutset = '10px';
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-004-ref.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-004-ref.html
new file mode 100644
index 00000000000..c32fdd8f0ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-004-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<style>
+html, body { margin: 0; padding: 0; }
+</style>
+<body>
+<canvas id ="canvas" width="120" height="120"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+// The test geometry-border-image4.html has a 100*100 paint canvas, it specifies
+// border-width=10 and border-image-outset=10, which means that it is drawing to
+// a 140*140 area. However, because the test has "border-image-slice: 0 fill",
+// together with the border-width=10, makes it draw to a 120*120 area.
+// In this ref html, we draw to a 140*140 area, but scale it to fit the 120*120
+// canvas.
+context.scale(120/140, 120/140);
+context.strokeStyle = 'green';
+context.lineWidth = 4;
+context.strokeRect(0, 0, 140, 140);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-004.html b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-004.html
new file mode 100644
index 00000000000..b15b66d9b90
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/geometry-border-image-004.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="geometry-border-image-004-ref.html">
+<style>
+html, body { margin: 0; padding: 0; }
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ border: solid 0;
+ border-image: paint(geometry);
+ border-image-slice: 0 fill;
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (geom.width == 140 && geom.height == 140)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ document.getElementById('canvas-geometry').style.borderWidth = '10px';
+ document.getElementById('canvas-geometry').style.borderImageOutset = '10px';
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/hidpi/device-pixel-ratio-ref.html b/tests/wpt/web-platform-tests/css-paint-api/hidpi/device-pixel-ratio-ref.html
new file mode 100644
index 00000000000..205cf8963bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/hidpi/device-pixel-ratio-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<style>
+html, body { margin: 0; padding: 0; }
+canvas {width: 150px; height: 150px; }
+</style>
+<body>
+<p>This test ensures that the PaintWorkletGlobalScope.devicePixelRatio returns
+the correct value, which should be identical as window.devicePixelRatio. To
+manually test, open both this file and "device-pixel-ratio-ref.html" with a
+browser, and you should see two idential green rectangles.</p>
+<canvas id ="canvas" width="100" height="100"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+canvas.width = 150 * window.devicePixelRatio;
+canvas.height = 150 * window.devicePixelRatio;
+var context = canvas.getContext("2d");
+context.fillStyle = 'green';
+var draw_width = Math.floor(canvas.width / window.devicePixelRatio);
+var draw_height = Math.floor(canvas.height / window.devicePixelRatio);
+context.fillRect(0, 0, draw_width, draw_height);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/hidpi/device-pixel-ratio.html b/tests/wpt/web-platform-tests/css-paint-api/hidpi/device-pixel-ratio.html
new file mode 100644
index 00000000000..fb62c23dc5f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/hidpi/device-pixel-ratio.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="device-pixel-ratio-ref.html">
+<style>
+html, body { margin: 0; padding: 0; }
+.container {
+ width: 150px;
+ height: 150px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<p>This test ensures that the PaintWorkletGlobalScope.devicePixelRatio returns
+the correct value, which should be identical as window.devicePixelRatio. To
+manually test, open both this file and "device-pixel-ratio-ref.html" with a
+browser, and you should see two idential green rectangles.</p>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ ctx.fillStyle = 'green';
+ var draw_width = Math.floor(geom.width / devicePixelRatio);
+ var draw_height = Math.floor(geom.height / devicePixelRatio);
+ ctx.fillRect(0, 0, draw_width, draw_height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/paint-arguments.html b/tests/wpt/web-platform-tests/css-paint-api/paint-arguments.html
index ce2eec3e3bf..f4ae452be5e 100644
--- a/tests/wpt/web-platform-tests/css-paint-api/paint-arguments.html
+++ b/tests/wpt/web-platform-tests/css-paint-api/paint-arguments.html
@@ -31,7 +31,7 @@
<script id="code" type="text/worklet">
registerPaint('box', class {
- static get alpha() { return true; }
+ static get contextOptions() { return {alpha: true}; }
static get inputArguments() { return ['<color>']; }
paint(ctx, geom, properties, args) {
ctx.strokeStyle = args[0].toString();
diff --git a/tests/wpt/web-platform-tests/css-paint-api/paint-function-arguments.html b/tests/wpt/web-platform-tests/css-paint-api/paint-function-arguments.html
index 6bae7ffe25b..d49f3f2b3d9 100644
--- a/tests/wpt/web-platform-tests/css-paint-api/paint-function-arguments.html
+++ b/tests/wpt/web-platform-tests/css-paint-api/paint-function-arguments.html
@@ -31,7 +31,7 @@
<script id="code" type="text/worklet">
registerPaint('box', class {
- static get alpha() { return true; }
+ static get contextOptions() { return {alpha: true}; }
static get inputArguments() { return ['<color>', '<length>']; }
paint(ctx, geom, properties, args) {
ctx.strokeStyle = args[0].toString();
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-001.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-001.html
new file mode 100644
index 00000000000..931a55a3fd5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-001.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo', class {
+ static get inputArguments() {
+ throw Error('failed!');
+ }
+ });
+} catch(ex) {
+ if (ex.name == 'Error' && ex.message == 'failed!')
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-002.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-002.html
new file mode 100644
index 00000000000..c07c0c0a5af
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-002.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo1', class {
+ static get inputArguments() {
+ return 'non sense stuff';
+ }
+ });
+} catch(ex) {
+ if (ex.name == "TypeError" && ex.message == "Failed to execute 'registerPaint' on 'PaintWorkletGlobalScope': The provided value cannot be converted to a sequence.")
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-003.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-003.html
new file mode 100644
index 00000000000..ff388deeab7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-003.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo2', class {
+ static get inputArguments() {
+ return ['<non-sense-type>'];
+ }
+ });
+} catch(ex) {
+ if (ex.name == "TypeError" && ex.message == "Failed to execute 'registerPaint' on 'PaintWorkletGlobalScope': Invalid argument types.")
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-004.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-004.html
new file mode 100644
index 00000000000..8d5b8d720a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-004.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo3', class {
+ static get inputArguments() {
+ return ['<length>'];
+ }
+ paint() { }
+ });
+ testsPassed = true;
+} catch(ex) {
+ testsPassed = false;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-005.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-005.html
new file mode 100644
index 00000000000..b726c22b92d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-005.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo', class { paint() { } });
+ registerPaint('foo', class { paint() { } });
+} catch(ex) {
+ if (ex.name == "NotSupportedError" && ex.message == "Failed to execute 'registerPaint' on 'PaintWorkletGlobalScope': A class with name:'foo' is already registered.")
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-006.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-006.html
new file mode 100644
index 00000000000..7d8504c4fb3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-006.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('', class { });
+} catch(ex) {
+ if (ex.name == 'TypeError' && ex.message == "Failed to execute 'registerPaint' on 'PaintWorkletGlobalScope': The empty string is not a valid name.")
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-007.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-007.html
new file mode 100644
index 00000000000..a59ac937706
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-007.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo3', class {
+ static get inputProperties() {
+ throw Error('failed!');
+ }
+ });
+} catch(ex) {
+ if (ex.name == 'Error' && ex.message == 'failed!')
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-008.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-008.html
new file mode 100644
index 00000000000..2d6df2319d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-008.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo4', class {
+ static get inputProperties() {
+ return 42;
+ }
+ });
+} catch(ex) {
+ if (ex.name == 'TypeError' && ex.message == "Failed to execute 'registerPaint' on 'PaintWorkletGlobalScope': The provided value cannot be converted to a sequence.")
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-009.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-009.html
new file mode 100644
index 00000000000..03c7c690154
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-009.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ var a = function() { };
+ a.prototype = undefined;
+ registerPaint('foo5', a);
+} catch(ex) {
+ if (ex.name == 'TypeError' && ex.message == "Failed to execute 'registerPaint' on 'PaintWorkletGlobalScope': The 'prototype' object on the class does not exist.")
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-010.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-010.html
new file mode 100644
index 00000000000..0bd676844c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-010.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ var b = function() { };
+ b.prototype = 42;
+ registerPaint('foo6', b);
+} catch(ex) {
+ if (ex.name == 'TypeError' && ex.message == "Failed to execute 'registerPaint' on 'PaintWorkletGlobalScope': The 'prototype' property on the class is not an object.")
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-011.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-011.html
new file mode 100644
index 00000000000..8945f7ea801
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-011.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo7', class { });
+} catch(ex) {
+ if (ex.name == 'TypeError' && ex.message == "Failed to execute 'registerPaint' on 'PaintWorkletGlobalScope': The 'paint' function on the prototype does not exist.")
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-012.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-012.html
new file mode 100644
index 00000000000..422b45ffff3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-012.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo8', class {
+ get paint() {
+ return 42;
+ }
+ });
+} catch(ex) {
+ if (ex.name == 'TypeError' && ex.message == "Failed to execute 'registerPaint' on 'PaintWorkletGlobalScope': The 'paint' property on the prototype is not a function.")
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-013.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-013.html
new file mode 100644
index 00000000000..cd628793481
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-013.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo9', class { paint() { } });
+ testsPassed = true;
+} catch(ex) {
+ testsPassed = false;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-014.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-014.html
new file mode 100644
index 00000000000..39aee6ad75e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-014.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ var c = function() { };
+ c.prototype.paint = function() { };
+ registerPaint('foo10', c);
+ testsPassed = true;
+} catch(ex) {
+ testsPassed = false;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-015.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-015.html
new file mode 100644
index 00000000000..c2e1844615c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-015.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo11', class {
+ static get inputProperties() {
+ return ['-webkit-border-radius'];
+ }
+ paint() { }
+ });
+ testsPassed = true;
+} catch(ex) {
+ testsPassed = false;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-016.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-016.html
new file mode 100644
index 00000000000..4bea1b43e23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-016.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo12', class {
+ static get contextOptions() {
+ return 42;
+ }
+ });
+} catch(ex) {
+ if (ex.name == "TypeError" && ex.message == "Failed to execute 'registerPaint' on 'PaintWorkletGlobalScope': cannot convert to dictionary.")
+ testsPassed = true;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-017.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-017.html
new file mode 100644
index 00000000000..38f9f43b94d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-017.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo13', class {
+ static get contextOptions() { return {alpha: true}; }
+ paint() { }
+ });
+ testsPassed = true;
+} catch(ex) {
+ testsPassed = false;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-018-ref.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-018-ref.html
new file mode 100644
index 00000000000..8222ab42fb3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-018-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<body>
+<p>The test result should show only one black rect border. It should not paint
+any content in the rect because registerPaint will be called twice and the
+inputArguments will return two different strings, that will throw an exception
+and paint won't be executed.</p>
+<canvas id ="canvas" width="100" height="100" style="border:1px solid black"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+context.clearRect(0, 0, 100, 100);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-018.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-018.html
new file mode 100644
index 00000000000..2cfac40bc2b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-018.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-018-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ border:1px solid black;
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<p>The test result should show only one black rect border. It should not paint
+any content in the rect because registerPaint will be called twice and the
+inputArguments will return two different strings, that will throw an exception
+and paint won't be executed.</p>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+function generateRandString(length) {
+ var text = "";
+ var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ for (var i = 0; i < length; i++)
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
+ return text;
+}
+
+try {
+ registerPaint('geometry', class {
+ static get inputArguments() {
+ // This test is testing the case where an exception should be thrown
+ // when two paint definitions with different properties are registered
+ // to the same paint worklet. In order to do that, we randomly generate
+ // the input properties here. We make the string length 100 to make sure
+ // that it is veryyyyyyyyyyyy unlikely that two strings will be the same
+ // when running this test.
+ var current_str = generateRandString(100);
+ return [current_str];
+ }
+ paint(ctx, geom) {
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+ });
+} catch(ex) {
+}
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-019.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-019.html
new file mode 100644
index 00000000000..76627fbe648
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-019.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo', class {
+ static get contextOptions() { return {alpha: 42}; }
+ paint() {}
+ });
+ testsPassed = true;
+} catch(ex) {
+ testsPassed = false;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-020.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-020.html
new file mode 100644
index 00000000000..b582555e30d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-020.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo', class {
+ paint() {}
+ });
+ testsPassed = true;
+} catch(ex) {
+ testsPassed = false;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-021.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-021.html
new file mode 100644
index 00000000000..666d4c485c2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-021.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo', class {
+ // Setting anything other than alpha should not throw exception, and
+ // the alpha value should fall back to default, which is true.
+ static get contextOptions() { return {bogus: true}; }
+ paint() {}
+ });
+ testsPassed = true;
+} catch(ex) {
+ testsPassed = false;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-022.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-022.html
new file mode 100644
index 00000000000..3c5d9f9b6bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-022.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+var testsPassed = false;
+try {
+ registerPaint('foo', class {
+ static get contextOptions() { return null; }
+ paint() {}
+ });
+ testsPassed = true;
+} catch(ex) {
+ testsPassed = false;
+}
+
+registerPaint('geometry', class {
+ paint(ctx, geom) {
+ if (testsPassed)
+ ctx.strokeStyle = 'green';
+ else
+ ctx.strokeStyle = 'red';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-ref.html b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-ref.html
new file mode 100644
index 00000000000..086bc7b27ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/parse-input-arguments-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<body>
+<canvas id ="canvas" width="100" height="100"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+context.strokeStyle = 'green';
+context.lineWidth = 4;
+context.strokeRect(0, 0, 100, 100);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/registered-properties-in-custom-paint.html b/tests/wpt/web-platform-tests/css-paint-api/registered-properties-in-custom-paint.html
new file mode 100644
index 00000000000..d77a33f0bc7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/registered-properties-in-custom-paint.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="parse-input-arguments-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+ --length: 10px;
+ --number: 10;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ static get inputProperties() {
+ return [
+ '--length',
+ '--length-initial',
+ '--number',
+ ];
+ }
+ paint(ctx, geom, styleMap) {
+ const properties = styleMap.getProperties().sort();
+ var serializedStrings = [];
+ for (let i = 0; i < properties.length; i++) {
+ const value = styleMap.get(properties[i]);
+ let serialized;
+ if (value)
+ serialized = properties[i].toString() + ': [' + value.constructor.name + '=' + value.toString() + ']';
+ else
+ serialized = properties[i].toString() + ': [null]';
+ serializedStrings.push(serialized);
+ }
+ ctx.strokeStyle = 'green';
+ if (serializedStrings[0] != "--length: [CSSUnitValue=10px]")
+ ctx.strokeStyle = 'red';
+ if (serializedStrings[1] != "--length-initial: [CSSUnitValue=20px]")
+ ctx.strokeStyle = 'blue';
+ if (serializedStrings[2] != "--number: [CSSStyleValue=10]")
+ ctx.strokeStyle = 'yellow';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ CSS.registerProperty({name: '--length', syntax: '<length>', initialValue: '0px'});
+ CSS.registerProperty({name: '--length-initial', syntax: '<length>', initialValue: '20px'});
+ CSS.registerProperty({name: '--number', syntax: '<number>', initialValue: '0'});
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/style-background-image-ref.html b/tests/wpt/web-platform-tests/css-paint-api/style-background-image-ref.html
new file mode 100644
index 00000000000..3fc9e6efcc9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/style-background-image-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<body>
+<canvas id ="canvas" width="100" height="100" style="border-radius: 2px"></canvas>
+<script>
+var canvas = document.getElementById('canvas');
+var context = canvas.getContext("2d");
+context.strokeStyle = 'green';
+context.lineWidth = 4;
+context.strokeRect(0, 0, 100, 100);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/style-background-image.html b/tests/wpt/web-platform-tests/css-paint-api/style-background-image.html
new file mode 100644
index 00000000000..716c28c1606
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/style-background-image.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="style-background-image-ref.html">
+<style>
+.container {
+ width: 100px;
+ height: 100px;
+ border-radius: 2px;
+ --foo: bar;
+}
+
+#canvas-geometry {
+ background-image: paint(geometry);
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body>
+<div id="canvas-geometry" class="container"></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ static get inputProperties() {
+ return [
+ '--bar',
+ '--foo',
+ 'align-items',
+ 'border-radius',
+ ];
+ }
+ paint(ctx, geom, styleMap) {
+ const properties = styleMap.getProperties().sort();
+ var serializedStrings = [];
+ for (let i = 0; i < properties.length; i++) {
+ const value = styleMap.get(properties[i]);
+ let serialized;
+ if (value)
+ serialized = properties[i].toString() + ': [' + value.constructor.name + '=' + value.toString() + ']';
+ else
+ serialized = properties[i].toString() + ': [null]';
+ serializedStrings.push(serialized);
+ }
+ ctx.strokeStyle = 'green';
+ if (serializedStrings[0] != "--bar: [null]")
+ ctx.strokeStyle = 'red';
+ if (serializedStrings[1] != "--foo: [CSSStyleValue= bar]")
+ ctx.strokeStyle = 'blue';
+ if (serializedStrings[2] != "align-items: [CSSKeywordValue=normal]")
+ ctx.strokeStyle = 'yellow';
+ if (serializedStrings[3] != "border-radius: [CSSStyleValue=2px]")
+ ctx.strokeStyle = 'cyan';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/style-before-pseudo-ref.html b/tests/wpt/web-platform-tests/css-paint-api/style-before-pseudo-ref.html
new file mode 100644
index 00000000000..9a666efe9c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/style-before-pseudo-ref.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<style>
+div {
+ border-radius: 3px;
+}
+div::before {
+ width: 100px;
+ height: 100px;
+ border-radius: 2px;
+ content: 'foo';
+ color: rgba(0, 0, 0, 0);
+}
+canvas{
+ border-radius: 2px;
+ display: block;
+ position: relative;
+ top: -1em;
+}
+</style>
+<body style="font: 10px/1 Ahem;">
+ <div><canvas width="30px" height="10px"></canvas></div>
+<script>
+document.addEventListener('DOMContentLoaded', function() {
+ var canvas = document.querySelector('canvas');
+ var context = canvas.getContext("2d");
+ context.strokeStyle = 'green';
+ context.lineWidth = 4;
+ context.strokeRect(0, 0, 30, 10);
+});
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/style-before-pseudo.html b/tests/wpt/web-platform-tests/css-paint-api/style-before-pseudo.html
new file mode 100644
index 00000000000..8ba4cdbc612
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/style-before-pseudo.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="style-before-pseudo-ref.html">
+<style>
+div {
+ border-radius: 3px;
+}
+
+div::before {
+ width: 100px;
+ height: 100px;
+ content: 'foo';
+ color: rgba(0, 0, 0, 0);
+
+ background-image: paint(geometry);
+ border-radius: 2px;
+ --foo: bar;
+}
+</style>
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/css-paint-tests.js"></script>
+<body style="font: 10px/1 Ahem;">
+<div></div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ static get inputProperties() {
+ return [
+ '--bar',
+ '--foo',
+ 'border-radius',
+ ];
+ }
+ paint(ctx, geom, styleMap) {
+ const properties = styleMap.getProperties().sort();
+ var serializedStrings = [];
+ for (let i = 0; i < properties.length; i++) {
+ const value = styleMap.get(properties[i]);
+ let serialized;
+ if (value)
+ serialized = properties[i].toString() + ': [' + value.constructor.name + '=' + value.toString() + ']';
+ else
+ serialized = properties[i].toString() + ': [null]';
+ serializedStrings.push(serialized);
+ }
+ ctx.strokeStyle = 'green';
+ if (serializedStrings[0] != "--bar: [null]")
+ ctx.strokeStyle = 'red';
+ if (serializedStrings[1] != "--foo: [CSSStyleValue= bar]")
+ ctx.strokeStyle = 'blue';
+ if (serializedStrings[2] != "border-radius: [CSSStyleValue=2px]")
+ ctx.strokeStyle = 'yellow';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/style-first-letter-pseudo-ref.html b/tests/wpt/web-platform-tests/css-paint-api/style-first-letter-pseudo-ref.html
new file mode 100644
index 00000000000..ea5c04a1808
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/style-first-letter-pseudo-ref.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<style>
+div {
+ color: rgb(0, 255, 0);
+ line-height: 2px;
+}
+
+div::first-letter {
+ color: rgb(255, 0, 0);
+}
+canvas{
+ position: absolute;
+ top: 4px;
+ z-index: -1;
+}
+</style>
+<body style="font: 10px/1 Ahem;">
+<div><canvas width="10px" height="10px"></canvas>ppp</div>
+<script>
+document.addEventListener('DOMContentLoaded', function() {
+ var canvas = document.querySelector('canvas');
+ var context = canvas.getContext("2d");
+ context.strokeStyle = 'green';
+ context.lineWidth = 4;
+ context.strokeRect(0, 0, 10, 10);
+});
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/style-first-letter-pseudo.html b/tests/wpt/web-platform-tests/css-paint-api/style-first-letter-pseudo.html
new file mode 100644
index 00000000000..61763b28298
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-paint-api/style-first-letter-pseudo.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<link rel="match" href="style-first-letter-pseudo-ref.html">
+<style>
+div {
+ color: rgb(0, 255, 0);
+ line-height: 1px;
+ height: 10px;
+}
+
+div::first-letter {
+ background-image: paint(geometry);
+ color: rgb(255, 0, 0);
+ line-height: 2px;
+}
+</style>
+<script src="../common/reftest-wait.js"></script>
+<script src="../common/css-paint-tests.js"></script>
+<body style="font: 10px/1 Ahem;">
+<div>ppp</div>
+
+<script id="code" type="text/worklet">
+registerPaint('geometry', class {
+ static get inputProperties() {
+ return [
+ 'color',
+ 'line-height',
+ ];
+ }
+ paint(ctx, geom, styleMap) {
+ const properties = styleMap.getProperties().sort();
+ var serializedStrings = [];
+ for (let i = 0; i < properties.length; i++) {
+ const value = styleMap.get(properties[i]);
+ let serialized;
+ if (value)
+ serialized = properties[i].toString() + ': [' + value.constructor.name + '=' + value.toString() + ']';
+ else
+ serialized = properties[i].toString() + ': [null]';
+ serializedStrings.push(serialized);
+ }
+ ctx.strokeStyle = 'green';
+ if (serializedStrings[0] != "color: [CSSStyleValue=rgb(255, 0, 0)]")
+ ctx.strokeStyle = 'red';
+ if (serializedStrings[1] != "line-height: [CSSUnitValue=2px]")
+ ctx.strokeStyle = 'blue';
+ ctx.lineWidth = 4;
+ ctx.strokeRect(0, 0, geom.width, geom.height);
+ }
+});
+</script>
+
+<script>
+ importPaintWorkletAndTerminateTestAfterAsyncPaint(document.getElementById('code').textContent);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css-paint-api/valid-image-after-load.html b/tests/wpt/web-platform-tests/css-paint-api/valid-image-after-load.html
index b1ad0d2d73a..73557d245de 100644
--- a/tests/wpt/web-platform-tests/css-paint-api/valid-image-after-load.html
+++ b/tests/wpt/web-platform-tests/css-paint-api/valid-image-after-load.html
@@ -23,14 +23,10 @@ registerPaint('green', class {
</script>
<script>
-if (window.testRunner) {
- testRunner.waitUntilDone();
-}
-
var blob = new Blob([document.getElementById('code').textContent],
{type: 'text/javascript'});
var frame_cnt = 0;
-paintWorklet.addModule(URL.createObjectURL(blob)).then(function() {
+CSS.paintWorklet.addModule(URL.createObjectURL(blob)).then(function() {
var el = document.getElementById('output');
el.style.backgroundImage = 'paint(green)';
requestAnimationFrame(function() {
diff --git a/tests/wpt/web-platform-tests/css-paint-api/valid-image-before-load.html b/tests/wpt/web-platform-tests/css-paint-api/valid-image-before-load.html
index b4e6b0e1720..483d16cfa89 100644
--- a/tests/wpt/web-platform-tests/css-paint-api/valid-image-before-load.html
+++ b/tests/wpt/web-platform-tests/css-paint-api/valid-image-before-load.html
@@ -23,17 +23,13 @@ registerPaint('green', class {
</script>
<script>
-if (window.testRunner) {
- testRunner.waitUntilDone();
-}
-
var el = document.getElementById('output');
el.style.backgroundImage = 'paint(green)';
var blob = new Blob([document.getElementById('code').textContent],
{type: 'text/javascript'});
var frame_cnt = 0;
-paintWorklet.addModule(URL.createObjectURL(blob)).then(function() {
+CSS.paintWorklet.addModule(URL.createObjectURL(blob)).then(function() {
requestAnimationFrame(function() {
takeScreenshot(frame_cnt);
});
diff --git a/tests/wpt/web-platform-tests/css-scoping/slotted-parsing.html b/tests/wpt/web-platform-tests/css-scoping/slotted-parsing.html
new file mode 100644
index 00000000000..308ff430449
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-scoping/slotted-parsing.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Scoping: ::slotted pseudo parsing</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#slotted-pseudo">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style id="styleElm">
+</style>
+<script>
+ function parse_selector(selector_text) {
+ try {
+ styleElm.sheet.insertRule(selector_text+"{}");
+ styleElm.sheet.deleteRule(0);
+ return true;
+ } catch (ex) {
+ return false;
+ }
+ }
+
+ function test_valid_selector(selector_text) {
+ test(function(){
+ assert_true(parse_selector(selector_text));
+ }, "Should be a valid selector: '" + selector_text + "'");
+ }
+
+ function test_invalid_selector(selector_text) {
+ test(function(){
+ assert_false(parse_selector(selector_text));
+ }, "Should be an invalid selector: '" + selector_text + "'");
+ }
+
+ test_invalid_selector("::slotted");
+ test_invalid_selector("::slotted()");
+ test_invalid_selector("::slotted(*).class");
+ test_invalid_selector("::slotted(*)#id {}");
+ test_invalid_selector("::slotted(*)[attr]");
+ test_invalid_selector("::slotted(*):hover");
+ test_invalid_selector("::slotted(*):read-only");
+ test_invalid_selector("::slotted(*)::slotted(*)");
+ test_invalid_selector("::slotted(*)::before::slotted(*)");
+ test_invalid_selector("::slotted(*) span");
+
+ test_valid_selector("::slotted(*)");
+ test_valid_selector("::slotted(div)");
+ test_valid_selector("::slotted([attr]:hover)");
+ test_valid_selector("::slotted(:not(.a))");
+
+ // Allow tree-abiding pseudo elements after ::slotted
+ test_valid_selector("::slotted(*)::before");
+ test_valid_selector("::slotted(*)::after");
+
+ // Other pseudo elements not valid after ::slotted
+ test_invalid_selector("::slotted(*)::first-line");
+ test_invalid_selector("::slotted(*)::first-letter");
+ test_invalid_selector("::slotted(*)::selection");
+</script>
diff --git a/tests/wpt/web-platform-tests/css-scoping/slotted-with-pseudo-element-ref.html b/tests/wpt/web-platform-tests/css-scoping/slotted-with-pseudo-element-ref.html
new file mode 100644
index 00000000000..63677cf4220
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-scoping/slotted-with-pseudo-element-ref.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Scoping: pseudo element after ::slotted - reference</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<div>PASS</div>
+<div>PASS</div>
+<div style="color:green">PASS</div>
diff --git a/tests/wpt/web-platform-tests/css-scoping/slotted-with-pseudo-element.html b/tests/wpt/web-platform-tests/css-scoping/slotted-with-pseudo-element.html
new file mode 100644
index 00000000000..08e6dcc018f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css-scoping/slotted-with-pseudo-element.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Scoping: pseudo element after ::slotted</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#slotted-pseudo">
+<link rel="match" href="slotted-with-pseudo-element-ref.html">
+<div id="host1"><span></span></div>
+<div id="host2"><span></span></div>
+<div id="host3"><span></span></div>
+<style>
+ #host3 > span::before { content: "PASS" }
+</style>
+<script>
+ function attachShadowWithSlottedStyle(host, styleString) {
+ var root = host.attachShadow({mode:"open"});
+ root.innerHTML = "<style>"+styleString+"</style><slot/>";
+ }
+
+ attachShadowWithSlottedStyle(host1, "::slotted(span)::before { content: 'PASS' }");
+ attachShadowWithSlottedStyle(host2, "::slotted(span)::after { content: 'PASS' }");
+ attachShadowWithSlottedStyle(host3, "::slotted(span)::before { content: 'FAIL'; color: green }");
+</script>
diff --git a/tests/wpt/web-platform-tests/css-values/unset-value-storage.html b/tests/wpt/web-platform-tests/css-values/unset-value-storage.html
deleted file mode 100644
index 9cf13b250d8..00000000000
--- a/tests/wpt/web-platform-tests/css-values/unset-value-storage.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Storage of "unset" value</title>
-<meta name="author" title="Xidorn Quan" href="https://www.upsuper.org">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<style>
- div {
- color: unset;
- border: unset;
- }
-</style>
-<body>
- <div id="log"></div>
- <script>
- test(function() {
- let properties = ["color", "border", "border-left", "border-color", "border-right-style"];
- let style = document.styleSheets[0].cssRules[0].style;
- for (let prop of properties) {
- assert_equals(style.getPropertyValue(prop), "unset", `${prop} is expected to be "unset"`);
- }
- });
- </script>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-001.xht
index 914843e2037..6068c6ab7ec 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-001.xht
@@ -5,6 +5,8 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/001.html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#at-import"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#at-import"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#at-import"/>
<link rel="help" href="http://www.ietf.org/rfc/rfc2397.txt"/>
<style type="text/css">
@import url(data:text/css,@import%20url\(data:text/css,.test%2520%257B%2520background:%2520maroon;%2520color:%2520white;%2520%257D\);%0D%0A.test.test%20%7B%20background:%20green;%20color:%20white;%20%7D);
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-002.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-002.xht
index 7cb7feb14b3..6a2c70fa365 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-002.xht
@@ -8,7 +8,11 @@
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.6"/>
<!-- There seems to be no spec defining http-equiv="Link" behavior -->
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#at-import"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#at-import"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#at-import"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<meta name="flags" content="http" />
<meta http-equiv="Link" content='&lt;support/cascade-import-002h.css>; rel="stylesheet"'/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-003.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-003.xht
index 65e8fd4a79c..2cdc96128a4 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-003.xht
@@ -6,6 +6,8 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/003.html"/>
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.3"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="stylesheet" href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=2&amp;mime=text%2Fcss&amp;text=.a+%7B+color%3A+green%3B+%7D%0D%0A.b+%7B+color%3A+red%3B+%7D%0D%0A.c+%7B+color%3A+red%3B+%7D"/>
<link rel="stylesheet" href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=5&amp;mime=text%2Fcss&amp;text=.b+%7B+color%3A+green%3B+%7D%0D%0A.c+%7B+color%3A+red%3B+%7D"/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-004.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-004.xht
index ec37fd81a5c..5b0cb6574ad 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-004.xht
@@ -6,6 +6,8 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/004.html"/>
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.3"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="stylesheet" href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=8&amp;mime=text%2Fcss&amp;text=.a+%7B+color%3A+green%3B+%7D%0D%0A.b+%7B+color%3A+red%3B+%7D%0D%0A.c+%7B+color%3A+red%3B+%7D"/>
<link rel="stylesheet" href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=5&amp;mime=text%2Fcss&amp;text=.b+%7B+color%3A+green%3B+%7D%0D%0A.c+%7B+color%3A+red%3B+%7D"/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-005.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-005.xht
index b6694598bb1..0b1b009e204 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-005.xht
@@ -6,6 +6,8 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/005.html"/>
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.3"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="alternate stylesheet" title="1"
href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=2&amp;mime=text%2Fcss&amp;text=.b+%7B+color%3A+red%3B+display%3A+block%3B+%7D"/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-006.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-006.xht
index 3003adfbb2a..c8b6e6b03bd 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-006.xht
@@ -6,6 +6,8 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/006.html"/>
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.3"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="alternate stylesheet" title="1"
href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=8&amp;mime=text%2Fcss&amp;text=.b+%7B+color%3A+red%3B+display%3A+block%3B+%7D"/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-007.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-007.xht
index b7fa01a346d..856a1dd4e3e 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-007.xht
@@ -6,6 +6,8 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/007.html"/>
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.3"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="alternate stylesheet" title="1"
href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=2&amp;mime=text%2Fcss&amp;text=.b+%7B+color%3A+red%3B+display%3A+block%3B+%7D"/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-008.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-008.xht
index a63421863d8..4e8d56ee804 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-008.xht
@@ -6,6 +6,8 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/008.html"/>
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.3"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="alternate stylesheet" title="1"
href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=8&amp;mime=text%2Fcss&amp;text=.b+%7B+color%3A+red%3B+display%3A+block%3B+%7D"/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-009.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-009.xht
index beb74755b73..b83217c56c9 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-009.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-009.xht
@@ -6,6 +6,8 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/009.html"/>
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.3"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="alternate stylesheet" title="Test"
href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=2&amp;mime=text%2Fcss&amp;text=.b+%7B+color%3A+red%3B+%7D"/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-010.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-010.xht
index 74d977c6d93..8ed0c7ad0e7 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-010.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-010.xht
@@ -6,6 +6,8 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/010.html"/>
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.3"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="alternate stylesheet" title="Test"
href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=8&amp;mime=text%2Fcss&amp;text=.b+%7B+color%3A+red%3B+%7D"/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-011.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-011.xht
index 1d830a961bb..6980f814b66 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-011.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-011.xht
@@ -6,6 +6,8 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/011.html"/>
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.3"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="alternate stylesheet" title="Test"
href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=2&amp;mime=text%2Fcss&amp;text=.b+%7B+color%3A+red%3B+%7D"/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-012.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-012.xht
index 3635bea8994..1a56032e211 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-012.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade-import/cascade-import-012.xht
@@ -6,6 +6,8 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/import/012.html"/>
<link rel="help" href="http://www.w3.org/TR/html4/present/styles.html#h-14.3"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="alternate stylesheet" title="Test"
href="http://software.hixie.ch/utilities/cgi/test-tools/delayed-file?pause=8&amp;mime=text%2Fcss&amp;text=.b+%7B+color%3A+red%3B+%7D"/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-001.xht
index bb1f242f174..bcaf4118b0e 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-001.xht
@@ -4,6 +4,8 @@
<title>CSS Test: @import not as the first declaration</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="" />
<meta name="assert" content="An @import is ignored if it is not the first statement in a style block." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-002.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-002.xht
index 48a80d9e906..1e147c7e5a3 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-002.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Importing external stylesheets with @import</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="An @import used to import external stylesheets." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-003.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-003.xht
index 6af94f62a11..db9d54d492f 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-003.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Importing styles using @import with a string</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="An @import used with just a string is interpreted as if it had url(...) around it." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-004.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-004.xht
index 836438e0466..b7222b339fc 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-004.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Media dependency on @import set to 'print'</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<link rel="match" href="../reference/no-red-filler-text-ref.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Specifying a media-dependency of print does not apply rules to the user agent display." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-005.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-005.xht
index f30016de406..b608ae9000a 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-005.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Media dependency on @import set to 'all'</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Specifying the media-dependency of 'all' applies to all media types including user agent display." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-006.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-006.xht
index 0d02445c0cc..91e8b9af378 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-006.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Media dependency on @import set to 'screen'</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Specifying the media-dependent import rules to 'screen' applies to user agent display." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-007.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-007.xht
index 23c1838da14..d9e50fbcdae 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-007.xht
@@ -4,6 +4,8 @@
<title>CSS Test: @import with @charset</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="An @import is valid after @charset." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-008.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-008.xht
index 106975c056f..fdc8a8f8b57 100755
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/at-import-008.xht
@@ -8,6 +8,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#at-import" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#at-import" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#at-import" />
<meta content="paged" name="flags" />
<meta content="Media-dependent @import rules" name="assert" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-001.xht
index fb3b8e5a89e..3d9fc19e6e5 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-001.xht
@@ -4,6 +4,8 @@
<title>CSS Test: User style sheets</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascade" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="Normal user declarations override the default user agent style sheet." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-002.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-002.xht
index 54664294f66..78e078b79b6 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-002.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Author stylesheets override user stylesheets</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascade" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="Normal author declarations override normal user stylesheet declarations." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-003.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-003.xht
index 1bedd0012d4..b02072d72d9 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-003.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Author rules with !important and a user stylesheet</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascade" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="Author rules using !important override user stylesheet rules." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-004.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-004.xht
index a4030be5fea..dac1fcf895f 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-004.xht
@@ -4,6 +4,8 @@
<title>CSS Test: User stylesheet rules using !important and normal author rules</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascade" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="User stylesheet rules using !important override normal author rules." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-005.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-005.xht
index b268de5a1ab..43ad7359542 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-005.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Redefining rules</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascade" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="The latter specified rule wins when having the same specificity and weight." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-006.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-006.xht
index cd5faeec42d..f48379da853 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-006.xht
@@ -4,6 +4,8 @@
<title>CSS Test: User style sheets and redefining rules</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascade" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The latter specified rule in a style sheet wins when having the same specificity and weight in user styles sheets." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-007.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-007.xht
index cf7d7cc7164..fc6a327d8d6 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-007.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Author rules local and external</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascade" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Author rules in embedded stylesheets override author rules in imported stylesheets." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-008.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-008.xht
index 770d2f78d15..30a0c47fd3c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-008.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Shorthand properties with !important</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#important-rules" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#importance" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#importance" />
<meta name="flags" content="" />
<meta name="assert" content="Shorthand properties with !important apply to all direct sub-properties." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009.xht
index b77c8233ee6..94473c42e6a 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Author rules with !important and other normal author rules</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#important-rules" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#importance" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#importance" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Author rules with !important override normal author rules." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009a.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009a.xht
index 7a5473c1eff..84027a5920f 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009a.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009a.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="author" title="James Hopkins" href="http://idreamincode.co.uk/css21testsuite" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#important-rules" title="6.4.2 !important rules" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#importance" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#importance" />
<link rel="match" href="cascade-009a-ref.xht" />
<meta content="" name="flags" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009b.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009b.xht
index 200d3bb5bc4..8ada42c838d 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009b.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-009b.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="author" title="James Hopkins" href="http://idreamincode.co.uk/css21testsuite" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#important-rules" title="6.4.2 !important rules" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#importance" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#importance" />
<link rel="match" href="cascade-009b-ref.xht" />
<meta content="" name="flags" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-010.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-010.xht
index 8a6e690a2b6..05cd7750766 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-010.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-010.xht
@@ -4,6 +4,8 @@
<title>CSS Test: User stylesheet rules with !important and !important author rules</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#important-rules" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#importance" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#importance" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="User stylesheet rules with !important override !important author rules." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-011.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-011.xht
index a8bb7948e27..568be1f0c5e 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-011.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-011.xht
@@ -4,6 +4,8 @@
<title>CSS Test: User stylesheet rules with !important and normal user rules</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#important-rules" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#importance" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#importance" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="User stylesheet rules with !important declarations override user stylesheet rules with normal declarations." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-012.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-012.xht
index 9f87c261be3..44ef7cddcd8 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-012.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-012.xht
@@ -6,6 +6,8 @@
<link rel="reviewer" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact" />
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/weight/002.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#at-import" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#at-import" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#at-import" />
<link rel="match" href="cascade-012-ref.xht" />
<style type="text/css"><![CDATA[
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-precedence-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-precedence-001.xht
index 4eff5ca4179..dce50d3119e 100755
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-precedence-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-precedence-001.xht
@@ -9,7 +9,11 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="author" title="James Hopkins" href="http://idreamincode.co.uk/css21testsuite" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specified-value" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#specified" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#specified" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#inheritance" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inheriting" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inheriting" />
<meta content="" name="flags" />
<meta content="When determining the specified value of a property, the cascade mechanism of (user agent, author, user) style sheets has precedence. If no value results from such mechanism, then the property may inherit from its parent. In this testcase, it is presumed that b elements are specified in the user agents style sheets to embold their text content." name="assert" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-precedence-002.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-precedence-002.xht
index 9d73cd20cb1..bf5587f313b 100755
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-precedence-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/cascade-precedence-002.xht
@@ -9,7 +9,11 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="author" title="James Hopkins" href="http://idreamincode.co.uk/css21testsuite" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specified-value" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#specified" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#specified" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#inheritance" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inheriting" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inheriting" />
<meta content="" name="flags" />
<meta content="When determining the specified value of a property, the cascade mechanism of (user agent, author, user) style sheets has precedence. If no value results from such mechanism, then the property may inherit from its parent. In this testcase, it is presumed that i elements are specified in the user agents style sheets to italicize their text content." name="assert" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/default-stylesheet-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/default-stylesheet-001.xht
index 549c945f3a6..3110e61a001 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/default-stylesheet-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/default-stylesheet-001.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Overriding the user agent default style sheet</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascade" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading" />
<meta name="flags" content="ahem" />
<meta name="assert" content="User agent default style sheet settings can be overridden." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-001.xht
index d8d436d2eb9..3adb060d762 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-001.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'align' vs. CSS 'caption-side' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'align' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-002.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-002.xht
index e810685f95f..f555d6039bd 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-002.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'alink' vs. CSS active specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="interact" />
<meta name="assert" content="Attribute 'alink' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-003.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-003.xht
index ff617ea950b..5649d94b4f0 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-003.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'background' vs. CSS 'background' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="image" />
<meta name="assert" content="Attribute 'background' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-004.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-004.xht
index 14abe1fbb02..5e0f2f0216d 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-004.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'bgcolor' vs. CSS 'background-color' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'bgcolor' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-005.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-005.xht
index 9a201dc9d52..a4adf154a82 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-005.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'border' vs. CSS border specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'border' has 0 specificity and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-006.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-006.xht
index be093836c2f..cb105b03b16 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-006.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'cellpadding' vs. CSS 'padding' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'cellpadding' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-007.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-007.xht
index f2737c2f04b..3f7911edb6b 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-007.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'cellspacing' vs. CSS border-spacing specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'cellspacing' has 0 specificity and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-008.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-008.xht
index b44cb3f4554..093c9b4b158 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-008.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'clear' vs. CSS 'clear' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'clear' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-009.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-009.xht
index 22ce37ee6b7..7b883f89815 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-009.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-009.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'color' vs. CSS 'color' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'color' has a specificity of zero and is overridden by CSS." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-010.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-010.xht
index a5607ad4bae..e25d66adb51 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-010.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-010.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'cols' vs CSS 'width' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'cols' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-011.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-011.xht
index 9f196edb27d..ea8552aa251 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-011.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-011.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'width' vs. CSS 'width' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'width' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-012.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-012.xht
index 928edb8a713..d9756f6bee4 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-012.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-012.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'face' vs. CSS 'font-family' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="ahem" />
<meta name="assert" content="Attribute 'face' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-013.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-013.xht
index ea4d9a045b6..5225eff1a5c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-013.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-013.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'valign' vs. CSS 'vertical-align' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'valign' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-014.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-014.xht
index c34333702ea..fb1283764fa 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-014.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-014.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'frame' vs. CSS 'border' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'frame' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-015.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-015.xht
index 88a9fec8fd0..3825411cae9 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-015.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-015.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'rules' vs. CSS border specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'rules' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-017.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-017.xht
index eb497a74677..88e6d57b1a8 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-017.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-017.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'height' vs. CSS 'height' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'height' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-018.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-018.xht
index 202d0afafa9..b0024915187 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-018.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-018.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'hspace' vs. CSS 'margin' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="image" />
<meta name="assert" content="Attribute 'hspace' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-019.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-019.xht
index a733f5c0048..9dc9e9194e2 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-019.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-019.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'vspace' vs. CSS 'margin' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="image" />
<meta name="assert" content="Attribute 'vspace' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-020.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-020.xht
index 6c1e517da9a..b6fac1eacbc 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-020.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-020.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'link' vs. CSS ':link' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'link' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-021.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-021.xht
index a2acbb20843..f2fbd26e0ea 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-021.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-021.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'marginheight' vs. CSS 'margin' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'marginheight' has a specificity of zero and is overridden by CSS." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-022.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-022.xht
index 5fb9760c290..ae6697e3da0 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-022.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-022.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'marginwidth' vs. CSS 'margin' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'marginwidth' has a specificity of zero and is overridden by CSS." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-023.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-023.xht
index 47213aa97cd..939f7432be2 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-023.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-023.xht
@@ -4,6 +4,8 @@
<title>CSS Test: HTML 'noshade' attribute vs CSS color specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'noshade' has 0 specificity and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-024.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-024.xht
index f2ef0515bc8..aa18763a240 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-024.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-024.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'nowrap' vs. CSS 'white-space' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'nowrap' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-025.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-025.xht
index 40f99d96645..b9e4bf688f5 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-025.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-025.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'rows' vs CSS 'height' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'rows' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-027.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-027.xht
index 09f7c01931c..eb0521553b9 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-027.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-027.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'size' vs CSS 'height' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'size' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-028.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-028.xht
index 630b41947d1..66b844e3c29 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-028.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-028.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'text' vs. CSS 'color' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Attribute 'text' has a specificity of zero and is overridden by CSS." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-029.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-029.xht
index 1ea8e55a95b..74cbfcd3bb1 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-029.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-attribute-029.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute 'vlink' vs. CSS ':visited' specificity</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<meta name="flags" content="history interact" />
<meta name="assert" content="Attribute 'vlink' has a specificity of zero and is overridden by CSS." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-001.xht
index 648f9d34a82..cc7dca42b45 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-001.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Element selector precedence</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#preshint" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#preshint" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="The 'color' attribute has a specificity equal to 0 which be overridden by subsequent style sheet rules." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-002.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-002.xht
index c1b3e8cc5a2..8562881a859 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-002.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Universal selector precedence</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="" />
<meta name="assert" content="The universal selector and the 'color' attribute have the same specificity. The universal selector is applied since CSS takes precedence." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-003.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-003.xht
index 205adba4b64..f10cc7e5b86 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/html-precedence-003.xht
@@ -4,6 +4,8 @@
<title>CSS Test: User style sheet precedence</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The 'font' element's 'color' attribute trumps the user stylesheet's universal selector. They have the same specificity but the font element is a virtual author rule." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-001.xht
index 95c11ad418a..a30ffd5e997 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-001.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Inherit keyword</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<meta name="flags" content="" />
<meta name="assert" content="Children elements inherit the parents color given the 'inherit' keyword." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-002.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-002.xht
index cb156a33b34..e0929204b48 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-002.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Inherit on non-inherited properties</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<meta name="flags" content="" />
<meta name="assert" content="Inherit can be used on properties which are not normally inherited." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-003.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-003.xht
index e19dc3784e8..b90a08e7429 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/inherit-003.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Inherit on the root element</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<meta name="flags" content="" />
<meta name="assert" content="If the 'inherit' value is set on the root element, the property is assigned its initial value." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/inherited-value-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/inherited-value-001.xht
index b38fe127c9d..7b7745ef8a1 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/inherited-value-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/inherited-value-001.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Inheritance</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#inheritance" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inheriting" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inheriting" />
<meta name="flags" content="" />
<meta name="assert" content="Children elements can inherit properties from parents." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/inherited-value-002.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/inherited-value-002.xht
index 5d342f8498f..85c0b0dcd82 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/inherited-value-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/inherited-value-002.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Inheriting computed values</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="ahem" />
<meta name="assert" content="The computed value of a font-size with a percentage is the percentage of its parent's font-size value. A nested element which also has a percentage applies the parents' specified value (which is inherited)." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/non-inherited-value-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/non-inherited-value-001.xht
index 0b15c985a3c..5846ddc84ff 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/non-inherited-value-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/non-inherited-value-001.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Non-inherited values</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specified-value" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#specified" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#specified" />
<meta name="flags" content="" />
<meta name="assert" content="If the cascade results in a value, use it." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/sort-by-order-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/sort-by-order-001.xht
index 7414a475ec0..9b8f718f329 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/sort-by-order-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/sort-by-order-001.xht
@@ -8,6 +8,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" title="6.4.1 Cascading order" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading" />
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta content="" name="flags" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-001.xht
index 6668bec237c..131f06022f9 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-001.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Calculating specificity - Specificity 0010 vs. 0001</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="The attribute selector has an higher specificity over the element selector - specificity 0010 takes precedence over 0001." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-002.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-002.xht
index 1b72c8686bb..867d0feb6a0 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-002.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Calculating specificity - Inline Style</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="Specificity of the inline style trumps all other selectors." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-003.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-003.xht
index e6324930c7d..5e2b17a43b2 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-003.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Calculating specificity - Specificity 0100 vs. 0011</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="The ID attribute in a selector has the higher specificity than the combined pseudo-class and element selectors - specificity 0100 takes precedence over 0011." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-004.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-004.xht
index 3fad5370009..180fdcf9a64 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-004.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Calculating specificity - Specificity 0011 vs. 0010</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="The combined pseudo-class and element selectors have a higher specificity than the attribute selector - specificity 0011 takes precedence over 0010." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-005.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-005.xht
index 84b0228170f..938f00303d8 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-005.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Calculating specificity - Specificity 0002 vs. 0001</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="An element selector with a pseudo-element selector wins over a pseudo-element selector - specificity 0002 takes precedence over 0001." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-006.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-006.xht
index e686ef9c7de..d02c853d57e 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-006.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Calculating specificity - Pseudo-element vs. simple element</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="The combination of a pseudo-element selector with an element selector takes takes precedence over simple and single element selector - specificity 0002 takes precedence over 0001." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-007.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-007.xht
index 5a287044812..11fc6c919f3 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-007.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Calculating specificity - Specificity 0001 vs. 0000</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="The element selector has a higher specificity over the universal selector - specificity 0001 takes precedence over 0000." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-008.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-008.xht
index ecfcab82fee..5ae79cbe7ef 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-008.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Calculating specificity - specificity 0012 vs. 0002</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<link rel="match" href="../reference/filler-text-below-green.xht"/>
<meta name="flags" content="" />
<meta name="assert" content="The combined specificity of an element selector, with a pseudo-class selector and a pseudo-element selector achieves an higher specificity than the combined specificity of an element selector with a pseudo-element selector." />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-009.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-009.xht
index afac31fc478..7dc4d6d3b6e 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-009.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-009.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Calculating specificity - specificity 0003 vs. 0002</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<meta name="flags" content="" />
<meta name="assert" content="First-line selector with highest specificity wins - specificity 0003 take precedence over 0002." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-011.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-011.xht
index a63ea876ad2..3c3952bd87c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-011.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-011.xht
@@ -5,6 +5,8 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/specificity/001.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<link rel="match" href="specificity-011-ref.xht" />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-012.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-012.xht
index 96a9161544f..06936b385d7 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-012.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-012.xht
@@ -5,6 +5,8 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/specificity/002.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<meta name="flags" content="history interact" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-013.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-013.xht
index 179fd875e38..a0089b0f67b 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-013.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/specificity-013.xht
@@ -5,6 +5,8 @@
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/cascade/specificity/003.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity" />
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity" />
<link rel="match" href="specificity-013-ref.xht" />
<style type="text/css"><![CDATA[
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-001.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-001.xht
index d127fab25f4..f2d686307ce 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-001.xht
@@ -4,6 +4,8 @@
<title>CSS Test: User defined stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="User stylesheet can be applied to the page." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-002.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-002.xht
index 252b5350a58..15a6476533e 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-002.xht
@@ -4,6 +4,8 @@
<title>CSS Test: User defined stylesheet can be applied and persisted</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="interact userstyle" />
<meta name="assert" content="The user stylesheet is still applied after close and reopen the user agent window." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-003.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-003.xht
index 9ec870d1896..056ee6d8b78 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-003.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Rules with normal declarations in an user defined stylesheet can be overriden by rules with normal declarations from author in a style block</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="A CSS rule (with normal - not !important - declarations) in an author style sheet have more weight than a CSS rule (with normal - not !important -declarations) in an user style sheet." />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-004.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-004.xht
index 662816a98f0..163d5c4c84f 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-004.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Rules with normal declarations in an user defined stylesheet can be overriden by normal declarations from author in an inline style attribute</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="A normal - not !important - declaration in an inline style from author have more weight than a CSS rule (with normal - not !important -) declarations in an user style sheet." />
<meta http-equiv="Content-Style-Type" content="text/css" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-005.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-005.xht
index 82582d334a1..bfa4db39fb2 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-005.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Descendant selector defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The descendant selector defined in user stylesheet is applied to the appropriate element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-006.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-006.xht
index 84cddce6d0f..3a2bdcee5d6 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-006.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Child selector defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The child selector defined in user stylesheet is applied to the appropriate element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-007.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-007.xht
index 2215e1c6b10..55b0a5bc526 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-007.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Adjacent sibling selector defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The adjacent sibling selector defined in user stylesheet is applied to the appropriate element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-008.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-008.xht
index 022743ad6bf..804f771dec3 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-008.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Attribute selector defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The attribute selector defined in user stylesheet is applied to the appropriate element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-009.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-009.xht
index 3e36257b3bf..4788a923f10 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-009.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-009.xht
@@ -4,6 +4,8 @@
<title>CSS Test: ID selector defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The ID selector defined in user stylesheet is applied to the appropriate element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-010.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-010.xht
index bcbfc6bf412..a43c8763bde 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-010.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-010.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Pseudo-class selector :first-child defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The pseudo-class selector :first-child defined in user stylesheet is applied to the first child of an element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-011.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-011.xht
index 065c5cd01d4..206203e3d5c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-011.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-011.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Pseudo-element first-line selector defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The pseudo-element selector :first-line defined in user stylesheet is applied to the first line of an element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-012.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-012.xht
index 2964868787a..add16869dde 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-012.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-012.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Link defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="history userstyle" />
<meta name="assert" content="The pseudo-class selector :link defined in user stylesheet is applied to all links." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-013.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-013.xht
index 6688855ddea..085f013a455 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-013.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-013.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Visited selector defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="interact userstyle" />
<meta name="assert" content="The pseudo-class selector :visited defined in user stylesheet is applied when a link has already been visited." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-014.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-014.xht
index 5e39d6e4beb..c34a064b94a 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-014.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-014.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Hover defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="interact userstyle" />
<meta name="assert" content="The pseudo-class selector :hover defined in user stylesheet is applied when the mouse is above an element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-015.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-015.xht
index 065e457b75f..f461aa2a17d 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-015.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-015.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Pseudo-class :active defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="interact userstyle" />
<meta name="assert" content="The pseudo-class selector :active defined in user stylesheet is implemented." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-016.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-016.xht
index 06dc02564d7..6d2549c2da9 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-016.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-016.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Pseudo-element first-letter selector defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The pseudo-element selector :first-letter defined in user stylesheet is applied to the first letter of an element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-017.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-017.xht
index 14c23aea4cb..32bf1694751 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-017.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-017.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Pseudo-element before selector defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The pseudo-element selector :before defined in user stylesheet is inserted before an element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-018.xht b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-018.xht
index e3067d73cda..e89589bd30a 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-018.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/cascade/user-stylesheet-018.xht
@@ -4,6 +4,8 @@
<title>CSS Test: Pseudo-element after selector defined in user stylesheet can be applied</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/" />
<meta name="flags" content="userstyle" />
<meta name="assert" content="The pseudo-element selector :after defined in user stylesheet is inserted after an element." />
<style type="text/css"></style>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/css1/c11-import-000.xht b/tests/wpt/web-platform-tests/css/CSS2/css1/c11-import-000.xht
index 6972de57fe0..f214001d11c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/css1/c11-import-000.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/css1/c11-import-000.xht
@@ -13,6 +13,8 @@
<!-- .d { color: green; } -->
]]></style>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#at-import" title="6.3 The @import rule"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#at-import"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#at-import"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#comments" title="4.1.9 Comments"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#uri" title="4.3.4 URLs and URIs"/>
<link rel="match" href="c11-import-000-ref.xht" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/css1/c13-inh-underlin-000.xht b/tests/wpt/web-platform-tests/css/CSS2/css1/c13-inh-underlin-000.xht
index d94e46b9f82..15177ee3c55 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/css1/c13-inh-underlin-000.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/css1/c13-inh-underlin-000.xht
@@ -13,6 +13,8 @@
#a { font-style: italic; }
]]></style>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#inheritance" title="6.2 Inheritance"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inheriting"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inheriting"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/text.html#lining-striking-props" title="16.3.1 Underlining, overlining, striking, and blinking: the 'text-decoration' property"/>
</head>
<body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/css1/c13-inheritance-000.xht b/tests/wpt/web-platform-tests/css/CSS2/css1/c13-inheritance-000.xht
index ba437c28fc3..a5ddcaab18f 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/css1/c13-inheritance-000.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/css1/c13-inheritance-000.xht
@@ -16,6 +16,8 @@
dfn { color: white; }
]]></style>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#inheritance" title="6.2 Inheritance"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inheriting"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inheriting"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/colors.html#colors" title="14.1 Foreground color: the 'color' property"/>
</head>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/css1/c21-pseu-cls-000.xht b/tests/wpt/web-platform-tests/css/CSS2/css1/c21-pseu-cls-000.xht
index c85a7b661e3..c9c68f2887d 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/css1/c21-pseu-cls-000.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/css1/c21-pseu-cls-000.xht
@@ -15,7 +15,11 @@
a.test {color: green;}
]]></style>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" title="6.4.3 Calculating a selector's specificity"/>
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity"/>
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascade" title="6.4 The cascade"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#pseudo-class-selectors" title="5.11 Pseudo-classes"/>
</head>
<body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/css1/c21-pseu-id-000.xht b/tests/wpt/web-platform-tests/css/CSS2/css1/c21-pseu-id-000.xht
index afcc0355edb..52831f72f29 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/css1/c21-pseu-id-000.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/css1/c21-pseu-id-000.xht
@@ -16,7 +16,11 @@
a:active {color: red;}
]]></style>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" title="6.4.3 Calculating a selector's specificity"/>
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity"/>
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascade" title="6.4 The cascade"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/selector.html#pseudo-class-selectors" title="5.11 Pseudo-classes"/>
</head>
<body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/css1/c31-important-000.xht b/tests/wpt/web-platform-tests/css/CSS2/css1/c31-important-000.xht
index 29e11d3a27a..424ca56dd06 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/css1/c31-important-000.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/css1/c31-important-000.xht
@@ -13,7 +13,11 @@
p#id1 { color: red; }
]]></style>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#important-rules" title="6.4.2 !important rules"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#importance"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#importance"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order" title="6.4.1 Cascading order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
</head>
<body>
<p> This sentence should be green. </p>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/css1/c32-cascading-000.xht b/tests/wpt/web-platform-tests/css/CSS2/css1/c32-cascading-000.xht
index 99b5ba973d5..c70eced3e6c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/css1/c32-cascading-000.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/css1/c32-cascading-000.xht
@@ -33,7 +33,11 @@
.c { color: green; }
]]></style>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order" title="6.4.1 Cascading order"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specificity" title="6.4.3 Calculating a selector's specificity"/>
+ <link rel="help" href="http://www.w3.org/TR/css3-selectors/#specificity"/>
+ <link rel="help" href="http://www.w3.org/TR/selectors4/#specificity"/>
<meta http-equiv="Content-Style-Type" content="text/css" />
</head>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/css1/c548-ln-ht-003.xht b/tests/wpt/web-platform-tests/css/CSS2/css1/c548-ln-ht-003.xht
index 2a7a75e9cca..a733c7cad38 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/css1/c548-ln-ht-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/css1/c548-ln-ht-003.xht
@@ -16,6 +16,8 @@
]]></style>
<link rel="help" href="http://www.w3.org/TR/CSS21/visudet.html#leading" title="10.8.1 Leading and half-leading"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#inheritance" title="6.2 Inheritance"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inheriting"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inheriting"/>
</head>
<body>
<p>There should be no red below:</p>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/css1/c548-ln-ht-004.xht b/tests/wpt/web-platform-tests/css/CSS2/css1/c548-ln-ht-004.xht
index fb7a81cba9a..789a7d20045 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/css1/c548-ln-ht-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/css1/c548-ln-ht-004.xht
@@ -16,6 +16,8 @@
]]></style>
<link rel="help" href="http://www.w3.org/TR/CSS21/visudet.html#leading" title="10.8.1 Leading and half-leading"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#inheritance" title="6.2 Inheritance"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inheriting"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inheriting"/>
</head>
<body>
<p>There should be no red below:</p>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/css1/c64-uri-000.xht b/tests/wpt/web-platform-tests/css/CSS2/css1/c64-uri-000.xht
index 2be35419adb..334c7bff052 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/css1/c64-uri-000.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/css1/c64-uri-000.xht
@@ -15,6 +15,8 @@
]]></style>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#uri" title="4.3.4 URLs and URIs"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#at-import" title="6.3 The @import rule"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#at-import"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#at-import"/>
</head>
<body>
<p>Test passes if there are 3 sentences with a green background.</p>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/i18n/OWNERS b/tests/wpt/web-platform-tests/css/CSS2/i18n/OWNERS
new file mode 100644
index 00000000000..30ef550185b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/i18n/OWNERS
@@ -0,0 +1 @@
+@r12a
diff --git a/tests/wpt/web-platform-tests/css/CSS2/lists/list-style-019.xht b/tests/wpt/web-platform-tests/css/CSS2/lists/list-style-019.xht
index cdda75d6a72..a1f3ff062ed 100755
--- a/tests/wpt/web-platform-tests/css/CSS2/lists/list-style-019.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/lists/list-style-019.xht
@@ -11,6 +11,8 @@
<link rel="help" href="http://www.w3.org/TR/CSS21/generate.html#list-style" />
<link rel="help" href="http://www.w3.org/TR/CSS21/about.html#shorthand" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#specified-value" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#specified" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#specified" />
<link rel="match" href="list-style-019-ref.xht"/>
<meta content="image" name="flags" />
<meta content="'list-style' property is a shorthand notation that sets the three properties 'list-style-type', 'list-style-image' and 'list-style-position'. If one of the 3 list-style properties is not specified explicitly, then such 'list-style' property is assigned its initial value as indicated in its property definition." name="assert" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/lists/list-style-021.xht b/tests/wpt/web-platform-tests/css/CSS2/lists/list-style-021.xht
index 296bdcda92f..07d638845d9 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/lists/list-style-021.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/lists/list-style-021.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/generate.html#list-style" title="12.5.1 list-style shorthand" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#cascading-order" title="6.4.1 Cascading order" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#cascading" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#cascading" />
<link rel="match" href="list-style-021-ref.xht" />
<meta content="image" name="flags" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/margin-em-inherit-001.xht b/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/margin-em-inherit-001.xht
index 3b050381fc5..57af6a5701a 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/margin-em-inherit-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/margin-em-inherit-001.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" title="4.3.2 Length" href="http://www.w3.org/TR/CSS21/syndata.html#length-units" />
<link rel="help" title="6.2.1 The 'inherit' value" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="help" title="8.3 Margin properties" href="http://www.w3.org/TR/CSS21/box.html#margin-properties" />
<link rel="match" href="margin-em-inherit-001-ref.xht" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/margin-percentage-inherit-001.xht b/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/margin-percentage-inherit-001.xht
index faf31b08e29..5e73777157b 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/margin-percentage-inherit-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/margin-percentage-inherit-001.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" title="8.3 Margin properties" href="http://www.w3.org/TR/CSS21/box.html#margin-properties" />
<link rel="help" title="6.2.1 The 'inherit' value" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="match" href="margin-percentage-inherit-001-ref.xht" />
<meta content="A margin percentage is calculated with respect to the width of the generated box's containing block. When inherit keyword is used, the property takes the same computed value - a percentage value in this testcase - as the property for the element's parent." name="assert" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/padding-em-inherit-001.xht b/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/padding-em-inherit-001.xht
index d90c2d29c8b..9fb9c15a02c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/padding-em-inherit-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/padding-em-inherit-001.xht
@@ -10,6 +10,8 @@
<link rel="help" title="8.4 Padding properties" href="http://www.w3.org/TR/CSS21/box.html#padding-properties" />
<link rel="help" title="4.3.2 Length" href="http://www.w3.org/TR/CSS21/syndata.html#length-units" />
<link rel="help" title="6.2.1 The 'inherit' value" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="match" href="padding-em-inherit-001-ref.xht" />
<meta content="The 'em' unit is equal to the computed value of the 'font-size' property of the element on which it is used. When inherit keyword is used, the property takes the same computed value - a length value in this testcase - as the property for the element's parent." name="assert" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/padding-percentage-inherit-001.xht b/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/padding-percentage-inherit-001.xht
index 18d119cf6dd..d3e9c8b4283 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/padding-percentage-inherit-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/margin-padding-clear/padding-percentage-inherit-001.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" title="8.4 Padding properties" href="http://www.w3.org/TR/CSS21/box.html#padding-properties" />
<link rel="help" title="6.2.1 The 'inherit' value" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="match" href="padding-percentage-inherit-001-ref.xht" />
<meta content="A padding percentage is calculated with respect to the width of the generated box's containing block. When inherit keyword is used, the property takes the same computed value - a percentage value in this testcase - as the property for the element's parent." name="assert" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/normal-flow/height-inherit-001.xht b/tests/wpt/web-platform-tests/css/CSS2/normal-flow/height-inherit-001.xht
index 30c5422b84c..63f59a8cc92 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/normal-flow/height-inherit-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/normal-flow/height-inherit-001.xht
@@ -6,6 +6,8 @@
<link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"/>
<link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2012-10-08 -->
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit"/>
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta name="flags" content=""/>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/absolute-replaced-width-013.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/absolute-replaced-width-013.xht
index acaf18a9f86..1646f1b82cb 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/absolute-replaced-width-013.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/absolute-replaced-width-013.xht
@@ -35,10 +35,10 @@
</style>
</head>
<body>
- <p>Test passes if the blue and orange boxes below are the same width, and the blue box is in the upper-left corner of the black box.</p>
+ <p>Test passes if the blue and orange squares have the same width and the blue square is in the upper-left corner of an hollow black rectangle.</p>
<div id="div1">
<img alt="blue 15x15" src="support/blue15x15.png" width="50%" />
<div></div>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/absolute-replaced-width-027-ref.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/absolute-replaced-width-027-ref.xht
index 3651c799555..c51d6d9e8f1 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/absolute-replaced-width-027-ref.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/absolute-replaced-width-027-ref.xht
@@ -29,7 +29,7 @@
<body>
- <p>Test passes if the blue and orange squares have the same width and the blue square is in the upper-left corner of an hollow black rectangle.</p>
+ <p>Test passes if the blue and orange squares have the same width and the blue square is in the upper-right corner of an hollow black rectangle.</p>
<div><img src="support/blue15x15.png" alt="Image download support must be enabled" /><img src="support/swatch-orange.png" alt="Image download support must be enabled" /></div>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-001.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-001.xht
index ec34cfce523..10dfc482c1f 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-001.xht
@@ -5,6 +5,8 @@
<link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu"/>
<link rel="reviewer" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#position-props"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-position"/>
<link rel="match" href="dynamic-top-change-001-ref.xht" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-002.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-002.xht
index 3f22797c877..f6b80fe2048 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-002.xht
@@ -5,6 +5,8 @@
<link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu"/>
<link rel="reviewer" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#position-props"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-position"/>
<link rel="match" href="dynamic-top-change-002-ref.xht" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-003.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-003.xht
index b449834007b..1359a047fcb 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-003.xht
@@ -5,6 +5,8 @@
<link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu"/>
<link rel="reviewer" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#position-props"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-position"/>
<link rel="match" href="dynamic-top-change-002-ref.xht" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-004.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-004.xht
index 8536099eddb..0f557bd4371 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-004.xht
@@ -5,6 +5,8 @@
<link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu"/>
<link rel="reviewer" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#position-props"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-position"/>
<link rel="match" href="dynamic-top-change-002-ref.xht" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005.xht
index c9930e9a1fa..7c015d32c77 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005.xht
@@ -5,6 +5,8 @@
<link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu"/>
<link rel="reviewer" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#position-props"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-position"/>
<meta name="flags" content="combo dom" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005a.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005a.xht
index 4517d4d352e..c84ac49054c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005a.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005a.xht
@@ -6,6 +6,8 @@
<link rel="author" title="L. David Baron" href="https://dbaron.org/" />
<link rel="reviewer" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#position-props"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-position"/>
<meta name="flags" content="dom" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005b.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005b.xht
index 8595cf95df9..c74a27be78d 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005b.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/dynamic-top-change-005b.xht
@@ -6,6 +6,8 @@
<link rel="author" title="L. David Baron" href="https://dbaron.org/" />
<link rel="reviewer" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit"/>
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#position-props"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#propdef-position"/>
<meta name="flags" content="dom" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/left-offset-percentage-002.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/left-offset-percentage-002.xht
index 005be19452d..12c00cf82a5 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/left-offset-percentage-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/left-offset-percentage-002.xht
@@ -8,6 +8,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" title="6.2.1 The 'inherit' value" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="help" title="9.3.2 Box offsets: 'top', 'right', 'bottom', 'left'" href="http://www.w3.org/TR/CSS21/visuren.html#position-props" />
<link rel="match" href="left-offset-percentage-002-ref.xht" />
<meta content="'left: inherit' makes the left property take the same computed value as the left property for the element's parent; in the case of a percentage value, the computed value is the specified percentage value. 'left: [percentage]' refers to width of containing block." name="assert" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/positioning/top-offset-percentage-002.xht b/tests/wpt/web-platform-tests/css/CSS2/positioning/top-offset-percentage-002.xht
index fea4a2b5cac..69a002cd0f3 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/positioning/top-offset-percentage-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/positioning/top-offset-percentage-002.xht
@@ -8,6 +8,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" title="6.2.1 The 'inherit' value" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="help" title="9.3.2 Box offsets: 'top', 'right', 'bottom', 'left'" href="http://www.w3.org/TR/CSS21/visuren.html#position-props" />
<link rel="match" href="left-offset-percentage-002-ref.xht" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-001-ref.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-001-ref.xht
index 296732095b0..1aaf21d22e4 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-001-ref.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-001-ref.xht
@@ -9,9 +9,9 @@
}
</style>
</head>
-<body>
+<body lang="en-us">
<p>Test passes if the first line of "Filler Text" below is black and the second one is green.</p>
<div>Filler Text</div>
-<div class="green">Filler Text</div>
+<div class="green" lang="fr-fr">Filler Text</div>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-001.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-001.xht
index 8130d44f641..374d9c27905 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-001.xht
@@ -14,9 +14,9 @@
}
</style>
</head>
- <body>
+ <body lang="en-us">
<p>Test passes if the first line of "Filler Text" below is black and the second one is green.</p>
<div id="div1">Filler Text</div>
- <div id="div2">Filler Text</div>
+ <div id="div2" lang="fr-fr">Filler Text</div>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-002.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-002.xht
index 146544445d4..b44a1f11ddc 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-002.xht
@@ -8,15 +8,15 @@
<meta name="flags" content="" />
<meta name="assert" content="Selector matches attributes with specific value in a hyphen-separated list." />
<style type="text/css">
- [lang|=en]
+ [lang|=fr]
{
color: green;
}
</style>
</head>
- <body>
+ <body lang="en-us">
<p>Test passes if the first line of "Filler Text" below is black and the second one is green.</p>
- <div lang="ja-jp">Filler Text</div>
- <div lang="en-us">Filler Text</div>
+ <div>Filler Text</div>
+ <div lang="fr-fr">Filler Text</div>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-003.xht b/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-003.xht
index f64de3e65b0..297b822e70c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/selectors/attribute-value-selector-003.xht
@@ -14,9 +14,9 @@
}
</style>
</head>
- <body>
+ <body lang="en-us">
<p>Test passes if the first line of "Filler Text" below is black and the second one is green.</p>
<div class="t estDiv">Filler Text</div>
- <div class="t est">Filler Text</div>
+ <div class="t est" lang="fr-fr">Filler Text</div>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-001.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-001.xht
index d91015dda5e..6d8ec7ceba2 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-001.xht
@@ -6,6 +6,7 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/parsing/core-syntax/001.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors" />
<link rel="match" href="core-syntax-001-ref.xht"/>
+ <meta name="flags" content="invalid" />
<style type="text/css">
.test { color: green; }
.test { test { :nested; color: yellow; background: red; }: not-nested; text-decoration: underline; }
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-002.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-002.xht
index ead8ddc4b49..606b7aa9f43 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-002.xht
@@ -6,6 +6,7 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/parsing/core-syntax/002.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors" />
<link rel="match" href="core-syntax-002-ref.xht"/>
+ <meta name="flags" content="invalid" />
<style type="text/css">
.instruct { color: black; background: white; }
p {
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-003.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-003.xht
index b83afe43835..11c5675d773 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-003.xht
@@ -6,6 +6,7 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/parsing/core-syntax/003.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors" />
<link rel="match" href="../reference/ref-this-text-should-be-green.xht"/>
+ <meta name="flags" content="invalid" />
<style type="text/css">p{color:green;/*no"}"*/span{color:yellow;background:red;}.test{color:maroon;background:yellow;}}</style>
</head>
<body>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-004.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-004.xht
index 6950e203192..830017c7c58 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-004.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-004.xht
@@ -6,6 +6,7 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/parsing/core-syntax/002-demo.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors" />
<link rel="match" href="../reference/ref-this-text-should-be-green.xht"/>
+ <meta name="flags" content="invalid" />
<style type="text/css">
body { color : green ; p{color : red ; }
span { color : red ; }
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-006.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-006.xht
index 8f20cc16e93..eb5d380af0c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-006.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-006.xht
@@ -6,6 +6,7 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/parsing/core-syntax/006.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors" />
<link rel="match" href="core-syntax-006-ref.xht"/>
+ <meta name="flags" content="invalid" />
<style type="text/css">
body { color: green; }
p { background: red ! fail; color: yellow ! fail }
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-007.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-007.xht
index dda815f1625..b0d99e3729c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-007.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-007.xht
@@ -6,6 +6,7 @@
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/parsing/core-syntax/007.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors" />
<link rel="match" href="core-syntax-007-ref.xht"/>
+ <meta name="flags" content="invalid" />
<style type="text/css">
body { font-size: 200px; }
p { font-size: 16px; font-size: 200!invalid; }
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-008.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-008.xht
index 38a9391f17d..08e08c0e01e 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-008.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-008.xht
@@ -1,11 +1,12 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
- <title>CSS Test: Parsing invalid '!' declarations</title>
+ <title>CSS Test: Parsing invalid 'color' declarations</title>
<link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
<link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/parsing/core-syntax/008.html" type="text/html"/>
<link rel="help" href="http://www.w3.org/TR/CSS21/syndata.html#parsing-errors" />
<link rel="match" href="../reference/ref-this-text-should-be-green.xht"/>
+ <meta name="flags" content="invalid" />
<style type="text/css">
body { color: green; }
p { color: 1111ff; }
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-009.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-009.xht
index b147154a539..2ffa3e4b9a5 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-009.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/core-syntax-009.xht
@@ -7,6 +7,7 @@
<link rel="match" href="../reference/ref-this-text-should-be-green.xht"/>
<meta name="assert" content="Only the characters U+0020, U+0009, U+000A,
U+000D, and U+000C are considered white space."/>
+ <meta name="flags" content="invalid" />
<style type="text/css">
@import "support/core-syntax-009.css";
div&#x2003;p { color: red; }
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/signed-numbers-001.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/signed-numbers-001.xht
index 5f1c4ad9484..6c3c54779f4 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/signed-numbers-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/signed-numbers-001.xht
@@ -4,6 +4,7 @@
<title>CSS syntax: signed numbers</title>
<link rel="author" title="Bert Bos" href="mailto:bert@w3.org" />
<link rel="help" href="http://www.w3.org/TR/CSS22/syndata.html#numbers" />
+<link rel="help" href="http://www.w3.org/TR/CSS22/changes.html#s.4.3.1" />
<link rel="match" href="signed-numbers-001-ref.xht" />
<meta name="assert" content='Both integers and real numbers may immediately be preceded by a "-" or "+" to indicate the sign.' />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/syntax/signed-numbers-002.xht b/tests/wpt/web-platform-tests/css/CSS2/syntax/signed-numbers-002.xht
index 080f59a3c25..cf38d7aed68 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/syntax/signed-numbers-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/syntax/signed-numbers-002.xht
@@ -4,6 +4,7 @@
<title>CSS syntax: signed numbers</title>
<link rel="author" title="Bert Bos" href="mailto:bert@w3.org" />
<link rel="help" href="http://www.w3.org/TR/CSS22/syndata.html#numbers" />
+<link rel="help" href="http://www.w3.org/TR/CSS22/changes.html#s.4.3.1" />
<link rel="match" href="signed-numbers-001-ref.xht" />
<meta name="assert" content='Both integers and real numbers may immediately be preceded by a "-" or "+" to indicate the sign.' />
<style type="text/css">
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/reference/table-anonymous-border-spacing-ref.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/reference/table-anonymous-border-spacing-ref.xht
new file mode 100644
index 00000000000..ab82821d665
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/reference/table-anonymous-border-spacing-ref.xht
@@ -0,0 +1,16 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <style><![CDATA[
+ #target { border-spacing: 20px; }
+ #target > * { display: table-cell; border: 1px solid black; }
+ ]]></style>
+ </head>
+<body>
+ <p>There should be 20px border-spacing in the table below.</p>
+ <div id="target">
+ <div>First cell</div>
+ <div>Second cell</div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/reference/table-anonymous-text-indent-ref.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/reference/table-anonymous-text-indent-ref.xht
new file mode 100644
index 00000000000..08cffbf3cc5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/reference/table-anonymous-text-indent-ref.xht
@@ -0,0 +1,16 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <style><![CDATA[
+ #target { text-indent: 20px; display: table; }
+ #target > * { display: table-cell; border: 1px solid black; }
+ ]]></style>
+ </head>
+<body>
+ <p>There should be 20px text-indent in the table below.</p>
+ <div id="target">
+ <div>First cell</div>
+ Second cell (no element on purpose)
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/table-anonymous-border-spacing.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/table-anonymous-border-spacing.xht
new file mode 100644
index 00000000000..d2c1bf8bd24
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/table-anonymous-border-spacing.xht
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu"/>
+ <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#anonymous-boxes"/>
+ <link rel="match" href="reference/table-anonymous-border-spacing-ref.xht"/>
+ <meta name="flags" content='dom'/>
+ <script type="text/javascript"><![CDATA[
+ function doTest() {
+ var t = document.getElementById("target");
+ t.style.borderSpacing = '20px';
+ }
+ ]]></script>
+ <style><![CDATA[
+ #target { border-spacing: 0; }
+ #target > * { display: table-cell; border: 1px solid black; }
+ ]]></style>
+ </head>
+<body onload="doTest()">
+ <p>There should be 20px border-spacing in the table below.</p>
+ <div id="target">
+ <div>First cell</div>
+ <div>Second cell</div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/tables/table-anonymous-text-indent.xht b/tests/wpt/web-platform-tests/css/CSS2/tables/table-anonymous-text-indent.xht
new file mode 100644
index 00000000000..1364f79033c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/CSS2/tables/table-anonymous-text-indent.xht
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu"/>
+ <link rel="help" href="http://www.w3.org/TR/CSS21/tables.html#anonymous-boxes"/>
+ <link rel="match" href="reference/table-anonymous-text-indent-ref.xht"/>
+ <meta name="flags" content='dom'/>
+ <script type="text/javascript"><![CDATA[
+ function doTest() {
+ var t = document.getElementById("target");
+ t.style.textIndent = '20px';
+ }
+ ]]></script>
+ <style><![CDATA[
+ #target { text-indent: 0; display: table; }
+ #target > * { display: table-cell; border: 1px solid black; }
+ ]]></style>
+</head>
+<body onload="doTest()">
+ <p>There should be 20px text-indent in the table below.</p>
+ <div id="target">
+ <div>First cell</div>
+ Second cell (no element on purpose)
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-001.xht b/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-001.xht
index 4f269e6bb0c..6db781c9b94 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-001.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#position-props" title="9.3.2 Box offsets: 'top', 'right', 'bottom', 'left'" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" title="6.2.1 The 'inherit' value" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta content="image" name="flags" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-002.xht b/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-002.xht
index 962ac7b2795..1860e76ebc7 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-002.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-002.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#position-props" title="9.3.2 Box offsets: 'top', 'right', 'bottom', 'left'" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" title="6.2.1 The 'inherit' value" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta content="image" name="flags" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-003.xht b/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-003.xht
index 2aad6a18483..32533df5e6c 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-003.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/visuren/inherit-static-offset-003.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#position-props" title="9.3.2 Box offsets: 'top', 'right', 'bottom', 'left'" />
<link rel="help" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" title="6.2.1 The 'inherit' value" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta content="image" name="flags" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht b/tests/wpt/web-platform-tests/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht
index 9a8b17d7a5c..879fc7d1e99 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/visuren/position-absolute-percentage-inherit-001.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" title="9.3.2 Box offsets: 'top', 'right', 'bottom', 'left'" href="http://www.w3.org/TR/CSS21/visuren.html#position-props" />
<link rel="help" title="6.2.1 The 'inherit' value" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="help" title="4.3.2 Length" href="http://www.w3.org/TR/CSS21/syndata.html#length-units" />
<link rel="match" href="position-absolute-percentage-inherit-001-ref.xht" />
diff --git a/tests/wpt/web-platform-tests/css/CSS2/visuren/top-114.xht b/tests/wpt/web-platform-tests/css/CSS2/visuren/top-114.xht
index a6eb44fceb4..a17b7cfbae7 100644
--- a/tests/wpt/web-platform-tests/css/CSS2/visuren/top-114.xht
+++ b/tests/wpt/web-platform-tests/css/CSS2/visuren/top-114.xht
@@ -9,6 +9,8 @@
<link rel="author" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" />
<link rel="help" title="9.3.2 Box offsets: 'top', 'right', 'bottom', 'left'" href="http://www.w3.org/TR/CSS21/visuren.html#position-props" />
<link rel="help" title="6.2.1 The 'inherit' value" href="http://www.w3.org/TR/CSS21/cascade.html#value-def-inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-3/#inherit" />
+ <link rel="help" href="http://www.w3.org/TR/css-cascade-4/#inherit" />
<link rel="match" href="top-114-ref.xht" />
<meta content="" name="flags" />
diff --git a/tests/wpt/web-platform-tests/css/build-css-testsuites.sh b/tests/wpt/web-platform-tests/css/build-css-testsuites.sh
index fe172166ae7..cbe38b76e16 100755
--- a/tests/wpt/web-platform-tests/css/build-css-testsuites.sh
+++ b/tests/wpt/web-platform-tests/css/build-css-testsuites.sh
@@ -1,49 +1,57 @@
#!/usr/bin/env sh
set -ex
-cd "`dirname $0`"
-
-if [ -z $VENV ]; then
- VENV=tools/_virtualenv
-fi
-
-# Create the virtualenv
-if [ ! -d $VENV ]; then
- if [ -z $PYTHON ]; then
- command -v python
- if [ $? -eq 0 ]; then
- if [ `python -c 'import sys; print(sys.version[0:3])'` == "2.7" ]; then
- PYTHON=python
+SCRIPT_DIR=$(dirname $(readlink -f "$0"))
+WPT_ROOT=$(readlink -f $SCRIPT_DIR/../..)
+cd $WPT_ROOT
+
+main() {
+ cd css
+
+ if [ -z $VENV ]; then
+ VENV=tools/_virtualenv
+ fi
+
+ # Create the virtualenv
+ if [ ! -d $VENV ]; then
+ if [ -z $PYTHON ]; then
+ command -v python
+ if [ $? -eq 0 ]; then
+ if [ `python -c 'import sys; print(sys.version[0:3])'` == "2.7" ]; then
+ PYTHON=python
+ fi
fi
fi
- fi
- if [ -z $PYTHON ]; then
- command -v python2
- if [ $? -eq 0 ]; then
- PYTHON=python2
+ if [ -z $PYTHON ]; then
+ command -v python2
+ if [ $? -eq 0 ]; then
+ PYTHON=python2
+ fi
+ fi
+
+ if [ -z $PYTHON ]; then
+ echo "Please ensure Python 2.7 is installed"
+ exit 1
fi
- fi
- if [ -z $PYTHON ]; then
- echo "Please ensure Python 2.7 is installed"
- exit 1
+ virtualenv -p $PYTHON $VENV || { echo "Please ensure virtualenv is installed"; exit 2; }
fi
- virtualenv -p $PYTHON $VENV || { echo "Please ensure virtualenv is installed"; exit 2; }
-fi
+ # Install dependencies
+ $VENV/bin/pip install -r requirements.txt
-# Install dependencies
-$VENV/bin/pip install -r requirements.txt
+ # Fetch hg submodules if they're not there
+ if [ ! -d tools/apiclient ]; then
+ $VENV/bin/hg clone https://hg.csswg.org/dev/apiclient tools/apiclient
+ fi
-# Fetch hg submodules if they're not there
-if [ ! -d tools/apiclient ]; then
- $VENV/bin/hg clone https://hg.csswg.org/dev/apiclient tools/apiclient
-fi
+ if [ ! -d tools/w3ctestlib ]; then
+ $VENV/bin/hg clone https://hg.csswg.org/dev/w3ctestlib tools/w3ctestlib
+ fi
-if [ ! -d tools/w3ctestlib ]; then
- $VENV/bin/hg clone https://hg.csswg.org/dev/w3ctestlib tools/w3ctestlib
-fi
+ # Run the build script
+ $VENV/bin/python tools/build.py "$@"
+}
-# Run the build script
-$VENV/bin/python tools/build.py "$@"
+main
diff --git a/tests/wpt/web-platform-tests/css/css-align-3/default-alignment/justify-items-legacy-001.html b/tests/wpt/web-platform-tests/css/css-align-3/default-alignment/justify-items-legacy-001.html
new file mode 100644
index 00000000000..c4164d2b258
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-align-3/default-alignment/justify-items-legacy-001.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>CSS Box Alignment: legacy value for justify-items</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="help" href="https://drafts.csswg.org/css-align/#justify-items-property">
+<meta name="assert" content="Tests that legacy justify-items values are correctly inherited.">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<style>
+#container {
+ justify-items: legacy center;
+}
+</style>
+<div id="container"><span id="child"></span></div>
+<script>
+ test(function() {
+ assert_equals(getComputedStyle(child).justifyItems, "legacy center",
+ "default justify-items resolves to the parent justify-items value if legacy")
+ container.style.justifyItems = "legacy left";
+ assert_equals(getComputedStyle(child).justifyItems, "legacy left",
+ "dynamic changes to justify-items propagate to children if needed (legacy)")
+ container.style.justifyItems = "left";
+ assert_equals(getComputedStyle(child).justifyItems, "normal",
+ "dynamic changes to justify-items propagate to children if needed (left)")
+ }, "legacy value for justify-items")
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds-3/background-clip-content-box-001.html b/tests/wpt/web-platform-tests/css/css-backgrounds-3/background-clip-content-box-001.html
index 162533b09b5..a3b8436a7ac 100644
--- a/tests/wpt/web-platform-tests/css/css-backgrounds-3/background-clip-content-box-001.html
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds-3/background-clip-content-box-001.html
@@ -28,7 +28,7 @@
</style>
</head>
<body>
- <p>Test pass if the green box has a 10px width red edge</p>
+ <p>Test pass if the green box has a 10px width blue edge</p>
<!-- background -->
<div id="test-color-blue"></div>
<div id="test-color-green"></div>
diff --git a/tests/wpt/web-platform-tests/css/css-backgrounds-3/reference/background-clip-content-box-ref.html b/tests/wpt/web-platform-tests/css/css-backgrounds-3/reference/background-clip-content-box-ref.html
index f00477f4a89..133e57a2d24 100644
--- a/tests/wpt/web-platform-tests/css/css-backgrounds-3/reference/background-clip-content-box-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-backgrounds-3/reference/background-clip-content-box-ref.html
@@ -10,12 +10,12 @@
width: 180px;
height: 180px;
background-color: rgba(0, 255, 0, 1);
- border: 10px solid rgba(255, 0, 0, 1);
+ border: 10px solid blue;
}
</style>
</head>
<body>
- <p>Test pass if the green box has a 10px width red edge</p>
+ <p>Test pass if the green box has a 10px width blue edge</p>
<!-- background -->
<div id="test-color-box"></div>
</body>
diff --git a/tests/wpt/web-platform-tests/css/css-counter-styles-3/i18n/OWNERS b/tests/wpt/web-platform-tests/css/css-counter-styles-3/i18n/OWNERS
new file mode 100644
index 00000000000..30ef550185b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-counter-styles-3/i18n/OWNERS
@@ -0,0 +1 @@
+@r12a
diff --git a/tests/wpt/web-platform-tests/css/css-counter-styles-3/i18n/css3-counter-styles-070.html b/tests/wpt/web-platform-tests/css/css-counter-styles-3/i18n/css3-counter-styles-070.html
index f0c319e589b..0fe403c962c 100644
--- a/tests/wpt/web-platform-tests/css/css-counter-styles-3/i18n/css3-counter-styles-070.html
+++ b/tests/wpt/web-platform-tests/css/css-counter-styles-3/i18n/css3-counter-styles-070.html
@@ -20,7 +20,7 @@ ol li { list-style-type: ethiopic-numeric; }
<div class='test'>
<ol start='1'>
- <li title='1'>፩.</li>
+ <li title='1'>፩/ </li>
</ol>
</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/auto-margins-001-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/auto-margins-001-ref.html
new file mode 100644
index 00000000000..04f32f5d798
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/auto-margins-001-ref.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<style>
+
+#circles, #circles div {
+ border: 1em solid blue;
+ border-radius:50%;
+ margin: auto;
+}
+
+#circles { width:9em; height:9em; }
+
+</style>
+</head>
+<body>
+<p>These tests are from the spec: <a href="http://dev.w3.org/csswg/css3-flexbox/#auto-margins">http://dev.w3.org/csswg/css3-flexbox/#auto-margins</a>.</p>
+
+<p>The word OK should be centered vertically and horizontally.</p>
+<div style="width: 4em; height: 4em; background: silver">
+ <table style="width: 100%; height: 100%;"><tr><td style="text-align: center">OK</td></tr></table>
+</div>
+
+<div style="width: 4em; height: 4em; margin-top: 10px; background: silver; writing-mode: vertical-rl">
+ <table style="width: 100%; height: 100%;"><tr><td style="text-align: center">OK</td></tr></table>
+</div>
+
+<p>You should see 3 blue concentric circles.</p>
+<div id="circles">
+ <div style="width: 5em; height: 5em; margin-top: 1em;">
+ <div style="width: 1em; height: 1em; margin-top: 1em;"></div>
+ </div>
+</div>
+
+<p>The computed style of each margin should not be 0.<br>OK: PASS<br>Vertical OK: PASS</p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/auto-margins-001.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/auto-margins-001.html
new file mode 100644
index 00000000000..3a90ef2be84
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/auto-margins-001.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>CSS Test: Aligning with auto margins</title>
+<link href="support/flexbox.css" rel="stylesheet">
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#auto-margins">
+<link rel="match" href="auto-margins-001-ref.html">
+<meta name="flags" content="">
+<style>
+
+#circles, #circles div {
+ display: flex;
+ width: -webkit-calc(100% - 4em);
+ width: calc(100% - 4em);
+ height: -webkit-calc(100% - 4em);
+ height: calc(100% - 4em);
+ border: 1em solid blue;
+ border-radius:50%;
+ margin: auto;
+}
+
+#circles { width:9em; height:9em; }
+
+</style>
+</head>
+<body>
+<p>These tests are from the spec: <a href="http://dev.w3.org/csswg/css3-flexbox/#auto-margins">http://dev.w3.org/csswg/css3-flexbox/#auto-margins</a>.</p>
+
+<p>The word OK should be centered vertically and horizontally.</p>
+<div class="flexbox" style="width: 4em; height: 4em; background: silver">
+ <p id="ok" style="margin: auto;">OK</p>
+</div>
+
+<div class="flexbox" style="width: 4em; height: 4em; margin-top: 10px; background: silver; writing-mode: vertical-rl">
+ <p id="okVertical" style="margin: auto;">OK</p>
+</div>
+
+<p>You should see 3 blue concentric circles.</p>
+<div id="circles"><div><div></div></div></div>
+
+<p id="log">The computed style of each margin should not be 0.</p>
+<script>
+var okStyle = getComputedStyle(document.getElementById('ok'));
+document.getElementById("log").innerHTML += "<br>OK: " +
+ ((parseInt(okStyle.marginTop) && parseInt(okStyle.marginRight) && parseInt(okStyle.marginBottom) && parseInt(okStyle.marginLeft)) ? "PASS" : "FAIL");
+
+var okVerticalStyle = getComputedStyle(document.getElementById('okVertical'));
+document.getElementById("log").innerHTML += "<br>Vertical OK: " +
+ ((parseInt(okVerticalStyle.marginTop) && parseInt(okVerticalStyle.marginRight) && parseInt(okVerticalStyle.marginBottom) && parseInt(okVerticalStyle.marginLeft)) ? "PASS" : "FAIL");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/negative-margins-001.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/negative-margins-001.html
index 85460727cdf..851c75fd4d4 100644
--- a/tests/wpt/web-platform-tests/css/css-flexbox-1/negative-margins-001.html
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/negative-margins-001.html
@@ -4,7 +4,8 @@
<link rel="author" title="Google Inc." href="https://www.google.com/">
<link rel="help" href="http://www.w3.org/TR/css-flexbox-1/#item-margins">
<link rel="match" href="reference/negative-margins-001-ref.html">
-<meta name="assert" content="Negative margins get floored at zero for intrinsic size computations">
+<meta name="assert" content="Tests that for intrinsic size computations,
+an item will not take up less than zero space even with negative margins.">
<style>
.container {
width: 60px;
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-001.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-001.html
new file mode 100644
index 00000000000..f24eee9eccf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-001.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html>
+
+<title>CSS Flexbox: Definite cross sizes</title>
+
+<link rel="stylesheet" href="support/flexbox.css">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#definite-sizes">
+<link rel="author" title="Google Inc." href="https://www.google.com/">
+<meta name="flags" content="dom" />
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/check-layout-th.js"></script>
+
+<style>
+.rect {
+ width: 50px;
+ height: 50px;
+ background-color: blue;
+}
+
+.flexbox {
+ width: 50px;
+ outline: 3px solid black;
+}
+
+
+.flexbox > * {
+ min-height: 0;
+ min-width: 0;
+}
+
+.flexbox > div > div {
+ overflow: hidden;
+}
+</style>
+
+<body onload="checkLayout('.flexbox')" style="height: 800px;">
+<div id=log></div>
+
+
+<p>This test verifies that we consider flex items' cross sizes to be definite
+if the align value is stretch (the default)</p>
+
+<p>Tests that we get a definite size in the simple case:</p>
+<div class="flexbox" data-expected-height="50">
+ <div data-expected-height="50">
+ <div style="height: 50%" data-expected-height="25">
+ <div class="rect" data-expected-height="50"></div>
+ </div>
+ </div>
+</div>
+
+<p>Tests that we get a definite size in a wrapping flexbox:</p>
+<div class="flexbox wrap" data-expected-height="50">
+ <div data-expected-height="50">
+ <div style="height: 50%" data-expected-height="25">
+ <div class="rect" data-expected-height="50"></div>
+ </div>
+ </div>
+</div>
+
+<p>Tests that we get an indefinite size when not stretch-aligning, despite
+definite size on container:</p>
+<div class="flexbox wrap" style="height: 50px;" data-expected-height="50">
+ <div class="align-self-flex-start" data-expected-height="50">
+ <div style="height: 50%" data-expected-height="50">
+ <div class="rect" data-expected-height="50"></div>
+ </div>
+ </div>
+</div>
+
+<p>Tests that we get a definite size in a definite-height flexbox:</p>
+<div class="flexbox" style="height: 50px;" data-expected-height="50">
+ <div data-expected-height="50">
+ <div style="height: 50%" data-expected-height="25">
+ <div class="rect" data-expected-height="50"></div>
+ </div>
+ </div>
+</div>
+
+<p>Tests that we get a definite size in a nested flexbox where only the outer
+one has an explicit height:</p>
+<div class="flexbox" style="height: 50px;" data-expected-height="50">
+ <div class="flexbox" data-expected-height="50">
+ <div data-expected-height="50">
+ <div style="height: 50%" data-expected-height="25">
+ <div class="rect" data-expected-height="50"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<p>Tests that we get a definite size in a nested flexbox where only the outer
+one has an explicit height and has an opposite direction:</p>
+<div class="flexbox" style="height: 50px;" data-expected-height="50">
+ <div class="flexbox column" data-expected-height="50">
+ <div class="flex-one" data-expected-height="50">
+ <div style="height: 50%" data-expected-height="25">
+ <div class="rect" data-expected-height="50"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<p>Tests that we respect min-height, on child of a flex item with percent
+height that's treated as definite:</p>
+<div class="flexbox" style="height: 50px;" data-expected-height="50">
+ <div data-expected-height="50">
+ <div style="height: 50%; min-height: 30px;" data-expected-height="30">
+ <div class="rect" data-expected-height="50"></div>
+ </div>
+ </div>
+</div>
+
+<p>Tests that max-height also supports percentages:</p>
+<div class="flexbox" data-expected-height="50">
+ <div data-expected-height="50">
+ <div style="max-height: 50%" data-expected-height="25">
+ <div class="rect" data-expected-height="50"></div>
+ </div>
+ </div>
+</div>
+
+<p>Tests that percentage sizes can also be definite:</p>
+<div class="flexbox" style="height: 10%;" data-expected-height="80">
+ <div data-expected-height="80">
+ <div style="height: 50%" data-expected-height="40">
+ <div class="rect" data-expected-height="50"></div>
+ </div>
+ </div>
+</div>
+
+<p>Tests that we use a definite size even when a percentage size is not definite</p>
+<div>
+ <div class="flexbox" style="height: 10%;" data-expected-height="50">
+ <div data-expected-height="50">
+ <div style="height: 50%" data-expected-height="25">
+ <div class="rect" data-expected-height="50"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<p>Tests that we don't mix up widths and heights</p>
+<div class="flexbox" style="height: 50px; width: 100px;" data-expected-height="50">
+ <div style="width: 100px;" data-expected-height="50" data-expected-width="100">
+ <div style="width: 50%" data-expected-width="50">
+ <div class="rect" data-expected-height="50" data-expected-width="50"></div>
+ </div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-002-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-002-ref.html
new file mode 100644
index 00000000000..55ec381d23f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-002-ref.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<style>
+body {
+ position: relative;
+ width: 800px;
+ height: 600px;
+}
+
+#container {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+}
+
+#top-bar {
+ background-color: green;
+ height: 100px;
+}
+
+#content {
+ background-color: blue;
+ height: 500px;
+}
+</style>
+
+
+<div id="container">
+ <div id="top-bar">
+ Tests that percentage heights get resolved correctly when the flexbox is
+ </div>
+ <div id="content">
+ absolutely positioned without an explicit height. You should see no red.
+ </div>
+</div>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-002.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-002.html
new file mode 100644
index 00000000000..cfdf5be2ff5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-heights-002.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>CSS Test: Percentage sizing in flexboxes</title>
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#definite-sizes">
+<link rel="match" href="percentage-heights-002-ref.html">
+<meta name="assert" content="Checks that we correctly size percentage-sized
+children of absolute-positioned flex boxes">
+<style>
+body {
+ position: relative;
+ width: 800px;
+ height: 600px;
+}
+
+#container {
+ background-color: red;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ display: flex;
+ flex-direction: column;
+}
+
+#top-bar {
+ background-color: green;
+ height: 20%;
+}
+
+#content {
+ background-color: blue;
+ flex-basis: 100%;
+}
+</style>
+
+
+<div id="container">
+ <div id="top-bar">
+ Tests that percentage heights get resolved correctly when the flexbox is
+ </div>
+ <div id="content">
+ absolutely positioned without an explicit height. You should see no red.
+ </div>
+</div>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-widths-001-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-widths-001-ref.html
new file mode 100644
index 00000000000..ca0c4d9b2a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-widths-001-ref.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<style>
+body {
+ position: relative;
+ width: 600px;
+ height: 800px;
+}
+
+#container {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ display: flex;
+}
+
+#top-bar {
+ background-color: green;
+ width: 100px;
+}
+
+#content {
+ background-color: blue;
+ width: 500px;
+}
+</style>
+
+
+<div id="container">
+ <div id="top-bar">
+ Tests that percentage widths get resolved correctly when the flexbox is
+ </div>
+ <div id="content">
+ absolutely positioned without an explicit width. You should see no red.
+ </div>
+</div>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-widths-001.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-widths-001.html
new file mode 100644
index 00000000000..b1b5acff629
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/percentage-widths-001.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>CSS Test: Absolutely positioned children of flexboxes</title>
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#definite-sizes">
+<link rel="match" href="percentage-widths-001-ref.html">
+<meta name="assert" content="Checks that we correctly size percentage-sized
+children of absolute-positioned flex boxes">
+<style>
+body {
+ position: relative;
+ width: 600px;
+ height: 800px;
+}
+
+#container {
+ background-color: red;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ display: flex;
+ flex-direction: row;
+}
+
+#top-bar {
+ background-color: green;
+ width: 20%;
+}
+
+#content {
+ background-color: blue;
+ flex-basis: 100%;
+}
+</style>
+
+
+<div id="container">
+ <div id="top-bar">
+ Tests that percentage widths get resolved correctly when the flexbox is
+ </div>
+ <div id="content">
+ absolutely positioned without an explicit width. You should see no red.
+ </div>
+</div>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-001.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-001.html
new file mode 100644
index 00000000000..d3d808940e5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-001.html
@@ -0,0 +1,709 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Test: Absolutely positioned children of flexboxes</title>
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items">
+<meta name="flags" content="dom">
+<meta name="assert" content="Checks that we correctly position abspos children
+in a number of writing modes and alignments">
+<style>
+body {
+ margin: 0;
+}
+
+.title {
+ margin-top: 1em;
+}
+
+.flexbox {
+ display: flex;
+ background-color: #aaa;
+ position: relative;
+}
+.flexbox div {
+ border: 0;
+ flex: none;
+}
+
+.horizontal-tb {
+ writing-mode: horizontal-tb;
+}
+.vertical-rl {
+ writing-mode: vertical-rl;
+}
+.vertical-lr {
+ writing-mode: vertical-lr;
+}
+
+.row {
+ flex-flow: row;
+}
+.row-reverse {
+ flex-flow: row-reverse;
+}
+.column {
+ flex-flow: column;
+}
+.column-reverse {
+ flex-flow: column-reverse;
+}
+
+.flexbox :nth-child(1) {
+ background-color: blue;
+}
+.flexbox :nth-child(2) {
+ background-color: green;
+}
+
+.rtl {
+ direction: rtl;
+}
+.ltr {
+ direction: ltr;
+}
+
+.justify-content-flex-start {
+ justify-content: flex-start;
+}
+.justify-content-flex-end {
+ justify-content: flex-end;
+}
+.justify-content-center {
+ justify-content: center;
+}
+.justify-content-space-between {
+ justify-content: space-between;
+}
+.justify-content-space-around {
+ justify-content: space-around;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/check-layout-th.js"></script>
+<body onload="checkLayout('.flexbox')">
+<div id=log></div>
+<script>
+// Each flexbox has two abspos children - one is 40x10, the other 10x20.
+// The flexbox itself is 80x20.
+// All that is flipped for vertical flows.
+var expectations = {
+ 'horizontal-tb': {
+ 'row': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'center': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'flex-end': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ },
+ },
+ 'column': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [0, 40],
+ 'child2': [0, 70],
+ },
+ 'center': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [10, 0],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [10, 40],
+ 'child2': [0, 70],
+ },
+ 'center': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [10, 0],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ },
+ },
+ 'row-reverse': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'flex-end': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'center': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ },
+ },
+ 'column-reverse': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [0, 40],
+ 'child2': [0, 70],
+ },
+ 'flex-end': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [0, 40],
+ 'child2': [0, 70],
+ },
+ 'space-around': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [10, 40],
+ 'child2': [0, 70],
+ },
+ 'flex-end': {
+ 'child1': [10, 0],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [10, 40],
+ 'child2': [0, 70],
+ },
+ 'space-around': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ },
+ },
+ },
+ 'vertical-rl': {
+ 'row': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [10, 0],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [10, 40],
+ 'child2': [0, 70],
+ },
+ 'center': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [10, 0],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [10, 40],
+ 'child2': [0, 70],
+ },
+ 'flex-end': {
+ 'child1': [10, 0],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [10, 40],
+ 'child2': [0, 70],
+ },
+ 'space-around': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ },
+ },
+ 'column': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'flex-end': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [40, 10],
+ 'child2': [70, 0],
+ },
+ 'flex-end': {
+ 'child1': [0, 10],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [20, 10],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [40, 10],
+ 'child2': [70, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 10],
+ 'child2': [35, 0],
+ },
+ },
+ },
+ 'row-reverse': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [10, 40],
+ 'child2': [0, 70],
+ },
+ 'flex-end': {
+ 'child1': [10, 0],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [10, 40],
+ 'child2': [0, 70],
+ },
+ 'space-around': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [10, 0],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [10, 40],
+ 'child2': [0, 70],
+ },
+ 'center': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [10, 0],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [10, 20],
+ 'child2': [0, 35],
+ },
+ },
+ },
+ 'column-reverse': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'center': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [0, 10],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [40, 10],
+ 'child2': [70, 0],
+ },
+ 'center': {
+ 'child1': [20, 10],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [0, 10],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 10],
+ 'child2': [35, 0],
+ },
+ },
+ },
+ },
+ 'vertical-lr': {
+ 'row': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [0, 40],
+ 'child2': [0, 70],
+ },
+ 'center': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [0, 40],
+ 'child2': [0, 70],
+ },
+ 'flex-end': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [0, 40],
+ 'child2': [0, 70],
+ },
+ 'space-around': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ },
+ },
+ 'column': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'center': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [0, 10],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [40, 10],
+ 'child2': [70, 0],
+ },
+ 'center': {
+ 'child1': [20, 10],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [0, 10],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 10],
+ 'child2': [35, 0],
+ },
+ },
+ },
+ 'row-reverse': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [0, 40],
+ 'child2': [0, 70],
+ },
+ 'flex-end': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [0, 40],
+ 'child2': [0, 70],
+ },
+ 'space-around': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'flex-end': {
+ 'child1': [0, 40],
+ 'child2': [0, 70],
+ },
+ 'center': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ 'space-between': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'space-around': {
+ 'child1': [0, 20],
+ 'child2': [0, 35],
+ },
+ },
+ },
+ 'column-reverse': {
+ 'ltr': {
+ 'flex-start': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'flex-end': {
+ 'child1': [0, 0],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [40, 0],
+ 'child2': [70, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 0],
+ 'child2': [35, 0],
+ },
+ },
+ 'rtl': {
+ 'flex-start': {
+ 'child1': [40, 10],
+ 'child2': [70, 0],
+ },
+ 'flex-end': {
+ 'child1': [0, 10],
+ 'child2': [0, 0],
+ },
+ 'center': {
+ 'child1': [20, 10],
+ 'child2': [35, 0],
+ },
+ 'space-between': {
+ 'child1': [40, 10],
+ 'child2': [70, 0],
+ },
+ 'space-around': {
+ 'child1': [20, 10],
+ 'child2': [35, 0],
+ },
+ },
+ },
+ },
+};
+
+var writingModes = ['horizontal-tb', 'vertical-rl', 'vertical-lr'];
+var flexDirections = ['row', 'column', 'row-reverse', 'column-reverse'];
+var directions = ['ltr', 'rtl'];
+var justifyContents = ['flex-start', 'flex-end', 'center', 'space-between', 'space-around'];
+
+function mainAxisDirection(writingMode, flexDirection)
+{
+ if ((writingMode.indexOf('horizontal') != -1 && flexDirection.indexOf('row') != -1)
+ || (writingMode.indexOf('vertical') != -1 && flexDirection.indexOf('column') != -1))
+ return 'width';
+ return 'height';
+}
+
+function addChild(flexbox, mainAxis, crossAxis, mainAxisLength, crossAxisLength, expectations)
+{
+ var child = document.createElement('div');
+ child.setAttribute('style', mainAxis + ': ' + mainAxisLength + 'px;'
+ + crossAxis + ': ' + crossAxisLength + 'px; position: absolute;');
+
+ child.setAttribute("data-expected-" + mainAxis, mainAxisLength);
+ child.setAttribute("data-expected-" + crossAxis, crossAxisLength);
+ child.setAttribute("data-offset-x", expectations[0]);
+ child.setAttribute("data-offset-y", expectations[1]);
+
+ flexbox.appendChild(child);
+}
+
+writingModes.forEach(function(writingMode) {
+ flexDirections.forEach(function(flexDirection) {
+ directions.forEach(function(direction) {
+ justifyContents.forEach(function(justifyContent) {
+ var flexboxClassName = writingMode + ' ' + direction + ' ' + flexDirection + ' justify-content-' + justifyContent;
+ var title = document.createElement('div');
+ title.className = 'title';
+ title.innerHTML = flexboxClassName;
+ document.body.appendChild(title);
+
+ var mainAxis = mainAxisDirection(writingMode, flexDirection);
+ var crossAxis = (mainAxis == 'width') ? 'height' : 'width';
+
+ var flexbox = document.createElement('div');
+ flexbox.className = 'flexbox ' + flexboxClassName;
+ flexbox.setAttribute('style', mainAxis + ': 80px;' + crossAxis + ': 20px');
+
+ var baselineMargin = (flexDirection.indexOf('row') != -1) ? '-webkit-margin-before: 5px' : '-webkit-margin-start: 5px';
+
+ var testExpectations = expectations[writingMode][flexDirection][direction][justifyContent];
+ addChild(flexbox, mainAxis, crossAxis, 40, 10, testExpectations['child1']);
+ addChild(flexbox, mainAxis, crossAxis, 10, 20, testExpectations['child2']);
+
+ document.body.appendChild(flexbox);
+ })
+ })
+ })
+})
+
+</script>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-002.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-002.html
new file mode 100644
index 00000000000..bf69765323e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-002.html
@@ -0,0 +1,160 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Test: Absolutely positioned children of flexboxes</title>
+<link href="support/flexbox.css" rel="stylesheet">
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items">
+<meta name="flags" content="dom">
+<meta name="assert" content="Checks that we correctly position abspos children
+with different alignments and dynamic changes">
+<style>
+body {
+ margin: 0;
+}
+.flexbox {
+ background-color: green;
+ height: 100px;
+ width: 100px;
+ margin: 10px;
+}
+.flexbox > * {
+ flex: none;
+}
+.relative {
+ position: relative;
+}
+.flexbox > div {
+ width: 20px;
+ height: 20px;
+}
+.absolute {
+ position: absolute;
+}
+#placed-absolute {
+ top: 20px;
+ left: 20px;
+}
+
+.rtl {
+ direction: rtl;
+}
+.ltr {
+ direction: ltr;
+}
+
+.flexbox :nth-child(1) {
+ background-color: blue;
+}
+.flexbox :nth-child(2) {
+ background-color: yellow;
+}
+.flexbox :nth-child(3) {
+ background-color: salmon;
+}
+.flexbox :nth-child(4) {
+ background-color: grey;
+}
+.flexbox :nth-child(5) {
+ background-color: red;
+}
+.flexbox :nth-child(6) {
+ background-color: orange;
+}
+.flexbox :nth-child(7) {
+ background-color: purple;
+}
+</style>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.flexbox')">
+<div id=log></div>
+
+<div class='flexbox relative align-items-center'>
+ <div id='placed-absolute' class='absolute' data-offset-x=20 data-offset-y=20></div>
+</div>
+
+<div class='flexbox relative align-items-center'>
+ <div data-offset-x=0 data-offset-y=40></div>
+ <div class='absolute' data-offset-x=0 data-offset-y=40></div>
+ <div data-offset-x=20 data-offset-y=40></div>
+ <div class="absolute" style="top: 5px; left: 5px" data-offset-x=5 data-offset-y=5></div>
+</div>
+
+<div class="relative">
+<div class='flexbox align-items-center'>
+ <div data-offset-x=10 data-offset-y=40></div>
+ <div class='absolute' data-offset-x=10 data-offset-y=40></div>
+ <div data-offset-x=30 data-offset-y=40></div>
+ <div class="absolute" style="top: 5px; left: 5px" data-offset-x=5 data-offset-y=5></div>
+</div>
+</div>
+
+<div class='flexbox relative column rtl'>
+ <div data-offset-x=80 data-offset-y=0></div>
+ <div class='absolute' data-offset-x=80 data-offset-y=0></div>
+ <div data-offset-x=80 data-offset-y=20></div>
+ <div class="absolute" style="top: 5px; left: 5px" data-offset-x=5 data-offset-y=5></div>
+</div>
+
+<div class="relative">
+<div class='flexbox wrap-reverse'>
+ <div style="width:90px" data-offset-x=10 data-offset-y=80></div>
+ <div class="absolute" data-offset-x=10 data-offset-y=80></div>
+ <div data-offset-x=10 data-offset-y=30></div>
+ <div class="absolute" data-offset-x=10 data-offset-y=80></div>
+ <div data-offset-x=30 data-offset-y=30></div>
+ <div class="absolute" data-offset-x=10 data-offset-y=80></div>
+ <div class="absolute" style="top: 5px; left: 5px" data-offset-x=5 data-offset-y=5></div>
+</div>
+</div>
+
+<div class='flexbox relative'>
+ <div style="margin: auto;" data-offset-x=40 data-offset-y=40></div>
+ <div class="absolute" style="margin: auto;" data-offset-x=0 data-offset-y=0></div>
+ <div class="absolute" style="margin: auto;" data-offset-x=0 data-offset-y=0></div>
+ <div class="absolute" style="margin: auto; top: 5px; left: 5px" data-offset-x=5 data-offset-y=5></div>
+</div>
+
+<div class='flexbox align-items-stretch relative'>
+ <div style="height: auto" data-offset-x=0 data-offset-y=0 data-expected-height=100></div>
+ <div class="absolute" style="height: auto" data-offset-x=0 data-offset-y=0 data-expected-height=0></div>
+ <div class="absolute" style="height: auto; top: 5px; left: 5px" data-offset-x=5 data-offset-y=5 data-expected-height=0></div>
+</div>
+
+<div class="flexbox wrap relative">
+ <div style="width: 100px;" data-offset-x=0 data-offset-y=0></div>
+ <div class="absolute" data-offset-x=0 data-offset-y=0></div>
+ <div style="width: 50px;" data-offset-x=0 data-offset-y=50></div>
+ <div class="absolute" data-offset-x=0 data-offset-y=0></div>
+ <div style="width: 50px;" data-offset-x=50 data-offset-y=50></div>
+ <div class="absolute" data-offset-x=0 data-offset-y=0></div>
+</div>
+
+<div class="flexbox wrap relative align-items-flex-end">
+ <div style="width: 100px;" data-offset-x=0 data-offset-y=30></div>
+ <div class="absolute" data-offset-x=0 data-offset-y=80></div>
+ <div style="width: 50px;" data-offset-x=0 data-offset-y=80></div>
+ <div class="absolute" data-offset-x=0 data-offset-y=80></div>
+ <div style="width: 50px;" data-offset-x=50 data-offset-y=80></div>
+ <div class="absolute" data-offset-x=0 data-offset-y=80></div>
+</div>
+
+
+<script>
+var absolute = document.getElementById('placed-absolute');
+var beforePosition = absolute.getBoundingClientRect();
+document.querySelector('.flexbox').style.height = '101px';
+var afterPosition = absolute.getBoundingClientRect();
+
+// Positioned element should not change position when the height of it's parent flexbox is changed.
+for (key in beforePosition) {
+ test(function() {
+ assert_equals(beforePosition[key], afterPosition[key]);
+ }, 'position of ' + key);
+}
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-003.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-003.html
new file mode 100644
index 00000000000..025aef6f45a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-003.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<title>CSS Test: Absolutely positioned children of flexboxes</title>
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items">
+<meta name="flags" content="dom">
+<meta name="assert" content="Checks that we correctly handle border and
+padding in combination with abspos items">
+<style>
+.rect {
+ position: absolute;
+ width: 50px;
+ height: 50px;
+ background-color: green;
+}
+
+.flexbox {
+ position: relative;
+ width: 100px;
+ height: 100px;
+ outline: 3px solid black;
+}
+</style>
+
+<link rel="stylesheet" href="support/flexbox.css">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.rect')">
+<div id=log></div>
+
+<div class="flexbox" style="padding-top: 10px; padding-left: 20px;">
+ <div class="rect" data-offset-x="20" data-offset-y="10"></div>
+</div>
+
+<div class="flexbox column" style="padding-top: 10px; padding-left: 20px;">
+ <div class="rect" data-offset-x="20" data-offset-y="10"></div>
+</div>
+
+<div class="flexbox" style="writing-mode: vertical-lr; padding-top: 10px; padding-left: 20px;">
+ <div class="rect" data-offset-x="20" data-offset-y="10"></div>
+</div>
+
+<div class="flexbox column" style="writing-mode: vertical-lr; padding-top: 10px; padding-left: 20px;">
+ <div class="rect" data-offset-x="20" data-offset-y="10"></div>
+</div>
+
+<div class="flexbox" style="direction: rtl; padding-top: 10px; padding-right: 20px;">
+ <div class="rect" data-offset-x="50" data-offset-y="10"></div>
+</div>
+
+<div class="flexbox column" style="direction: rtl; padding-top: 10px; padding-right: 20px;">
+ <div class="rect" data-offset-x="50" data-offset-y="10"></div>
+</div>
+
+<div class="flexbox" style="direction: rtl; writing-mode: vertical-lr; padding-bottom: 10px; padding-left: 20px;">
+ <div class="rect" data-offset-x="20" data-offset-y="50"></div>
+</div>
+
+<div class="flexbox column" style="direction: rtl; writing-mode: vertical-lr; padding-bottom: 10px; padding-left: 20px;">
+ <div class="rect" data-offset-x="20" data-offset-y="50"></div>
+</div>
+
+<hr>
+<div class="flexbox" style="border-top: 10px solid; border-left: 20px solid;">
+ <div class="rect" data-offset-x="0" data-offset-y="0"></div>
+</div>
+
+<div class="flexbox column" style="border-top: 10px solid; border-left: 20px solid;">
+ <div class="rect" data-offset-x="0" data-offset-y="0"></div>
+</div>
+
+<div class="flexbox" style="writing-mode: vertical-lr; border-top: 10px solid; border-left: 20px solid;">
+ <div class="rect" data-offset-x="0" data-offset-y="0"></div>
+</div>
+
+<div class="flexbox column" style="writing-mode: vertical-lr; border-top: 10px solid; border-left: 20px solid;">
+ <div class="rect" data-offset-x="0" data-offset-y="0"></div>
+</div>
+
+<div class="flexbox" style="direction: rtl; border-top: 10px solid; border-right: 20px solid;">
+ <div class="rect" data-offset-x="50" data-offset-y="0"></div>
+</div>
+
+<div class="flexbox column" style="direction: rtl; border-top: 10px solid; border-right: 20px solid;">
+ <div class="rect" data-offset-x="50" data-offset-y="0"></div>
+</div>
+
+<div class="flexbox" style="direction: rtl; writing-mode: vertical-lr; border-bottom: 10px solid; border-left: 20px solid;">
+ <div class="rect" data-offset-x="0" data-offset-y="50"></div>
+</div>
+
+<div class="flexbox column" style="direction: rtl; writing-mode: vertical-lr; border-bottom: 10px solid; border-left: 20px solid;">
+ <div class="rect" data-offset-x="0" data-offset-y="50"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-004.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-004.html
new file mode 100644
index 00000000000..ff14f35b146
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-004.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<title>CSS Test: Absolutely positioned children of flexboxes</title>
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items">
+<meta name="flags" content="dom">
+<meta name="assert" content="Checks that we correctly handle when a flex item
+becomes absolutely positioned">
+<style>
+#flex {
+ display: flex;
+ position: relative;
+ background: red;
+ width: 500px;
+ height: 200px;
+}
+
+#item {
+ background: green;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+}
+</style>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/check-layout-th.js"></script>
+
+<script>
+function update() {
+ var item = document.getElementById("item");
+ item.offsetHeight;
+ item.style.position = "absolute";
+ item.offsetHeight;
+ checkLayout("#flex");
+}
+</script>
+
+<body onload="update();">
+
+<div id="flex">
+ <div id="item" data-expected-width="500"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-005-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-005-ref.html
new file mode 100644
index 00000000000..2f7e669c72f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-005-ref.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<p>This test should not have a horizontal scrollbar</p>
+
+<div style="width: 400px; height: 100px; overflow-x: hidden; overflow-y: scroll;">
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+<br>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-005.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-005.html
new file mode 100644
index 00000000000..3199dfb9a69
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/position-absolute-005.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<title>CSS Test: Absolutely positioned children of flexboxes</title>
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items">
+<link rel="match" href="position-absolute-005-ref.html">
+<meta name="assert" content="Checks that we correctly handle overflow: auto in
+abspos nodes in flexbox">
+
+<style>
+ body {
+ width: 400px;
+ height: 300px;
+ }
+
+ .flexbox {
+ display: flex;
+ }
+
+ .column {
+ flex-direction: column;
+ }
+
+ .flex11a {
+ flex: 1 1 auto;
+ }
+
+ .root {
+ height: 100px;
+ overflow-y: auto;
+ position: relative;
+ }
+
+ #abspos {
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 0;
+ height: 10px;
+ }
+</style>
+
+
+<p>This test should not have a horizontal scrollbar</p>
+
+<div class="flexbox column">
+ <div class="flexbox">
+ <div class="flex11a">
+ <div class="root">
+ <div>
+ <div>
+ <div id="history"></div>
+ <div id="abspos"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<script>
+onload = function() {
+ var historyEl = document.getElementById('history');
+ historyEl.offsetWidth;
+ historyEl.innerText = '\n\n\n\n\n\n\n\n';
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/whitespace-in-flexitem-001-ref.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/whitespace-in-flexitem-001-ref.html
new file mode 100644
index 00000000000..f7ab7baf7c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/whitespace-in-flexitem-001-ref.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<link href="support/flexbox.css" rel="stylesheet">
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<style>
+ .a {
+ flex: none;
+ width: 30px;
+ background: salmon;
+ }
+</style>
+<body>
+ <div class="flexbox justify-content-space-around">
+ <div class="a"></div>
+ </div>
+
+ <div class="flexbox">
+ <b>foo</b><b>bar</b>
+ </div>
diff --git a/tests/wpt/web-platform-tests/css/css-flexbox-1/whitespace-in-flexitem-001.html b/tests/wpt/web-platform-tests/css/css-flexbox-1/whitespace-in-flexitem-001.html
new file mode 100644
index 00000000000..bec931a4e33
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-flexbox-1/whitespace-in-flexitem-001.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Test: Whitespace-only nodes in Flexboxes</title>
+<link href="support/flexbox.css" rel="stylesheet">
+<link rel="author" title="Google Inc." href="http://www.google.com/">
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#flex-items">
+<link rel="match" href="whitespace-in-flexitem-001-ref.html">
+<meta name="flags" content="">
+<meta name="assert" content="Whitespace-only nodes in a flexbox should not
+be rendered and not influence justify-content, even in the presence of
+white-space: pre">
+<style>
+ .flexbox { white-space: pre; }
+ .a {
+ flex: none;
+ width: 30px;
+ background: salmon;
+ }
+</style>
+<body>
+ <div class="flexbox justify-content-space-around">
+ <div class="a"></div> &#9;
+ </div>
+
+ <div class="flexbox">
+ <b>foo</b> <b>bar</b>
+ </div>
diff --git a/tests/wpt/web-platform-tests/css/css-fonts-3/support/fonts/Unnamed Med/FontFeatureTest.ttf b/tests/wpt/web-platform-tests/css/css-fonts-3/support/fonts/Unnamed Med/FontFeatureTest.ttf
deleted file mode 100644
index bb21a3c5dd2..00000000000
--- a/tests/wpt/web-platform-tests/css/css-fonts-3/support/fonts/Unnamed Med/FontFeatureTest.ttf
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-fonts-3/support/fonts/Unnamed Med/Unnamed-Medium.ttf b/tests/wpt/web-platform-tests/css/css-fonts-3/support/fonts/Unnamed Med/Unnamed-Medium.ttf
deleted file mode 100644
index 03846ab2c3b..00000000000
--- a/tests/wpt/web-platform-tests/css/css-fonts-3/support/fonts/Unnamed Med/Unnamed-Medium.ttf
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-fonts-3/test_datafont_same_origin.html b/tests/wpt/web-platform-tests/css/css-fonts-3/test_datafont_same_origin.html
new file mode 100644
index 00000000000..937c8c38e00
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-fonts-3/test_datafont_same_origin.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset=utf-8>
+ <title>data:font same-origin test</title>
+ <link rel="author" title="Henry Chang" href="mailto:hchang@mozilla.com">
+ <link rel="help" href="http://www.w3.org/TR/css-fonts-3/#font-prop" />
+ <meta name="assert" content="tests data:font would be treated same origin." />
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+ <style type="text/css">
+ @font-face {
+ font-family: 'DataFont';
+ src: url(data:font/opentype;base64,AAEAAAANAIAAAwBQRkZUTU6u6MkAAAXcAAAAHE9TLzJWYWQKAAABWAAAAFZjbWFwAA8D7wAAAcAAAAFCY3Z0IAAhAnkAAAMEAAAABGdhc3D//wADAAAF1AAAAAhnbHlmCC6aTwAAAxQAAACMaGVhZO8ooBcAAADcAAAANmhoZWEIkAV9AAABFAAAACRobXR4EZQAhQAAAbAAAAAQbG9jYQBwAFQAAAMIAAAACm1heHAASQA9AAABOAAAACBuYW1lehAVOgAAA6AAAAIHcG9zdP+uADUAAAWoAAAAKgABAAAAAQAAMhPyuV8PPPUACwPoAAAAAMU4Lm0AAAAAxTgubQAh/5wFeAK8AAAACAACAAAAAAAAAAEAAAK8/5wAWgXcAAAAAAV4AAEAAAAAAAAAAAAAAAAAAAAEAAEAAAAEAAwAAwAAAAAAAgAAAAEAAQAAAEAALgAAAAAAAQXcAfQABQAAAooCvAAAAIwCigK8AAAB4AAxAQIAAAIABgkAAAAAAAAAAAABAAAAAAAAAAAAAAAAUGZFZABAAEEAQQMg/zgAWgK8AGQAAAABAAAAAAAABdwAIQAAAAAF3AAABdwAZAAAAAMAAAADAAAAHAABAAAAAAA8AAMAAQAAABwABAAgAAAABAAEAAEAAABB//8AAABB////wgABAAAAAAAAAQYAAAEAAAAAAAAAAQIAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAnkAAAAqACoAKgBGAAAAAgAhAAABKgKaAAMABwAusQEALzyyBwQA7TKxBgXcPLIDAgDtMgCxAwAvPLIFBADtMrIHBgH8PLIBAgDtMjMRIREnMxEjIQEJ6MfHApr9ZiECWAAAAwBk/5wFeAK8AAMABwALAAABNSEVATUhFQE1IRUB9AH0/UQDhPu0BRQB9MjI/tTIyP7UyMgAAAAAAA4ArgABAAAAAAAAACYATgABAAAAAAABAAUAgQABAAAAAAACAAYAlQABAAAAAAADACEA4AABAAAAAAAEAAUBDgABAAAAAAAFABABNgABAAAAAAAGAAUBUwADAAEECQAAAEwAAAADAAEECQABAAoAdQADAAEECQACAAwAhwADAAEECQADAEIAnAADAAEECQAEAAoBAgADAAEECQAFACABFAADAAEECQAGAAoBRwBDAG8AcAB5AHIAaQBnAGgAdAAgACgAYwApACAAMgAwADAAOAAgAE0AbwB6AGkAbABsAGEAIABDAG8AcgBwAG8AcgBhAHQAaQBvAG4AAENvcHlyaWdodCAoYykgMjAwOCBNb3ppbGxhIENvcnBvcmF0aW9uAABNAGEAcgBrAEEAAE1hcmtBAABNAGUAZABpAHUAbQAATWVkaXVtAABGAG8AbgB0AEYAbwByAGcAZQAgADIALgAwACAAOgAgAE0AYQByAGsAQQAgADoAIAA1AC0AMQAxAC0AMgAwADAAOAAARm9udEZvcmdlIDIuMCA6IE1hcmtBIDogNS0xMS0yMDA4AABNAGEAcgBrAEEAAE1hcmtBAABWAGUAcgBzAGkAbwBuACAAMAAwADEALgAwADAAMAAgAABWZXJzaW9uIDAwMS4wMDAgAABNAGEAcgBrAEEAAE1hcmtBAAAAAgAAAAAAAP+DADIAAAABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAQACACQAAAAAAAH//wACAAAAAQAAAADEPovuAAAAAMU4Lm0AAAAAxTgubQ==);
+ }
+ </style>
+</head>
+<body>
+<div id="log"></div>
+<pre id="display"></pre>
+<style type="text/css" id="testbox"></style>
+
+<script type="text/javascript">
+ async_test(function(t) {
+ var text = document.createElement('p');
+ // Cross-domain font will not load according to [1] so we try to apply
+ // data:font to this text and see if the font can be loaded.
+ // [1] https://www.w3.org/TR/css-fonts-3/#same-origin-restriction
+ text.style = 'font-family: DataFont';
+ text.innerHTML = "This text should trigger 'TestFont' to load.";
+ document.body.appendChild(text);
+
+ document.fonts.onloadingdone = function (fontFaceSetEvent) {
+ assert_equals(fontFaceSetEvent.fontfaces.length, 1, "Same origin font should be loaded.");
+ t.done();
+ };
+ document.fonts.onloadingerror = function (fontFaceSetEvent) {
+ assert_unreached("data:font is not same origin!");
+ };
+ }, "Test if data:font would be treated same origin.")
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001-ref.html
new file mode 100644
index 00000000000..07e297f18e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001-ref.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Absolute positioning changing containing block reference file</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<style>
+.wrapper {
+ width: 100px;
+ height: 100px;
+ margin-bottom: 25px;
+ background: purple;
+}
+
+.grid {
+ width: 50px;
+ height: 50px;
+ background: lightblue;
+}
+
+.item {
+ width: 75%;
+ height: 75%;
+ background: orange;
+}
+</style>
+
+<p>The test PASS if you see an orange box inside a purple box on top and a small orange box inside a light blue box inside a purple box on bottom.</p>
+
+<div class="wrapper">
+ <div class="item"></div>
+</div>
+<div class="wrapper">
+ <div class="grid">
+ <div class="item"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001.html
new file mode 100644
index 00000000000..31030835c8c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-changing-containing-block-001.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang=en class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Absolute positioning changing containing block</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="match" href="absolute-positioning-changing-containing-block-001-ref.html">
+<meta name="assert" content="This test checks that absolutelly positioned children of a grid are properly sized when the containing block switches between the grid container and a grid ancestor.">
+<style>
+.wrapper {
+ width: 100px;
+ height: 100px;
+ margin-bottom: 25px;
+ background: purple;
+ position: relative;
+}
+
+.grid {
+ display: grid;
+ grid-template: 10px / 10px;
+ width: 50px;
+ height: 50px;
+ background: lightblue;
+}
+
+.item {
+ width: 75%;
+ height: 75%;
+ background: orange;
+ position: absolute;
+}
+</style>
+
+<p>The test PASS if you see an orange box inside a purple box on top and a small orange box inside a light blue box inside a purple box on bottom.</p>
+
+<div class="wrapper">
+ <div id="grid-as-cb" class="grid" style="position: relative;">
+ <div class="item"></div>
+ </div>
+</div>
+<div class="wrapper">
+ <div id="grid-as-parent" class="grid">
+ <div class="item"></div>
+ </div>
+</div>
+
+<script>
+ window.requestAnimationFrame(() => {
+ document.getElementById("grid-as-cb").style.position = "initial";
+ document.getElementById("grid-as-parent").style.position = "relative";
+ document.body.offsetLeft;
+ document.documentElement.classList.remove('reftest-wait');
+ });
+</script>
+
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-definite-sizes-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-definite-sizes-001.html
new file mode 100644
index 00000000000..1249a142638
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-definite-sizes-001.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Absolute positioning definite sizes</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<meta name="flags" content="ahem">
+<meta name="assert" content="Items should extend to fill the width of the absolutely positioned grid container.">
+<style>
+.grid {
+ display: grid;
+ grid-template: 50px 1fr / 1fr;
+
+ position: absolute;
+ left: 50px;
+ top: 50px;
+
+ width: 200px;
+ height: 200px;
+
+ border: 7px solid #ccc;
+ font: 10px/1 Ahem;
+}
+
+.row1 {
+ grid-row-start: 1;
+ background-color: yellow;
+}
+
+.row2 {
+ grid-row-start: 2;
+ background-color: cyan;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid">
+ <div class="row1" data-expected-height="50" data-expected-width="200">XXX X</div>
+ <div class="row2" data-expected-height="150" data-expected-width="200">XX XXX XX</div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-grid-container-containing-block-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-grid-container-containing-block-001.html
new file mode 100644
index 00000000000..65a358e10a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-grid-container-containing-block-001.html
@@ -0,0 +1,352 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Absolute positioning grid container containing block</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<meta name="assert" content="This test checks the behavior of the absolutely positioned elements with a grid container as containing block.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ grid-template-columns: 50px 100px 150px 200px;
+ grid-template-rows: 50px 100px 150px 200px;
+ width: 500px;
+ height: 500px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.thirdRowThirdColumnSpanning2Rows {
+ grid-column: 3;
+ grid-row: 3 / span 2;
+ background-color: maroon;
+}
+
+.thirdRowThirdColumnSpanning2Rows2Columns {
+ grid-column: 3 / span 2;
+ grid-row: 3 / span 2;
+ background-color: aqua;
+}
+
+.endFirstRowEndFirstColumn {
+ background-color: blue;
+ grid-column-end: 2;
+ grid-row-end: 2;
+}
+
+.endFirstRowEndSecondColumn {
+ background-color: lime;
+ grid-column-end: 3;
+ grid-row-end: 2;
+}
+
+.endSecondRowEndFirstColumn {
+ background-color: purple;
+ grid-column-end: 2;
+ grid-row-end: 3;
+}
+
+.endThirdRowEndThirdColumnSpanning2Rows {
+ grid-column-end: 4;
+ grid-row: span 2 / 4;
+ background-color: maroon;
+}
+
+.endThirdRowEndThirdColumnSpanning2Rows2Columns {
+ grid-column: span 2 / 4;
+ grid-row: span 2 / 4;
+ background-color: aqua;
+}
+
+.onlyThirdRowOnlyThirdColumnSpanning2Rows {
+ grid-column: 3 / 4;
+ grid-row: 3 / 5;
+ background-color: maroon;
+}
+
+.onlyThirdRowOnlyThirdColumnSpanning2Rows2Columns {
+ grid-column: 3 / 5;
+ grid-row: 3 / 5;
+ background-color: aqua;
+}
+
+.offsetLeft25 {
+ left: 25px;
+}
+
+.offsetRight50 {
+ right: 50px;
+}
+
+.offsetTop75 {
+ top: 75px;
+}
+
+.offsetBottom100 {
+ bottom: 100px;
+}
+
+.offsetLeftMinus20 {
+ left: -20px;
+}
+
+.offsetRightMinus40 {
+ right: -40px;
+}
+
+.offsetTopMinus60 {
+ top: -60px;
+}
+
+.offsetBottomMinus80 {
+ bottom: -80px;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid">
+ <div class="sizedToGridArea absolute autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="530" data-expected-height="530">
+ </div>
+ <div class="sizedToGridArea absolute firstRowFirstColumn"
+ data-offset-x="15" data-offset-y="15" data-expected-width="515" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowFirstColumn"
+ data-offset-x="15" data-offset-y="65" data-expected-width="515" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute firstRowSecondColumn"
+ data-offset-x="65" data-offset-y="15" data-expected-width="465" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowSecondColumn"
+ data-offset-x="65" data-offset-y="65" data-expected-width="465" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows"
+ data-offset-x="165" data-offset-y="165" data-expected-width="365" data-expected-height="350">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows2Columns"
+ data-offset-x="165" data-offset-y="165" data-expected-width="350" data-expected-height="350">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea absolute endThirdRowEndThirdColumnSpanning2Rows"
+ data-offset-x="0" data-offset-y="65" data-expected-width="315" data-expected-height="250">
+ </div>
+ <div class="sizedToGridArea absolute endThirdRowEndThirdColumnSpanning2Rows2Columns"
+ data-offset-x="65" data-offset-y="65" data-expected-width="250" data-expected-height="250">
+ </div>
+ <div class="sizedToGridArea absolute endSecondRowEndSecondColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="165" data-expected-height="165">
+ </div>
+ <div class="sizedToGridArea absolute endSecondRowEndFirstColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="65" data-expected-height="165">
+ </div>
+ <div class="sizedToGridArea absolute endFirstRowEndSecondColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="165" data-expected-height="65">
+ </div>
+ <div class="sizedToGridArea absolute endFirstRowEndFirstColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="65" data-expected-height="65">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea absolute onlyFirstRowOnlyFirstColumn"
+ data-offset-x="15" data-offset-y="15" data-expected-width="50" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea absolute onlySecondRowOnlyFirstColumn"
+ data-offset-x="15" data-offset-y="65" data-expected-width="50" data-expected-height="100">
+ </div>
+ <div class="sizedToGridArea absolute onlyFirstRowOnlySecondColumn"
+ data-offset-x="65" data-offset-y="15" data-expected-width="100" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea absolute onlySecondRowOnlySecondColumn"
+ data-offset-x="65" data-offset-y="65" data-expected-width="100" data-expected-height="100">
+ </div>
+ <div class="sizedToGridArea absolute onlyThirdRowOnlyThirdColumnSpanning2Rows2Columns"
+ data-offset-x="165" data-offset-y="165" data-expected-width="350" data-expected-height="350">
+ </div>
+ <div class="sizedToGridArea absolute onlyThirdRowOnlyThirdColumnSpanning2Rows"
+ data-offset-x="165" data-offset-y="165" data-expected-width="150" data-expected-height="350">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea absolute autoRowAutoColumn offsetLeft25 offsetTop75"
+ data-offset-x="25" data-offset-y="75" data-expected-width="530" data-expected-height="530">
+ </div>
+ <div class="sizedToGridArea absolute firstRowFirstColumn offsetRightMinus40 offsetBottomMinus80"
+ data-offset-x="55" data-offset-y="95" data-expected-width="515" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowFirstColumn offsetRight50 offsetBottom100"
+ data-offset-x="-35" data-offset-y="-35" data-expected-width="515" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute firstRowSecondColumn offsetLeftMinus20 offsetTopMinus60"
+ data-offset-x="45" data-offset-y="-45" data-expected-width="465" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowSecondColumn offsetRight50 offsetTop75"
+ data-offset-x="15" data-offset-y="140" data-expected-width="465" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows offsetLeft25 offsetBottom100"
+ data-offset-x="190" data-offset-y="65" data-expected-width="365" data-expected-height="350">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows2Columns offsetLeftMinus20 offsetRight50 offsetTopMinus60 offsetBottom100"
+ data-offset-x="145" data-offset-y="105" data-expected-width="350" data-expected-height="350">
+ </div>
+</div>
+
+<div class="grid">
+ <div>
+ <div class="sizedToGridArea absolute autoRowAutoColumn offsetLeft25 offsetTop75"
+ data-offset-x="25" data-offset-y="75" data-expected-width="530" data-expected-height="530">
+ </div>
+ <div class="sizedToGridArea absolute firstRowFirstColumn offsetRightMinus40 offsetBottomMinus80"
+ data-offset-x="55" data-offset-y="95" data-expected-width="515" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowFirstColumn offsetRight50 offsetBottom100"
+ data-offset-x="-35" data-offset-y="-35" data-expected-width="515" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute firstRowSecondColumn offsetLeftMinus20 offsetTopMinus60"
+ data-offset-x="45" data-offset-y="-45" data-expected-width="465" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowSecondColumn offsetRight50 offsetTop75"
+ data-offset-x="15" data-offset-y="140" data-expected-width="465" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows offsetLeft25 offsetBottom100"
+ data-offset-x="190" data-offset-y="65" data-expected-width="365" data-expected-height="350">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows2Columns offsetLeftMinus20 offsetRight50 offsetTopMinus60 offsetBottom100"
+ data-offset-x="145" data-offset-y="105" data-expected-width="350" data-expected-height="350">
+ </div>
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sizedToGridArea absolute autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="530" data-expected-height="530">
+ </div>
+ <div class="sizedToGridArea absolute firstRowFirstColumn"
+ data-offset-x="0" data-offset-y="15" data-expected-width="515" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowFirstColumn"
+ data-offset-x="0" data-offset-y="65" data-expected-width="515" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute firstRowSecondColumn"
+ data-offset-x="0" data-offset-y="15" data-expected-width="465" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowSecondColumn"
+ data-offset-x="0" data-offset-y="65" data-expected-width="465" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows"
+ data-offset-x="0" data-offset-y="165" data-expected-width="365" data-expected-height="350">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows2Columns"
+ data-offset-x="15" data-offset-y="165" data-expected-width="350" data-expected-height="350">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sizedToGridArea absolute endThirdRowEndThirdColumnSpanning2Rows"
+ data-offset-x="215" data-offset-y="65" data-expected-width="315" data-expected-height="250">
+ </div>
+ <div class="sizedToGridArea absolute endThirdRowEndThirdColumnSpanning2Rows2Columns"
+ data-offset-x="215" data-offset-y="65" data-expected-width="250" data-expected-height="250">
+ </div>
+ <div class="sizedToGridArea absolute endSecondRowEndSecondColumn"
+ data-offset-x="365" data-offset-y="0" data-expected-width="165" data-expected-height="165">
+ </div>
+ <div class="sizedToGridArea absolute endSecondRowEndFirstColumn"
+ data-offset-x="465" data-offset-y="0" data-expected-width="65" data-expected-height="165">
+ </div>
+ <div class="sizedToGridArea absolute endFirstRowEndSecondColumn"
+ data-offset-x="365" data-offset-y="0" data-expected-width="165" data-expected-height="65">
+ </div>
+ <div class="sizedToGridArea absolute endFirstRowEndFirstColumn"
+ data-offset-x="465" data-offset-y="0" data-expected-width="65" data-expected-height="65">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sizedToGridArea absolute onlyFirstRowOnlyFirstColumn"
+ data-offset-x="465" data-offset-y="15" data-expected-width="50" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea absolute onlySecondRowOnlyFirstColumn"
+ data-offset-x="465" data-offset-y="65" data-expected-width="50" data-expected-height="100">
+ </div>
+ <div class="sizedToGridArea absolute onlyFirstRowOnlySecondColumn"
+ data-offset-x="365" data-offset-y="15" data-expected-width="100" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea absolute onlySecondRowOnlySecondColumn"
+ data-offset-x="365" data-offset-y="65" data-expected-width="100" data-expected-height="100">
+ </div>
+ <div class="sizedToGridArea absolute onlyThirdRowOnlyThirdColumnSpanning2Rows2Columns"
+ data-offset-x="15" data-offset-y="165" data-expected-width="350" data-expected-height="350">
+ </div>
+ <div class="sizedToGridArea absolute onlyThirdRowOnlyThirdColumnSpanning2Rows"
+ data-offset-x="215" data-offset-y="165" data-expected-width="150" data-expected-height="350">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sizedToGridArea absolute autoRowAutoColumn offsetLeft25 offsetTop75"
+ data-offset-x="25" data-offset-y="75" data-expected-width="530" data-expected-height="530">
+ </div>
+ <div class="sizedToGridArea absolute firstRowFirstColumn offsetRightMinus40 offsetBottomMinus80"
+ data-offset-x="40" data-offset-y="95" data-expected-width="515" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowFirstColumn offsetRight50 offsetBottom100"
+ data-offset-x="-50" data-offset-y="-35" data-expected-width="515" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute firstRowSecondColumn offsetLeftMinus20 offsetTopMinus60"
+ data-offset-x="-20" data-offset-y="-45" data-expected-width="465" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowSecondColumn offsetRight50 offsetTop75"
+ data-offset-x="-50" data-offset-y="140" data-expected-width="465" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows offsetLeft25 offsetBottom100"
+ data-offset-x="25" data-offset-y="65" data-expected-width="365" data-expected-height="350">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows2Columns offsetLeftMinus20 offsetRight50 offsetTopMinus60 offsetBottom100"
+ data-offset-x="-35" data-offset-y="105" data-expected-width="350" data-expected-height="350">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div>
+ <div class="sizedToGridArea absolute autoRowAutoColumn offsetLeft25 offsetTop75"
+ data-offset-x="25" data-offset-y="75" data-expected-width="530" data-expected-height="530">
+ </div>
+ <div class="sizedToGridArea absolute firstRowFirstColumn offsetRightMinus40 offsetBottomMinus80"
+ data-offset-x="40" data-offset-y="95" data-expected-width="515" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowFirstColumn offsetRight50 offsetBottom100"
+ data-offset-x="-50" data-offset-y="-35" data-expected-width="515" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute firstRowSecondColumn offsetLeftMinus20 offsetTopMinus60"
+ data-offset-x="-20" data-offset-y="-45" data-expected-width="465" data-expected-height="515">
+ </div>
+ <div class="sizedToGridArea absolute secondRowSecondColumn offsetRight50 offsetTop75"
+ data-offset-x="-50" data-offset-y="140" data-expected-width="465" data-expected-height="465">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows offsetLeft25 offsetBottom100"
+ data-offset-x="25" data-offset-y="65" data-expected-width="365" data-expected-height="350">
+ </div>
+ <div class="sizedToGridArea absolute thirdRowThirdColumnSpanning2Rows2Columns offsetLeftMinus20 offsetRight50 offsetTopMinus60 offsetBottom100"
+ data-offset-x="-35" data-offset-y="105" data-expected-width="350" data-expected-height="350">
+ </div>
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-grid-container-parent-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-grid-container-parent-001.html
new file mode 100644
index 00000000000..3ea36c7dab9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/absolute-positioning-grid-container-parent-001.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Absolute positioning grid container parent</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<meta name="assert" content="This test checks the behavior of the absolutely positioned elements with a grid container as parent.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ grid-template-columns: 50px 100px 150px;
+ grid-template-rows: 25px 50px 100px;
+ width: 300px;
+ height: 200px;
+ border: 5px solid black;
+ margin: 20px 30px;
+ padding: 5px 15px;
+}
+
+.container {
+ width: 500px;
+ height: 400px;
+}
+
+.relative {
+ /* Ensures that the element is the containing block of the absolutely positioned elements. */
+ position: relative;
+}
+
+.absolute {
+ position: absolute;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<body onload="checkLayout('.container')">
+
+<div id="log"></div>
+
+<div class="container relative">
+ <div class="grid">
+ <div class="sizedToGridArea absolute autoRowAutoColumn" data-offset-x="35" data-offset-y="5" data-expected-width="500" data-expected-height="400"></div>
+ </div>
+</div>
+
+<div class="container relative">
+ <div class="grid">
+ <div class="sizedToGridArea absolute firstRowFirstColumn" data-offset-x="35" data-offset-y="5" data-expected-width="500" data-expected-height="400"></div>
+ </div>
+</div>
+
+<div class="container relative">
+ <div class="grid">
+ <div class="sizedToGridArea absolute secondRowSecondColumn" data-offset-x="35" data-offset-y="5" data-expected-width="500" data-expected-height="400"></div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="grid relative">
+ <div class="sizedToGridArea absolute autoRowAutoColumn" data-offset-x="0" data-offset-y="0" data-expected-width="330" data-expected-height="210"></div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="grid relative">
+ <div class="sizedToGridArea absolute firstRowFirstColumn" data-offset-x="15" data-offset-y="5" data-expected-width="315" data-expected-height="205"></div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="grid relative">
+ <div class="sizedToGridArea absolute secondRowSecondColumn" data-offset-x="65" data-offset-y="30" data-expected-width="265" data-expected-height="180"></div>
+ </div>
+</div>
+
+<div class="container relative">
+ <div class="grid directionRTL">
+ <div class="sizedToGridArea absolute autoRowAutoColumn" data-offset-x="-135" data-offset-y="5" data-expected-width="500" data-expected-height="400"></div>
+ </div>
+</div>
+
+<div class="container relative">
+ <div class="grid directionRTL">
+ <div class="sizedToGridArea absolute firstRowFirstColumn" data-offset-x="-135" data-offset-y="5" data-expected-width="500" data-expected-height="400"></div>
+ </div>
+</div>
+
+<div class="container relative">
+ <div class="grid directionRTL">
+ <div class="sizedToGridArea absolute secondRowSecondColumn" data-offset-x="-135" data-offset-y="5" data-expected-width="500" data-expected-height="400"></div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="grid relative directionRTL">
+ <div class="sizedToGridArea absolute autoRowAutoColumn" data-offset-x="0" data-offset-y="0" data-expected-width="330" data-expected-height="210"></div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="grid relative directionRTL">
+ <div class="sizedToGridArea absolute firstRowFirstColumn" data-offset-x="0" data-offset-y="5" data-expected-width="315" data-expected-height="205"></div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="grid relative directionRTL">
+ <div class="sizedToGridArea absolute secondRowSecondColumn" data-offset-x="0" data-offset-y="30" data-expected-width="265" data-expected-height="180"></div>
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-item-absolute-positioning-dynamic-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-item-absolute-positioning-dynamic-001.html
new file mode 100644
index 00000000000..bcd5dbaab5d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-item-absolute-positioning-dynamic-001.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html lang=en class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid item absolute positioning dynamic</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
+<meta name="assert" content="This test checks that a grid item which becomes an absolutelly positioned children of a grid.">
+<style>
+#wrapper {
+ width: 200px;
+ height: 200px;
+ position: relative;
+ background: red;
+}
+
+#grid {
+ display: grid;
+ grid: 100px / 100px;
+}
+
+#item {
+ background: green;
+ width: 100%;
+ height: 100%;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div id="wrapper">
+ <div id="grid">
+ <div id="item"></div>
+ </div>
+</div>
+
+<script>
+ window.requestAnimationFrame(() => {
+ document.getElementById("item").style.position = "absolute";
+ document.body.offsetLeft;
+ document.documentElement.classList.remove('reftest-wait');
+ });
+</script>
+
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-paint-positioned-children-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-paint-positioned-children-001-ref.html
new file mode 100644
index 00000000000..ac2a95e7960
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-paint-positioned-children-001-ref.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid paint positioned children reference file</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<style>
+.grid {
+ border: 2px solid black;
+ width: 100px;
+ height: 40px;
+ background: gray;
+}
+
+.abs {
+ height: 5px;
+ float: left;
+}
+
+#item {
+ width: 90px;
+ height: 30px;
+ margin-top: 10px;
+}
+</style>
+
+<p>This test passes if you see a gray box with a black border color with 5 rectangles inside. The first line contains a purple, orange, yellow and magenta boxes. Bellow them you should see a 90px cyan box.</p>
+
+<div class="grid">
+ <div class="abs" style="background: purple; width: 10px;"></div>
+ <div class="abs" style="background: orange; width: 20px;"></div>
+ <div class="abs" style="background: yellow; width: 30px;"></div>
+ <div class="abs" style="background: magenta; width: 40px;"></div>
+ <div id="item" style="background: cyan;"</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-paint-positioned-children-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-paint-positioned-children-001.html
new file mode 100644
index 00000000000..7528b084c8a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-paint-positioned-children-001.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid paint positioned children</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="match" href="grid-paint-positioned-children-001-ref.html">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+.grid {
+ border: 2px solid black;
+ position: relative;
+ width: 100px;
+
+ grid-template-columns: 10px 20px 30px 40px;
+
+ padding-top: 10px;
+}
+
+.abs {
+ height: 5px;
+ position: absolute;
+ width: 100%;
+}
+
+#item {
+ width: 90px;
+ height: 30px;
+}
+
+</style>
+
+<p>This test passes if you see a gray box with a black border color with 5 rectangles inside. The first line contains a purple, orange, yellow and magenta boxes. Bellow them you should see a 90px cyan box.</p>
+
+<div class="grid">
+ <div id="item" style="grid-column: 1 / -1; background: cyan;"></div>
+ <div class="abs" style="grid-column: 1 / 2; background: purple;"></div>
+ <div class="abs" style="grid-column: 2 / 3; background: orange;"></div>
+ <div class="abs" style="grid-column: 3 / 4; background: yellow;"></div>
+ <div class="abs" style="grid-column: 4 / 5; background: magenta;"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-children-writing-modes-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-children-writing-modes-001-ref.html
new file mode 100644
index 00000000000..3610cd3bfc7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-children-writing-modes-001-ref.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned children writing modes reference test</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ display: block;
+ margin: 5px;
+ width: 100px;
+ height: 75px;
+ padding: 5px 10px 15px 20px;
+ border-style: solid;
+ border-width: 5px 10px 15px 20px;
+ float: left;
+}
+
+.green {
+ background-color: green;
+ width: 30px;
+ height: 20px;
+ font: 10px/1 Ahem;
+}
+
+.verticalSize {
+ width: 20px;
+ height: 30px;
+}
+
+</style>
+
+<p>For the test to pass you should see no red and only green boxes. The black box will be positioned depending on the writing mode and text direction values.</p>
+
+<div class="grid">
+ <div class="green">XX</div>
+</div>
+
+<div class="grid verticalRL">
+ <div class="green verticalSize">XX</div>
+</div>
+
+<div class="grid verticalLR">
+ <div class="green verticalSize">XX</div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="green">XX</div>
+</div>
+
+<div class="grid verticalRL directionRTL">
+ <div class="green verticalSize">XX</div>
+</div>
+
+<div class="grid verticalLR directionRTL">
+ <div class="green verticalSize">XX</div>
+</div>
+
+<div class="grid">
+ <div class="green">XX</div>
+</div>
+
+<div class="grid verticalRL">
+ <div class="green verticalSize">XX</div>
+</div>
+
+<div class="grid verticalLR">
+ <div class="green verticalSize">XX</div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="green">XX</div>
+</div>
+
+<div class="grid verticalRL directionRTL">
+ <div class="green verticalSize">XX</div>
+</div>
+
+<div class="grid verticalLR directionRTL">
+ <div class="green verticalSize">XX</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-children-writing-modes-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-children-writing-modes-001.html
new file mode 100644
index 00000000000..b92263956ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-children-writing-modes-001.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned children writing modes</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="match" href="grid-positioned-children-writing-modes-001-ref.html">
+<meta name="assert" content="This test checks the behavior of the positioned grid children in combination with the writing modes and text direction properties.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ margin: 5px;
+ width: 100px;
+ height: 75px;
+ grid: 20px / 30px;
+ padding: 5px 10px 15px 20px;
+ border-style: solid;
+ border-width: 5px 10px 15px 20px;
+ float: left;
+ /* Ensures that the grid container is the containing block of the grid children. */
+ position: relative;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.onlyFirstRowOnlyFirstColumn {
+ background-color: green;
+ grid-column: 1 / 2;
+ grid-row: 1 / 2;
+}
+
+.offsets {
+ left: 0;
+ top: 0;
+}
+
+.red {
+ background-color: red;
+}
+
+</style>
+
+<p>For the test to pass you should see no red and only green boxes. The black box will be positioned depending on the writing mode and text direction values.</p>
+
+<div class="grid">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid verticalRL">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid verticalLR">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid verticalRL directionRTL">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid verticalLR directionRTL">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute offsets onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid verticalRL">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute offsets onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid verticalLR">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute offsets onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute offsets onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid verticalRL directionRTL">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute offsets onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
+
+<div class="grid verticalLR directionRTL">
+ <div class="red"></div>
+ <div class="sizedToGridArea absolute offsets onlyFirstRowOnlyFirstColumn">XX</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-item-dynamic-change-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-item-dynamic-change-001.html
new file mode 100644
index 00000000000..ff0c04e24ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-item-dynamic-change-001.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html lang=en class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned item dynamic change</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="This test checks that positioned items can be dynamically changed.">
+<style>
+.grid {
+ display: grid;
+ grid: 50px 50px / 50px 50px;
+ position: relative;
+}
+
+.green {
+ background: green;
+}
+
+.red {
+ background: red;
+}
+
+#item {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ grid-column: 1 / 2;
+ grid-row: 1 / 2;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div class="grid">
+ <div class="green"></div>
+ <div class="green"></div>
+ <div class="green"></div>
+ <div class="red"></div>
+ <div id="item" class="green"></div>
+</div>
+
+<script>
+ document.body.offsetLeft;
+
+ var item = document.getElementById("item");
+ item.style.gridColumn = "2 / 3";
+ item.style.gridRow = "2 / 3";
+
+ document.documentElement.classList.remove('reftest-wait');
+</script>
+
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-001-ref.html
new file mode 100644
index 00000000000..899dc98ec62
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-001-ref.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items background reference file</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<style>
+.grid {
+ width: 500px;
+ height: 300px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+}
+
+.container {
+ position: relative;
+ float: left;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.green {
+ background-color: green;
+}
+</style>
+
+<p>The test passes if you see 4 green boxes and no red.</p>
+
+<div class="container">
+ <div class="grid"></div>
+ <div class="absolute green" style="left: 55px; top: 50px; width: 100px; height: 50px"></div>
+ <div class="absolute green" style="left: 290px; top: 50px; width: 50px; height: 20px"></div>
+ <div class="absolute green" style="left: 50px; top: 115px; width: 50px; height: 30px"></div>
+ <div class="absolute green" style="left: 175px; top: 135px; width: 145px; height: 75px"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-001.html
new file mode 100644
index 00000000000..2b299cd5dae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-001.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items background</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="match" href="grid-positioned-items-background-001-ref.html">
+<meta name="assert" content="This test checks that the background of positioned items is painted in the right position">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ grid-template-columns: 100px 200px;
+ grid-template-rows: 50px 150px;
+ width: 500px;
+ height: 300px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+ background-color: transparent;
+}
+
+.container {
+ position: relative;
+ float: left;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.grid > div {
+ background-color: green;
+}
+
+.lengthSize {
+ width: 50px;
+ height: 20px;
+}
+
+.percentageSize {
+ width: 50%;
+ height: 20%;
+}
+
+.offsetsSize {
+ left: 25px;
+ right: 30px;
+ top: 35px;
+ bottom: 40px;
+}
+
+.red {
+ background-color: red;
+}
+</style>
+
+<p>The test passes if you see 4 green boxes and no red.</p>
+
+<div class="container">
+ <div class="absolute red" style="left: 55px; top: 50px; width: 100px; height: 50px"></div>
+ <div class="absolute red" style="left: 290px; top: 50px; width: 50px; height: 20px"></div>
+ <div class="absolute red" style="left: 50px; top: 115px; width: 50px; height: 30px"></div>
+ <div class="absolute red" style="left: 175px; top: 135px; width: 145px; height: 75px"></div>
+ <div class="grid">
+ <div class="absolute onlyFirstRowOnlyFirstColumn sizedToGridArea"
+ style="left: 5px;">
+ </div>
+ <div class="absolute onlyFirstRowOnlySecondColumn lengthSize"
+ style="right: 10px;">
+ </div>
+ <div class="absolute onlySecondRowOnlyFirstColumn percentageSize"
+ style="top: 15px;">
+ </div>
+ <div class="absolute onlySecondRowOnlySecondColumn offsetsSize"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-rtl-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-rtl-001-ref.html
new file mode 100644
index 00000000000..f57f496e3b0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-rtl-001-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items background RTL reference file</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<html>
+<style>
+.grid {
+ width: 500px;
+ height: 300px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+}
+
+.container {
+ position: relative;
+ float: left;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.green {
+ background-color: green;
+}
+</style>
+
+<p>The test passes if you see 4 green boxes and no red.</p>
+
+<div class="container">
+ <div class="grid"></div>
+ <div class="absolute green" style="left: 455px; top: 50px; width: 100px; height: 50px"></div>
+ <div class="absolute green" style="left: 390px; top: 50px; width: 50px; height: 20px"></div>
+ <div class="absolute green" style="left: 500px; top: 115px; width: 50px; height: 30px"></div>
+ <div class="absolute green" style="left: 275px; top: 135px; width: 145px; height: 75px"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-rtl-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-rtl-001.html
new file mode 100644
index 00000000000..50741e2fe6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-background-rtl-001.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items background RTL</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="match" href="grid-positioned-items-background-rtl-001-ref.html">
+<meta name="assert" content="This test checks that the background of positioned items is painted in the right position using RTL direction.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ grid-template-columns: 100px 200px;
+ grid-template-rows: 50px 150px;
+ width: 500px;
+ height: 300px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+ background-color: transparent;
+}
+
+.container {
+ position: relative;
+ float: left;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.grid > div {
+ background-color: green;
+}
+
+.lengthSize {
+ width: 50px;
+ height: 20px;
+}
+
+.percentageSize {
+ width: 50%;
+ height: 20%;
+}
+
+.offsetsSize {
+ left: 25px;
+ right: 30px;
+ top: 35px;
+ bottom: 40px;
+}
+
+.red {
+ background-color: red;
+}
+</style>
+
+<p>The test passes if you see 4 green boxes and no red.</p>
+
+<div class="container">
+ <div class="absolute red" style="left: 455px; top: 50px; width: 100px; height: 50px"></div>
+ <div class="absolute red" style="left: 390px; top: 50px; width: 50px; height: 20px"></div>
+ <div class="absolute red" style="left: 500px; top: 115px; width: 50px; height: 30px"></div>
+ <div class="absolute red" style="left: 275px; top: 135px; width: 145px; height: 75px"></div>
+ <div class="grid directionRTL">
+ <div class="absolute onlyFirstRowOnlyFirstColumn sizedToGridArea"
+ style="left: 5px;">
+ </div>
+ <div class="absolute onlyFirstRowOnlySecondColumn lengthSize"
+ style="right: 10px;">
+ </div>
+ <div class="absolute onlySecondRowOnlyFirstColumn percentageSize"
+ style="top: 15px;">
+ </div>
+ <div class="absolute onlySecondRowOnlySecondColumn offsetsSize"></div>
+ </div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-content-alignment-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-content-alignment-001.html
new file mode 100644
index 00000000000..d92c9b7c091
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-content-alignment-001.html
@@ -0,0 +1,403 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items content alignment</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align" title="10.5. Aligning the Grid: the justify-content and align-content properties">
+<meta name="assert" content="This test checks the behavior of the positioned items in a grid using content alignment.">
+<link rel="stylesheet" href="../support/grid.css">
+<link rel="stylesheet" href="../support/grid-alignment.css">
+<style>
+
+.grid {
+ grid-template-columns: 100px 50px;
+ grid-template-rows: 70px 30px;
+ width: 400px;
+ height: 200px;
+ margin: 5px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.grid > div {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background-color: lime;
+}
+
+.offsets {
+ left: 0;
+ top: 0;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid contentStart">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentStart">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentCenter">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="125" data-offset-y="50" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentCenter">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="125" data-offset-y="50" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentEnd">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="250" data-offset-y="100" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentEnd">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="250" data-offset-y="100" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentSpaceBetween">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentSpaceBetween">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentSpaceAround">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="63" data-offset-y="25" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentSpaceAround">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="63" data-offset-y="25" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentSpaceEvenly">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="83" data-offset-y="33" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentSpaceEvenly">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="83" data-offset-y="33" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentStart">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="100" data-offset-y="70" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentStart">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="100" data-offset-y="70" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentCenter">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="225" data-offset-y="120" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentCenter">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="225" data-offset-y="120" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentEnd">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="350" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentEnd">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="350" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentSpaceBetween">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="350" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentSpaceBetween">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="350" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentSpaceAround">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="288" data-offset-y="145" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentSpaceAround">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="288" data-offset-y="145" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentSpaceEvenly">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="267" data-offset-y="137" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentSpaceEvenly">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="267" data-offset-y="137" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentStart">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentStart">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentCenter">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="225" data-expected-height="120">
+ </div>
+</div>
+
+<div class="grid contentCenter">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="225" data-expected-height="120">
+ </div>
+</div>
+
+<div class="grid contentEnd">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="350" data-expected-height="170">
+ </div>
+</div>
+
+<div class="grid contentEnd">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="350" data-expected-height="170">
+ </div>
+</div>
+
+<div class="grid contentSpaceBetween">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentSpaceBetween">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid contentSpaceAround">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="163" data-expected-height="95">
+ </div>
+</div>
+
+<div class="grid contentSpaceAround">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="163" data-expected-height="95">
+ </div>
+</div>
+
+<div class="grid contentSpaceEvenly">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="183" data-expected-height="103">
+ </div>
+</div>
+
+<div class="grid contentSpaceEvenly">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="183" data-expected-height="103">
+ </div>
+</div>
+
+<div class="grid contentStart">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="100" data-offset-y="70" data-expected-width="300" data-expected-height="130">
+ </div>
+</div>
+
+<div class="grid contentStart">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="100" data-offset-y="70" data-expected-width="300" data-expected-height="130">
+ </div>
+</div>
+
+<div class="grid contentCenter">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="225" data-offset-y="120" data-expected-width="175" data-expected-height="80">
+ </div>
+</div>
+
+<div class="grid contentCenter">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="225" data-offset-y="120" data-expected-width="175" data-expected-height="80">
+ </div>
+</div>
+
+<div class="grid contentEnd">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="350" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentEnd">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="350" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentSpaceBetween">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="350" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentSpaceBetween">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="350" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid contentSpaceAround">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="288" data-offset-y="145" data-expected-width="112" data-expected-height="55">
+ </div>
+</div>
+
+<div class="grid contentSpaceAround">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="288" data-offset-y="145" data-expected-width="112" data-expected-height="55">
+ </div>
+</div>
+
+<div class="grid contentSpaceEvenly">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="267" data-offset-y="137" data-expected-width="133" data-expected-height="63">
+ </div>
+</div>
+
+<div class="grid contentSpaceEvenly">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="267" data-offset-y="137" data-expected-width="133" data-expected-height="63">
+ </div>
+</div>
+
+<div class="grid contentStart">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentStart">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentCenter">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentCenter">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentEnd">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentEnd">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentSpaceBetween">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentSpaceBetween">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentSpaceAround">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentSpaceAround">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentSpaceEvenly">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid contentSpaceEvenly">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-content-alignment-rtl-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-content-alignment-rtl-001.html
new file mode 100644
index 00000000000..748cb6f40b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-content-alignment-rtl-001.html
@@ -0,0 +1,403 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items content alignment RTL</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align" title="10.5. Aligning the Grid: the justify-content and align-content properties">
+<meta name="assert" content="This test checks the behavior of the positioned items in a grid using content alignment in RTL.">
+<link rel="stylesheet" href="../support/grid.css">
+<link rel="stylesheet" href="../support/grid-alignment.css">
+<style>
+
+.grid {
+ grid-template-columns: 100px 50px;
+ grid-template-rows: 70px 30px;
+ width: 400px;
+ height: 200px;
+ margin: 5px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.grid > div {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background-color: lime;
+}
+
+.offsets {
+ left: 0;
+ top: 0;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid directionRTL contentStart">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentStart">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentCenter">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="175" data-offset-y="50" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentCenter">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="175" data-offset-y="50" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentEnd">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="50" data-offset-y="100" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentEnd">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="50" data-offset-y="100" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceBetween">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceBetween">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceAround">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="238" data-offset-y="25" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceAround">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="238" data-offset-y="25" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceEvenly">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="217" data-offset-y="33" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceEvenly">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="217" data-offset-y="33" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentStart">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="250" data-offset-y="70" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentStart">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="250" data-offset-y="70" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentCenter">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="125" data-offset-y="120" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentCenter">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="125" data-offset-y="120" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentEnd">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="0" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentEnd">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="0" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceBetween">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="0" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceBetween">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="0" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceAround">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="63" data-offset-y="145" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceAround">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="63" data-offset-y="145" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceEvenly">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="83" data-offset-y="137" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceEvenly">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="83" data-offset-y="137" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentStart">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentStart">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentCenter">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="175" data-offset-y="0" data-expected-width="225" data-expected-height="120">
+ </div>
+</div>
+
+<div class="grid directionRTL contentCenter">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="175" data-offset-y="0" data-expected-width="225" data-expected-height="120">
+ </div>
+</div>
+
+<div class="grid directionRTL contentEnd">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="50" data-offset-y="0" data-expected-width="350" data-expected-height="170">
+ </div>
+</div>
+
+<div class="grid directionRTL contentEnd">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="50" data-offset-y="0" data-expected-width="350" data-expected-height="170">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceBetween">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceBetween">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="70">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceAround">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="238" data-offset-y="0" data-expected-width="162" data-expected-height="95">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceAround">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="238" data-offset-y="0" data-expected-width="162" data-expected-height="95">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceEvenly">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="217" data-offset-y="0" data-expected-width="183" data-expected-height="103">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceEvenly">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="217" data-offset-y="0" data-expected-width="183" data-expected-height="103">
+ </div>
+</div>
+
+<div class="grid directionRTL contentStart">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="70" data-expected-width="300" data-expected-height="130">
+ </div>
+</div>
+
+<div class="grid directionRTL contentStart">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="70" data-expected-width="300" data-expected-height="130">
+ </div>
+</div>
+
+<div class="grid directionRTL contentCenter">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="120" data-expected-width="175" data-expected-height="80">
+ </div>
+</div>
+
+<div class="grid directionRTL contentCenter">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="120" data-expected-width="175" data-expected-height="80">
+ </div>
+</div>
+
+<div class="grid directionRTL contentEnd">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentEnd">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceBetween">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceBetween">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="170" data-expected-width="50" data-expected-height="30">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceAround">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="145" data-expected-width="113" data-expected-height="55">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceAround">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="145" data-expected-width="113" data-expected-height="55">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceEvenly">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="137" data-expected-width="133" data-expected-height="63">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceEvenly">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="137" data-expected-width="133" data-expected-height="63">
+ </div>
+</div>
+
+<div class="grid directionRTL contentStart">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentStart">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentCenter">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentCenter">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentEnd">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentEnd">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceBetween">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceBetween">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceAround">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceAround">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceEvenly">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL contentSpaceEvenly">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="200">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-gaps-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-gaps-001.html
new file mode 100644
index 00000000000..5869bfbea4f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-gaps-001.html
@@ -0,0 +1,309 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items gaps</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#gutters" title="10.1. Gutters: the row-gap, column-gap, and gap properties">
+<meta name="assert" content="This test checks the behavior of the positioned items in a grid container with gaps.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ grid-template-columns: 100px 100px 100px 100px;
+ grid-template-rows: 50px 50px;
+ grid-gap: 25px 50px;
+ width: 800px;
+ height: 200px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.grid > div {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background-color: lime;
+}
+
+.offsets {
+ left: 0;
+ top: 0;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 1 / auto; grid-row: 1 / auto;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="815" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 1 / auto; grid-row: 1 / auto;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="815" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 1 / 3; grid-row: 1 / 3;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="250" data-expected-height="125">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 1 / 3; grid-row: 1 / 3;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="250" data-expected-height="125">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 1 / 4; grid-row: 1 / 4;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="400" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 1 / 4; grid-row: 1 / 4;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="400" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 1 / 5; grid-row: 1 / 5;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="550" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 1 / 5; grid-row: 1 / 5;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="550" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 1 / 6; grid-row: 1 / 6;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="815" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 1 / 6; grid-row: 1 / 6;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="815" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="165" data-offset-y="90" data-expected-width="665" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="165" data-offset-y="90" data-expected-width="665" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="165" data-offset-y="90" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="165" data-offset-y="90" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 2 / 4; grid-row: 2 / 4;"
+ data-offset-x="165" data-offset-y="90" data-expected-width="250" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 2 / 4; grid-row: 2 / 4;"
+ data-offset-x="165" data-offset-y="90" data-expected-width="250" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 2 / 5; grid-row: 2 / 5;"
+ data-offset-x="165" data-offset-y="90" data-expected-width="400" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 2 / 5; grid-row: 2 / 5;"
+ data-offset-x="165" data-offset-y="90" data-expected-width="400" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 2 / 6; grid-row: 2 / 6;"
+ data-offset-x="165" data-offset-y="90" data-expected-width="665" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 2 / 6; grid-row: 2 / 6;"
+ data-offset-x="165" data-offset-y="90" data-expected-width="665" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 3 / auto; grid-row: 3 / auto;"
+ data-offset-x="315" data-offset-y="140" data-expected-width="515" data-expected-height="90">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 3 / auto; grid-row: 3 / auto;"
+ data-offset-x="315" data-offset-y="140" data-expected-width="515" data-expected-height="90">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 4 / auto; grid-row: 4 / auto;"
+ data-offset-x="465" data-offset-y="0" data-expected-width="365" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 4 / auto; grid-row: 4 / auto;"
+ data-offset-x="465" data-offset-y="0" data-expected-width="365" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 5 / auto; grid-row: 5 / auto;"
+ data-offset-x="565" data-offset-y="0" data-expected-width="265" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 5 / auto; grid-row: 5 / auto;"
+ data-offset-x="565" data-offset-y="0" data-expected-width="265" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: 6 / auto; grid-row: 6 / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: 6 / auto; grid-row: 6 / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: auto / 1; grid-row: auto / 1;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: auto / 1; grid-row: auto / 1;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="115" data-expected-height="65">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="115" data-expected-height="65">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: auto / 3; grid-row: auto / 3;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="265" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: auto / 3; grid-row: auto / 3;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="265" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: auto / 4; grid-row: auto / 4;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="415" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: auto / 4; grid-row: auto / 4;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="415" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: auto / 5; grid-row: auto / 5;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="565" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: auto / 5; grid-row: auto / 5;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="565" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div style="grid-column: auto / 6; grid-row: auto / 6;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="offsets" style="grid-column: auto / 6; grid-row: auto / 6;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-gaps-rtl-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-gaps-rtl-001.html
new file mode 100644
index 00000000000..e6fe7c27361
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-gaps-rtl-001.html
@@ -0,0 +1,309 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items gaps RTL</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#gutters" title="10.1. Gutters: the row-gap, column-gap, and gap properties">
+<meta name="assert" content="This test checks the behavior of the positioned items in a grid container with gaps in RTL.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ grid-template-columns: 100px 100px 100px 100px;
+ grid-template-rows: 50px 50px;
+ grid-gap: 25px 50px;
+ width: 800px;
+ height: 200px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.grid > div {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background-color: lime;
+}
+
+.offsets {
+ left: 0;
+ top: 0;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: auto / auto; grid-row: auto / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 1 / auto; grid-row: 1 / auto;"
+ data-offset-x="0" data-offset-y="15" data-expected-width="815" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 1 / auto; grid-row: 1 / auto;"
+ data-offset-x="0" data-offset-y="15" data-expected-width="815" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="715" data-offset-y="15" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 1 / 2; grid-row: 1 / 2;"
+ data-offset-x="715" data-offset-y="15" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 1 / 3; grid-row: 1 / 3;"
+ data-offset-x="565" data-offset-y="15" data-expected-width="250" data-expected-height="125">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 1 / 3; grid-row: 1 / 3;"
+ data-offset-x="565" data-offset-y="15" data-expected-width="250" data-expected-height="125">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 1 / 4; grid-row: 1 / 4;"
+ data-offset-x="415" data-offset-y="15" data-expected-width="400" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 1 / 4; grid-row: 1 / 4;"
+ data-offset-x="415" data-offset-y="15" data-expected-width="400" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 1 / 5; grid-row: 1 / 5;"
+ data-offset-x="265" data-offset-y="15" data-expected-width="550" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 1 / 5; grid-row: 1 / 5;"
+ data-offset-x="265" data-offset-y="15" data-expected-width="550" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 1 / 6; grid-row: 1 / 6;"
+ data-offset-x="0" data-offset-y="15" data-expected-width="815" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 1 / 6; grid-row: 1 / 6;"
+ data-offset-x="0" data-offset-y="15" data-expected-width="815" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="90" data-expected-width="665" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="90" data-expected-width="665" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="565" data-offset-y="90" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 2 / 3; grid-row: 2 / 3;"
+ data-offset-x="565" data-offset-y="90" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 2 / 4; grid-row: 2 / 4;"
+ data-offset-x="415" data-offset-y="90" data-expected-width="250" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 2 / 4; grid-row: 2 / 4;"
+ data-offset-x="415" data-offset-y="90" data-expected-width="250" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 2 / 5; grid-row: 2 / 5;"
+ data-offset-x="265" data-offset-y="90" data-expected-width="400" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 2 / 5; grid-row: 2 / 5;"
+ data-offset-x="265" data-offset-y="90" data-expected-width="400" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 2 / 6; grid-row: 2 / 6;"
+ data-offset-x="0" data-offset-y="90" data-expected-width="665" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 2 / 6; grid-row: 2 / 6;"
+ data-offset-x="0" data-offset-y="90" data-expected-width="665" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 3 / auto; grid-row: 3 / auto;"
+ data-offset-x="0" data-offset-y="140" data-expected-width="515" data-expected-height="90">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 3 / auto; grid-row: 3 / auto;"
+ data-offset-x="0" data-offset-y="140" data-expected-width="515" data-expected-height="90">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 4 / auto; grid-row: 4 / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="365" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 4 / auto; grid-row: 4 / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="365" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 5 / auto; grid-row: 5 / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="265" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 5 / auto; grid-row: 5 / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="265" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: 6 / auto; grid-row: 6 / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: 6 / auto; grid-row: 6 / auto;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: auto / 1; grid-row: auto / 1;"
+ data-offset-x="815" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: auto / 1; grid-row: auto / 1;"
+ data-offset-x="815" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="715" data-offset-y="0" data-expected-width="115" data-expected-height="65">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="715" data-offset-y="0" data-expected-width="115" data-expected-height="65">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: auto / 3; grid-row: auto / 3;"
+ data-offset-x="565" data-offset-y="0" data-expected-width="265" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: auto / 3; grid-row: auto / 3;"
+ data-offset-x="565" data-offset-y="0" data-expected-width="265" data-expected-height="140">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: auto / 4; grid-row: auto / 4;"
+ data-offset-x="415" data-offset-y="0" data-expected-width="415" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: auto / 4; grid-row: auto / 4;"
+ data-offset-x="415" data-offset-y="0" data-expected-width="415" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: auto / 5; grid-row: auto / 5;"
+ data-offset-x="265" data-offset-y="0" data-expected-width="565" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: auto / 5; grid-row: auto / 5;"
+ data-offset-x="265" data-offset-y="0" data-expected-width="565" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div style="grid-column: auto / 6; grid-row: auto / 6;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="offsets" style="grid-column: auto / 6; grid-row: auto / 6;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="830" data-expected-height="230">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-implicit-grid-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-implicit-grid-001.html
new file mode 100644
index 00000000000..063da56fe55
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-implicit-grid-001.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items implicit grid</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#implicit-grids" title="7.5. The Implicit Grid">
+<meta name="assert" content="This test checks the behavior of the absolutely positioned grid items placed on the implicit grid.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ width: 200px;
+ height: 200px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.grid-columns-rows {
+ grid-template-columns: 100px;
+ grid-template-rows: 50px;
+}
+
+.absolute {
+ position: absolute;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid">
+ <div class="sizedToGridArea absolute secondRowSecondColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="230" data-expected-height="230">
+ </div>
+ <div class="sizedToGridArea absolute endSecondRowEndSecondColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="230" data-expected-height="230">
+ </div>
+ <div class="sizedToGridArea absolute onlySecondRowOnlySecondColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="230" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid grid-columns-rows">
+ <div class="sizedToGridArea absolute secondRowSecondColumn"
+ data-offset-x="115" data-offset-y="65" data-expected-width="115" data-expected-height="165">
+ </div>
+ <div class="sizedToGridArea absolute endSecondRowEndSecondColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="230" data-expected-height="230">
+ </div>
+ <div class="sizedToGridArea absolute onlySecondRowOnlySecondColumn"
+ data-offset-x="115" data-offset-y="65" data-expected-width="115" data-expected-height="165">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sizedToGridArea absolute secondRowSecondColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="230" data-expected-height="230">
+ </div>
+ <div class="sizedToGridArea absolute endSecondRowEndSecondColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="230" data-expected-height="230">
+ </div>
+ <div class="sizedToGridArea absolute onlySecondRowOnlySecondColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="230" data-expected-height="230">
+ </div>
+</div>
+
+<div class="grid grid-columns-rows directionRTL">
+ <div class="sizedToGridArea absolute secondRowSecondColumn"
+ data-offset-x="0" data-offset-y="65" data-expected-width="115" data-expected-height="165">
+ </div>
+ <div class="sizedToGridArea absolute endSecondRowEndSecondColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="230" data-expected-height="230">
+ </div>
+ <div class="sizedToGridArea absolute onlySecondRowOnlySecondColumn"
+ data-offset-x="0" data-offset-y="65" data-expected-width="115" data-expected-height="165">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-implicit-grid-line-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-implicit-grid-line-001.html
new file mode 100644
index 00000000000..908ea39ef5d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-implicit-grid-line-001.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items implicit grid line</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#implicit-grids" title="7.5. The Implicit Grid">
+<meta name="assert" content="This test checks that grid placement properties of absolutely positioned items using implicit grid lines are treated as 'auto'.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ grid-template-columns: 100px 200px;
+ grid-template-rows: 50px 150px;
+ width: 500px;
+ height: 300px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.startImplicitLine {
+ background-color: blue;
+ grid-column: 5;
+ grid-row: 8;
+}
+
+.endImplicitLine {
+ background-color: orange;
+ grid-column: 1 / 5;
+ grid-row: 1 / 8;
+}
+
+.startImplicitLineSpan {
+ background-color: blue;
+ grid-column: span 5;
+ grid-row: span 8;
+}
+
+.endImplicitLineSpan {
+ background-color: orange;
+ grid-column: 1 / span 5;
+ grid-row: 1 / span 8;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid">
+ <div class="absolute sizedToGridArea startImplicitLine"
+ data-offset-x="0" data-offset-y="0" data-expected-width="530" data-expected-height="330">
+ </div>
+ <div class="absolute sizedToGridArea endImplicitLine"
+ data-offset-x="15" data-offset-y="15" data-expected-width="515" data-expected-height="315">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="absolute sizedToGridArea startImplicitLineSpan"
+ data-offset-x="0" data-offset-y="0" data-expected-width="530" data-expected-height="330">
+ </div>
+ <div class="absolute sizedToGridArea endImplicitLineSpan"
+ data-offset-x="15" data-offset-y="15" data-expected-width="515" data-expected-height="315">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="absolute sizedToGridArea startImplicitLine"
+ data-offset-x="0" data-offset-y="0" data-expected-width="530" data-expected-height="330">
+ </div>
+ <div class="absolute sizedToGridArea endImplicitLine"
+ data-offset-x="0" data-offset-y="15" data-expected-width="515" data-expected-height="315">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="absolute sizedToGridArea startImplicitLineSpan"
+ data-offset-x="0" data-offset-y="0" data-expected-width="530" data-expected-height="330">
+ </div>
+ <div class="absolute sizedToGridArea endImplicitLineSpan"
+ data-offset-x="0" data-offset-y="15" data-expected-width="515" data-expected-height="315">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-padding-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-padding-001.html
new file mode 100644
index 00000000000..5a7244c78a1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-padding-001.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items padding</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<meta name="assert" content="This test checks that positioned grid items can be placed directly on the padding.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ grid-template-columns: 100px 200px;
+ grid-template-rows: 50px 150px;
+ width: 500px;
+ height: 300px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.autoFit {
+ grid-template-columns: repeat(auto-fit, 100px);
+ grid-template-rows: repeat(auto-fit, 100px);
+}
+
+.absolute {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: lime;
+}
+
+.gap { grid-gap: 10px; }
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid">
+ <div class="absolute" style="grid-column: auto / 1; grid-row: auto / 1;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: 1 / 2; grid-row: auto / 1;"
+ data-offset-x="15" data-offset-y="0" data-expected-width="100" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: auto / 1; grid-row: 1 / 2;"
+ data-offset-x="0" data-offset-y="15" data-expected-width="15" data-expected-height="50">
+ </div>
+ <div class="absolute" style="grid-column: 3 / auto; grid-row: 3 / auto;"
+ data-offset-x="315" data-offset-y="215" data-expected-width="215" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 2 / 3; grid-row: 3 / auto;"
+ data-offset-x="115" data-offset-y="215" data-expected-width="200" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 3 / auto; grid-row: 2 / 3;"
+ data-offset-x="315" data-offset-y="65" data-expected-width="215" data-expected-height="150">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="absolute" style="grid-column: -5 / 1; grid-row: -5 / 1;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: 1 / 2; grid-row: -5 / 1;"
+ data-offset-x="15" data-offset-y="0" data-expected-width="100" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: -5 / 1; grid-row: 1 / 2;"
+ data-offset-x="0" data-offset-y="15" data-expected-width="15" data-expected-height="50">
+ </div>
+ <div class="absolute" style="grid-column: 3 / 5; grid-row: 3 / 5;"
+ data-offset-x="315" data-offset-y="215" data-expected-width="215" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 2 / 3; grid-row: 3 / 5;"
+ data-offset-x="115" data-offset-y="215" data-expected-width="200" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 3 / 5; grid-row: 2 / 3;"
+ data-offset-x="315" data-offset-y="65" data-expected-width="215" data-expected-height="150">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="absolute" style="grid-column: span 2 / 1; grid-row: span 2 / 1;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: 1 / 2; grid-row: span 2 / 1;"
+ data-offset-x="15" data-offset-y="0" data-expected-width="100" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: span 2 / 1; grid-row: 1 / 2;"
+ data-offset-x="0" data-offset-y="15" data-expected-width="15" data-expected-height="50">
+ </div>
+ <div class="absolute" style="grid-column: 3 / span 2; grid-row: 3 / span 2;"
+ data-offset-x="315" data-offset-y="215" data-expected-width="215" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 2 / 3; grid-row: 3 / span 2;"
+ data-offset-x="115" data-offset-y="215" data-expected-width="200" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 3 / span 2; grid-row: 2 / 3;"
+ data-offset-x="315" data-offset-y="65" data-expected-width="215" data-expected-height="150">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="absolute" style="grid-column: foo / 1; grid-row: foo / 1;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: 1 / 2; grid-row: foo / 1;"
+ data-offset-x="15" data-offset-y="0" data-expected-width="100" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: foo / 1; grid-row: 1 / 2;"
+ data-offset-x="0" data-offset-y="15" data-expected-width="15" data-expected-height="50">
+ </div>
+ <div class="absolute" style="grid-column: 3 / foo; grid-row: 3 / foo;"
+ data-offset-x="315" data-offset-y="215" data-expected-width="215" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 2 / 3; grid-row: 3 / foo;"
+ data-offset-x="115" data-offset-y="215" data-expected-width="200" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 3 / foo; grid-row: 2 / 3;"
+ data-offset-x="315" data-offset-y="65" data-expected-width="215" data-expected-height="150">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="absolute" style="grid-column: auto / 1; grid-row: auto / 1;"
+ data-offset-x="515" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: 1 / 2; grid-row: auto / 1;"
+ data-offset-x="415" data-offset-y="0" data-expected-width="100" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: auto / 1; grid-row: 1 / 2;"
+ data-offset-x="515" data-offset-y="15" data-expected-width="15" data-expected-height="50">
+ </div>
+ <div class="absolute" style="grid-column: 3 / auto; grid-row: 3 / auto;"
+ data-offset-x="0" data-offset-y="215" data-expected-width="215" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 2 / 3; grid-row: 3 / auto;"
+ data-offset-x="215" data-offset-y="215" data-expected-width="200" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 3 / auto; grid-row: 2 / 3;"
+ data-offset-x="0" data-offset-y="65" data-expected-width="215" data-expected-height="150">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="absolute" style="grid-column: -5 / 1; grid-row: -5 / 1;"
+ data-offset-x="515" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: 1 / 2; grid-row: -5 / 1;"
+ data-offset-x="415" data-offset-y="0" data-expected-width="100" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: -5 / 1; grid-row: 1 / 2;"
+ data-offset-x="515" data-offset-y="15" data-expected-width="15" data-expected-height="50">
+ </div>
+ <div class="absolute" style="grid-column: 3 / 5; grid-row: 3 / 5;"
+ data-offset-x="0" data-offset-y="215" data-expected-width="215" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 2 / 3; grid-row: 3 / 5;"
+ data-offset-x="215" data-offset-y="215" data-expected-width="200" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 3 / 5; grid-row: 2 / 3;"
+ data-offset-x="0" data-offset-y="65" data-expected-width="215" data-expected-height="150">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="absolute" style="grid-column: span 2 / 1; grid-row: span 2 / 1;"
+ data-offset-x="515" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: 1 / 2; grid-row: span 2 / 1;"
+ data-offset-x="415" data-offset-y="0" data-expected-width="100" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: span 2 / 1; grid-row: 1 / 2;"
+ data-offset-x="515" data-offset-y="15" data-expected-width="15" data-expected-height="50">
+ </div>
+ <div class="absolute" style="grid-column: 3 / span 2; grid-row: 3 / span 2;"
+ data-offset-x="0" data-offset-y="215" data-expected-width="215" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 2 / 3; grid-row: 3 / span 2;"
+ data-offset-x="215" data-offset-y="215" data-expected-width="200" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 3 / span 2; grid-row: 2 / 3;"
+ data-offset-x="0" data-offset-y="65" data-expected-width="215" data-expected-height="150">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="absolute" style="grid-column: foo / 1; grid-row: foo / 1;"
+ data-offset-x="515" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: 1 / 2; grid-row: foo / 1;"
+ data-offset-x="415" data-offset-y="0" data-expected-width="100" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: foo / 1; grid-row: 1 / 2;"
+ data-offset-x="515" data-offset-y="15" data-expected-width="15" data-expected-height="50">
+ </div>
+ <div class="absolute" style="grid-column: 3 / foo; grid-row: 3 / foo;"
+ data-offset-x="0" data-offset-y="215" data-expected-width="215" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 2 / 3; grid-row: 3 / foo;"
+ data-offset-x="215" data-offset-y="215" data-expected-width="200" data-expected-height="115">
+ </div>
+ <div class="absolute" style="grid-column: 3 / foo; grid-row: 2 / 3;"
+ data-offset-x="0" data-offset-y="65" data-expected-width="215" data-expected-height="150">
+ </div>
+</div>
+
+<div class="grid autoFit gap">
+ <div class="absolute" style="grid-column: auto / 1; grid-row: auto / 1;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: -1 / auto; grid-row: -1 / auto;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="515" data-expected-height="315">
+ </div>
+</div>
+
+<div class="grid autoFit gap">
+ <div class="absolute" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: -2 / auto; grid-row: -2 / auto;"
+ data-offset-x="15" data-offset-y="15" data-expected-width="515" data-expected-height="315">
+ </div>
+</div>
+
+<div class="grid autoFit directionRTL gap">
+ <div class="absolute" style="grid-column: auto / 1; grid-row: auto / 1;"
+ data-offset-x="515" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: -1 / auto; grid-row: -1 / auto;"
+ data-offset-x="0" data-offset-y="15" data-expected-width="515" data-expected-height="315">
+ </div>
+</div>
+
+<div class="grid autoFit directionRTL gap">
+ <div class="absolute" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="515" data-offset-y="0" data-expected-width="15" data-expected-height="15">
+ </div>
+ <div class="absolute" style="grid-column: -2 / auto; grid-row: -2 / auto;"
+ data-offset-x="0" data-offset-y="15" data-expected-width="515" data-expected-height="315">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-unknown-named-grid-line-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-unknown-named-grid-line-001.html
new file mode 100644
index 00000000000..6aee082f674
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-unknown-named-grid-line-001.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items unknown named grid line</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<meta name="assert" content="This test checks that grid placement properties of absolutely positioned items using unknown named grid lines are treated as 'auto'.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ grid-template-columns: 100px 200px;
+ grid-template-rows: 50px 150px;
+ width: 500px;
+ height: 300px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.startUnknownLine {
+ background-color: blue;
+ grid-column: foo / 3;
+ grid-row: bar / 3;
+}
+
+.endUnknownLine {
+ background-color: orange;
+ grid-column: 1 / foo;
+ grid-row: 1 / bar;
+}
+
+.startAndEndUnknownLines {
+ background-color: green;
+ grid-column: foo / bar;
+ grid-row: foo / bar;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid">
+ <div class="absolute sizedToGridArea startAndEndUnknownLines"
+ data-offset-x="0" data-offset-y="0" data-expected-width="530" data-expected-height="330">
+ </div>
+ <div class="absolute sizedToGridArea endUnknownLine"
+ data-offset-x="15" data-offset-y="15" data-expected-width="515" data-expected-height="315">
+ </div>
+ <div class="absolute sizedToGridArea startUnknownLine"
+ data-offset-x="0" data-offset-y="0" data-expected-width="315" data-expected-height="215">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="absolute sizedToGridArea startAndEndUnknownLines"
+ data-offset-x="0" data-offset-y="0" data-expected-width="530" data-expected-height="330">
+ </div>
+ <div class="absolute sizedToGridArea endUnknownLine"
+ data-offset-x="0" data-offset-y="15" data-expected-width="515" data-expected-height="315">
+ </div>
+ <div class="absolute sizedToGridArea startUnknownLine"
+ data-offset-x="215" data-offset-y="0" data-expected-width="315" data-expected-height="215">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-within-grid-implicit-track-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-within-grid-implicit-track-001.html
new file mode 100644
index 00000000000..1c82feb04f7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-positioned-items-within-grid-implicit-track-001.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid positioned items within grid implicit track</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#implicit-grids" title="7.5. The Implicit Grid">
+<meta name="assert" content="This test checks that positioned grid items are placed properly (including implicit tracks) even if the grid has implicit tracks.">
+<link rel="stylesheet" href="../support/grid.css">
+<style>
+
+.grid {
+ grid-template-columns: 200px 300px;
+ grid-template-rows: 150px 250px;
+ grid-auto-columns: 100px;
+ grid-auto-rows: 50px;
+ width: 800px;
+ height: 600px;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.absolute {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: cyan;
+}
+
+.sixRowsAndSixColumns {
+ background: magenta;
+ grid-row: -5 / 5;
+ grid-column: -5 / 5;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="15" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: auto / 1; grid-row: auto / 1;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="215" data-expected-height="115">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="15" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="0" data-offset-y="0" data-expected-width="415" data-expected-height="265">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="15" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: 3 / auto; grid-row: 3 / auto;"
+ data-offset-x="715" data-offset-y="515" data-expected-width="115" data-expected-height="115">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="15" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="415" data-offset-y="265" data-expected-width="415" data-expected-height="365">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="15" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: -4 / 1; grid-row: -4 / 1;"
+ data-offset-x="115" data-offset-y="65" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="15" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: -4 / 2; grid-row: -4 / 2;"
+ data-offset-x="115" data-offset-y="65" data-expected-width="300" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="15" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: 3 / 4; grid-row: 3 / 4;"
+ data-offset-x="715" data-offset-y="515" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="15" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: 2 / 4; grid-row: 2 / 4;"
+ data-offset-x="415" data-offset-y="265" data-expected-width="400" data-expected-height="300">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="-85" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: auto / 1; grid-row: auto / 1;"
+ data-offset-x="615" data-offset-y="0" data-expected-width="215" data-expected-height="115">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="-85" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: auto / 2; grid-row: auto / 2;"
+ data-offset-x="415" data-offset-y="0" data-expected-width="415" data-expected-height="265">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="-85" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: 3 / auto; grid-row: 3 / auto;"
+ data-offset-x="0" data-offset-y="515" data-expected-width="115" data-expected-height="115">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="-85" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: 2 / auto; grid-row: 2 / auto;"
+ data-offset-x="0" data-offset-y="265" data-expected-width="415" data-expected-height="365">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="-85" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: -4 / 1; grid-row: -4 / 1;"
+ data-offset-x="615" data-offset-y="65" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="-85" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: -4 / 2; grid-row: -4 / 2;"
+ data-offset-x="415" data-offset-y="65" data-expected-width="300" data-expected-height="200">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="-85" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: 3 / 4; grid-row: 3 / 4;"
+ data-offset-x="15" data-offset-y="515" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="sixRowsAndSixColumns"
+ data-offset-x="-85" data-offset-y="15" data-expected-width="900" data-expected-height="600">
+ </div>
+ <div class="absolute" style="grid-column: 2 / 4; grid-row: 2 / 4;"
+ data-offset-x="15" data-offset-y="265" data-expected-width="400" data-expected-height="300">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-sizing-positioned-items-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-sizing-positioned-items-001.html
new file mode 100644
index 00000000000..4bd43cc9b23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/grid-sizing-positioned-items-001.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid sizing positioned items</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<meta name="assert" content="This test checks the different size options for absolutely positioned grid items.">
+<link href="../support/grid.css" rel="stylesheet">
+<style>
+
+.grid {
+ grid-template-columns: 100px 200px;
+ grid-template-rows: 50px 150px;
+ width: 100%;
+ height: 100%;
+ border: 5px solid black;
+ margin: 30px;
+ padding: 15px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.lengthSize {
+ width: 50px;
+ height: 20px;
+}
+
+.percentageSize {
+ width: 50%;
+ height: 20%;
+}
+
+.offsets {
+ left: 5px;
+ right: 10px;
+ top: 15px;
+ bottom: 20px;
+}
+
+.onlyFirstRowOnlyFirstColumn {
+ background-color: blue;
+ grid-column: 1 / 2;
+ grid-row: 1 / 2;
+}
+
+.endSecondRowEndSecondColumn {
+ background-color: orange;
+ grid-column-end: 3;
+ grid-row-end: 3;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="unconstrainedContainer">
+ <div class="grid">
+ <div class="absolute autoRowAutoColumn sizedToGridArea"
+ data-offset-x="0" data-offset-y="0" data-expected-width="1030" data-expected-height="1030">
+ </div>
+ <div class="absolute secondRowSecondColumn sizedToGridArea"
+ data-offset-x="115" data-offset-y="65" data-expected-width="915" data-expected-height="965">
+ </div>
+ <div class="absolute onlyFirstRowOnlyFirstColumn sizedToGridArea"
+ data-offset-x="15" data-offset-y="15" data-expected-width="100" data-expected-height="50">
+ </div>
+ <div class="absolute endSecondRowEndSecondColumn sizedToGridArea"
+ data-offset-x="0" data-offset-y="0" data-expected-width="315" data-expected-height="215">
+ </div>
+ </div>
+</div>
+
+<div class="unconstrainedContainer">
+ <div class="grid">
+ <div class="absolute autoRowAutoColumn lengthSize"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="20">
+ </div>
+ <div class="absolute secondRowSecondColumn lengthSize"
+ data-offset-x="115" data-offset-y="65" data-expected-width="50" data-expected-height="20">
+ </div>
+ <div class="absolute onlyFirstRowOnlyFirstColumn lengthSize"
+ data-offset-x="15" data-offset-y="15" data-expected-width="50" data-expected-height="20">
+ </div>
+ <div class="absolute endSecondRowEndSecondColumn lengthSize"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="20">
+ </div>
+ </div>
+</div>
+
+<div class="unconstrainedContainer">
+ <div class="grid">
+ <div class="absolute autoRowAutoColumn percentageSize"
+ data-offset-x="0" data-offset-y="0" data-expected-width="515" data-expected-height="206">
+ </div>
+ <div class="absolute secondRowSecondColumn percentageSize"
+ data-offset-x="115" data-offset-y="65" data-expected-width="457.5" data-expected-height="193">
+ </div>
+ <div class="absolute onlyFirstRowOnlyFirstColumn percentageSize"
+ data-offset-x="15" data-offset-y="15" data-expected-width="50" data-expected-height="10">
+ </div>
+ <div class="absolute endSecondRowEndSecondColumn percentageSize"
+ data-offset-x="0" data-offset-y="0" data-expected-width="157.5" data-expected-height="43">
+ </div>
+ </div>
+</div>
+
+<div class="unconstrainedContainer">
+ <div class="grid">
+ <div class="absolute autoRowAutoColumn offsets"
+ data-offset-x="5" data-offset-y="15" data-expected-width="1015" data-expected-height="995">
+ </div>
+ <div class="absolute secondRowSecondColumn offsets"
+ data-offset-x="120" data-offset-y="80" data-expected-width="900" data-expected-height="930">
+ </div>
+ <div class="absolute onlyFirstRowOnlyFirstColumn offsets"
+ data-offset-x="20" data-offset-y="30" data-expected-width="85" data-expected-height="15">
+ </div>
+ <div class="absolute endSecondRowEndSecondColumn offsets"
+ data-offset-x="5" data-offset-y="15" data-expected-width="300" data-expected-height="180">
+ </div>
+ </div>
+</div>
+
+<div class="unconstrainedContainer">
+ <div class="grid directionRTL">
+ <div class="absolute autoRowAutoColumn sizedToGridArea"
+ data-offset-x="0" data-offset-y="0" data-expected-width="1030" data-expected-height="1030">
+ </div>
+ <div class="absolute secondRowSecondColumn sizedToGridArea"
+ data-offset-x="0" data-offset-y="65" data-expected-width="915" data-expected-height="965">
+ </div>
+ <div class="absolute onlyFirstRowOnlyFirstColumn sizedToGridArea"
+ data-offset-x="915" data-offset-y="15" data-expected-width="100" data-expected-height="50">
+ </div>
+ <div class="absolute endSecondRowEndSecondColumn sizedToGridArea"
+ data-offset-x="715" data-offset-y="0" data-expected-width="315" data-expected-height="215">
+ </div>
+ </div>
+</div>
+
+<div class="unconstrainedContainer">
+ <div class="grid directionRTL">
+ <div class="absolute autoRowAutoColumn lengthSize"
+ data-offset-x="980" data-offset-y="0" data-expected-width="50" data-expected-height="20">
+ </div>
+ <div class="absolute secondRowSecondColumn lengthSize"
+ data-offset-x="865" data-offset-y="65" data-expected-width="50" data-expected-height="20">
+ </div>
+ <div class="absolute onlyFirstRowOnlyFirstColumn lengthSize"
+ data-offset-x="965" data-offset-y="15" data-expected-width="50" data-expected-height="20">
+ </div>
+ <div class="absolute endSecondRowEndSecondColumn lengthSize"
+ data-offset-x="980" data-offset-y="0" data-expected-width="50" data-expected-height="20">
+ </div>
+ </div>
+</div>
+
+<div class="unconstrainedContainer">
+ <div class="grid directionRTL">
+ <div class="absolute autoRowAutoColumn percentageSize"
+ data-offset-x="515" data-offset-y="0" data-expected-width="515" data-expected-height="206">
+ </div>
+ <div class="absolute secondRowSecondColumn percentageSize"
+ data-offset-x="457.5" data-offset-y="65" data-expected-width="457.5" data-expected-height="193">
+ </div>
+ <div class="absolute onlyFirstRowOnlyFirstColumn percentageSize"
+ data-offset-x="965" data-offset-y="15" data-expected-width="50" data-expected-height="10">
+ </div>
+ <div class="absolute endSecondRowEndSecondColumn percentageSize"
+ data-offset-x="873" data-offset-y="0" data-expected-width="157.5" data-expected-height="43">
+ </div>
+ </div>
+</div>
+
+<div class="unconstrainedContainer">
+ <div class="grid directionRTL">
+ <div class="absolute autoRowAutoColumn offsets"
+ data-offset-x="5" data-offset-y="15" data-expected-width="1015" data-expected-height="995">
+ </div>
+ <div class="absolute secondRowSecondColumn offsets"
+ data-offset-x="5" data-offset-y="80" data-expected-width="900" data-expected-height="930">
+ </div>
+ <div class="absolute onlyFirstRowOnlyFirstColumn offsets"
+ data-offset-x="920" data-offset-y="30" data-expected-width="85" data-expected-height="15">
+ </div>
+ <div class="absolute endSecondRowEndSecondColumn offsets"
+ data-offset-x="720" data-offset-y="15" data-expected-width="300" data-expected-height="180">
+ </div>
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-should-not-create-implicit-tracks-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-should-not-create-implicit-tracks-001.html
new file mode 100644
index 00000000000..25881a48e50
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-should-not-create-implicit-tracks-001.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Positioned grid items should not create implicit tracks</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<meta name="assert" content="This test checks that positioned items shouldn't create implicit tracks on the grid.">
+<link href="../support/grid.css" rel="stylesheet">
+<style>
+
+.grid {
+ grid-auto-columns: 100px;
+ grid-auto-rows: 50px;
+ width: 400px;
+ height: 300px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.seventhRowFourthColumn {
+ background-color: coral;
+ grid-column: 4;
+ grid-row: 7;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<div class="grid">
+ <div class="sizedToGridArea absolute seventhRowFourthColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="400" data-expected-height="300">
+ </div>
+ <div class="autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50">
+ </div>
+ <div class="autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="50" data-expected-width="100" data-expected-height="50">
+ </div>
+ <div class="autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="100" data-expected-width="100" data-expected-height="50">
+ </div>
+ <div class="autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="150" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-should-not-take-up-space-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-should-not-take-up-space-001.html
new file mode 100644
index 00000000000..c7983671cc9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-should-not-take-up-space-001.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Positioned grid items should not take up space</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<meta name="assert" content="This test checks that positioned items shouldn't take up space or otherwise participate in the layout of the grid.">
+<link href="../support/grid.css" rel="stylesheet">
+<style>
+
+.grid {
+ grid-template-columns: 50px 100px;
+ grid-template-rows: 50px 100px;
+ width: 150px;
+ height: 150px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+ /* Ensures that the grid container is the containing block of the fixed positioned grid children. */
+ transform: translate(10px, 20px);
+}
+
+.absolute {
+ position: absolute;
+}
+
+.fixed {
+ position: fixed;
+}
+
+.offsetLeft100 {
+ left: 100px;
+}
+
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onload="checkLayout('.grid')">
+
+<div id="log"></div>
+
+<p>Absolutely positioned:</p>
+
+<div class="grid">
+ <div class="sizedToGridArea absolute autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea absolute autoRowAutoColumn offsetLeft100"
+ data-offset-x="100" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea absolute autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="50" data-offset-y="0" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea absolute autoRowAutoColumn offsetLeft100"
+ data-offset-x="100" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="50" data-offset-y="0" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="50" data-offset-y="0" data-expected-width="100" data-expected-height="50">
+ <div class="sizedToGridArea absolute autoRowAutoColumn"
+ data-offset-x="50" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="50" data-expected-width="50" data-expected-height="100">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="50" data-offset-y="0" data-expected-width="100" data-expected-height="50">
+ <div class="sizedToGridArea absolute autoRowAutoColumn offsetLeft100"
+ data-offset-x="100" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="50" data-expected-width="50" data-expected-height="100">
+ </div>
+</div>
+
+<p>Fixed positioned:</p>
+
+<div class="grid">
+ <div class="sizedToGridArea fixed autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea fixed autoRowAutoColumn offsetLeft100"
+ data-offset-x="100" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea fixed autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="50" data-offset-y="0" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea fixed autoRowAutoColumn offsetLeft100"
+ data-offset-x="100" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="50" data-offset-y="0" data-expected-width="100" data-expected-height="50">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="50" data-offset-y="0" data-expected-width="100" data-expected-height="50">
+ <div class="sizedToGridArea fixed autoRowAutoColumn"
+ data-offset-x="50" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="50" data-expected-width="50" data-expected-height="100">
+ </div>
+</div>
+
+<div class="grid">
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="50" data-offset-y="0" data-expected-width="100" data-expected-height="50">
+ <div class="sizedToGridArea fixed autoRowAutoColumn offsetLeft100"
+ data-offset-x="100" data-offset-y="0" data-expected-width="150" data-expected-height="150">
+ </div>
+ </div>
+ <div class="sizedToGridArea autoRowAutoColumn"
+ data-offset-x="0" data-offset-y="50" data-expected-width="50" data-expected-height="100">
+ </div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-sizing-001-ref.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-sizing-001-ref.html
new file mode 100644
index 00000000000..a468863543f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-sizing-001-ref.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Positioned grid items sizing reference file</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<meta name="flags" content="ahem">
+<link href="../support/grid.css" rel="stylesheet">
+<style>
+
+.grid {
+ grid: 25px 50px / 100px 60px;
+ margin: 1px 2px 3px 4px;
+ padding: 6px 3px 9px 12px;
+ border: solid;
+ border-width: 8px 2px 4px 6px;
+ font: 10px/1 Ahem;
+ float: left;
+ inline-size: 200px;
+ block-size: 100px;
+ justify-items: start;
+ align-items: start;
+}
+
+</style>
+
+<p>The test passes if it has the same output than the reference.</p>
+
+<div class="grid">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
+
+<div class="grid verticalLR">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
+
+<div class="grid verticalLR directionRTL">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
+
+<div class="grid verticalRL">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
+
+<div class="grid verticalRL directionRTL">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-sizing-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-sizing-001.html
new file mode 100644
index 00000000000..ae128064f1d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/abspos/positioned-grid-items-sizing-001.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Positioned grid items sizing</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#abspos" title="9. Absolute Positioning">
+<link rel="match" href="positioned-grid-items-sizing-001-ref.html">
+<meta name="assert" content="This test checks that the sizing of positioned grid items without specific dimensions or offsets is equivalent to the size of regular items.">
+<meta name="flags" content="ahem">
+<link href="../support/grid.css" rel="stylesheet">
+<style>
+
+.grid {
+ grid: 25px 50px / 100px 60px;
+ margin: 1px 2px 3px 4px;
+ padding: 6px 3px 9px 12px;
+ border: solid;
+ border-width: 8px 2px 4px 6px;
+ font: 10px/1 Ahem;
+ float: left;
+ inline-size: 200px;
+ block-size: 100px;
+ /* Ensures that the grid container is the containing block of the absolutely positioned grid children. */
+ position: relative;
+}
+
+.grid > div {
+ position: absolute;
+}
+
+</style>
+
+<p>The test passes if it has the same output than the reference.</p>
+
+<div class="grid">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
+
+<div class="grid directionRTL">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
+
+<div class="grid verticalLR">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
+
+<div class="grid verticalLR directionRTL">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
+
+<div class="grid verticalRL">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
+
+<div class="grid verticalRL directionRTL">
+ <div class="onlyFirstRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlyFirstRowOnlySecondColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlyFirstColumn">XXX XX X XX XXX</div>
+ <div class="onlySecondRowOnlySecondColumn">XXX XX X XX XXX</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html
new file mode 100644
index 00000000000..71e1ee8425d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-001.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid's align-items value from 'stretch' to 'start' causes non-replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: stretch;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 200);
+ grid.style.alignItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html
new file mode 100644
index 00000000000..01f48ccde75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-002.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid's align-items value from 'start' to 'stretch' causes non-replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: start;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 100);
+ grid.style.alignItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html
new file mode 100644
index 00000000000..d3c5ae10614
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-003.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid's align-items value from 'stretch' to 'normal' causes no effect on non-replaced items.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: stretch;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 200);
+ grid.style.alignItems = "normal";
+ evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html
new file mode 100644
index 00000000000..1f5ca8d19b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-004.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid item's align-items value from 'normal' to 'stretch' causes no effect on non-replaced items.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: normal;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 200);
+ grid.style.alignItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html
new file mode 100644
index 00000000000..07b0aca7376
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-005.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid's align-items value from 'start' to 'normal' causes non-replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: start;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 100);
+ grid.style.alignItems = "normal";
+ evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html
new file mode 100644
index 00000000000..f0f4d5d4353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-006.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid's align-items value from 'normal' to 'start' causes non-replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: normal;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 200);
+ grid.style.alignItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html
new file mode 100644
index 00000000000..5dd70bd1f61
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-007.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid item's align-items value from 'start' to 'stretch' causes non-replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 80px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: start;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 100);
+ grid.style.alignItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-height", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html
new file mode 100644
index 00000000000..f1b22c56353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-008.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid item's align-items value from 'stretch' to 'start' causes non-replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 80px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: stretch;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 80);
+ grid.style.alignItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html
new file mode 100644
index 00000000000..fb0041ce71f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-009.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid item's align-items value from 'start' to 'normal' causes non-replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 80px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: start;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 100);
+ grid.style.alignItems = "normal";
+ evaluateStyleChange(item, "after", "data-expected-height", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html
new file mode 100644
index 00000000000..1e68845baaa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-010.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid item's align-items value from 'normal' to 'start' causes non-replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 80px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: normal;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 80);
+ grid.style.alignItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-width="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html
new file mode 100644
index 00000000000..e38852090ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-011.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid's align-items value from 'stretch' to 'start' causes replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: stretch;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 200);
+ grid.style.alignItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html
new file mode 100644
index 00000000000..3ab4977a4d9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-012.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid's align-items value from 'start' to 'stretch' causes replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: start;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 100);
+ grid.style.alignItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html
new file mode 100644
index 00000000000..bd6ce3f94dd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-013.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid's align-items value from 'stretch' to 'normal' causes replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: stretch;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 200);
+ grid.style.alignItems = "normal";
+ evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html
new file mode 100644
index 00000000000..ab565666b5c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-014.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid item's align-items value from 'normal' to 'stretch' causes non-replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: normal;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 100);
+ grid.style.alignItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-height", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html
new file mode 100644
index 00000000000..844713a7285
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-015.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid item's align-items value from 'start' to 'normal' causes no effect on replaced items.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: start;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 100);
+ grid.style.alignItems = "normal";
+ evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html
new file mode 100644
index 00000000000..dd3b4bee1dd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-016.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid item's align-items value from 'normal' to 'start' causes no effect on replaced items.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 200px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: normal;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 100);
+ grid.style.alignItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html
new file mode 100644
index 00000000000..5b2c20e8339
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-017.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-normal">
+<meta name="assert" content="Changing the grid item's align-items value from 'start' to 'stretch' causes replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 80px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: start;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 100);
+ grid.style.alignItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-height", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html
new file mode 100644
index 00000000000..77711aaad38
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-018.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-start">
+<meta name="assert" content="Changing the grid item's align-items value from 'stretch' to 'start' causes replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 100px;
+ grid-template-rows: 80px;
+ font: 20px/1 Ahem;
+ background: grey;
+ align-items: stretch;
+}
+#item {
+ background: blue;
+ align-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-height", 80);
+ grid.style.alignItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-height", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html
new file mode 100644
index 00000000000..9d0bbc936ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-019.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid's justify-items value from 'stretch' to 'start' causes non-replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: stretch;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 200);
+ grid.style.justifyItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-width", 120);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html
new file mode 100644
index 00000000000..86dc27130d1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-020.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid's justify-items value from 'start' to 'stretch' causes non-replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: start;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 120);
+ grid.style.justifyItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html
new file mode 100644
index 00000000000..1c92223bff6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-021.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid's justify-items value from 'stretch' to 'normal' causes no effect on non-replaced items.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: stretch;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 200);
+ grid.style.alignItems = "normal";
+ evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html
new file mode 100644
index 00000000000..94a634b9ad4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-022.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid item's justify-items value from 'normal' to 'stretch' causes no effect on non-replaced items.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: normal;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 200);
+ grid.style.justifyItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html
new file mode 100644
index 00000000000..3476f12200c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-023.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid's justify-items value from 'start' to 'normal' causes non-replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: start;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 120);
+ grid.style.justifyItems = "normal";
+ evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html
new file mode 100644
index 00000000000..92db0024543
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-024.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid's justify-items value from 'normal' to 'start' causes non-replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: normal;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 200);
+ grid.style.justifyItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-width", 120);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-height="100" id="item">XX X<br>X XXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html
new file mode 100644
index 00000000000..997fa855415
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-025.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid item's justify-items value from 'start' to 'stretch' causes non-replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 80px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: start;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 120);
+ grid.style.justifyItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-width", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-height="100" id="item">XXXXXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html
new file mode 100644
index 00000000000..9d18be6f264
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-026.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid item's justify-items value from 'stretch' to 'start' causes non-replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 80px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: stretch;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 80);
+ grid.style.justifyItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-width", 120);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-height="100" id="item">XXXXXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html
new file mode 100644
index 00000000000..78b9fbd72d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-027.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid item's justify-items value from 'start' to 'normal' causes non-replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 80px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: start;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 120);
+ grid.style.justifyItems = "normal";
+ evaluateStyleChange(item, "after", "data-expected-width", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-height="100" id="item">XXXXXX<br>X<br>XX XXX</div>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html
new file mode 100644
index 00000000000..1426cc41b06
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-028.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid item's justify-items value from 'normal' to 'start' causes non-replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 80px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: normal;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 80);
+ grid.style.justifyItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-width", 120);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <div data-expected-height="100" id="item">XXXXXX<br>X<br>XX XXX</div>
+</div>
+</body>
+
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html
new file mode 100644
index 00000000000..ca9f47a5846
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-029.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid's justify-items value from 'stretch' to 'start' causes replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: stretch;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 200);
+ grid.style.justifyItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-width", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html
new file mode 100644
index 00000000000..103b04d76fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-030.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid's justify-items value from 'start' to 'stretch' causes replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: start;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 100);
+ grid.style.justifyItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html
new file mode 100644
index 00000000000..9c85e5a9035
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-031.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid's justify-items value from 'stretch' to 'normal' causes replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: stretch;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 200);
+ grid.style.justifyItems = "normal";
+ evaluateStyleChange(item, "after", "data-expected-width", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html
new file mode 100644
index 00000000000..093c0f966e0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-032.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid item's justify-items value from 'normal' to 'stretch' causes non-replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: normal;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 100);
+ grid.style.justifyItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-width", 200);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-width="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html
new file mode 100644
index 00000000000..1cf535803bb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-033.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid item's justify-items value from 'start' to 'normal' causes no effect on replaced items.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: start;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 100);
+ grid.style.justifyItems = "normal";
+ evaluateStyleChange(item, "after", "data-expected-width", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html
new file mode 100644
index 00000000000..87ec1ae07d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-034.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid item's justify-items value from 'normal' to 'start' causes no effect on replaced items.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 200px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: normal;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 100);
+ grid.style.justifyItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-width", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html
new file mode 100644
index 00000000000..1968522fecf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-035.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-normal">
+<meta name="assert" content="Changing the grid item's justify-items value from 'start' to 'stretch' causes replaced items to shrink.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 80px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: start;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 100);
+ grid.style.justifyItems = "stretch";
+ evaluateStyleChange(item, "after", "data-expected-width", 80);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html
new file mode 100644
index 00000000000..a79740308a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-alignment-implies-size-change-036.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Changes on Default-Alignment may affect grid item's width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-item-sizing">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-items">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-start">
+<meta name="assert" content="Changing the grid item's justify-items value from 'stretch' to 'start' causes replaced items to grow.">
+<style>
+.grid {
+ position: relative;
+ display: inline-grid;
+ grid-template-columns: 80px;
+ grid-template-rows: 100px;
+ font: 20px/1 Ahem;
+ background: grey;
+ justify-items: stretch;
+}
+#item {
+ background: blue;
+ justify-self: auto;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+<script src="../support/style-change.js"></script>
+<script>
+function runTest() {
+ evaluateStyleChange(item, "before", "data-expected-width", 80);
+ grid.style.justifyItems = "start";
+ evaluateStyleChange(item, "after", "data-expected-width", 100);
+}
+</script>
+<body onload="runTest()">
+<div class="grid" id="grid">
+ <img data-expected-height="100" id="item" src="../grid-items/support/100x100-green.png"></img>
+</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-001.html
index f8aa1c9b727..7b53a2897b8 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-001.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-002.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-002.html
index d273c7bd076..194934bb93e 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-002.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-002.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-003.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-003.html
index b5cf8c0964b..ed6e3226390 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-003.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-003.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-004.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-004.html
index a2e4930c109..419d0fb1bd3 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-004.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-004.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-stretch">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-005.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-005.html
index 0b544ff15f2..2830aecab6b 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-005.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-005.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution default value</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-stretch">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-006.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-006.html
index 7cb2bc1b94b..61cfe2b68ed 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-006.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-006.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' and gaps on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-007.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-007.html
index 34faa7470ba..d4dce5dc95a 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-007.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-007.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' on 3x3 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-008.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-008.html
index f2a3f5d33d9..3e381ec68b3 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-008.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-008.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' and gaps on 3x3 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-009.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-009.html
index 2acad9d4a7a..aa28a980b66 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-009.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-009.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' on 4x4 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-010.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-010.html
index cc80076d332..cb08775cd24 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-010.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-010.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' and gaps on 4x4 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-011.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-011.html
index c5ef6d74436..57eb3d0eac2 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-011.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-011.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' and gaps on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-012.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-012.html
index 2b41ea26365..e45dbec8fce 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-012.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-012.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' on 3x3 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-013.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-013.html
index 1160cb7a5cc..3e1df650fb1 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-013.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-013.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' and gaps on 3x3 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-014.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-014.html
index 2d8d24abdb4..423aad172bc 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-014.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-014.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' on 4x4 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-015.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-015.html
index f754528c0d1..ef4c857db66 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-015.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-015.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' and gaps on 4x4 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-016.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-016.html
index b372aaecb9c..11a66915de5 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-016.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-016.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' and gaps on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-017.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-017.html
index 6155df77b5b..9a490ad9483 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-017.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-017.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' on 3x3 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around">
<link rel="match" href="../../reference/ref-filled-green-300px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-019.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-019.html
index 2941b752459..49ca22eb245 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-019.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-019.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' on 4x4 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-020.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-020.html
index da5773b08c1..249f57d93fe 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-020.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-020.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' and gaps on 4x4 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around">
<link rel="match" href="../../reference/ref-filled-green-300px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-021.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-021.html
index 0f3bb845e19..6a5469fc8c7 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-021.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-021.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' and gaps on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-stretch">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-022.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-022.html
index e660c2fe561..15a69c11025 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-022.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-022.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' on 3x3 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-stretch">
<link rel="match" href="../../reference/ref-filled-green-300px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-023.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-023.html
index 011e4436948..f5d07b76487 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-023.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-023.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' and gaps on 3x3 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-stretch">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-024.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-024.html
index 73ae83f53da..1b6932bca56 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-024.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-024.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' on 4x4 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-stretch">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-025.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-025.html
index 1909192a2b2..f229a56f4fb 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-025.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-025.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' and gaps on 4x4 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-stretch">
<link rel="match" href="../../reference/ref-filled-green-300px-square.html">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-001.html
index 72571da66c9..ebd169cf591 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-001.html
@@ -2,9 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' with collapsed tracks on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#distribution-values">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#collapsed-track">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution alignment ignore collapsed grid tracks and render correctly with a value of 'space-evenly'.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-002.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-002.html
index 7fd26610b93..a48c377ef32 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-002.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-002.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' with collapsed tracks on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#collapsed-track">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution alignment ignore collapsed grid tracks and render correctly with a value of 'space-between'.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-003.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-003.html
index f0100c02de0..25c03022a37 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-003.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-003.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' with collapsed tracks on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#collapsed-track">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution alignment ignore collapsed grid tracks and render correctly with a value of 'space-around'.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-004.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-004.html
index d8b43b64c1d..a280a69871e 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-004.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-004.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' with collapsed tracks on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#collapsed-track">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution alignment ignore collapsed grid tracks and render correctly with a value of 'stretch'.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-005.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-005.html
index d2a323e10be..34d62116ed3 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-005.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-005.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' and gaps on 2x2 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-evenly' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-006.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-006.html
index ce3cbafbd55..151d34d2bb4 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-006.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-006.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' on 3x3 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-evenly' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-007.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-007.html
index 2e6a4af8edf..061e93bae7a 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-007.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-007.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' and gaps on 3x3 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-evenly' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-008.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-008.html
index b2995521716..1b7135e70b3 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-008.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-008.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' on 4x4 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-evenly' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-009.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-009.html
index 0eb19a3b7ad..0bc4adae76e 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-009.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-009.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-evenly' and gaps on 4x4 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-evenly">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-evenly' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-010.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-010.html
index 16783fd8482..eccf0041c81 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-010.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-010.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' and gaps on 2x2 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-between' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-011.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-011.html
index 7ba130a601e..fca4df588da 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-011.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-011.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' on 3x3 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-between' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-012.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-012.html
index 0eb6c84057e..4250c14126c 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-012.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-012.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' and gaps on 3x3 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-between' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-013.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-013.html
index 1f70083e720..f20741e4a00 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-013.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-013.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' on 4x4 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-between' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-014.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-014.html
index 86543695ae8..78d2477109b 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-014.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-014.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-between' and gaps on 4x4 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-between">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-between' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-015.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-015.html
index 9d7be68411c..e8247e0419b 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-015.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-015.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' and gaps on 2x2 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-around' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-016.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-016.html
index bbaad008872..511961f34e5 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-016.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-016.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' on 3x3 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around">
<link rel="match" href="../../reference/ref-filled-green-300px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-around' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-017.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-017.html
index ec2ea308f5b..f587301599a 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-017.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-017.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' and gaps on 3x3 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-around' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-018.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-018.html
index 93ba652bca8..d91c1c5cab2 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-018.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-018.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' on 4x4 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-around' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-019.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-019.html
index 484ca20c1fa..7a09ce699d6 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-019.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-019.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'space-around' and gaps on 4x4 grid with collapsed tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#valdef-align-content-space-around">
<link rel="match" href="../../reference/ref-filled-green-300px-square.html">
<meta name="assert" content="Content Distribution properties with 'space-around' value render correcly.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-020.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-020.html
index 7e9988c6ef0..f0a29e7f45a 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-020.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-020.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' with collapsed tracks on 2x2 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#collapsed-track">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution alignment ignore collapsed grid tracks and render correctly with a value of 'stretch'.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-021.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-021.html
index 1c8cf66f3aa..d45f528d497 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-021.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-021.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' with collapsed tracks on 3x3 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#collapsed-track">
<link rel="match" href="../../reference/ref-filled-green-300px-square.html">
<meta name="assert" content="Content Distribution alignment ignore collapsed grid tracks and render correctly with a value of 'stretch'.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-022.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-022.html
index 3b9a2082c4e..7f837ba4b2e 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-022.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-022.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' and gaps with collapsed tracks on 3x3 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#collapsed-track">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution alignment ignore collapsed grid tracks and render correctly with a value of 'stretch'.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-023.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-023.html
index b39ea2cb6e4..11de67a099a 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-023.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-023.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' with collapsed tracks on 4x4 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#collapsed-track">
<link rel="match" href="../../reference/ref-filled-green-200px-square.html">
<meta name="assert" content="Content Distribution alignment ignore collapsed grid tracks and render correctly with a value of 'stretch'.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-024.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-024.html
index 97d95403884..9afd058692d 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-024.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-content-distribution-with-collapsed-tracks-024.html
@@ -2,8 +2,9 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Content Distribution 'stretch' and gaps with collapsed tracks on 4x4 grid</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#collapsed-track">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#content-distribution">
-<link rel="help" href="https://drafts.csswg.org/css-grid/#collapsed-track">
<link rel="match" href="../../reference/ref-filled-green-300px-square.html">
<meta name="assert" content="Content Distribution alignment ignore collapsed grid tracks and render correctly with a value of 'stretch'.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-fit-content-tracks-dont-stretch-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-fit-content-tracks-dont-stretch-001.html
new file mode 100644
index 00000000000..367386c2538
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-fit-content-tracks-dont-stretch-001.html
@@ -0,0 +1,208 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: fit-content() tracks don't stretch</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#track-sizing" title="7.2. Explicit Track Sizing: the grid-template-rows and grid-template-columns properties">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align" title="10.5. Aligning the Grid: the justify-content and align-content properties">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#algo-stretch" title="11.8. Stretch auto Tracks">
+<meta name="flags" content="ahem dom">
+<meta name="assert" content="This test checks that 'fit-content()' tracks behave the same with 'normal', 'stretch' or 'start' values for content distribution properties.">
+
+<style>
+.grid {
+ display: grid;
+ width: 400px;
+ height: 200px;
+ font: 25px/1 Ahem;
+}
+
+.constrainedGrid {
+ width: 20px;
+ height: 10px;
+}
+
+.fitContent200x100 {
+ grid-template-columns: fit-content(200px);
+ grid-template-rows: fit-content(100px);
+}
+
+.placeContentStretch {
+ place-content: stretch;
+}
+
+.placeContentStart {
+ place-content: start;
+}
+</style>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../support/check-layout-th.js"></script>
+
+<body onLoad="checkLayout('.grid');">
+
+<div id="log"></div>
+
+<h1>1) place-content: normal</h1>
+
+<h2>1.2) Unconstrained grid container</h2>
+
+<div class="grid" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="400" data-expected-height="200">X</div>
+</div>
+
+<div class="grid" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="400" data-expected-height="200">XXXX XXX XX X</div>
+</div>
+
+<div class="grid fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="25" data-expected-height="25">X</div>
+</div>
+
+<div class="grid fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="200" data-expected-height="50">XXXX XXX XX X</div>
+</div>
+
+<div class="grid fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="225" data-expected-height="50">XXXXXXXXX X</div>
+</div>
+
+<div class="grid fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="50" data-expected-height="125">XX<br>X<br>X<br>X<br>X</div>
+</div>
+
+<h2>1.2) Constrained grid container</h2>
+
+<div class="grid constrainedGrid" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="25" data-expected-height="25">X</div>
+</div>
+
+<div class="grid constrainedGrid" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="100" data-expected-height="75">XXXX XXX XX X</div>
+</div>
+
+<div class="grid constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="25" data-expected-height="25">X</div>
+</div>
+
+<div class="grid constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="100" data-expected-height="75">XXXX XXX XX X</div>
+</div>
+
+<div class="grid constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="225" data-expected-height="50">XXXXXXXXX X</div>
+</div>
+
+<div class="grid constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="50" data-expected-height="125">XX<br>X<br>X<br>X<br>X</div>
+</div>
+
+<h1>2) place-content: stretch</h1>
+
+<h2>2.2) Unconstrained grid container</h2>
+
+<div class="grid placeContentStretch" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="400" data-expected-height="200">X</div>
+</div>
+
+<div class="grid placeContentStretch" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="400" data-expected-height="200">XXXX XXX XX X</div>
+</div>
+
+<div class="grid placeContentStretch fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="25" data-expected-height="25">X</div>
+</div>
+
+<div class="grid placeContentStretch fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="200" data-expected-height="50">XXXX XXX XX X</div>
+</div>
+
+<div class="grid placeContentStretch fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="225" data-expected-height="50">XXXXXXXXX X</div>
+</div>
+
+<div class="grid placeContentStretch fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="50" data-expected-height="125">XX<br>X<br>X<br>X<br>X</div>
+</div>
+
+<h2>2.2) Constrained grid container</h2>
+
+<div class="grid placeContentStretch constrainedGrid" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="25" data-expected-height="25">X</div>
+</div>
+
+<div class="grid placeContentStretch constrainedGrid" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="100" data-expected-height="75">XXXX XXX XX X</div>
+</div>
+
+<div class="grid placeContentStretch constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="25" data-expected-height="25">X</div>
+</div>
+
+<div class="grid placeContentStretch constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="100" data-expected-height="75">XXXX XXX XX X</div>
+</div>
+
+<div class="grid placeContentStretch constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="225" data-expected-height="50">XXXXXXXXX X</div>
+</div>
+
+<div class="grid placeContentStretch constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="50" data-expected-height="125">XX<br>X<br>X<br>X<br>X</div>
+</div>
+
+<h1>3) place-content: start</h1>
+
+<h2>3.1) Unconstrained grid container</h2>
+
+<div class="grid placeContentStart" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="25" data-expected-height="25">X</div>
+</div>
+
+<div class="grid placeContentStart" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="325" data-expected-height="25">XXXX XXX XX X</div>
+</div>
+
+<div class="grid placeContentStart fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="25" data-expected-height="25">X</div>
+</div>
+
+<div class="grid placeContentStart fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="200" data-expected-height="50">XXXX XXX XX X</div>
+</div>
+
+<div class="grid placeContentStart fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="225" data-expected-height="50">XXXXXXXXX X</div>
+</div>
+
+<div class="grid placeContentStart fitContent200x100" data-expected-width="400" data-expected-height="200">
+ <div data-expected-width="50" data-expected-height="125">XX<br>X<br>X<br>X<br>X</div>
+</div>
+
+<h2>3.2) Constrained grid container</h2>
+
+<div class="grid placeContentStart constrainedGrid" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="25" data-expected-height="25">X</div>
+</div>
+
+<div class="grid placeContentStart constrainedGrid" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="100" data-expected-height="75">XXXX XXX XX X</div>
+</div>
+
+<div class="grid placeContentStart constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="25" data-expected-height="25">X</div>
+</div>
+
+<div class="grid placeContentStart constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="100" data-expected-height="75">XXXX XXX XX X</div>
+</div>
+
+<div class="grid placeContentStart constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="225" data-expected-height="50">XXXXXXXXX X</div>
+</div>
+
+<div class="grid placeContentStart constrainedGrid fitContent200x100" data-expected-width="20" data-expected-height="10">
+ <div data-expected-width="50" data-expected-height="125">XX<br>X<br>X<br>X<br>X</div>
+</div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html
index b25b47134f4..e700587bdfe 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-001.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-002.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-002.html
index b9a354e04e2..30413e0bba1 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-002.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-002.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-003.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-003.html
index 0af408115e7..63ab28e75b0 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-003.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-003.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-004.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-004.html
index ad76f526fc8..6566e9c1f47 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-004.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-004.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html
index 68e794bdaa6..16890320d8c 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-005.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html
index 94c65d0b1df..c090ef84d49 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-006.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html
index 8cb459ed9d5..8a5161ceb8a 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-007.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html
index 52337ee21d8..d103a448ddd 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-008.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-009.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-009.html
index 22bcc707e84..f971ddbf33e 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-009.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-009.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-010.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-010.html
index 02e138e8b0b..1541a27a2c3 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-010.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-010.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-011.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-011.html
index 060e0251b05..dc2738b6b62 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-011.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-011.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-012.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-012.html
index 422d2eb0aaf..1c04de18e95 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-012.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-012.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html
index ba88de03d1d..d8acd61dd5f 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-013.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html
index 9b3d64d7591..0b048089c2d 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-014.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html
index c7290f7ced6..dc366eb106e 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-015.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html
index 1365b709b3b..27dab09be52 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-016.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html
index ac300a5ee62..5c057624d98 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-001.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html
index 00e4ca70c3c..abcf06e3338 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-002.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html
index dd961948ff3..ca185bdc591 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-003.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html
index 8b5882ced71..bc0b8d6ca15 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-004.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-005.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-005.html
index 4b29aa7c3b9..b155f5c7ded 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-005.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-005.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-006.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-006.html
index a72fbd13826..23ee97951aa 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-006.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-006.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-007.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-007.html
index ab190d39a31..5496e781b50 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-007.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-007.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-008.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-008.html
index 5be86531a6c..556ca0f1531 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-008.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-008.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html
index f38ceb6af33..75433ad48d8 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-009.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html
index 6744c0573ec..7ed26cfccd4 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-010.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html
index fa50dff5aa3..701d9a803c5 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-011.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html
index 94773382679..323ad98a4c7 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-012.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-013.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-013.html
index 25baada5b96..dde2a18e255 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-013.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-013.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-014.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-014.html
index 19a8ede86f7..2a80035067c 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-014.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-014.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-015.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-015.html
index 45c8b757c9d..34e501f9752 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-015.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-015.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-016.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-016.html
index 2a47e02d503..5cc5a0290bf 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-016.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-lr-016.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html
index 1afde93aa86..28a78306aac 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-001.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html
index a7a1c97d224..297b5ff15cd 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-002.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html
index 96cbad39826..e958ec266c0 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-003.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html
index c93b7b6ebab..ef2a7e6c537 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-004.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-005.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-005.html
index 73f7a6fb9d6..c512afe5679 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-005.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-005.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-006.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-006.html
index 0a6d003ff03..584bfb9860a 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-006.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-006.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-007.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-007.html
index ac9231412f4..257de49c97b 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-007.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-007.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-008.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-008.html
index 4756ebad6db..4e9c264f5b6 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-008.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-008.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on fixed-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html
index 4d05c9f5e0f..cb66f6162eb 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-009.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html
index 1cb5b8dc7c2..b551d3e6147 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-010.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html
index 535d57c3a01..a56e83a2e72 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-011.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html
index 8ed59c7fd74..91c8ce68489 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-012.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-013.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-013.html
index 4070c2ec011..20eafb785b7 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-013.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-013.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-014.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-014.html
index d6a6b30d6e5..61038b22bf0 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-014.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-014.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-015.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-015.html
index e6ef67df8f6..3cadf7f55de 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-015.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-015.html
@@ -2,6 +2,7 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-016.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-016.html
index 5e26d1407ab..03d6f7d78a4 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-016.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/grid-self-alignment-stretch-vertical-rl-016.html
@@ -2,9 +2,11 @@
<meta charset="utf-8">
<title>CSS Grid Layout Test: Self-Alignment and stretch on auto-sized tracks</title>
<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#alignment">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-align-self">
<link rel="help" href="https://drafts.csswg.org/css-align-3/#propdef-justify-self">
<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-justify-self-stretch">
+<link rel="help" href="https://drafts.csswg.org/css-align/#valdef-align-self-stretch">
<meta name="assert" content="The stretched orthogonal grid items along the column and/or row axis include their defined padding-box.">
<style>
.grid {
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html
new file mode 100644
index 00000000000..a7d69063189
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-001.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Column-Axis Self-Baseline alignment may change grid area height on a fixed grid.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: grid;
+ width: 100px;
+ height: 100px;
+ color: green;
+ grid-auto-columns: 50px;
+ align-items: baseline;
+ align-content: start;
+}
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 8px; left: 0px;">XX<br>XXXX<br>XX<br>XX X</div>
+ <div style="top: 0px; left: 50px" class="big">X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn">XX XXXX XX</div>
+ <div class="firstRowSecondColumn big">X</div>
+ <div class="secondRowFirstColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-002.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-002.html
new file mode 100644
index 00000000000..48956dd3c4e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-002.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Column-Axis Self-Baseline alignment may change grid area height on fixed-sized grid and content-distribution.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: grid;
+ width: 100px;
+ height: 100px;
+ color: green;
+ grid-auto-columns: 50px;
+ align-items: baseline;
+ align-content: space-evenly;
+}
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 25px; left: 0px;">XX<br>XXXX<br>XX</div>
+ <div style="top: 73px; left: 0px;">XX X</div>
+ <div style="top: 17px; left: 50px" class="big">X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn">XX XXXX XX</div>
+ <div class="firstRowSecondColumn big">X</div>
+ <div class="secondRowFirstColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-003.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-003.html
new file mode 100644
index 00000000000..e4ea440ac9e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-003.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Column-Axis Self-Baseline alignment may change grid area height on fixed-sized grid and empty items .">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: grid;
+ width: 100px;
+ height: 100px;
+ color: green;
+ grid-auto-columns: 50px;
+ align-items: baseline;
+ align-content: start;
+}
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+ font: 20px/1 Ahem;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 0px; left: 0px; width: 40px; background: red; height: 40px;"></div>
+ <div style="top: 24px; left: 50px" class="big">X</div>
+ <div style="top: 44px; left: 0px;">XX X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn" style="background: green; width: 40px; height: 40px;"></div>
+ <div class="firstRowSecondColumn big">X</div>
+ <div class="secondRowFirstColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html
new file mode 100644
index 00000000000..5730701bd1b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-004.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Column-Axis Self-Baseline alignment may change grid area height on auto-sized grid.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: inline-grid;
+ color: green;
+ grid-auto-columns: 50px;
+ align-items: baseline;
+ align-content: start;
+}
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 8px; left: 0px;">XX<br>XXXX<br>XX<br>XX X</div>
+ <div style="top: 0px; left: 50px" class="big">X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn">XX XXXX XX</div>
+ <div class="firstRowSecondColumn big">X</div>
+ <div class="secondRowFirstColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html
new file mode 100644
index 00000000000..63057b22c1d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-005.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Column-Axis Self-Baseline alignment may change grid area height on auto-sized grid and gutters.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: inline-grid;
+ color: green;
+ grid-auto-columns: 50px;
+ align-items: baseline;
+ grid-row-gap: 20px;
+}
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 8px; left: 0px;">XX<br>XXXX<br>XX</div>
+ <div style="top: 58px; left: 0px;">XX X</div>
+ <div style="top: 0px; left: 50px" class="big">X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn">XX XXXX XX</div>
+ <div class="firstRowSecondColumn big">X</div>
+ <div class="secondRowFirstColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-006.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-006.html
new file mode 100644
index 00000000000..4e0eae404b9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-006.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area height</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#column-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Column-Axis Self-Baseline alignment may change grid area height on auto-sized grid and empty items.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: inline-grid;
+ font: 10px/1 Ahem;
+ color: green;
+ grid-auto-columns: 50px;
+ align-items: baseline;
+}
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 0px; left: 0px; width: 40px; background: red; height: 40px;"></div>
+ <div style="top: 24px; left: 50px" class="big">X</div>
+ <div style="top: 44px; left: 0px;">XX X</div>
+</div>
+<div class="grid"">
+ <div class="firstRowFirstColumn" style="background: green; width: 40px; height: 40px;"></div>
+ <div class="firstRowSecondColumn big">X</div>
+ <div class="secondRowFirstColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-007.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-007.html
new file mode 100644
index 00000000000..6fcd35631ed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-007.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Row-Axis Self-Baseline alignment may change grid area width on fixed-sized grid.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: grid;
+ width: 100px;
+ height: 100px;
+ color: green;
+ grid-auto-rows: 50px;
+ justify-items: baseline;
+ justify-content: start;
+}
+.grid > div { writing-mode: vertical-lr; }
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 0px; left: 5px;">XXXX<br>XXXX</div>
+ <div style="top: 20px; left: 15px;">X</div>
+ <div style="top: 30px; left: 15px;">X X</div>
+ <div style="top: 50px; left: 0px" class="big">X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn">XX XXXX XX</div>
+ <div class="secondRowFirstColumn big">X</div>
+ <div class="firstRowSecondColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-008.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-008.html
new file mode 100644
index 00000000000..9aee9b3f515
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-008.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Row-Axis Self-Baseline alignment may change grid area width on fixed-sized grid and content-distribution.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: grid;
+ width: 100px;
+ height: 100px;
+ color: green;
+ grid-auto-rows: 50px;
+ justify-items: baseline;
+ justify-content: space-evenly;
+}
+.grid > div { writing-mode: vertical-lr; }
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 0px; left: 23px;">XXX<br>XXX</div>
+ <div style="top: 0px; left: 72px;">X</div>
+ <div style="top: 10px; left: 72px;">X</div>
+ <div style="top: 20px; left: 33px;">X</div>
+ <div style="top: 30px; left: 33px;">X</div>
+ <div style="top: 30px; left: 72px;">X</div>
+ <div style="top: 50px; left: 18px" class="big">X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn">XX XXXX XX</div>
+ <div class="secondRowFirstColumn big">X</div>
+ <div class="firstRowSecondColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-009.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-009.html
new file mode 100644
index 00000000000..155a20c0771
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-009.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Row-Axis Self-Baseline alignment may change grid area width on fixed-sized grid and empty items.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: grid;
+ width: 100px;
+ height: 100px;
+ color: green;
+ grid-auto-rows: 50px;
+ justify-items: baseline;
+ justify-content: start;
+}
+.grid > div { writing-mode: vertical-lr; }
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 0px; left: 10px; width: 40px; background: red; height: 40px;"></div>
+ <div style="top: 0px; left: 50px;">X</div>
+ <div style="top: 10px; left: 50px;">X</div>
+ <div style="top: 30px; left: 50px;">X</div>
+ <div style="top: 50px; left: 0px" class="big">X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn" style="background: green; width: 40px; height: 40px;"></div>
+ <div class="secondRowFirstColumn big">X</div>
+ <div class="firstRowSecondColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-010.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-010.html
new file mode 100644
index 00000000000..6333bf3f73b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-010.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Row-Axis Self-Baseline alignment may change grid area width on auto-sized grid.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: inline-grid;
+ color: green;
+ grid-auto-rows: 50px;
+ justify-items: baseline;
+ justify-content: start;
+}
+.grid > div { writing-mode: vertical-lr; }
+.big { font-size: 20px; }
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 0px; left: 5px;">XXXX<br>XXXX</div>
+ <div style="top: 20px; left: 15px;">X</div>
+ <div style="top: 30px; left: 15px;">X X</div>
+ <div style="top: 50px; left: 0px" class="big">X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn">XX XXXX XX</div>
+ <div class="secondRowFirstColumn big">X</div>
+ <div class="firstRowSecondColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-011.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-011.html
new file mode 100644
index 00000000000..4f54208ade1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-011.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Row-Axis Self-Baseline alignment may change grid area width on auto-sized grid and gutters.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: inline-grid;
+ color: green;
+ grid-auto-rows: 50px;
+ justify-items: baseline;
+ grid-column-gap: 20px;
+}
+.grid > div { writing-mode: vertical-lr; }
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 0px; left: 5px;">XXX<br>XXX</div>
+ <div style="top: 0px; left: 55px;">X</div>
+ <div style="top: 10px; left: 55px;">X</div>
+ <div style="top: 20px; left: 15px;">X</div>
+ <div style="top: 30px; left: 15px;">X</div>
+ <div style="top: 30px; left: 55px;">X</div>
+ <div style="top: 50px; left: 0px" class="big">X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn">XX XXXX XX</div>
+ <div class="secondRowFirstColumn big">X</div>
+ <div class="firstRowSecondColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-012.html b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-012.html
new file mode 100644
index 00000000000..db7d45e412b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-012.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Self-Baseline alignment may change grid area width</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#row-align">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#baseline-align-self">
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-by-baseline">
+<link rel="match" href="../../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Row-Axis Self-Baseline alignment may change grid area width on auto-sized grid and empty items.">
+<style>
+.block, .grid { font: 10px/1 Ahem; }
+.big { font-size: 20px; }
+.block {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.block > div {
+ position: absolute;
+ color: red;
+}
+.grid {
+ display: inline-grid;
+ color: green;
+ grid-auto-rows: 50px;
+ justify-items: baseline;
+ justify-content: start;
+}
+.grid > div { writing-mode: vertical-lr; }
+.firstRowFirstColumn {
+ grid-row: 1;
+ grid-column: 1;
+}
+.secondRowFirstColumn {
+ grid-row: 2;
+ grid-column: 1;
+}
+.firstRowSecondColumn {
+ grid-row: 1;
+ grid-column: 2;
+}
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="block">
+ <div style="top: 0px; left: 10px; width: 40px; background: red; height: 40px;"></div>
+ <div style="top: 0px; left: 50px;">X</div>
+ <div style="top: 10px; left: 50px;">X</div>
+ <div style="top: 30px; left: 50px;">X</div>
+ <div style="top: 50px; left: 0px;">X</div>
+</div>
+<div class="grid">
+ <div class="firstRowFirstColumn" style="background: green; width: 40px; height: 40px;"></div>
+ <div class="secondRowFirstColumn big">X</div>
+ <div class="firstRowSecondColumn">XX X</div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/grid-definition/grid-shorthand-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/grid-definition/grid-shorthand-001.html
new file mode 100644
index 00000000000..476415e8dfe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/grid-definition/grid-shorthand-001.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: 'grid' shorthand does not reset gutter properties</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-shorthand">
+<meta name="flags" content="dom">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #grid {
+ display: grid;
+ grid-column-gap: 10px;
+ grid-row-gap: 20px;
+ }
+</style>
+<div id="grid"></div>
+<script>
+ var grid = document.getElementById("grid");
+
+ test(
+ () => {
+ assert_equals(window.getComputedStyle(grid)["grid-template-columns"], "none");
+ assert_equals(window.getComputedStyle(grid)["grid-template-rows"], "none");
+ assert_equals(window.getComputedStyle(grid)["grid-column-gap"], "10px");
+ assert_equals(window.getComputedStyle(grid)["grid-row-gap"], "20px");
+ }, "Check gutter properties initial values");
+
+ grid.style.grid = "100px / 200px";
+
+ test(
+ () => {
+ assert_equals(window.getComputedStyle(grid)["grid-template-columns"], "200px");
+ assert_equals(window.getComputedStyle(grid)["grid-template-rows"], "100px");
+ assert_equals(window.getComputedStyle(grid)["grid-column-gap"], "10px");
+ assert_equals(window.getComputedStyle(grid)["grid-row-gap"], "20px");
+ }, "Check gutter properties after setting 'grid' shorthand");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-006.html b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-006.html
index 1f0086eac76..69bbc7c0981 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-006.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-006.html
@@ -5,7 +5,7 @@
<link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.6. Implied Minimum Size of Grid Items">
<link rel="match" href="ref-filled-green-100px-square-image.html">
<meta name="flags" content="image">
-<meta name="assert" content="Checks that minimum size for grid items is the specified size for width (regardless the content size) and the transferred size for height (as it's smaller than the content size of the image).">
+<meta name="assert" content="Checks that minimum size for grid items is the specified size for width (regardless the content size) and the transferred size of the image for height (even when content size is bigger).">
<style>
#reference-overlapped-red {
position: absolute;
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-007.html b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-007.html
index 6f13d8b0835..8899ca1c7ae 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-007.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-007.html
@@ -5,7 +5,7 @@
<link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.6. Implied Minimum Size of Grid Items">
<link rel="match" href="ref-filled-green-100px-square-image.html">
<meta name="flags" content="image">
-<meta name="assert" content="Checks that minimum size for grid items is the specified size for width (regardless the content size) and the content size for height (as it's smaller than the transferred size of the image).">
+<meta name="assert" content="Checks that minimum size for grid items is the specified size for width (regardless the content size) and the transferred size of the image for height (even when content size is smaller).">
<style>
#reference-overlapped-red {
position: absolute;
@@ -17,12 +17,13 @@
#constrained-grid {
display: grid;
+ grid-template-columns: auto auto;
width: 10px;
height: 10px;
}
- #test-grid-item-overlapping-green {
- width: 100px;
+ .test-grid-item-overlapping-green {
+ width: 50px;
justify-self: stretch;
align-self: stretch;
}
@@ -31,6 +32,7 @@
<div id="reference-overlapped-red"></div>
<div id="constrained-grid">
- <img id="test-grid-item-overlapping-green" src="support/50x100-green.png" alt="Image download support must be enabled" />
+ <img class="test-grid-item-overlapping-green" src="support/25x50-green.png" alt="Image download support must be enabled" />
+ <img class="test-grid-item-overlapping-green" src="support/25x50-green.png" alt="Image download support must be enabled" />
</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-008.html b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-008.html
index b69070c4c16..c945490c480 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-008.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-008.html
@@ -5,7 +5,7 @@
<link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.6. Implied Minimum Size of Grid Items">
<link rel="match" href="ref-filled-green-100px-square-image.html">
<meta name="flags" content="image">
-<meta name="assert" content="Checks that minimum size for grid items is the specified size for height (regardless the content size) and the transferred size for width (as it's smaller than the content size of the image).">
+<meta name="assert" content="Checks that minimum size for grid items is the specified size for height (regardless the content size) and the transferred size of the image for width (even when content size is bigger).">
<style>
#reference-overlapped-red {
position: absolute;
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-009.html b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-009.html
index e0239cf37a5..77d8979cbdd 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-009.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-009.html
@@ -5,7 +5,7 @@
<link rel="help" href="http://www.w3.org/TR/css-grid-1/#min-size-auto" title="6.6. Implied Minimum Size of Grid Items">
<link rel="match" href="ref-filled-green-100px-square-image.html">
<meta name="flags" content="image">
-<meta name="assert" content="Checks that minimum size for grid items is the specified size for height (regardless the content size) and the content size for width (as it's smaller than the transferred size of the image).">
+<meta name="assert" content="Checks that minimum size for grid items is the specified size for height (regardless the content size) and the transferred size for width of the image (even when content size is smaller).">
<style>
#reference-overlapped-red {
position: absolute;
@@ -21,8 +21,8 @@
height: 10px;
}
- #test-grid-item-overlapping-green {
- height: 100px;
+ .test-grid-item-overlapping-green {
+ height: 50px;
justify-self: stretch;
align-self: stretch;
}
@@ -31,6 +31,7 @@
<div id="reference-overlapped-red"></div>
<div id="constrained-grid">
- <img id="test-grid-item-overlapping-green" src="support/100x50-green.png" alt="Image download support must be enabled" />
+ <img class="test-grid-item-overlapping-green" src="support/50x25-green.png" alt="Image download support must be enabled" />
+ <img class="test-grid-item-overlapping-green" src="support/50x25-green.png" alt="Image download support must be enabled" />
</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-021.html b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-021.html
index d05e3e5e2b9..136872fafc1 100644
--- a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-021.html
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/grid-minimum-size-grid-items-021.html
@@ -67,17 +67,17 @@
function runTests() {
checkGridSizeTracksAndImageSize("grid-1", "img-1", "200px", "200px", "200px", "200px", "200px", "200px");
- checkGridSizeTracksAndImageSize("grid-2", "img-2", "10px", "10px", "200px", "50px", "200px", "200px");
- checkGridSizeTracksAndImageSize("grid-3", "img-3", "200px", "50px", "200px", "50px", "200px", "200px");
- checkGridSizeTracksAndImageSize("grid-4", "img-4", "200px", "10px", "200px", "50px", "200px", "200px");
+ checkGridSizeTracksAndImageSize("grid-2", "img-2", "10px", "10px", "200px", "200px", "200px", "200px");
+ checkGridSizeTracksAndImageSize("grid-3", "img-3", "200px", "200px", "200px", "200px", "200px", "200px");
+ checkGridSizeTracksAndImageSize("grid-4", "img-4", "200px", "10px", "200px", "200px", "200px", "200px");
checkGridSizeTracksAndImageSize("grid-5", "img-5", "200px", "50px", "50px", "50px", "50px", "50px");
checkGridSizeTracksAndImageSize("grid-6", "img-6", "200px", "10px", "50px", "50px", "50px", "50px");
checkGridSizeTracksAndImageSize("grid-7", "img-7", "200px", "225px", "200px", "200px 25px", "200px", "200px");
- checkGridSizeTracksAndImageSize("grid-8", "img-8", "10px", "10px", "200px", "50px 25px", "200px", "200px");
- checkGridSizeTracksAndImageSize("grid-9", "img-9", "200px", "125px", "200px", "100px 25px", "200px", "200px");
- checkGridSizeTracksAndImageSize("grid-10", "img-10", "200px", "10px", "200px", "50px 25px", "200px", "200px");
+ checkGridSizeTracksAndImageSize("grid-8", "img-8", "10px", "10px", "200px", "200px 25px", "200px", "200px");
+ checkGridSizeTracksAndImageSize("grid-9", "img-9", "200px", "225px", "200px", "200px 25px", "200px", "200px");
+ checkGridSizeTracksAndImageSize("grid-10", "img-10", "200px", "10px", "200px", "200px 25px", "200px", "200px");
checkGridSizeTracksAndImageSize("grid-11", "img-11", "200px", "125px", "100px", "100px 25px", "100px", "100px");
- checkGridSizeTracksAndImageSize("grid-12", "img-12", "200px", "10px", "100px", "50px 25px", "100px", "100px");
+ checkGridSizeTracksAndImageSize("grid-12", "img-12", "200px", "10px", "100px", "100px 25px", "100px", "100px");
checkGridSizeTracksAndImageSize("grid-13", "img-13", "200px", "200px", "200px", "200px", "200px", "200px");
checkGridSizeTracksAndImageSize("grid-14", "img-14", "10px", "10px", "200px", "200px", "200px", "200px");
checkGridSizeTracksAndImageSize("grid-15", "img-15", "200px", "200px", "200px", "200px", "200px", "200px");
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/100x50-green.png b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/100x50-green.png
deleted file mode 100644
index 67f3eaa646c..00000000000
--- a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/100x50-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/25x50-green.png b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/25x50-green.png
new file mode 100644
index 00000000000..6ab02fce0fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/25x50-green.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/50x100-green.png b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/50x100-green.png
deleted file mode 100644
index c10c9a7f4da..00000000000
--- a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/50x100-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/50x25-green.png b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/50x25-green.png
new file mode 100644
index 00000000000..2bd68e74214
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/grid-items/support/50x25-green.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/implicit-grids/grid-support-grid-auto-columns-rows-002.html b/tests/wpt/web-platform-tests/css/css-grid-1/implicit-grids/grid-support-grid-auto-columns-rows-002.html
new file mode 100644
index 00000000000..2e90b460194
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/implicit-grids/grid-support-grid-auto-columns-rows-002.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Support for 'grid-auto-columns' and 'grid-auto-rows' accepting track listing as value</title>
+<link rel="help" href="http://www.w3.org/TR/css-grid-1/#auto-tracks">
+<link rel="match" href="../reference/grid-support-grid-auto-columns-rows-002-ref.html">
+<link rel="author" title="Rachel Andrew" href="mailto:me@rachelandrew.co.uk" />
+<style>
+ #grid {
+ display: grid;
+ grid-auto-columns: 25px 50px;
+ grid-auto-rows: 40px 30px;
+ }
+
+ #first-column-first-row {
+ grid-column: 1;
+ grid-row: 1;
+ background-color: purple;
+ }
+
+ #second-column-first-row {
+ grid-column: 2;
+ grid-row: 1;
+ background-color: orange;
+ }
+
+ #first-column-second-row {
+ grid-column: 1;
+ grid-row: 2;
+ background-color: green;
+ }
+
+ #second-column-second-row {
+ grid-column: 2;
+ grid-row: 2;
+ background-color: pink;
+ }
+
+ #first-and-second-column-third-row {
+ grid-column: 1 / span 2;
+ grid-row: 3;
+ background-color: silver;
+ }
+
+ #third-column-all-rows {
+ grid-column: 3;
+ grid-row: 1 / span 3;
+ background-color: blue;
+ }
+</style>
+
+<p>The test passes if it has the same visual effect as reference.</p>
+<div id="grid">
+ <div id="first-column-first-row"></div>
+ <div id="second-column-first-row"></div>
+ <div id="first-column-second-row"></div>
+ <div id="second-column-second-row"></div>
+ <div id="first-and-second-column-third-row"></div>
+ <div id="third-column-all-rows"></div>
+</div> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/placement/grid-placement-using-named-grid-lines-001.html b/tests/wpt/web-platform-tests/css/css-grid-1/placement/grid-placement-using-named-grid-lines-001.html
new file mode 100644
index 00000000000..12fdd78204d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/placement/grid-placement-using-named-grid-lines-001.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Grid item placement mixing named grid areas and lines</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" href="http://www.w3.org/TR/css-grid-1/#line-placement">
+<link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-placement-slot">
+<link rel="help" href="http://www.w3.org/TR/css-grid-1/#named-grid-area">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="Line placement algorithm selects the first matching column when using a grid line name associated to several columns and no integer is specified within the custom-ident.">
+<style>
+.grid {
+ display: inline-grid;
+ background: red;
+ grid-template-columns: [C] 25px [C] 25px [C] 25px [C] 25px;
+ grid-auto-rows: 50px;
+ grid-template-areas: "A1 A2 A3 A4"
+ ". A2 A3 A4";
+}
+.grid > div { background: green; }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class="grid">
+ <div style="grid-area: A1"></div>
+ <div style="grid-area: A2"></div>
+ <div style="grid-area: A3"></div>
+ <div style="grid-area: A4"></div>
+ <div style="grid-column: C; grid-row: 2;"></div>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/reference/grid-support-grid-auto-columns-rows-002-ref.html b/tests/wpt/web-platform-tests/css/css-grid-1/reference/grid-support-grid-auto-columns-rows-002-ref.html
new file mode 100644
index 00000000000..4a21823429e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/reference/grid-support-grid-auto-columns-rows-002-ref.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Support for 'grid-auto-columns' and 'grid-auto-rows' properties accepting track listing as value</title>
+<link rel="author" title="Rachel Andrew" href="mailto:me@rachelandrew.co.uk" />
+<style>
+ #grid {
+ position: relative;
+ }
+
+ .absolute {
+ position: absolute;
+ top: 0;
+ left: 0;
+ }
+
+ #first-column-first-row {
+ width: 25px;
+ height: 40px;
+ background-color: purple;
+ }
+
+ #second-column-first-row {
+ width: 50px;
+ height: 40px;
+ left: 25px;
+ background-color: orange;
+ }
+
+ #first-column-second-row {
+ width: 25px;
+ height: 30px;
+ top: 40px;
+ background-color: green;
+ }
+
+ #second-column-second-row {
+ width: 50px;
+ height: 30px;
+ top: 40px;
+ left: 25px;
+ background-color: pink;
+ }
+
+ #first-and-second-column-third-row {
+ width: 75px;
+ height: 40px;
+ top: 70px;
+ background-color: silver;
+ }
+
+ #third-column-all-rows {
+ left: 75px;
+ height: 110px;
+ width: 25px;
+ background-color: blue;
+ }
+</style>
+
+<p>The test passes if it has the same visual effect as reference.</p>
+<div id="grid">
+ <div class="absolute" id="first-column-first-row"></div>
+ <div class="absolute" id="second-column-first-row"></div>
+ <div class="absolute" id="first-column-second-row"></div>
+ <div class="absolute" id="second-column-second-row"></div>
+ <div class="absolute" id="first-and-second-column-third-row"></div>
+ <div class="absolute" id="third-column-all-rows"></div>
+</div> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/support/grid-alignment.css b/tests/wpt/web-platform-tests/css/css-grid-1/support/grid-alignment.css
new file mode 100644
index 00000000000..4cf50154cf4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/support/grid-alignment.css
@@ -0,0 +1,240 @@
+/* align-self */
+.alignSelfAuto { align-self: auto; }
+.alignSelfStretch { align-self: stretch; }
+.alignSelfStart { align-self: start; }
+.alignSelfEnd { align-self: end; }
+.alignSelfCenter { align-self: center; }
+.alignSelfRight { align-self: right; }
+.alignSelfLeft { align-self: left; }
+
+.alignSelfFlexStart { align-self: flex-start; }
+.alignSelfFlexEnd { align-self: flex-end; }
+
+.alignSelfSelfStart { align-self: self-start; }
+.alignSelfSelfEnd { align-self: self-end; }
+
+.alignSelfCenterSafe { align-self: center safe; }
+.alignSelfCenterUnsafe { align-self: center unsafe; }
+.alignSelfEndSafe { align-self: end safe; }
+.alignSelfEndUnsafe { align-self: end unsafe; }
+
+.alignSelfBaseline { align-self: baseline; }
+
+/* align-items */
+.alignItemsAuto { align-items: auto; }
+.alignItemsStretch { align-items: stretch; }
+.alignItemsStart { align-items: start; }
+.alignItemsCenter { align-items: center; }
+.alignItemsEnd { align-items: end; }
+.alignItemsBaseline { align-items: baseline; }
+
+.alignItemsCenterSafe { align-items: center safe; }
+.alignItemsCenterUnsafe { align-items: center unsafe; }
+.alignItemsEndSafe { align-items: end safe; }
+.alignItemsEndUnsafe { align-items: end unsafe; }
+
+/* align-content */
+.alignContentBaseline { align-content: baseline; }
+.alignContentLastBaseline { align-content: last-baseline; }
+.alignContentStart { align-content: start; }
+.alignContentEnd { align-content: end; }
+.alignContentCenter { align-content: center; }
+.alignContentLeft { align-content: left; }
+.alignContentRight { align-content: right; }
+.alignContentFlexStart { align-content: flex-start; }
+.alignContentFlexEnd { align-content: flex-end; }
+.alignContentSpaceBetween { align-content: space-between; }
+.alignContentSpaceAround { align-content: space-around; }
+.alignContentSpaceEvenly { align-content: space-evenly; }
+.alignContentStretch { align-content: stretch; }
+
+/* justify-self */
+.justifySelfAuto { justify-self: auto; }
+.justifySelfStretch { justify-self: stretch; }
+.justifySelfStart { justify-self: start; }
+.justifySelfCenter { justify-self: center; }
+.justifySelfEnd { justify-self: end; }
+.justifySelfRight { justify-self: right; }
+.justifySelfLeft { justify-self: left; }
+
+.justifySelfFlexStart { justify-self: flex-start; }
+.justifySelfFlexEnd { justify-self: flex-end; }
+
+.justifySelfSelfStart { justify-self: self-start; }
+.justifySelfSelfEnd { justify-self: self-end; }
+
+.justifySelfCenterSafe { justify-self: center safe; }
+.justifySelfCenterUnsafe { justify-self: center unsafe; }
+
+.justifySelfBaseline { justify-self: baseline; }
+
+/* justify-items */
+.justifyItemsAuto { justify-items: auto; }
+.justifyItemsStretch { justify-items: stretch; }
+.justifyItemsStart { justify-items: start; }
+.justifyItemsCenter { justify-items: center; }
+.justifyItemsEnd { justify-items: end; }
+
+.justifyItemsCenterSafe { justify-items: center safe; }
+.justifyItemsCenterUnsafe { justify-items: center unsafe; }
+.justifyItemsEndSafe { justify-items: end safe; }
+.justifyItemsEndUnsafe { justify-items: end unsafe; }
+
+.justifyItemsBaseline { justify-items: baseline; }
+
+/* justify-content */
+.justifyContentBaseline { justify-content: baseline; }
+.justifyContentLastBaseline { justify-content: last-baseline; }
+.justifyContentStart { justify-content: start; }
+.justifyContentEnd { justify-content: end; }
+.justifyContentCenter { justify-content: center; }
+.justifyContentLeft { justify-content: left; }
+.justifyContentRight { justify-content: right; }
+.justifyContentFlexStart { justify-content: flex-start; }
+.justifyContentFlexEnd { justify-content: flex-end; }
+.justifyContentSpaceBetween { justify-content: space-between; }
+.justifyContentSpaceAround { justify-content: space-around; }
+.justifyContentSpaceEvenly { justify-content: space-evenly; }
+.justifyContentStretch { justify-content: stretch; }
+
+/* Both align-items and justify-items */
+.itemsNormal {
+ align-items: normal;
+ justify-items: normal;
+}
+
+.itemsStretch {
+ align-items: stretch;
+ justify-items: stretch;
+}
+
+.itemsStart {
+ align-items: start;
+ justify-items: start;
+}
+
+.itemsCenter {
+ align-items: center;
+ justify-items: center;
+}
+
+.itemsEnd {
+ align-items: end;
+ justify-items: end;
+}
+
+.itemsLeft {
+ align-items: left;
+ justify-items: left;
+}
+
+.itemsRight {
+ align-items: right;
+ justify-items: right;
+}
+
+.itemsSelfStart {
+ align-items: self-start;
+ justify-items: self-start;
+}
+
+.itemsSelfEnd {
+ align-items: self-end;
+ justify-items: self-end;
+}
+.itemsBaseline {
+ align-items: baseline;
+ justify-items: baseline;
+}
+
+/* Both align-self and justify-self */
+.selfStretch {
+ align-self: stretch;
+ justify-self: stretch;
+}
+.selfStart {
+ align-self: start;
+ justify-self: start;
+}
+.selfEnd {
+ align-self: end;
+ justify-self: end;
+}
+.selfCenter {
+ align-self: center;
+ justify-self: center;
+}
+.selfRight {
+ align-self: right;
+ justify-self: right;
+}
+.selfLeft {
+ align-self: left;
+ justify-self: left;
+}
+.selfSelfStart {
+ align-self: self-start;
+ justify-self: self-start;
+}
+.selfSelfEnd {
+ align-self: self-end;
+ justify-self: self-end;
+}
+.selfBaseline {
+ align-self: baseline;
+ justify-self: baseline;
+}
+
+/* Both align-content and justify-content */
+.contentStart {
+ align-content: start;
+ justify-content: start;
+}
+.contentCenter {
+ align-content: center;
+ justify-content: center;
+}
+.contentEnd {
+ align-content: end;
+ justify-content: end;
+}
+
+.contentCenterSafe {
+ align-content: center safe;
+ justify-content: center safe;
+}
+
+.contentCenterUnsafe {
+ align-content: center unsafe;
+ justify-content: center unsafe;
+}
+
+.contentEndSafe {
+ align-content: end safe;
+ justify-content: end safe;
+}
+
+.contentEndUnsafe {
+ align-content: end unsafe;
+ justify-content: end unsafe;
+}
+
+.contentSpaceBetween {
+ justify-content: space-between;
+ align-content: space-between;
+}
+
+.contentSpaceAround {
+ justify-content: space-around;
+ align-content: space-around;
+}
+
+.contentSpaceEvenly {
+ justify-content: space-evenly;
+ align-content: space-evenly;
+}
+
+.contentStretch {
+ justify-content: stretch;
+ align-content: stretch;
+}
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/support/grid.css b/tests/wpt/web-platform-tests/css/css-grid-1/support/grid.css
new file mode 100644
index 00000000000..602e114880a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/support/grid.css
@@ -0,0 +1,277 @@
+.grid {
+ display: grid;
+ background-color: grey;
+}
+
+.inline-grid {
+ display: inline-grid;
+ background-color: grey;
+}
+
+.firstRowFirstColumn {
+ background-color: blue;
+ grid-column: 1;
+ grid-row: 1;
+}
+
+.onlyFirstRowOnlyFirstColumn {
+ background-color: blue;
+ grid-column: 1 / 2;
+ grid-row: 1 / 2;
+}
+
+.firstRowSecondColumn {
+ background-color: lime;
+ grid-column: 2;
+ grid-row: 1;
+}
+
+.onlyFirstRowOnlySecondColumn {
+ background-color: lime;
+ grid-column: 2 / 3;
+ grid-row: 1 / 2;
+}
+
+.secondRowFirstColumn {
+ background-color: purple;
+ grid-column: 1;
+ grid-row: 2;
+}
+
+.onlySecondRowOnlyFirstColumn {
+ background-color: purple;
+ grid-column: 1 / 2;
+ grid-row: 2 / 3;
+}
+
+.secondRowSecondColumn {
+ background-color: orange;
+ grid-column: 2;
+ grid-row: 2;
+}
+
+.onlySecondRowOnlySecondColumn {
+ background-color: orange;
+ grid-column: 2 / 3;
+ grid-row: 2 / 3;
+}
+
+.endSecondRowEndSecondColumn {
+ background-color: orange;
+ grid-column-end: 3;
+ grid-row-end: 3;
+}
+
+.thirdRowSecondColumn {
+ background-color: red;
+ grid-column: 2;
+ grid-row: 3;
+}
+
+.firstRowThirdColumn {
+ background-color: magenta;
+ grid-column: 3;
+ grid-row: 1;
+}
+
+.secondRowThirdColumn {
+ background-color: navy;
+ grid-column: 3;
+ grid-row: 2;
+}
+
+.firstRowFourthColumn {
+ background-color: green;
+ grid-column: 4;
+ grid-row: 1;
+}
+
+.secondRowFourthColumn {
+ background-color: pink;
+ grid-column: 4;
+ grid-row: 2;
+}
+
+.firstAutoRowSecondAutoColumn {
+ grid-row: 1 / auto;
+ grid-column: 2 / auto;
+}
+
+.autoLastRowAutoLastColumn {
+ grid-row: auto / -1;
+ grid-column: auto / -1;
+}
+
+.autoSecondRowAutoFirstColumn {
+ grid-row: auto / 2;
+ grid-column: auto / 1;
+}
+
+.firstRowBothColumn {
+ grid-row: 1;
+ grid-column: 1 / -1;
+}
+
+.secondRowBothColumn {
+ grid-row: 2;
+ grid-column: 1 / -1;
+}
+
+.bothRowFirstColumn {
+ grid-row: 1 / -1;
+ grid-column: 1;
+}
+
+.bothRowSecondColumn {
+ grid-row: 1 / -1;
+ grid-column: 2;
+}
+
+.bothRowBothColumn {
+ grid-row: 1 / -1;
+ grid-column: 1 / -1;
+}
+
+/* Auto column / row. */
+.autoRowAutoColumn {
+ background-color: pink;
+ grid-column: auto;
+ grid-row: auto;
+}
+
+.firstRowAutoColumn {
+ background-color: blue;
+ grid-column: auto;
+ grid-row: 1;
+}
+
+.secondRowAutoColumn {
+ background-color: purple;
+ grid-column: auto;
+ grid-row: 2;
+}
+
+.thirdRowAutoColumn {
+ background-color: navy;
+ grid-column: auto;
+ grid-row: 3;
+}
+
+.autoRowFirstColumn {
+ background-color: lime;
+ grid-column: 1;
+ grid-row: auto;
+}
+
+.autoRowSecondColumn {
+ background-color: orange;
+ grid-column: 2;
+ grid-row: auto;
+}
+
+.autoRowThirdColumn {
+ background-color: magenta;
+ grid-column: 3;
+ grid-row: auto;
+}
+
+.autoRowAutoColumnSpanning2 {
+ background-color: maroon;
+ grid-column: span 2;
+ grid-row: auto;
+}
+
+.autoRowSpanning2AutoColumn {
+ background-color: aqua;
+ grid-column: auto;
+ grid-row: span 2;
+}
+
+.autoRowSpanning2AutoColumnSpanning3 {
+ background-color: olive;
+ grid-column: span 3;
+ grid-row: span 2;
+}
+
+.autoRowSpanning3AutoColumnSpanning2 {
+ background-color: indigo;
+ grid-column: span 2;
+ grid-row: span 3;
+}
+
+.autoRowFirstColumnSpanning2 {
+ background-color: maroon;
+ grid-column: 1 / span 2;
+ grid-row: auto;
+}
+
+.autoRowSecondColumnSpanning2 {
+ background-color: olive;
+ grid-column: 2 / span 2;
+ grid-row: auto;
+}
+
+.firstRowSpanning2AutoColumn {
+ background-color: maroon;
+ grid-column: auto;
+ grid-row: 1 / span 2;
+ height: 100%;
+}
+
+.secondRowSpanning2AutoColumn {
+ background-color: olive;
+ grid-column: auto;
+ grid-row: 2 / span 2;
+ height: 100%;
+}
+
+/* Grid element flow. */
+.gridAutoFlowColumnSparse {
+ grid-auto-flow: column;
+}
+
+.gridAutoFlowColumnDense {
+ grid-auto-flow: column dense;
+}
+
+.gridAutoFlowRowSparse {
+ grid-auto-flow: row;
+}
+
+.gridAutoFlowRowDense {
+ grid-auto-flow: row dense;
+}
+
+/* This rule makes sure the container is smaller than any grid items to avoid distributing any extra logical space to them. */
+.constrainedContainer {
+ width: 10px;
+ height: 10px;
+}
+
+.unconstrainedContainer {
+ width: 1000px;
+ height: 1000px;
+}
+
+.sizedToGridArea {
+ font: 10px/1 Ahem;
+ /* Make us fit our grid area. */
+ width: 100%;
+ height: 100%;
+}
+
+.verticalRL {
+ writing-mode: vertical-rl;
+}
+.verticalLR {
+ writing-mode: vertical-lr;
+}
+.horizontalTB {
+ writing-mode: horizontal-tb;
+}
+.directionRTL {
+ direction: rtl;
+}
+.directionLTR {
+ direction: ltr;
+}
diff --git a/tests/wpt/web-platform-tests/css/css-grid-1/support/style-change.js b/tests/wpt/web-platform-tests/css/css-grid-1/support/style-change.js
new file mode 100644
index 00000000000..636b08a3a01
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-grid-1/support/style-change.js
@@ -0,0 +1,5 @@
+function evaluateStyleChange(element, phase, expectedProperty, expectedResult) {
+ element.className += " " + phase;
+ element.setAttribute(expectedProperty, expectedResult);
+ checkLayout("." + phase);
+}
diff --git a/tests/wpt/web-platform-tests/css/css-logical-properties-1/OWNERS b/tests/wpt/web-platform-tests/css/css-logical-1/OWNERS
index 5790e338d5d..5790e338d5d 100644
--- a/tests/wpt/web-platform-tests/css/css-logical-properties-1/OWNERS
+++ b/tests/wpt/web-platform-tests/css/css-logical-1/OWNERS
diff --git a/tests/wpt/web-platform-tests/css/css-logical-props-1/cascading-001-ref.html b/tests/wpt/web-platform-tests/css/css-logical-1/cascading-001-ref.html
index 79a432c4557..79a432c4557 100644
--- a/tests/wpt/web-platform-tests/css/css-logical-props-1/cascading-001-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-logical-1/cascading-001-ref.html
diff --git a/tests/wpt/web-platform-tests/css/css-logical-props-1/cascading-001.html b/tests/wpt/web-platform-tests/css/css-logical-1/cascading-001.html
index 653925552f8..653925552f8 100644
--- a/tests/wpt/web-platform-tests/css/css-logical-props-1/cascading-001.html
+++ b/tests/wpt/web-platform-tests/css/css-logical-1/cascading-001.html
diff --git a/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-block-size-vlr.html b/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-block-size-vlr.html
index 4c8c13e9987..4c8c13e9987 100644
--- a/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-block-size-vlr.html
+++ b/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-block-size-vlr.html
diff --git a/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-block-size.html b/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-block-size.html
index 66cb318e93d..66cb318e93d 100644
--- a/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-block-size.html
+++ b/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-block-size.html
diff --git a/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-inline-size-vlr.html b/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-inline-size-vlr.html
index 09e17009c97..09e17009c97 100644
--- a/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-inline-size-vlr.html
+++ b/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-inline-size-vlr.html
diff --git a/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-inline-size.html b/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-inline-size.html
index 32ede09cd6d..32ede09cd6d 100644
--- a/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-inline-size.html
+++ b/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-inline-size.html
diff --git a/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-quirklength.html b/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-quirklength.html
new file mode 100644
index 00000000000..04317839f45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-logical-1/logicalprops-quirklength.html
@@ -0,0 +1,30 @@
+<meta charset="utf-8">
+<title>CSS Logical Properties: {max-,min-}block-size</title>
+<link rel="author" title="Xu Xing" href="mailto:openxu@gmail.com">
+<link rel="help" href="https://drafts.csswg.org/css-logical-props-1/#logical-dimension-properties">
+<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style> #dummy {} </style>
+
+<script>
+function isValidDeclaration(cssText) {
+ var cssRule = document.styleSheets[0].cssRules[0];
+ cssRule.style = cssText;
+ var valid = (cssRule.style.length > 0);
+ cssRule.style = "";
+ return valid;
+}
+var tests = [
+ {cssText:"block-size: 1"},
+ {cssText:"min-block-size: 1"},
+ {cssText:"max-block-size: 1"},
+ {cssText:"inline-size: 1"},
+ {cssText:"min-inline-size: 1"},
+ {cssText:"max-inline-size: 1"},
+];
+tests.forEach(function(t) {
+ test(() => assert_false(isValidDeclaration(t.cssText)), 'Check that "' + t.cssText + '" is not valid in quirks mode');
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-logical-properties-1/resources/style-check.js b/tests/wpt/web-platform-tests/css/css-logical-1/resources/style-check.js
index cd129fd51b8..cd129fd51b8 100644
--- a/tests/wpt/web-platform-tests/css/css-logical-properties-1/resources/style-check.js
+++ b/tests/wpt/web-platform-tests/css/css-logical-1/resources/style-check.js
diff --git a/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-quirklength.html b/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-quirklength.html
deleted file mode 100644
index 58b03d05f1f..00000000000
--- a/tests/wpt/web-platform-tests/css/css-logical-properties-1/logicalprops-quirklength.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<meta charset="utf-8">
-<title>CSS Logical Properties: {max-,min-}block-size</title>
-<link rel="author" title="Xu Xing" href="mailto:openxu@gmail.com">
-<link rel="help" href="https://drafts.csswg.org/css-logical-props-1/#logical-dimension-properties">
-<link rel="help" href="https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<style> #dummy {} </style>
-
-<script>
-function isValidDeclaration(cssText) {
- var cssRule = document.styleSheets[0].cssRules[0];
- cssRule.style = cssText;
- var valid = (cssRule.style.length > 0);
- cssRule.style = "";
- return valid;
-}
-var tests = [
- {cssText:"block-size: 1"},
- {cssText:"min-block-size: 1"},
- {cssText:"max-block-size: 1"},
- {cssText:"inline-size: 1"},
- {cssText:"min-inline-size: 1"},
- {cssText:"max-inline-size: 1"},
-];
-tests.forEach(function(t) {
- test(() => assert_false(isValidDeclaration(t.cssText)), "Check that unitless lengths are not valid for logical properties in quirks mode");
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/css/css-masking-1/clip-path-svg-content/clip-path-precision-001.svg b/tests/wpt/web-platform-tests/css/css-masking-1/clip-path-svg-content/clip-path-precision-001.svg
index 64e2b498449..aa8e5ba7e15 100644
--- a/tests/wpt/web-platform-tests/css/css-masking-1/clip-path-svg-content/clip-path-precision-001.svg
+++ b/tests/wpt/web-platform-tests/css/css-masking-1/clip-path-svg-content/clip-path-precision-001.svg
@@ -7,7 +7,7 @@
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#ClipPathElement"/>
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#svg-masks"/>
<html:link rel="help" href="http://www.w3.org/TR/css-masking-1/#MaskElement"/>
- <html:link rel="match" href="reference/clip-path-precision-002-ref.svg" />
+ <html:link rel="match" href="reference/clip-path-precision-001-ref.svg" />
<metadata class="flags">svg</metadata>
<desc class="assert">Various comma values should no influence the precision
of the clipPath element. The test should not show any red outlines
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/OWNERS b/tests/wpt/web-platform-tests/css/css-multicol-1/OWNERS
index ec8236e19b9..1048ba69fda 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/OWNERS
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/OWNERS
@@ -1 +1,2 @@
@frivoal
+@rachelandrew
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-001-ref.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-001-ref.xht
deleted file mode 100644
index 5695c7fe784..00000000000
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-001-ref.xht
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>CSS Reftest Reference</title>
- <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
- <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-07-24 -->
- <meta name="flags" content="image" />
- <style type="text/css"><![CDATA[
- table
- {
- border-spacing: 0px;
- border: gray solid 1em;
- font: 1.25em/1 serif;
- }
-
- td
- {
- padding: 0;
- width: 3em;
- }
-
- td + td {width: 8em;}
-
- img, td {vertical-align: top;}
- ]]></style>
- </head>
- <body>
- <table>
- <tr>
- <td><img src="support/swatch-blue.png" width="40" height="80" alt="Image download support must be enabled" /><img src="support/black20x20.png" width="50" height="20" alt="Image download support must be enabled" /></td><td><img src="support/swatch-orange.png" width="40" height="80" alt="Image download support must be enabled" /></td>
- </tr></table>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-001.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-001.xht
deleted file mode 100644
index 3dba1eddd4f..00000000000
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-001.xht
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>CSS Multi-column Layout Test: Overflowed content inside multicol element</title>
- <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
- <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-07-24 -->
- <link rel="help" href="http://www.w3.org/TR/css3-multicol/#overflow-inside-multicol-elements" title="8.1. Overflow inside multicol elements" />
- <link rel="match" href="multicol-block-clip-001-ref.xht"/>
- <meta name="flags" content="ahem" />
- <meta name="assert" content="This test checks that content in the normal flow that extends into column gaps is clipped in the middle of the column gap." />
- <style type="text/css"><![CDATA[
- div
- {
- border: gray solid 1em;
- font: 1.25em/1 Ahem;
- orphans: 1;
- widows: 1;
- width: 11em;
-
- column-count: 4;
- column-gap: 1em;
- }
-
- h4
- {
- background: black;
- color: black;
- font: inherit;
- margin: 0;
- width: 11em;
- }
-
- #first-column {color: blue;}
-
- #second-column {color: orange;}
-
- #third-column, #fourth-column {color: white;}
- ]]></style>
- </head>
- <body>
- <div>
- <span id="first-column"> ab cd ef gh </span>
- <h4> 1234567890123 </h4>
- <span id="second-column"> ij kl mn oq </span>
- <span id="third-column"> ab cd ef gh </span>
- <span id="fourth-column"> rs tu vw xy </span>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-002-ref.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-002-ref.xht
deleted file mode 100644
index b5ba3f467de..00000000000
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-002-ref.xht
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>CSS Reftest Reference</title>
- <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
- <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-07-24 -->
- <meta name="flags" content="image" />
- <style type="text/css"><![CDATA[
- div
- {
- font: 1.25em/1 serif;
- border: 1em solid gray;
- width: 11em;
- height: 6em;
- position: relative;
- }
-
- img {position: absolute;}
-
- img#black {top: 4em;}
-
- img#first-orange {top: 5em;}
-
- img#second-orange {left: 4em;}
-
- img#first-pink
- {
- left: 4em;
- top: 3em;
- }
-
- img#second-pink {left: 8em;}
-
- img#yellow
- {
- left: 8em;
- top: 1em;
- }
- ]]></style>
- </head>
- <body>
-
- <div>
- <img id="blue" src="support/swatch-blue.png" width="40" height="80" alt="Image download support must be enabled" />
- <img id="black" src="support/black20x20.png" width="70" height="20" alt="Image download support must be enabled" />
- <img id="first-orange" src="support/swatch-orange.png" width="40" height="20" alt="Image download support must be enabled" />
- <img id="second-orange" src="support/swatch-orange.png" width="40" height="60" alt="Image download support must be enabled" />
- <img id="first-pink" src="support/swatch-pink.png" width="40" height="60" alt="Image download support must be enabled" />
- <img id="second-pink" src="support/swatch-pink.png" width="40" height="20" alt="Image download support must be enabled" />
- <img id="yellow" src="support/swatch-yellow.png" width="40" height="80" alt="Image download support must be enabled" />
- </div>
-
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-002.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-002.xht
deleted file mode 100644
index b5f118ea86f..00000000000
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-clip-002.xht
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>CSS Multi-column Layout Test: Overflowed content inside and outside multicol element</title>
- <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
- <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-07-24 -->
- <link rel="help" href="http://www.w3.org/TR/css3-multicol/#overflow-inside-multicol-elements" title="8.1. Overflow inside multicol elements" />
- <link rel="match" href="multicol-block-clip-002-ref.xht"/>
- <meta name="flags" content="ahem" />
- <meta name="assert" content="This test checks that content in the normal flow that extends into column gaps is clipped in the middle of the column gap." />
- <style type="text/css"><![CDATA[
- div
- {
- border: gray solid 1em;
- font: 1.25em/1 Ahem;
- orphans: 1;
- widows: 1;
- width: 11em;
-
- column-count: 3;
- column-gap: 1em;
- }
-
- h4
- {
- background: black;
- color: black;
- font: inherit;
- margin: 0;
- width: 11em;
- }
-
- #first-column {color: blue;}
-
- #second-column {color: orange;}
-
- #third-column {color: pink;}
-
- #fourth-column {color: yellow;}
- ]]></style>
- </head>
- <body>
- <div>
- <span id="first-column"> ab cd ef gh </span>
- <h4> 1234567890123 </h4>
- <span id="second-column"> ij kl mn oq </span>
- <span id="third-column"> ab cd ef gh </span>
- <span id="fourth-column"> rs tu vw xy </span>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-001-ref.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-001-ref.xht
new file mode 100644
index 00000000000..1313948514e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-001-ref.xht
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>CSS Reftest Reference</title>
+ <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
+ <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-07-24 -->
+ <meta name="flags" content="image" />
+ <style type="text/css"><![CDATA[
+ table
+ {
+ border-spacing: 0px;
+ border: gray solid 1em;
+ font: 1.25em/1 serif;
+ }
+
+ td
+ {
+ padding: 0;
+ width: 3em;
+ }
+
+ td + td {width: 8em;}
+
+ img, td {vertical-align: top;}
+ ]]></style>
+ </head>
+ <body>
+ <table>
+ <tr>
+ <td><img src="support/swatch-blue.png" width="40" height="80" alt="Image download support must be enabled" /><img src="support/black20x20.png" width="60" height="20" alt="Image download support must be enabled" /></td><td><img src="support/swatch-orange.png" width="40" height="80" alt="Image download support must be enabled" /></td>
+ </tr></table>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-001.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-001.xht
new file mode 100644
index 00000000000..d9dd34cfe21
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-001.xht
@@ -0,0 +1,48 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>CSS Multi-column Layout Test: Overflowed content inside multicol element</title>
+ <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
+ <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-07-24 -->
+ <link rel="help" href="http://www.w3.org/TR/css3-multicol/#overflow-inside-multicol-elements" title="8.1. Overflow inside multicol elements" />
+ <link rel="match" href="multicol-block-no-clip-001-ref.xht"/>
+ <meta name="flags" content="ahem" />
+ <meta name="assert" content="This test checks that content in the normal flow that extends into column gaps is not clipped in the middle of the column gap." />
+ <style type="text/css"><![CDATA[
+ div
+ {
+ border: gray solid 1em;
+ font: 1.25em/1 Ahem;
+ orphans: 1;
+ widows: 1;
+ width: 11em;
+
+ column-count: 4;
+ column-gap: 1em;
+ }
+
+ h4
+ {
+ background: black;
+ color: black;
+ font: inherit;
+ margin: 0;
+ }
+
+ #first-column {color: blue;}
+
+ #second-column {color: orange;}
+
+ #third-column, #fourth-column {color: white;}
+ ]]></style>
+ </head>
+ <body>
+ <div>
+ <span id="first-column"> ab cd ef gh </span>
+ <h4>123</h4>
+ <span id="second-column"> ij kl mn oq </span>
+ <span id="third-column"> ab cd ef gh </span>
+ <span id="fourth-column"> rs tu vw xy </span>
+ </div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-002-ref.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-002-ref.xht
new file mode 100644
index 00000000000..dd0461feeb0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-002-ref.xht
@@ -0,0 +1,54 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>CSS Reftest Reference</title>
+ <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
+ <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-07-24 -->
+ <meta name="flags" content="image" />
+ <style type="text/css"><![CDATA[
+ div
+ {
+ font: 1.25em/1 serif;
+ border: 1em solid gray;
+ width: 11em;
+ height: 6em;
+ position: relative;
+ }
+
+ img {position: absolute;}
+
+ img#black {top: 4em;}
+
+ img#first-orange {top: 5em;}
+
+ img#second-orange {left: 4em;}
+
+ img#first-pink
+ {
+ left: 4em;
+ top: 3em;
+ }
+
+ img#second-pink {left: 8em;}
+
+ img#yellow
+ {
+ left: 8em;
+ top: 1em;
+ }
+ ]]></style>
+ </head>
+ <body>
+
+ <div>
+ <img id="blue" src="support/swatch-blue.png" width="40" height="80" alt="Image download support must be enabled" />
+ <img id="black" src="support/black20x20.png" width="80" height="20" alt="Image download support must be enabled" />
+ <img id="first-orange" src="support/swatch-orange.png" width="40" height="20" alt="Image download support must be enabled" />
+ <img id="second-orange" src="support/swatch-orange.png" width="40" height="60" alt="Image download support must be enabled" />
+ <img id="first-pink" src="support/swatch-pink.png" width="40" height="60" alt="Image download support must be enabled" />
+ <img id="second-pink" src="support/swatch-pink.png" width="40" height="20" alt="Image download support must be enabled" />
+ <img id="yellow" src="support/swatch-yellow.png" width="40" height="80" alt="Image download support must be enabled" />
+ </div>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-002.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-002.xht
new file mode 100644
index 00000000000..55934ed234c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-block-no-clip-002.xht
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>CSS Multi-column Layout Test: Overflowed content inside and outside multicol element</title>
+ <link rel="author" title="Opera Software ASA" href="http://www.opera.com/" />
+ <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-07-24 -->
+ <link rel="help" href="http://www.w3.org/TR/css3-multicol/#overflow-inside-multicol-elements" title="8.1. Overflow inside multicol elements" />
+ <link rel="match" href="multicol-block-no-clip-002-ref.xht"/>
+ <meta name="flags" content="ahem" />
+ <meta name="assert" content="This test checks that content in the normal flow that extends into column gaps is not clipped in the middle of the column gap." />
+ <style type="text/css"><![CDATA[
+ div
+ {
+ border: gray solid 1em;
+ font: 1.25em/1 Ahem;
+ orphans: 1;
+ widows: 1;
+ width: 11em;
+
+ column-count: 3;
+ column-gap: 1em;
+ }
+
+ h4
+ {
+ background: black;
+ color: black;
+ font: inherit;
+ margin: 0;
+ }
+
+ #first-column {color: blue;}
+
+ #second-column {color: orange;}
+
+ #third-column {color: pink;}
+
+ #fourth-column {color: yellow;}
+ ]]></style>
+ </head>
+ <body>
+ <div>
+ <span id="first-column"> ab cd ef gh </span>
+ <h4>1234</h4>
+ <span id="second-column"> ij kl mn oq </span>
+ <span id="third-column"> ab cd ef gh </span>
+ <span id="fourth-column"> rs tu vw xy </span>
+ </div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-clip-001.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-clip-001.xht
index 378f608d631..f6fae8477f0 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-clip-001.xht
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-clip-001.xht
@@ -7,7 +7,7 @@
<link rel="help" href="http://www.w3.org/TR/css3-multicol/#overflow-inside-multicol-elements" title="8.1. Overflow inside multicol elements" />
<link rel="match" href="multicol-clip-001-ref.xht" />
<meta name="flags" content="ahem" />
- <meta name="assert" content="This test checks that content in the normal flow can extend into column gap before it reaches its middle. In this test, the 'l' and 'c' glyphs are painted into the left half of the column gap; the 'l' and 'e' glyphs extend outside the last column box at the edge of the multi-column and are therefore rendered thanks to the default 'overflow: visible' declaration." />
+ <meta name="assert" content="This test checks that content in the normal flow can extend into column gap. In this test, the 'l' and 'c' glyphs are painted into the left half of the column gap; the 'l' and 'e' glyphs extend outside the last column box at the edge of the multi-column and are therefore rendered thanks to the default 'overflow: visible' declaration." />
<style type="text/css"><![CDATA[
div
{
@@ -41,4 +41,4 @@
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-003-ref.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-003-ref.xht
index 51668fbd462..60074ee46c6 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-003-ref.xht
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-003-ref.xht
@@ -15,11 +15,11 @@
<div><img src="support/swatch-gray.png" width="300" height="20" alt="Image download support must be enabled" /></div>
- <div><img src="support/swatch-gray.png" width="20" height="20" alt="Image download support must be enabled" /><img src="support/swatch-pink.png" width="70" height="20" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="15" height="20" alt="Image download support must be enabled" /><img src="support/swatch-yellow.png" width="35" height="20" alt="Image download support must be enabled" /><img src="support/swatch-purple.png" width="80" height="20" alt="Image download support must be enabled" /><img src="support/swatch-yellow.png" width="60" height="20" alt="Image download support must be enabled" /><img src="support/swatch-gray.png" width="20" height="20" alt="Image download support must be enabled" /></div>
+ <div><img src="support/swatch-gray.png" width="20" height="20" alt="Image download support must be enabled" /><img src="support/swatch-pink.png" width="80" height="20" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="5" height="20" alt="Image download support must be enabled" /><img src="support/swatch-yellow.png" width="35" height="20" alt="Image download support must be enabled" /><img src="support/swatch-purple.png" width="80" height="20" alt="Image download support must be enabled" /><img src="support/swatch-yellow.png" width="60" height="20" alt="Image download support must be enabled" /><img src="support/swatch-gray.png" width="20" height="20" alt="Image download support must be enabled" /></div>
- <div><img src="support/swatch-gray.png" width="20" height="20" alt="Image download support must be enabled" /><img src="support/swatch-orange.png" width="70" height="20" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="15" height="20" alt="Image download support must be enabled" /><img src="support/swatch-yellow.png" width="35" height="20" alt="Image download support must be enabled" /><img src="support/swatch-gray.png" width="80" height="20" alt="Image download support must be enabled" /><img src="support/swatch-yellow.png" width="60" height="20" alt="Image download support must be enabled" /><img src="support/swatch-gray.png" width="20" height="20" alt="Image download support must be enabled" /></div>
+ <div><img src="support/swatch-gray.png" width="20" height="20" alt="Image download support must be enabled" /><img src="support/swatch-orange.png" width="80" height="20" alt="Image download support must be enabled" /><img src="support/swatch-blue.png" width="5" height="20" alt="Image download support must be enabled" /><img src="support/swatch-yellow.png" width="35" height="20" alt="Image download support must be enabled" /><img src="support/swatch-gray.png" width="80" height="20" alt="Image download support must be enabled" /><img src="support/swatch-yellow.png" width="60" height="20" alt="Image download support must be enabled" /><img src="support/swatch-gray.png" width="20" height="20" alt="Image download support must be enabled" /></div>
<div><img src="support/swatch-gray.png" width="300" height="20" alt="Image download support must be enabled" /></div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-003.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-003.xht
index 892f4dda4da..47e6f940796 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-003.xht
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-003.xht
@@ -7,7 +7,7 @@
<link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns" title="3. The number and width of columns" />
<link rel="match" href="multicol-count-computed-003-ref.xht" />
<meta name="flags" content="ahem" />
- <meta name="assert" content="This test checks that if one of 2 adjacent column boxes (2nd and 3rd colum box in this test) does not have any content, then the column rule separating those should not be drawn. In this test, the 3rd colum box should have no inline content. This test also checks that inline content in the normal flow that extends into a column gap should be clipped in the middle of the column gap. So, in this test, inline content in 1st column box should be partially clipped and overlapped partially by 1st column-rule." />
+ <meta name="assert" content="This test checks that if one of 2 adjacent column boxes (2nd and 3rd colum box in this test) does not have any content, then the column rule separating those should not be drawn. In this test, the 3rd colum box should have no inline content. This test also checks that inline content in the normal flow that extends into a column gap should not be clipped in the middle of the column gap. So, in this test, inline content in 1st column box should not be clipped and should overlappe partially the 1st column-rule." />
<style type="text/css"><![CDATA[
div
{
@@ -53,13 +53,11 @@
/*
Since
"
- Content in the normal flow that extends into
- column gaps (e.g., long words or images) is
- clipped in the middle of the column gap.
+ content that extends outside column boxes visibly overflows and is not clipped to the column box.
"
- http://www.w3.org/TR/css3-multicol/#overflow-inside-multicol-elements
+ https://drafts.csswg.org/css-multicol-1/#overflow-inside-multicol-elements
this causes the right-half (0.5em) of the 'K' glyph to
- be overlapped by the right-half (0.75em) of the 1st blue column-rule.
+ overlap the right-half (0.75em) of the 1st blue column-rule.
Same thing should happen to the 'N' glyph of 'ORAN'.
Because no inline content should be rendered into the
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-005.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-005.xht
index 9de2902fc5e..ae2c77e242c 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-005.xht
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-count-computed-005.xht
@@ -7,7 +7,7 @@
<link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-number-and-width-of-columns" title="3. The number and width of columns" />
<link rel="match" href="multicol-count-computed-003-ref.xht" />
<meta name="flags" content="ahem" />
- <meta name="assert" content="This test checks that if one of 2 adjacent column boxes (2nd and 3rd colum box in this test) does not have any content, then the column rule separating those should not be drawn. In this test, the 3rd colum box should have no inline content. This test also checks that inline content in the normal flow that extends into a column gap should be clipped in the middle of the column gap. So, in this test, inline content in 1st column box should be partially clipped and overlapped partially by 1st column-rule." />
+ <meta name="assert" content="This test checks that if one of 2 adjacent column boxes (2nd and 3rd colum box in this test) does not have any content, then the column rule separating those should not be drawn. In this test, the 3rd colum box should have no inline content. This test also checks that inline content in the normal flow that extends into a column gap should not be clipped in the middle of the column gap. So, in this test, inline content in 1st column box should not be partially clipped and should overlap partially with the 1st column-rule." />
<style type="text/css"><![CDATA[
div
{
@@ -57,13 +57,11 @@
/*
Since
"
- Content in the normal flow that extends into
- column gaps (e.g., long words or images) is
- clipped in the middle of the column gap.
+ content that extends outside column boxes visibly overflows and is not clipped to the column box
"
http://www.w3.org/TR/css3-multicol/#overflow-inside-multicol-elements
this causes the right-half (0.5em) of the 'K' glyph to
- be overlapped by the right-half (0.75em) of the 1st blue column-rule.
+ overlap with the right-half (0.75em) of the 1st blue column-rule.
Same thing should happen to the 'N' glyph of 'ORAN'.
Because no inline content should be rendered into the
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-gap-001-ref.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-gap-001-ref.xht
index f8b6ee6a4cb..adbb689de4d 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-gap-001-ref.xht
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-gap-001-ref.xht
@@ -6,7 +6,7 @@
<link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2013-08-05 -->
<meta name="flags" content="image" />
<style type="text/css"><![CDATA[
- div {margin: 1.25em;}
+ div {margin: 1.25em; line-height: 1;}
img {vertical-align: top;}
]]></style>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-gap-large-001.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-gap-large-001.xht
index dc4bc6962f1..442befcd89b 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-gap-large-001.xht
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-gap-large-001.xht
@@ -7,7 +7,7 @@
<link rel="help" href="http://www.w3.org/TR/css3-multicol/#column-gap" title="4.1 'column-gap" />
<link rel="match" href="multicol-gap-large-001-ref.xht" />
<meta name="flags" content="ahem" />
- <meta name="assert" content="This test checks that when 'column-gap' is large and when used 'column-width' is narrow, then content extends into column-gap until its middle and content can extend, overflow outside the edges of the multi-colum element if 'overflow' is set to 'visible'." />
+ <meta name="assert" content="This test checks that when 'column-gap' is large and when used 'column-width' is narrow, then content extends into column-gap and content can extend, overflow outside the edges of the multi-colum element if 'overflow' is set to 'visible'." />
<style type="text/css"><![CDATA[
div
{
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-rule-shorthand-2-ref.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-rule-shorthand-2-ref.xht
new file mode 100644
index 00000000000..e53487be531
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-rule-shorthand-2-ref.xht
@@ -0,0 +1,49 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>multicolumn | column-rule</title>
+<link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/>
+<style><![CDATA[
+body {
+ margin: 0;
+}
+body>div {
+ font-family: ahem;
+ font-size: 1em;
+ line-height: 1em;
+ color: black;
+ background: yellow;
+ margin: 1em;
+ border: 1em solid gray;
+ width: 15em;
+ height: 2em;
+}
+div div {
+ width: 2em;
+ height: 2em;
+ float: left;
+}
+.a {
+ color: blue;
+ width: 1em;
+ margin-left: 1em;
+}
+div+div+div {
+ left: 11em;
+}
+]]></style>
+</head>
+
+<body>
+
+<div>
+ <div>xx xx</div>
+ <div class="a">x x</div>
+ <div>xx xx</div>
+ <div class="a">x x</div>
+ <div>xx xx</div>
+ <div class="a">x x</div>
+ <div>xx xx</div>
+</div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-rule-shorthand-2.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-rule-shorthand-2.xht
index 64f18aaaf23..0e5282b5ab7 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-rule-shorthand-2.xht
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-rule-shorthand-2.xht
@@ -5,7 +5,7 @@
<title>multicolumn | column-rule</title>
<link rel="author" title="Opera Software ASA" href="http://www.opera.com/"/>
<link rel="help" href=""/>
-<link rel="match" href=""/>
+<link rel="match" href="multicol-rule-shorthand-2-ref.xht"/>
<meta name="flags" content=""/>
<style type="text/css"><![CDATA[
body {
diff --git a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-width-small-001.xht b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-width-small-001.xht
index cf45251c892..362aeb17f1e 100644
--- a/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-width-small-001.xht
+++ b/tests/wpt/web-platform-tests/css/css-multicol-1/multicol-width-small-001.xht
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css3-multicol/#cw" title="3.1. 'column-width'" />
<link rel="match" href="multicol-width-small-001-ref.xht" />
<meta name="flags" content="ahem" />
- <meta name="assert" content="This test checks that a set 'column-width' which is small with regards to width of multi-column element. In this test, in-flow content that extends into column gaps is clipped in the middle of the column gap. " />
+ <meta name="assert" content="This test checks that a set 'column-width' which is small with regards to width of multi-column element." />
<style type="text/css"><![CDATA[
div
{
@@ -47,8 +47,6 @@
*B|a|b|u|b|u|B|a| | | | *
*************************
- Every "l", "c" and "e" glyphs are clipped.
-
-->
</body>
diff --git a/tests/wpt/web-platform-tests/css/css-page-3/page-size-001.xht b/tests/wpt/web-platform-tests/css/css-page-3/page-size-001.xht
index 650c40fdabe..1b7ddb2d03f 100644
--- a/tests/wpt/web-platform-tests/css/css-page-3/page-size-001.xht
+++ b/tests/wpt/web-platform-tests/css/css-page-3/page-size-001.xht
@@ -10,7 +10,7 @@
<style type="text/css">
@page {
- size:portait;
+ size:portrait;
}
</style>
@@ -18,4 +18,4 @@
<body>
<div>This page must be printed in portrait orientation: the shorter edges of the page must be horizontal.</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-flexbox-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-flexbox-ref.html
new file mode 100644
index 00000000000..554ffa6d6bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-flexbox-ref.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>Reference for position:sticky elements should work correctly with flexbox</title>
+
+<style>
+.scroller {
+ overflow: scroll;
+ width: 350px;
+ height: 100px;
+ margin-bottom: 15px;
+}
+
+.flex-container {
+ width: 600px;
+ position: relative;
+ display: flex;
+ flex-flow: row wrap;
+}
+
+.green {
+ background-color: green;
+}
+
+.flex-item {
+ height: 85px;
+ width: 100px;
+ display: flex;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollLeft = 50;
+ document.getElementById('scroller2').scrollLeft = 150;
+ document.getElementById('scroller3').scrollLeft = 250;
+});
+</script>
+
+<div id="scroller1" class="scroller">
+ <div class="flex-container">
+ <div class="flex-item"></div>
+ <div class="green flex-item"></div>
+ <div class="green flex-item"></div>
+ </div>
+</div>
+
+<div id="scroller2" class="scroller">
+ <div class="flex-container">
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+ <div class="green flex-item"></div>
+ </div>
+</div>
+
+<div id="scroller3" class="scroller">
+ <div class="flex-container">
+ <div class="flex-item"></div>
+ <div class="flex-item"></div>
+ <div class="green flex-item"></div>
+ <div class="green flex-item"></div>
+ </div>
+</div>
+
+<p>You should see three green boxes of varying size above. There should be no red.</p>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-flexbox.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-flexbox.html
new file mode 100644
index 00000000000..cf4e8cbcdaa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-flexbox.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<title>position:sticky elements should work correctly with flexbox</title>
+<link rel="match" href="position-sticky-flexbox-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that position:sticky elements interoperate correctly with flexbox" />
+
+<style>
+.scroller {
+ overflow: scroll;
+ width: 350px;
+ height: 100px;
+ margin-bottom: 15px;
+}
+
+.flex-container {
+ width: 600px;
+ position: relative;
+ display: flex;
+ flex-flow: row wrap;
+}
+
+.sticky {
+ position: sticky;
+ left: 50px;
+}
+
+.green {
+ background-color: green;
+}
+
+.flex-item {
+ width: 100px;
+ height: 85px;
+ display: flex;
+}
+
+.indicator {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 85px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollLeft = 50;
+ document.getElementById('scroller2').scrollLeft = 150;
+ document.getElementById('scroller3').scrollLeft = 250;
+});
+</script>
+
+<div id="scroller1" class="scroller">
+ <div class="flex-container">
+ <div class="indicator" style="left: 100px;"></div>
+ <div class="flex-item"></div>
+ <div class="sticky green flex-item"></div>
+ <div class="green flex-item"></div>
+ </div>
+</div>
+
+<div id="scroller2" class="scroller">
+ <div class="flex-container">
+ <div class="indicator" style="left: 200px;"></div>
+ <div class="flex-item"></div>
+ <div class="sticky green flex-item"></div>
+ <div class="green flex-item"></div>
+ </div>
+</div>
+
+<div id="scroller3" class="scroller">
+ <div class="flex-container">
+ <div class="indicator" style="left: 300px;"></div>
+ <div class="flex-item"></div>
+ <div class="sticky green flex-item"></div>
+ <div class="green flex-item"></div>
+ </div>
+</div>
+
+<p>You should see three green boxes of varying size above. There should be no red.</p>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-get-bounding-client-rect.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-get-bounding-client-rect.html
index a664ab3d181..18b2acfe16f 100644
--- a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-get-bounding-client-rect.html
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-get-bounding-client-rect.html
@@ -19,6 +19,7 @@ body {
}
.spacer {
+ width: 2000px;
height: 2000px;
}
@@ -26,29 +27,73 @@ body {
width: 100px;
height: 100px;
background-color: green;
- top: 50px;
}
.sticky {
position: sticky;
+ top: 50px;
+ left: 20px;
}
</style>
-<div id="scroller" class="container">
- <div id="sticky" class="sticky box"></div>
+<div id="scroller1" class="container">
+ <div id="sticky1" class="sticky box"></div>
<div class="spacer"></div>
</div>
<script>
test(() => {
- var element = document.getElementById('sticky');
- assert_equals(element.getBoundingClientRect().top, 50);
- document.getElementById('scroller').scrollTop = 100;
- assert_equals(element.getBoundingClientRect().top, 50);
+ var sticky = document.getElementById('sticky1');
+ assert_equals(sticky.getBoundingClientRect().top, 50);
+ document.getElementById('scroller1').scrollTop = 100;
+ assert_equals(sticky.getBoundingClientRect().top, 50);
sticky.style.position = 'relative';
- assert_equals(element.getBoundingClientRect().top, -50);
+ assert_equals(sticky.getBoundingClientRect().top, -50);
sticky.style.position = 'sticky';
- assert_equals(element.getBoundingClientRect().top, 50);
+ assert_equals(sticky.getBoundingClientRect().top, 50);
}, 'sticky positioned element should be observable by getBoundingClientRect.');
</script>
+<div id="scroller2" class="container">
+ <div class="spacer"></div>
+</div>
+
+<script>
+test(() => {
+ var scroller = document.getElementById('scroller2');
+ scroller.scrollTop = 100;
+ scroller.scrollLeft = 75;
+
+ var sticky = document.createElement('div');
+ sticky.className = 'sticky box';
+ scroller.insertBefore(sticky, scroller.querySelector('.spacer'));
+
+ var sticky_bounds = sticky.getBoundingClientRect();
+ var scroller_bounds = scroller.getBoundingClientRect();
+ assert_equals(sticky_bounds.top, scroller_bounds.top + 50);
+ assert_equals(sticky_bounds.left, scroller_bounds.left + 20);
+}, 'getBoundingClientRect should be correct for sticky after script insertion');
+</script>
+
+<div id="scroller3" class="container">
+ <div id="sticky3" class="sticky box"></div>
+ <div class="spacer"></div>
+</div>
+
+<script>
+test(() => {
+ var scroller = document.getElementById('scroller3');
+ var sticky = document.getElementById('sticky3');
+ scroller.scrollTop = 100;
+ scroller.scrollLeft = 75;
+
+ var div = document.createElement('div');
+ div.style.height = '65px';
+ scroller.insertBefore(div, sticky);
+
+ var sticky_bounds = sticky.getBoundingClientRect();
+ var scroller_bounds = scroller.getBoundingClientRect();
+ assert_equals(sticky_bounds.top, scroller_bounds.top + 50);
+ assert_equals(sticky_bounds.left, scroller_bounds.left + 20);
+}, 'getBoundingClientRect should be correct for sticky after script-caused layout');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-grid-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-grid-ref.html
new file mode 100644
index 00000000000..9af81129a63
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-grid-ref.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<title>Reference for position:sticky elements should work correctly with grid layout</title>
+
+<style>
+.scroller {
+ position: relative;
+ overflow-x: scroll;
+ overflow-y: hidden;
+ width: 300px;
+ height: 100px;
+ margin-bottom: 15px;
+}
+
+.grid-container {
+ display: grid;
+ grid-template-columns: 25% 25% 25% 25%;
+ grid-template-rows: 100%;
+ width: 400px;
+ height: 90px;
+}
+
+.green {
+ background-color: green;
+}
+
+.grid-item {
+ width: 100%;
+ height: 100%;
+ grid-row: 1;
+}
+
+.padding {
+ height: 1px;
+ width: 700px;
+}
+
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollLeft = 0;
+ document.getElementById('scroller2').scrollLeft = 150;
+ document.getElementById('scroller3').scrollLeft = 300;
+});
+</script>
+
+<div id="scroller1" class="scroller">
+ <div class="grid-container">
+ <div class="grid-item" style="grid-column: 1;"></div>
+ <div class="green grid-item" style="grid-column: 2;"></div>
+ <div class="green grid-item" style="grid-column: 3;"></div>
+ </div>
+ <div class="padding"></div>
+</div>
+
+<div id="scroller2" class="scroller">
+ <div class="grid-container">
+ <div class="grid-item" style="grid-column: 1;"></div>
+ <div class="grid-item" style="grid-column: 2;"></div>
+ <div class="green grid-item" style="grid-column: 3;"></div>
+ </div>
+ <div class="padding"></div>
+</div>
+
+<div id="scroller3" class="scroller">
+ <div class="grid-container">
+ <div class="grid-item" style="grid-column: 1;"></div>
+ <div class="grid-item" style="grid-column: 2;"></div>
+ <div class="grid-item" style="grid-column: 3;"></div>
+ <div class="green grid-item" style="grid-column: 4;"></div>
+ </div>
+ <div class="padding"></div>
+</div>
+
+<p>You should see three green boxes of varying size above. There should be no red.</p>
+
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-grid.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-grid.html
new file mode 100644
index 00000000000..c2c1b8ec74c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-grid.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<title>position:sticky elements should work correctly with grid layout</title>
+<link rel="match" href="position-sticky-grid-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that position:sticky elements interoperate correctly with grid" />
+
+<style>
+.scroller {
+ position: relative;
+ overflow-x: scroll;
+ overflow-y: hidden;
+ width: 300px;
+ height: 100px;
+ margin-bottom: 15px;
+}
+
+.grid-container {
+ display: grid;
+ grid-template-columns: 25% 25% 25% 25%;
+ grid-template-rows: 100%;
+ width: 400px;
+ height: 90px;
+}
+
+.sticky {
+ position: sticky;
+ left: 50px;
+}
+
+.green {
+ background-color: green;
+}
+
+.grid-item {
+ width: 100%;
+ height: 100%;
+ grid-row: 1;
+}
+
+.indicator {
+ position: absolute;
+ background-color: red;
+ width: 100px;
+ height: 90px;
+}
+
+.padding {
+ height: 1px;
+ width: 700px;
+}
+
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollLeft = 0;
+ document.getElementById('scroller2').scrollLeft = 150;
+ document.getElementById('scroller3').scrollLeft = 300;
+});
+</script>
+
+<div id="scroller1" class="scroller">
+ <div class="grid-container">
+ <div class="indicator" style="left: 100px;"></div>
+ <div class="grid-item" style="grid-column: 1;"></div>
+ <div class="sticky green grid-item" style="grid-column: 2;"></div>
+ <div class="green grid-item" style="grid-column: 3;"></div>
+ </div>
+ <div class="padding"></div>
+</div>
+
+<div id="scroller2" class="scroller">
+ <div class="grid-container">
+ <div class="indicator" style="left: 200px;"></div>
+ <div class="grid-item" style="grid-column: 1;"></div>
+ <div class="sticky green grid-item" style="grid-column: 2;"></div>
+ <div class="green grid-item" style="grid-column: 3;"></div>
+ </div>
+ <div class="padding"></div>
+</div>
+
+<div id="scroller3" class="scroller">
+ <div class="grid-container">
+ <div class="indicator" style="left: 300px;"></div>
+ <div class="grid-item" style="grid-column: 1;"></div>
+ <div class="sticky green grid-item" style="grid-column: 2;"></div>
+ <div class="green grid-item" style="grid-column: 3;"></div>
+ </div>
+ <div class="padding"></div>
+</div>
+
+<p>You should see three green boxes of varying size above. There should be no red.</p>
+
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inflow-position-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inflow-position-ref.html
new file mode 100644
index 00000000000..beebd7e5aeb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inflow-position-ref.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<title>Reference for position:sticky elements should not affect the flow position of other elements</title>
+
+<style>
+.scroller {
+ height: 200px;
+ width: 100px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+}
+
+.sticky {
+ background-color: green;
+}
+
+.box {
+ height: 50px;
+ width: 50px;
+}
+
+.before {
+ background-color: fuchsia;
+}
+
+.after {
+ background-color: orange;
+}
+
+.padding {
+ height: 450px;
+}
+</style>
+
+<div class="scroller">
+ <div class="before box"></div>
+ <div class="box"></div>
+ <div class="after box"></div>
+ <div class="sticky box"></div>
+ <div class="padding"></div>
+</div>
+
+<div>You should see a fuchsia box, a one-box gap, an orange box, and then a green box above.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inflow-position.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inflow-position.html
new file mode 100644
index 00000000000..fc7e8290b15
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inflow-position.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<title>position:sticky elements should not affect the flow position of other elements</title>
+<link rel="match" href="position-sticky-inflow-position-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that position:sticky elements do not affect the flow position of other elements" />
+
+<style>
+.scroller {
+ height: 200px;
+ width: 100px;
+ overflow-y: scroll;
+ margin-bottom: 15px;
+}
+
+.sticky {
+ background-color: green;
+ position: sticky;
+ top: 150px;
+}
+
+.box {
+ height: 50px;
+ width: 50px;
+}
+
+.before {
+ background-color: fuchsia;
+}
+
+.after {
+ background-color: orange;
+}
+
+.padding {
+ height: 500px;
+}
+</style>
+
+<div class="scroller">
+ <div class="before box"></div>
+ <div class="sticky box"></div>
+ <div class="after box"></div>
+ <div class="padding"></div>
+</div>
+
+<div>You should see a fuchsia box, a one-box gap, an orange box, and then a green box above.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inline-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inline-ref.html
new file mode 100644
index 00000000000..11e2909f47b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inline-ref.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<title>Reference for position:sticky should work for inline elements</title>
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ font: 25px/1 Ahem;
+}
+
+.contents {
+ height: 500px;
+}
+
+.indicator {
+ position: absolute;
+ left: 0;
+ color: green;
+}
+
+.inline {
+ display: inline;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 125;
+ document.getElementById('scroller3').scrollTop = 250;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="indicator inline" style="top: 150px;">XXX</div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="indicator inline" style="top: 175px;">XXX</div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="contents">
+ <div class="indicator inline" style="top: 275px;">XXX</div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green rectangles above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inline.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inline.html
new file mode 100644
index 00000000000..cc8694d4236
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-inline.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<title>position:sticky should work for inline elements</title>
+<link rel="match" href="position-sticky-inline-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that position:sticky works for inline elements" />
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ font: 25px/1 Ahem;
+}
+
+.contents {
+ height: 500px;
+}
+
+.prepadding {
+ height: 100px;
+}
+
+.container {
+ height: 200px;
+}
+
+.innerpadding {
+ height: 50px;
+}
+
+.indicator {
+ position: absolute;
+ left: 0;
+ color: red;
+}
+
+.sticky {
+ position: sticky;
+ top: 50px;
+ color: green;
+}
+
+.inline {
+ display: inline;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 125;
+ document.getElementById('scroller3').scrollTop = 250;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="indicator inline" style="top: 150px;">XXX</div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="sticky inline">XXX</div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="indicator inline" style="top: 175px;">XXX</div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="sticky inline">XXX</div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="indicator inline" style="top: 275px;">XXX</div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="sticky inline">XXX</div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green rectangles above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-input-box-gets-focused-after-scroll.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-input-box-gets-focused-after-scroll.html
new file mode 100644
index 00000000000..5b2d705e2d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-input-box-gets-focused-after-scroll.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<title>Focusing on visible sticky input box should not scroll the page.</title>
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that focusing on visible sticky
+positioned input box should not scroll the page." />
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style>
+body {
+ height: 2000px;
+}
+
+input {
+ position: sticky;
+ top: 10px;
+}
+</style>
+
+<input type="text" id="input"/>
+
+<script>
+test(() => {
+ var input = document.getElementById('input');
+ window.scrollTo(0, 100);
+ input.focus();
+ assert_equals(window.scrollY, 100);
+}, 'Focusing on visible sticky input box should not scroll the page.');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-margins-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-margins-ref.html
new file mode 100644
index 00000000000..30490398923
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-margins-ref.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<title>Reference for position:sticky elements should properly interact with margins</title>
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 180px;
+ height: 400px;
+}
+
+.scroller {
+ width: 150px;
+ height: 300px;
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
+
+.indicator {
+ position: relative;
+ background-color: green;
+ margin: 15px;
+}
+
+.box {
+ width: 100px;
+ height: 100px;
+}
+
+.padding {
+ height: 385px;
+}
+</style>
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 0;
+ document.getElementById('scroller2').scrollTop = 60;
+ document.getElementById('scroller3').scrollTop = 120;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="indicator box" style="top: 0;"></div>
+ <div class="padding"></div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="indicator box" style="top: 50px;"></div>
+ <div class="padding"></div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="indicator box" style="top: 85px;"></div>
+ <div class="padding"></div>
+ </div>
+</div>
+
+<div>You should see three green boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-margins.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-margins.html
new file mode 100644
index 00000000000..5b38ab4c996
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-margins.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<title>position:sticky elements should properly interact with margins</title>
+<link rel="match" href="position-sticky-margins-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="position:sticky elements should ignore margins when sticking, but consider them when making sure sticky elements do not escape their containing block" />
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 180px;
+ height: 400px;
+}
+
+.scroller {
+ position: relative;
+ width: 150px;
+ height: 300px;
+ overflow-y: scroll;
+ overflow-x: hidden;
+}
+
+.holder {
+ width: 130px;
+ height: 200px;
+}
+
+.sticky {
+ position: sticky;
+ background-color: green;
+ top: 5px;
+ margin: 15px;
+}
+
+.indicator {
+ left: 15px;
+ position: absolute;
+ background-color: red;
+}
+
+.box {
+ width: 100px;
+ height: 100px;
+}
+
+.padding {
+ height: 300px;
+}
+</style>
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 0;
+ document.getElementById('scroller2').scrollTop = 60;
+ document.getElementById('scroller3').scrollTop = 120;
+});
+</script>
+
+<!-- Before sticking, the margin should be obeyed. -->
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="indicator box" style="top: 15px;"></div>
+ <div class="holder">
+ <div class="sticky box"></div>
+ </div>
+ <div class="padding"></div>
+ </div>
+</div>
+
+<!-- Whilst stuck, the margin is irrelevant. -->
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="indicator box" style="top: 65px;"></div>
+ <div class="holder">
+ <div class="sticky box"></div>
+ </div>
+ <div class="padding"></div>
+ </div>
+</div>
+
+<!-- The margin does count when making sure the sticky element does not escape
+ its containing block. -->
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="indicator box" style="top: 100px;"></div>
+ <div class="holder">
+ <div class="sticky box"></div>
+ </div>
+ <div class="padding"></div>
+ </div>
+</div>
+
+<div>You should see three green boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-bottom-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-bottom-ref.html
new file mode 100644
index 00000000000..6be2b5a7b1d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-bottom-ref.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<title>Reference for nested bottom-constrained position:sticky elements should render correctly</title>
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 500px;
+}
+
+.outerIndicator {
+ background-color: green;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ height: 100px;
+}
+
+.innerIndicator {
+ background-color: blue;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ height: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 75;
+ document.getElementById('scroller2').scrollTop = 175;
+ document.getElementById('scroller3').scrollTop = 250;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="top: 200px;"></div>
+ <div class="innerIndicator" style="top: 200px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="top: 250px;"></div>
+ <div class="innerIndicator" style="top: 290px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="top: 300px;"></div>
+ <div class="innerIndicator" style="top: 350px;"></div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green and three blue boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-bottom.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-bottom.html
new file mode 100644
index 00000000000..d4d20e571a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-bottom.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<title>Nested bottom-constrained position:sticky elements should render correctly</title>
+<link rel="match" href="position-sticky-nested-bottom-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that nested position:sticky elements with a bottom constraint render correctly" />
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 500px;
+}
+
+.prepadding {
+ height: 200px;
+}
+
+.container {
+ height: 200px;
+}
+
+.filler {
+ height: 100px;
+}
+
+.outerIndicator {
+ background-color: red;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ height: 100px;
+}
+
+.innerIndicator {
+ background-color: red;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ height: 50px;
+}
+
+.outerSticky {
+ background-color: green;
+ position: sticky;
+ bottom: 25px;
+ width: 100%;
+ height: 100px;
+}
+
+.innerFiller {
+ height: 50px;
+}
+
+.innerSticky {
+ background-color: blue;
+ position: sticky;
+ bottom: 35px;
+ width: 100%;
+ height: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 75;
+ document.getElementById('scroller2').scrollTop = 175;
+ document.getElementById('scroller3').scrollTop = 250;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="outerIndicator" style="top: 200px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="filler"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="top: 0;"></div>
+ <div class="innerFiller"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="outerIndicator" style="top: 250px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="filler"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="top: 40px;"></div>
+ <div class="innerFiller"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="outerIndicator" style="top: 300px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="filler"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="top: 50px;"></div>
+ <div class="innerFiller"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green and three blue boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-inline-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-inline-ref.html
new file mode 100644
index 00000000000..694a3cc8403
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-inline-ref.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<title>Reference for nested inline position:sticky elements should render correctly</title>
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ font: 25px/1 Ahem;
+}
+
+.contents {
+ height: 500px;
+}
+
+.outerIndicator {
+ color: green;
+ position: absolute;
+ left: 0;
+}
+
+.innerIndicator {
+ color: blue;
+ position: absolute;
+ left: 25px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 125;
+ document.getElementById('scroller3').scrollTop = 225;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="top: 150px;">X</div>
+ <div class="innerIndicator" style="top: 150px;">XX</div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="top: 175px;">X</div>
+ <div class="innerIndicator" style="top: 185px;">XX</div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="top: 275px;">X</div>
+ <div class="innerIndicator" style="top: 275px;">XX</div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green and three blue rectangles above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-inline.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-inline.html
new file mode 100644
index 00000000000..f44c0e69b59
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-inline.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<title>Nested inline position:sticky elements should render correctly</title>
+<link rel="match" href="position-sticky-nested-inline-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that nested inline position:sticky elements render correctly" />
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+ font: 25px/1 Ahem;
+}
+
+.contents {
+ height: 500px;
+}
+
+.prepadding {
+ height: 100px;
+}
+
+.container {
+ height: 200px;
+}
+
+.innerpadding {
+ height: 50px;
+}
+
+.outerIndicator {
+ color: red;
+ position: absolute;
+ left: 0;
+}
+
+.innerIndicator {
+ color: red;
+ position: absolute;
+ left: 25px;
+}
+
+.outerSticky {
+ display: inline;
+ color: green;
+ position: sticky;
+ top: 50px;
+}
+
+.innerSticky {
+ display: inline;
+ color: blue;
+ position: sticky;
+ top: 60px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 125;
+ document.getElementById('scroller3').scrollTop = 225;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="outerIndicator" style="top: 150px;">X</div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="outerSticky">X<div class="innerIndicator" style="top: 0;">XX</div><div class="innerSticky">XX</div></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="outerIndicator" style="top: 175px;">X</div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="outerSticky">X<div class="innerIndicator" style="top: 10px;">XX</div><div class="innerSticky">XX</div></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="outerIndicator" style="top: 200px;">X</div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="outerSticky">X<div class="innerIndicator" style="top: 0;">XX</div><div class="innerSticky">XX</div></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green and three blue rectangles above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-left-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-left-ref.html
new file mode 100644
index 00000000000..d3ab0d593d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-left-ref.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<title>Reference for nested left-constrained position:sticky elements should render correctly</title>
+
+<style>
+.group {
+ position: relative;
+ width: 250px;
+ height: 150px;
+}
+
+.scroller {
+ position: relative;
+ width: 200px;
+ height: 100px;
+ overflow-x: auto;
+ overflow-y: hidden;
+}
+
+.contents {
+ height: 100%;
+ width: 500px;
+}
+
+.outerIndicator {
+ background-color: green;
+ position: absolute;
+ top: 0;
+ height: 100%;
+ width: 100px;
+}
+
+.innerIndicator {
+ background-color: blue;
+ position: absolute;
+ top: 0;
+ height: 100%;
+ width: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollLeft = 50;
+ document.getElementById('scroller2').scrollLeft = 125;
+ document.getElementById('scroller3').scrollLeft = 225;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="left: 150px;"></div>
+ <div class="innerIndicator" style="left: 150px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="left: 175px;"></div>
+ <div class="innerIndicator" style="left: 185px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="left: 200px;"></div>
+ <div class="innerIndicator" style="left: 250px;"></div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green and three blue boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-left.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-left.html
new file mode 100644
index 00000000000..b5a23abeccf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-left.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<title>Nested left-constrained position:sticky elements should render correctly</title>
+<link rel="match" href="position-sticky-nested-left-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that nested position:sticky elements with a left constraint render correctly" />
+
+<style>
+.group {
+ position: relative;
+ width: 250px;
+ height: 150px;
+}
+
+.scroller {
+ position: relative;
+ width: 200px;
+ height: 100px;
+ overflow-x: auto;
+ overflow-y: hidden;
+}
+
+.contents {
+ height: 100%;
+ width: 500px;
+ /* Allow nice formatting of inline divs. Fonts are not used in this test. */
+ font-size: 0;
+}
+
+.prepadding {
+ display: inline-block;
+ height: 100%;
+ width: 100px;
+}
+
+.container {
+ display: inline-block;
+ height: 100%;
+ width: 200px;
+}
+
+.innerpadding {
+ display: inline-block;
+ height: 100%;
+ width: 50px;
+}
+
+.outerIndicator {
+ background-color: red;
+ position: absolute;
+ top: 0;
+ display: inline-block;
+ height: 100%;
+ width: 100px;
+}
+
+.innerIndicator {
+ background-color: red;
+ position: absolute;
+ top: 0;
+ display: inline-block;
+ height: 100%;
+ width: 50px;
+}
+
+.outerSticky {
+ background-color: green;
+ position: sticky;
+ left: 50px;
+ display: inline-block;
+ height: 100%;
+ width: 100px;
+}
+
+.innerSticky {
+ background-color: blue;
+ position: sticky;
+ left: 60px;
+ display: inline-block;
+ height: 100%;
+ width: 50px;
+}
+
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollLeft = 50;
+ document.getElementById('scroller2').scrollLeft = 125;
+ document.getElementById('scroller3').scrollLeft = 225;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="outerIndicator" style="left: 150px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="left: 0;"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="outerIndicator" style="left: 175px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding">
+ </div><div class="outerSticky">
+ <div class="innerIndicator" style="left: 10px;"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="outerIndicator" style="left: 200px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="left: 50px;"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green and three blue boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-right-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-right-ref.html
new file mode 100644
index 00000000000..07852ba6041
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-right-ref.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<title>Reference for position:sticky elements should respect the right constraint</title>
+
+<style>
+.group {
+ position: relative;
+ width: 250px;
+ height: 150px;
+}
+
+.scroller {
+ position: relative;
+ width: 200px;
+ height: 100px;
+ overflow-x: auto;
+ overflow-y: hidden;
+}
+
+.contents {
+ height: 100%;
+ width: 500px;
+}
+
+.outerIndicator {
+ background-color: green;
+ position: absolute;
+ top: 0;
+ height: 100%;
+ width: 100px;
+}
+
+.innerIndicator {
+ background-color: blue;
+ position: absolute;
+ top: 0;
+ height: 100%;
+ width: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollLeft = 75;
+ document.getElementById('scroller2').scrollLeft = 175;
+ document.getElementById('scroller3').scrollLeft = 250;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="left: 200px;"></div>
+ <div class="innerIndicator" style="left: 200px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="left: 250px;"></div>
+ <div class="innerIndicator" style="left: 290px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="contents">
+ <div class="outerIndicator" style="left: 300px;"></div>
+ <div class="innerIndicator" style="left: 350px;"></div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green and three blue boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-right.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-right.html
new file mode 100644
index 00000000000..411f722eec7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-right.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html>
+<title>Nested right-constrained position:sticky elements should render correctly</title>
+<link rel="match" href="position-sticky-nested-right-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that nested position:sticky elements with a right constraint render correctly" />
+
+<style>
+.group {
+ position: relative;
+ width: 250px;
+ height: 150px;
+}
+
+.scroller {
+ position: relative;
+ width: 200px;
+ height: 100px;
+ overflow-x: auto;
+ overflow-y: hidden;
+}
+
+.contents {
+ height: 100%;
+ width: 500px;
+ /* Allow nice formatting of inline divs. Fonts are not used in this test. */
+ font-size: 0;
+}
+
+.prepadding {
+ display: inline-block;
+ height: 100%;
+ width: 200px;
+}
+
+.container {
+ display: inline-block;
+ height: 100%;
+ width: 200px;
+}
+
+.filler {
+ display: inline-block;
+ height: 100%;
+ width: 100px;
+}
+
+.outerIndicator {
+ background-color: red;
+ position: absolute;
+ top: 0;
+ display: inline-block;
+ height: 100%;
+ width: 100px;
+}
+
+.innerIndicator {
+ background-color: red;
+ position: absolute;
+ top: 0;
+ display: inline-block;
+ height: 100%;
+ width: 50px;
+}
+
+.outerSticky {
+ background-color: green;
+ position: sticky;
+ right: 25px;
+ display: inline-block;
+ height: 100%;
+ width: 100px;
+}
+
+.innerFiller {
+ display: inline-block;
+ height: 100%;
+ width: 50px;
+}
+
+.innerSticky {
+ background-color: blue;
+ position: sticky;
+ right: 35px;
+ display: inline-block;
+ height: 100%;
+ width: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollLeft = 75;
+ document.getElementById('scroller2').scrollLeft = 175;
+ document.getElementById('scroller3').scrollLeft = 250;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="outerIndicator" style="left: 200px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="filler"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="left: 0;"></div>
+ <div class="innerFiller"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="outerIndicator" style="left: 250px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="filler"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="left: 40px;"></div>
+ <div class="innerFiller"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="outerIndicator" style="left: 300px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="filler"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="left: 50px;"></div>
+ <div class="innerFiller"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green and three blue boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-table-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-table-ref.html
new file mode 100644
index 00000000000..9327d04e83f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-table-ref.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<title>Reference for nested position:sticky table elements should render correctly</title>
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 700px;
+}
+
+.indicator {
+ position: absolute;
+ left: 0;
+ background-color: green;
+ height: 50px;
+ width: 50px;
+}
+
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 125;
+ document.getElementById('scroller3').scrollTop = 250;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="indicator" style="top: 100px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="indicator" style="top: 150px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="contents">
+ <div class="indicator" style="top: 250px;"></div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green rectangles above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-table.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-table.html
new file mode 100644
index 00000000000..be3fbce1560
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-table.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<title>Nested position:sticky table elements should render correctly</title>
+<link rel="match" href="position-sticky-nested-table-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that nested position:sticky table elements render correctly" />
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 700px;
+}
+
+.prepadding {
+ height: 100px;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+td, th {
+ height: 50px;
+ width: 50px;
+ padding: 0;
+}
+
+th {
+ background: green;
+}
+
+.sticky {
+ position: sticky;
+ top: 25px;
+}
+
+.indicator {
+ position: absolute;
+ left: 0;
+ background-color: red;
+ height: 50px;
+ width: 50px;
+}
+
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 125;
+ document.getElementById('scroller3').scrollTop = 250;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="indicator" style="top: 100px;"></div>
+ <div class="prepadding"></div>
+ <table>
+ <thead class="sticky">
+ <tr class="sticky">
+ <th class="sticky"></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr><td></td></tr>
+ <tr><td></td></tr>
+ <tr><td></td></tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="indicator" style="top: 150px;"></div>
+ <div class="prepadding"></div>
+ <table>
+ <thead class="sticky">
+ <tr class="sticky">
+ <th class="sticky"></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr><td></td></tr>
+ <tr><td></td></tr>
+ <tr><td></td></tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="contents">
+ <div class="indicator" style="top: 250px;"></div>
+ <div class="prepadding"></div>
+ <table>
+ <thead class="sticky">
+ <tr class="sticky">
+ <th class="sticky"></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr><td></td></tr>
+ <tr><td></td></tr>
+ <tr><td></td></tr>
+ </tbody>
+ </table>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green rectangles above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-top-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-top-ref.html
new file mode 100644
index 00000000000..f4696ce7d0a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-top-ref.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<title>Reference for nested top-constrained position:sticky elements should render correctly</title>
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 500px;
+}
+
+.green {
+ background-color: green;
+}
+
+.blue {
+ background-color: blue;
+}
+
+.indicator {
+ position: absolute;
+ left: 0;
+}
+
+.bigBox {
+ width: 100%;
+ height: 100px;
+}
+
+.smallBox {
+ width: 100%;
+ height: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 125;
+ document.getElementById('scroller3').scrollTop = 225;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="green indicator bigBox" style="top: 150px;"></div>
+ <div class="blue indicator smallBox" style="top: 150px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="green indicator bigBox" style="top: 175px;"></div>
+ <div class="blue indicator smallBox" style="top: 185px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="contents">
+ <div class="green indicator bigBox" style="top: 200px;"></div>
+ <div class="blue indicator smallBox" style="top: 250px;"></div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green and three blue boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-top.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-top.html
new file mode 100644
index 00000000000..1ed9dc2a210
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-nested-top.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<title>Nested top-constrainted position:sticky elements should render correctly</title>
+<link rel="match" href="position-sticky-nested-top-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that nested position:sticky elements with a top constraint render correctly" />
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 500px;
+}
+
+.prepadding {
+ height: 100px;
+}
+
+.container {
+ height: 200px;
+}
+
+.innerpadding {
+ height: 50px;
+}
+
+.outerIndicator {
+ background-color: red;
+ position: absolute;
+ left: 0;
+ height: 100px;
+ width: 100%;
+}
+
+.innerIndicator {
+ background-color: red;
+ position: absolute;
+ left: 0;
+ height: 50px;
+ width: 100%;
+}
+
+.outerSticky {
+ background-color: green;
+ position: sticky;
+ top: 50px;
+ width: 100%;
+ height: 100px;
+}
+
+.innerSticky {
+ background-color: blue;
+ position: sticky;
+ top: 60px;
+ width: 100%;
+ height: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 125;
+ document.getElementById('scroller3').scrollTop = 225;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="outerIndicator" style="top: 150px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="top: 0;"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="outerIndicator" style="top: 175px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="top: 10px;"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="outerIndicator" style="top: 200px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="outerSticky">
+ <div class="innerIndicator" style="top: 50px;"></div>
+ <div class="innerSticky"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green and three blue boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-offset-top-left.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-offset-top-left.html
new file mode 100644
index 00000000000..ade9e108cf4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-offset-top-left.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<title>Sticky positioned element should be observable by offsetTop and offsetLeft</title>
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that a sticky positioned element
+should be observable by offsetTop/offsetLeft." />
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style>
+body {
+ margin: 0;
+}
+
+.container {
+ position: relative; /* Required for offsetTop/offsetLeft tests. */
+ overflow: scroll;
+ width: 200px;
+ height: 200px;
+}
+
+.spacer {
+ width: 2000px;
+ height: 2000px;
+}
+
+.box {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+
+.sticky {
+ position: sticky;
+ top: 50px;
+ left: 20px;
+}
+</style>
+
+<div id="scroller1" class="container">
+ <div class="spacer"></div>
+</div>
+
+<script>
+test(() => {
+ var scroller = document.getElementById('scroller1');
+ scroller.scrollTop = 100;
+ scroller.scrollLeft = 75;
+
+ var sticky = document.createElement('div');
+ sticky.className = 'sticky box';
+ scroller.insertBefore(sticky, scroller.querySelector('.spacer'));
+
+ assert_equals(sticky.offsetTop, scroller.scrollTop + 50);
+ assert_equals(sticky.offsetLeft, scroller.scrollLeft + 20);
+}, 'offsetTop/offsetLeft should be correct for sticky after script insertion');
+</script>
+
+<div id="scroller2" class="container">
+ <div id="sticky2" class="sticky box"></div>
+ <div class="spacer"></div>
+</div>
+
+<script>
+test(function() {
+ var scroller = document.getElementById('scroller2');
+ var sticky = document.getElementById('sticky2');
+ scroller.scrollTop = 100;
+ scroller.scrollLeft = 75;
+
+ var div = document.createElement('div');
+ div.style.height = '65px';
+ scroller.insertBefore(div, sticky);
+
+ assert_equals(sticky.offsetTop, scroller.scrollTop + 50);
+ assert_equals(sticky.offsetLeft, scroller.scrollLeft + 20);
+}, 'offsetTop/offsetLeft should be correct for sticky after script-caused layout');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-overflow-padding-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-overflow-padding-ref.html
new file mode 100644
index 00000000000..b0e1d4680bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-overflow-padding-ref.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<title>Reference for position:sticky elements should respect padding on their ancestor overflow element</title>
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ padding: 20px 0;
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 500px;
+}
+
+.indicator {
+ background-color: green;
+ position: absolute;
+ left: 0;
+}
+
+.box {
+ width: 100%;
+ height: 100px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 175;
+ document.getElementById('scroller3').scrollTop = 220;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="indicator box" style="top: 170px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="indicator box" style="top: 195px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="contents">
+ <div class="indicator box" style="top: 220px;"></div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-overflow-padding.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-overflow-padding.html
new file mode 100644
index 00000000000..0324861219b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-overflow-padding.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<title>position:sticky elements should respect padding on their ancestor overflow element</title>
+<link rel="match" href="position-sticky-overflow-padding-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that position:sticky elements respect padding on their ancestor overflow element" />
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ /* The target sticky position should be offset by this padding. */
+ padding: 20px 0;
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 500px;
+}
+
+.prepadding {
+ height: 100px;
+}
+
+.container {
+ height: 200px;
+}
+
+.innerpadding {
+ height: 50px;
+}
+
+.indicator {
+ background-color: red;
+ position: absolute;
+ left: 0;
+}
+
+.sticky {
+ background-color: green;
+ position: sticky;
+ top: 0;
+}
+
+.box {
+ width: 100%;
+ height: 100px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 175;
+ document.getElementById('scroller3').scrollTop = 220;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="indicator box" style="top: 170px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="sticky box"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="indicator box" style="top: 195px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="sticky box"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="indicator box" style="top: 220px;"></div>
+ <div class="contents">
+ <div class="prepadding"></div>
+ <div class="container">
+ <div class="innerpadding"></div>
+ <div class="sticky box"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-root-scroller-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-root-scroller-ref.html
new file mode 100644
index 00000000000..a6ded0925f3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-root-scroller-ref.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<title>Reference for position:sticky should operate correctly for the root scroller</title>
+
+<style>
+body {
+ /* Assumption: 3000px is taller than any user agents test window size. */
+ height: 3000px;
+}
+
+.indicator {
+ background-color: green;
+ position: absolute;
+ top: 750px;
+}
+
+.box {
+ width: 200px;
+ height: 200px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ window.scrollTo(0, 700);
+});
+</script>
+
+<div class="indicator box"></div>
+
+<div style="position: absolute; top: 1000px;">You should see a green box above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-root-scroller.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-root-scroller.html
new file mode 100644
index 00000000000..35ab8dc085c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-root-scroller.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<title>position:sticky should operate correctly for the root scroller</title>
+<link rel="match" href="position-sticky-root-scroller-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that position:sticky elements work when using the root (document) scroller" />
+
+<style>
+body {
+ /* Assumption: 3000px is taller than any user agents test window size. */
+ height: 3000px;
+}
+
+.indicator {
+ background-color: red;
+ position: absolute;
+}
+
+.sticky {
+ background-color: green;
+ position: sticky;
+ top: 50px;
+}
+
+.box {
+ width: 200px;
+ height: 200px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ window.scrollTo(0, 700);
+});
+</script>
+
+<div class="indicator box" style="top: 750px;"></div>
+<div class="sticky box"></div>
+
+<div style="position: absolute; top: 1000px;">You should see a green box above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-stacking-context-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-stacking-context-ref.html
new file mode 100644
index 00000000000..0fe20bd3c33
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-stacking-context-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>Reference for position: sticky should create a stacking context</title>
+
+<style>
+.indicator {
+ background-color: green;
+}
+
+.box {
+ width: 200px;
+ height: 200px;
+}
+</style>
+
+<div class="indicator box"></div>
+
+<div>You should see a single green box above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-stacking-context.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-stacking-context.html
new file mode 100644
index 00000000000..36acf82f4f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-stacking-context.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>position: sticky should create a stacking context</title>
+<link rel="match" href="position-sticky-stacking-context-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="position:sticky elements should create a stacking context" />
+
+<style>
+.indicator {
+ position: absolute;
+ background-color: green;
+ z-index: 1;
+}
+
+.sticky {
+ position: sticky;
+ z-index: 0;
+}
+
+.child {
+ position: relative;
+ background-color: red;
+ z-index: 2;
+}
+
+.box {
+ width: 200px;
+ height: 200px;
+}
+</style>
+
+<div class="indicator box"></div>
+<div class="sticky box">
+ <!-- Because sticky forms a stacking context, this child remains on bottom
+ even though it has a higher z-index than the indicator box. -->
+ <div class="child box"></div>
+</div>
+
+<div>You should see a single green box above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-ref.html
new file mode 100644
index 00000000000..f865a9bed21
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-ref.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<title>Reference for transforms on position:sticky elements should apply after sticking</title>
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 500px;
+}
+
+.indicator {
+ background-color: green;
+ position: relative;
+}
+
+.box {
+ width: 100%;
+ height: 50px;
+}
+
+.rotated {
+ transform: rotateX(60deg);
+ height: 100px;
+ width: 100%;
+}
+
+.perspective {
+ transform: perspective(3px) translateZ(1px);
+ height: 50px;
+ width: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 50;
+ document.getElementById('scroller3').scrollTop = 50;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="indicator box" style="height: 100px; top: 75px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="rotated indicator" style="top: 100px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <!-- Required for blending. -->
+ <div class="perspective" style="position: absolute; background: red; top: 100px;"></div>
+ <div class="contents">
+ <div class="perspective indicator" style="top: 100px;"></div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-translate-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-translate-ref.html
new file mode 100644
index 00000000000..b357795356b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-translate-ref.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<title>Reference for translations on position:sticky elements should apply after sticking</title>
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 500px;
+}
+
+.indicator {
+ background-color: green;
+ position: relative;
+}
+
+.box {
+ width: 100%;
+ height: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 70;
+ document.getElementById('scroller3').scrollTop = 50;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="contents">
+ <div class="indicator box" style="top: 50px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="contents">
+ <div class="indicator box" style="top: 50px;"></div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="contents">
+ <div class="indicator box" style="top: 200px;"></div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-translate.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-translate.html
new file mode 100644
index 00000000000..076db9ea277
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms-translate.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<title>translations on position:sticky elements should apply after sticking</title>
+<link rel="match" href="position-sticky-transforms-translate-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that translations on position:sticky elements are carried out on their stuck position" />
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 500px;
+}
+
+.container {
+ height: 150px;
+}
+
+.indicator {
+ background-color: red;
+ position: absolute;
+ left: 0;
+}
+
+.sticky {
+ background-color: green;
+ position: sticky;
+ top: 50px;
+}
+
+.box {
+ width: 100%;
+ height: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 70;
+ document.getElementById('scroller3').scrollTop = 50;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="indicator box" style="top: 50px;"></div>
+ <div class="contents">
+ <div class="container">
+ <div class="sticky box" style="transform: translateY(-100%);"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- The pre-transform sticky is not allowed to escape its containing block. -->
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="indicator box" style="top: 50px;"></div>
+ <div class="contents">
+ <div class="container">
+ <div class="sticky box" style="transform: translateY(-100%);"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<!-- The sticky element should stick before the container is transformed. -->
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="indicator box" style="top: 200px;"></div>
+ <div class="contents">
+ <div class="container" style="transform: translateY(100px);">
+ <div class="sticky box"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms.html
new file mode 100644
index 00000000000..f9e63865066
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-transforms.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<title>transforms on position:sticky elements should apply after sticking</title>
+<link rel="match" href="position-sticky-transforms-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that transforms on position:sticky elements are carried out on their stuck position" />
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 150px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 100px;
+ height: 200px;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.contents {
+ height: 500px;
+}
+
+.container {
+ height: 150px;
+}
+
+.indicator {
+ background-color: red;
+ position: absolute;
+}
+
+.sticky {
+ background-color: green;
+ position: sticky;
+ top: 50px;
+}
+
+.box {
+ width: 100%;
+ height: 50px;
+}
+
+.rotated {
+ transform: rotateX(60deg);
+ width: 100%;
+ height: 100px;
+}
+
+.perspective {
+ transform: perspective(3px) translateZ(1px);
+ height: 50px;
+ width: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller2').scrollTop = 50;
+ document.getElementById('scroller3').scrollTop = 50;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller">
+ <div class="indicator box" style="height: 100px; top: 75px;"></div>
+ <div class="contents">
+ <div class="container">
+ <div class="sticky box" style="transform: scale(2);"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller">
+ <div class="rotated indicator" style="top: 100px;"></div>
+ <div class="contents">
+ <div class="container" style="height: 250px;">
+ <div class="rotated sticky"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller3" class="scroller">
+ <div class="perspective indicator" style="top: 100px;"></div>
+ <div class="contents">
+ <div class="container">
+ <div class="perspective sticky"></div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div>You should see three green boxes above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-writing-modes-ref.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-writing-modes-ref.html
new file mode 100644
index 00000000000..8b171fa5583
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-writing-modes-ref.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<title>Reference for position:sticky constraints are independent of writing mode</title>
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 180px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 130px;
+ height: 200px;
+ overflow: scroll;
+ font: 25px/1 Ahem;
+}
+
+.contents {
+ height: 500px;
+ width: 200px;
+}
+
+.indicator {
+ display: inline;
+ color: green;
+ position: relative;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller1').scrollLeft = 20;
+ document.getElementById('scroller2').scrollTop = 50;
+ document.getElementById('scroller2').scrollLeft = 60;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller" style="writing-mode: vertical-lr;">
+ <div class="contents">
+ <div class="indicator" style="left: 40px; top: 100px;">XXX</div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller" style="writing-mode: vertical-rl;">
+ <div class="contents">
+ <div class="indicator" style="right: 45px; top: 100px;">XXX</div>
+ </div>
+ </div>
+</div>
+
+<div>You should see two green blocks above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-writing-modes.html b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-writing-modes.html
new file mode 100644
index 00000000000..7f10ff5daf3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-position-3/position-sticky-writing-modes.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<title>position:sticky constraints are independent of writing mode</title>
+<link rel="match" href="position-sticky-writing-modes-ref.html" />
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#sticky-pos" />
+<meta name="assert" content="This test checks that position:sticky constraints are independent of the writing mode" />
+
+<style>
+.group {
+ display: inline-block;
+ position: relative;
+ width: 180px;
+ height: 250px;
+}
+
+.scroller {
+ position: relative;
+ width: 130px;
+ height: 200px;
+ overflow: scroll;
+ font: 25px/1 Ahem;
+}
+
+.contents {
+ height: 500px;
+ width: 200px;
+}
+
+.indicator {
+ position: absolute;
+ color: red;
+}
+
+.sticky {
+ display: inline;
+ color: green;
+ position: sticky;
+ top: 50px;
+}
+</style>
+
+<script>
+window.addEventListener('load', function() {
+ document.getElementById('scroller1').scrollTop = 50;
+ document.getElementById('scroller1').scrollLeft = 20;
+ document.getElementById('scroller2').scrollTop = 50;
+ document.getElementById('scroller2').scrollLeft = 60;
+});
+</script>
+
+<div class="group">
+ <div id="scroller1" class="scroller" style="writing-mode: vertical-lr;">
+ <div class="indicator" style="left: 40px; top: 100px;">XXX</div>
+ <div class="contents">
+ <div class="sticky" style="left: 20px;">XXX</div>
+ </div>
+ </div>
+</div>
+
+<div class="group">
+ <div id="scroller2" class="scroller" style="writing-mode: vertical-rl;">
+ <div class="contents">
+ <div class="indicator" style="left: 45px; top: 100px;">XXX</div>
+ <div class="sticky" style="right: 20px;">XXX</div>
+ </div>
+ </div>
+</div>
+
+<div>You should see two green blocks above. No red should be visible.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-and-other-pseudo-elements-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-and-other-pseudo-elements-ref.html
new file mode 100644
index 00000000000..796acbf7598
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-and-other-pseudo-elements-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Test: ::marker interaction with ::before, ::after, and ::first-letter pseudo elements reference file</title>
+<link rel="author" title="Daniel Bates" href="mailto:dbates@webkit.org">
+<style>
+li {
+ color: green;
+ font-size: 20px;
+}
+
+.first-letter {
+ color: white;
+ background-color: green;
+}
+</style>
+</head>
+<body>
+<ol>
+ <li><span class="first-letter">P</span>ASSED if the list marker is green.</li>
+</ol>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-and-other-pseudo-elements.html b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-and-other-pseudo-elements.html
new file mode 100644
index 00000000000..f393db58fe8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-and-other-pseudo-elements.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Test: ::marker interaction with ::before, ::after, and ::first-letter pseudo elements</title>
+<link rel="author" title="Daniel Bates" href="mailto:dbates@webkit.org">
+<link rel="match" href="marker-and-other-pseudo-elements-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo">
+<meta name="assert" content="Tests ::marker interaction with ::before, ::after, and ::first-letter pseudo elements">
+<style>
+li {
+ color: red;
+ font-size: 20px;
+}
+
+li::before {
+ color: green;
+ content: "PA";
+}
+
+li::after {
+ color: green;
+ content: "SSED if the list marker is green.";
+}
+
+li::marker {
+ color: green;
+}
+
+li::first-letter {
+ color: white;
+ background-color: green;
+}
+</style>
+</head>
+<body>
+<ol>
+ <li></li>
+</ol>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-color-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-color-ref.html
new file mode 100644
index 00000000000..f2269f7f78b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-color-ref.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Test: ::marker formatting with color property reference file</title>
+<link rel="author" title="Daniel Bates" href="mailto:dbates@webkit.org">
+<style>
+li {
+ color: green;
+ font-size: 40px;
+ list-style-type: square;
+}
+</style>
+</head>
+<body>
+<ol>
+ <li><!-- The list marker should be a green square.--></li>
+</ol>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-color.html b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-color.html
new file mode 100644
index 00000000000..d45c76696ec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-color.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Test: ::marker formatting with color property</title>
+<link rel="author" title="Daniel Bates" href="mailto:dbates@webkit.org">
+<link rel="match" href="marker-color-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo">
+<meta name="assert" content="Tests ::marker rendering with color property">
+<style>
+li {
+ color: red;
+ font-size: 40px;
+ list-style-type: square;
+}
+
+li::marker {
+ color: green;
+}
+</style>
+</head>
+<body>
+<ol>
+ <li><!-- The list marker should be a green square.--></li>
+</ol>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-font-properties-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-font-properties-ref.html
new file mode 100644
index 00000000000..093674d81b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-font-properties-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Test: ::marker formatting with font properties reference file</title>
+<link rel="author" title="Daniel Bates" href="mailto:dbates@webkit.org">
+<style>
+li {
+ font-family: sans-serif;
+ font-size: 24px;
+ font-style: italic;
+ font-variant: small-caps;
+ font-weight: bold;
+ list-style-type: lower-alpha;
+ font-variant-numeric: tabular-nums;
+}
+</style>
+</head>
+<body>
+<ol>
+ <li></li>
+</ol>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-font-properties.html b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-font-properties.html
new file mode 100644
index 00000000000..d2570eb3085
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-font-properties.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Test: ::marker formatting with font properties</title>
+<link rel="author" title="Daniel Bates" href="mailto:dbates@webkit.org">
+<link rel="match" href="marker-font-properties-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo">
+<meta name="assert" content="Tests ::marker rendering with font properties">
+<style>
+li {
+ list-style-type: lower-alpha;
+}
+
+li::marker {
+ font-family: sans-serif;
+ font-size: 24px;
+ font-style: italic;
+ font-variant: small-caps;
+ font-weight: bold;
+}
+</style>
+</head>
+<body>
+<ol>
+ <li><span style="font-size: 24px"><!-- FIXME: Needed to ensure consistent baseline position with expected result in WebKit (why?). --></span></li>
+</ol>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-inherit-values-ref.html b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-inherit-values-ref.html
new file mode 100644
index 00000000000..6cce146ab3f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-inherit-values-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Test: ::marker inherits values from originating element reference file</title>
+<link rel="author" title="Daniel Bates" href="mailto:dbates@webkit.org">
+<style>
+li {
+ color: green;
+ font-family: sans-serif;
+ font-size: x-large;
+ font-style: italic;
+ font-variant: small-caps;
+ font-weight: bold;
+ list-style-type: lower-alpha;
+}
+</style>
+</head>
+<body>
+<ol>
+ <li></li>
+</ol>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-inherit-values.html b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-inherit-values.html
new file mode 100644
index 00000000000..82456afb6c6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-pseudo-4/marker-inherit-values.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Test: ::marker inherits values from originating element</title>
+<link rel="author" title="Daniel Bates" href="mailto:dbates@webkit.org">
+<link rel="match" href="marker-inherit-values-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/#marker-pseudo">
+<meta name="assert" content="Tests ::marker inherits values from originating element">
+<style>
+ol {
+ color: red;
+}
+
+li { /* Originating element */
+ color: green;
+ font-family: sans-serif;
+ font-size: x-large;
+ font-style: italic;
+ font-variant: small-caps;
+ font-weight: bold;
+ list-style-type: lower-alpha;
+}
+
+li::marker {
+ color: inherit;
+ font-family: inherit;
+ font-size: inherit;
+ font-style: inherit;
+ font-variant: inherit;
+ font-weight: inherit;
+}
+</style>
+</head>
+<body>
+<ol>
+ <li></li>
+</ol>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-ruby-1/line-break-around-ruby-001.html b/tests/wpt/web-platform-tests/css/css-ruby-1/line-break-around-ruby-001.html
index 8fc7b7e6caa..c631f201e30 100644
--- a/tests/wpt/web-platform-tests/css/css-ruby-1/line-break-around-ruby-001.html
+++ b/tests/wpt/web-platform-tests/css/css-ruby-1/line-break-around-ruby-001.html
@@ -32,8 +32,5 @@ function runTests() {
assert_approx_equals(lineCount, 3, 0.1);
}, element.title);
});
-
- if (window.testRunner)
- container.style.display = "none";
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/basic-shape-circle-ellipse-serialization.html b/tests/wpt/web-platform-tests/css/css-shapes-1/basic-shape-circle-ellipse-serialization.html
new file mode 100644
index 00000000000..9c82039ac4e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/basic-shape-circle-ellipse-serialization.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Serialization of basic shapes</title>
+<link rel="help" href="https://drafts.csswg.org/css-shapes/#basic-shape-serialization"/>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+function checkEquals(input, expected) {
+ test(function() {
+ let div = document.createElement('div');
+ div.style.clipPath = input;
+ let serialized = div.style.clipPath;
+ assert_equals(serialized, expected, input);
+ });
+}
+
+// Keywords get replaced by percentages in 2-value form
+checkEquals("circle(at left bottom)", "circle(at 0% 100%)");
+checkEquals("circle(at bottom left)", "circle(at 0% 100%)");
+checkEquals("circle(at right calc(10% + 5px))",
+ "circle(at 100% calc(10% + 5px))");
+checkEquals("ellipse(at left bottom)", "ellipse(at 0% 100%)");
+checkEquals("ellipse(at bottom left)", "ellipse(at 0% 100%)");
+checkEquals("ellipse(at right calc(10% + 5px))",
+ "ellipse(at 100% calc(10% + 5px))");
+
+// Only 2 or 4 value form allowed
+checkEquals("circle()", "circle(at 50% 50%)");
+checkEquals("circle(0px)", "circle(0px at 50% 50%)");
+checkEquals("circle(closest-side)", "circle(at 50% 50%)");
+checkEquals("circle(farthest-side)",
+ "circle(farthest-side at 50% 50%)");
+checkEquals("ellipse()", "ellipse(at 50% 50%)");
+checkEquals("ellipse(closest-side farthest-side)",
+ "ellipse(closest-side farthest-side at 50% 50%)");
+
+
+checkEquals("circle(at right 5px top)", "circle(at right 5px top 0%)");
+checkEquals("ellipse(at right 10px top)", "ellipse(at right 10px top 0%)");
+// Remove defaults like closest-side
+checkEquals("circle(closest-side at center)",
+ "circle(at 50% 50%)");
+checkEquals("ellipse(closest-side closest-side at center)",
+ "ellipse(at 50% 50%)");
+
+// don't remove non defaults
+checkEquals("circle(farthest-side at center)",
+ "circle(farthest-side at 50% 50%)");
+checkEquals("circle(10px at center)",
+ "circle(10px at 50% 50%)");
+checkEquals("ellipse(farthest-side 10px at center)",
+ "ellipse(farthest-side 10px at 50% 50%)");
+// Ellipse can have 0 radii or two, not one. We cannot
+// eliminate a single closest-side if the other is different
+checkEquals("ellipse(closest-side farthest-side at 50% 50%)",
+ "ellipse(closest-side farthest-side at 50% 50%)");
+checkEquals("ellipse(closest-side 10% at 50% 50%)",
+ "ellipse(closest-side 10% at 50% 50%)");
+
+// Don't transform nonzero lengths
+checkEquals("circle(at right 5px bottom 10px)",
+ "circle(at right 5px bottom 10px)");
+checkEquals("ellipse(at right 5px bottom 10px)",
+ "ellipse(at right 5px bottom 10px)");
+
+// Convert keyword-percentage pairs to plain percentages
+// Convert zero lengths to 0%
+checkEquals("circle(at right 5% top 0px)", "circle(at 95% 0%)");
+checkEquals("ellipse(at right 5% top 0px)", "ellipse(at 95% 0%)");
+
+// Don't transform calcs
+checkEquals("circle(at right calc(10% + 5px) bottom calc(10% + 5px))",
+ "circle(at right calc(10% + 5px) bottom calc(10% + 5px))");
+checkEquals("ellipse(at right calc(10% + 5px) bottom calc(10% + 5px))",
+ "ellipse(at right calc(10% + 5px) bottom calc(10% + 5px))");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-000.html
index ef5a6849d64..17cf25f5f5d 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-000.html
@@ -7,7 +7,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-image-threshold-property">
<meta name="assert" content="shape-image-threshold is any valid number and computed the
clipped value between 0 and 1.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-001.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-001.html
index 15823450a38..da3f6afa1ac 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-001.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-001.html
@@ -7,7 +7,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-image-threshold-property">
<meta name="assert" content="shape-image-threshold may take calc values and computed the
clipped value between 0 and 1.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-002.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-002.html
index d1aa8eed486..e4524ef29b6 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-002.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-002.html
@@ -6,7 +6,7 @@
<link rel="author" title="Rebecca Hauck" href="mailto:rhauck@adobe.com">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-image-threshold-property">
<meta name="assert" content="shape-image-threshold is set to 0 when an invalid value is specified.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-003.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-003.html
index b8a43b64d69..b9395697c35 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-003.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-image-threshold-003.html
@@ -6,7 +6,7 @@
<link rel="author" title="Rebecca Hauck" href="mailto:rhauck@adobe.com">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-image-threshold-property">
<meta name="assert" content="shape-outside can be assigned the 'inherit' value and does not inherit by default.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-000.html
index 191346e6b70..487868cee60 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-000.html
@@ -6,7 +6,7 @@
<link rel="author" title="Rebecca Hauck" href="mailto:rhauck@adobe.com">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-margin-property">
<meta name="assert" content="shape-margin values may be either a length or percentage">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-001.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-001.html
index d3bdfe047f1..39dea7efe81 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-001.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-001.html
@@ -6,7 +6,7 @@
<link rel="author" title="Rebecca Hauck" href="mailto:rhauck@adobe.com">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-margin-property">
<meta name="assert" content="shape-margin values may be in any length unit">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-002.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-002.html
index 31107be43bd..4cb0c69ba78 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-002.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-002.html
@@ -6,7 +6,7 @@
<link rel="author" title="Rebecca Hauck" href="mailto:rhauck@adobe.com">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-margin-property">
<meta name="assert" content="shape-margin values may be either a length or percentage">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-003.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-003.html
index 0844a712b95..7a6998447b3 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-003.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-003.html
@@ -6,7 +6,7 @@
<link rel="author" title="Rebecca Hauck" href="mailto:rhauck@adobe.com">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-margin-property">
<meta name="assert" content="shape-margin values may be calc() values">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-004.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-004.html
index 15606f7a197..5e7e1e83404 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-004.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-004.html
@@ -6,7 +6,7 @@
<link rel="author" title="Rebecca Hauck" href="mailto:rhauck@adobe.com">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-margin-property">
<meta name="assert" content="shape-margin values may only be positive length units.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-005.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-005.html
index 8cce60e4498..3c9b3233f2b 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-005.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-margin-005.html
@@ -6,7 +6,7 @@
<link rel="author" title="Rebecca Hauck" href="mailto:rhauck@adobe.com">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-margin-property">
<meta name="assert" content="The shape-margin value is not inherited and can be assigned the 'inherit' value.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-box-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-box-000.html
index ad9cee8f986..0c08358296d 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-box-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-box-000.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#typedef-shape-box">
<meta name="assert" content="Shape-outside may be one of the box model box values">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-000.html
index 80b0c15937a..e3ddeaf1272 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-000.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-circle">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="A circular basic shape has an optional radius and position component">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-001.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-001.html
index 0e8cfd101d0..9ca1ac1b710 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-001.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-001.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-circle">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="A circle's radius may be a length, percentage, or keyword.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-002.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-002.html
index 62b8abfa159..0a2b3fca567 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-002.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-002.html
@@ -15,7 +15,7 @@
or [ left|center|right ]
or [ left|center|right top|center|bottom ]
or [ top|center|bottom ]. ">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-003.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-003.html
index 2cfd9fa9e59..af111d21c6f 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-003.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-003.html
@@ -14,7 +14,7 @@
or [ left|center|right top|center|bottom ]
or [ top|center|bottom ].
All position arguments not in this form are invalid.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-004.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-004.html
index 1afcec5e2b4..01f3fc1bffe 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-004.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-004.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#lengths">
<meta name="assert" content="A circle's position arguments may in any valid <length> unit allowed by a <position> value.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-005.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-005.html
index 5a564af7ce4..7d90318ec73 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-005.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-005.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-circle">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="A circle's radius may be in any valid length unit.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-006.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-006.html
index bef8f864206..c7eace4cf93 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-006.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-006.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="A circle's radius may be in signed positive or decimal/non-decimal format. Negative
radii are invalid.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-007.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-007.html
index 5e3ddd9a854..e7e7c63c5dd 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-007.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-007.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-circle">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="This test verifies that invalid shape-radius arguments on circle() don't parse.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-008.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-008.html
index 9358f482021..24b37575b0d 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-008.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-008.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-circle">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="This test verifies that invalid position arguments on circle() don't parse">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-009.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-009.html
index 4dafb50b7ed..ff5dc83d353 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-009.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-009.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="A circle's position arguments may be in signed positive/negative or
decimal/non-decimal format.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-010.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-010.html
index b3565cee728..b255825bea6 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-010.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-010.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#calc-notation">
<meta name="assert" content="A circle's arguments may be in calc() values.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-011.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-011.html
index 266837ddbc0..7f0571cdd6f 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-011.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-circle-011.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#calc-notation">
<meta name="assert" content="A circle's <position> arguments may be in calc() values.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-000.html
index 17ed9c68a4a..f79b21a723e 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-000.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css-cascade-3/#computed">
<meta name="assert" content="The basic shape can contain relative length formats, which resolve to the computed (absolute) length value">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
@@ -18,15 +18,17 @@
<script type="text/javascript">
// font relative units: em, ex, ch, rem
var units = ['em', 'ex', 'ch', 'rem'];
- var div = document.createElement('div');
- document.body.appendChild(div);
var resolveds = {};
- units.forEach(function(unit) {
- div.style.width = '10' + unit;
- var s = getComputedStyle(div);
- resolveds[unit] = parseFloat(s.width);
- });
- document.body.removeChild(div);
+ ParsingUtils.setupFonts(function () {
+ var div = document.createElement('div');
+ document.body.appendChild(div);
+ units.forEach(function(unit) {
+ div.style.width = '10' + unit;
+ var s = getComputedStyle(div);
+ resolveds[unit] = parseFloat(s.width);
+ });
+ document.body.removeChild(div);
+ })();
function fillArray(string, length) {
return Array.apply(null, new Array(length)).map(String.prototype.valueOf, string);
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-001.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-001.html
index 49980c4031b..3f9d33f9e7e 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-001.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-computed-shape-001.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css-cascade-3/#computed">
<meta name="assert" content="The basic shape can contain percentages, which remain unchanged when computed">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-000.html
index 1c6da8a3b82..70f41ba0b57 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-000.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-ellipse">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="An elliptical basic shape has two optional components, radii (2) and a position.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-001.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-001.html
index 12ab4fd024b..c3dbae160c7 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-001.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-001.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-ellipse">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="An elliptical basic shape's radii may be keywords, lengths or percentages">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-002.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-002.html
index 5be4b8362d9..bcb84682128 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-002.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-002.html
@@ -15,7 +15,7 @@
or [ left|center|right ]
or [ left|center|right top|center|bottom ]
or [ top|center|bottom ]. ">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-003.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-003.html
index 82aeee6ea8c..55be7a55587 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-003.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-003.html
@@ -14,7 +14,7 @@
or [ left|center|right top|center|bottom ]
or [ top|center|bottom ].
All position arguments not in this form are invalid.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-004.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-004.html
index 05fe854d70c..7617a34bce0 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-004.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-004.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#lengths">
<meta name="assert" content="An ellipse's position arguments may in any valid <length> unit allowed by a <position> value.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-005.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-005.html
index 6ccefabe8d1..fe5af3b682c 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-005.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-005.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-ellipse">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="An ellipse's radii may be in any valid length unit.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-006.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-006.html
index 7b677f8b272..fe04cfaf51d 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-006.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-006.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="An ellipse's radii may be in signed positive or decimal/non-decimal format. Negative
radii are invalid.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-007.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-007.html
index 16f062520e1..7b8bc22d1d5 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-007.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-007.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-ellipse">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="This test verifies that invalid shape-radius arguments on ellipse() don't parse.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-008.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-008.html
index 3463d5361da..051c2669cd0 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-008.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-008.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-ellipse">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="This test verifies that invalid position arguments on ellipse() don't parse">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-009.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-009.html
index 32fbfba1bcc..af3a46a0004 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-009.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-009.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="An ellipse's position arguments may be in signed positive/negative or
decimal/non-decimal format.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-010.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-010.html
index 442a724cbee..19f80c25d59 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-010.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-010.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#calc-notation">
<meta name="assert" content="An ellipse's arguments may be in calc() values.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-011.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-011.html
index b92f9c7551c..983ff7b5879 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-011.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-ellipse-011.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#calc-notation">
<meta name="assert" content="An ellipse's <position> arguments may be in calc() values.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-000.html
index 8e8be964a32..8bd68ecde44 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-000.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-inset">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="An inset has 1 to 4 insets, and optional border radii that follow the border-radius format">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-001.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-001.html
index 24ae246a5cc..3724971363b 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-001.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-001.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-inset">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="An inset has 1 to 4 insets as percentages or length in any unit">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-002.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-002.html
index 19cd994aecd..559738f71d8 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-002.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-002.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="An inset's radial component has 1 to 4 length/percentages, optionally followed by a '/'
and an additional 1 to 4 length/percentages and lengths can be in any unit.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-003.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-003.html
index 0012621df1d..9b420707fe2 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-003.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-003.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#lengths">
<meta name="assert" content="An inset's radial component's values can be in any length unit">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-004.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-004.html
index e78e1f2a4f1..25de48a5cca 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-004.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-004.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="These tests verify that shape-outside inset() arguments can be numbers that are signed in
positive and negative and/or decimal/non-decimal form.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-005.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-005.html
index 4c05b598888..caf767f126c 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-005.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-005.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-inset">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="These tests verifies that invalid inset() arguments don't parse.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-006.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-006.html
index b699aac58ab..ee8b68c1eb7 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-006.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-006.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="These tests verify that shape-outside inset() radial component can be numbers that are in
signed positive and/or decimal/non-decimal form. Negative values are not allowed">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-007.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-007.html
index 7349e79dda8..8c4a7645138 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-007.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-007.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-inset">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="These tests verify invalid radial component arguments don't parse.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-008.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-008.html
index 837d9d94ad6..158898d7785 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-008.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-008.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#calc-notation">
<meta name="assert" content="An inset's arguments may be in calc() values.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-009.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-009.html
index fb0f573cb2d..c131783d1ea 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-009.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-inset-009.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#calc-notation">
<meta name="assert" content="An inset's radial component arguments may be in calc() values.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-000.html
index 479cb691763..9ca058194a8 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-000.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-polygon">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="A polygonal basic shape has an optional fill-rule and one or more pairs of coordinates">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-001.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-001.html
index fbfa8547014..847bfd96ea1 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-001.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-001.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-polygon">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="A polygonal basic shape's optional fill-rule may be either 'nonzero' or 'evenodd'">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-002.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-002.html
index 1a2b3f19c1c..533198bc95b 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-002.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-002.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-polygon">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="A polygonal basic shape's points may be either lengths or percentages">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-003.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-003.html
index f9f4fae2e6f..f357875a68b 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-003.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-003.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-polygon">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="A polygonal basic shape's points may be either lengths or percentages">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-004.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-004.html
index 21b91a2d492..c9623a2e5bd 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-004.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-004.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#lengths">
<meta name="assert" content="A polygon's veritices may in percentage or any valid <length> units.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-005.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-005.html
index fa4bfd6dff6..de861bdcb73 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-005.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-005.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#funcdef-polygon">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="A polygon's vertices can be in signed positive/negative or decimal/non-decimal format">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-006.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-006.html
index ac2628ecdb5..a5f18d9bec3 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-006.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-polygon-006.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css3-values/#calc-notation">
<meta name="assert" content="A polygon's arguments may be in calc() values.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-000.html
index e4d2c643a8a..02d5bc78d9a 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-000.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/cssom-1/#serializing-css-values">
<meta name="assert" content="A basic basic shape can contain any length unit type, or percentage">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-001.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-001.html
index bdc4d5e7e24..6bad4d0b0ab 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-001.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-arguments-001.html
@@ -9,7 +9,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/cssom-1/#serializing-css-values">
<meta name="assert" content="The basic shape can contain all valid number formats">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-box-pair-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-box-pair-000.html
index 92a727c7b35..72de9010dbe 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-box-pair-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-box-pair-000.html
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#typedef-shape-box">
<meta name="assert" content="Shape-outside may be a pair of shape and box values">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-inherit-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-inherit-000.html
index 9e661803fdd..4a589bf781b 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-inherit-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-inherit-000.html
@@ -7,7 +7,7 @@
<link rel="reviewer" title="Alan Stearns" href="mailto:stearns@adobe.com"> <!-- 2014-03-04 -->
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="Shape-outside takes can be assigned the 'inherit' value.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-initial-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-initial-000.html
index 00d8f6e3389..912e1c67a38 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-initial-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-initial-000.html
@@ -7,7 +7,7 @@
<link rel="reviewer" title="Alan Stearns" href="mailto:stearns@adobe.com"> <!-- 2014-03-04 -->
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="Shape-outside takes its default value of none when assigned the 'initial' value">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-none-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-none-000.html
index 9f7ffce23ca..d76345df01f 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-none-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-none-000.html
@@ -7,7 +7,7 @@
<link rel="reviewer" title="Alan Stearns" href="mailto:stearns@adobe.com"> <!-- 2014-03-04 -->
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<meta name="assert" content="shape-outside can be explictly assigned the default value of none.">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-notation-000.html b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-notation-000.html
index dce331ba5a2..c84f934bcf3 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-notation-000.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/shape-outside-shape-notation-000.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html>
+ <!DOCTYPE html>
<html>
<head>
<title>Shape Outside Valid Basic Shape Functional Notation</title>
@@ -8,7 +8,7 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property">
<link rel="help" href="http://www.w3.org/TR/cssom-1/#serializing-css-values">
<meta name="assert" content="Basic shapes use functional notation, and may contain optional whitespace inside the parentheses">
- <meta name="flags" content="dom">
+ <meta name="flags" content="ahem dom">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/parsing-utils.js"></script>
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/support/parsing-utils.js b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/support/parsing-utils.js
index 11a8dc833f3..cc174ecb7fa 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/support/parsing-utils.js
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/shape-outside/values/support/parsing-utils.js
@@ -350,9 +350,9 @@ function convertToPx(origValue) {
} else if (unit == 'em') {
number = (16 * number);
} else if (unit == 'ex') {
- number = (7.1796875 * number);
+ number = (12.8 * number);
} else if (unit == 'ch') {
- number = (8 * number);
+ number = (16 * number);
} else if (unit == 'rem') {
number = (16 * number);
} else if (unit == 'vw') {
@@ -438,6 +438,38 @@ function generateInsetRoundCases(units, testType) {
return results;
}
+function each(object, func) {
+ for (var prop in object) {
+ if (object.hasOwnProperty(prop)) {
+ func(prop, object[prop]);
+ }
+ }
+}
+
+function setupFonts(func) {
+ return function () {
+ var fontProperties = {
+ 'font-family': 'Ahem',
+ 'font-size': '16px',
+ 'line-height': '1'
+ };
+ var savedValues = { };
+ each(fontProperties, function (key, value) {
+ savedValues[key] = document.body.style.getPropertyValue(key);
+ document.body.style.setProperty(key, value);
+ });
+ func.apply(this, arguments);
+ each(fontProperties, function (key, value) {
+ if (value) {
+ document.body.style.setProperty(key, value);
+ }
+ else {
+ document.body.style.removeProperty(key);
+ }
+ });
+ };
+}
+
var validUnits = [
"cm","mm","in","pt","pc", // Absolute length units (omitting px b/c we default to that in all tests)
"em","ex","ch","rem", // Font relative length units
@@ -847,11 +879,11 @@ var calcTestValues = [
return {
testInlineStyle: testInlineStyle,
- testComputedStyle: testComputedStyle,
+ testComputedStyle: setupFonts(testComputedStyle),
testShapeMarginInlineStyle: testShapeMarginInlineStyle,
- testShapeMarginComputedStyle: testShapeMarginComputedStyle,
+ testShapeMarginComputedStyle: setupFonts(testShapeMarginComputedStyle),
testShapeThresholdInlineStyle: testShapeThresholdInlineStyle,
- testShapeThresholdComputedStyle: testShapeThresholdComputedStyle,
+ testShapeThresholdComputedStyle: setupFonts(testShapeThresholdComputedStyle),
buildTestCases: buildTestCases,
buildRadiiTests: buildRadiiTests,
buildPositionTests: buildPositionTests,
@@ -861,6 +893,7 @@ return {
buildCalcTests: buildCalcTests,
validUnits: validUnits,
calcTestValues: calcTestValues,
- roundResultStr: roundResultStr
+ roundResultStr: roundResultStr,
+ setupFonts: setupFonts
}
})();
diff --git a/tests/wpt/web-platform-tests/css/css-shapes-1/spec-examples/shape-outside-012.html b/tests/wpt/web-platform-tests/css/css-shapes-1/spec-examples/shape-outside-012.html
index 3ce4e6a01e3..1d0b052e909 100644
--- a/tests/wpt/web-platform-tests/css/css-shapes-1/spec-examples/shape-outside-012.html
+++ b/tests/wpt/web-platform-tests/css/css-shapes-1/spec-examples/shape-outside-012.html
@@ -7,7 +7,6 @@
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shapes-from-image"/>
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-outside-property"/>
<link rel="help" href="http://www.w3.org/TR/css-shapes-1/#shape-image-threshold-property"/>
- <link rel="match" href="reference/shape-outside-012-ref.html"/>
<meta name="flags" content="ahem dom"/>
<meta name="assert" content="This test verifies content flows around a shape that is
defined in the image's alpha channel and adjusted by the
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-1.html b/tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-1.html
new file mode 100644
index 00000000000..4173f399bd7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-1.html
@@ -0,0 +1,96 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#bounding-box-assignment">
+<main>
+
+ <h1>Bounding box computation</h1>
+ <p>Checks that all table-internal boxes are positioned correctly</p>
+
+ <hr/>
+ <p>The all table-internal elements of this table shoud be 100px and 100px wide tall:</p>
+ <p>Table size is 120px. There are two 10px border-spacing, one at each side.</p>
+ <x-table style="width: 120px; height: 120px; border-spacing: 10px; background: yellow;">
+ <x-colgroup><x-col></x-col></x-colgroup>
+ <x-tbody>
+ <x-tr>
+ <x-td style="padding: 0; background: blue;"></x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ "Control test: Table width is 120px",
+ document.querySelector("x-table:nth-of-type("+(i++)+")").offsetWidth,
+ 120
+ ],
+ [
+ "Control test: Table height is 120px",
+ document.querySelector("x-table:nth-of-type("+(i-1)+")").offsetHeight,
+ 120
+ ],
+ [
+ "Table-cell is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-td").offsetWidth,
+ 100
+ ],
+ [
+ "Table-cell is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-td").offsetHeight,
+ 100
+ ],
+ [
+ "Table-row is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tr").offsetWidth,
+ 100
+ ],
+ [
+ "Table-row is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tr").offsetHeight,
+ 100
+ ],
+ [
+ "Table-row-group is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetWidth,
+ 100
+ ],
+ [
+ "Table-row-group is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetHeight,
+ 100
+ ],
+ [
+ "Table-column is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-col").offsetWidth,
+ 100
+ ],
+ [
+ "Table-column is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-col").offsetHeight,
+ 100
+ ],
+ [
+ "Table-column-group is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-colgroup").offsetWidth,
+ 100
+ ],
+ [
+ "Table-column-group is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-colgroup").offsetHeight,
+ 100
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-2.html b/tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-2.html
new file mode 100644
index 00000000000..f20cfe2a78a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-2.html
@@ -0,0 +1,96 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#bounding-box-assignment">
+<main>
+
+ <h1>Bounding box computation</h1>
+ <p>Checks that all table-internal boxes are positioned correctly</p>
+
+ <hr/>
+ <p>The all table-internal elements of this table shoud be 100px and 100px wide tall:</p>
+ <p>Table size is 120px. There are two 10px borders, one at each side.</p>
+ <x-table style="width: 120px; height: 120px; border: 10px solid transparent; box-sizing: border-box; background: yellow;">
+ <x-colgroup><x-col></x-col></x-colgroup>
+ <x-tbody>
+ <x-tr>
+ <x-td style="padding: 0; background: blue;"></x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ "Control test: Table width is 120px",
+ document.querySelector("x-table:nth-of-type("+(i++)+")").offsetWidth,
+ 120
+ ],
+ [
+ "Control test: Table height is 120px",
+ document.querySelector("x-table:nth-of-type("+(i-1)+")").offsetHeight,
+ 120
+ ],
+ [
+ "Table-cell is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-td").offsetWidth,
+ 100
+ ],
+ [
+ "Table-cell is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-td").offsetHeight,
+ 100
+ ],
+ [
+ "Table-row is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tr").offsetWidth,
+ 100
+ ],
+ [
+ "Table-row is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tr").offsetHeight,
+ 100
+ ],
+ [
+ "Table-row-group is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetWidth,
+ 100
+ ],
+ [
+ "Table-row-group is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetHeight,
+ 100
+ ],
+ [
+ "Table-column is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-col").offsetWidth,
+ 100
+ ],
+ [
+ "Table-column is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-col").offsetHeight,
+ 100
+ ],
+ [
+ "Table-column-group is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-colgroup").offsetWidth,
+ 100
+ ],
+ [
+ "Table-column-group is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-colgroup").offsetHeight,
+ 100
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-3.html b/tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-3.html
new file mode 100644
index 00000000000..188257af443
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/bounding-box-computation-3.html
@@ -0,0 +1,86 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#bounding-box-assignment">
+<main>
+
+ <h1>Bounding box computation</h1>
+ <p>Checks that all table-internal boxes are positioned correctly</p>
+
+ <hr/>
+ <p>The first table-row-group should have width and height 0:</p>
+ <p>The first tbody is empty, and should return an height of 0px. The second one should be 100px tall.</p>
+ <x-table style="border-spacing: 10px; background: yellow; position: relative;">
+ <x-tbody></x-tbody>
+ <x-tbody>
+ <x-tr>
+ <x-td style="padding: 50px; background: blue;"></x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ "Control test: Table width is 120px",
+ document.querySelector("x-table:nth-of-type("+(i++)+")").offsetWidth,
+ 120
+ ],
+ [
+ "Control test: Table height is 120px",
+ document.querySelector("x-table:nth-of-type("+(i-1)+")").offsetHeight,
+ 120
+ ],
+ [
+ "First (empty) table-row-group is 0px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetWidth,
+ 0
+ ],
+ [
+ "First (empty) table-row-group is 0px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetHeight,
+ 0
+ ],
+ [
+ "First (empty) table-row-group should be located at 10px left",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetLeft,
+ 10
+ ],
+ [
+ "First (empty) table-row-group should be located at 10px top",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetTop,
+ 10
+ ],
+ [
+ "Second table-row-group is 100px wide",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody + x-tbody").offsetWidth,
+ 100
+ ],
+ [
+ "Second table-row-group is 100px tall",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody + x-tbody").offsetHeight,
+ 100
+ ],
+ [
+ "Second table-row-group should be located at 10px left",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody + x-tbody").offsetLeft,
+ 10
+ ],
+ [
+ "Second table-row-group should be located at 10px top",
+ document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody + x-tbody").offsetTop,
+ 10
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/caption-side-1.html b/tests/wpt/web-platform-tests/css/css-tables-3/caption-side-1.html
new file mode 100644
index 00000000000..302e51ae239
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/caption-side-1.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#caption-side-property">
+<main>
+
+ <h1>Caption-side</h1>
+ <p>Checks that browsers implement properly the caption-side property</p>
+
+ <hr/>
+ <p>This should read ABC:</p>
+ <p>
+ The first caption (C) should be put on the bottom because it inherits caption-side:bottom from the table;<br/>
+ The second captin (A) should be put on the top because it has caption-side:top specified;
+ </p>
+ <div><table style="caption-side:bottom"><caption>C</caption><tbody><tr><td>B</td></tr></tbody><caption style="caption-side:top">A</caption></table></div>
+
+ <script>void function() { var table; while(table = document.querySelector('.to-remove')) table.parentNode.replaceChild(table.firstChild,table) }();</script>
+ <script>void function() { var td; while(td = document.querySelector('table.no-td td')) td.parentNode.replaceChild(document.createElement('x-td'),td) }();</script>
+ <script>void function() { var divs = document.querySelectorAll("main > div"); for(var i = divs.length; i--;) { var div = divs[i]; var pre = document.createElement('pre'); pre.title = pre.textContent = div.innerHTML; div.parentNode.insertBefore(pre, div); }; }();</script>
+ <hr/>
+
+</main>
+
+<script>
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ "Caption-side inherits and reorder captions properly",
+ document.querySelector("main > div:nth-of-type("+(i++)+") caption:first-child").offsetTop > document.querySelector("main > div:nth-of-type("+(i-1)+") caption:last-child").offsetTop,
+ true
+ ],
+ [
+ "Multiple captions can be rendered",
+ document.querySelector("main > div:nth-of-type("+(i-1)+") table").offsetHeight > 3 * 16,
+ true
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-1.html b/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-1.html
new file mode 100644
index 00000000000..3e0d013af1c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-1.html
@@ -0,0 +1,90 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution-in-fixed-mode">
+<main>
+
+ <h1>Fixed Layout</h1>
+ <p>Checks whether fixed layout is implemented properly</p>
+
+ <hr/>
+ <p>This should be a 100px-wide blue square:</p>
+ <p>Width is distributed equally between columns of auto size</p>
+ <x-table style="table-layout: fixed; width: 200px; border-spacing: 0px">
+ <x-tr>
+ <x-td style="padding: 0; background: blue; height: 100px;"></x-td>
+ <x-td style="padding: 0"></x-td>
+ </x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 100px-wide blue square:</p>
+ <p>Width is distributed equally between columns of auto size (even if they are defined by rows other than the first)</p>
+ <x-table style="table-layout: fixed; width: 200px; border-spacing: 0px">
+ <x-tr><x-td style="padding: 0; background: blue; height: 100px;"></x-td></x-tr>
+ <x-tr><x-td style="padding: 0; height: 0px"></x-td><x-td style="padding: 0"></x-td></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 100px-wide blue square:</p>
+ <p>Widths defined on cells that are not the first row are ignored</p>
+ <x-table style="table-layout: fixed; width: 200px; border-spacing: 0px">
+ <x-tr><x-td style="padding: 0; background: blue; height: 100px;"></x-td></x-tr>
+ <x-tr><x-td style="padding: 0; height: 0px; width: 200px;"></x-td><x-td style="padding: 0; width: 200px;"></x-td></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 100px-wide blue square:</p>
+ <p>The table has to grow to contain the widths defined for its columns</p>
+ <x-table style="table-layout: fixed; width: 50px; border-spacing: 0px">
+ <x-tr><x-td style="padding: 0; background: blue; height: 100px; width: 100px;"></x-td></x-tr>
+ <x-tr><x-td style="padding: 0; height: 0px"></x-td><x-td style="padding: 0"></x-td></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 100px-wide blue square:</p>
+ <p>The first row is based on the visual order, not the dom order</p>
+ <x-table style="table-layout: fixed; width: 100px; border-spacing: 0px">
+ <x-tr><x-td style="padding: 0; height: 0px"></x-td><x-td style="padding: 0"></x-td></x-tr>
+ <x-thead><x-tr><x-td style="padding: 0; background: blue; height: 100px; width: 100px;"></x-td></x-tr></x-thead>
+ </x-table>
+
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ generate_tests(assert_equals, [
+ [
+ "Table-layout:fixed distributes width equally to all auto-columns",
+ document.querySelector("x-table:nth-of-type(1) > x-tr:first-child > x-td:first-child").offsetWidth,
+ 100
+ ],
+ [
+ "Table-layout:fixed deals with columns generated by subsequent rows",
+ document.querySelector("x-table:nth-of-type(2) > x-tr:first-child > x-td:first-child").offsetWidth,
+ 100
+ ],
+ [
+ "Table-layout:fixed ignores sizes specified by subsequent rows",
+ document.querySelector("x-table:nth-of-type(3) > x-tr:first-child > x-td:first-child").offsetWidth,
+ 100
+ ],
+ [
+ "Table-layout:fixed grows the table if needed for minimum-width",
+ document.querySelector("x-table:nth-of-type(4) > x-tr:first-child > x-td:first-child").offsetWidth,
+ 100
+ ],
+ [
+ "Table-layout:fixed takes visual order into account, not dom order",
+ document.querySelector("x-table:nth-of-type(5) > x-tr:first-child > x-td:first-child").offsetWidth,
+ 100
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-2.html b/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-2.html
new file mode 100644
index 00000000000..7cb09d4dd04
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-2.html
@@ -0,0 +1,84 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#in-fixed-mode">
+<main>
+
+ <h1>Fixed Layout</h1>
+ <p>Checks whether fixed layout is implemented properly (width is not definite)</p>
+
+ <hr/>
+ <p>This should be a 100px-wide blue square:</p>
+ <p>Table-layout:fixed does not apply to width:auto tables</p>
+ <x-table style="table-layout: fixed; border-spacing: 0px">
+ <x-tr>
+ <x-td style="padding: 0; background: blue; height: 100px;"><div style="width: 100px"></div></x-td>
+ <x-td style="padding: 0"></x-td>
+ </x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 100px-wide blue square:</p>
+ <p>Table-layout:fixed does not apply to width:max-content tables</p>
+ <x-table style="table-layout: fixed; width: max-content; border-spacing: 0px">
+ <x-tr>
+ <x-td style="padding: 0; background: blue; height: 100px;"><div style="width: 100px"></div></x-td>
+ <x-td style="padding: 0"></x-td>
+ </x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 100px-wide blue square:</p>
+ <p>Table-layout:fixed does not apply to width:min-content/fit-content tables</p>
+ <x-table style="table-layout: auto; width: fit-content; border-spacing: 0px">
+ <x-tr>
+ <x-td style="padding: 0; background: blue; height: 50px;"><div style="width: 100px"></div></x-td>
+ <x-td style="padding: 0"></x-td>
+ </x-tr>
+ </x-table>
+ <x-table style="table-layout: fixed; width: min-content; border-spacing: 0px">
+ <x-tr>
+ <x-td style="padding: 0; background: blue; height: 50px;"><div style="width: 100px"></div></x-td>
+ <x-td style="padding: 0"></x-td>
+ </x-tr>
+ </x-table>
+
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ generate_tests(assert_equals, [
+ [
+ "Table-layout:fixed is not applied when width is auto",
+ document.querySelector("x-table:nth-of-type(1) > x-tr:first-child > x-td:first-child").offsetWidth,
+ 100
+ ],
+ [
+ "Table-layout:fixed reports it is not applied when width is auto",
+ getComputedStyle(document.querySelector("x-table:nth-of-type(1)")).tableLayout,
+ 'auto'
+ ],
+ [
+ "Table-layout:fixed is not applied when width is max-content",
+ document.querySelector("x-table:nth-of-type(2) > x-tr:first-child > x-td:first-child").offsetWidth,
+ 100
+ ],
+ [
+ "Table-layout:fixed reports it is not applied when width is max-content",
+ getComputedStyle(document.querySelector("x-table:nth-of-type(2)")).tableLayout,
+ 'auto'
+ ],
+ [
+ "Table-layout:fixed is not applied when width is min-content",
+ document.querySelector("x-table:nth-of-type(3) > x-tr:first-child > x-td:first-child").offsetWidth,
+ document.querySelector("x-table:nth-of-type(4) > x-tr:first-child > x-td:first-child").offsetWidth
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-calc-width-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-calc-width-001.html
new file mode 100644
index 00000000000..91c665ee2d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-calc-width-001.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/check-layout-th.js"></script>
+<link rel="author" title="David Grogan" href="dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#distributing-width-to-columns">
+
+<style>
+table {
+ width: 200px;
+ border-collapse: collapse;
+ table-layout: fixed;
+ height: 20px;
+}
+
+td {
+ padding: 0px;
+ background: lime;
+ outline: 1px solid blue;
+}
+</style>
+
+<h2>Calc width on col is treated as auto, even in fixed tables</h2>
+
+<table id=theTable>
+ <col style="width:calc(20% + 80px)">
+ <tr>
+ <td data-expected-width=100></td>
+ <td data-expected-width=100></td>
+ </tr>
+</table>
+
+<script>
+checkLayout('#theTable')
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-excess-width-distribution-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-excess-width-distribution-001.html
new file mode 100644
index 00000000000..a9a78bd59b0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/fixed-layout-excess-width-distribution-001.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/check-layout-th.js"></script>
+<link rel="author" title="David Grogan" href="dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#distributing-width-to-columns">
+
+<style>
+table {
+ width: 300px;
+ border-collapse: collapse;
+ table-layout: fixed;
+ height: 20px;
+}
+
+td {
+ padding: 0px;
+ background: lime;
+ outline: 1px solid blue;
+}
+
+td:nth-child(1) { width: 20px; }
+td:nth-child(2) { width: 10px; }
+td:nth-child(3) { width: 10%; }
+</style>
+
+<h2>Fixed layout tables with excess width and no auto columns</h2>
+
+FF/Edge give excess only to fixed columns, in proportion to their relative
+widths. This is what the spec dictates.
+<br>Chrome (62) gives excess to ALL columns, in proportion to their
+contribution to total width.
+<table id=theTable>
+ <tr>
+ <td data-expected-width=180></td>
+ <td data-expected-width=90></td>
+ <td data-expected-width=30></td>
+ </tr>
+</table>
+
+<script>
+checkLayout('#theTable')
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/computing-row-measure-0.html b/tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/computing-row-measure-0.html
new file mode 100644
index 00000000000..ba8bf73429f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/computing-row-measure-0.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-column-measures" />
+<main>
+ <h4>"Computing row measures"</h4>
+ <p>This is testing that the table root's minimum is max(table-root width, capmin, gridmin) <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec Text</a></p>
+
+ <hr/>
+ <table id="one" cellspacing="0" cellpadding="0">
+ <tbody style="height: 1px;">
+ <tr style="height: 10px;">
+ <td style="height: 1px;"></td>
+ </tr>
+ </tbody>
+ </table>
+
+ <table id="two" cellspacing="0" cellpadding="0">
+ <tbody style="height: 10px;">
+ <tr style="height: 1px;">
+ <td style="height: 1px;"></td>
+ </tr>
+ </tbody>
+ </table>
+
+ <table id="three" cellspacing="0" cellpadding="0">
+ <tbody style="height: 1px;">
+ <tr style="height: 1px;">
+ <td style="height: 10px;"></td>
+ </tr>
+ </tbody>
+ </table>
+
+ <table id="four" cellspacing="0" cellpadding="0">
+ <tbody style="height: 10px;">
+ <tr>
+ <td style="height: 1px;"></td>
+ </tr>
+ </tbody>
+ </table>
+</main>
+
+<script>
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ "Checking intermediate min-content height for span 1 (1)",
+ document.getElementById('one').offsetHeight,
+ 10
+ ],
+ [
+ "Checking intermediate min-content height for span 1 (2)",
+ document.getElementById('two').offsetHeight,
+ 1
+ ],
+ [
+ "Checking intermediate min-content height for span 1 (3)",
+ document.getElementById('three').offsetHeight,
+ 10
+ ],
+ [
+ "Checking intermediate min-content height for span 1 (4)",
+ document.getElementById('four').offsetHeight,
+ 10
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/computing-row-measure-1.html b/tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/computing-row-measure-1.html
new file mode 100644
index 00000000000..756e730eefb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/computing-row-measure-1.html
@@ -0,0 +1,94 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-column-measures" />
+<main>
+ <h1>Width Distribution</h1>
+ <h4>"Computing column measures"</h4>
+ <p>This is testing intermediate min-content width for span 2</p>
+
+ <hr/>
+ <table cellspacing="0" cellpadding="0">
+ <colgroup style="width: auto;">
+ <col style="width: 10px;"></col>
+ <col style="width: 20px;"></col>
+ </colgroup>
+ <tr>
+ <td id="one" style="width: 1px;"></td>
+ <td style="width: 2px;"></td>
+ </tr>
+ <tr>
+ <td colspan="2" style="width: 51px;"></td>
+ </tr>
+ </table>
+
+ <table cellspacing="0" cellpadding="0">
+ <colgroup style="width: auto;">
+ <col style="width: 10px;"></col>
+ <col style="width: auto;"></col>
+ </colgroup>
+ <tr>
+ <td id="two" style="width: 1px;"></td>
+ <td style="width: auto;"></td>
+ </tr>
+ <tr>
+ <td colspan="2" style="width: 51px;"></td>
+ </tr>
+ </table>
+
+ <table cellspacing="0" cellpadding="0">
+ <colgroup style="width: 51px;">
+ <col style="width: 10px;"></col>
+ <col style="width: 20px;"></col>
+ </colgroup>
+ <tr>
+ <td id="three" style="width: 1px;"></td>
+ <td style="width: 2px;"></td>
+ </tr>
+ </table>
+
+ <table cellspacing="0" cellpadding="0">
+ <colgroup style="width: 51px;">
+ <col style="width: 20px;"></col>
+ <col style="width: auto;"></col>
+ </colgroup>
+ <tr>
+ <td style="width: 10px;"></td>
+ <td id="four" style="width: 20px;"></td>
+ </tr>
+ </table>
+</main>
+
+<style>
+ table { margin-bottom: 10px; height: 50px; }
+ td { outline: 1px solid red; outline-offset: -1px; }
+</style>
+<script>
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ "Checking intermediate min-content width for span 2 (1)",
+ document.getElementById('one').offsetWidth,
+ 17
+ ],
+ [
+ "Checking intermediate min-content width for span 2 (2)",
+ document.getElementById('two').offsetWidth,
+ 10
+ ],
+ [
+ "Checking intermediate min-content width for span 2 (3)",
+ document.getElementById('three').offsetWidth,
+ 10
+ ],
+ [
+ "Checking intermediate min-content width for span 2 (4)",
+ document.getElementById('four').offsetWidth,
+ 51
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/percentage-sizing-of-table-cell-children.html b/tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/percentage-sizing-of-table-cell-children.html
new file mode 100644
index 00000000000..10295810227
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/height-distribution/percentage-sizing-of-table-cell-children.html
@@ -0,0 +1,199 @@
+<!doctype html>
+<!--------------------------------------------------------------------------------------->
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-column-measures" />
+<script>
+
+ function assertOffsetWidthEquals(a,targetValue) {
+ var desc = document.querySelector('main > hr:last-of-type + p + p') || document.querySelectorAll('main > hr + p + p')[document.querySelectorAll('main > hr + p + p').length-1];
+ var root = document.querySelector('main > div:last-of-type') || document.querySelectorAll('main > div')[document.querySelectorAll('main > div').length-1];
+ generate_tests(assert_equals, [
+ [
+ desc.textContent,
+ root.querySelector("[target="+a+"]").offsetWidth,
+ targetValue
+ ]
+ ]);
+ }
+
+ function assertOffsetHeightEquals(a,targetValue) {
+ var desc = document.querySelector('main > hr:last-of-type + p + p') || document.querySelectorAll('main > hr + p + p')[document.querySelectorAll('main > hr + p + p').length-1];
+ var root = document.querySelector('main > div:last-of-type') || document.querySelectorAll('main > div')[document.querySelectorAll('main > div').length-1];
+ generate_tests(assert_equals, [
+ [
+ desc.textContent,
+ root.querySelector("[target="+a+"]").offsetHeight,
+ targetValue
+ ]
+ ]);
+ }
+
+</script>
+
+
+<main>
+
+ <h1>Height distribution</h1>
+ <p>Check that percentages are accounted for correctly for table-cell children</p>
+
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>There should be a 100px blue square below:</p>
+ <p>Percentages resolve based on the column width</p>
+ <div>
+ <x-table style="width: 100px; height: 100px;">
+ <x-tr><x-td><div target=a style="width: 100%; height: 100px; background: blue"></div></x-td></x-tr>
+ </x-table>
+ </div>
+ <script>
+
+ assertOffsetWidthEquals('a',100);
+
+ </script>
+
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>There should be a 100px blue square below:</p>
+ <p>Percentages resolve based on the row height</p>
+ <div>
+ <x-table style="width: 100px; height: 100px;">
+ <x-tr><x-td><div target=a style="width: 100px; height: 100%; background: blue"></div></x-td></x-tr>
+ </x-table>
+ </div>
+ <script>
+
+ assertOffsetHeightEquals('a',100);
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>There should be a 100px blue square below:</p>
+ <p>Percentages resolve based on the final column width</p>
+ <div>
+ <x-table style="width: 0px; height: 100px; background: red;">
+ <x-tr><x-td style="width:0px;height:0px;"><div target=a style="width: 100%; height: 100px; background: blue"></div></x-td></x-tr>
+ <x-tr><x-td style="width:0px;height:0px;"><div target=a style="width: 100px; height: 0px"></div></x-td></x-tr>
+ </x-table>
+ </div>
+ <script>
+
+ assertOffsetWidthEquals('a',100);
+
+ </script>
+
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>There should be a 100px blue square below:</p>
+ <p>Percentages resolve based on the final row height</p>
+ <div>
+ <x-table style="width: 100px; height: 0px; background: red;">
+ <x-tr>
+ <x-td style="width: 0px; height: 0px;"><div target=a style="width: 100px; height: 100%; background: blue"></div></x-td>
+ <x-td style="width: 0px; height: 0px;"><div target=a style="width: 0px; height: 100px; background: red"></div></x-td>
+ </x-tr>
+ </x-table>
+ </div>
+ <script>
+
+ assertOffsetHeightEquals('a',100);
+
+ </script>
+
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>There should be a blue and cyan rectangles of the same width:</p>
+ <p>Unresolvable percentage widths are resolved as auto in first pass (replaced elements)</p>
+ <div>
+ <x-table style="width: 0px; height: 18px; background: red;">
+ <x-tr><x-td><input target=a style="width: 100%; height: 100%; background: blue; vertical-align: top; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;"/></x-td></x-tr>
+ </x-table>
+ <input style="background:cyan; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;" />
+ </div>
+ <script>
+
+ assertOffsetWidthEquals('a',document.querySelector('input[style="background:cyan; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;"]').offsetWidth);
+
+ </script>
+
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>There should be a blue and cyan rectangles below of the same height:</p>
+ <p>Unresolvable percentage heights are resolved as auto in first pass (replaced elements)</p>
+ <div>
+ <x-table style="width: auto; height: 0px; background: red;">
+ <x-tr><x-td><input target=a style="width: 100%; height: 100%; background: blue; vertical-align: top; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;"/></x-td></x-tr>
+ </x-table>
+ <input style="background:cyan; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;" />
+ </div>
+ <script>
+
+ assertOffsetHeightEquals('a',document.querySelector('input[style="background:cyan; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;"]').offsetHeight);
+
+ </script>
+
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>There should be a 100px blue square below:</p>
+ <p>Unresolvable percentage widths are resolved as auto in first pass (unscrollable overflow)</p>
+ <div>
+ <x-table style="width: 0px; height: 100px; background: red;">
+ <x-tr><x-td><div target=a style="width: 100%; height: 100px; background: blue; overflow: hidden;"><div target=a style="width: 100px; height: 0px"></div></div></x-td></x-tr>
+ </x-table>
+ </div>
+ <script>
+
+ assertOffsetWidthEquals('a',100);
+
+ </script>
+
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>There should be a 100px blue square below:</p>
+ <p>Unresolvable percentage heights are resolved as auto in first pass (unscrollable overflow)</p>
+ <div>
+ <x-table style="width: 100px; height: 0px; background: red;">
+ <x-tr>
+ <x-td><div target=a style="width: 100px; height: 100%; background: blue; overflow: hidden;"><div target=a style="width: 0px; height: 100px; background: red"></div></div></x-td>
+ </x-tr>
+ </x-table>
+ </div>
+ <script>
+
+ assertOffsetHeightEquals('a',100);
+
+ </script>
+
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>There should be a 100px blue square below:</p>
+ <p>Unresolvable percentage widths are resolved as auto in first pass (scrollable overflow)</p>
+ <div>
+ <x-table style="width: 0px; height: 100px; background: red;">
+ <x-tr><x-td><div target=a style="width: 100%; height: 100px; background: blue; overflow: auto;"><div target=a style="width: 100px; height: 0px"></div></div></x-td></x-tr>
+ </x-table>
+ </div>
+ <script>
+
+ assertOffsetWidthEquals('a',100);
+
+ </script>
+
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>There should be a 100px blue square below:</p>
+ <p>Unresolvable percentage heights are resolved as 0px in first pass (scrollable overflow)</p>
+ <div>
+ <x-table style="width: 100px; height: 100px; background: red;">
+ <x-tr><x-td><div target=a style="width: 100px; height: 100%; background: red; overflow: auto;"><div target=a style="width: 0px; height: 100px; background: red"></div></div></x-td></x-tr>
+ <x-tr><x-td><div style="width: 100px; height: 100%; background: blue; overflow: hidden;"><div target=a style="width: 0px; height: 100px; background: red"></div></div></x-td></x-tr>
+ </x-table>
+ </div>
+ <script>
+
+ assertOffsetHeightEquals('a',0);
+
+ </script>
+
+</main>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/html-to-css-mapping-1.html b/tests/wpt/web-platform-tests/css/css-tables-3/html-to-css-mapping-1.html
new file mode 100644
index 00000000000..c29fd1db9db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/html-to-css-mapping-1.html
@@ -0,0 +1,63 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#fixup">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#mapping">
+<main>
+
+ <h1>HTML-2-CSS Mapping</h1>
+ <p>Checks that browsers implement properly the html2css stylesheet (rules without attributes)</p>
+
+ <hr/>
+ <p>You should see a 5 2px blue square here, separated by 2px each:</p>
+ <p>Because of the lack of the table element, border-spacing is 0; padding on each td should be 1px on each side. 1px*2*5=10px.</p>
+ <div><table><tbody style="background: blue; height: 2px"><tr><td></td><td></td><td></td><td></td><td></tr></tbody></table></div>
+
+ <hr/>
+ <p>You should see a 10px blue square here:</p>
+ <p>Because of the lack of the table element, border-spacing is 0; padding on each td should be 1px on each side. 1px*2*5=10px.</p>
+ <div><table class="to-remove"><tbody style="background: blue; height: 10px"><tr><td></td><td></td><td></td><td></td><td></tr></tbody></table></div>
+
+ <hr/>
+ <p>You should see a 12px blue square here:</p>
+ <p>The table has the background; x-td elements have no padding, only the border-spacing remains. 6*2px=12px.</p>
+ <div><table style="height: 12px; background: blue;" class="no-td"><tbody><tr><td></td><td></td><td></td><td></td><td></tr></tbody></table></div>
+
+ <hr/>
+ <p>You shouldn't see anything here:</p>
+ <p>The table has the background but is empty; it does not apply border-spacing in this case.</p>
+ <div><table style="height: 2px; background: red"></table></div>
+
+ <script>void function() { var table; while(table = document.querySelector('.to-remove')) table.parentNode.replaceChild(table.firstChild,table) }();</script>
+ <script>void function() { var td; while(td = document.querySelector('table.no-td td')) td.parentNode.replaceChild(document.createElement('x-td'),td) }();</script>
+
+</main>
+
+<script>
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ "HTML -> CSS Mapping is applied correctly on proper table markup (border-spacing, padding)",
+ document.querySelector("main > div:nth-of-type("+(i++)+") table").offsetWidth,
+ 22
+ ],
+ [
+ "HTML -> CSS Mapping is applied correctly on improper table markup (no table => no border-spacing, but padding)",
+ document.querySelector("main > div:nth-of-type("+(i++)+") tbody").offsetWidth,
+ 10
+ ],
+ [
+ "HTML -> CSS Mapping is applied correctly on improper table markup (no td => border-spacing, but no padding)",
+ document.querySelector("main > div:nth-of-type("+(i++)+") table").offsetWidth,
+ 12
+ ],
+ [
+ "HTML -> CSS Mapping is applied correctly on empty table markup (no content => no border-spacing, no padding)",
+ document.querySelector("main > div:nth-of-type("+(i++)+") table").offsetWidth,
+ 0
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/html-to-css-mapping-2.html b/tests/wpt/web-platform-tests/css/css-tables-3/html-to-css-mapping-2.html
new file mode 100644
index 00000000000..552270b5399
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/html-to-css-mapping-2.html
@@ -0,0 +1,226 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#mapping">
+<main>
+
+ <h1>HTML-2-CSS Mapping</h1>
+ <p>Checks that browsers implement properly the html2css stylesheet (rules about borders, disabling border-collapse for clarity)</p>
+ <style>table { border-collapse: separate !important; }</style>
+
+ <hr/>
+ <p>1: The border of the table element should be 0px hidden gray:</p>
+ <p>
+ <code>border-width:0px</code> is the <code>initial</code> value;<br/>
+ <code>border-style:hidden</code> comes from <code>table:matches(..., [rules=groups], ...)</code>;<br/>
+ <code>border-color:gray</code> comes from <code>table</code>
+ </p>
+ <div><table border="0" rules="groups"><tbody><tr><td></td></tr></tbody></table></div>
+
+ <hr/>
+ <p>2: The border of the table element should be 1px outset black:</p>
+ <p>
+ <code>border-width:1px</code> comes from <code>table[frame=box] (1/2)</code>;<br/>
+ <code>border-style:outset</code> comes from <code>table[frame=box] (2/2)</code>;<br/>
+ <code>border-color:black</code> comes from <code>table:matches(..., [rules=groups], ...)</code>
+ </p>
+ <div><table border="0" rules="groups" frame="box"><tbody><tr><td></td></tr></tbody></table></div>
+
+ <hr/>
+ <p>3a: The border of the table element should be 10px outset gray:</p>
+ <p>
+ <code>border-width:10px</code> comes from <code>table[border=$w]</code>;<br/>
+ <code>border-style:outset</code> comes from <code>table[frame=box] (2/2)</code>;<br/>
+ <code>border-color:gray</code> comes from <code>table[border=$w]</code>
+ </p>
+ <hr style="display:none"/>
+ <p>3b: The border-top of the td element should be 1px inset gray:</p>
+ <p>
+ <code>border-width:1px</code> comes from <code>table[border=$w] > ...td</code>;<br/>
+ <code>border-style:inset</code> comes from <code>table[border=$w] > ...td</code>;<br/>
+ <code>border-color:gray</code> comes from <code>table[border=$w] > ...td</code>
+ </p>
+ <hr style="display:none"/>
+ <p>3c: The border-left of the td element should be 1px hidden gray:</p>
+ <p>
+ <code>border-width:1px</code> comes from <code>table[border=$w] > ...td</code>;<br/>
+ <code>border-style:inset</code> comes from <code>table[border=$w] > ...td</code>;<br/>
+ <code>border-color:gray</code> comes from <code>table[border=$w] > ...td</code>
+ </p>
+ <div><table border="10" rules="groups" frame="box"><tbody><tr><td></td></tr></tbody></table></div>
+
+ <hr/>
+ <p>4a: The border of the table element should be 1px outset gray:</p>
+ <p>
+ <code>border-width:10px</code> comes from <code>table[border=$w]</code>;<br/>
+ <code>border-style:outset</code> comes from <code>table[border=$w]</code>;<br/>
+ <code>border-color:gray</code> comes from <code>table[border=$w]</code>
+ </p>
+ <hr style="display:none">
+ <p>4b: The top border of the td element should be 1px solid gray:</p>
+ <p>
+ <code>border-width:1px</code> comes from <code>table[rules=all] > ... td</code>;<br/>
+ <code>border-style:solid</code> comes from <code>table[rules=all] > ... td</code>;<br/>
+ <code>border-color:gray</code> comes from <code>table[rules=all] > ... td</code>
+ </p>
+ <div><table border="yes" rules="all"><tr><td></td></tr></table></div>
+
+ <hr>
+ <p>5a: The left border of the table element should be ? hidden ?:</p>
+ <p>
+ <code>border-style:hidden</code> comes from <code>table[frame=hsides]</code>;<br/>
+ </p>
+ <hr style="display:none">
+ <p>5b: The right border of the table element should be 10px solid gray:</p>
+ <p>
+ <code>border-width:10px</code> comes from <code>table[border=$w]</code>;<br/>
+ <code>border-style:solid</code> comes from <code>[style]</code>;<br/>
+ <code>border-color:gray</code> comes from <code>table[border=$w]</code>
+ </p>
+ <div><table border="10" frame="hsides" style="border-right-style: solid"><tr><td></td></tr></table></div>
+
+ <script>void function() { var table; while(table = document.querySelector('.to-remove')) table.parentNode.replaceChild(table.firstChild,table) }();</script>
+ <script>void function() { var td; while(td = document.querySelector('table.no-td td')) td.parentNode.replaceChild(document.createElement('x-td'),td) }();</script>
+ <script>void function() { var divs = document.querySelectorAll("main > div"); for(var i = divs.length; i--;) { var div = divs[i]; var pre = document.createElement('pre'); pre.title = pre.textContent = div.innerHTML; div.parentNode.insertBefore(pre, div); }; }();</script>
+ <hr/>
+
+</main>
+
+<script>
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ /*========================================*/
+ [
+ "1: HTML -> CSS Mapping for borders is applied correctly on table markup (table left width)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i++)+") table")).borderLeftWidth,
+ "0px"
+ ],
+ [
+ "1: HTML -> CSS Mapping for borders is applied correctly on table markup (table left style)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftStyle,
+ "hidden"
+ ],
+ [
+ "1: HTML -> CSS Mapping for borders is applied correctly on table markup (table left color)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftColor,
+ "rgb(128, 128, 128)"
+ ],
+ /*========================================*/
+ [
+ "2: HTML -> CSS Mapping for borders is applied correctly on table markup (table left width)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i++)+") table")).borderLeftWidth,
+ "1px"
+ ],
+ [
+ "2: HTML -> CSS Mapping for borders is applied correctly on table markup (table left style)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftStyle,
+ "outset"
+ ],
+ [
+ "2: HTML -> CSS Mapping for borders is applied correctly on table markup (table left color)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftColor,
+ "rgb(0, 0, 0)"
+ ],
+ /*========================================*/
+ [
+ "3a: HTML -> CSS Mapping for borders is applied correctly on table markup (table left width)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i++)+") table")).borderLeftWidth,
+ "10px"
+ ],
+ [
+ "3a: HTML -> CSS Mapping for borders is applied correctly on table markup (table left style)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftStyle,
+ "outset"
+ ],
+ [
+ "3a: HTML -> CSS Mapping for borders is applied correctly on table markup (table left color)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftColor,
+ "rgb(128, 128, 128)"
+ ],
+ [
+ "3b: HTML -> CSS Mapping for borders is applied correctly on table markup (td top width)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderTopWidth,
+ "1px"
+ ],
+ [
+ "3b: HTML -> CSS Mapping for borders is applied correctly on table markup (td top style)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderTopStyle,
+ "inset"
+ ],
+ [
+ "3b: HTML -> CSS Mapping for borders is applied correctly on table markup (td top color)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderTopColor,
+ "rgb(128, 128, 128)"
+ ],
+ [
+ "3c: HTML -> CSS Mapping for borders is applied correctly on table markup (td left width)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftWidth,
+ "1px"
+ ],
+ [
+ "3c: HTML -> CSS Mapping for borders is applied correctly on table markup (td left style)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftStyle,
+ "inset"
+ ],
+ [
+ "3c: HTML -> CSS Mapping for borders is applied correctly on table markup (td left color)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftColor,
+ "rgb(128, 128, 128)"
+ ],
+ /*========================================*/
+ [
+ "4: HTML -> CSS Mapping for borders is applied correctly on table markup (table left width)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i++)+") table")).borderLeftWidth,
+ "1px"
+ ],
+ [
+ "4: HTML -> CSS Mapping for borders is applied correctly on table markup (table left style)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftStyle,
+ "outset"
+ ],
+ [
+ "4: HTML -> CSS Mapping for borders is applied correctly on table markup (table left color)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftColor,
+ "rgb(128, 128, 128)"
+ ],
+ [
+ "4: HTML -> CSS Mapping for borders is applied correctly on table markup (td left width)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftWidth,
+ "1px"
+ ],
+ [
+ "4: HTML -> CSS Mapping for borders is applied correctly on table markup (td left style)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftStyle,
+ "solid"
+ ],
+ [
+ "4: HTML -> CSS Mapping for borders is applied correctly on table markup (td left color)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftColor,
+ "rgb(128, 128, 128)"
+ ],
+ /*========================================*/
+ [
+ "5a: HTML -> CSS Mapping for borders is applied correctly on table markup (table left style)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i++)+") table")).borderLeftStyle,
+ "hidden"
+ ],
+ [
+ "5b: HTML -> CSS Mapping for borders is applied correctly on table markup (table right width)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderRightWidth,
+ "10px"
+ ],
+ [
+ "5b: HTML -> CSS Mapping for borders is applied correctly on table markup (table right style)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderRightStyle,
+ "solid"
+ ],
+ [
+ "5b: HTML -> CSS Mapping for borders is applied correctly on table markup (table right color)",
+ getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderRightColor,
+ "rgb(128, 128, 128)"
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-1.html b/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-1.html
new file mode 100644
index 00000000000..f0c96dd707c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-1.html
@@ -0,0 +1,98 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#table-layout-algorithm">
+<main>
+
+ <h1>HTML5 Table Formatting algorithm (row/column grid computation)</h1>
+ <p>Verifies how browser define and act on empty tables</p>
+
+ <hr/>
+ <p>This should be a 50px by 50px blue square:</p>
+ <p>The table grid is 0x0, so the table is empty and follows step 3B of the table layout algorithm</p>
+ <x-table style="min-width: 50px; height: 50px; background: blue;"></x-table>
+
+ <hr/>
+ <p>This should be a 50px by 50px blue square:</p>
+ <p>The table grid is 2x0, so the table is empty and follows step 3B of the table layout algorithm</p>
+ <x-table style="min-width: 50px; height: 50px; background: blue;">
+ <x-col style="width: 100px"></x-col>
+ <x-col style="width: 100px"></x-col>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 50px by 50px blue square:</p>
+ <p>The table grid is 0x1, so the table is empty and follows step 3B of the table layout algorithm</p>
+ <x-table style="min-width: 50px; height: 50px; background: blue;">
+ <x-tr style="height: 100px; background: orange;"></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 200px by 100px blue rectangle:</p>
+ <p>The table grid is 2x1, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <x-table style="min-width: 50px; height: 50px; background: blue;">
+ <x-col style="width: 100px"></x-col>
+ <x-col style="width: 100px"></x-col>
+ <x-tr style="height: 100px; background: orange;"></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 200px by 100px half-blue half-orange rectangle:</p>
+ <p>The table grid is 2x1, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <x-table style="min-width: 50px; height: 50px; background: blue;">
+ <x-col style="width: 100px"></x-col>
+ <x-col style="width: 100px"></x-col>
+ <x-tr style="height: 100px; background: orange;"><x-td></x-td></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 200px by 100px orange rectangle:</p>
+ <p>The table grid is 2x1, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <x-table style="min-width: 50px; height: 50px; background: blue;">
+ <x-col style="width: 100px"></x-col>
+ <x-col style="width: 100px"></x-col>
+ <x-tr style="height: 100px; background: orange;"><x-td></x-td><x-td></x-td></x-tr>
+ </x-table>
+
+</main>
+
+<script>
+
+ generate_tests(assert_equals, [
+ [
+ "Empty tables can still get a lsyout",
+ document.querySelector("x-table:nth-of-type(1)").offsetWidth,
+ 50
+ ],
+ [
+ "Empty tables do not take table-columns into account",
+ document.querySelector("x-table:nth-of-type(2)").offsetWidth,
+ 50
+ ],
+ [
+ "Empty tables do not take table-rows into account",
+ document.querySelector("x-table:nth-of-type(3)").offsetHeight,
+ 50
+ ],
+ ])
+
+ generate_tests(assert_equals, [
+ [
+ "Table-columns are taken into account after missing cells are generated (empty line)",
+ document.querySelector("x-table:nth-of-type(4)").offsetWidth,
+ 200
+ ],
+ [
+ "Table-columns are taken into account after missing cells are generated (partially empty line)",
+ document.querySelector("x-table:nth-of-type(5)").offsetWidth,
+ 200
+ ],
+ [
+ "Table-columns are taken into account after missing cells are generated (non-empty line)",
+ document.querySelector("x-table:nth-of-type(6)").offsetWidth,
+ 200
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-2.html b/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-2.html
new file mode 100644
index 00000000000..4292c4c76fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-2.html
@@ -0,0 +1,150 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#missing-cells-fixup">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#dimensioning-the-row-column-grid">
+<main>
+
+ <h1>HTML5 Table Formatting algorithm (row/column grid computation)</h1>
+ <p>Verifies how browsers deal with explicit tracks from which no cell does originate</p>
+
+ <hr/>
+ <p>This should be a 100px by 100px blue square:</p>
+ <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
+ <x-table style="background: blue;">
+ <x-col style="width: 50px"></x-col>
+ <x-col style="width: 50px"></x-col>
+ <x-tr style="height: 50px"></x-tr>
+ <x-tr style="height: 50px"></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 175px by 175px blue square:</p>
+ <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
+ <p>Three 25px border-spacing causes the addition of 75px</p>
+ <x-table style="background: blue; border-spacing: 25px">
+ <x-col style="width: 50px"></x-col>
+ <x-col style="width: 50px"></x-col>
+ <x-tr style="height: 50px"></x-tr>
+ <x-tr style="height: 50px"></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 175px by 175px blue square:</p>
+ <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
+ <p>Three 25px border-spacing causes the addition of 75px</p>
+ <x-table style="background: blue; border-spacing: 25px">
+ <x-col style="width: 50px"></x-col>
+ <x-col style="width: 50px"></x-col>
+ <x-tr style="height: 50px"><x-td></x-td><x-td></x-td></x-tr>
+ <x-tr style="height: 50px"></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 175px by 175px blue square:</p>
+ <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
+ <p>Three 25px border-spacing causes the addition of 75px</p>
+ <x-table style="background: blue; border-spacing: 25px">
+ <x-col style="width: 50px"></x-col>
+ <x-col style="width: 50px"></x-col>
+ <x-tr style="height: 50px"></x-tr>
+ <x-tr style="height: 50px"><x-td></x-td><x-td></x-td></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 175px by 175px blue square:</p>
+ <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
+ <p>Three 25px border-spacing causes the addition of 75px</p>
+ <x-table style="background: blue; border-spacing: 25px">
+ <x-col style="width: 50px"></x-col>
+ <x-col style="width: 50px"></x-col>
+ <x-tr style="height: 50px"><x-td></x-td><x-td></x-td></x-tr>
+ <x-tr style="height: 50px"><x-td></x-td><x-td></x-td></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 175px by 175px blue square:</p>
+ <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
+ <p>Three 25px border-spacing causes the addition of 75px</p>
+ <x-table style="background: blue; border-spacing: 25px">
+ <x-col style="width: 50px"></x-col>
+ <x-col style="width: 50px"></x-col>
+ <x-tr style="height: 50px"><x-td></x-td></x-tr>
+ <x-tr style="height: 50px"><x-td></x-td></x-tr>
+ </x-table>
+
+</main>
+
+<script>
+
+ generate_tests(assert_equals, [
+ [
+ "Explicitely defined columns are not merged",
+ document.querySelector("x-table:nth-of-type(1)").offsetWidth,
+ 100
+ ],
+ [
+ "Explicitely defined rows are not merged",
+ document.querySelector("x-table:nth-of-type(1)").offsetHeight,
+ 100
+ ],
+ [
+ "Border-spacing is added between any two unmerged columns (1)",
+ document.querySelector("x-table:nth-of-type(2)").offsetWidth,
+ 175
+ ],
+ [
+ "Border-spacing is added between any two unmerged rows (1)",
+ document.querySelector("x-table:nth-of-type(2)").offsetHeight,
+ 175
+ ],
+ [
+ "Border-spacing is added between any two unmerged columns (2)",
+ document.querySelector("x-table:nth-of-type(3)").offsetWidth,
+ 175
+ ],
+ [
+ "Border-spacing is added between any two unmerged rows (2)",
+ document.querySelector("x-table:nth-of-type(3)").offsetHeight,
+ 175
+ ],
+ [
+ "Border-spacing is added between any two unmerged columns (3)",
+ document.querySelector("x-table:nth-of-type(4)").offsetWidth,
+ 175
+ ],
+ [
+ "Border-spacing is added between any two unmerged rows (3)",
+ document.querySelector("x-table:nth-of-type(4)").offsetHeight,
+ 175
+ ],
+ [
+ "Border-spacing is added between any two unmerged columns (4)",
+ document.querySelector("x-table:nth-of-type(5)").offsetWidth,
+ 175
+ ],
+ [
+ "Border-spacing is added between any two unmerged rows (4)",
+ document.querySelector("x-table:nth-of-type(5)").offsetHeight,
+ 175
+ ],
+ [
+ "Border-spacing is added between any two unmerged columns (5)",
+ document.querySelector("x-table:nth-of-type(6)").offsetWidth,
+ 175
+ ],
+ [
+ "Border-spacing is added between any two unmerged rows (5)",
+ document.querySelector("x-table:nth-of-type(6)").offsetHeight,
+ 175
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-3.html b/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-3.html
new file mode 100644
index 00000000000..a12e1df5d84
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-3.html
@@ -0,0 +1,106 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#missing-cells-fixup">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#dimensioning-the-row-column-grid">
+<main>
+
+ <h1>HTML5 Table Formatting algorithm (row/column grid computation)</h1>
+ <p>Verifies how browsers deal with implicit tracks from which no cell does originate</p>
+
+ <hr/>
+ <p>This should be a 100px by 100px blue square:</p>
+ <p>The table grid is 1x1, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <p>The consecutive tracks were merged together because they are not all defined explicitely by a table-column or a table-row, and share the same set of cells</p>
+ <p>Two 25px border-spacing causes the addition of 50px (track is 50x50)</p>
+ <x-table style="background: blue; border-spacing: 25px">
+ <x-tr><x-td style="padding: 25px"></x-td></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 100px by 100px blue square:</p>
+ <p>The table grid is 1x1, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <p>The consecutive tracks were merged together because they are not all defined explicitely by a table-column or a table-row, and share the same set of cells</p>
+ <p>Two 25px border-spacing causes the addition of 50px (track is 50x50)</p>
+ <x-table style="background: blue; border-spacing: 25px">
+ <x-tr><x-td style="padding: 25px" rowspan=2 colspan=2></x-td></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 75px by 75px blue square:</p>
+ <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <p>The consecutive tracks were not merged together because they are all defined explicitely by a table-column or a table-row</p>
+ <p>Three 25px border-spacing causes the addition of 75px (tracks are 0x0)</p>
+ <x-table style="background: blue; border-spacing: 25px">
+ <x-col></x-col>
+ <x-col></x-col>
+ <x-tr><x-td style="padding: 0px" rowspan=2 colspan=2></x-td></x-tr>
+ <x-tr></x-tr>
+ </x-table>
+
+ <hr/>
+ <p>This should be a 100px by 100px blue square:</p>
+ <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
+ <p>The consecutive tracks were not merged together because they are all defined explicitely by a table-column or a table-row</p>
+ <p>Three 25px border-spacing causes the addition of 75px (tracks are 12.5x12.5)</p>
+ <x-table style="background: blue; border-spacing: 25px">
+ <x-col></x-col>
+ <x-col></x-col>
+ <x-tr><x-td style="padding: 25px" rowspan=2 colspan=2></x-td></x-tr>
+ <x-tr></x-tr>
+ </x-table>
+
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ generate_tests(assert_equals, [
+ [
+ "Control test for table-cell padding and border-spacing, etc (width)",
+ document.querySelector("x-table:nth-of-type(1)").offsetWidth,
+ 100
+ ],
+ [
+ "Control test for table-cell padding and border-spacing (height)",
+ document.querySelector("x-table:nth-of-type(1)").offsetHeight,
+ 100
+ ],
+ [
+ "Anonymous consecutive columns spanned by the same set of cells are merged",
+ document.querySelector("x-table:nth-of-type(2)").offsetWidth,
+ 100
+ ],
+ [
+ "Anonymous consecutive rows spanned by the same set of cells are merged",
+ document.querySelector("x-table:nth-of-type(2)").offsetHeight,
+ 100
+ ],
+ [
+ "Explicitely-defined consecutive columns spanned by the same set of cells are not merged",
+ document.querySelector("x-table:nth-of-type(3)").offsetWidth,
+ 75
+ ],
+ [
+ "Explicitely-defined consecutive rows spanned by the same set of cells are not merged",
+ document.querySelector("x-table:nth-of-type(3)").offsetHeight,
+ 75
+ ],
+ [
+ "Explicitely-defined consecutive columns spanned by the same set of cells are not merged, and cells span across border-spacing",
+ document.querySelector("x-table:nth-of-type(4) x-col").getBoundingClientRect().width,
+ 12.5
+ ],
+ [
+ "Explicitely-defined consecutive rows spanned by the same set of cells are not merged, and cells span across border-spacing",
+ document.querySelector("x-table:nth-of-type(4) x-tr").getBoundingClientRect().height,
+ 12.5
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-fixed-layout-1.html b/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-fixed-layout-1.html
new file mode 100644
index 00000000000..d4f0986fcd8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/html5-table-formatting-fixed-layout-1.html
@@ -0,0 +1,44 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#dimensioning-the-row-column-grid">
+<main>
+
+ <h1>HTML5 Table Formatting algorithm and Fixed Layout (row/column grid computation)</h1>
+ <p>Verifies how browsers deal with implicit tracks from which no cell does originate in fixed mode</p>
+
+ <hr/>
+ <p>This should be a 100px by 50px blue rectangle:</p>
+ <p>The table grid is 1x3, so the table is not empty and follows step 3A of the table layout algorithm</p>
+ <p>The consecutive columns were merged not together because the table-layout is fixed, but consecutive rows were.</p>
+ <p>Each track has a 0px breadth; the table width (respect. height) comes from 4x (respect. 2x) 25px-wide border spacings</p>
+ <x-table style="table-layout: fixed; width: 0; background: blue; border-spacing: 25px">
+ <x-tr><x-td width="0" height="0" colspan="3" rowspan="3" style="padding: 0"></x-td></x-tr>
+ </x-table>
+
+ <hr/>
+
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ generate_tests(assert_equals, [
+ [
+ "Redundant columns of fixed-layout tables are not being merged",
+ document.querySelector("x-table:nth-of-type(1)").offsetWidth,
+ 100
+ ],
+ [
+ "Redundant rows of fixed-layout tables are not being merged",
+ document.querySelector("x-table:nth-of-type(1)").offsetHeight,
+ 50
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/support/base.css b/tests/wpt/web-platform-tests/css/css-tables-3/support/base.css
new file mode 100644
index 00000000000..52be1bb4e52
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/support/base.css
@@ -0,0 +1,21 @@
+/* custom table tags */
+
+ x-table { display: table; }
+ x-colgroup { display: table-column-group; }
+ x-col { display: table-column; }
+ x-tbody { display: table-row-group; }
+ x-thead { display: table-header-group; }
+ x-tfoot { display: table-footer-group; }
+ x-tr { display: table-row; }
+ x-td { display: table-cell; }
+ x-caption { display: table-caption; }
+
+/* layout of the page */
+
+ hr + p { font-weight: bold; margin-bottom: 0; }
+ p + p { margin-top: 0; }
+
+ html, body { padding: 0; margin: 0; }
+ main, #log { padding: 10px; width: 50%; box-sizing: border-box; }
+ main { float: left; }
+ #log { float: right; background: #eee; } \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/support/check-layout-th.js b/tests/wpt/web-platform-tests/css/css-tables-3/support/check-layout-th.js
new file mode 100644
index 00000000000..07f7d5ded82
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/support/check-layout-th.js
@@ -0,0 +1,190 @@
+(function() {
+// Test is initiated from body.onload, so explicit done() call is required.
+setup({ explicit_done: true });
+
+function checkSubtreeExpectedValues(t, parent, prefix)
+{
+ var checkedLayout = checkExpectedValues(t, parent, prefix);
+ Array.prototype.forEach.call(parent.childNodes, function(node) {
+ checkedLayout |= checkSubtreeExpectedValues(t, node, prefix);
+ });
+ return checkedLayout;
+}
+
+function checkAttribute(output, node, attribute)
+{
+ var result = node.getAttribute && node.getAttribute(attribute);
+ output.checked |= !!result;
+ return result;
+}
+
+function assert_tolerance(actual, expected, message)
+{
+ if (isNaN(expected) || Math.abs(actual - expected) >= 1) {
+ assert_equals(actual, Number(expected), message);
+ }
+}
+
+function checkExpectedValues(t, node, prefix)
+{
+ var output = { checked: false };
+
+ var expectedWidth = checkAttribute(output, node, "data-expected-width");
+ if (expectedWidth) {
+ assert_tolerance(node.offsetWidth, expectedWidth, prefix + "width");
+ }
+
+ var expectedHeight = checkAttribute(output, node, "data-expected-height");
+ if (expectedHeight) {
+ assert_tolerance(node.offsetHeight, expectedHeight, prefix + "height");
+ }
+
+ var expectedOffset = checkAttribute(output, node, "data-offset-x");
+ if (expectedOffset) {
+ assert_tolerance(node.offsetLeft, expectedOffset, prefix + "offsetLeft");
+ }
+
+ var expectedOffset = checkAttribute(output, node, "data-offset-y");
+ if (expectedOffset) {
+ assert_tolerance(node.offsetTop, expectedOffset, prefix + "offsetTop");
+ }
+
+ var expectedWidth = checkAttribute(output, node, "data-expected-client-width");
+ if (expectedWidth) {
+ assert_tolerance(node.clientWidth, expectedWidth, prefix + "clientWidth");
+ }
+
+ var expectedHeight = checkAttribute(output, node, "data-expected-client-height");
+ if (expectedHeight) {
+ assert_tolerance(node.clientHeight, expectedHeight, prefix + "clientHeight");
+ }
+
+ var expectedWidth = checkAttribute(output, node, "data-expected-scroll-width");
+ if (expectedWidth) {
+ assert_tolerance(node.scrollWidth, expectedWidth, prefix + "scrollWidth");
+ }
+
+ var expectedHeight = checkAttribute(output, node, "data-expected-scroll-height");
+ if (expectedHeight) {
+ assert_tolerance(node.scrollHeight, expectedHeight, prefix + "scrollHeight");
+ }
+
+ var expectedOffset = checkAttribute(output, node, "data-total-x");
+ if (expectedOffset) {
+ var totalLeft = node.clientLeft + node.offsetLeft;
+ assert_tolerance(totalLeft, expectedOffset, prefix +
+ "clientLeft+offsetLeft (" + node.clientLeft + " + " + node.offsetLeft + ")");
+ }
+
+ var expectedOffset = checkAttribute(output, node, "data-total-y");
+ if (expectedOffset) {
+ var totalTop = node.clientTop + node.offsetTop;
+ assert_tolerance(totalTop, expectedOffset, prefix +
+ "clientTop+offsetTop (" + node.clientTop + " + " + node.offsetTop + ")");
+ }
+
+ var expectedDisplay = checkAttribute(output, node, "data-expected-display");
+ if (expectedDisplay) {
+ var actualDisplay = getComputedStyle(node).display;
+ assert_equals(actualDisplay, expectedDisplay, prefix + "display");
+ }
+
+ var expectedPaddingTop = checkAttribute(output, node, "data-expected-padding-top");
+ if (expectedPaddingTop) {
+ var actualPaddingTop = getComputedStyle(node).paddingTop;
+ // Trim the unit "px" from the output.
+ actualPaddingTop = actualPaddingTop.slice(0, -2);
+ assert_equals(actualPaddingTop, expectedPaddingTop, prefix + "padding-top");
+ }
+
+ var expectedPaddingBottom = checkAttribute(output, node, "data-expected-padding-bottom");
+ if (expectedPaddingBottom) {
+ var actualPaddingBottom = getComputedStyle(node).paddingBottom;
+ // Trim the unit "px" from the output.
+ actualPaddingBottom = actualPaddingBottom.slice(0, -2);
+ assert_equals(actualPaddingBottom, expectedPaddingBottom, prefix + "padding-bottom");
+ }
+
+ var expectedPaddingLeft = checkAttribute(output, node, "data-expected-padding-left");
+ if (expectedPaddingLeft) {
+ var actualPaddingLeft = getComputedStyle(node).paddingLeft;
+ // Trim the unit "px" from the output.
+ actualPaddingLeft = actualPaddingLeft.slice(0, -2);
+ assert_equals(actualPaddingLeft, expectedPaddingLeft, prefix + "padding-left");
+ }
+
+ var expectedPaddingRight = checkAttribute(output, node, "data-expected-padding-right");
+ if (expectedPaddingRight) {
+ var actualPaddingRight = getComputedStyle(node).paddingRight;
+ // Trim the unit "px" from the output.
+ actualPaddingRight = actualPaddingRight.slice(0, -2);
+ assert_equals(actualPaddingRight, expectedPaddingRight, prefix + "padding-right");
+ }
+
+ var expectedMarginTop = checkAttribute(output, node, "data-expected-margin-top");
+ if (expectedMarginTop) {
+ var actualMarginTop = getComputedStyle(node).marginTop;
+ // Trim the unit "px" from the output.
+ actualMarginTop = actualMarginTop.slice(0, -2);
+ assert_equals(actualMarginTop, expectedMarginTop, prefix + "margin-top");
+ }
+
+ var expectedMarginBottom = checkAttribute(output, node, "data-expected-margin-bottom");
+ if (expectedMarginBottom) {
+ var actualMarginBottom = getComputedStyle(node).marginBottom;
+ // Trim the unit "px" from the output.
+ actualMarginBottom = actualMarginBottom.slice(0, -2);
+ assert_equals(actualMarginBottom, expectedMarginBottom, prefix + "margin-bottom");
+ }
+
+ var expectedMarginLeft = checkAttribute(output, node, "data-expected-margin-left");
+ if (expectedMarginLeft) {
+ var actualMarginLeft = getComputedStyle(node).marginLeft;
+ // Trim the unit "px" from the output.
+ actualMarginLeft = actualMarginLeft.slice(0, -2);
+ assert_equals(actualMarginLeft, expectedMarginLeft, prefix + "margin-left");
+ }
+
+ var expectedMarginRight = checkAttribute(output, node, "data-expected-margin-right");
+ if (expectedMarginRight) {
+ var actualMarginRight = getComputedStyle(node).marginRight;
+ // Trim the unit "px" from the output.
+ actualMarginRight = actualMarginRight.slice(0, -2);
+ assert_equals(actualMarginRight, expectedMarginRight, prefix + "margin-right");
+ }
+
+ return output.checked;
+}
+
+window.checkLayout = function(selectorList, outputContainer)
+{
+ if (!selectorList) {
+ console.error("You must provide a CSS selector of nodes to check.");
+ return;
+ }
+ var nodes = document.querySelectorAll(selectorList);
+ var testNumber = 0;
+ nodes = Array.prototype.slice.call(nodes);
+ nodes.reverse();
+ var checkedLayout = false;
+ Array.prototype.forEach.call(nodes, function(node) {
+ test(function(t) {
+ var container = node.parentNode.className == 'container' ? node.parentNode : node;
+ var prefix = "\n" + container.outerHTML + "\n";
+ var passed = false;
+ try {
+ checkedLayout |= checkExpectedValues(t, node.parentNode, prefix);
+ checkedLayout |= checkSubtreeExpectedValues(t, node, prefix);
+ passed = true;
+ } finally {
+ checkedLayout |= !passed;
+ }
+ }, selectorList + ' ' + String(++testNumber));
+ });
+ if (!checkedLayout) {
+ console.error("No valid data-* attributes found in selector list : " + selectorList);
+ }
+ done();
+};
+
+})();
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/table-model-fixup-2.html b/tests/wpt/web-platform-tests/css/css-tables-3/table-model-fixup-2.html
new file mode 100644
index 00000000000..543645135ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/table-model-fixup-2.html
@@ -0,0 +1,464 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#table-structure">
+<style>
+ [inline] { display: inline !important; }
+ [block] { display: block !important; }
+ [inline-table] { display: inline-table !important; }
+ [table] { display: table !important; }
+ [table-row] { display: table-row !important; }
+ [table-cell] { display: table-cell !important; }
+ [table-column] { display: table-column !important; }
+ [table-row-group] { display: table-row-group !important; }
+ [table-header-group] { display: table-header-group !important; }
+ [table-footer-group] { display: table-footer-group !important; }
+ [table-column-group] { display: table-column-group !important; }
+ div > x-table { background: yellow; border-spacing: 10px }
+ div input { width: 100px; }
+</style>
+<script>
+ function assertEqualOffsetWidths(a,b) {
+ var desc = document.querySelector('main > hr:last-of-type + p + p') || document.querySelectorAll('main > hr + p + p')[document.querySelectorAll('main > hr + p + p').length-1];
+ var root = document.querySelector('main > div:last-of-type') || document.querySelectorAll('main > div')[document.querySelectorAll('main > div').length-1];
+ generate_tests(assert_equals, [
+ [
+ desc.textContent,
+ root.querySelector("[target="+a+"]").offsetWidth,
+ root.querySelector("[target="+b+"]").offsetWidth
+ ]
+ ]);
+ }
+ function assertEqualOffsetTops(a,b) {
+ var desc = document.querySelector('main > hr:last-of-type + p + p') || document.querySelectorAll('main > hr + p + p')[document.querySelectorAll('main > hr + p + p').length-1];
+ var root = document.querySelector('main > div:last-of-type') || document.querySelectorAll('main > div')[document.querySelectorAll('main > div').length-1];
+ generate_tests(assert_equals, [
+ [
+ desc.textContent,
+ root.querySelector("[target="+a+"]").getBoundingClientRect().top|0,
+ root.querySelector("[target="+b+"]").getBoundingClientRect().top|0
+ ]
+ ]);
+ }
+ function assertUnequalOffsetTops(a,b) {
+ var desc = document.querySelector('main > hr:last-of-type + p + p') || document.querySelectorAll('main > hr + p + p')[document.querySelectorAll('main > hr + p + p').length-1];
+ var root = document.querySelector('main > div:last-of-type') || document.querySelectorAll('main > div')[document.querySelectorAll('main > div').length-1];
+ generate_tests(assert_not_equals, [
+ [
+ desc.textContent,
+ root.querySelector("[target="+a+"]").getBoundingClientRect().top|0,
+ root.querySelector("[target="+b+"]").getBoundingClientRect().top|0
+ ]
+ ]);
+ }
+</script>
+
+<main>
+
+ <h1>Table fixup</h1>
+ <p>Check that replaced elements display types are handled properly in fixup</p>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both input fields should look identical, on their own line:</p>
+ <p>Replaced elements inside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- input elements</p>
+ <div>
+ <x-table style="width: 400px">
+ <x-tr><x-td><input block target=a /></x-tr>
+ <input table-row target=b />
+ </x-table>
+ </div>
+ <script>
+
+ assertEqualOffsetWidths('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both images should look identical, on their own line:</p>
+ <p>Replaced elements inside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- img elements</p>
+ <div>
+ <x-table style="width: 400px">
+ <x-tr><x-td><img block src="http://w3.org/favicon.ico" target=a /></x-tr>
+ <img src="http://w3.org/favicon.ico" table-row target=b />
+ </x-table>
+ </div>
+ <script>
+
+ assertEqualOffsetWidths('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both input fields should look identical, on their own line:</p>
+ <p>Replaced elements inside a table cannot be <mark>table-column</mark> and are considered <mark>inline</mark> -- input elements</p>
+ <div>
+ <x-table style="width: 400px">
+ <x-tr><x-td><input inline target=a /></x-tr>
+ <input table-column target=b />
+ </x-table>
+ </div>
+ <script>
+
+ assertEqualOffsetWidths('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both images should look identical, on their own line:</p>
+ <p>Replaced elements inside a table cannot be <mark>table-column</mark> and are considered <mark>inline</mark> -- img elements</p>
+ <div>
+ <x-table style="width: 400px">
+ <x-tr><x-td><img inline src="http://w3.org/favicon.ico" target=a /></x-tr>
+ <img src="http://w3.org/favicon.ico" table-column target=b />
+ </x-table>
+ </div>
+ <script>
+
+ assertEqualOffsetWidths('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both input fields should look identical, on their own line:</p>
+ <p>Replaced elements inside a table cannot be <mark>table-cell</mark> and are considered <mark>inline</mark> -- input elements</p>
+ <div>
+ <x-table style="width: 400px">
+ <x-tr><x-td><input inline target=a /></x-tr>
+ <x-tr><input table-cell target=b /></x-tr>
+ </x-table>
+ </div>
+ <script>
+
+ assertEqualOffsetWidths('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both images should look identical, on their own line:</p>
+ <p>Replaced elements inside a table cannot be <mark>table-cell</mark> and are considered <mark>inline</mark> -- img elements</p>
+ <div>
+ <x-table style="width: 400px">
+ <x-tr><x-td><img inline src="http://w3.org/favicon.ico" target=a /></x-tr>
+ <x-tr><img src="http://w3.org/favicon.ico" table-cell target=b /></x-tr>
+ </x-table>
+ </div>
+ <script>
+
+ assertEqualOffsetWidths('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both text inputs should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>inline-table</mark> and are <mark>considered</mark> inline -- input=text elements</p>
+ <div>
+ <input inline-table target=a />
+ <input inline-table target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both button inputs should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>inline-table</mark> and are considered <mark>inline</mark> -- input=button elements</p>
+ <div>
+ <input type=button inline-table target=a />
+ <input type=button inline-table target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both file inputs should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>inline-table</mark> and are considered <mark>inline</mark> -- input=file elements</p>
+ <div>
+ <input type=file inline-table target=a />
+ <input type=file inline-table target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both images should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>inline-table</mark> and are considered <mark>inline</mark> -- img elements</p>
+ <div>
+ <img src="http://w3.org/favicon.ico" inline-table target=a />
+ <img src="http://w3.org/favicon.ico" inline-table target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both text inputs should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table</mark> and are considered <mark>block</mark> -- input=text elements</p>
+ <div>
+ <input type=text table target=a />
+ <input type=text table target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both button inputs should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table</mark> and are considered <mark>block</mark> -- input=button elements</p>
+ <div>
+ <input type=button table target=a />
+ <input type=button table target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both file inputs should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table</mark> and are considered <mark>block</mark> -- input=file elements</p>
+ <div>
+ <input type=file table target=a />
+ <input type=file table target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both images should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table</mark> and are considered <mark>block</mark> -- img elements</p>
+ <div>
+ <img src="http://w3.org/favicon.ico" table target=a />
+ <img src="http://w3.org/favicon.ico" table target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both text inputs should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- input=text elements</p>
+ <div>
+ <input type=text table-row target=a />
+ <input type=text table-row target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both button inputs should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- input=button elements</p>
+ <div>
+ <input type=button table-row target=a />
+ <input type=button table-row target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both file inputs should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- input=file elements</p>
+ <div>
+ <input type=file table-row target=a />
+ <input type=file table-row target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both images should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- img elements</p>
+ <div>
+ <img src="http://w3.org/favicon.ico" table-row target=a />
+ <img src="http://w3.org/favicon.ico" table-row target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both text inputs should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-row-group</mark> and are considered <mark>block</mark> -- input=text elements</p>
+ <div>
+ <input type=text table-row-group target=a />
+ <input type=text table-row-group target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both button inputs should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-row-group</mark> and are considered <mark>block</mark> -- input=button elements</p>
+ <div>
+ <input type=button table-row-group target=a />
+ <input type=button table-row-group target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both file inputs should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-row-group</mark> and are considered <mark>block</mark> -- input=file elements</p>
+ <div>
+ <input type=file table-row-group target=a />
+ <input type=file table-row-group target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both images should stand on their own line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-row-group</mark> and are considered <mark>block</mark> -- img elements</p>
+ <div>
+ <img src="http://w3.org/favicon.ico" table-row-group target=a />
+ <img src="http://w3.org/favicon.ico" table-row-group target=b />
+ </div>
+ <script>
+
+ assertUnequalOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both text inputs should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-column</mark> and are <mark>considered</mark> inline -- input=text elements</p>
+ <div>
+ <input table-column target=a />
+ <input table-column target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both button inputs should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-column</mark> and are considered <mark>inline</mark> -- input=button elements</p>
+ <div>
+ <input type=button table-column target=a />
+ <input type=button table-column target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both file inputs should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-column</mark> and are considered <mark>inline</mark> -- input=file elements</p>
+ <div>
+ <input type=file table-column target=a />
+ <input type=file table-column target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both images should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-column</mark> and are considered <mark>inline</mark> -- img elements</p>
+ <div>
+ <img src="http://w3.org/favicon.ico" table-column target=a />
+ <img src="http://w3.org/favicon.ico" table-column target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both text inputs should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-cell</mark> and are <mark>considered</mark> inline -- input=text elements</p>
+ <div>
+ <input table-cell target=a />
+ <input table-cell target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both button inputs should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-cell</mark> and are considered <mark>inline</mark> -- input=button elements</p>
+ <div>
+ <input type=button table-cell target=a />
+ <input type=button table-cell target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both file inputs should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-cell</mark> and are considered <mark>inline</mark> -- input=file elements</p>
+ <div>
+ <input type=file table-cell target=a />
+ <input type=file table-cell target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+ <hr/><!------------------------------------------------------------------------------------------------------------>
+ <p>Both images should share the same line:</p>
+ <p>Replaced elements outside a table cannot be <mark>table-cell</mark> and are considered <mark>inline</mark> -- img elements</p>
+ <div>
+ <img src="http://w3.org/favicon.ico" table-cell target=a />
+ <img src="http://w3.org/favicon.ico" table-cell target=b />
+ </div>
+ <script>
+
+ assertEqualOffsetTops('a','b');
+
+ </script>
+
+</main>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/table-model-fixup.html b/tests/wpt/web-platform-tests/css/css-tables-3/table-model-fixup.html
new file mode 100644
index 00000000000..13af8b9db4e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/table-model-fixup.html
@@ -0,0 +1,125 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='./support/base.css' />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#fixup">
+<main>
+
+ <h1>Table fixup</h1>
+ <p>Check that missing elements are being created properly</p>
+
+ <hr/>
+ <p>This should be a 100px by 100px blue square:</p>
+ <p>1.1. Children of a table-column are treated as if they had display: none.</p>
+ <div style="width: 100px; height: 100px; background: blue;"><x-col><div id="target1" style="display: block!important; visibility: visible!important; width: 100px; height: 100px; background: red;"></div></x-col></div>
+
+ <hr/>
+ <p>This should be a 100px by 100px blue square:</p>
+ <p>1.2. Children of a table-column-group which are not a table-column are treated as if they had display: none.</p>
+ <div style="width: 100px; height: 100px; background: blue;"><x-colgroup><div id="target2" style="display: block!important; visibility: visible!important; width: 100px; height: 100px; background: red;"></div></x-colgroup></div>
+
+ <hr/>
+ <p>This should be a 100px by 100px blue square:</p>
+ <p>2.1. An anonymous table-row box must be generated around each sequence of consecutive children of a table-root box which are not proper table child boxes. </p>
+ <x-table><x-td id="target3" style="width: 50%; height: 0px; background: blue;"></x-td> <x-td style="width: 50px; height: 100px; background: blue;"></x-td></x-table>
+
+ <hr/>
+ <p>This should read as "1\t2\t3\n&nbsp;&nbsp;&nbsp;x":</p>
+ <p>2.2. An anonymous table-row box must be generated around each sequence of consecutive children of a table-row-grouping box which are not table-row boxes.</p>
+ <x-table><x-tbody>
+ <span id="target4a">1</span>
+ <x-col style="width: 100px"></x-col>
+ <x-td id="target4b">2</x-td>
+ <span id="target4c">3</span>
+ <x-caption id="target4d">x</x-caption>
+ </x-tbody><x-col style="width: 50px"></x-col><x-col style="width: 50px"></x-col><x-col style="width: 50px"></x-col></x-table>
+
+ <hr/>
+ <p>This should read as "1\n1\t2":</p>
+ <p>2.1. and 2.2. happens before 2.3.</p>
+ <x-table>
+ <span id="target5a">1</span>
+ <x-col style="width: 50px"></x-col>
+ <x-td id="target5b">1</x-td>
+ <span id="target5c">2</span>
+ </x-table>
+
+ <hr/>
+ <p>This should read as "1\t2":</p>
+ <p>3.2. An anonymous table or inline-table box must be generated around each sequence of consecutive proper table child box which are misparented</p>
+ <table><tr><td id="target6a">1</td><td style="display: table-caption" id="target6b">2</td></tr><col style="width: 50px"></x-col></table>
+
+ <hr/>
+ <p>This should read as "A B":</p>
+ <p>1.4. Anonymous inline boxes which contains only white space and are between two immediate siblings *each* of which is a table-non-root element, are treated as if they had display: none.</p>
+ <x-table><x-tr> <span id="target7a">A</span> <span id="target7b">B</span> </x-tr></x-table>
+
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ "1.1. Children of a table-column are treated as if they had display: none.",
+ document.querySelector("div[style*='red']#target"+(i++)+"").offsetWidth,
+ 0
+ ],
+ [
+ "1.2. Children of a table-column-group which are not a table-column are treated as if they had display: none.",
+ document.querySelector("div[style*='red']#target"+(i++)+"").offsetWidth,
+ 0
+ ],
+ [
+ "2.1. An anonymous table-row box must be generated around each sequence of consecutive children of a table-root box which are not proper table child boxes. (1/2)",
+ document.querySelector("#target"+(i++)+"").offsetWidth,
+ 50
+ ],
+ [
+ "2.1. An anonymous table-row box must be generated around each sequence of consecutive children of a table-root box which are not proper table child boxes. (2/2)",
+ document.querySelector("#target"+(i-1)+"").offsetHeight,
+ 100
+ ],
+ [
+ "2.2. An anonymous table-row box must be generated around each sequence of consecutive children of a table-row-grouping box which are not table-row boxes. (1/3)",
+ document.querySelector("#target"+(i++)+"b").offsetLeft - document.querySelector("#target"+(i-1)+"a").offsetLeft,
+ 50
+ ],
+ [
+ "2.2. An anonymous table-row box must be generated around each sequence of consecutive children of a table-row-grouping box which are not table-row boxes. (2/3)",
+ document.querySelector("#target"+(i-1)+"c").offsetLeft - document.querySelector("#target"+(i-1)+"a").offsetLeft,
+ 100
+ ],
+ [
+ "2.2. An anonymous table-row box must be generated around each sequence of consecutive children of a table-row-grouping box which are not table-row boxes. (3/3)",
+ document.querySelector("#target"+(i-1)+"d").offsetLeft,
+ document.querySelector("#target"+(i-1)+"c").offsetLeft
+ ],
+ [
+ "2.3 happens after 2.1. and 2.2. (1/2)",
+ document.querySelector("#target"+(i++)+"b").offsetLeft < 25,
+ true
+ ],
+ [
+ "2.3 happens after 2.1. and 2.2. (2/2)",
+ document.querySelector("#target"+(i-1)+"c").offsetLeft > 50,
+ true
+ ],
+ [
+ "3.2. An anonymous table or inline-table box must be generated around each sequence of consecutive proper table child box which are misparented",
+ document.querySelector("#target"+(i++)+"b").offsetLeft > document.querySelector("#target"+(i-1)+"a").offsetLeft,
+ true
+ ],
+ [
+ "1.4. Anonymous inline boxes which contains only white space and are between two immediate siblings *each* of which is a table-non-root element, are treated as if they had display: none.",
+ document.querySelector("#target"+(i++)+"b").offsetLeft > 1 + document.querySelector("#target"+(i-1)+"a").offsetLeft + document.querySelector("#target"+(i-1)+"a").offsetWidth,
+ true
+ ],
+ ])
+
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/tools/markup-generator.html b/tests/wpt/web-platform-tests/css/css-tables-3/tools/markup-generator.html
new file mode 100644
index 00000000000..3b37e6c5fee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/tools/markup-generator.html
@@ -0,0 +1,200 @@
+<!doctype html>
+<link rel="stylesheet" href="../support/base.css" />
+<aside style="position:absolute"><!-- THIS IS WHERE WE RUN THE EXPERIMENTS --></aside>
+<main><textarea style="display: none; width: 100%"></textarea><script>
+
+ var textarea = document.querySelector('textarea');
+ var testingBorderAttributes = true;
+ var seed = 0;
+
+ // This is not meant to be a good random number generator; I literally don't care
+ function XorshiftMath(seed) {
+ var x = 1;
+ var y = 2;
+ var z = 3;
+ var w = seed|0;
+ this.random = function random() {
+ var t = x;
+ t ^= t << 11;
+ t ^= t >> 8;
+ x = y; y = z; z = w;
+ w ^= w >> 19;
+ w ^= t;
+ return (w%1024)/1024;
+ }
+ }
+
+ var rndGen = new XorshiftMath(seed);
+ function rnd(x) {
+ return x > rndGen.random();
+ }
+ function pickInList(list) {
+ var i = list.length; while(i>1 && rnd(1/i)) { i--; }
+ return list[i-1];
+ }
+
+ function generateMarkup(root) {
+ if(rnd(0.99)) {
+
+ //
+ // the table has a <table> element
+ //
+ var table = document.createElement('table');
+
+ //
+ if(testingBorderAttributes) {
+ if(rnd(0.3)) { table.setAttribute('border',pickInList(['0','10','yes'])); }
+ if(rnd(0.3)) { table.setAttribute('frame',pickInList(['box','vsides','none'])); }
+ if(rnd(0.3)) { table.setAttribute('rules',pickInList(['all','rows','groups'])); }
+ table.setAttribute("cellspacing","0");
+ }
+
+
+ generateRowGroups(table);
+ root.appendChild(table);
+
+ } else {
+
+ //
+ // the table has no <table> element
+ //
+
+ generateRowGroup(root);
+
+ }
+ }
+
+ function generateRowGroups(root) {
+ if(rnd(0.5)) {
+
+ generateRowGroup(root);
+ while(rnd(0.25)) {
+ generateRowGroup(root);
+ }
+
+ } else {
+
+ generateRows(root);
+
+ }
+ }
+
+ function generateRowGroup(root) {
+
+ var tbody; if(rnd(0.7)) {
+ tbody = document.createElement('tbody');
+ } else if (rnd(0.5)) {
+ tbody = document.createElement('thead');
+ } else {
+ tbody = document.createElement('tfoot');
+ }
+
+ generateRows(tbody);
+ root.appendChild(tbody);
+
+ }
+
+ function generateRows(root) {
+
+ while(rnd(0.9)) {
+ if(rnd(0.9)) {
+ generateRow(root);
+ } else {
+ generateCells(root);
+ }
+ }
+
+ }
+
+ function generateRow(root) {
+
+ var tr = document.createElement('tr');
+ generateCells(tr);
+ root.appendChild(tr);
+
+ }
+
+ function generateCells(root) {
+
+ while(rnd(0.9)) {
+ if(rnd(0.9)) {
+ generateCell(root);
+ } else {
+ generateCellContent(root);
+ }
+ }
+
+ }
+
+ function generateCell(root) {
+
+ var td = document.createElement( rnd(0.9) ? 'td' : 'th' );
+ generateCellContent(td);
+ root.appendChild(td);
+
+ }
+
+ function generateCellContent() {
+ // for now, do nothing
+ }
+
+ for(var i = 10; i--;) {
+ //document.write("<textarea style='width: 100%; display: none'>");
+ var div = document.createElement('div');
+ generateMarkup(div);
+ appendReportFor(div);
+ //document.write(div.innerHTML);
+ //document.write("</textarea>");
+ }
+
+ if(navigator.userAgent.indexOf("Edge") == -1) {
+ var downloadLink = document.createElement('a');
+ downloadLink.setAttribute("download","report.txt");
+ downloadLink.href = "data:," + escape(textarea.value);
+ downloadLink.textContent = "download";
+ document.body.appendChild(downloadLink);
+ }
+
+ function appendReportFor(markup) {
+ var report = markup.innerHTML + '\r\n\r\n';
+
+ //
+ // append markup to the dom
+ //
+ var root = document.querySelector('aside');
+ root.innerHTML = '';
+ root.appendChild(markup);
+
+ //
+ // output box stats
+ //
+ var boxes = markup.getElementsByTagName("*");
+ for(var i = 0; i<boxes.length; i++) {
+
+ var box = boxes[i];
+ report += '' + i + ': ' + box.tagName + '\r\n';
+ report += 'offsetWidth: ' + box.offsetWidth + '\r\n';
+ report += 'offsetHeight: ' + box.offsetHeight + '\r\n';
+ report += 'offsetLeft: ' + box.offsetLeft + '\r\n';
+ report += 'offsetTop: ' + box.offsetTop + '\r\n';
+ report += 'borderTopWidth: ' + getComputedStyle(box).borderTopWidth + '\r\n';
+ report += 'borderTopStyle: ' + getComputedStyle(box).borderTopStyle + '\r\n';
+ report += 'borderTopColor: ' + getComputedStyle(box).borderTopColor + '\r\n';
+ report += 'borderLeftWidth: ' + getComputedStyle(box).borderLeftWidth + '\r\n';
+ report += 'borderLeftStyle: ' + getComputedStyle(box).borderLeftStyle + '\r\n';
+ report += 'borderLeftColor: ' + getComputedStyle(box).borderLeftColor + '\r\n';
+ report += '\r\n';
+
+ }
+
+ report += '\r\n';
+ report += '=====================================================================\r\n';
+ report += '\r\n';
+
+ textarea.value += report;
+
+ root.innerHTML = '';
+
+ }
+
+</script></main>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-001.html
new file mode 100644
index 00000000000..15368aceec3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-001.html
@@ -0,0 +1,101 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+ <p>
+ Setting a column to visibility:collapse changes table width but not height.
+ </p>
+ <x-table id="one">
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span style="height:50px"></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+ Bottom table is identical to top except left column has been collapsed.
+ <x-table id="two">
+ <x-colgroup style="visibility:collapse;"></x-colgroup>
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span style="height:50px"></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+</main>
+
+<script>
+ generate_tests(assert_equals, [
+ [
+ "col visibility:collapse doesn't change table height",
+ document.getElementById('two').offsetHeight,
+ document.getElementById('one').offsetHeight
+ ],
+ [
+ "col visibility:collapse changes table width",
+ document.getElementById('two').offsetWidth,
+ 116
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-002.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-002.html
new file mode 100644
index 00000000000..32c2efebb48
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-002.html
@@ -0,0 +1,110 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+ <p>
+ Setting a column to visibility:collapse changes table width but not height.
+ </p>
+ <x-table id="one">
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span style="height:50px"></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+ Second table is identical to first except both column groups have been collapsed.
+ 5px borders are still visible.
+ <x-table id="two">
+ <x-colgroup style="visibility:collapse;"></x-colgroup>
+ <x-colgroup style="visibility:collapse;"></x-colgroup>
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span style="height:50px"></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetHeight,
+ document.getElementById('one').offsetHeight,
+ "col visibility:collapse doesn't change table height"
+ ],
+ [
+ document.getElementById('two').offsetWidth,
+ 10,
+ "col visibility:collapse changes table width"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-003.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-003.html
new file mode 100644
index 00000000000..bf18adeac2c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-003.html
@@ -0,0 +1,114 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+ <p>
+ Setting a column to visibility:collapse changes table width but not height.
+ </p>
+ <x-table id="one">
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span style="height:50px"></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+
+ Second table is identical to first except right column has been collapsed.
+ Visibility:collapse is applied on col, not colgroup.
+
+ <x-table id="two">
+ <x-colgroup></x-colgroup>
+ <x-colgroup>
+ <x-col style="visibility:collapse;">
+ </x-colgroup>
+
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span style="height:50px"></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetHeight,
+ document.getElementById('one').offsetHeight,
+ "col visibility:collapse doesn't change table height"
+ ],
+ [
+ document.getElementById('two').offsetWidth,
+ 116,
+ "col visibility:collapse changes table width"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-004-dynamic.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-004-dynamic.html
new file mode 100644
index 00000000000..cb868bac416
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-004-dynamic.html
@@ -0,0 +1,81 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+ table {
+ border: 5px solid black;
+ }
+ table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Dynamic Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+ <p>
+ Setting a column to visibility:collapse changes table width but not height.
+ Bottom table is identical to top except left column has been collapsed.
+ </p>
+ <table id="test">
+ <colgroup id="collapse"></colgroup>
+ <tbody>
+ <tr>
+ <td>
+ <span>row 1</span>
+ </td>
+ <td>
+ <span></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span>row 2</span>
+ </td>
+ <td>
+ <span></span>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span>row 3</span>
+ </td>
+ <td>
+ <span style="height:50px"></span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</main>
+
+<script>
+ colgroup = document.getElementById("collapse");
+ colgroup.style.visibility = "collapse";
+
+ tests = [
+ [
+ document.getElementById('test').offsetHeight,
+ 342,
+ "col visibility:collapse doesn't change table height",
+ ],
+ [
+ document.getElementById('test').offsetWidth,
+ 122,
+ "col visibility:collapse changes table width"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-005.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-005.html
new file mode 100644
index 00000000000..b674cddf651
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-col-005.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+ td {
+ padding: 0;
+ }
+</style>
+<h1>Visibility collapse</h1>
+<a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+<p>
+Setting a spanning column to visibility:collapse changes table width but
+not height. The right two columns here have been collapsed.
+</p>
+<table id="test" style="border-collapse: collapse;">
+<colgroup>
+ <col style="background:#00F"/>
+ <col span="2" style="background:#F00; visibility: collapse"/>
+</colgroup>
+<tbody>
+ <tr>
+ <td><div style="width: 100px; height: 100px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 1px; height: 1px"></div></td>
+ </tr>
+ <tr>
+ <td><div style="width: 100px; height: 100px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 1px; height: 1px"></div></td>
+ </tr>
+</tbody>
+</table>
+<script>
+ tests = [
+ [
+ document.getElementById('test').offsetHeight,
+ 200,
+ "col visibility:collapse doesn't change table height",
+ ],
+ [
+ document.getElementById('test').offsetWidth,
+ 100,
+ "col visibility:collapse changes table width"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-001.html
new file mode 100644
index 00000000000..0b59f20fb84
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-001.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+ td {
+ padding: 0;
+ }
+</style>
+<h1>Visibility collapse</h1>
+<a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+<p>
+Setting a spanning column to visibility:collapse changes table width but
+not height. The middle column has been collapsed.
+</p>
+<table id="test" style="border-spacing: 0;">
+ <col style="background-color:red;">
+ <col style="background-color: blue; visibility: collapse;">
+ <col style="background-color: green;">
+ <tr>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ </tr>
+ <tr>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ </tr>
+ <tr>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ </tr>
+ <tr>
+ <td colspan="3"><div style="width: 30px; height: 10px"></div></td>
+ </tr>
+</table>
+
+<script>
+ tests = [
+ [
+ document.getElementById('test').offsetHeight,
+ 40,
+ "col visibility:collapse doesn't change table height",
+ ],
+ [
+ document.getElementById('test').offsetWidth,
+ 20,
+ "col visibility:collapse changes table width"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-002.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-002.html
new file mode 100644
index 00000000000..0203749c532
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-002.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+ td {
+ padding: 0;
+ }
+</style>
+<h1>Visibility collapse</h1>
+<a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+<p>
+Setting a spanning column to visibility:collapse changes table width but
+not height. The first column has been collapsed and column width is the widest cell
+in the column.
+</p>
+<table id="test" style="border-spacing: 0;">
+ <col style="background-color:red; visibility: collapse;">
+ <col style="background-color: blue;">
+ <col style="background-color: green;">
+ <tr>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 20px; height: 10px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ </tr>
+ <tr>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 20px; height: 10px"></div></td>
+ <td><div style="width: 20px; height: 10px"></div></td>
+ </tr>
+ <tr>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td><div style="width: 20px; height: 10px"></div></td>
+ <td><div style="width: 30px; height: 10px"></div></td>
+ </tr>
+ <tr>
+ <td colspan="3"><div style="width: 25px; height: 10px"></div></td>
+ </tr>
+</table>
+<script>
+ tests = [
+ [
+ document.getElementById('test').offsetHeight,
+ 40,
+ "col visibility:collapse doesn't change table height",
+ ],
+ [
+ document.getElementById('test').offsetWidth,
+ 50,
+ "col visibility:collapse changes table width"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-003-ref.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-003-ref.html
new file mode 100644
index 00000000000..4617a3a2ed6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-003-ref.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test Reference: Overflow clipping in cells that span columns</title>
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+ .firstCol {
+ width: 65px;
+ }
+ .thirdCol {
+ width: 160px;
+ }
+</style>
+<table>
+ <col style="background-color:red;">
+ <col style="background-color: blue; visibility:collapse;">
+ <col style="background-color: green;">
+ <tr>
+ <td class="firstCol">Row 1</td>
+ <td>Row 1 wordword</td>
+ <td class="thirdCol">Row 1 wordwordword</td>
+ </tr>
+ <tr>
+ <td class="firstCol">Row 2</td>
+ <td>Row 2 wordwordword</td>
+ <td class="thirdCol">Row 2 wordword</td>
+ </tr>
+ <tr>
+ <td class="firstCol">Row 3</td>
+ <td>Row 3 word</td>
+ <td class="thirdCol">Row 3 wordwordwordword</td>
+ </tr>
+ <tr>
+ <td colspan="3">superlongwordsuperlongwordsuper</td>
+ </tr>
+</table>
+
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-003.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-003.html
new file mode 100644
index 00000000000..37092818f62
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-003.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test: Overflow clipping in cells that span columns</title>
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<link rel="match" href="visibility-collapse-colspan-003-ref.html">
+<style>
+ .firstCol {
+ width: 65px;
+ }
+ .thirdCol {
+ width: 160px;
+ }
+</style>
+<table>
+ <col style="background-color:red;">
+ <col style="background-color: blue; visibility:collapse;">
+ <col style="background-color: green;">
+ <tr>
+ <td class="firstCol">Row 1</td>
+ <td>Row 1 wordword</td>
+ <td class="thirdCol">Row 1 wordwordword</td>
+ </tr>
+ <tr>
+ <td class="firstCol">Row 2</td>
+ <td>Row 2 wordwordword</td>
+ <td class="thirdCol">Row 2 wordword</td>
+ </tr>
+ <tr>
+ <td class="firstCol">Row 3</td>
+ <td>Row 3 word</td>
+ <td class="thirdCol">Row 3 wordwordwordword</td>
+ </tr>
+ <tr>
+ <td colspan="3">superlongwordsuperlongwordsuper&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shouldbeclipped</td>
+ </tr>
+</table>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-crash.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-crash.html
new file mode 100644
index 00000000000..591fbd9a994
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-colspan-crash.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
+<h1>Visibility collapse</h1>
+<a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+<p>
+When a row is collapsed, a cell spanning the row may get clipped. When the row is then uncollapsed,
+the browser should not crash because the cell's children should be correctly updated and laid out.
+</p>
+<table>
+ <col style="background-color:red;">
+ <col id="colToCollapse" style="background-color: blue;">
+ <col style="background-color: green;">
+ <tr>
+ <td class="firstCol">Row 1</td>
+ <td>Row 1 wordword</td>
+ <td class="thirdCol">Row 1 wordwordword</td>
+ </tr>
+ <tr>
+ <td class="firstCol">Row 2</td>
+ <td>Row 2 wordwordword</td>
+ <td class="thirdCol">Row 2 wordword</td>
+ </tr>
+ <tr>
+ <td class="firstCol">Row 3</td>
+ <td>Row 3 word</td>
+ <td class="thirdCol">Row 3 wordwordwordword</td>
+ </tr>
+ <tr>
+ <td colspan="3">superlongwordsuperlongwordsuper&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shouldbeclipped</td>
+ </tr>
+</table>
+
+<script>
+ test(() => {
+ col = document.getElementById("colToCollapse");
+ col.style.visibility = "collapse";
+ step_timeout(function(){ col.style.visibility = "visible"; }, 500);
+ step_timeout(function(){ col.style.visibility = "collapse"; }, 1000);
+ }, "No crash or assertion failure. crbug.com/174167");
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-non-rowcol-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-non-rowcol-001.html
new file mode 100644
index 00000000000..9765a37f8b8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-non-rowcol-001.html
@@ -0,0 +1,110 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#visibility-prop">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ When setting any element that is not a row, col, row group, or col group,
+ visibility:collapse is equivalent to visibility:hidden.
+ </p>
+ <x-table id="one">
+ <x-tr>
+ <x-td id="visibleCell">
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span id="visibleSpan"></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+ Bottom table is identical to top except top cells have been collapsed.
+ <x-table id="two">
+ <x-tr>
+ <x-td id="hiddenCell" style="visibility:collapse">
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span id="hiddenSpan" style="visibility:collapse"></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "table width is unchanged"
+ ],
+ [
+ document.getElementById('two').offsetHeight,
+ document.getElementById('one').offsetHeight,
+ "table height is unchanged"
+ ],
+ [
+ document.getElementById('hiddenCell').offsetWidth,
+ document.getElementById('visibleCell').offsetWidth,
+ "td visibility:collapse has no effect on td width"
+ ],
+ [
+ document.getElementById('hiddenCell').offsetHeight,
+ document.getElementById('visibleCell').offsetHeight,
+ "td visibility:collapse has no effect on td height"
+ ],
+ [
+ document.getElementById('hiddenSpan').offsetWidth,
+ document.getElementById('visibleSpan').offsetWidth,
+ "span visibility:collapse has no effect on span width"
+ ],
+ [
+ document.getElementById('hiddenSpan').offsetHeight,
+ document.getElementById('visibleSpan').offsetHeight,
+ "span visibility:collapse has no effect on span height"
+ ]];
+
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-001.html
new file mode 100644
index 00000000000..51c87b6c62e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-001.html
@@ -0,0 +1,80 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ Setting a row to visibility:collapse changes table height but not width.
+ </p>
+ <x-table id="one">
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span><span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+ Bottom table is identical to top except row 1 has been collapsed.
+ <x-table id="two">
+ <x-tr style="visibility:collapse">
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span><span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ generate_tests(assert_equals, [
+ [
+ "row visibility:collapse doesn't change table width, unlike display:none",
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth
+ ],
+ [
+ "row visibility:collapse changes table height, unlike visibility:hidden",
+ document.getElementById('two').offsetHeight,
+ 116
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-002-dynamic.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-002-dynamic.html
new file mode 100644
index 00000000000..7bcf413023e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-002-dynamic.html
@@ -0,0 +1,89 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ Setting a row to visibility:collapse changes table height but not width.
+ </p>
+ <x-table id="one">
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span><span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+ Bottom table is identical to top except row 2 has been collapsed.
+ <x-table id="two">
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span><span></span>
+ </x-td>
+ </x-tr>
+ <x-tr id="collapse">
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ row = document.getElementById("collapse");
+ row.style.visibility = "collapse";
+
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "row visibility:collapse doesn't change table width, unlike display:none"
+ ],
+ [
+ document.getElementById('two').offsetHeight,
+ 116,
+ "row visibility:collapse changes table height, unlike visibility:hidden"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-003-dynamic.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-003-dynamic.html
new file mode 100644
index 00000000000..1488a4da7f7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-003-dynamic.html
@@ -0,0 +1,89 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ Setting a row to visibility:collapse changes table height but not width.
+ </p>
+ <x-table id="one">
+ <x-tr>
+ <x-td>
+ <img src="../support/cat.png">
+ </x-td>
+ <x-td>
+ <span></span><span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+ Bottom table is identical to top except row 1 has been collapsed.
+ <x-table id="two">
+ <x-tr id="collapse">
+ <x-td>
+ <img src="../support/cat.png">
+ </x-td>
+ <x-td>
+ <span></span><span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ row = document.getElementById("collapse");
+ row.style.visibility = "collapse";
+
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "row visibility:collapse doesn't change table width, unlike display:none"
+ ],
+ [
+ document.getElementById('two').offsetHeight,
+ 116,
+ "row visibility:collapse changes table height, unlike visibility:hidden"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-group-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-group-001.html
new file mode 100644
index 00000000000..ea76e902b54
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-group-001.html
@@ -0,0 +1,124 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<link rel="help" href="https://www.w3.org/TR/2017/WD-css-tables-3-20170307/#visible-track">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ Collapsing a row group but making its rows visible should still result in a
+ collapsed row group.
+ </p>
+ <x-table id="one">
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ <x-tr id="thirdRowRef">
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+ When row group is collapsed, visible rows within the row group are still collapsed and therefore invisible.
+ <x-table id="two">
+ <x-tbody style="visibility:collapse;">
+ <x-tr style="visibility:visible;" id="firstRow">
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr style="visibility:visible;" id="secondRow">
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ <x-tr id="thirdRow">
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "row group visibility:collapse doesn't change table width"
+ ],
+ [
+ document.getElementById('two').offsetHeight,
+ 116,
+ "row group visibility:collapse changes table height"
+ ],
+ [
+ document.getElementById('firstRow').offsetHeight,
+ 0,
+ "the first row should be collapsed"
+ ],
+ [
+ document.getElementById('secondRow').offsetHeight,
+ 0,
+ "the second row should be collapsed"
+ ],
+ [
+ document.getElementById('thirdRow').offsetHeight,
+ document.getElementById('thirdRowRef').offsetHeight,
+ "the third row stays the same"
+ ]];
+
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-group-002.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-group-002.html
new file mode 100644
index 00000000000..1aa7a68048f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-row-group-002.html
@@ -0,0 +1,107 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ Setting row group to visibility:collapse changes table height but not width.
+ </p>
+ <x-table id="one">
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+ Bottom table is identical to top except row group of first two rows has been collapsed.
+ <x-table id="two">
+ <x-tbody style="visibility:collapse;">
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "row group visibility:collapse doesn't change table width"
+ ],
+ [
+ document.getElementById('two').offsetHeight,
+ 116,
+ "row group visibility:collapse changes table height"
+ ]];
+
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowcol-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowcol-001.html
new file mode 100644
index 00000000000..912ab0d8b0f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowcol-001.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+table, td {
+ border: 1px solid;
+ height: 32px;
+ min-width: 32px;
+ white-space: nowrap;
+ padding: 0;
+}
+</style>
+<h1>Visibility collapse</h1>
+<a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+<p>
+Setting row and column to visibility:collapse changes both height and width. The
+collapsed result should have whitespace in the bottom right corner.
+</p>
+<table id="test">
+ <col style="background-color: pink">
+ <col style="background-color: purple;">
+ <col style="background-color: black; visibility: collapse;">
+ <col style="background-color: grey; ">
+ <tbody>
+ <tr>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td colspan="2" rowspan="2"></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr style="visibility:collapse">
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td></td>
+ <td colspan="2"></td>
+ </tr>
+ </tbody>
+</table>
+<script>
+ tests = [
+ [
+ document.getElementById('test').offsetWidth,
+ 112,
+ "spanning col visibility:collapse changes table width"
+ ],
+ [
+ document.getElementById('test').offsetHeight,
+ 112,
+ "spanning row visibility:collapse changes height"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowcol-002.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowcol-002.html
new file mode 100644
index 00000000000..6876a40712d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowcol-002.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+ td {
+ padding: 0;
+ }
+</style>
+<h1>Visibility collapse</h1>
+<a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+<p>
+Setting row and spanning column to visibility:collapse changes height and width.
+</p>
+<table id="test" style="border-spacing:0;">
+ <col style="background-color: pink;">
+ <col style="background-color: green;">
+ <col span="2" style="background-color: purple; visibility: collapse;">
+ <tr>
+ <td><div style="width: 25px; height: 25px"></div></td>
+ <td><div style="width: 20px; height: 20px"></div></td>
+ <td><div style="width: 15px; height: 15px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ </tr>
+ <tr>
+ <td rowspan="2" colspan="3"><div style="width: 45px; height: 25px"></div></td>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ </tr>
+ <tr style="visibility: collapse;">
+ <td><div style="width: 70px; height: 40px"></div></td>
+ </tr>
+</table>
+<script>
+ borderWidth = 2;
+ tests = [
+ [
+ document.getElementById('test').offsetWidth,
+ 45,
+ "spanning row visibility:collapse doesn't change table width"
+ ],
+ [
+ document.getElementById('test').offsetHeight,
+ 35,
+ "spanning row visibility:collapse doesn't change height in this case"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-001.html
new file mode 100644
index 00000000000..72ceb3a34ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-001.html
@@ -0,0 +1,69 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ Setting a rowspan to visibility:collapse doesn't change height or width in this case.
+ </p>
+ <table id="one">
+ <tr>
+ <th>Month</th>
+ <th>Savings</th>
+ <th>Savings for holiday!</th>
+ </tr>
+ <tr>
+ <td>January</td>
+ <td>$100</td>
+ <td rowspan="2">$50</td>
+ </tr>
+ <tr>
+ <td>February</td>
+ <td>$80</td>
+ </tr>
+</table>
+ Collapsing a spanning row does not change table height in this case.
+ <table id="two">
+ <tr>
+ <th>Month</th>
+ <th>Savings</th>
+ <th>Savings for holiday!</th>
+ </tr>
+ <tr>
+ <td>January</td>
+ <td>$100</td>
+ <td rowspan="2" style="visibility:collapse;">$50</td>
+ </tr>
+ <tr>
+ <td>February</td>
+ <td>$80</td>
+ </tr>
+</table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "spanning row visibility:collapse doesn't change table width"
+ ],
+ [
+ document.getElementById('two').offsetHeight,
+ document.getElementById('one').offsetHeight,
+ "spanning row visibility:collapse doesn't change height in this case"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-002-border-separate.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-002-border-separate.html
new file mode 100644
index 00000000000..d6e7469d70d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-002-border-separate.html
@@ -0,0 +1,107 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
+<style>
+table {
+ border-spacing: 0;
+ border-collapse: separate;
+}
+table td {
+ border: 1px solid blue;
+ padding: 5px;
+}
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">Spec</a>
+ <p>
+ Setting a row to visibility:collapse changes table height but not width.
+ Here, the spanning cell is the only cell in its row.
+ </p>
+ <table id="one">
+ <tr id="spanningRowRef">
+ <td rowspan="5">B<br>B<br>B<br>B<br>B</td>
+ </tr>
+ <tr id="firstRowRef">
+ <td>aaaa</td>
+ </tr>
+ <tr>
+ <td>bbbb</td>
+ </tr>
+ <tr id="thirdRowRef">
+ <td>cccc</td>
+ </tr>
+ <tr id="fourthRowRef">
+ <td>dddd</td>
+ </tr>
+ </table>
+ Bottom table is identical to top except second row has been collapsed.
+ The spanning cell's height shrinks and is clipped.
+ <table id="two">
+ <tr id="spanningRow">
+ <td rowspan="5" id="spanningCell">B<br>B<br>B<br>B<br>B</td>
+ </tr>
+ <tr id="firstRow">
+ <td>aaaa</td>
+ </tr>
+ <tr id="secondRow" style="visibility: collapse">
+ <td>bbbb</td>
+ </tr>
+ <tr id="thirdRow">
+ <td>cccc</td>
+ </tr>
+ <tr id="fourthRow">
+ <td>dddd</td>
+ </tr>
+ </table>
+
+ This text should not intersect with the table.
+
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "spanning row visibility:collapse doesn't change table width"
+ ],
+ [
+ document.getElementById('fourthRow').offsetHeight,
+ document.getElementById('fourthRowRef').offsetHeight,
+ "fourth row stays the same height"
+ ],
+ [
+ document.getElementById('thirdRow').offsetHeight,
+ document.getElementById('thirdRowRef').offsetHeight,
+ "third row stays the same height"
+ ],
+ [ document.getElementById('secondRow').offsetHeight,
+ 0,
+ "spanning row visibility:collapse makes row height 0"
+ ],
+ [
+ document.getElementById('firstRow').offsetHeight,
+ document.getElementById('firstRowRef').offsetHeight,
+ "first row stays the same height"
+ ],
+ [
+ document.getElementById('spanningCell').offsetHeight,
+ document.getElementById('firstRow').offsetHeight +
+ document.getElementById('thirdRow').offsetHeight +
+ document.getElementById('fourthRow').offsetHeight,
+ "spanning cell shrinks to sum of remaining three rows' height"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-002.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-002.html
new file mode 100644
index 00000000000..c88831a4eed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-002.html
@@ -0,0 +1,107 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
+<style>
+table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+table td {
+ border: 1px solid blue;
+ padding: 5px;
+}
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">Spec</a>
+ <p>
+ Setting a row to visibility:collapse changes table height but not width.
+ Here, the spanning cell is the only cell in its row.
+ </p>
+ <table id="one">
+ <tr id="spanningRowRef">
+ <td rowspan="5">B<br>B<br>B<br>B<br>B</td>
+ </tr>
+ <tr id="firstRowRef">
+ <td>aaaa</td>
+ </tr>
+ <tr>
+ <td>bbbb</td>
+ </tr>
+ <tr id="thirdRowRef">
+ <td>cccc</td>
+ </tr>
+ <tr id="fourthRowRef">
+ <td>dddd</td>
+ </tr>
+ </table>
+ Bottom table is identical to top except second row has been collapsed.
+ The spanning cell's height shrinks and is clipped.
+ <table id="two">
+ <tr id="spanningRow">
+ <td rowspan="5" id="spanningCell">B<br>B<br>B<br>B<br>B</td>
+ </tr>
+ <tr id="firstRow">
+ <td>aaaa</td>
+ </tr>
+ <tr id="secondRow" style="visibility: collapse">
+ <td>bbbb</td>
+ </tr>
+ <tr id="thirdRow">
+ <td>cccc</td>
+ </tr>
+ <tr id="fourthRow">
+ <td>dddd</td>
+ </tr>
+ </table>
+
+ This text should not intersect with the table.
+
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "spanning row visibility:collapse doesn't change table width"
+ ],
+ [
+ document.getElementById('fourthRow').offsetHeight,
+ document.getElementById('fourthRowRef').offsetHeight,
+ "fourth row stays the same height"
+ ],
+ [
+ document.getElementById('thirdRow').offsetHeight,
+ document.getElementById('thirdRowRef').offsetHeight,
+ "third row stays the same height"
+ ],
+ [ document.getElementById('secondRow').offsetHeight,
+ 0,
+ "spanning row visibility:collapse makes row height 0"
+ ],
+ [
+ document.getElementById('firstRow').offsetHeight,
+ document.getElementById('firstRowRef').offsetHeight,
+ "first row stays the same height"
+ ],
+ [
+ document.getElementById('spanningCell').offsetHeight,
+ document.getElementById('firstRow').offsetHeight +
+ document.getElementById('thirdRow').offsetHeight +
+ document.getElementById('fourthRow').offsetHeight,
+ "spanning cell shrinks to sum of remaining three rows' height"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-003-border-separate.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-003-border-separate.html
new file mode 100644
index 00000000000..343da685168
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-003-border-separate.html
@@ -0,0 +1,104 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<style>
+table {
+ border-spacing: 0;
+ border-collapse: separate;
+}
+table td {
+ border: 1px solid blue;
+ padding: 5px;
+}
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ Setting a row to visibility:collapse changes table height but not width.
+ Here the spanning cell and another cell are in the same row.
+ </p>
+ <table id="one">
+ <tr id="firstRowRef">
+ <td>aaaa</td>
+ </tr>
+ <tr id="secondRowRef">
+ <td>bbbb</td>
+ </tr>
+ <tr id="collapsedRowRef">
+ <td rowspan="2">spanning</td>
+ <td>cccc</td>
+ </tr>
+ <tr id="fourthRowRef">
+ <td>dddd</td>
+ </tr>
+ <tr id="fifthRowRef">
+ <td>eeee</td>
+ </tr>
+ </table>
+ Bottom table is identical to top except third row has been collapsed.
+ <table id="two">
+ <tr id="firstRow">
+ <td>aaaa</td>
+ </tr>
+ <tr id="secondRow">
+ <td>bbbb</td>
+ </tr>
+ <tr style="visibility:collapse;" id="collapsedRow">
+ <td rowspan="2">spanning</td>
+ <td>cccc</td>
+ </tr>
+ <tr id="fourthRow">
+ <td>dddd</td>
+ </tr>
+ <tr id="fifthRow">
+ <td>eeee</td>
+ </tr>
+ </table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "spanning row visibility:collapse doesn't change table width"
+ ],
+ [
+ document.getElementById('collapsedRow').offsetHeight,
+ 0,
+ "collapsed row has zero height"
+ ],
+ [
+ document.getElementById('firstRow').offsetHeight,
+ document.getElementById('firstRowRef').offsetHeight,
+ "first row height doesn't change"
+ ],
+ [
+ document.getElementById('secondRow').offsetHeight,
+ document.getElementById('secondRowRef').offsetHeight,
+ "second row height doesn't change"
+ ],
+ [
+ document.getElementById('fourthRow').offsetHeight,
+ document.getElementById('fourthRowRef').offsetHeight,
+ "fourth row height doesn't change"
+ ],
+ [
+ document.getElementById('fifthRow').offsetHeight,
+ document.getElementById('fifthRowRef').offsetHeight,
+ "fifth row height doesn't change"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-003.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-003.html
new file mode 100644
index 00000000000..2de164f2fda
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-003.html
@@ -0,0 +1,104 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<style>
+table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+table td {
+ border: 1px solid blue;
+ padding: 5px;
+}
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ Setting a row to visibility:collapse changes table height but not width.
+ Here the spanning cell and another cell are in the same row.
+ </p>
+ <table id="one">
+ <tr id="firstRowRef">
+ <td>aaaa</td>
+ </tr>
+ <tr id="secondRowRef">
+ <td>bbbb</td>
+ </tr>
+ <tr id="collapsedRowRef">
+ <td rowspan="2">spanning</td>
+ <td>cccc</td>
+ </tr>
+ <tr id="fourthRowRef">
+ <td>dddd</td>
+ </tr>
+ <tr id="fifthRowRef">
+ <td>eeee</td>
+ </tr>
+ </table>
+ Bottom table is identical to top except third row has been collapsed.
+ <table id="two">
+ <tr id="firstRow">
+ <td>aaaa</td>
+ </tr>
+ <tr id="secondRow">
+ <td>bbbb</td>
+ </tr>
+ <tr style="visibility:collapse;" id="collapsedRow">
+ <td rowspan="2">spanning</td>
+ <td>cccc</td>
+ </tr>
+ <tr id="fourthRow">
+ <td>dddd</td>
+ </tr>
+ <tr id="fifthRow">
+ <td>eeee</td>
+ </tr>
+ </table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "spanning row visibility:collapse doesn't change table width"
+ ],
+ [
+ document.getElementById('collapsedRow').offsetHeight,
+ 0,
+ "collapsed row has zero height"
+ ],
+ [
+ document.getElementById('firstRow').offsetHeight,
+ document.getElementById('firstRowRef').offsetHeight,
+ "first row height doesn't change"
+ ],
+ [
+ document.getElementById('secondRow').offsetHeight,
+ document.getElementById('secondRowRef').offsetHeight,
+ "second row height doesn't change"
+ ],
+ [
+ document.getElementById('fourthRow').offsetHeight,
+ document.getElementById('fourthRowRef').offsetHeight,
+ "fourth row height doesn't change"
+ ],
+ [
+ document.getElementById('fifthRow').offsetHeight,
+ document.getElementById('fifthRowRef').offsetHeight,
+ "fifth row height doesn't change"
+ ]];
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-004-dynamic.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-004-dynamic.html
new file mode 100644
index 00000000000..e6f65c450f7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-004-dynamic.html
@@ -0,0 +1,176 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
+<style>
+table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+table td {
+ border: 1px solid blue;
+ padding: 5px;
+}
+</style>
+<main>
+ <h1>Visibility collapse</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">Spec</a>
+ <p>
+ Setting a row to visibility:collapse changes table height but not width.
+ </p>
+ <table id="one">
+ <tr id="firstRowRef">
+ <td rowspan="5" id="spanningCellRef">B<br>B<br>B<br>B<br>B</td>
+ <td>first row</td>
+ </tr>
+ <tr id="secondRowRef">
+ <td>aaaa</td>
+ </tr>
+ <tr>
+ <td>bbbb</td>
+ </tr>
+ <tr id="fourthRowRef">
+ <td>cccc</td>
+ </tr>
+ <tr id="fifthRowRef">
+ <td>dddd</td>
+ </tr>
+ </table>
+ In the bottom table, a row is dynamically collapsed, made visible, and collapsed again.
+ <table id="two">
+ <tr id="firstRow">
+ <td rowspan="5" id="spanningCell">B<br>B<br>B<br>B<br>B</td>
+ <td>first row</td>
+ </tr>
+ <tr id="secondRow">
+ <td>aaaa</td>
+ </tr>
+ <tr id="thirdRow">
+ <td>bbbb</td>
+ </tr>
+ <tr id="fourthRow">
+ <td>cccc</td>
+ </tr>
+ <tr id="fifthRow">
+ <td>dddd</td>
+ </tr>
+ </table>
+</main>
+
+<script>
+ function runTests() {
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+ }
+ document.getElementById("thirdRow").style.visibility = "collapse";
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "spanning row visibility:collapse doesn't change table width"
+ ],
+ [
+ document.getElementById('firstRow').offsetHeight,
+ document.getElementById('firstRowRef').offsetHeight,
+ "when third row is collapsed, first row stays the same height"
+ ],
+ [
+ document.getElementById('secondRow').offsetHeight,
+ document.getElementById('secondRowRef').offsetHeight,
+ "when third row is collapsed, second row stays the same height"
+ ],
+ [ document.getElementById('thirdRow').offsetHeight,
+ 0,
+ "third row visibility:collapse makes row height 0"
+ ],
+ [
+ document.getElementById('fourthRow').offsetHeight,
+ document.getElementById('fourthRowRef').offsetHeight,
+ "when third row is collapsed, fourth row stays the same height"
+ ],
+ [
+ document.getElementById('spanningCell').offsetHeight,
+ document.getElementById('firstRow').offsetHeight +
+ document.getElementById('secondRow').offsetHeight +
+ document.getElementById('fourthRow').offsetHeight +
+ document.getElementById('fifthRow').offsetHeight,
+ "spanning cell shrinks to sum of remaining three rows' height"
+ ]];
+ runTests();
+ document.getElementById("thirdRow").style.visibility = "visible";
+ tests = [
+ [
+ document.getElementById('firstRow').offsetHeight,
+ document.getElementById('firstRowRef').offsetHeight,
+ "when third row is visible, first row stays the same height"
+ ],
+ [
+ document.getElementById('secondRow').offsetHeight,
+ document.getElementById('secondRowRef').offsetHeight,
+ "when third row is visible, second row stays the same height"
+ ],
+ [ document.getElementById('thirdRow').offsetHeight,
+ document.getElementById('secondRowRef').offsetHeight,
+ "when third row is visible, third row stays the same height"
+ ],
+ [
+ document.getElementById('fourthRow').offsetHeight,
+ document.getElementById('fourthRowRef').offsetHeight,
+ "when third row is visible, fourth row stays the same height"
+ ],
+ [
+ document.getElementById('fifthRow').offsetHeight,
+ document.getElementById('fifthRowRef').offsetHeight,
+ "when third row is visible, fifth row stays the same height"
+ ],
+ [
+ document.getElementById('spanningCell').offsetHeight,
+ document.getElementById('spanningCellRef').offsetHeight,
+ "when third row is visible, spanning cell stays the same height"
+ ]];
+ runTests();
+ document.getElementById("thirdRow").style.visibility = "collapse";
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "(2nd collapse) spanning row visibility:collapse doesn't change table width"
+ ],
+ [
+ document.getElementById('firstRow').offsetHeight,
+ document.getElementById('firstRowRef').offsetHeight,
+ "when third row is collapsed again, first row stays the same height"
+ ],
+ [
+ document.getElementById('secondRow').offsetHeight,
+ document.getElementById('secondRowRef').offsetHeight,
+ "when third row is collapsed again, second row stays the same height"
+ ],
+ [ document.getElementById('thirdRow').offsetHeight,
+ 0,
+ "(2nd collapse) third row visibility:collapse makes row height 0"
+ ],
+ [
+ document.getElementById('fourthRow').offsetHeight,
+ document.getElementById('fourthRowRef').offsetHeight,
+ "when third row is collapsed again, fourth row stays the same height"
+ ],
+ [
+ document.getElementById('spanningCell').offsetHeight,
+ document.getElementById('firstRow').offsetHeight +
+ document.getElementById('secondRow').offsetHeight +
+ document.getElementById('fourthRow').offsetHeight +
+ document.getElementById('fifthRow').offsetHeight,
+ "(2nd collapse) spanning cell shrinks to sum of remaining three rows' height"
+ ]];
+ runTests();
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-005-ref.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-005-ref.html
new file mode 100644
index 00000000000..27eceb19b5a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-005-ref.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test Reference: Overflow clipping in cells that span rows</title>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
+<style>
+table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+table td {
+ border: 1px solid blue;
+ padding: 5px;
+}
+</style>
+<h1>Visibility collapse</h1>
+<a href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">Spec</a>
+<table>
+ <tr>
+ <td>Row 1 Left</td>
+ <td>Row 1 Center</td>
+ <td rowspan=2 style="width:100px"><p>Supersuperlongword</p><p style="visibility: hidden;">row with lots and lots of text</p></td>
+ </tr>
+ <tr style="visibility: collapse">
+ <td>Row 2 Left</td>
+ <td>Row 2 Center</td>
+ </tr>
+ <tr>
+ <td>Row 3 Left</td>
+ <td>Row 3 Center</td>
+ <td>Row 3 Right</td>
+ </tr>
+</table>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-005.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-005.html
new file mode 100644
index 00000000000..a10c56dda71
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-005.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS Test: Overflow clipping in cells that span rows</title>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
+<link rel="match" href="visibility-collapse-rowspan-005-ref.html">
+<style>
+table {
+ border-spacing: 0;
+ border-collapse: collapse;
+}
+table td {
+ border: 1px solid blue;
+ padding: 5px;
+}
+</style>
+<h1>Visibility collapse</h1>
+<a href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">Spec</a>
+<table>
+ <tr>
+ <td>Row 1 Left</td>
+ <td>Row 1 Center</td>
+ <td rowspan=2 style="width:100px"><p>Supersuperlongword</p><p>row with lots and lots of text</p></td>
+ </tr>
+ <tr style="visibility: collapse">
+ <td>Row 2 Left</td>
+ <td>Row 2 Center</td>
+ </tr>
+ <tr>
+ <td>Row 3 Left</td>
+ <td>Row 3 Center</td>
+ <td>Row 3 Right</td>
+ </tr>
+</table>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-crash.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-crash.html
new file mode 100644
index 00000000000..977c3a026e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-collapse-rowspan-crash.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#visibility-collapse-cell-rendering">
+<h1>Visibility collapse</h1>
+<a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+<p>
+When a row is collapsed, a cell spanning the row may get clipped. When the row is then uncollapsed,
+the browser should not crash because the cell's children should be correctly updated and laid out.
+</p>
+<table>
+ <tr>
+ <td><div style="width: 10px; height: 10px"></div></td>
+ <td rowspan="2">
+ <div style="outline: 1px solid cyan">
+ Overflow Overflow Overflow</div>
+ </td>
+ </tr>
+ <tr id="rowToCollapse">
+ <td><div style="width: 10px; height: 10px"></div></td>
+ </tr>
+</table>
+
+<script>
+ test(() => {
+ row = document.getElementById("rowToCollapse");
+ row.style.visibility = "collapse";
+ step_timeout(function(){ row.style.visibility = "visible"; }, 500);
+ }, "No crash or assertion failure. crbug.com/753515");
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-col-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-col-001.html
new file mode 100644
index 00000000000..914af3683ef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-col-001.html
@@ -0,0 +1,107 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility hidden</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+ <p>
+ Setting a column of cells to visibility:hidden.
+ </p>
+ <x-table id="one">
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+ Bottom table is identical to top except right column's cells are hidden.
+ <x-table id="two">
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td style="visibility:hidden;">
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td style="visibility:hidden;">
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td style="visibility:hidden;">
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetHeight,
+ document.getElementById('one').offsetHeight,
+ "visibility:hidden doesn't change table height"
+ ],
+ [
+ document.getElementById('two').offsetWidth,
+ 222,
+ "visibility:hidden doesn't change table width"
+ ]];
+
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-nested-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-nested-001.html
new file mode 100644
index 00000000000..a2a80fdc461
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-nested-001.html
@@ -0,0 +1,140 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#visibility-prop">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility hidden</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+ <p>
+ Setting a table to visibility:hidden, but rows and cells to different visibility values.
+ </p>
+ <x-table id="one">
+ <x-tbody>
+ <x-tr id="visibleRow">
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td id="visibleCell">
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span id="visibleSpan"></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+ Bottom table is identical to top, except entire table is hidden, the second row
+ is visible with a nested hidden cell, and the third row is visible with a nested
+ hidden span.
+ <x-table id="two" style="visibility:hidden;">
+ <x-tbody>
+ <x-tr id="invisibleRow">
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr style="visibility:visible;">
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td id="invisibleCell" style="visibility:hidden;">
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr style="visibility:visible;">
+ <x-td>
+ <span>row 3</span>
+ </x-td>
+ <x-td>
+ <span id="invisibleSpan" style="visibility:hidden;"></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetHeight,
+ document.getElementById('one').offsetHeight,
+ "table visibility:hidden doesn't change table height"
+ ],
+ [
+ document.getElementById('two').offsetWidth,
+ 222,
+ "table visibility:hidden doesn't change table width"
+ ],
+ [
+ document.getElementById('visibleRow').offsetWidth,
+ document.getElementById('invisibleRow').offsetWidth,
+ "row visibility:hidden doesn't change row width"
+ ],
+ [
+ document.getElementById('visibleRow').offsetHeight,
+ document.getElementById('invisibleRow').offsetHeight,
+ "row visibility:hidden doesn't change row height"
+ ],
+ [
+ document.getElementById('visibleCell').offsetWidth,
+ document.getElementById('invisibleCell').offsetWidth,
+ "cell visibility:hidden doesn't change cell width"
+ ],
+ [
+ document.getElementById('visibleCell').offsetHeight,
+ document.getElementById('invisibleCell').offsetHeight,
+ "cell visibility:hidden doesn't change cell height"
+ ],
+ [
+ document.getElementById('visibleSpan').offsetWidth,
+ document.getElementById('invisibleSpan').offsetWidth,
+ "span visibility:hidden doesn't change span width"
+ ],
+ [
+ document.getElementById('visibleSpan').offsetHeight,
+ document.getElementById('invisibleSpan').offsetHeight,
+ "span visibility:hidden doesn't change span height"
+ ]];
+
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-nested-002.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-nested-002.html
new file mode 100644
index 00000000000..74da25b8b27
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-nested-002.html
@@ -0,0 +1,106 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
+<link rel="help" href="https://drafts.csswg.org/css-box-3/#visibility-prop">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: lime;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility hidden</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
+ <p>
+ Setting a table to visibility:hidden, but rows and cells to different nested visibility values.
+ Height and width of table should not change.
+ </p>
+ <x-table id="one">
+ <x-tbody>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+ Bottom table is identical to top except entire row group of two rows is hidden, and
+ first row is visible with two hidden cells and a visible span in the left cell.
+ <x-table id="two">
+ <x-tbody style="visibility:hidden;">
+ <x-tr id="invisibleRow" style="visibility:visible;">
+ <x-td id="leftCell" style="visibility:hidden;">
+ <span style="visibility:visible;">row 1</span>
+ </x-td>
+ <x-td id="rightCell" style="visibility:hidden;">
+ <span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-tbody>
+ </x-table>
+
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetHeight,
+ document.getElementById('one').offsetHeight,
+ "table visibility:hidden doesn't change table height"
+ ],
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "table visibility:hidden doesn't change table width"
+ ],
+ [
+ document.getElementById("leftCell").offsetWidth,
+ document.getElementById("rightCell").offsetWidth,
+ "hidden and visible cells should have same height"
+ ],
+ [
+ document.getElementById("leftCell").offsetHeight,
+ document.getElementById("rightCell").offsetHeight,
+ "hidden and visible cells should have same width"
+ ]
+ ];
+
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-row-001.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-row-001.html
new file mode 100644
index 00000000000..ed2e200cb7e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-row-001.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: pink;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility hidden</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ Setting a row to visibility:hidden doesn't change table height or width.
+ </p>
+ <x-table id="one">
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span><span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+ Bottom table is identical to top except row 1 has been hidden.
+ <x-table id="two">
+ <x-tr style="visibility:hidden">
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span><span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "row visibility:hidden doesn't change table width"
+ ],
+ [
+ document.getElementById('two').offsetHeight,
+ document.getElementById('one').offsetHeight,
+ "row visibility:hidden doesn't change table height"
+ ],
+ [
+ document.getElementById('two').offsetHeight,
+ 222,
+ "Table height is 222px"
+ ]];
+
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-row-002.html b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-row-002.html
new file mode 100644
index 00000000000..e9090e68461
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/visibility-hidden-row-002.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<meta charset="utf-8">
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='support/base.css' />
+<link rel="author" title="Joy Yu" href="mailto:joysyu@mit.edu">
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
+<style>
+ x-table {
+ border: 5px solid black;
+ }
+ x-table span {
+ display: inline-block;
+ vertical-align: top;
+ background: pink;
+ margin: 3px;
+ height: 100px;
+ width: 100px;
+ }
+</style>
+<main>
+ <h1>Visibility hidden</h1>
+ <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
+ <p>
+ Setting cells to visibility:hidden doesn't change table height or width.
+ </p>
+ <x-table id="one">
+ <x-tr>
+ <x-td>
+ <span>row 1</span>
+ </x-td>
+ <x-td>
+ <span></span><span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+ Bottom table is identical to top except row 1's cells has been hidden.
+ <x-table id="two">
+ <x-tr>
+ <x-td style="visibility:hidden">
+ <span>row 1</span>
+ </x-td>
+ <x-td style="visibility:hidden">
+ <span></span><span></span>
+ </x-td>
+ </x-tr>
+ <x-tr>
+ <x-td>
+ <span>row 2</span>
+ </x-td>
+ <x-td>
+ <span></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ tests = [
+ [
+ document.getElementById('two').offsetWidth,
+ document.getElementById('one').offsetWidth,
+ "row visibility:hidden doesn't change table width"
+ ],
+ [
+ document.getElementById('two').offsetHeight,
+ document.getElementById('one').offsetHeight,
+ "row visibility:hidden doesn't change table height"
+ ],
+ [
+ document.getElementById('two').offsetHeight,
+ 222,
+ "Table height is 222px"
+ ]];
+
+ for (i = 0; i< tests.length; i++) {
+ test(function()
+ {
+ assert_equals.apply(this, tests[i]);
+ },
+ tests[i][2]);
+ };
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-column-measure-0.html b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-column-measure-0.html
new file mode 100644
index 00000000000..795ad7e65ca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-column-measure-0.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-column-measures" />
+<main>
+ <h1>Width Distribution</h1>
+ <h4>"Computing column measures"</h4>
+ <p>This is testing that the table root's minimum is max(table-root width, capmin, gridmin) <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec Text</a></p>
+
+ <hr/>
+ <table id="one" cellspacing="0" cellpadding="0">
+ <colgroup style="width: 1px;">
+ <col style="width: 10px;"></col>
+ </colgroup>
+ <tr>
+ <td style="width: 1px;"></td>
+ </tr>
+ </table>
+
+ <table id="two" cellspacing="0" cellpadding="0">
+ <colgroup style="width: 10px;">
+ <col style="width: 1px;"></col>
+ </colgroup>
+ <tr>
+ <td style="width: 1px;"></td>
+ </tr>
+ </table>
+
+ <table id="three" cellspacing="0" cellpadding="0">
+ <colgroup style="width: 1px;">
+ <col style="width: 1px;"></col>
+ </colgroup>
+ <tr>
+ <td style="width: 10px;"></td>
+ </tr>
+ </table>
+
+ <table id="four" cellspacing="0" cellpadding="0">
+ <colgroup style="width: 10px;">
+ <col></col>
+ </colgroup>
+ <tr>
+ <td style="width: 1px;"></td>
+ </tr>
+ </table>
+</main>
+
+<script>
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ "Checking intermediate min-content width for span 1 (1)",
+ document.getElementById('one').offsetWidth,
+ 10
+ ],
+ [
+ "Checking intermediate min-content width for span 1 (2)",
+ document.getElementById('two').offsetWidth,
+ 1
+ ],
+ [
+ "Checking intermediate min-content width for span 1 (3)",
+ document.getElementById('three').offsetWidth,
+ 10
+ ],
+ [
+ "Checking intermediate min-content width for span 1 (4)",
+ document.getElementById('four').offsetWidth,
+ 10
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-column-measure-1.html b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-column-measure-1.html
new file mode 100644
index 00000000000..f032fcd1987
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-column-measure-1.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-column-measures" />
+<main>
+ <h1>Height Distribution</h1>
+ <h4>"Computing row measures"</h4>
+ <p>This is testing intermediate min-content height for span 2</p>
+
+ <hr/>
+ <table cellspacing="0" cellpadding="0">
+ <tbody style="height: auto">
+ <tr style="height: 10px">
+ <td id="one" style="height: 1px"></td>
+ <td rowspan="2" style="height: 51px"></td>
+ </tr>
+ <tr style="height: 20px">
+ <td style="height: 2px"></td>
+ </tr>
+ </tbody>
+ </table>
+
+ <table cellspacing="0" cellpadding="0">
+ <tbody style="height: auto">
+ <tr style="height: 10px">
+ <td id="two" style="height: 1px"></td>
+ <td rowspan="2" style="height: 51px"></td>
+ </tr>
+ <tr style="height: auto">
+ <td style="height: auto"></td>
+ </tr>
+ </tbody>
+ </table>
+
+ <table cellspacing="0" cellpadding="0">
+ <tbody style="height: 51px">
+ <tr style="height: 10px">
+ <td id="three" style="height: 1px"></td>
+ <td rowspan="2" style="height: 51px"></td>
+ </tr>
+ <tr style="height: 20px">
+ <td style="height: 2px"></td>
+ </tr>
+ </tbody>
+ </table>
+
+ <table cellspacing="0" cellpadding="0">
+ <tbody style="height: 51px">
+ <tr style="height: 10px">
+ <td id="four" style="height: 1px"></td>
+ </tr>
+ <tr style="height: 20px">
+ <td style="height: 2px"></td>
+ </tr>
+ </tbody>
+ </table>
+
+</main>
+
+<style>
+ table { margin-bottom: 10px; width: 50px; }
+ td { outline: 1px solid red; outline-offset: -1px; }
+</style>
+<script>
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ "Checking intermediate min-content height for span 2 (1)",
+ document.getElementById('one').offsetHeight,
+ 17
+ ],
+ [
+ "Checking intermediate min-content height for span 2 (2)",
+ document.getElementById('two').offsetHeight,
+ 10
+ ],
+ [
+ "Checking intermediate min-content height for span 2 (3)",
+ document.getElementById('three').offsetHeight,
+ 17
+ ],
+ [
+ "Checking intermediate min-content height for span 2 (4)",
+ document.getElementById('four').offsetHeight,
+ 17
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-table-width-0.html b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-table-width-0.html
new file mode 100644
index 00000000000..49bae4b4f79
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-table-width-0.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width" />
+<main>
+ <h1>Width Distribution</h1>
+ <h4>"Computing the table width"</h4>
+ <p>This is testing that the table root's minimum is max(table-root width, capmin, gridmin) <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec Text</a></p>
+
+ <hr/>
+ <x-table id="one" style="width: 50px; height: 100px; border: 2px solid black;">
+ <x-caption><span style="display: inline-block; height: 100px; width: 100px; background: blue;"></x-caption>
+ <x-tr>
+ <x-td></x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ // TEST ONE
+ "Width is 100px due to 100px content size of caption",
+ document.getElementById('one').offsetWidth,
+ 100
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-table-width-1.html b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-table-width-1.html
new file mode 100644
index 00000000000..d735568a123
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/computing-table-width-1.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width" />
+
+<style>
+ x-table span {
+ display: inline-block;
+ background: green;
+ height: 100px;
+ }
+</style>
+<main>
+ <h1>Width Distribution</h1>
+ <h4>"Computing the table width"</h4>
+ <p>This is testing that the table root's width when the TABLEROOT width is auto <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec Text</a></p>
+ <x-table id="one">
+ <x-caption>
+ <span style="width: 100px; background: blue;"></span>
+ </x-caption>
+ <x-tr>
+ <x-td>
+ <span style="width: 100px;"></span>
+ </x-td>
+ <x-td>
+ <span style="width: 200px"></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ 'The box should be 300px since that is the size of the content',
+ document.getElementById('one').offsetWidth,
+ 300
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-1.html b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-1.html
new file mode 100644
index 00000000000..83357d71252
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-1.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
+
+<style>
+ x-table span {
+ display: inline-block;
+ background: green;
+ height: 100px;
+ }
+</style>
+<main>
+ <h1>Width Distribution</h1>
+ <h4>"Distribution Algorithm"</h4>
+ <p>Tests the first step that all cells get their min content guess which is that
+ of their min content
+ <a href="https://drafts.csswg.org/css-tables-3/#width-distribution">Spec Text</a>
+ </p>
+ <x-table id="one">
+ <x-tr>
+ <x-td id="two">
+ <span style="width: 100px;"></span>
+ </x-td>
+ <x-td id="three">
+ <span style="width: 200px"></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ 'The box should be 300px since that is the size of the content',
+ document.getElementById('one').offsetWidth,
+ 300
+ ],
+ [
+ 'The first cell is 100px wide due to its content\'s size',
+ document.getElementById('two').offsetWidth,
+ 100
+ ],
+ [
+ 'The first cell is 200px wide due to its content\'s size',
+ document.getElementById('three').offsetWidth,
+ 200
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-2.html b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-2.html
new file mode 100644
index 00000000000..83357d71252
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-2.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
+
+<style>
+ x-table span {
+ display: inline-block;
+ background: green;
+ height: 100px;
+ }
+</style>
+<main>
+ <h1>Width Distribution</h1>
+ <h4>"Distribution Algorithm"</h4>
+ <p>Tests the first step that all cells get their min content guess which is that
+ of their min content
+ <a href="https://drafts.csswg.org/css-tables-3/#width-distribution">Spec Text</a>
+ </p>
+ <x-table id="one">
+ <x-tr>
+ <x-td id="two">
+ <span style="width: 100px;"></span>
+ </x-td>
+ <x-td id="three">
+ <span style="width: 200px"></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ 'The box should be 300px since that is the size of the content',
+ document.getElementById('one').offsetWidth,
+ 300
+ ],
+ [
+ 'The first cell is 100px wide due to its content\'s size',
+ document.getElementById('two').offsetWidth,
+ 100
+ ],
+ [
+ 'The first cell is 200px wide due to its content\'s size',
+ document.getElementById('three').offsetWidth,
+ 200
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-guess.html b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-guess.html
new file mode 100644
index 00000000000..8ff39dd3949
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-guess.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
+
+<style>
+ x-table span {
+ display: inline-block;
+ background: green;
+ height: 100px;
+ }
+</style>
+<main>
+ <h1>Width Distribution</h1>
+ <h4>"Distribution Algorithm - min-content guess"</h4>
+ <p>Tests the first step that all cells get their min content guess which is that
+ of their min content
+ <a href="https://drafts.csswg.org/css-tables-3/#width-distribution-algorithm">Spec Text</a>
+ </p>
+ <x-table id="one">
+ <x-tr>
+ <x-td id="two">
+ <span style="width: 100px;"></span>
+ </x-td>
+ <x-td id="three">
+ <span style="width: 200px"></span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ 'The box should be 300px since that is the size of the content',
+ document.getElementById('one').offsetWidth,
+ 300
+ ],
+ [
+ 'The first cell is 100px wide due to its content\'s size',
+ document.getElementById('two').offsetWidth,
+ 100
+ ],
+ [
+ 'The first cell is 200px wide due to its content\'s size',
+ document.getElementById('three').offsetWidth,
+ 200
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-percent-guess.html b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-percent-guess.html
new file mode 100644
index 00000000000..0541e8b0dfd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-percent-guess.html
@@ -0,0 +1,64 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
+
+<style>
+ x-td {
+ background: blue;
+ }
+
+ x-table span {
+ display: inline-block;
+ background: green;
+ height: 100px;
+ }
+</style>
+<main>
+ <h1>Width Distribution</h1>
+ <h4>"Distribution Algorithm - min-content-percent guess"</h4>
+ <p>Tests that the size of the column is given the max(%width, min-content width)
+ <a href="https://drafts.csswg.org/css-tables-3/#width-distribution-algorithm">Spec Text</a>
+ </p>
+ <x-table id="one" style="width: 400px;">
+ <x-tr>
+ <x-td id="two" style="width: 50%">
+ <span style="width: 100%">Cell 1</span>
+ </x-td>
+ <x-td id="three">
+ <span style="width: 100%">Cell 2</span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ 'The box should be 400px since that is the size of the content',
+ document.getElementById('one').offsetWidth,
+ 400
+ ],
+ [
+ 'The first cell is 200px due to its 50% specified width is greater than ',
+ document.getElementById('two').offsetWidth,
+ 200
+ ],
+ [
+ 'The second cell is 200px due to the 50% set on the first cell and the second gets distributed the remaining space since its auto',
+ document.getElementById('three').offsetWidth,
+ 200
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.1.html b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.1.html
new file mode 100644
index 00000000000..f0def87f113
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.1.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
+
+<style>
+ x-td {
+ background: blue;
+ }
+
+ x-table span {
+ display: inline-block;
+ background: green;
+ height: 50px;
+ }
+</style>
+<main>
+ <h1>Width Distribution</h1>
+ <h4>"Distribution Algorithm - min-content-specified guess"</h4>
+ <p>Tests that the size of the column as the spec states that if the cell is constrained then the
+ <a href="https://drafts.csswg.org/css-tables-3/#width-distribution-algorithm">Spec Text</a>
+ </p>
+ <x-table style="width: 50px; border: 1px solid black;">
+ <x-tr>
+ <x-td id="one" style="width: 50%;">
+ <span style="width: 75px;">Cell 2</span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ 'The box should be 75px due to its min-content size.',
+ document.getElementById('one').offsetWidth,
+ 75
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.html b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.html
new file mode 100644
index 00000000000..a74c37005d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<link rel='stylesheet' href='../support/base.css' />
+
+<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
+<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
+
+<style>
+ x-td {
+ background: blue;
+ }
+
+ x-table span {
+ display: inline-block;
+ background: green;
+ height: 50px;
+ }
+</style>
+<main>
+ <h1>Width Distribution</h1>
+ <h4>"Distribution Algorithm - min-content-specified guess"</h4>
+ <p>Tests that the size of the column as the spec states that if the cell is constrained then the
+ <a href="https://drafts.csswg.org/css-tables-3/#width-distribution-algorithm">Spec Text</a>
+ </p>
+ <x-table style="width: 50px; border: 1px solid black;">
+ <x-tr>
+ <x-td id="one" style="width: 100px;">
+ <span style="width: 75px;">Cell 2</span>
+ </x-td>
+ </x-tr>
+ </x-table>
+</main>
+
+<script>
+ while(true) {
+ var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
+ var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
+ xtd.parentNode.replaceChild(td,xtd);
+ }
+
+ var i = 1;
+ generate_tests(assert_equals, [
+ [
+ 'The box should be 75px due to its min-content size.',
+ document.getElementById('one').offsetWidth,
+ 75
+ ]
+ ]);
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/i18n/OWNERS b/tests/wpt/web-platform-tests/css/css-text-3/i18n/OWNERS
new file mode 100644
index 00000000000..30ef550185b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/i18n/OWNERS
@@ -0,0 +1 @@
+@r12a
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-break/line-break-anywhere-001.html b/tests/wpt/web-platform-tests/css/css-text-3/line-break/line-break-anywhere-001.html
new file mode 100644
index 00000000000..8c8252eb563
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-break/line-break-anywhere-001.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang=en>
+<meta charset="utf-8">
+<title>CSS Text Test: line-break: anywhere</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
+<link rel="match" href="reference/line-break-anywhere-001-ref.html">
+<meta name="flags" content="">
+<meta name="assert" content="line-break:anywhere puts a soft wrap opportunity around every typographic character unit,
+ including around punctuation or in the middle of words,
+ disregarding any prohibition against line breaks introduced by characters with the GL, JW, or ZJW character class.">
+<style>
+#green {
+ position: absolute;
+ background: green;
+ font-family: monospace;
+ width: 1ch;
+ height: 20em;
+}
+#test {
+ width: 1ch;
+ line-height: 1;
+ color: red;
+ font-family: monospace;
+ line-break: anywhere;
+}
+</style>
+
+<p>Test passes if there is a green rectangle below and no red.</p>
+<div id=green></div>
+<!-- with line breaks everywhere, none of the following characters should stick out from under the green div -->
+<div id=test>aa-a.a)a,a)a&nbsp;a&#xfeff;a&#x2060;a&#x200d;a・a</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-break/line-break-anywhere-002.html b/tests/wpt/web-platform-tests/css/css-text-3/line-break/line-break-anywhere-002.html
new file mode 100644
index 00000000000..79d9daba1cc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-break/line-break-anywhere-002.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang=en>
+<meta charset="utf-8">
+<title>CSS Text Test: line-break: anywhere</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-line-break-anywhere">
+<link rel="match" href="reference/line-break-anywhere-001-ref.html">
+<meta name="flags" content="">
+<meta name="assert" content="line-break:anywhere puts a soft wrap opportunity betwwen letters in the middle of words and hyphenation is not applied.">
+<style>
+#green {
+ position: absolute;
+ background: green;
+ font-family: monospace;
+ width: 1ch;
+ height: 20em;
+}
+#test {
+ width: 1ch;
+ line-height: 1;
+ color: red;
+ font-family: monospace;
+ line-break: anywhere;
+ hyphens: auto;
+}
+</style>
+
+<p>Test passes if there is a green rectangle below and no red.</p>
+<div id=green></div>
+<!-- Hyphenation, if it occurs, will produce a hyphen that sticks out from under the green rectangle.
+ Also, if the words fails to be wrapped between all letters, letters will also stick out from under the green rectangle -->
+<div id=test>no hyphenation</div>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-break/reference/line-break-anywhere-001-ref.html b/tests/wpt/web-platform-tests/css/css-text-3/line-break/reference/line-break-anywhere-001-ref.html
new file mode 100644
index 00000000000..ff74b3bce2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-break/reference/line-break-anywhere-001-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang=en>
+<meta charset="utf-8">
+<title>CSS Text Test Reference</title>
+<link rel="author" title="Florian Rivoal" href="https://florian.rivoal.net/">
+<style>
+#green {
+ position: absolute;
+ background: green;
+ font-family: monospace;
+ width: 1ch;
+ height: 20em;
+}
+</style>
+
+<p>Test passes if there is a green rectangle below and no red.</p>
+<div id=green></div>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-001.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-001.html
index fda6cb82c7f..20b32786fb4 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-001.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-001.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking around Zero With Space</title>
<meta name=assert content="When ‘white-space’ allows wrapping, line breaking behavior defined for the ZW line-breaking classes in [UAX14] must be honored.">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-002.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-002.html
index a6d41c9dfec..807711bb0e6 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-002.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-002.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking sanity check</title>
<meta name=assert content="sanity check: an unstyled span should not affect line breaking">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-003.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-003.html
index 67a3194f59c..48a8a691025 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-003.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-003.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking sanity check 2</title>
<meta name=assert content="sanity check: an unstyled span should not affect line breaking">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-004.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-004.html
index 3ec5169287b..b00b40d4620 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-004.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-004.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking sanity check 3</title>
<meta name=assert content="sanity check: an unstyled span should not affect line breaking">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-005.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-005.html
index 7a86618782a..e3e02421f62 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-005.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-005.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking sanity check 4</title>
<meta name=assert content="sanity check: an unstyled span should not affect line breaking">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-006.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-006.html
index c3bb8c0ab8e..240e739a861 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-006.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-006.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking sanity check 5</title>
<meta name=assert content="sanity check: an unstyled span should not affect line breaking">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-007.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-007.html
index a5b877678c3..83ac0eb48c7 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-007.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-007.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking sanity check 6</title>
<meta name=assert content="sanity check: an unstyled span should not affect line breaking">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-008.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-008.html
index 5cc482d6463..2f1c589004d 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-008.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-008.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking sanity check 7</title>
<meta name=assert content="sanity check: an unstyled span should not affect line breaking">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-009.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-009.html
index 98071e36429..37a81b30d60 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-009.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-009.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking at element boundary</title>
<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking.">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-010.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-010.html
index 93195f38ce0..c1f4d21a252 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-010.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-010.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking at element boundary 2</title>
<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking.">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-011.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-011.html
index 43912b35e05..f32b86ecbd9 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-011.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-011.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking at element boundary 3</title>
<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking.">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-001-ref.html">
+<link rel=match href="reference/line-breaking-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-001.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-001.html
index f6444caa44d..6cfe6f86a45 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-001.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-001.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking at element boundary with ideographic caracters 1</title>
<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking.">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-ic-001-ref.html">
+<link rel=match href="reference/line-breaking-ic-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-002.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-002.html
index 2e2f3ff31e5..dc8851e5cf2 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-002.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-002.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking at element boundary with ideographic caracters 2</title>
<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking.">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-ic-001-ref.html">
+<link rel=match href="reference/line-breaking-ic-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-003.html b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-003.html
index 29f3a80601f..09dc11dd1d2 100644
--- a/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-003.html
+++ b/tests/wpt/web-platform-tests/css/css-text-3/line-breaking/line-breaking-ic-003.html
@@ -4,7 +4,7 @@
<title>CSS Text — line breaking at element boundary with ideographic caracters 1</title>
<meta name=assert content="For soft wrap opportunities defined by the boundary between two characters, the properties on nearest common ancestor of the two characters controls breaking.">
<link rel=help href="https://www.w3.org/TR/css-text-3/#line-break-details">
-<link rel=match href="references/line-breaking-ic-001-ref.html">
+<link rel=match href="reference/line-breaking-ic-001-ref.html">
<link rel=author title="Florian Rivoal" href="http://florian.rivoal.net">
<style>
div {
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-001.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-001.html
new file mode 100644
index 00000000000..6a1893fd3e3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-001.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap is not wrapped</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-002.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-002.html
new file mode 100644
index 00000000000..891527fe37b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-002.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on word-break:break-all</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if word-break is break-all">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ word-break: break-all;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-003.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-003.html
new file mode 100644
index 00000000000..56d30802a71
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-003.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on word-break:keep-all</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if word-break is keep-all.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ word-break: keep-all;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-004.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-004.html
new file mode 100644
index 00000000000..b4b3b459783
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-004.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on line-break:loose</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if line-break is loose.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ line-break: loose;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-005.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-005.html
new file mode 100644
index 00000000000..bf04625c7c5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-005.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on line-break:normal</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if line-break is normal.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ line-break: normal;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-006.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-006.html
new file mode 100644
index 00000000000..8802c30732c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-006.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on line-break:strict</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if line-break is strict.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ line-break: strict;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-007.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-007.html
new file mode 100644
index 00000000000..29b356c13d3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-007.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on overflow-wrap:break-word</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if overflow-wrap is break-word.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ word-wrap: break-word; /* deprecated alias */
+ overflow-wrap: break-word;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-008.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-008.html
new file mode 100644
index 00000000000..61ccaae34e0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-008.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap is wrapped when overflow-wrap is break-spaces</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-overflow-wrap-break-spaces">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is wrapped when the white-space property is set to pre-wrap and overflow-wrap is break-spaces.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 1ch 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ overflow-wrap: break-spaces;
+ margin-left: -1ch;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div> XX XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-009.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-009.html
new file mode 100644
index 00000000000..2aa8cd2d982
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-009.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: single preserved white space at the end of with white-space:pre-wrap overflow-wrap:break-spaces</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-overflow-wrap-break-spaces">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="a single preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap and overflow-wrap is break-spaces.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 2ch;
+ overflow-wrap: break-spaces;
+}
+
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-010.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-010.html
new file mode 100644
index 00000000000..90f20055427
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-010.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: single preserved white space at the end of with white-space:pre-wrap overflow-wrap:break-spaces break-word</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#overflow-wrap-property">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="a single preserved white space at the end of the line is wrapped when the white-space property is set to pre-wrap and overflow-wrap is break-spaces break-word.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 1ch 0/2ch 2ch no-repeat;
+
+ width: 3ch;
+ overflow-wrap: break-spaces break-word;
+ margin-left: -1ch;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div> XX XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-011.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-011.html
new file mode 100644
index 00000000000..6659e324bc5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-011.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not cause wrapping</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#overflow-wrap-property">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="When the white-space property is set to pre-wrap, preserved white space at the end of the line must hang or be collapsed, and must not cause preceeding content to be wrapped.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 1ch 0/2ch 2ch no-repeat;
+
+ width: 3ch;
+ margin-left: -1ch;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div> XX&#x20;
+ XX </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-012.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-012.html
new file mode 100644
index 00000000000..d96be79c3e3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-012.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap with right alignement</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="When white-space is pre-wrap, only spaces that overflow the line get collapsed or hanged, the ones that fit have an effect when right-aligning.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 3ch;
+ text-align: right;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX&#x20;
+XX </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-013.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-013.html
new file mode 100644
index 00000000000..6e3b6db6626
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-013.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap with center alignement</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="When white-space is pre-wrap, only spaces that overflow the line get collapsed or hanged, the ones that fit have an effect when centering.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 3ch;
+ text-align: center;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX&#x20;
+XX </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-014.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-014.html
new file mode 100644
index 00000000000..2275201f864
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/pre-wrap-014.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap with justification</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/pre-wrap-001-ref.html">
+<meta name="assert" content="When white-space is pre-wrap, only spaces that overflow the line get collapsed or hanged, the ones that fit have an effect when justifying.">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 3ch;
+ text-align: justify;
+ text-justify: inter-character;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>X&#8203;X&#x20;
+X&#8203;X </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/reference/pre-wrap-001-ref.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/reference/pre-wrap-001-ref.html
new file mode 100644
index 00000000000..21fe887aede
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/reference/pre-wrap-001-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test reference file</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<style>
+div {
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ color: green;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <div>XX<br>XX</div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html
new file mode 100644
index 00000000000..8951c3db4bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/reference/textarea-pre-wrap-001-ref.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test reference file</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<!-- pre-wrap-001-ref.html could probably be used instead,
+but since textarea is a form control that's not fully specified,
+using a separate reference just in case something is indeed different
+is safer. -->
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ color: green;
+ white-space: pre;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX
+XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-001.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-001.html
new file mode 100644
index 00000000000..2c41682fd17
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-001.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap is not wrapped in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap in a textarea">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-002.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-002.html
new file mode 100644
index 00000000000..bd411d9f1ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-002.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on word-break:break-all in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if word-break is break-all in a textarea">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ word-break: break-all;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-003.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-003.html
new file mode 100644
index 00000000000..81f7a5aa800
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-003.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on word-break:keep-all in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if word-break is keep-all in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ word-break: keep-all;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-004.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-004.html
new file mode 100644
index 00000000000..c29ceed221a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-004.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on line-break:loose in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if line-break is loose in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ line-break: loose;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-005.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-005.html
new file mode 100644
index 00000000000..8137ac64214
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-005.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on line-break:normal in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if line-break is normal in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ line-break: normal;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-006.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-006.html
new file mode 100644
index 00000000000..b06947c8a71
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-006.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on line-break:strict in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if line-break is strict in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ line-break: strict;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-007.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-007.html
new file mode 100644
index 00000000000..c6785707589
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-007.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not change based on overflow-wrap:break-word in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap, even if overflow-wrap is break-word in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ word-wrap: break-word; /* deprecated alias */
+ overflow-wrap: break-word;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-008.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-008.html
new file mode 100644
index 00000000000..1361bf19866
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-008.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap is wrapped when overflow-wrap is break-spaces in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-overflow-wrap-break-spaces">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="preserved white space at the end of the line is wrapped when the white-space property is set to pre-wrap and overflow-wrap is break-spaces in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 1ch 0/2ch 2ch no-repeat;
+
+ width: 4ch;
+ overflow-wrap: break-spaces;
+ margin-left: -1ch;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea> XX XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-009.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-009.html
new file mode 100644
index 00000000000..cecaadb0b37
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-009.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: single preserved white space at the end of with white-space:pre-wrap overflow-wrap:break-spaces in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-overflow-wrap-break-spaces">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="a single preserved white space at the end of the line is not wrapped when the white-space property is set to pre-wrap and overflow-wrap is break-spaces in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 2ch;
+ overflow-wrap: break-spaces;
+}
+
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-010.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-010.html
new file mode 100644
index 00000000000..7d41fee8c6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-010.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: single preserved white space at the end of with white-space:pre-wrap overflow-wrap:break-spaces break-word in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#overflow-wrap-property">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="a single preserved white space at the end of the line is wrapped when the white-space property is set to pre-wrap and overflow-wrap is break-spaces break-word in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 1ch 0/2ch 2ch no-repeat;
+
+ width: 3ch;
+ overflow-wrap: break-spaces break-word;
+ margin-left: -1ch;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea> XX XX</textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-011.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-011.html
new file mode 100644
index 00000000000..96d121f0aab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-011.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap does not cause wrapping in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#overflow-wrap-property">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="When the white-space property is set to pre-wrap, preserved white space at the end of the line must hang or be collapsed, and must not cause preceeding content to be wrapped in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 1ch 0/2ch 2ch no-repeat;
+
+ width: 3ch;
+ margin-left: -1ch;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea> XX&#x20;
+ XX </textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-012.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-012.html
new file mode 100644
index 00000000000..85fcfee41fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-012.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap with right alignement in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="When white-space is pre-wrap, only spaces that overflow the line get collapsed or hanged, the ones that fit have an effect when right-aligning in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 3ch;
+ text-align: right;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX&#x20;
+XX </textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-013.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-013.html
new file mode 100644
index 00000000000..fd3b26b1da0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-013.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap with center alignement in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="When white-space is pre-wrap, only spaces that overflow the line get collapsed or hanged, the ones that fit have an effect when centering in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 3ch;
+ text-align: center;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>XX&#x20;
+XX </textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-014.html b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-014.html
new file mode 100644
index 00000000000..881fffe173d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-text-3/white-space/textarea-pre-wrap-014.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text level 3 Test: preserved white space at the end of and white-space:pre-wrap with justification in a textarea</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#white-space-phase-2">
+<link rel="match" href="reference/textarea-pre-wrap-001-ref.html">
+<meta name="assert" content="When white-space is pre-wrap, only spaces that overflow the line get collapsed or hanged, the ones that fit have an effect when justifying in a textarea.">
+<style>
+textarea {
+ word-wrap: initial; /*deprecated alias*/
+ overflow-wrap: initial;
+ line-break: initial;
+ word-break: initial;
+ margin: 0;
+ padding: 0;
+ border: none;
+ outline: none;
+ resize: none;
+ overflow: hidden; /* I don't want scrollbars, and overflow:visible isn't typically supported on textarea */
+
+ font-size: 20px;
+ font-family: ahem;
+ line-height: 1em;
+ white-space: pre-wrap;
+ color: green;
+
+ background: linear-gradient(red, red) 0 0/2ch 2ch no-repeat;
+
+ width: 3ch;
+ text-align: justify;
+ text-justify: inter-character;
+}
+</style>
+<body>
+ <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+ <textarea>X&#8203;X&#x20;
+X&#8203;X </textarea>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms-2/animation/resources/interpolation-testcommon.js b/tests/wpt/web-platform-tests/css/css-transforms-2/animation/resources/interpolation-testcommon.js
new file mode 100644
index 00000000000..5ab5551152e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms-2/animation/resources/interpolation-testcommon.js
@@ -0,0 +1,54 @@
+'use strict';
+function test_interpolation(settings, expectations) {
+ // Returns a timing function that at 0.5 evaluates to progress.
+ function timingFunction(progress) {
+ if (progress === 0)
+ return 'steps(1, end)';
+ if (progress === 1)
+ return 'steps(1, start)';
+ var y = (8 * progress - 1) / 6;
+ return 'cubic-bezier(0, ' + y + ', 1, ' + y + ')';
+ }
+
+ test(function(){
+ assert_true(CSS.supports(settings.property, settings.from), 'Value "' + settings.from + '" is supported by ' + settings.property);
+ assert_true(CSS.supports(settings.property, settings.to), 'Value "' + settings.to + '" is supported by ' + settings.property);
+ }, '"' + settings.from + '" and "' + settings.to + '" are valid ' + settings.property + ' values');
+
+ for (var i = 0; i < expectations.length; ++i) {
+ var progress = expectations[i].at;
+ var expectation = expectations[i].expect;
+ var animationId = 'anim' + i;
+ var targetId = 'target' + i;
+ var referenceId = 'reference' + i;
+
+ test(function(){
+ assert_true(CSS.supports(settings.property, expectation), 'Value "' + expectation + '" is supported by ' + settings.property);
+
+ var stylesheet = document.createElement('style');
+ stylesheet.textContent =
+ '#' + targetId + ' {\n' +
+ ' animation: 2s ' + timingFunction(progress) + ' -1s paused ' + animationId + ';\n' +
+ '}\n' +
+ '@keyframes ' + animationId + ' {\n' +
+ ' 0% { ' + settings.property + ': ' + settings.from + '; }\n' +
+ ' 100% { ' + settings.property + ': ' + settings.to + '; }\n' +
+ '}\n' +
+ '#' + referenceId + ' {\n' +
+ ' ' + settings.property + ': ' + expectation + ';\n' +
+ '}\n';
+ document.head.appendChild(stylesheet);
+
+ var target = document.createElement('div');
+ target.id = targetId;
+ document.body.appendChild(target);
+
+ var reference = document.createElement('div');
+ reference.id = referenceId;
+ document.body.appendChild(reference);
+ reference.style = '';
+
+ assert_equals(getComputedStyle(target)[settings.property], getComputedStyle(reference)[settings.property]);
+ }, 'Animation between "' + settings.from + '" and "' + settings.to + '" at progress ' + progress);
+ }
+}
diff --git a/tests/wpt/web-platform-tests/css/css-transforms-2/animation/rotate-interpolation.html b/tests/wpt/web-platform-tests/css/css-transforms-2/animation/rotate-interpolation.html
new file mode 100644
index 00000000000..ec96ba0b09b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms-2/animation/rotate-interpolation.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>rotate interpolation</title>
+ <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+ <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-rotate">
+ <meta name="assert" content="rotate supports animation.">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/interpolation-testcommon.js"></script>
+ </head>
+ <body>
+ <script>
+ test_interpolation({
+ property: 'rotate',
+ from: '100deg',
+ to: '180deg',
+ }, [
+ {at: -1, expect: '20deg'},
+ {at: 0, expect: '100deg'},
+ {at: 0.125, expect: '110deg'},
+ {at: 0.875, expect: '170deg'},
+ {at: 1, expect: '180deg'},
+ {at: 2, expect: '260deg'}
+ ]);
+
+ test_interpolation({
+ property: 'rotate',
+ from: '45deg',
+ to: '-1 1 0 60deg',
+ }, [
+ {at: -1, expect: '0.447214 -0.447214 0.774597 104.478deg'},
+ {at: 0, expect: '45deg'},
+ {at: 0.125, expect: '-0.136456 0.136456 0.981203 40.6037deg'},
+ {at: 0.875, expect: '-0.70246 0.70246 0.114452 53.1994deg'},
+ {at: 1, expect: '-1 1 0 60deg'},
+ {at: 2, expect: '-0.637897 0.637897 -0.431479 124.975deg'}
+ ]);
+
+ test_interpolation({
+ property: 'rotate',
+ from: 'none',
+ to: '7 -8 9 400grad',
+ }, [
+ {at: -1, expect: '7 -8 9 -400grad'},
+ {at: 0, expect: 'none'},
+ {at: 0.125, expect: '7 -8 9 50grad'},
+ {at: 0.875, expect: '7 -8 9 350grad'},
+ {at: 1, expect: '7 -8 9 400grad'},
+ {at: 2, expect: '7 -8 9 800grad'}
+ ]);
+
+ test_interpolation({
+ property: 'rotate',
+ from: 'none',
+ to: 'none',
+ }, [
+ {at: -1, expect: 'none'},
+ {at: 0, expect: 'none'},
+ {at: 0.125, expect: 'none'},
+ {at: 0.875, expect: 'none'},
+ {at: 1, expect: 'none'},
+ {at: 2, expect: 'none'}
+ ]);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms-2/animation/scale-interpolation.html b/tests/wpt/web-platform-tests/css/css-transforms-2/animation/scale-interpolation.html
new file mode 100644
index 00000000000..da25d3afb7c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms-2/animation/scale-interpolation.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>scale interpolation</title>
+ <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+ <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-scale">
+ <meta name="assert" content="scale supports animation.">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/interpolation-testcommon.js"></script>
+ </head>
+ <body>
+ <script>
+ test_interpolation({
+ property: 'scale',
+ from: '2 30 400',
+ to: '10 110 1200',
+ }, [
+ {at: -1, expect: '-6 -50 -400'},
+ {at: 0, expect: '2 30 400'},
+ {at: 0.125, expect: '3 40 500'},
+ {at: 0.875, expect: '9 100 1100'},
+ {at: 1, expect: '10 110 1200'},
+ {at: 2, expect: '18 190 2000'}
+ ]);
+
+ test_interpolation({
+ property: 'scale',
+ from: '26 17 9',
+ to: '2',
+ }, [
+ {at: -1, expect: '50 33 17'},
+ {at: 0, expect: '26 17 9'},
+ {at: 0.125, expect: '23 15 8'},
+ {at: 0.875, expect: '5 3 2'},
+ {at: 1, expect: '2'},
+ {at: 2, expect: '-22 -15 -7'}
+ ]);
+
+ test_interpolation({
+ property: 'scale',
+ from: 'none',
+ to: '4 3 2',
+ }, [
+ {at: -1, expect: '-2 -1 0'},
+ {at: 0, expect: 'none'},
+ {at: 0.125, expect: '1.375 1.25 1.125'},
+ {at: 0.875, expect: '3.625 2.75 1.875'},
+ {at: 1, expect: '4 3 2'},
+ {at: 2, expect: '7 5 3'}
+ ]);
+
+ test_interpolation({
+ property: 'scale',
+ from: 'none',
+ to: 'none',
+ }, [
+ {at: -1, expect: 'none'},
+ {at: 0, expect: 'none'},
+ {at: 0.125, expect: 'none'},
+ {at: 0.875, expect: 'none'},
+ {at: 1, expect: 'none'},
+ {at: 2, expect: 'none'}
+ ]);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms-2/animation/translate-interpolation.html b/tests/wpt/web-platform-tests/css/css-transforms-2/animation/translate-interpolation.html
new file mode 100644
index 00000000000..d5d47f733ef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms-2/animation/translate-interpolation.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>translate interpolation</title>
+ <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+ <link rel="help" href="https://drafts.csswg.org/css-transforms-2/#propdef-translate">
+ <meta name="assert" content="translate supports <length> and <percentage> animation.">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/interpolation-testcommon.js"></script>
+ <style>
+ body {
+ width: 500px;
+ height: 500px;
+ }
+ div {
+ width: 10px;
+ height: 10px;
+ }
+ </style>
+ </head>
+ <body>
+ <script>
+ test_interpolation({
+ property: 'translate',
+ from: '220px 240px 260px',
+ to: '300px 400px 500px',
+ }, [
+ {at: -1, expect: '140px 80px 20px'},
+ {at: 0, expect: '220px 240px 260px'},
+ {at: 0.125, expect: '230px 260px 290px'},
+ {at: 0.875, expect: '290px 380px 470px'},
+ {at: 1, expect: '300px 400px 500px'},
+ {at: 2, expect: '380px 560px 740px'}
+ ]);
+
+ test_interpolation({
+ property: 'translate',
+ from: '480px 400px 320px',
+ to: '240% 160%',
+ }, [
+ {at: -1, expect: 'calc(960px - 240%) calc(800px - 160%) 640px'},
+ {at: 0, expect: '480px 400px 320px'},
+ {at: 0.125, expect: 'calc(420px + 30%) calc(350px + 20%) 280px'},
+ {at: 0.875, expect: 'calc(210% + 60px) calc(140% + 50px) 40px'},
+ {at: 1, expect: '240% 160%'},
+ {at: 2, expect: 'calc(480% - 480px) calc(320% - 400px) -320px'}
+ ]);
+
+ test_interpolation({
+ property: 'translate',
+ from: 'none',
+ to: '8px 80% 800px',
+ }, [
+ {at: -1, expect: '-8px -80% -800px'},
+ {at: 0, expect: 'none'},
+ {at: 0.125, expect: '1px 10% 100px'},
+ {at: 0.875, expect: '7px 70% 700px'},
+ {at: 1, expect: '8px 80% 800px'},
+ {at: 2, expect: '16px 160% 1600px'}
+ ]);
+
+ test_interpolation({
+ property: 'translate',
+ from: 'none',
+ to: 'none',
+ }, [
+ {at: -1, expect: 'none'},
+ {at: 0, expect: 'none'},
+ {at: 0.125, expect: 'none'},
+ {at: 0.875, expect: 'none'},
+ {at: 1, expect: 'none'},
+ {at: 2, expect: 'none'}
+ ]);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transforms-2/transforms-support-calc.html b/tests/wpt/web-platform-tests/css/css-transforms-2/transforms-support-calc.html
new file mode 100644
index 00000000000..19bacd96261
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-transforms-2/transforms-support-calc.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Transform Module Level 2: calc values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.csswg.org/css-transforms-2/">
+<link rel="help" href="https://drafts.csswg.org/css-values-3/#calc-notation">
+<meta name="assert" content="calc values are supported in css-transforms properties.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #container {
+ width: 600px;
+ height: 500px;
+ transform-style: preserve-3d;
+ }
+ #target {
+ width: 300px;
+ height: 200px;
+ font-size: 20px;
+ }
+</style>
+</head>
+<body>
+<div id="container">
+ <div id="target"></div>
+</div>
+<script>
+'use strict';
+
+test(function(){
+ target.style = 'translate: calc(30px + 20%) calc(-200px + 100%);';
+ assert_equals(getComputedStyle(target).translate, '90px 0px');
+}, 'translate supports calc');
+
+test(function(){
+ target.style = 'rotate: calc(1turn - 100grad);';
+ assert_equals(getComputedStyle(target).rotate, '270deg');
+}, 'rotate supports calc');
+
+test(function(){
+ target.style = 'scale: calc(5 + 2) calc(5 - 2) calc(5 * 2);';
+ assert_equals(getComputedStyle(target).scale, '7 3 10');
+}, 'scale supports calc');
+
+test(function(){
+ target.style = 'perspective: calc(100px - 3em);';
+ assert_equals(getComputedStyle(target).perspective, '40px');
+}, 'perspective supports calc');
+
+test(function(){
+ target.style = 'perspective-origin: calc(30px + 20%) calc(-200px + 100%);';
+ assert_equals(getComputedStyle(target).perspectiveOrigin, '90px 0px');
+}, 'perspective-origin supports calc');
+
+test(function(){
+ target.style = 'transform: translate(calc(30px + 20%), calc(-200px + 100%)) rotate(calc(1turn - 400grad)) scale(calc(5 + 2), calc(5 - 2));';
+ assert_equals(getComputedStyle(target).transform, 'matrix(7, 0, 0, 3, 90, 0)');
+}, 'transform supports calc');
+
+test(function(){
+ target.style = 'transform-origin: calc(30px + 20%) calc(-200px + 100%);';
+ assert_equals(getComputedStyle(target).transformOrigin, '90px 0px');
+}, 'transform-origin supports calc');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transitions-1/events-001.html b/tests/wpt/web-platform-tests/css/css-transitions-1/events-001.html
index 013c36b7710..59d2011b397 100644
--- a/tests/wpt/web-platform-tests/css/css-transitions-1/events-001.html
+++ b/tests/wpt/web-platform-tests/css/css-transitions-1/events-001.html
@@ -1,210 +1,150 @@
-<!DOCTYPE html>
+<!doctype html>
<html>
- <head>
- <meta charset="utf-8">
- <title>CSS Transitions Test: transitionend event for shorthand property</title>
- <meta name="assert" content="Test checks that all transitionend events are triggered for shorthand property">
- <link rel="help" title="2.1. The 'transition-property' Property" href="http://www.w3.org/TR/css3-transitions/#transition-property-property">
- <link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
- <link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js" type="text/javascript"></script>
- <script src="/resources/testharnessreport.js" type="text/javascript"></script>
-
- <script src="./support/vendorPrefix.js" type="text/javascript"></script>
- <script src="./support/helper.js" type="text/javascript"></script>
- <script src="./support/runParallelAsyncHarness.js" type="text/javascript"></script>
- <script src="./support/generalParallelTest.js" type="text/javascript"></script>
- <script src="./support/properties.js" type="text/javascript"></script>
-
- <style type="text/css">
- #offscreen {
- position: absolute;
- top: -100000px;
- left: -100000px;
- width: 100000px;
- height: 100000px;
- }
- </style>
-
- <script id="metadata_cache">/*
- {
- "transition:all, changing padding-left / events": {},
- "transition:all, changing padding / events": {},
- "transition:all, changing padding but not padding-bottom / events": {},
- "transition:padding, changing padding-left / events": {},
- "transition:padding, changing padding / events": {},
- "transition:padding, changing padding but not padding-bottom / events": {},
- "transition:padding-left, changing padding-left / events": {},
- "transition:padding-left, changing padding / events": {},
- "transition:padding-left, changing padding but not padding-bottom / events": {}
- }
- */</script>
- </head>
- <body>
- <!-- required by testharnessreport.js -->
- <div id="log"></div>
- <!-- elements used for testing -->
- <div id="fixture" class="fixture">
- <div class="container">
- <div class="transition">Text sample</div>
- </div>
- </div>
- <div id="offscreen"></div>
-
- <!--
- SEE ./support/README.md for an abstract explanation of the test procedure
- http://test.csswg.org/source/contributors/rodneyrehm/submitted/css3-transitions/README.md
- -->
-
- <script>
- // For the keyword ‘all’, or if one of the identifiers listed is a shorthand property, implementations must
- // start transitions for any of its longhand sub-properties that are animatable (or, for ‘all’, all animatable
- // properties), using the duration, delay, and timing function at the index corresponding to the shorthand.
-
- // this test takes its time, give it a minute to run
- var timeout = 60000;
- setup({timeout: timeout});
-
- var tests = [
- {
- name: "transition:all, changing padding-left",
- transitions: 'all .1s linear .01s',
- from: {'padding-left': '1px'},
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:0.1s'
- ]
- }, {
- name: "transition:all, changing padding",
- transitions: 'all .1s linear .01s',
- from: {'padding': '1px'},
- to: {'padding': '10px'},
- expect: [
- 'padding-top:0.1s',
- 'padding-right:0.1s',
- 'padding-bottom:0.1s',
- 'padding-left:0.1s'
- ]
- }, {
- name: "transition:all, changing padding but not padding-bottom",
- transitions: 'all .1s linear .01s',
- from: {'padding': '1px 1px 1px 1px'},
- to: {'padding': '10px 10px 1px 10px'},
- expect: [
- 'padding-top:0.1s',
- 'padding-right:0.1s',
- 'padding-left:0.1s'
- ]
- }, {
- name: "transition:padding, changing padding-left",
- transitions: 'padding .1s linear .01s',
- from: {'padding-left': '1px'},
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:0.1s'
- ]
- }, {
- name: "transition:padding, changing padding",
- transitions: 'padding .1s linear .01s',
- from: {'padding': '1px'},
- to: {'padding': '10px'},
- expect: [
- 'padding-top:0.1s',
- 'padding-right:0.1s',
- 'padding-bottom:0.1s',
- 'padding-left:0.1s'
- ]
- }, {
- name: "transition:padding, changing padding but not padding-bottom",
- transitions: 'padding .1s linear .01s',
- from: {'padding': '1px 1px 1px 1px'},
- to: {'padding': '10px 10px 1px 10px'},
- expect: [
- 'padding-top:0.1s',
- 'padding-right:0.1s',
- 'padding-left:0.1s'
- ]
- }, {
- name: "transition:padding-left, changing padding-left",
- transitions: 'padding-left .1s linear .01s',
- from: {'padding-left': '1px'},
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:0.1s'
- ]
- }, {
- name: "transition:padding-left, changing padding",
- transitions: 'padding-left .1s linear .01s',
- from: {'padding': '1px'},
- to: {'padding': '10px'},
- expect: [
- 'padding-left:0.1s'
- ]
- }, {
- name: "transition:padding-left, changing padding but not padding-bottom",
- transitions: 'padding-left .1s linear .01s',
- from: {'padding': '1px 1px 1px 1px'},
- to: {'padding': '10px 10px 1px 10px'},
- expect: [
- 'padding-left:0.1s'
- ]
- }
- ];
-
- // general transition-duration
- var duration = '0.5s';
-
- runParallelAsyncHarness({
- // array of test data
- tests: tests,
- // the number of tests to run in parallel
- testsPerSlice: 50,
- // milliseconds to wait before calling teardown and ending test
- duration: parseFloat(duration) * 1000,
- // the global suite timeout
- timeout: timeout,
- // prepare individual test
- setup: function(data, options) {
- var styles = {
- '.fixture': {},
-
- '.container': {},
- '.container.to': {},
- '.container.how': {},
-
- '.transition': data.from,
- '.transition.to' : data.to,
- '.transition.how' : {transition: data.transitions}
- };
-
- generalParallelTest.setup(data, options);
- generalParallelTest.addStyles(data, options, styles);
- },
- // cleanup after individual test
- teardown: generalParallelTest.teardown,
- // invoked prior to running a slice of tests
- sliceStart: generalParallelTest.sliceStart,
- // invoked after running a slice of tests
- sliceDone: generalParallelTest.sliceDone,
- // test cases, make them as granular as possible
- cases: {
- // test TransitionEnd events
- 'events': {
- start: function(test, data, options) {
- // kick off the transition
- generalParallelTest.startTransition(data);
- },
- done: function(test, data, options) {
- // make sure we got the event for the tested property only
- test.step(generalParallelTest.assertExpectedEventsFunc(data, 'transition', data.expect));
- }
- }
- },
- // called once all tests are done
- done: generalParallelTest.done
- });
- </script>
- </body>
+<head>
+<meta charset=utf-8>
+<title>CSS Transitions Test: transitionend event for shorthand property</title>
+<meta name="assert" content="This test checks that all transitionend events are triggered for shorthand property">
+<link rel="help" href="http://www.w3.org/TR/css3-transitions/#transition-property-property">
+<link rel="help" href="http://www.w3.org/TR/css3-transitions/#transition-events">
+<link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js"></script>
+
+</head>
+<body>
+
+<script>
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: all .01s linear; ' +
+ 'padding-left: 1px' });
+ getComputedStyle(div).paddingLeft;
+ div.style.paddingLeft = '10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.01);
+ });
+}, 'transition:all changing padding-left');
+
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: all .01s linear; ' +
+ 'padding: 1px' });
+ getComputedStyle(div).paddingLeft;
+ div.style.padding = '10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for(Array(4).fill('transitionend'),
+ { record: 'all' }).then(evts => {
+ assert_end_event_batch_equal(evts,
+ [ 'padding-bottom',
+ 'padding-left',
+ 'padding-right',
+ 'padding-top' ],
+ 0.01);
+ });
+}, 'transition:all changing padding');
+
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: all .01s linear; ' +
+ 'padding: 1px' });
+ getComputedStyle(div).paddingLeft;
+ div.style.padding = '10px 10px 1px 10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for(Array(3).fill('transitionend'),
+ { record: 'all' }).then(evts => {
+ assert_end_event_batch_equal(evts,
+ [ 'padding-left',
+ 'padding-right',
+ 'padding-top' ],
+ 0.01);
+ });
+}, 'transition:all changing padding but not padding-bottom');
+
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: padding .01s linear; ' +
+ 'padding-left: 1px' });
+ getComputedStyle(div).paddingLeft;
+ div.style.paddingLeft = '10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.01);
+ });
+}, 'transition:padding changing padding-left');
+
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: padding .01s linear; ' +
+ 'padding: 1px' });
+ getComputedStyle(div).paddingLeft;
+ div.style.padding = '10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for(Array(4).fill('transitionend'),
+ { record: 'all' }).then(evts => {
+ assert_end_event_batch_equal(evts,
+ [ 'padding-bottom',
+ 'padding-left',
+ 'padding-right',
+ 'padding-top' ],
+ 0.01);
+ });
+}, 'transition:padding changing padding');
+
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: padding .01s linear; ' +
+ 'padding: 1px' });
+ getComputedStyle(div).paddingLeft;
+ div.style.padding = '10px 10px 1px 10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for(Array(3).fill('transitionend'),
+ { record: 'all' }).then(evts => {
+ assert_end_event_batch_equal(evts,
+ [ 'padding-left',
+ 'padding-right',
+ 'padding-top' ],
+ 0.01);
+ });
+}, 'transition:padding changing padding but not padding-bottom');
+
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: padding-left .01s linear; ' +
+ 'padding-left: 1px' });
+ getComputedStyle(div).paddingLeft;
+ div.style.paddingLeft = '10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.01);
+ });
+}, 'transition:padding-left changing padding-left');
+
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: padding-left .01s linear; ' +
+ 'padding: 1px' });
+ getComputedStyle(div).paddingLeft;
+ div.style.padding = '10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.01);
+ });
+}, 'transition:padding-left changing padding');
+
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: padding-left .01s linear; ' +
+ 'padding: 1px' });
+ getComputedStyle(div).paddingLeft;
+ div.style.padding = '10px 10px 1px 10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.01);
+ });
+}, 'transition:padding-left changing padding but not padding-bottom');
+</script>
+</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transitions-1/events-002.html b/tests/wpt/web-platform-tests/css/css-transitions-1/events-002.html
index ca0bd89522c..3ec2cc3da47 100644
--- a/tests/wpt/web-platform-tests/css/css-transitions-1/events-002.html
+++ b/tests/wpt/web-platform-tests/css/css-transitions-1/events-002.html
@@ -1,136 +1,49 @@
-<!DOCTYPE html>
+<!doctype html>
<html>
- <head>
- <meta charset="utf-8">
- <title>CSS Transitions Test: transitionend event for implied property value</title>
- <meta name="assert" content="Test checks that all transitionend events are triggered for implied property value">
- <link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
- <link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js" type="text/javascript"></script>
- <script src="/resources/testharnessreport.js" type="text/javascript"></script>
-
- <script src="./support/vendorPrefix.js" type="text/javascript"></script>
- <script src="./support/helper.js" type="text/javascript"></script>
- <script src="./support/runParallelAsyncHarness.js" type="text/javascript"></script>
- <script src="./support/generalParallelTest.js" type="text/javascript"></script>
- <script src="./support/properties.js" type="text/javascript"></script>
-
- <style type="text/css">
- #offscreen {
- position: absolute;
- top: -100000px;
- left: -100000px;
- width: 100000px;
- height: 100000px;
- }
- </style>
-
- <script id="metadata_cache">/*
- {
- "transitions:all, changing padding-left from nothing / events": {},
- "transitions:all, changing padding from nothing / events": {}
- }
- */</script>
- </head>
- <body>
- <!-- required by testharnessreport.js -->
- <div id="log"></div>
- <!-- elements used for testing -->
- <div id="fixture" class="fixture">
- <div class="container">
- <div class="transition">Text sample</div>
- </div>
- </div>
- <div id="offscreen"></div>
-
- <!--
- SEE ./support/README.md for an abstract explanation of the test procedure
- http://test.csswg.org/source/contributors/rodneyrehm/submitted/css3-transitions/README.md
- -->
-
- <script>
-
- // this test takes its time, give it a minute to run
- var timeout = 60000;
- setup({timeout: timeout});
-
- var tests = [
- {
- name: "transitions:all, changing padding-left from nothing",
- transitions: 'all .1s linear .01s',
- from: {}, // no padding === padding:0;
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:0.1s'
- ]
- }, {
- name: "transitions:all, changing padding from nothing",
- transitions: 'all .1s linear .01s',
- from: {}, // no padding === padding:0;
- to: {'padding': '10px'},
- expect: [
- 'padding-top:0.1s',
- 'padding-right:0.1s',
- 'padding-bottom:0.1s',
- 'padding-left:0.1s'
- ]
- }
- ];
-
- // general transition-duration
- var duration = '0.5s';
-
- runParallelAsyncHarness({
- // array of test data
- tests: tests,
- // the number of tests to run in parallel
- testsPerSlice: 50,
- // milliseconds to wait before calling teardown and ending test
- duration: parseFloat(duration) * 1000,
- // the global suite timeout
- timeout: timeout,
- // prepare individual test
- setup: function(data, options) {
- var styles = {
- '.fixture': {},
-
- '.container': {},
- '.container.to': {},
- '.container.how': {},
-
- '.transition': data.from,
- '.transition.to' : data.to,
- '.transition.how' : {transition: data.transitions}
- };
-
- generalParallelTest.setup(data, options);
- generalParallelTest.addStyles(data, options, styles);
- },
- // cleanup after individual test
- teardown: generalParallelTest.teardown,
- // invoked prior to running a slice of tests
- sliceStart: generalParallelTest.sliceStart,
- // invoked after running a slice of tests
- sliceDone: generalParallelTest.sliceDone,
- // test cases, make them as granular as possible
- cases: {
- // test TransitionEnd events
- 'events': {
- start: function(test, data, options) {
- // kick off the transition
- generalParallelTest.startTransition(data);
- },
- done: function(test, data, options) {
- // make sure we got the event for the tested property only
- test.step(generalParallelTest.assertExpectedEventsFunc(data, 'transition', data.expect));
- }
- }
- },
- // called once all tests are done
- done: generalParallelTest.done
- });
- </script>
- </body>
+<head>
+<meta charset=utf-8>
+<title>CSS Transitions Test: transitionend event for implied property value</title>
+<meta name="assert" content="Test checks that all transitionend events are triggered for implied property value">
+<link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
+<link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
+
+<script src="/resources/testharness.js" type="text/javascript"></script>
+<script src="/resources/testharnessreport.js" type="text/javascript"></script>
+<script src="./support/helper.js" type="text/javascript"></script>
+
+</head>
+<body>
+
+<div id="log"></div>
+
+<script>
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: all .01s linear' });
+ getComputedStyle(div).paddingLeft;
+ div.style.paddingLeft = '10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.01);
+ });
+}, 'transition:all changing padding-left from nothing');
+
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: all .01s linear' });
+ getComputedStyle(div).paddingLeft;
+ div.style.padding = '10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for(Array(4).fill('transitionend'),
+ { record: 'all' }).then(evts => {
+ assert_end_event_batch_equal(evts,
+ [ 'padding-bottom',
+ 'padding-left',
+ 'padding-right',
+ 'padding-top' ],
+ 0.01);
+ });
+}, 'transition:all changing padding from nothing');
+</script>
+</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transitions-1/events-003.html b/tests/wpt/web-platform-tests/css/css-transitions-1/events-003.html
index edaef1166fd..2f8ac7f4244 100644
--- a/tests/wpt/web-platform-tests/css/css-transitions-1/events-003.html
+++ b/tests/wpt/web-platform-tests/css/css-transitions-1/events-003.html
@@ -1,143 +1,34 @@
-<!DOCTYPE html>
+<!doctype html>
<html>
- <head>
- <meta charset="utf-8">
- <title>CSS Transitions Test: transitionend event with negative delay</title>
- <meta name="assert" content="Test checks that transitionend event is triggered for duration time being canceled out by negative delay">
- <link rel="help" title="2.4. The 'transition-delay' Property" href="http://www.w3.org/TR/css3-transitions/#transition-delay-property">
- <link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
- <link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js" type="text/javascript"></script>
- <script src="/resources/testharnessreport.js" type="text/javascript"></script>
-
- <script src="./support/vendorPrefix.js" type="text/javascript"></script>
- <script src="./support/helper.js" type="text/javascript"></script>
- <script src="./support/runParallelAsyncHarness.js" type="text/javascript"></script>
- <script src="./support/generalParallelTest.js" type="text/javascript"></script>
- <script src="./support/properties.js" type="text/javascript"></script>
-
- <style type="text/css">
- #offscreen {
- position: absolute;
- top: -100000px;
- left: -100000px;
- width: 100000px;
- height: 100000px;
- }
- </style>
-
- <script id="metadata_cache">/*
- {
- "duration: 0.1s, delay: -0.05s / events": {},
- "duration: 0.1s, delay: -0.1s / events": {}
- }
- */</script>
- </head>
- <body>
- <!-- required by testharnessreport.js -->
- <div id="log"></div>
- <!-- elements used for testing -->
- <div id="fixture" class="fixture">
- <div class="container">
- <div class="transition">Text sample</div>
- </div>
- </div>
- <div id="offscreen"></div>
-
- <!--
- SEE ./support/README.md for an abstract explanation of the test procedure
- http://test.csswg.org/source/contributors/rodneyrehm/submitted/css3-transitions/README.md
- -->
-
- <script>
- // If the value for 'transition-delay' is a negative time offset then the transition will execute the moment the property
- // is changed, but will appear to have begun execution at the specified offset. That is, the transition will appear to
- // begin part-way through its play cycle. In the case where a transition has implied starting values and a negative
- // 'transition-delay', the starting values are taken from the moment the property is changed.
-
- // http://www.w3.org/TR/css3-transitions/#starting
- // Define the combined duration of the transition as the sum of max(‘transition-duration’, ‘0s’) and ‘transition-delay’.
- // When the combined duration is greater than ‘0s’, then a transition starts based on the values of ‘transition-duration’,
- // ‘transition-delay’, and ‘transition-timing-function’; in other cases transitions do not occur.
-
- // this test takes its time, give it a minute to run
- var timeout = 60000;
- setup({timeout: timeout});
-
- var tests = [
- {
- name: "duration: 0.1s, delay: -0.05s",
- transitions: 'all .1s linear -0.05s',
- from: {'padding-left': '1px'},
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:0.1s'
- ]
- }, {
- name: "duration: 0.1s, delay: -0.1s",
- transitions: 'all .1s linear -0.1s',
- from: {'padding-left': '1px'},
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:0.1s'
- ]
- }
- ];
-
- // general transition-duration
- var duration = '0.5s';
-
- runParallelAsyncHarness({
- // array of test data
- tests: tests,
- // the number of tests to run in parallel
- testsPerSlice: 50,
- // milliseconds to wait before calling teardown and ending test
- duration: parseFloat(duration) * 1000,
- // the global suite timeout
- timeout: timeout,
- // prepare individual test
- setup: function(data, options) {
- var styles = {
- '.fixture': {},
-
- '.container': {},
- '.container.to': {},
- '.container.how': {},
-
- '.transition': data.from,
- '.transition.to' : data.to,
- '.transition.how' : {transition: data.transitions}
- };
-
- generalParallelTest.setup(data, options);
- generalParallelTest.addStyles(data, options, styles);
- },
- // cleanup after individual test
- teardown: generalParallelTest.teardown,
- // invoked prior to running a slice of tests
- sliceStart: generalParallelTest.sliceStart,
- // invoked after running a slice of tests
- sliceDone: generalParallelTest.sliceDone,
- // test cases, make them as granular as possible
- cases: {
- // test TransitionEnd events
- 'events': {
- start: function(test, data, options) {
- // kick off the transition
- generalParallelTest.startTransition(data);
- },
- done: function(test, data, options) {
- // make sure we got the event for the tested property only
- test.step(generalParallelTest.assertExpectedEventsFunc(data, 'transition', data.expect));
- }
- }
- },
- // called once all tests are done
- done: generalParallelTest.done
- });
- </script>
- </body>
+<head>
+<meta charset=utf-8>
+<title>CSS Transitions Test: transitionend event with negative delay</title>
+<meta name="assert" content="Test checks that transitionend event is triggered for duration time being canceled out by negative delay">
+<link rel="help" title="2.4. The 'transition-delay' Property" href="http://www.w3.org/TR/css3-transitions/#transition-delay-property">
+<link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
+<link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
+
+<script src="/resources/testharness.js" type="text/javascript"></script>
+<script src="/resources/testharnessreport.js" type="text/javascript"></script>
+<script src="./support/helper.js" type="text/javascript"></script>
+
+</head>
+<body>
+
+<div id="log"></div>
+
+<script>
+promise_test(t => {
+ const div = addDiv(t, { style: 'transition: all .02s -.01s; ' +
+ 'padding-left: 1px' });
+ getComputedStyle(div).paddingLeft;
+ div.style.paddingLeft = '10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.02);
+ });
+}, 'duration: 0.02s, delay: -0.01s');
+</script>
+</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transitions-1/events-004.html b/tests/wpt/web-platform-tests/css/css-transitions-1/events-004.html
index 6ab35e21900..17195f40eb1 100644
--- a/tests/wpt/web-platform-tests/css/css-transitions-1/events-004.html
+++ b/tests/wpt/web-platform-tests/css/css-transitions-1/events-004.html
@@ -1,150 +1,61 @@
-<!DOCTYPE html>
+<!doctype html>
<html>
- <head>
- <meta charset="utf-8">
- <title>CSS Transitions Test: transitionend event with non matching lists</title>
- <meta name="assert" content="Test checks that non-matching lists are properly resolved">
- <link rel="help" title="2. Transitions - Example 3" href="http://www.w3.org/TR/css3-transitions/#list-matching">
- <link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
- <link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js" type="text/javascript"></script>
- <script src="/resources/testharnessreport.js" type="text/javascript"></script>
-
- <script src="./support/vendorPrefix.js" type="text/javascript"></script>
- <script src="./support/helper.js" type="text/javascript"></script>
- <script src="./support/runParallelAsyncHarness.js" type="text/javascript"></script>
- <script src="./support/generalParallelTest.js" type="text/javascript"></script>
- <script src="./support/properties.js" type="text/javascript"></script>
-
- <style type="text/css">
- #offscreen {
- position: absolute;
- top: -100000px;
- left: -100000px;
- width: 100000px;
- height: 100000px;
- }
- </style>
-
- <script id="metadata_cache">/*
- {
- "repeating lists / events": {},
- "truncating lists / events": {}
- }
- */</script>
- </head>
- <body>
- <!-- required by testharnessreport.js -->
- <div id="log"></div>
- <!-- elements used for testing -->
- <div id="fixture" class="fixture">
- <div class="container">
- <div class="transition">Text sample</div>
- </div>
- </div>
- <div id="offscreen"></div>
-
- <!--
- SEE ./support/README.md for an abstract explanation of the test procedure
- http://test.csswg.org/source/contributors/rodneyrehm/submitted/css3-transitions/README.md
- -->
-
- <script>
- // In the case where the lists of values in transition properties do not have the same length, the length of the
- // ‘transition-property’ list determines the number of items in each list examined when starting transitions.
- // The lists are matched up from the first value: excess values at the end are not used.
-
- // this test takes its time, give it a minute to run
- var timeout = 60000;
- setup({timeout: timeout});
-
- var tests = [
- {
- name: "repeating lists",
- from: {'padding': '1px'},
- to: {
- 'padding': '10px',
- 'transition-property': 'padding-top, padding-right, padding-bottom, padding-left',
- 'transition-duration': '0.1s, 0.05s',
- 'transition-timing-function': 'linear, ease-in',
- 'transition-delay': '0.01s, 0.02s',
- },
- expect: [
- 'padding-top:0.1s',
- 'padding-right:0.05s',
- 'padding-bottom:0.1s',
- 'padding-left:0.05s',
- ]
- }, {
- name: "truncating lists",
- from: {'padding': '1px'},
- to: {
- 'padding': '10px',
- 'transition-property': 'padding-top',
- 'transition-duration': '0.1s, 0.05s',
- 'transition-timing-function': 'linear, ease-in',
- 'transition-delay': '0.01s, 0.02s',
- },
- expect: [
- 'padding-top:0.1s'
- ]
- }
- ];
-
- // general transition-duration
- var duration = '0.5s';
-
- runParallelAsyncHarness({
- // array of test data
- tests: tests,
- // the number of tests to run in parallel
- testsPerSlice: 50,
- // milliseconds to wait before calling teardown and ending test
- duration: parseFloat(duration) * 1000,
- // the global suite timeout
- timeout: timeout,
- // prepare individual test
- setup: function(data, options) {
- var styles = {
- '.fixture': {},
-
- '.container': {},
- '.container.to': {},
- '.container.how': {},
-
- '.transition': data.from,
- '.transition.to' : data.to,
- '.transition.how' : {}
- };
-
- generalParallelTest.setup(data, options);
- generalParallelTest.addStyles(data, options, styles);
- },
- // cleanup after individual test
- teardown: generalParallelTest.teardown,
- // invoked prior to running a slice of tests
- sliceStart: generalParallelTest.sliceStart,
- // invoked after running a slice of tests
- sliceDone: generalParallelTest.sliceDone,
- // test cases, make them as granular as possible
- cases: {
- // test TransitionEnd events
- 'events': {
- start: function(test, data, options) {
- // kick off the transition
- generalParallelTest.startTransition(data);
- },
- done: function(test, data, options) {
- // make sure we got the event for the tested property only
- test.step(generalParallelTest.assertExpectedEventsFunc(data, 'transition', data.expect));
- }
- }
- },
- // called once all tests are done
- done: generalParallelTest.done
- });
- </script>
- </body>
+<head>
+<meta charset=utf-8>
+<title>CSS Transitions Test: transitionend event with non matching lists</title>
+<meta name="assert" content="Test checks that non-matching lists are properly resolved">
+<link rel="help" title="2. Transitions - Example 3" href="http://www.w3.org/TR/css3-transitions/#list-matching">
+<link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
+<link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
+
+<script src="/resources/testharness.js" type="text/javascript"></script>
+<script src="/resources/testharnessreport.js" type="text/javascript"></script>
+<script src="./support/helper.js" type="text/javascript"></script>
+
+</head>
+<body>
+
+<div id="log"></div>
+
+<script>
+promise_test(t => {
+ const div = addDiv(t, { style: 'padding: 1px' });
+ getComputedStyle(div).paddingLeft;
+
+ div.style.transitionProperty =
+ 'padding-top, padding-right, padding-bottom, padding-left';
+ div.style.transitionDuration = '0.02s, 0.01s';
+ div.style.transitionTimingFunction = 'linear, ease-in';
+ div.style.transitionDelay = '0.01s, 0.02s';
+ div.style.padding = '10px';
+
+ const watcher = new EventWatcher(t, div, ['transitionend']);
+ return watcher
+ .wait_for(Array(4).fill('transitionend'), { record: 'all' })
+ .then(evts => {
+ assert_end_event_batch_equal(
+ evts,
+ [ 'padding-top', 'padding-right', 'padding-bottom', 'padding-left' ],
+ [ 0.02, 0.01, 0.02, 0.01 ]
+ );
+ });
+}, 'repeating lists');
+
+promise_test(t => {
+ const div = addDiv(t, { style: 'padding: 1px' });
+ getComputedStyle(div).paddingLeft;
+
+ div.style.transitionProperty = 'padding-top';
+ div.style.transitionDuration = '0.02s, 0.01s';
+ div.style.transitionTimingFunction = 'linear, ease-in';
+ div.style.transitionDelay = '0.01s, 0.02s';
+ div.style.padding = '10px';
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-top', 0.02);
+ });
+}, 'truncating lists');
+</script>
+</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transitions-1/events-005.html b/tests/wpt/web-platform-tests/css/css-transitions-1/events-005.html
index 78c69d70436..48ba63ab2d8 100644
--- a/tests/wpt/web-platform-tests/css/css-transitions-1/events-005.html
+++ b/tests/wpt/web-platform-tests/css/css-transitions-1/events-005.html
@@ -1,146 +1,67 @@
-<!DOCTYPE html>
+<!doctype html>
<html>
- <head>
- <meta charset="utf-8">
- <title>CSS Transitions Test: transitionend event with property specificity</title>
- <meta name="assert" content="Test checks that property specificity is properly resolved">
- <link rel="help" title="2.1. The 'transition-property' Property" href="http://www.w3.org/TR/css3-transitions/#transition-property-property">
- <link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
- <link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
- <meta name="flags" content="dom">
+<head>
+<meta charset=utf-8>
+<title>CSS Transitions Test: transitionend event with property specificity</title>
+<meta name="assert" content="Test checks that property specificity is properly resolved">
+<link rel="help" title="2.1. The 'transition-property' Property" href="http://www.w3.org/TR/css3-transitions/#transition-property-property">
+<link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
+<link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
- <script src="/resources/testharness.js" type="text/javascript"></script>
- <script src="/resources/testharnessreport.js" type="text/javascript"></script>
+<script src="/resources/testharness.js" type="text/javascript"></script>
+<script src="/resources/testharnessreport.js" type="text/javascript"></script>
+<script src="./support/helper.js" type="text/javascript"></script>
- <script src="./support/vendorPrefix.js" type="text/javascript"></script>
- <script src="./support/helper.js" type="text/javascript"></script>
- <script src="./support/runParallelAsyncHarness.js" type="text/javascript"></script>
- <script src="./support/generalParallelTest.js" type="text/javascript"></script>
- <script src="./support/properties.js" type="text/javascript"></script>
+</head>
+<body>
- <style type="text/css">
- #offscreen {
- position: absolute;
- top: -100000px;
- left: -100000px;
- width: 100000px;
- height: 100000px;
- }
- </style>
+<div id="log"></div>
- <script id="metadata_cache">/*
- {
- "property repetition / events": {},
- "padding, padding-left / events": {},
- "padding-left, padding / events": {}
- }
- */</script>
- </head>
- <body>
- <!-- required by testharnessreport.js -->
- <div id="log"></div>
- <!-- elements used for testing -->
- <div id="fixture" class="fixture">
- <div class="container">
- <div class="transition">Text sample</div>
- </div>
- </div>
- <div id="offscreen"></div>
+<script>
+promise_test(t => {
+ const div = addDiv(t, {
+ style:
+ 'transition: padding-left .01s, padding-left .02s;' +
+ 'padding-left: 1px'
+ });
+ getComputedStyle(div).paddingLeft;
+ div.style.paddingLeft = '10px';
- <!--
- SEE ./support/README.md for an abstract explanation of the test procedure
- http://test.csswg.org/source/contributors/rodneyrehm/submitted/css3-transitions/README.md
- -->
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.02);
+ });
+}, 'property repetition');
- <script>
- // If a property is specified multiple times in the value of ‘transition-property’ (either on its own, via a shorthand that
- // contains it, or via the ‘all’ value), then the transition that starts uses the duration, delay, and timing function at
- // the index corresponding to the last item in the value of ‘transition-property’ that calls for animating that property.
+promise_test(t => {
+ const div = addDiv(t, {
+ style:
+ 'transition: padding .01s, padding-left .02s;' +
+ 'padding-left: 1px'
+ });
+ getComputedStyle(div).paddingLeft;
+ div.style.paddingLeft = '10px';
- // this test takes its time, give it a minute to run
- var timeout = 60000;
- setup({timeout: timeout});
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.02);
+ });
+}, 'padding, padding-left');
- var tests = [
- {
- name: "property repetition",
- transitions: 'padding-left .1s linear 0s, padding-left .15s linear 0s',
- from: {'padding-left': '1px'},
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:0.15s'
- ]
- }, {
- name: "padding, padding-left",
- transitions: 'padding .1s linear 0s, padding-left .15s linear 0s',
- from: {'padding-left': '1px'},
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:0.15s'
- ]
- }, {
- name: "padding-left, padding",
- transitions: 'padding-left .1s linear 0s, padding .15s linear 0s',
- from: {'padding-left': '1px'},
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:0.15s'
- ]
- }
- ];
+promise_test(t => {
+ const div = addDiv(t, {
+ style:
+ 'transition: padding-left .01s, padding .02s;' +
+ 'padding-left: 1px'
+ });
+ getComputedStyle(div).paddingLeft;
+ div.style.paddingLeft = '10px';
- // general transition-duration
- var duration = '0.5s';
-
- runParallelAsyncHarness({
- // array of test data
- tests: tests,
- // the number of tests to run in parallel
- testsPerSlice: 50,
- // milliseconds to wait before calling teardown and ending test
- duration: parseFloat(duration) * 1000,
- // the global suite timeout
- timeout: timeout,
- // prepare individual test
- setup: function(data, options) {
- var styles = {
- '.fixture': {},
-
- '.container': {},
- '.container.to': {},
- '.container.how': {},
-
- '.transition': data.from,
- '.transition.to' : data.to,
- '.transition.how' : {transition: data.transitions}
- };
-
- generalParallelTest.setup(data, options);
- generalParallelTest.addStyles(data, options, styles);
- },
- // cleanup after individual test
- teardown: generalParallelTest.teardown,
- // invoked prior to running a slice of tests
- sliceStart: generalParallelTest.sliceStart,
- // invoked after running a slice of tests
- sliceDone: generalParallelTest.sliceDone,
- // test cases, make them as granular as possible
- cases: {
- // test TransitionEnd events
- 'events': {
- start: function(test, data, options) {
- // kick off the transition
- generalParallelTest.startTransition(data);
- },
- done: function(test, data, options) {
- // make sure we got the event for the tested property only
- test.step(generalParallelTest.assertExpectedEventsFunc(data, 'transition', data.expect));
- }
- }
- },
- // called once all tests are done
- done: generalParallelTest.done
- });
- </script>
- </body>
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.02);
+ });
+}, 'padding-left, padding');
+</script>
+</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transitions-1/events-006.html b/tests/wpt/web-platform-tests/css/css-transitions-1/events-006.html
index ab3b88072c0..36412bcd9e1 100644
--- a/tests/wpt/web-platform-tests/css/css-transitions-1/events-006.html
+++ b/tests/wpt/web-platform-tests/css/css-transitions-1/events-006.html
@@ -1,135 +1,58 @@
-<!DOCTYPE html>
+<!doctype html>
<html>
- <head>
- <meta charset="utf-8">
- <title>CSS Transitions Test: transitionend event for pseudo elements</title>
- <meta name="assert" content="Test checks that TransitionEnd events are fired for pseudo-elements">
- <link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
- <link rel="help" title="CSS21 - 12.1 The :before and :after pseudo-elements" href="http://www.w3.org/TR/CSS21/generate.html#before-after-content">
- <link rel="help" title="CSS3 Generated and Replaced Content Module" href="http://www.w3.org/TR/css3-content/">
- <link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js" type="text/javascript"></script>
- <script src="/resources/testharnessreport.js" type="text/javascript"></script>
-
- <script src="./support/vendorPrefix.js" type="text/javascript"></script>
- <script src="./support/helper.js" type="text/javascript"></script>
- <script src="./support/runParallelAsyncHarness.js" type="text/javascript"></script>
- <script src="./support/generalParallelTest.js" type="text/javascript"></script>
- <script src="./support/properties.js" type="text/javascript"></script>
-
- <style type="text/css">
- #offscreen {
- position: absolute;
- top: -100000px;
- left: -100000px;
- width: 100000px;
- height: 100000px;
- }
- </style>
-
- <script id="metadata_cache">/*
- {
- "transition padding-left on :before / events": {},
- "transition padding-left on :after / events": {}
- }
- */</script>
- </head>
- <body>
- <!-- required by testharnessreport.js -->
- <div id="log"></div>
- <!-- elements used for testing -->
- <div id="fixture" class="fixture">
- <div class="container">
- <div class="transition">Text sample</div>
- </div>
- </div>
- <div id="offscreen"></div>
-
- <!--
- SEE ./support/README.md for an abstract explanation of the test procedure
- http://test.csswg.org/source/contributors/rodneyrehm/submitted/css3-transitions/README.md
- -->
-
- <script>
- // this is yet to be specified behavior
-
- // this test takes its time, give it a minute to run
- var timeout = 60000;
- setup({timeout: timeout});
-
- var tests = [
- {
- name: "transition padding-left on :before",
- pseudo: 'before',
- property: 'padding-left',
- flags: {},
- from: {'padding-left': '1px', 'content': '""'},
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:before:0.1s'
- ]
- }, {
- name: "transition padding-left on :after",
- pseudo: 'after',
- property: 'padding-left',
- flags: {},
- from: {'padding-left': '1px', 'content': '""'},
- to: {'padding-left': '10px'},
- expect: [
- 'padding-left:after:0.1s'
- ]
- }
- ];
-
- // general transition-duration
- var duration = '0.5s';
-
- runParallelAsyncHarness({
- // array of test data
- tests: tests,
- // the number of tests to run in parallel
- testsPerSlice: 50,
- // milliseconds to wait before calling teardown and ending test
- duration: parseFloat(duration) * 1000,
- // the global suite timeout
- timeout: timeout,
- // prepare individual test
- setup: function(data, options) {
- var styles = {};
- styles['.container'] = {};
- styles['.transition'] = {};
- styles['.transition:' + data.pseudo.name] = data.from;
- styles['.transition.how:' + data.pseudo.name] = {transition: 'all .1s linear 0s'};
- styles['.transition.to:' + data.pseudo.name] = data.to;
-
- generalParallelTest.setup(data, options);
- generalParallelTest.addStyles(data, options, styles);
- },
- // cleanup after individual test
- teardown: generalParallelTest.teardown,
- // invoked prior to running a slice of tests
- sliceStart: generalParallelTest.sliceStart,
- // invoked after running a slice of tests
- sliceDone: generalParallelTest.sliceDone,
- // test cases, make them as granular as possible
- cases: {
- // test TransitionEnd events
- 'events': {
- start: function(test, data, options) {
- // kick off the transition
- generalParallelTest.startTransition(data);
- },
- done: function(test, data, options) {
- // make sure we got the event for the tested property only
- test.step(generalParallelTest.assertExpectedEventsFunc(data, 'transition', data.expect));
- }
- }
- },
- // called once all tests are done
- done: generalParallelTest.done
- });
- </script>
- </body>
+<head>
+<meta charset=utf-8>
+<title>CSS Transitions Test: transitionend event for pseudo elements</title>
+<meta name="assert" content="Test checks that TransitionEnd events are fired for pseudo-elements">
+<link rel="help" title="5. Transition Events" href="http://www.w3.org/TR/css3-transitions/#transition-events">
+<link rel="help" title="CSS21 - 12.1 The :before and :after pseudo-elements" href="http://www.w3.org/TR/CSS21/generate.html#before-after-content">
+<link rel="help" title="CSS3 Generated and Replaced Content Module" href="http://www.w3.org/TR/css3-content/">
+<link rel="author" title="Rodney Rehm" href="http://rodneyrehm.de/en/">
+
+<script src="/resources/testharness.js" type="text/javascript"></script>
+<script src="/resources/testharnessreport.js" type="text/javascript"></script>
+<script src="./support/helper.js" type="text/javascript"></script>
+
+<style>
+.before::before,
+.after:after {
+ content: '';
+ transition: padding-left .01s;
+ padding-left: 1px;
+}
+.before.active::before,
+.after.active:after {
+ padding-left: 10px;
+}
+</style>
+
+</head>
+<body>
+
+<div id="log"></div>
+
+<script>
+promise_test(t => {
+ const div = addDiv(t, { 'class': 'before' });
+ getComputedStyle(div).paddingLeft;
+ div.classList.add('active');
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.01, '::before');
+ });
+}, 'transition padding-left on ::before');
+
+promise_test(t => {
+ const div = addDiv(t, { 'class': 'after' });
+ getComputedStyle(div).paddingLeft;
+ div.classList.add('active');
+
+ const watcher = new EventWatcher(t, div, [ 'transitionend' ]);
+ return watcher.wait_for('transitionend').then(evt => {
+ assert_end_events_equal(evt, 'padding-left', 0.01, '::after');
+ });
+}, 'transition padding-left on ::after');
+</script>
+</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transitions-1/events-007.html b/tests/wpt/web-platform-tests/css/css-transitions-1/events-007.html
index d75b0031290..610df6e85d0 100644
--- a/tests/wpt/web-platform-tests/css/css-transitions-1/events-007.html
+++ b/tests/wpt/web-platform-tests/css/css-transitions-1/events-007.html
@@ -1,64 +1,50 @@
<!DOCTYPE html>
<html>
<head>
- <meta charset="utf-8">
- <title>CSS Transitions Test: no transitionend event after display:none</title>
- <link rel="author" title="Chris Rebert" href="http://chrisrebert.com">
- <link rel="help" href="http://www.w3.org/TR/css3-transitions/#transition-events">
- <link rel="help" href="https://lists.w3.org/Archives/Public/www-style/2015Apr/0405.html" title="[CSSWG] Minutes Telecon 2015-04-29" data-section-title="AnimationEnd events and display: none">
- <meta name="flags" content="dom">
- <meta name="assert" content="Making an element display:none; while it has a transition in progress should prevent a transitionend event from getting fired.">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <style>
-#a {
- height: 100px;
- width: 100px;
- transition: background-color 2s;
-}
-.red {
- background-color: red;
-}
-.blue {
- background-color: blue;
-}
-.hidden {
- display: none !important;
-}
- </style>
- <script>
-async_test(function (t) {
- window.addEventListener('load', function () {
- var div = document.getElementById('a');
- var ended = false;
- var after = false;
- div.addEventListener('transitionend', function () {
- ended = true;
- t.step(function () {
- assert_false(true, "transitionend event didn't fire");
- });
- }, false);
+<meta charset="utf-8">
+<title>CSS Transitions Test: no transitionend event after display:none</title>
+<link rel="author" title="Chris Rebert" href="http://chrisrebert.com">
+<link rel="help" href="http://www.w3.org/TR/css3-transitions/#transition-events">
+<link rel="help" href="https://lists.w3.org/Archives/Public/www-style/2015Apr/0405.html" title="[CSSWG] Minutes Telecon 2015-04-29" data-section-title="AnimationEnd events and display: none">
+<meta name="assert" content="Making an element display:none; while it has a transition in progress should prevent a transitionend event from getting fired.">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js" type="text/javascript"></script>
- div.className = 'blue';// initiate transition
- window.setTimeout(function () {
- t.step(function () {
- assert_false(ended, "transitionend did not fire before hiding callback ran");
- assert_false(after, "hiding callback ran before the end of the test");
- });
- div.className += ' hidden';// force display:none during the transition
- }, 1000);// halfway into the transition
- window.setTimeout(function () {
- after = true;
- t.step(function () {
- assert_false(ended, "transitionend event didn't fire");
- t.done();
- });
- }, 2100);// after the transition would have ended
- }, false);
-}, "transitionend should not be fired if the element is made display:none during the transition");
- </script>
</head>
<body>
- <div id="a" class="red"></div>
+
+<div id="log"></div>
+
+<script>
+async_test(t => {
+ window.addEventListener('load', function () {
+ const div = addDiv(t, { 'style': 'transition: background-color 0.4s;' +
+ 'background-color: red' });
+ getComputedStyle(div).backgroundColor;
+ div.style.backgroundColor = 'blue';
+
+ // Wait until the transition has started before registering the event
+ // listener. That way, if the transition finishes before the
+ // requestAnimationFrame callback is called and the element is made
+ // display:none, we won't report an error if transitionend is dispatched.
+ //
+ // In that case, there will be no indication that the test didn't test
+ // anything. However, that's preferable to having this test fail
+ // intermittently on slower automation hardware and end up being disabled
+ // as a result.
+ requestAnimationFrame(t.step_func(() => {
+ div.addEventListener('transitionend', t.step_func(() => {
+ assert_unreached('transitionend event didn\'t fire');
+ }), false);
+
+ div.style.display = 'none';
+
+ setTimeout(t.done.bind(t), 500);
+ }));
+ }, false);
+}, 'transitionend should not be fired if the element is made display:none during the transition');
+</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-transitions-1/support/helper.js b/tests/wpt/web-platform-tests/css/css-transitions-1/support/helper.js
index 805a1f24d6b..f11e4347abe 100644
--- a/tests/wpt/web-platform-tests/css/css-transitions-1/support/helper.js
+++ b/tests/wpt/web-platform-tests/css/css-transitions-1/support/helper.js
@@ -93,4 +93,107 @@ root.domFixture = function(selector) {
throw new Error('domFixture must be initialized first!');
}
};
+
+/*
+ * The recommended minimum precision to use for time values.
+ *
+ * Based on Web Animations:
+ * https://w3c.github.io/web-animations/#precision-of-time-values
+ */
+const TIME_PRECISION = 0.0005; // ms
+
+/*
+ * Allow implementations to substitute an alternative method for comparing
+ * times based on their precision requirements.
+ */
+root.assert_times_equal = function(actual, expected, description) {
+ assert_approx_equals(actual, expected, TIME_PRECISION, description);
+}
+
+/**
+ * Assert that CSSTransition event, |evt|, has the expected property values
+ * defined by |propertyName|, |elapsedTime|, and |pseudoElement|.
+ */
+root.assert_end_events_equal = function(evt, propertyName, elapsedTime,
+ pseudoElement = '') {
+ assert_equals(evt.propertyName, propertyName);
+ assert_times_equal(evt.elapsedTime, elapsedTime);
+ assert_equals(evt.pseudoElement, pseudoElement);
+}
+
+/**
+ * Assert that array of simultaneous CSSTransition events, |evts|, have the
+ * corresponding property names listed in |propertyNames|, and the expected
+ * |elapsedTimes| and |pseudoElement| members.
+ *
+ * |elapsedTimes| may be a single value if all events are expected to have the
+ * same elapsedTime, or an array parallel to |propertyNames|.
+ */
+root.assert_end_event_batch_equal = function(evts, propertyNames, elapsedTimes,
+ pseudoElement = '') {
+ assert_equals(
+ evts.length,
+ propertyNames.length,
+ 'Test harness error: should have waited for the correct number of events'
+ );
+ assert_true(
+ typeof elapsedTimes === 'number' ||
+ (Array.isArray(elapsedTimes) &&
+ elapsedTimes.length === propertyNames.length),
+ 'Test harness error: elapsedTimes must either be a number or an array of' +
+ ' numbers with the same length as propertyNames'
+ );
+
+ if (typeof elapsedTimes === 'number') {
+ elapsedTimes = Array(propertyNames.length).fill(elapsedTimes);
+ }
+ const testPairs = propertyNames.map((propertyName, index) => ({
+ propertyName,
+ elapsedTime: elapsedTimes[index]
+ }));
+
+ const sortByPropertyName = (a, b) =>
+ a.propertyName.localeCompare(b.propertyName);
+ evts.sort(sortByPropertyName);
+ testPairs.sort(sortByPropertyName);
+
+ for (let evt of evts) {
+ const expected = testPairs.shift();
+ assert_end_events_equal(
+ evt,
+ expected.propertyName,
+ expected.elapsedTime,
+ pseudoElement
+ );
+ }
+}
+
+/**
+ * Appends a div to the document body.
+ *
+ * @param t 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 attrs A dictionary object with attribute names and values to set on
+ * the div.
+ */
+root.addDiv = function(t, attrs) {
+ var div = document.createElement('div');
+ if (attrs) {
+ for (var attrName in attrs) {
+ div.setAttribute(attrName, attrs[attrName]);
+ }
+ }
+ document.body.appendChild(div);
+ if (t && typeof t.add_cleanup === 'function') {
+ t.add_cleanup(function() {
+ if (div.parentNode) {
+ div.remove();
+ }
+ });
+ }
+ return div;
+}
+
})(window);
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/box-sizing-026.html b/tests/wpt/web-platform-tests/css/css-ui-3/box-sizing-026.html
index a3ee653385f..424b764acaf 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/box-sizing-026.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/box-sizing-026.html
@@ -4,7 +4,6 @@
<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
<link rel="help" href="https://drafts.csswg.org/css-ui-3/#box-sizing">
<meta name="flags" content="">
-<link rel="match" href="reference/box-sizing-001-ref.html">
<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
<meta name="assert" content="Floor width and height computation to 0 as they cannot be negative.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/caret-color-020.html b/tests/wpt/web-platform-tests/css/css-ui-3/caret-color-020.html
index 4e80c2f1d1f..742c4a1f958 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/caret-color-020.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/caret-color-020.html
@@ -33,7 +33,14 @@
var player = textarea.animate(keyframes, options);
player.pause();
player.currentTime = 5;
- assert_equals(getComputedStyle(textarea).caretColor, 'rgb(128, 128, 128)');
+ var rgb = getComputedStyle(textarea).caretColor.match(/\d+/g);
+ /* Only testing that the rgb value is some intermediary value,
+ but not checking which, as we only care that the value is interpolated,
+ not about the numerical accuracy of interpolation,
+ which is something tests for the animation spec ought to worry about. */
+ assert_true( rgb[0] < 255 && rgb[0] > 0, "the red channel is interpolated");
+ assert_true( rgb[1] < 255 && rgb[1] > 0, "the green channel is interpolated");
+ assert_true( rgb[2] < 255 && rgb[2] > 0, "the blue channel is interpolated");
}, "caret-color: currentcolor is interpolable");
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/cursor-auto-005.html b/tests/wpt/web-platform-tests/css/css-ui-3/cursor-auto-005.html
index 40c466ba205..ad11863b598 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/cursor-auto-005.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/cursor-auto-005.html
@@ -2,7 +2,7 @@
<title>CSS Basic User Interface Test: cursor:auto on form elements</title>
<link rel="author" title="Florian Rivoal" href="mailto:florian@rivoal.net">
<link rel="help" href="http://www.w3.org/TR/css3-ui/#cursor">
-<meta name="flags" content="interact may">
+<meta name="flags" content="interact">
<meta charset="UTF-8">
<meta name="assert" content="The 'auto' cursor value does the same as 'default' over everything other than text, such as form elements.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/cursor-image-005-nfs.html b/tests/wpt/web-platform-tests/css/css-ui-3/cursor-image-005-nfs.html
index 6b841967088..e7396d212d5 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/cursor-image-005-nfs.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/cursor-image-005-nfs.html
@@ -4,7 +4,7 @@
<link rel="reviewer" title="Florian Rivoal" href="http://florian.rivoal.net/"> <!-- 2015-04-12 -->
<link rel="help" href="http://www.w3.org/TR/css3-ui/#cursor">
<link rel="help" href="http://www.w3.org/TR/css3-images/#default-object-size">
-<meta name="flags" content="interact svg">
+<meta name="flags" content="interact svg may">
<meta charset="UTF-8">
<meta name="assert" content="Test checks that an SVG image with no fixed size is supported as a custom cursor at the default object size for cursor images.">
<style>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-001.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-001.html
deleted file mode 100644
index bdc9c54ea31..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-001.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - property inheritance</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'nav-left' property value is not inherited.">
-<style>
- #parent {
- nav-left: #finish;
- }
- #intermediate {
- nav-left: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent"><a href="">ignore</a> <a href="" id="intermediate">ignore</a> <a href="">START</a> <a href="" id="finish">ignore</a></div>
-
- <div><a href="">ignore</a> <a href="" id="end">FINISH</a></div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-002.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-002.html
deleted file mode 100644
index bc4b7296827..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-002.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'inherit' property value</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'inherit' value is respected.">
-<style>
- #parent {
- nav-left: #finish;
- }
- #start {
- nav-left: inherit;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
-
- <div id="parent"><a href="">ignore</a> <a href="" id="start">START</a> <a href="" id="finish">FINISH</a></div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-003.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-003.html
deleted file mode 100644
index 3a58889bf42..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-003.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - input elements</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that directional focus navigation properties work on input elements.">
-<style>
- #start {
- nav-left: #finish;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the text input containing "START" below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" input.</p>
-
- <div><input value="ignore"> <input value="START" id="start"> <input value="ignore"></div>
-
- <div><input value="ignore"> <input value="ignore"> <input value="ignore"></div>
-
- <div><input value="ignore"> <input value="FINISH" id="finish"> <input value="ignore"></div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-004.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-004.html
deleted file mode 100644
index d3ea69f07ae..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-004.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - floating elements</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that directional focus navigation properties work on floating elements.">
-<style>
- #container > div {
- clear: left;
- }
- #container > div > a {
- float: left;
- margin-right: 1ex;
- }
- #start {
- nav-left: #finish;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" input.</p>
-
- <div id="container">
- <div><a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a></div>
-
- <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
-
- <div><a href="">ignore</a> <a href="" id="finish">FINISH</a> <a href="">ignore</a></div>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-005.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-005.html
deleted file mode 100644
index b4c624f4d0a..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-005.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - currently focused element</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that focus doesn't change when navigating to the currently focused element.">
-<style>
- #start {
- nav-left: #start;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if the "START" element remains focused when navigating left.</p>
-
- <div><a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a></div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-1.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-1.html
deleted file mode 100644
index 7d2b7607d52..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-1.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - unkown element id</title>
-<link rel="author" title="Florian Rivoal" href="mailto:florian@rivoal.net">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that an unknow element id used as the value of the 'nav-right' property value does not hinder normal spacial navigation.">
-<style>
-#start {
-nav-right: #foo;
-}
-</style>
-</head>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right moves the focus to the "FINISH" link.</p>
-
- <a href="" id="start">START</a> <a href="" id="finish">FINISH</a>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-2.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-2.html
deleted file mode 100644
index a4cd06215a5..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-2.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - unkown element id</title>
-<link rel="author" title="Florian Rivoal" href="mailto:florian@rivoal.net">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that an unknow element id used as the value of the 'nav-left' property value does not hinder normal spacial navigation.">
-<style>
-#start {
-nav-left: #foo;
-}
-</style>
-</head>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left moves the focus to the "FINISH" link.</p>
-
- <a href="" id="finish">FINISH</a> <a href="" id="start">START</a>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-3.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-3.html
deleted file mode 100644
index ea424c1d96d..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-3.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - unkown element id</title>
-<link rel="author" title="Florian Rivoal" href="mailto:florian@rivoal.net">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that an unknow element id used as the value of the 'nav-down' property value does not hinder normal spacial navigation.">
-<style>
-#start {
-nav-down: #foo;
-}
-</style>
-</head>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down moves the focus to the "FINISH" link.</p>
-
- <a href="" id="start">START</a><br>
- <a href="" id="finish">FINISH</a>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-4.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-4.html
deleted file mode 100644
index 25d2552ee64..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-missing-4.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - unkown element id</title>
-<link rel="author" title="Florian Rivoal" href="mailto:florian@rivoal.net">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that an unknow element id used as the value of the 'nav-up' property value does not hinder normal spacial navigation.">
-<style>
-#start {
-nav-up: #foo;
-}
-</style>
-</head>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up moves the focus to the "FINISH" link.</p>
-
- <a href="" id="finish">FINISH</a><br>
- <a href="" id="start">START</a>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-001.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-001.html
deleted file mode 100644
index 866f0dc5c84..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-001.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'current' target frame</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'current' frame value is respected.">
-<style>
- #start {
- nav-down: #finish current;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="finish">FINISH</a></p>
-
- <p><a href="" id="start">START</a></p>
-
- <iframe src="support/nav-dir-target-001-frame.html"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-002.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-002.html
deleted file mode 100644
index 75f3b0f7635..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-002.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'root' target frame</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'root' frame value is respected.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="finish">FINISH</a></p>
-
- <iframe src="support/nav-dir-target-002-frame.html"></iframe>
-
- <p><a href="">ignore</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-003.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-003.html
deleted file mode 100644
index 931e80b972f..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-003.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - named target frame</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a named target frame value is respected.">
-<style>
- #start {
- nav-right: #finish "frame";
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="start">START</a> <a href="" id="finish">ignore</a></p>
-
- <iframe src="support/nav-dir-target-003-frame.html" name="frame"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-004.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-004.html
deleted file mode 100644
index 27b14c47bdf..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-004.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - non-existing target frame</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a non-existing target frame value is treated as 'current'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="finish">ignore</a></p>
-
- <iframe src="support/nav-dir-target-004-frame.html"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-005.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-005.html
deleted file mode 100644
index 118d6bead74..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-005.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - sibling target frame</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a named frame value also works for sibling frames.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
-
- <iframe src="support/nav-dir-target-005-frame.html"></iframe>
- <iframe src="support/nav-dir-target-003-frame.html" name="sibling"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-006.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-006.html
deleted file mode 100644
index 2466ab29047..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-dir-target-006.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - missing target element</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that focus does not change to a different frame if the identifier is missing from the target frame.">
-<style>
- #start {
- nav-left: #finish current;
- }
- #intermediate {
- nav-left: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
-
- <p><a href="">ignore</a> <a href="" id="intermediate">ignore</a> <a href="" id="start">START</a></p>
-
- <iframe src="support/nav-dir-target-001-frame.html"></iframe>
-
- <p><a href="" id="end">FINISH</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-000.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-000.html
deleted file mode 100644
index 87d91a324f5..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-000.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - property inheritance for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'nav-down' property value is not inherited for 'nav-left'.">
-<style type="text/css">
- #parent {
- nav-down: #finish;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="">ignore</a></p>
- <p><a href="">START</a></p>
- <p><a href="" id="end">FINISH</a></p>
- <p><a href="" id="finish">ignore</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-001.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-001.html
deleted file mode 100644
index 0be34d5beaf..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-001.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation (nav-down) - &lt;id&gt;</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that downward navigation input respects the 'nav-down' property.">
-<style>
- #start {
- nav-down: #finish;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
-
- <div><a href="" id="finish">FINISH</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
-
- <div><a href="">ignore</a> <a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a> <a href="">ignore</a></div>
-
- <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-002.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-002.html
deleted file mode 100644
index b7ba2f3bc04..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-002.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'auto' value for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'auto' value is implemented for 'nav-down'.">
-<style type="text/css">
- #start {
- nav-down: #finish;
- nav-down: auto;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="">ignore</a></p>
- <p><a href="" id="start">START</a></p>
- <p><a href="" id="end">FINISH</a></p>
- <p><a href="" id="finish">ignore</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-003.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-003.html
deleted file mode 100644
index 88eb205e00b..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-003.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - ID value for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the ID value is implemented for 'nav-down'.">
-<style type="text/css">
- #parent {
- nav-down: #finish;
- }
-
- #intermediate {
- nav-down: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="">ignore</a></p>
- <p><a href="">START</a></p>
- <p><a href="" id="intermediate">ignore</a></p>
- <p><a href="">ignore</a></p>
- </div>
-
- <div>
- <p><a href="">ignore</a></p>
- <p><a href="" id="end">FINISH</a></p>
- <p><a href="">ignore</a></p>
- <p><a href="">ignore</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-004.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-004.html
deleted file mode 100644
index cc09e0b027a..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-004.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - input elements for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-down' works for input elements.">
-<style type="text/css">
- #parent {
- nav-down: #finish;
- }
-
- #intermediate {
- nav-down: #end;
- }
-
- input {
- display: block;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down twice moves the focus to the "FINISH" text field.</p>
-
- <div id="parent">
- <input value="ignore"/>
- <input value="START"/>
- <input value="ignore" id="intermediate"/>
- <input value="ignore"/>
- </div>
-
- <div>
- <input value="ignore"/>
- <input value="FINISH" id="end"/>
- <input value="ignore"/>
- <input value="ignore"/>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-005.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-005.html
deleted file mode 100644
index 034c73871dd..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-005.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in the writing direction for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-down' works for elements floating to the left.">
-<style type="text/css">
- div > a {
- float: left;
- margin-left: 1em;
- margin-right: 1em;
- }
-
- div {
- clear: left;
- }
-
- #parent {
- nav-down: #finish;
- }
-
- #intermediate {
- nav-down: #end;
- }
-
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore 1</a>
- <a href="">START</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore 3</a>
- </div>
-
- <div>
- <a href="">ignore 4</a>
- <a href="" id="intermediate">ignore 2</a>
- <a href="">ignore 5</a>
- <a href="">ignore 6</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-006.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-006.html
deleted file mode 100644
index 85abe2f4169..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-006.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in opposite to the writing direction for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-down' works for elements floating to the right.">
-<style type="text/css">
- div > a {
- float: right;
- margin-left: 1em;
- margin-right: 1em;
- }
-
- div {
- clear: right;
- }
-
- #parent {
- nav-down: #finish;
- }
-
- #intermediate {
- nav-down: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore 1</a>
- <a href="">ignore 2</a>
- <a href="">START</a>
- <a href="">ignore 3</a>
- </div>
-
- <div>
- <a href="">ignore 4</a>
- <a href="" id="end">FINISH</a>
- <a href="" id="intermediate">ignore 5</a>
- <a href="">ignore 6</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-007.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-007.html
deleted file mode 100644
index 0b71a92530a..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-007.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - non existing ID for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'nav-down' is ignored if the ID does not exist.">
-<style type="text/css">
- #parent {
- nav-down: #error;
- }
-
- #intermediate {
- nav-down: #foobar;
- }
-
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="">START</a></p>
- <p><a href="" id="intermediate">ignore</a></p>
- <p><a href="" id="end">FINISH</a>
- <p><a href="">ignore</a>
- </div>
-
- <div>
- <p><a href="">ignore</a>
- <p><a href="">ignore</a>
- <p><a href="" id="error">ignore</a>
- <p><a href="">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-008.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-008.html
deleted file mode 100644
index a5a2edc5482..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-008.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - currently focused element for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that focus doesn't change when navigating to the currently focused element for 'nav-down'.">
-<style>
- #start {
- nav-down: #start;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if the "START" element remains focused when navigating down.</p>
-
- <div>
- <p><a href="">ignore</a></p>
- <p><a href="" id="start">START</a></p>
- <p><a href="">ignore</a></p>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-009.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-009.html
deleted file mode 100644
index 2dc67e54093..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-009.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'current' target frame for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'current' frame value is respected for 'nav-down'.">
-<style>
- #start {
- nav-down: #finish current;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
-
- <div>
- <p><a href="" id="finish">FINISH</a></p>
- <iframe src="support/nav-down-009-frame.html"></iframe>
- <p><a href="" id="start">START</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-010.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-010.html
deleted file mode 100644
index e2d0881f88b..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-010.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'root' target frame for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'root' frame value is respected for 'nav-down'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="finish">FINISH</a></p>
-
- <iframe src="support/nav-down-010-frame.html"></iframe>
-
- <p><a href="">ignore</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-011.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-011.html
deleted file mode 100644
index 49c7172eac2..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-011.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - named target frame for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="contributor" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a named target frame value is respected for 'nav-down'.">
-<style>
- #start {
- nav-down: #finish "frame";
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
-
- <p>
- <a href="" id="start">START</a>
- </p>
- <p>
- <a href="" id="finish">ignore</a>
- </p>
-
- <iframe src="support/nav-down-011-frame.html" name="frame"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-012.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-012.html
deleted file mode 100644
index 315e5d19887..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-012.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - non-existing target frame for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a non-existing target frame value is treated as 'current' for 'nav-down'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
-
- <iframe src="support/nav-down-012-frame.html"></iframe>
-
- <p><a href="" id="finish">ignore</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-013.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-013.html
deleted file mode 100644
index 641bff82b8a..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-013.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - sibling target frame for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a named frame value also works for sibling frames for 'nav-down'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
-
- <iframe src="support/nav-down-013-frame.html"></iframe>
- <iframe src="support/nav-down-011-frame.html" name="sibling"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-014.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-014.html
deleted file mode 100644
index 5ee819b4029..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-014.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - missing target element for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that focus does not change to a different frame if the identifier is missing from the target frame for 'nav-down'.">
-<style>
- #start {
- nav-down: #finish current;
- }
- #intermediate {
- nav-down: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="start">START</a></p>
- <p><a href="" id="intermediate">ignore</a></p>
- <p><a href="">ignore</a></p>
-
- <iframe src="support/nav-down-009-frame.html"></iframe>
-
- <p><a href="" id="end">FINISH</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-015.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-015.html
deleted file mode 100644
index 11f6afd217c..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-015.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'inherit' value for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'inherit' value is implemented for 'nav-down'.">
-<style type="text/css">
- #parent {
- nav-down: #end;
- }
-
- #intermediateParent, #intermediate {
- nav-down: inherit;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="">ignore</a></p>
- <p><a href="">START</a></p>
- <p id="intermediateParent"><a href="" id="intermediate">ignore</a></p>
- <p><a href="">ignore</a></p>
- </div>
-
- <div>
- <p><a href="">ignore</a></p>
- <p><a href="" id="end">FINISH</a></p>
- <p><a href="">ignore</a></p>
- <p><a href="">ignore</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-016.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-016.html
deleted file mode 100644
index 8eb2351bfb0..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-down-016.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - disabled elements are not navigated for 'nav-down'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that disabled elements are not navigated for 'nav-down'.">
-<style type="text/css">
- #start {
- nav-down: #intermediate;
- }
- input {
- display: block;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating down moves the focus to the "FINISH" text field and not the disabled "ignore" one.</p>
-
- <div id="parent">
- <input value="START"/>
- <input value="ignore" disabled="disabled" id="intermediate"/>
- <input value="FINISH"/>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-000.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-000.html
deleted file mode 100644
index bfbd57e930d..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-000.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - property inheritance for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'nav-left' property value is not inherited for 'nav-left'.">
-<style type="text/css">
- #parent {
- nav-left: #finish;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore</a>
- <a href="" id="end">FINISH</a>
- <a href="">START</a>
- <a href="" id="finish">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-001.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-001.html
deleted file mode 100644
index b44f8f9f9b0..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-001.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation (nav-left) - &lt;id&gt;</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that leftward navigation input respects the 'nav-left' property.">
-<style>
- #start {
- nav-left: #finish;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
-
- <div><a href="">ignore</a> <a href="" id="finish">FINISH</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
-
- <div><a href="">ignore</a> <a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a> <a href="">ignore</a></div>
-
- <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-002.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-002.html
deleted file mode 100644
index a4c08fa2549..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-002.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'auto' value for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'auto' value is implemented for 'nav-left'.">
-<style type="text/css">
- #start {
- nav-left: #finish;
- nav-left: auto;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore</a>
- <a href="" id="end">FINISH</a>
- <a href="" id="start">START</a>
- <a href="" id="finish">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-003.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-003.html
deleted file mode 100644
index 6c227ba2d9d..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-003.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - ID value for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the ID value is implemented for 'nav-left'.">
-<style type="text/css">
- #parent {
- nav-left: #finish;
- }
-
- #intermediate {
- nav-left: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore</a>
- <a href="" id="intermediate">ignore</a>
- <a href="">START</a>
- <a href="">ignore</a>
- </div>
-
- <div>
- <a href="">ignore</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore</a>
- <a href="">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-004.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-004.html
deleted file mode 100644
index bb0086d0188..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-004.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - input elements for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-left' works for input elements.">
-<style type="text/css">
- #parent {
- nav-left: #finish;
- }
-
- #intermediate {
- nav-left: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left twice moves the focus to the "FINISH" text field.</p>
-
- <div id="parent">
- <input value="ignore"/>
- <input value="ignore" id="intermediate"/>
- <input value="START"/>
- <input value="ignore"/>
- </div>
-
- <div>
- <input value="ignore"/>
- <input value="FINISH" id="end"/>
- <input value="ignore"/>
- <input value="ignore"/>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-005.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-005.html
deleted file mode 100644
index 2a063e0c50f..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-005.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in the writing direction for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-left' works for elements floating to the left.">
-<style type="text/css">
- div > a {
- float: left;
- margin-left: 1em;
- margin-right: 1em;
- }
-
- div {
- clear: left;
- }
-
- #parent {
- nav-left: #finish;
- }
-
- #intermediate {
- nav-left: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore 1</a>
- <a href="" id="intermediate">ignore 2</a>
- <a href="">START</a>
- <a href="">ignore 3</a>
- </div>
-
- <div>
- <a href="">ignore 4</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore 5</a>
- <a href="">ignore 6</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-006.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-006.html
deleted file mode 100644
index 0e0ab2900ef..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-006.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in opposite to the writing direction for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-left' works for elements floating to the right.">
-<style type="text/css">
- div > a {
- float: right;
- margin-left: 1em;
- margin-right: 1em;
- }
-
- div {
- clear: right;
- }
-
- #parent {
- nav-left: #finish;
- }
-
- #intermediate {
- nav-left: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore 1</a>
- <a href="">ignore 2</a>
- <a href="">START</a>
- <a href="" id="intermediate">ignore 3</a>
- </div>
-
- <div>
- <a href="">ignore 4</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore 5</a>
- <a href="">ignore 6</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-007.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-007.html
deleted file mode 100644
index 3a031d970d2..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-007.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - non existing ID for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'nav-left' is ignored if the ID does not exist.">
-<style type="text/css">
- #parent {
- nav-left: #error;
- }
-
- #intermediate {
- nav-left: #foobar;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="" id="end">FINISH</a>
- <a href="" id="intermediate">ignore</a>
- <a href="">START</a>
- <a href="">ignore</a>
- </div>
-
- <div>
- <a href="">ignore</a>
- <a href="">ignore</a>
- <a href="" id="error">ignore</a>
- <a href="">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-008.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-008.html
deleted file mode 100644
index 444dd4a852e..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-008.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - currently focused element for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that focus doesn't change when navigating to the currently focused element for 'nav-left'.">
-<style>
- #start {
- nav-left: #start;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if the "START" element remains focused when navigating left.</p>
-
- <div><a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a></div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-009.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-009.html
deleted file mode 100644
index 4354b7aba99..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-009.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'current' target frame for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'current' frame value is respected for 'nav-left'.">
-<style>
- #start {
- nav-left: #finish current;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
-
- <div>
- <a href="" id="finish">FINISH</a>
- <iframe src="support/nav-left-009-frame.html"></iframe>
- <a href="" id="start">START</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-010.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-010.html
deleted file mode 100644
index 8d34a8b7919..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-010.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'root' target frame for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'root' frame value is respected for 'nav-left'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="finish">FINISH</a></p>
-
- <iframe src="support/nav-left-010-frame.html"></iframe>
-
- <p><a href="">ignore</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-011.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-011.html
deleted file mode 100644
index d9d792fcd29..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-011.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - named target frame for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="contributor" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a named target frame value is respected for 'nav-left'.">
-<style>
- #start {
- nav-left: #finish "frame";
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
-
- <p>
- <a href="" id="finish">ignore</a>
- <a href="" id="start">START</a>
- </p>
-
- <iframe src="support/nav-left-011-frame.html" name="frame"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-012.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-012.html
deleted file mode 100644
index ffebab0754a..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-012.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - non-existing target frame for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a non-existing target frame value is treated as 'current' for 'nav-left'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
-
- <div>
- <a href="" id="finish">ignore</a>
- <iframe src="support/nav-left-012-frame.html"></iframe>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-013.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-013.html
deleted file mode 100644
index d1b5e8e68d2..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-013.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - sibling target frame for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a named frame value also works for sibling frames for 'nav-left'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
-
- <iframe src="support/nav-left-013-frame.html"></iframe>
- <iframe src="support/nav-left-011-frame.html" name="sibling"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-014.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-014.html
deleted file mode 100644
index babfbdf6c56..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-014.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - missing target element for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that focus does not change to a different frame if the identifier is missing from the target frame for 'nav-left'.">
-<style>
- #start {
- nav-left: #finish current;
- }
- #intermediate {
- nav-left: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
-
- <p><a href="">ignore</a> <a href="" id="intermediate">ignore</a> <a href="" id="start">START</a></p>
-
- <iframe src="support/nav-left-009-frame.html"></iframe>
-
- <p><a href="" id="end">FINISH</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-015.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-015.html
deleted file mode 100644
index 0af327a9bf5..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-015.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'inherit' value for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'inherit' value is implemented for 'nav-left'.">
-<style type="text/css">
- #parent {
- nav-left: #end;
- }
-
- #intermediate {
- nav-left: inherit;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore</a>
- <a href="" id="intermediate">ignore</a>
- <a href="">START</a>
- <a href="">ignore</a>
- </div>
-
- <div>
- <a href="">ignore</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore</a>
- <a href="">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-016.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-016.html
deleted file mode 100644
index 482ef229506..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-left-016.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - disabled elements are not navigated for 'nav-left'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that disabled elements are not navigated for 'nav-left'.">
-<style type="text/css">
- #start {
- nav-left: #intermediate;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating left moves the focus to the "FINISH" text field and not the disabled "ignore" one.</p>
-
- <div id="parent">
- <input value="FINISH"/>
- <input value="ignore" disabled="disabled" id="intermediate"/>
- <input value="START"/>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-000.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-000.html
deleted file mode 100644
index 4bb8faa49cd..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-000.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - property inheritance for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'nav-right' property value is not inherited for 'nav-left'.">
-<style type="text/css">
- #parent {
- nav-right: #finish;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore</a>
- <a href="">START</a>
- <a href="" id="end">FINISH</a>
- <a href="" id="finish">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-001.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-001.html
deleted file mode 100644
index 4eeed279661..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-001.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation (nav-right) - &lt;id&gt;</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that rightward navigation input respects the 'nav-right' property.">
-<style>
- #start {
- nav-right: #finish;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
-
- <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
-
- <div><a href="">ignore</a> <a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a> <a href="">ignore</a></div>
-
- <div><a href="" id="finish">FINISH</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-002.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-002.html
deleted file mode 100644
index 962a9fa6760..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-002.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'auto' value for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'auto' value is implemented for 'nav-right'.">
-<style type="text/css">
- #start {
- nav-right: #finish;
- nav-right: auto;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore</a>
- <a href="" id="start">START</a>
- <a href="" id="end">FINISH</a>
- <a href="" id="finish">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-003.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-003.html
deleted file mode 100644
index e2baf23deb3..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-003.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - ID value for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the ID value is implemented for 'nav-right'.">
-<style type="text/css">
- #parent {
- nav-right: #finish;
- }
-
- #intermediate {
- nav-right: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore</a>
- <a href="">START</a>
- <a href="" id="intermediate">ignore</a>
- <a href="">ignore</a>
- </div>
-
- <div>
- <a href="">ignore</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore</a>
- <a href="">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-004.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-004.html
deleted file mode 100644
index 73a795bbdfe..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-004.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - input elements for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-right' works for input elements.">
-<style type="text/css">
- #parent {
- nav-right: #finish;
- }
-
- #intermediate {
- nav-right: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right twice moves the focus to the "FINISH" text field.</p>
-
- <div id="parent">
- <input value="ignore"/>
- <input value="START"/>
- <input value="ignore" id="intermediate"/>
- <input value="ignore"/>
- </div>
-
- <div>
- <input value="ignore"/>
- <input value="FINISH" id="end"/>
- <input value="ignore"/>
- <input value="ignore"/>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-005.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-005.html
deleted file mode 100644
index fdbebc0c0fd..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-005.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in the writing direction for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-right' works for elements floating to the left.">
-<style type="text/css">
- div > a {
- float: left;
- margin-right: 1em;
- margin-right: 1em;
- }
-
- div {
- clear: left;
- }
-
- #parent {
- nav-right: #finish;
- }
-
- #intermediate {
- nav-right: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore 1</a>
- <a href="">START</a>
- <a href="" id="intermediate">ignore 2</a>
- <a href="">ignore 3</a>
- </div>
-
- <div>
- <a href="">ignore 4</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore 5</a>
- <a href="">ignore 6</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-006.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-006.html
deleted file mode 100644
index 89a7238e42a..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-006.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in opposite to the writing direction for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-right' works for elements floating to the right.">
-<style type="text/css">
- div > a {
- float: right;
- margin-right: 1em;
- margin-right: 1em;
- }
-
- div {
- clear: right;
- }
-
- #parent {
- nav-right: #finish;
- }
-
- #intermediate {
- nav-right: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore 1</a>
- <a href="" id="intermediate">ignore 2</a>
- <a href="">START</a>
- <a href="">ignore 3</a>
- </div>
-
- <div>
- <a href="">ignore 4</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore 5</a>
- <a href="">ignore 6</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-007.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-007.html
deleted file mode 100644
index 2c5e1972f68..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-007.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - non existing ID for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'nav-right' is ignored if the ID does not exist.">
-<style type="text/css">
- #parent {
- nav-right: #error;
- }
-
- #intermediate {
- nav-right: #foobar;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">START</a>
- <a href="" id="intermediate">ignore</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore</a>
- </div>
-
- <div>
- <a href="">ignore</a>
- <a href="">ignore</a>
- <a href="" id="error">ignore</a>
- <a href="">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-008.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-008.html
deleted file mode 100644
index 5a00fef07fe..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-008.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - currently focused element for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that focus doesn't change when navigating to the currently focused element for 'nav-right'.">
-<style>
- #start {
- nav-right: #start;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if the "START" element remains focused when navigating right.</p>
-
- <div>
- <a href="">ignore</a>
- <a href="" id="start">START</a>
- <a href="">ignore</a>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-009.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-009.html
deleted file mode 100644
index 536c9fc0e58..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-009.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'current' target frame for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'current' frame value is respected for 'nav-right'.">
-<style>
- #start {
- nav-right: #finish current;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
-
- <div>
- <a href="" id="start">START</a>
- <iframe src="support/nav-right-009-frame.html"></iframe>
- <a href="" id="finish">FINISH</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-010.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-010.html
deleted file mode 100644
index 4a339229500..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-010.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'root' target frame for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'root' frame value is respected for 'nav-right'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="finish">FINISH</a></p>
-
- <iframe src="support/nav-right-010-frame.html"></iframe>
-
- <p><a href="">ignore</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-011.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-011.html
deleted file mode 100644
index e9a0eed55e9..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-011.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - named target frame for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="contributor" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a named target frame value is respected for 'nav-right'.">
-<style>
- #start {
- nav-right: #finish "frame";
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
-
- <p>
- <a href="" id="start">START</a>
- <a href="" id="finish">ignore</a>
- </p>
-
- <iframe src="support/nav-right-011-frame.html" name="frame"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-012.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-012.html
deleted file mode 100644
index b432a892b00..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-012.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - non-existing target frame for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a non-existing target frame value is treated as 'current' for 'nav-right'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
-
- <div>
- <iframe src="support/nav-right-012-frame.html"></iframe>
- <a href="" id="finish">ignore</a>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-013.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-013.html
deleted file mode 100644
index b184e7d3b72..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-013.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - sibling target frame for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a named frame value also works for sibling frames for 'nav-right'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
-
- <iframe src="support/nav-right-011-frame.html" name="sibling"></iframe>
- <iframe src="support/nav-right-013-frame.html"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-014.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-014.html
deleted file mode 100644
index afc08fcd18d..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-014.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - missing target element for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that focus does not change to a different frame if the identifier is missing from the target frame for 'nav-right'.">
-<style>
- #start {
- nav-right: #finish current;
- }
- #intermediate {
- nav-right: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
-
- <p>
- <a href="" id="start">START</a>
- <a href="" id="intermediate">ignore</a>
- <a href="">ignore</a>
- </p>
-
- <iframe src="support/nav-right-009-frame.html"></iframe>
-
- <p><a href="" id="end">FINISH</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-015.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-015.html
deleted file mode 100644
index 2b7704c53cb..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-015.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'inherit' value for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'inherit' value is implemented for 'nav-right'.">
-<style type="text/css">
- #parent {
- nav-right: #end;
- }
-
- #intermediate {
- nav-right: inherit;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore</a>
- <a href="">START</a>
- <a href="" id="intermediate">ignore</a>
- <a href="">ignore</a>
- </div>
-
- <div>
- <a href="">ignore</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore</a>
- <a href="">ignore</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-016.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-016.html
deleted file mode 100644
index de6dd0571ad..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-right-016.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - disabled elements are not navigated for 'nav-right'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that disabled elements are not navigated for 'nav-right'.">
-<style type="text/css">
- #start {
- nav-right: #intermediate;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating right moves the focus to the "FINISH" text field and not the disabled "ignore" one.</p>
-
- <div id="parent">
- <input value="START"/>
- <input value="ignore" disabled="disabled" id="intermediate"/>
- <input value="FINISH"/>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-000.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-000.html
deleted file mode 100644
index 0241dc83ecf..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-000.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - property inheritance for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'nav-up' property value is not inherited for 'nav-left'.">
-<style type="text/css">
- #parent {
- nav-up: #finish;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="">ignore</a></p>
- <p><a href="" id="end">FINISH</a></p>
- <p><a href="">START</a></p>
- <p><a href="" id="finish">ignore</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-001.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-001.html
deleted file mode 100644
index 09fc89771ad..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-001.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation (nav-up) - &lt;id&gt;</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
-<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that upward navigation input respects the 'nav-up' property.">
-<style>
- #start {
- nav-up: #finish;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
-
- <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
-
- <div><a href="">ignore</a> <a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a> <a href="">ignore</a></div>
-
- <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="" id="finish">FINISH</a></div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-002.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-002.html
deleted file mode 100644
index 264e37922b7..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-002.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'auto' value for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'auto' value is implemented for 'nav-up'.">
-<style type="text/css">
- #start {
- nav-up: #finish;
- nav-up: auto;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="">ignore</a></p>
- <p><a href="" id="end">FINISH</a></p>
- <p><a href="" id="start">START</a></p>
- <p><a href="" id="finish">ignore</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-003.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-003.html
deleted file mode 100644
index d4db9e5e973..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-003.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - ID value for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the ID value is implemented for 'nav-up'.">
-<style type="text/css">
- #parent {
- nav-up: #finish;
- }
-
- #intermediate {
- nav-up: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="">ignore</a></p>
- <p><a href="" id="intermediate">ignore</a></p>
- <p><a href="">START</a></p>
- <p><a href="">ignore</a></p>
- </div>
-
- <div>
- <p><a href="">ignore</a></p>
- <p><a href="" id="end">FINISH</a></p>
- <p><a href="">ignore</a></p>
- <p><a href="">ignore</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-004.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-004.html
deleted file mode 100644
index 021bd03ba9e..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-004.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - input elements for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-up' works for input elements.">
-<style type="text/css">
- #parent {
- nav-up: #finish;
- }
-
- #intermediate {
- nav-up: #end;
- }
-
- input {
- display: block;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up twice moves the focus to the "FINISH" text field.</p>
-
- <div id="parent">
- <input value="ignore"/>
- <input value="ignore" id="intermediate"/>
- <input value="START"/>
- <input value="ignore"/>
- </div>
-
- <div>
- <input value="ignore"/>
- <input value="FINISH" id="end"/>
- <input value="ignore"/>
- <input value="ignore"/>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-005.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-005.html
deleted file mode 100644
index 3842cff25e6..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-005.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in the writing direction for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-up' works for elements floating to the left.">
-<style type="text/css">
- div > a {
- float: up;
- margin-up: 1em;
- margin-right: 1em;
- }
-
- div {
- clear: up;
- }
-
- #parent {
- nav-up: #finish;
- }
-
- #intermediate {
- nav-up: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="">ignore 1</a></p>
- <p><a href="" id="intermediate">ignore 2</a></p>
- <p><a href="">START</a></p>
- <p><a href="">ignore 3</a></p>
- </div>
-
- <div>
- <p><a href="">ignore 4</a></p>
- <p><a href="" id="end">FINISH</a></p>
- <p><a href="">ignore 5</a></p>
- <p><a href="">ignore 6</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-006.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-006.html
deleted file mode 100644
index 52643c13745..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-006.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in opposite to the writing direction for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that 'nav-up' works for elements floating to the right.">
-<style type="text/css">
- div > a {
- float: right;
- margin-up: 1em;
- margin-right: 1em;
- }
-
- div {
- clear: right;
- }
-
- #parent {
- nav-up: #finish;
- }
-
- #intermediate {
- nav-up: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <a href="">ignore 1</a>
- <a href="" id="intermediate">ignore 3</a>
- <a href="" id="end">FINISH</a>
- <a href="">ignore 2</a>
- </div>
-
- <div>
- <a href="">ignore 4</a>
- <a href="">START</a>
- <a href="">ignore 5</a>
- <a href="">ignore 6</a>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-007.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-007.html
deleted file mode 100644
index f12118ad5d4..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-007.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - non existing ID for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'nav-up' is ignored if the ID does not exist.">
-<style type="text/css">
- #parent {
- nav-up: #error;
- }
-
- #intermediate {
- nav-up: #foobar;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="" id="end">FINISH</a></p>
- <p><a href="" id="intermediate">ignore</a></p>
- <p><a href="">START</a></p>
- <p><a href="">ignore</a></p>
- </div>
-
- <div>
- <p><a href="">ignore</a></p>
- <p><a href="">ignore</a></p>
- <p><a href="" id="error">ignore</a></p>
- <p><a href="">ignore</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-008.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-008.html
deleted file mode 100644
index 9df71066d60..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-008.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - currently focused element for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that focus doesn't change when navigating to the currently focused element for 'nav-up'.">
-<style>
- #start {
- nav-up: #start;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if the "START" element remains focused when navigating up.</p>
-
- <div>
- <p><a href="">ignore</a></p>
- <p><a href="" id="start">START</a></p>
- <p><a href="">ignore</a></div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-009.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-009.html
deleted file mode 100644
index a0b3a08ff8b..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-009.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'current' target frame for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'current' frame value is respected for 'nav-up'.">
-<style>
- #start {
- nav-up: #finish current;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
-
- <div>
- <p><a href="" id="finish">FINISH</a></p>
- <iframe src="support/nav-up-009-frame.html"></iframe>
- <p><a href="" id="start">START</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-010.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-010.html
deleted file mode 100644
index f8670bbcc45..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-010.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'root' target frame for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'root' frame value is respected for 'nav-up'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="finish">FINISH</a></p>
-
- <iframe src="support/nav-up-010-frame.html"></iframe>
-
- <p><a href="">ignore</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-011.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-011.html
deleted file mode 100644
index b0ce729c9d5..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-011.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - named target frame for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="contributor" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a named target frame value is respected for 'nav-up'.">
-<style>
- #start {
- nav-up: #finish "frame";
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="finish">ignore</a></p>
- <p><a href="" id="start">START</a></p>
-
- <iframe src="support/nav-up-011-frame.html" name="frame"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-012.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-012.html
deleted file mode 100644
index ed364a69988..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-012.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - non-existing target frame for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a non-existing target frame value is treated as 'current' for 'nav-up'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
-
- <p><a href="" id="finish">ignore</a></p>
-
- <iframe src="support/nav-up-012-frame.html"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-013.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-013.html
deleted file mode 100644
index f9348802b2e..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-013.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - sibling target frame for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that a named frame value also works for sibling frames for 'nav-up'.">
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
-
- <iframe src="support/nav-up-013-frame.html"></iframe>
- <iframe src="support/nav-up-011-frame.html" name="sibling"></iframe>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-014.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-014.html
deleted file mode 100644
index f4b76397131..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-014.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - missing target element for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that focus does not change to a different frame if the identifier is missing from the target frame for 'nav-up'.">
-<style>
- #start {
- nav-up: #finish current;
- }
- #intermediate {
- nav-up: #end;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
-
- <p><a href="">ignore</a></p>
- <p><a href="" id="intermediate">ignore</a></p>
- <p><a href="" id="start">START</a></p>
-
- <iframe src="support/nav-up-009-frame.html"></iframe>
-
- <p><a href="" id="end">FINISH</a></p>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-015.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-015.html
deleted file mode 100644
index 84a33b50f98..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-015.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - 'inherit' value for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that the 'inherit' value is implemented for 'nav-up'.">
-<style type="text/css">
- #parent {
- nav-up: #end;
- }
-
- #intermediateParent, #intermediate {
- nav-up: inherit;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
-
- <div id="parent">
- <p><a href="">ignore</a></p>
- <p id="intermediateParent"><a href="" id="intermediate">ignore</a></p>
- <p><a href="">START</a></p>
- <p><a href="">ignore</a></p>
- </div>
-
- <div>
- <p><a href="">ignore</a></p>
- <p><a href="" id="end">FINISH</a></p>
- <p><a href="">ignore</a></p>
- <p><a href="">ignore</a></p>
- </div>
-
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-016.html b/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-016.html
deleted file mode 100644
index 47f159316d8..00000000000
--- a/tests/wpt/web-platform-tests/css/css-ui-3/nav-up-016.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Basic User Interface Test: Directional Focus Navigation - disabled elements are not navigated for 'nav-up'</title>
-<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
-<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#nav-dir">
-<meta name="flags" content="interact">
-<meta name="assert" content="Test checks that disabled elements are not navigated for 'nav-up'.">
-<style type="text/css">
- #start {
- nav-up: #intermediate;
- }
-
- input {
- display: block;
- }
-</style>
-<body>
- <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
- <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
- In the SmartTV emulator, use the keypad in the GUI. -->
- <p>Test passes if navigating up moves the focus to the "FINISH" text field and not the disabled "ignore" one.</p>
-
- <div id="parent">
- <input value="FINISH"/>
- <input value="ignore" disabled="disabled" id="intermediate"/>
- <input value="START"/>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-006-ref.html b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-006-ref.html
new file mode 100644
index 00000000000..cec2ba0e80c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-006-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test reference File</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<style>
+div {
+ white-space: pre;
+ font-family: monospace;
+}
+</style>
+
+<p>Test passes if “PASS…” appears below.</p>
+<div>PASS…</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-008-ref.html b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-008-ref.html
new file mode 100644
index 00000000000..4eb357f8e36
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-008-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Reference File</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<style>
+div {
+ font-size: 100px;
+ line-height: 1;
+ font-family: ahem;
+ overflow: hidden;
+ width: 0.5em;
+ color: green;
+}
+</style>
+
+<p>Test passes if there is a filled green rectangle and <strong>no red</strong>.</p>
+<div>x</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-012-ref.html b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-012-ref.html
new file mode 100644
index 00000000000..700f9c896fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-012-ref.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test Reference File</title>
+<style>
+div {
+ font-size: 50px;
+ white-space: pre;
+ color: green;
+}
+span {
+ color: white;
+}
+</style>
+
+<p>Test passes if there are three green dots below and <strong>no red</strong>.</p>
+
+<div> …<span>&#x0E01;&#x0E33;</span></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-013-ref.html b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-013-ref.html
new file mode 100644
index 00000000000..b4565a2402f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-013-ref.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test reference</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<style>
+.test {
+ overflow: hidden;
+ white-space: pre;
+ font: 100px/1 ahem;
+ width: 2em;
+}
+.green {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ background: green;
+ margin-left: 100px;
+}
+span {
+ vertical-align: sub;
+}
+</style>
+
+<p>Test passes if there are 3 filled green squares and <strong>no red</strong>.</p>
+<div class="green"></div>
+<div class=test><span><br><div class="green"></div><br><div class="green"></div></span></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-016-ref.html b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-016-ref.html
new file mode 100644
index 00000000000..a5a983aff53
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-016-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test reference</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<style>
+div {
+ margin-left: 60px;
+ background: green;
+ width: 40px;
+ height: 40px;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-021-ref.html b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-021-ref.html
new file mode 100644
index 00000000000..466755df6f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-021-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: test reference</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<style>
+div {
+ font-family: monospace;
+ width: 16ch;
+ white-space: pre;
+ overflow: scroll;
+ border: solid blue;
+}
+</style>
+
+<p>This test passes if the text is in the blue box below is “PASS”.
+<div id=test> PASS</div>
+<script>
+var test = document.getElementById("test");
+test.scrollBy(500,0);
+</script>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-022-ref.html b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-022-ref.html
new file mode 100644
index 00000000000..2986631ff0c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/reference/text-overflow-022-ref.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test Reference File</title>
+<style>
+div {
+ font-size: 50px;
+ white-space: pre;
+ color: green;
+}
+span {
+ color: white;
+}
+</style>
+
+<p>Test passes if there are three green dots below and <strong>no red</strong>.</p>
+
+<div> …<span>l&#x20DE;</span></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-008.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-008.html
new file mode 100644
index 00000000000..0b10155a4a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-008.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing images</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact may">
+<meta name="assert" content="UAs may apply the resize property to <img> regardless of the value of the overflow property.">
+<style>
+img { resize: both; }
+</style>
+
+<p>Test passes if both <strong>width</strong> and <strong>height</strong> of the orange box below can be adjusted (for instance by dragging the bottom-right corner).</p>
+
+<img src="support/orange.png" alt="">
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-009.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-009.html
new file mode 100644
index 00000000000..8662b1a72c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-009.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing sgv</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact may">
+<meta name="assert" content="UAs may apply the resize property to <svg> regardless of the value of the overflow property.">
+<style>
+svg { resize: both; }
+</style>
+
+<p>Test passes if both <strong>width</strong> and <strong>height</strong> of the orange box below can be adjusted (for instance by dragging the bottom-right corner).</p>
+
+<svg width="100" height="100" viewBox="0 0 100 100"
+ xmlns="http://www.w3.org/2000/svg">
+<rect x="0" y="0" width="100" height="100" fill="orange"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-010.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-010.html
new file mode 100644
index 00000000000..b7cf2712983
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-010.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing pictures</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact may">
+<meta name="assert" content="UAs may apply the resize property to <picture> regardless of the value of the overflow property.">
+<style>
+picture { resize: both; }
+</style>
+
+<p>Test passes if both <strong>width</strong> and <strong>height</strong> of the orange box below can be adjusted (for instance by dragging the bottom-right corner).</p>
+
+<picture>
+ <source srcset="support/orange.svg" type="image/svg+xml">
+ <img src="support/orange.png" alt="">
+</picture>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-011.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-011.html
new file mode 100644
index 00000000000..71a8604366a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-011.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing objects</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact may">
+<meta name="assert" content="UAs may apply the resize property to <object> regardless of the value of the overflow property.">
+<style>
+object { resize: both; }
+</style>
+
+<p>Test passes if both <strong>width</strong> and <strong>height</strong> of the orange box below can be adjusted (for instance by dragging the bottom-right corner).</p>
+
+<object data="support/orange.svg" type="image/svg+xml">
+ &lt;object&gt; is not supported. This test is non conclusive.
+</object>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-012.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-012.html
new file mode 100644
index 00000000000..717cb5a668c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-012.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing iframes</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact may">
+<meta name="assert" content="UAs may apply the resize property to <iframes> regardless of the value of the overflow property.">
+<style>
+iframe { resize: both; }
+</style>
+
+<p>Test passes if both <strong>width</strong> and <strong>height</strong> of the box surrounding the orange box below can be adjusted (for instance by dragging the bottom-right corner).</p>
+
+<iframe src="support/orange.svg"></iframe>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-013.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-013.html
new file mode 100644
index 00000000000..d8cea0e6749
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-013.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing canvas</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact may">
+<meta name="assert" content="UAs may apply the resize property to <canvas> regardless of the value of the overflow property.">
+<style>
+canvas { resize: both; }
+</style>
+
+<p>Test passes if both <strong>width</strong> and <strong>height</strong> of the orange box below can be adjusted (for instance by dragging the bottom-right corner).</p>
+
+<canvas id="test" width="100" height="100">
+ &lt;canvas&gt; is not supported. This test is non conclusive.
+</canvas>
+<script>
+var canvas = document.getElementById('test');
+if (canvas.getContext) {
+ var ctx = canvas.getContext('2d');
+ ctx.fillStyle = '#FFA500';
+ ctx.fillRect (0, 0, 100, 100);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-014.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-014.html
new file mode 100644
index 00000000000..fdbd77e38ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-014.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing videos</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact may">
+<meta name="assert" content="UAs may apply the resize property to <video> regardless of the value of the overflow property.">
+<style>
+video { resize: both; }
+</style>
+
+<p>Test passes if both <strong>width</strong> and <strong>height</strong> of the video below can be adjusted (for instance by dragging the bottom-right corner).</p>
+
+<video width="100" autoplay loop>
+ <source
+ src="support/test.webm"
+ type="video/webm">
+ <source
+ src="support/test.mp4"
+ type="video/mp4">
+ <source
+ src="support/test.ogv"
+ type="video/ogg">
+ &lt;video&gt; is not supported. This test is non conclusive.
+</video>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-015.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-015.html
new file mode 100644
index 00000000000..b613da261c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-015.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing uses the style attribute</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+#test {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ background: orange;
+ overflow: hidden;
+ resize: both;
+}
+#target {
+ position: absolute;
+ width: 150px;
+ height: 150px;
+ background: blue;
+}
+#log { margin-top: 200px; }
+</style>
+
+<p>Enlarge the orange box so that it at least covers the blue box entirely, then press the “done” button.</p>
+<!-- There's no actual need to cover the whole box,
+ but doing so makes sure that the user has resized in both dimensions -->
+
+<button onclick="verify()">done</button>
+
+<div id="target"></div>
+<div id="test"></div>
+<div id=log></div>
+<script>
+setup({ explicit_done: true });
+function verify() {
+ test(
+ function(){
+ var test = document.getElementById("test");
+ assert_regexp_match(test.style.width, /px$/, "The width property of the style attribute should be set in pixels");
+ assert_not_equals(test.style.width, "100px", "The width should be different from the initial one");
+ assert_regexp_match(test.style.height, /px$/, "The height property of the style attribute should be set in pixels");
+ assert_not_equals(test.style.height, "100px", "The height should be different from the initial one");
+ }, "resize works by setting the width and height properties on the style attrbute in pixels");
+ test(
+ function(){
+ var test = document.getElementById("test");
+ assert_false(test.getAttribute("style").includes("important"));
+ }, "resize does not set !important");
+ done();
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-016.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-016.html
new file mode 100644
index 00000000000..4bc00287f72
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-016.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing horizontally uses the style attribute</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+#test {
+ width: 100px;
+ height: 100px;
+ background: orange;
+ overflow: hidden;
+ resize: horizontal;
+}
+</style>
+
+<p>Attempt to resize the orange box both horizontally and vertically, then press the “done” button
+(Resizing vertically is not expected to be possible but should still be attempted).</p>
+
+<button onclick="verify()">done</button>
+
+<div id="test"></div>
+<div id=log></div>
+<script>
+setup({ explicit_done: true });
+function verify() {
+ test(
+ function(){
+ var test = document.getElementById("test");
+ assert_regexp_match(test.style.width, /px$/, "The width property of the style attribute should be set in pixels");
+ assert_not_equals(test.style.width, "100px", "The width should be different from the initial one");
+ assert_equals(test.style.height, "", "The height property of the style attribute should not be set");
+ }, "horizontal resizing only affects the width properties on the style attrbute.");
+ done();
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-017.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-017.html
new file mode 100644
index 00000000000..98a7d31f28c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-017.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing vertically uses the style attribute</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+#test {
+ width: 100px;
+ height: 100px;
+ background: orange;
+ overflow: hidden;
+ resize: vertical;
+}
+</style>
+
+<p>Attempt to resize the orange box both horizontally and vertically, then press the “done” button
+(Resizing horizontally is not expected to be possible but should still be attempted).</p>
+
+<button onclick="verify()">done</button>
+
+<div id="test"></div>
+<div id=log></div>
+<script>
+setup({ explicit_done: true });
+function verify() {
+ test(
+ function(){
+ var test = document.getElementById("test");
+ assert_equals(test.style.width, "", "The width property of the style attribute should not be set");
+ assert_regexp_match(test.style.height, /px$/, "The height property of the style attribute should be set in pixels");
+ assert_not_equals(test.style.height, "100px", "The height should be different from the initial one");
+ }, "horizontal resizing only affects the width properties on the style attrbute.");
+ done();
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-018.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-018.html
new file mode 100644
index 00000000000..6e40d583074
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-018.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: removing the ability to resize keeps the resized dimentions</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+#test {
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ background: orange;
+ overflow: hidden;
+ resize: both;
+}
+#target {
+ position: absolute;
+ width: 150px;
+ height: 150px;
+ background: blue;
+}
+#log { margin-top: 200px; }
+</style>
+
+<p>Enlarge the orange box so that it at least covers the blue box entirely, then press the “done” button.</p>
+<!-- There's no actual need to cover the whole box,
+ but doing so makes sure that the user has resized in both dimensions -->
+
+<button onclick="verify()">done</button>
+
+<div id="target"></div>
+<div id="test"></div>
+<div id=log></div>
+<script>
+setup({ explicit_done: true });
+function verify() {
+ test(
+ function(){
+ var test = document.getElementById("test");
+ var w = test.style.width;
+ var h = test.style.height;
+ assert_regexp_match(w, /px$/, "The width property of the style attribute should be set");
+ assert_regexp_match(h, /px$/, "The height property of the style attribute should be set");
+ document.styleSheets[0].cssRules[0].style.resize= "none";
+ assert_equals(test.style.width, w, "The width property of the style attribute should still be set after removing ability to resize");
+ assert_equals(test.style.height, h, "The height property of the style attribute should still be set after removing ability to resize");
+ }, "Removing the ability to resize an element does not reset its size");
+ done();
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-019.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-019.html
new file mode 100644
index 00000000000..4a6ff7d7d39
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-019.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing constraints</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact">
+<meta name="assert" content="UAs must not place constrains on resizing that would prevent an element from becoming smaller than its original size.">
+<style>
+#test {
+ position: absolute;
+ background: orange;
+ height: 100px;
+ width: 100px;
+ overflow: auto;
+ resize: both;
+}
+#ref {
+ position: absolute;
+ background: green;
+ height: 100px;
+ width: 100px;
+}
+</style>
+
+<p>The test passes is you can resize the orange box to be smaller than its initial size.
+For reference there is an unresizable green box beneath it.
+If you can uncover it, the test passes.</p>
+
+<div id=ref></div>
+<div id=test></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-020.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-020.html
new file mode 100644
index 00000000000..807f788b0a5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-020.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing min-height/width constraints</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact">
+<meta name="assert" content="min-width and min-height constraints are honored.">
+<style>
+#test {
+ position: absolute;
+ background: orange;
+ min-height: 50px;
+ min-width: 50px;
+ height: 100px;
+ width: 100px;
+ overflow: auto;
+ resize: both;
+}
+#ref {
+ position: absolute;
+ background: red;
+ height: 50px;
+ width: 50px;
+}
+</style>
+
+<p>Resize the orange box below to the smallest size possible.
+There is a smaller unresizable red box beneath it.</p>
+<p>If you can uncover any amount of red, the test fails.
+If you cannot resize the orange box, the test also fails.
+Otherwise, the test passes.</p>
+
+<div id=ref></div>
+<div id=test></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/resize-021.html b/tests/wpt/web-platform-tests/css/css-ui-3/resize-021.html
new file mode 100644
index 00000000000..709551f1590
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/resize-021.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: resizing min-height/width constraints</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-3/#resize">
+<meta name="flags" content="interact">
+<meta name="assert" content="max-width and max-height constraints are honored.">
+<style>
+#test {
+ position: absolute;
+ background: linear-gradient(to right, transparent 200px, red 200px) no-repeat,
+ linear-gradient(to bottom, transparent 200px, red 200px) no-repeat,
+ orange;
+ max-height: 200px;
+ max-width: 200px;
+ height: 100px;
+ width: 100px;
+ overflow: auto;
+ resize: both;
+}
+#ref {
+ position: absolute;
+ background: blue;
+ height: 300px;
+ width: 300px;
+}
+</style>
+
+<p>Attempt to resize the orange box below so that it is large enough to fully cover the blue one.</p>
+<p>If you cannot enlarge the orange box, the test fails.<br>
+If you can fully cover the blue box, the test fails.<br>
+Even if the blue box is not fully covered, if you see any red, the test fails.<br>
+Otherwise, the test passes.</p>
+
+<div id=ref></div>
+<div id=test></div>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-red.png b/tests/wpt/web-platform-tests/css/css-ui-3/support/1x1-red.png
index 6bd73ac1018..6bd73ac1018 100644
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-red.png
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/support/1x1-red.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/orange.png b/tests/wpt/web-platform-tests/css/css-ui-3/support/orange.png
new file mode 100644
index 00000000000..0a08d3ae5d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/support/orange.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/orange.svg b/tests/wpt/web-platform-tests/css/css-ui-3/support/orange.svg
new file mode 100644
index 00000000000..56346a8295b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/support/orange.svg
@@ -0,0 +1,4 @@
+<svg width="100" height="100" viewBox="0 0 100 100"
+ xmlns="http://www.w3.org/2000/svg">
+<rect x="0" y="0" width="100" height="100" fill="orange"/>
+</svg>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/test.mp4 b/tests/wpt/web-platform-tests/css/css-ui-3/support/test.mp4
new file mode 100644
index 00000000000..1b0e7b56a6b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/support/test.mp4
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/test.ogv b/tests/wpt/web-platform-tests/css/css-ui-3/support/test.ogv
new file mode 100644
index 00000000000..50d59dfb38b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/support/test.ogv
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/test.webm b/tests/wpt/web-platform-tests/css/css-ui-3/support/test.webm
new file mode 100644
index 00000000000..3a601805d79
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/support/test.webm
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-006.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-006.html
new file mode 100644
index 00000000000..f978f624b29
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-006.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: text-overflow applied at edge of block container</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<link rel="match" href="reference/text-overflow-006-ref.html">
+<meta name="flags" content="">
+<meta name="assert" content="Checks that the elipsis is applied at the edge of the line box, not the end of the block container, when these are different.">
+<style>
+div {
+ white-space: pre;
+ font-family: monospace;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ width: 9.5ch;
+ /* 9ch ought to be enough,
+ but Safari seems to have aliasing issues that make the ellipsis character larger than 1ch by a bit.
+ Adding an extra .5 does not change the validity of the test,
+ and lets safari fit “PASS…” in the space provided.
+ This issue may be a bug, but if so, it is unrelated to what this test is testing,
+ so no need to force a fail when an easy workaround is available.
+ */
+}
+span { float: right; }
+</style>
+
+<p>Test passes if “PASS…” appears below.</p>
+<div><span> </span>PASS FAIL</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-007.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-007.html
new file mode 100644
index 00000000000..bfc693978fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-007.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsis adjacent to remaining content</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="flags" content="ahem">
+<meta name="assert" content="The ellipsis is placed immediately adjacent to the end edge of the remaining inline content, with no intervening gap.">
+<style>
+.test {
+ white-space: pre;
+ font: 50px/1 ahem;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ width: 2.5em; /* We will be fitting 2em worth of characters in a 2.5em space, to see where the extra .5em goes. It should be after, not between the characters.*/
+ color: green;
+}
+.red {
+ position: absolute;
+ z-index: -1;
+ width: 100px;
+ height: 100px;
+ background: red;
+ /* This red box wich will show through the gap between the letter and the ellipsis if there's one
+ but not extend past the two characters if the ellipsis is adjacent to the character as it should be.
+ */
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class=red></div>
+<div class=test>this line should render to a "t" followed by a "…", both of which are a 1em square in ahem, whithout any gap between them.
+this line also should render to a "t" followed by a "…", both of which are a 1em square in ahem, whithout any gap between them.</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-008.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-008.html
new file mode 100644
index 00000000000..79c8443359e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-008.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsis and first character</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<link rel="match" href="reference/text-overflow-008-ref.html">
+<meta name="flags" content="ahem">
+<meta name="assert" content="The first character on a line must be clipped rather than ellipsed.">
+<!--
+ If the ellipsis character appears, it will be red (as it is styled after the block), and the test will fail.
+ If the first character is omitted rather than clipped, there will be no box at all, and the test will fail.
+-->
+<style>
+.test {
+ font: 100px/1 ahem;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ width: 0.5em;
+ color: red;
+}
+</style>
+
+<p>Test passes if there is a filled green rectangle and <strong>no red</strong>.</p>
+<div class=test><span style="color:green">x</span></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-009.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-009.html
new file mode 100644
index 00000000000..e7a4e03eeb0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-009.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsis and first atomic inline</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="flags" content="">
+<meta name="assert" content="The first atomic inline on a line must be clipped rather than ellipsed.">
+<style>
+body > div {
+ width: 100px;
+ white-space: pre;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ color: red;
+}
+span {
+ display: inline-block;
+ height: 100px;
+ width: 200px;
+ background: green;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div><span> </span>XXXXXX</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-010.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-010.html
new file mode 100644
index 00000000000..1556da39455
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-010.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsis hides atomic inlines and chars at end of line</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="flags" content="ahem">
+<meta name="assert" content="Implementations must hide atomic inlines and characters at the end of the line to make room for the ellipsis">
+<style>
+.green {
+ position: absolute;
+ z-index: -1;
+ background: green;
+ width: 100px;
+ height: 100px;
+}
+.test {
+ white-space: pre;
+ font-family: ahem;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ width: 5.2em; /* making this 5.2em rather than 5em, to ensure that the atomic inline gets entirely hidden even if it is only partially obstructing */
+ color: green;
+}
+span {
+ color: red;
+}
+.ib {
+ display: inline-block;
+ background: red; /* in case the text gets disapeared but the box is still there. */
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class=green></div>
+<div class=test> <span class=ib>X</span> </div>
+<div class=test> <span>X</span> </div>
+<div class=test> <img src="support/1x1-red.png" width=10 height=10> </div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-011.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-011.html
new file mode 100644
index 00000000000..33ebd0bba3f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-011.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsis hides end of line</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="flags" content="ahem">
+<meta name="assert" content="Implementations must hide at the *end* (not right) of the line to make room for the ellipsis">
+<style>
+.test {
+ white-space: pre;
+ font: 100px/1 ahem;
+ color: green;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ width: 500px;
+}
+.red {
+ position: absolute;
+ z-index: -1;
+ background: red;
+ width: 100px;
+ height: 100px;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class=red></div>
+<div class=test dir=rtl> <span style="color:orange">xxxxxx</span></div>
+<!-- Adding some visible non-green characters in the positions that are supposed to be elided,
+to make sure that not only the ellipsis is shown at the right place, but that it replaces
+the right characters -->
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-012.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-012.html
new file mode 100644
index 00000000000..a75908026aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-012.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsis and extended grapheme cluster</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<link rel="match" href="reference/text-overflow-012-ref.html">
+<meta name="flags" content="should">
+<!-- This is SHOULD because although CSS-UI defines "character" as "grapheme cluster" in a non optional manner
+ UAX29 itself defines grapheme cluster as either legacy or extended grapheme clusters,
+ and says (emphasis mine):
+ The extended grapheme clusters **should** be used
+ in implementations in preference to legacy grapheme clusters
+ -->
+<meta name="assert" content="Implementations must hide characters, i.e. entire garpheme clusters, not part of them, to make room for the ellipsis">
+<style>
+#sizer {
+ font-size: 50px;
+ white-space: pre;
+ color: white;
+ float: left;
+ position: relative;
+}
+
+#test {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ position: absolute;
+ top: 0; right: 2px; bottom: 0; left: 0;
+ color: green;
+}
+span {
+ color: red;
+}
+
+</style>
+
+<p>Test passes if there are three green dots below and <strong>no red</strong>.</p>
+
+<!--Starting the line with an space because the first character on the line is clipped rather than ellided, so we need the tested grapheme cluster to be non-first-->
+<!--
+sizer shrinkwraps to the size of a space, plus the grapheme cluster, plus the ellipsis.
+test is 2px shorter than that, so it can only fit part of the grapheme cluster.
+The whole grapheme cluster should be removed, not just its second character.
+-->
+
+<div id=sizer> &#x0E01;&#x0E33;…<div id=test> <span>&#x0E01;&#x0E33;filler text to make things overflow</span></div><div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-013.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-013.html
new file mode 100644
index 00000000000..dd8f98670fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-013.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsis and baseline alignement</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#ellipsing-details">
+<link rel="match" href="reference/text-overflow-013-ref.html">
+<meta name="flags" content="ahem">
+<meta name="assert" content="The ellipsis is be baseline aligned with the block, even if the thing it replaces isn't.">
+<style>
+.test {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: pre;
+ font: 100px/1 ahem;
+ color: green;
+
+ /* 2em width and starting with a space
+ because the handling of the ellipsis of the first character on the line is special,
+ and therefore we need to have the thing we want to test in non first position.
+ */
+ width: 2em;
+}
+.red {
+ position: absolute;
+ z-index: -1;
+ width: 100px;
+ height: 100px;
+ background: red;
+ margin-left: 100px; /* moving right to skip the first 100x100 space that starts each line */
+}
+span {
+ vertical-align: sub;
+ color: red;
+}
+</style>
+
+<p>Test passes if there are 3 filled green squares and <strong>no red</strong>.</p>
+<div class="red"></div>
+<div class=test> <span>xxxx<br><div class="red"></div> xxxx<br><div class="red"></div> xxxx</span> </div>
+<!--
+There are 3 lines in the test div to make sure that the middle one only contains text from the span, not directly from the block,
+guaranteeing that the ellipsis is taking its baseline from the block even when the block has no direct content on the line.
+
+The "red" divs for line 2 and 3 are descendants of the span so that they are placed based on their static position at the begining of each line.
+The alternative, which would be to place them (vertically) with explicit offsets would require knowing
+the precise height of the preceeding line boxes, which isn't reliable across UAs.
+-->
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-014.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-014.html
new file mode 100644
index 00000000000..6e1e9898e4a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-014.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: styling the ellipsis</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#ellipsing-details">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="flags" content="ahem">
+<meta name="assert" content="The ellipsis' font family, font size, and color are styled according to the block.">
+<style>
+.test {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space:pre;
+ font: 100px/1 ahem;
+ color: green;
+
+ /* 2em width and starting with a space
+ because the handling of the ellipsis of the first character on the line is special,
+ and therefore we need to have the thing we want to test in non first position.
+ Shifting 1em left to align with the usual green square.
+ */
+ width: 2em;
+ margin-left: -1em;
+}
+.red {
+ position: absolute;
+ z-index: -1;
+ width: 100px;
+ height: 100px;
+ background: red;
+}
+span {
+ font: 50%/1 serif;
+ color: red;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class=red></div>
+<div class=test> <span>xxxxxxxxxxxxxxxxxxxx</span></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-015.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-015.html
new file mode 100644
index 00000000000..8a6672c37a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-015.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsis after graphical transformations</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#ellipsing-details">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="flags" content="ahem">
+<meta name="assert" content="Ellipsing occurs after relative positioning">
+<style>
+div {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ width: 100px;
+ height: 100px;
+ white-space: pre;
+ font: 20px/1 ahem;
+ color: green;
+ background: url("support/1x1-red.png") top right / 1em 1em no-repeat, green;
+}
+.rel {
+ position: relative;
+ left: 1em;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div><span class=rel> </span></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-016.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-016.html
new file mode 100644
index 00000000000..6e642ae689c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-016.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: clipping the ellipsis</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#ellipsing-details">
+<link rel="match" href="reference/text-overflow-016-ref.html">
+<meta name="flags" content="ahem">
+<meta name="assert" content="If there is insufficient space for the ellipsis, then clip the rendering of the ellipsis itself">
+<style>
+.test, .test2 {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ width: 100px;
+ white-space: pre;
+ font: 50px/1 ahem;
+ height: 20px;
+ position: relative;
+}
+span {
+ display: inline-block;
+ width: 60px;
+ height: 1em;
+ vertical-align: bottom;
+}
+
+/* if the ellipsis is shorter than the expected 40px (or misplaced) the red background will show */
+.test {
+ color: green;
+ background: url("support/1x1-red.png") right / 40px auto no-repeat;
+}
+
+/* if the ellipsis (which is red) is longer that the expected 40px (or misplaced), it won't be fully covered by the green abspos */
+.test2 { color: red; }
+.test2::after {
+ content: "";
+ position: absolute;
+ top: 0; right: 0; bottom: 0;
+ width: 40px;
+ background: green;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div class=test><span></span>filler text to make things overflow</div>
+<div class=test2><span></span>filler text to make things overflow</div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-017.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-017.html
new file mode 100644
index 00000000000..7e857bcc103
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-017.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: interacting with the ellipsis</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="flags" content="ahem interact dom">
+<meta name="assert" content="Ellipsing must not prevent dispatching of pointer events.">
+<style>
+#test {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin-left: -100px;
+ width: 2.5em;
+ height: 1em;
+ white-space: pre;
+ font: 100px/1 ahem;
+ color: blue;
+}
+#discard {
+ float: left;
+}
+</style>
+
+<div id=discard>First, click the blue box. </div>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div id="test" onclick="green()"> </div>
+<script>
+function green() {
+ document.getElementById("test").style.color="green";
+ document.getElementById("discard").remove();
+ document.children[0].className="";
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-018.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-018.html
new file mode 100644
index 00000000000..848ebe690eb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-018.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: selecting the ellipsis</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#ellipsis-interaction">
+<meta name="flags" content="interact should">
+<meta name="assert" content="Selecting the ellipsis should select the ellipsed text">
+<style>
+div{
+ font-size: 25px;
+ font-family: monospace;
+ width: 2.1ch;
+ white-space: pre;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ border: solid blue;
+ padding-right: 0.9ch;
+}
+textarea {
+ width: 100%;
+ box-sizing: border-box;
+ border: solid orange;
+}
+</style>
+
+<p>Select the elipsis character (“…”) in the blue box below, copy it to the clipboard, and paste the result into the orange box.
+<p>This test passes if the pasted text is “This test passes”. If only part of that text is pasted, the test fails.
+<div>&nbsp;This test passes</div>
+<textarea></textarea>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-019.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-019.html
new file mode 100644
index 00000000000..2571d4cf934
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-019.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsed text selection</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#ellipsis-interaction">
+<meta name="flags" content="interact dom should">
+<meta name="assert" content="If all of the ellipsed text is selected, UAs should show selection of the ellipsis.">
+<style>
+div{
+ font-size: 25px;
+ font-family: monospace;
+ width: 2.1ch;
+ white-space: pre;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ border: solid blue;
+}
+</style>
+
+<p>This test passes if both the “P” and the ellipsis (“…”) in the blue box bellow appear selected.
+<div id=test>Pass</div>
+
+<script>
+var sel = window.getSelection();
+sel.selectAllChildren(document.getElementById("test"));
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-020.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-020.html
new file mode 100644
index 00000000000..caac6fb5393
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-020.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: no ellipsing when nesting</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="flags" content="ahem">
+<meta name="assert" content="Nested paragraph won’t ellipse.">
+<style>
+div {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ width: 100px;
+ height: 100px;
+ background: green;
+}
+div > p {
+ white-space: pre;
+ font: 40px/1 ahem;
+ color: green;
+ background: red;
+ margin: 0;
+}
+</style>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div><p>xxxxxxxxxx</p></div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-021.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-021.html
new file mode 100644
index 00000000000..8057ffc7876
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-021.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsis, revealing more text</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#ellipsis-scrolling">
+<link rel="match" href="reference/text-overflow-021-ref.html">
+<meta name="flags" content="dom should">
+<meta name="assert" content="When an element with ellipsis is scrolled, more content should be revealed, until the element is scrolled far enough to display the edge of the content at which point that content should be displayed rather than an ellipsis.">
+<style>
+div {
+ font-family: monospace;
+ width: 16ch;
+ white-space: pre;
+ overflow: scroll;
+ text-overflow: ellipsis;
+ border: solid blue;
+}
+</style>
+
+<p>This test passes if the text is in the blue box below is “PASS”.
+<div id=test> PASS</div>
+<script>
+var test = document.getElementById("test");
+test.scrollBy(500,0);
+document.documentElement.className = "";
+</script>
+
+
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-022.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-022.html
new file mode 100644
index 00000000000..5a3a7e439ef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-022.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: ellipsis and legacy grapheme cluster</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<link rel="match" href="reference/text-overflow-022-ref.html">
+<meta name="flags" content="">
+<meta name="assert" content="Implementations must hide characters, i.e. entire garpheme clusters, not part of them, to make room for the ellipsis">
+<style>
+#sizer {
+ font-size: 50px;
+ white-space: pre;
+ color: white;
+ float: left;
+ position: relative;
+}
+
+#test {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ position: absolute;
+ top: 0; right: 2px; bottom: 0; left: 0;
+ color: green;
+}
+span {
+ color: red;
+}
+
+</style>
+
+<p>Test passes if there are three green dots below and <strong>no red</strong>.</p>
+
+<!--Starting the line with an space because the first character on the line is clipped rather than ellided, so we need the tested grapheme cluster to be non-first-->
+<!--
+sizer shrinkwraps to the size of a space, plus the grapheme cluster, plus the ellipsis.
+test is 2px shorter than that, so it can only fit part of the grapheme cluster.
+The whole grapheme cluster should be removed, not just its second character.
+-->
+
+<div id=sizer> l&#x20DE;…<div id=test> <span>l&#x20DE;filler text to make things overflow</span></div><div>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-023.html b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-023.html
new file mode 100644
index 00000000000..ca3f8da3b1d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-3/text-overflow-023.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<meta charset="utf-8">
+<title>CSS Basic User Interface Test: interacting with the ellipsis</title>
+<link rel="author" title="Florian Rivoal" href="http://florian.rivoal.net/">
+<link rel="help" href="http://www.w3.org/TR/css3-ui/#text-overflow">
+<meta name="flags" content="ahem dom should">
+<meta name="assert" content="Pointer events on the ellipsis should be dispatched to the elided inline element if there's one, rather than directly to the block.">
+<!-- This is tested indirectly, using elementFromPoint instead of actually triggering a pointer event, because:
+ * Actual pointer events can only be dispatched in an manual test, while elementFromPoint allows for an automated test
+ * These two methods are expected to give the same result
+
+ This indirection and the slight risk of false positive or false negative it introduces
+ is preferable to a manual test which would hardly anyone would ever run.
+-->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+#parent {
+ position: absolute;
+ top: 0; left: 0;
+ font: 50px / 1 ahem ;
+ overflow: hidden;
+ width: 3em;
+ text-overflow: ellipsis;
+}
+</style>
+<div id=parent>&nbsp;&nbsp;<span id=target>&nbsp;&nbsp;</span></div>
+<script>
+test(
+ function() {
+ var e = document.elementFromPoint(125,25);
+ assert_equals(e.id,"target", "the element targeted by a hit on the ellipsis is the elided inline.");
+ }, "Checks hit testing on the ellipsis");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/OWNERS b/tests/wpt/web-platform-tests/css/css-ui-4/OWNERS
new file mode 100644
index 00000000000..ec8236e19b9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/OWNERS
@@ -0,0 +1 @@
+@frivoal
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-001.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-001.html
new file mode 100644
index 00000000000..98250a1d5cf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-001.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - property inheritance</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'nav-left' property value is not inherited.">
+<style>
+ #parent {
+ nav-left: #finish;
+ }
+ #intermediate {
+ nav-left: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent"><a href="">ignore</a> <a href="" id="intermediate">ignore</a> <a href="">START</a> <a href="" id="finish">ignore</a></div>
+
+ <div><a href="">ignore</a> <a href="" id="end">FINISH</a></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-002.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-002.html
new file mode 100644
index 00000000000..649dd554820
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-002.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'inherit' property value</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'inherit' value is respected.">
+<style>
+ #parent {
+ nav-left: #finish;
+ }
+ #start {
+ nav-left: inherit;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
+
+ <div id="parent"><a href="">ignore</a> <a href="" id="start">START</a> <a href="" id="finish">FINISH</a></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-003.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-003.html
new file mode 100644
index 00000000000..af2290d8e2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-003.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - input elements</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that directional focus navigation properties work on input elements.">
+<style>
+ #start {
+ nav-left: #finish;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the text input containing "START" below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" input.</p>
+
+ <div><input value="ignore"> <input value="START" id="start"> <input value="ignore"></div>
+
+ <div><input value="ignore"> <input value="ignore"> <input value="ignore"></div>
+
+ <div><input value="ignore"> <input value="FINISH" id="finish"> <input value="ignore"></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-004.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-004.html
new file mode 100644
index 00000000000..f6b5dbeea33
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-004.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - floating elements</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that directional focus navigation properties work on floating elements.">
+<style>
+ #container > div {
+ clear: left;
+ }
+ #container > div > a {
+ float: left;
+ margin-right: 1ex;
+ }
+ #start {
+ nav-left: #finish;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" input.</p>
+
+ <div id="container">
+ <div><a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a></div>
+
+ <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
+
+ <div><a href="">ignore</a> <a href="" id="finish">FINISH</a> <a href="">ignore</a></div>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-005.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-005.html
new file mode 100644
index 00000000000..2f88a073277
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-005.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - currently focused element</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that focus doesn't change when navigating to the currently focused element.">
+<style>
+ #start {
+ nav-left: #start;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if the "START" element remains focused when navigating left.</p>
+
+ <div><a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-1.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-1.html
new file mode 100644
index 00000000000..01c25276a66
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-1.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - unkown element id</title>
+<link rel="author" title="Florian Rivoal" href="mailto:florian@rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that an unknow element id used as the value of the 'nav-right' property value does not hinder normal spacial navigation.">
+<style>
+#start {
+ nav-right: #foo;
+}
+</style>
+</head>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right moves the focus to the "FINISH" link.</p>
+
+ <a href="" id="start">START</a> <a href="" id="finish">FINISH</a>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-2.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-2.html
new file mode 100644
index 00000000000..a231d43871a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-2.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - unkown element id</title>
+<link rel="author" title="Florian Rivoal" href="mailto:florian@rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that an unknow element id used as the value of the 'nav-left' property value does not hinder normal spacial navigation.">
+<style>
+#start {
+ nav-left: #foo;
+}
+</style>
+</head>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left moves the focus to the "FINISH" link.</p>
+
+ <a href="" id="finish">FINISH</a> <a href="" id="start">START</a>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-3.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-3.html
new file mode 100644
index 00000000000..327e387eddb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-3.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - unkown element id</title>
+<link rel="author" title="Florian Rivoal" href="mailto:florian@rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that an unknow element id used as the value of the 'nav-down' property value does not hinder normal spacial navigation.">
+<style>
+#start {
+ nav-down: #foo;
+}
+</style>
+</head>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down moves the focus to the "FINISH" link.</p>
+
+ <a href="" id="start">START</a><br>
+ <a href="" id="finish">FINISH</a>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-4.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-4.html
new file mode 100644
index 00000000000..643ff67e8ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-missing-4.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - unkown element id</title>
+<link rel="author" title="Florian Rivoal" href="mailto:florian@rivoal.net">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that an unknow element id used as the value of the 'nav-up' property value does not hinder normal spacial navigation.">
+<style>
+#start {
+ nav-up: #foo;
+}
+</style>
+</head>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up moves the focus to the "FINISH" link.</p>
+
+ <a href="" id="finish">FINISH</a><br>
+ <a href="" id="start">START</a>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-001.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-001.html
new file mode 100644
index 00000000000..91c660272c0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-001.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'current' target frame</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'current' frame value is respected.">
+<style>
+ #start {
+ nav-down: #finish current;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="finish">FINISH</a></p>
+
+ <p><a href="" id="start">START</a></p>
+
+ <iframe src="support/nav-dir-target-001-frame.html"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-002.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-002.html
new file mode 100644
index 00000000000..8c7e5512c36
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-002.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'root' target frame</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'root' frame value is respected.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="finish">FINISH</a></p>
+
+ <iframe src="support/nav-dir-target-002-frame.html"></iframe>
+
+ <p><a href="">ignore</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-003.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-003.html
new file mode 100644
index 00000000000..46e65c4e62e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-003.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - named target frame</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a named target frame value is respected.">
+<style>
+ #start {
+ nav-right: #finish "frame";
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="start">START</a> <a href="" id="finish">ignore</a></p>
+
+ <iframe src="support/nav-dir-target-003-frame.html" name="frame"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-004.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-004.html
new file mode 100644
index 00000000000..82b604598ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-004.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - non-existing target frame</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a non-existing target frame value is treated as 'current'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="finish">ignore</a></p>
+
+ <iframe src="support/nav-dir-target-004-frame.html"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-005.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-005.html
new file mode 100644
index 00000000000..b286df22f66
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-005.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - sibling target frame</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a named frame value also works for sibling frames.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
+
+ <iframe src="support/nav-dir-target-005-frame.html"></iframe>
+ <iframe src="support/nav-dir-target-003-frame.html" name="sibling"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-006.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-006.html
new file mode 100644
index 00000000000..7c9194af538
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-dir-target-006.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - missing target element</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that focus does not change to a different frame if the identifier is missing from the target frame.">
+<style>
+ #start {
+ nav-left: #finish current;
+ }
+ #intermediate {
+ nav-left: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
+
+ <p><a href="">ignore</a> <a href="" id="intermediate">ignore</a> <a href="" id="start">START</a></p>
+
+ <iframe src="support/nav-dir-target-001-frame.html"></iframe>
+
+ <p><a href="" id="end">FINISH</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-000.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-000.html
new file mode 100644
index 00000000000..47ebd3fa278
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-000.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - property inheritance for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'nav-down' property value is not inherited for 'nav-left'.">
+<style type="text/css">
+ #parent {
+ nav-down: #finish;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="">ignore</a></p>
+ <p><a href="">START</a></p>
+ <p><a href="" id="end">FINISH</a></p>
+ <p><a href="" id="finish">ignore</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-001.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-001.html
new file mode 100644
index 00000000000..319be2f89b0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-001.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation (nav-down) - &lt;id&gt;</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that downward navigation input respects the 'nav-down' property.">
+<style>
+ #start {
+ nav-down: #finish;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
+
+ <div><a href="" id="finish">FINISH</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
+
+ <div><a href="">ignore</a> <a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a> <a href="">ignore</a></div>
+
+ <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-002.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-002.html
new file mode 100644
index 00000000000..5d4df4e2d58
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-002.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'auto' value for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'auto' value is implemented for 'nav-down'.">
+<style type="text/css">
+ #start {
+ nav-down: #finish;
+ nav-down: auto;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="start">START</a></p>
+ <p><a href="" id="end">FINISH</a></p>
+ <p><a href="" id="finish">ignore</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-003.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-003.html
new file mode 100644
index 00000000000..6465279e051
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-003.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - ID value for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the ID value is implemented for 'nav-down'.">
+<style type="text/css">
+ #parent {
+ nav-down: #finish;
+ }
+
+ #intermediate {
+ nav-down: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="">ignore</a></p>
+ <p><a href="">START</a></p>
+ <p><a href="" id="intermediate">ignore</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+
+ <div>
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="end">FINISH</a></p>
+ <p><a href="">ignore</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-004.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-004.html
new file mode 100644
index 00000000000..a5b9e01ba3a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-004.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - input elements for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-down' works for input elements.">
+<style type="text/css">
+ #parent {
+ nav-down: #finish;
+ }
+
+ #intermediate {
+ nav-down: #end;
+ }
+
+ input {
+ display: block;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down twice moves the focus to the "FINISH" text field.</p>
+
+ <div id="parent">
+ <input value="ignore"/>
+ <input value="START"/>
+ <input value="ignore" id="intermediate"/>
+ <input value="ignore"/>
+ </div>
+
+ <div>
+ <input value="ignore"/>
+ <input value="FINISH" id="end"/>
+ <input value="ignore"/>
+ <input value="ignore"/>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-005.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-005.html
new file mode 100644
index 00000000000..908b0b7ceaa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-005.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in the writing direction for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-down' works for elements floating to the left.">
+<style type="text/css">
+ div > a {
+ float: left;
+ margin-left: 1em;
+ margin-right: 1em;
+ }
+
+ div {
+ clear: left;
+ }
+
+ #parent {
+ nav-down: #finish;
+ }
+
+ #intermediate {
+ nav-down: #end;
+ }
+
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore 1</a>
+ <a href="">START</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore 3</a>
+ </div>
+
+ <div>
+ <a href="">ignore 4</a>
+ <a href="" id="intermediate">ignore 2</a>
+ <a href="">ignore 5</a>
+ <a href="">ignore 6</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-006.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-006.html
new file mode 100644
index 00000000000..74c98430b39
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-006.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in opposite to the writing direction for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-down' works for elements floating to the right.">
+<style type="text/css">
+ div > a {
+ float: right;
+ margin-left: 1em;
+ margin-right: 1em;
+ }
+
+ div {
+ clear: right;
+ }
+
+ #parent {
+ nav-down: #finish;
+ }
+
+ #intermediate {
+ nav-down: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore 1</a>
+ <a href="">ignore 2</a>
+ <a href="">START</a>
+ <a href="">ignore 3</a>
+ </div>
+
+ <div>
+ <a href="">ignore 4</a>
+ <a href="" id="end">FINISH</a>
+ <a href="" id="intermediate">ignore 5</a>
+ <a href="">ignore 6</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-007.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-007.html
new file mode 100644
index 00000000000..da053f2ebb8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-007.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - non existing ID for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'nav-down' is ignored if the ID does not exist.">
+<style type="text/css">
+ #parent {
+ nav-down: #error;
+ }
+
+ #intermediate {
+ nav-down: #foobar;
+ }
+
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="">START</a></p>
+ <p><a href="" id="intermediate">ignore</a></p>
+ <p><a href="" id="end">FINISH</a>
+ <p><a href="">ignore</a>
+ </div>
+
+ <div>
+ <p><a href="">ignore</a>
+ <p><a href="">ignore</a>
+ <p><a href="" id="error">ignore</a>
+ <p><a href="">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-008.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-008.html
new file mode 100644
index 00000000000..9f3349adaff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-008.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - currently focused element for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that focus doesn't change when navigating to the currently focused element for 'nav-down'.">
+<style>
+ #start {
+ nav-down: #start;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if the "START" element remains focused when navigating down.</p>
+
+ <div>
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="start">START</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-009.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-009.html
new file mode 100644
index 00000000000..782ab20029a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-009.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'current' target frame for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'current' frame value is respected for 'nav-down'.">
+<style>
+ #start {
+ nav-down: #finish current;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
+
+ <div>
+ <p><a href="" id="finish">FINISH</a></p>
+ <iframe src="support/nav-down-009-frame.html"></iframe>
+ <p><a href="" id="start">START</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-010.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-010.html
new file mode 100644
index 00000000000..a27316104a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-010.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'root' target frame for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'root' frame value is respected for 'nav-down'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="finish">FINISH</a></p>
+
+ <iframe src="support/nav-down-010-frame.html"></iframe>
+
+ <p><a href="">ignore</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-011.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-011.html
new file mode 100644
index 00000000000..50bf586eb81
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-011.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - named target frame for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="contributor" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a named target frame value is respected for 'nav-down'.">
+<style>
+ #start {
+ nav-down: #finish "frame";
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
+
+ <p>
+ <a href="" id="start">START</a>
+ </p>
+ <p>
+ <a href="" id="finish">ignore</a>
+ </p>
+
+ <iframe src="support/nav-down-011-frame.html" name="frame"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-012.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-012.html
new file mode 100644
index 00000000000..c9952b4632b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-012.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - non-existing target frame for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a non-existing target frame value is treated as 'current' for 'nav-down'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
+
+ <iframe src="support/nav-down-012-frame.html"></iframe>
+
+ <p><a href="" id="finish">ignore</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-013.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-013.html
new file mode 100644
index 00000000000..2c20dda7fe6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-013.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - sibling target frame for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a named frame value also works for sibling frames for 'nav-down'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down once moves the focus to the "FINISH" link.</p>
+
+ <iframe src="support/nav-down-013-frame.html"></iframe>
+ <iframe src="support/nav-down-011-frame.html" name="sibling"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-014.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-014.html
new file mode 100644
index 00000000000..ff751c89d8b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-014.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - missing target element for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that focus does not change to a different frame if the identifier is missing from the target frame for 'nav-down'.">
+<style>
+ #start {
+ nav-down: #finish current;
+ }
+ #intermediate {
+ nav-down: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="start">START</a></p>
+ <p><a href="" id="intermediate">ignore</a></p>
+ <p><a href="">ignore</a></p>
+
+ <iframe src="support/nav-down-009-frame.html"></iframe>
+
+ <p><a href="" id="end">FINISH</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-015.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-015.html
new file mode 100644
index 00000000000..8c5e2cbf0ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-015.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'inherit' value for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'inherit' value is implemented for 'nav-down'.">
+<style type="text/css">
+ #parent {
+ nav-down: #end;
+ }
+
+ #intermediateParent, #intermediate {
+ nav-down: inherit;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="">ignore</a></p>
+ <p><a href="">START</a></p>
+ <p id="intermediateParent"><a href="" id="intermediate">ignore</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+
+ <div>
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="end">FINISH</a></p>
+ <p><a href="">ignore</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-016.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-016.html
new file mode 100644
index 00000000000..4c247b35750
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-down-016.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - disabled elements are not navigated for 'nav-down'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that disabled elements are not navigated for 'nav-down'.">
+<style type="text/css">
+ #start {
+ nav-down: #intermediate;
+ }
+ input {
+ display: block;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating down moves the focus to the "FINISH" text field and not the disabled "ignore" one.</p>
+
+ <div id="parent">
+ <input value="START"/>
+ <input value="ignore" disabled="disabled" id="intermediate"/>
+ <input value="FINISH"/>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-000.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-000.html
new file mode 100644
index 00000000000..6b4302b78fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-000.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - property inheritance for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'nav-left' property value is not inherited for 'nav-left'.">
+<style type="text/css">
+ #parent {
+ nav-left: #finish;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">START</a>
+ <a href="" id="finish">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-001.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-001.html
new file mode 100644
index 00000000000..7d5bebbfe5c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-001.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation (nav-left) - &lt;id&gt;</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that leftward navigation input respects the 'nav-left' property.">
+<style>
+ #start {
+ nav-left: #finish;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
+
+ <div><a href="">ignore</a> <a href="" id="finish">FINISH</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
+
+ <div><a href="">ignore</a> <a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a> <a href="">ignore</a></div>
+
+ <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-002.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-002.html
new file mode 100644
index 00000000000..0f2618e4c87
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-002.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'auto' value for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'auto' value is implemented for 'nav-left'.">
+<style type="text/css">
+ #start {
+ nav-left: #finish;
+ nav-left: auto;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore</a>
+ <a href="" id="end">FINISH</a>
+ <a href="" id="start">START</a>
+ <a href="" id="finish">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-003.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-003.html
new file mode 100644
index 00000000000..405edba732a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-003.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - ID value for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the ID value is implemented for 'nav-left'.">
+<style type="text/css">
+ #parent {
+ nav-left: #finish;
+ }
+
+ #intermediate {
+ nav-left: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore</a>
+ <a href="" id="intermediate">ignore</a>
+ <a href="">START</a>
+ <a href="">ignore</a>
+ </div>
+
+ <div>
+ <a href="">ignore</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore</a>
+ <a href="">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-004.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-004.html
new file mode 100644
index 00000000000..e68fe6ed55a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-004.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - input elements for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-left' works for input elements.">
+<style type="text/css">
+ #parent {
+ nav-left: #finish;
+ }
+
+ #intermediate {
+ nav-left: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left twice moves the focus to the "FINISH" text field.</p>
+
+ <div id="parent">
+ <input value="ignore"/>
+ <input value="ignore" id="intermediate"/>
+ <input value="START"/>
+ <input value="ignore"/>
+ </div>
+
+ <div>
+ <input value="ignore"/>
+ <input value="FINISH" id="end"/>
+ <input value="ignore"/>
+ <input value="ignore"/>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-005.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-005.html
new file mode 100644
index 00000000000..6ac91c161bd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-005.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in the writing direction for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-left' works for elements floating to the left.">
+<style type="text/css">
+ div > a {
+ float: left;
+ margin-left: 1em;
+ margin-right: 1em;
+ }
+
+ div {
+ clear: left;
+ }
+
+ #parent {
+ nav-left: #finish;
+ }
+
+ #intermediate {
+ nav-left: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore 1</a>
+ <a href="" id="intermediate">ignore 2</a>
+ <a href="">START</a>
+ <a href="">ignore 3</a>
+ </div>
+
+ <div>
+ <a href="">ignore 4</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore 5</a>
+ <a href="">ignore 6</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-006.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-006.html
new file mode 100644
index 00000000000..2e2a93bd87c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-006.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in opposite to the writing direction for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-left' works for elements floating to the right.">
+<style type="text/css">
+ div > a {
+ float: right;
+ margin-left: 1em;
+ margin-right: 1em;
+ }
+
+ div {
+ clear: right;
+ }
+
+ #parent {
+ nav-left: #finish;
+ }
+
+ #intermediate {
+ nav-left: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore 1</a>
+ <a href="">ignore 2</a>
+ <a href="">START</a>
+ <a href="" id="intermediate">ignore 3</a>
+ </div>
+
+ <div>
+ <a href="">ignore 4</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore 5</a>
+ <a href="">ignore 6</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-007.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-007.html
new file mode 100644
index 00000000000..42f19dac0f3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-007.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - non existing ID for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'nav-left' is ignored if the ID does not exist.">
+<style type="text/css">
+ #parent {
+ nav-left: #error;
+ }
+
+ #intermediate {
+ nav-left: #foobar;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="" id="end">FINISH</a>
+ <a href="" id="intermediate">ignore</a>
+ <a href="">START</a>
+ <a href="">ignore</a>
+ </div>
+
+ <div>
+ <a href="">ignore</a>
+ <a href="">ignore</a>
+ <a href="" id="error">ignore</a>
+ <a href="">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-008.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-008.html
new file mode 100644
index 00000000000..ed638c2fbaa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-008.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - currently focused element for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that focus doesn't change when navigating to the currently focused element for 'nav-left'.">
+<style>
+ #start {
+ nav-left: #start;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if the "START" element remains focused when navigating left.</p>
+
+ <div><a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-009.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-009.html
new file mode 100644
index 00000000000..d5e18a59a9b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-009.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'current' target frame for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'current' frame value is respected for 'nav-left'.">
+<style>
+ #start {
+ nav-left: #finish current;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
+
+ <div>
+ <a href="" id="finish">FINISH</a>
+ <iframe src="support/nav-left-009-frame.html"></iframe>
+ <a href="" id="start">START</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-010.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-010.html
new file mode 100644
index 00000000000..1d1129bef14
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-010.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'root' target frame for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'root' frame value is respected for 'nav-left'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="finish">FINISH</a></p>
+
+ <iframe src="support/nav-left-010-frame.html"></iframe>
+
+ <p><a href="">ignore</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-011.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-011.html
new file mode 100644
index 00000000000..545b4497746
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-011.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - named target frame for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="contributor" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a named target frame value is respected for 'nav-left'.">
+<style>
+ #start {
+ nav-left: #finish "frame";
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
+
+ <p>
+ <a href="" id="finish">ignore</a>
+ <a href="" id="start">START</a>
+ </p>
+
+ <iframe src="support/nav-left-011-frame.html" name="frame"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-012.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-012.html
new file mode 100644
index 00000000000..c2bcae53ebf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-012.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - non-existing target frame for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a non-existing target frame value is treated as 'current' for 'nav-left'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
+
+ <div>
+ <a href="" id="finish">ignore</a>
+ <iframe src="support/nav-left-012-frame.html"></iframe>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-013.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-013.html
new file mode 100644
index 00000000000..f73eb42379d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-013.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - sibling target frame for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a named frame value also works for sibling frames for 'nav-left'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left once moves the focus to the "FINISH" link.</p>
+
+ <iframe src="support/nav-left-013-frame.html"></iframe>
+ <iframe src="support/nav-left-011-frame.html" name="sibling"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-014.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-014.html
new file mode 100644
index 00000000000..a844eda7c1d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-014.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - missing target element for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that focus does not change to a different frame if the identifier is missing from the target frame for 'nav-left'.">
+<style>
+ #start {
+ nav-left: #finish current;
+ }
+ #intermediate {
+ nav-left: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
+
+ <p><a href="">ignore</a> <a href="" id="intermediate">ignore</a> <a href="" id="start">START</a></p>
+
+ <iframe src="support/nav-left-009-frame.html"></iframe>
+
+ <p><a href="" id="end">FINISH</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-015.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-015.html
new file mode 100644
index 00000000000..971e8830d7e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-015.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'inherit' value for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'inherit' value is implemented for 'nav-left'.">
+<style type="text/css">
+ #parent {
+ nav-left: #end;
+ }
+
+ #intermediate {
+ nav-left: inherit;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore</a>
+ <a href="" id="intermediate">ignore</a>
+ <a href="">START</a>
+ <a href="">ignore</a>
+ </div>
+
+ <div>
+ <a href="">ignore</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore</a>
+ <a href="">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-016.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-016.html
new file mode 100644
index 00000000000..f801bef1f89
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-left-016.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - disabled elements are not navigated for 'nav-left'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that disabled elements are not navigated for 'nav-left'.">
+<style type="text/css">
+ #start {
+ nav-left: #intermediate;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating left moves the focus to the "FINISH" text field and not the disabled "ignore" one.</p>
+
+ <div id="parent">
+ <input value="FINISH"/>
+ <input value="ignore" disabled="disabled" id="intermediate"/>
+ <input value="START"/>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-000.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-000.html
new file mode 100644
index 00000000000..b637f48bdc9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-000.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - property inheritance for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'nav-right' property value is not inherited for 'nav-left'.">
+<style type="text/css">
+ #parent {
+ nav-right: #finish;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore</a>
+ <a href="">START</a>
+ <a href="" id="end">FINISH</a>
+ <a href="" id="finish">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-001.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-001.html
new file mode 100644
index 00000000000..df022891468
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-001.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation (nav-right) - &lt;id&gt;</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that rightward navigation input respects the 'nav-right' property.">
+<style>
+ #start {
+ nav-right: #finish;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
+
+ <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
+
+ <div><a href="">ignore</a> <a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a> <a href="">ignore</a></div>
+
+ <div><a href="" id="finish">FINISH</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-002.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-002.html
new file mode 100644
index 00000000000..04be3d7cc87
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-002.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'auto' value for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'auto' value is implemented for 'nav-right'.">
+<style type="text/css">
+ #start {
+ nav-right: #finish;
+ nav-right: auto;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore</a>
+ <a href="" id="start">START</a>
+ <a href="" id="end">FINISH</a>
+ <a href="" id="finish">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-003.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-003.html
new file mode 100644
index 00000000000..447226bf3e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-003.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - ID value for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the ID value is implemented for 'nav-right'.">
+<style type="text/css">
+ #parent {
+ nav-right: #finish;
+ }
+
+ #intermediate {
+ nav-right: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore</a>
+ <a href="">START</a>
+ <a href="" id="intermediate">ignore</a>
+ <a href="">ignore</a>
+ </div>
+
+ <div>
+ <a href="">ignore</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore</a>
+ <a href="">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-004.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-004.html
new file mode 100644
index 00000000000..889631920d1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-004.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - input elements for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-right' works for input elements.">
+<style type="text/css">
+ #parent {
+ nav-right: #finish;
+ }
+
+ #intermediate {
+ nav-right: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right twice moves the focus to the "FINISH" text field.</p>
+
+ <div id="parent">
+ <input value="ignore"/>
+ <input value="START"/>
+ <input value="ignore" id="intermediate"/>
+ <input value="ignore"/>
+ </div>
+
+ <div>
+ <input value="ignore"/>
+ <input value="FINISH" id="end"/>
+ <input value="ignore"/>
+ <input value="ignore"/>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-005.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-005.html
new file mode 100644
index 00000000000..bd2a90b94f6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-005.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in the writing direction for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-right' works for elements floating to the left.">
+<style type="text/css">
+ div > a {
+ float: left;
+ margin-right: 1em;
+ margin-right: 1em;
+ }
+
+ div {
+ clear: left;
+ }
+
+ #parent {
+ nav-right: #finish;
+ }
+
+ #intermediate {
+ nav-right: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore 1</a>
+ <a href="">START</a>
+ <a href="" id="intermediate">ignore 2</a>
+ <a href="">ignore 3</a>
+ </div>
+
+ <div>
+ <a href="">ignore 4</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore 5</a>
+ <a href="">ignore 6</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-006.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-006.html
new file mode 100644
index 00000000000..e713ff0163c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-006.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in opposite to the writing direction for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-right' works for elements floating to the right.">
+<style type="text/css">
+ div > a {
+ float: right;
+ margin-right: 1em;
+ margin-right: 1em;
+ }
+
+ div {
+ clear: right;
+ }
+
+ #parent {
+ nav-right: #finish;
+ }
+
+ #intermediate {
+ nav-right: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore 1</a>
+ <a href="" id="intermediate">ignore 2</a>
+ <a href="">START</a>
+ <a href="">ignore 3</a>
+ </div>
+
+ <div>
+ <a href="">ignore 4</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore 5</a>
+ <a href="">ignore 6</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-007.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-007.html
new file mode 100644
index 00000000000..030d9c5e208
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-007.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - non existing ID for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'nav-right' is ignored if the ID does not exist.">
+<style type="text/css">
+ #parent {
+ nav-right: #error;
+ }
+
+ #intermediate {
+ nav-right: #foobar;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">START</a>
+ <a href="" id="intermediate">ignore</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore</a>
+ </div>
+
+ <div>
+ <a href="">ignore</a>
+ <a href="">ignore</a>
+ <a href="" id="error">ignore</a>
+ <a href="">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-008.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-008.html
new file mode 100644
index 00000000000..ddf154c8a35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-008.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - currently focused element for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that focus doesn't change when navigating to the currently focused element for 'nav-right'.">
+<style>
+ #start {
+ nav-right: #start;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if the "START" element remains focused when navigating right.</p>
+
+ <div>
+ <a href="">ignore</a>
+ <a href="" id="start">START</a>
+ <a href="">ignore</a>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-009.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-009.html
new file mode 100644
index 00000000000..b1fe70bd7de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-009.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'current' target frame for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'current' frame value is respected for 'nav-right'.">
+<style>
+ #start {
+ nav-right: #finish current;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
+
+ <div>
+ <a href="" id="start">START</a>
+ <iframe src="support/nav-right-009-frame.html"></iframe>
+ <a href="" id="finish">FINISH</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-010.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-010.html
new file mode 100644
index 00000000000..4c20160e6bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-010.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'root' target frame for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'root' frame value is respected for 'nav-right'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="finish">FINISH</a></p>
+
+ <iframe src="support/nav-right-010-frame.html"></iframe>
+
+ <p><a href="">ignore</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-011.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-011.html
new file mode 100644
index 00000000000..5102cb91e25
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-011.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - named target frame for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="contributor" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a named target frame value is respected for 'nav-right'.">
+<style>
+ #start {
+ nav-right: #finish "frame";
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
+
+ <p>
+ <a href="" id="start">START</a>
+ <a href="" id="finish">ignore</a>
+ </p>
+
+ <iframe src="support/nav-right-011-frame.html" name="frame"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-012.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-012.html
new file mode 100644
index 00000000000..9c5722c8a79
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-012.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - non-existing target frame for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a non-existing target frame value is treated as 'current' for 'nav-right'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
+
+ <div>
+ <iframe src="support/nav-right-012-frame.html"></iframe>
+ <a href="" id="finish">ignore</a>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-013.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-013.html
new file mode 100644
index 00000000000..d4220426604
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-013.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - sibling target frame for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a named frame value also works for sibling frames for 'nav-right'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right once moves the focus to the "FINISH" link.</p>
+
+ <iframe src="support/nav-right-011-frame.html" name="sibling"></iframe>
+ <iframe src="support/nav-right-013-frame.html"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-014.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-014.html
new file mode 100644
index 00000000000..088725a4483
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-014.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - missing target element for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that focus does not change to a different frame if the identifier is missing from the target frame for 'nav-right'.">
+<style>
+ #start {
+ nav-right: #finish current;
+ }
+ #intermediate {
+ nav-right: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
+
+ <p>
+ <a href="" id="start">START</a>
+ <a href="" id="intermediate">ignore</a>
+ <a href="">ignore</a>
+ </p>
+
+ <iframe src="support/nav-right-009-frame.html"></iframe>
+
+ <p><a href="" id="end">FINISH</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-015.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-015.html
new file mode 100644
index 00000000000..7b76b0a0117
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-015.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'inherit' value for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'inherit' value is implemented for 'nav-right'.">
+<style type="text/css">
+ #parent {
+ nav-right: #end;
+ }
+
+ #intermediate {
+ nav-right: inherit;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore</a>
+ <a href="">START</a>
+ <a href="" id="intermediate">ignore</a>
+ <a href="">ignore</a>
+ </div>
+
+ <div>
+ <a href="">ignore</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore</a>
+ <a href="">ignore</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-016.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-016.html
new file mode 100644
index 00000000000..5531c5b60cd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-right-016.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - disabled elements are not navigated for 'nav-right'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that disabled elements are not navigated for 'nav-right'.">
+<style type="text/css">
+ #start {
+ nav-right: #intermediate;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating right moves the focus to the "FINISH" text field and not the disabled "ignore" one.</p>
+
+ <div id="parent">
+ <input value="START"/>
+ <input value="ignore" disabled="disabled" id="intermediate"/>
+ <input value="FINISH"/>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-000.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-000.html
new file mode 100644
index 00000000000..8c71bf51846
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-000.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - property inheritance for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'nav-up' property value is not inherited for 'nav-left'.">
+<style type="text/css">
+ #parent {
+ nav-up: #finish;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="end">FINISH</a></p>
+ <p><a href="">START</a></p>
+ <p><a href="" id="finish">ignore</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-001.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-001.html
new file mode 100644
index 00000000000..576b349959f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-001.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation (nav-up) - &lt;id&gt;</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="reviewer" title="Leif Arne Storset" href="mailto:lstorset@opera.com">
+<link rel="reviewer" title="Rebecca Hauck" href="mailto:rhauck@adobe.com"><!-- 07-18-2013 -->
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that upward navigation input respects the 'nav-up' property.">
+<style>
+ #start {
+ nav-up: #finish;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
+
+ <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a></div>
+
+ <div><a href="">ignore</a> <a href="">ignore</a> <a href="" id="start">START</a> <a href="">ignore</a> <a href="">ignore</a></div>
+
+ <div><a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="">ignore</a> <a href="" id="finish">FINISH</a></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-002.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-002.html
new file mode 100644
index 00000000000..cbcf11a924d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-002.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'auto' value for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'auto' value is implemented for 'nav-up'.">
+<style type="text/css">
+ #start {
+ nav-up: #finish;
+ nav-up: auto;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="end">FINISH</a></p>
+ <p><a href="" id="start">START</a></p>
+ <p><a href="" id="finish">ignore</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-003.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-003.html
new file mode 100644
index 00000000000..9353af9425a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-003.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - ID value for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the ID value is implemented for 'nav-up'.">
+<style type="text/css">
+ #parent {
+ nav-up: #finish;
+ }
+
+ #intermediate {
+ nav-up: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="intermediate">ignore</a></p>
+ <p><a href="">START</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+
+ <div>
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="end">FINISH</a></p>
+ <p><a href="">ignore</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-004.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-004.html
new file mode 100644
index 00000000000..16eb4fd5cff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-004.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - input elements for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-up' works for input elements.">
+<style type="text/css">
+ #parent {
+ nav-up: #finish;
+ }
+
+ #intermediate {
+ nav-up: #end;
+ }
+
+ input {
+ display: block;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up twice moves the focus to the "FINISH" text field.</p>
+
+ <div id="parent">
+ <input value="ignore"/>
+ <input value="ignore" id="intermediate"/>
+ <input value="START"/>
+ <input value="ignore"/>
+ </div>
+
+ <div>
+ <input value="ignore"/>
+ <input value="FINISH" id="end"/>
+ <input value="ignore"/>
+ <input value="ignore"/>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-005.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-005.html
new file mode 100644
index 00000000000..7598a08e22e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-005.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in the writing direction for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-up' works for elements floating to the left.">
+<style type="text/css">
+ div > a {
+ float: up;
+ margin-up: 1em;
+ margin-right: 1em;
+ }
+
+ div {
+ clear: up;
+ }
+
+ #parent {
+ nav-up: #finish;
+ }
+
+ #intermediate {
+ nav-up: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="">ignore 1</a></p>
+ <p><a href="" id="intermediate">ignore 2</a></p>
+ <p><a href="">START</a></p>
+ <p><a href="">ignore 3</a></p>
+ </div>
+
+ <div>
+ <p><a href="">ignore 4</a></p>
+ <p><a href="" id="end">FINISH</a></p>
+ <p><a href="">ignore 5</a></p>
+ <p><a href="">ignore 6</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-006.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-006.html
new file mode 100644
index 00000000000..168276514a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-006.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - elements floating in opposite to the writing direction for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that 'nav-up' works for elements floating to the right.">
+<style type="text/css">
+ div > a {
+ float: right;
+ margin-up: 1em;
+ margin-right: 1em;
+ }
+
+ div {
+ clear: right;
+ }
+
+ #parent {
+ nav-up: #finish;
+ }
+
+ #intermediate {
+ nav-up: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <a href="">ignore 1</a>
+ <a href="" id="intermediate">ignore 3</a>
+ <a href="" id="end">FINISH</a>
+ <a href="">ignore 2</a>
+ </div>
+
+ <div>
+ <a href="">ignore 4</a>
+ <a href="">START</a>
+ <a href="">ignore 5</a>
+ <a href="">ignore 6</a>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-007.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-007.html
new file mode 100644
index 00000000000..17251afd476
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-007.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - non existing ID for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'nav-up' is ignored if the ID does not exist.">
+<style type="text/css">
+ #parent {
+ nav-up: #error;
+ }
+
+ #intermediate {
+ nav-up: #foobar;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="" id="end">FINISH</a></p>
+ <p><a href="" id="intermediate">ignore</a></p>
+ <p><a href="">START</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+
+ <div>
+ <p><a href="">ignore</a></p>
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="error">ignore</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-008.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-008.html
new file mode 100644
index 00000000000..c6c53a68df4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-008.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - currently focused element for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that focus doesn't change when navigating to the currently focused element for 'nav-up'.">
+<style>
+ #start {
+ nav-up: #start;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if the "START" element remains focused when navigating up.</p>
+
+ <div>
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="start">START</a></p>
+ <p><a href="">ignore</a></div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-009.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-009.html
new file mode 100644
index 00000000000..757ca6a9045
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-009.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'current' target frame for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'current' frame value is respected for 'nav-up'.">
+<style>
+ #start {
+ nav-up: #finish current;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
+
+ <div>
+ <p><a href="" id="finish">FINISH</a></p>
+ <iframe src="support/nav-up-009-frame.html"></iframe>
+ <p><a href="" id="start">START</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-010.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-010.html
new file mode 100644
index 00000000000..c7e1c0e4708
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-010.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'root' target frame for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'root' frame value is respected for 'nav-up'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="finish">FINISH</a></p>
+
+ <iframe src="support/nav-up-010-frame.html"></iframe>
+
+ <p><a href="">ignore</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-011.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-011.html
new file mode 100644
index 00000000000..15cccc5b205
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-011.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - named target frame for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="contributor" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a named target frame value is respected for 'nav-up'.">
+<style>
+ #start {
+ nav-up: #finish "frame";
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="finish">ignore</a></p>
+ <p><a href="" id="start">START</a></p>
+
+ <iframe src="support/nav-up-011-frame.html" name="frame"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-012.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-012.html
new file mode 100644
index 00000000000..aed5f2195d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-012.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - non-existing target frame for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a non-existing target frame value is treated as 'current' for 'nav-up'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
+
+ <p><a href="" id="finish">ignore</a></p>
+
+ <iframe src="support/nav-up-012-frame.html"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-013.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-013.html
new file mode 100644
index 00000000000..2fec4da6614
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-013.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - sibling target frame for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that a named frame value also works for sibling frames for 'nav-up'.">
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up once moves the focus to the "FINISH" link.</p>
+
+ <iframe src="support/nav-up-013-frame.html"></iframe>
+ <iframe src="support/nav-up-011-frame.html" name="sibling"></iframe>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-014.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-014.html
new file mode 100644
index 00000000000..ceb29548591
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-014.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - missing target element for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that focus does not change to a different frame if the identifier is missing from the target frame for 'nav-up'.">
+<style>
+ #start {
+ nav-up: #finish current;
+ }
+ #intermediate {
+ nav-up: #end;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
+
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="intermediate">ignore</a></p>
+ <p><a href="" id="start">START</a></p>
+
+ <iframe src="support/nav-up-009-frame.html"></iframe>
+
+ <p><a href="" id="end">FINISH</a></p>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-015.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-015.html
new file mode 100644
index 00000000000..3680bc0ddff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-015.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - 'inherit' value for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that the 'inherit' value is implemented for 'nav-up'.">
+<style type="text/css">
+ #parent {
+ nav-up: #end;
+ }
+
+ #intermediateParent, #intermediate {
+ nav-up: inherit;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" link below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up twice moves the focus to the "FINISH" link.</p>
+
+ <div id="parent">
+ <p><a href="">ignore</a></p>
+ <p id="intermediateParent"><a href="" id="intermediate">ignore</a></p>
+ <p><a href="">START</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+
+ <div>
+ <p><a href="">ignore</a></p>
+ <p><a href="" id="end">FINISH</a></p>
+ <p><a href="">ignore</a></p>
+ <p><a href="">ignore</a></p>
+ </div>
+
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-016.html b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-016.html
new file mode 100644
index 00000000000..bca0f73ddee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/nav-up-016.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>CSS Basic User Interface Test: Directional Focus Navigation - disabled elements are not navigated for 'nav-up'</title>
+<link rel="author" title="Jorrit Vermeiren" href="mailto:jorritv@opera.com">
+<link rel="author" title="Daniel Glazman" href="mailto:d.glazman@partner.samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-ui-4/#nav-dir">
+<meta name="flags" content="interact">
+<meta name="assert" content="Test checks that disabled elements are not navigated for 'nav-up'.">
+<style type="text/css">
+ #start {
+ nav-up: #intermediate;
+ }
+
+ input {
+ display: block;
+ }
+</style>
+<body>
+ <p>First, use directional navigation to navigate the focus to the "START" text field below.</p>
+ <!-- In Opera 12.16, directional navigation may be done using Shift+<arrow key>.
+ In the SmartTV emulator, use the keypad in the GUI. -->
+ <p>Test passes if navigating up moves the focus to the "FINISH" text field and not the disabled "ignore" one.</p>
+
+ <div id="parent">
+ <input value="FINISH"/>
+ <input value="ignore" disabled="disabled" id="intermediate"/>
+ <input value="START"/>
+ </div>
+</body>
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-001-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-001-frame.html
index ad103118664..ad103118664 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-001-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-001-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-002-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-002-frame.html
index 63095a8646d..63095a8646d 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-002-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-002-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-003-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-003-frame.html
index a477638553b..a477638553b 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-003-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-003-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-004-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-004-frame.html
index 024c95610fb..024c95610fb 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-004-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-004-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-005-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-005-frame.html
index caa9b60c8c6..caa9b60c8c6 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-dir-target-005-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-dir-target-005-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-009-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-009-frame.html
index f11d32ed761..f11d32ed761 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-009-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-009-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-010-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-010-frame.html
index 98d6c611f5e..98d6c611f5e 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-010-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-010-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-011-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-011-frame.html
index ce69bc810d6..ce69bc810d6 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-011-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-011-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-012-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-012-frame.html
index 3854596cc41..3854596cc41 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-012-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-012-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-013-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-013-frame.html
index 868281fd100..868281fd100 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-down-013-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-down-013-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-009-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-009-frame.html
index f11d32ed761..f11d32ed761 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-009-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-009-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-010-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-010-frame.html
index e09a3750a93..e09a3750a93 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-010-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-010-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-011-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-011-frame.html
index ce69bc810d6..ce69bc810d6 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-011-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-011-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-012-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-012-frame.html
index 94a0fe5ed8e..94a0fe5ed8e 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-012-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-012-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-013-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-013-frame.html
index e52c9482f4c..e52c9482f4c 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-left-013-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-left-013-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-009-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-009-frame.html
index f11d32ed761..f11d32ed761 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-009-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-009-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-010-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-010-frame.html
index 31732576117..31732576117 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-010-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-010-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-011-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-011-frame.html
index ce69bc810d6..ce69bc810d6 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-011-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-011-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-012-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-012-frame.html
index 71f8b3cfb97..71f8b3cfb97 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-012-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-012-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-013-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-013-frame.html
index e133d15473c..e133d15473c 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-right-013-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-right-013-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-009-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-009-frame.html
index f11d32ed761..f11d32ed761 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-009-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-009-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-010-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-010-frame.html
index ba04833c3b0..ba04833c3b0 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-010-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-010-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-011-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-011-frame.html
index ce69bc810d6..ce69bc810d6 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-011-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-011-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-012-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-012-frame.html
index d0375869f24..d0375869f24 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-012-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-012-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-013-frame.html b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-013-frame.html
index e9af2dbf928..e9af2dbf928 100644
--- a/tests/wpt/web-platform-tests/css/css-ui-3/support/nav-up-013-frame.html
+++ b/tests/wpt/web-platform-tests/css/css-ui-4/support/nav-up-013-frame.html
diff --git a/tests/wpt/web-platform-tests/css/css-values-3/absolute-length-units-001.html b/tests/wpt/web-platform-tests/css/css-values-3/absolute-length-units-001.html
new file mode 100644
index 00000000000..ae20834572e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values-3/absolute-length-units-001.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>absolute length units test</title>
+<meta name="author" title="Hwanseung Lee" href="mailto:hs1217.lee@samsung.com">
+<link rel="help" href="https://drafts.csswg.org/css-values-3/#absolute-lengths"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #t1 { width: 96px; height: 2.54cm; }
+ #t2 { width: 2.54cm; height: 25.4mm; }
+ #t3 { width: 25.4mm; height: 101.6q; }
+ #t4 { width: 101.6q; height: 1in; }
+ #t5 { width: 1in; height: 6pc; }
+ #t6 { width: 6pc; height: 72pt; }
+ #t7 { width: 72pt; height: 96px; }
+</style>
+</head>
+<body>
+ <div id="t1"> </div>
+ <div id="t2"> </div>
+ <div id="t3"> </div>
+ <div id="t4"> </div>
+ <div id="t5"> </div>
+ <div id="t6"> </div>
+ <div id="t7"> </div>
+
+ <script type="text/javascript">
+
+ var test_items = ["t1", "t2", "t3", "t4", "t5", "t6", "t7"]
+
+ function getPropertyValue(id, property) {
+ var elem = document.getElementById(id);
+ return window.getComputedStyle(elem, null).getPropertyValue(property);
+ }
+
+ test(function(){
+ for (var i = 0; i < test_items.length; i++) {
+ assert_equals(getPropertyValue(test_items[i], "width"), getPropertyValue(test_items[i], "height"));
+ }
+ }, "all width and height should be same");
+ </script>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/css-values-3/attr-invalid-type-003.html b/tests/wpt/web-platform-tests/css/css-values-3/attr-invalid-type-003.html
deleted file mode 100644
index 69766c0e11a..00000000000
--- a/tests/wpt/web-platform-tests/css/css-values-3/attr-invalid-type-003.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
- <title>
- CSS Values and Units Test:
- Attribute references (types)
- </title>
- <meta name="assert" content="
- When the type of an att() function is known and unexpected, the declaration is ignored
- " />
-
- <link
- rel="author"
- title="François REMY"
- href="mailto:fremycompany.developer@yahoo.fr"
- / >
-
- <link rel="help" href="http://www.w3.org/TR/css3-values/#attr-notation"/>
-
- <link
- rel="match"
- href="reference/200-200-green.html"
- />
-
- <style type="text/css">
-
- html, body { margin: 0px; padding: 0px; }
-
- html { background: white; overflow: hidden; }
- #outer { position: relative; background: green; }
-
- #outer { width: 200px; width: attr(data-test number); height: 200px; }
- /* NOTE: while '0' is a valid length AND a valid number, the number type isn't a valid representation of a length. */
- /* The reason for this is that most numbers aren't valid length */
- /* ! Spec need some updates to make those assumptions clearly valid (see Tab Atkins for details) */
-
- </style>
-
-</head>
-<body>
-
- <div id="outer" data-test="0"></div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/css-values-3/reference/vh_not_refreshing_on_chrome-ref.html b/tests/wpt/web-platform-tests/css/css-values-3/reference/vh_not_refreshing_on_chrome-ref.html
index eb5b15d4aa5..32ce9ada155 100644
--- a/tests/wpt/web-platform-tests/css/css-values-3/reference/vh_not_refreshing_on_chrome-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-values-3/reference/vh_not_refreshing_on_chrome-ref.html
@@ -1,10 +1,11 @@
<!DOCTYPE html>
-<html>
+<html class="reftest-wait">
<!-- Submitted from TestTWF Paris -->
<head>
<title>CSS Reference File</title>
<link rel="author" title="Marc Bourlon" href="mailto:marc@bourlon.com">
+ <script src="/common/reftest-wait.js"></script>
<style type="text/css">
@@ -15,6 +16,19 @@
</style>
<script type="text/javascript">
+ 'use strict';
+
+ // We must not capture the screen until the frameTest
+ // and testBoxWithVhOnly elements have finished changing height.
+ var elementsPending = 2;
+ function receiveMessage() {
+ if (--elementsPending === 0) {
+ takeScreenshot();
+ }
+ }
+
+ window.addEventListener('message', receiveMessage, false);
+
var height = 200;
function resizeReference() {
@@ -34,6 +48,7 @@
// uncomment the next line to see how a width resize triggers a layout recalculation
//frameTest.style.width = (parseInt(window.getComputedStyle(document.getElementById('frameTest'))['width'], 10) + 1) + "px";
+ window.postMessage('frameTest', '*');
}
}
diff --git a/tests/wpt/web-platform-tests/css/css-values-3/reference/vh_not_refreshing_on_chrome_iframe-ref.html b/tests/wpt/web-platform-tests/css/css-values-3/reference/vh_not_refreshing_on_chrome_iframe-ref.html
index d69465b0bbf..5e35f6261e2 100644
--- a/tests/wpt/web-platform-tests/css/css-values-3/reference/vh_not_refreshing_on_chrome_iframe-ref.html
+++ b/tests/wpt/web-platform-tests/css/css-values-3/reference/vh_not_refreshing_on_chrome_iframe-ref.html
@@ -32,6 +32,7 @@
<div id="referenceBoxGrownHorizontallyByJS"></div>
<script type="text/javascript">
+ 'use strict';
// In case this file was opened by mistake, redirects to proper test
if (window.top.location.href === document.location.href) {
@@ -63,7 +64,11 @@
setDimension('referenceBoxGrownHorizontallyByJS', 'width', referenceDimension);
setDimension('referenceBoxGrownHorizontallyByJS', 'height', referenceDimension);
- setTimeout(animate, 20);
+ if (referenceDimension < 60) {
+ setTimeout(animate, 20);
+ } else {
+ parent.postMessage('testBoxWithVhOnly', '*');
+ }
}
setTimeout(animate, 20);
diff --git a/tests/wpt/web-platform-tests/css/css-values-3/support/vh_not_refreshing_on_chrome_iframe.html b/tests/wpt/web-platform-tests/css/css-values-3/support/vh_not_refreshing_on_chrome_iframe.html
new file mode 100644
index 00000000000..c58ec57a58f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values-3/support/vh_not_refreshing_on_chrome_iframe.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+<!-- Submitted from TestTWF Paris -->
+<head>
+
+ <title>CSS Values and Units Test: vh-based dimension doesn't change when the element other dimension doesn't change.</title>
+
+ <style type="text/css">
+
+ * { margin: 0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size: 13px; }
+
+ /* the first test box has its vertical dimension is set to some vh units */
+ #testBoxWithVhOnly { background: #F00; width: 60px; height: 20vh; float: left; }
+
+ /* the second test box, with fixed height */
+ #testBoxNotGrownHorizontallyByJS { background: #F0F; width: 20vh; height: 60px; float: left; }
+
+ /* third box, changed by using CSS transition */
+ #testBoxWithTransition { background: #FF0; width: 20vh; height: 40px; float: left;
+ transition-property: width, height;
+ transition-duration: 0.3s;
+ transition-delay: 0;
+ }
+
+ /* the reference box, growing in both directions (height by js, width by vh unit */
+ #referenceBoxGrownHorizontallyByJS { background: #0F0; width: 20vh; height: 40px; float: left; }
+
+ p { clear: both; margin: 10px 0; }
+
+ </style>
+
+</head>
+<body>
+
+<p>
+ All boxes should end up the same size. The green box is the reference one.
+</p>
+
+<div id="testBoxWithVhOnly"></div>
+<div id="testBoxNotGrownHorizontallyByJS"></div>
+<div id="testBoxWithTransition"></div>
+<div id="referenceBoxGrownHorizontallyByJS"></div>
+
+<script type="text/javascript">
+ 'use strict';
+
+ // In case this file was opened by mistake, redirects to proper test
+ if (window.top.location.href === document.location.href) {
+
+ window.top.location.href = "vh_not_refreshing_on_chrome.html";
+
+ }
+
+ function setDimension(id, dimension, value) {
+
+ var element = document.getElementById(id);
+
+ element.style[dimension] = value + "px";
+
+ }
+
+ function animate() {
+
+ var viewportHeight = document.documentElement.clientHeight;
+
+ var sizeH = 20;
+
+ var referenceDimension = Math.round(sizeH * viewportHeight / 100);
+
+ setDimension('referenceBoxGrownHorizontallyByJS', 'height', referenceDimension);
+
+ if (referenceDimension < 60) {
+ setTimeout(animate, 20);
+ } else {
+ parent.postMessage('referenceBoxGrownHorizontallyByJS', '*');
+ }
+ }
+
+ setTimeout(animate, 20);
+
+ addEventListener('transitionend', function() {
+ parent.postMessage('testBoxWithTransition', '*');
+ }, false);
+ var transitionedTestBoxStyle = document.getElementById('testBoxWithTransition').style;
+ transitionedTestBoxStyle.height = "60px";
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/css-values-3/unset-value-storage.html b/tests/wpt/web-platform-tests/css/css-values-3/unset-value-storage.html
new file mode 100644
index 00000000000..5869e9e6072
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-values-3/unset-value-storage.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Storage of "unset" value</title>
+<meta name="author" title="Xidorn Quan" href="https://www.upsuper.org">
+<link rel="help" href="https://drafts.csswg.org/css-values-3/#common-keywords"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ div {
+ color: unset;
+ border: unset;
+ }
+</style>
+<body>
+ <div id="log"></div>
+ <script>
+ test(function() {
+ let properties = ["color", "border", "border-left", "border-color", "border-right-style"];
+ let style = document.styleSheets[0].cssRules[0].style;
+ for (let prop of properties) {
+ assert_equals(style.getPropertyValue(prop), "unset", `${prop} is expected to be "unset"`);
+ }
+ });
+ </script>
diff --git a/tests/wpt/web-platform-tests/css/css-values-3/vh_not_refreshing_on_chrome.html b/tests/wpt/web-platform-tests/css/css-values-3/vh_not_refreshing_on_chrome.html
index 11b973a2916..b4e0a413ab9 100644
--- a/tests/wpt/web-platform-tests/css/css-values-3/vh_not_refreshing_on_chrome.html
+++ b/tests/wpt/web-platform-tests/css/css-values-3/vh_not_refreshing_on_chrome.html
@@ -1,6 +1,6 @@
<!-- Submitted from TestTWF Paris -->
<!DOCTYPE html>
-<html>
+<html class="reftest-wait">
<head>
<title>CSS Values and Units Test: vh-based dimension doesn't change when the element's other dimension doesn't change.</title>
<link rel="author" title="Marc Bourlon" href="mailto:marc@bourlon.com">
@@ -8,6 +8,7 @@
<link rel="match" href="reference/vh_not_refreshing_on_chrome-ref.html">
<meta name="assert" content="vh-based dimension doesn't change when the element's other dimension doesn't change.">
<!-- This test exhibits a bug for Chrome 19.0.1084.56 / Mac OS X 10.6.8 -->
+ <script src="/common/reftest-wait.js"></script>
<style type="text/css">
@@ -18,6 +19,19 @@
</style>
<script type="text/javascript">
+ 'use strict';
+
+ // We must not capture the screen until the frameTest, referenceBoxGrownHorizontallyByJS
+ // and testBoxWithTransition elements have finished changing height.
+ var elementsPending = 3;
+ function receiveMessage() {
+ if (--elementsPending === 0) {
+ takeScreenshot();
+ }
+ }
+
+ window.addEventListener('message', receiveMessage, false);
+
var height = 200;
function resizeReference() {
@@ -37,6 +51,7 @@
// uncomment the next line to see how a width resize triggers a layout recalculation
//frameTest.style.width = (parseInt(window.getComputedStyle(document.getElementById('frameTest'))['width'], 10) + 1) + "px";
+ window.postMessage('frameTest', '*');
}
}
@@ -47,7 +62,7 @@
</head>
<body>
-<iframe id="frameTest" src="vh_not_refreshing_on_chrome_iframe.html" frameborder="0"></iframe>
+<iframe id="frameTest" src="support/vh_not_refreshing_on_chrome_iframe.html" frameborder="0"></iframe>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/css/css-values-3/vh_not_refreshing_on_chrome_iframe.html b/tests/wpt/web-platform-tests/css/css-values-3/vh_not_refreshing_on_chrome_iframe.html
deleted file mode 100644
index 89ed75a52b7..00000000000
--- a/tests/wpt/web-platform-tests/css/css-values-3/vh_not_refreshing_on_chrome_iframe.html
+++ /dev/null
@@ -1,85 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!-- Submitted from TestTWF Paris -->
-<head>
-
- <title>CSS Values and Units Test: vh-based dimension doesn't change when the element other dimension doesn't change.</title>
- <meta name="assert" content="vh-based dimension doesn't change when the element other dimension doesn't change. Bug for Chrome 19.0.1084.56 / Mac OS X 10.6.8">
- <link rel="author" title="Marc Bourlon" href="mailto:marc@bourlon.com">
- <link rel="help" href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths" title="5.1.2. Viewport-percentage lengths: the 'vw', 'vh', 'vmin', 'vmax' units">
- <link rel="match" href="reference/vh_not_refreshing_on_chrome-ref.html">
-
- <style type="text/css">
-
- * { margin: 0; padding: 0; font-family: Arial, Helvetica, sans-serif; font-size: 13px; }
-
- /* the first test box has its vertical dimension is set to some vh units */
- #testBoxWithVhOnly { background: #F00; width: 60px; height: 20vh; float: left; }
-
- /* the second test box, with fixed height */
- #testBoxNotGrownHorizontallyByJS { background: #F0F; width: 20vh; height: 60px; float: left; }
-
- /* third box, changed by using CSS transition */
- #testBoxWithTransition { background: #FF0; width: 20vh; height: 40px; float: left;
- transition-property: width, height;
- transition-duration: 1.5s;
- transition-delay: 0;
- }
-
- /* the reference box, growing in both directions (height by js, width by vh unit */
- #referenceBoxGrownHorizontallyByJS { background: #0F0; width: 20vh; height: 40px; float: left; }
-
- p { clear: both; margin: 10px 0; }
-
- </style>
-
-</head>
-<body>
-
-<p>
- All boxes should end up the same size. The green box is the reference one.
-</p>
-
-<div id="testBoxWithVhOnly"></div>
-<div id="testBoxNotGrownHorizontallyByJS"></div>
-<div id="testBoxWithTransition"></div>
-<div id="referenceBoxGrownHorizontallyByJS"></div>
-
-<script type="text/javascript">
-
- // In case this file was opened by mistake, redirects to proper test
- if (window.top.location.href === document.location.href) {
-
- window.top.location.href = "vh_not_refreshing_on_chrome.html";
-
- }
-
- function setDimension(id, dimension, value) {
-
- var element = document.getElementById(id);
-
- element.style[dimension] = value + "px";
-
- }
-
- function animate() {
-
- var viewportHeight = document.documentElement.clientHeight;
-
- var sizeH = 20;
-
- var referenceDimension = Math.round(sizeH * viewportHeight / 100);
-
- setDimension('referenceBoxGrownHorizontallyByJS', 'height', referenceDimension);
-
- setTimeout(animate, 20);
- }
-
- setTimeout(animate, 20);
-
- var transitionedTestBoxStyle = document.getElementById('testBoxWithTransition').style;
- transitionedTestBoxStyle.height = "60px";
-</script>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/css-variables-1/variable-generated-content-dynamic-001-ref.html b/tests/wpt/web-platform-tests/css/css-variables-1/variable-generated-content-dynamic-001-ref.html
new file mode 100644
index 00000000000..893611a1570
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-variables-1/variable-generated-content-dynamic-001-ref.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test Reference</title>
+<div>PASS</div>
diff --git a/tests/wpt/web-platform-tests/css/css-variables-1/variable-generated-content-dynamic-001.html b/tests/wpt/web-platform-tests/css/css-variables-1/variable-generated-content-dynamic-001.html
new file mode 100644
index 00000000000..792c51d31c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-variables-1/variable-generated-content-dynamic-001.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Test: Dynamic attribute change handling in generated content</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="help" href="https://drafts.csswg.org/css-variables/#using-variables">
+<link rel="match" href="variable-generated-content-dynamic-001-ref.html">
+<style>
+:root {
+ --my-attr: attr(data-foo);
+}
+div::before {
+ content: var(--my-attr);
+}
+</style>
+<div data-foo="FAIL"></div>
+<script>
+document.body.offsetTop;
+document.querySelector('div').setAttribute('data-foo', "PASS");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-variables-1/vars-font-shorthand-001.html b/tests/wpt/web-platform-tests/css/css-variables-1/vars-font-shorthand-001.html
index 89886d9dd90..3c280547fb3 100644
--- a/tests/wpt/web-platform-tests/css/css-variables-1/vars-font-shorthand-001.html
+++ b/tests/wpt/web-platform-tests/css/css-variables-1/vars-font-shorthand-001.html
@@ -6,11 +6,6 @@
<meta name="flags" content="ahem">
<style>
-@font-face {
- font-family: Ahem;
- src: url(https://cdn.rawgit.com/w3c/csswg-test/master/fonts/ahem/ahem.ttf);
-}
-
div {
width: 150px;
height: 150px;
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/background-position-vrl-018-ref.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/background-position-vrl-018-ref.xht
index e75ef353d8f..bda2fb623ec 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/background-position-vrl-018-ref.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/background-position-vrl-018-ref.xht
@@ -11,6 +11,11 @@
<meta content="image" name="flags" />
<style type="text/css"><![CDATA[
+ html
+ {
+ line-height: 1;
+ }
+
div#expected
{
text-align: right;
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vlr-007.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vlr-007.xht
index 34faf644698..a02689e3f5c 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vlr-007.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vlr-007.xht
@@ -16,7 +16,7 @@
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta content="image" name="flags" />
- <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-lr' are not substracted by the amount of their borders. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
+ <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-lr' are not subtracted by the amount of their borders. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
<style type="text/css"><![CDATA[
table
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vlr-009.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vlr-009.xht
index 39fd43e0382..1679daeae81 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vlr-009.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vlr-009.xht
@@ -16,7 +16,7 @@
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta content="image" name="flags" />
- <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-lr' are not substracted by the amount of their horizontal padding. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
+ <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-lr' are not subtracted by the amount of their horizontal padding. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
<style type="text/css"><![CDATA[
table
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vrl-006.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vrl-006.xht
index d973517806a..52ecdebc3c1 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vrl-006.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vrl-006.xht
@@ -16,7 +16,7 @@
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta content="image" name="flags" />
- <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-rl' are not substracted by the amount of their borders. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
+ <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-rl' are not subtracted by the amount of their borders. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
<style type="text/css"><![CDATA[
table
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vrl-008.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vrl-008.xht
index 625f2c4e958..24c10092616 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vrl-008.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/contiguous-floated-table-vrl-008.xht
@@ -16,7 +16,7 @@
<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
<meta content="image" name="flags" />
- <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-rl' are not substracted by the amount of their horizontal padding. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
+ <meta content="This test checks that horizontal margins existing between contiguous floated tables with writing-mode set to 'vertical-rl' are not subtracted by the amount of their horizontal padding. In this test, there should be an horizontal gap of 50px separating both tables. Margins between 2 floated boxes do not collapse." name="assert" />
<style type="text/css"><![CDATA[
table
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-003.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-003.xht
index 263d55d8f52..2dda4210797 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-003.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-003.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vlr-003-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-005.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-005.xht
index 32e2ddca166..a0e8943493e 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-005.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-005.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vlr-003-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-007.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-007.xht
index c1f3e128b35..c43d7d2eb2c 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-007.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-007.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vlr-007-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-009.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-009.xht
index 1c631694057..746fab562a8 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-009.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-009.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vlr-007-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-011.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-011.xht
index 953c7f076c5..db8eb019631 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-011.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-011.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vlr-011-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-013.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-013.xht
index b4c56d52f31..7721919ac6f 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-013.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-013.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vlr-011-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-021.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-021.xht
index 8f1b60c7c98..4da9a5fbd6a 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-021.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-021.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vlr-021-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
<meta name="DC.date.created" content="2015-07-22T09:54:03+11:00" scheme=
"W3CDTF" />
<meta name="DC.date.modified" content="2016-07-22T09:54:03+11:00" scheme=
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-023.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-023.xht
index 802a3fd2257..ae5a2f53025 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-023.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vlr-023.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vlr-023-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
<meta name="DC.date.created" content="2015-07-22T09:54:03+11:00" scheme="W3CDTF" />
<meta name="DC.date.modified" content="2016-07-22T09:54:03+11:00" scheme="W3CDTF" />
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-002.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-002.xht
index 1c572846714..422f7d75d67 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-002.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-002.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vrl-002-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-004.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-004.xht
index 558d7a25bf5..4f3f06f578e 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-004.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-004.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vrl-002-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-006.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-006.xht
index f49258d71b0..0776ff9280c 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-006.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-006.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vrl-006-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-008.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-008.xht
index c2733337308..69485d7010b 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-008.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-008.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vrl-006-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-010.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-010.xht
index db85b1d3485..ca6f77d83e2 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-010.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-010.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vrl-010-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a border. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'border-left' of inline box and transparent 'border-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-012.xht b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-012.xht
index dac6eef0fd0..9376aee0ff0 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-012.xht
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/line-box-height-vrl-012.xht
@@ -17,7 +17,7 @@
<link rel="match" href="line-box-height-vrl-010-ref.xht" />
<meta content="" name="flags" />
- <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accomodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
+ <meta content="This test checks that a line box height does not increase because an inline non-replaced box has a padding. In this test, the '34' inline box and the '56' inline box should be lined up with its inline '12' sibling. The line box height, enclosed by the blue border should not grow to accommodate transparent 'padding-left' of inline box and transparent 'padding-right' of inline box." name="assert" />
<style type="text/css"><![CDATA[
body
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001.html
index 624a7bb01ad..795bf6b7001 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001.html
@@ -172,8 +172,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html
index e4372283895..6811313fb74 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html
index 048306e78b1..97013917ef5 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html
index 352b68a8980..4a18f322d0c 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001c.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html
index 8050aa59279..95e714666f9 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001d.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html
index 31f17bc8ef2..7347b676090 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001e.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001f.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001f.html
index 02c66a8f6e9..35dbaca24c7 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001f.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001f.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html
index a4f9525de68..b7730a649e7 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001g.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html
index f10633be830..adca0e9165b 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001h.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001i.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001i.html
index 62073f055c8..6fb680e35d3 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001i.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001i.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001j.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001j.html
index fbc401c0156..a9a4a62e28c 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001j.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001j.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001k.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001k.html
index d0ea4ccc8d7..931cefc8a29 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001k.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001k.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001l.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001l.html
index de00ffbccf1..f3482a1e427 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001l.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001l.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001m.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001m.html
index 1c39d495cfe..e68683823a6 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001m.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001m.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001n.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001n.html
index 52ea6092965..84ac1834907 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001n.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001n.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001o.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001o.html
index 85c1f99a99b..82599c9059c 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001o.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001o.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001p.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001p.html
index 613292a5eec..653dc374a89 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001p.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001p.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001q.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001q.html
index c2fe4a5759f..070f08b6bc1 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001q.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001q.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001r.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001r.html
index 53515105a9a..86ffb3f79c5 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001r.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001r.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001s.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001s.html
index bcfeb624f7a..24cf31e3f0e 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001s.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001s.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001t.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001t.html
index e0e93baf48a..c5c9ca38af9 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001t.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001t.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001u.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001u.html
index c4e381a3f5f..c49d1ef3d74 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001u.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001u.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001v.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001v.html
index a20c54f6576..01bc8f8b3aa 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001v.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001v.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001w.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001w.html
index d7f3211ebaf..27b00d9611a 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001w.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001w.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001x.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001x.html
index fb79a2a6b51..0ec5d97a9b5 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001x.html
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001x.html
@@ -80,8 +80,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/support/text-orientation.js b/tests/wpt/web-platform-tests/css/css-writing-modes-3/support/text-orientation.js
index 6e007cea82e..fb6eb7d60de 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/support/text-orientation.js
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/support/text-orientation.js
@@ -69,13 +69,12 @@
}});
function Results(name) {
- var block = document.createElement("details");
- this.summary = appendChildElement(block, "summary");
+ this.details = document.createElement("details");
+ this.summary = appendChildElement(this.details, "summary");
this.summary.textContent = name;
- var typeList = appendChildElement(block, "ul");
+ var typeList = appendChildElement(this.details, "ul");
this.failList = appendChildElement(appendChildElement(typeList, "li", "Failures"), "ol");
this.inconclusiveList = appendChildElement(appendChildElement(typeList, "li", "Inconclusives"), "ol");
- details.appendChild(block);
this.passCount = 0;
this.failCount = 0;
this.inconclusiveCount = 0;
@@ -101,6 +100,7 @@
this.summary.textContent += " (" + this.passCount + " passes, " +
this.failCount + " fails, " +
this.inconclusiveCount + " inconclusives)";
+ details.appendChild(this.details);
assert_equals(this.failCount, 0, "Fail count");
assert_greater_than(this.passCount, 0, "Pass count");
test.done();
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/tools/generators/orthogonal-parent-shrink-to-fit.ejs b/tests/wpt/web-platform-tests/css/css-writing-modes-3/tools/generators/orthogonal-parent-shrink-to-fit.ejs
index 987c4a1fb62..b395a7c944b 100644
--- a/tests/wpt/web-platform-tests/css/css-writing-modes-3/tools/generators/orthogonal-parent-shrink-to-fit.ejs
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/tools/generators/orthogonal-parent-shrink-to-fit.ejs
@@ -121,8 +121,6 @@ function run() {
}
}, title);
});
- if (window.testRunner)
- container.style.display = "none";
done();
}
</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-computed-root.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-computed-root.html
new file mode 100644
index 00000000000..7741ac7051e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-computed-root.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Writing Modes Test: Computed writing-mode for html element when writing mode for body propagated to viewport</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#principal-flow">
+<meta name="assert" content="Test that propagating writing-mode from body to viewport does not affect the computed writing-mode of the html element">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ .vertical-lr { writing-mode: vertical-lr }
+</style>
+<body class="vertical-lr">
+<script>
+ test(function() {
+ assert_equals(getComputedStyle(document.body).writingMode, "vertical-lr");
+ }, "Check computed writing-mode for body element.");
+
+ test(function() {
+ assert_not_equals(getComputedStyle(document.documentElement).writingMode, "vertical-lr");
+ }, "Check computed writing-mode for html root element.");
+
+ test(function() {
+ document.body.className = "";
+ assert_not_equals(getComputedStyle(document.body).writingMode, "vertical-lr");
+ }, "Check computed writing-mode for body element when style no longer applies.");
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-lr.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-lr.html
new file mode 100644
index 00000000000..8c59532b1a5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-lr.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Writing Modes Test: body vertical-lr propagated to viewport - scroll direction</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#principal-flow">
+<meta name="assert" content="Test that propagating writing-mode from body to viewport affects scroll direction">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ html { writing-mode: vertical-rl; }
+ body { writing-mode: vertical-lr; width: 10000px; }
+
+ .result-wm, .result-wm > body {
+ writing-mode: horizontal-tb;
+ width: auto;
+ }
+</style>
+<body>
+<script>
+ test(function() {
+ assert_equals(document.documentElement.scrollLeft, 0, "scrollLeft should be 0.");
+ }, "Check initial scroll position of viewport.");
+
+ test(function() {
+ document.documentElement.scrollLeft = -1000;
+ assert_equals(document.documentElement.scrollLeft, 0, "scrollLeft should be 0.");
+ }, "Scroll to scrollLeft = -1000 should not be possible.");
+
+ test(function() {
+ document.documentElement.scrollLeft = 1000;
+ assert_equals(document.documentElement.scrollLeft, 1000, "scrollLeft should be 1000.");
+ }, "Scroll to scrollLeft = 1000 should be possible.");
+
+ // Reset back to horizontal-tb to make the result readable on-screen.
+ document.documentElement.className = "result-wm";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-rl.html b/tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-rl.html
new file mode 100644
index 00000000000..523928f9ad8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css-writing-modes-3/wm-propagation-body-scroll-offset-vertical-rl.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Writing Modes Test: body vertical-rl propagated to viewport - scroll direction</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://www.w3.org/TR/css-writing-modes-3/#principal-flow">
+<meta name="assert" content="Test that propagating writing-mode from body to viewport affects scroll direction">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ html { writing-mode: vertical-lr; }
+ body { writing-mode: vertical-rl; width: 10000px; }
+
+ .result-wm, .result-wm > body {
+ writing-mode: horizontal-tb;
+ width: auto;
+ }
+</style>
+<body>
+<script>
+ test(function() {
+ assert_equals(document.documentElement.scrollLeft, 0, "scrollLeft should be 0.");
+ }, "Check initial scroll position of viewport.");
+
+ test(function() {
+ document.documentElement.scrollLeft = -1000;
+ assert_equals(document.documentElement.scrollLeft, -1000, "scrollLeft should be -1000.");
+ }, "Scroll to scrollLeft = -1000 should be possible.");
+
+ test(function() {
+ document.documentElement.scrollLeft = 1000;
+ assert_equals(document.documentElement.scrollLeft, 0, "scrollLeft should be 0.");
+ }, "Scroll to scrollLeft = 1000 should not be possible.");
+
+ // Reset back to horizontal-tb to make the result readable on-screen.
+ document.documentElement.className = "result-wm";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/css3-color/t424-hsl-parsing-f.xht b/tests/wpt/web-platform-tests/css/css3-color/t424-hsl-parsing-f.xht
index 5e2824529b3..ca89eae62d0 100644
--- a/tests/wpt/web-platform-tests/css/css3-color/t424-hsl-parsing-f.xht
+++ b/tests/wpt/web-platform-tests/css/css3-color/t424-hsl-parsing-f.xht
@@ -13,8 +13,6 @@
p { color: hsl(120, 100%, 25%); }
p { color: hsl(0, 255, 128); }
p { color: hsl(0%, 100%, 50%); }
- p { color: hsl(0, 100%, 50%, 1); }
- p { color: hsl(0deg, 100%, 50%); }
p { color: hsl(0px, 100%, 50%); }
]]></style>
</head>
diff --git a/tests/wpt/web-platform-tests/css/css3-color/t425-hsla-parsing-f.xht b/tests/wpt/web-platform-tests/css/css3-color/t425-hsla-parsing-f.xht
index 18d22cb9734..67ce55f4ac6 100644
--- a/tests/wpt/web-platform-tests/css/css3-color/t425-hsla-parsing-f.xht
+++ b/tests/wpt/web-platform-tests/css/css3-color/t425-hsla-parsing-f.xht
@@ -11,14 +11,10 @@
<style type="text/css"><![CDATA[
html, body { background: white; }
p { color: hsla(120, 100%, 25%, 1.0); }
- p { color: hsla(0, 100%, 25%); }
p { color: hsla(0, 100%, 25%, 1.0, 1.0); }
p { color: hsla(0, 100%, 25%, 1.0,); }
p { color: hsla(0, 255, 128, 1.0); }
p { color: hsla(0%, 100%, 50%, 1.0); }
- p { color: hsla(0, 100%, 50%, 1%); }
- p { color: hsla(0, 100%, 50%, 0%); }
- p { color: hsla(0deg, 100%, 50%, 1.0); }
p { color: hsla(0px, 100%, 50%, 1.0); }
]]></style>
</head>
diff --git a/tests/wpt/web-platform-tests/css/css3-selectors/i18n/OWNERS b/tests/wpt/web-platform-tests/css/css3-selectors/i18n/OWNERS
new file mode 100644
index 00000000000..30ef550185b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/css3-selectors/i18n/OWNERS
@@ -0,0 +1 @@
+@r12a
diff --git a/tests/wpt/web-platform-tests/css/fonts/ahem/COPYING b/tests/wpt/web-platform-tests/css/fonts/ahem/COPYING
deleted file mode 100644
index 6327b904bed..00000000000
--- a/tests/wpt/web-platform-tests/css/fonts/ahem/COPYING
+++ /dev/null
@@ -1,36 +0,0 @@
-The Ahem font in this directory belongs to the public domain. In
-jurisdictions that do not recognize public domain ownership of these
-files, the following Creative Commons Zero declaration applies:
-
-<http://labs.creativecommons.org/licenses/zero-waive/1.0/us/legalcode>
-
-which is quoted below:
-
- The person who has associated a work with this document (the "Work")
- affirms that he or she (the "Affirmer") is the/an author or owner of
- the Work. The Work may be any work of authorship, including a
- database.
-
- The Affirmer hereby fully, permanently and irrevocably waives and
- relinquishes all of her or his copyright and related or neighboring
- legal rights in the Work available under any federal or state law,
- treaty or contract, including but not limited to moral rights,
- publicity and privacy rights, rights protecting against unfair
- competition and any rights protecting the extraction, dissemination
- and reuse of data, whether such rights are present or future, vested
- or contingent (the "Waiver"). The Affirmer makes the Waiver for the
- benefit of the public at large and to the detriment of the Affirmer's
- heirs or successors.
-
- The Affirmer understands and intends that the Waiver has the effect
- of eliminating and entirely removing from the Affirmer's control all
- the copyright and related or neighboring legal rights previously held
- by the Affirmer in the Work, to that extent making the Work freely
- available to the public for any and all uses and purposes without
- restriction of any kind, including commercial use and uses in media
- and formats or by methods that have not yet been invented or
- conceived. Should the Waiver for any reason be judged legally
- ineffective in any jurisdiction, the Affirmer hereby grants a free,
- full, permanent, irrevocable, nonexclusive and worldwide license for
- all her or his copyright and related or neighboring legal rights in
- the Work.
diff --git a/tests/wpt/web-platform-tests/css/fonts/ahem/README b/tests/wpt/web-platform-tests/css/fonts/ahem/README
deleted file mode 100644
index ab95bd4888d..00000000000
--- a/tests/wpt/web-platform-tests/css/fonts/ahem/README
+++ /dev/null
@@ -1,49 +0,0 @@
-The Ahem font was developed by Todd Fahrner to help test writers
-develop predictable tests. The font's em square is exactly square.
-Its ascent and descent is exactly the size of the em square. This
-means that the font's extent is exactly the same as its line-height,
-meaning that it can be exactly aligned with padding, borders, margins,
-and so forth.
-
-The font's alphabetic baseline is 0.2em above its bottom, and 0.8em
-below its top. The font has an x-height of 0.8em.
-
-The font has four main glyphs:
-
- 'X' U+0058 A square exactly 1em in height and width.
-
- 'p' U+0070 A rectangle exactly 0.2em high, 1em wide, and aligned so
- that its top is flush with the baseline.
-
- 'É' U+00C9 A rectangle exactly 0.8em high, 1em wide, and aligned so
- that its bottom is flush with the baseline.
-
- ' ' U+0020 A transparent space exactly 1em high and wide.
-
-Most other US-ASCII characters in the font have the same glyph as X.
-
-Additionally, the following Unicode formatting characters are assigned
-appropriate glyphs so that they may safely be used in tests as well:
-
- U+2002 - en-space (0.5em)
- U+2003 - em-space
- U+2004 - 3-per-em space
- U+2005 - 4-per-em space
- U+2006 - six-per-em space
- U+2009 - thin space (0.2em)
- U+200A - hair space (0.1em)
- U+200B - zero-width space
- U+200C - zero-width non-joiner
- U+200D - zero-width joiner
- U+3000 - ideographic space (1em)
- U+FEFF - zero-width non-breaking space
-
-The Ahem font belongs to the public domain as described in COPYING.
-
-Acknowledgements:
- v1 The font was originally created by Todd Fahrner in the late 90s.
- v2 It was updated by Paul Nelson in the mid 2000s to add x-height
- information to the OS/2 table and to add the space and non-breaking
- space glyphs.
- v3 It was further updated by Sergey Malkin to include the non-ASCII
- space glyphs.
diff --git a/tests/wpt/web-platform-tests/css/fonts/ahem/ahem.ttf b/tests/wpt/web-platform-tests/css/fonts/ahem/ahem.ttf
deleted file mode 100644
index a18a56c1525..00000000000
--- a/tests/wpt/web-platform-tests/css/fonts/ahem/ahem.ttf
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/DOMMatrix-attributes.html b/tests/wpt/web-platform-tests/css/geometry-1/DOMMatrix-attributes.html
new file mode 100644
index 00000000000..4b3db9d5508
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/geometry-1/DOMMatrix-attributes.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<title>Geometry Interfaces: DOMMatrix attributes</title>
+<link rel="help" href="https://drafts.fxtf.org/geometry/#dommatrix-attributes">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const initial = {
+ a: 1, b: 0, c: 0, d: 1, e: 0, f: 0,
+ m11: 1, m12: 0, m13: 0, m14: 0,
+ m21: 0, m22: 1, m23: 0, m24: 0,
+ m31: 0, m32: 0, m33: 1, m34: 0,
+ m41: 0, m42: 0, m43: 0, m44: 1,
+};
+
+// Attributes that always preserve is2D.
+["a", "b", "c", "d", "e", "f",
+ "m11", "m12", "m21", "m22", "m41", "m42" ].forEach(attribute => {
+ test(() => {
+ let m = new DOMMatrix();
+ assert_true(m.is2D);
+ assert_equals(m[attribute], initial[attribute]);
+ m[attribute] = 42;
+ assert_true(m.is2D);
+ assert_equals(m[attribute], 42);
+ }, `DOMMatrix.${attribute}`);
+});
+
+// Attributes that clear is2D for values other than 0 or -0.
+["m13", "m14", "m23", "m24", "m31", "m32", "m34", "m43" ].forEach(attribute => {
+ test(() => {
+ let m = new DOMMatrix();
+ assert_true(m.is2D);
+ assert_equals(m[attribute], initial[attribute]);
+ m[attribute] = 0;
+ assert_true(m.is2D, "0 preserves is2D");
+ assert_equals(m[attribute], 0);
+ m[attribute] = -0;
+ assert_true(m.is2D, "-0 preserves is2D");
+ assert_equals(m[attribute], -0);
+ m[attribute] = 42;
+ assert_false(m.is2D, "a value other than 0 or -0 clears is2D");
+ assert_equals(m[attribute], 42);
+ m[attribute] = 0;
+ assert_false(m.is2D, "is2D can never be set to true after having been set to false");
+ assert_equals(m[attribute], 0);
+ }, `DOMMatrix.${attribute}`);
+});
+
+// Attributes that clear is2D for values other than 1.
+["m33", "m44" ].forEach(attribute => {
+ test(() => {
+ let m = new DOMMatrix();
+ assert_true(m.is2D);
+ assert_equals(m[attribute], initial[attribute]);
+ m[attribute] = 1;
+ assert_true(m.is2D, "1 preserves is2D");
+ assert_equals(m[attribute], 1);
+ m[attribute] = 42;
+ assert_false(m.is2D, "a value other than 1 clears is2D");
+ assert_equals(m[attribute], 42);
+ m[attribute] = 1;
+ assert_false(m.is2D, "is2D can never be set to true after having been set to false");
+ assert_equals(m[attribute], 1);
+ }, `DOMMatrix.${attribute}`);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/DOMMatrix2DInit-validate-fixup.html b/tests/wpt/web-platform-tests/css/geometry-1/DOMMatrix2DInit-validate-fixup.html
new file mode 100644
index 00000000000..5fb7e7d271b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/geometry-1/DOMMatrix2DInit-validate-fixup.html
@@ -0,0 +1,183 @@
+<!DOCTYPE html>
+<title>Geometry Interfaces: DOMMatrix2DInit validate and fixup</title>
+<link rel="help" href="https://drafts.fxtf.org/geometry/#dommatrixinit-dictionary">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-context-2d-settransform">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support/dommatrix-test-util.js"></script>
+<canvas id=canvas hidden></canvas>
+<script>
+setup(() => {
+ window.canvas = document.getElementById('canvas');
+ window.ctx = canvas.getContext('2d');
+ window.ctx.fillStyle = '#000';
+});
+
+function clearCanvas(ctx) {
+ ctx.resetTransform();
+ ctx.clearRect(0, 0, window.canvas.width, window.canvas.height);
+}
+
+function drawRectWithSetTransform(ctx, transform) {
+ clearCanvas(ctx);
+ ctx.setTransform(transform);
+ ctx.fillRect(20, 20, 30, 30);
+ return window.canvas.toDataURL();
+}
+
+function drawRectWithAddPathTransform(ctx, transform) {
+ clearCanvas(ctx);
+ var path = new Path2D();
+ path.rect(20, 20, 30, 30);
+ var transformedPath = new Path2D();
+ if (transform === undefined) {
+ transformedPath.addPath(path);
+ } else {
+ transformedPath.addPath(path, transform);
+ }
+ ctx.fill(transformedPath);
+ return window.canvas.toDataURL();
+}
+
+[
+ {a: 1, m11: 2},
+ {b: 0, m12: -1},
+ {c: Infinity, m21: -Infinity},
+ {d: 0, m22: NaN},
+ {e: 1, m41: 1.00000001},
+ {f: 0, m42: Number.MIN_VALUE},
+].forEach(dict => {
+ test(() => {
+ ctx.resetTransform();
+ assert_throws(new TypeError(), () => ctx.setTransform(dict));
+ }, `setTransform(${format_dict(dict)}) (invalid)`);
+
+ test(() => {
+ assert_throws(new TypeError(), () => drawRectWithAddPathTransform(ctx, dict));
+ }, `addPath(${format_dict(dict)}) (invalid)`);
+});
+
+test(() => {
+ ctx.resetTransform();
+ ctx.setTransform(1, 2, 3, 4, 5, 6);
+ const matrix = ctx.getTransform();
+ checkMatrix(matrix, matrix2D({m11: 1, m12: 2, m21: 3, m22: 4, m41: 5, m42: 6}));
+}, `setTransform (Sanity check without dictionary)`);
+
+test(() => {
+ var ident = matrix2D({});
+ var expectedResultURL = drawRectWithSetTransform(ctx, ident);
+ var actualResultURL = drawRectWithAddPathTransform(ctx);
+ assert_equals(actualResultURL, expectedResultURL);
+}, `addPath (Sanity check without second parameter)`);
+
+[
+ // Input dict that would throw if ignore3D was false
+ [{m13: 1, is2D: true}, matrix2D({})],
+ [{m14: 1, is2D: true}, matrix2D({})],
+ [{m23: 1, is2D: true}, matrix2D({})],
+ [{m24: 1, is2D: true}, matrix2D({})],
+ [{m31: 1, is2D: true}, matrix2D({})],
+ [{m32: 1, is2D: true}, matrix2D({})],
+ [{m33: 0, is2D: true}, matrix2D({})],
+ [{m33: -0, is2D: true}, matrix2D({})],
+ [{m33: -1, is2D: true}, matrix2D({})],
+ [{m34: 1, is2D: true}, matrix2D({})],
+ [{m43: 1, is2D: true}, matrix2D({})],
+ [{m44: 0, is2D: true}, matrix2D({})],
+
+ // Input dict that are 2D
+ [{}, matrix2D({})],
+ [{is2D: undefined}, matrix2D({})],
+ [{a: 1, m11: 1}, matrix2D({m11: 1})],
+ [{b: 0, m12: undefined}, matrix2D({m12: 0})],
+ [{c: 0, m21: 0}, matrix2D({m21: 0})],
+ [{c: 0, m21: -0}, matrix2D({m21: -0})],
+ [{c: -0, m21: 0}, matrix2D({m21: 0})],
+ [{c: -0, m21: -0}, matrix2D({m21: -0})],
+ [{d: Infinity, m22: Infinity}, matrix2D({})], // should be silently ignored
+ [{e: -Infinity, m41: -Infinity}, matrix2D({})], // should be silently ignored
+ [{f: NaN, m42: NaN}, matrix2D({})], // should be silently ignored
+ [{f: NaN, m42: NaN, is2D: true}, matrix2D({})], // should be silently ignored
+ [{f: 0, m42: null}, matrix2D({m42: 0})], // null is converted to 0
+ [{f: -0, m42: null}, matrix2D({m42: 0})], // null is converted to 0
+ [{a: 2}, matrix2D({m11: 2})],
+ [{b: 2}, matrix2D({m12: 2})],
+ [{c: 2}, matrix2D({m21: 2})],
+ [{d: 2}, matrix2D({m22: 2})],
+ [{e: 2}, matrix2D({m41: 2})],
+ [{f: 2}, matrix2D({m42: 2})],
+ [{a: -0, b: -0, c: -0, d: -0, e: -0, f: -0},
+ matrix2D({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0})],
+ [{a: -0, b: -0, c: -0, d: -0, e: -0, f: -0, is2D: true},
+ matrix2D({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0})],
+ [{m11:2}, matrix2D({m11: 2})],
+ [{m12:2}, matrix2D({m12: 2})],
+ [{m21:2}, matrix2D({m21: 2})],
+ [{m22:2}, matrix2D({m22: 2})],
+ [{m41:2}, matrix2D({m41: 2})],
+ [{m42:2}, matrix2D({m42: 2})],
+ [{m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0},
+ matrix2D({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0})],
+ [{m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0, is2D: true},
+ matrix2D({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0})],
+ [{m13: 0, is2D: true}, matrix2D({})],
+ [{m13: -0, is2D: true}, matrix2D({})],
+ [{m14: 0, is2D: true}, matrix2D({})],
+ [{m14: -0, is2D: true}, matrix2D({})],
+ [{m23: 0, is2D: true}, matrix2D({})],
+ [{m23: -0, is2D: true}, matrix2D({})],
+ [{m24: 0, is2D: true}, matrix2D({})],
+ [{m24: -0, is2D: true}, matrix2D({})],
+ [{m31: 0, is2D: true}, matrix2D({})],
+ [{m31: -0, is2D: true}, matrix2D({})],
+ [{m32: 0, is2D: true}, matrix2D({})],
+ [{m32: -0, is2D: true}, matrix2D({})],
+ [{m33: 1, is2D: true}, matrix2D({})],
+ [{m34: 0, is2D: true}, matrix2D({})],
+ [{m34: -0, is2D: true}, matrix2D({})],
+ [{m43: 0, is2D: true}, matrix2D({})],
+ [{m43: -0, is2D: true}, matrix2D({})],
+ [{m44: 1, is2D: true}, matrix2D({})],
+ [{is2D: true}, matrix2D({})],
+
+ // Input dict that are 3D, but 3D members are ignored
+ [{m13: 1, is2D: false}, matrix2D({})],
+ [{m14: 1, is2D: false}, matrix2D({})],
+ [{m23: 1, is2D: false}, matrix2D({})],
+ [{m24: 1, is2D: false}, matrix2D({})],
+ [{m31: 1, is2D: false}, matrix2D({})],
+ [{m32: 1, is2D: false}, matrix2D({})],
+ [{m33: 0, is2D: false}, matrix2D({})],
+ [{m33: -0, is2D: false}, matrix2D({})],
+ [{m33: -1, is2D: false}, matrix2D({})],
+ [{m34: 1, is2D: false}, matrix2D({})],
+ [{m43: 1, is2D: false}, matrix2D({})],
+ [{m44: 0, is2D: false}, matrix2D({})],
+ [{m13: 1}, matrix2D({})],
+ [{m14: 1}, matrix2D({})],
+ [{m23: 1}, matrix2D({})],
+ [{m24: 1}, matrix2D({})],
+ [{m31: 1}, matrix2D({})],
+ [{m32: 1}, matrix2D({})],
+ [{m33: 0}, matrix2D({})],
+ [{m34: 1}, matrix2D({})],
+ [{m43: 1}, matrix2D({})],
+ [{m44: 0}, matrix2D({})],
+ [{is2D: false}, matrix2D({})],
+ [{is2D: null}, matrix2D({})],
+].forEach(([dict, expected]) => {
+ test(() => {
+ ctx.resetTransform();
+ ctx.setTransform(dict);
+ const matrix = ctx.getTransform();
+ checkMatrix(matrix, expected);
+ }, `setTransform(${format_dict(dict)})`);
+
+ test(() => {
+ var expectedResultURL = drawRectWithSetTransform(ctx, expected);
+ var actualResultURL = drawRectWithAddPathTransform(ctx, expected);
+ assert_equals(actualResultURL, expectedResultURL);
+ }, `addPath(${format_dict(dict)})`);
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/DOMMatrixInit-validate-fixup.html b/tests/wpt/web-platform-tests/css/geometry-1/DOMMatrixInit-validate-fixup.html
index cf511cd9660..8835c1ba48a 100644
--- a/tests/wpt/web-platform-tests/css/geometry-1/DOMMatrixInit-validate-fixup.html
+++ b/tests/wpt/web-platform-tests/css/geometry-1/DOMMatrixInit-validate-fixup.html
@@ -3,50 +3,8 @@
<link rel="help" href="https://drafts.fxtf.org/geometry/#dommatrixinit-dictionary">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="support/dommatrix-test-util.js"></script>
<script>
-// This formats dict as a string suitable as test name.
-// format_value() is provided by testharness.js,
-// which also preserves sign for -0.
-function format_dict(dict) {
- const props = [];
- for (let prop in dict) {
- props.push(`${prop}: ${format_value(dict[prop])}`);
- }
- return `{${props.join(', ')}}`;
-}
-
-// Create a normal JS object with the expected properties
-// from a dict with only m11..m44 specified (not a..f).
-function matrix3D(dict) {
- const matrix = {m11: 1, m12: 0, m13: 0, m14: 0,
- m21: 0, m22: 1, m23: 0, m24: 0,
- m31: 0, m32: 0, m33: 1, m34: 0,
- m41: 0, m42: 0, m43: 0, m44: 1}
- matrix.is2D = false;
- for (let member in dict) {
- matrix[member] = dict[member];
- }
- matrix.a = matrix.m11;
- matrix.b = matrix.m12;
- matrix.c = matrix.m21;
- matrix.d = matrix.m22;
- matrix.e = matrix.m41;
- matrix.f = matrix.m42;
- return matrix;
-}
-
-function matrix2D(dict) {
- const matrix = matrix3D(dict);
- matrix.is2D = true;
- return matrix;
-}
-
-function checkMatrix(actual, expected) {
- for (let member in expected) {
- assert_equals(actual[member], expected[member], member);
- }
-}
-
[
{a: 1, m11: 2},
{b: 0, m12: -1},
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/DOMRect-002.html b/tests/wpt/web-platform-tests/css/geometry-1/DOMRect-002.html
new file mode 100644
index 00000000000..a5f0f88428f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/geometry-1/DOMRect-002.html
@@ -0,0 +1,171 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Geometry Interfaces: DOMRect and DOMRectReadOnly interface tests</title>
+ <link rel="author" title="Hwanseung Lee" href="mailto:hs1217.lee@samsung.com" />
+ <link rel="help" href="https://drafts.fxtf.org/geometry-1/#DOMRect">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <div id="log"></div>
+ <script>
+ testConstructor("DOMRect");
+ testConstructor("DOMRectReadOnly");
+ test(function() {
+ var r = new DOMRect();
+ r.top = 5;
+ assert_equals(r.top, 0, "top");
+ r.right = 5;
+ assert_equals(r.right, 0, "right");
+ r.bottom = 5;
+ assert_equals(r.bottom, 0, "bottom");
+ r.left = 5;
+ assert_equals(r.left, 0, "left");
+ }, 'DOMRect: set top/right/bottom/left');
+
+ test(function() {
+ var r = new DOMRect();
+ r.x = 5;
+ assert_equals(r.x, 5, "Expected value for x is 5");
+ assert_equals(r.left, 5, "Expected value for left is 5");
+ assert_equals(r.right, 5, "Expected value for right is 5");
+ r.y = 5;
+ assert_equals(r.y, 5, "Expected value for y is 5");
+ assert_equals(r.top, 5, "Expected value for top is 5");
+ assert_equals(r.bottom, 5, "Expected value for bottom is 5");
+ r.width = 5;
+ assert_equals(r.width, 5, "Expected value for width is 5");
+ assert_equals(r.left, 5, "Expected value for left is 5");
+ assert_equals(r.right, 10, "Expected value for right is 10");
+ r.height = 5;
+ assert_equals(r.height, 5, "Expected value for height is 5");
+ assert_equals(r.top, 5, "Expected value for top is 5");
+ assert_equals(r.bottom, 10, "Expected value for bottom is 10");
+ }, 'DOMRect: set x/y/width/height');
+
+ test(function() {
+ var r = new DOMRectReadOnly();
+ r.top = 5;
+ assert_equals(r.top, 0, "top after setting top");
+ assert_equals(r.y, 0, "y after setting top");
+ assert_equals(r.bottom, 0, "bottom after setting top");
+ r.right = 5;
+ assert_equals(r.right, 0, "right after setting right");
+ assert_equals(r.x, 0, "x after setting right");
+ assert_equals(r.left, 0, "left after setting right");
+ r.bottom = 5;
+ assert_equals(r.bottom, 0, "bottom after setting bottom");
+ assert_equals(r.y, 0, "y after setting bottom");
+ assert_equals(r.top, 0, "top after setting bottom");
+ r.left = 5;
+ assert_equals(r.left, 0, "left after setting left");
+ assert_equals(r.x, 0, "x after setting left");
+ assert_equals(r.right, 0, "right after setting left");
+ }, 'DOMRectReadOnly: set top/right/bottom/left');
+
+ test(function() {
+ var r = new DOMRectReadOnly();
+ r.x = 5;
+ assert_equals(r.x, 0, "x after setting x");
+ assert_equals(r.left, 0, "left after setting x");
+ assert_equals(r.right, 0, "right after setting x");
+ r.y = 5;
+ assert_equals(r.y, 0, "y after setting y");
+ assert_equals(r.top, 0, "top after setting y");
+ assert_equals(r.bottom, 0, "bottom after setting y");
+ r.width = 5;
+ assert_equals(r.width, 0, "width after setting width");
+ assert_equals(r.x, 0, "x after setting width");
+ assert_equals(r.right, 0, "right after setting width");
+ r.height = 5;
+ assert_equals(r.height, 0, "height after setting height");
+ assert_equals(r.y, 0, "y after setting height");
+ assert_equals(r.bottom, 0, "bottom after setting height");
+ }, 'DOMRectReadOnly: set x/y/width/height');
+
+ test(function() {
+ var actual = DOMRect.fromRect({x: 1, y: 2, width: 3, height: 4});
+ var expected = new DOMRect(1, 2, 3, 4);
+ checkDOMRect(actual, expected);
+ assert_true(actual instanceof DOMRectReadOnly, "actual instanceof DOMRectReadOnly");
+ assert_true(actual instanceof DOMRect, "actual instanceof DOMRect");
+ }, 'DOMRect.fromRect');
+
+ test(function() {
+ var actual = DOMRectReadOnly.fromRect({x: 1, y: 2, width: 3, height: 4});
+ var expected = new DOMRectReadOnly(1, 2, 3, 4);
+ checkDOMRect(actual, expected);
+ assert_true(actual instanceof DOMRectReadOnly, "actual instanceof DOMRectReadOnly");
+ assert_false(actual instanceof DOMRect, "actual instanceof DOMRect");
+ }, 'DOMRectReadOnly.fromRect');
+
+ function testConstructor(constructorString) {
+ var constructor = self[constructorString];
+ test(function() {
+ checkDOMRect(new constructor(),
+ { x: 0, y: 0, width: 0, height: 0, top: 0, right: 0, bottom: 0, left: 0 });
+ }, constructorString + ' constructor without parameter');
+ test(function() {
+ checkDOMRect(new constructor(1),
+ { x: 1, y: 0, width: 0, height: 0, top: 0, right: 1, bottom: 0, left: 1 });
+ }, constructorString + ' constructor with one parameter');
+ test(function() {
+ checkDOMRect(new constructor(1, 2),
+ { x: 1, y: 2, width: 0, height: 0, top: 2, right: 1, bottom: 2, left: 1 });
+ }, constructorString + ' constructor with two parameters');
+ test(function() {
+ checkDOMRect(new constructor(1, 2, 3),
+ { x: 1, y: 2, width: 3, height: 0, top: 2, right: 4, bottom: 2, left: 1 });
+ }, constructorString + ' constructor with three parameters');
+ test(function() {
+ checkDOMRect(new constructor(1, 2, 3, 4),
+ { x: 1, y: 2, width: 3, height: 4, top: 2, right: 4, bottom: 6, left: 1 });
+ }, constructorString + ' constructor with four parameters');
+ test(function() {
+ checkDOMRect(new constructor(1, 2, 3, 4, 5),
+ { x: 1, y: 2, width: 3, height: 4, top: 2, right: 4, bottom: 6, left: 1 });
+ }, constructorString + ' constructor with five parameters');
+ test(function() {
+ checkDOMRect(new constructor(2, 2, -4, 4),
+ { x: 2, y: 2, width: -4, height: 4, top: 2, right: 2, bottom: 6, left: -2 });
+ }, constructorString + ' constructor with negative width');
+ test(function() {
+ checkDOMRect(new constructor(2, 2, 4, -4),
+ { x: 2, y: 2, width: 4, height: -4, top: -2, right: 6, bottom: 2, left: 2 });
+ }, constructorString + ' constructor with negative height');
+ test(function() {
+ checkDOMRect(new constructor(2, 2, -4, -4),
+ { x: 2, y: 2, width: -4, height: -4, top: -2, right: 2, bottom: 2, left: -2 });
+ }, constructorString + ' constructor with negative width and height');
+ test(function() {
+ checkDOMRect(new constructor(0, 0, undefined, 4),
+ { x: 0, y: 0, width: 0, height: 4, top: 0, right: 0, bottom: 4, left: 0 });
+ }, constructorString + ' constructor with undefined');
+ test(function() {
+ checkDOMRect(new constructor(NaN, Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY, null),
+ { x: NaN, y: -Infinity, width: Infinity, height: 0, top: -Infinity, right: NaN, bottom: -Infinity, left: NaN });
+ }, constructorString + ' constructor with NaN and infinity and null');
+ test(function() {
+ checkDOMRect(new constructor("1", "2", "3", "4"),
+ { x: 1, y: 2, width: 3, height: 4, top: 2, right: 4, bottom: 6, left: 1 });
+ }, constructorString + ' constructor with number string');
+ test(function() {
+ checkDOMRect(new constructor("a", "b", "c", "d"),
+ { x: NaN, y: NaN, width: NaN, height: NaN, top: NaN, right: NaN, bottom: NaN, left: NaN });
+ }, constructorString + ' constructor with character string');
+ }
+
+ function checkDOMRect(r, exp) {
+ assert_equals(r.x, exp.x, "x");
+ assert_equals(r.y, exp.y, "y");
+ assert_equals(r.width, exp.width, "width");
+ assert_equals(r.height, exp.height, "height");
+ assert_equals(r.top, exp.top, "top");
+ assert_equals(r.left, exp.left, "left");
+ assert_equals(r.bottom, exp.bottom, "bottom");
+ assert_equals(r.right, exp.right, "right");
+ }
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/DOMRectList.html b/tests/wpt/web-platform-tests/css/geometry-1/DOMRectList.html
new file mode 100644
index 00000000000..f128a059cc5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/geometry-1/DOMRectList.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>Geometry interfaces: DOMRectList</title>
+<link rel="help" href="https://drafts.fxtf.org/geometry-1/#DOMRectList">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=x>x</div>
+<script>
+setup(() => {
+ window.domRectList = document.getElementById('x').getClientRects();
+});
+
+test(() => {
+ assert_false('DOMRectList' in window);
+}, 'DOMRectList [NoInterfaceObject]');
+
+test(() => {
+ assert_true(domRectList instanceof Array);
+}, 'DOMRectList [LegacyArrayClass]');
+
+test(() => {
+ assert_equals(domRectList.length, 1);
+}, 'DOMRectList length');
+
+test(() => {
+ assert_equals(domRectList[-1], undefined, 'domRectList[-1]');
+ assert_class_string(domRectList[0], 'DOMRect', 'domRectList[0]');
+ assert_equals(domRectList[1], undefined, 'domRectList[1]');
+}, 'DOMRectList indexed getter');
+
+test(() => {
+ assert_equals(domRectList.item(-1), null, 'domRectList.item(-1)');
+ assert_class_string(domRectList.item(0), 'DOMRect', 'domRectList.item(0)');
+ assert_equals(domRectList.item(1), null, 'domRectList.item(1)');
+ assert_equals(domRectList.item(0), domRectList[0], 'domRectList.item(0) should equal domRectList[0]');
+}, 'DOMRectList item()');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/OWNERS b/tests/wpt/web-platform-tests/css/geometry-1/OWNERS
index 84648afab20..250d764b657 100644
--- a/tests/wpt/web-platform-tests/css/geometry-1/OWNERS
+++ b/tests/wpt/web-platform-tests/css/geometry-1/OWNERS
@@ -1,4 +1,3 @@
@peterjoel
@tschneidereit
@dirkschulze
-@zcorpan
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/interfaces.html b/tests/wpt/web-platform-tests/css/geometry-1/interfaces.html
index 3e816fac220..b1207003730 100644
--- a/tests/wpt/web-platform-tests/css/geometry-1/interfaces.html
+++ b/tests/wpt/web-platform-tests/css/geometry-1/interfaces.html
@@ -9,4 +9,5 @@
<script src=/resources/testharnessreport.js></script>
<script src=/resources/WebIDLParser.js></script>
<script src=/resources/idlharness.js></script>
+<div id=log></div>
<script src=support/interfaces.js></script>
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/spec-examples.html b/tests/wpt/web-platform-tests/css/geometry-1/spec-examples.html
new file mode 100644
index 00000000000..4e97fb5f217
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/geometry-1/spec-examples.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<title>Geometry APIs spec examples</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<link rel=help href="https://drafts.fxtf.org/geometry/">
+<script>
+test(() => {
+ var point = new DOMPoint(5, 4);
+ var matrix = new DOMMatrix([2, 0, 0, 2, 10, 10]);
+ var transformedPoint = point.matrixTransform(matrix);
+ // The point variable is set to a new DOMPoint object with x coordinate initialized to 5 and y
+ // coordinate initialized to 4.
+ assert_equals(point.x, 5, 'point.x');
+ assert_equals(point.y, 4, 'point.y');
+ assert_equals(point.z, 0, 'point.z');
+ assert_equals(point.w, 1, 'point.w');
+ // This new DOMPoint is now scaled and the translated by matrix. This resulting transformedPoint
+ // has the x coordinate 20 and y coordinate 18.
+ assert_equals(transformedPoint.x, 20, 'transformedPoint.x');
+ assert_equals(transformedPoint.y, 18, 'transformedPoint.x');
+ assert_equals(transformedPoint.z, 0, 'transformedPoint.z');
+ assert_equals(transformedPoint.w, 1, 'transformedPoint.w');
+}, 'matrixTransform');
+
+test(() => {
+ var point = new DOMPoint(2, 0);
+ var quad1 = new DOMQuad(point, {x: 12, y: 0}, {x: 12, y: 10}, {x: 2, y: 10});
+ // The attribute values of the resulting DOMQuad quad1 above are also equivalent to the attribute
+ // values of the following DOMQuad quad2:
+ var rect = new DOMRect(2, 0, 10, 10);
+ var quad2 = DOMQuad.fromRect(rect);
+ for (var p of ['p1', 'p2', 'p3', 'p4']) {
+ for (var attr of ['x', 'y', 'z', 'w']) {
+ assert_equals(quad2[p][attr], quad1[p][attr], `${p}.${attr}`);
+ }
+ }
+}, 'DOMQuad');
+
+test(() => {
+ var quad = new DOMQuad({x: 40, y: 25}, {x: 180, y: 8}, {x: 210, y: 150}, {x: 10, y: 180});
+ // <circle cx="40" cy="25" r="3" fill="rgb(204, 51, 51)"/>
+ assert_equals(quad.p1.x, 40, 'p1.x');
+ assert_equals(quad.p1.y, 25, 'p1.y');
+ // <circle cx="180" cy="8" r="3" fill="rgb(204, 51, 51)"/>
+ assert_equals(quad.p2.x, 180, 'p2.x');
+ assert_equals(quad.p2.y, 8, 'p2.y');
+ // <circle cx="210" cy="150" r="3" fill="rgb(204, 51, 51)"/>
+ assert_equals(quad.p3.x, 210, 'p3.x');
+ assert_equals(quad.p3.y, 150, 'p3.y');
+ // <circle cx="10" cy="180" r="3" fill="rgb(204, 51, 51)"/>
+ assert_equals(quad.p4.x, 10, 'p4.x');
+ assert_equals(quad.p4.y, 180, 'p4.y');
+ var bounds = quad.getBounds();
+ // <rect x="10" y="8" width="200" height="172" fill="none" stroke="black" stroke-dasharray="3 2"/>
+ assert_equals(bounds.x, 10, 'bounds.x');
+ assert_equals(bounds.y, 8, 'bounds.x');
+ assert_equals(bounds.width, 200, 'bounds.width');
+ assert_equals(bounds.height, 172, 'bounds.height');
+}, 'DOMQuad irregular');
+
+test(() => {
+ // In this example, a matrix is created and several 2D transformation methods are called:
+ var matrix = new DOMMatrix();
+ matrix.scaleSelf(2);
+ matrix.translateSelf(20,20);
+ assert_equals(matrix.toString(), "matrix(2, 0, 0, 2, 40, 40)");
+}, 'DOMMatrix 2D transformation');
+
+test(() => {
+ // In the following example, a matrix is created and several 3D transformation methods are called:
+ var matrix = new DOMMatrix();
+ matrix.scale3dSelf(2);
+ assert_equals(matrix.toString(), "matrix3d(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1)");
+}, 'DOMMatrix 3D transformation');
+
+test(() => {
+ // This example will throw an exception because there are non-finite values in the matrix.
+ var matrix = new DOMMatrix([NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]);
+ assert_throws("InvalidStateError", () => { var string = matrix + " Batman!"; });
+}, 'DOMMatrix NaN');
+
+test(() => {
+ var matrix = new DOMMatrix();
+ matrix.translateSelf(20, 20);
+ matrix.scaleSelf(2);
+ matrix.translateSelf(-20, -20);
+ // is equivalent to:
+ var matrix2 = new DOMMatrix();
+ matrix2.translateSelf(20, 20).scaleSelf(2).translateSelf(-20, -20);
+ assert_equals(matrix.toString(), matrix2.toString());
+}, 'DOMMatrix mutable');
+</script>
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/structured-serialization.html b/tests/wpt/web-platform-tests/css/geometry-1/structured-serialization.html
index ca33cec63fe..dcf4cdd0c5f 100644
--- a/tests/wpt/web-platform-tests/css/geometry-1/structured-serialization.html
+++ b/tests/wpt/web-platform-tests/css/geometry-1/structured-serialization.html
@@ -3,6 +3,7 @@
<link rel="help" href="https://drafts.fxtf.org/geometry/#structured-serialization">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
<script>
function clone(obj) {
return new Promise((resolve, reject) => {
@@ -156,4 +157,9 @@ function defineThrowingGetters(object, attrs) {
throw new Error(`Test bug: ${constr} has no test for non-initial values`);
}
});
+
+promise_test((t) => {
+ const object = document.getElementById('log').getClientRects();
+ return promise_rejects(t, "DataCloneError", clone(object));
+}, 'DOMRectList clone');0
</script>
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/support/dommatrix-test-util.js b/tests/wpt/web-platform-tests/css/geometry-1/support/dommatrix-test-util.js
index 294db8ed7dc..b5d782764ec 100644
--- a/tests/wpt/web-platform-tests/css/geometry-1/support/dommatrix-test-util.js
+++ b/tests/wpt/web-platform-tests/css/geometry-1/support/dommatrix-test-util.js
@@ -1,4 +1,47 @@
+// This formats dict as a string suitable as test name.
+// format_value() is provided by testharness.js,
+// which also preserves sign for -0.
+function format_dict(dict) {
+ const props = [];
+ for (let prop in dict) {
+ props.push(`${prop}: ${format_value(dict[prop])}`);
+ }
+ return `{${props.join(', ')}}`;
+}
+
+// Create a normal JS object with the expected properties
+// from a dict with only m11..m44 specified (not a..f).
+function matrix3D(dict) {
+ const matrix = {m11: 1, m12: 0, m13: 0, m14: 0,
+ m21: 0, m22: 1, m23: 0, m24: 0,
+ m31: 0, m32: 0, m33: 1, m34: 0,
+ m41: 0, m42: 0, m43: 0, m44: 1}
+ matrix.is2D = false;
+ for (let member in dict) {
+ matrix[member] = dict[member];
+ }
+ matrix.a = matrix.m11;
+ matrix.b = matrix.m12;
+ matrix.c = matrix.m21;
+ matrix.d = matrix.m22;
+ matrix.e = matrix.m41;
+ matrix.f = matrix.m42;
+ return matrix;
+}
+
+function matrix2D(dict) {
+ const matrix = matrix3D(dict);
+ matrix.is2D = true;
+ return matrix;
+}
+
+function checkMatrix(actual, expected) {
+ for (let member in expected) {
+ assert_equals(actual[member], expected[member], member);
+ }
+}
+// checkMatrix and checkDOMMatrix should probably be merged...
function checkDOMMatrix(m, exp, is2D) {
if (is2D === undefined) {
is2D = exp.is2D;
diff --git a/tests/wpt/web-platform-tests/css/geometry-1/support/interfaces.js b/tests/wpt/web-platform-tests/css/geometry-1/support/interfaces.js
index e40a9268279..e5955d1092f 100644
--- a/tests/wpt/web-platform-tests/css/geometry-1/support/interfaces.js
+++ b/tests/wpt/web-platform-tests/css/geometry-1/support/interfaces.js
@@ -2,6 +2,11 @@
var idlArray = new IdlArray();
+const domRectListList = [];
+if ("document" in self) {
+ domRectListList.push(document.getElementById('log').getClientRects());
+}
+
function doTest(idl) {
idlArray.add_idls(idl);
idlArray.add_objects({
@@ -9,6 +14,7 @@ function doTest(idl) {
DOMPoint: ["new DOMPoint()"],
DOMRectReadOnly: ["new DOMRectReadOnly()"],
DOMRect: ["new DOMRect()"],
+ DOMRectList: domRectListList,
DOMQuad: ["new DOMQuad()"],
DOMMatrixReadOnly: ["new DOMMatrixReadOnly()", "DOMMatrixReadOnly.fromMatrix({is2D: false})"],
DOMMatrix: ["new DOMMatrix()", "DOMMatrix.fromMatrix({is2D: false})"],
diff --git a/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-002.html b/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-002.html
index 1f30562a8c3..40af3b67631 100644
--- a/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-002.html
+++ b/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-002.html
@@ -6,7 +6,7 @@
<link rel="author" title="Chris Rebert" href="http://chrisrebert.com">
<link rel="help" href="https://www.w3.org/TR/css3-mediaqueries/#units">
<link rel="help" href="https://www.w3.org/TR/mediaqueries-4/#units">
- <link rel="match" href="../reference/ref-green-body.xht">
+ <link rel="match" href="reference/ref-green-body.xht">
<meta name="flags" content="">
<meta name="assert" content="Font-relative length units (such as 'em') in media queries should be calculated based on the initial value of 'font-size', not based on author style declarations, such as: html { font-size: 200%; }">
<style>
diff --git a/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-003.html b/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-003.html
index 6697455d5f7..1ee2a90b63c 100644
--- a/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-003.html
+++ b/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-003.html
@@ -6,7 +6,7 @@
<link rel="author" title="Chris Rebert" href="http://chrisrebert.com">
<link rel="help" href="https://www.w3.org/TR/css3-mediaqueries/#units">
<link rel="help" href="https://www.w3.org/TR/mediaqueries-4/#units">
- <link rel="match" href="../reference/ref-green-body.xht">
+ <link rel="match" href="reference/ref-green-body.xht">
<meta name="flags" content="">
<meta name="assert" content="Font-relative length units (such as 'ex') in media queries should be calculated based on the initial value of 'font-size', not based on author style declarations, such as: html { font-size: 200%; }">
<style>
diff --git a/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-004.html b/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-004.html
index 75cfe9ee71f..9db6821bd02 100644
--- a/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-004.html
+++ b/tests/wpt/web-platform-tests/css/mediaqueries-3/relative-units-004.html
@@ -6,7 +6,7 @@
<link rel="author" title="Chris Rebert" href="http://chrisrebert.com">
<link rel="help" href="https://www.w3.org/TR/css3-mediaqueries/#units">
<link rel="help" href="https://www.w3.org/TR/mediaqueries-4/#units">
- <link rel="match" href="../reference/ref-green-body.xht">
+ <link rel="match" href="reference/ref-green-body.xht">
<meta name="flags" content="">
<meta name="assert" content="Font-relative length units (such as 'ch') in media queries should be calculated based on the initial value of 'font-size', not based on author style declarations, such as: html { font-size: 200%; }">
<style>
diff --git a/tests/wpt/web-platform-tests/css/motion-1/animation/offset-anchor-interpolation.html b/tests/wpt/web-platform-tests/css/motion-1/animation/offset-anchor-interpolation.html
new file mode 100644
index 00000000000..414a0bd0d70
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion-1/animation/offset-anchor-interpolation.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>offset-anchor interpolation</title>
+ <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+ <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-anchor-property">
+ <meta name="assert" content="offset-anchor supports <position> animation.">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/interpolation-testcommon.js"></script>
+ <style>
+ body {
+ width: 500px;
+ height: 500px;
+ transform: rotate(0deg);
+ }
+ div {
+ width: 10px;
+ height: 10px;
+ }
+ </style>
+ </head>
+ <body>
+ <script>
+ test_interpolation({
+ property: 'offset-anchor',
+ from: '220px 240px',
+ to: '300px 400px',
+ }, [
+ {at: -1, expect: '140px 80px'},
+ {at: 0, expect: '220px 240px'},
+ {at: 0.125, expect: '230px 260px'},
+ {at: 0.875, expect: '290px 380px'},
+ {at: 1, expect: '300px 400px'},
+ {at: 2, expect: '380px 560px'}
+ ]);
+
+ test_interpolation({
+ property: 'offset-anchor',
+ from: 'left 480px top 400px',
+ to: 'right -140% bottom -60%',
+ }, [
+ {at: -1, expect: 'calc(960px - 240%) calc(800px - 160%)'},
+ {at: 0, expect: 'left 480px top 400px'},
+ {at: 0.125, expect: 'calc(420px + 30%) calc(350px + 20%)'},
+ {at: 0.875, expect: 'calc(210% + 60px) calc(140% + 50px)'},
+ {at: 1, expect: 'right -140% bottom -60%'},
+ {at: 2, expect: 'calc(480% - 480px) calc(320% - 400px)'}
+ ]);
+
+ test_interpolation({
+ property: 'offset-anchor',
+ from: 'left top',
+ to: 'left 8px bottom 20%',
+ }, [
+ {at: -1, expect: '-8px -80%'},
+ {at: 0, expect: 'left top'},
+ {at: 0.125, expect: '1px 10%'},
+ {at: 0.875, expect: '7px 70%'},
+ {at: 1, expect: 'left 8px bottom 20%'},
+ {at: 2, expect: '16px 160%'}
+ ]);
+
+ test_no_interpolation({
+ property: 'offset-anchor',
+ from: 'right 10px top 20%',
+ to: 'auto'
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/motion-1/animation/offset-distance-interpolation.html b/tests/wpt/web-platform-tests/css/motion-1/animation/offset-distance-interpolation.html
new file mode 100644
index 00000000000..a56878a0a5a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion-1/animation/offset-distance-interpolation.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>offset-distance interpolation</title>
+ <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+ <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-distance-property">
+ <meta name="assert" content="offset-distance supports animation.">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/interpolation-testcommon.js"></script>
+ </head>
+ <body>
+ <script>
+ test_interpolation({
+ property: 'offset-distance',
+ from: '-30px',
+ to: '50px',
+ }, [
+ {at: -1, expect: '-110px'},
+ {at: 0, expect: '-30px'},
+ {at: 0.125, expect: '-20px'},
+ {at: 0.875, expect: '40px'},
+ {at: 1, expect: '50px'},
+ {at: 2, expect: '130px'}
+ ]);
+
+ test_interpolation({
+ property: 'offset-distance',
+ from: '20%',
+ to: '100%',
+ }, [
+ {at: -1, expect: '-60%'},
+ {at: 0, expect: '20%'},
+ {at: 0.125, expect: '30%'},
+ {at: 0.875, expect: '90%'},
+ {at: 1, expect: '100%'},
+ {at: 2, expect: '180%'}
+ ]);
+
+ test_interpolation({
+ property: 'offset-distance',
+ from: 'calc(20% - 30px)',
+ to: 'calc(50px + 100%)',
+ }, [
+ {at: -1, expect: 'calc(-110px + -60%)'},
+ {at: 0, expect: 'calc(20% - 30px)'},
+ {at: 0.125, expect: 'calc(-20px + 30%)'},
+ {at: 0.875, expect: 'calc(40px + 90%)'},
+ {at: 1, expect: 'calc(50px + 100%)'},
+ {at: 2, expect: 'calc(130px + 180%)'}
+ ]);
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/motion-1/animation/offset-position-interpolation.html b/tests/wpt/web-platform-tests/css/motion-1/animation/offset-position-interpolation.html
new file mode 100644
index 00000000000..c31034d10f8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion-1/animation/offset-position-interpolation.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>offset-position interpolation</title>
+ <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+ <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-position-property">
+ <meta name="assert" content="offset-position supports <position> animation.">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/interpolation-testcommon.js"></script>
+ <style>
+ body {
+ width: 500px;
+ height: 500px;
+ transform: rotate(0deg);
+ }
+ div {
+ width: 10px;
+ height: 10px;
+ }
+ </style>
+ </head>
+ <body>
+ <script>
+ test_interpolation({
+ property: 'offset-position',
+ from: '220px 240px',
+ to: '300px 400px',
+ }, [
+ {at: -1, expect: '140px 80px'},
+ {at: 0, expect: '220px 240px'},
+ {at: 0.125, expect: '230px 260px'},
+ {at: 0.875, expect: '290px 380px'},
+ {at: 1, expect: '300px 400px'},
+ {at: 2, expect: '380px 560px'}
+ ]);
+
+ test_interpolation({
+ property: 'offset-position',
+ from: 'left 480px top 400px',
+ to: 'right -140% bottom -60%',
+ }, [
+ {at: -1, expect: 'calc(960px - 240%) calc(800px - 160%)'},
+ {at: 0, expect: 'left 480px top 400px'},
+ {at: 0.125, expect: 'calc(420px + 30%) calc(350px + 20%)'},
+ {at: 0.875, expect: 'calc(210% + 60px) calc(140% + 50px)'},
+ {at: 1, expect: 'right -140% bottom -60%'},
+ {at: 2, expect: 'calc(480% - 480px) calc(320% - 400px)'}
+ ]);
+
+ test_interpolation({
+ property: 'offset-position',
+ from: 'left top',
+ to: 'left 8px bottom 20%',
+ }, [
+ {at: -1, expect: '-8px -80%'},
+ {at: 0, expect: 'left top'},
+ {at: 0.125, expect: '1px 10%'},
+ {at: 0.875, expect: '7px 70%'},
+ {at: 1, expect: 'left 8px bottom 20%'},
+ {at: 2, expect: '16px 160%'}
+ ]);
+
+ test_no_interpolation({
+ property: 'offset-position',
+ from: 'right 10px top 20%',
+ to: 'auto'
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/motion-1/animation/offset-rotate-interpolation.html b/tests/wpt/web-platform-tests/css/motion-1/animation/offset-rotate-interpolation.html
new file mode 100644
index 00000000000..a73c1a41dc8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion-1/animation/offset-rotate-interpolation.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>offset-rotate interpolation</title>
+ <link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+ <link rel="help" href="https://drafts.fxtf.org/motion-1/#offset-rotate-property">
+ <meta name="assert" content="offset-rotate supports animation.">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/interpolation-testcommon.js"></script>
+ </head>
+ <body>
+ <script>
+ test_interpolation({
+ property: 'offset-rotate',
+ from: '100deg',
+ to: '180deg',
+ }, [
+ {at: -1, expect: '20deg'},
+ {at: 0, expect: '100deg'},
+ {at: 0.125, expect: '110deg'},
+ {at: 0.875, expect: '170deg'},
+ {at: 1, expect: '180deg'},
+ {at: 2, expect: '260deg'}
+ ]);
+
+ test_interpolation({
+ property: 'offset-rotate',
+ from: 'auto 100deg',
+ to: 'reverse',
+ }, [
+ {at: -1, expect: 'auto 20deg'},
+ {at: 0, expect: 'auto 100deg'},
+ {at: 0.125, expect: 'auto 110deg'},
+ {at: 0.875, expect: 'auto 170deg'},
+ {at: 1, expect: 'reverse'},
+ {at: 2, expect: 'auto 260deg'}
+ ]);
+
+ // No interpolation between auto/reverse and angle.
+ test_no_interpolation({
+ property: 'offset-rotate',
+ from: 'reverse 90deg',
+ to: '360deg',
+ });
+
+ test_no_interpolation({
+ property: 'offset-rotate',
+ from: '6rad',
+ to: 'auto',
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/motion-1/animation/resources/interpolation-testcommon.js b/tests/wpt/web-platform-tests/css/motion-1/animation/resources/interpolation-testcommon.js
new file mode 100644
index 00000000000..be86c438986
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion-1/animation/resources/interpolation-testcommon.js
@@ -0,0 +1,65 @@
+'use strict';
+function test_interpolation(settings, expectations) {
+ // Returns a timing function that at 0.5 evaluates to progress.
+ function timingFunction(progress) {
+ if (progress === 0)
+ return 'steps(1, end)';
+ if (progress === 1)
+ return 'steps(1, start)';
+ var y = (8 * progress - 1) / 6;
+ return 'cubic-bezier(0, ' + y + ', 1, ' + y + ')';
+ }
+
+ test(function(){
+ assert_true(CSS.supports(settings.property, settings.from), 'Value "' + settings.from + '" is supported by ' + settings.property);
+ assert_true(CSS.supports(settings.property, settings.to), 'Value "' + settings.to + '" is supported by ' + settings.property);
+ }, '"' + settings.from + '" and "' + settings.to + '" are valid ' + settings.property + ' values');
+
+ for (var i = 0; i < expectations.length; ++i) {
+ var progress = expectations[i].at;
+ var expectation = expectations[i].expect;
+ var animationId = 'anim' + i;
+ var targetId = 'target' + i;
+ var referenceId = 'reference' + i;
+
+ test(function(){
+ assert_true(CSS.supports(settings.property, expectation), 'Value "' + expectation + '" is supported by ' + settings.property);
+
+ var stylesheet = document.createElement('style');
+ stylesheet.textContent =
+ '#' + targetId + ' {\n' +
+ ' animation: 2s ' + timingFunction(progress) + ' -1s paused ' + animationId + ';\n' +
+ '}\n' +
+ '@keyframes ' + animationId + ' {\n' +
+ ' 0% { ' + settings.property + ': ' + settings.from + '; }\n' +
+ ' 100% { ' + settings.property + ': ' + settings.to + '; }\n' +
+ '}\n' +
+ '#' + referenceId + ' {\n' +
+ ' ' + settings.property + ': ' + expectation + ';\n' +
+ '}\n';
+ document.head.appendChild(stylesheet);
+
+ var target = document.createElement('div');
+ target.id = targetId;
+ document.body.appendChild(target);
+
+ var reference = document.createElement('div');
+ reference.id = referenceId;
+ document.body.appendChild(reference);
+ reference.style = '';
+
+ assert_equals(getComputedStyle(target)[settings.property], getComputedStyle(reference)[settings.property]);
+ }, 'Animation between "' + settings.from + '" and "' + settings.to + '" at progress ' + progress);
+ }
+}
+
+function test_no_interpolation(settings) {
+ var expectatFrom = [-1, 0, 0.125].map(function (progress) {
+ return {at: progress, expect: settings.from};
+ });
+ var expectatTo = [0.875, 1, 2].map(function (progress) {
+ return {at: progress, expect: settings.to};
+ });
+
+ test_interpolation(settings, expectatFrom.concat(expectatTo));
+}
diff --git a/tests/wpt/web-platform-tests/css/motion-1/offset-supports-calc.html b/tests/wpt/web-platform-tests/css/motion-1/offset-supports-calc.html
new file mode 100644
index 00000000000..79aa9a9f50a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/motion-1/offset-supports-calc.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Motion Path Module Level 1: calc values</title>
+<link rel="author" title="Eric Willigers" href="mailto:ericwilligers@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/motion-1/">
+<link rel="help" href="https://drafts.csswg.org/css-values-3/#calc-notation">
+<meta name="assert" content="calc values are supported in offset properties.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ #target {
+ font-size: 20px;
+ }
+</style>
+</head>
+<body>
+<div id="target"></div>
+<script>
+'use strict';
+
+test(function(){
+ target.style = 'offset-position: calc(30px + 20%) calc(-200px + 8em + 100%);';
+ assert_equals(getComputedStyle(target).offsetPosition, 'calc(30px + 20%) calc(-40px + 100%)');
+}, 'offset-position supports calc');
+
+test(function(){
+ target.style = 'offset-path: ray(calc(1turn - 100grad) closest-side);';
+ assert_equals(getComputedStyle(target).offsetPath, 'ray(270deg closest-side)');
+}, 'offset-path supports calc');
+
+test(function(){
+ target.style = 'offset-distance: calc(-100px + 50%);';
+ assert_equals(getComputedStyle(target).offsetDistance, 'calc(-100px + 50%)');
+}, 'offset-distance supports calc');
+
+test(function(){
+ target.style = 'offset-rotate: auto calc(1turn - 100grad);';
+ assert_equals(getComputedStyle(target).offsetRotate, 'auto 270deg');
+}, 'offset-rotate supports calc');
+
+test(function(){
+ target.style = 'offset-anchor: calc(30px + 20%) calc(-200px + 8em + 100%);';
+ assert_equals(getComputedStyle(target).offsetAnchor, 'calc(30px + 20%) calc(-40px + 100%)');
+}, 'offset-anchor supports calc');
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/css/tools/w3ctestlib/Indexer.py b/tests/wpt/web-platform-tests/css/tools/w3ctestlib/Indexer.py
index 22d550bc792..3b71f5bab74 100644
--- a/tests/wpt/web-platform-tests/css/tools/w3ctestlib/Indexer.py
+++ b/tests/wpt/web-platform-tests/css/tools/w3ctestlib/Indexer.py
@@ -83,7 +83,7 @@ class Indexer:
# Load toc data
self.sections = {}
for uri, numstr, title in sections:
- uri = intern(uri.encode('ascii'))
+ uri = intern(uri.encode('utf-8'))
uriKey = intern(self._normalizeScheme(uri))
numstr = escapeToNamedASCII(numstr)
title = escapeToNamedASCII(title) if title else None
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-1.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-1.html
index 530a353c789..26067124695 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-1.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-1.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-10.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-10.html
index b096c9f7449..89b48c5790f 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-10.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-10.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-11.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-11.html
index ac867b2764a..6bd65bf00ff 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-11.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-11.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-12.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-12.html
index 96a190e95c7..8b7c7c3b357 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-12.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-12.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-13.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-13.html
index bcd45e091a2..f5296abab0b 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-13.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-13.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14-ref.html
index 12f2a3db62e..26a67faddf5 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14.html
index ba5e5f17509..a1f77d6a3a7 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-14.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15-ref.html
index 856c3fb50bf..0a88ee436dc 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15.html
index 7b8e958947f..6732def1450 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-15.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-2.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-2.html
index b5a8d0f923d..aaeb1b6c7af 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-2.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-2.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-3.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-3.html
index f18a344e6e5..21ffc279b2e 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-3.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-3.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-4.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-4.html
index a69ea4cd62d..3c7b6d5da17 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-4.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-4.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-5.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-5.html
index 944d3c12e7f..3047e8b22f9 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-5.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-5.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-6.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-6.html
index 8108b444c1b..d65052abcc7 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-6.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-6.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-7.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-7.html
index 0f35edb7c76..2ce9933e29a 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-7.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-7.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8-ref.html
index bf31a0b710e..796ac545e51 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8.html
index 77d9e340695..2e13cff74fd 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-8.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-9.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-9.html
index b2e9c9da0d5..7bcd746171d 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-9.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-9.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-ref.html
index 7ab7bb30319..a340bc1d5c4 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-block-page-break-inside-avoid-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-1.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-1.html
index 8f7d709f037..4f24e6f260c 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-1.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-1.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2-ref.html
index e4df1dbc146..e1189155922 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2.html
index 9cfc9bb35a1..6995d93a1a1 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-2.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-3.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-3.html
index dd61bde5100..d4f6af8aef5 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-3.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-3.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-4.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-4.html
index 95f6a56e25e..0646884a97c 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-4.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-4.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5-ref.html
index e04ffcb60ca..01331f22761 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5.html
index c320d7744c9..5990392f841 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-5.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6-ref.html
index f4b7529d74c..a5a075f4890 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6.html
index 505ccb26346..3cd0a5fb1c4 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-6.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7-ref.html
index 06b197fa3d3..922165e6ab4 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7.html
index 854a2dce320..01c33da0181 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-7.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8-ref.html
index b09e87f5c9c..a6f5e07b246 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8.html
index a4e11942209..1c146aa919e 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-8.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9-ref.html
index 2c6bb0ed090..023495fe660 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9.html
index 6c955a16b77..cb708cb768c 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-float-page-break-inside-avoid-9.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1-ref.html
index 1e8de0a463e..b07f4d56954 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1.html
index 0b7c6af14c5..ff00c41cbce 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-inline-page-break-inside-avoid-1.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-1.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-1.html
index f964fd7ca9a..5053fa80598 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-1.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-1.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-2.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-2.html
index a09e0f7a68e..0ec44645329 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-2.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-row-page-break-inside-avoid-2.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-1.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-1.html
index 549f738bbb4..e59646e25b3 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-1.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-1.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-2.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-2.html
index de8cf69cbb0..3f82437bc02 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-2.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-2.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-3.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-3.html
index d5ed3e40423..32484c3f4c9 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-3.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-3.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4-ref.html
index 155e2aa2664..c0850a7cf00 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4.html
index e6afb598bdd..306a7fc1285 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-4.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5-ref.html
index 88aae37080b..c6c482abc7a 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5.html
index 94715fb47a4..d3534bb5361 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-5.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-6.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-6.html
index 8ffb7f76517..c0d64e92253 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-6.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-6.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7-ref.html
index f524800801e..0496203450f 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7.html
index c130f84d4de..d6b53e85cce 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-7.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8-ref.html
index 71dbbab7c93..e2bac8885b9 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8.html
index 4f814d48690..1caa4764985 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-rowgroup-page-break-inside-avoid-8.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-1.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-1.html
index 962c7ee28df..073f7eb89c6 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-1.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-1.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2-ref.html
index a54708a7002..377ce2083ad 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2.html
index c7fa2da41b6..cc6a55933f6 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-2.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3-ref.html
index 1029d31e6b0..374675b8f05 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3.html
index 794486c52e2..852145f8937 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-3.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4-ref.html
index a9129f248bc..73f4c86b274 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4.html
index 23c5b8c7a45..e71c0b1d8ba 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-4.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5-ref.html
index 6e62b79d8d5..1101c4bc06b 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5.html
index 7172f0dd6b0..e7443b08f5a 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-5.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6-ref.html
index 0560667a4e6..f83247cdfd0 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6.html
index d9a37071d2b..fbe1ee46371 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-6.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7-ref.html
index 1a2d3d304e8..cc4a31c2901 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7.html
index edf25618346..52eca20f2a8 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-7.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-8.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-8.html
index ea09ff93ea3..f0caa18aea9 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-8.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-8.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-ref.html
index 6cce765b3b8..d52a38713ac 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-ref.html
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/css21/pagination/moz-css21-table-page-break-inside-avoid-ref.html
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html lang="en-US" class="reftest-print">
+<html lang="en-US" class="reftest-paged">
<head>
<title>CSS Test: CSS 2.1 page-break-inside:avoid</title>
<link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=685012">
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/masking/reftest.list b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/masking/reftest.list
index 0c24b6a310b..b8286de1665 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/masking/reftest.list
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/masking/reftest.list
@@ -27,6 +27,7 @@
== mask-image-3c.html mask-image-3-ref.html
== mask-image-3d.html mask-image-3-ref.html
== mask-image-3e.html mask-image-3-ref.html
+# Due to SVG luminance, see bug 1372577, parent process doesn't use d2d for luminance.
== mask-image-3f.html mask-image-3-ref.html
== mask-image-3g.html mask-image-3-ref.html
== mask-image-3h.html mask-image-3-ref.html
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/multicol-height-002.xht b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/multicol-height-002.xht
index f9ad2ee9f0f..aaf544cb16b 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/multicol-height-002.xht
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/multicol-height-002.xht
@@ -1,6 +1,6 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
- <head class="reftest-print">
+ <head class="reftest-paged">
<title>CSS Test: Percentage Computed Height on Multicol Child (Definite Multicol Height)</title>
<link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact" />
<link rel="help" href="http://www.w3.org/TR/css3-multicol/#the-multi-column-model" />
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/reference/multicol-height-002.xht b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/reference/multicol-height-002.xht
index f707a8a31f1..16e7f1b3ddb 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/reference/multicol-height-002.xht
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/multicol3/reference/multicol-height-002.xht
@@ -1,6 +1,6 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
- <head class="reftest-print">
+ <head class="reftest-paged">
<title>CSS Reftest Reference</title>
<link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact" />
<style type="text/css"><![CDATA[
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/reftest.list b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/reftest.list
index 3f145fa92d6..a6e18f3f389 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/reftest.list
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/reftest.list
@@ -1,5 +1,6 @@
== ruby-text-decoration-01.html ruby-text-decoration-01-ref.html
== text-decoration-propagation-01.html text-decoration-propagation-01-ref.html
+== text-decoration-propagation-dynamic-001.html text-decoration-propagation-dynamic-001-ref.html
# text-emphasis-style
== text-emphasis-style-property-001.html text-emphasis-style-property-001-ref.html
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001-ref.html
new file mode 100644
index 00000000000..f9b3c4c484e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001-ref.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<title>CSS Test reference: Dynamic text-decoration propagation</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="help" href="https://www.w3.org/TR/css-text-decor-3/#line-decoration">
+<style>
+ div { text-decoration: underline }
+</style>
+<div>
+ <span><b>Should be underlined</b></span>
+</div>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001.html
new file mode 100644
index 00000000000..9616a4784d9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/text-decor-3/text-decoration-propagation-dynamic-001.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<title>CSS Test: Dynamic text-decoration propagation</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="help" href="https://www.w3.org/TR/css-text-decor-3/#line-decoration">
+<link rel="match" href="text-decoration-propagation-dynamic-001-ref.html">
+<style>
+ div { text-decoration: none }
+ div.restyled { text-decoration: underline }
+</style>
+<div>
+ <span><b>Should be underlined</b></span>
+</div>
+<script>
+ document.body.offsetTop;
+ document.querySelector('div').classList = "restyled";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/reftest.list b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/reftest.list
index 77d4e5014b8..87562d963de 100644
--- a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/reftest.list
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/reftest.list
@@ -29,3 +29,4 @@
== calc-width-block-intrinsic-1.html calc-width-block-intrinsic-1-ref.html
== calc-width-table-auto-1.html calc-width-table-auto-1-ref.html
== calc-width-table-fixed-1.html calc-width-table-fixed-1-ref.html
+== rem-root-font-size-restyle-1.html rem-root-font-size-restyle-1-ref.html
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1-ref.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1-ref.html
new file mode 100644
index 00000000000..a1a1430d35e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1-ref.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<title>CSS Test reference</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<style>
+:root {
+ font-size: 2em;
+}
+
+div {
+ width: 10rem;
+ height: 10rem;
+ background: green;
+}
+</style>
+<div></div>
diff --git a/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1.html b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1.html
new file mode 100644
index 00000000000..0f236cb3df9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/css/vendor-imports/mozilla/mozilla-central-reftests/values3/rem-root-font-size-restyle-1.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>CSS Test: Test for rem units on the root element</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="help" href="https://drafts.csswg.org/css-values/#rem">
+<link rel="match" href="rem-root-font-size-restyle-1-ref.html">
+<style>
+:root {
+ font-size: 2rem;
+}
+
+div {
+ width: 10rem;
+ height: 10rem;
+ background: green;
+}
+</style>
+<div></div>
+<script>
+ document.documentElement.offsetTop;
+ // Force a style recalc.
+ document.documentElement.style.color = "green";
+</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/base.css b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/base.css
deleted file mode 100644
index 2a86fb7c3f8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/base.css
+++ /dev/null
@@ -1,21 +0,0 @@
-/* custom table tags */
-
- x-table { display: table; }
- x-colgroup { display: table-column-group; }
- x-col { display: table-column; }
- x-tbody { display: table-row-group; }
- x-thead { display: table-header-group; }
- x-tfoot { display: table-footer-group; }
- x-tr { display: table-row; }
- x-td { display: table-cell; }
- x-caption { display: table-caption; }
-
-/* layout of the page */
-
- hr + p { font-weight: bold; margin-bottom: 0; }
- p + p { margin-top: 0; }
-
- html, body { padding: 0; margin: 0; }
- main, #log { padding: 10px; width: 50%; box-sizing: border-box; }
- main { float: left; }
- #log { float: right; background: #eee; } \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-1.html
deleted file mode 100644
index c2819c51fce..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-1.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#bounding-box-assignment">
-<main>
-
- <h1>Bounding box computation</h1>
- <p>Checks that all table-internal boxes are positioned correctly</p>
-
- <hr/>
- <p>The all table-internal elements of this table shoud be 100px and 100px wide tall:</p>
- <p>Table size is 120px. There are two 10px border-spacing, one at each side.</p>
- <x-table style="width: 120px; height: 120px; border-spacing: 10px; background: yellow;">
- <x-colgroup><x-col></x-col></x-colgroup>
- <x-tbody>
- <x-tr>
- <x-td style="padding: 0; background: blue;"></x-td>
- </x-tr>
- </x-tbody>
- </x-table>
-
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- "Control test: Table width is 120px",
- document.querySelector("x-table:nth-of-type("+(i++)+")").offsetWidth,
- 120
- ],
- [
- "Control test: Table height is 120px",
- document.querySelector("x-table:nth-of-type("+(i-1)+")").offsetHeight,
- 120
- ],
- [
- "Table-cell is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-td").offsetWidth,
- 100
- ],
- [
- "Table-cell is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-td").offsetHeight,
- 100
- ],
- [
- "Table-row is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tr").offsetWidth,
- 100
- ],
- [
- "Table-row is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tr").offsetHeight,
- 100
- ],
- [
- "Table-row-group is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetWidth,
- 100
- ],
- [
- "Table-row-group is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetHeight,
- 100
- ],
- [
- "Table-column is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-col").offsetWidth,
- 100
- ],
- [
- "Table-column is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-col").offsetHeight,
- 100
- ],
- [
- "Table-column-group is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-colgroup").offsetWidth,
- 100
- ],
- [
- "Table-column-group is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-colgroup").offsetHeight,
- 100
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-2.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-2.html
deleted file mode 100644
index 45f6cbc5e50..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-2.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#bounding-box-assignment">
-<main>
-
- <h1>Bounding box computation</h1>
- <p>Checks that all table-internal boxes are positioned correctly</p>
-
- <hr/>
- <p>The all table-internal elements of this table shoud be 100px and 100px wide tall:</p>
- <p>Table size is 120px. There are two 10px borders, one at each side.</p>
- <x-table style="width: 120px; height: 120px; border: 10px solid transparent; box-sizing: border-box; background: yellow;">
- <x-colgroup><x-col></x-col></x-colgroup>
- <x-tbody>
- <x-tr>
- <x-td style="padding: 0; background: blue;"></x-td>
- </x-tr>
- </x-tbody>
- </x-table>
-
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- "Control test: Table width is 120px",
- document.querySelector("x-table:nth-of-type("+(i++)+")").offsetWidth,
- 120
- ],
- [
- "Control test: Table height is 120px",
- document.querySelector("x-table:nth-of-type("+(i-1)+")").offsetHeight,
- 120
- ],
- [
- "Table-cell is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-td").offsetWidth,
- 100
- ],
- [
- "Table-cell is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-td").offsetHeight,
- 100
- ],
- [
- "Table-row is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tr").offsetWidth,
- 100
- ],
- [
- "Table-row is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tr").offsetHeight,
- 100
- ],
- [
- "Table-row-group is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetWidth,
- 100
- ],
- [
- "Table-row-group is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetHeight,
- 100
- ],
- [
- "Table-column is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-col").offsetWidth,
- 100
- ],
- [
- "Table-column is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-col").offsetHeight,
- 100
- ],
- [
- "Table-column-group is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-colgroup").offsetWidth,
- 100
- ],
- [
- "Table-column-group is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-colgroup").offsetHeight,
- 100
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-3.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-3.html
deleted file mode 100644
index fc9c399e153..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/bounding-box-computation-3.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#bounding-box-assignment">
-<main>
-
- <h1>Bounding box computation</h1>
- <p>Checks that all table-internal boxes are positioned correctly</p>
-
- <hr/>
- <p>The first table-row-group should have width and height 0:</p>
- <p>The first tbody is empty, and should return an height of 0px. The second one should be 100px tall.</p>
- <x-table style="border-spacing: 10px; background: yellow; position: relative;">
- <x-tbody></x-tbody>
- <x-tbody>
- <x-tr>
- <x-td style="padding: 50px; background: blue;"></x-td>
- </x-tr>
- </x-tbody>
- </x-table>
-
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- "Control test: Table width is 120px",
- document.querySelector("x-table:nth-of-type("+(i++)+")").offsetWidth,
- 120
- ],
- [
- "Control test: Table height is 120px",
- document.querySelector("x-table:nth-of-type("+(i-1)+")").offsetHeight,
- 120
- ],
- [
- "First (empty) table-row-group is 0px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetWidth,
- 0
- ],
- [
- "First (empty) table-row-group is 0px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetHeight,
- 0
- ],
- [
- "First (empty) table-row-group should be located at 10px left",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetLeft,
- 10
- ],
- [
- "First (empty) table-row-group should be located at 10px top",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody").offsetTop,
- 10
- ],
- [
- "Second table-row-group is 100px wide",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody + x-tbody").offsetWidth,
- 100
- ],
- [
- "Second table-row-group is 100px tall",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody + x-tbody").offsetHeight,
- 100
- ],
- [
- "Second table-row-group should be located at 10px left",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody + x-tbody").offsetLeft,
- 10
- ],
- [
- "Second table-row-group should be located at 10px top",
- document.querySelector("x-table:nth-of-type("+(i-1)+") x-tbody + x-tbody").offsetTop,
- 10
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/caption-side-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/caption-side-1.html
deleted file mode 100644
index 3754ce4d2dc..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/caption-side-1.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#caption-side-property">
-<main>
-
- <h1>Caption-side</h1>
- <p>Checks that browsers implement properly the caption-side property</p>
-
- <hr/>
- <p>This should read ABC:</p>
- <p>
- The first caption (C) should be put on the bottom because it inherits caption-side:bottom from the table;<br/>
- The second captin (A) should be put on the top because it has caption-side:top specified;
- </p>
- <div><table style="caption-side:bottom"><caption>C</caption><tbody><tr><td>B</td></tr></tbody><caption style="caption-side:top">A</caption></table></div>
-
- <script>void function() { var table; while(table = document.querySelector('.to-remove')) table.parentNode.replaceChild(table.firstChild,table) }();</script>
- <script>void function() { var td; while(td = document.querySelector('table.no-td td')) td.parentNode.replaceChild(document.createElement('x-td'),td) }();</script>
- <script>void function() { var divs = document.querySelectorAll("main > div"); for(var i = divs.length; i--;) { var div = divs[i]; var pre = document.createElement('pre'); pre.title = pre.textContent = div.innerHTML; div.parentNode.insertBefore(pre, div); }; }();</script>
- <hr/>
-
-</main>
-
-<script>
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- "Caption-side inherits and reorder captions properly",
- document.querySelector("main > div:nth-of-type("+(i++)+") caption:first-child").offsetTop > document.querySelector("main > div:nth-of-type("+(i-1)+") caption:last-child").offsetTop,
- true
- ],
- [
- "Multiple captions can be rendered",
- document.querySelector("main > div:nth-of-type("+(i-1)+") table").offsetHeight > 3 * 16,
- true
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/fixed-layout-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/fixed-layout-1.html
deleted file mode 100644
index 046f94d6d0e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/fixed-layout-1.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution-in-fixed-mode">
-<main>
-
- <h1>Fixed Layout</h1>
- <p>Checks whether fixed layout is implemented properly</p>
-
- <hr/>
- <p>This should be a 100px-wide blue square:</p>
- <p>Width is distributed equally between columns of auto size</p>
- <x-table style="table-layout: fixed; width: 200px; border-spacing: 0px">
- <x-tr>
- <x-td style="padding: 0; background: blue; height: 100px;"></x-td>
- <x-td style="padding: 0"></x-td>
- </x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 100px-wide blue square:</p>
- <p>Width is distributed equally between columns of auto size (even if they are defined by rows other than the first)</p>
- <x-table style="table-layout: fixed; width: 200px; border-spacing: 0px">
- <x-tr><x-td style="padding: 0; background: blue; height: 100px;"></x-td></x-tr>
- <x-tr><x-td style="padding: 0; height: 0px"></x-td><x-td style="padding: 0"></x-td></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 100px-wide blue square:</p>
- <p>Widths defined on cells that are not the first row are ignored</p>
- <x-table style="table-layout: fixed; width: 200px; border-spacing: 0px">
- <x-tr><x-td style="padding: 0; background: blue; height: 100px;"></x-td></x-tr>
- <x-tr><x-td style="padding: 0; height: 0px; width: 200px;"></x-td><x-td style="padding: 0; width: 200px;"></x-td></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 100px-wide blue square:</p>
- <p>The table has to grow to contain the widths defined for its columns</p>
- <x-table style="table-layout: fixed; width: 50px; border-spacing: 0px">
- <x-tr><x-td style="padding: 0; background: blue; height: 100px; width: 100px;"></x-td></x-tr>
- <x-tr><x-td style="padding: 0; height: 0px"></x-td><x-td style="padding: 0"></x-td></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 100px-wide blue square:</p>
- <p>The first row is based on the visual order, not the dom order</p>
- <x-table style="table-layout: fixed; width: 100px; border-spacing: 0px">
- <x-tr><x-td style="padding: 0; height: 0px"></x-td><x-td style="padding: 0"></x-td></x-tr>
- <x-thead><x-tr><x-td style="padding: 0; background: blue; height: 100px; width: 100px;"></x-td></x-tr></x-thead>
- </x-table>
-
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- generate_tests(assert_equals, [
- [
- "Table-layout:fixed distributes width equally to all auto-columns",
- document.querySelector("x-table:nth-of-type(1) > x-tr:first-child > x-td:first-child").offsetWidth,
- 100
- ],
- [
- "Table-layout:fixed deals with columns generated by subsequent rows",
- document.querySelector("x-table:nth-of-type(2) > x-tr:first-child > x-td:first-child").offsetWidth,
- 100
- ],
- [
- "Table-layout:fixed ignores sizes specified by subsequent rows",
- document.querySelector("x-table:nth-of-type(3) > x-tr:first-child > x-td:first-child").offsetWidth,
- 100
- ],
- [
- "Table-layout:fixed grows the table if needed for minimum-width",
- document.querySelector("x-table:nth-of-type(4) > x-tr:first-child > x-td:first-child").offsetWidth,
- 100
- ],
- [
- "Table-layout:fixed takes visual order into account, not dom order",
- document.querySelector("x-table:nth-of-type(5) > x-tr:first-child > x-td:first-child").offsetWidth,
- 100
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/fixed-layout-2.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/fixed-layout-2.html
deleted file mode 100644
index 35a6e4b8a98..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/fixed-layout-2.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#in-fixed-mode">
-<main>
-
- <h1>Fixed Layout</h1>
- <p>Checks whether fixed layout is implemented properly (width is not definite)</p>
-
- <hr/>
- <p>This should be a 100px-wide blue square:</p>
- <p>Table-layout:fixed does not apply to width:auto tables</p>
- <x-table style="table-layout: fixed; border-spacing: 0px">
- <x-tr>
- <x-td style="padding: 0; background: blue; height: 100px;"><div style="width: 100px"></div></x-td>
- <x-td style="padding: 0"></x-td>
- </x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 100px-wide blue square:</p>
- <p>Table-layout:fixed does not apply to width:max-content tables</p>
- <x-table style="table-layout: fixed; width: max-content; border-spacing: 0px">
- <x-tr>
- <x-td style="padding: 0; background: blue; height: 100px;"><div style="width: 100px"></div></x-td>
- <x-td style="padding: 0"></x-td>
- </x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 100px-wide blue square:</p>
- <p>Table-layout:fixed does not apply to width:min-content/fit-content tables</p>
- <x-table style="table-layout: auto; width: fit-content; border-spacing: 0px">
- <x-tr>
- <x-td style="padding: 0; background: blue; height: 50px;"><div style="width: 100px"></div></x-td>
- <x-td style="padding: 0"></x-td>
- </x-tr>
- </x-table>
- <x-table style="table-layout: fixed; width: min-content; border-spacing: 0px">
- <x-tr>
- <x-td style="padding: 0; background: blue; height: 50px;"><div style="width: 100px"></div></x-td>
- <x-td style="padding: 0"></x-td>
- </x-tr>
- </x-table>
-
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- generate_tests(assert_equals, [
- [
- "Table-layout:fixed is not applied when width is auto",
- document.querySelector("x-table:nth-of-type(1) > x-tr:first-child > x-td:first-child").offsetWidth,
- 100
- ],
- [
- "Table-layout:fixed reports it is not applied when width is auto",
- getComputedStyle(document.querySelector("x-table:nth-of-type(1)")).tableLayout,
- 'auto'
- ],
- [
- "Table-layout:fixed is not applied when width is max-content",
- document.querySelector("x-table:nth-of-type(2) > x-tr:first-child > x-td:first-child").offsetWidth,
- 100
- ],
- [
- "Table-layout:fixed reports it is not applied when width is max-content",
- getComputedStyle(document.querySelector("x-table:nth-of-type(2)")).tableLayout,
- 'auto'
- ],
- [
- "Table-layout:fixed is not applied when width is min-content",
- document.querySelector("x-table:nth-of-type(3) > x-tr:first-child > x-td:first-child").offsetWidth,
- document.querySelector("x-table:nth-of-type(4) > x-tr:first-child > x-td:first-child").offsetWidth
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-0.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-0.html
deleted file mode 100644
index 3dda06c64d5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-0.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-column-measures" />
-<main>
- <h4>"Computing row measures"</h4>
- <p>This is testing that the table root's minimum is max(table-root width, capmin, gridmin) <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec Text</a></p>
-
- <hr/>
- <table id="one" cellspacing="0" cellpadding="0">
- <tbody style="height: 1px;">
- <tr style="height: 10px;">
- <td style="height: 1px;"></td>
- </tr>
- </tbody>
- </table>
-
- <table id="two" cellspacing="0" cellpadding="0">
- <tbody style="height: 10px;">
- <tr style="height: 1px;">
- <td style="height: 1px;"></td>
- </tr>
- </tbody>
- </table>
-
- <table id="three" cellspacing="0" cellpadding="0">
- <tbody style="height: 1px;">
- <tr style="height: 1px;">
- <td style="height: 10px;"></td>
- </tr>
- </tbody>
- </table>
-
- <table id="four" cellspacing="0" cellpadding="0">
- <tbody style="height: 10px;">
- <tr>
- <td style="height: 1px;"></td>
- </tr>
- </tbody>
- </table>
-</main>
-
-<script>
- var i = 1;
- generate_tests(assert_equals, [
- [
- "Checking intermediate min-content height for span 1 (1)",
- document.getElementById('one').offsetHeight,
- 10
- ],
- [
- "Checking intermediate min-content height for span 1 (2)",
- document.getElementById('two').offsetHeight,
- 1
- ],
- [
- "Checking intermediate min-content height for span 1 (3)",
- document.getElementById('three').offsetHeight,
- 10
- ],
- [
- "Checking intermediate min-content height for span 1 (4)",
- document.getElementById('four').offsetHeight,
- 10
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-1.html
deleted file mode 100644
index 8e50e95d4b2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/computing-row-measure-1.html
+++ /dev/null
@@ -1,94 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-column-measures" />
-<main>
- <h1>Width Distribution</h1>
- <h4>"Computing column measures"</h4>
- <p>This is testing intermediate min-content width for span 2</p>
-
- <hr/>
- <table cellspacing="0" cellpadding="0">
- <colgroup style="width: auto;">
- <col style="width: 10px;"></col>
- <col style="width: 20px;"></col>
- </colgroup>
- <tr>
- <td id="one" style="width: 1px;"></td>
- <td style="width: 2px;"></td>
- </tr>
- <tr>
- <td colspan="2" style="width: 51px;"></td>
- </tr>
- </table>
-
- <table cellspacing="0" cellpadding="0">
- <colgroup style="width: auto;">
- <col style="width: 10px;"></col>
- <col style="width: auto;"></col>
- </colgroup>
- <tr>
- <td id="two" style="width: 1px;"></td>
- <td style="width: auto;"></td>
- </tr>
- <tr>
- <td colspan="2" style="width: 51px;"></td>
- </tr>
- </table>
-
- <table cellspacing="0" cellpadding="0">
- <colgroup style="width: 51px;">
- <col style="width: 10px;"></col>
- <col style="width: 20px;"></col>
- </colgroup>
- <tr>
- <td id="three" style="width: 1px;"></td>
- <td style="width: 2px;"></td>
- </tr>
- </table>
-
- <table cellspacing="0" cellpadding="0">
- <colgroup style="width: 51px;">
- <col style="width: 20px;"></col>
- <col style="width: auto;"></col>
- </colgroup>
- <tr>
- <td style="width: 10px;"></td>
- <td id="four" style="width: 20px;"></td>
- </tr>
- </table>
-</main>
-
-<style>
- table { margin-bottom: 10px; height: 50px; }
- td { outline: 1px solid red; outline-offset: -1px; }
-</style>
-<script>
- var i = 1;
- generate_tests(assert_equals, [
- [
- "Checking intermediate min-content width for span 2 (1)",
- document.getElementById('one').offsetWidth,
- 17
- ],
- [
- "Checking intermediate min-content width for span 2 (2)",
- document.getElementById('two').offsetWidth,
- 10
- ],
- [
- "Checking intermediate min-content width for span 2 (3)",
- document.getElementById('three').offsetWidth,
- 10
- ],
- [
- "Checking intermediate min-content width for span 2 (4)",
- document.getElementById('four').offsetWidth,
- 51
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/percentage-sizing-of-table-cell-children.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/percentage-sizing-of-table-cell-children.html
deleted file mode 100644
index d0e63ff5100..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/height-distribution/percentage-sizing-of-table-cell-children.html
+++ /dev/null
@@ -1,198 +0,0 @@
-<!doctype html>
-<!--------------------------------------------------------------------------------------->
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-<script>
-
- function assertOffsetWidthEquals(a,targetValue) {
- var desc = document.querySelector('main > hr:last-of-type + p + p') || document.querySelectorAll('main > hr + p + p')[document.querySelectorAll('main > hr + p + p').length-1];
- var root = document.querySelector('main > div:last-of-type') || document.querySelectorAll('main > div')[document.querySelectorAll('main > div').length-1];
- generate_tests(assert_equals, [
- [
- desc.textContent,
- root.querySelector("[target="+a+"]").offsetWidth,
- targetValue
- ]
- ]);
- }
-
- function assertOffsetHeightEquals(a,targetValue) {
- var desc = document.querySelector('main > hr:last-of-type + p + p') || document.querySelectorAll('main > hr + p + p')[document.querySelectorAll('main > hr + p + p').length-1];
- var root = document.querySelector('main > div:last-of-type') || document.querySelectorAll('main > div')[document.querySelectorAll('main > div').length-1];
- generate_tests(assert_equals, [
- [
- desc.textContent,
- root.querySelector("[target="+a+"]").offsetHeight,
- targetValue
- ]
- ]);
- }
-
-</script>
-
-
-<main>
-
- <h1>Height distribution</h1>
- <p>Check that percentages are accounted for correctly for table-cell children</p>
-
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>There should be a 100px blue square below:</p>
- <p>Percentages resolve based on the column width</p>
- <div>
- <x-table style="width: 100px; height: 100px;">
- <x-tr><x-td><div target=a style="width: 100%; height: 100px; background: blue"></div></x-td></x-tr>
- </x-table>
- </div>
- <script>
-
- assertOffsetWidthEquals('a',100);
-
- </script>
-
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>There should be a 100px blue square below:</p>
- <p>Percentages resolve based on the row height</p>
- <div>
- <x-table style="width: 100px; height: 100px;">
- <x-tr><x-td><div target=a style="width: 100px; height: 100%; background: blue"></div></x-td></x-tr>
- </x-table>
- </div>
- <script>
-
- assertOffsetHeightEquals('a',100);
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>There should be a 100px blue square below:</p>
- <p>Percentages resolve based on the final column width</p>
- <div>
- <x-table style="width: 0px; height: 100px; background: red;">
- <x-tr><x-td style="width:0px;height:0px;"><div target=a style="width: 100%; height: 100px; background: blue"></div></x-td></x-tr>
- <x-tr><x-td style="width:0px;height:0px;"><div target=a style="width: 100px; height: 0px"></div></x-td></x-tr>
- </x-table>
- </div>
- <script>
-
- assertOffsetWidthEquals('a',100);
-
- </script>
-
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>There should be a 100px blue square below:</p>
- <p>Percentages resolve based on the final row height</p>
- <div>
- <x-table style="width: 100px; height: 0px; background: red;">
- <x-tr>
- <x-td style="width: 0px; height: 0px;"><div target=a style="width: 100px; height: 100%; background: blue"></div></x-td>
- <x-td style="width: 0px; height: 0px;"><div target=a style="width: 0px; height: 100px; background: red"></div></x-td>
- </x-tr>
- </x-table>
- </div>
- <script>
-
- assertOffsetHeightEquals('a',100);
-
- </script>
-
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>There should be a blue and cyan rectangles of the same width:</p>
- <p>Unresolvable percentage widths are resolved as auto in first pass (replaced elements)</p>
- <div>
- <x-table style="width: 0px; height: 18px; background: red;">
- <x-tr><x-td><input target=a style="width: 100%; height: 100%; background: blue; vertical-align: top; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;"/></x-td></x-tr>
- </x-table>
- <input style="background:cyan; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;" />
- </div>
- <script>
-
- assertOffsetWidthEquals('a',document.querySelector('input[style="background:cyan; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;"]').offsetWidth);
-
- </script>
-
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>There should be a blue and cyan rectangles below of the same height:</p>
- <p>Unresolvable percentage heights are resolved as auto in first pass (replaced elements)</p>
- <div>
- <x-table style="width: auto; height: 0px; background: red;">
- <x-tr><x-td><input target=a style="width: 100%; height: 100%; background: blue; vertical-align: top; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;"/></x-td></x-tr>
- </x-table>
- <input style="background:cyan; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;" />
- </div>
- <script>
-
- assertOffsetHeightEquals('a',document.querySelector('input[style="background:cyan; appearance:none; -webkit-appearance:none; border:0;margin:0;padding:0;"]').offsetHeight);
-
- </script>
-
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>There should be a 100px blue square below:</p>
- <p>Unresolvable percentage widths are resolved as auto in first pass (unscrollable overflow)</p>
- <div>
- <x-table style="width: 0px; height: 100px; background: red;">
- <x-tr><x-td><div target=a style="width: 100%; height: 100px; background: blue; overflow: hidden;"><div target=a style="width: 100px; height: 0px"></div></div></x-td></x-tr>
- </x-table>
- </div>
- <script>
-
- assertOffsetWidthEquals('a',100);
-
- </script>
-
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>There should be a 100px blue square below:</p>
- <p>Unresolvable percentage heights are resolved as auto in first pass (unscrollable overflow)</p>
- <div>
- <x-table style="width: 100px; height: 0px; background: red;">
- <x-tr>
- <x-td><div target=a style="width: 100px; height: 100%; background: blue; overflow: hidden;"><div target=a style="width: 0px; height: 100px; background: red"></div></div></x-td>
- </x-tr>
- </x-table>
- </div>
- <script>
-
- assertOffsetHeightEquals('a',100);
-
- </script>
-
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>There should be a 100px blue square below:</p>
- <p>Unresolvable percentage widths are resolved as auto in first pass (scrollable overflow)</p>
- <div>
- <x-table style="width: 0px; height: 100px; background: red;">
- <x-tr><x-td><div target=a style="width: 100%; height: 100px; background: blue; overflow: auto;"><div target=a style="width: 100px; height: 0px"></div></div></x-td></x-tr>
- </x-table>
- </div>
- <script>
-
- assertOffsetWidthEquals('a',100);
-
- </script>
-
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>There should be a 100px blue square below:</p>
- <p>Unresolvable percentage heights are resolved as 0px in first pass (scrollable overflow)</p>
- <div>
- <x-table style="width: 100px; height: 100px; background: red;">
- <x-tr><x-td><div target=a style="width: 100px; height: 100%; background: red; overflow: auto;"><div target=a style="width: 0px; height: 100px; background: red"></div></div></x-td></x-tr>
- <x-tr><x-td><div style="width: 100px; height: 100%; background: blue; overflow: hidden;"><div target=a style="width: 0px; height: 100px; background: red"></div></div></x-td></x-tr>
- </x-table>
- </div>
- <script>
-
- assertOffsetHeightEquals('a',0);
-
- </script>
-
-</main>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html-to-css-mapping-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html-to-css-mapping-1.html
deleted file mode 100644
index 7995ece78c5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html-to-css-mapping-1.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#fixup">
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#mapping">
-<main>
-
- <h1>HTML-2-CSS Mapping</h1>
- <p>Checks that browsers implement properly the html2css stylesheet (rules without attributes)</p>
-
- <hr/>
- <p>You should see a 5 2px blue square here, separated by 2px each:</p>
- <p>Because of the lack of the table element, border-spacing is 0; padding on each td should be 1px on each side. 1px*2*5=10px.</p>
- <div><table><tbody style="background: blue; height: 2px"><tr><td></td><td></td><td></td><td></td><td></tr></tbody></table></div>
-
- <hr/>
- <p>You should see a 10px blue square here:</p>
- <p>Because of the lack of the table element, border-spacing is 0; padding on each td should be 1px on each side. 1px*2*5=10px.</p>
- <div><table class="to-remove"><tbody style="background: blue; height: 10px"><tr><td></td><td></td><td></td><td></td><td></tr></tbody></table></div>
-
- <hr/>
- <p>You should see a 12px blue square here:</p>
- <p>The table has the background; x-td elements have no padding, only the border-spacing remains. 6*2px=12px.</p>
- <div><table style="height: 12px; background: blue;" class="no-td"><tbody><tr><td></td><td></td><td></td><td></td><td></tr></tbody></table></div>
-
- <hr/>
- <p>You shouldn't see anything here:</p>
- <p>The table has the background but is empty; it does not apply border-spacing in this case.</p>
- <div><table style="height: 2px; background: red"></table></div>
-
- <script>void function() { var table; while(table = document.querySelector('.to-remove')) table.parentNode.replaceChild(table.firstChild,table) }();</script>
- <script>void function() { var td; while(td = document.querySelector('table.no-td td')) td.parentNode.replaceChild(document.createElement('x-td'),td) }();</script>
-
-</main>
-
-<script>
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- "HTML -> CSS Mapping is applied correctly on proper table markup (border-spacing, padding)",
- document.querySelector("main > div:nth-of-type("+(i++)+") table").offsetWidth,
- 22
- ],
- [
- "HTML -> CSS Mapping is applied correctly on improper table markup (no table => no border-spacing, but padding)",
- document.querySelector("main > div:nth-of-type("+(i++)+") tbody").offsetWidth,
- 10
- ],
- [
- "HTML -> CSS Mapping is applied correctly on improper table markup (no td => border-spacing, but no padding)",
- document.querySelector("main > div:nth-of-type("+(i++)+") table").offsetWidth,
- 12
- ],
- [
- "HTML -> CSS Mapping is applied correctly on empty table markup (no content => no border-spacing, no padding)",
- document.querySelector("main > div:nth-of-type("+(i++)+") table").offsetWidth,
- 0
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html-to-css-mapping-2.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html-to-css-mapping-2.html
deleted file mode 100644
index e2b111525aa..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html-to-css-mapping-2.html
+++ /dev/null
@@ -1,226 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#mapping">
-<main>
-
- <h1>HTML-2-CSS Mapping</h1>
- <p>Checks that browsers implement properly the html2css stylesheet (rules about borders, disabling border-collapse for clarity)</p>
- <style>table { border-collapse: separate !important; }</style>
-
- <hr/>
- <p>1: The border of the table element should be 0px hidden gray:</p>
- <p>
- <code>border-width:0px</code> is the <code>initial</code> value;<br/>
- <code>border-style:hidden</code> comes from <code>table:matches(..., [rules=groups], ...)</code>;<br/>
- <code>border-color:gray</code> comes from <code>table</code>
- </p>
- <div><table border="0" rules="groups"><tbody><tr><td></td></tr></tbody></table></div>
-
- <hr/>
- <p>2: The border of the table element should be 1px outset black:</p>
- <p>
- <code>border-width:1px</code> comes from <code>table[frame=box] (1/2)</code>;<br/>
- <code>border-style:outset</code> comes from <code>table[frame=box] (2/2)</code>;<br/>
- <code>border-color:black</code> comes from <code>table:matches(..., [rules=groups], ...)</code>
- </p>
- <div><table border="0" rules="groups" frame="box"><tbody><tr><td></td></tr></tbody></table></div>
-
- <hr/>
- <p>3a: The border of the table element should be 10px outset gray:</p>
- <p>
- <code>border-width:10px</code> comes from <code>table[border=$w]</code>;<br/>
- <code>border-style:outset</code> comes from <code>table[frame=box] (2/2)</code>;<br/>
- <code>border-color:gray</code> comes from <code>table[border=$w]</code>
- </p>
- <hr style="display:none"/>
- <p>3b: The border-top of the td element should be 1px inset gray:</p>
- <p>
- <code>border-width:1px</code> comes from <code>table[border=$w] > ...td</code>;<br/>
- <code>border-style:inset</code> comes from <code>table[border=$w] > ...td</code>;<br/>
- <code>border-color:gray</code> comes from <code>table[border=$w] > ...td</code>
- </p>
- <hr style="display:none"/>
- <p>3c: The border-left of the td element should be 1px hidden gray:</p>
- <p>
- <code>border-width:1px</code> comes from <code>table[border=$w] > ...td</code>;<br/>
- <code>border-style:inset</code> comes from <code>table[border=$w] > ...td</code>;<br/>
- <code>border-color:gray</code> comes from <code>table[border=$w] > ...td</code>
- </p>
- <div><table border="10" rules="groups" frame="box"><tbody><tr><td></td></tr></tbody></table></div>
-
- <hr/>
- <p>4a: The border of the table element should be 1px outset gray:</p>
- <p>
- <code>border-width:10px</code> comes from <code>table[border=$w]</code>;<br/>
- <code>border-style:outset</code> comes from <code>table[border=$w]</code>;<br/>
- <code>border-color:gray</code> comes from <code>table[border=$w]</code>
- </p>
- <hr style="display:none">
- <p>4b: The top border of the td element should be 1px solid gray:</p>
- <p>
- <code>border-width:1px</code> comes from <code>table[rules=all] > ... td</code>;<br/>
- <code>border-style:solid</code> comes from <code>table[rules=all] > ... td</code>;<br/>
- <code>border-color:gray</code> comes from <code>table[rules=all] > ... td</code>
- </p>
- <div><table border="yes" rules="all"><tr><td></td></tr></table></div>
-
- <hr>
- <p>5a: The left border of the table element should be ? hidden ?:</p>
- <p>
- <code>border-style:hidden</code> comes from <code>table[frame=hsides]</code>;<br/>
- </p>
- <hr style="display:none">
- <p>5b: The right border of the table element should be 10px solid gray:</p>
- <p>
- <code>border-width:10px</code> comes from <code>table[border=$w]</code>;<br/>
- <code>border-style:solid</code> comes from <code>[style]</code>;<br/>
- <code>border-color:gray</code> comes from <code>table[border=$w]</code>
- </p>
- <div><table border="10" frame="hsides" style="border-right-style: solid"><tr><td></td></tr></table></div>
-
- <script>void function() { var table; while(table = document.querySelector('.to-remove')) table.parentNode.replaceChild(table.firstChild,table) }();</script>
- <script>void function() { var td; while(td = document.querySelector('table.no-td td')) td.parentNode.replaceChild(document.createElement('x-td'),td) }();</script>
- <script>void function() { var divs = document.querySelectorAll("main > div"); for(var i = divs.length; i--;) { var div = divs[i]; var pre = document.createElement('pre'); pre.title = pre.textContent = div.innerHTML; div.parentNode.insertBefore(pre, div); }; }();</script>
- <hr/>
-
-</main>
-
-<script>
-
- var i = 1;
- generate_tests(assert_equals, [
- /*========================================*/
- [
- "1: HTML -> CSS Mapping for borders is applied correctly on table markup (table left width)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i++)+") table")).borderLeftWidth,
- "0px"
- ],
- [
- "1: HTML -> CSS Mapping for borders is applied correctly on table markup (table left style)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftStyle,
- "hidden"
- ],
- [
- "1: HTML -> CSS Mapping for borders is applied correctly on table markup (table left color)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftColor,
- "rgb(128, 128, 128)"
- ],
- /*========================================*/
- [
- "2: HTML -> CSS Mapping for borders is applied correctly on table markup (table left width)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i++)+") table")).borderLeftWidth,
- "1px"
- ],
- [
- "2: HTML -> CSS Mapping for borders is applied correctly on table markup (table left style)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftStyle,
- "outset"
- ],
- [
- "2: HTML -> CSS Mapping for borders is applied correctly on table markup (table left color)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftColor,
- "rgb(0, 0, 0)"
- ],
- /*========================================*/
- [
- "3a: HTML -> CSS Mapping for borders is applied correctly on table markup (table left width)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i++)+") table")).borderLeftWidth,
- "10px"
- ],
- [
- "3a: HTML -> CSS Mapping for borders is applied correctly on table markup (table left style)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftStyle,
- "outset"
- ],
- [
- "3a: HTML -> CSS Mapping for borders is applied correctly on table markup (table left color)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftColor,
- "rgb(128, 128, 128)"
- ],
- [
- "3b: HTML -> CSS Mapping for borders is applied correctly on table markup (td top width)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderTopWidth,
- "1px"
- ],
- [
- "3b: HTML -> CSS Mapping for borders is applied correctly on table markup (td top style)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderTopStyle,
- "inset"
- ],
- [
- "3b: HTML -> CSS Mapping for borders is applied correctly on table markup (td top color)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderTopColor,
- "rgb(128, 128, 128)"
- ],
- [
- "3c: HTML -> CSS Mapping for borders is applied correctly on table markup (td left width)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftWidth,
- "1px"
- ],
- [
- "3c: HTML -> CSS Mapping for borders is applied correctly on table markup (td left style)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftStyle,
- "inset"
- ],
- [
- "3c: HTML -> CSS Mapping for borders is applied correctly on table markup (td left color)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftColor,
- "rgb(128, 128, 128)"
- ],
- /*========================================*/
- [
- "4: HTML -> CSS Mapping for borders is applied correctly on table markup (table left width)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i++)+") table")).borderLeftWidth,
- "1px"
- ],
- [
- "4: HTML -> CSS Mapping for borders is applied correctly on table markup (table left style)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftStyle,
- "outset"
- ],
- [
- "4: HTML -> CSS Mapping for borders is applied correctly on table markup (table left color)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderLeftColor,
- "rgb(128, 128, 128)"
- ],
- [
- "4: HTML -> CSS Mapping for borders is applied correctly on table markup (td left width)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftWidth,
- "1px"
- ],
- [
- "4: HTML -> CSS Mapping for borders is applied correctly on table markup (td left style)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftStyle,
- "solid"
- ],
- [
- "4: HTML -> CSS Mapping for borders is applied correctly on table markup (td left color)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table td")).borderLeftColor,
- "rgb(128, 128, 128)"
- ],
- /*========================================*/
- [
- "5a: HTML -> CSS Mapping for borders is applied correctly on table markup (table left style)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i++)+") table")).borderLeftStyle,
- "hidden"
- ],
- [
- "5b: HTML -> CSS Mapping for borders is applied correctly on table markup (table right width)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderRightWidth,
- "10px"
- ],
- [
- "5b: HTML -> CSS Mapping for borders is applied correctly on table markup (table right style)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderRightStyle,
- "solid"
- ],
- [
- "5b: HTML -> CSS Mapping for borders is applied correctly on table markup (table right color)",
- getComputedStyle(document.querySelector("main > div:nth-of-type("+(i-1)+") table")).borderRightColor,
- "rgb(128, 128, 128)"
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-1.html
deleted file mode 100644
index 01bc33f3ad2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-1.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#table-layout-algorithm">
-<main>
-
- <h1>HTML5 Table Formatting algorithm (row/column grid computation)</h1>
- <p>Verifies how browser define and act on empty tables</p>
-
- <hr/>
- <p>This should be a 50px by 50px blue square:</p>
- <p>The table grid is 0x0, so the table is empty and follows step 3B of the table layout algorithm</p>
- <x-table style="min-width: 50px; height: 50px; background: blue;"></x-table>
-
- <hr/>
- <p>This should be a 50px by 50px blue square:</p>
- <p>The table grid is 2x0, so the table is empty and follows step 3B of the table layout algorithm</p>
- <x-table style="min-width: 50px; height: 50px; background: blue;">
- <x-col style="width: 100px"></x-col>
- <x-col style="width: 100px"></x-col>
- </x-table>
-
- <hr/>
- <p>This should be a 50px by 50px blue square:</p>
- <p>The table grid is 0x1, so the table is empty and follows step 3B of the table layout algorithm</p>
- <x-table style="min-width: 50px; height: 50px; background: blue;">
- <x-tr style="height: 100px; background: orange;"></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 200px by 100px blue rectangle:</p>
- <p>The table grid is 2x1, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <x-table style="min-width: 50px; height: 50px; background: blue;">
- <x-col style="width: 100px"></x-col>
- <x-col style="width: 100px"></x-col>
- <x-tr style="height: 100px; background: orange;"></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 200px by 100px half-blue half-orange rectangle:</p>
- <p>The table grid is 2x1, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <x-table style="min-width: 50px; height: 50px; background: blue;">
- <x-col style="width: 100px"></x-col>
- <x-col style="width: 100px"></x-col>
- <x-tr style="height: 100px; background: orange;"><x-td></x-td></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 200px by 100px orange rectangle:</p>
- <p>The table grid is 2x1, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <x-table style="min-width: 50px; height: 50px; background: blue;">
- <x-col style="width: 100px"></x-col>
- <x-col style="width: 100px"></x-col>
- <x-tr style="height: 100px; background: orange;"><x-td></x-td><x-td></x-td></x-tr>
- </x-table>
-
-</main>
-
-<script>
-
- generate_tests(assert_equals, [
- [
- "Empty tables can still get a lsyout",
- document.querySelector("x-table:nth-of-type(1)").offsetWidth,
- 50
- ],
- [
- "Empty tables do not take table-columns into account",
- document.querySelector("x-table:nth-of-type(2)").offsetWidth,
- 50
- ],
- [
- "Empty tables do not take table-rows into account",
- document.querySelector("x-table:nth-of-type(3)").offsetHeight,
- 50
- ],
- ])
-
- generate_tests(assert_equals, [
- [
- "Table-columns are taken into account after missing cells are generated (empty line)",
- document.querySelector("x-table:nth-of-type(4)").offsetWidth,
- 200
- ],
- [
- "Table-columns are taken into account after missing cells are generated (partially empty line)",
- document.querySelector("x-table:nth-of-type(5)").offsetWidth,
- 200
- ],
- [
- "Table-columns are taken into account after missing cells are generated (non-empty line)",
- document.querySelector("x-table:nth-of-type(6)").offsetWidth,
- 200
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-2.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-2.html
deleted file mode 100644
index 34173649776..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-2.html
+++ /dev/null
@@ -1,150 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#missing-cells-fixup">
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#dimensioning-the-row-column-grid">
-<main>
-
- <h1>HTML5 Table Formatting algorithm (row/column grid computation)</h1>
- <p>Verifies how browsers deal with explicit tracks from which no cell does originate</p>
-
- <hr/>
- <p>This should be a 100px by 100px blue square:</p>
- <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
- <x-table style="background: blue;">
- <x-col style="width: 50px"></x-col>
- <x-col style="width: 50px"></x-col>
- <x-tr style="height: 50px"></x-tr>
- <x-tr style="height: 50px"></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 175px by 175px blue square:</p>
- <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
- <p>Three 25px border-spacing causes the addition of 75px</p>
- <x-table style="background: blue; border-spacing: 25px">
- <x-col style="width: 50px"></x-col>
- <x-col style="width: 50px"></x-col>
- <x-tr style="height: 50px"></x-tr>
- <x-tr style="height: 50px"></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 175px by 175px blue square:</p>
- <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
- <p>Three 25px border-spacing causes the addition of 75px</p>
- <x-table style="background: blue; border-spacing: 25px">
- <x-col style="width: 50px"></x-col>
- <x-col style="width: 50px"></x-col>
- <x-tr style="height: 50px"><x-td></x-td><x-td></x-td></x-tr>
- <x-tr style="height: 50px"></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 175px by 175px blue square:</p>
- <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
- <p>Three 25px border-spacing causes the addition of 75px</p>
- <x-table style="background: blue; border-spacing: 25px">
- <x-col style="width: 50px"></x-col>
- <x-col style="width: 50px"></x-col>
- <x-tr style="height: 50px"></x-tr>
- <x-tr style="height: 50px"><x-td></x-td><x-td></x-td></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 175px by 175px blue square:</p>
- <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
- <p>Three 25px border-spacing causes the addition of 75px</p>
- <x-table style="background: blue; border-spacing: 25px">
- <x-col style="width: 50px"></x-col>
- <x-col style="width: 50px"></x-col>
- <x-tr style="height: 50px"><x-td></x-td><x-td></x-td></x-tr>
- <x-tr style="height: 50px"><x-td></x-td><x-td></x-td></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 175px by 175px blue square:</p>
- <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <p>The consecutive tracks are not merged together because they are all defined explicitely by a table-column or a table-row</p>
- <p>Three 25px border-spacing causes the addition of 75px</p>
- <x-table style="background: blue; border-spacing: 25px">
- <x-col style="width: 50px"></x-col>
- <x-col style="width: 50px"></x-col>
- <x-tr style="height: 50px"><x-td></x-td></x-tr>
- <x-tr style="height: 50px"><x-td></x-td></x-tr>
- </x-table>
-
-</main>
-
-<script>
-
- generate_tests(assert_equals, [
- [
- "Explicitely defined columns are not merged",
- document.querySelector("x-table:nth-of-type(1)").offsetWidth,
- 100
- ],
- [
- "Explicitely defined rows are not merged",
- document.querySelector("x-table:nth-of-type(1)").offsetHeight,
- 100
- ],
- [
- "Border-spacing is added between any two unmerged columns (1)",
- document.querySelector("x-table:nth-of-type(2)").offsetWidth,
- 175
- ],
- [
- "Border-spacing is added between any two unmerged rows (1)",
- document.querySelector("x-table:nth-of-type(2)").offsetHeight,
- 175
- ],
- [
- "Border-spacing is added between any two unmerged columns (2)",
- document.querySelector("x-table:nth-of-type(3)").offsetWidth,
- 175
- ],
- [
- "Border-spacing is added between any two unmerged rows (2)",
- document.querySelector("x-table:nth-of-type(3)").offsetHeight,
- 175
- ],
- [
- "Border-spacing is added between any two unmerged columns (3)",
- document.querySelector("x-table:nth-of-type(4)").offsetWidth,
- 175
- ],
- [
- "Border-spacing is added between any two unmerged rows (3)",
- document.querySelector("x-table:nth-of-type(4)").offsetHeight,
- 175
- ],
- [
- "Border-spacing is added between any two unmerged columns (4)",
- document.querySelector("x-table:nth-of-type(5)").offsetWidth,
- 175
- ],
- [
- "Border-spacing is added between any two unmerged rows (4)",
- document.querySelector("x-table:nth-of-type(5)").offsetHeight,
- 175
- ],
- [
- "Border-spacing is added between any two unmerged columns (5)",
- document.querySelector("x-table:nth-of-type(6)").offsetWidth,
- 175
- ],
- [
- "Border-spacing is added between any two unmerged rows (5)",
- document.querySelector("x-table:nth-of-type(6)").offsetHeight,
- 175
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-3.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-3.html
deleted file mode 100644
index 0b6cdd8760e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-3.html
+++ /dev/null
@@ -1,106 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#missing-cells-fixup">
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#dimensioning-the-row-column-grid">
-<main>
-
- <h1>HTML5 Table Formatting algorithm (row/column grid computation)</h1>
- <p>Verifies how browsers deal with implicit tracks from which no cell does originate</p>
-
- <hr/>
- <p>This should be a 100px by 100px blue square:</p>
- <p>The table grid is 1x1, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <p>The consecutive tracks were merged together because they are not all defined explicitely by a table-column or a table-row, and share the same set of cells</p>
- <p>Two 25px border-spacing causes the addition of 50px (track is 50x50)</p>
- <x-table style="background: blue; border-spacing: 25px">
- <x-tr><x-td style="padding: 25px"></x-td></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 100px by 100px blue square:</p>
- <p>The table grid is 1x1, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <p>The consecutive tracks were merged together because they are not all defined explicitely by a table-column or a table-row, and share the same set of cells</p>
- <p>Two 25px border-spacing causes the addition of 50px (track is 50x50)</p>
- <x-table style="background: blue; border-spacing: 25px">
- <x-tr><x-td style="padding: 25px" rowspan=2 colspan=2></x-td></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 75px by 75px blue square:</p>
- <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <p>The consecutive tracks were not merged together because they are all defined explicitely by a table-column or a table-row</p>
- <p>Three 25px border-spacing causes the addition of 75px (tracks are 0x0)</p>
- <x-table style="background: blue; border-spacing: 25px">
- <x-col></x-col>
- <x-col></x-col>
- <x-tr><x-td style="padding: 0px" rowspan=2 colspan=2></x-td></x-tr>
- <x-tr></x-tr>
- </x-table>
-
- <hr/>
- <p>This should be a 100px by 100px blue square:</p>
- <p>The table grid is 2x2, so the table is not empty and follows step 3A of the table layout algorithm (which adds anonymous cell boxes)</p>
- <p>The consecutive tracks were not merged together because they are all defined explicitely by a table-column or a table-row</p>
- <p>Three 25px border-spacing causes the addition of 75px (tracks are 12.5x12.5)</p>
- <x-table style="background: blue; border-spacing: 25px">
- <x-col></x-col>
- <x-col></x-col>
- <x-tr><x-td style="padding: 25px" rowspan=2 colspan=2></x-td></x-tr>
- <x-tr></x-tr>
- </x-table>
-
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- generate_tests(assert_equals, [
- [
- "Control test for table-cell padding and border-spacing, etc (width)",
- document.querySelector("x-table:nth-of-type(1)").offsetWidth,
- 100
- ],
- [
- "Control test for table-cell padding and border-spacing (height)",
- document.querySelector("x-table:nth-of-type(1)").offsetHeight,
- 100
- ],
- [
- "Anonymous consecutive columns spanned by the same set of cells are merged",
- document.querySelector("x-table:nth-of-type(2)").offsetWidth,
- 100
- ],
- [
- "Anonymous consecutive rows spanned by the same set of cells are merged",
- document.querySelector("x-table:nth-of-type(2)").offsetHeight,
- 100
- ],
- [
- "Explicitely-defined consecutive columns spanned by the same set of cells are not merged",
- document.querySelector("x-table:nth-of-type(3)").offsetWidth,
- 75
- ],
- [
- "Explicitely-defined consecutive rows spanned by the same set of cells are not merged",
- document.querySelector("x-table:nth-of-type(3)").offsetHeight,
- 75
- ],
- [
- "Explicitely-defined consecutive columns spanned by the same set of cells are not merged, and cells span across border-spacing",
- document.querySelector("x-table:nth-of-type(4) x-col").getBoundingClientRect().width,
- 12.5
- ],
- [
- "Explicitely-defined consecutive rows spanned by the same set of cells are not merged, and cells span across border-spacing",
- document.querySelector("x-table:nth-of-type(4) x-tr").getBoundingClientRect().height,
- 12.5
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-fixed-layout-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-fixed-layout-1.html
deleted file mode 100644
index 0e6373505f9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/html5-table-formatting-fixed-layout-1.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#dimensioning-the-row-column-grid">
-<main>
-
- <h1>HTML5 Table Formatting algorithm and Fixed Layout (row/column grid computation)</h1>
- <p>Verifies how browsers deal with implicit tracks from which no cell does originate in fixed mode</p>
-
- <hr/>
- <p>This should be a 100px by 50px blue rectangle:</p>
- <p>The table grid is 1x3, so the table is not empty and follows step 3A of the table layout algorithm</p>
- <p>The consecutive columns were merged not together because the table-layout is fixed, but consecutive rows were.</p>
- <p>Each track has a 0px breadth; the table width (respect. height) comes from 4x (respect. 2x) 25px-wide border spacings</p>
- <x-table style="table-layout: fixed; width: 0; background: blue; border-spacing: 25px">
- <x-tr><x-td width="0" height="0" colspan="3" rowspan="3" style="padding: 0"></x-td></x-tr>
- </x-table>
-
- <hr/>
-
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- generate_tests(assert_equals, [
- [
- "Redundant columns of fixed-layout tables are not being merged",
- document.querySelector("x-table:nth-of-type(1)").offsetWidth,
- 100
- ],
- [
- "Redundant rows of fixed-layout tables are not being merged",
- document.querySelector("x-table:nth-of-type(1)").offsetHeight,
- 50
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/markup-generator.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/markup-generator.html
deleted file mode 100644
index 3509712cb36..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/markup-generator.html
+++ /dev/null
@@ -1,200 +0,0 @@
-<!doctype html>
-<link rel="stylesheet" href="base.css" />
-<aside style="position:absolute"><!-- THIS IS WHERE WE RUN THE EXPERIMENTS --></aside>
-<main><textarea style="display: none; width: 100%"></textarea><script>
-
- var textarea = document.querySelector('textarea');
- var testingBorderAttributes = true;
- var seed = 0;
-
- // This is not meant to be a good random number generator; I literally don't care
- function XorshiftMath(seed) {
- var x = 1;
- var y = 2;
- var z = 3;
- var w = seed|0;
- this.random = function random() {
- var t = x;
- t ^= t << 11;
- t ^= t >> 8;
- x = y; y = z; z = w;
- w ^= w >> 19;
- w ^= t;
- return (w%1024)/1024;
- }
- }
-
- var rndGen = new XorshiftMath(seed);
- function rnd(x) {
- return x > rndGen.random();
- }
- function pickInList(list) {
- var i = list.length; while(i>1 && rnd(1/i)) { i--; }
- return list[i-1];
- }
-
- function generateMarkup(root) {
- if(rnd(0.99)) {
-
- //
- // the table has a <table> element
- //
- var table = document.createElement('table');
-
- //
- if(testingBorderAttributes) {
- if(rnd(0.3)) { table.setAttribute('border',pickInList(['0','10','yes'])); }
- if(rnd(0.3)) { table.setAttribute('frame',pickInList(['box','vsides','none'])); }
- if(rnd(0.3)) { table.setAttribute('rules',pickInList(['all','rows','groups'])); }
- table.setAttribute("cellspacing","0");
- }
-
-
- generateRowGroups(table);
- root.appendChild(table);
-
- } else {
-
- //
- // the table has no <table> element
- //
-
- generateRowGroup(root);
-
- }
- }
-
- function generateRowGroups(root) {
- if(rnd(0.5)) {
-
- generateRowGroup(root);
- while(rnd(0.25)) {
- generateRowGroup(root);
- }
-
- } else {
-
- generateRows(root);
-
- }
- }
-
- function generateRowGroup(root) {
-
- var tbody; if(rnd(0.7)) {
- tbody = document.createElement('tbody');
- } else if (rnd(0.5)) {
- tbody = document.createElement('thead');
- } else {
- tbody = document.createElement('tfoot');
- }
-
- generateRows(tbody);
- root.appendChild(tbody);
-
- }
-
- function generateRows(root) {
-
- while(rnd(0.9)) {
- if(rnd(0.9)) {
- generateRow(root);
- } else {
- generateCells(root);
- }
- }
-
- }
-
- function generateRow(root) {
-
- var tr = document.createElement('tr');
- generateCells(tr);
- root.appendChild(tr);
-
- }
-
- function generateCells(root) {
-
- while(rnd(0.9)) {
- if(rnd(0.9)) {
- generateCell(root);
- } else {
- generateCellContent(root);
- }
- }
-
- }
-
- function generateCell(root) {
-
- var td = document.createElement( rnd(0.9) ? 'td' : 'th' );
- generateCellContent(td);
- root.appendChild(td);
-
- }
-
- function generateCellContent() {
- // for now, do nothing
- }
-
- for(var i = 10; i--;) {
- //document.write("<textarea style='width: 100%; display: none'>");
- var div = document.createElement('div');
- generateMarkup(div);
- appendReportFor(div);
- //document.write(div.innerHTML);
- //document.write("</textarea>");
- }
-
- if(navigator.userAgent.indexOf("Edge") == -1) {
- var downloadLink = document.createElement('a');
- downloadLink.setAttribute("download","report.txt");
- downloadLink.href = "data:," + escape(textarea.value);
- downloadLink.textContent = "download";
- document.body.appendChild(downloadLink);
- }
-
- function appendReportFor(markup) {
- var report = markup.innerHTML + '\r\n\r\n';
-
- //
- // append markup to the dom
- //
- var root = document.querySelector('aside');
- root.innerHTML = '';
- root.appendChild(markup);
-
- //
- // output box stats
- //
- var boxes = markup.getElementsByTagName("*");
- for(var i = 0; i<boxes.length; i++) {
-
- var box = boxes[i];
- report += '' + i + ': ' + box.tagName + '\r\n';
- report += 'offsetWidth: ' + box.offsetWidth + '\r\n';
- report += 'offsetHeight: ' + box.offsetHeight + '\r\n';
- report += 'offsetLeft: ' + box.offsetLeft + '\r\n';
- report += 'offsetTop: ' + box.offsetTop + '\r\n';
- report += 'borderTopWidth: ' + getComputedStyle(box).borderTopWidth + '\r\n';
- report += 'borderTopStyle: ' + getComputedStyle(box).borderTopStyle + '\r\n';
- report += 'borderTopColor: ' + getComputedStyle(box).borderTopColor + '\r\n';
- report += 'borderLeftWidth: ' + getComputedStyle(box).borderLeftWidth + '\r\n';
- report += 'borderLeftStyle: ' + getComputedStyle(box).borderLeftStyle + '\r\n';
- report += 'borderLeftColor: ' + getComputedStyle(box).borderLeftColor + '\r\n';
- report += '\r\n';
-
- }
-
- report += '\r\n';
- report += '=====================================================================\r\n';
- report += '\r\n';
-
- textarea.value += report;
-
- root.innerHTML = '';
-
- }
-
-</script></main>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/table-model-fixup-2.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/table-model-fixup-2.html
deleted file mode 100644
index 81770d517c4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/table-model-fixup-2.html
+++ /dev/null
@@ -1,464 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#table-structure">
-<style>
- [inline] { display: inline !important; }
- [block] { display: block !important; }
- [inline-table] { display: inline-table !important; }
- [table] { display: table !important; }
- [table-row] { display: table-row !important; }
- [table-cell] { display: table-cell !important; }
- [table-column] { display: table-column !important; }
- [table-row-group] { display: table-row-group !important; }
- [table-header-group] { display: table-header-group !important; }
- [table-footer-group] { display: table-footer-group !important; }
- [table-column-group] { display: table-column-group !important; }
- div > x-table { background: yellow; border-spacing: 10px }
- div input { width: 100px; }
-</style>
-<script>
- function assertEqualOffsetWidths(a,b) {
- var desc = document.querySelector('main > hr:last-of-type + p + p') || document.querySelectorAll('main > hr + p + p')[document.querySelectorAll('main > hr + p + p').length-1];
- var root = document.querySelector('main > div:last-of-type') || document.querySelectorAll('main > div')[document.querySelectorAll('main > div').length-1];
- generate_tests(assert_equals, [
- [
- desc.textContent,
- root.querySelector("[target="+a+"]").offsetWidth,
- root.querySelector("[target="+b+"]").offsetWidth
- ]
- ]);
- }
- function assertEqualOffsetTops(a,b) {
- var desc = document.querySelector('main > hr:last-of-type + p + p') || document.querySelectorAll('main > hr + p + p')[document.querySelectorAll('main > hr + p + p').length-1];
- var root = document.querySelector('main > div:last-of-type') || document.querySelectorAll('main > div')[document.querySelectorAll('main > div').length-1];
- generate_tests(assert_equals, [
- [
- desc.textContent,
- root.querySelector("[target="+a+"]").getBoundingClientRect().top|0,
- root.querySelector("[target="+b+"]").getBoundingClientRect().top|0
- ]
- ]);
- }
- function assertUnequalOffsetTops(a,b) {
- var desc = document.querySelector('main > hr:last-of-type + p + p') || document.querySelectorAll('main > hr + p + p')[document.querySelectorAll('main > hr + p + p').length-1];
- var root = document.querySelector('main > div:last-of-type') || document.querySelectorAll('main > div')[document.querySelectorAll('main > div').length-1];
- generate_tests(assert_not_equals, [
- [
- desc.textContent,
- root.querySelector("[target="+a+"]").getBoundingClientRect().top|0,
- root.querySelector("[target="+b+"]").getBoundingClientRect().top|0
- ]
- ]);
- }
-</script>
-
-<main>
-
- <h1>Table fixup</h1>
- <p>Check that replaced elements display types are handled properly in fixup</p>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both input fields should look identical, on their own line:</p>
- <p>Replaced elements inside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- input elements</p>
- <div>
- <x-table style="width: 400px">
- <x-tr><x-td><input block target=a /></x-tr>
- <input table-row target=b />
- </x-table>
- </div>
- <script>
-
- assertEqualOffsetWidths('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both images should look identical, on their own line:</p>
- <p>Replaced elements inside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- img elements</p>
- <div>
- <x-table style="width: 400px">
- <x-tr><x-td><img block src="http://w3.org/favicon.ico" target=a /></x-tr>
- <img src="http://w3.org/favicon.ico" table-row target=b />
- </x-table>
- </div>
- <script>
-
- assertEqualOffsetWidths('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both input fields should look identical, on their own line:</p>
- <p>Replaced elements inside a table cannot be <mark>table-column</mark> and are considered <mark>inline</mark> -- input elements</p>
- <div>
- <x-table style="width: 400px">
- <x-tr><x-td><input inline target=a /></x-tr>
- <input table-column target=b />
- </x-table>
- </div>
- <script>
-
- assertEqualOffsetWidths('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both images should look identical, on their own line:</p>
- <p>Replaced elements inside a table cannot be <mark>table-column</mark> and are considered <mark>inline</mark> -- img elements</p>
- <div>
- <x-table style="width: 400px">
- <x-tr><x-td><img inline src="http://w3.org/favicon.ico" target=a /></x-tr>
- <img src="http://w3.org/favicon.ico" table-column target=b />
- </x-table>
- </div>
- <script>
-
- assertEqualOffsetWidths('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both input fields should look identical, on their own line:</p>
- <p>Replaced elements inside a table cannot be <mark>table-cell</mark> and are considered <mark>inline</mark> -- input elements</p>
- <div>
- <x-table style="width: 400px">
- <x-tr><x-td><input inline target=a /></x-tr>
- <x-tr><input table-cell target=b /></x-tr>
- </x-table>
- </div>
- <script>
-
- assertEqualOffsetWidths('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both images should look identical, on their own line:</p>
- <p>Replaced elements inside a table cannot be <mark>table-cell</mark> and are considered <mark>inline</mark> -- img elements</p>
- <div>
- <x-table style="width: 400px">
- <x-tr><x-td><img inline src="http://w3.org/favicon.ico" target=a /></x-tr>
- <x-tr><img src="http://w3.org/favicon.ico" table-cell target=b /></x-tr>
- </x-table>
- </div>
- <script>
-
- assertEqualOffsetWidths('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both text inputs should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>inline-table</mark> and are <mark>considered</mark> inline -- input=text elements</p>
- <div>
- <input inline-table target=a />
- <input inline-table target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both button inputs should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>inline-table</mark> and are considered <mark>inline</mark> -- input=button elements</p>
- <div>
- <input type=button inline-table target=a />
- <input type=button inline-table target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both file inputs should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>inline-table</mark> and are considered <mark>inline</mark> -- input=file elements</p>
- <div>
- <input type=file inline-table target=a />
- <input type=file inline-table target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both images should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>inline-table</mark> and are considered <mark>inline</mark> -- img elements</p>
- <div>
- <img src="http://w3.org/favicon.ico" inline-table target=a />
- <img src="http://w3.org/favicon.ico" inline-table target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both text inputs should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table</mark> and are considered <mark>block</mark> -- input=text elements</p>
- <div>
- <input type=text table target=a />
- <input type=text table target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both button inputs should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table</mark> and are considered <mark>block</mark> -- input=button elements</p>
- <div>
- <input type=button table target=a />
- <input type=button table target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both file inputs should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table</mark> and are considered <mark>block</mark> -- input=file elements</p>
- <div>
- <input type=file table target=a />
- <input type=file table target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both images should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table</mark> and are considered <mark>block</mark> -- img elements</p>
- <div>
- <img src="http://w3.org/favicon.ico" table target=a />
- <img src="http://w3.org/favicon.ico" table target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both text inputs should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- input=text elements</p>
- <div>
- <input type=text table-row target=a />
- <input type=text table-row target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both button inputs should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- input=button elements</p>
- <div>
- <input type=button table-row target=a />
- <input type=button table-row target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both file inputs should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- input=file elements</p>
- <div>
- <input type=file table-row target=a />
- <input type=file table-row target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both images should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-row</mark> and are considered <mark>block</mark> -- img elements</p>
- <div>
- <img src="http://w3.org/favicon.ico" table-row target=a />
- <img src="http://w3.org/favicon.ico" table-row target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both text inputs should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-row-group</mark> and are considered <mark>block</mark> -- input=text elements</p>
- <div>
- <input type=text table-row-group target=a />
- <input type=text table-row-group target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both button inputs should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-row-group</mark> and are considered <mark>block</mark> -- input=button elements</p>
- <div>
- <input type=button table-row-group target=a />
- <input type=button table-row-group target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both file inputs should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-row-group</mark> and are considered <mark>block</mark> -- input=file elements</p>
- <div>
- <input type=file table-row-group target=a />
- <input type=file table-row-group target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both images should stand on their own line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-row-group</mark> and are considered <mark>block</mark> -- img elements</p>
- <div>
- <img src="http://w3.org/favicon.ico" table-row-group target=a />
- <img src="http://w3.org/favicon.ico" table-row-group target=b />
- </div>
- <script>
-
- assertUnequalOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both text inputs should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-column</mark> and are <mark>considered</mark> inline -- input=text elements</p>
- <div>
- <input table-column target=a />
- <input table-column target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both button inputs should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-column</mark> and are considered <mark>inline</mark> -- input=button elements</p>
- <div>
- <input type=button table-column target=a />
- <input type=button table-column target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both file inputs should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-column</mark> and are considered <mark>inline</mark> -- input=file elements</p>
- <div>
- <input type=file table-column target=a />
- <input type=file table-column target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both images should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-column</mark> and are considered <mark>inline</mark> -- img elements</p>
- <div>
- <img src="http://w3.org/favicon.ico" table-column target=a />
- <img src="http://w3.org/favicon.ico" table-column target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both text inputs should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-cell</mark> and are <mark>considered</mark> inline -- input=text elements</p>
- <div>
- <input table-cell target=a />
- <input table-cell target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both button inputs should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-cell</mark> and are considered <mark>inline</mark> -- input=button elements</p>
- <div>
- <input type=button table-cell target=a />
- <input type=button table-cell target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both file inputs should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-cell</mark> and are considered <mark>inline</mark> -- input=file elements</p>
- <div>
- <input type=file table-cell target=a />
- <input type=file table-cell target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
- <hr/><!------------------------------------------------------------------------------------------------------------>
- <p>Both images should share the same line:</p>
- <p>Replaced elements outside a table cannot be <mark>table-cell</mark> and are considered <mark>inline</mark> -- img elements</p>
- <div>
- <img src="http://w3.org/favicon.ico" table-cell target=a />
- <img src="http://w3.org/favicon.ico" table-cell target=b />
- </div>
- <script>
-
- assertEqualOffsetTops('a','b');
-
- </script>
-
-</main>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/table-model-fixup.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/table-model-fixup.html
deleted file mode 100644
index cb73f0b89d7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/table-model-fixup.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='./base.css' />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#fixup">
-<main>
-
- <h1>Table fixup</h1>
- <p>Check that missing elements are being created properly</p>
-
- <hr/>
- <p>This should be a 100px by 100px blue square:</p>
- <p>1.1. Children of a table-column are treated as if they had display: none.</p>
- <div style="width: 100px; height: 100px; background: blue;"><x-col><div id="target1" style="display: block!important; visibility: visible!important; width: 100px; height: 100px; background: red;"></div></x-col></div>
-
- <hr/>
- <p>This should be a 100px by 100px blue square:</p>
- <p>1.2. Children of a table-column-group which are not a table-column are treated as if they had display: none.</p>
- <div style="width: 100px; height: 100px; background: blue;"><x-colgroup><div id="target2" style="display: block!important; visibility: visible!important; width: 100px; height: 100px; background: red;"></div></x-colgroup></div>
-
- <hr/>
- <p>This should be a 100px by 100px blue square:</p>
- <p>2.1. An anonymous table-row box must be generated around each sequence of consecutive children of a table-root box which are not proper table child boxes. </p>
- <x-table><x-td id="target3" style="width: 50%; height: 0px; background: blue;"></x-td> <x-td style="width: 50px; height: 100px; background: blue;"></x-td></x-table>
-
- <hr/>
- <p>This should read as "1\t2\t3\n&nbsp;&nbsp;&nbsp;x":</p>
- <p>2.2. An anonymous table-row box must be generated around each sequence of consecutive children of a table-row-grouping box which are not table-row boxes.</p>
- <x-table><x-tbody>
- <span id="target4a">1</span>
- <x-col style="width: 100px"></x-col>
- <x-td id="target4b">2</x-td>
- <span id="target4c">3</span>
- <x-caption id="target4d">x</x-caption>
- </x-tbody><x-col style="width: 50px"></x-col><x-col style="width: 50px"></x-col><x-col style="width: 50px"></x-col></x-table>
-
- <hr/>
- <p>This should read as "1\n1\t2":</p>
- <p>2.1. and 2.2. happens before 2.3.</p>
- <x-table>
- <span id="target5a">1</span>
- <x-col style="width: 50px"></x-col>
- <x-td id="target5b">1</x-td>
- <span id="target5c">2</span>
- </x-table>
-
- <hr/>
- <p>This should read as "1\t2":</p>
- <p>3.2. An anonymous table or inline-table box must be generated around each sequence of consecutive proper table child box which are misparented</p>
- <table><tr><td id="target6a">1</td><td style="display: table-caption" id="target6b">2</td></tr><col style="width: 50px"></x-col></table>
-
- <hr/>
- <p>This should read as "A B":</p>
- <p>1.4. Anonymous inline boxes which contains only white space and are between two immediate siblings *each* of which is a table-non-root element, are treated as if they had display: none.</p>
- <x-table><x-tr> <span id="target7a">A</span> <span id="target7b">B</span> </x-tr></x-table>
-
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- "1.1. Children of a table-column are treated as if they had display: none.",
- document.querySelector("div[style*='red']#target"+(i++)+"").offsetWidth,
- 0
- ],
- [
- "1.2. Children of a table-column-group which are not a table-column are treated as if they had display: none.",
- document.querySelector("div[style*='red']#target"+(i++)+"").offsetWidth,
- 0
- ],
- [
- "2.1. An anonymous table-row box must be generated around each sequence of consecutive children of a table-root box which are not proper table child boxes. (1/2)",
- document.querySelector("#target"+(i++)+"").offsetWidth,
- 50
- ],
- [
- "2.1. An anonymous table-row box must be generated around each sequence of consecutive children of a table-root box which are not proper table child boxes. (2/2)",
- document.querySelector("#target"+(i-1)+"").offsetHeight,
- 100
- ],
- [
- "2.2. An anonymous table-row box must be generated around each sequence of consecutive children of a table-row-grouping box which are not table-row boxes. (1/3)",
- document.querySelector("#target"+(i++)+"b").offsetLeft - document.querySelector("#target"+(i-1)+"a").offsetLeft,
- 50
- ],
- [
- "2.2. An anonymous table-row box must be generated around each sequence of consecutive children of a table-row-grouping box which are not table-row boxes. (2/3)",
- document.querySelector("#target"+(i-1)+"c").offsetLeft - document.querySelector("#target"+(i-1)+"a").offsetLeft,
- 100
- ],
- [
- "2.2. An anonymous table-row box must be generated around each sequence of consecutive children of a table-row-grouping box which are not table-row boxes. (3/3)",
- document.querySelector("#target"+(i-1)+"d").offsetLeft,
- document.querySelector("#target"+(i-1)+"c").offsetLeft
- ],
- [
- "2.3 happens after 2.1. and 2.2. (1/2)",
- document.querySelector("#target"+(i++)+"b").offsetLeft < 25,
- true
- ],
- [
- "2.3 happens after 2.1. and 2.2. (2/2)",
- document.querySelector("#target"+(i-1)+"c").offsetLeft > 50,
- true
- ],
- [
- "3.2. An anonymous table or inline-table box must be generated around each sequence of consecutive proper table child box which are misparented",
- document.querySelector("#target"+(i++)+"b").offsetLeft > document.querySelector("#target"+(i-1)+"a").offsetLeft,
- true
- ],
- [
- "1.4. Anonymous inline boxes which contains only white space and are between two immediate siblings *each* of which is a table-non-root element, are treated as if they had display: none.",
- document.querySelector("#target"+(i++)+"b").offsetLeft > 1 + document.querySelector("#target"+(i-1)+"a").offsetLeft + document.querySelector("#target"+(i-1)+"a").offsetWidth,
- true
- ],
- ])
-
-</script>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/visibility-collapse-col-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/visibility-collapse-col-001.html
deleted file mode 100644
index 120ac1392a7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/visibility-collapse-col-001.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<!doctype html>
-<meta charset="utf-8">
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='base.css' />
-<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">
-<style>
- x-table {
- border: 5px solid black;
- }
- x-table span {
- display: inline-block;
- vertical-align: top;
- background: lime;
- margin: 3px;
- height: 100px;
- width: 100px;
- }
-</style>
-<main>
- <h1>Visibility collapse</h1>
- <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec</a>
- <p>
- Setting a column to visibility:collapse changes table width but not height.
- </p>
- <x-table id="one">
- <x-tbody>
- <x-tr>
- <x-td>
- <span>row 1</span>
- </x-td>
- <x-td>
- <span></span>
- </x-td>
- </x-tr>
- <x-tr>
- <x-td>
- <span>row 2</span>
- </x-td>
- <x-td>
- <span></span>
- </x-td>
- </x-tr>
- <x-tr>
- <x-td>
- <span>row 3</span>
- </x-td>
- <x-td>
- <span style="height:50px"></span>
- </x-td>
- </x-tr>
- </x-tbody>
- </x-table>
- Bottom table is identical to top except left column has been collapsed.
- <x-table id="two">
- <x-colgroup style="visibility:collapse;"></x-colgroup>
- <x-tbody>
- <x-tr>
- <x-td>
- <span>row 1</span>
- </x-td>
- <x-td>
- <span></span>
- </x-td>
- </x-tr>
- <x-tr>
- <x-td>
- <span>row 2</span>
- </x-td>
- <x-td>
- <span></span>
- </x-td>
- </x-tr>
- <x-tr>
- <x-td>
- <span>row 3</span>
- </x-td>
- <x-td>
- <span style="height:50px"></span>
- </x-td>
- </x-tr>
- </x-tbody>
- </x-table>
-</main>
-
-<script>
- generate_tests(assert_equals, [
- [
- "col visibility:collapse doesn't change table height",
- document.getElementById('two').offsetHeight,
- document.getElementById('one').offsetHeight
- ],
- [
- "col visibility:collapse changes table width",
- document.getElementById('two').offsetWidth,
- 116
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/visibility-collapse-row-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/visibility-collapse-row-001.html
deleted file mode 100644
index e70fbd66dfb..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/visibility-collapse-row-001.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!doctype html>
-<meta charset="utf-8">
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='base.css' />
-<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">
-<style>
- x-table {
- border: 5px solid black;
- }
- x-table span {
- display: inline-block;
- vertical-align: top;
- background: lime;
- margin: 3px;
- height: 100px;
- width: 100px;
- }
-</style>
-<main>
- <h1>Visibility collapse</h1>
- <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-height">Spec</a>
- <p>
- Setting a row to visibility:collapse changes table height but not width.
- </p>
- <x-table id="one">
- <x-tr>
- <x-td>
- <span>row 1</span>
- </x-td>
- <x-td>
- <span></span><span></span>
- </x-td>
- </x-tr>
- <x-tr>
- <x-td>
- <span>row 2</span>
- </x-td>
- <x-td>
- <span></span>
- </x-td>
- </x-tr>
- </x-table>
- Bottom table is identical to top except row 1 has been collapsed.
- <x-table id="two">
- <x-tr style="visibility:collapse">
- <x-td>
- <span>row 1</span>
- </x-td>
- <x-td>
- <span></span><span></span>
- </x-td>
- </x-tr>
- <x-tr>
- <x-td>
- <span>row 2</span>
- </x-td>
- <x-td>
- <span></span>
- </x-td>
- </x-tr>
- </x-table>
-</main>
-
-<script>
- generate_tests(assert_equals, [
- [
- "row visibility:collapse doesn't change table width, unlike display:none",
- document.getElementById('two').offsetWidth,
- document.getElementById('one').offsetWidth
- ],
- [
- "row visibility:collapse changes table height, unlike visibility:hidden",
- document.getElementById('two').offsetHeight,
- 116
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-0.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-0.html
deleted file mode 100644
index 59ce520347e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-0.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-column-measures" />
-<main>
- <h1>Width Distribution</h1>
- <h4>"Computing column measures"</h4>
- <p>This is testing that the table root's minimum is max(table-root width, capmin, gridmin) <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec Text</a></p>
-
- <hr/>
- <table id="one" cellspacing="0" cellpadding="0">
- <colgroup style="width: 1px;">
- <col style="width: 10px;"></col>
- </colgroup>
- <tr>
- <td style="width: 1px;"></td>
- </tr>
- </table>
-
- <table id="two" cellspacing="0" cellpadding="0">
- <colgroup style="width: 10px;">
- <col style="width: 1px;"></col>
- </colgroup>
- <tr>
- <td style="width: 1px;"></td>
- </tr>
- </table>
-
- <table id="three" cellspacing="0" cellpadding="0">
- <colgroup style="width: 1px;">
- <col style="width: 1px;"></col>
- </colgroup>
- <tr>
- <td style="width: 10px;"></td>
- </tr>
- </table>
-
- <table id="four" cellspacing="0" cellpadding="0">
- <colgroup style="width: 10px;">
- <col></col>
- </colgroup>
- <tr>
- <td style="width: 1px;"></td>
- </tr>
- </table>
-</main>
-
-<script>
- var i = 1;
- generate_tests(assert_equals, [
- [
- "Checking intermediate min-content width for span 1 (1)",
- document.getElementById('one').offsetWidth,
- 10
- ],
- [
- "Checking intermediate min-content width for span 1 (2)",
- document.getElementById('two').offsetWidth,
- 1
- ],
- [
- "Checking intermediate min-content width for span 1 (3)",
- document.getElementById('three').offsetWidth,
- 10
- ],
- [
- "Checking intermediate min-content width for span 1 (4)",
- document.getElementById('four').offsetWidth,
- 10
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-1.html
deleted file mode 100644
index 0ade748bba7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-column-measure-1.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-column-measures" />
-<main>
- <h1>Height Distribution</h1>
- <h4>"Computing row measures"</h4>
- <p>This is testing intermediate min-content height for span 2</p>
-
- <hr/>
- <table cellspacing="0" cellpadding="0">
- <tbody style="height: auto">
- <tr style="height: 10px">
- <td id="one" style="height: 1px"></td>
- <td rowspan="2" style="height: 51px"></td>
- </tr>
- <tr style="height: 20px">
- <td style="height: 2px"></td>
- </tr>
- </tbody>
- </table>
-
- <table cellspacing="0" cellpadding="0">
- <tbody style="height: auto">
- <tr style="height: 10px">
- <td id="two" style="height: 1px"></td>
- <td rowspan="2" style="height: 51px"></td>
- </tr>
- <tr style="height: auto">
- <td style="height: auto"></td>
- </tr>
- </tbody>
- </table>
-
- <table cellspacing="0" cellpadding="0">
- <tbody style="height: 51px">
- <tr style="height: 10px">
- <td id="three" style="height: 1px"></td>
- <td rowspan="2" style="height: 51px"></td>
- </tr>
- <tr style="height: 20px">
- <td style="height: 2px"></td>
- </tr>
- </tbody>
- </table>
-
- <table cellspacing="0" cellpadding="0">
- <tbody style="height: 51px">
- <tr style="height: 10px">
- <td id="four" style="height: 1px"></td>
- </tr>
- <tr style="height: 20px">
- <td style="height: 2px"></td>
- </tr>
- </tbody>
- </table>
-
-</main>
-
-<style>
- table { margin-bottom: 10px; width: 50px; }
- td { outline: 1px solid red; outline-offset: -1px; }
-</style>
-<script>
- var i = 1;
- generate_tests(assert_equals, [
- [
- "Checking intermediate min-content height for span 2 (1)",
- document.getElementById('one').offsetHeight,
- 17
- ],
- [
- "Checking intermediate min-content height for span 2 (2)",
- document.getElementById('two').offsetHeight,
- 10
- ],
- [
- "Checking intermediate min-content height for span 2 (3)",
- document.getElementById('three').offsetHeight,
- 17
- ],
- [
- "Checking intermediate min-content height for span 2 (4)",
- document.getElementById('four').offsetHeight,
- 17
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-0.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-0.html
deleted file mode 100644
index 9dc0271ec95..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-0.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width" />
-<main>
- <h1>Width Distribution</h1>
- <h4>"Computing the table width"</h4>
- <p>This is testing that the table root's minimum is max(table-root width, capmin, gridmin) <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec Text</a></p>
-
- <hr/>
- <x-table id="one" style="width: 50px; height: 100px; border: 2px solid black;">
- <x-caption><span style="display: inline-block; height: 100px; width: 100px; background: blue;"></x-caption>
- <x-tr>
- <x-td></x-td>
- </x-tr>
- </x-table>
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- // TEST ONE
- "Width is 100px due to 100px content size of caption",
- document.getElementById('one').offsetWidth,
- 100
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-1.html
deleted file mode 100644
index 3219807ab7f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/computing-table-width-1.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width" />
-
-<style>
- x-table span {
- display: inline-block;
- background: green;
- height: 100px;
- }
-</style>
-<main>
- <h1>Width Distribution</h1>
- <h4>"Computing the table width"</h4>
- <p>This is testing that the table root's width when the TABLEROOT width is auto <a href="https://drafts.csswg.org/css-tables-3/#computing-the-table-width">Spec Text</a></p>
- <x-table id="one">
- <x-caption>
- <span style="width: 100px; background: blue;"></span>
- </x-caption>
- <x-tr>
- <x-td>
- <span style="width: 100px;"></span>
- </x-td>
- <x-td>
- <span style="width: 200px"></span>
- </x-td>
- </x-tr>
- </x-table>
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- 'The box should be 300px since that is the size of the content',
- document.getElementById('one').offsetWidth,
- 300
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-1.html
deleted file mode 100644
index 13779eed94f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-1.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
-
-<style>
- x-table span {
- display: inline-block;
- background: green;
- height: 100px;
- }
-</style>
-<main>
- <h1>Width Distribution</h1>
- <h4>"Distribution Algorithm"</h4>
- <p>Tests the first step that all cells get their min content guess which is that
- of their min content
- <a href="https://drafts.csswg.org/css-tables-3/#width-distribution">Spec Text</a>
- </p>
- <x-table id="one">
- <x-tr>
- <x-td id="two">
- <span style="width: 100px;"></span>
- </x-td>
- <x-td id="three">
- <span style="width: 200px"></span>
- </x-td>
- </x-tr>
- </x-table>
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- 'The box should be 300px since that is the size of the content',
- document.getElementById('one').offsetWidth,
- 300
- ],
- [
- 'The first cell is 100px wide due to its content\'s size',
- document.getElementById('two').offsetWidth,
- 100
- ],
- [
- 'The first cell is 200px wide due to its content\'s size',
- document.getElementById('three').offsetWidth,
- 200
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-2.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-2.html
deleted file mode 100644
index 13779eed94f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-2.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
-
-<style>
- x-table span {
- display: inline-block;
- background: green;
- height: 100px;
- }
-</style>
-<main>
- <h1>Width Distribution</h1>
- <h4>"Distribution Algorithm"</h4>
- <p>Tests the first step that all cells get their min content guess which is that
- of their min content
- <a href="https://drafts.csswg.org/css-tables-3/#width-distribution">Spec Text</a>
- </p>
- <x-table id="one">
- <x-tr>
- <x-td id="two">
- <span style="width: 100px;"></span>
- </x-td>
- <x-td id="three">
- <span style="width: 200px"></span>
- </x-td>
- </x-tr>
- </x-table>
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- 'The box should be 300px since that is the size of the content',
- document.getElementById('one').offsetWidth,
- 300
- ],
- [
- 'The first cell is 100px wide due to its content\'s size',
- document.getElementById('two').offsetWidth,
- 100
- ],
- [
- 'The first cell is 200px wide due to its content\'s size',
- document.getElementById('three').offsetWidth,
- 200
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-guess.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-guess.html
deleted file mode 100644
index 87d67fadbfe..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-guess.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
-
-<style>
- x-table span {
- display: inline-block;
- background: green;
- height: 100px;
- }
-</style>
-<main>
- <h1>Width Distribution</h1>
- <h4>"Distribution Algorithm - min-content guess"</h4>
- <p>Tests the first step that all cells get their min content guess which is that
- of their min content
- <a href="https://drafts.csswg.org/css-tables-3/#width-distribution-algorithm">Spec Text</a>
- </p>
- <x-table id="one">
- <x-tr>
- <x-td id="two">
- <span style="width: 100px;"></span>
- </x-td>
- <x-td id="three">
- <span style="width: 200px"></span>
- </x-td>
- </x-tr>
- </x-table>
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- 'The box should be 300px since that is the size of the content',
- document.getElementById('one').offsetWidth,
- 300
- ],
- [
- 'The first cell is 100px wide due to its content\'s size',
- document.getElementById('two').offsetWidth,
- 100
- ],
- [
- 'The first cell is 200px wide due to its content\'s size',
- document.getElementById('three').offsetWidth,
- 200
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-percent-guess.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-percent-guess.html
deleted file mode 100644
index 66d086af6b6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-percent-guess.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
-
-<style>
- x-td {
- background: blue;
- }
-
- x-table span {
- display: inline-block;
- background: green;
- height: 100px;
- }
-</style>
-<main>
- <h1>Width Distribution</h1>
- <h4>"Distribution Algorithm - min-content-percent guess"</h4>
- <p>Tests that the size of the column is given the max(%width, min-content width)
- <a href="https://drafts.csswg.org/css-tables-3/#width-distribution-algorithm">Spec Text</a>
- </p>
- <x-table id="one" style="width: 400px;">
- <x-tr>
- <x-td id="two" style="width: 50%">
- <span style="width: 100%">Cell 1</span>
- </x-td>
- <x-td id="three">
- <span style="width: 100%">Cell 2</span>
- </x-td>
- </x-tr>
- </x-table>
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- 'The box should be 400px since that is the size of the content',
- document.getElementById('one').offsetWidth,
- 400
- ],
- [
- 'The first cell is 200px due to its 50% specified width is greater than ',
- document.getElementById('two').offsetWidth,
- 200
- ],
- [
- 'The second cell is 200px due to the 50% set on the first cell and the second gets distributed the remaining space since its auto',
- document.getElementById('three').offsetWidth,
- 200
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.1.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.1.html
deleted file mode 100644
index 0bca27ccf6f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.1.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
-
-<style>
- x-td {
- background: blue;
- }
-
- x-table span {
- display: inline-block;
- background: green;
- height: 50px;
- }
-</style>
-<main>
- <h1>Width Distribution</h1>
- <h4>"Distribution Algorithm - min-content-specified guess"</h4>
- <p>Tests that the size of the column as the spec states that if the cell is constrained then the
- <a href="https://drafts.csswg.org/css-tables-3/#width-distribution-algorithm">Spec Text</a>
- </p>
- <x-table style="width: 50px; border: 1px solid black;">
- <x-tr>
- <x-td id="one" style="width: 50%;">
- <span style="width: 75px;">Cell 2</span>
- </x-td>
- </x-tr>
- </x-table>
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- 'The box should be 75px due to its min-content size.',
- document.getElementById('one').offsetWidth,
- 75
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.html b/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.html
deleted file mode 100644
index a6aea8ba909..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/microsoft/css-tables/width-distribution/distribution-algo-min-content-specified-guess.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype html>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<link rel='stylesheet' href='../base.css' />
-
-<link rel="author" title="Greg Whitworth" href="gwhit@microsoft.com" />
-<link rel="help" href="https://drafts.csswg.org/css-tables-3/#width-distribution" />
-
-<style>
- x-td {
- background: blue;
- }
-
- x-table span {
- display: inline-block;
- background: green;
- height: 50px;
- }
-</style>
-<main>
- <h1>Width Distribution</h1>
- <h4>"Distribution Algorithm - min-content-specified guess"</h4>
- <p>Tests that the size of the column as the spec states that if the cell is constrained then the
- <a href="https://drafts.csswg.org/css-tables-3/#width-distribution-algorithm">Spec Text</a>
- </p>
- <x-table style="width: 50px; border: 1px solid black;">
- <x-tr>
- <x-td id="one" style="width: 100px;">
- <span style="width: 75px;">Cell 2</span>
- </x-td>
- </x-tr>
- </x-table>
-</main>
-
-<script>
- while(true) {
- var xtd = document.querySelector('x-td[rowspan], x-td[colspan]'); if(!xtd) break;
- var td = document.createElement('td'); for(var i = xtd.attributes.length; i--;) { td.setAttribute(xtd.attributes[i].name,xtd.attributes[i].value) }
- xtd.parentNode.replaceChild(td,xtd);
- }
-
- var i = 1;
- generate_tests(assert_equals, [
- [
- 'The box should be 75px due to its min-content size.',
- document.getElementById('one').offsetWidth,
- 75
- ]
- ]);
-</script>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/opera/OWNERS b/tests/wpt/web-platform-tests/css/work-in-progress/opera/OWNERS
index 63851614695..8b137891791 100644
--- a/tests/wpt/web-platform-tests/css/work-in-progress/opera/OWNERS
+++ b/tests/wpt/web-platform-tests/css/work-in-progress/opera/OWNERS
@@ -1 +1 @@
-@zcorpan
+
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/reference/ttwf-reftest-borderRadius-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/reference/ttwf-reftest-borderRadius-ref.html
deleted file mode 100644
index 25bd4d34003..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/reference/ttwf-reftest-borderRadius-ref.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Reference File</title>
- <link rel="author" title="Jinlong Zhang" href="mailto:jinlongz@oupeng.com">
- <style type="text/css">
- #testCon{border: 4px solid green; border-collapse: collapse;}
- #testCon td{width: 60px; height: 60px; border: 4px solid green;}
- </style>
-</head>
-<body>
- <p>The test passes if table's 'border-radius' style don't work.</p>
- <table id="testCon">
- <tr><td></td><td></td><td></td></tr>
- <tr><td></td><td></td><td></td></tr>
- <tr><td></td><td></td><td></td></tr>
- </table>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/ttwf-jstest-borderRadius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/ttwf-jstest-borderRadius.html
deleted file mode 100644
index a38978b071d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/ttwf-jstest-borderRadius.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Test Background and border</title>
- <link rel="author" title="Jinlong Zhang" href="mailto:jinlongz@oupeng.com">
- <link rel="help" href="https://drafts.csswg.org/css3-background/#border-radius-tables">
- <link rel="help" href="">
- <meta name="flags" content="dom"><!--precondition-->
- <meta name="assert" content="Table with 'border-collapse: collapse;' declaration, it's 'border-radius' style will not work.">
- <style type="text/css">
- #testCon{border: 4px solid green; border-radius: 5px; border-collapse: collapse;}
- #testCon td{width: 60px; height: 60px; border: 4px solid green; border-radius: 10px;}
- </style>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <table id="testCon">
- <tr><td></td><td></td><td></td></tr>
- <tr><td></td><td></td><td></td></tr>
- <tr><td></td><td></td><td></td></tr>
- </table>
- <div id="log"></div>
- <script>
- test(function() {
- var testCon = document.getElementById('testCon');
- testCon.style.borderRadius = '5px';
- assert_equals(testCon.style.getPropertyValue("border-radius"),
- "5px",
- "Table's borderRadius is 5px, but borderRadius don't work.")
- }, "Table_borderRadius_borderCollapse");
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/ttwf-reftest-borderRadius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/ttwf-reftest-borderRadius.html
deleted file mode 100644
index 50135ad96bf..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Along/ttwf-reftest-borderRadius.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Test Background and border</title>
- <link rel="author" title="Jinlong Zhang" href="mailto:jinlongz@oupeng.com">
- <link rel="help" href="https://drafts.csswg.org/css3-background/#border-radius-tables">
- <link rel="help" href="additional spec link">
- <link rel="match" href="reference/ttwf-reftest-tutorial-starter-ref">
- <meta name="assert" content="Table with 'border-collapse: collapse;' declaration, it's 'border-radius' style will not work.">
- <style type="text/css">
- #testCon{border: 4px solid green; border-radius: 5px; border-collapse: collapse;}
- #testCon td{width: 60px; height: 60px; border: 4px solid green; border-radius: 10px;}
- </style>
-</head>
-<body>
- <p>The test passes if table's 'border-radius' style don't work.</p>
- <p>CSS3 UAs should ignore border-radius properties applied to internal table elements when ‘border-collapse’ is ‘collapse’.</p>
- <table id="testCon">
- <tr><td></td><td></td><td></td></tr>
- <tr><td></td><td></td><td></td></tr>
- <tr><td></td><td></td><td></td></tr>
- </table>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/elementFromPosition.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/elementFromPosition.html
deleted file mode 100644
index a9b5850a73f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/elementFromPosition.html
+++ /dev/null
@@ -1,127 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en-US">
-<head>
- <title>wwwwCSS Test: CSSOM View elementFromPoint</title>
- <meta charset="UTF-8">
- <link rel="author" title="Redky" href="mailto:redky@qq.com" />
- <link rel="help" href="https://drafts.csswg.org/cssom-view/#extensions-to-the-document-interface" />
- <link rel="help" href="https://drafts.csswg.org/cssom-view/#widl-Document-elementFromPoint-Element-float-x-float-y" />
- <meta name="flags" content="dom" />
- <script src="/resources/testharness.js" type="text/javascript"></script>
- <script src="/resources/testharnessreport.js" type="text/javascript"></script>
-</head>
-<body>
- <noscript>Test not run - JavaScript required!</noscript>
- <div id="log"></div>
- <script type="text/javascript">
-
- var body = document.getElementsByTagName( 'body' )[0];
- function createElement( id ) {
- var elem = document.createElement( 'div' );
- if ( id && typeof id == 'string' ) {
- elem.id = id;
- }
- body.appendChild( elem );
- return elem;
- }
-
- function setPosition( config ) {
- var target = config.target;
- target.style.position = 'absolute';
- target.style.left = config.left + 'px';
- target.style.top = config.top + 'px';
- target.style.width = config.width + 'px';
- target.style.height = config.height + 'px';
- if ( config['z-index'] ) {
- target.style.zIndex = config['z-index'];
- }
- }
-
- var target = createElement( 'dom-1' );
- setPosition( {
- width: 100,
- height: 100,
- left: 10,
- top: 10,
- target: target
- });
-
- test( function () {
- assert_inherits( document, 'elementFromPoint' );
- }, 'document.elementFromPoint');
-
- test( function () {
- assert_true( document.elementFromPoint instanceof Function );
- }, 'document.elementFromPoint is a Function');
-
- test( function () {
- var wrap = [
- // 左上角.
- {x: 10, y: 10, r: true},
- // 上边线
- {x: 50, y: 10, r: true},
- // 右上角
- {x: 110, y: 10, r: false},
- // 左边线
- {x: 10, y: 50, r: true},
- // 元素范围内
- {x: 50, y: 50, r: true},
- // 右边线
- {x: 110, y: 10, r: false},
- // 左下角
- {x: 10, y: 110, r: false},
- // 下边线
- {x: 50, y: 110, r: false},
- // 右下角
- {x: 110, y: 110, r: false}
- ];
-
- var i = 0, len = wrap.length, item;
- for ( ; i < len; i++ ) {
- item = wrap[ i ];
- assert_equals( document.elementFromPoint( item.x, item.y).id == 'dom-1', item.r );
- }
- }, 'test some point of the element');
-
- test( function () {
- var elem = document.elementFromPoint( 0, 0 );
- assert_true( elem.nodeName == 'HTML' );
- }, 'Point (0, 0), return root element(HTML)' );
-
- test( function () {
- var elem = document.elementFromPoint( -1000, 0 );
- assert_true( elem == null, 'negative x, return null' );
- }, ' test negative x ');
-
- test( function () {
- var elem = document.elementFromPoint( 0, -1000 );
- assert_true( elem == null, 'negative y, return null' );
- }, ' test negative y ');
-
- test( function () {
- var elem = document.elementFromPoint( 100000, 0 );
- assert_true( elem == null );
- }, 'test outside of viewport');
-
- test( function () {
- var config = {
- width: 100,
- height: 100,
- left: 5,
- top: 5
- };
- var target2 = createElement( 'dom-2' );
- config.target = target2;
- setPosition( config );
-
- var elem = document.elementFromPoint( 10, 10 );
- var elem2 = document.elementFromPoint( 10, 10 );
- assert_equals( elem.id, elem2.id );
- }, 'test the top of layer');
-
-
- </script>
-</body>
-</html>
-
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/reference/ttwf-reftest-borderRadius-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/reference/ttwf-reftest-borderRadius-ref.html
deleted file mode 100644
index 25bd4d34003..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/reference/ttwf-reftest-borderRadius-ref.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Reference File</title>
- <link rel="author" title="Jinlong Zhang" href="mailto:jinlongz@oupeng.com">
- <style type="text/css">
- #testCon{border: 4px solid green; border-collapse: collapse;}
- #testCon td{width: 60px; height: 60px; border: 4px solid green;}
- </style>
-</head>
-<body>
- <p>The test passes if table's 'border-radius' style don't work.</p>
- <table id="testCon">
- <tr><td></td><td></td><td></td></tr>
- <tr><td></td><td></td><td></td></tr>
- <tr><td></td><td></td><td></td></tr>
- </table>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/ttwf-reftest-borderRadius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/ttwf-reftest-borderRadius.html
deleted file mode 100644
index b6071ea99d2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/ttwf-reftest-borderRadius.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Test Background and border</title>
- <link rel="author" title="Jinlong Zhang" href="mailto:jinlongz@oupeng.com">
- <link rel="help" href="https://drafts.csswg.org/css3-background/#border-radius-tables">
- <link rel="help" href="additional spec link">
- <link rel="match" href="reference/ttwf-reftest-tutorial-starter-ref">
- <meta name="assert" content="Table with 'border-collapse: collapse;' declaration, it's 'border-radius' style will not work.">
- <style type="text/css">
- #testCon{border: 4px solid green; border-radius: 5px; border-collapse: collapse;}
- #testCon td{width: 60px; height: 60px; border: 4px solid green; border-radius: 10px;}
- </style>
-</head>
-<body>
- <p>The test passes if table's 'border-radius' style don't work.</p>
- <table id="testCon">
- <tr><td></td><td></td><td></td></tr>
- <tr><td></td><td></td><td></td></tr>
- <tr><td></td><td></td><td></td></tr>
- </table>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/ttwf-scrollintoview.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/ttwf-scrollintoview.html
deleted file mode 100644
index 1e6d2ea6eb8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/ttwf-scrollintoview.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSSOM View - 6 - scrollIntoView tests</title>
- <meta charset="utf-8">
- <link rel="author" title="Chris Wu" href="mailto:pwx.frontend@gmail.com">
- <link rel="help" href="https://drafts.csswg.org/cssom-view/#widl-Element-scrollIntoView-void-boolean-top">
- <meta name="flags" content="dom">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <style type="text/css">
- #phitem{height: 2000px;}
- #viewitem{width:300px;height:200px;margin:0 auto;background-color: lightgreen;}
- </style>
-</head>
-<body>
- <div id="myDiv">
- <div id="phitem"></div>
- <div id="viewitem"></div>
- </div>
- <div id="log"></div>
- <script>
- var asytest = async_test('check scrollIntoView');
- asytest.step(function(){
- var viewitem = document.getElementById('viewitem');
- viewitem.scrollIntoView();
- assert_true(window.pageYOffset + window.innerHeight > viewitem.offsetTop, "The element isn't in the viewport")
- })
- asytest.done()
- </script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/window-screen-height.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/window-screen-height.html
deleted file mode 100644
index c20e061e256..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/Chris/window-screen-height.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSSOM View - 4.2 - screen.height range tests</title>
- <link rel="author" title="Neils Christoffersen" href="mailto:neils.christoffersen@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-view/#the-screen-interface">
- <meta name="flags" content="dom">
- <meta name="assert" content="window.screen.height has sensible values">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <div id="myDiv"></div>
- <div id="log"></div>
- <script>
- var upperBound = 50000;
-
- test(
- function() {
- assert_not_equals(window.screen.height, 0, "window.screen.height is zero")
- }, "zero check"
- );
-
- test(
- function() {
- assert_true(window.screen.height > 0, "window.screen.height shouldn't be negative")
- }, "positive check"
- );
-
- test(
- function() {
- assert_true(window.screen.height < upperBound, "window.screen.height shouldn't be so large")
- }, "upper bound check"
- );
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/background-clip-color.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/background-clip-color.html
deleted file mode 100644
index 0a9c773f70e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/background-clip-color.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Test: background-clip Reference</title>
- <link rel="author" title="angelazou" href="mailto:angela380in@hotmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-clip" />
- <link rel="match" href="reference/background-clip-ref.html">
- <meta name="assert" content="Test pass if the entire background is filled with color, including the border under background-clip: border-box rule">
- <style type="text/css">
- * { padding: 0; margin: 0; }
- #test-color {
- width: 200px;
- height: 200px;
- background-color: #00ff00;
- background-clip: border-box;
- float: left;
- padding: 10px;
- margin: 20px;
- border: 5px solid #00ff11;
- }
- </style>
-</head>
-<body>
- <p>Test pass if the entire background is filled with color, including the border, spanning total of 240px, under background-clip: border-box rule</p>
- <div id="test-color"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/background-clip-image.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/background-clip-image.html
deleted file mode 100644
index 4fd5294b3aa..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/background-clip-image.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Test: background-clip Reference</title>
- <link rel="author" title="angelazou" href="mailto:angela380in@hotmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-clip" />
- <link rel="match" href="reference/background-clip-ref.html">
- <meta name="assert" content="Test pass if the entire background is filled with image, including the border under background-clip: border-box rule">
- <style type="text/css">
- * { padding: 0; margin: 0; }
- #test-image {
- width: 200px;
- height: 200px;
- background-image: url(support/img_start.png);
- background-clip: border-box;
- float: left;
- padding: 10px;
- margin: 20px;
- border: 5px solid #00ff11;
- }
- </style>
-</head>
-<body>
- <p>Test pass if the entire background is filled with image, including the border, spanning total of 240px, under background-clip: border-box rule</p>
- <div id="test-image"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/reference/background-clip-color-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/reference/background-clip-color-ref.html
deleted file mode 100644
index 9f6d7525f1d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/reference/background-clip-color-ref.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Test: background-clip Reference</title>
- <link rel="author" title="angelazou" href="mailto:angela380in@hotmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-clip" />
- <link rel="match" href="reference/background-clip-ref.html">
- <meta name="assert" content="Test pass if the entire background is filled with color, including the border under background-clip: border-box rule">
- <style type="text/css">
- * { padding: 0; margin: 0; }
- #test-color {
- width: 240px;
- height: 240px;
- background-color: #00ff00;
- float: left;
- margin: 20px;
- }
- </style>
-</head>
-<body>
- <p>Test pass if the entire background is filled with color, including the border, spanning total of 240px, under background-clip: border-box rule</p>
- <div id="test-color"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/reference/background-clip-image-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/reference/background-clip-image-ref.html
deleted file mode 100644
index 66a3eebfa4e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/reference/background-clip-image-ref.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Test: background-clip Reference</title>
- <link rel="author" title="angelazou" href="mailto:angela380in@hotmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-clip" />
- <link rel="match" href="reference/background-clip-ref.html">
- <meta name="assert" content="Test pass if the entire background is filled with image, including the border under background-clip: border-box rule">
- <style type="text/css">
- * { padding: 0; margin: 0; }
- #test-image {
- width: 240px;
- height: 240px;
- background-image: url(../support/img_start.png);
- float: left;
- margin: 20px;
- }
- </style>
-</head>
-<body>
- <p>Test pass if the entire background is filled with image, including the border, spanning total of 240px, under background-clip: border-box rule</p>
- <div id="test-image"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/support/img_star.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/support/img_star.png
deleted file mode 100644
index e657bfa34ce..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/angela/support/img_star.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images-002.html
deleted file mode 100644
index 8c045f293b1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images-002.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <title>CSS Border-images Test File</title>
- <link rel="author" title="babyliner" href="mailto:babyliner1026@gmail.com" />
- <style type="text/css">
- #main {
- width: 400px;
- height: 600px;
- border: 1px red solid;
- border-image-source: url(./images/border-image-002.jpg);
- border-image-slice: 230 230 400 230;
- border-image-repeat: stretch;
- border-image-width: 115 115 200 115;
- }
- </style>
- </head>
-<body>
- <div id="main"></div>
- <script type="text/javascript">
- var minWidth = 230,
- minHeight = 315,
- change = 5,
- main = document.getElementById('main');
-
- main.style.width = minWidth + 'px';
- main.style.height = minHeight + 'px';
-
- setInterval(function() {
- main.style.width = parseInt(main.style.width) + change + 'px';
- main.style.height = parseInt(main.style.height) + change + 'px';
- if (parseInt(main.style.width) > 500 ||
- parseInt(main.style.width) < minWidth) {
- change = -change;
- }
- }, 1);
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images-003.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images-003.html
deleted file mode 100644
index fd310435887..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images-003.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <title>CSS Border-images Test File</title>
- <link rel="author" title="babyliner" href="mailto:babyliner1026@gmail.com" />
- <style type="text/css">
- .main {
- width: 500px;
- height: 400px;
- border: 1px red solid;
- border-image-source: url(./images/border-image-003.jpg);
- border-image-slice: 50%;
- border-image-repeat: stretch;
- border-image-width: 100 100;
- }
- </style>
- </head>
-<body>
- <p class="explain">Test passes if there are borders with flowers.<br />
- Test fails if there are solid borders</p>
- <div class="main"></div>
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images.html
deleted file mode 100644
index 489e76b434d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/border-images.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML>
-<html lang="en">
-<head>
- <meta charset="UTF-8">
- <title>CSS Backgrounds and Borders Test:border-images with round repeat</title>
- <link rel="author" title="babyliner" href="mailto:babyliner1026@gmail.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-border-image">
- <meta name="flags" content="image">
- <meta name="assert" content="Testing border-image-repeat:round attribute">
- <style type="text/css">
- .main {
- width: 200px;
- height: 200px;
- border: 1px red solid;
- border-image-source: url(./images/border-image.jpg);
- border-image-slice: 100 100;
- border-image-repeat: round;
- border-image-width: 50 50;
- }
- </style>
- </head>
-<body>
- <p class="explain">Test passes if there are borders with flowers.<br />
- Test fails if there are red solid borders</p>
- <div class="main"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image-002.jpg b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image-002.jpg
deleted file mode 100644
index d8716958b95..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image-002.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image-003.jpg b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image-003.jpg
deleted file mode 100644
index 91b382e5a5c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image-003.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image.jpg b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image.jpg
deleted file mode 100644
index a83a921fdf0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/babyliner/images/border-image.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-bottom.htm b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-bottom.htm
deleted file mode 100644
index 800a0eb0eb8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-bottom.htm
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Backgrounds and Borders Test: border_color_shorthand_missing_bottom</title>
- <link rel="author" title="disound" href="mailto:disound@gmail.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#border-color" />
- <meta name="flags" content="image" />
- <meta name="assert" content="'Border-color' is a shorthand for the four 'border-*-color' properties. The four values set the top, right, bottom and left border, respectively. A missing left is the same as right, a missing bottom is the same as top, and a missing right is also the same as top." />
- <style>
- #ref {
- background-color: white;
- height: 160px;
- width: 160px;
- }
- #test {
- border: black solid 5px;
- border-color: yellow black;
- bottom: 160px;
- height: 100px;
- padding: 25px;
- position: relative;
- width: 100px;
- }
- </style>
- </head>
- <body>
- <p>Test passes if there is a white square, left border is black, <strong>bottom border is yellow</strong>, right border is black, top border is yellow.</p>
- <div id="ref"></div>
- <div id="test"></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-left.htm b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-left.htm
deleted file mode 100644
index e3b11839276..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand-missing-left.htm
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Backgrounds and Borders Test: border_color_shorthand_missing_left</title>
- <link rel="author" title="disound" href="mailto:disound@gmail.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#border-color" />
- <meta name="flags" content="image" />
- <meta name="assert" content="'Border-color' is a shorthand for the four 'border-*-color' properties. The four values set the top, right, bottom and left border, respectively. A missing left is the same as right, a missing bottom is the same as top, and a missing right is also the same as top." />
- <style>
- #ref {
- background-color: white;
- height: 160px;
- width: 160px;
- }
- #test {
- border: black solid 5px;
- border-color: yellow black blue;
- bottom: 160px;
- height: 100px;
- padding: 25px;
- position: relative;
- width: 100px;
- }
- </style>
- </head>
- <body>
- <p>Test passes if there is a white square, <strong>left border is black</strong>, bottom border is blue, right border is black, top border is yellow.</p>
- <div id="ref"></div>
- <div id="test"></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand.htm b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand.htm
deleted file mode 100644
index c9fbc559de2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color-shorthand.htm
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Backgrounds and Borders Test: border_color_shorthand</title>
- <link rel="author" title="disound" href="mailto:disound@gmail.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#border-color" />
- <meta name="flags" content="image" />
- <meta name="assert" content="'Border-color' is a shorthand for the four 'border-*-color' properties. The four values set the top, right, bottom and left border, respectively. A missing left is the same as right, a missing bottom is the same as top, and a missing right is also the same as top." />
- <style>
- #ref {
- background-color: white;
- height: 160px;
- width: 160px;
- }
- #test {
- border: black solid 5px;
- border-color: yellow black blue green;
- bottom: 160px;
- height: 100px;
- padding: 25px;
- position: relative;
- width: 100px;
- }
- </style>
- </head>
- <body>
- <p>Test passes if there is a white square, left border is green, bottom border is blue, right border is black, top border is yellow.</p>
- <div id="ref"></div>
- <div id="test"></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color.htm b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color.htm
deleted file mode 100644
index e1a6fe7b530..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/disound/ttwf-css3background-border-color.htm
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Backgrounds and Borders Test: border_color</title>
- <link rel="author" title="disound" href="mailto:disound@gmail.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#border-color" />
- <meta name="flags" content="image" />
- <meta name="assert" content="'Border-color' is a shorthand for the four 'border-*-color' properties. The four values set the top, right, bottom and left border, respectively. A missing left is the same as right, a missing bottom is the same as top, and a missing right is also the same as top." />
- <style>
- #ref {
- background-color: white;
- height: 160px;
- width: 160px;
- }
- #test {
- border: black solid 5px;
- border-top-color: yellow;
- border-right-color: black;
- border-bottom-color: blue;
- border-left-color: green;
- bottom: 160px;
- height: 100px;
- padding: 25px;
- position: relative;
- width: 100px;
- }
- </style>
- </head>
- <body>
- <p>Test passes if there is a white square, left border is green, bottom border is blue, right border is black, top border is yellow.</p>
- <div id="ref"></div>
- <div id="test"></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box.html
deleted file mode 100644
index bf8d496b4f8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:border-box</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="border-box : The background is painted within (clipped to) the border box." >
-
- <meta charset="utf-8">
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : border-box;
- }
-
-
-</style>
-
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area includes the area covered by border , and the area surrounded by border.<br>
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-clip
- </div>
-
- <div class="view case" >
- Test background-clip
- </div>
-
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_position.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_position.html
deleted file mode 100644
index f875cfe753c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_position.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:border-box & background-position</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="border-box : The background is painted within (clipped to) the border box." >
-
- <meta charset="utf-8">
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : border-box;
- background-position: -15px -15px;
- }
-
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area includes the area covered by border , and the area surrounded by border.<br>
-When background-position is enabled, the browser should clip the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-clip:
- </div>
-
- <div class="view case" >
- Test background-clip:
- </div>
-
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_radius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_radius.html
deleted file mode 100644
index 85b9d990271..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_radius.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:border-box & border-radius</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="border-box : The background is painted within (clipped to) the border box." >
-
- <meta charset="utf-8">
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : border-box;
- border-radius: 60px;
- }
-
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area includes the area covered by border , and the area surrounded by border.<br>
-When border-radius is enabled, the browser should clip the background correctly.
-</div>
-
-<div class="test-case">
-
- <div id="border-box" class="view case no-repeat" >
- Test background-clip:
- </div>
-
- <div id="border-box" class="view case" >
- Test background-clip:
- </div>
-
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_size.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_size.html
deleted file mode 100644
index d1af85a0252..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/border-box_with_size.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:border-box & background-size</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="border-box : The background is painted within (clipped to) the border box." >
-
- <meta charset="utf-8">
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : border-box;
- background-size : 50%;
- }
-
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area includes the area covered by border , and the area surrounded by border.<br>
-When background-size is enabled, the browser should clip the background correctly.
-</div>
-
-<div class="test-case">
-
- <div id="border-box" class="view case no-repeat" >
- Test background-clip:
- </div>
-
- <div id="border-box" class="view case" >
- Test background-clip:
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box.html
deleted file mode 100644
index 0c16ccdb294..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:content-box</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="content-box : The background is painted within (clipped to) the content box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : content-box;
- }
-
-
-</style>
-
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area is the content-area(excludes padding-area ) of the DIV.<br>
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-clip
- </div>
-
- <div class="view case" >
- Test background-clip
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_position.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_position.html
deleted file mode 100644
index e2a3a242fe2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_position.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:content-box & background-position</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="content-box : The background is painted within (clipped to) the content box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : content-box;
- background-position: -15px -15px;
- }
-
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area is the content-area(excludes padding-area ) of the DIV.<br>
-When background-position is enabled, the browser should clip the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-clip
- </div>
-
- <div class="view case" >
- Test background-clip
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_radius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_radius.html
deleted file mode 100644
index 3e21353abbb..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_radius.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:content-box & border-radius</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="content-box : The background is painted within (clipped to) the content box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : content-box;
- border-radius: 60px;
- }
-
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area is the content-area(excludes padding-area ) of the DIV.<br>
-When border-radius is enabled, the browser should clip the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-clip
- </div>
-
- <div class="view case" >
- Test background-clip
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_size.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_size.html
deleted file mode 100644
index 3bd0e1ce6e5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/content-box_with_size.html
+++ /dev/null
@@ -1,70 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:content-box & background-size</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="content-box : The background is painted within (clipped to) the content box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : content-box;
- background-size : 50%;
- }
-
- </style>
-
-</head>
-<body>
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area is the content-area(excludes padding-area ) of the DIV.<br>
-When background-size is enabled, the browser should clip the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-clip
- </div>
-
- <div class="view case" >
- Test background-clip
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/list.txt b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/list.txt
deleted file mode 100644
index 52c47ebba99..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/list.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-background-clip/border-box.html
-background-clip/border-box_with_position.html
-background-clip/border-box_with_radius.html
-background-clip/border-box_with_size.html
-background-clip/content-box.html
-background-clip/content-box_with_position.html
-background-clip/content-box_with_radius.html
-background-clip/content-box_with_size.html
-background-clip/padding-box.html
-background-clip/padding-box_with_position.html
-background-clip/padding-box_with_radius.html
-background-clip/padding-box_with_size.html
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box.html
deleted file mode 100644
index 6e43572f558..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:padding-box</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="padding-box : The background is painted within (clipped to) the padding box" >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : padding-box;
- }
-
-
-</style>
-
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area is the area covered by border(includes padding-area ).
-</div>
-
-<div class="test-case">
-
-
- <div class="view case no-repeat" >
- Test background-clip
- </div>
-
- <div class="view case" >
- Test background-clip
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_position.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_position.html
deleted file mode 100644
index b1938d0390b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_position.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:padding-box & background-position</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="padding-box : The background is painted within (clipped to) the padding box" >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : padding-box;
- background-position: -15px -15px;
- }
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area is the area covered by border(includes padding-area ).<br>
-When background-position is enabled, the browser should clip the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-clip
- </div>
-
- <div class="view case" >
- Test background-clip
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_radius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_radius.html
deleted file mode 100644
index d2d576446a9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_radius.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:padding-box & border-radius</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="padding-box : The background is painted within (clipped to) the padding box" >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : padding-box;
- border-radius: 60px;
- }
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area is the area covered by border(includes padding-area ).<br>
-When border-radius is enabled, the browser should clip the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-clip
- </div>
-
- <div class="view case" >
- Test background-clip
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_size.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_size.html
deleted file mode 100644
index df1b2649c45..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-clip/padding-box_with_size.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-clip:padding-box & background-size</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-clip" >
- <meta name="flags" content="" >
- <meta name="assert" content="padding-box : The background is painted within (clipped to) the padding box" >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-clip : padding-box;
- background-size : 50%;
- }
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is clipped. The clip area is the area covered by border(includes padding-area ).<br>
-When background-size is enabled, the browser should clip the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-clip
- </div>
-
- <div class="view case" >
- Test background-clip
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box.html
deleted file mode 100644
index 49c3cad3493..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box.html
+++ /dev/null
@@ -1,70 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:border-box</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="border-box : The position is relative to the border box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : border-box;
- }
-
-</style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is painted. The paint area includes the area covered by border , and the area surrounded by border.<br>
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-origin
- </div>
-
- <div class="view case" >
- Test background-origin
- </div>
-
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_position.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_position.html
deleted file mode 100644
index 986fbc5202b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_position.html
+++ /dev/null
@@ -1,73 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:border-box & background-position</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="border-box : The position is relative to the border box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : border-box;
- background-position: -15px -15px;
- }
-
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is painted. The paint area includes the area covered by border , and the area surrounded by border.<br>
-When background-position is enabled, the browser should paint the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-origin:
- </div>
-
- <div class="view case" >
- Test background-origin:
- </div>
-
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_radius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_radius.html
deleted file mode 100644
index afc23c9fd7b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_radius.html
+++ /dev/null
@@ -1,73 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:border-box & border-radius</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="border-box : The position is relative to the border box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : border-box;
- border-radius: 60px;
- }
-
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is painted. The paint area includes the area covered by border , and the area surrounded by border.<br>
-When border-radius is enabled, the browser should paint the background correctly.
-</div>
-
-<div class="test-case">
-
- <div id="border-box" class="view case no-repeat" >
- Test background-origin:
- </div>
-
- <div id="border-box" class="view case" >
- Test background-origin:
- </div>
-
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_size.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_size.html
deleted file mode 100644
index c170b58db16..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/border-box_with_size.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:border-box & background-size</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="border-box : The position is relative to the border box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : border-box;
- background-size : 50%;
- }
-
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is painted. The paint area includes the area covered by border , and the area surrounded by border.<br>
-When background-size is enabled, the browser should paint the background correctly.
-</div>
-
-<div class="test-case">
-
- <div id="border-box" class="view case no-repeat" >
- Test background-origin:
- </div>
-
- <div id="border-box" class="view case" >
- Test background-origin:
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box.html
deleted file mode 100644
index c4bf152b3e5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:content-box</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="content-box : The position is relative to the content box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : content-box;
- }
-
-
-</style>
-
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is painted. The paint area is the content-area(excludes padding-area ) of the DIV.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-origin
- </div>
-
- <div class="view case" >
- Test background-origin
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_position.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_position.html
deleted file mode 100644
index 4db5163c144..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_position.html
+++ /dev/null
@@ -1,74 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:content-box & background-position</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="content-box : The position is relative to the content box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : content-box;
- background-position: -15px -15px;
- }
-
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-
-
-Test Passed If : The background is painted. The paint area is the content-area(excludes padding-area ) of the DIV.<br>
-When background-position is enabled, the browser should paint the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-origin
- </div>
-
- <div class="view case" >
- Test background-origin
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_radius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_radius.html
deleted file mode 100644
index 2c13aae63a7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_radius.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:content-box & border-radius</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="content-box : The position is relative to the content box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : content-box;
- border-radius: 60px;
- }
-
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is painted. The paint area is the content-area(excludes padding-area ) of the DIV.<br>
-When border-radius is enabled, the browser should paint the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-origin
- </div>
-
- <div class="view case" >
- Test background-origin
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_size.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_size.html
deleted file mode 100644
index 2e0a639191c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/content-box_with_size.html
+++ /dev/null
@@ -1,70 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:content-box & background-size</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="content-box : The position is relative to the content box." >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : content-box;
- background-size : 50%;
- }
-
- </style>
-
-</head>
-<body>
-<div class="infomation">
-Test Passed If : The background is painted. The paint area is the content-area(excludes padding-area ) of the DIV.<br>
-When background-size is enabled, the browser should paint the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-origin
- </div>
-
- <div class="view case" >
- Test background-origin
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/list.txt b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/list.txt
deleted file mode 100644
index a6fdedde542..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/list.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-background-origin/border-box.html
-background-origin/border-box_with_position.html
-background-origin/border-box_with_radius.html
-background-origin/border-box_with_size.html
-background-origin/content-box.html
-background-origin/content-box_with_position.html
-background-origin/content-box_with_radius.html
-background-origin/content-box_with_size.html
-background-origin/padding-box.html
-background-origin/padding-box_with_position.html
-background-origin/padding-box_with_radius.html
-background-origin/padding-box_with_size.html
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box.html
deleted file mode 100644
index b63127f0223..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:padding-box</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="padding-box : The position is relative to the padding box. (For single boxes ‘0 0’ is the upper left corner of the padding edge, ‘100% 100%’ is the lower right corner.)" >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : padding-box;
- }
-
-
-</style>
-
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is painted. The paint area is the area covered by border(includes padding-area ).
-</div>
-
-<div class="test-case">
-
-
- <div class="view case no-repeat" >
- Test background-origin
- </div>
-
- <div class="view case" >
- Test background-origin
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_position.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_position.html
deleted file mode 100644
index efdcee39306..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_position.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:padding-box & background-position</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="padding-box : The position is relative to the padding box. (For single boxes ‘0 0’ is the upper left corner of the padding edge, ‘100% 100%’ is the lower right corner.)" >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : padding-box;
- background-position: -15px -15px;
- }
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is painted. The paint area is the area covered by border(includes padding-area ).<br>
-When background-position is enabled, the browser should paint the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-origin
- </div>
-
- <div class="view case" >
- Test background-origin
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_radius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_radius.html
deleted file mode 100644
index e089ea2dc8c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_radius.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:padding-box & border-radius</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="padding-box : The position is relative to the padding box. (For single boxes ‘0 0’ is the upper left corner of the padding edge, ‘100% 100%’ is the lower right corner.)" >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : padding-box;
- border-radius: 60px;
- }
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is painted. The paint area is the area covered by border(includes padding-area ).<br>
-When border-radius is enabled, the browser should paint the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-origin
- </div>
-
- <div class="view case" >
- Test background-origin
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_size.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_size.html
deleted file mode 100644
index 60cb8436832..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/background-origin/padding-box_with_size.html
+++ /dev/null
@@ -1,71 +0,0 @@
-
-<!doctype html>
-<html>
-<head>
- <title>CSS Backgrounds Test: background-origin:padding-box & background-size</title>
- <link rel="author" title="finscn" href="mailto:finscn@gmail.com" >
- <link rel="help" href="https://drafts.csswg.org/css3-background/#the-background-origin" >
- <meta name="flags" content="" >
- <meta name="assert" content="padding-box : The position is relative to the padding box. (For single boxes ‘0 0’ is the upper left corner of the padding edge, ‘100% 100%’ is the lower right corner.)" >
-
- <meta charset="utf-8">
-
-
-<style type="text/css">
-
- .infomation {
- padding : 10px;
- font-size : 16pt;
- margin : 5px;
- }
-
- .test-case {
- padding : 5px;
- margin : 5px;
- }
-
- .view {
- border : 30px solid rgba(60,150,255,0.4);
- width : 320px;
- height : 240px;
- padding : 30px;
- margin : 10px;
- font-size : 16pt;
- color : #ff9933;
- background-image : url("../resource/css3.png");
- }
-
- .no-repeat {
- background-repeat : no-repeat;
- }
-
- .case {
- background-origin : padding-box;
- background-size : 50%;
- }
-
- </style>
-
-</head>
-<body>
-
-<div class="infomation">
-Test Passed If : The background is painted. The paint area is the area covered by border(includes padding-area ).<br>
-When background-size is enabled, the browser should paint the background correctly.
-</div>
-
-<div class="test-case">
-
- <div class="view case no-repeat" >
- Test background-origin
- </div>
-
- <div class="view case" >
- Test background-origin
- </div>
-
-</div>
-
-</body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/border.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/border.png
deleted file mode 100644
index 7a657391d65..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/border.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/css3.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/css3.png
deleted file mode 100644
index 823b16a16ca..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/css3.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/ttwf.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/ttwf.png
deleted file mode 100644
index c8e578327c2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/finscn/resource/ttwf.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/border-image-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/border-image-001.html
deleted file mode 100644
index ee6ccaf5903..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/border-image-001.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>css3 Backgrounds & Borders</title>
- <link rel="author" title="wenlong duan" href="mailto:jornakbobo@163.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#border-images">
- <!--link rel="help" href="additional spec link"-->
- <link rel="match" href="reference/ttwf-reftest-tutorial-starter-ref.html">
- <meta name="assert" content="Statement describing what the test case is asserting">
- <style type="text/css">
- .border{
- border-width:2px 12px;
- padding:10px;
- text-align:center;
- font-size:16px;
- color:green;
- border-image:url(support/bt_blue.png) 0 12 0 12 stretch stretch;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a bule background-image border and no border-image.</p>
- <div class="border">css3</div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/reference/border-image-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/reference/border-image-ref.html
deleted file mode 100644
index 5692effe04f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/reference/border-image-ref.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>css3 Backgrounds & Borders</title>
- <link rel="author" title="" href="mailto:jornakbobo@163.com"/>
- <link rel="help" href="http://www.w3.org/TR/css3-background/#border-images"/>
- <!--link rel="help" href="additional spec link"-->
- <link rel="match" href="reference/ttwf-reftest-tutorial-starter-ref.html"/>
- <meta name="assert" content="Statement describing what the test case is asserting"/>
- <style type="text/css">
- .border{
- padding-left: 11px;
- text-align: center;
- font-size: 16px;
- color:white;
- background:url(../support/bt_blue.png) 0 0 no-repeat
- }
- .border div{
- padding-right:11px;
- background:url(../support/bt_blue.png) 100% 0 no-repeat
- }
- .border div div{
- padding:12px 0;
- background:url(../support/repeat-x.png) repeat-x
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a bule background-image border and no border-image.</p>
- <div class="border">
- <div>
- <div>css3 border</div>
- </div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/support/bt_blue.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/support/bt_blue.png
deleted file mode 100644
index d89a111e8d7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/support/bt_blue.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/support/repeat-x.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/support/repeat-x.png
deleted file mode 100644
index eab6cd19313..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/henry_d/support/repeat-x.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/flex-justify.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/flex-justify.html
deleted file mode 100644
index 85dd1a2890a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/flex-justify.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<title>flex test justify fix by yisi</title>
-<link rel="author" title="yisi" href="mailto:50167214@qq.com">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#justify-content" />
-<link rel="match" href="reference/border-radius-clipping-ref.html">
-<meta name="assert" content="" />
-<style>
-* {
- margin: 0;
- padding: 0;
-}
-body {
- font: 12px/1.5 tahoma, sans-serif;
-}
-ul {
- list-style: none outside none;
-}
-a {
- color: #333;
- text-decoration: none;
-}
-a:hover {
- text-decoration: underline;
- color: #F63;
-}
-img {
- border: 0 none;
- vertical-align: middle;
-}
-h1 {
- margin: 20px auto;
- font-size: 26px;
- font-weight: normal;
- text-align: center;
- color: #333;
-}
-h2 {
- color: #555;
- font-size: 20px;
- margin: 20px 0;
-}
-.box{ width:990px; margin-left:auto; margin-right:auto;}
-.box .bd{ border:1px solid #DDD;}
-.hd span {
- font-size: 14px;
- color: #888;
- padding-left: 20px;
-}
-.list {
- padding: 0 0 20px 0;
-}
-.list li {
- margin-top: 20px;
- padding:0 22.5px 0 22px;
-}
-
-.dib-wrap {
- font-size: 0;
-}
-
-.dib {
- display: inline-block;
- *display:inline;
- *zoom:1;
-}
-.dib-wrap .dib {
- font-size: 12px;
- letter-spacing: normal;
- word-spacing: normal;
- vertical-align: top;
-}
-</style>
-</head>
-
-<body>
- <div class="box">
- <div class="bd">
- <ul class="list dib-wrap">
- <li class="dib"><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class="dib"><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class="dib"><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class="dib"><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class="dib"><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class="dib"><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class="dib"><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class="dib"><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class="dib"><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- </ul>
- </div>
- </div>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/flex-min-auto.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/flex-min-auto.html
deleted file mode 100644
index 3927c667ba9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/flex-min-auto.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!doctype html>
-<html>
-<title>flex min-width:auto by yisi</title>
-<link rel="author" title="yisi" href="mailto:50167214@qq.com">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#min-size-auto" />
-<link rel="match" href="flex-min-auto-rel.html">
-<meta name="assert" content="伸缩项目的最小宽度应该和 float 元素宽度一致,都是最小内容宽度。" />
-<style>
-div{ width:1em; height:50px; background:#39F; border:1px solid red;display:flex; }
-span{ border:1px solid #000;}
-</style>
-</head>
-
-<body>
-<div><span>FlexibleFlexibleFlexibleFlexibleFlexible</span></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/reference/flex-justify-rel.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/reference/flex-justify-rel.html
deleted file mode 100644
index 01ae9717c79..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/reference/flex-justify-rel.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<title>flex test justify fix by yisi</title>
-<link rel="author" title="yisi" href="mailto:50167214@qq.com">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#justify-content" />
-<link rel="match" href="reference/flex-justify-ref.html">
-<meta name="assert" content="" />
-<style>
-* {
- margin: 0;
- padding: 0;
-}
-body {
- font: 12px/1.5 tahoma, sans-serif;
-}
-ul {
- list-style: none outside none;
-}
-
-img {
- border: 0 none;
- vertical-align: middle;
-}
-
-h2 {
- color: #555;
- font-size: 20px;
- margin: 20px 0;
-}
-.box{ width:990px; margin-left:auto; margin-right:auto;}
-.box .bd{ border:1px solid #DDD;}
-.hd span {
- font-size: 14px;
- color: #888;
- padding-left: 20px;
-}
-.list {
- padding: 0 0 20px 0;
-}
-.list li {
- margin-top: 20px;
- padding:0 22px;
-}
-
-.dib-wrap {
- font-size: 0;
-}
-
-.dib {
- display: inline-block;
- *display:inline;
- *zoom:1;
-}
-.dib-wrap .dib {
- font-size: 12px;
- letter-spacing: normal;
- word-spacing: normal;
- vertical-align: top;
-}
-.flex {
- display: flex;
- justify-content: space-between;
- flex-wrap: wrap;
-}
-.flex li {
- flex: 1 0 12%;
-}
-.flex .flex-item-last{
- flex: 1 0 62%;
-}
-
-</style>
-</head>
-
-<body>
- <div class="box">
- <div class="bd">
- <ul class="list flex">
- <li class=""><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class=""><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class=""><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class=""><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class=""><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class=""><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class=""><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class=""><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- <li class="dib flex-item-last"><a href="http://www.iyunlu.com/view/" title="һ˿" target="_blank"><img src="http://placebox.es/120/60/67a9e7/ffffff/" alt="ͼƬ" width="120" height="60"></a></li>
- </ul>
- </div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/reference/flex-min-auto-rel.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/reference/flex-min-auto-rel.html
deleted file mode 100644
index 2d3b3b71988..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jieorlin/reference/flex-min-auto-rel.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!doctype html>
-<html>
-<title>flex min-width:auto by yisi</title>
-<link rel="author" title="yisi" href="mailto:50167214@qq.com">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#min-size-auto" />
-<link rel="match" href="flex-min-auto-rel.html">
-<meta name="assert" content="min-width of flex item should equals width of floats elment." />
-<style>
-div{ width:1em; height:50px; background:#39F; border:1px solid red; }
-span{ border:1px solid #000; float:left; height:95%;}
-</style>
-</head>
-
-<body>
-<div><span>FlexibleFlexibleFlexibleFlexibleFlexible</span></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jingke/cssom-view-window-pageXOffset-return-scrollX.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jingke/cssom-view-window-pageXOffset-return-scrollX.html
deleted file mode 100644
index 86ff707fa2b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/jingke/cssom-view-window-pageXOffset-return-scrollX.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSSOM View Test: window pageXOffset attribute attribute must return the value returned by the scrollX attribute</title>
- <link rel="author" title="jingke" href="mailto:jingkewhu@gmail.com">
- <link rel="help" href="https://drafts.csswg.org/cssom-view/#widl-Window-pageXOffset">
- <meta name="flags" content="dom">
- <meta name="assert"
- content="pageXOffset attribute attribute must return the value returned by the scrollX attribute.">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <div id="myDiv"></div>
- <div id="log"></div>
- <script>
- test(function(){
- assert_equals(window.scrollX, window.pageXOffset);
- },
- "window.pageXOffset must equals with window.scrollX");
- </script>
-
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/keynesqu/Flexible-order.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/keynesqu/Flexible-order.html
deleted file mode 100644
index f901716697f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/keynesqu/Flexible-order.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head><title>CSS Test: Change the value of 'order' property</title>
-
-<meta name="assert" content="The order of three should be blue-red-black" />
-
-<link rel="match" href="reference/Flexible-order-ref.html">
-<link rel="author" title="KeynesQu" href="mailto:keynesqu@sohu.com" />
-<link rel="help" href="https://drafts.csswg.org/css3-flexbox/#order-property" />
-
-<style>
-
-.box {
- margin:0 auto;
- background:#CCC;
- border-radius:5px;
- width:600px;
- display:flex;
- flex-flow:row;
-}
-
-.box div {
- text-align:center;
-}
-
-.box .red {
- order:-2;
- flex:0 1 auto;
- width:200px;
- background:#F00;
-}
-.box .blue {
- order:-4;
- flex:0 1 auto;
- width:200px;
- background:#00F;
-}
-.box .black {
- order:-1;
- flex:0 1 auto;
- width:200px;
- background:#000;
- color:#FFF;
-}
-
-
-
-
-</style>
-
-</head>
-
-<body>
-
-
-<!-- FLEX CONTAINER -->
-<div class="box">
- <div class="red">A</div>
- <div class="blue">B</div>
- <div class="black">C</div>
-</div>
-
-
-
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/keynesqu/reference/Flexible-order-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/keynesqu/reference/Flexible-order-ref.html
deleted file mode 100644
index 6fee6279d65..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/keynesqu/reference/Flexible-order-ref.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head><title>CSS Test: Change the value of 'order' property</title>
-
-<link rel="author" title="KeynesQu" href="mailto:keynesqu@sohu.com" />
-
-<style>
-
-.box {
- margin:0 auto;
- background:#CCC;
- border-radius:5px;
- width:600px;
-}
-
-.box div {
- margin:0;
- width:200px;
- float:left;
- text-align:center;
-}
-
-.box .red {
- background:#F00;
-}
-.box .blue {
- background:#00F;
-}
-.box .black {
- color:#FFF;
- background:#000;
-}
-
-
-
-
-</style>
-
-</head>
-
-<body>
-
-
-<!-- FLEX CONTAINER -->
-<div class="box">
- <div class="blue">B</div>
- <div class="red">A</div>
- <div class="black">C</div>
-</div>
-
-
-
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/neo_and_rayi/extensions_to_the_HTMLElement_interface.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/neo_and_rayi/extensions_to_the_HTMLElement_interface.html
deleted file mode 100644
index b03d6087045..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/neo_and_rayi/extensions_to_the_HTMLElement_interface.html
+++ /dev/null
@@ -1,131 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Extensions to the HTMLElement Interface</title>
-<link rel="author" href="http://github.com/wangxiao" title="neo_and_rayi">
-<link rel="help" href="https://drafts.csswg.org/cssom-view/#widl-HTMLElement-offsetParent">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<style>
-#fixed {
- position: fixed;
-}
-
-#none-element {
- display:none;
-}
-
-#relative-element {
- position: relative;
-}
-
-#absolute-element {
- position: absolute;
-}
-</style>
-
-</head>
-<body>
-
-<div id="body-element-child"></div>
-
-<div id="relative-element">
- <div id="relative-element-child"></div>
-</div>
-
-<div id="absolute-element">
- <div id="absolute-element-child"></div>
-</div>
-
-<table id="table-element">
- <caption>
- <div id="caption-element-child"></div>
- </caption>
-
- <tbody>
- <tr id="table-element-tr">
- <td id="table-element-td">
- <span id="table-element-child"></span>
- </td>
- </tr>
- </tbody>
-</table>
-
-<div id="none-element">
- <a href="#" id="none-element-child-a"></a>
- <p id="none-element-child-p"></p>
- <video id="none-element-child-video"></video>
- <audio id="none-element-child-audio"></audio>
- <canvas id="none-element-child-canvas"></canvas>
- <svg id="none-element-child-svg"></svg>
-</div>
-
-<div id="fixed">
-</div>
-
-<div id="log"></div>
-<script type="text/javascript">
-var getStyle = window.getComputedStyle;
-var html = document.documentElement;
-var body = document.body;
-var fixed_element = document.getElementById('fixed');
-var none_element = document.getElementById('none-element');
-
-var none_element_child_a = document.getElementById('none-element-child-a');
-var none_element_child_p = document.getElementById('none-element-child-p');
-var none_element_child_video = document.getElementById('none-element-child-video');
-var none_element_child_audio = document.getElementById('none-element-child-audio');
-var none_element_child_canvas = document.getElementById('none-element-child-canvas');
-var none_element_child_svg = document.getElementById('none-element-child-svg');
-
-var relative_element = document.getElementById('relative-element');
-var absolute_element = document.getElementById('absolute-element');
-var td_element = document.getElementsByTagName('td')[0];
-
-var body_element_child = document.getElementById('body-element-child');
-var relative_element_child = document.getElementById('relative-element-child');
-var absolute_element_child = document.getElementById('absolute-element-child');
-var table_element_child = document.getElementById('table-element-child');
-
-var caption_element_child = document.getElementById('caption-element-child');
-var table_element_tr = document.getElementById('table-element-tr');
-var table_element = document.getElementById('table-element');
-
-test(function() {
- assert_equals(html.offsetParent,null);
- assert_equals(body.offsetParent,null);
- assert_equals(fixed_element.offsetParent,null);
- assert_equals(none_element.offsetParent,null);
- assert_equals(none_element_child_a.offsetParent,null);
- assert_equals(none_element_child_p.offsetParent,null);
- assert_equals(none_element_child_video.offsetParent,null);
- assert_equals(none_element_child_audio.offsetParent,null);
- assert_equals(none_element_child_canvas.offsetParent,null);
- assert_equals(none_element_child_svg.offsetParent,null);
-}, "Valid the algorithm rule of offsetParent check step 1",
-{ assert: "The offsetParent attribute algorithm rule checking passed!" }
-);
-
-test(function() {
- assert_equals(body_element_child.offsetParent,body);
- assert_equals(window.getComputedStyle(relative_element).position,'relative');
- assert_equals(relative_element_child.offsetParent,relative_element);
- assert_equals(window.getComputedStyle(absolute_element).position,'absolute');
- assert_equals(absolute_element_child.offsetParent,absolute_element);
- assert_equals(window.getComputedStyle(td_element).position,'static');
- assert_equals(table_element_child.offsetParent,td_element);
- assert_equals(window.getComputedStyle(table_element_tr).position,'static');
- assert_equals(table_element_tr.offsetParent,table_element);
- assert_equals(window.getComputedStyle(caption_element_child).position,'static');
- assert_equals(caption_element_child.offsetParent,table_element);
- assert_equals(window.getComputedStyle(td_element).position,'static');
- assert_equals(td_element.offsetParent,table_element);
-}, "Valid the algorithm rule of offsetParent check step 2",
-{ assert: "The offsetParent attribute algorithm rule checking passed!" }
-);
-
-</script>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/flex-align-items-center.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/flex-align-items-center.html
deleted file mode 100644
index d34d1c97fd6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/flex-align-items-center.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Flex-basis Test</title>
- <link rel="author" title="Chunsheng Zhang" href="mailto:zhangcs_423@163.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-flexbox/#alignment" />
- <link rel="match" href="reference/flex-align-items-center-ref.html" />
- <meta name="assert" content="flex items center" />
- <style type="text/css">
- #container {
- display: flex;
- justify-content: center;
- align-items: center;
- border: 5px solid green;
- width: 600px;
- height: 200px;
- padding: 5px;
- border-radius: 3px;
- position: absolute;
- top: 70px;
- left: 10px;
- }
- #container > div {
- border: 2px dotted blue;
- background: green;
- border-radius: 3px;
- padding: 10px;
- width: 30px;
- height: 40px;
- text-align: center;
- flex: none;
- }
- #fail-flag {
- position: absolute;
- top: 162px;
- left: 272px;
- width: 92px;
- height: 36px;
- background: red;
- }
- </style>
- </head>
- <body>
- <p>This case tests that flex items center</p>
- <p>The test passes if there is no red</p>
- <div id="fail-flag"></div>
- <section id="container">
- <div></div>
- <div></div>
- <div></div>
- </section>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/flex-items-flexibility.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/flex-items-flexibility.html
deleted file mode 100644
index ee8fdddc6c2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/flex-items-flexibility.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Flex-basis Test</title>
- <link rel="author" title="Chunsheng Zhang" href="mailto:zhangcs_423@163.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flexibility" />
- <link rel="match" href="reference/flex-items-flexibility-ref.html" />
- <meta name="assert" content="flex items flexibility" />
- <style type="text/css">
- #container {
- display: flex;
- justify-content: center;
- align-items: center;
- border: 5px solid green;
- width: 600px;
- height: 200px;
- padding: 5px;
- border-radius: 3px;
- position: absolute;
- top: 70px;
- left: 10px;
- }
- div {
- padding: 10px;
- width: 30px;
- height: 40px;
- text-align: center;
- flex: 1 0 auto;
- }
- #flex {
- border: 2px dotted blue;
- background: green;
- border-radius: 3px;
- flex: 2 0 auto;
- }
- #fail-flag {
- position: absolute;
- padding: 10px;
- top: 150px;
- left: 183px;
- width: 254px;
- height: 40px;
- background: red;
- }
- </style>
- </head>
- <body>
- <p>This case tests that flex items flexibility</p>
- <p>The test passes if there is no red</p>
- <div id="fail-flag"></div>
- <section id="container">
- <div></div>
- <div id="flex"></div>
- <div></div>
- </section>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/readme.txt b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/readme.txt
deleted file mode 100644
index c5ca4d2ffd5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/readme.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-Test the Web Forward
-将你的测试和参考文件添加到代码库中
-$ cd [path to repo]/test/contributors/ttwf/yourName/incoming
-$ hg add ttwf-reftest-tutorial-001.html
-$ hg add reference
-$ hg commit -m "TTWF reftest tutorial"
-$ hg push
-merge
-$ hg pull
-$ hg merge
-$ hg commit -m "Merge"
-$ hg push
-整合反馈意见并将测试移到submitted目录
-cd [path to repo]/test/contributors/ttwf/yourName
-$ hg pull -u
-$ hg merge
-$ hg commit -m "merging"
-$ hg mv incoming/ttwf-reftest-tutorial-001.html submitted/ttwf-reftest-tutorial-001.html
-$ hg mv incoming/reference/ttwf-reftest-tutorial-ref.html submitted/reference/ttwf-reftest-tutorial-ref.html
-$ hg commit -m "moved the TTWF reftest tutorial to the submitted folder"
-$ hg push
-基本命令:
-hg pull (gets the latest changes from the CSSWG Test repo)
-To update after pull, use: hg pull -u (alleviates need to do hg update)
-hg update (applies the latest changes pulled to your local repo)
-hg status (displays list of locally changed files)
-hg add (stages a new or modified local file for commit)
-hg remove (stages the removal of a local file for commit)
-hg merge (merges local changes with updates pulled from CSSWG Test repo)
-hg commit (commits local changes to local repository)
-To include commit message, use: hg commit -m "Commit message here"
-hg push (pushes local changes to the CSSWG Test repository)
-用户想更新本地的代码库:
-hg pull -u (pulls and applies latest changes from CSSWG repo to local repo)
-用户想推送本地的变化:
-hg status (check which files are stages for commit)
-hg add fileName (stages file for commit, repeat for each file)
-hg status (confirm all files are stages for commit)
-hg commit -m "Commit message here" (Commit to local repo)
-hg push (pushes locally committed changes to CSSWG Test repo)
-2012-10-21
-ttwfbj@gmail.com
-public-html-testsuite@w3.org \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/reference/flex-align-items-center-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/reference/flex-align-items-center-ref.html
deleted file mode 100644
index 5eee97260e1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/reference/flex-align-items-center-ref.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Flex-basis Test</title>
- <link rel="author" title="Chunsheng Zhang" href="mailto:zhangcs_423@163.com" />
- <style type="text/css">
- #container {
- display: flex;
- justify-content: center;
- align-items: center;
- border: 5px solid green;
- width: 600px;
- height: 200px;
- padding: 5px;
- border-radius: 3px;
- position: absolute;
- top: 70px;
- left: 10px;
- }
- #a {
- top: 150px;
- left: 230px;
- border: 2px dotted blue;
- background: green;
- border-radius: 3px;
- padding: 10px;
- width: 30px;
- height: 40px;
- text-align: center;
- flex: none;
- }
- #b {
- top: 150px;
- left: 283px;
- border: 2px dotted blue;
- background: green;
- border-radius: 3px;
- padding: 10px;
- width: 30px;
- height: 40px;
- text-align: center;
- flex: none;
- }
- #c {
- top: 150px;
- left: 336px;
- border: 2px dotted blue;
- background: green;
- border-radius: 3px;
- padding: 10px;
- width: 30px;
- height: 40px;
- text-align: center;
- flex: none;
- }
- </style>
- </head>
- <body>
- <p>This case tests that flex items center</p>
- <p>The test passes if there is no red</p>
- <section id="container">
- </section>
- <div id="a" style="position:absolute"></div>
- <div id="b" style="position:absolute"></div>
- <div id="c" style="position:absolute"></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/reference/flex-items-flexibility.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/reference/flex-items-flexibility.html
deleted file mode 100644
index 99399e7491e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/peter/reference/flex-items-flexibility.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Flex-basis Test</title>
- <link rel="author" title="Chunsheng Zhang" href="mailto:zhangcs_423@163.com" />
- <style type="text/css">
- #container {
- display: flex;
- justify-content: center;
- align-items: center;
- border: 5px solid green;
- width: 600px;
- height: 200px;
- padding: 5px;
- border-radius: 3px;
- position: absolute;
- top: 70px;
- left: 10px;
- }
- div {
- padding: 10px;
- width: 30px;
- height: 40px;
- text-align: center;
- flex: 1 0 auto;
- }
- #flex {
- border: 2px dotted blue;
- background: green;
- border-radius: 3px;
- flex: 2 0 auto;
- position: absolute;
- top: 70px;
- left: 160px;
- width: 254px;
- }
- </style>
- </head>
- <body>
- <p>This case tests that flex items flexibility</p>
- <p>The test passes if there is no red</p>
- <section id="container">
- <div></div>
- <div id="flex"></div>
- <div></div>
- </section>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/phuangce/flex-margin-no-collapse.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/phuangce/flex-margin-no-collapse.html
deleted file mode 100755
index f20b8f14086..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/phuangce/flex-margin-no-collapse.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Flexible Box Test: flex item margins</title>
- <link rel="author" href="mailto:Ping Huang" href="mailto:phuangce@gmail.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-flexbox">
- <link rel="help" href="http://www.w3.org/TR/css3-flexbox/#item-margins">
- <link rel="match" href="reference/flex-margin-no-collapse-ref.html">
- <meta name="assert" content="The vertical gap between two green boxs should be 100px." />
- <style type="text/css">
- #container {
- display: flex ;
- flex-direction: column;
- position: absolute;
- top: 100px;
- left: 10px;
- width: 200px;
- height: 300px;
- }
-
- .box {
- width: 100px;
- height: 100px;
- background-color: green;
- }
-
- #box1 {
- margin: 50px 0;
- }
-
- #box2 {
- margin: 50px 0;
- }
-
- #red-box {
- position: absolute;
- top: 350px;
- left: 10px;
- width: 100px;
- height: 100px;
- background-color: red;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there are two green boxes and no red.</p>
- <div id="red-box"></div>
- <div id="container">
- <div id="box1" class="box"></div>
- <div id="box2" class="box"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/phuangce/reference/flex-margin-no-collapse-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/phuangce/reference/flex-margin-no-collapse-ref.html
deleted file mode 100755
index aea42952665..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/phuangce/reference/flex-margin-no-collapse-ref.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Flexible Box Reference File</title>
- <link rel="author" href="mailto:Ping Huang" href="mailto:phuangce@gmail.com" />
- <style type="text/css">
- #container {
- position: absolute;
- top: 100px;
- left: 10px;
- width: 200px;
- height: 300px;
- }
-
- .box {
- width: 100px;
- height: 100px;
- background-color: green;
- }
-
- #box1 {
- margin: 50px 0;
- }
-
- #box2 {
- margin: 100px 0;
- }
-
- </style>
-</head>
-<body>
- <p>The test passes if there are two green boxes and no red.</p>
- <div id="container">
- <div id="box1" class="box"></div>
- <div id="box2" class="box"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-repeat-round.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-repeat-round.html
deleted file mode 100644
index d6e6e681030..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-repeat-round.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Backgrounds and Borders Test: 'border-image-repeat' set as 'round'</title>
- <link rel="author" title="Ren Jing" href="mailto:reni2046@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#border-images">
- <link rel="match" href="reference/border-image-repeat-round-ref.html">
- <meta name="assert" content="diamonds in corners should be red, and other diamonds should be orange, it should be 4 orange diamonds on each side.">
- <style type="text/css">
- .container {
- border: double red 1em;
- border-image: url("support/border.png") 27 round;
- height:64px;
- width:64px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if diamonds in corners are red, and other diamonds are orange, there are 4 orange diamonds on each side.</p>
- <div class="container"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-round-and-stretch.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-round-and-stretch.html
deleted file mode 100644
index 26f46faa7d7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-round-and-stretch.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Backgrounds and Borders Test: 'border-image' set as 'round' and 'stretch' </title>
- <link rel="author" title="Ren Jing" href="mailto:reni2046@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#border-images">
- <link rel="match" href="reference/border-image-round-and-stretch-ref.html">
- <meta name="assert" content="orange diamonds on top and bottom border should be repeated 12 times, and orange diamonds on left and right border should be stretched, diamonds in corners should be red, and other diamonds should be orange.">
- <style type="text/css">
- .container {
- border: double red 1em;
- border-image: url("support/border.png") 27 round stretch;
- height:77px;
- width:192px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if orange diamonds on top and bottom border repeat 12 times, and orange diamonds on left and right border are stretched, diamonds in corners are red, and other diamonds are orange.</p>
- <div class="container"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-slice-percentage.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-slice-percentage.html
deleted file mode 100644
index 5ef9ff0d1df..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/border-image-slice-percentage.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Backgrounds and Borders Test: 'border-image-slice' set by percentage</title>
- <link rel="author" title="Ren Jing" href="mailto:reni2046@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#border-images">
- <link rel="match" href="reference/border-image-slice-percentage-ref.html">
- <meta name="assert" content="diamonds in corners should be red, and other diamonds should be orange, it should be 4 orange diamonds on each side.">
- <style type="text/css">
- .container {
- border: double red 1em;
- border-image: url("support/border.png") 33.3% round;
- height:64px;
- width:64px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if diamonds in corners are red, and other diamonds are orange, there are 4 orange diamonds on each side.</p>
- <div class="container"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-repeat-round-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-repeat-round-ref.html
deleted file mode 100644
index bfc2efbfa0b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-repeat-round-ref.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Reference File</title>
- <link rel="author" title="Ren Jing" href="mailto:reni2046@gmail.com">
- <style type="text/css">
- </style>
-</head>
-<body>
- <p>The test passes if diamonds in corners are red, and other diamonds are orange, there are 4 orange diamonds on each side.</p>
- <div class="container">
- <img class="result-image" alt="border-image-round-result" src="../support/border-image-round-result.png"></img>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-round-and-stretch-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-round-and-stretch-ref.html
deleted file mode 100644
index 39a88e954c5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-round-and-stretch-ref.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Reference File</title>
- <link rel="author" title="Ren Jing" href="mailto:reni2046@gmail.com">
- <style type="text/css">
- .result-image {
- width:224px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if orange diamonds on top and bottom border repeat 12 times, and orange diamonds on left and right border are stretched, diamonds in corners are red, and other diamonds are orange.</p>
- <div class="container">
- <img class="result-image" alt="border-image-result" src="../support/borderresult.png"></img>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-slice-percentage-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-slice-percentage-ref.html
deleted file mode 100644
index bfc2efbfa0b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/reference/border-image-slice-percentage-ref.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Reference File</title>
- <link rel="author" title="Ren Jing" href="mailto:reni2046@gmail.com">
- <style type="text/css">
- </style>
-</head>
-<body>
- <p>The test passes if diamonds in corners are red, and other diamonds are orange, there are 4 orange diamonds on each side.</p>
- <div class="container">
- <img class="result-image" alt="border-image-round-result" src="../support/border-image-round-result.png"></img>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/border-image-round-result.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/border-image-round-result.png
deleted file mode 100644
index 2f9d54ce3c2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/border-image-round-result.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/border.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/border.png
deleted file mode 100644
index 7a657391d65..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/border.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/borderresult.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/borderresult.png
deleted file mode 100644
index 9e2afc348e7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/renjing/support/borderresult.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tang,shaofeng/border-image-repeat_repeatnegx_none_50px.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tang,shaofeng/border-image-repeat_repeatnegx_none_50px.html
deleted file mode 100644
index 6460aacd365..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tang,shaofeng/border-image-repeat_repeatnegx_none_50px.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<html>
-<head>
- <title> CSS Background Border Test: "border-image-repeat:repeat-x;height:200px;width:200px;border-image-source:none;border-image-width:50px" on test div</title>
- <link rel="author" title="Intel" href="http://www.intel.com" />
- <link rel="help" href="http://www.w3.org/TR/2012/WD-css3-background-20120214/#the-border-image-repeat" />
- <meta name="assert" content="Check if 'border-image-repeat:repeat-x;height:200px;width:200px;border-image-source:none;border-image-width:50px' work on div" />
- <script type="text/javascript" src="/resources/testharness.js"></script>
- <script type="text/javascript" src="/resources/testharnessreport.js"></script>
- <style>
- #test{
- height: 30px;
- width: 80px;
- padding: 5px;
- border: 5px solid black;
- margin: 5px;
- background: blue;
- }
- </style>
-</head>
-<body>
- <div id="log"></div>
- <div id="test"></div>
- <script type="text/javascript">
- var div = document.querySelector("#test");
- var t = async_test(document.title, { timeout: 500 });
- t.step(function () {
- div.style[headProp("border-image-repeat")] = "repeat-x";
- div.style[headProp("height")] = "200px";
- div.style[headProp("width")] = "200px";
- div.style[headProp("border-image-source")] = "none";
- div.style[headProp("border-image-width")] = "50px";
- var propvalue = GetCurrentStyle("border-image-repeat");
- var prop = propvalue.indexOf("repeat-x")!=-1;
- assert_false(prop, "The element border-image-repeat can be repeat-x")
- var height = GetCurrentStyle("height");
- prop = height.indexOf("200px")!=-1;
- assert_true(prop, "The element height should be 200px");
- var width = GetCurrentStyle("width");
- prop = width.indexOf("200px")!=-1;
- assert_true(prop, "The element width should be 200px");
- var borderImageSource = GetCurrentStyle("border-image-source");
- prop = borderImageSource.indexOf("none")!=-1;
- assert_true(prop, "The element border-image-source should be none");
- var borderImageWidth = GetCurrentStyle("border-image-width");
- prop = borderImageWidth.indexOf("50px")!=-1;
- assert_true(prop, "The element border-image-width should be 50px");
- });
- t.done();
-
- function GetCurrentStyle(prop) {
- try
- {
- var div = document.querySelector("#test"); //object
- prop = prop.replace(/([-][a-z])/g, function ($1) { return $1.toUpperCase().replace("-","") });
- var headprop = headProp(prop);
- var fixprop = getComputedStyle(div)[headprop];
- if (!fixprop)
- {return "";}
- return fixprop;
- }
- catch(e)
- {
- return "";
- }
-}
-
-//
-function headProp(s) {
- var div = document.querySelector("#test");
- if (s in div.style) {
- return s;
- }
- s = s.replace(/([-][a-z])/g, function ($1) { return $1.toUpperCase().replace("-", "") });
- if (s in div.style) {
- return s;
- }
- s = s[0].toUpperCase() + s.slice(1);
- var prefixes = ["ms", "Moz", "moz", "webkit", "O"];
- for (var i = 0; i < prefixes.length; i++) {
- if ((prefixes[i] + s) in div.style) {
- return prefixes[i] + s;
- }
- }
- return s;
-}
-
- </script>
-</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/css-border-radius-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/css-border-radius-001.html
deleted file mode 100644
index 1717f677f38..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/css-border-radius-001.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS border-radius Test</title>
- <link rel="author" title="tmd" href="mailto:weisong4413@126.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-border-radius">
- <link rel="match" href="reference/css-border-radius-ref-001.html">
- <meta name="assert" content="">
- <meta name="flag" content="border-radius">
- <style type="text/css">
- .redSquare{
- position: absolute;
- top:50px;
- left:50px;
- width: 100px;
- height: 100px;
- background-color:rgba(255, 0, 0, 1);
- }
- .greenSquare {
- position: absolute;
- top:50px;
- left:50px;
- width: 100px;
- height: 100px;
- border-radius: 50%;
- background-color:rgba(0, 255, 0, 1);
- }
- .container {
- position: absolute;
- }
- </style>
-</head>
-<body>
- <p>The test passes if you the green is inscribed circle of the red square.</p>
- <div class="container">
- <!-- This is the square that has a inscribed circle if the test passes -->
- <div id="red" class="redSquare"></div>
- <!-- This is the square being tested with the radius-->
- <div id="green" class="greenSquare"></div>
- </div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/css-border-radius-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/css-border-radius-002.html
deleted file mode 100644
index 17d0dd4dd86..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/css-border-radius-002.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS border-radius Test</title>
- <link rel="author" title="tmd" href="mailto:weisong4413@126.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-border-radius">
- <link rel="match" href="reference/css-border-radius-ref-002.html">
- <meta name="assert" content="">
- <meta name="flag" content="border-radius">
- <style type="text/css">
- .redSquare{
- position: absolute;
- top: 64px;
- left: 64px;
- width: 71px;
- height: 71px;
- background-color:rgba(255, 0, 0, 1);
- }
- .greenSquare {
- position: absolute;
- top:50px;
- left:50px;
- width: 100px;
- height: 100px;
- border-radius: 50%;
- background-color:rgba(0, 255, 0, 1);
- }
- .container {
- position: absolute;
- }
- </style>
-</head>
-<body>
- <p>The test passes if you the redinscribedsquareis in green circle.</p>
- <div class="container">
- <!-- This is the square being tested with the radius-->
- <div id="green" class="greenSquare"></div>
- <!-- This is the circle that has a inscribed square if the test passes -->
- <div id="red" class="redSquare"></div>
- </div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/readme.txt b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/readme.txt
deleted file mode 100644
index 3bef0f0d2e8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-Test the Web Forward \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-001.html
deleted file mode 100644
index 0645756057b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-001.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS border-radius Test</title>
- <style type="text/css">
- .redSquare{
- position: absolute;
- top:50px;
- left:50px;
- width: 100px;
- height: 100px;
- background-color:rgba(255, 0, 0, 1);
- }
- .greenSquare {
- position: absolute;
- top:50px;
- left:50px;
- width: 100px;
- height: 100px;
- /*border-radius: 50%;*/
- background:url(y.png);
- }
- .container {
- position: absolute;
- }
- </style>
-</head>
-<body>
- <p>The test passes if you the green is inscribed circle of the red square.</p>
- <div class="container">
- <!-- This is the square that has a inscribed circle if the test passes -->
- <div id="red" class="redSquare"></div>
- <!-- This is the square being tested with the radius-->
- <div id="green" class="greenSquare"></div>
- </div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-002.html
deleted file mode 100644
index 1b3a6929f6d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/css-border-radius-ref-002.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS border-radius Test</title>
- <style type="text/css">
- .redSquare{
- position: absolute;
- top: 64px;
- left: 64px;
- width: 71px;
- height: 71px;
- background-color:rgba(255, 0, 0, 1);
- }
- .greenSquare {
- position: absolute;
- top:50px;
- left:50px;
- width: 100px;
- height: 100px;
- /*border-radius: 50%;*/
- background:url(y.png);
- }
- .container {
- position: absolute;
- }
- </style>
-</head>
-<body>
- <p>The test passes if you the redinscribedsquareis in green circle.</p>
- <div class="container">
- <!-- This is the square being tested with the radius-->
- <div id="green" class="greenSquare"></div>
- <!-- This is the circle that has a inscribed square if the test passes -->
- <div id="red" class="redSquare"></div>
- </div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/y.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/y.png
deleted file mode 100644
index 4e402fe2ee4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/tmd/reference/y.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-boxsizing.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-boxsizing.html
deleted file mode 100644
index 11e94aef7b0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-boxsizing.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>flexbox | flex item with percentage size</title>
-<link rel="author" href="http://shaofei.name" title="winter">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-items">
-<style>
-#test
-{
- background: blue;
- display: flex;
- height:300px;
-}
-#test>div.flex {
- width: 100px;
- background:red;
-}
-#test>div.fixed
-
-{
- box-sizing:border-box;
- border:solid green 50px;
- height: 300px;
- flex:1;
- background:blue;
-}
-
-
-</style>
-</head>
-<body>
-
-<div id="test">
- <div class="fixed">
-
- </div>
- <div class="flex">
- </div>
-</div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-childmargin.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-childmargin.html
deleted file mode 100644
index 0c80876eaa1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-childmargin.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>flexbox | flex item with percentage size</title>
-<link rel="author" href="http://shaofei.name" title="winter">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-items">
-<style>
-#test
-{
- background: blue;
- display: flex;
- height:300px;
-}
-#test>div.flex {
- width: 100px;
- background:red;
-}
-#test>div.fixed
-{
- height: 300px;
- flex:1;
- background:red;
-}
-#test p
-{
- margin:200px 0 0 0;
-}
-
-</style>
-</head>
-<body>
-
-<div id="test">
- <div class="fixed">
- <p style="width:100px;height:100px;background:orange;">
- a
- </p>
- </div>
- <div class="flex">
- <p style="width:100px;height:100px;background:green;">
- b
- </p>
- </div>
-</div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-flex-prescation.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-flex-prescation.html
deleted file mode 100644
index 304f65b6c43..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-flex-prescation.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>flexbox | flex item with percentage size</title>
-<link rel="author" href="http://shaofei.name" title="winter">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-items">
-<style>
-#test
-{
- background: blue;
- display: flex;
- height:300px;
- width:101px;
-}
-p {
- flex:1;
- background:red;
- flex-direction:row;
- magin:0 0 0 0;
-}
-</style>
-</head>
-<body>
-
-<div id="test">
- <p style="background:green;">damer</p>
- <p>damer</p>
-</div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-margin.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-margin.html
deleted file mode 100644
index 93c93f0de2a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-margin.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>flexbox | flex item with percentage size</title>
-<link rel="author" href="http://shaofei.name" title="winter">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-items">
-<style>
-#test
-{
- background: blue;
- display: flex;
- height:300px;
-}
-#test>div.flex {
- width: 100px;
- background:red;
- magin-right:30px;
-}
-#test>div.fixed
-{
- height: 300px;
- margin-left:30px;
- flex:1;
- background:red;
-}
-
-
-</style>
-</head>
-<body>
-
-<div id="test">
- <div class="fixed">
-
- </div>
- <div class="flex">
- </div>
-</div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-padding.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-padding.html
deleted file mode 100644
index e39625c1e70..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-padding.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>flexbox | flex item with percentage size</title>
-<link rel="author" href="http://shaofei.name" title="winter">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-items">
-<style>
-#test
-{
- background: blue;
- display: flex;
- height:300px;
-}
-#test>div.flex {
- width: 100px;
- padding-top:200px;
- background:red;
-}
-#test>div.fixed
-{
- height: 300px;
- flex:1;
- background:red;
-}
-#test p
-{
- margin:0 0 0 0;
-}
-
-</style>
-</head>
-<body>
-
-<div id="test">
- <div class="fixed">
- <p style="width:100px;height:100px;background:orange;">
- a
- </p>
- </div>
- <div class="flex">
- <p style="width:100px;height:100px;background:green;">
- b
- </p>
- </div>
-</div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-basic.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-basic.html
deleted file mode 100644
index 4e64bff288f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-basic.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>flexbox | flex item with percentage size</title>
-<link rel="author" href="http://shaofei.name" title="winter">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-items">
-<style>
-#test
-{
- background: blue;
- display: flex;
- height:300px;
-}
-p {
- width: 30%;
- background:red;
- flex-direction:row;
-}
-</style>
-</head>
-<body>
-
-<div id="test">
- <div>
- <p>damer</p>
- <p>damer</p>
- </div>
-</div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-cascading.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-cascading.html
deleted file mode 100644
index 90fee0487e7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/winter/flex-flexitem-percentage-cascading.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>flexbox | flex item with percentage size</title>
-<link rel="author" href="http://shaofei.name" title="winter">
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-items">
-<style>
-#test
-{
- background: blue;
- display: flex;
- height:300px;
-}
-#test>div.flex {
- width: 50px;
- background:red;
-}
-#test>div.fixed
-{
- height: 300px;
- flex:1;
- background:red;
-}
-#test p
-{
- margin:0 0 0 0;
-}
-
-</style>
-</head>
-<body>
-
-<div id="test">
- <div class="fixed">
- <p style="width:100%;height:100%;background:orange;">
- a
- </p>
- </div>
- <div class="flex">
- <p style="width:100%;height:100%;background:green;">
- b
- </p>
- </div>
-</div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/background-size-035.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/background-size-035.html
deleted file mode 100644
index 96bf626fb06..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/background-size-035.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Background and Border Test:background-size conflicts with background-attachment</title>
- <link rel="author" title="xiaochun" href="mailto:stenders@163.com">
- <link rel="help" href="https://drafts.csswg.org/css3-background/#background-size">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-size">
- <link rel="match" href="reference/background-size-ref.html">
- <meta name="assert" content="The test passes if we can see the background-image is exactly same as above.">
- <style type="text/css">
- .backgroundSize{
- width:295px;
- height:289px;
-
- background-image:url(bg.jpg);
- background-repeat:no-repeat;
- background-size:cover;
- background-attachment:fixed;
- }
- </style>
-</head>
-<body>
- The image used as background-image is :<br />
- <img src="bg.jpg" />
-
- <p>The test passes if we can see the background-image is exactly same as above.</p>
- <div class="container">
- <!-- This is the box that should only contains an image if the test passes -->
- <div class="backgroundSize">
- </div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/bg.jpg b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/bg.jpg
deleted file mode 100644
index 44181298138..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/bg.jpg
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/reference/background-size-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/reference/background-size-ref.html
deleted file mode 100644
index 55e08dd70d4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaochun/reference/background-size-ref.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Background and Border Test:background-size conflicts with background-attachment</title>
- <link rel="author" title="xiaochun" href="mailto:stenders@163.com">
- <link rel="help" href="https://drafts.csswg.org/css3-background/#background-size">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-size">
- <link rel="match" href="reference/background-size-ref.html">
- <meta name="assert" content="The test passes if we can see the background-image is exactly same as above.">
- <style type="text/css">
- .backgroundSize{
- width:295px;
- height:289px;
-
- background-image:url(../bg.jpg);
- background-repeat:no-repeat;
- }
- </style>
-</head>
-<body>
- The image used as background-image is :<br />
- <img src="../bg.jpg" />
-
- <p>The test passes if we can see the background-image is exactly same as above.</p>
- <div class="container">
- <!-- This is the box that should only contains an image if the test passes -->
- <div class="backgroundSize">
- </div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaoyan.jxy/background-clip_padding-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaoyan.jxy/background-clip_padding-box.html
deleted file mode 100644
index 159b4363064..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaoyan.jxy/background-clip_padding-box.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Backgrounds and Borders Test: background-clip_border-box</title>
- <link rel="author" title="Xiaoyan Jiang" href="mailto:dajiangxiaoyan@126.com">
- <link rel="help" href="http://www.w3.org/TR/css3-transforms/#transform-property">
- <link rel="help" href="additional spec link">
- <link rel="match" href="reference/background_clip_padding-box.html">
- <meta name="assert" content="Test passes if border is blue and dotted without red background">
- <style type="text/css">
- /* Positioned container allows for the self-describing statement to still
- be visible in the case of failure */
- .container {
- position: absolute;
- }
- .test {
- background-color: red;
- height: 130px;
- left: 5px;
- top: 5px;
- width: 130px;
- border: blue dotted 5px ;
- position: absolute;
- background-clip: padding-box;
- }
-
-
- </style>
-</head>
-<body>
-<p>Test passes if border is blue and dotted without red background </p>
- <div class="container">
- <div class="test"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaoyan.jxy/reference/background_clip_padding-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaoyan.jxy/reference/background_clip_padding-box.html
deleted file mode 100644
index f8022a6638f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/xiaoyan.jxy/reference/background_clip_padding-box.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Backgrounds and Borders Test: background-clip_border-box</title>
- <style type="text/css">
- /* Positioned container allows for the self-describing statement to still
- be visible in the case of failure */
- .container {
- position: absolute;
- }
- .ref {
- background-color: red;
- height: 130px;
- left: 10px;
- top: 10px;
- width: 130px;
- position: absolute;
- }
-
- .ref1 {
- height: 130px;
- left: 5px;
- top: 5px;
- width: 130px;
- position: absolute;
- border: blue dotted 5px ;
- }
-
- </style>
-</head>
-<body>
-<p>Test passes if border is blue and dotted without red background</p>
- <div class="container">
- <div class="ref"></div>
- <div class="ref1"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/css-backgrounds-sizingimages-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/css-backgrounds-sizingimages-001.html
deleted file mode 100644
index 07db4647490..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/css-backgrounds-sizingimages-001.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Sizing Images Test: the background-size property</title>
- <link rel="author" title="yuhong" href="mailto:hello.hyu@gmail.com">
- <link rel="match" href="reference/css-backgrounds-sizingimages-001-ref.html">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-size">
- <link rel="assert" content="The background image should not repeat in the horizontal direction, while repeating 3 times in the vertical direction. Each image should be 200px width and 200px height">
-
- <style type="text/css">
-
- .imagebox {
- width:400px;
- height:600px;
- background: url(support/test.png);
-
- background-size:50% 30%;
- background-repeat:no-repeat round;
-
- }
- </style>
-</head>
-<body>
- <p>The background image should not repeat in the horizontal direction, while repeating 3 times in the vertical direction. Each image should be 200px width and 200px height</p>
- <div class="container">
- <div class="imagebox"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/reference/css-backgrounds-sizingimages-001-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/reference/css-backgrounds-sizingimages-001-ref.html
deleted file mode 100644
index 3ad3db91b3f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/reference/css-backgrounds-sizingimages-001-ref.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Sizing Images Test Reference File</title>
- <link rel="author" title="yuhong" href="mailto:hello.hyu@gmail.com">
- <link rel="match" href="reference/css-backgrounds-sizingimages-001-ref.html">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-size">
- <link rel="assert" content="The background image should not repeat in the horizontal direction, while repeating 3 times in the vertical direction. Each image should be 200px width and 200px height">
-
- <style type="text/css">
-
- .imagebox {
- width:200px;
- height:600px;
- background: url(../support/test.png);
-
-
- }
- </style>
-</head>
-<body>
- <p>The background image should not repeat in the horizontal direction, while repeating 3 times in the vertical direction. Each image should be 200px width and 200px height</p>
- <div class="container">
- <div class="imagebox"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/support/test.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/support/test.png
deleted file mode 100644
index f755e563aae..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/yuhong/support/test.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhangxiaochong/box-shadow-outset-without-border-radius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhangxiaochong/box-shadow-outset-without-border-radius.html
deleted file mode 100644
index 9f213541727..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhangxiaochong/box-shadow-outset-without-border-radius.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Backgrounds and Borders Test: box-shadow</title>
- <link rel="author" title="Zhang Xiaochong" href="mailto:joy.xczhang@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-box-shadow">
- <link rel="match" href="reference/box-shadow-outset-without-border-radius.html">
- <meta name="assert" content="box-shadow should show shadow.">
- <style type="text/css">
- .container {
- position: relative;
- }
- .container div {
- position: absolute;
- height: 150px;
- width: 150px;
- }
- .container .test {
- box-shadow: red 10px 10px;
- left: 0;
- top: 0;
- }
- .container .ref {
- background-color: green;
- left: 10px;
- top: 10px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a filled green square and no red.</p>
- <div class="container">
- <div class="test"></div>
- <div class="ref"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhangxiaochong/reference/box-shadow-outset-without-border-radius.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhangxiaochong/reference/box-shadow-outset-without-border-radius.html
deleted file mode 100644
index 2bca4c6961b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhangxiaochong/reference/box-shadow-outset-without-border-radius.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Reference File</title>
- <link rel="author" title="Zhang Xiaochong" href="mailto:joy.xczhang@gmail.com">
- <style type="text/css">
- .container {
- position: relative;
- }
- .ref {
- background-color: green;
- height: 150px;
- left: 10px;
- position: absolute;
- top: 10px;
- width: 150px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a filled green square and no red.</p>
- <div class="container">
- <div class="ref"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/border-radius-clipping.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/border-radius-clipping.html
deleted file mode 100644
index efa0c2989f4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/border-radius-clipping.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Border radius clipping</title>
- <link rel="author" title="zhouli" href="mailto:liz@oupeng.com">
- <link rel="help" href="http://www.w3.org/TR/css3-background/#corner-clipping" />
- <link rel="match" href="reference/border-radius-clipping-ref.html">
- <meta name="assert" content="When set with 'overflow: hidden', outer container should clip background of an element insides at the corners. " />
- <style>
- #parent{
- border-radius: 15px;
- border: 1px solid blue;
- overflow: hidden;
- width: 300px;
- height: 30px;
- }
- #son{
- background-color: green;
- width: 300px;
- height: 30px;
- }
- #dummy {
- border-radius: 5000em;
- height: 10000em;
- overflow: hidden;
- width: 10000em;
- }
- </style>
-</head>
-<body>
-<div id="parent">
- <div id="son"></div>
-</div>
-<div id="dummy">
- This should not appear if browser supports border-radius
-</div>
-<script>
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/flexible-box-float.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/flexible-box-float.html
deleted file mode 100644
index bc105fd88d6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/flexible-box-float.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>flexible box flex item float effect</title>
- <link rel="author" title="zhouli" href="mailto:liz@oupeng.com">
- <link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-containers" />
- <link rel="match" href="reference/flex-box-float-ref.html">
- <meta name="assert" content="float has no effect on flex items" />
- <style>
- #myDiv {
- display: flex;
- flex-flow: row wrap;
- align-content: space-between;
- position: relative;
- }
- #myDiv p{
- width: 300px;
- height: 30px;
- margin: 0;
- }
- #first-p{
- background-color: green;
- float: right;
- }
- #second-p{
- background-color: blue;
- }
- #myDiv #fail-flag{
- width: 600px;
- background-color: red;
- position: absolute;
- left: 0;
- top: 0;
- z-index: -1;
- }
- </style>
-</head>
-<body>
- <p>'float' have no effect on a flex item.</p>
- <p>The test passes if there is a green square, a blue square and no red square.</p>
-<div id="myDiv">
- <p id="first-p">&nbsp;</p><p id="second-p">&nbsp;</p><p id="fail-flag">&nbsp;</p>
-</div>
-<script>
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/reference/border-radius-clipping-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/reference/border-radius-clipping-ref.html
deleted file mode 100644
index e524aff19d0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/reference/border-radius-clipping-ref.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Border radius clipping</title>
- <link rel="author" title="zhouli" href="mailto:liz@oupeng.com">
- <style>
- #parent{
- border-radius: 15px;
- border: 1px solid blue;
- overflow: hidden;
- width: 300px;
- height: 30px;
- background-color: green;
- }
- #son{
- width: 300px;
- height: 30px;
- }
- </style>
-</head>
-<body>
-<div id="parent">
- <div id="son"></div>
-</div>
-<script>
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/reference/flex-box-float-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/reference/flex-box-float-ref.html
deleted file mode 100644
index 726257dbf85..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_bj/zhouli/reference/flex-box-float-ref.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>flexible box flex item float effect</title>
- <link rel="author" title="zhouli" href="mailto:liz@oupeng.com">
- <style>
- #myDiv{
- position: relative;
- }
- #myDiv p{
- width: 300px;
- height: 30px;
- display: inline-block;
- margin: 0;
- }
- #first-p{
- background-color: green;
- }
- #second-p{
- background-color: blue;
- }
- #myDiv #fail-flag{
- width: 600px;
- background-color: red;
- position: absolute;
- left: 0;
- top: 0;
- z-index: -1;
- }
- </style>
-</head>
-<body>
- <p>'float' have no effect on a flex item.</p>
- <p>The test passes if there is a green square, a blue square and no red square.</p>
-<div id="myDiv">
- <p id="first-p">&nbsp;</p><p id="second-p">&nbsp;</p><p id="fail-flag">&nbsp;</p>
-</div>
-<script>
-</script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/box-sizing-border-box-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/box-sizing-border-box-001.html
deleted file mode 100644
index 14fd6a56c5f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/box-sizing-border-box-001.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<title>box-sizing: border-box all elements sized with percentages</title>
-<link rel="author" title="Justin Hill" href="http://www.justin-hill.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#box-sizing">
-<link rel="match" href="ref/box-sizing-border-box-001-ref.html">
-<meta name="assert" content="Test checks that border-sizing:border-box makes element's width distance from left border edge to right border edge when the container's width is specified in percentage.">
-<style>
- .container {
- width:50%;
- background: red;
-
- }
- .child {
- box-sizing:border-box;
- color:white;
- width:50%;
- background:green;
- border: 10px black solid;
- float: left;
- text-align: center;
- }
-</style>
-<body>
- <p> Test passes if green boxes are side by side with no red visible.</p>
- <div class="container">
- <div class="child">
- <p>left</p>
- </div>
- <div class="child">
- <p>right</p>
- </div>
- </div>
-</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-001.html
deleted file mode 100644
index bf052b89e92..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-001.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>outline: outline on div with specified width (percent)</title>
-<link rel="author" title="Justin Hill" href="http://www.justin-hill.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#outline">
-<link rel="match" href="ref/outline-001-ref.html">
-<meta name="assert" content="Test checks that outline does not effect flow of elements.">
-<style>
- .container {
- width:200px;
- background: red;
- border:10px solid red;
- }
- .child {
- width:50%;
- background:white;
- float:left;
- }
-
- .first {
- outline: 10px solid blue;
- }
-
- .second {
- outline: 10px solid orange;
- }
-</style>
-<body>
- <p>Test passes if no red visible and orange outline overlaps blue.</p>
- <div class="container">
- <div class="child first">
- <p>left</p>
- </div>
- <div class="child second">
- <p>right</p>
- </div>
- </div>
-</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-002.html
deleted file mode 100644
index 57438afd2dc..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-002.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<title>outline: outline on div with specified width (px)</title>
-<link rel="author" title="Justin Hill" href="http://www.justin-hill.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#outline">
-<link rel="match" href="ref/outline-001-ref.html">
-<meta name="assert" content="Test checks that outline does not effect flow of elements.">
-<style>
- .container {
- width:200px;
- background: red;
- border:10px solid red;
- }
- .child {
- width:100px;
- background:white;
- float:left;
- }
-
- .first {
- outline: 10px solid blue;
- }
-
- .second {
- outline: 10px solid orange;
- }
-</style>
-<body>
- <p>Test passes if no red visible and orange outline overlaps blue.</p>
- <div class="container">
- <div class="child first">
- <p>left</p>
- </div>
- <div class="child second">
- <p>right</p>
- </div>
- </div>
-</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-offset-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-offset-001.html
deleted file mode 100644
index 0b2b9b96755..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/outline-offset-001.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<title>outline-offset: outline offset on div</title>
-<link rel="author" title="Justin Hill" href="http://www.justin-hill.com">
-<link rel="help" href="http://www.w3.org/TR/css3-ui/#outline-offset">
-<link rel="match" href="ref/outline-offset-001-ref.html">
-<meta name="assert" content="Test checks that outline offset draws outline offset from element over any other elements.">
-<style>
- .container {
- width:200px;
- height: 50px;
- background: black;
- padding:5px;
- border:10px solid red;
- }
- .child {
- width:100%;
- height:100%;
- background:white;
- outline: 10px solid green;
- outline-offset:5px;
- }
-</style>
-<body>
- <p>Test passes if green outline and no red visible.</p>
- <div class="container">
- <div class="child">
- </div>
- </div>
-</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/box-sizing-border-box-001-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/box-sizing-border-box-001-ref.html
deleted file mode 100644
index 13efd571bac..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/box-sizing-border-box-001-ref.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<title>box-sizing: border-box Reference File</title>
-<link rel="author" title="Justin Hill" href="http://www.justin-hill.com">
-<style>
- .container {
- width:50%;
- background: red;
- }
- .child {
- color: white;
- box-shadow: 0 0 0 10px black inset;
- width:50%;
- background:green;
- float: left;
- text-align: center;
- padding:10px 0;
- }
-</style>
-<body>
- <p> Test passes if green boxes are side by side with no red visible.</p>
- <div class="container">
- <div class="child">
- <p>left</p>
- </div>
- <div class="child">
- <p>right</p>
- </div>
- </div>
-</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/outline-001-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/outline-001-ref.html
deleted file mode 100644
index 8350a98ec57..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/outline-001-ref.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<title>outline reference</title>
-<link rel="author" title="Justin Hill" href="http://www.justin-hill.com">
-<style>
- .container {
- width:220px;
- background: red;
- }
-
- .child {
- position:relative;
- z-index: 1;
- background:white;
- float:left;
- }
-
- .first {
- border: 10px solid blue;
- border-right-width: 0px;
- width:90px;
- }
-
- .second {
- border: 10px solid orange;
- width:100px;
- }
-</style>
-<body>
- <p>Test passes if no red visible and orange outline overlaps blue.</p>
- <div class="container">
- <div class="child first">
- <p>left</p>
- </div>
- <div class="child second">
- <p>right</p>
- </div>
- </div>
-</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/outline-offset-001-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/outline-offset-001-ref.html
deleted file mode 100644
index 651d307e2c4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/justh/ref/outline-offset-001-ref.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<title>outline-offset reference</title>
-<link rel="author" title="Justin Hill" href="http://www.justin-hill.com">
-<style>
- .container {
- width:200px;
- height: 50px;
- background: black;
- padding:5px;
- border:10px solid green;
- }
- .child {
- position:relative;
- z-index: 1;
- width:100%;
- height:100%;
- background:white;
- }
-</style>
-<body>
- <p>Test passes if green outline and no red visible.</p>
- <div class="container">
- <div class="child">
- </div>
- </div>
-</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/tonychyan/css-transform-combination-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/tonychyan/css-transform-combination-001.html
deleted file mode 100644
index 487c068a0aa..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/tonychyan/css-transform-combination-001.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<html>
-<title>CSS Transforms Test: transform property with combination of translate and rotate function
-</title>
- <link rel="author" title="Jun Qian" href="mailto:tonychyan9@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-transforms/#transform-property">
- <link rel="help" href="https://drafts.csswg.org/css3-transforms/#transform-origin">
- <link rel="match" href="reference/css-transform-scale-ref-001.html">
- <meta name="assert" content="Test checks that whether function translate and rotate can work together.">
- <meta name="flag" content="combination">
- <style type="text/css">
- .container {
- position: absolute;
- }
- .greenRectangle {
- position: absolute;
- top: 0;
- left: 0;
- width: 100px;
- height: 200px;
- background-color: green;
- transform:translate(100px,0);
- transform-origin: 100% bottom;
- transform:rotate(90deg);
- }
- /* This div should only be visible if the test fails */
- .redSquare {
- position: absolute;
- /* It is approximately the same size as the test div, but with a 1px margin */
- width: 98px;
- height: 98px;
- background-color: red;
- left: 200px;
- top :100px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if you can only see the green rectangle and no red square.</p>
- <div class="container">
- <!-- This is the square that should not be visible if the test passes -->
- <div class="redSquare"></div>
- <!-- This is the rectangle being tested with the transform -->
- <div class="greenRectangle"></div>
- </div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/tonychyan/css-transform-hover-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/tonychyan/css-transform-hover-001.html
deleted file mode 100644
index 168d2df715b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/tonychyan/css-transform-hover-001.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html>
-<title>CSS Transforms Test: transform property on hover state</title>
- <link rel="author" title="Jun Qian" href="mailto:tonychyan9@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-transforms/#transform-property">
- <link rel="help" href="https://drafts.csswg.org/css3-transforms/#transform-origin">
- <meta name="assert" content="Test checks that whether transform property work on hover state.">
- <meta name="flag" content="interaction">
- <style type="text/css">
- .container {
- position: absolute;
- }
- .greenRectangle {
- position: absolute;
- top: 0;
- left: 0;
- width: 100px;
- height: 200px;
- background-color: green;
- }
- .greenRectangle:hover {
- transform:translate(100px,0);
- transform-origin: 100% bottom;
- transform:rotate(90deg);
- }
-
- /* This div should only be visible if the test fails */
- .redSquare {
- position: absolute;
- /* It is approximately the same size as the test div, but with a 1px margin */
- width: 98px;
- height: 98px;
- background-color: red;
- left: 200px;
- top :100px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if you hover over the green rectangle and it completely covers the red square.</p>
- <div class="container">
- <!-- This is the square that should not be visible if the test passes -->
- <div class="redSquare"></div>
- <!-- This is the rectangle being tested with the transform -->
- <div class="greenRectangle"></div>
- </div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-bothlines.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-bothlines.html
deleted file mode 100644
index d78b2a9adc2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-bothlines.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Flexbox Test: Test flex:auto - no flex:auto set for 1 item in line 1, and another item in line 2</title>
- <link rel="author" title="Bora Vuth" href="mailto:vbora85@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-common">
- <meta name="assert" content="Test passes if box1 and box3 are 100px width; and box3 width's X axis doesn't end with the same one of box2's">
- <style type="text/css">
- #flexContainer {
- background: blue;
- margin: 10px 0;
- border: 1px solid black;
- height: 200px;
- width: 300px;
-
- display: flex;
- flex-wrap: wrap;
- align-content: center;
- }
- .item{
- flex:auto;
- background: white;
- margin: 0 20px 10px 10px;
- width: 100px;
- height: 40px;
- display: inline-block;
- }
- .item1{
- background: white;
- margin: 0 20px 10px 10px;
- width: 100px;
- height: 40px;
- display: inline-block;
- }
- </style>
-</head>
-<body>
- <p>Test passes if box1 and box3 are 100px width; and box3 width's X axis doesn't end with the same one of box2's</p></br>
- <div id="flexContainer">
- <div class="item1">box1</div>
- <div class="item">box2</div>
- <div class="item1">box3</div>
- </div>
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-firstline.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-firstline.html
deleted file mode 100644
index b56640bd9ad..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-firstline.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Flexbox Test: flex:auto - one item in line 1 doesn't have that flex:auto set</title>
- <link rel="author" title="Bora Vuth" href="mailto:vbora85@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-common">
- <meta name="assert" content="Test passes if box1's width is 100px (smaller than box2's width)">
- <style type="text/css">
- #flexContainer {
- background: blue;
- margin: 10px 0;
- border: 1px solid black;
- height: 200px;
- width: 300px;
-
- display: flex;
- flex-wrap: wrap;
- align-content: center;
- }
- .item{
- flex:auto;
- background: white;
- margin: 0 20px 10px 10px;
- width: 100px;
- height: 40px;
- display: inline-block;
- }
- .item1{
- background: white;
- margin: 0 20px 10px 10px;
- width: 100px;
- height: 40px;
- display: inline-block;
- }
- </style>
-</head>
-<body>
- <p>Test passes if box1's width is 100px (smaller than box2's width)</p></br>
- <div id="flexContainer">
- <div class="item1">box1</div>
- <div class="item">box2</div>
- <div class="item">box3</div>
- </div>
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-secondline.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-secondline.html
deleted file mode 100644
index f05226989e8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto-notallitems-secondline.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Flexbox Test: Test flex:auto - no flex:auto set for item on 2nd line</title>
- <link rel="author" title="Bora Vuth" href="mailto:vbora85@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-common">
- <meta name="assert" content="Test passes if box3's width is 100px (smaller than box1's width), and it starts at the same X axis as box1">
- <style type="text/css">
- #flexContainer {
- background: blue;
- margin: 10px 0;
- border: 1px solid black;
- height: 200px;
- width: 300px;
-
- display: flex;
- flex-wrap: wrap;
- align-content: center;
- }
- .item{
- flex:auto;
- background: white;
- margin: 0 20px 10px 10px;
- width: 100px;
- height: 40px;
- display: inline-block;
- }
- .item1{
- background: white;
- margin: 0 20px 10px 10px;
- width: 100px;
- height: 40px;
- display: inline-block;
- }
- </style>
-</head>
-<body>
- <p>Test passes if box3's width is 100px (smaller than box1's width), and it starts at the same X axis as box1</p></br>
- <div id="flexContainer">
- <div class="item">box1</div>
- <div class="item">box2</div>
- <div class="item1">box3</div>
- </div>
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto.html
deleted file mode 100644
index dd470041dd3..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-auto.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Flexbox Test: flex:auto - applying to all items</title>
- <link rel="author" title="Bora Vuth" href="mailto:vbora85@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-common">
- <meta name="assert" content="Test passes if all boxes are not 100px width; and box3 start position is the same X axis as box1's and position is the same as box2">
- <style type="text/css">
- #flexContainer {
- background: blue;
- margin: 10px 0;
- border: 1px solid black;
- height: 200px;
- width: 300px;
-
- display: flex;
- flex-wrap: wrap;
- align-content: center;
- }
- .item{
- flex:auto;
- background: white;
- margin: 0 20px 10px 10px;
- width: 100px;
- height: 40px;
- display: inline-block;
- }
- </style>
-</head>
-<body>
- <p>Test passes if all boxes are not 100px width; and box3 start position is the same X axis as box1's and position is the same as box2</p>
- <div id="flexContainer">
- <div class="item">box1</div>
- <div class="item">box2</div>
- <div class="item">box3</div>
- </div>
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-order.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-order.html
deleted file mode 100644
index 6068857fc8a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_seattle/vbora85/flexbox/submitted/flexbox_flex-order.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Flexbox Test: flex:auto - applying to all items</title>
- <link rel="author" title="Bora Vuth" href="mailto:vbora85@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-common">
- <meta name="assert" content="Test passes if all boxes are not 100px width; and box3 start position is the same X axis as box1's and position is the same as box2">
- <style type="text/css">
- #flexContainer {
- background: blue;
- margin: 10px 0;
- border: 1px solid black;
- height: 200px;
- width: 300px;
-
- display: flex;
- flex-wrap: wrap;
- }
- .item{
- flex: auto;
- background: white;
- margin: 0 20px 10px 10px;
- width: 100px;
- height: 40px;
- display: inline-block;
- }
- .order0{
- order: 0;
- }
- .order1{
- order: 100;
- }
- .order2{
- order: 2;
- }
- </style>
-</head>
-<body>
- <p>Test passes if al</p>
- <div id="flexContainer">
- <div class="item order1">box3</div>
- <div class="item order2">box2</div>
- <div class="item order0">box1</div>
- </div>
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-green.png
deleted file mode 100644
index b98ca0ba0a0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-lime.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-lime.png
deleted file mode 100644
index cb397fb090e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-lime.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-maroon.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-maroon.png
deleted file mode 100644
index 3f86b072195..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-maroon.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-navy.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-navy.png
deleted file mode 100644
index 9b9a03955ba..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-navy.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-white.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-white.png
deleted file mode 100644
index dd43faec54a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/1x1-white.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-gg-rr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-gg-rr.png
deleted file mode 100644
index 84f5b2a4f1d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-gg-rr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-green.png
deleted file mode 100644
index b3c8cf3eb4c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-red.png
deleted file mode 100644
index 823f125b8e4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/60x60-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/README b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/README
deleted file mode 100644
index 2e5f2ad0738..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/README
+++ /dev/null
@@ -1,28 +0,0 @@
-CSS Global Support Directory
-============================
-
-This directory contains common support files (such as images and external
-style sheets). These are sync'ed into the support directories of all our
-test suites. If you have test-suite-specific support files, please add
-them to the appropriate test-suite-specific support/ directory.
-
-If you add to a support/ directory, please run the tools/supportprop.py
-script from the top of the repository to cascade support files into the
-lower-level support directories.
-
-Description of the Common Support File Collection
--------------------------------------------------
-
-The 1x1-* images are all exactly one pixel.
-
-The swatch-* images all use 15x15 cells.
-
-The square-* images all use 15x15 cells with one pixel borders.
-
-The pattern-* images use cells of various sizes:
-
- pattern-grg-rgr-grg.png 20x20
- pattern-rgr-grg-rgr.png 20x20
- pattern-tr.png 15x15
- pattern-grg-rrg-rgg.png 15x15
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/a-green.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/a-green.css
deleted file mode 100644
index b0dbb071d5b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/a-green.css
+++ /dev/null
@@ -1 +0,0 @@
-.a { color: green; }
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/b-green.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/b-green.css
deleted file mode 100644
index a0473f5ca26..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/b-green.css
+++ /dev/null
@@ -1 +0,0 @@
-.b { color: green; } \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/c-red.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/c-red.css
deleted file mode 100644
index d4ba5c64e95..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/c-red.css
+++ /dev/null
@@ -1 +0,0 @@
-.c { color: red; } \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/cat.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/cat.png
deleted file mode 100644
index 85dd7324815..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/cat.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/import-green.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/import-green.css
deleted file mode 100644
index 537104e6633..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/import-green.css
+++ /dev/null
@@ -1 +0,0 @@
-.import { color: green; }
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/import-red.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/import-red.css
deleted file mode 100644
index 9945ef47114..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/import-red.css
+++ /dev/null
@@ -1 +0,0 @@
-.import { color: red; }
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-gg-gr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-gg-gr.png
deleted file mode 100644
index a6d65b0d4a1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-gg-gr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rgr-grg.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rgr-grg.png
deleted file mode 100644
index 9b88fbd8114..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rgr-grg.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rrg-rgg.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rrg-rgg.png
deleted file mode 100644
index fcf4f3fd7d9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-grg-rrg-rgg.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-rgr-grg-rgr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-rgr-grg-rgr.png
deleted file mode 100644
index d454e3a630c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-rgr-grg-rgr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-tr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-tr.png
deleted file mode 100644
index 8b4b25364e0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/pattern-tr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50%.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50%.png
deleted file mode 100644
index cf2eea6b438..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50%.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50px.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50px.png
deleted file mode 100644
index 9f46583665c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-h-50px.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-v-100px.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-v-100px.png
deleted file mode 100644
index a837eca2225..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-v-100px.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-v-50px.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-v-50px.png
deleted file mode 100644
index 84141028020..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/ruler-v-50px.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-purple.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-purple.png
deleted file mode 100644
index 0f522d78728..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-purple.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-teal.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-teal.png
deleted file mode 100644
index e567f51b91b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-teal.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-white.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-white.png
deleted file mode 100644
index 5853cbb238c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/square-white.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/README b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/README
deleted file mode 100644
index ea8cb9ef357..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/README
+++ /dev/null
@@ -1,4 +0,0 @@
-The swatch-green.png file in this directory is really a RED swatch,
-and the swatch-red.png file is really a green swatch.
-
-This directory is used to test relative URIs. \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/swatch-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/swatch-green.png
deleted file mode 100644
index 1caf25c992a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/swatch-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/swatch-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/swatch-red.png
deleted file mode 100644
index 0aa79b0c86b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/support/swatch-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-blue.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-blue.png
deleted file mode 100644
index bf2759634d4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-blue.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-green.png
deleted file mode 100644
index 0aa79b0c86b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-lime.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-lime.png
deleted file mode 100644
index 55fd7fdaedf..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-lime.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-orange.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-orange.png
deleted file mode 100644
index d3cd498b52b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-orange.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-red.png
deleted file mode 100644
index 1caf25c992a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-teal.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-teal.png
deleted file mode 100644
index 0293ce89dea..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-teal.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-white.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-white.png
deleted file mode 100644
index 1a7d4323d77..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-white.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-yellow.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-yellow.png
deleted file mode 100644
index 1591aa0e2e2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/swatch-yellow.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-bl.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-bl.png
deleted file mode 100644
index 904e24e996a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-bl.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-br.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-br.png
deleted file mode 100644
index f413ff5c1a0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-br.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-inner-half-size.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-inner-half-size.png
deleted file mode 100644
index e473bf80efc..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-inner-half-size.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-outer.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-outer.png
deleted file mode 100644
index 82eeace7fc0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-outer.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-tl.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-tl.png
deleted file mode 100644
index f6ac0ef7e8f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-tl.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-tr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-tr.png
deleted file mode 100644
index 59843ae54b6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/betravis/support/test-tr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/css-transform-scale-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/css-transform-scale-001.html
deleted file mode 100644
index cf777446eb3..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/css-transform-scale-001.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Transforms Test: transform property with scale function on hover state</title>
- <link rel="author" title="Chris Sanborn" href="mailto:granimalcracker@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-transforms/#transform-property">
- <link rel="help" href="https://drafts.csswg.org/css3-transforms/#transform-origin">
- <link rel="help" href="https://drafts.csswg.org/css3-transforms/#transform-functions">
- <link rel="help" href="http://www.w3.org/wiki/CSS/Selectors/pseudo-classes/:hover">
- <link rel="match" href="reference/css-transform-scale-ref-001.html">
- <meta name="assert" content="When the element is hovered over, the transform scales the element to twice its size in both the X and Y directions and moves its origin to the top left corner.">
- <meta name="flag" content="interactive">
- <style type="text/css">
- .container {
- position: absolute;
- }
- .greenSquare {
- position: absolute;
- top: 0;
- left: 0;
- width: 100px;
- height: 100px;
- background-color: green;
- }
- .greenSquare:hover {
- transform-origin: 0 0;
- transform: scale(2);
- }
-
- /* This div should only be visible if the test fails */
- .redSquare {
- position: absolute;
- /* It is approximately the same size as the test div, but with a 1px margin */
- width: 98px;
- height: 98px;
- background-color: red;
- left: 100px;
- top :100px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if you hover over the green square and it completely covers the red square.</p>
- <div class="container">
- <!-- This is the square that should not be visible if the test passes -->
- <div class="redSquare"></div>
- <!-- This is the square being tested with the transform -->
- <div class="greenSquare"></div>
- </div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-001.html
deleted file mode 100644
index 9f4b82b983d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-001.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Reference File</title>
- <link rel="author" title="Chris Sanborn" href="mailto:granimalcracker@gmail.com">
- <style type="text/css">
- .container {
- position: absolute;
- }
- .greenSquare {
- position: absolute;
- width: 200px;
- height: 200px;
- background-color:green;
- }
- </style>
-</head>
-<body>
-<p>The test passes if you hover over the green square and it completely covers the red square.</p>
- <div class="container">
- <div class="greenSquare"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-002.html
deleted file mode 100644
index def3870bcbe..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/chrissanborn/reference/css-transform-scale-ref-002.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Reference - CSS Transforms Test: transform property with scale function and move its origin</title>
- <link rel="author" title="Chris Sanborn" href="mailto:granimalcracker@gmail.com">
- <style type="text/css">
- .container {
- position: absolute;
- }
- .greenSquare {
- position: absolute;
- width: 200px;
- height: 200px;
- background-color:green;
- }
- </style>
-</head>
-<body>
-<p>The test passes if the green square completely covers the red square.</p>
- <div class="container">
- <div class="greenSquare"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cjgammon/css-transforms/reftest/transform-origin-01-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cjgammon/css-transforms/reftest/transform-origin-01-ref.html
deleted file mode 100644
index 0e85f3c698f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cjgammon/css-transforms/reftest/transform-origin-01-ref.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Reference File</title>
- <link rel="author" title="CJ Gammon" href="mailto:youremail@address.com">
- <style type="text/css">
-
- #container{
- position: relative;
- }
-
- .square{
- position: absolute;
- }
-
- #green{
- top: 50px;
- left: 50px;
- width: 100px;
- height: 100px;
- background: green;
- }
-
- </style>
-</head>
-<body>
- <p>The test passes if there is a green square and no red.</p>
-
- <div id="container">
- <div id="green" class="square"></div>
- </div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cjgammon/css-transforms/transform-origin-01.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cjgammon/css-transforms/transform-origin-01.html
deleted file mode 100644
index 53b0492603d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cjgammon/css-transforms/transform-origin-01.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Test: SVG Transform using transform-origin</title>
- <link rel="author" title="CJ Gammon" href="mailto:gammon@adobe.com">
- <link rel="help" href="http://www.w3.org/TR/css3-transforms/#transform-origin">
- <link rel="match" href="reftest/transform-origin-01-ref.html">
- <meta name="assert" content="If only one value is specified, the second value is assumed to be ‘center’">
- <style type="text/css">
- #container{
- position: relative;
- }
-
- .square{
- position: absolute;
- }
-
- #blue{
- top: 50px;
- left: 50px;
- width: 100px;
- height: 100px;
- background: blue;
- }
-
- #red{
- top: 0px;
- left: 100px;
- width: 100px;
- height: 100px;
- background: red;
- transform-origin: left center;
- transform: rotate(90deg);
- }
-
- #green{
- top: 0px;
- left: 100px;
- width: 100px;
- height: 100px;
- background: green;
- transform-origin: left;
- transform: rotate(90deg);
- }
-
- </style>
-</head>
-<body>
- <p>The test passes if there is a green square and no red or blue square.</p>
- <div id="container">
- <div id="blue" class="square"></div>
- <div id="red" class="square"></div>
- <div id="green" class="square"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cshoop/medialist-creating-object-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cshoop/medialist-creating-object-001.html
deleted file mode 100644
index e1241911b7a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/cshoop/medialist-creating-object-001.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Test: CSSOM MediaList Object Creation</title>
- <link rel="author" title="Ben Sheldon" href="mailto:ben@codeforamerica.org">
- <link rel="author" title="Chapman Shoop" href="mailto:chapman.shoop@gmail.com">
- <link rel="help" href="https://drafts.csswg.org/cssom/#creating-a-medialist-object">
- <meta name="flags" content="dom">
- <meta name="assert" content="Create a new MediaList object.">
- <script src="/resources/testharness.js" type="text/javascript"></script>
- <script src="/resources/testharnessreport.js" type="text/javascript"></script>
-</head>
-
-<body>
-
- <noscript>Test not run - javascript required.</noscript>
- <div id="log"></div>
-
- <script type="text/javascript">
- test(function() {
- var my_media_list = new MediaList();
- my_media_list.mediaText = 'all';
- assert_true(my_media_list instanceof MediaList);
- }, "medialist_spec_object_creation",
- { assert: ["Can create MediaList object as described in the spec."] });
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/background-position-center-001-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/background-position-center-001-ref.html
deleted file mode 100644
index e90f9b26fc0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/background-position-center-001-ref.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Reftest Reference for background-position center value</title>
- <link rel="author" title="david kim" href="mailto:kimdkim@yahoo.com OR http://findinbay.blogspot.com">
- <link rel="help" href="https://drafts.csswg.org/css3-background/#background-position">
- <meta name="flags" content="background-position image">
- <meta name="assert" content="To test propery display of 'background-position' center property.">
-
- <style type="text/css">
- /* <![CDATA[ */
-
- div {
- height: 100px;
- width: 100px;
- }
-
- #reference {
- background-image: url('support/20x20-green.png');
- background-repeat: no-repeat;
- background-position: 50% 50%;
- z-index: -1;
- }
- /* ]]> */
- </style>
-
-</head>
-
-<body>
-
- <div id="reference">
-
- </div>
-
-
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/background-position-center-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/background-position-center-001.html
deleted file mode 100644
index cb25ba9c0a2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/background-position-center-001.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Test: Test for background-position values</title>
- <link rel="author" title="david kim" href="mailto:kimdkim@yahoo.com OR http://findinbay.blogspot.com">
- <link rel="help" href="https://drafts.csswg.org/css3-background/#background-position">
- <meta name="flags" content="background-position image">
- <meta name="assert" content="To test propery display of 'background-position' center property.">
-
- <style type="text/css">
- /* CSS FOR TEST */
-
- div {
- height: 100px;
- width: 100px;
- }
-
- #reference {
- background-image: url('support/20x20-green.png');
- background-repeat: no-repeat;
- background-position: 50% 50%;
- z-index: 0;
- }
-
- #test1 {
- background-image: url('support/20x20-red.png');
- background-repeat: no-repeat;
- background-position: center;
- z-index: -1;
- }
-
- #test2 {
- background-image: url('support/20x20-red.png');
- background-repeat: no-repeat;
- background-position: left 40px top 40px; /* 40px, 40px */
- z-index: -1;
- }
-
- </style>
-
-</head>
-
-<body>
-
- <!-- test passes if no red shows through -->
- <div id="test1">
- <div id="test2">
- <div id="reference"></div>
- </div>
- </div>
-
-
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/border-bottom-left-radius-001.xht b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/border-bottom-left-radius-001.xht
deleted file mode 100644
index 2187f9ac377..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/border-bottom-left-radius-001.xht
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>CSS Test: Borders. Border-bottom-left-radius using 0 value</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta http-equiv="Content-Style-Type" content="text/css" />
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
- <link rel="author" title="Nokia" href="http://www.nokia.com/" />
- <link rel="reviewer" title="david kim" href="mailto:kimdkim@yahoo.com http://findinbay.blogspot.com" /> <!-- 2012-06-16 -->
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-border-radius" />
- <link rel="match" href="border-radius-001-ref.xht" />
- <meta name="flags" content="" />
- <meta name="assert" content="To verify the border-bottom-left-radius property, when set with 0, works as expected" />
- <style type="text/css">
- /* <![CDATA[ */
- div
- {
- border:2px solid #ff0000;
- background:#dddddd;
- width:200px;
- height: 100px;
- }
- #test
- {
- border:2px solid #00ff00;
- border-bottom-left-radius: 0em;
- }
- /* ]]> */
- </style>
-<!--
- <script type="text/javascript" src="js/css3_test_helper.js"></script>
--->
- </head>
- <body>
- <p>
- There should be two boxes with no rounded corners.
- </p>
- <!-- PASS AND FAIL CRITERIA ARE IN THE LIST BELOW -->
- <ul>
- <li>PASS if the two boxes below are the same.</li>
- <li>FAIL if the output is not as expected.</li>
- <li><em>test box is green using id="test"</em></li>
- <li><em>reference div is green</em></li>
- </ul>
-
- <!-- PLACE TEST CONTENT FROM HERE -->
- <div id="test"></div>
-<!--
- <script type="text/javascript">
- /* <![CDATA[ */
- var expectedBorderRadius = "0px";
-
- var testResult = check_CSS_property("border-bottom-left-radius", expectedBorderRadius);
-
- // if (testResult.pass)
- /* This portion of the code has been removed to ensure that the test case is not automated */
- // else
- /* This portion of the code has been removed to ensure that the test case is not automated */
-
-
-
- if (top.FrameEnabled) top.fnLog(testResult);
-
- /* ]]> */
- </script>
--->
- </body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-green.png
deleted file mode 100644
index b98ca0ba0a0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-lime.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-lime.png
deleted file mode 100644
index cb397fb090e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-lime.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-maroon.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-maroon.png
deleted file mode 100644
index 3f86b072195..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-maroon.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-navy.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-navy.png
deleted file mode 100644
index 9b9a03955ba..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-navy.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-red.png
deleted file mode 100644
index 6bd73ac1018..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-white.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-white.png
deleted file mode 100644
index dd43faec54a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/1x1-white.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/20x20-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/20x20-green.png
deleted file mode 100644
index d1cff8e039e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/20x20-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/20x20-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/20x20-red.png
deleted file mode 100644
index 2e92a7e57c7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/20x20-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-gg-rr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-gg-rr.png
deleted file mode 100644
index 84f5b2a4f1d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-gg-rr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-green.png
deleted file mode 100644
index b3c8cf3eb4c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-red.png
deleted file mode 100644
index 823f125b8e4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/60x60-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/a-green.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/a-green.css
deleted file mode 100644
index b0dbb071d5b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/a-green.css
+++ /dev/null
@@ -1 +0,0 @@
-.a { color: green; }
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/b-green.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/b-green.css
deleted file mode 100644
index a0473f5ca26..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/b-green.css
+++ /dev/null
@@ -1 +0,0 @@
-.b { color: green; } \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/c-red.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/c-red.css
deleted file mode 100644
index d4ba5c64e95..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/c-red.css
+++ /dev/null
@@ -1 +0,0 @@
-.c { color: red; } \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/cat.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/cat.png
deleted file mode 100644
index 85dd7324815..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/cat.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/import-green.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/import-green.css
deleted file mode 100644
index 537104e6633..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/import-green.css
+++ /dev/null
@@ -1 +0,0 @@
-.import { color: green; }
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/import-red.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/import-red.css
deleted file mode 100644
index 9945ef47114..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/import-red.css
+++ /dev/null
@@ -1 +0,0 @@
-.import { color: red; }
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-grg-rgr-grg.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-grg-rgr-grg.png
deleted file mode 100644
index 6fcfeb4883e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-grg-rgr-grg.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-grg-rrg-rgg.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-grg-rrg-rgg.png
deleted file mode 100644
index fcf4f3fd7d9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-grg-rrg-rgg.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-rgr-grg-rgr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-rgr-grg-rgr.png
deleted file mode 100644
index db8ed5cf7bd..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-rgr-grg-rgr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-tr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-tr.png
deleted file mode 100644
index 8b4b25364e0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/pattern-tr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-h-50%.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-h-50%.png
deleted file mode 100644
index cf2eea6b438..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-h-50%.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-h-50px.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-h-50px.png
deleted file mode 100644
index 9f46583665c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-h-50px.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-v-100px.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-v-100px.png
deleted file mode 100644
index a837eca2225..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-v-100px.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-v-50px.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-v-50px.png
deleted file mode 100644
index 84141028020..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/ruler-v-50px.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-purple.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-purple.png
deleted file mode 100644
index 0f522d78728..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-purple.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-teal.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-teal.png
deleted file mode 100644
index e567f51b91b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-teal.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-white.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-white.png
deleted file mode 100644
index 5853cbb238c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/square-white.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/support/swatch-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/support/swatch-green.png
deleted file mode 100644
index 1caf25c992a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/support/swatch-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/support/swatch-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/support/swatch-red.png
deleted file mode 100644
index 0aa79b0c86b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/support/swatch-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-blue.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-blue.png
deleted file mode 100644
index bf2759634d4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-blue.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-green.png
deleted file mode 100644
index 0aa79b0c86b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-lime.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-lime.png
deleted file mode 100644
index 55fd7fdaedf..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-lime.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-orange.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-orange.png
deleted file mode 100644
index d3cd498b52b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-orange.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-red.png
deleted file mode 100644
index 1caf25c992a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-white.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-white.png
deleted file mode 100644
index 1a7d4323d77..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-white.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-yellow.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-yellow.png
deleted file mode 100644
index 1591aa0e2e2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/swatch-yellow.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-bl.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-bl.png
deleted file mode 100644
index 904e24e996a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-bl.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-br.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-br.png
deleted file mode 100644
index f413ff5c1a0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-br.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-inner-half-size.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-inner-half-size.png
deleted file mode 100644
index e473bf80efc..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-inner-half-size.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-outer.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-outer.png
deleted file mode 100644
index 82eeace7fc0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-outer.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-tl.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-tl.png
deleted file mode 100644
index f6ac0ef7e8f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-tl.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-tr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-tr.png
deleted file mode 100644
index 59843ae54b6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/david/support/test-tr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/divya/index-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/divya/index-001.html
deleted file mode 100644
index f80b3a21d1c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/divya/index-001.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<head>
- <title>CSS OM: CSS Values</title>
- <link rel="author" title="Divya Manian" href="mailto:manian@adobe.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-1/#css-values">
- <meta name="flags" content="cssom">
- <meta name="assert" content="The style value should be serialized to margin: 20px;">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <div id="cssomtestElm"></div>
- <div id="log"></div>
- <script>
- var testElm = document.getElementById('cssomtestElm');
- // Set the transform
- document.getElementById('cssomtestElm').style.margin = "20px 20px 20px 20px";
-
- // Verify that the transform was set as expected
- test(function() {assert_equals(
- document.getElementById('cssomtestElm').style.cssText, //Actual
- "margin: 20px;", //Expected
- "Margin should be serialized as 'margin: 20px;'")}, //Description
- "margin_20px_20px"); //name
- </script>
- </body>
- </html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/divya/index-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/divya/index-002.html
deleted file mode 100644
index 25276f630e6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/divya/index-002.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!doctype html>
-<head>
- <title>CSS OM: CSS Values</title>
- <link rel="author" title="Divya Manian" href="mailto:manian@adobe.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-1/#css-values">
- <meta name="flags" content="cssom">
- <meta name="assert" content="Testing Serialization of Shorthand Values">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <div id="cssomtestElm"></div>
- <div id="log"></div>
- <script>
- var tests = {
- 'border': [
- ['border: 1px; border-top: 1px;', 'border: 1px;'],
- ['border: 1px solid red;', 'border: 1px solid red;'],
- ['border: 1px red;', 'border: 1px red;'],
- ['border: red;', 'border: red;'],
- ['border-top: 1px; border-right: 1px; border-bottom: 1px; border-left: 1px;', 'border: 1px;'],
- ['border-top: 1px; border-right: 2px; border-bottom: 3px; border-left: 4px;', 'border-width: 1px 2px 3px 4px;'],
- ['border: 1px; border-top: 2px;', 'border-width: 2px 1px 1px;'],
- ['border: 1px; border-top: 1px !important;',
- 'border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-width: 1px !important;'],
-
- ['border: 1px; border-top-color: red;', 'border-width: 1px; border-top-color: red;'],
- ['border: solid; border-style: dotted', 'border: dotted;'],
- ['border-width: 1px;', 'border-width: 1px;']
- ],
-
- 'overflow': [
- ['overflow-x: scroll; overflow-y: hidden;', 'overflow: scroll hidden;'],
- ['overflow-x: scroll; overflow-y: scroll;', 'overflow: scroll;']
- ],
- 'outline': [
- ['outline-width: 2px; outline-style: dotted; outline-color: blue;', 'outline: blue dotted 2px;']
- ],
- 'margin': [
- ['margin-top: 1px; margin-right: 2px; margin-bottom: 3px; margin-left: 4px;', 'margin: 1px 2px 3px 4px;']
- ],
- 'list': [
- ['list-style-type: circle; list-style-position: inside; list-style-image: initial;', 'list-style: circle inside;'],
- ['list-style-type: lower-alpha;', 'list-style-type: lower-alpha;']
- ],
- 'font-family': [
- ['font-family: sans-serif; line-height: 2em; font-size: 3em; font-style: italic; font-weight: bold;',
- 'font-family: sans-serif; line-height: 2em; font-size: 3em; font-style: italic; font-weight: bold;']
- ],
- 'padding': [
- ['padding-top: 1px; padding-right: 2px; padding-bottom: 3px; padding-left: 4px;', 'padding: 1px 2px 3px 4px;'],
- ]
- }
-
- var results = {};
-
- var testElm = document.getElementById('cssomtestElm');
- for (var test in tests) {
-
- console.log(test);
-
- if(tests.hasOwnProperty(test)) {
- results[test] = [];
- var propertyTests = tests[test];
-
- for (i = 0; i < propertyTests.length; i++) {
- document.getElementById('cssomtestElm').setAttribute('style', propertyTests[i][0]);
- results[test].push([
- test + ' is expected to be ' + propertyTests[i][1],
- document.getElementById('cssomtestElm').style.cssText,
- propertyTests[i][1]
- ]);
- }
-
- generate_tests(assert_equals, results[test]);
- }
- }
-
- </script>
- </body>
- </html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/gangleton/reference/transform-translateX-002-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/gangleton/reference/transform-translateX-002-ref.html
deleted file mode 100644
index a1cee2aa91e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/gangleton/reference/transform-translateX-002-ref.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Tranforms Reference File</title>
- <link rel="author" title="Serena Wales" href="mailto:serena@codeforamerica.org">
- <style type="text/css">
- .container {
- position: absolute;
- }
- .greenSquare {
- position: absolute;
- width: 100px;
- height: 100px;
- /* Position the div so its identical to the div in the test file */
- /* Add fill color to match the test file */
- top: 0px;
- left: 50px;
- background: green;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a green square and no red.</p>
- <div class="container">
- <div class="greenSquare"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/gangleton/transform-translateX-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/gangleton/transform-translateX-002.html
deleted file mode 100644
index 5e237c58556..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/gangleton/transform-translateX-002.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Transforms Test: transform property with translate function</title>
- <link rel="author" title="Serena Wales" href="mailto:serena@codeforamerica.org">
- <link rel="help" href="http://www.w3.org/TR/css3-transforms/#transform-property">
- <link rel="help" href="http://www.w3.org/TR/css3-transforms/#two-d-transform-functions">
- <link rel="match" href="reference/transform-translateX-002.html">
- <meta name="assert" content="This tests that translateX(50%) translates a box by 50% of its width in the X direction">
- <style type="text/css">
- /* Positioned container allows for the self-describing statement to still
- be visible in the case of failure */
- .container {
- position: absolute;
- }
- .greenSquare {
- position: absolute;
- top: 0;
- left: 0;
- width: 100px;
- height: 100px;
- background-color: green;
- transform: translateX(50%);
- }
- /* This div should only be visible if the test fails */
- .redSquare {
- position: absolute;
- width: 100px;
- height: 100px;
- background-color: red;
- top: 0px;
- left: 50px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a green square and no red.</p>
- <div class="container">
- <!-- This is the square that should not be visible if the test passes -->
- <div class="redSquare"></div>
- <!-- This is the square being tested with the transform -->
- <div class="greenSquare"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewx90.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewx90.html
deleted file mode 100644
index ae4ffba241f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewx90.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Transforms Test: skewX(90deg)</title>
- <link href="mailto:tomomi.i@gmail.com" title="Tomomi Imura" rel="author">
- <link href="http://www.w3.org/TR/css3-transforms/#two-d-transform-functions" rel="help">
- <link href="reference/ttwf-reftest-tutorial-ref.html" rel="match">
- <meta content="This 2D skew transformation along the X axis by 90-degree angle, which should become invisible." name="assert">
- <style type="text/css">
- .redSquare {
- background: red;
- width: 100px;
- height: 100px;
- }
- .skew-x {
- transform: skewX(90deg);
- }
- </style>
-</head>
-<body>
-<p>The test passes if there is no red. (The tested element should be invisible).</p>
- <div class="redSquare skew-x"></div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewy90.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewy90.html
deleted file mode 100644
index 00d47625812..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/girlie_mac/css-transforms-skewy90.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Transforms Test: skewY(90deg)</title>
- <link href="mailto:tomomi.i@gmail.com" title="Tomomi Imura" rel="author">
- <link href="http://www.w3.org/TR/css3-transforms/#two-d-transform-functions" rel="help">
- <link href="reference/ttwf-reftest-tutorial-ref.html" rel="match">
- <meta content="This 2D skew transformation along the Y axis by 90-degree angle, which should become invisible." name="assert">
- <style type="text/css">
- .redSquare {
- background: red;
- width: 100px;
- height: 100px;
- }
- .skew-y {
- transform: skewY(90deg);
- }
- </style>
-</head>
-<body>
-<p>The test passes if there is no red. (The tested element should be invisible).</p>
- <!-- <div class="redSquare skew-x"></div> -->
- <div class="redSquare skew-y"></div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-TODO b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-TODO
deleted file mode 100644
index 2b749374e6c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-TODO
+++ /dev/null
@@ -1,24 +0,0 @@
-'background-origin' with the 'bounding-box' policy:
-
- :''''''''''''''''''''''''''+-------
- : | :
- : | +----
- : | | :
- : | | :
- : | | :
- : | +----
- : | :
- : +-------
- : :
- ------+ :
- : | :
- ---+ | :
- : | | :
- : | | :
- : | | :
- ---+ | :
- : | :
- ------+...........................:
-
-
-other mixed tests
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-README b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-README
deleted file mode 100644
index f674c7be647..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-README
+++ /dev/null
@@ -1,4 +0,0 @@
-See http://lists.w3.org/Archives/Member/w3c-css-wg/2002OctDec/0079.html
-
-The fixed/ directory is for background-attachment: fixed tests, as
--moz-background-policy only applies to background-attachment: scroll.
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-001.html
deleted file mode 100644
index afc615aebef..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-001.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: bounding-box, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/bounding-box/001.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/rainbow);
- -moz-background-inline-policy: bounding-box;
- border: solid; line-height: 2.5; padding: 0.25em;
- }
- </style>
- </head>
- <body>
-
- <p> <span class="test"> <strong>This element should have a rainbow
- background which starts with red at the start of each line and
- gradually goes through yellow, orange, green, blue, indigo, and
- violet as it reaches the end of the line. If each line starts with
- the last colour of the previous line, then the test has
- failed.</strong> Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. </span> </p>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-002.html
deleted file mode 100644
index a5d6c479a98..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-002.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: bounding-box, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/bounding-box/002.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/patterns/plasma-and-fail-99-repeat-x);
- -moz-background-inline-policy: bounding-box;
- border: solid; font: 50px/256px serif; padding: 10px;
- }
- strong { color: white; }
- </style>
- </head>
- <body>
-
- <p> <span class="test"> <strong>This element should have a fuzzy
- green background all over the page. There should be no red
- anywhere.</strong> Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. </span> </p>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-003.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-003.html
deleted file mode 100644
index fc34721a4bb..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-003.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: bounding-box, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/bounding-box/003.html"/>
- <style type="text/css">
- .test {
- font: 16px/1 Ahem, monospace;
- white-space: pre;
- }
- span {
- background: url(/resources/images/easter-egg);
- -moz-background-inline-policy: bounding-box;
- }
- </style>
- </head>
- <body>
- <p> There should be a single complete bird picture below. </p>
- <!-- there will also be a few pixels to the right and bottom of the
- main picture since the space provided is slightly larger than the
- image being used. Note: if you don't have the Ahem font it will
- probably be horizontally cut off instead. -->
- <p class="test"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-004.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-004.html
deleted file mode 100644
index b4e11624640..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-004.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: bounding-box, animated test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/bounding-box/004.html"/>
- <style type="text/css">
- #a { background: #FFCC99; margin: 1em 1em 1em 0; float: right; padding: 1em; color: white; }
- #test {
- background: url(/resources/images/big-wasp) bottom right no-repeat #FFCC99;
- -moz-background-inline-policy: bounding-box;
- padding: 0.2em; color: white;
- }
- </style>
- <script type="text/javascript">
- var x1 = 1; var bias1 = 1;
- var x2 = 1; var bias2 = 1;
- var x3 = 1; var bias3 = 1;
- var count = 0;
- function test() {
- count++;
- if (count % 200 == 0) { bias1 = bias1 < 0 ? 1 : -1; }
- if (count % 60 == 0) { bias2 = bias2 < 0 ? 1 : -1; }
- if (count % 50 == 0) { bias3 = bias3 < 0 ? 1 : -1; }
- x1 += 0.04 * bias1;
- document.getElementById('before').style.letterSpacing = x1 + 'px';
- document.getElementById('test').style.letterSpacing = x1 + 'px';
- x2 += 0.04 * bias2;
- document.getElementById('b').style.lineHeight = x2;
- x3 += 0.20 * bias3;
- document.getElementById('a').style.width = x3 * 1.2 + 6 + 'em';
- document.getElementById('a').style.height = x3 + 3 + 'em';
- }
- </script>
- </head>
- <body onload="setInterval(test, 50)">
- <p>There should be a single big wasp on this page, aligned with the
- bottom line of the inline, and the right hand side of the inline
- content.</p>
- <p id="b">
- <span id="before">filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- <span id="test">filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- <span id="a"> </span>
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-005.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-005.html
deleted file mode 100644
index 42f22641718..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-005.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: bounding-box, animated position test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/bounding-box/005.html"/>
- <style type="text/css">
- #test {
- background: url(/resources/images/smallcats) no-repeat;
- -moz-background-inline-policy: bounding-box;
- background-position: 50% 0%;
- }
- p {
- width: 50%; margin: 2em 10%;
- }
- </style>
- <script type="text/javascript">
- var x = 500; var vx = 3; var ax = 0;
- var y = 0; var vy = 0; var ay = 1;
- function test() {
- x += vx;
- if ((x < 0) || (x > 1000)) {
- vx = -vx;
- } else {
- vx += ax;
- }
- y += vy;
- if (y >= 1000) {
- vy = -vy;
- } else {
- vy += ay;
- }
- document.styleSheets[0].cssRules[0].style.backgroundPosition = x/10 + '% ' + y/10 +'%';
- document.getElementById('status').firstChild.data = document.styleSheets[0].cssRules[0].style.backgroundPosition;
- }
- </script>
- </head>
- <body onload="var query = location.search; if (query) { query = query.substring(1, query.length); } else { query = 10 } setInterval(test, query)">
- <p> Topsy and Turvy should be boucing up and down around the text below. </p>
- <p> <span id="test">
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text </span>
- </p>
- <p>Position: <span id="status">50% 0%</span></p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-README b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-README
deleted file mode 100644
index c2bddb1deac..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-bounding-box-README
+++ /dev/null
@@ -1,6 +0,0 @@
--moz-background-inline-policy: bounding-box;
-
- The background is tiled in a rectangle which is the union of all
- inline boxes of the element. It is only visible within the content
- and padding (and possibly border, depending on the 'background-
- clip' property) areas of the inline boxes.
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-001.html
deleted file mode 100644
index 1951a532a4f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-001.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/001.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/rainbow);
- -moz-background-inline-policy: continuous;
- border: solid; line-height: 2.5; padding: 0.25em;
- }
- </style>
- </head>
- <body>
-
- <p> <span class="test"> <strong>This element should have a rainbow
- background which follows it around, however much it wraps, so that
- it starts on red on the first line and gradually goes through
- yellow, orange, green, blue, indigo, and violet. If the inline is
- longer than the background, the background should start over. If
- each line starts again at red, then the test has failed.</strong>
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text.</span> </p>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-002.html
deleted file mode 100644
index dcb9da7c3b6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-002.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, bidi test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/002.html"/>
- <style type="text/css">
- .control { display: inline; font: 1em/1 Ahem, sans-serif; background: red; color: white; }
- div p { font: 48px/1 Ahem; border: solid; padding: 0.5em; white: green; }
- .test span { background: url(/resources/images/numbers); border: solid; }
- .ref span { background: url(/resources/images/numbers); border: solid; }
-
- # a.one o n.two c.one l.two e.one j.two i h g f.one k.two d.one m.two b.one #
-
- .a { border-style: solid none solid solid; } /* 1 start */
- .o { }
- .n { border-style: solid none solid solid; } /* 2 end */
- .c { } /* 1 */
- .l { } /* 2 */
- .e { } /* 1 */
- .j { } /* 2 start */
- .i { }
- .h { }
- .g { }
- .f { } /* 1 end */
- .k { } /* 2 */
- .d { } /* 1 */
- .m { } /* 2 */
- .b { } /* 1 */
-
-
- </style>
- </head>
- <body>
- <div class="control">Ahem_font_required_for_this_test.</div>
- <h1>incomplete pending wg resolution</h1>
- <p> The following two blocks should be identical, including overflow. (Force bidi: &#x05D0;) </p>
- <div>
-
- <p class="test">&nbsp;<span class="one">&nbsp;&#x202E;&nbsp;&#x202D;&nbsp;&#x202E;&nbsp;&#x202D;&nbsp;&#x202E;&nbsp;</span>&nbsp;&#x202D;&nbsp;&#x202C;&nbsp;<span class="two">&nbsp;&#x202C;&nbsp;&#x202C;&nbsp;&#x202C;&nbsp;&#x202C;&nbsp;</span>&nbsp;&#x202C;&nbsp;</p>
-
- <p class="ref">&nbsp;<span class="a">&nbsp;</span><span class="b">&nbsp;</span><span class="c">&nbsp;</span><span class="d">&nbsp;</span><span class="e">&nbsp;</span><span class="f">&nbsp;</span><span class="g">&nbsp;</span><span class="h">&nbsp;</span><span class="i">&nbsp;</span><span class="j">&nbsp;</span><span class="k">&nbsp;</span><span class="l">&nbsp;</span><span class="m">&nbsp;</span><span class="n">&nbsp;</span><span class="o">&nbsp;</span>&nbsp;</p>
-
-
- <p class="test">
-
- Z
- Oa
- &#x202E; <
- Ob
- &#x202D; >
- Oc
- &#x202E; <
- Od
- &#x202D; >
- Oe
- &#x202E; <
- Of
- Zg
- &#x202D; >
- Zh
- &#x202C;
- Zi
- Tj
- &#x202C;
- Tk
- &#x202C;
- Tl
- &#x202C;
- Tm
- &#x202C;
- Tn
- Zo
- &#x202C;
- Z
-
- </p>
-
-
-
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-003.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-003.html
deleted file mode 100644
index c998c926c59..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-003.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/003.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/patterns/plasma-and-fail-99-repeat-x);
- -moz-background-inline-policy: continuous;
- border: solid; font: 20px/2.5 serif; padding: 0.25em;
- }
- strong { color: white; }
- </style>
- </head>
- <body>
-
- <p> <span class="test"> <strong>This element should have a fuzzy
- green background all over the page. There should be no red
- anywhere.</strong> Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. </span> </p>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-004.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-004.html
deleted file mode 100644
index 5d1af403925..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-004.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/004.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/patterns/quiet-green) repeat-y;
- -moz-background-inline-policy: continuous; color: white;
- border: none; font: 20px/2.5 serif; padding: 0.25em;
- }
- </style>
- </head>
- <body>
-
- <p>You should see the word PASS below a few times, white on a green
- background. The last one may be incomplete.</p>
-
- <p> <strong class="test"> PASS PASS PASS PASS PASS PASS PASS FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL
- FAIL FAIL FAIL FAIL FAIL FAIL FAIL FAIL </strong> </p>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-005.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-005.html
deleted file mode 100644
index 5142a5d5f36..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-005.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/005.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/patterns/plasma-and-fail-99-repeat-x) red repeat-x;
- -moz-background-inline-policy: continuous;
- border: solid; font: 20px/2.5 serif; padding: 0.25em;
- }
- strong { color: white; }
- </style>
- </head>
- <body>
-
- <p> <span class="test"> <strong>This element should have a fuzzy
- green background all over the page. There should be no red
- anywhere.</strong> Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. </span> </p>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-006.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-006.html
deleted file mode 100644
index 46446543b32..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-006.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/006.html"/>
- <style type="text/css">
- .control { display: inline; font: 1em/1 Ahem, sans-serif; background: red; color: white; }
- .test {
- background: url(/resources/images/patterns/red-blobs) no-repeat green;
- -moz-background-inline-policy: continuous;
- border: none; font: 20px/2.5 serif; color: white;
- }
- .test span { font: 32px/1 Ahem; }
- </style>
- </head>
- <body>
- <div class="control">Ahem_font_required_for_this_test.</div>
- <p>There should only be green below.</p>
- <p> <span class="test"> <span>XXXXXXXX</span> Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. </span> </p>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-007.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-007.html
deleted file mode 100644
index 0504ab924bf..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-007.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, animated test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/007.html"/>
- <style type="text/css">
- #a { background: green; margin: 1em 1em 1em 0; float: right; padding: 1em; color: white; }
- #test {
- background: url(/resources/images/patterns/plasma-and-fail-99-repeat-x) red;
- -moz-background-inline-policy: continuous;
- padding: 0.2em; color: white;
- }
- </style>
- <script type="text/javascript">
- var x1 = 1; var bias1 = 1;
- var x2 = 1; var bias2 = 1;
- var x3 = 1; var bias3 = 1;
- var count = 0;
- function test() {
- count++;
- if (count % 200 == 0) { bias1 = bias1 < 0 ? 1 : -1; }
- if (count % 100 == 0) { bias2 = bias2 < 0 ? 1 : -1; }
- if (count % 50 == 0) { bias3 = bias3 < 0 ? 1 : -1; }
- x1 += 0.04 * bias1;
- document.getElementById('before').style.letterSpacing = x1 + 'px';
- document.getElementById('test').style.letterSpacing = x1 + 'px';
- x2 += 0.04 * bias2;
- document.getElementById('b').style.lineHeight = x2;
- x3 += 0.20 * bias3;
- document.getElementById('a').style.width = x3 * 1.2 + 6 + 'em';
- document.getElementById('a').style.height = x3 + 3 + 'em';
- }
- </script>
- </head>
- <body onload="setInterval(test, 50)">
- <p>There should be no red on this page.</p>
- <p id="b">
- <span id="before">filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- <span id="test">filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- <span id="a"> </span>
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-008.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-008.html
deleted file mode 100644
index 2a6260ce35c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-008.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, animated test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/008.html"/>
- <style type="text/css">
- #a { background: green; margin: 1em 1em 1em 0; float: right; padding: 1em; color: white; }
- #test {
- background: url(/resources/images/patterns/rainbow) red;
- -moz-background-inline-policy: continuous;
- padding: 0.2em; color: white;
- }
- </style>
- <script type="text/javascript">
- var x1 = 1; var bias1 = 1;
- var x2 = 1; var bias2 = 1;
- var x3 = 1; var bias3 = 1;
- var count = 0;
- function test() {
- count++;
- if (count % 200 == 0) { bias1 = bias1 < 0 ? 1 : -1; }
- if (count % 100 == 0) { bias2 = bias2 < 0 ? 1 : -1; }
- if (count % 50 == 0) { bias3 = bias3 < 0 ? 1 : -1; }
- x1 += 0.04 * bias1;
- document.getElementById('before').style.letterSpacing = x1 + 'px';
- document.getElementById('test').style.letterSpacing = x1 + 'px';
- x2 += 0.04 * bias2;
- document.getElementById('b').style.lineHeight = x2;
- x3 += 0.20 * bias3;
- document.getElementById('a').style.width = x3 * 1.2 + 10 + 'em';
- document.getElementById('a').style.height = x3 + 5 + 'em';
- }
- </script>
- </head>
- <body onload="setInterval(test, 50)">
- <p>The rainbow should be continuous, not restarting on each line.</p>
- <p id="b">
- <span id="before">filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- <span id="test">filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- <span id="a"> </span>
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-009.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-009.html
deleted file mode 100644
index 9e9aadb609e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-009.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, animated test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/009.html"/>
- <style type="text/css">
- .control { display: inline; font: 1em/1 Ahem, sans-serif; background: red; color: white; }
- #a { background: green; margin: 1em 1em 1em 0; float: right; padding: 1em; color: white; }
- #test {
- background: url(/resources/images/patterns/red-blobs) no-repeat green;
- -moz-background-inline-policy: continuous;
- color: white;
- }
- #x { font: 32px/1 Ahem; letter-spacing: 0; }
- </style>
- <script type="text/javascript">
- var x1 = 1; var bias1 = 1;
- var x2 = 1; var bias2 = 1;
- var x3 = 1; var bias3 = 1;
- var count = 0;
- function test() {
- count++;
- if (count % 200 == 0) { bias1 = bias1 < 0 ? 1 : -1; }
- if (count % 100 == 0) { bias2 = bias2 < 0 ? 1 : -1; }
- if (count % 50 == 0) { bias3 = bias3 < 0 ? 1 : -1; }
- x1 += 0.04 * bias1;
- document.getElementById('before').style.letterSpacing = x1 + 'px';
- document.getElementById('test').style.letterSpacing = x1 + 'px';
- x2 += 0.04 * bias2;
- document.getElementById('b').style.lineHeight = x2;
- x3 += 0.20 * bias3;
- document.getElementById('a').style.width = x3 * 1.2 + 10 + 'em';
- document.getElementById('a').style.height = x3 + 5 + 'em';
- }
- </script>
- </head>
- <body onload="setInterval(test, 50)">
- <div class="control">Ahem_font_required_for_this_test.</div>
- <p>There should be no red below.</p>
- <p id="b">
- <span id="before">filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- <span id="test"><span id="x">XXXXXXXX</span> filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- <span id="a"> </span>
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-010.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-010.html
deleted file mode 100644
index dc99282b981..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-010.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, animated test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/010.html"/>
- <style type="text/css">
- .control { display: inline; font: 1em/1 Ahem, sans-serif; background: red; color: white; }
- #a { background: green; margin: 1em 1em 1em 0; float: right; padding: 1em; color: white; }
- #test {
- background: url(/resources/images/patterns/red-blobs) repeat-y green;
- -moz-background-inline-policy: continuous;
- color: white;
- }
- #x { font: 32px/1 Ahem; letter-spacing: 0; }
- </style>
- <script type="text/javascript">
- var x1 = 1; var bias1 = 1;
- var x2 = 1; var bias2 = 1;
- var x3 = 1; var bias3 = 1;
- var count = 0;
- function test() {
- count++;
- if (count % 200 == 0) { bias1 = bias1 < 0 ? 1 : -1; }
- if (count % 100 == 0) { bias2 = bias2 < 0 ? 1 : -1; }
- if (count % 50 == 0) { bias3 = bias3 < 0 ? 1 : -1; }
- x1 += 0.04 * bias1;
- document.getElementById('before').style.letterSpacing = x1 + 'px';
- document.getElementById('test').style.letterSpacing = x1 + 'px';
- x2 += 0.04 * bias2;
- document.getElementById('b').style.lineHeight = x2;
- x3 += 0.20 * bias3;
- document.getElementById('a').style.width = x3 * 1.2 + 10 + 'em';
- document.getElementById('a').style.height = x3 + 5 + 'em';
- }
- </script>
- </head>
- <body onload="setInterval(test, 50)">
- <div class="control">Ahem_font_required_for_this_test.</div>
- <p>There should be no red below.</p>
- <p id="b">
- <span id="before">filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- <span id="test"><span id="x">XXXXXXXX</span> filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- <span id="a"> </span>
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-011.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-011.html
deleted file mode 100644
index c20693e2196..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-011.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, simple test, with positioning</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/011.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/astrophy/16) no-repeat 100% 50%;
- -moz-background-inline-policy: continuous;
- border: silver solid thin; font: 20px/2.5 serif; padding: 0.3em 2em 0.3em 0;
- }
- .test span { font: 32px/1 Ahem; }
- </style>
- </head>
- <body>
- <p>Astrophy should follow the text below, not overlap it.</p>
- <p> <span class="test"> Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. </span> </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-012.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-012.html
deleted file mode 100644
index 89f205ab6c9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-012.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, simple test, with positioning</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/012.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/astrophy/16) no-repeat 50% 50%;
- -moz-background-inline-policy: continuous;
- border: silver solid thin; font: 20px/2.5 serif; padding: 0.3em;
- }
- </style>
- </head>
- <body>
- <p>Astrophy should fit exactly into the gap below, and not overlap any text.</p>
- <p> <span class="test">
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- </span> </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-013.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-013.html
deleted file mode 100644
index 517254aebc3..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-013.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, simple test, with positioning</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/013.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/1x1-green) repeat-x 0 2.6em;
- -moz-background-inline-policy: continuous;
- -moz-background-origin: border;
- font: 20px/2.5 serif; padding: 0.6em 0 0 0; border-top: transparent 1em solid;
- }
- </style>
- </head>
- <body>
- <p>The text below should be underlined in green.</p>
- <p> <span class="test">
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- </span> </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-014.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-014.html
deleted file mode 100644
index b28c09cbce5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-014.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, simple test, with positioning</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/014.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/1x1-red) repeat-x 0 1.1em;
- -moz-background-inline-policy: continuous;
- -moz-background-clip: padding;
- font: 20px/2.5 serif; border: solid 1em transparent; color: green;
- }
- </style>
- </head>
- <body>
- <p>There should be no red below.</p>
- <p> <span class="test">
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- </span> </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-015.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-015.html
deleted file mode 100644
index d072b59ef95..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-015.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, simple test, with positioning</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/015.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/1x1-green) repeat-x 0 1em;
- -moz-background-inline-policy: continuous;
- -moz-background-origin: content;
- font: 20px/2.5 serif; padding: 0.6em 0 0 0; border-top: transparent 1em solid;
- }
- </style>
- </head>
- <body>
- <p>The text below should be underlined in green.</p>
- <p> <span class="test">
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- </span> </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-016.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-016.html
deleted file mode 100644
index 63283dbed13..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-016.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: continuous, animated position test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/continuous/016.html"/>
- <style type="text/css">
- #test {
- background: url(/resources/images/bullet) no-repeat;
- -moz-background-inline-policy: continuous;
- background-position: 0% 0%;
- }
- p {
- width: 50%; margin: 2em 10%;
- }
- </style>
- <script type="text/javascript">
- var position = 0; /* 0 .. 2*PI */
- function test() {
- with (Math) {
- position += PI / 500;
- if (position >= 2 * PI) {
- position = 0;
- }
- document.styleSheets[0].cssRules[0].style.backgroundPosition = (sin(position) + 1) * 50 + '% 0%';
- document.getElementById('status').firstChild.data = document.styleSheets[0].cssRules[0].style.backgroundPosition;
- }
- }
- </script>
- </head>
- <body onload="var query = location.search; if (query) { query = query.substring(1, query.length); } else { query = 10 } setInterval(test, query)">
- <p> <span id="test">
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text </span>
- </p>
- <p>Position: <span id="status">0% 0%</span></p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-README b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-README
deleted file mode 100644
index 89a2689b19a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-continuous-README
+++ /dev/null
@@ -1,13 +0,0 @@
--moz-background-inline-policy: continuous;
-
- The inline element is considered before line breaking (both
- explicit and caused by wrapping) has occurred, i.e. as one long
- solid rectangular box, for the purposes of tiling the background.
-
-
-For these tests you will need Todd Fahrner's Ahem font, which you can
-download from:
-
- http://www.hixie.ch/resources/fonts/
-
-Versions for Mac, Unix and Windows are available.
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-001.html
deleted file mode 100644
index b526d7416fc..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-001.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: each-box, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/each-box/001.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/rainbow);
- -moz-background-inline-policy: each-box;
- border: solid; line-height: 2.5; padding: 0.25em;
- }
- </style>
- </head>
- <body>
-
- <p> <span class="test"> <strong>This element should have a rainbow
- background which starts with red at the start of each line and
- gradually goes through yellow, orange, green, blue, indigo, and
- violet as it reaches the end of the line. If each line starts with
- the last colour of the previous line, then the test has
- failed.</strong> Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. </span> </p>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-002.html
deleted file mode 100644
index c9e037319a1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-002.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: each-box, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/each-box/002.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/patterns/plasma-and-fail-99-repeat-x);
- -moz-background-inline-policy: each-box;
- border: solid; font: 20px/2.5 serif; padding: 0.25em;
- }
- strong { color: white; }
- </style>
- </head>
- <body>
-
- <p> <span class="test"> <strong>This element should have a fuzzy
- green background all over the page. There should be no red
- anywhere.</strong> Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. Filler text. Filler text. Filler
- text. Filler text. Filler text. </span> </p>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-003.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-003.html
deleted file mode 100644
index be73b98c8f9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-003.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: each-box, simple test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/each-box/003.html"/>
- <style type="text/css">
- .test {
- background: url(/resources/images/patterns/rainbow) no-repeat red;
- -moz-background-inline-policy: each-box;
- font: 16px/2.5 serif; border: solid; padding: 2px;
- }
- p { max-width: 2048px; }
- </style>
- </head>
- <body>
- <p> <span class="test"> <strong>This element should have a rainbow
- background which starts with red at the start of each line and
- gradually goes through yellow, orange, green, blue, indigo, and
- violet as it reaches the end of the line. If each line starts with
- the last colour of the previous line, then the test has failed. If
- there are any lines that are only red, the test has failed.</strong>
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. Filler text. Filler text. Filler text. Filler text.
- Filler text. </span> </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-004.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-004.html
deleted file mode 100644
index b65dd86171b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-004.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background policy: each-box, animated position test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/each-box/004.html"/>
- <style type="text/css">
- #test {
- background: url(/resources/images/bullet) no-repeat;
- -moz-background-inline-policy: each-box;
- background-position: 0% 0%;
- border: solid;
- }
- p {
- width: 50%; margin: 2em 10%;
- }
- #a { float: left; padding: 2em; }
- </style>
- <script type="text/javascript">
- var position = 0; /* 0 .. 2*PI */
- var x1 = 1; var bias1 = 1;
- var x2 = 1; var bias2 = 1;
- var x3 = 1; var bias3 = 1;
- var count = 0;
- function test() {
- count++;
- if (count % 180 == 0) { bias1 = bias1 < 0 ? 1 : -1; }
- if (count % 35 == 0) { bias2 = bias2 < 0 ? 1 : -1; }
- if (count % 50 == 0) { bias3 = bias3 < 0 ? 1 : -1; }
- x1 += 0.04 * bias1;
- document.getElementById('before').style.letterSpacing = x1 + 'px';
- document.getElementById('test').style.letterSpacing = x1 + 'px';
- x2 += 0.04 * bias2;
- document.getElementById('b').style.lineHeight = x2;
- x3 += 0.20 * bias3;
- document.getElementById('a').style.width = x3 * 1.2 + 6 + 'em';
- document.getElementById('a').style.height = x3 + 3 + 'em';
- with (Math) {
- position += PI / 200;
- if (position >= 2 * PI) {
- position = 0;
- }
- document.styleSheets[0].cssRules[0].style.backgroundPosition = (sin(position) + 1) * 50 + '% 0%';
- document.getElementById('status').firstChild.data = document.styleSheets[0].cssRules[0].style.backgroundPosition;
- }
- }
- </script>
- </head>
- <body onload="var query = location.search; if (query) { query = query.substring(1, query.length); } else { query = 10 } setInterval(test, query)">
- <p> The diamond should bounce across each line. Position: <span id="status">0% 0%</span> </p>
- <p id="b"> <span id="before"> filler text filler text </span> <span id="test">
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- <span id="a"> </span>
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text </span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-README b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-README
deleted file mode 100644
index 07cadb77771..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-each-box-README
+++ /dev/null
@@ -1,6 +0,0 @@
--moz-background-inline-policy: each-box;
-
- The background is tiled in each inline box of the element
- independently. A no-repeat background image will be rendered once
- per inline box of the element, rather than only once.
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-fixed-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-fixed-001.html
deleted file mode 100644
index a579836f5da..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-inline-policy-fixed-001.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html lang="en">
- <head>
- <title>CSS inline background attachment: fixed, animated test</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/inline/policy/fixed/001.html"/>
- <style type="text/css">
- #a { margin: 1em 1em 1em 0; float: right; padding: 1em; color: white; }
- #test {
- -moz-background-inline-policy: bounding-box;
- padding: 0.2em; color: white;
- }
- #a, #test { background: url(/resources/images/big-wasp) bottom right no-repeat #FFCC99 fixed; }
- </style>
- <script type="text/javascript">
- var x1 = 1; var bias1 = 1;
- var x2 = 1; var bias2 = 1;
- var x3 = 1; var bias3 = 1;
- var count = 0;
- function test() {
- count++;
- if (count % 200 == 0) { bias1 = bias1 < 0 ? 1 : -1; }
- if (count % 60 == 0) { bias2 = bias2 < 0 ? 1 : -1; }
- if (count % 50 == 0) { bias3 = bias3 < 0 ? 1 : -1; }
- x1 += 0.04 * bias1;
- document.getElementById('before').style.letterSpacing = x1 + 'px';
- document.getElementById('test').style.letterSpacing = x1 + 'px';
- x2 += 0.04 * bias2;
- document.getElementById('b').style.lineHeight = x2;
- x3 += 0.20 * bias3;
- document.getElementById('a').style.width = x3 * 1.2 + 'em';
- document.getElementById('a').style.height = x3 + 'em';
- }
- </script>
- </head>
- <body onload="setInterval(test, 50)">
- <p>There should be a single big wasp on this page, aligned with the
- bottom right of the viewport, and not moving with the text.
- However, the image should only be visible where the inline or the
- float overlaps it.</p>
- <p id="b">
- <span id="before">filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- <span id="test">filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- <span id="a"> </span>
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text filler
- text filler text filler text filler text filler text filler text
- filler text filler text filler text filler text filler text</span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-001.xml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-001.xml
deleted file mode 100644
index edbb7712d88..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-001.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Multiple backgrounds: Basic Positioning</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/multiple/001.xml"/>
- <style type="text/css">
- body { color: navy; }
- div { background: red; height: 200px; width: 400px; }
- div { background: no-repeat url(support/test-bl.png) 50px bottom, url(support/test-br.png) 150px 100px no-repeat,
- url(support/test-tr.png) top no-repeat, url(support/test-tl.png) 16.666667% 0 no-repeat; }
- </style>
- </head>
- <body>
- <p>There should be a complete unbroken drawing of a yin-yang (&#x262F;) symbol below.</p>
- <div></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-002.xml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-002.xml
deleted file mode 100644
index dd54890363b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-002.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Multiple backgrounds: repetition in funky situations (primarily no-repeat)</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/multiple/002.xml"/>
- <style type="text/css">
- body { color: navy; }
- div { background: red; height: 200px; width: 400px; }
- div { background-color: red;
- background: none, no-repeat url(support/test-bl.png) 50px bottom, url(support/test-br.png) 150px 100px no-repeat,
- url(support/test-tr.png) top no-repeat, none, url(support/test-tl.png) 16.667% 0 repeat-y,
- repeat, fixed, none, url(support/1x1-white.png);
- background-attachment: fixed, scroll, scroll, scroll, fixed, scroll, fixed;
- background-repeat: repeat, no-repeat, no-repeat, no-repeat, repeat-y, no-repeat; }
- </style>
- </head>
- <body>
- <p>There should be a complete unbroken drawing of a yin-yang (&#x262F;) symbol below.</p>
- <div></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-003.xml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-003.xml
deleted file mode 100644
index 2e9cb9c93c9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-003.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Multiple backgrounds: Basic Positioning</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/multiple/003.xml"/>
- <style type="text/css">
- body { color: navy; }
- div { background: red; height: 200px; width: 400px; }
- div { background: url(support/1x1-green.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png), url(support/1x1-red.png); }
- </style>
- </head>
- <body>
- <p>There should be a green box below.</p>
- <div></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-004.xml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-004.xml
deleted file mode 100644
index c7f67ac3874..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-004.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Multiple backgrounds: Different layer counts</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/multiple/004.xml"/>
- <style type="text/css">
- body { color: navy; }
- div { background: red; height: 200px; width: 400px; }
- div { background-image: url(http://404.example.org/), url(http://404.example.org/), url(http://404.example.org/); }
- div { background-color: green; }
- div { background-repeat: repeat, repeat, repeat, repeat; }
- </style>
- </head>
- <body>
- <p>There should be a green box below.</p>
- <div></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-005.xml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-005.xml
deleted file mode 100644
index e634aa664ea..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-005.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Multiple backgrounds: Different layer counts</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/multiple/005.xml"/>
- <style type="text/css">
- body { color: navy; }
- div { background: red; height: 200px; width: 400px; }
- div { background-image: url(http://404.example.org/), url(http://404.example.org/), url(http://404.example.org/); }
- div { background-color: navy; }
- div { background-repeat: repeat, no-repeat; }
- div:hover { background-image: url(support/1x1-green); }
- </style>
- </head>
- <body>
- <p>There should be a green box below after you hover it (but it should never be red).</p>
- <div></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-006.xml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-006.xml
deleted file mode 100644
index cd40c099cc0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-006.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Multiple backgrounds: Different layer counts</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/multiple/006.xml"/>
- <style type="text/css">
- body { color: navy; }
- div { background: red; height: 15px; width: 15px; }
- div { background-image: url(http://404.example.org/), url(support/swatch-blue.png), url(support/swatch-green.png); }
- div { background-color: red; }
- div:hover { background-position: 50%, 300px; background-repeat: repeat-y; }
- </style>
- </head>
- <body>
- <p>There should be a green box below after you hover it (but it should never be red).</p>
- <div></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-007.xml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-007.xml
deleted file mode 100644
index 57254ca52a7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-007.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Multiple backgrounds: Inheritance into inlines</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/multiple/007.xml"/>
- <style type="text/css">
- p, span { background: red; color: yellow; }
- body { background-position: right 200px, 2px -2px, top right; }
- p { background-position: inherit;
- background-image: url(support/swatch-white.png), url(support/1x1-red.png), url(support/swatch-green.png); color: green; }
- span { background-image: inherit; background-position: inherit; background-repeat: repeat-x; color: white; font-size: 15px; }
- </style>
- </head>
- <body>
- <div>There should be two sentences below.</div>
- <p>This sentence should be green. <span>This sentence should be white on green.</span></p>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-008.xml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-008.xml
deleted file mode 100644
index 0721e7e0359..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-008.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Multiple backgrounds: Inheritance into blocks (shorthand)</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/multiple/008.xml"/>
- <style type="text/css">
- body { font: 16px serif; }
- div { height: 0; background: url(support/test-tl) no-repeat,
- url(support/test-tr) no-repeat right 0%,
- url(support/test-bl) no-repeat fixed 80px 11.25em,
- url(support/test-br) no-repeat bottom right,
- white repeat scroll bottom right; }
- div p { position: absolute; top: 5em; left: 5em; height: 200px; width: 200px;
- background: inherit; }
- </style>
- </head>
- <body>
- <p>There should be a complete unbroken drawing of a yin-yang (&#x262F;) symbol below.</p>
- <div><p></p></div>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-009.xml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-009.xml
deleted file mode 100644
index 2f4a836b8f9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-009.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Multiple backgrounds: Parsing test (shorthand)</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/multiple/009.xml"/>
- <style type="text/css">
- p { height: 100px; color: green;
- background: url(support/swatch-red.png) no-repeat,
- url(support/swatch-red.png) no-repeat right,
- url(support/swatch-red.png) no-repeat fixed 80px 11.25em,
- url(support/swatch-red.png) no-repeat bottom right,
- red repeat left scroll bottom; } /* this line is not valid, so whole thing should be dropped */
- </style>
- </head>
- <body>
- <p>This line should be green.</p>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-010.xml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-010.xml
deleted file mode 100644
index 3554249840e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-010.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Multiple backgrounds: Painting order</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/background/multiple/010.xml"/>
- <style type="text/css">
- body { color: navy; }
- div, span, tr { background-image: url(support/1x1-green.png), url(support/1x1-red.png); background-color: red; color: white; }
- </style>
- </head>
- <body>
- <p>There should be several times the word PASS below, in differently sized boxes.</p>
- <div>PASS</div>
- <p><span>PASS</span></p>
- <table><tr><td>PASS</td></tr></table>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-README b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-README
deleted file mode 100644
index 874df0fdf05..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/background-multiple-README
+++ /dev/null
@@ -1,2 +0,0 @@
-These tests are based on UNPUBLISHED DRAFT PROPOSALS for the CSS3
-background and borders module.
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/border-style-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/border-style-001.html
deleted file mode 100644
index 422d902422c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/border-style-001.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <title>border-style: double</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/border/style/001.html"/>
- <link rel="help" href="http://www.w3.org/TR/CSS21/box.html#border-style-properties"/>
- <style type="text/css">
- .double { border: double 3em red; margin: 2em 0 0 2em; height: 6em; width: 10em; }
- .single1 { border: solid 1em green; margin: -12em 0 0 2em; padding: 1em; width: 12em; }
- .single2 { border: solid 1em green; height: 6em; }
- </style>
- </head>
- <body>
- <p>There should be two nested green rectangles below.</p>
- <div class="double"></div>
- <div class="single1"><div class="single2"></div></div>
-
- <!-- this test assumes that double borders are implemented so that
- there are three equally-sized bands, two on the outside being of the
- border-color and one on the inside being transparent. -->
-
-
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/border-style-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/border-style-002.html
deleted file mode 100644
index 4a5e3b2b749..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/hixie/border-style-002.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
-<head>
- <title>border-style: double</title>
- <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
- <link rel="alternate" href="http://www.hixie.ch/tests/adhoc/css/border/style/002.html"/>
- <link rel="help" href="http://www.w3.org/TR/CSS21/box.html#border-style-properties"/>
- <style type="text/css">
- .single1 { border: solid 1em red; margin: 2em 0 0 2em; padding: 1em; width: 12em; }
- .single2 { border: solid 1em red; height: 6em; }
- .double { border: double 3em green; margin: -12em 0 0 2em; height: 6em; width: 10em; }
- </style>
- </head>
- <body>
- <p>There should be two nested green rectangles below.</p>
- <div class="single1"><div class="single2"></div></div>
- <div class="double"></div>
-
- <!-- this test assumes that double borders are implemented so that
- there are three equally-sized bands, two on the outside being of the
- border-color and one on the inside being transparent. -->
-
-
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-container-margin.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-container-margin.html
deleted file mode 100644
index ad4bdf47690..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-container-margin.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>CSS Test: flex-container-margin-not-collapse-with-content-margin</title>
-<link rel="author" title="houzhenyu" href="http://www.github.com/sskyy" />
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#item-margins">
-<link rel="match" href="reference/flex-container-margin.html">
-<meta name="assert" content="The margins of adjacent flex items do not collapse." />
-<style>
- .flex-container{
- display: flex;
- margin:20px;
- background: #333;
- }
- .flex-item{
- width:50px;
- height:50px;
- margin:20px;
- background: #eee;
- }
-</style>
-</head>
-<body>
- <div class="flex-container">
- <div class="flex-item"></div>
- <div class="flex-item"></div>
- <div class="flex-item"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-modify.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-modify.html
deleted file mode 100644
index 3fa36b46d4d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-modify.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>CSS Test: flex flow direction</title>
-<link rel="author" title="houzhenyu" href="http://www.github.com/sskyy" />
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-direction">
-<link rel="match" href="reference/flex-direction-modify.html">
-<meta name="assert" content="Changing 'flex-direction' with JavaScript and then changing it back should returns to the original look." />
-<style>
- .flex-container{
- display: flex;
- margin:20px;
- background: #333;
- }
- .flex-item{
- width:50px;
- height:50px;
- margin:20px;
- background: #eee;
- line-height: 50px;
- text-align: center;
- }
-
-
- .flex-container.flex-direction-row{
- flex-direction : row;
- }
-
- .flex-container.flex-direction-row-reverse{
- flex-direction : row-reverse;
- }
-
- .flex-container.flex-direction-column{
- flex-direction : column;
- }
- .flex-container.flex-direction-column-reverse{
- flex-direction : column-reverse;
- }
-</style>
-</head>
-<body>
- <h1>flex-direction:<span id="current_direction">row</h1>
- <div id="flex_container" class="flex-container"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-
- <script>
- var container = document.getElementById("flex_container");
- var direction_text = document.getElementById("current_direction");
- var baseClass = "flex-container ";
- var classPrefix = "flex-direction-";
- function change_direction( direction ){
- container.className = baseClass + classPrefix + direction;
- notify( direction );
- }
-
- function notify( direction ){
- direction_text.innerHTML = direction;
- }
-
- change_direction("row");
- change_direction("row-reverse");
- change_direction("column");
- change_direction("row-column-reverse");
- change_direction("row");
- </script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-with-element-insert.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-with-element-insert.html
deleted file mode 100644
index 2dcd29e4179..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction-with-element-insert.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>CSS Test: flex flow direction</title>
-<link rel="author" title="houzhenyu" href="http://www.github.com/sskyy" />
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-direction">
-<link rel="match" href="reference/flex-direction-with-element-insert.html">
-<meta name="assert" content="The flex items inserted by script shuould follow the right direction what the flex-direction property directives." />
-<style>
- .flex-container{
- display: flex;
- margin:20px;
- background: #333;
- }
- .flex-item{
- width:50px;
- height:50px;
- margin:20px;
- background: #eee;
- line-height: 50px;
- text-align: center;
- }
-
-
- .flex-container.flex-direction-row{
- flex-direction : row;
- }
-
- .flex-container.flex-direction-row-reverse{
- flex-direction : row-reverse;
- }
-
- .flex-container.flex-direction-column{
- flex-direction : column;
- }
- .flex-container.flex-direction-column-reverse{
- flex-direction : column-reverse;
- }
-</style>
-</head>
-<body>
- <h1>flex-direction:row</h1>
- <div id="flex-direction-row" class="flex-container flex-direction-row"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-
- <h1>flex-direction:row-reverse</h1>
- <div id="flex-direction-row-reverse" class="flex-container flex-direction-row-reverse"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-
- <h1>flex-direction:column</h1>
- <div id="flex-direction-column" class="flex-container flex-direction-column"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-
- <h1>flex-direction:column-reverse</h1>
- <div id="flex-direction-column-reverse" class="flex-container flex-direction-column-reverse"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-
-
- <script>
- var ids = ['flex-direction-row',
- 'flex-direction-row-reverse',
- 'flex-direction-column',
- 'flex-direction-column-reverse'];
-
- for( var i in ids ){
- var new_element = document.createElement("div")
- new_element.className="flex-item";
- new_element.innerHTML="new";
- var container = document.getElementById( ids[i] );
- container.appendChild( new_element );
- }
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction.html
deleted file mode 100644
index f3b9693b662..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-direction.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>CSS Test: flex flow direction</title>
-<link rel="author" title="houzhenyu" href="http://www.github.com/sskyy" />
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-direction">
-<link rel="match" href="reference/flex-direction.html">
-<meta name="assert" content="The flow of flex items in the the flex container should observe the flex-direction property." />
-<style>
- .flex-container{
- display: flex;
- margin:20px;
- background: #333;
- }
- .flex-item{
- width:50px;
- height:50px;
- margin:20px;
- background: #eee;
- line-height: 50px;
- text-align: center;
- }
-
-
- .flex-container.flex-direction-row{
- flex-direction : row;
- }
-
- .flex-container.flex-direction-row-reverse{
- flex-direction : row-reverse;
- }
-
- .flex-container.flex-direction-column{
- flex-direction : column;
- }
- .flex-container.flex-direction-column-reverse{
- flex-direction : column-reverse;
- }
-</style>
-</head>
-<body>
- <h1>flex-direction:row</h1>
- <div class="flex-container flex-direction-row"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-
- <h1>flex-direction:row-reverse</h1>
- <div class="flex-container flex-direction-row-reverse"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-
- <h1>flex-direction:column</h1>
- <div class="flex-container flex-direction-column"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-
- <h1>flex-direction:column-reverse</h1>
- <div class="flex-container flex-direction-column-reverse"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-item-change-width.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-item-change-width.html
deleted file mode 100644
index 181b5e278ce..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/flex-item-change-width.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>CSS Test: flex flow direction</title>
-<link rel="author" title="houzhenyu" href="http://www.github.com/sskyy" />
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#painting">
-<link rel="match" href="reference/flex-direction.html">
-<meta name="assert" content="using javascript to change the first flex item should not effect the others flex item." />
-<style>
- .flex-container{
- display: flex;
- margin:20px;
- background: #333;
- }
- .flex-item{
- height:50px;
- margin:20px;
- background: #eee;
- line-height: 50px;
- text-align: center;
- }
-
-
- .flex-container.flex-direction-row{
- flex-direction : row;
- }
-
- .flex-container.flex-direction-row-reverse{
- flex-direction : row-reverse;
- }
-
- .flex-container.flex-direction-column{
- flex-direction : column;
- }
- .flex-container.flex-direction-column-reverse{
- flex-direction : column-reverse;
- }
- .width{
- width:50px;
- }
-</style>
-</head>
-<body>
- <h1>flex-direction:row</h1>
- <div class="flex-container flex-direction-row">
- <div id="flex-item-1" class="flex-item">1</div>
- <div class="flex-item">2</div>
- <div class="flex-item">3</div>
- </div>
-
- <script>
- var div = document.getElementById("flex-item-1");
- window.setTimeout(function(){
- div.className='flex-item width';
- }, 1000)
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-container.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-container.html
deleted file mode 100644
index bdbb7f2f73e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-container.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>CSS Test: flex-container-margin-not-collapse-with-content-margin</title>
-<link rel="author" title="houzhenyu" href="http://www.github.com/sskyy" />
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-direction">
-<style>
- .flex-container{
- display:block;
- margin:20px;
- background: #333;
- line-height: 0px;
- }
- .flex-item{
- display: inline-block;
- width:50px;
- height:50px;
- margin:20px 20px;
- background: #eee;
- }
- .flex-item.first{
- margin-left:20px;
- }
- .flex-item.last{
- margin-right: 20px;
- }
-</style>
-</head>
-<body>
- <div class="flex-container">
- <div class="flex-item first"></div><div class="flex-item"></div><div class="flex-item last"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-modify.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-modify.html
deleted file mode 100644
index 8cbe6d8b5fd..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-modify.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>CSS Test: flex flow direction</title>
-<link rel="author" title="houzhenyu" href="http://www.github.com/sskyy" />
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-direction">
-<style>
- .flex-container{
- display: flex;
- margin:20px;
- background: #333;
- }
- .flex-item{
- display: inline-block;
- width:50px;
- height:50px;
- margin:20px;
- background: #eee;
- line-height: 50px;
- text-align: center;
- }
-
-
- .flex-container.flex-direction-row{
- flex-direction : row;
- }
-
- .flex-container.flex-direction-row-reverse{
- flex-direction : row-reverse;
- }
-
- .flex-container.flex-direction-column{
- flex-direction : column;
- }
- .flex-container.flex-direction-column-reverse{
- flex-direction : column-reverse;
- }
-</style>
-</head>
-<body>
- <h1>flex-direction:row</h1>
- <div id="flex_container" class="flex-container flex-direction-row"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-with-element-insert.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-with-element-insert.html
deleted file mode 100644
index 50b25667450..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction-with-element-insert.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>CSS Test: flex flow direction</title>
-<link rel="author" title="houzhenyu" href="http://www.github.com/sskyy" />
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-direction">
-<style>
- .flex-container{
- display:block;
- margin:20px;
- background: #333;
- line-height: 0px;
- }
- .flex-item{
- display: inline-block;
- width:50px;
- height:50px;
- margin:20px 20px;
- background: #eee;
- line-height: 50px;
- text-align: center;
- }
-
- .flex-container.flex-direction-row{
- flex-direction : row;
- }
- .flex-container.flex-direction-row-reverse{
- text-align: right;
- }
-
- .flex-container.flex-direction-column{
- padding:20px 0px;
- }
-
- .flex-container.flex-direction-column .flex-item{
- display: block;
- margin:40px 20px;
- }
-
- .flex-container.flex-direction-column .flex-item.first{
- margin-top:0px;
- }
- .flex-container.flex-direction-column .flex-item.last{
- margin-bottom:0px;
- }
-
- .flex-container.flex-direction-column-reverse{
- padding:20px 0px;
- }
-
- .flex-container.flex-direction-column-reverse .flex-item{
- display: block;
- margin:40px 20px;
- }
-
- .flex-container.flex-direction-column-reverse .flex-item.first{
- margin-top:0px;
- }
- .flex-container.flex-direction-column-reverse .flex-item.last{
- margin-bottom:0px;
- }
-</style>
-</head>
-<body>
- <h1>flex-direction:row</h1>
- <div class="flex-container flex-direction-row"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div><div class="flex-item">new</div></div>
-
- <h1>flex-direction:row-reverse</h1>
- <div class="flex-container flex-direction-row-reverse"><div class="flex-item">new</div><div class="flex-item">3</div><div class="flex-item">2</div><div class="flex-item">1</div></div>
-
- <h1>flex-direction:column</h1>
- <div class="flex-container flex-direction-column"><div class="flex-item first">1</div><div class="flex-item">2</div><div class="flex-item">3</div><div class="flex-item last">new</div></div>
-
- <h1>flex-direction:column-reverse</h1>
- <div class="flex-container flex-direction-column-reverse"><div class="flex-item first">new</div><div class="flex-item">3</div><div class="flex-item">2</div><div class="flex-item last">1</div></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction.html
deleted file mode 100644
index 410622bf0f2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-direction.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>CSS Test: flex flow direction</title>
-<link rel="author" title="houzhenyu" href="http://www.github.com/sskyy" />
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#flex-direction">
-<style>
- .flex-container{
- display:block;
- margin:20px;
- background: #333;
- line-height: 0px;
- }
- .flex-item{
- display: inline-block;
- width:50px;
- height:50px;
- margin:20px 20px;
- background: #eee;
- line-height: 50px;
- text-align: center;
- }
-
- .flex-container.flex-direction-row{
- flex-direction : row;
- }
- .flex-container.flex-direction-row-reverse{
- text-align: right;
- }
-
- .flex-container.flex-direction-column{
- padding:20px 0px;
- }
-
- .flex-container.flex-direction-column .flex-item{
- display: block;
- margin:40px 20px;
- }
-
- .flex-container.flex-direction-column .flex-item.first{
- margin-top:0px;
- }
- .flex-container.flex-direction-column .flex-item.last{
- margin-bottom:0px;
- }
-
- .flex-container.flex-direction-column-reverse{
- padding:20px 0px;
- }
-
- .flex-container.flex-direction-column-reverse .flex-item{
- display: block;
- margin:40px 20px;
- }
-
- .flex-container.flex-direction-column-reverse .flex-item.first{
- margin-top:0px;
- }
- .flex-container.flex-direction-column-reverse .flex-item.last{
- margin-bottom:0px;
- }
-</style>
-</head>
-<body>
- <h1>flex-direction:row</h1>
- <div class="flex-container flex-direction-row"><div class="flex-item">1</div><div class="flex-item">2</div><div class="flex-item">3</div></div>
-
- <h1>flex-direction:row-reverse</h1>
- <div class="flex-container flex-direction-row-reverse"><div class="flex-item">3</div><div class="flex-item">2</div><div class="flex-item">1</div></div>
-
- <h1>flex-direction:column</h1>
- <div class="flex-container flex-direction-column"><div class="flex-item first">1</div><div class="flex-item">2</div><div class="flex-item last">3</div></div>
-
- <h1>flex-direction:column-reverse</h1>
- <div class="flex-container flex-direction-column-reverse"><div class="flex-item first">3</div><div class="flex-item">2</div><div class="flex-item last">1</div></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-item-change-width.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-item-change-width.html
deleted file mode 100644
index a566f767430..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/houzhenyu/reference/flex-item-change-width.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>CSS Test: flex flow direction</title>
-<link rel="author" title="houzhenyu" href="http://www.github.com/sskyy" />
-<link rel="help" href="http://www.w3.org/TR/css3-flexbox/#painting">
-<style>
- .flex-container{
- display: flex;
- margin:20px;
- background: #333;
- }
- .flex-item{
- display: inline-block;
- height:50px;
- margin:20px;
- background: #eee;
- line-height: 50px;
- text-align: center;
- }
-
-
- .flex-container.flex-direction-row{
- flex-direction : row;
- }
-
- .flex-container.flex-direction-row-reverse{
- flex-direction : row-reverse;
- }
-
- .flex-container.flex-direction-column{
- flex-direction : column;
- }
- .flex-container.flex-direction-column-reverse{
- flex-direction : column-reverse;
- }
- .width{
- width:50px;
- }
- #flex-item-1{
- width:50px;
- }
-</style>
-</head>
-<body>
- <h1>flex-direction:row</h1>
- <div class="flex-container flex-direction-row">
- <div id="flex-item-1" class="flex-item">1</div>
- <div class="flex-item">2</div>
- <div class="flex-item">3</div>
- </div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-100x60.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-100x60.png
deleted file mode 100644
index 106336a6637..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-100x60.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-96x60.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-96x60.png
deleted file mode 100644
index add0d272b1e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/jeffreyatw/support/rectangle-96x60.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-180-degrees-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-180-degrees-001.html
deleted file mode 100644
index efe1e09dcf5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-180-degrees-001.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Test: Reference</title>
- <link rel="author" title="Larry McLister" href="mailto:lmcliste@adobe.com"/>
- <style type="text/css">
- #greenBottomDiv {
- position: absolute;
- background: green;
- border-left: transparent;
- border-bottom-color: transparent;
- border-right-color: transparent;
- border-top-color: black;
- border-width: 5px;
- border-style: solid;
- height: 100px;
- width: 100px;
- }
-
- </style>
-</head>
-<body>
- <p>Test passes if there is a black line on the top of green box and no red.</p>
- <div id="greenBottomDiv"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-270-degrees-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-270-degrees-001.html
deleted file mode 100644
index c57c4409715..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-270-degrees-001.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Test: Reference</title>
- <link rel="author" title="Larry McLister" href="mailto:lmcliste@adobe.com"/>
- <style type="text/css">
- #greenBottomDiv {
- position: absolute;
- background: green;
- border-left: transparent;
- border-bottom-color: transparent;
- border-right-color: black;
- border-top-color: transparent;
- border-width: 5px;
- border-style: solid;
- height: 100px;
- width: 100px;
- }
-
- </style>
-</head>
-<body>
- <p>Test passes if there is a black line on the right of green box and no red.</p>
- <div id="greenBottomDiv"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-90-degrees-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-90-degrees-001.html
deleted file mode 100644
index 3495b38789c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/lmcliste/css3-transforms/reference/rotate-90-degrees-001.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Test: Reference</title>
- <link rel="author" title="Larry McLister" href="mailto:lmcliste@adobe.com"/>
- <style type="text/css">
- #greenBottomDiv {
- position: absolute;
- background: green;
- border-left: black;
- border-bottom-color: transparent;
- border-right-color: transparent;
- border-top-color: transparent;
- border-width: 5px;
- border-style: solid;
- height: 100px;
- width: 100px;
- }
-
- </style>
-</head>
-<body>
- <p>Test passes if there is a black line on the left of green box and no red.</p>
- <div id="greenBottomDiv"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-attachment-fixed.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-attachment-fixed.html
deleted file mode 100644
index 087a4a813e0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-attachment-fixed.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>
- CSS Test: 'Background-attachment' with value 'fixed'
- </title>
- <link rel="author" title="Melanie Archer" href="mailto:job@twobanjos.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-attachment" />
- <meta name="flags" content="interact" />
- <meta name="assert" content="If 'background-attachment' is given the value 'fixed,' then the background image remains fixed in relation to the user agent viewport when the viewport is scrolled." />
-<style type="text/css">
- #test-container {
- background-attachment: fixed;
- background-position: 1em 5em;
- background-image: url("support/cat.png");
- background-repeat: no-repeat;
- border: 1px solid blue;
- height: 250px;
- overflow: scroll;
- width: 250px;
- }
-
- </style>
- </head>
- <body>
- <p>
- Test passes if the cat image does not move when the blue-bordered containing block or the viewport is scrolled.
- </p>
- <div id="test-container">
- Cupcake ipsum dolor sit. Amet applicake bonbon chocolate cake ice cream. Bear claw tootsie roll cotton candy biscuit. Sweet roll chupa chups gingerbread sugar plum icing muffin biscuit. Chocolate cake wafer pastry tart macaroon danish topping ice cream. Jujubes liquorice candy canes faworki. Jujubes cake caramels faworki pie cake sweet roll. Tiramisu sesame snaps candy cheesecake brownie souffle biscuit. Danish chupa chups donut. Donut tart marshmallow biscuit lollipop chupa chups jelly beans faworki. Sugar plum wafer faworki marshmallow brownie ice cream cotton candy marshmallow marzipan. Cheesecake gummi bears cupcake sweet croissant cookie chocolate bar sweet roll. Halvah cupcake carrot cake souffle carrot cake chocolate cake pastry gummi bears muffin. Sweet roll candy gingerbread dessert tart. Pastry oat cake jelly beans.
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-border-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-border-box.html
deleted file mode 100644
index 956ed568e0c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-border-box.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>
- CSS Test: 'Background-origin' with value 'border-box'
- </title>
- <link rel="author" title="Melanie Archer" href="mailto:job@twobanjos.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-origin" />
- <link rel="match" href="reference/background-origin-border-box-ref.xht" />
- <meta name="flags" content="" />
- <meta name="assert" content="If 'background-origin' is given the value 'border-box,' then the background image is positioned in relationship to, and confined to, its containing element's bordered dimensions." />
-<style type="text/css">
- div {
- border-style: solid;
- border-width: 4px;
- padding: 2em;
- }
-
- #test-container {
- background-image: url("support/cat.png");
- background-repeat: no-repeat;
- border-color: magenta;
- background-origin: border-box;
- }
-
-
- </style>
-</head>
-<body>
- <p>
- Test passes if the cat image is positioned at the top and left of the magenta-bordered rectangle, and is cut off by the magenta border.
- </p>
- <div id="test-container">
- </div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-content-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-content-box.html
deleted file mode 100644
index d7ff410683c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-content-box.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>
- CSS Test: 'Background-origin' with value 'border-box'
- </title>
- <link rel="author" title="Melanie Archer" href="mailto:job@twobanjos.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-origin" />
- <link rel="match" href="reference/background-origin-content-box-ref.xht" />
- <meta name="flags" content="" />
- <meta name="assert" content="If 'background-origin' is given the value 'content-box,' then the background image is positioned in relationship to, and confined to, its containing element's content dimensions." />
-<style type="text/css">
- div {
- border-style: solid;
- border-width: 4px;
- padding: 2em;
- }
-
- #test-container {
- background-image: url("support/cat.png");
- background-repeat: no-repeat;
- border-color: magenta;
- background-origin: content-box;
- }
-
- #test-container #test-block {
- border-color: blue;
- }
-
- </style>
- </head>
- <body>
- <p>
- Test passes if the cat image is positioned at the top and left of the blue-bordered rectangle, and is cut off on the top and left by the blue border.
- </p>
- <div id="test-container">
- <div id="test-block">
- </div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-padding-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-padding-box.html
deleted file mode 100644
index 5352e281f86..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/background-origin-padding-box.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>
- CSS Test: 'Background-origin' with value 'border-box'
- </title>
- <link rel="author" title="Melanie Archer" href="mailto:job@twobanjos.com" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-origin" />
- <link rel="match" href="reference/background-origin-padding-box-ref.xht">
- <meta name="flags" content="" />
- <meta name="assert" content="If 'background-origin' is given the value 'padding-box,' then the background image is positioned in relationship to its containing element's dimensions, and permitted to overflow them." />
-<style type="text/css">
- div {
- border-style: solid;
- border-width: 4px;
- padding: 2em;
- }
-
- #test-container {
- background-image: url("support/cat.png");
- background-repeat: no-repeat;
- border-color: magenta;
- background-origin: padding-box;
- }
-
- </style>
- </head>
- <body>
-
- <p>
- Test passes if the cat image is positioned at the top and left of the magenta-bordered rectangle, and is not cut off by the magenta border.
- </p>
- <div id="test-container">
-
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-border-box-ref.xht b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-border-box-ref.xht
deleted file mode 100644
index 077f650d6ed..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-border-box-ref.xht
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>
- CSS Ref Test: 'Background-origin' with value 'border-box'
- </title>
- <link rel="author" title="Melanie Archer" href="mailto:job@twobanjos.com" />
-<style type="text/css">
- div {
- background-repeat: no-repeat;
- border-style: solid;
- border-width: 4px;
- padding: 2em;
- }
-
- #test-container {
- background-image: url("../support/cat.png");
- background-position: -4px -4px;
- border-color: magenta;
- }
- </style>
- </head>
- <body>
- <div id="test-container">
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-content-box-ref.xht b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-content-box-ref.xht
deleted file mode 100644
index 098e29c64d2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-content-box-ref.xht
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>
- CSS Ref Test: 'Background-origin' with value 'content-box'
- </title>
- <link rel="author" title="Melanie Archer" href="mailto:job@twobanjos.com" />
-<style type="text/css">
- div {
- background-repeat: no-repeat;
- border-style: solid;
- border-width: 4px;
- }
-
- #test-container {
- border-color: magenta;
- padding: 2em;
- }
-
- #test-block {
- background-image: url("../support/cat.png");
- background-position: -4px -4px;
- border: 0;
- min-height: 100px;
- min-width: 100px;
- padding: 0;
- position: absolute;
- top: 0;
- z-index: -1;
- }
-
- #test-border {
- border-color: blue;
- position: relative;
- height: 64px;
- }</style>
- </head>
- <body>
- <div id="test-container">
- <div id="test-border">&nbsp;
- <div id="test-block">&nbsp;
- </div>
- </div></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-padding-box-ref.xht b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-padding-box-ref.xht
deleted file mode 100644
index ebdc16d0a9e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/reference/background-origin-padding-box-ref.xht
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>
- CSS Ref Test: 'Background-origin' with value 'padding-box'
- </title>
- <link rel="author" title="Melanie Archer" href="mailto:job@twobanjos.com" />
-<style type="text/css">
- div {
- background-repeat: no-repeat;
- border-style: solid;
- border-width: 4px;
- padding: 2em;
- }
-
- #test-container {
- background-image: url("../support/cat.png");
- background-position: 0 0;
- border-color: magenta;
- }
-
- </style>
- </head>
- <body>
- <div id="test-container">
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-green.png
deleted file mode 100644
index b98ca0ba0a0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-lime.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-lime.png
deleted file mode 100644
index cb397fb090e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-lime.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-maroon.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-maroon.png
deleted file mode 100644
index 3f86b072195..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-maroon.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-navy.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-navy.png
deleted file mode 100644
index 9b9a03955ba..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-navy.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-red.png
deleted file mode 100644
index 6bd73ac1018..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-white.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-white.png
deleted file mode 100644
index dd43faec54a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/1x1-white.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-gg-rr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-gg-rr.png
deleted file mode 100644
index 84f5b2a4f1d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-gg-rr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-green.png
deleted file mode 100644
index b3c8cf3eb4c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-red.png
deleted file mode 100644
index 823f125b8e4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/60x60-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/README b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/README
deleted file mode 100644
index 2e5f2ad0738..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/README
+++ /dev/null
@@ -1,28 +0,0 @@
-CSS Global Support Directory
-============================
-
-This directory contains common support files (such as images and external
-style sheets). These are sync'ed into the support directories of all our
-test suites. If you have test-suite-specific support files, please add
-them to the appropriate test-suite-specific support/ directory.
-
-If you add to a support/ directory, please run the tools/supportprop.py
-script from the top of the repository to cascade support files into the
-lower-level support directories.
-
-Description of the Common Support File Collection
--------------------------------------------------
-
-The 1x1-* images are all exactly one pixel.
-
-The swatch-* images all use 15x15 cells.
-
-The square-* images all use 15x15 cells with one pixel borders.
-
-The pattern-* images use cells of various sizes:
-
- pattern-grg-rgr-grg.png 20x20
- pattern-rgr-grg-rgr.png 20x20
- pattern-tr.png 15x15
- pattern-grg-rrg-rgg.png 15x15
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/a-green.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/a-green.css
deleted file mode 100644
index b0dbb071d5b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/a-green.css
+++ /dev/null
@@ -1 +0,0 @@
-.a { color: green; }
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/b-green.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/b-green.css
deleted file mode 100644
index a0473f5ca26..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/b-green.css
+++ /dev/null
@@ -1 +0,0 @@
-.b { color: green; } \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/c-red.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/c-red.css
deleted file mode 100644
index d4ba5c64e95..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/c-red.css
+++ /dev/null
@@ -1 +0,0 @@
-.c { color: red; } \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/cat.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/cat.png
deleted file mode 100644
index 85dd7324815..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/cat.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/import-green.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/import-green.css
deleted file mode 100644
index 537104e6633..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/import-green.css
+++ /dev/null
@@ -1 +0,0 @@
-.import { color: green; }
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/import-red.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/import-red.css
deleted file mode 100644
index 9945ef47114..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/import-red.css
+++ /dev/null
@@ -1 +0,0 @@
-.import { color: red; }
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rgr-grg.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rgr-grg.png
deleted file mode 100644
index 9b88fbd8114..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rgr-grg.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rrg-rgg.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rrg-rgg.png
deleted file mode 100644
index fcf4f3fd7d9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-grg-rrg-rgg.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-rgr-grg-rgr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-rgr-grg-rgr.png
deleted file mode 100644
index d454e3a630c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-rgr-grg-rgr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-tr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-tr.png
deleted file mode 100644
index 8b4b25364e0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/pattern-tr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50%.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50%.png
deleted file mode 100644
index cf2eea6b438..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50%.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50px.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50px.png
deleted file mode 100644
index 9f46583665c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-h-50px.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-100px.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-100px.png
deleted file mode 100644
index a837eca2225..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-100px.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-50px.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-50px.png
deleted file mode 100644
index 84141028020..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/ruler-v-50px.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-purple.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-purple.png
deleted file mode 100644
index 0f522d78728..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-purple.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-teal.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-teal.png
deleted file mode 100644
index e567f51b91b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-teal.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-white.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-white.png
deleted file mode 100644
index 5853cbb238c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/square-white.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/README b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/README
deleted file mode 100644
index ea8cb9ef357..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/README
+++ /dev/null
@@ -1,4 +0,0 @@
-The swatch-green.png file in this directory is really a RED swatch,
-and the swatch-red.png file is really a green swatch.
-
-This directory is used to test relative URIs. \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-green.png
deleted file mode 100644
index 1caf25c992a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-red.png
deleted file mode 100644
index 0aa79b0c86b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/support/swatch-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-blue.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-blue.png
deleted file mode 100644
index bf2759634d4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-blue.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-green.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-green.png
deleted file mode 100644
index 0aa79b0c86b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-lime.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-lime.png
deleted file mode 100644
index 55fd7fdaedf..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-lime.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-orange.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-orange.png
deleted file mode 100644
index d3cd498b52b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-orange.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-red.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-red.png
deleted file mode 100644
index 1caf25c992a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-teal.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-teal.png
deleted file mode 100644
index 0293ce89dea..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-teal.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-white.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-white.png
deleted file mode 100644
index 1a7d4323d77..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-white.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-yellow.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-yellow.png
deleted file mode 100644
index 1591aa0e2e2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/swatch-yellow.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-bl.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-bl.png
deleted file mode 100644
index 904e24e996a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-bl.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-br.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-br.png
deleted file mode 100644
index f413ff5c1a0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-br.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-inner-half-size.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-inner-half-size.png
deleted file mode 100644
index e473bf80efc..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-inner-half-size.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-outer.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-outer.png
deleted file mode 100644
index 82eeace7fc0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-outer.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-tl.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-tl.png
deleted file mode 100644
index f6ac0ef7e8f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-tl.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-tr.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-tr.png
deleted file mode 100644
index 59843ae54b6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/mejarc/support/test-tr.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/miked782000/transform-oragin.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/miked782000/transform-oragin.html
deleted file mode 100644
index ac26413ddb8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/miked782000/transform-oragin.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Transforms API Test: transform-oragin</title>
- <link rel="author" title="Michael Downey" href="mailto:miked782000@yahoo.com">
- <link rel="help" href="http://www.w3.org/TR/css3-transforms/#transform-origin">
- <link rel="match" href="reference/transform-origin-ref.html" />
- <meta name="assert" content="The transform should change the transform-origin to the bottom right and rotate 180 degrees">
- <style type="text/css">
- body {margin:0}
- #greenSquare {
- position: absolute;
- top: 0px;
- left: -100px;
- width: 100px;
- height: 100px;
- background: green;
- transform-origin: right bottom;
- transform:rotate(90deg);
- }
- #relativeContainer {
- position: relative;
- }
- #redSquare {
- position: absolute;
- top: 0px;
- left: 0px;
- width: 100px;
- height: 100px;
- background: red;
- }
- </style>
-
-</head>
-<body>
-
-<p>The test passes if there is a green square and no red.</p>
-<div id="relativeContainer" >
- <div id="redSquare"></div>
- <div id="greenSquare"></div>
-</div>
-
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/miked782000/ttwf-reftest-rotate.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/miked782000/ttwf-reftest-rotate.html
deleted file mode 100644
index 6df533f066c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/miked782000/ttwf-reftest-rotate.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Transforms API Test: transform rotate</title>
- <link rel="author" title="Michael Downey" href="mailto:miked782000@yahoo.com">
- <link rel="help" href="http://www.w3.org/TR/css3-transforms/#transform-property">
- <link rel="help" href="http://www.w3.org/TR/css3-transforms/#two-d-transform-functions">
- <link rel="match" href="reference/ttwf-reftest-rotate-ref.html" />
- <meta name="assert" content="The transform should rotate 180 degrees">
- <style type="text/css">
- body {margin:0}
- #greenSquare {
- position: absolute;
- top: 0px;
- left: 0px;
- width: 100px;
- height: 100px;
- background: green;
- }
- #relativeContainer {
- position: relative;
- }
- #redSquare {
- position: absolute;
- top: 0px;
- left: 100px;
- width: 100px;
- height: 100px;
- background: red;
- }
- #rotateSquare {
- position:absolute;
- top: 0px;
- left: -100px;
- width: 200px;
- height: 100px;
- transform:rotate(180deg)
- }
- </style>
-
-</head>
-<body>
-
-<p>The test passes if there is a green square and no red.</p>
-<div id="relativeContainer" >
- <div id="rotateSquare">
- <div id="redSquare"></div>
- <div id="greenSquare"></div>
- </div>
-</div>
-
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-cssText-serialize.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-cssText-serialize.html
deleted file mode 100644
index 1f3cf0090cb..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-cssText-serialize.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSSOM Parsing Test: getting cssText must return the result of serializing the CSS declaration blocks.</title>
- <link rel="author" title="Paul Irish" href="mailto:paul.irish@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-1/#the-cssstyledeclaration-interface">
-
- <link rel="source" href="http://trac.webkit.org/export/120528/trunk/LayoutTests/fast/css/cssText-cache.html">
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
-
- <body>
- <div id="log"></div>
-
- <div id="box"></div>
-
- <script>
-
- var style = document.getElementById('box').style;
-
- test(function(){
-
- style.left = "10px";
- assert_equals(style.cssText.trim(), "left: 10px;");
- style.right = "20px";
- assert_equals(style.cssText.trim(), "left: 10px; right: 20px;");
-
- }, 'CSSStyleDeclaration cssText serializes declaration blocks.');
-
- </script>
-
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-cssstyledeclaration-set.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-cssstyledeclaration-set.html
deleted file mode 100644
index 1fb7ccd3249..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-cssstyledeclaration-set.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSSOM: CSSStyleDeclaration on HTMLElement represents inline style changes</title>
- <link rel="author" title="Paul Irish" href="mailto:paul.irish@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-1/#the-cssstyledeclaration-interface">
-
- <link rel="source" href="http://trac.webkit.org/export/120528/trunk/LayoutTests/fast/css/cssText-cache.html">
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
-
- <body>
- <div id="log"></div>
-
- <div id="box"></div>
-
- <script>
-
- var style = document.getElementById('box').style;
-
- test(function(){
-
- style.left = "10px";
- assert_equals(style.left, "10px", 'left property set on element\'s CSSStyleDeclaration Object');
- style.left = "20px";
- assert_equals(style.left, "20px", 'left property set on element\'s CSSStyleDeclaration Object');
-
- }, 'CSSStyleDeclaration on HTMLElement represents inline style changes');
-
- </script>
-
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule-constructors.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule-constructors.html
deleted file mode 100644
index 42ea96b550a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule-constructors.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSSOM Parsing Test: @font-face rules toString() as valid interfaces</title>
- <link rel="author" title="Paul Irish" href="mailto:paul.irish@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-1/#css-font-face-rule">
-
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
-
- <body>
- <div id="log"></div>
-
-
- <style id="teststyles">
- @font-face {
- src: url(http://foo/bar/font.ttf);
- }
- @font-face {
- font-family: STIXGeneral;
- src: local(STIXGeneral), url(/stixfonts/STIXGeneral.otf);
- unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
- }
- @font-face {
- font-family: MainText;
- src: url(http://example.com/font.ttf);
- font-variant: oldstyle-nums proportional-nums styleset(1,3);
- }
-
- @font-face {
- font-family: BodyText;
- src: local("HiraMaruPro-W4");
- font-variant: proportional-width;
- font-feature-settings: "ital"; /* Latin italics within CJK text feature */
- }
- </style>
-
-
- <script>
- var validRules = document.getElementById('teststyles').sheet.cssRules;
-
- test(function(){
- for (var i = 0; i < validRules.length; ++i) {
- assert_equals(validRules.item(i).toString(), '[object CSSFontFaceRule]');
- }
- }, '@font-face declarations are instances of CSSFontFaceRule')
-
-
- test(function(){
- for (var i = 0; i < validRules.length; ++i) {
- assert_equals(validRules.item(i).style.toString(), '[object CSSStyleDeclaration]');
- }
- }, 'The style attribute must return a CSSStyleDeclaration block')
-
- </script>
-
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule.html
deleted file mode 100644
index 06209101c38..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-fontfacerule.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSSOM Parsing Test: @font-face rules parsed into CSSOM CSSFontFaceRules</title>
- <link rel="author" title="Paul Irish" href="mailto:paul.irish@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-1/#css-font-face-rule">
-
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
-
- <body>
- <div id="log"></div>
-
-
- <style id="teststyles">
- @font-face {
- src: url(http://foo/bar/font.ttf);
- }
- @font-face {
- font-family: STIXGeneral;
- src: local(STIXGeneral), url(/stixfonts/STIXGeneral.otf);
- unicode-range: U+000-49F, U+2000-27FF, U+2900-2BFF, U+1D400-1D7FF;
- }
- @font-face {
- font-family: MainText;
- src: url(http://example.com/font.ttf);
- font-variant: oldstyle-nums proportional-nums styleset(1,3);
- }
-
- @font-face {
- font-family: BodyText;
- src: local("HiraMaruPro-W4");
- font-variant: proportional-width;
- font-feature-settings: "ital"; /* Latin italics within CJK text feature */
- }
- </style>
-
-
- <script>
- var validRules = document.getElementById('teststyles').sheet.cssRules;
-
- test(function(){
-
- assert_equals(validRules[0].style.src, 'url(http://foo/bar/font.ttf)');
- assert_equals(validRules[1].style.fontFamily, 'STIXGeneral');
-
- /* unimplemented @font-face properties are not represented in CSSOM */
-
- }, 'CSSStyleDeclaration values are represented within CSSFontFaceRule')
-
- </script>
-
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-setProperty-shorthand.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-setProperty-shorthand.html
deleted file mode 100644
index fe2ad4731a1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssom-setProperty-shorthand.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSSOM: CSSStyleDeclaration (set|remove)PropertyValue sets/removes shorthand properties</title>
- <link rel="author" title="Paul Irish" href="mailto:paul.irish@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-1/#the-cssstyledeclaration-interface">
-
- <link rel="source" href="http://trac.webkit.org/export/120528/trunk/LayoutTests/fast/css/cssom-remove-shorthand-property.html">
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
-
- <body>
- <div id="log"></div>
-
- <div id="box"></div>
-
- <script>
- shorthandProperties = [
- "font",
- "border-top",
- "border-right",
- "border-bottom",
- "border-left",
- "border",
- "border-color",
- "border-style",
- "border-width",
- "background-position",
- "background-repeat",
- "border-spacing",
- "list-style",
- "margin",
- "outline",
- "padding",
- "background",
- "overflow",
- "border-radius"
- ];
-
- element = document.createElement('span');
-
- function canSetProperty(propertyName) {
- element.style.setProperty(propertyName, 'initial');
- return element.style.getPropertyValue(propertyName) == 'initial';
- }
-
- function canRemoveProperty(propertyName) {
- element.style.removeProperty(propertyName);
- return element.style.getPropertyValue(propertyName) != 'initial';
- }
-
- for (i = 0; i < shorthandProperties.length; ++i) {
- var propertyName = shorthandProperties[i];
-
- test(function(){
- assert_true(canSetProperty(propertyName), 'can setPropertyValue with shorthand');
- }, 'shorthand ' + propertyName + ' can be set with setProperty');
-
- test(function(){
- assert_true(canRemoveProperty(propertyName), 'can setPropertyValue with shorthand');
- }, 'shorthand ' + propertyName + ' can be removed with removeProperty');
-
- }
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssstyledeclaration-mutability.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssstyledeclaration-mutability.html
deleted file mode 100644
index f4a43ea5351..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/paulirish/cssstyledeclaration-mutability.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSSOM: CSSStyleDeclaration is mutable and immutable in various settings</title>
- <link rel="author" title="Paul Irish" href="mailto:paul.irish@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-1/#the-cssstyledeclaration-interface">
-
- <meta name="flags" content="dom">
-
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
-
- <body>
- <div id="log"></div>
- <div id="box"></box>
- <div id="box2"></box>
- <style id="teststyles">
- #box2 { width: 15px; }
- </style>
- <script>
-
- test(function(){
- var elem = document.getElementById('box');
-
- elem.style.width = '10px';
- assert_equals(elem.style.width, '10px', 'setting via style property');
- elem.style.width = '';
-
- elem.style.cssText = 'width: 10px';
- assert_equals(elem.style.width, '10px', 'setting via cssText');
- elem.style.width = '';
-
- }, 'HTMLElement\'s CSSStyleDeclaration is mutable')
-
-
- test(function(){
- var elem = document.getElementById('box');
- var style = getComputedStyle(elem, 'width');
-
- assert_throws('NO_MODIFICATION_ALLOWED_ERR', function(){
- style.width = '10px';
- });
-
- }, 'getComputedStyle\'s CSSStyleDeclaration is not mutable')
-
-
- test(function(){
-
- var style = document.getElementById('teststyles').sheet.cssRules[0].style;
-
- assert_equals(style.width, '15px', 'width value is correct');
-
- style.width = '25px';
-
- assert_equals(style.width, '25px', 'width value is mutable');
-
- var gCSstyle = getComputedStyle(document.getElementById('box2'));
-
- assert_equals(gCSstyle.width, '25px', 'styleSheet change is live and accesible via getComputedStyle');
-
- }, 'StyleSheet\'s CSSStyleDeclaration is mutable');
-
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/diagonal-percentage-vector-background.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/diagonal-percentage-vector-background.html
deleted file mode 100644
index 74fbb8b51c5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/diagonal-percentage-vector-background.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!DOCTYPE html>
-<html>
-<head>
- <title>Scaled vector image without intrinsic dimensions as background, with rendering dependent on the diagonal</title>
- <link rel="author" title="Jeff Walden" href="http://whereswalden.com/" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-size" />
- <link rel="help" href="http://www.w3.org/TR/SVG/coords.html#IntrinsicSizing" />
- <link rel="help" href="http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute" />
- <meta name="flags" content="svg" />
- <style type="text/css">
-#outer
-{
- width: 256px; height: 768px;
- border: 1px solid black;
-}
-#inner
-{
- width: 100px; height: 700px;
- background-image: url(diagonal-scaled.svg);
- background-repeat: no-repeat;
-}
- </style>
-</head>
-<body>
-<div id="outer"><div id="inner"></div></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/diagonal-scaled.svg b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/diagonal-scaled.svg
deleted file mode 100644
index 391a9abe84b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/diagonal-scaled.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<svg xmlns="http://www.w3.org/2000/svg">
- <title>Vector image without intrinsic dimensions with percentage stroke-width (proportional to the diagonal)</title>
- <rect y="0" width="100%" height="50%" fill="lime"/>
- <rect y="50%" width="100%" height="50%" fill="aqua"/>
- <!--
- A percent stroke-width is resolved with respect to:
-
- d = sqrt(vh**2 + vw**2) / sqrt(2)
-
- where vh/vw are the image viewport width/height. Because this image has no
- intrinsic dimensions or ratio, it expands to fill the entire background
- positioning area, so its width is 100px and its height is 700px. For those
- carefully-chosen dimensions, d = 500px, so 10% of that creates a 50px-wide
- rectangle, vertically centered and horizontally left-aligned in the image.
- -->
- <line x1="25%" y1="25%" x2="25%" y2="75%" stroke="fuchsia" stroke-width="10%"/>
-</svg>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-percentage-vector-background-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-percentage-vector-background-ref.html
deleted file mode 100644
index 48af46c0d70..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-percentage-vector-background-ref.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!DOCTYPE html>
-<html>
-<head>
- <title>Scaled vector image without intrinsic dimensions as background, with rendering dependent on the diagonal</title>
- <link rel="author" title="Jeff Walden" href="http://whereswalden.com/" />
- <link rel="help" href="http://www.w3.org/TR/css3-background/#the-background-size" />
- <link rel="help" href="http://www.w3.org/TR/SVG/coords.html#IntrinsicSizing" />
- <link rel="help" href="http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute" />
- <meta name="flags" content="svg" />
- <style type="text/css">
-#outer
-{
- width: 256px; height: 768px;
- border: 1px solid black;
-}
-#inner
-{
- width: 100px; height: 700px;
- background-image: url(diagonal-scaled-fixed.svg);
- background-repeat: no-repeat;
-}
- </style>
-</head>
-<body>
-<div id="outer"><div id="inner"></div></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-scaled-fixed.svg b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-scaled-fixed.svg
deleted file mode 100644
index bf0dcfb59b5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/ssreed/reftest/diagonal-scaled-fixed.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<svg xmlns="http://www.w3.org/2000/svg" width="100px" height="700px">
- <title>Vector image with intrinsic dimensions, reference for diagonal-scaled.svg</title>
- <rect y="0" width="100px" height="350px" fill="lime"/>
- <rect y="350px" width="100px" height="350px" fill="aqua"/>
- <rect y="175px" width="50px" height="350px" fill="fuchsia"/>
-</svg>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/background-color-transparent.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/background-color-transparent.html
deleted file mode 100644
index de72cfa96d8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/background-color-transparent.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Background-origin Test</title>
- <link rel="author" title="Jacky Xiao" href="mailto:foot3188@aliyun.com">
- <link rel="reviewer" title="" href="">
- <link rel="help" href="http://www.w3.org/TR/compositing-1/">
- <link rel="match" href="reference/rotateY-ref.html">
- <meta name="assert" content="There is a green background and white padding.">
- <style type="text/css">
- .yellowSquare {
- width:240px;
- height:240px;
- padding:10px;
- background-image:url(support/bg_flower.gif);
- background-repeat:no-repeat;
- background-color:rgba(255,255,2,.5);
- background-blend-mode:difference;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a yellow background.</p>
- <div class="yellowSquare"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/background-origin.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/background-origin.html
deleted file mode 100644
index c3ae418b179..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/background-origin.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Test background-origin</title>
- <link rel="author" title="Jacky Xiao" href="mailto:foot3188@aliyun.com">
- <link rel="reviewer" title="" href="">
- <link rel="help" href="http://www.w3.org/TR/compositing-1/">
- <link rel="match" href="reference/rotateY-ref.html">
- <meta name="assert" content="The test passes if there is a green background and a black square.">
- <style type="text/css">
- .greenSquare {
- width:120px;
- height:120px;
- padding:10px;
- background-image:url(support/60x60-green.png);
- background-repeat:no-repeat;
- background-color:green;
- background-origin:content-box;
- background-blend-mode:difference;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a green background and a black square.</p>
- <div class="greenSquare"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/reference/background-color-transparent.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/reference/background-color-transparent.html
deleted file mode 100644
index b4c4e0bc677..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/reference/background-color-transparent.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Background-origin Test</title>
- <link rel="author" title="Jacky Xiao" href="mailto:foot3188@aliyun.com">
- <link rel="reviewer" title="" href="">
- <link rel="help" href="http://www.w3.org/TR/compositing-1/">
- <link rel="match" href="reference/rotateY-ref.html">
- <meta name="assert" content="There is a green background and white padding.">
- <style type="text/css">
- .yellowSquare {
- width:240px;
- height:240px;
- padding:10px;
- background-image:url(../support/bg_flower.gif);
- background-repeat:no-repeat;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a yellow background.</p>
- <div class="yellowSquare"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/reference/background-origin.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/reference/background-origin.html
deleted file mode 100644
index 1e9e4c66a4a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/Zourui/reference/background-origin.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Test background-origin</title>
- <link rel="author" title="Jacky Xiao" href="mailto:foot3188@aliyun.com">
- <link rel="reviewer" title="" href="">
- <link rel="help" href="http://www.w3.org/TR/compositing-1/">
- <link rel="match" href="reference/rotateY-ref.html">
- <meta name="assert" content="The test passes if there is a green background and a black square.">
- <style type="text/css">
- .greenSquare {
- width:120px;
- height:120px;
- padding:10px;
- background-image:url(../support/60x60-black.png);
- background-repeat:no-repeat;
- background-color:green;
- background-origin:content-box;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a green background and a black square.</p>
- <div class="greenSquare"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/mark/css3-box-shadow-outline.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/mark/css3-box-shadow-outline.html
deleted file mode 100755
index 70b87f6c208..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/mark/css3-box-shadow-outline.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype html>
-<html>
-<head>
- <meta charset="utf-8" />
- <title>Test box-shadow and outline</title>
- <link rel="author" title="mark" href="mailto:markje@live.cn">
- <link rel="help" href="https://drafts.csswg.org/css-backgrounds/#the-box-shadow" />
- <link rel="match" href="reference/css3-box-shadow-outline-ref.html">
- <meta name="assert" content="There should be no green shadow." />
- <style>
- .test_backG {
- width: 200px;
- height: 200px;
- box-shadow: 10px 10px 0 green;
- outline: solid yellow 10px;
- background: #999;
- }
- </style>
-</head>
-<body>
- <p>There should be no green shadow.</p>
- <div class="test_backG"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/mark/reference/css3-box-shadow-outline-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/mark/reference/css3-box-shadow-outline-ref.html
deleted file mode 100755
index bf7022cc0c4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shanghai/mark/reference/css3-box-shadow-outline-ref.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!doctype html>
-<html>
-<head>
- <meta charset="utf-8" />
- <title>Test box-shadow and outline</title>
- <link rel="author" title="mark" href="mailto:markje@live.cn">
- <link rel="help" href="https://drafts.csswg.org/css-backgrounds/#the-box-shadow" />
- <style>
- .test_backG {
- width: 200px;
- height: 200px;
- outline: solid yellow 10px;
- position: relative;
- background: #999;
- }
- </style>
-</head>
-<body>
- <p>There should be no green shadow.</p>
- <div class="test_backG"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/keiko-kiki/refrence/ref-shape-circle-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/keiko-kiki/refrence/ref-shape-circle-001.html
deleted file mode 100644
index 0de69b9845d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/keiko-kiki/refrence/ref-shape-circle-001.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Reftest Refarence</title>
-<link rel="author" title="Keiko Shigeta" href="mailto:shigeta.k118@gmail.com">
-<link rel="help" href="http://www.w3.org/TR/css-shapes/#funcdef-circle">
-<style>
- #container {
- width: 100px;
- height: 100px;
- background-color: yellow;
- position: relative;
- }
- .inline-square {
- width: 50px;
- height: 50px;
- background: green;
- position: absolute;
- }
- #box1{
- top: 0;
- right: 0;
- }
- #box2{
- bottom: 0;
- left: 0;
- }
-</style>
-<body>
- <p>The test passes if there are two green square boxes aligned diagonally from top right to bottom left.</p>
- <div id="container">
- <div id="box1" class="inline-square"></div>
- <div id="box2" class="inline-square"></div>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/keiko-kiki/shape-circle-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/keiko-kiki/shape-circle-001.html
deleted file mode 100644
index a70f110ce88..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/keiko-kiki/shape-circle-001.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<title>CSS Test: CSS Shapes circle() with negative cx, negative cy and positive r</title>
-<link rel="author" title="Keiko Shigeta" href="mailto:shigeta.k118@gmail.com">
-<link rel="help" href="http://www.w3.org/TR/css-shapes/#funcdef-circle">
-<link rel="match" href="refarence/ref-shape-circle-001.html">
-<meta name="assert" content="Test checks that there are two green square boxes aligned diagonally from top right to bottom left.">
-<style>
- #container {
- width: 100px;
- line-height: 0;
- }
- #float-left {
- shape-outside: circle(-1px, -1px, 51px);
- float: left;
- width: 100px;
- height: 100px;
- background-color: yellow;
- }
- .inline-square {
- display: inline-block;
- width: 50px;
- height: 50px;
- background: green;
- margin: 0;
- }
-</style>
-<body>
- <p>The test passes if there are two green square boxes aligned diagonally from top right to bottom left.</p>
- <div id="container">
- <div id="float-left"></div>
- <div class="inline-square"></div>
- <div class="inline-square"></div>
- </div>
-</body>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/dish-isolated.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/dish-isolated.png
deleted file mode 100644
index af840533506..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/dish-isolated.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-000.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-000.html
deleted file mode 100644
index 4f975fcf94e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-000.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
-
- <title>CSS Shapes Test: ellipse invalid cx value</title>
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
- <link rel="author" title="Lou Tongbing" href="mailto:loutongbing:loutongbing@gmail.com">
-
- <link rel="help" href="http://www.w3.org/TR/css-shapes/#Supported Shapes">
- <link rel="match" href="shape-ref.html"/>
- <meta name="flags" content="dom">
- <meta name="assert" content="ellipse invalid cx value.">
- <style>
- .ellipse {
- float: left;
- width: 600px;
- height: 600px;
- shape-outside: ellipse(200, 200px, 300px, 100px);
- shape-margin: 20px;
- }
- .text {
- width: 750px;
-
- }
- </style>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-
- </head>
- <body>
- <p>Test passes if there is the invalid cx value.</p>
- <div class="container">
- <img id="shape" class="ellipse" src="http://adobe-webplatform.github.io/exclusionsrecipe/dish-isolated.png"></img>
- <!--img id="shape" class="ellipse" src="dish-isolated.png">
- </img-->
-
- <p class="text">
- 我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。
- 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。
- </p>
-
- </div>
- <div id="log"></div>
- <script type="text/javascript">
- var obj = document.getElementById("shape");
- var cx = getComputedStyle(obj).webkitShapeOutside;
- test(function () {
- assert_equals(cx,"auto","pass");
- });
- </script>
- </body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-001.html
deleted file mode 100644
index 97d28c1f96d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/loutongbing/shape-outside-invalid-ellipse-001.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
-
- <title>CSS Shapes Test: ellipse invalid cy value</title>
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
- <link rel="author" title="Lou Tongbing" href="mailto:loutongbing:loutongbing@gmail.com">
-
- <link rel="help" href="http://www.w3.org/TR/css-shapes/#Supported Shapes">
- <link rel="match" href="shape-ref.html"/>
- <meta name="flags" content="dom">
- <meta name="assert" content="ellipse invalid cy value.">
- <style>
- .ellipse {
- float: left;
- width: 600px;
- height: 600px;
- shape-outside: ellipse(200px, 100, 300px, 100px);
- shape-margin: 20px;
- }
- .text {
- width: 750px;
-
- }
- </style>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-
- </head>
- <body>
- <p>Test passes if there is the invalid cy value.</p>
- <div class="container">
- <img id="shape" class="ellipse" src="http://adobe-webplatform.github.io/exclusionsrecipe/dish-isolated.png"></img>
- <!--img id="shape" class="ellipse" src="dish-isolated.png">
- </img-->
-
- <p class="text">
- 我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。
- 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。我非常高兴来深圳开会,深圳是个好地方。来几次都不过分。 我深深地爱上了这片土地。
- </p>
-
- </div>
- <div id="log"></div>
- <script type="text/javascript">
- var obj = document.getElementById("shape");
- var cy = getComputedStyle(obj).webkitShapeOutside;
- test(function () {
- assert_equals(cy,"auto","pass");
- });
- </script>
- </body>
-
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001-ref.html
deleted file mode 100644
index 9c2295e4751..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001-ref.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="UTF-8">
- <title>CSS Test: grapheme clusters and letter-spacing</title>
- <link rel="author" title="Mark Qin" href="mailto:qclaaa@gmail.com" />
- <style type="text/css">
- .test1 { letter-spacing: 1em; }
- div { border: solid; width: 10em; line-height: 2;}
- </style>
-</head>
-<body>
- <div class="test1">&#x300;A</div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001.html
deleted file mode 100644
index 17531fc50bc..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters-001.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="UTF-8">
- <title>CSS Test: grapheme clusters and letter-spacing</title>
- <link rel="author" title="Mark Qin" href="mailto:qclaaa@gmail.com" />
- <link rel="match" href="letter-spacing-and-grapheme-clusters-001-ref.html" />
- <style type="text/css">
- .test1 { letter-spacing: 1em; }
- div { border: solid; width: 10em; line-height: 2;}
- </style>
-</head>
-<body>
- <div class="test1">À</div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters.html
deleted file mode 100644
index 8987fd1ee8a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-and-grapheme-clusters.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>CSS Test: grapheme clusters and letter-spacing</title>
-<link rel="author" title="Mark Qin" href="mailto:qclaaa@gmail.com"/>
-<style type="text/css">
-
-.test1 { letter-spacing: 1em; }
-div { border: solid; width: 10em; line-height: 2;}
-</style>
-</head>
-<body lang="en">
-
-<div class="test1">ÀàÇçÉéÈèÊêÔôŸÿ</div>
-<div class="test1">À à Ç ç É é È è Ê ê Ô ô Ÿ ÿ</div>
-<div class="test1">hello world!</div>
-<div class="test1">한국말선어</div>
-<div class="test1">한국말조선어</div>
-<div class="test1">アクセント</div>
-<div class="test1">アクセントの滝</div>
-<div class="test1">我是短中文</div>
-<div class="test1">我是长中文啊长中文</div>
-
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-value-1em.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-value-1em.html
deleted file mode 100644
index 6f0e762f9b6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/letter-spacing-value-1em.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta charset="utf-8">
- <title>CSS Test: letter-spacing - value -1em - basic cases</title>
- <link rel="help" href="http://www.w3.org/TR/css3-text/#letter-spacing-property"/>
- <link rel="author" title="Smallni Ding" href="mailto:smallniding@tencent.com"/>
- <style type="text/css">
- p{ border: 1px solid #000; }
-.em1{letter-spacing: 0;}
-.em2{ letter-spacing: 1em;}
-.em3{ letter-spacing: -1em;}
- </style>
- </head>
- <body>
-<!-- when the letter-spacing's value is -1em,it's different from Chinese and English.English characters are moved left,but Chinese characters are added together. -->
-
-<p class="em1">ABCDEFGHIJKLMNOPQRSTUVWXYZ</p>
-<p class="em2">ABCDEFGHIJKLMNOPQRSTUVWXYZ</p>
-<p class="em3">ABCDEFGHIJKLMNOPQRSTUVWXYZ</p>
-
-
-<p class="em1">你好世界</p>
-<p class="em2">你好世界</p>
-<p class="em3">你好世界</p>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/where-is-letter-spacing-applied.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/where-is-letter-spacing-applied.html
deleted file mode 100644
index 348cbc5fcc3..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/markqin/where-is-letter-spacing-applied.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="UTF-8">
- <title>CSS Test: where is letter-spacing applied or not applied</title>
- <link rel="author" title="Mark Qin" href="mailto:qclaaa@gmail.com" />
- <style type="text/css">
- .test1 { letter-spacing: 1em; }
- div { border: solid; width: 10em; font-family: Ahem; line-height: 2;}
- </style>
-</head>
-<body>
- <div class="test1">ABCDEFGHIJKL</div>
- <div class="test1">ABCD EFGH IJKL</div>
- <div class="test1">hello world!</div>
- <div class="test1">我是短中文</div>
- <div class="test1">我是长中文啊长中文</div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/onlymollah/shape-outside-negative-center-positive-radius-ellipse-000.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/onlymollah/shape-outside-negative-center-positive-radius-ellipse-000.html
deleted file mode 100644
index f0bbe267d8f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/onlymollah/shape-outside-negative-center-positive-radius-ellipse-000.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>无标题文档</title>
-<link rel="author" title="Mollah Zhou" href="mailto:onlymollah@gmail.com">
-<style>
- .container {
- padding-left: 120px;
- width: 700px;
- height: 500px;
- bordeR: 1px solid black;
- overflow-x: hidden;
- overflow-y: scroll;
- text-align: justify;
- font-family: Tahoma, Geneva, sans-serif;
- }
- .float-left {
- float: left;
- width: 120px;
- height: 80px;
- /*margin-left: -40px;*/
- }
- .ellipse{
- background-color: #FC0;
- /*
- Ellipse - negative cx, negative cy, positive rx, ry - ref test
- set the ellipse of shape-outside
- */
- shape-outside: ellipse(-60px, -40px, 50px, 50px);
- -webkit-shape-outside: ellipse(-60px, -40px, 50px, 50px);
- /*
- it can use with the down data:
- -webkit-clip-path: ellipse(-60px, -40px, 50px, 50px);
- if only set it, it is just clip the path, but it takes the whole place.
- */
- }
- .txt{background-color:#999;}
- /*.ellipse {
- shape-outside: ellipse(50%, 50%, 25%, 50%);
- clip-path is not working with prefix-free.
- -webkit-clip-path: ellipse(50%, 50%, 25%, 50%);
- -background: orange;
- shape-margin: 5px;
- -webkit-shape-outside: ellipse(50%, 50%, 25%, 50%);
- clip-path is not working with prefix-free.
- --webkit-clip-path: ellipse(50%, 50%, 25%, 50%);
- -webkit-shape-margin: 5px;
- }*/
-</style>
-</head>
-
-<body>
- <div class=container>
- <h3>The circle and the ellipse</h3>
- <div class="float-left ellipse"></div>
- <p class="txt">Once upon a time, there was a green circle. A very ordinary green circle. The circle could roll this way and that. It was also very round. Oh, and very green. The circle wasn't bothered by how very ordinary things were, in fact; it couldn't have been happier. Being green and round was the circle's very favorite things.</p>
- </div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/smallni/letter-spacing-value-1em.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/smallni/letter-spacing-value-1em.html
deleted file mode 100644
index 6f0e762f9b6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/smallni/letter-spacing-value-1em.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta charset="utf-8">
- <title>CSS Test: letter-spacing - value -1em - basic cases</title>
- <link rel="help" href="http://www.w3.org/TR/css3-text/#letter-spacing-property"/>
- <link rel="author" title="Smallni Ding" href="mailto:smallniding@tencent.com"/>
- <style type="text/css">
- p{ border: 1px solid #000; }
-.em1{letter-spacing: 0;}
-.em2{ letter-spacing: 1em;}
-.em3{ letter-spacing: -1em;}
- </style>
- </head>
- <body>
-<!-- when the letter-spacing's value is -1em,it's different from Chinese and English.English characters are moved left,but Chinese characters are added together. -->
-
-<p class="em1">ABCDEFGHIJKLMNOPQRSTUVWXYZ</p>
-<p class="em2">ABCDEFGHIJKLMNOPQRSTUVWXYZ</p>
-<p class="em3">ABCDEFGHIJKLMNOPQRSTUVWXYZ</p>
-
-
-<p class="em1">你好世界</p>
-<p class="em2">你好世界</p>
-<p class="em3">你好世界</p>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/gradient.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/gradient.png
deleted file mode 100644
index a872391c295..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/gradient.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-01.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-01.html
deleted file mode 100644
index 9f8dcd2824a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-01.html
+++ /dev/null
@@ -1,38 +0,0 @@
-
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
- <title>luminance mask and alpha mask</title>
- <link rel="author" title="yanghengfeng"
- href="mailto:yanghengfeng@163.com">
- <link rel="help"
- href="http://www.w3.org/TR/css-masking/#MaskElement">
- <meta name="assert"
- content="">
- <link rel="match" href="">
-<style type="text/css">
-.mask{width:200px;height:200px;margin: 10px; background-color: blue;}
-#masked{
- -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns:xlink='http://www.w3.org/1999/xlink' xmlns='http://www.w3.org/2000/svg' width='200' height='200'><radialGradient id='grad'><stop offset='0%' stop-color='#000' /><stop offset='100%' stop-color='yellow' stop-opacity='0'/></radialGradient><rect width='200' height='200' fill='url(#grad)'/></svg>");
-}
-#maskasBackground{
- background:url("data:image/svg+xml;utf8,<svg xmlns:xlink='http://www.w3.org/1999/xlink' xmlns='http://www.w3.org/2000/svg' width='200' height='200'><radialGradient id='grad'><stop offset='0%' stop-color='#000' /><stop offset='100%' stop-color='yellow' stop-opacity='0'/></radialGradient><rect width='200' height='200' fill='url(#grad)'/></svg>");
-}
-#luminancemask{
- -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns:xlink='http://www.w3.org/1999/xlink' xmlns='http://www.w3.org/2000/svg' width='200' height='200'><radialGradient id='grad'><stop offset='0%' stop-color='#000' /><stop offset='100%' stop-color='yellow' stop-opacity='0'/></radialGradient><rect width='200' height='200' fill='url(#grad)'/></svg>");
- mask-source-type:luminance;
-}
-</style>
-</head>
-<body>
-blue background color div
-<div id="withoutmask" class="mask"></div>
-svg as background
-<div id="maskasBackground" class="mask"></div>
-alpha masked(default) svg div
-<div id="masked" class="mask"></div>
-luminance masked svg div
-<div id="luminancemask" class="mask"></div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-02-mask-box.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-02-mask-box.html
deleted file mode 100644
index 0c0b8b92c44..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_shenzen/yanghengfeng/mask-test-02-mask-box.html
+++ /dev/null
@@ -1,42 +0,0 @@
-
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
- <title>mask-image-box</title>
- <link rel="author" title="yanghengfeng"
- href="mailto:yanghengfeng@163.com">
- <link rel="help"
- href="http://www.w3.org/TR/css-masking/#MaskElement">
- <meta name="assert"
- content="assert border image slice width: 39px works fine but 40px does not work">
- <link rel="match" href="">
-<style type="text/css">
-#mask,#mask40{width:10px;height:10px; border:200px solid blue;
- background-color: yellow;
- background-clip: content-box;
-}
-#mask{
- -webkit-mask-box-image-slice: 39 fill;
- -webkit-mask-box-image-repeat: stretch;
- -webkit-mask-box-image-source: url(gradient.png);
-}
-#mask40{
- -webkit-mask-box-image-slice: 40 fill;
- -webkit-mask-box-image-repeat: stretch;
- -webkit-mask-box-image-source: url(gradient.png);
-}
-</style>
-</head>
-<body>
- <h1>border image slice width: 39px works fine but 40px does not work</h1>
- <h2>image width 80px width 80px height and radial gradient</h2>
-<div style="background-color:green;width:80px;height:80px;">
-<img src="gradient.png" />
-</div>
-<h2>use as mask-box-image slice 39px</h2>
-<div id="mask"></div>
-<h2>use as mask-box-image slice 40px</h2>
-<div id="mask40"></div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001-ref.html
deleted file mode 100644
index 1d09ecdc8cc..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001-ref.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Reftest Reference</title>
- <link rel="author" title="Hiromi Hayashi" href="mailto:hayashih@gmail.com">
- <style type="text/css">
- div {
- width: 200px;
- height: 200px;
- background-color: green;
- position:absolute;
- top:50px;
- left:10px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a green box.</p>
-
- <div></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001.html
deleted file mode 100644
index ac7e91b4250..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hayashih/padding-box-001.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS UI box-sizing: Test for box-sizing: padding-box</title>
- <link rel="author" title="Hiromi Hayashi" href="mailto:hayashih@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/2012/WD-css3-ui-20120117/#box-sizing0">
- <link rel="match" href="padding-box-001-ref.html">
- <meta name="flags" content="">
- <meta name="assert" content="box-sizing with padding-box sets the width and height of the element so that is takes padding widths into account.">
- <style type="text/css">
-
- .background {
- box-sizing: padding-box;
- width: 200px;
- height: 200px;
- padding: 20px;
- background-color: red;
- position:absolute;
- top: 50px;
- left: 10px;
- }
- .forward{
- width: 200px;
- height: 200px;
- background-color: green;
- position:absolute;
- top: 50px;
- left: 10px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is a green box.</p>
- <div class="background"></div>
- <div class="forward"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hiromitsuuuuu/test_font_face_parser.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hiromitsuuuuu/test_font_face_parser.html
deleted file mode 100644
index 3b5856791fc..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/hiromitsuuuuu/test_font_face_parser.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset=utf-8>
- <title>CSS Fonts Test: @font-feature-values rule parsing tests</title>
- <link rel="author" title="Hiromi Morikawa" href="mailto:hiromitsuuuuu@gmail.com">
- <!-- You must have at least one spec link, but may have as many as are covered in the test. -->
- <!-- Be sure to make the main testing area first in the order -->
- <link rel="help" href="http://www.w3.org/TR/css3-fonts/#font-face-rule">
- <!-- The match link is only required if this is a reftest -->
- <!--<link rel="match" href="reference/REFERENCE-FILE-NAME">
- <meta name="flags" content="">-->
- <meta name="assert" content="tests that valid @font-feature-values rules parse and invalid ones don't">
-
- <script type="text/javascript" src="/resources/testharness.js"></script>
- <script type="text/javascript" src="/resources/testharnessreport.js"></script>
-
- <style type="text/css">
-
- /* This is just 'paesing test'. So noexist URL is ok. */
- @font-face {
- font-family: cssTestBasicFont;
- src: url(http://example.com/testfont.ttf);
- }
-
- p {
- font-family: cssTestBasicFont, serif;
- }
-
-
-
- </style>
-
-</head>
-<body>
-
- <div id="log"></div>
- <p>test</p>
-
- <script>
-
- var sheet = document.styleSheets[0];
-
- var path = "http://example.com/testfont.ttf";
-
- /* strip out just values */
- function extractDecl(rule){
- // console.log(rule);
- var t = rule.split(/\s/).join("");
- console.log(t);
- return t;
- }
-
- function testFontFaceParser(){
-
- var expected = "@font-face { font-family: cssTestBasicFont; src: url("+path+"); }";
- var actual = extractDecl(sheet.cssRules[0].cssText);
-
- test(function(){
- assert_equals(extractDecl(actual),extractDecl(expected));
- },'tests that valid @font-face rules parse.');
-
- }
-
- testFontFaceParser();
-
-
-
-
- </script>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001-ref.html
deleted file mode 100644
index 7ce76b6d72a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001-ref.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Reftest Reference</title>
- <link rel="author" title="Ryo Kashiwagi" href="mailto:kasshisatari@gmail.com">
- <style type="text/css">
- div {
- width: 200px;
- height: 200px;
- background-color: green;
- position:absolute;
- top:50px;
- left:10px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is only a green box.</p>
-
- <div></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001.html
deleted file mode 100644
index 975c2a90a09..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/kasshisatari/border-box-001.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS UI box-sizing : Test for box-sizing: border-box</title>
- <link rel="author" title="Ryo Kashiwagi" href="mailto:kasshisatari@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-ui/#box-sizing">
- <link rel="match" href="border-box-001-ref.html">
- <meta name="flags" content="">
- <meta name="assert" content="box-sizing with border-box sets the width and the height of the element so that it takes padding and border widths into account.">
- <style type="text/css">
-
- .background {
- box-sizing: border-box;
- width: 200px;
- height: 200px;
- border:20px solid red;
- background-color: red;
- position:absolute;
- top:50px;
- left:10px;
- }
- .forward{
- width: 200px;
- height: 200px;
- background-color: green;
- position:absolute;
- top:50px;
- left:10px;
- }
- </style>
-</head>
-<body>
- <p>The test passes if there is only a green box.</p>
- <div class="background"></div>
- <div class="forward"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/ahem.css b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/ahem.css
deleted file mode 100644
index 884a41198b8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/ahem.css
+++ /dev/null
@@ -1,4 +0,0 @@
-@font-face {
- font-family: "Ahem";
- src: url(../fonts/Ahem.ttf);
-}
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2-ref.xhtml
deleted file mode 100644
index 26033bf78f8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2-ref.xhtml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for behavior of the 'baseline' value for align-items and
- align-self.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- .flexbox {
- display: block;
- border: 1px dashed blue;
- font: 14px sans-serif;
- }
-
- input { height: 30px; }
-
- textarea {
- width: 30px;
- height: 50px;
- }
-
- div.multilinebutton {
- /* For comparison vs. "button.multilinebutton" in the testcase: */
- -moz-appearance: button;
- display: block;
- text-align: center;
- font: 20px sans-serif;
- padding-top: 1px;
- height: 49px;
- width: 20px;
- }
-
- div { display: inline-block; }
- table { display: inline-table; }
-
- .lime { background: lime; }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <div class="lime">text</div
- ><input type="text" style="width: 20px; min-width: 0;" value="input"
- /><textarea style="width: 30px">t e x t a r e a </textarea
- ><table cellspacing="0" cellpadding="0">
- <div class="multilinebutton">b<br/>t<br/>n</div>
- </table>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2.xhtml
deleted file mode 100644
index b8e445215eb..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-2.xhtml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Testcase for behavior of the 'baseline' value for align-items (and
- align-self, implicitly). This test baseline-aligns various types of
- content, and the flexbox's vertical size depends on the aggregate
- post-alignment height of its children.
-
- This test checks baseline-alignment for a text <input> field, a
- <textarea>, and a <button> with a multi-line label.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- .flexbox {
- display: flex;
- align-items: baseline;
- border: 1px dashed blue;
- font: 14px sans-serif;
- }
-
- input { height: 30px; }
-
- textarea {
- width: 30px;
- height: 50px;
- }
-
- button.multilinebutton {
- font: 20px sans-serif;
- color: black;
- padding: 0;
- height: 50px;
- width: 20px;
- -moz-box-sizing: content-box;
- }
-
- .lime { background: lime; }
- .orange { background: orange; }
- .pink { background: pink; }
- .aqua { background: aqua; }
- .violet { background: violet; }
- .tan { background: tan; }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <div class="lime">text</div>
- <input type="text" style="width: 20px; min-width: 0;" value="input"/>
- <textarea style="width: 30px">t e x t a r e a </textarea>
- <button class="multilinebutton">b<br/>t<br/>n</button>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3-ref.xhtml
deleted file mode 100644
index 34a1b081c35..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3-ref.xhtml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for behavior of the 'baseline' value for align-items and
- align-self.
-
- NOTE: For multi-line 'display: block' flex items in the testcase, we use
- an inline-table here in the reference case, so that we get first-line
- baseline alignment. (If we used an inline-block instead, that would give
- us *last-line* baseline alignment.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- .flexbox {
- display: block;
- border: 1px dashed blue;
- font: 14px sans-serif;
- }
-
- div { display: inline-block; }
- table { display: inline-table; }
-
- .big {
- height: 100px;
- font: 24px sans-serif;
- margin-top: 20px;
- }
-
- .lime { background: lime; }
- .pink { background: pink; }
- .aqua { background: aqua; }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <div class="lime">text</div
- ><button>btn</button
- ><input type="radio"
- /><input type="checkbox"
- /><label class="pink">label</label
- ><table cellspacing="0" cellpadding="0" class="aqua">
- <label>lab<br/>el</label>
- </table
- ><table cellspacing="0" cellpadding="0">
- <fieldset>field<br/>set</fieldset>
- </table
- ><table cellspacing="0" cellpadding="0">
- <fieldset><legend>leg</legend>field<br/>set</fieldset>
- </table
- ><table cellspacing="0" cellpadding="0">
- <fieldset><legend>leg<br/>end</legend>field<br/>set</fieldset>
- </table>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3.xhtml
deleted file mode 100644
index 199162379a9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-3.xhtml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Testcase for behavior of the 'baseline' value for align-items (and
- align-self, implicitly). This test has various types of baseline-aligned
- content, and the flexbox's vertical size depends on the aggregate
- post-alignment height of its children.
-
- This test checks baseline-alignment for text <button>, for
- various <input> fields, for <label>, and for <fieldset>.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- .flexbox {
- display: flex;
- align-items: baseline;
- border: 1px dashed blue;
- font: 14px sans-serif;
- }
-
- .big {
- height: 100px;
- font: 24px sans-serif;
- margin-top: 20px;
- }
-
- .lime { background: lime; }
- .pink { background: pink; }
- .aqua { background: aqua; }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <div class="lime">text</div>
- <button>btn</button>
- <input type="radio"/>
- <input type="checkbox"/>
- <label class="pink">label</label>
- <label class="aqua">lab<br/>el</label>
- <fieldset>field<br/>set</fieldset>
- <fieldset><legend>leg</legend>field<br/>set</fieldset>
- <fieldset><legend>leg<br/>end</legend>field<br/>set</fieldset>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4-ref.xhtml
deleted file mode 100644
index 867fa4cfc82..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4-ref.xhtml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for behavior of the 'baseline' value for align-items and
- align-self.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- display: block;
- border: 1px dashed blue;
- font: 14px sans-serif;
- }
-
- div { display: inline-block; }
- table {
- display: inline-table;
- margin: 1px; /* to fix fuzziness from text overlapping table border */
- }
-
- .lime { background: lime; }
- .pink { background: pink; }
- .aqua { background: aqua; }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <div class="lime">text</div
- ><table class="pink" border="1">
- <tr><td>tr1</td></tr>
- <tr><td>tr2</td></tr>
- </table>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4.xhtml
deleted file mode 100644
index 266134a030a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-align-self-baseline-horiz-4.xhtml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Testcase for behavior of the 'baseline' value for align-items (and
- align-self, implicitly). This test baseline-aligns a <table>.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- display: flex;
- align-items: baseline;
- border: 1px dashed blue;
- font: 14px sans-serif;
- }
-
- table {
- margin: 1px; /* to fix fuzziness from text overlapping table border */
- }
-
- .lime { background: lime; }
- .pink { background: pink; }
- .aqua { background: aqua; }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <div class="lime">text</div>
- <table class="pink" border="1">
- <tr><td>tr1</td></tr>
- <tr><td>tr2</td></tr>
- </table>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2-ref.xhtml
deleted file mode 100644
index 5db0db9b34f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2-ref.xhtml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- canvas {
- width: 50px;
- height: 50px;
- background: purple;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <canvas/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2.xhtml
deleted file mode 100644
index 424edd04cea..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-horiz-2.xhtml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that a canvas element with "min-width: min-content"
- and a huge specified "width" ends up being shrinkable. (In particular,
- the large "width" value shouldn't influence the min-content width).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- canvas {
- width: 1000px;
- height: 50px;
- background: purple;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <canvas/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2-ref.xhtml
deleted file mode 100644
index a2bea16dd49..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2-ref.xhtml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- canvas {
- width: 50px;
- height: 50px;
- background: purple;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <canvas/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2.xhtml
deleted file mode 100644
index 2ba684cf2c7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-canvas-vert-2.xhtml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that a canvas element with "min-height: min-content"
- and a huge specified "height" ends up being shrinkable. (In particular,
- the large "height" value shouldn't influence the min-content height).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- canvas {
- width: 50px;
- height: 1000px;
- background: purple;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <canvas/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2-ref.xhtml
deleted file mode 100644
index 2ab90d36c0e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2-ref.xhtml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- fieldset {
- width: 50px;
- height: 50px;
- background: purple;
- border: 1px dotted green;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <fieldset/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2.xhtml
deleted file mode 100644
index c6031ffc320..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-horiz-2.xhtml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that a fieldset element with "min-width: min-content"
- and a huge specified "width" ends up being shrinkable. (In particular,
- the large "width" value shouldn't influence the min-content width).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- fieldset {
- width: 1000px;
- height: 50px;
- background: purple;
- border: 1px dotted green;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <fieldset/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2-ref.xhtml
deleted file mode 100644
index b4a630467ed..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2-ref.xhtml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- fieldset {
- width: 50px;
- height: 50px;
- background: purple;
- border: 1px dotted green;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <fieldset/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2.xhtml
deleted file mode 100644
index ac416619339..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-fieldset-vert-2.xhtml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that a fieldset element with "min-height: min-content"
- and a huge specified "height" ends up being shrinkable. (In particular,
- the large "height" value shouldn't influence the min-content height).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- fieldset {
- width: 50px;
- height: 1000px;
- background: purple;
- border: 1px dotted green;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <fieldset/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2-ref.xhtml
deleted file mode 100644
index 1d7ed6583d1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2-ref.xhtml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- iframe {
- width: 50px;
- height: 50px;
- background: purple;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <iframe/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2.xhtml
deleted file mode 100644
index f1b20c91814..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-horiz-2.xhtml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that an iframe element with "min-width: min-content"
- and a huge specified "width" ends up being shrinkable. (In particular,
- the large "width" value shouldn't influence the min-content width).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- iframe {
- width: 1000px;
- height: 50px;
- background: purple;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <iframe/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2-ref.xhtml
deleted file mode 100644
index a5591876d29..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2-ref.xhtml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- iframe {
- width: 50px;
- height: 50px;
- background: purple;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <iframe/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2.xhtml
deleted file mode 100644
index c5656325316..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-iframe-vert-2.xhtml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that an iframe element with "min-height: min-content"
- and a huge specified "height" ends up being shrinkable. (In particular,
- the large "height" value shouldn't influence the min-content height).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- iframe {
- width: 50px;
- height: 1000px;
- background: purple;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <iframe/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2-ref.xhtml
deleted file mode 100644
index e1a2284a947..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2-ref.xhtml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- img {
- width: 50px;
- height: 50px;
- background: purple;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <img src="solidblue.png"/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2.xhtml
deleted file mode 100644
index af8c4fae226..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-horiz-2.xhtml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that an img element with "min-width: min-content"
- and a huge specified "width" ends up being shrinkable. (In particular,
- the large "width" value shouldn't influence the min-content width).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- img {
- width: 1000px;
- height: 50px;
- background: purple;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <img src="solidblue.png"/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2-ref.xhtml
deleted file mode 100644
index 73bb6e4fdf7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2-ref.xhtml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- img {
- width: 50px;
- height: 50px;
- background: purple;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <img src="solidblue.png"/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2.xhtml
deleted file mode 100644
index da12c592509..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-img-vert-2.xhtml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that an img element with "min-height: min-content"
- and a huge specified "height" ends up being shrinkable. (In particular,
- the large "height" value shouldn't influence the min-content height).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- img {
- width: 50px;
- height: 1000px;
- background: purple;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <img src="solidblue.png"/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2-ref.xhtml
deleted file mode 100644
index 4e3dc23fef9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2-ref.xhtml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- textarea {
- width: 50px;
- height: 50px;
- background: purple;
- border: 1px dotted green;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <textarea/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2.xhtml
deleted file mode 100644
index 5b5c837c026..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-horiz-2.xhtml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that a textarea element with "min-width: min-content"
- and a huge specified "width" ends up being shrinkable. (In particular,
- the large "width" value shouldn't influence the min-content width).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- textarea {
- width: 1000px;
- height: 50px;
- background: purple;
- border: 1px dotted green;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <textarea/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2-ref.xhtml
deleted file mode 100644
index b6b1c40c2dd..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2-ref.xhtml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- textarea {
- width: 50px;
- height: 50px;
- background: purple;
- border: 1px dotted green;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <textarea/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2.xhtml
deleted file mode 100644
index e6015f5ec2c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-textarea-vert-2.xhtml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that a textarea element with "min-height: min-content"
- and a huge specified "height" ends up being shrinkable. (In particular,
- the large "height" value shouldn't influence the min-content height).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- textarea {
- width: 50px;
- height: 1000px;
- background: purple;
- border: 1px dotted green;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <textarea/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2-ref.xhtml
deleted file mode 100644
index d1829d0c1fb..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2-ref.xhtml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- video {
- width: 50px;
- height: 50px;
- background: purple;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <video/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2.xhtml
deleted file mode 100644
index 4a5794e5c4e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-horiz-2.xhtml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that a video element with "min-width: min-content"
- and a huge specified "width" ends up being shrinkable. (In particular,
- the large "width" value shouldn't influence the min-content width).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- }
- video {
- width: 1000px;
- height: 50px;
- background: purple;
- min-width: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <video/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2-ref.xhtml
deleted file mode 100644
index bdba373cfb1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2-ref.xhtml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- video {
- width: 50px;
- height: 50px;
- background: purple;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <video/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2.xhtml
deleted file mode 100644
index e1736532706..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-basic-video-vert-2.xhtml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that a video element with "min-height: min-content"
- and a huge specified "height" ends up being shrinkable. (In particular,
- the large "height" value shouldn't influence the min-content height).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 50px;
- width: 50px;
- border: 2px dotted black;
- display: flex;
- flex-direction: column;
- }
- video {
- width: 50px;
- height: 1000px;
- background: purple;
- /* min-height: min-content isn't supported yet (bug 852367), but we'd
- like this to work when it is supported. */
- min-height: -moz-min-content;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <video/>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-iframe.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-iframe.html
deleted file mode 100644
index 3801464ee2b..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-iframe.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<html>
- <head>
- <style>
- body {
- margin: 0;
- }
- .outerContainer {
- display: flex;
- height: 100px;
- background-color: red;
- }
- .innerContainer {
- display: flex;
- flex: 1;
- background-color: lime;
- }
- </style>
- </head>
- <body>
- <div class="outerContainer">
- <div class="innerContainer"></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-ref.xhtml
deleted file mode 100644
index 889ac83ce49..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1-ref.xhtml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- #container {
- width: 100px;
- height: 100px;
- background: lime;
- }
- </style>
- </head>
- <body>
- <div id="container"></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1.xhtml
deleted file mode 100644
index 889b479c04f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-1.xhtml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that we reflow nested flex containers sufficiently when
- the window (or the iframe we're inside of) is horizontally resized.
-
- This test should end up rendering as a lime square, 100px by 100px.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- #frame {
- width: 400px;
- height: 200px;
- border: 0;
- }
- </style>
- <script>
- function tweak() {
- document.getElementById("frame").style.width = "100px";
- document.documentElement.removeAttribute("class");
- }
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <iframe id="frame" src="flexbox-dyn-changeFrameWidth-1-iframe.html"></iframe>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-iframe.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-iframe.html
deleted file mode 100644
index 41a4a4c8028..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-iframe.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<html>
- <head>
- <style>
- body {
- margin: 0;
- }
- #container {
- display: flex;
- flex-direction: column;
- border: 10px solid lime;
- width: 80px;
- height: 80px;
- background-color: red;
- }
- #item {
- background-color: lime;
- width: 80px;
- height: 80px;
- }
- </style>
- </head>
- <body>
- <div id="container">
- <div id="item"></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-ref.xhtml
deleted file mode 100644
index 889ac83ce49..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2-ref.xhtml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- #container {
- width: 100px;
- height: 100px;
- background: lime;
- }
- </style>
- </head>
- <body>
- <div id="container"></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2.xhtml
deleted file mode 100644
index fdb0590959d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-2.xhtml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that we don't end up with the effects of an intermediate
- "measuring" reflow left over, when we resize a window that contains a
- vertical flex container with a fixed-height flex item.
-
- This test should end up rendering as a lime square, 100px by 100px.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- #frame {
- width: 400px;
- height: 200px;
- border: 0;
- }
- </style>
- <script>
- function tweak() {
- document.getElementById("frame").style.width = "100px";
- document.documentElement.removeAttribute("class");
- }
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <iframe id="frame" src="flexbox-dyn-changeFrameWidth-2-iframe.html"></iframe>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-iframe.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-iframe.html
deleted file mode 100644
index b3e7dc27c82..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-iframe.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<html>
- <head>
- <style>
- body {
- margin: 0;
- }
- #container {
- display: flex;
- flex-direction: column;
- border: 10px solid lime;
- width: 80px;
- height: 80px;
- background-color: red;
- }
- #item {
- background-color: lime;
- min-height: 0;
- width: 80px;
- height: auto;
- line-height: 80px;
- }
- </style>
- </head>
- <body>
- <div id="container">
- <div id="item">&nbsp;</div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-ref.xhtml
deleted file mode 100644
index 889ac83ce49..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3-ref.xhtml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- #container {
- width: 100px;
- height: 100px;
- background: lime;
- }
- </style>
- </head>
- <body>
- <div id="container"></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3.xhtml
deleted file mode 100644
index c4124690251..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-3.xhtml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that we don't end up with the effects of an intermediate
- "measuring" reflow left over, when we resize a window that contains a
- vertical flex container with an auto-height flex item.
-
- This test should end up rendering as a lime square, 100px by 100px.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- #frame {
- width: 400px;
- height: 200px;
- border: 0;
- }
- </style>
- <script>
- function tweak() {
- document.getElementById("frame").style.width = "100px";
- document.documentElement.removeAttribute("class");
- }
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <iframe id="frame" src="flexbox-dyn-changeFrameWidth-3-iframe.html"></iframe>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-iframe.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-iframe.html
deleted file mode 100644
index 72cb0af38b8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-iframe.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<html>
- <head>
- <style>
- body {
- margin: 0;
- }
- .container {
- display: flex;
- background-color: lime;
- top: 0;
- bottom: 0;
- position: absolute;
- width: 100px;
- }
- </style>
- </head>
- <body>
- <div class="container"></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-ref.xhtml
deleted file mode 100644
index 889ac83ce49..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4-ref.xhtml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- #container {
- width: 100px;
- height: 100px;
- background: lime;
- }
- </style>
- </head>
- <body>
- <div id="container"></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4.xhtml
deleted file mode 100644
index 80a7a1cd5fd..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changeFrameWidth-4.xhtml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that we sufficiently reflow abspos flex containers that
- have top:0;bottom:0 (which ends up effectively being like height:100%)
- the window (or the iframe we're inside of) is vertically resized.
-
- This test should end up rendering as a lime square, 100px by 100px.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- #frame {
- width: 100px;
- height: 50px;
- border: 0;
- }
- </style>
- <script>
- function tweak() {
- document.getElementById("frame").style.height = "100px";
- document.documentElement.removeAttribute("class");
- }
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <iframe id="frame" src="flexbox-dyn-changeFrameWidth-4-iframe.html"></iframe>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1-ref.xhtml
deleted file mode 100644
index 681a3cb4ccb..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1-ref.xhtml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- #container {
- display: flex;
- width: 100px;
- height: 100px;
- background: lime;
- }
- </style>
- </head>
- <body>
- <div id="container"></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1a.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1a.xhtml
deleted file mode 100644
index 600ab0fafa9..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1a.xhtml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that we reflow sufficiently when a grandchild of a
- flex container needs an incremental reflow. This test should end up
- rendering as a lime square, 100px by 100px.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- #container {
- display: flex;
- flex-direction: column;
- width: 100px;
- }
- #item {
- background: red;
- }
- #tweakMe {
- height: 100px;
- background: orange;
- padding-left: 1px;
- }
- </style>
- <script>
- function tweak() {
- var tweakMe = document.getElementById("tweakMe");
- tweakMe.style.paddingLeft = "0";
- tweakMe.style.background = "lime";
- document.documentElement.removeAttribute("class");
- }
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div id="container">
- <div id="item">
- <div id="tweakMe"></div>
- </div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1b.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1b.xhtml
deleted file mode 100644
index 32390e6a279..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-changePadding-1b.xhtml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that we reflow sufficiently when a stretched, nested
- flex container needs an incremental reflow. This test should end up
- rendering as a lime square, 100px by 100px.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- #outerContainer {
- display: flex;
- width: 100px;
- height: 100px;
- background: red;
- }
- #tweakMe {
- display: flex;
- background: orange;
- width: 100px;
- /* height should stretch to fill parent's height, via
- * parent's "align-items: stretch" (the default) */
-
- padding-left: 1px;
- }
- </style>
- <script>
- function tweak() {
- var tweakMe = document.getElementById("tweakMe");
- tweakMe.style.paddingLeft = "0";
- tweakMe.style.background = "lime";
- document.documentElement.removeAttribute("class");
- }
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div id="outerContainer">
- <div id="tweakMe"></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1-ref.xhtml
deleted file mode 100644
index 13e0880c096..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1-ref.xhtml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This reference case is like its textcase, but with the testcase's dynamic
- modifications already performed.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { font-size: 10px; }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- </head>
- <body>
- <div class="flexbox" id="f0"> <div>[OldText]</div></div>
- <div class="flexbox" id="f1"><div>[OldText]</div> </div>
- <div class="flexbox" id="f2">[NewText]<div>[OldText]</div></div>
- <div class="flexbox" id="f3">[NewText] <div>[OldText]</div></div>
- <div class="flexbox" id="f4"> [NewText]<div>[OldText]</div></div>
- <div class="flexbox" id="f5"><div>[OldText]</div>[NewText]</div>
- <div class="flexbox" id="f6"><div>[OldText]</div>[NewText] </div>
- <div class="flexbox" id="f7"><div>[OldText]</div> [NewText]</div>
- <div class="flexbox" id="f8">[NewText] <div>[OldText]</div></div>
- <div class="flexbox" id="f9"> [NewText]<div>[OldText]</div></div>
- <div class="flexbox" id="f10"><div>[OldText]</div>[NewText] </div>
- <div class="flexbox" id="f11"><div>[OldText]</div> [NewText]</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1.xhtml
deleted file mode 100644
index e271f4fb3e7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-1.xhtml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that we reconstruct frames as necessary, after content
- (including whitespace & text) is dynamically inserted as a child of a
- flexbox. (Note that in cases where we know the whitespace is going to be
- dropped, we don't bother reconstructing frames. This test is to be sure we
- aren't overzealous with that optimization.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- body { font-size: 10px; }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- <script>
- function insertNodeAtPosnInElem(aNodeToInsert, aPosn, aParentId) {
- var parent = document.getElementById(aParentId);
- var insertBeforeTarget = parent.firstChild;
- for (var i = 0; i &lt; aPosn; i++) {
- insertBeforeTarget = insertBeforeTarget.nextSibling;
- }
- parent.insertBefore(aNodeToInsert, insertBeforeTarget);
- }
-
- function tweak() {
- // Just inserting whitespace
- // -------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f0");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f1");
-
- // Inserting text or text with whitespace
- // --------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f2");
- insertNodeAtPosnInElem(document.createTextNode("[NewText] "), 0, "f3");
- insertNodeAtPosnInElem(document.createTextNode(" [NewText]"), 0, "f4");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f5");
- insertNodeAtPosnInElem(document.createTextNode("[NewText] "), 1, "f6");
- insertNodeAtPosnInElem(document.createTextNode(" [NewText]"), 1, "f7");
-
- // Same as the whitespace cases immediately above, but now with separate
- // text nodes for the whitespace vs. the text
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f8");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f8");
-
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f9");
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f9");
-
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f10");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f10");
-
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f11");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f11");
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div class="flexbox" id="f0"><div>[OldText]</div></div>
- <div class="flexbox" id="f1"><div>[OldText]</div></div>
- <div class="flexbox" id="f2"><div>[OldText]</div></div>
- <div class="flexbox" id="f3"><div>[OldText]</div></div>
- <div class="flexbox" id="f4"><div>[OldText]</div></div>
- <div class="flexbox" id="f5"><div>[OldText]</div></div>
- <div class="flexbox" id="f6"><div>[OldText]</div></div>
- <div class="flexbox" id="f7"><div>[OldText]</div></div>
- <div class="flexbox" id="f8"><div>[OldText]</div></div>
- <div class="flexbox" id="f9"><div>[OldText]</div></div>
- <div class="flexbox" id="f10"><div>[OldText]</div></div>
- <div class="flexbox" id="f11"><div>[OldText]</div></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2-ref.xhtml
deleted file mode 100644
index db3860fcef6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2-ref.xhtml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This reference case is like its textcase, but with the testcase's dynamic
- modifications already performed.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { font-size: 10px; }
-
- <!-- to make inserted div elements stand out -->
- div.inserted { background: teal; }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- </head>
- <body>
- <div class="flexbox" id="f8"><div class="inserted">[NewDiv]</div><div>[OldText]</div></div>
- <div class="flexbox" id="f9"><div>[OldText]</div><div class="inserted">[NewDiv]</div></div>
- <div class="flexbox" id="f10"><div class="inserted">[NewDiv]</div> <div>[OldText]</div></div>
- <div class="flexbox" id="f11"> <div class="inserted">[NewDiv]</div><div>[OldText]</div></div>
- <div class="flexbox" id="f12"><div>[OldText]</div><div class="inserted">[NewDiv]</div> </div>
- <div class="flexbox" id="f13"><div>[OldText]</div> <div class="inserted">[NewDiv]</div></div>
- <div class="flexbox" id="f14"><div class="inserted">[NewDiv]</div>[NewText]<div>[OldText]</div></div>
- <div class="flexbox" id="f15">[NewText]<div class="inserted">[NewDiv]</div><div>[OldText]</div></div>
- <div class="flexbox" id="f16"><div>[OldText]</div><div class="inserted">[NewDiv]</div>[NewText]</div>
- <div class="flexbox" id="f17"><div>[OldText]</div>[NewText]<div class="inserted">[NewDiv]</div></div>
- </body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2.xhtml
deleted file mode 100644
index b083ccd5f95..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-2.xhtml
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that we reconstruct frames as necessary, after content
- (including whitespace & divs) is dynamically inserted as a child of a
- flexbox. (Note that in cases where we know the whitespace is going to be
- dropped, we don't bother reconstructing frames. This test is to be sure we
- aren't overzealous with that optimization.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- body { font-size: 10px; }
-
- <!-- to make inserted div elements stand out -->
- div.inserted { background: teal; }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- <script>
- function insertNodeAtPosnInElem(aNodeToInsert, aPosn, aParentId) {
- var parent = document.getElementById(aParentId);
- var insertBeforeTarget = parent.firstChild;
- for (var i = 0; i &lt; aPosn; i++) {
- insertBeforeTarget = insertBeforeTarget.nextSibling;
- }
- parent.insertBefore(aNodeToInsert, insertBeforeTarget);
- }
-
- function createDivElem() {
- var div = document.createElement("div");
- div.setAttribute("class", "inserted");
- div.appendChild(document.createTextNode("[NewDiv]"));
- return div;
- }
-
- function tweak() {
- // Inserting div, adjacent to inline content
- // -----------------------------------------
- insertNodeAtPosnInElem(createDivElem(), 0, "f0");
- insertNodeAtPosnInElem(createDivElem(), 1, "f1");
-
- // Inserting div and whitespace, before inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f2");
- insertNodeAtPosnInElem(createDivElem(), 0, "f2");
-
- insertNodeAtPosnInElem(createDivElem(), 0, "f3");
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f3");
-
- // Inserting div and whitespace, after inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f4");
- insertNodeAtPosnInElem(createDivElem(), 1, "f4");
-
- insertNodeAtPosnInElem(createDivElem(), 1, "f5");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f5");
-
- // Inserting div and text, before inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f6");
- insertNodeAtPosnInElem(createDivElem(), 0, "f6");
-
- insertNodeAtPosnInElem(createDivElem(), 0, "f7");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f7");
-
- // Inserting div and text, after inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f8");
- insertNodeAtPosnInElem(createDivElem(), 1, "f8");
-
- insertNodeAtPosnInElem(createDivElem(), 1, "f9");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f9");
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div class="flexbox" id="f0"><div>[OldText]</div></div>
- <div class="flexbox" id="f1"><div>[OldText]</div></div>
- <div class="flexbox" id="f2"><div>[OldText]</div></div>
- <div class="flexbox" id="f3"><div>[OldText]</div></div>
- <div class="flexbox" id="f4"><div>[OldText]</div></div>
- <div class="flexbox" id="f5"><div>[OldText]</div></div>
- <div class="flexbox" id="f6"><div>[OldText]</div></div>
- <div class="flexbox" id="f7"><div>[OldText]</div></div>
- <div class="flexbox" id="f8"><div>[OldText]</div></div>
- <div class="flexbox" id="f9"><div>[OldText]</div></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3-ref.xhtml
deleted file mode 100644
index b29b16f1864..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3-ref.xhtml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This reference case is like its textcase, but with the testcase's dynamic
- modifications already performed.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { font-size: 10px; }
-
- <!-- to make inserted span elements stand out -->
- span.inserted { background: teal; }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- </head>
- <body>
- <div class="flexbox" id="f0"><span class="inserted">[NewSpan]</span><div>[OldText]</div></div>
- <div class="flexbox" id="f1"><div>[OldText]</div><span class="inserted">[NewSpan]</span></div>
- <div class="flexbox" id="f2"><span class="inserted">[NewSpan]</span> <div>[OldText]</div></div>
- <div class="flexbox" id="f3"> <span class="inserted">[NewSpan]</span><div>[OldText]</div></div>
- <div class="flexbox" id="f4"><div>[OldText]</div><span class="inserted">[NewSpan]</span> </div>
- <div class="flexbox" id="f5"><div>[OldText]</div> <span class="inserted">[NewSpan]</span></div>
- <div class="flexbox" id="f6"><span class="inserted">[NewSpan]</span>[NewText]<div>[OldText]</div></div>
- <div class="flexbox" id="f7">[NewText]<span class="inserted">[NewSpan]</span><div>[OldText]</div></div>
- <div class="flexbox" id="f8"><div>[OldText]</div><span class="inserted">[NewSpan]</span>[NewText]</div>
- <div class="flexbox" id="f9"><div>[OldText]</div>[NewText]<span class="inserted">[NewSpan]</span></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3.xhtml
deleted file mode 100644
index faf54917de7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundDiv-3.xhtml
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that we reconstruct frames as necessary, after content
- (including whitespace & spans) is dynamically inserted as a child of a
- flexbox. (Note that in cases where we know the whitespace is going to be
- dropped, we don't bother reconstructing frames. This test is to be sure we
- aren't overzealous with that optimization.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- body { font-size: 10px; }
-
- <!-- to make inserted span elements stand out -->
- span.inserted { background: teal; }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- <script>
- function insertNodeAtPosnInElem(aNodeToInsert, aPosn, aParentId) {
- var parent = document.getElementById(aParentId);
- var insertBeforeTarget = parent.firstChild;
- for (var i = 0; i &lt; aPosn; i++) {
- insertBeforeTarget = insertBeforeTarget.nextSibling;
- }
- parent.insertBefore(aNodeToInsert, insertBeforeTarget);
- }
-
- function createSpanElem() {
- var span = document.createElement("span");
- span.setAttribute("class", "inserted");
- span.appendChild(document.createTextNode("[NewSpan]"));
- return span;
- }
-
- function tweak() {
- // Inserting span, on either side of existing content
- // --------------------------------------------------
- insertNodeAtPosnInElem(createSpanElem(), 0, "f0");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f1");
-
- // Inserting span and whitespace, before existing content
- // ------------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f2");
- insertNodeAtPosnInElem(createSpanElem(), 0, "f2");
-
- insertNodeAtPosnInElem(createSpanElem(), 0, "f3");
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f3");
-
- // Inserting span and whitespace, after existing content
- // -----------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f4");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f4");
-
- insertNodeAtPosnInElem(createSpanElem(), 1, "f5");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f5");
-
- // Inserting span and text, before existing content
- // ------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f6");
- insertNodeAtPosnInElem(createSpanElem(), 0, "f6");
-
- insertNodeAtPosnInElem(createSpanElem(), 0, "f7");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f7");
-
- // Inserting span and text, after existing content
- // -----------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f8");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f8");
-
- insertNodeAtPosnInElem(createSpanElem(), 1, "f9");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f9");
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div class="flexbox" id="f0"><div>[OldText]</div></div>
- <div class="flexbox" id="f1"><div>[OldText]</div></div>
- <div class="flexbox" id="f2"><div>[OldText]</div></div>
- <div class="flexbox" id="f3"><div>[OldText]</div></div>
- <div class="flexbox" id="f4"><div>[OldText]</div></div>
- <div class="flexbox" id="f5"><div>[OldText]</div></div>
- <div class="flexbox" id="f6"><div>[OldText]</div></div>
- <div class="flexbox" id="f7"><div>[OldText]</div></div>
- <div class="flexbox" id="f8"><div>[OldText]</div></div>
- <div class="flexbox" id="f9"><div>[OldText]</div></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-1.xhtml
deleted file mode 100644
index 785063fdf7c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-1.xhtml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that we reconstruct frames as necessary, after content
- (including whitespace & text) is dynamically inserted as a child of a
- flexbox. (Note that in cases where we know the whitespace is going to be
- dropped, we don't bother reconstructing frames. This test is to be sure we
- aren't overzealous with that optimization.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- body { font-size: 10px; }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- <script>
- function insertNodeAtPosnInElem(aNodeToInsert, aPosn, aParentId) {
- var parent = document.getElementById(aParentId);
- var insertBeforeTarget = parent.firstChild;
- for (var i = 0; i &lt; aPosn; i++) {
- insertBeforeTarget = insertBeforeTarget.nextSibling;
- }
- parent.insertBefore(aNodeToInsert, insertBeforeTarget);
- }
-
- function tweak() {
- // Just inserting whitespace
- // -------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f0");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f1");
-
- // Inserting text or text with whitespace
- // --------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f2");
- insertNodeAtPosnInElem(document.createTextNode("[NewText] "), 0, "f3");
- insertNodeAtPosnInElem(document.createTextNode(" [NewText]"), 0, "f4");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f5");
- insertNodeAtPosnInElem(document.createTextNode("[NewText] "), 1, "f6");
- insertNodeAtPosnInElem(document.createTextNode(" [NewText]"), 1, "f7");
-
- // Same as the whitespace cases immediately above, but now with separate
- // text nodes for the whitespace vs. the text
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f8");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f8");
-
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f9");
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f9");
-
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f10");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f10");
-
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f11");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f11");
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div class="flexbox" id="f0"><span>[OldText]</span></div>
- <div class="flexbox" id="f1"><span>[OldText]</span></div>
- <div class="flexbox" id="f2"><span>[OldText]</span></div>
- <div class="flexbox" id="f3"><span>[OldText]</span></div>
- <div class="flexbox" id="f4"><span>[OldText]</span></div>
- <div class="flexbox" id="f5"><span>[OldText]</span></div>
- <div class="flexbox" id="f6"><span>[OldText]</span></div>
- <div class="flexbox" id="f7"><span>[OldText]</span></div>
- <div class="flexbox" id="f8"><span>[OldText]</span></div>
- <div class="flexbox" id="f9"><span>[OldText]</span></div>
- <div class="flexbox" id="f10"><span>[OldText]</span></div>
- <div class="flexbox" id="f11"><span>[OldText]</span></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-2.xhtml
deleted file mode 100644
index 9c827966201..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-2.xhtml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that we reconstruct frames as necessary, after content
- (including whitespace & divs) is dynamically inserted as a child of a
- flexbox. (Note that in cases where we know the whitespace is going to be
- dropped, we don't bother reconstructing frames. This test is to be sure we
- aren't overzealous with that optimization.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- body {
- font-size: 10px;
- }
-
- div.inserted {
- background: teal; /* To make inserted div elements stand out. */
- }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- <script>
- function insertNodeAtPosnInElem(aNodeToInsert, aPosn, aParentId) {
- var parent = document.getElementById(aParentId);
- var insertBeforeTarget = parent.firstChild;
- for (var i = 0; i &lt; aPosn; i++) {
- insertBeforeTarget = insertBeforeTarget.nextSibling;
- }
- parent.insertBefore(aNodeToInsert, insertBeforeTarget);
- }
-
- function createDivElem() {
- var div = document.createElement("div");
- div.setAttribute("class", "inserted");
- div.appendChild(document.createTextNode("[NewDiv]"));
- return div;
- }
-
- function tweak() {
- // Inserting div, adjacent to inline content
- // -----------------------------------------
- insertNodeAtPosnInElem(createDivElem(), 0, "f0");
- insertNodeAtPosnInElem(createDivElem(), 1, "f1");
-
- // Inserting div and whitespace, before inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f2");
- insertNodeAtPosnInElem(createDivElem(), 0, "f2");
-
- insertNodeAtPosnInElem(createDivElem(), 0, "f3");
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f3");
-
- // Inserting div and whitespace, after inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f4");
- insertNodeAtPosnInElem(createDivElem(), 1, "f4");
-
- insertNodeAtPosnInElem(createDivElem(), 1, "f5");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f5");
-
- // Inserting div and text, before inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f6");
- insertNodeAtPosnInElem(createDivElem(), 0, "f6");
-
- insertNodeAtPosnInElem(createDivElem(), 0, "f7");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f7");
-
- // Inserting div and text, after inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f8");
- insertNodeAtPosnInElem(createDivElem(), 1, "f8");
-
- insertNodeAtPosnInElem(createDivElem(), 1, "f9");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f9");
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div class="flexbox" id="f0"><span>[OldText]</span></div>
- <div class="flexbox" id="f1"><span>[OldText]</span></div>
- <div class="flexbox" id="f2"><span>[OldText]</span></div>
- <div class="flexbox" id="f3"><span>[OldText]</span></div>
- <div class="flexbox" id="f4"><span>[OldText]</span></div>
- <div class="flexbox" id="f5"><span>[OldText]</span></div>
- <div class="flexbox" id="f6"><span>[OldText]</span></div>
- <div class="flexbox" id="f7"><span>[OldText]</span></div>
- <div class="flexbox" id="f8"><span>[OldText]</span></div>
- <div class="flexbox" id="f9"><span>[OldText]</span></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-3.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-3.xhtml
deleted file mode 100644
index 9f60c431603..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundSpan-3.xhtml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that we reconstruct frames as necessary, after content
- (including whitespace & spans) is dynamically inserted as a child of a
- flexbox. (Note that in cases where we know the whitespace is going to be
- dropped, we don't bother reconstructing frames. This test is to be sure we
- aren't overzealous with that optimization.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- body {
- font-size: 10px;
- }
-
- span.inserted {
- background: teal; /* To make inserted span elements stand out. */
- }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- <script>
- function insertNodeAtPosnInElem(aNodeToInsert, aPosn, aParentId) {
- var parent = document.getElementById(aParentId);
- var insertBeforeTarget = parent.firstChild;
- for (var i = 0; i &lt; aPosn; i++) {
- insertBeforeTarget = insertBeforeTarget.nextSibling;
- }
- parent.insertBefore(aNodeToInsert, insertBeforeTarget);
- }
-
- function createSpanElem() {
- var span = document.createElement("span");
- span.setAttribute("class", "inserted");
- span.appendChild(document.createTextNode("[NewSpan]"));
- return span;
- }
-
- function tweak() {
- // Inserting span, on either side of existing content
- // --------------------------------------------------
- insertNodeAtPosnInElem(createSpanElem(), 0, "f0");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f1");
-
- // Inserting span and whitespace, before existing content
- // ------------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f2");
- insertNodeAtPosnInElem(createSpanElem(), 0, "f2");
-
- insertNodeAtPosnInElem(createSpanElem(), 0, "f3");
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f3");
-
- // Inserting span and whitespace, after existing content
- // -----------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f4");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f4");
-
- insertNodeAtPosnInElem(createSpanElem(), 1, "f5");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f5");
-
- // Inserting span and text, before existing content
- // ------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f6");
- insertNodeAtPosnInElem(createSpanElem(), 0, "f6");
-
- insertNodeAtPosnInElem(createSpanElem(), 0, "f7");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f7");
-
- // Inserting span and text, after existing content
- // -----------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f8");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f8");
-
- insertNodeAtPosnInElem(createSpanElem(), 1, "f9");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f9");
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div class="flexbox" id="f0"><span>[OldText]</span></div>
- <div class="flexbox" id="f1"><span>[OldText]</span></div>
- <div class="flexbox" id="f2"><span>[OldText]</span></div>
- <div class="flexbox" id="f3"><span>[OldText]</span></div>
- <div class="flexbox" id="f4"><span>[OldText]</span></div>
- <div class="flexbox" id="f5"><span>[OldText]</span></div>
- <div class="flexbox" id="f6"><span>[OldText]</span></div>
- <div class="flexbox" id="f7"><span>[OldText]</span></div>
- <div class="flexbox" id="f8"><span>[OldText]</span></div>
- <div class="flexbox" id="f9"><span>[OldText]</span></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1-ref.xhtml
deleted file mode 100644
index 536a9fa83ec..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1-ref.xhtml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This reference case is like its textcase, but with the testcase's dynamic
- modifications already performed.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { font-size: 10px; }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- </head>
- <body>
- <div class="flexbox" id="f0"> [OldText]</div>
- <div class="flexbox" id="f1">[OldText] </div>
- <div class="flexbox" id="f2">[NewText][OldText]</div>
- <div class="flexbox" id="f3">[NewText] [OldText]</div>
- <div class="flexbox" id="f4"> [NewText][OldText]</div>
- <div class="flexbox" id="f5">[OldText][NewText]</div>
- <div class="flexbox" id="f6">[OldText][NewText] </div>
- <div class="flexbox" id="f7">[OldText] [NewText]</div>
- <div class="flexbox" id="f8">[NewText] [OldText]</div>
- <div class="flexbox" id="f9"> [NewText][OldText]</div>
- <div class="flexbox" id="f10">[OldText][NewText] </div>
- <div class="flexbox" id="f11">[OldText] [NewText]</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1.xhtml
deleted file mode 100644
index 37f63136a7e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-1.xhtml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that we reconstruct frames as necessary, after content
- (including whitespace & text) is dynamically inserted as a child of a
- flexbox. (Note that in cases where we know the whitespace is going to be
- dropped, we don't bother reconstructing frames. This test is to be sure we
- aren't overzealous with that optimization.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- body { font-size: 10px; }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- <script>
- function insertNodeAtPosnInElem(aNodeToInsert, aPosn, aParentId) {
- var parent = document.getElementById(aParentId);
- var insertBeforeTarget = parent.firstChild;
- for (var i = 0; i &lt; aPosn; i++) {
- insertBeforeTarget = insertBeforeTarget.nextSibling;
- }
- parent.insertBefore(aNodeToInsert, insertBeforeTarget);
- }
-
- function tweak() {
- // Just inserting whitespace
- // -------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f0");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f1");
-
- // Inserting text or text with whitespace
- // --------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f2");
- insertNodeAtPosnInElem(document.createTextNode("[NewText] "), 0, "f3");
- insertNodeAtPosnInElem(document.createTextNode(" [NewText]"), 0, "f4");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f5");
- insertNodeAtPosnInElem(document.createTextNode("[NewText] "), 1, "f6");
- insertNodeAtPosnInElem(document.createTextNode(" [NewText]"), 1, "f7");
-
- // Same as the whitespace cases immediately above, but now with separate
- // text nodes for the whitespace vs. the text
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f8");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f8");
-
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f9");
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f9");
-
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f10");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f10");
-
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f11");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f11");
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div class="flexbox" id="f0">[OldText]</div>
- <div class="flexbox" id="f1">[OldText]</div>
- <div class="flexbox" id="f2">[OldText]</div>
- <div class="flexbox" id="f3">[OldText]</div>
- <div class="flexbox" id="f4">[OldText]</div>
- <div class="flexbox" id="f5">[OldText]</div>
- <div class="flexbox" id="f6">[OldText]</div>
- <div class="flexbox" id="f7">[OldText]</div>
- <div class="flexbox" id="f8">[OldText]</div>
- <div class="flexbox" id="f9">[OldText]</div>
- <div class="flexbox" id="f10">[OldText]</div>
- <div class="flexbox" id="f11">[OldText]</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2-ref.xhtml
deleted file mode 100644
index 7e3468b1f38..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2-ref.xhtml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This reference case is like its textcase, but with the testcase's dynamic
- modifications already performed.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body {
- font-size: 10px;
- }
-
- div.inserted {
- background: teal; /* To make inserted div elements stand out. */
- }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- </head>
- <body>
- <div class="flexbox" id="f8"><div class="inserted">[NewDiv]</div>[OldText]</div>
- <div class="flexbox" id="f9">[OldText]<div class="inserted">[NewDiv]</div></div>
- <div class="flexbox" id="f10"><div class="inserted">[NewDiv]</div> [OldText]</div>
- <div class="flexbox" id="f11"> <div class="inserted">[NewDiv]</div>[OldText]</div>
- <div class="flexbox" id="f12">[OldText]<div class="inserted">[NewDiv]</div> </div>
- <div class="flexbox" id="f13">[OldText] <div class="inserted">[NewDiv]</div></div>
- <div class="flexbox" id="f14"><div class="inserted">[NewDiv]</div>[NewText][OldText]</div>
- <div class="flexbox" id="f15">[NewText]<div class="inserted">[NewDiv]</div>[OldText]</div>
- <div class="flexbox" id="f16">[OldText]<div class="inserted">[NewDiv]</div>[NewText]</div>
- <div class="flexbox" id="f17">[OldText][NewText]<div class="inserted">[NewDiv]</div></div>
- </body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2.xhtml
deleted file mode 100644
index b907af8b572..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-2.xhtml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that we reconstruct frames as necessary, after content
- (including whitespace & divs) is dynamically inserted as a child of a
- flexbox. (Note that in cases where we know the whitespace is going to be
- dropped, we don't bother reconstructing frames. This test is to be sure we
- aren't overzealous with that optimization.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- body {
- font-size: 10px;
- }
-
- div.inserted {
- background: teal; /* To make inserted div elements stand out. */
- }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- <script>
- function insertNodeAtPosnInElem(aNodeToInsert, aPosn, aParentId) {
- var parent = document.getElementById(aParentId);
- var insertBeforeTarget = parent.firstChild;
- for (var i = 0; i &lt; aPosn; i++) {
- insertBeforeTarget = insertBeforeTarget.nextSibling;
- }
- parent.insertBefore(aNodeToInsert, insertBeforeTarget);
- }
-
- function createDivElem() {
- var div = document.createElement("div");
- div.setAttribute("class", "inserted");
- div.appendChild(document.createTextNode("[NewDiv]"));
- return div;
- }
-
- function tweak() {
- // Inserting div, adjacent to inline content
- // -----------------------------------------
- insertNodeAtPosnInElem(createDivElem(), 0, "f0");
- insertNodeAtPosnInElem(createDivElem(), 1, "f1");
-
- // Inserting div and whitespace, before inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f2");
- insertNodeAtPosnInElem(createDivElem(), 0, "f2");
-
- insertNodeAtPosnInElem(createDivElem(), 0, "f3");
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f3");
-
- // Inserting div and whitespace, after inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f4");
- insertNodeAtPosnInElem(createDivElem(), 1, "f4");
-
- insertNodeAtPosnInElem(createDivElem(), 1, "f5");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f5");
-
- // Inserting div and text, before inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f6");
- insertNodeAtPosnInElem(createDivElem(), 0, "f6");
-
- insertNodeAtPosnInElem(createDivElem(), 0, "f7");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f7");
-
- // Inserting div and text, after inline content
- // ---------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f8");
- insertNodeAtPosnInElem(createDivElem(), 1, "f8");
-
- insertNodeAtPosnInElem(createDivElem(), 1, "f9");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f9");
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div class="flexbox" id="f0">[OldText]</div>
- <div class="flexbox" id="f1">[OldText]</div>
- <div class="flexbox" id="f2">[OldText]</div>
- <div class="flexbox" id="f3">[OldText]</div>
- <div class="flexbox" id="f4">[OldText]</div>
- <div class="flexbox" id="f5">[OldText]</div>
- <div class="flexbox" id="f6">[OldText]</div>
- <div class="flexbox" id="f7">[OldText]</div>
- <div class="flexbox" id="f8">[OldText]</div>
- <div class="flexbox" id="f9">[OldText]</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3-ref.xhtml
deleted file mode 100644
index 45d357ab872..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3-ref.xhtml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This reference case is like its textcase, but with the testcase's dynamic
- modifications already performed.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body {
- font-size: 10px;
- }
-
- span.inserted {
- background: teal; /* To make inserted span elements stand out. */
- }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- </head>
- <body>
- <div class="flexbox" id="f0"><span class="inserted">[NewSpan]</span>[OldText]</div>
- <div class="flexbox" id="f1">[OldText]<span class="inserted">[NewSpan]</span></div>
- <div class="flexbox" id="f2"><span class="inserted">[NewSpan]</span> [OldText]</div>
- <div class="flexbox" id="f3"> <span class="inserted">[NewSpan]</span>[OldText]</div>
- <div class="flexbox" id="f4">[OldText]<span class="inserted">[NewSpan]</span> </div>
- <div class="flexbox" id="f5">[OldText] <span class="inserted">[NewSpan]</span></div>
- <div class="flexbox" id="f6"><span class="inserted">[NewSpan]</span>[NewText][OldText]</div>
- <div class="flexbox" id="f7">[NewText]<span class="inserted">[NewSpan]</span>[OldText]</div>
- <div class="flexbox" id="f8">[OldText]<span class="inserted">[NewSpan]</span>[NewText]</div>
- <div class="flexbox" id="f9">[OldText][NewText]<span class="inserted">[NewSpan]</span></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3.xhtml
deleted file mode 100644
index eca09eb851f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertAroundText-3.xhtml
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that we reconstruct frames as necessary, after content
- (including whitespace & spans) is dynamically inserted as a child of a
- flexbox. (Note that in cases where we know the whitespace is going to be
- dropped, we don't bother reconstructing frames. This test is to be sure we
- aren't overzealous with that optimization.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- body {
- font-size: 10px;
- }
-
- span.inserted {
- background: teal; /* To make inserted span elements stand out. */
- }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- <script>
- function insertNodeAtPosnInElem(aNodeToInsert, aPosn, aParentId) {
- var parent = document.getElementById(aParentId);
- var insertBeforeTarget = parent.firstChild;
- for (var i = 0; i &lt; aPosn; i++) {
- insertBeforeTarget = insertBeforeTarget.nextSibling;
- }
- parent.insertBefore(aNodeToInsert, insertBeforeTarget);
- }
-
- function createSpanElem() {
- var span = document.createElement("span");
- span.setAttribute("class", "inserted");
- span.appendChild(document.createTextNode("[NewSpan]"));
- return span;
- }
-
- function tweak() {
- // Inserting span, on either side of existing content
- // --------------------------------------------------
- insertNodeAtPosnInElem(createSpanElem(), 0, "f0");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f1");
-
- // Inserting span and whitespace, before existing content
- // ------------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f2");
- insertNodeAtPosnInElem(createSpanElem(), 0, "f2");
-
- insertNodeAtPosnInElem(createSpanElem(), 0, "f3");
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f3");
-
- // Inserting span and whitespace, after existing content
- // -----------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f4");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f4");
-
- insertNodeAtPosnInElem(createSpanElem(), 1, "f5");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f5");
-
- // Inserting span and text, before existing content
- // ------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f6");
- insertNodeAtPosnInElem(createSpanElem(), 0, "f6");
-
- insertNodeAtPosnInElem(createSpanElem(), 0, "f7");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f7");
-
- // Inserting span and text, after existing content
- // -----------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f8");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f8");
-
- insertNodeAtPosnInElem(createSpanElem(), 1, "f9");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f9");
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div class="flexbox" id="f0">[OldText]</div>
- <div class="flexbox" id="f1">[OldText]</div>
- <div class="flexbox" id="f2">[OldText]</div>
- <div class="flexbox" id="f3">[OldText]</div>
- <div class="flexbox" id="f4">[OldText]</div>
- <div class="flexbox" id="f5">[OldText]</div>
- <div class="flexbox" id="f6">[OldText]</div>
- <div class="flexbox" id="f7">[OldText]</div>
- <div class="flexbox" id="f8">[OldText]</div>
- <div class="flexbox" id="f9">[OldText]</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1-ref.xhtml
deleted file mode 100644
index 0c0f9b5baa2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1-ref.xhtml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This reference case is like its textcase, but with the testcase's dynamic
- modifications already performed.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { font-size: 10px; }
-
- <!-- to make inserted span elements stand out -->
- span {
- background: teal;
- padding: 3px;
- }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- </head>
- <body>
- <div class="flexbox" id="f0"><span/>[orig]</div>
- <div class="flexbox" id="f1">[orig]<span/></div>
- <div class="flexbox" id="f2"><span/> [orig]</div>
- <div class="flexbox" id="f3"> <span/>[orig]</div>
- <div class="flexbox" id="f4">[orig]<span/> </div>
- <div class="flexbox" id="f5">[orig] <span/></div>
- <div class="flexbox" id="f6"><span/>[NewText][orig]</div>
- <div class="flexbox" id="f7">[NewText]<span/>[orig]</div>
- <div class="flexbox" id="f8">[orig]<span/>[NewText]</div>
- <div class="flexbox" id="f9">[orig][NewText]<span/></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1.xhtml
deleted file mode 100644
index 9bcd133529f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-dyn-insertEmptySpan-1.xhtml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test is a variant of flexbox-dyn-insertAroundText-3.xhtml with the
- inserted spans being empty & having padding. This triggered invalidation
- issues with an older work-in-progress patch, so I'm adding this reftest to
- track that issue & prevent it from regressing.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- body { font-size: 10px; }
-
- <!-- to make inserted span elements stand out -->
- span {
- background: teal;
- padding: 3px;
- }
-
- div.flexbox {
- border: 1px dashed blue;
- width: 300px;
- display: flex;
- justify-content: space-around;
- margin-bottom: 1px;
- white-space: pre;
- }
- </style>
- <script>
- function insertNodeAtPosnInElem(aNodeToInsert, aPosn, aParentId) {
- var parent = document.getElementById(aParentId);
- var insertBeforeTarget = parent.firstChild;
- for (var i = 0; i &lt; aPosn; i++) {
- insertBeforeTarget = insertBeforeTarget.nextSibling;
- }
- parent.insertBefore(aNodeToInsert, insertBeforeTarget);
- }
-
- function createSpanElem() {
- return document.createElement("span");
- }
-
- function tweak() {
- // Inserting span, on either side of existing content
- // --------------------------------------------------
- insertNodeAtPosnInElem(createSpanElem(), 0, "f0");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f1");
-
- // Inserting span and whitespace, before existing content
- // ------------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f2");
- insertNodeAtPosnInElem(createSpanElem(), 0, "f2");
-
- insertNodeAtPosnInElem(createSpanElem(), 0, "f3");
- insertNodeAtPosnInElem(document.createTextNode(" "), 0, "f3");
-
- // Inserting span and whitespace, after existing content
- // -----------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f4");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f4");
-
- insertNodeAtPosnInElem(createSpanElem(), 1, "f5");
- insertNodeAtPosnInElem(document.createTextNode(" "), 1, "f5");
-
- // Inserting span and text, before existing content
- // ------------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f6");
- insertNodeAtPosnInElem(createSpanElem(), 0, "f6");
-
- insertNodeAtPosnInElem(createSpanElem(), 0, "f7");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 0, "f7");
-
- // Inserting span and text, after existing content
- // -----------------------------------------------
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f8");
- insertNodeAtPosnInElem(createSpanElem(), 1, "f8");
-
- insertNodeAtPosnInElem(createSpanElem(), 1, "f9");
- insertNodeAtPosnInElem(document.createTextNode("[NewText]"), 1, "f9");
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <div class="flexbox" id="f0">[orig]</div>
- <div class="flexbox" id="f1">[orig]</div>
- <div class="flexbox" id="f2">[orig]</div>
- <div class="flexbox" id="f3">[orig]</div>
- <div class="flexbox" id="f4">[orig]</div>
- <div class="flexbox" id="f5">[orig]</div>
- <div class="flexbox" id="f6">[orig]</div>
- <div class="flexbox" id="f7">[orig]</div>
- <div class="flexbox" id="f8">[orig]</div>
- <div class="flexbox" id="f9">[orig]</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1-ref.xhtml
deleted file mode 100644
index 074436d1129..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1-ref.xhtml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for behavior of flex containers that have no children -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- border: 1px dotted blue;
- background: yellow;
- }
-
- div.withPadding {
- padding: 2px 3px 4px 5px;
- }
- </style>
- </head>
- <body>
- <div class="flexbox"/>
- <div class="flexbox" style="width: 5px"/>
- <div class="flexbox" style="width: -moz-available"/>
- <div class="flexbox" style="width: -moz-max-content"/>
- <div class="flexbox" style="width: -moz-min-content"/>
- <div class="flexbox" style="height: 6px"/>
- <div class="flexbox" style="width: 7px; height: 8px"/>
-
- <!-- now with padding -->
- <div class="flexbox withPadding"/>
- <div class="flexbox withPadding" style="width: 5px"/>
- <div class="flexbox withPadding" style="width: -moz-available"/>
- <div class="flexbox withPadding" style="width: -moz-max-content"/>
- <div class="flexbox withPadding" style="width: -moz-min-content"/>
- <div class="flexbox withPadding" style="height: 6px"/>
- <div class="flexbox withPadding" style="width: 7px; height: 8px"/>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1a.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1a.xhtml
deleted file mode 100644
index 2912028dd89..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1a.xhtml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Testcase for behavior of flex containers that have no children -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- border: 1px dotted blue;
- background: yellow;
- display: flex;
- }
-
- div.withPadding {
- padding: 2px 3px 4px 5px;
- }
- </style>
- </head>
- <body>
- <div class="flexbox"/>
- <div class="flexbox" style="width: 5px"/>
- <div class="flexbox" style="width: -moz-available"/>
- <div class="flexbox" style="width: -moz-max-content"/>
- <div class="flexbox" style="width: -moz-min-content"/>
- <div class="flexbox" style="height: 6px"/>
- <div class="flexbox" style="width: 7px; height: 8px"/>
-
- <!-- now with padding -->
- <div class="flexbox withPadding"/>
- <div class="flexbox withPadding" style="width: 5px"/>
- <div class="flexbox withPadding" style="width: -moz-available"/>
- <div class="flexbox withPadding" style="width: -moz-max-content"/>
- <div class="flexbox withPadding" style="width: -moz-min-content"/>
- <div class="flexbox withPadding" style="height: 6px"/>
- <div class="flexbox withPadding" style="width: 7px; height: 8px"/>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1b.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1b.xhtml
deleted file mode 100644
index 20ea2e50b9c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-empty-1b.xhtml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Testcase for behavior of flex containers that have no children. This
- testcase differs from the "1a" variant in that it's got a single space
- inside each flex container (which should be ignored, since the flexbox
- spec says we shouldn't create a flex item for an entirely-whitespace run
- of inline content).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- border: 1px dotted blue;
- background: yellow;
- display: flex;
- }
-
- div.withPadding {
- padding: 2px 3px 4px 5px;
- }
- </style>
- </head>
- <body>
- <div class="flexbox"> </div>
- <div class="flexbox" style="width: 5px"> </div>
- <div class="flexbox" style="width: -moz-available"> </div>
- <div class="flexbox" style="width: -moz-max-content"> </div>
- <div class="flexbox" style="width: -moz-min-content"> </div>
- <div class="flexbox" style="height: 6px"> </div>
- <div class="flexbox" style="width: 7px; height: 8px"> </div>
-
- <!-- now with padding -->
- <div class="flexbox withPadding"> </div>
- <div class="flexbox withPadding" style="width: 5px"> </div>
- <div class="flexbox withPadding" style="width: -moz-available"> </div>
- <div class="flexbox withPadding" style="width: -moz-max-content"> </div>
- <div class="flexbox withPadding" style="width: -moz-min-content"> </div>
- <div class="flexbox withPadding" style="height: 6px"> </div>
- <div class="flexbox withPadding" style="width: 7px; height: 8px"> </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1-ref.xhtml
deleted file mode 100644
index 1fd86bafd4c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1-ref.xhtml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- display: flex;
- width: 400px;
- margin-bottom: 2px;
- font-family: sans-serif;
- background: lightgreen;
- justify-content: space-around;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- aaa<div>[[[</div>bbb
- </div>
- <div class="flexbox">
- aaa<div>]]]</div>bbb
- </div>
- <div class="flexbox">
- aaa<div>[[[</div>
- </div>
- <div class="flexbox">
- aaa<div>]]]</div>
- </div>
- <div class="flexbox">
- <div>[[[</div>bbb
- </div>
- <div class="flexbox">
- <div>]]]</div>bbb
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1a.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1a.xhtml
deleted file mode 100644
index e5c336b4653..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1a.xhtml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that 'float' on a direct child of a flexbox won't
- actually cause it to be floated.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- display: flex;
- width: 400px;
- margin-bottom: 2px;
- font-family: sans-serif;
- background: lightgreen;
- justify-content: space-around;
- }
- </style>
- </head>
- <body>
- <!-- These cases have a span as a direct child of the flexbox. The span
- should become display:block (and hence form its own flex item),
- but it shouldn't actually float.
- -->
- <div class="flexbox">
- aaa<span style="float: left">[[[</span>bbb
- </div>
- <div class="flexbox">
- aaa<span style="float: right">]]]</span>bbb
- </div>
- <div class="flexbox">
- aaa<span style="float: left">[[[</span>
- </div>
- <div class="flexbox">
- aaa<span style="float: right">]]]</span>
- </div>
- <div class="flexbox">
- <span style="float: left">[[[</span>bbb
- </div>
- <div class="flexbox">
- <span style="float: right">]]]</span>bbb
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1b.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1b.xhtml
deleted file mode 100644
index d00b5304eec..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1b.xhtml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test is like flexbox-float-1a.xhtml, but with the float-styled
- element already being a block. (Should render the same.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- display: flex;
- width: 400px;
- margin-bottom: 2px;
- font-family: sans-serif;
- background: lightgreen;
- justify-content: space-around;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- aaa<div style="float: left">[[[</div>bbb
- </div>
- <div class="flexbox">
- aaa<div style="float: right">]]]</div>bbb
- </div>
- <div class="flexbox">
- aaa<div style="float: left">[[[</div>
- </div>
- <div class="flexbox">
- aaa<div style="float: right">]]]</div>
- </div>
- <div class="flexbox">
- <div style="float: left">[[[</div>bbb
- </div>
- <div class="flexbox">
- <div style="float: right">]]]</div>bbb
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1c.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1c.xhtml
deleted file mode 100644
index e906358131e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1c.xhtml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test is like flexbox-float-1a.xhtml, but with the float-styled
- element dynamically inserted.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" class="reftest-wait">
- <head>
- <script>
- function generateFloat(aFloatDirection) {
- var newElem = document.createElement("span");
- newElem.setAttribute("style", "float: " + aFloatDirection);
- newElem.innerHTML = aFloatDirection == "left" ? "[[[" : "]]]";
- return newElem;
- }
-
- function tweak() {
- var containerList = document.getElementsByClassName("flexbox");
- for (var i = 0; i &lt; containerList.length; i++) {
- var container = containerList[i];
- var newElem = generateFloat(container.getAttribute("floatValToUse"));
-
- var nodeToInsertBefore;
- var insertPosn = container.getAttribute("insertPosn");
- if (insertPosn == "begin") {
- nodeToInsertBefore = container.firstChild;
- } else if (insertPosn == "mid") {
- nodeToInsertBefore = container.firstChild.nextSibling;
- } else if (insertPosn == "end") {
- nodeToInsertBefore = null;
- }
-
- container.insertBefore(newElem, nodeToInsertBefore);
- }
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- <style>
- div.flexbox {
- display: flex;
- width: 400px;
- margin-bottom: 2px;
- font-family: sans-serif;
- background: lightgreen;
- justify-content: space-around;
- }
- </style>
- </head>
- <body>
- <div class="flexbox" floatValToUse="left" insertPosn="mid">
- aaa<span>bbb</span>
- </div>
- <div class="flexbox" floatValToUse="right" insertPosn="mid">
- aaa<span>bbb</span>
- </div>
- <div class="flexbox" floatValToUse="left" insertPosn="end">
- aaa
- </div>
- <div class="flexbox" floatValToUse="right" insertPosn="end">
- aaa
- </div>
- <div class="flexbox" floatValToUse="left" insertPosn="begin">
- bbb
- </div>
- <div class="flexbox" floatValToUse="right" insertPosn="begin">
- bbb
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1d.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1d.xhtml
deleted file mode 100644
index 4fdc493f129..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-1d.xhtml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test is like flexbox-float-1b.xhtml, but with the float-styled
- element dynamically inserted.
--->
-<html xmlns="http://www.w3.org/1999/xhtml" class="reftest-wait">
- <head>
- <script>
- function generateFloat(aFloatDirection) {
- var newElem = document.createElement("div");
- newElem.setAttribute("style", "float: " + aFloatDirection);
- newElem.innerHTML = aFloatDirection == "left" ? "[[[" : "]]]";
- return newElem;
- }
-
- function tweak() {
- var containerList = document.getElementsByClassName("flexbox");
- for (var i = 0; i &lt; containerList.length; i++) {
- var container = containerList[i];
- var newElem = generateFloat(container.getAttribute("floatValToUse"));
-
- var nodeToInsertBefore;
- var insertPosn = container.getAttribute("insertPosn");
- if (insertPosn == "begin") {
- nodeToInsertBefore = container.firstChild;
- } else if (insertPosn == "mid") {
- nodeToInsertBefore = container.firstChild.nextSibling;
- } else if (insertPosn == "end") {
- nodeToInsertBefore = null;
- }
-
- container.insertBefore(newElem, nodeToInsertBefore);
- }
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- <style>
- div.flexbox {
- display: flex;
- width: 400px;
- margin-bottom: 2px;
- font-family: sans-serif;
- background: lightgreen;
- justify-content: space-around;
- }
- </style>
- </head>
- <body>
- <div class="flexbox" floatValToUse="left" insertPosn="mid">
- aaa<span>bbb</span>
- </div>
- <div class="flexbox" floatValToUse="right" insertPosn="mid">
- aaa<span>bbb</span>
- </div>
- <div class="flexbox" floatValToUse="left" insertPosn="end">
- aaa
- </div>
- <div class="flexbox" floatValToUse="right" insertPosn="end">
- aaa
- </div>
- <div class="flexbox" floatValToUse="left" insertPosn="begin">
- bbb
- </div>
- <div class="flexbox" floatValToUse="right" insertPosn="begin">
- bbb
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2-ref.xhtml
deleted file mode 100644
index c6270dd49bb..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2-ref.xhtml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This reference case uses a div with "text-align: center" in place of a
- flex container, and has the text "lll" and "rrr" already placed at the
- target position instead of having it positioned with the "float" property.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- text-align: center;
- font-family: sans-serif;
- width: 400px;
- margin-bottom: 2px;
- background: lightgreen;
- justify-content: space-around;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- lllaaabbb
- </div>
- <div class="flexbox">
- aaabbbrrr
- </div>
-
- <div class="flexbox">
- lllaaabbb
- </div>
- <div class="flexbox">
- aaabbbrrr
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2a.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2a.xhtml
deleted file mode 100644
index 817e3fb2c4f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2a.xhtml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that 'float' on a grandchild of a flex container _will_
- cause the element to be floated.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- display: flex;
- font-family: sans-serif;
- width: 400px;
- margin-bottom: 2px;
- background: lightgreen;
- justify-content: space-around;
- }
- </style>
- </head>
- <body>
- <!-- These cases have a floated span as a grandchild of the flex container.
- The span should float within its flex item. -->
- <div class="flexbox">
- <span>aaa<span style="float: left">lll</span>bbb</span>
- </div>
- <div class="flexbox">
- <span>aaa<span style="float: right">rrr</span>bbb</span>
- </div>
-
- <!-- These cases have a floated div as a grandchild of the flex container.
- The div should float within its flex item. -->
- <div class="flexbox">
- <span>aaa<div style="float: left">lll</div>bbb</span>
- </div>
- <div class="flexbox">
- <span>aaa<div style="float: right">rrr</div>bbb</span>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2b.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2b.xhtml
deleted file mode 100644
index 29b9355ee6a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-float-2b.xhtml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that 'float' on a grandchild of a flex container _will_
- cause the element to be floated.
-
- This differs from the "2a" variant in that the flex items are <div>s
- rather than <span>s (though that shouldn't matter, because <span> as a
- flex item should become "display:block").
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- display: flex;
- font-family: sans-serif;
- width: 400px;
- margin-bottom: 2px;
- background: lightgreen;
- justify-content: space-around;
- }
- </style>
- </head>
- <body>
- <!-- These cases have a floated span as a grandchild of the flex container.
- The span should float within its flex item. -->
- <div class="flexbox">
- <div>aaa<span style="float: left">lll</span>bbb</div>
- </div>
- <div class="flexbox">
- <div>aaa<span style="float: right">rrr</span>bbb</div>
- </div>
-
- <!-- These cases have a floated div as a grandchild of the flex container.
- The div should float within its flex item. -->
- <div class="flexbox">
- <div>aaa<div style="float: left">lll</div>bbb</div>
- </div>
- <div class="flexbox">
- <div>aaa<div style="float: right">rrr</div>bbb</div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1-ref.xhtml
deleted file mode 100644
index b1008e7cc00..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1-ref.xhtml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Reference case, using a table with fixed-size cells instead of a
- flex container.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <link rel="stylesheet" type="text/css" href="ahem.css" />
- <style>
- table {
- font: 10px Ahem;
- height: 100px;
- width: 200px;
- }
- td { vertical-align: top; }
- td.a {
- width: 30px;
- background: lightgreen;
- }
- td.b {
- width: 50px;
- background: yellow;
- }
- td.inflex {
- width: 20px;
- background: gray;
- }
- </style>
- </head>
- <body>
- <table cellspacing="0" cellpadding="0">
- <tr>
- <td class="a"/>
- <td>text</td>
- <td class="b"/>
- <td><i>italic</i></td>
- <td class="inflex"></td>
- </tr>
- </table>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1a.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1a.xhtml
deleted file mode 100644
index 6146e505229..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1a.xhtml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test has static inline content intermixed with flex items,
- inside a flex container.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <link rel="stylesheet" type="text/css" href="ahem.css" />
- <style>
- div { height: 100px; }
- div.flexbox {
- font: 10px Ahem;
- width: 200px;
- display: flex;
- }
- div.a {
- flex: 1 0 20px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 30px;
- background: yellow;
- }
- div.inflex {
- flex: 0 0 20px;
- background: gray;
- }
- </style>
- </head>
- <body>
- <div class="flexbox"
- ><div class="a"/>text<div class="b"/><i>italic</i
- ><div class="inflex"/></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1b.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1b.xhtml
deleted file mode 100644
index 933b770707c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-1b.xhtml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test inserts a new div into some inline content in a flex container.
- That should split the inline content into two flex items.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <link rel="stylesheet" type="text/css" href="ahem.css" />
- <script>
- function tweak() {
- var flexbox = document.getElementsByClassName("flexbox")[0];
- var insertionPoint = flexbox.firstChild.nextSibling.nextSibling;
-
- var newDiv = document.createElement("div");
- newDiv.setAttribute("class", "b");
-
- flexbox.insertBefore(newDiv, insertionPoint);
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- <style>
- div { height: 100px; }
- div.flexbox {
- font: 10px Ahem;
- width: 200px;
- display: flex;
- }
- div.a {
- flex: 1 0 20px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 30px;
- background: yellow;
- }
- div.inflex {
- flex: 0 0 20px;
- background: gray;
- }
- </style>
- </head>
- <body>
- <div class="flexbox"
- ><div class="a"/>text<i>italic</i
- ><div class="inflex"/></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2-ref.xhtml
deleted file mode 100644
index d1469e79c93..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2-ref.xhtml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Reference case with a stretch of inline content in a flex container.
- (The corresponding testcase has a div interrupting the run, which gets
- removed, hopefully making it look like this reference case.)
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div { height: 100px; }
- div.flexbox {
- width: 200px;
- display: flex;
- }
- div.a {
- flex: 1 0 20px;
- background: lightgreen;
- }
- div.inflex {
- flex: 0 0 20px;
- background: gray;
- }
- </style>
- </head>
- <body>
- <div class="flexbox"
- ><div class="a"/>text<i>italic</i
- ><div class="inflex"/></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2.xhtml
deleted file mode 100644
index bc0b341526f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-2.xhtml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test removes a div from the middle of some inline content in a flex
- container. That should merge the inline content into a single flex item.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <script>
- function tweak() {
- var removeMe = document.getElementById("removeMe");
- removeMe.parentNode.removeChild(removeMe);
- document.documentElement.removeAttribute("class");
- }
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- <style>
- div { height: 100px; }
- div.flexbox {
- width: 200px;
- display: flex;
- }
- div.a {
- flex: 1 0 20px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 30px;
- background: yellow;
- }
- div.inflex {
- flex: 0 0 20px;
- background: gray;
- }
- </style>
- </head>
- <body>
- <div class="flexbox"
- ><div class="a"/>text<div class="b" id="removeMe"/><i>italic</i
- ><div class="inflex"/></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3-ref.xhtml
deleted file mode 100644
index 4c28d8d206d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3-ref.xhtml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Reference case, using a block instead of a flexbox.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <link rel="stylesheet" type="text/css" href="ahem.css" />
- <style>
- div#block {
- width: 100px;
- font: 10px Ahem;
- }
- </style>
- </head>
- <body>
- <div id="block">abc def ghi jkl mno pqr stu</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3a.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3a.xhtml
deleted file mode 100644
index 2b88ce2ae28..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3a.xhtml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test has a run of text in a flex container, for comparison
- against the "b" & "c" variants of this test (which use dynamic tweaks).
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <link rel="stylesheet" type="text/css" href="ahem.css" />
- <style>
- div#flexbox {
- width: 100px;
- display: flex;
- font: 10px Ahem;
- }
- </style>
- </head>
- <body>
- <div id="flexbox">abc def ghi jkl mno pqr stu</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3b.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3b.xhtml
deleted file mode 100644
index b5d509f18ab..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3b.xhtml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test inserts a some inline content in a flex container, just before a
- stretch of existing inline content. The new content should be incorporated
- into the same anonymous flex item as the existing content.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <link rel="stylesheet" type="text/css" href="ahem.css" />
- <script>
- function tweak() {
- var newInlineContent = document.createTextNode("abc def ghi");
-
- var flexbox = document.getElementById("flexbox");
- flexbox.insertBefore(newInlineContent, flexbox.firstChild);
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- <style>
- div#flexbox {
- width: 100px;
- display: flex;
- font: 10px Ahem;
- }
- </style>
- </head>
- <body>
- <div id="flexbox"> jkl mno pqr stu</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3c.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3c.xhtml
deleted file mode 100644
index d532372a41d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-3c.xhtml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test inserts a some inline content in a flex container, just after a
- stretch of existing inline content. The new content should be incorporated
- into the same anonymous flex item as the existing content.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <link rel="stylesheet" type="text/css" href="ahem.css" />
- <script>
- function tweak() {
- var newInlineContent = document.createTextNode("mno pqr stu");
-
- var flexbox = document.getElementById("flexbox");
- flexbox.insertBefore(newInlineContent, null);
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- <style>
- div#flexbox {
- width: 100px;
- display: flex;
- font: 10px Ahem;
- }
- </style>
- </head>
- <body>
- <div id="flexbox">abc def ghi jkl </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4-ref.xhtml
deleted file mode 100644
index cbb99ba9f0d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4-ref.xhtml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- This reference case simply has text centered within a div. -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div {
- width: 200px;
- height: 100px;
- background: lightgreen;
- text-align: center;
- }
- </style>
- </head>
- <body>
- <div>text</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4.xhtml
deleted file mode 100644
index c7a068d5726..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-4.xhtml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that a flex container which only contains text
- will render correctly. We use justify-content to position the text
- in the center of the flex container, as a sanity-check to be sure we
- are in fact getting a flex container.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- width: 200px;
- height: 100px;
- background: lightgreen;
- justify-content: center;
- display: flex;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">text</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5-ref.xhtml
deleted file mode 100644
index 9e51122cad1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5-ref.xhtml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This reference case is the same as the corresponding testcase,
- but with the dynamic removal already performed.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- width: 200px;
- height: 100px;
- background: lightgreen;
- justify-content: space-around;
- display: flex;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">text<div>div</div></div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5.xhtml
deleted file mode 100644
index 8338d1871ed..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-inlinecontent-horiz-5.xhtml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test removes a run of inline content from a flexbox, which
- should trigger the removal of its now-empty anonymous flex item.
--->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <script>
- function tweak() {
- var removeMe = document.getElementsByClassName("flexbox")[0].lastChild;
- removeMe.parentNode.removeChild(removeMe);
- document.documentElement.removeAttribute("class");
- }
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- <style>
- div.flexbox {
- width: 200px;
- height: 100px;
- background: lightgreen;
- justify-content: space-around;
- display: flex;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">text<div>div</div>
- REMOVE ME
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1-ref.xhtml
deleted file mode 100644
index f11668e5962..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1-ref.xhtml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Reference case - see documentation in corresponding testcase.
- This reference uses blocks where the testcase uses flexboxes.
- They should be sized the same, since they're basically just text
- with no special flex sizing properties in play.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <link rel="stylesheet" type="text/css" href="ahem.css" />
- <style>
- table {
- width: 300px;
- font: 10px Ahem;
- margin-bottom: 2px;
- border: 1px dashed black;
- }
-
- div.a { background: lightgreen; }
- div.b { background: lightblue; }
-
- <!-- helper-classes for assigning pref / min / auto-width to our divs -->
- div.prefWidth {
- width: -moz-max-content;
- }
- div.minWidth {
- width: -moz-min-content;
- }
- div.autoWidth {
- width: auto;
- }
- </style>
-</head>
-<body>
- <!-- both auto width -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a autoWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b autoWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
-
- <!-- MIXING MIN WIDTH & AUTO -->
- <!-- both min width -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a minWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b minWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
- <!-- min,auto -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a minWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b autoWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
- <!-- auto,min -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a autoWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b minWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
-
- <!-- MIXING PREF WIDTH & AUTO -->
- <!-- both prefWidth (NOTE: makes the table larger than it wants to be -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a prefWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b prefWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
- <!-- pref,auto -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a prefWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b autoWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
- <!-- auto,pref -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a autoWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b prefWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
-
- <!-- MIXING PREF WIDTH & MIN WIDTH -->
- <!-- min,pref -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a minWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b prefWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
- <!-- pref,min -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a prefWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b minWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1a.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1a.xhtml
deleted file mode 100644
index f7e99f68ac2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1a.xhtml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test has a number of tables, each with 2 flexboxes side-by-side,
- whose "width" values depend on the flexbox's min and/or pref widths.
-
- There's not enough space for both flexboxes to fit side-by-side, so their
- width preferences must be balanced This exercises
- nsFlexContainerFrame::GetPrefWidth() & ::GetMinWidth().
-
- IN EACH CASE, div.a has these intrinsic widths:
- Pref width: 2*40 + 1*50 + 2*10 = 150px (2*aaaa + 1*aaaaa + 2*space)
- Min width: 50px (width of "aaaaa")
- and div.b has these intrinsic widths:
- Pref width: 5*20 + 3*10 + 7*10 = 200px (5*bb + 3*b + 7*space)
- Min width: 20px (width "bb")
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <link rel="stylesheet" type="text/css" href="ahem.css" />
- <style>
- table {
- width: 300px;
- font: 10px Ahem;
- margin-bottom: 2px;
- border: 1px dashed black;
- }
-
- div.a, div.b { display: flex; }
-
- div.a { background: lightgreen; }
- div.b { background: lightblue; }
-
- <!-- helper-classes for assigning pref / min / auto-width to our divs -->
- div.prefWidth {
- width: -moz-max-content;
- }
- div.minWidth {
- width: -moz-min-content;
- }
- div.autoWidth {
- width: auto;
- }
- </style>
-</head>
-<body>
- <!-- both auto width -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a autoWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b autoWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
-
- <!-- MIXING MIN WIDTH & AUTO -->
- <!-- both min width -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a minWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b minWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
- <!-- min,auto -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a minWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b autoWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
- <!-- auto,min -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a autoWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b minWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
-
- <!-- MIXING PREF WIDTH & AUTO -->
- <!-- both prefWidth (NOTE: makes the table larger than it wants to be -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a prefWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b prefWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
- <!-- pref,auto -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a prefWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b autoWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
- <!-- auto,pref -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a autoWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b prefWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
-
- <!-- MIXING PREF WIDTH & MIN WIDTH -->
- <!-- min,pref -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a minWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b prefWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
- <!-- pref,min -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a prefWidth">aaaa aaaa aaaaa</div></td>
- <td><div class="b minWidth">bb bb b bb bb b bb b</div></td>
- </tr></table>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1b.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1b.xhtml
deleted file mode 100644
index c2b0074baf3..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-1b.xhtml
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test has a number of tables, each with 2 flexboxes side-by-side,
- whose "width" values depend on the flexbox's min and/or pref widths.
-
- There's not enough space for both flexboxes to fit side-by-side, so their
- width preferences must be balanced. This exercises
- nsFlexContainerFrame::GetPrefWidth() & ::GetMinWidth().
-
- IN EACH CASE, div.a has these intrinsic widths:
- Pref width: 2*40 + 1*50 + 2*10 = 150px (2*aaaa + 1*aaaaa + 2*space)
- Min width: 50px (width of "aaaaa")
- and div.b has these intrinsic widths:
- Pref width: 5*20 + 3*10 + 7*10 = 200px (5*bb + 3*b + 7*space)
- Min width: 20px (width "bb")
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <link rel="stylesheet" type="text/css" href="ahem.css" />
- <style>
- table {
- width: 300px;
- font: 10px Ahem;
- margin-bottom: 2px;
- border: 1px dashed black;
- }
-
- div.a, div.b { display: flex; }
-
- div.a { background: lightgreen; }
- div.b { background: lightblue; }
-
- <!-- helper-classes for assigning pref / min / auto-width to our divs -->
- div.prefWidth {
- width: -moz-max-content;
- }
- div.minWidth {
- width: -moz-min-content;
- }
- div.autoWidth {
- width: auto;
- }
- </style>
-</head>
-<body>
- <!-- both auto width -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a autoWidth"><div>aaaa aaaa aaaaa</div></div></td>
- <td><div class="b autoWidth"><div>bb bb b bb bb b bb b</div></div></td>
- </tr></table>
-
- <!-- MIXING MIN WIDTH & AUTO -->
- <!-- both min width -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a minWidth"><div>aaaa aaaa aaaaa</div></div></td>
- <td><div class="b minWidth"><div>bb bb b bb bb b bb b</div></div></td>
- </tr></table>
- <!-- min,auto -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a minWidth"><div>aaaa aaaa aaaaa</div></div></td>
- <td><div class="b autoWidth"><div>bb bb b bb bb b bb b</div></div></td>
- </tr></table>
- <!-- auto,min -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a autoWidth"><div>aaaa aaaa aaaaa</div></div></td>
- <td><div class="b minWidth"><div>bb bb b bb bb b bb b</div></div></td>
- </tr></table>
-
- <!-- MIXING PREF WIDTH & AUTO -->
- <!-- both prefWidth (NOTE: makes the table larger than it wants to be -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a prefWidth"><div>aaaa aaaa aaaaa</div></div></td>
- <td><div class="b prefWidth"><div>bb bb b bb bb b bb b</div></div></td>
- </tr></table>
- <!-- pref,auto -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a prefWidth"><div>aaaa aaaa aaaaa</div></div></td>
- <td><div class="b autoWidth"><div>bb bb b bb bb b bb b</div></div></td>
- </tr></table>
- <!-- auto,pref -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a autoWidth"><div>aaaa aaaa aaaaa</div></div></td>
- <td><div class="b prefWidth"><div>bb bb b bb bb b bb b</div></div></td>
- </tr></table>
-
- <!-- MIXING PREF WIDTH & MIN WIDTH -->
- <!-- min,pref -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a minWidth"><div>aaaa aaaa aaaaa</div></div></td>
- <td><div class="b prefWidth"><div>bb bb b bb bb b bb b</div></div></td>
- </tr></table>
- <!-- pref,min -->
- <table cellpadding="0" cellspacing="0"><tr>
- <td><div class="a prefWidth"><div>aaaa aaaa aaaaa</div></div></td>
- <td><div class="b minWidth"><div>bb bb b bb bb b bb b</div></div></td>
- </tr></table>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2-ref.xhtml
deleted file mode 100644
index fe839bdd0c4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2-ref.xhtml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This reference case has inline blocks in a div, in place of
- flex items in a flex container.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { margin: 0; }
-
- div.flexbox {
- width: -moz-max-content;
- /* We give the flex container a border and background so we can easily
- * see how large it is. */
- border: 2px dotted black;
- background: lime;
-
- font-size: 0; /* to prevent whitespace from having an effect */
- }
-
- div.wrapper {
- display: inline-block;
- border: 5px solid teal;
- width: 40px;
- height: 16px;
- }
- div.blueBlock {
- width: 16px;
- height: 16px;
- background: rgb(0, 19, 127); /* matches solidblue.png */
- }
- </style>
-</head>
-<body>
- <div class="flexbox">
- <div class="wrapper"><div class="blueBlock"/></div>
- <div class="wrapper"><div class="blueBlock"/></div>
- <div class="wrapper"><div class="blueBlock"/></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2a.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2a.xhtml
deleted file mode 100644
index bdd41847dc1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2a.xhtml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks how a flexbox sizes itself to shrinkwrap its contents'
- preferred sizes.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { margin: 0; }
- div.flexbox {
- display: flex;
- width: -moz-max-content;
-
- /* We give the flexbox a border and background so we can easily see how
- * large it is. */
- border: 2px dotted black;
- background: lime;
- }
-
- div.imgWrapper {
- border: 5px solid teal;
- width: 40px;
- height: 16px;
- }
- img {
- vertical-align: top;
- }
- </style>
-</head>
-<body>
- <div class="flexbox">
- <div class="imgWrapper"><img src="solidblue.png"/></div>
- <div class="imgWrapper"><img src="solidblue.png"/></div>
- <div class="imgWrapper"><img src="solidblue.png"/></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2b.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2b.xhtml
deleted file mode 100644
index 07ba6faf393..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-intrinsic-sizing-horiz-2b.xhtml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test is like the -2a variant, but with a <div> instead of an <img>
- at the deepest level of nesting.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { margin: 0; }
-
- div.flexbox {
- display: flex;
- width: -moz-max-content;
-
- /* We give the flex container a border and background so we can easily
- * see how large it is. */
- border: 2px dotted black;
- background: lime;
- }
-
- div.wrapper {
- border: 5px solid teal;
- width: 40px;
- height: 16px;
- }
- div.blueBlock {
- width: 16px;
- height: 16px;
- background: rgb(0, 19, 127); /* matches solidblue.png */
- }
- </style>
-</head>
-<body>
- <div class="flexbox">
- <div class="wrapper"><div class="blueBlock"/></div>
- <div class="wrapper"><div class="blueBlock"/></div>
- <div class="wrapper"><div class="blueBlock"/></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1-ref.html
deleted file mode 100644
index a9481b0a785..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1-ref.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Reference case, with testcase's dynamic tweak already performed.
--->
-<html>
- <head>
- <style>
- div#outer { margin-left: 40px }
-
- div#flexContainer {
- width: 100px;
- height: 50px;
- background: lightgray;
- display: flex;
- justify-content: center;
- }
-
- div#flexItem {
- border: 1px solid black;
- height: 200%;
- background: purple;
- }
- </style>
- </head>
- <body>
- <div id="outer">
- <div id="flexContainer">
- <div id="flexItem">item</div>
- </div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1.html
deleted file mode 100644
index 5520c295e48..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-invalidation-1.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test verifies that we include our children's overflow areas in the
- flex container's overflow area -- invalidating their old location and new
- location when the flex container is moved, even if they stick outside the
- flex container.
--->
-<html class="reftest-wait">
- <head>
- <script>
- function tweak() {
- var outer = document.getElementById("outer");
- outer.style.marginLeft = "40px";
-
- document.documentElement.removeAttribute("class");
- }
-
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- <style>
- div#flexContainer {
- width: 100px;
- height: 50px;
- background: lightgray;
- display: flex;
- justify-content: center;
- }
-
- div#flexItem {
- border: 1px solid black;
- height: 200%;
- background: purple;
- }
- </style>
- </head>
- <body>
- <div id="outer">
- <div id="flexContainer">
- <div id="flexItem">item</div>
- </div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1-ref.xhtml
deleted file mode 100644
index 9c13e263088..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1-ref.xhtml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- width: 200px;
- font-size: 8px;
- }
- div.outerContainer {
- border: 1px dotted black;
- height: 42px;
- margin-bottom: 5px;
- }
- div.flexbox > * {
- vertical-align: top;
- display: inline-block;
- margin-right: 20px;
- border: 1px dashed green;
- background: lightblue;
- height: 40px;
- }
- div.childMinSizeIsMinContent > * {
- min-width: -moz-min-content;
- }
- div.childSizeIsMinContent > * {
- width: -moz-min-content;
- }
- div.smallSize { width: 5px; }
- div.smallFlexBasis { width: 2px; }
- div.zeroWidth { width: 0; }
-
- </style>
- </head>
- <body>
-
- <!-- Check that we use the min-content width as a lower-bound when sizing
- flex items. -->
- <div class="flexbox childMinSizeIsMinContent outerContainer">
- <div>abc d e f</div
- ><div class="smallSize">abc d e f</div
- ><div class="smallFlexBasis">abc d e f</div>
- </div>
-
- <!-- ... EVEN if our flex container is small and we're overflowing. -->
- <div class="outerContainer smallSize">
- <div class="flexbox childSizeIsMinContent">
- <div>abc d e f</div
- ><div>abc d e f</div
- ><div>abc d e f</div>
- </div>
- </div>
-
- <!-- Test that "min-width: 0" on flex items will keep us from clamping to
- the min-content width. (So we can now actually honor small 'width'
- and 'flex-basis' values.) -->
- <div class="flexbox outerContainer">
- <div>abc d e f</div
- ><div class="smallSize">abc d e f</div
- ><div class="smallFlexBasis">abc d e f</div>
- </div>
-
- <!-- ... and similarly, when we have a small flex container and we trigger
- shrinking behavior, flex items with "min-width: 0" are allowed to
- shrink past their min-content width. -->
- <div class="outerContainer smallSize">
- <div class="flexbox">
- <div class="zeroWidth">abc d e f</div
- ><div class="zeroWidth">abc d e f</div
- ><div class="zeroWidth">abc d e f</div>
- </div>
- </div>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1.xhtml
deleted file mode 100644
index b159b420d89..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-horiz-1.xhtml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that we correctly handle flex items with an explicit
- "min-width: -moz-min-content".
-
- We check that such flex items can't shrink below their min-content width,
- unless we explicitly reduce their min-width with e.g. "min-width: 0".
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- width: 200px;
- display: flex;
- margin-bottom: 5px;
- font-size: 8px;
- border: 1px dotted black;
- }
- div.flexbox > * {
- margin-right: 20px;
- border: 1px dashed green;
- background: lightblue;
- height: 40px;
- min-width: -moz-min-content;
- }
- div.smallSize { width: 5px; }
- div.smallFlexBasis { flex-basis: 2px; }
- div.zeroMinWidth { min-width: 0; }
-
- </style>
- </head>
- <body>
-
- <!-- Check that we honor "min-width: min-content" as a lower-bound when
- sizing flex items. -->
- <div class="flexbox">
- <div>abc d e f</div>
- <div class="smallSize">abc d e f</div>
- <div class="smallFlexBasis">abc d e f</div>
- </div>
-
- <!-- ... EVEN if our flex container is small and we're overflowing. -->
- <div class="flexbox smallSize">
- <div>abc d e f</div>
- <div class="smallSize">abc d e f</div>
- <div class="smallFlexBasis">abc d e f</div>
- </div>
-
- <!-- Test that we don't clamp when we've got "min-width: 0" on our
- flex items, though. -->
- <div class="flexbox">
- <div class="zeroMinWidth">abc d e f</div>
- <div class="zeroMinWidth smallSize">abc d e f</div>
- <div class="zeroMinWidth smallFlexBasis">abc d e f</div>
- </div>
-
- <!-- ... and similarly, when we have a small flex container and we trigger
- shrinking behavior, flex items with "min-width: 0" are allowed to
- shrink past their min-content width. -->
- <div class="flexbox smallSize">
- <div class="zeroMinWidth">abc d e f</div>
- <div class="zeroMinWidth smallSize">abc d e f</div>
- <div class="zeroMinWidth smallFlexBasis">abc d e f</div>
- </div>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1-ref.xhtml
deleted file mode 100644
index f736fb8abb8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1-ref.xhtml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 140px;
- margin-right: 5px;
- font-size: 8px;
- border: 1px dotted black;
- float: left;
- }
- div.flexbox > * {
- margin-bottom: 20px;
- border: 1px dashed green;
- background: lightblue;
- width: 40px;
- }
- div.smallSize { height: 5px; }
- div.smallFlexBasis { height: 2px; }
- div.zeroHeight { height: 0; }
-
- </style>
- </head>
- <body>
-
- <div class="flexbox">
- <div>a b</div>
- <div>a b</div>
- <div>a b</div>
- </div>
-
- <div class="flexbox smallSize">
- <div>a b</div>
- <div>a b</div>
- <div>a b</div>
- </div>
-
- <div class="flexbox">
- <div>a b</div>
- <div class="smallSize">a b</div>
- <div class="smallFlexBasis">a b</div>
- </div>
-
- <div class="flexbox smallSize">
- <div class="zeroHeight">a b</div>
- <div class="zeroHeight">a b</div>
- <div class="zeroHeight">a b</div>
- </div>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1.xhtml
deleted file mode 100644
index 985b98ae7d2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-minSize-vert-1.xhtml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This test checks that we correctly handle flex items with an explicit
- "min-height: -moz-min-content".
-
- We check that such flex items can't shrink below their min-content height,
- unless we explicitly reduce their min-height with e.g. "min-height: 0".
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.flexbox {
- height: 140px;
- display: flex;
- flex-direction: column;
- margin-right: 5px;
- font-size: 8px;
- border: 1px dotted black;
- float: left;
- }
- div.flexbox > * {
- margin-bottom: 20px;
- border: 1px dashed green;
- background: lightblue;
- width: 40px;
- min-height: -moz-min-content; /* not yet supported -- see bug 852367 */
- }
- div.smallSize { height: 5px; }
- div.smallFlexBasis { flex-basis: 2px; }
- div.zeroMinHeight { min-height: 0; }
-
- </style>
- </head>
- <body>
-
- <!-- Check that we honor "min-height: min-content" as a lower-bound when
- sizing flex items. -->
- <div class="flexbox">
- <div>a b</div>
- <div class="smallSize">a b</div>
- <div class="smallFlexBasis">a b</div>
- </div>
-
- <!-- ... EVEN if our flex container is small and we're overflowing. -->
- <div class="flexbox smallSize">
- <div>a b</div>
- <div class="smallSize">a b</div>
- <div class="smallFlexBasis">a b</div>
- </div>
-
- <!-- Test that we don't clamp when we've got "min-height: 0" on our
- flex items, though. -->
- <div class="flexbox">
- <div class="zeroMinHeight">a b</div>
- <div class="zeroMinHeight smallSize">a b</div>
- <div class="zeroMinHeight smallFlexBasis">a b</div>
- </div>
-
- <!-- ... and similarly, when we have a small flex container and we trigger
- shrinking behavior, flex items with "min-height: 0" are allowed to
- shrink past their min-content height. -->
- <div class="flexbox smallSize">
- <div class="zeroMinHeight">a b</div>
- <div class="zeroMinHeight smallSize">a b</div>
- <div class="zeroMinHeight smallFlexBasis">a b</div>
- </div>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3-ref.html
deleted file mode 100644
index dd17f16716d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3-ref.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html>
-<head>
- <style>
- #container { display: flex; }
- #highOrdinal {
- background: lime;
- height: 100px; width: 100px;
- }
- </style>
-</head>
-<body>
- <div id="container">
- <div id="highOrdinal"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3.html
deleted file mode 100644
index a0052ff9f08..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-paint-ordering-3.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Testcase for whether we honor "order" on absolutely-positioned elements
- within a flex container. Specifically, we test whether it affects their
- paint-order (as it should, since it reorders the frame tree). -->
-<html>
-<head>
- <style>
- #container { display: flex; }
- #lowOrdinal {
- position: absolute;
- order: 5;
- background: red;
- height: 100px; width: 100px;
- }
- #highOrdinal {
- position: absolute;
- order: 10;
- background: lime;
- height: 100px; width: 100px;
- }
- #noOrdinal {
- position: absolute;
- background: orange;
- height: 100px; width: 100px;
- }
- </style>
-</head>
-<body>
- <div id="container">
- <div id="highOrdinal"></div>
- <div id="lowOrdinal"></div>
- <div id="noOrdinal"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1-ref.xhtml
deleted file mode 100644
index 20925cd5651..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1-ref.xhtml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for absolutely positioned children of a flex container. -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .abspos {
- position: absolute;
- left: 5px;
- border: 2px dotted black;
- }
- div.flexbox {
- width: 200px;
- height: 100px;
- }
- div.a {
- width: 100%;
- height: 100px;
- background: lightgreen;
- display: inline-block;
- }
- div.b {
- width: 100%;
- height: 100px;
- background: yellow;
- display: inline-block;
- }
- div.inflex {
- width: 20px;
- height: 100px;
- background: gray;
- display: inline-block;
- }
- div.noFlexFn {
- width: 15px;
- height: 15px;
- background: teal;
- display: inline-block;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <!-- First child abspos: -->
- <div class="flexbox"
- ><div class="a abspos" style="width: 30px"/><div class="b"/></div>
- <!-- Second child abspos: -->
- <div class="flexbox"
- ><div class="a"/><div class="b abspos" style="width: 20px"/></div>
- <!-- Middle child abspos: -->
- <div class="flexbox"
- ><div class="a" style="width: 80px"
- /><div class="inflex abspos"
- /><div class="b" style="width: 120px"/></div>
- <!-- Third child abspos, w/ inflexible items & justify-content: space-around: -->
- <div class="flexbox"
- ><div class="inflex" style="margin-left: 12px"
- /><div class="inflex" style="margin-left: 24px"
- /><div class="inflex" style="margin-left: 24px"
- /><div class="noFlexFn abspos"
- /><div class="inflex" style="margin-left: 48px"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1.xhtml
deleted file mode 100644
index aa89dd714c2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-1.xhtml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Testcase with absolutely positioned children of a flex container.
- This positioning is with respect to the containing block's left edge.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .abspos {
- position: absolute;
- left: 5px;
- border: 2px dotted black;
- }
- div.flexbox {
- width: 200px;
- height: 100px;
- display: flex;
- }
- div.a {
- flex: 1 0 auto;
- width: 30px;
- height: 100px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 auto;
- width: 20px;
- height: 100px;
- background: yellow;
- }
- div.inflex {
- flex: none;
- width: 20px;
- height: 100px;
- background: gray;
- }
- div.noFlexFn {
- width: 15px;
- height: 15px;
- background: teal;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <!-- First child abspos: -->
- <div class="flexbox"><div class="a abspos"/><div class="b"/></div>
- <!-- Second child abspos: -->
- <div class="flexbox"><div class="a"/><div class="b abspos"/></div>
- <!-- Middle child abspos: -->
- <div class="flexbox"
- ><div class="a"/><div class="inflex abspos"/><div class="b"/></div>
- <!-- Third child abspos, w/ inflexible items & justify-content: space-around: -->
- <div class="flexbox" style="justify-content: space-around"
- ><div class="inflex"/><div class="inflex"/><div class="inflex"
- /><div class="noFlexFn abspos"/><div class="inflex"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2-ref.xhtml
deleted file mode 100644
index 4e403c21977..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2-ref.xhtml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for absolutely positioned children of a flex container. -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .abspos {
- position: absolute;
- border: 2px dotted black;
- }
- div.flexbox {
- width: 200px;
- height: 100px;
- }
- div.a {
- width: 100%;
- height: 100px;
- background: lightgreen;
- display: inline-block;
- }
- div.b {
- width: 100%;
- height: 100px;
- background: yellow;
- display: inline-block;
- }
- div.inflex {
- width: 20px;
- height: 100px;
- background: gray;
- display: inline-block;
- }
- div.noFlexFn {
- width: 15px;
- height: 15px;
- background: teal;
- display: inline-block;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <!-- First child abspos: -->
- <div class="flexbox"
- ><div class="a abspos" style="width: 30px"/><div class="b"/></div>
- <!-- Second child abspos: -->
- <div class="flexbox"
- ><div class="a"/><div class="b abspos" style="width: 20px"/></div>
- <!-- Middle child abspos: -->
- <div class="flexbox"
- ><div class="a" style="width: 80px"
- /><div class="inflex abspos"
- /><div class="b" style="width: 120px"/></div>
- <!-- Third child abspos, w/ inflexible items & justify-content: space-around: -->
- <div class="flexbox"
- ><div class="inflex" style="margin-left: 12px"
- /><div class="inflex" style="margin-left: 24px"
- /><div class="inflex" style="margin-left: 24px"
- /><div class="noFlexFn abspos" style="margin-left: 24px"
- /><div class="inflex" style="margin-left: 48px"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2.xhtml
deleted file mode 100644
index d676272c037..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-2.xhtml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Testcase with absolutely positioned children of a flex container.
- In this testcase, we simply specify "position: absolute" without
- actually doing any positioning, to test the "static position" of these
- children.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .abspos {
- position: absolute;
- border: 2px dotted black;
- }
- div.flexbox {
- width: 200px;
- height: 100px;
- display: flex;
- }
- div.a {
- flex: 1 0 auto;
- width: 30px;
- height: 100px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 auto;
- width: 20px;
- height: 100px;
- background: yellow;
- }
- div.inflex {
- flex: none;
- width: 20px;
- height: 100px;
- background: gray;
- }
- div.noFlexFn {
- width: 15px;
- height: 15px;
- background: teal;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <!-- First child abspos: -->
- <div class="flexbox"><div class="a abspos"/><div class="b"/></div>
- <!-- Second child abspos: -->
- <div class="flexbox"><div class="a"/><div class="b abspos"/></div>
- <!-- Middle child abspos: -->
- <div class="flexbox"
- ><div class="a"/><div class="inflex abspos"/><div class="b"/></div>
- <!-- Third child abspos, w/ inflexible items & justify-content: space-around: -->
- <div class="flexbox" style="justify-content: space-around"
- ><div class="inflex"/><div class="inflex"/><div class="inflex"
- /><div class="noFlexFn abspos"/><div class="inflex"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3-ref.xhtml
deleted file mode 100644
index 9bafa1506a4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3-ref.xhtml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for absolutely positioned flex container. -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- div.flexbox {
- top: 30px;
- left: 40px;
- width: 200px;
- height: 100px;
- position: absolute;
- border: 1px solid black;
- }
- div.a {
- width: 80px;
- height: 100px;
- background: lightgreen;
- display: inline-block;
- }
- div.b {
- width: 120px;
- height: 100px;
- background: yellow;
- display: inline-block;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <div class="flexbox"><div class="a"/><div class="b"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3.xhtml
deleted file mode 100644
index 21b8730c4b7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-3.xhtml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Testcase with absolutely positioned flex container.
- This positioning is with respect to the containing block's left edge.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- div.flexbox {
- top: 30px;
- left: 40px;
- width: 200px;
- height: 100px;
- display: flex;
- position: absolute;
- border: 1px solid black;
- }
- div.a {
- flex: 1 0 30px;
- height: 100px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 20px;
- height: 100px;
- background: yellow;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <div class="flexbox"><div class="a"/><div class="b"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4-ref.xhtml
deleted file mode 100644
index 4c675fa8eec..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4-ref.xhtml
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for absolutely positioned flex container & children. -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .abspos {
- position: absolute;
- left: 5px;
- border: 2px dotted black;
- }
- div.flexbox {
- top: 30px;
- left: 40px;
- width: 200px;
- height: 100px;
- position: absolute;
- border: 1px solid black;
- }
- div.a {
- width: 30px;
- height: 100px;
- background: lightgreen;
- display: inline-block;
- }
- div.b {
- width: 100%;
- height: 100px;
- background: yellow;
- display: inline-block;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <div class="flexbox"
- ><div class="a abspos"/><div class="b"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4.xhtml
deleted file mode 100644
index 67974fcf67a..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-absolute-4.xhtml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Testcase with absolutely positioned flex container & children.
- The children's positioning is with respect to the flex container.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .abspos {
- position: absolute;
- left: 5px;
- border: 2px dotted black;
- }
- div.flexbox {
- top: 30px;
- left: 40px;
- width: 200px;
- height: 100px;
- display: flex;
- position: absolute;
- border: 1px solid black;
- }
- div.a {
- flex: 1 0 auto;
- width: 30px;
- height: 100px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 20px;
- height: 100px;
- background: yellow;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <div class="flexbox"><div class="a abspos"/><div class="b"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1-ref.xhtml
deleted file mode 100644
index 27e8438b321..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1-ref.xhtml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for fixed-position children of a flex container. -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .fixedpos {
- position: fixed;
- left: 5px;
- border: 2px dotted black;
- }
- div.flexbox {
- width: 200px;
- height: 100px;
- }
- div.a {
- width: 100%;
- height: 100px;
- background: lightgreen;
- display: inline-block;
- }
- div.b {
- width: 100%;
- height: 100px;
- background: yellow;
- display: inline-block;
- }
- div.inflex {
- width: 20px;
- height: 100px;
- background: gray;
- display: inline-block;
- }
- div.noFlexFn {
- width: 15px;
- height: 15px;
- background: teal;
- display: inline-block;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <!-- First child fixedpos: -->
- <div class="flexbox"
- ><div class="a fixedpos" style="width: 30px"/><div class="b"/></div>
- <!-- Second child fixedpos: -->
- <div class="flexbox"
- ><div class="a"/><div class="b fixedpos" style="width: 20px"/></div>
- <!-- Middle child fixedpos: -->
- <div class="flexbox"
- ><div class="a" style="width: 80px"
- /><div class="inflex fixedpos"
- /><div class="b" style="width: 120px"/></div>
- <!-- Third child fixedpos, w/ inflexible items & justify-content: space-around: -->
- <div class="flexbox"
- ><div class="inflex" style="margin-left: 12px"
- /><div class="inflex" style="margin-left: 24px"
- /><div class="inflex" style="margin-left: 24px"
- /><div class="noFlexFn fixedpos"
- /><div class="inflex" style="margin-left: 48px"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1.xhtml
deleted file mode 100644
index 6401fb2cb19..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-1.xhtml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Testcase with fixed-position children of a flex container.
- The positioning is with respect to the containing block's left edge.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .fixedpos {
- position: fixed;
- left: 5px;
- border: 2px dotted black;
- }
- div.flexbox {
- width: 200px;
- height: 100px;
- display: flex;
- }
- div.a {
- flex: 1 0 auto;
- width: 30px;
- height: 100px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 auto;
- width: 20px;
- height: 100px;
- background: yellow;
- }
- div.inflex {
- flex: none;
- width: 20px;
- height: 100px;
- background: gray;
- }
- div.noFlexFn {
- width: 15px;
- height: 15px;
- background: teal;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <!-- First child fixedpos: -->
- <div class="flexbox"><div class="a fixedpos"/><div class="b"/></div>
- <!-- Second child fixedpos: -->
- <div class="flexbox"><div class="a"/><div class="b fixedpos"/></div>
- <!-- Middle child fixedpos: -->
- <div class="flexbox"
- ><div class="a"/><div class="inflex fixedpos"/><div class="b"/></div>
- <!-- Third child fixedpos, w/ inflexible items & justify-content: space-around: -->
- <div class="flexbox" style="justify-content: space-around"
- ><div class="inflex"/><div class="inflex"/><div class="inflex"
- /><div class="noFlexFn fixedpos"/><div class="inflex"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2-ref.xhtml
deleted file mode 100644
index 5dbeeeeb52e..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2-ref.xhtml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for fixed-position children of a flex container. -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .fixedpos {
- position: fixed;
- border: 2px dotted black;
- }
- div.flexbox {
- width: 200px;
- height: 100px;
- }
- div.a {
- width: 100%;
- height: 100px;
- background: lightgreen;
- display: inline-block;
- }
- div.b {
- width: 100%;
- height: 100px;
- background: yellow;
- display: inline-block;
- }
- div.inflex {
- width: 20px;
- height: 100px;
- background: gray;
- display: inline-block;
- }
- div.noFlexFn {
- width: 15px;
- height: 15px;
- background: teal;
- display: inline-block;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <!-- First child fixedpos: -->
- <div class="flexbox"
- ><div class="a fixedpos" style="width: 30px"/><div class="b"/></div>
- <!-- Second child fixedpos: -->
- <div class="flexbox"
- ><div class="a"/><div class="b fixedpos" style="width: 20px"/></div>
- <!-- Middle child fixedpos: -->
- <div class="flexbox"
- ><div class="a" style="width: 80px"
- /><div class="inflex fixedpos"
- /><div class="b" style="width: 120px"/></div>
- <!-- Third child fixedpos, w/ inflexible items & justify-content: space-around: -->
- <div class="flexbox"
- ><div class="inflex" style="margin-left: 12px"
- /><div class="inflex" style="margin-left: 24px"
- /><div class="inflex" style="margin-left: 24px"
- /><div class="noFlexFn fixedpos" style="margin-left: 24px"
- /><div class="inflex" style="margin-left: 48px"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2.xhtml
deleted file mode 100644
index c4f02bc9ce4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-2.xhtml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Testcase with fixed-position children of a flex container.
- In this testcase, we simply specify "position: fixed" without
- actually doing any positioning, to test the "static position" of these
- children.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .fixedpos {
- position: fixed;
- border: 2px dotted black;
- }
- div.flexbox {
- width: 200px;
- height: 100px;
- display: flex;
- }
- div.a {
- flex: 1 0 auto;
- width: 30px;
- height: 100px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 auto;
- width: 20px;
- height: 100px;
- background: yellow;
- }
- div.inflex {
- flex: none;
- width: 20px;
- height: 100px;
- background: gray;
- }
- div.noFlexFn {
- width: 15px;
- height: 15px;
- background: teal;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <!-- First child fixedpos: -->
- <div class="flexbox"><div class="a fixedpos"/><div class="b"/></div>
- <!-- Second child fixedpos: -->
- <div class="flexbox"><div class="a"/><div class="b fixedpos"/></div>
- <!-- Middle child fixedpos: -->
- <div class="flexbox"
- ><div class="a"/><div class="inflex fixedpos"/><div class="b"/></div>
- <!-- Third child fixedpos, w/ inflexible items & justify-content: space-around: -->
- <div class="flexbox" style="justify-content: space-around"
- ><div class="inflex"/><div class="inflex"/><div class="inflex"
- /><div class="noFlexFn fixedpos"/><div class="inflex"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3-ref.xhtml
deleted file mode 100644
index d0a086d60dd..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3-ref.xhtml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for fixed-position flex container. -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- div.flexbox {
- top: 30px;
- left: 40px;
- width: 200px;
- height: 100px;
- position: fixed;
- border: 1px solid black;
- }
- div.a {
- width: 80px;
- height: 100px;
- background: lightgreen;
- display: inline-block;
- }
- div.b {
- width: 120px;
- height: 100px;
- background: yellow;
- display: inline-block;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <div class="flexbox"><div class="a"/><div class="b"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3.xhtml
deleted file mode 100644
index a67481879d5..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-3.xhtml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Testcase with fixed-position flex container.
- This positioning is with respect to the viewport.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- div.flexbox {
- top: 30px;
- left: 40px;
- width: 200px;
- height: 100px;
- display: flex;
- position: fixed;
- border: 1px solid black;
- }
- div.a {
- flex: 1 0 30px;
- height: 100px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 20px;
- height: 100px;
- background: yellow;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <div class="flexbox"><div class="a"/><div class="b"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4-ref.xhtml
deleted file mode 100644
index 87783266559..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4-ref.xhtml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Reference case for fixed-position flex container & children. -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .fixedpos {
- position: fixed;
- left: 5px;
- border: 2px dotted black;
- }
- div.flexbox {
- top: 30px;
- left: 40px;
- width: 200px;
- height: 100px;
- position: fixed;
- border: 2px dashed teal;
- }
- div.a {
- width: 30px;
- height: 100px;
- background: lightgreen;
- display: inline-block;
- }
- div.b {
- width: 100%;
- height: 100px;
- background: yellow;
- display: inline-block;
- vertical-align: top;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <div class="flexbox"
- ><div class="a fixedpos"/><div class="b"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4.xhtml
deleted file mode 100644
index 05c75baeeb4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-position-fixed-4.xhtml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- Testcase with fixed-position flex container & children.
- All positioning is with respect to the viewport.
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- div.containingBlock {
- top: 15px;
- left: 20px;
- height: 400px;
- position: absolute;
- border: 2px dashed purple;
- }
- .fixedpos {
- position: fixed;
- left: 5px;
- border: 2px dotted black;
- }
- div.flexbox {
- top: 30px;
- left: 40px;
- width: 200px;
- height: 100px;
- display: flex;
- position: fixed;
- border: 2px dashed teal;
- }
- div.a {
- flex: 1 0 auto;
- width: 30px;
- height: 100px;
- background: lightgreen;
- }
- div.b {
- flex: 2 0 20px;
- height: 100px;
- background: yellow;
- }
- </style>
- </head>
- <body>
- <div class="containingBlock">
- <div class="flexbox"><div class="a fixedpos"/><div class="b"/></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-disabled-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-disabled-ref.xhtml
deleted file mode 100644
index 8dc18f44a66..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-disabled-ref.xhtml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { margin: 0 }
- </style>
- </head>
- <body>
- <p>
- "display: flex" is:
- <div>disabled</div>
- </p>
- <p>
- "display: inline-flex" is:
- <div>disabled</div>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-enabled-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-enabled-ref.xhtml
deleted file mode 100644
index 9bfba5f3150..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1-enabled-ref.xhtml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { margin: 0 }
- </style>
- </head>
- <body>
- <p>
- "display: flex" is:
- <div>enabled</div>
- </p>
- <p>
- "display: inline-flex" is:
- <div>enabled</div>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1.xhtml
deleted file mode 100644
index 471f388b4e6..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-pref-1.xhtml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Testcase that indicates whether flexbox support is enabled -->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- body { margin: 0 }
- div.mask {
- position: absolute;
- background: white;
- width: -moz-available;
- }
- div.flex {
- display: none;
- display: flex;
- }
- div.inlineFlex {
- display: none;
- display: inline-flex;
- }
- </style>
- </head>
- <body>
- <p>
- "display: flex" is:
- <!-- If rendered, this will cover up "disabled" below: -->
- <div class="mask flex">enabled</div>
- <div>disabled</div>
- </p>
- <p>
- "display: inline-flex" is:<br/>
- <!-- If rendered, this will cover up "disabled" below: -->
- <div class="mask inlineFlex">enabled</div>
- <div>disabled</div>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-helper.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-helper.html
deleted file mode 100644
index 66df03b9de4..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-helper.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Helper-file for reftest flexbox-resizeviewport-1.xhtml
- I'm intentionally using quirks-mode (no doctype), so that
- a 100% height will work. -->
-<html>
- <head>
- <style>
- div.flexbox {
- display: flex;
- height: 100%;
- border: 2px dashed black;
- }
- div.a {
- flex: 1;
- background: pink;
- }
- div.b {
- flex: 1;
- background: teal;
- }
- </style>
- </head>
- <body>
- <div class="flexbox">
- <div class="a"></div><div class="b"></div>
- </div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-ref.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-ref.xhtml
deleted file mode 100644
index 791d3a89f3d..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1-ref.xhtml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <style>
- iframe {
- width: 75px;
- height: 75px;
- }
- </style>
- </head>
- <body onload="tweak()">
- <iframe src="flexbox-resizeviewport-1-helper.html" style="width: 50px"/>
- <iframe src="flexbox-resizeviewport-1-helper.html" style="width: 125px"/>
- <br/>
- <iframe src="flexbox-resizeviewport-1-helper.html" style="height: 50px"/>
- <iframe src="flexbox-resizeviewport-1-helper.html" style="height: 125px"/>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1.xhtml b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1.xhtml
deleted file mode 100644
index 2875e8ee3b1..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-resizeviewport-1.xhtml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!-- Testcase to be sure a flex container gets reflowed properly when its
- iframe changes size. -->
-<html xmlns="http://www.w3.org/1999/xhtml"
- class="reftest-wait">
- <head>
- <style>
- iframe {
- width: 75px;
- height: 75px;
- }
- </style>
- <script>
- function setElementPropertyTo(id, propertyName, propertyValue) {
- var elem = document.getElementById(id);
- elem.style[propertyName] = propertyValue;
- }
-
- function tweak() {
- setElementPropertyTo("a", "width", "50px");
- setElementPropertyTo("b", "width", "125px");
- setElementPropertyTo("c", "height", "50px");
- setElementPropertyTo("d", "height", "125px");
- document.documentElement.removeAttribute("class");
- }
- window.addEventListener("MozReftestInvalidate", tweak, false);
- </script>
- </head>
- <body>
- <iframe id="a" src="flexbox-resizeviewport-1-helper.html"/>
- <iframe id="b" src="flexbox-resizeviewport-1-helper.html"/>
- <br/>
- <iframe id="c" src="flexbox-resizeviewport-1-helper.html"/>
- <iframe id="d" src="flexbox-resizeviewport-1-helper.html"/>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1-ref.html
deleted file mode 100644
index 68bac4fabfb..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1-ref.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html>
-<head>
- <style>
- div.flexbox {
- border: 2px dotted lightgray;
- width: 400px;
- height: 30px;
- margin-bottom: 10px;
- }
- div.flexbox > * {
- width: -moz-available;
- outline: 1px dashed black;
- margin: 0;
- vertical-align: top;
- display: block;
- }
- </style>
-</head>
-<body>
- <div class="flexbox"><input type="button"></div>
- <div class="flexbox"><input type="checkbox"></div>
- <div class="flexbox"><input type="file"></div>
- <div class="flexbox"><input type="image"></div>
- <div class="flexbox"><input type="password"></div>
- <div class="flexbox"><input type="radio"></div>
- <div class="flexbox"><input type="reset"></div>
- <div class="flexbox"><input type="submit"></div>
- <div class="flexbox"><input type="text"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1.html
deleted file mode 100644
index 54a82b9136f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-1.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This testcase checks that flex containers honor those widgets (if any) in
- our system theme that have only a single valid size (and hence should
- refuse to flex).
-
- e.g. in Gecko with a GTK theme, checkboxes and radio buttons have a single
- valid size, and any specified widths (and min/max-widths) will have no
- effect on their rendering (regardless of whether they're in a flex
- container).
--->
-<html>
-<head>
- <style>
- div.flexbox {
- display: flex;
- align-items: flex-start;
- border: 2px dotted lightgray;
- width: 400px;
- height: 30px;
- margin-bottom: 10px;
- }
- div.flexbox > * {
- flex: 1;
- outline: 1px dashed black;
- margin: 0;
- vertical-align: top;
- }
- </style>
-</head>
-<body>
- <div class="flexbox"><input type="button"></div>
- <div class="flexbox"><input type="checkbox"></div>
- <div class="flexbox"><input type="file"></div>
- <div class="flexbox"><input type="image"></div>
- <div class="flexbox"><input type="password"></div>
- <div class="flexbox"><input type="radio"></div>
- <div class="flexbox"><input type="reset"></div>
- <div class="flexbox"><input type="submit"></div>
- <div class="flexbox"><input type="text"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2-ref.html
deleted file mode 100644
index 4ac30975025..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2-ref.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html>
-<head>
- <style>
- div.flexbox {
- background: lightgray;
- width: 400px;
- height: 30px;
- margin-bottom: 10px;
- }
- div.flexbox > * {
- min-width: 350px;
- outline: 1px dashed black;
- margin: 0;
- vertical-align: top;
- display: block;
- width: -moz-max-content;
- }
- </style>
-</head>
-<body>
- <div class="flexbox"><input type="button"></div>
- <div class="flexbox"><input type="checkbox"></div>
- <div class="flexbox"><input type="file"></div>
- <div class="flexbox"><input type="image"></div>
- <div class="flexbox"><input type="password"></div>
- <div class="flexbox"><input type="radio"></div>
- <div class="flexbox"><input type="reset"></div>
- <div class="flexbox"><input type="submit"></div>
- <div class="flexbox"><input type="text"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2.html
deleted file mode 100644
index f184aa0f472..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-2.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This testcase checks that, for any widgets that have a single valid size
- (and hence refuse to flex), we don't honor the "min-width" property
- when running the flex algorithm, just as we don't honor it outside
- of flexbox contexts.
--->
-<html>
-<head>
- <style>
- div.flexbox {
- display: flex;
- align-items: flex-start;
- background: lightgray;
- width: 400px;
- height: 30px;
- margin-bottom: 10px;
- }
- div.flexbox > * {
- min-width: 350px;
- outline: 1px dashed black;
- margin: 0;
- vertical-align: top;
- }
- </style>
-</head>
-<body>
- <div class="flexbox"><input type="button"></div>
- <div class="flexbox"><input type="checkbox"></div>
- <div class="flexbox"><input type="file"></div>
- <div class="flexbox"><input type="image"></div>
- <div class="flexbox"><input type="password"></div>
- <div class="flexbox"><input type="radio"></div>
- <div class="flexbox"><input type="reset"></div>
- <div class="flexbox"><input type="submit"></div>
- <div class="flexbox"><input type="text"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3-ref.html
deleted file mode 100644
index 56d0d836d8f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3-ref.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html>
-<head>
- <style>
- div.flexbox {
- background: lightgray;
- width: 400px;
- height: 30px;
- margin-bottom: 10px;
- }
- div.flexbox > * {
- max-width: 3px;
- outline: 1px dashed black;
- margin: 0;
- vertical-align: top;
- display: block;
- }
- </style>
-</head>
-<body>
- <div class="flexbox"><input type="button"></div>
- <div class="flexbox"><input type="checkbox"></div>
- <div class="flexbox"><input type="file"></div>
- <div class="flexbox"><input type="image"></div>
- <div class="flexbox"><input type="password"></div>
- <div class="flexbox"><input type="radio"></div>
- <div class="flexbox"><input type="reset"></div>
- <div class="flexbox"><input type="submit"></div>
- <div class="flexbox"><input type="text"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3.html
deleted file mode 100644
index 609835ac0ef..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-3.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This testcase checks that, for any widgets that have a single valid size
- (and hence refuse to flex), we don't honor the "max-width" property
- when running the flex algorithm, just as we don't honor it outside
- of flexbox contexts.
--->
-<html>
-<head>
- <style>
- div.flexbox {
- display: flex;
- align-items: flex-start;
- background: lightgray;
- width: 400px;
- height: 30px;
- margin-bottom: 10px;
- }
- div.flexbox > * {
- max-width: 3px;
- outline: 1px dashed black;
- margin: 0;
- vertical-align: top;
- }
- </style>
-</head>
-<body>
- <div class="flexbox"><input type="button"></div>
- <div class="flexbox"><input type="checkbox"></div>
- <div class="flexbox"><input type="file"></div>
- <div class="flexbox"><input type="image"></div>
- <div class="flexbox"><input type="password"></div>
- <div class="flexbox"><input type="radio"></div>
- <div class="flexbox"><input type="reset"></div>
- <div class="flexbox"><input type="submit"></div>
- <div class="flexbox"><input type="text"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4-ref.html
deleted file mode 100644
index b34c4f51d51..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4-ref.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html>
-<head>
- <style>
- div.flexbox {
- background: lightgray;
- float: left;
- height: 60px;
- margin-right: 10px;
- }
- div.flexbox > * {
- outline: 1px dashed black;
- margin: 0;
- vertical-align: top;
- height: 100%;
- display: block;
- }
- br { clear: left; }
- </style>
-</head>
-<body>
- <div class="flexbox"><input type="button"></div>
- <div class="flexbox"><input type="checkbox"></div>
- <br>
- <div class="flexbox"><input type="image"></div>
- <div class="flexbox"><input type="radio"></div>
- <br>
- <div class="flexbox"><input type="reset"></div>
- <div class="flexbox"><input type="submit"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4.html
deleted file mode 100644
index bb7c5e9584f..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/flexbox-widget-flex-items-4.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html>
-<!--
- Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/
--->
-<!--
- This testcase checks that, for any widgets that have a single valid size
- (and hence refuse to flex), we don't stretch them in the cross-axis,
- despite the "align-self: stretch" property.
-
- These widgets can be allowed to be resized on some platforms but not others.
- We'll account for that by giving them height: 100% in the reference case,
- so that if they're allowed to stretch, then they'll stretch in both the
- reference case and the testcase.
--->
-<html>
-<head>
- <style>
- div.flexbox {
- display: flex;
- background: lightgray;
- float: left;
- height: 60px;
- margin-right: 10px;
- }
- div.flexbox > * {
- outline: 1px dashed black;
- margin: 0;
- vertical-align: top;
- height: auto;
- align-self: stretch;
- }
- br { clear: left; }
- </style>
-</head>
-<body>
- <div class="flexbox"><input type="button"></div>
- <div class="flexbox"><input type="checkbox"></div>
- <br>
- <div class="flexbox"><input type="image"></div>
- <div class="flexbox"><input type="radio"></div>
- <br>
- <div class="flexbox"><input type="reset"></div>
- <div class="flexbox"><input type="submit"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/reftest.list b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/reftest.list
deleted file mode 100644
index e8294df0ae2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/reftest.list
+++ /dev/null
@@ -1,141 +0,0 @@
-# NOTE: Most of our flexbox tests have moved to the w3c-css reftest directory.
-# The tests that remain in *this* directory are still here because either:
-# a) They (or one of their closely-related tests) use some moz-prefixed
-# feature, e.g. MozReftestInvalidate or -moz-max-content.
-# ...or...
-# b) They test a feature that has known bugs (e.g. bug 874713)
-#
-# Where possible & practical, we should try to address these so we can migrate
-# tests over to the w3c-css directory, so that they can become part of the
-# W3C's test suite.
-
-# Tests for flexbox pref "layout.css.flexbox.enabled"
-# (Note that it defaults to being off in release builds - see bug 841876)
-# Check that manually setting the pref on/off w/ test-pref() works correctly:
-test-pref(layout.css.flexbox.enabled,false) == flexbox-pref-1.xhtml flexbox-pref-1-disabled-ref.xhtml
-test-pref(layout.css.flexbox.enabled,true) == flexbox-pref-1.xhtml flexbox-pref-1-enabled-ref.xhtml
-
-# Enable pref for remaining tests
-# (Most tests only need it in the testcase, but a few use it in the
-# reference case, so we'll just enable it using "pref()" to make
-# it available for both.)
-default-preferences pref(layout.css.flexbox.enabled,true)
-
-# Tests for cross-axis alignment (align-self / align-items properties)
-fails == flexbox-align-self-baseline-horiz-2.xhtml flexbox-align-self-baseline-horiz-2-ref.xhtml # bug 793456, and possibly others
-# This one fails on windows R (but not Ru, strangely). On Windows R, the
-# single-line <label> flex item has a different background size in test vs. ref
-fuzzy-if(B2G,10,3) random-if(winWidget) == flexbox-align-self-baseline-horiz-3.xhtml flexbox-align-self-baseline-horiz-3-ref.xhtml # XXXdholbert investigate
-== flexbox-align-self-baseline-horiz-4.xhtml flexbox-align-self-baseline-horiz-4-ref.xhtml
-
-# Tests for basic handling of <canvas>/<img>/etc as a flex item
-# NOTE: The "-1" versions of these tests have moved to the w3c-css directory;
-# the -2 variants remain behind, because they explicitly intend to test
-# how e.g. "min-width: -moz-min-content" affects the rendering, and we don't
-# want to upload tests with prefixed keywords to the W3C testsuite.
-
-== flexbox-basic-canvas-horiz-2.xhtml flexbox-basic-canvas-horiz-2-ref.xhtml
-# NOTE: This test will only test something useful once we add support for
-# "min-height: -moz-min-content", bug 852367. At that point, it will probably
-# fail until bug 794660 is fixed:
-== flexbox-basic-canvas-vert-2.xhtml flexbox-basic-canvas-vert-2-ref.xhtml
-== flexbox-basic-fieldset-horiz-2.xhtml flexbox-basic-fieldset-horiz-2-ref.xhtml
-== flexbox-basic-fieldset-vert-2.xhtml flexbox-basic-fieldset-vert-2-ref.xhtml
-== flexbox-basic-iframe-horiz-2.xhtml flexbox-basic-iframe-horiz-2-ref.xhtml
-== flexbox-basic-iframe-vert-2.xhtml flexbox-basic-iframe-vert-2-ref.xhtml
-== flexbox-basic-img-horiz-2.xhtml flexbox-basic-img-horiz-2-ref.xhtml
-# NOTE: This test will only test something useful once we add support for
-# "min-height: -moz-min-content", bug 852367. At that point, it will probably
-# fail until bug 794660 is fixed:
-== flexbox-basic-img-vert-2.xhtml flexbox-basic-img-vert-2-ref.xhtml
-== flexbox-basic-textarea-horiz-2.xhtml flexbox-basic-textarea-horiz-2-ref.xhtml
-== flexbox-basic-textarea-vert-2.xhtml flexbox-basic-textarea-vert-2-ref.xhtml
-== flexbox-basic-video-horiz-2.xhtml flexbox-basic-video-horiz-2-ref.xhtml
-# NOTE: This test will only test something useful once we add support for
-# "min-height: -moz-min-content", bug 852367. At that point, it will probably
-# fail until bug 794660 is fixed:
-== flexbox-basic-video-vert-2.xhtml flexbox-basic-video-vert-2-ref.xhtml
-
-# Tests for dynamic modifications of content inside/around a flex container
-== flexbox-dyn-changeFrameWidth-1.xhtml flexbox-dyn-changeFrameWidth-1-ref.xhtml
-== flexbox-dyn-changeFrameWidth-2.xhtml flexbox-dyn-changeFrameWidth-2-ref.xhtml
-== flexbox-dyn-changeFrameWidth-3.xhtml flexbox-dyn-changeFrameWidth-3-ref.xhtml
-== flexbox-dyn-changeFrameWidth-4.xhtml flexbox-dyn-changeFrameWidth-4-ref.xhtml
-== flexbox-dyn-changePadding-1a.xhtml flexbox-dyn-changePadding-1-ref.xhtml
-== flexbox-dyn-changePadding-1b.xhtml flexbox-dyn-changePadding-1-ref.xhtml
-
-# Tests for dynamic insertions of content into a flex container
-# (with existing [div | span | text] inside the flexbox, and new content
-# inserted adjacent to that existing content.)
-== flexbox-dyn-insertAroundDiv-1.xhtml flexbox-dyn-insertAroundDiv-1-ref.xhtml
-fuzzy-if(d2d&&layersGPUAccelerated,24,14) == flexbox-dyn-insertAroundDiv-2.xhtml flexbox-dyn-insertAroundDiv-2-ref.xhtml # bug 849692
-== flexbox-dyn-insertAroundDiv-3.xhtml flexbox-dyn-insertAroundDiv-3-ref.xhtml
-
-== flexbox-dyn-insertAroundSpan-1.xhtml flexbox-dyn-insertAroundDiv-1-ref.xhtml
-fuzzy-if(d2d&&layersGPUAccelerated,24,14) == flexbox-dyn-insertAroundSpan-2.xhtml flexbox-dyn-insertAroundDiv-2-ref.xhtml # bug 849692
-== flexbox-dyn-insertAroundSpan-3.xhtml flexbox-dyn-insertAroundDiv-3-ref.xhtml
-
-== flexbox-dyn-insertAroundText-1.xhtml flexbox-dyn-insertAroundText-1-ref.xhtml
-== flexbox-dyn-insertAroundText-2.xhtml flexbox-dyn-insertAroundText-2-ref.xhtml
-== flexbox-dyn-insertAroundText-3.xhtml flexbox-dyn-insertAroundText-3-ref.xhtml
-
-# Variant of one of the above tests, to regression-test an invalidation issue
-== flexbox-dyn-insertEmptySpan-1.xhtml flexbox-dyn-insertEmptySpan-1-ref.xhtml
-
-# Tests for empty flexboxes (with no flex items)
-== flexbox-empty-1a.xhtml flexbox-empty-1-ref.xhtml
-== flexbox-empty-1b.xhtml flexbox-empty-1-ref.xhtml
-
-# Tests for handling of floated elements inside a flexbox
-== flexbox-float-1a.xhtml flexbox-float-1-ref.xhtml
-== flexbox-float-1b.xhtml flexbox-float-1-ref.xhtml
-== flexbox-float-1c.xhtml flexbox-float-1-ref.xhtml
-== flexbox-float-1d.xhtml flexbox-float-1-ref.xhtml
-== flexbox-float-2a.xhtml flexbox-float-2-ref.xhtml
-== flexbox-float-2b.xhtml flexbox-float-2-ref.xhtml
-
-# Tests for "min-width" and "min-height" on flex items.
-== flexbox-minSize-horiz-1.xhtml flexbox-minSize-horiz-1-ref.xhtml
-fails == flexbox-minSize-vert-1.xhtml flexbox-minSize-vert-1-ref.xhtml # bug 852367
-
-# Tests for the order in which we paint flex items
-fails == flexbox-paint-ordering-3.html flexbox-paint-ordering-3-ref.html # bug 874718
-
-# Tests for handling of absolutely/fixed/relatively-positioned flex items.
-== flexbox-position-absolute-1.xhtml flexbox-position-absolute-1-ref.xhtml
-== flexbox-position-absolute-2.xhtml flexbox-position-absolute-2-ref.xhtml
-== flexbox-position-absolute-3.xhtml flexbox-position-absolute-3-ref.xhtml
-== flexbox-position-absolute-4.xhtml flexbox-position-absolute-4-ref.xhtml
-== flexbox-position-fixed-3.xhtml flexbox-position-fixed-3-ref.xhtml
-== flexbox-position-fixed-1.xhtml flexbox-position-fixed-1-ref.xhtml
-== flexbox-position-fixed-2.xhtml flexbox-position-fixed-2-ref.xhtml
-== flexbox-position-fixed-3.xhtml flexbox-position-fixed-3-ref.xhtml
-== flexbox-position-fixed-4.xhtml flexbox-position-fixed-4-ref.xhtml
-
-# Tests for inline content in a flexbox that gets wrapped in an anonymous block
-fails == flexbox-inlinecontent-horiz-1a.xhtml flexbox-inlinecontent-horiz-1-ref.xhtml # reference case rendering is incorrect; bug 858333
-fails == flexbox-inlinecontent-horiz-1b.xhtml flexbox-inlinecontent-horiz-1-ref.xhtml # reference case rendering is incorrect; bug 858333
-== flexbox-inlinecontent-horiz-2.xhtml flexbox-inlinecontent-horiz-2-ref.xhtml
-== flexbox-inlinecontent-horiz-3a.xhtml flexbox-inlinecontent-horiz-3-ref.xhtml
-== flexbox-inlinecontent-horiz-3b.xhtml flexbox-inlinecontent-horiz-3-ref.xhtml
-== flexbox-inlinecontent-horiz-3c.xhtml flexbox-inlinecontent-horiz-3-ref.xhtml
-== flexbox-inlinecontent-horiz-4.xhtml flexbox-inlinecontent-horiz-4-ref.xhtml
-== flexbox-inlinecontent-horiz-5.xhtml flexbox-inlinecontent-horiz-5-ref.xhtml
-
-# Tests for intrinsic sizing of flexboxes
-== flexbox-intrinsic-sizing-horiz-1a.xhtml flexbox-intrinsic-sizing-horiz-1-ref.xhtml
-== flexbox-intrinsic-sizing-horiz-1b.xhtml flexbox-intrinsic-sizing-horiz-1-ref.xhtml
-== flexbox-intrinsic-sizing-horiz-2a.xhtml flexbox-intrinsic-sizing-horiz-2-ref.xhtml
-== flexbox-intrinsic-sizing-horiz-2b.xhtml flexbox-intrinsic-sizing-horiz-2-ref.xhtml
-
-# Tests for invalidation after dynamic modifications
-== flexbox-invalidation-1.html flexbox-invalidation-1-ref.html
-
-# Tests for flexbox in an iframe that gets resized.
-skip-if(B2G) == flexbox-resizeviewport-1.xhtml flexbox-resizeviewport-1-ref.xhtml
-
-# Tests with widgets as flex items
-fuzzy-if(gtk2Widget,1,66) == flexbox-widget-flex-items-1.html flexbox-widget-flex-items-1-ref.html
-fuzzy-if(gtk2Widget,1,74) == flexbox-widget-flex-items-2.html flexbox-widget-flex-items-2-ref.html
-fuzzy-if(gtk2Widget,1,58) == flexbox-widget-flex-items-3.html flexbox-widget-flex-items-3-ref.html
-fuzzy-if(gtk2Widget,1,31) == flexbox-widget-flex-items-4.html flexbox-widget-flex-items-4-ref.html
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/solidblue.png b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/solidblue.png
deleted file mode 100644
index a64b6a4255c..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/mozilla/solidblue.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/CSSOM/samples/CSSStyleDeclaration-setProperty.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/CSSOM/samples/CSSStyleDeclaration-setProperty.html
deleted file mode 100644
index 69cf086b1c0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/CSSOM/samples/CSSStyleDeclaration-setProperty.html
+++ /dev/null
@@ -1,173 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSSOM Test: CSSStyleDeclaration#setProperty</title>
- <link rel="author" title="Simon Pieters" href="mailto:simonp@opera.com">
- <link rel="help" href="https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-setproperty">
- <meta name="flags" content="dom">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <div id="log"></div>
- <script>
- function newElm() {
- return document.body.appendChild(document.createElement('div'));
- }
-
- test(function(){
- // step 1
- assert_throws('NoModificationAllowedError', function() {
- getComputedStyle(newElm()).setProperty('color', 'blue');
- });
- }, 'readonly flag set');
-
- test(function(){
- // step 2
- var elm = newElm();
- elm.style.setProperty('--unknown-color', 'blue');
- assert_equals(elm.style.getPropertyValue('--unknown-color'), '');
- }, 'unsupported property');
-
- test(function(){
- // step 3
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted');
- assert_equals(elm.style.length, 1);
- var rv = elm.style.setProperty('border-top-style', '');
- assert_equals(elm.style.length, 0);
- assert_equals(rv, undefined);
- }, 'empty value');
-
- test(function(){
- // step 4
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', 'important');
- assert_equals(elm.style.getPropertyPriority('border-top-style'), 'important');
- }, 'priority lowercase');
-
- test(function(){
- // step 4
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', 'IMPORTANT');
- assert_equals(elm.style.getPropertyPriority('border-top-style'), 'important');
- }, 'priority uppercase');
-
- test(function(){
- // step 4
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', '\u0131mportant');
- assert_equals(elm.style.length, 0);
- }, 'priority lowercase dotless i');
-
- test(function(){
- // step 4
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', '\u0130mportant');
- assert_equals(elm.style.length, 0);
- }, 'priority uppercase dotted i');
-
- test(function(){
- // step 4
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', '');
- assert_equals(elm.style.getPropertyPriority('border-top-style'), '');
- }, 'priority empty string');
-
- test(function(){
- // step 4
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', null);
- assert_equals(elm.style.getPropertyPriority('border-top-style'), '');
- }, 'priority null');
-
- test(function(){
- // step 4
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', undefined); // stringifies to "undefined" per http://dev.w3.org/2006/webapi/WebIDL/#es-DOMString
- assert_equals(elm.style.length, 0);
- }, 'priority undefined');
-
- test(function(){
- // step 4
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', ' important');
- assert_equals(elm.style.length, 0);
- }, 'priority leading space');
-
- test(function(){
- // step 4
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', 'important ');
- assert_equals(elm.style.length, 0);
- }, 'priority trailing space');
-
- test(function(){
- // step 4
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', 'important\u0000');
- assert_equals(elm.style.length, 0);
- }, 'priority trailing U+0000');
-
- test(function(){
- // step 5
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted !important');
- assert_equals(elm.style.length, 0);
- }, 'invalid value (has !important)');
-
- test(function(){
- // step 5
- var elm = newElm();
- elm.style.setProperty('border-top-style', '10px');
- assert_equals(elm.style.length, 0);
- }, 'invalid value (length instead of keyword)');
-
- test(function(){
- // step 5
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted}');
- assert_equals(elm.style.length, 0);
- }, 'invalid value (trailing })');
-
- test(function(){
- // step 5
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted ');
- assert_equals(elm.style.getPropertyValue('border-top-style'), 'dotted');
- }, 'trailing space in value');
-
- test(function(){
- // step 5
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted;');
- assert_equals(elm.style.length, 0);
- }, 'trailing ; in value');
-
- test(function(){
- // step 6
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'dotted', 'important');
- assert_equals(elm.style.getPropertyValue('border-top-style'), 'dotted');
- assert_equals(elm.style.getPropertyPriority('border-top-style'), 'important');
- elm.style.setProperty('border-top-style', 'dotted', '');
- assert_equals(elm.style.getPropertyValue('border-top-style'), 'dotted');
- assert_equals(elm.style.getPropertyPriority('border-top-style'), '');
- }, 'unsetting priority');
-
- test(function(){
- // step 6
- var elm = newElm();
- elm.style.setProperty('BORDER-TOP-STYLE', 'dotted');
- assert_equals(elm.style.getPropertyValue('border-top-style'), 'dotted');
- }, 'uppercase property');
-
- test(function(){
- // step 6
- var elm = newElm();
- elm.style.setProperty('border-top-style', 'DOTTED');
- assert_equals(elm.style.getPropertyValue('border-top-style'), 'dotted');
- }, 'uppercase value');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001-ref.html
deleted file mode 100644
index f08757bf526..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001-ref.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Text Test: The White Space Processing Rules (property:normal)</title>
- <link rel="author" title="Ryoya Kawai" href="mailto:ryoya.kawai@gmail.com">
- <link rel="help" href="https://drafts.csswg.org/css-text/#white-space-rules">
- <meta name="flags" content="CSS Full-Width Orientation Test">
- <style type="text/css">
- .white-space_normal {
- font: 16px/1em CSS Full-Width Orientation Test;
- }
- </style>
- </head>
- <body>
- <p>Test passed if 3 boxes are displayed in one line.</p>
- <p class="white-space_normal">XXX</p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001.html
deleted file mode 100644
index 3605fa1a7e3..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-001.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Text Test: The White Space Processing Rules (property:normal)</title>
- <link rel="author" title="Ryoya Kawai" href="mailto:ryoya.kawai@gmail.com">
- <link rel="help" href="https://drafts.csswg.org/css-text/#white-space-rules">
- <link rel="match" href="white-space-processing-001-ref.html">
- <meta name="flags" content="CSS Full-Width Orientation Test">
- <meta name="assert" content="All spaces immediately preceding or following a segment break are removed in property of white-space is normal.">
- <style type="text/css">
- .white-space_normal {
- font: 16px/1em CSS Full-Width Orientation Test;
- white-space: normal
- }
- </style>
- </head>
- <body>
- <p>Test passed if 3 boxes are displayed in one line.</p>
- <p class="white-space_normal">X
- X</p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-002.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-002.html
deleted file mode 100644
index f5ea96e60ab..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-002.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Text Test: The White Space Processing Rules (property:nowrap)</title>
- <link rel="author" title="Ryoya Kawai" href="mailto:ryoya.kawai@gmail.com">
- <link rel="help" href="https://drafts.csswg.org/css-text/#white-space">
- <link rel="match" href="white-space-processing-ref-001.html">
- <meta name="flags" content="CSS Full-Width Orientation Test">
- <meta name="assert" content="All spaces immediately preceding or following a segment break are removed in property of white-space is nowrap.">
- <style type="text/css">
- .white-space_nowrap {
- font: 16px/1em CSS Full-Width Orientation Test;
- white-space: nowrap
- }
- </style>
- </head>
- <body>
- <p>Test passed if 3 boxes are displayed in one line.</p>
- <p class="white-space_nowrap">X
- X</p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003-ref.html
deleted file mode 100644
index 3204a70c763..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003-ref.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Text Test: The White Space Processing Rules (property:normal)</title>
- <link rel="author" title="Ryoya Kawai" href="mailto:ryoya.kawai@gmail.com">
- <link rel="help" href="https://drafts.csswg.org/css-text/#white-space-rules">
- <meta name="flags" content="CSS Full-Width Orientation Test">
- <style type="text/css">
- .white-space_normal {
- font: 16px/1em CSS Full-Width Orientation Test;
- }
- </style>
- </head>
- <body>
- <p>Test passed if 2 lines displays, and 1st line has 1 box, 2nd line has 1 box.</p>
- <p class="white-space_normal">X <br>X</p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003.html
deleted file mode 100644
index 5aeb66b5d69..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-003.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Text Test: The White Space Processing Rules (property:pre-line)</title>
- <link rel="author" title="Ryoya Kawai" href="mailto:ryoya.kawai@gmail.com">
- <link rel="help" href="https://drafts.csswg.org/css-text/#white-space-rules">
- <link rel="match" href="white-space-processing-003-ref.html">
- <meta name="flags" content="CSS Full-Width Orientation Test">
- <meta name="assert" content="All spaces immediately preceding or following a segment break are removed in property of white-space is pre-line.">
- <style type="text/css">
- .white-space_pre-line {
- font: 16px/1em CSS Full-Width Orientation Test;
- white-space: pre-line
- }
- </style>
- </head>
- <body>
- <p>Test passed if 2 lines displays, and 1st line has 1 box, 2nd line has 1 box.</p>
- <p class="white-space_pre-line">X
- X</p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-004.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-004.html
deleted file mode 100644
index 3cc0eb12a98..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-004.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Text Test: The White Space Processing Rules (property:pre-wrap)</title>
- <link rel="author" title="Ryoya Kawai" href="mailto:ryoya.kawai@gmail.com">
- <link rel="help" href="https://drafts.csswg.org/css-text/#white-space-rules">
- <link rel="match" href="white-space-processing-004-ref.html">
- <meta name="flags" content="CSS Full-Width Orientation Test">
- <meta name="assert" content="All spaces immediately preceding or following a segment break are removed in property of white-space is pre-wrap.">
- <style type="text/css">
- .white-space_pre-wrap {
- font: 16px/1em CSS Full-Width Orientation Test;
- white-space: pre-wrap
- }
- </style>
- </head>
- <body>
- <p>Test passed if 2 lines displays, and 1st line has 5 boxes, 2nd line has 1 box.</p>
- <p class="white-space_pre-wrap">X
- X</p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-005.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-005.html
deleted file mode 100644
index c3e5b2c80f7..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/starters/css-text/white-space-processing-005.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>CSS Text Test: The White Space Processing Rules (property:pre)</title>
- <link rel="author" title="Ryoya Kawai" href="mailto:ryoya.kawai@gmail.com">
- <link rel="help" href="https://drafts.csswg.org/css-text/#white-space-rules">
- <link rel="match" href="white-space-processing-004-ref.html">
- <meta name="flags" content="CSS Full-Width Orientation Test">
- <meta name="assert" content="All spaces immediately preceding or following a segment break are removed in property of white-space is pre.">
- <style type="text/css">
- .white-space_pre {
- font: 16px/1em CSS Full-Width Orientation Test;
- white-space: pre
- }
- </style>
- </head>
- <body>
- <p>Test passed if 2 lines displays, and 1st line has 5 box, 2nd line has 2 box.</p>
- <p class="white-space_pre">X
- X</p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/t32k/css-fonts-font-face-rule.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/t32k/css-fonts-font-face-rule.html
deleted file mode 100644
index ca9ebc4fc53..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/t32k/css-fonts-font-face-rule.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSS Fonts Test: @font-face rule</title>
- <link rel="author" title="Koji Ishimoto" href="mailto:ijok.ijok@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/css3-fonts/#font-resources">
- <link rel="match" href="">
- <meta name="flags" content="">
- <meta name="assert" content="Test passes if this is Serif text.">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <style>
- @font-face {
- font-family: csstestfont;
- src: url('../../../approved/fonts/CSSTest/csstest-ascii.ttf') format("truetype");
- }
- body {
- font-family: sans-serif;
- }
- #test {
- font-family: csstestfont;
- font-size: 200%;
- }
- </style>
-</head>
-<body>
- <p id="test">Test passes if this is Serif text.</p>
- <div id="log"></div>
-
- <script>
- test(function() {
- var fontFaceProp = document.styleSheets[1].cssRules[0].style;
- var fontFamily = fontFaceProp.fontFamily;
- var fontSrc = fontFaceProp.src;
-
- test(function() {
- assert_equals(fontFamily, 'csstestfont');
- }, "`font-family` value is correct.");
- test(function() {
- assert_not_equals(fontSrc, '');
- }, "`src` value is correct.");
- });
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-18n-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-18n-ref.html
deleted file mode 100644
index c4b70b334c0..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-18n-ref.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <meta charset=utf-8>
- <title>CSS Test: localized font-family name</title>
- <link rel="author" title="Takuya Oikawa" href="mailto:takoratta@gmail.com"/>
- <link rel="help" href="https://drafts.csswg.org/css-fonts/" />
- <link rel="help" href="https://drafts.csswg.org/css-fonts/#font-family-prop"/>
- <!-- (from the spec) Some font formats allow fonts to carry multiple localizations of the family name. User agents must recognize and correctly match all of these names independent of the underlying platform localization, system API used or document encoding: -->
- <meta name="assert" content="Font which family name is in Japanese should work." />
- <style type="text/css">
- p { color: navy; font-size: 4em; margin: 0.25em; }
- .a span.test { font-family: "IPAexゴシック", IPAexGothic; }
- .a span.control { font-family: IPAexGothic, "IPAexゴシック"; }
- .a span.diff { font-family: sans-serif;}
- .b span.test { font-family: "IPAex明朝", IPAexMincho; }
- .b span.control { font-family: IPAexMincho, "IPAex明朝"; }
- .b span.diff { font-family: serif;}
- </style>
- </head>
- <body>
- <div>In each of the three lines below, first two words should look identical but not the third one. Before starting, download <a href="http://ipafont.ipa.go.jp/ipaexfont/download.html#en">font</a> first. Note that this font is licensed under <a href="http://ipafont.ipa.go.jp/ipaexfont/download.html#en">IPA font license</a> which conforms with <a href="http://opensource.org/">OSI</a>.</div>
- <p class="a">
- <span class="test">テスト</span>
- &mdash;
- <span class="control">テスト</span>
- &mdash;
- <span class="diff">テスト</span>
- </p>
- <p class="b">
- <span class="test">テスト</span>
- &mdash;
- <span class="control">テスト</span>
- &mdash;
- <span class="diff">テスト</span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-18n.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-18n.html
deleted file mode 100644
index 9aedabb8bf8..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-18n.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <meta charset=utf-8>
- <title>CSS Test: localized font-family name</title>
- <link rel="author" title="Takuya Oikawa" href="mailto:takoratta@gmail.com"/>
- <link rel="help" href="https://drafts.csswg.org/css-fonts/" />
- <link rel="help" href="https://drafts.csswg.org/css-fonts/#font-family-prop"/>
- <link rel="match" href="font-family-i18n-ref.html" />
- <!-- (from the spec) Some font formats allow fonts to carry multiple localizations of the family name. User agents must recognize and correctly match all of these names independent of the underlying platform localization, system API used or document encoding: -->
- <meta name="assert" content="Font which family name is in Japanese should work." />
- <style type="text/css">
- p { color: navy; font-size: 4em; margin: 0.25em; }
- .a span.test { font-family: "IPAexゴシック"; }
- .a span.control { font-family: IPAexGothic; }
- .a span.diff { font-family: sans-serif;}
- .b span.test { font-family: "IPAex明朝"; }
- .b span.control { font-family: IPAexMincho; }
- .b span.diff { font-family: serif;}
- </style>
- </head>
- <body>
- <div>In each of the three lines below, first two words should look identical but not the third one. Before starting, download <a href="http://ipafont.ipa.go.jp/ipaexfont/download.html#en">font</a> first. Note that this font is licensed under <a href="http://ipafont.ipa.go.jp/ipaexfont/download.html#en">IPA font license</a> which conforms with <a href="http://opensource.org/">OSI</a>.</div>
- <p class="a">
- <span class="test">テスト</span>
- &mdash;
- <span class="control">テスト</span>
- &mdash;
- <span class="diff">テスト</span>
- </p>
- <p class="b">
- <span class="test">テスト</span>
- &mdash;
- <span class="control">テスト</span>
- &mdash;
- <span class="diff">テスト</span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n-ref.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n-ref.html
deleted file mode 100644
index 4d6183f4870..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n-ref.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <meta charset=utf-8>
- <title>CSS Test: localized font-family name and fallbacks</title>
- <link rel="author" title="Takuya Oikawa" href="mailto:takoratta@gmail.com"/>
- <link rel="help" href="https://drafts.csswg.org/css-fonts/" />
- <link rel="help" href="https://drafts.csswg.org/css-fonts/#font-family-prop"/>
- <!-- (from the spec) Some font formats allow fonts to carry multiple localizations of the family name. User agents must recognize and correctly match all of these names independent of the underlying platform localization, system API used or document encoding: -->
- <style type="text/css">
- p { color: navy; font-size: 4em; margin: 0.25em; }
- .a span.test { font-family: "無いフォント", "Times New Roman"; }
- .a span.control { font-family: "Times New Roman"; }
- .b span.test { font-family: "無いフォント", "Arial"; }
- .b span.control { font-family: "Arial"; }
- .c span.test { font-family: "無いフォント", "Courier New"; }
- .c span.control { font-family: "Courier New"; }
- </style>
- </head>
- <body>
- <div>In each of the three lines below, the two words should look identical.</div>
- <p class="a">
- <span class="test">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- &mdash;
- <span class="control">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- </p>
- <p class="b">
- <span class="test">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- &mdash;
- <span class="control">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- </p>
- <p class="c">
- <span class="test">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- &mdash;
- <span class="control">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n.html b/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n.html
deleted file mode 100644
index c59d12a5fa2..00000000000
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_tokyo/takuya/font-family-fallback18n.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <meta charset=utf-8>
- <title>CSS Test: localized font-family name and fallbacks</title>
- <link rel="author" title="Takuya Oikawa" href="mailto:takoratta@gmail.com"/>
- <link rel="help" href="https://drafts.csswg.org/css-fonts/" />
- <link rel="help" href="https://drafts.csswg.org/css-fonts/#font-family-prop"/>
- <link rel="match" href="font-family-fallbacki18n-ref.html" />
- <!--(from the spec) Some font formats allow fonts to carry multiple localizations of the family name. User agents must recognize and correctly match all of these names independent of the underlying platform localization, system API used or document encoding: -->
- <meta name="assert" content="Font which family name is in Japanese doesn't exist. Fallback font specified next should be used." />
- <style type="text/css">
- p { color: navy; font-size: 4em; margin: 0.25em; }
- .a span.test { font-family: "無いフォント", "Times New Roman"; }
- .a span.control { font-family: "Times New Roman"; }
- .b span.test { font-family: "無いフォント", "Arial"; }
- .b span.control { font-family: "Arial"; }
- .c span.test { font-family: "無いフォント", "Courier New"; }
- .c span.control { font-family: "Courier New"; }
- </style>
- </head>
- <body>
- <div>In each of the three lines below, the two words should look identical.</div>
- <p class="a">
- <span class="test">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- &mdash;
- <span class="control">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- </p>
- <p class="b">
- <span class="test">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- &mdash;
- <span class="control">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- </p>
- <p class="c">
- <span class="test">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- &mdash;
- <span class="control">&#x0162;&#x0119;&#x015F;&#x0163;</span>
- </p>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/cssom-view/DOMRectList.html b/tests/wpt/web-platform-tests/cssom-view/DOMRectList.html
new file mode 100644
index 00000000000..dafced99478
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/DOMRectList.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>CSSOM View APIs that return a DOMRectList</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=x>x</div>
+<script>
+setup(() => {
+ window.element = document.getElementById('x');
+});
+
+test(() => {
+ const domRectList = element.getClientRects();
+ assert_class_string(domRectList, 'DOMRectList');
+ assert_class_string(domRectList.item(0), 'DOMRect');
+}, 'Element getClientRects()');
+
+test(() => {
+ const range = new Range();
+ range.selectNodeContents(element);
+ const domRectList = range.getClientRects();
+ assert_class_string(domRectList, 'DOMRectList');
+ assert_class_string(domRectList.item(0), 'DOMRect');
+}, 'Range getClientRects()');
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/HTMLBody-ScrollArea_quirksmode.html b/tests/wpt/web-platform-tests/cssom-view/HTMLBody-ScrollArea_quirksmode.html
index 46fd5010e76..8255d130345 100644
--- a/tests/wpt/web-platform-tests/cssom-view/HTMLBody-ScrollArea_quirksmode.html
+++ b/tests/wpt/web-platform-tests/cssom-view/HTMLBody-ScrollArea_quirksmode.html
@@ -44,6 +44,8 @@ test(function() {
assert_equals(document.body.style.overflowY, "scroll", "Could not set document.body.style.overflowY to 'scroll'.");
document.documentElement.style.overflowY = "scroll";
assert_equals(document.documentElement.style.overflowY, "scroll", "Could not set document.documentElement.style.overflow to 'scroll'.");
+ document.documentElement.style.overflowY = "";
+ document.body.style.overflowY = "";
}, "Ensure that style.overflowY can be set properly.")
test(function() {
diff --git a/tests/wpt/web-platform-tests/cssom-view/OWNERS b/tests/wpt/web-platform-tests/cssom-view/OWNERS
index 678152d6503..5e0cb233944 100644
--- a/tests/wpt/web-platform-tests/cssom-view/OWNERS
+++ b/tests/wpt/web-platform-tests/cssom-view/OWNERS
@@ -1,3 +1,2 @@
@AutomatedTester
@plinss
-@zcorpan
diff --git a/tests/wpt/web-platform-tests/cssom-view/cssom-getClientRects-002.html b/tests/wpt/web-platform-tests/cssom-view/cssom-getClientRects-002.html
new file mode 100644
index 00000000000..9fd791d5db7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/cssom-getClientRects-002.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>CSSOM View - GetClientRects().length is the same regardless source new lines</title>
+ <link rel="help" href="https://drafts.csswg.org/cssom-view-1/#dom-element-getclientrects">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <span id="single">
+ test test
+ </span><br/>
+ <span id="multiple">
+ test
+ test
+ </span>
+ <script>
+ test(function () {
+ const count = document.querySelector("#single").getClientRects().length;
+ const count2 = document.querySelector("#multiple").getClientRects().length;
+ assert_equals(count, 1, "count");
+ assert_equals(count2, 1, "count2");
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementFromPoint-002.html b/tests/wpt/web-platform-tests/cssom-view/elementFromPoint-002.html
new file mode 100644
index 00000000000..ebab52feada
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/elementFromPoint-002.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Checking whether dynamic changes to visibility interact correctly with
+ table anonymous boxes</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<style>
+#overlay {
+ display: table;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: white;
+ z-index: 999
+}
+
+#wrapper { position: relative; }
+</style>
+<div id=log></div>
+<div id="wrapper">
+ <div id="overlay"><div></div></div>
+ <div id="target">Some text</div>
+</div>
+<script>
+ test(function() {
+ var t = document.querySelector("#target");
+ var rect = t.getBoundingClientRect();
+ var hit = document.elementFromPoint(rect.x + rect.width/2,
+ rect.y + rect.height/2);
+ assert_equals(hit, t.previousElementSibling,
+ "Should hit the overlay first.");
+ t.previousElementSibling.style.visibility = "hidden";
+ hit = document.elementFromPoint(rect.x + rect.width/2,
+ rect.y + rect.height/2);
+ assert_equals(hit, t,
+ "Should hit our target now that the overlay is hidden.");
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementFromPoint-003.html b/tests/wpt/web-platform-tests/cssom-view/elementFromPoint-003.html
new file mode 100644
index 00000000000..0a1ac40e722
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/elementFromPoint-003.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Checking whether dynamic changes to visibility interact correctly with
+ table anonymous boxes</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<style>
+#overlay {
+ display: table;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: white;
+ z-index: 999
+}
+
+#wrapper { position: relative; }
+</style>
+<div id=log></div>
+<div id="wrapper">
+ <div id="overlay"><div></div></div>
+ <div id="target">Some text</div>
+</div>
+<script>
+ test(function() {
+ // Make sure we have boxes constructed already.
+ document.body.offsetWidth;
+ var overlay = document.querySelector("#overlay");
+ overlay.insertBefore(document.createElement("div"), overlay.firstChild);
+ overlay.appendChild(document.createElement("div"));
+ // Make sure we have boxes constructed for those inserts/appends
+ document.body.offsetWidth;
+ overlay.firstChild.nextSibling.remove();
+ var t = document.querySelector("#target");
+ var rect = t.getBoundingClientRect();
+ var hit = document.elementFromPoint(rect.x + rect.width/2,
+ rect.y + rect.height/2);
+ assert_equals(hit, t.previousElementSibling,
+ "Should hit the overlay first.");
+ t.previousElementSibling.style.visibility = "hidden";
+ hit = document.elementFromPoint(rect.x + rect.width/2,
+ rect.y + rect.height/2);
+ assert_equals(hit, t,
+ "Should hit our target now that the overlay is hidden.");
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementFromPoint.html b/tests/wpt/web-platform-tests/cssom-view/elementFromPoint.html
index 55a14072b60..466fb5cb0a0 100644
--- a/tests/wpt/web-platform-tests/cssom-view/elementFromPoint.html
+++ b/tests/wpt/web-platform-tests/cssom-view/elementFromPoint.html
@@ -4,12 +4,12 @@
<script src="/resources/testharnessreport.js"></script>
<style>
.size {
- width:100px;
- height:100px;
+ width:60px;
+ height:60px;
}
.overlay {
position:absolute;
- top:109px;
+ top:69px;
pointer-events:none;
}
.purple {
@@ -32,26 +32,27 @@
<iframe id=iframe-1 src="iframe.html" style='display:none;position:absolute; left:300px;'></iframe>
<iframe id=iframe-2 src="iframe.html" width="" height=""></iframe>
<iframe id=iframe-3 width="" height=""></iframe>
- <svg id=squiggle xmlns="http://www.w3.org/2000/svg" height="98" width="581" viewBox="0 0 581 98">
+ <svg id=squiggle xmlns="http://www.w3.org/2000/svg" height="98" width="500" viewBox="0 0 581 98">
<path stroke-dashoffset="0.00" stroke-dasharray="" d="M62.9 14.9c-25-7.74-56.6 4.8-60.4 24.3-3.73 19.6 21.6 35 39.6 37.6 42.8 6.2 72.9-53.4 116-58.9 65-18.2 191 101 215 28.8 5-16.7-7-49.1-34-44-34 11.5-31 46.5-14 69.3 9.38 12.6 24.2 20.6 39.8 22.9 91.4 9.05 102-98.9 176-86.7 18.8 3.81 33 17.3 36.7 34.6 2.01 10.2.124 21.1-5.18 30.1" stroke="#000" stroke-width="4.3" fill="none">
</path>
</svg>
- <svg id=svg-transform width="180" height="200"
+ <svg id=svg-transform width="180" height="140"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Now we add a text element and apply rotate and translate to both -->
- <rect x="50" y="50" height="100" width="100" style="stroke:#000; fill: #0086B2" transform="translate(30) rotate(45 50 50)"></rect>
- <text x="60" y="105" transform="translate(30) rotate(45 50 50)"> Hello WPT! </text>
+ <rect x="50" y="50" height="60" width="60" style="stroke:#000; fill: #0086B2" transform="translate(30) rotate(45 50 50)"></rect>
+ <text x="60" y="105" transform="translate(30) rotate(45 50 50)"> Hello! </text>
</svg>
<div id='pink' class='size pink' style='transform: translate(10px)'>&nbsp;</div>
<div id='anotherteal' class='size teal' style='pointer-events:none'>Another teal</div>
- <img id="dinos" src="/images/blue-area.png" usemap="#dinos_map" border="0" width="364" height="126"/>
+ <img id="dinos" src="/images/blue-area.png" usemap="#dinos_map" border="0" width="364" height="40"/>
<map id="dinos_map" name="dinos_map">
- <area id="rectG" shape="rect" coords="0,0,90,100" href="#" alt="area 1"/>
- <area id="circleO" shape="circle" coords="120,60,30" href="#" alt="area 2"/>
- <area id="polyLE" shape="poly" coords="280,0,310,0,360,30,360,90,280,90" href="#" alt="area 3"/>
+ <area id="rectG" shape="rect" coords="0,0,90,100" href="#" alt="area 1"/>
+ <area id="circleO" shape="circle" coords="120,60,30" href="#" alt="area 2"/>
+ <area id="polyLE" shape="poly" coords="280,0,310,0,360,30,360,90,280,90" href="#" alt="area 3"/>
+ </map>
<!-- Test for fieldsets not doing weird things. Use a 200x200 div to hold
all the bits for this test. Also, place it top/right, so it is not below
the bottom edge of the viewport. -->
@@ -109,7 +110,7 @@
}, "Return first element that is the target for hit testing");
test(function () {
- assert_equals(document.elementFromPoint(10, 120), document.getElementById('yellow'),
+ assert_equals(document.elementFromPoint(10, 80), document.getElementById('yellow'),
"Should have returned the element with id `yellow` as element with `teal` has `pointer-events:none`");
}, "First element to get mouse events with pointer-events css");
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementFromPosition.html b/tests/wpt/web-platform-tests/cssom-view/elementFromPosition.html
index b781bb3713e..d4da36ff1f7 100644
--- a/tests/wpt/web-platform-tests/cssom-view/elementFromPosition.html
+++ b/tests/wpt/web-platform-tests/cssom-view/elementFromPosition.html
@@ -85,7 +85,7 @@
// 元素范围内
{x: 50, y: 50, r: 'inside'},
// 右边线
- {x: 110, y: 10, r: 'right line'},
+ {x: 110, y: 50, r: 'right line'},
// 左下角
{x: 10, y: 110, r: 'bottom left corner'},
// 下边线
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementScroll.html b/tests/wpt/web-platform-tests/cssom-view/elementScroll.html
index e54bca44be0..a5df48109eb 100644
--- a/tests/wpt/web-platform-tests/cssom-view/elementScroll.html
+++ b/tests/wpt/web-platform-tests/cssom-view/elementScroll.html
@@ -25,14 +25,12 @@
<section id="section">
<div id="scrollable"></div>
- <div id="unrelated"></div>
</section>
<script>
setup({explicit_done:true});
window.onload = function () {
var section = document.getElementById("section");
- var unrelated = document.getElementById("unrelated");
test(function () {
assert_equals(section.scrollTop, 0, "initial scrollTop should be 0");
@@ -43,9 +41,6 @@
assert_equals(section.scrollTop, 30, "changed scrollTop should be 40");
assert_equals(section.scrollLeft, 40, "changed scrollLeft should be 40");
-
- assert_equals(unrelated.scrollTop, 0, "unrelated element should not scroll");
- assert_equals(unrelated.scrollLeft, 0, "unrelated element should not scroll");
}, "Element scrollTop/Left getter/setter test");
test(function () {
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-iframes.html b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-iframes.html
new file mode 100644
index 00000000000..3bba161b47d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-iframes.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/elementsFromPoint.js"></script>
+<script>
+var loadedFrameCount = 0;
+var t1 = async_test('elementsFromPoint on the root document for points in iframe elements');
+var t2 = async_test('elementsFromPoint on inner documents');
+
+function onFrameLoaded() {
+ loadedFrameCount++;
+ if (loadedFrameCount < 2)
+ return;
+
+ var body = document.body;
+ var html = document.documentElement;
+ var iframe = document.getElementById('iframe');
+ var scrollableIframe = document.getElementById('scrollableIframe');
+ t1.step(function() {
+ checkElementsFromPointFourCorners('document', 'iframe',
+ [iframe, body, html],
+ [iframe, body, html],
+ [iframe, body, html],
+ [scrollableIframe, iframe, body, html]);
+
+ checkElementsFromPointFourCorners('document', 'scrollableIframe',
+ [scrollableIframe, iframe, body, html],
+ [scrollableIframe, iframe, body, html],
+ [scrollableIframe, iframe, body, html],
+ [scrollableIframe, iframe, body, html]);
+ });
+ t1.done();
+
+ t2.step(function() {
+ var iframeDocument = document.getElementById('iframe').contentDocument;
+ var iframeRoot = iframeDocument.documentElement;
+ var iframeBody = iframeDocument.body;
+ var iframeDiv = iframeDocument.getElementById('div');
+ checkElementsFromPointFourCorners('document.getElementById(\'iframe\').contentDocument', 'div',
+ [iframeDiv, iframeBody, iframeRoot],
+ [iframeDiv, iframeBody, iframeRoot],
+ [iframeDiv, iframeBody, iframeRoot],
+ [iframeDiv, iframeBody, iframeRoot]);
+
+ var iframeDocument2 = document.getElementById('scrollableIframe').contentDocument;
+ var iframeRoot2 = iframeDocument2.documentElement;
+ var iframeBody2 = iframeDocument2.body;
+ var iframeSmallDiv = iframeDocument2.getElementById('small');
+ var iframeBigDiv = iframeDocument2.getElementById('big');
+ checkElementsFromPointFourCorners('document.getElementById(\'scrollableIframe\').contentDocument', 'big',
+ [iframeSmallDiv, iframeBigDiv, iframeBody2, iframeRoot2],
+ [iframeBigDiv, iframeBody2, iframeRoot2],
+ [],
+ []);
+ });
+ t2.done();
+}
+</script>
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+}
+body {
+ height: 500px;
+}
+#iframe {
+ width: 200px;
+ height: 200px;
+}
+#scrollableIframe {
+ position: absolute;
+ top: 0;
+ left: 0;
+ transform: translate(50px, 50px);
+ width: 150px;
+ height: 150px;
+ overflow-y: scroll;
+ overflow-x: scroll;
+}
+</style>
+<iframe id="iframe" src="resources/iframe1.html"></iframe>
+<iframe id="scrollableIframe" src="resources/iframe2.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-invalid-cases.html b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-invalid-cases.html
new file mode 100644
index 00000000000..369cffcd31a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-invalid-cases.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/elementsFromPoint.js"></script>
+<style>
+html {
+ overflow-y: scroll;
+ overflow-x: scroll;
+}
+html, body {
+ margin: 0;
+ padding: 0;
+}
+body {
+ width: 100%;
+ height: 100%;
+}
+#simpleDiv {
+ width: 200px;
+ height: 200px;
+ background-color: rgba(0,255,0,0.5);
+}
+#beyondTopLeft {
+ position: absolute;
+ transform: translate3d(-100px, -100px, 10px);
+ left: 0;
+ top: 0;
+ width: 100px;
+ height: 100px;
+ background-color: rgba(0,0,0,0.1);
+}
+</style>
+<body>
+<div id="beyondTopLeft"></div>
+<div id="simpleDiv"></div>
+<script>
+test(function() {
+ assertElementsFromPoint('document', 300, 300, [document.documentElement]);
+}, "The root element is the last element returned for otherwise empty queries within the viewport");
+
+test(function() {
+ var simpleDiv = document.getElementById('simpleDiv');
+ var simpleRect = simpleDiv.getBoundingClientRect();
+ var simpleCoords = (simpleRect.right - 1) + ', ' + (simpleRect.bottom - 1);
+ assertElementsFromPoint('document', simpleRect.right - 1, simpleRect.bottom - 1,
+ [simpleDiv, document.body, document.documentElement]);
+}, "The root element is the last element returned for valid queries");
+
+test(function() {
+ assertElementsFromPoint('document', window.innerWidth + 1, window.innerHeight + 1, []);
+ assertElementsFromPoint('document', -1, -1, []);
+ assertElementsFromPoint('document', 1, -1, []);
+ assertElementsFromPoint('document', -1, 1, []);
+}, "An empty sequence is returned for queries outside the viewport");
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-shadowroot.html b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-shadowroot.html
new file mode 100644
index 00000000000..b3e0c6db269
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-shadowroot.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/elementsFromPoint.js"></script>
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+}
+body {
+ height: 500px;
+}
+</style>
+<body>
+<div id="host"></div>
+<div id="blockHost"></div>
+<span id="inlineBlockHost" style="display:inline-block;"></span>
+<input type="submit" id="submit">
+<script>
+function assertElementsFromPoint(doc, x, y, expected) {
+ var query = doc + '.elementsFromPoint(' + x + ',' + y + ')';
+ var sequence = eval(query);
+ assert_equals(nodeListToString(sequence), nodeListToString(expected), query);
+}
+
+function createBox(id) {
+ var div = document.createElement('div');
+ div.id = id;
+ div.style.width = '100px';
+ div.style.height = '10px';
+ return div;
+}
+
+function centerX(element) {
+ return element.offsetLeft + element.offsetWidth / 2;
+}
+
+function centerY(element) {
+ return element.offsetTop + element.offsetHeight / 2;
+}
+
+var shadowRoot = host.attachShadow({mode: 'closed'});
+var box11 = createBox('box11');
+var box12 = createBox('box12');
+var box13 = createBox('box13');
+shadowRoot.appendChild(box11);
+shadowRoot.appendChild(box12);
+shadowRoot.appendChild(box13);
+
+var nestedHost = document.createElement('div');
+var nestedShadowRoot = nestedHost.attachShadow({mode: 'closed'});
+var box21 = createBox('box21');
+var box22 = createBox('box22');
+var box23 = createBox('box23');
+nestedShadowRoot.appendChild(box21);
+nestedShadowRoot.appendChild(box22);
+nestedShadowRoot.appendChild(box23);
+
+shadowRoot.appendChild(nestedHost);
+
+var x12 = centerX(box12);
+var y12 = centerY(box12);
+var x22 = centerX(box22);
+var y22 = centerY(box22);
+
+var root3 = blockHost.attachShadow({mode: 'closed'});
+root3.appendChild(document.createTextNode('text1'));
+var root4 = inlineBlockHost.attachShadow({mode: 'closed'});
+root4.appendChild(document.createTextNode('text2'));
+
+test(function() {
+ assertElementsFromPoint('document', x22, y22, [host, document.body, document.documentElement]);
+ assertElementsFromPoint('document', centerX(blockHost), centerY(blockHost),
+ [blockHost, document.body, document.documentElement]);
+ assertElementsFromPoint('document', centerX(inlineBlockHost), centerY(inlineBlockHost),
+ [inlineBlockHost, document.body, document.documentElement]);
+ assertElementsFromPoint('document', centerX(submit), centerY(submit),
+ [submit, document.body, document.documentElement]);
+}, 'elementsFromPoint on the document root should not return elements in shadow trees');
+
+test(function() {
+ assert_not_equals(shadowRoot.elementsFromPoint(x12, y12).indexOf(box12), -1);
+ assert_not_equals(shadowRoot.elementsFromPoint(x22, y22).indexOf(nestedHost), -1);
+ assert_not_equals(nestedShadowRoot.elementsFromPoint(x22, y22).indexOf(box22), -1);
+}, 'elementsFromPoint on a shadow root should include elements in that shadow tree');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-simple.html b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-simple.html
new file mode 100644
index 00000000000..4973121d7db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-simple.html
@@ -0,0 +1,131 @@
+<!DOCTYPE HTML>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/elementsFromPoint.js"></script>
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+}
+body {
+ height: 500px;
+}
+#simpleDiv {
+ width: 200px;
+ height: 200px;
+ background-color: rgba(0,0,255,0.5);
+}
+#divWithPseudo {
+ position: absolute;
+ left: 50px;
+ top: 50px;
+ width: 100px;
+ height: 100px;
+ background-color: rgba(255,0,0,0.5);
+}
+#divWithPseudo::before {
+ position: absolute;
+ left: 20px;
+ top: 20px;
+ width: 100px;
+ height: 100px;
+ content: "::before";
+ background-color: rgba(255,0,0,0.5);
+ z-index: 9999;
+}
+#divBetweenPseudo {
+ position: absolute;
+ left: 100px;
+ top: 100px;
+ width: 100px;
+ height: 100px;
+ background-color: rgba(0,255,0,0.5);
+}
+#withMargin {
+ margin-top: -15px;
+ width: 200px;
+ height: 200px;
+ background-color: rgba(0,0,0,0.5);
+}
+#inlineSpan {
+ float: right;
+ background-color: yellow;
+ width: 100px;
+ height: 1em;
+}
+#noPointerEvents {
+ position: absolute;
+ left: 50px;
+ top: 50px;
+ width: 100px;
+ height: 300px;
+ background-color: rgba(0,0,0,0.1);
+ pointer-events: none;
+}
+#threeD {
+ position: absolute;
+ transform: translate3d(-100px, -100px, 10px);
+ left: 140px;
+ top: 140px;
+ width: 200px;
+ height: 50px;
+ background-color: rgba(255,255,255,0.5);
+}
+</style>
+<div id="simpleDiv"></div>
+<div id="divWithPseudo"></div>
+<div id="divBetweenPseudo"></div>
+<div id="withMargin"><span id="inlineSpan"></span></div>
+<div id="noPointerEvents"></div>
+<div id="threeD"></div>
+<script>
+var body = document.body;
+var html = document.documentElement;
+test(function() {
+ checkElementsFromPointFourCorners('document', 'simpleDiv',
+ [simpleDiv, body, html],
+ [simpleDiv, body, html],
+ [withMargin, simpleDiv, body, html],
+ [divBetweenPseudo, inlineSpan, withMargin, simpleDiv, body, html]);
+}, "elementsFromPoint for each corner of a simple div");
+
+test(function() {
+ checkElementsFromPointFourCorners('document', 'divWithPseudo',
+ [threeD, divWithPseudo, simpleDiv, body, html],
+ [threeD, divWithPseudo, simpleDiv, body, html],
+ [divWithPseudo, simpleDiv, body, html],
+ [divWithPseudo, divBetweenPseudo, divWithPseudo, simpleDiv, body, html]);
+}, "elementsFromPoint for each corner of a div that has a pseudo-element");
+
+test(function() {
+ checkElementsFromPointFourCorners('document', 'divBetweenPseudo',
+ [divWithPseudo, divBetweenPseudo, divWithPseudo, simpleDiv, body, html],
+ [divBetweenPseudo, simpleDiv, body, html],
+ [divBetweenPseudo, inlineSpan, withMargin, simpleDiv, body, html],
+ [divBetweenPseudo, inlineSpan, withMargin, simpleDiv, body, html]);
+}, "elementsFromPoint for each corner of a div that is between another div and its pseudo-element");
+
+test(function() {
+ checkElementsFromPointFourCorners('document', 'withMargin',
+ [withMargin, simpleDiv, body, html],
+ [divBetweenPseudo, inlineSpan, withMargin, simpleDiv, body, html],
+ [withMargin, body, html],
+ [withMargin, body, html]);
+}, "elementsFromPoint for each corner of a div that has a margin");
+
+test(function() {
+ checkElementsFromPointFourCorners('document', 'noPointerEvents',
+ [threeD, divWithPseudo, simpleDiv, body, html],
+ [threeD, divWithPseudo, simpleDiv, body, html],
+ [withMargin, body, html],
+ [withMargin, body, html]);
+}, "elementsFromPoint for each corner of a div with pointer-events:none");
+
+test(function() {
+ checkElementsFromPointFourCorners('document', 'threeD',
+ [threeD, simpleDiv, body, html],
+ [threeD, body, html],
+ [threeD, simpleDiv, body, html],
+ [threeD, body, html]);
+}, "elementsFromPoint for each corner of a div with a 3d transform");
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-svg.html b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-svg.html
new file mode 100644
index 00000000000..8535228abab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-svg.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/elementsFromPoint.js"></script>
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+}
+#svg {
+ margin: 100px;
+ background-color: rgba(0,180,0,0.2);
+}
+rect {
+ fill: rgba(180,0,0,0.2);
+}
+#topLeftRect2NoHitTest {
+ pointer-events: none;
+}
+</style>
+<div id='sandbox'>
+ <svg id='svg' width='300' height='300'>
+ <rect id='topLeftRect1' x='5' y='5' width='90' height='90'/>
+ <rect id='topLeftRect2NoHitTest' x='10' y='10' width='80' height='80'/>
+ <rect id='topLeftRect3' x='15' y='15' width='70' height='70'/>
+
+ <g id='middleG1'>
+ <g id='middleG2'>
+ <rect id='middleRect1' x='105' y='105' width='90' height='90'/>
+ <rect id='middleRect2' x='110' y='110' width='80' height='80'/>
+ </g>
+ </g>
+
+ <g id='bottomLeftG'>
+ <image id='bottomLeftImage1' x='5' y='205' width='90' height='90' xlink:href='data:image/svg+xml;utf8,<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="rgba(180,0,0,0.2)"/></svg>'/>
+ <image id='bottomLeftImage2' x='10' y='210' width='80' height='80' xlink:href='data:image/svg+xml;utf8,<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="rgba(180,0,0,0.2)"/></svg>'/>
+ </g>
+
+ <g id='bottomRightG1' transform='translate(300, 300)'>
+ <g id='bottomRightG2' transform='translate(-100, -100)'>
+ <rect id='bottomRightRect1' x='5' y='5' width='90' height='90'/>
+ <rect id='bottomRightRect2' x='110' y='110' width='80' height='80' transform='translate(-100, -100)'/>
+ </g>
+ </g>
+ </svg>
+</div>
+<script>
+test(function() {
+ assertElementsFromPoint('document', 125, 125,
+ [topLeftRect3, topLeftRect1, svg, sandbox, document.body, document.documentElement]);
+}, 'elementsFromPoint for a point inside two rects');
+
+test(function() {
+ assertElementsFromPoint('document', 225, 225,
+ [middleRect2, middleRect1, svg, sandbox, document.body, document.documentElement]);
+}, 'elementsFromPoint for a point inside two rects that are inside a <g>');
+
+test(function() {
+ assertElementsFromPoint('document', 125, 325,
+ [bottomLeftImage2, bottomLeftImage1, svg, sandbox, document.body, document.documentElement]);
+}, 'elementsFromPoint for a point inside two images');
+
+test(function() {
+ assertElementsFromPoint('document', 325, 325,
+ [bottomRightRect2, bottomRightRect1, svg, sandbox, document.body, document.documentElement]);
+}, 'elementsFromPoint for a point inside transformed rects and <g>');
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-table.html b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-table.html
new file mode 100644
index 00000000000..9ecb614b666
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint-table.html
@@ -0,0 +1,99 @@
+<!DOCTYPE HTML>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/elementsFromPoint.js"></script>
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+}
+#testtable {
+ margin: 100px;
+ width: 200px;
+ height: 200px;
+ background-color: rgba(0,180,0,0.2);
+}
+#testtable tr {
+ background-color: rgba(180,0,0,0.2);
+}
+#testtable td {
+ background-color: rgba(0,0,180,0.2);
+}
+.rtl {
+ direction: rtl;
+}
+.tblr {
+ writing-mode: vertical-lr;
+}
+</style>
+<div id='sandbox'>
+ <table id='testtable'>
+ <tr id='tr1'>
+ <td id='td11'></td>
+ <td id='td12'></td>
+ <td id='td13'></td>
+ <td id='td14'></td>
+ </tr>
+ <tr id='tr2'>
+ <td id='td21'></td>
+ <td id='td22'></td>
+ <td id='td23'></td>
+ <td id='td24'></td>
+ </tr>
+ <tr id='tr3'>
+ <td id='td31'></td>
+ <td id='td32'></td>
+ <td id='td33'></td>
+ <td id='td34'></td>
+ </tr>
+ <tr id='tr4'>
+ <td id='td41'></td>
+ <td id='td42'></td>
+ <td id='td43'></td>
+ <td id='td44'></td>
+ </tr>
+ </table>
+</div>
+<script>
+test(function() {
+ assertElementsFromPoint('document', 125, 125,
+ [td11, testtable, sandbox, document.body, document.documentElement]);
+ assertElementsFromPoint('document', 275, 125,
+ [td14, testtable, sandbox, document.body, document.documentElement]);
+ assertElementsFromPoint('document', 175, 175,
+ [td22, testtable, sandbox, document.body, document.documentElement]);
+ assertElementsFromPoint('document', 125, 275,
+ [td41, testtable, sandbox, document.body, document.documentElement]);
+}, 'elementsFromPoint for points inside table cells');
+
+test(function() {
+ assertElementsFromPoint('document', 100, 100,
+ [testtable, sandbox, document.body, document.documentElement]);
+ assertElementsFromPoint('document', 199, 199,
+ [testtable, sandbox, document.body, document.documentElement]);
+}, 'elementsFromPoint for points between table cells');
+
+testtable.setAttribute('class', 'rtl');
+test(function() {
+ assertElementsFromPoint('document', 125, 125,
+ [td14, testtable, sandbox, document.body, document.documentElement]);
+ assertElementsFromPoint('document', 275, 125,
+ [td11, testtable, sandbox, document.body, document.documentElement]);
+ assertElementsFromPoint('document', 100, 100,
+ [testtable, sandbox, document.body, document.documentElement]);
+ assertElementsFromPoint('document', 199, 199,
+ [testtable, sandbox, document.body, document.documentElement]);
+}, 'elementsFromPoint for points inside cells in a right-to-left table');
+
+testtable.setAttribute('class', 'tblr');
+test(function() {
+ assertElementsFromPoint('document', 125, 275,
+ [td14, testtable, sandbox, document.body, document.documentElement]);
+ assertElementsFromPoint('document', 275, 125,
+ [td41, testtable, sandbox, document.body, document.documentElement]);
+ assertElementsFromPoint('document', 100, 100,
+ [testtable, sandbox, document.body, document.documentElement]);
+ assertElementsFromPoint('document', 199, 199,
+ [testtable, sandbox, document.body, document.documentElement]);
+}, 'elementsFromPoint for points inside cells in a flipped (writing-mode:vertical-lr) table');
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint.html b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint.html
index 4400f6aa9cb..bf883a1423a 100644
--- a/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint.html
+++ b/tests/wpt/web-platform-tests/cssom-view/elementsFromPoint.html
@@ -4,12 +4,12 @@
<script src="/resources/testharnessreport.js"></script>
<style>
.size {
- width:100px;
- height:100px;
+ width:60px;
+ height:60px;
}
.overlay {
position:absolute;
- top:109px;
+ top:69px;
pointer-events:none;
}
.purple {
@@ -32,17 +32,17 @@
<iframe id=iframe-1 src="iframe.html" style='display:none;position:absolute; left:300px;'></iframe>
<iframe id=iframe-2 src="iframe.html" width="" height=""></iframe>
<iframe id=iframe-3 width="" height=""></iframe>
- <svg id=squiggle xmlns="http://www.w3.org/2000/svg" height="98" width="581" viewBox="0 0 581 98">
+ <svg id=squiggle xmlns="http://www.w3.org/2000/svg" height="98" width="500" viewBox="0 0 581 98">
<path stroke-dashoffset="0.00" stroke-dasharray="" d="M62.9 14.9c-25-7.74-56.6 4.8-60.4 24.3-3.73 19.6 21.6 35 39.6 37.6 42.8 6.2 72.9-53.4 116-58.9 65-18.2 191 101 215 28.8 5-16.7-7-49.1-34-44-34 11.5-31 46.5-14 69.3 9.38 12.6 24.2 20.6 39.8 22.9 91.4 9.05 102-98.9 176-86.7 18.8 3.81 33 17.3 36.7 34.6 2.01 10.2.124 21.1-5.18 30.1" stroke="#000" stroke-width="4.3" fill="none">
</path>
</svg>
- <svg id=svg-transform width="180" height="200"
+ <svg id=svg-transform width="180" height="140"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Now we add a text element and apply rotate and translate to both -->
- <rect x="50" y="50" height="100" width="100" style="stroke:#000; fill: #0086B2" transform="translate(30) rotate(45 50 50)"></rect>
- <text x="60" y="105" transform="translate(30) rotate(45 50 50)"> Hello WPT! </text>
+ <rect x="50" y="50" height="60" width="60" style="stroke:#000; fill: #0086B2" transform="translate(30) rotate(45 50 50)"></rect>
+ <text x="60" y="105" transform="translate(30) rotate(45 50 50)"> Hello! </text>
</svg>
<div id='pink' class='size pink' style='transform: translate(10px)'>&nbsp;</div>
@@ -90,7 +90,7 @@
}, "Return first element that is the target for hit testing");
test(function () {
- assert_array_equals(document.elementsFromPoint(10, 120),
+ assert_array_equals(document.elementsFromPoint(10, 80),
[document.getElementById('yellow'), document.body, document.querySelector('html')],
"Should have returned a sequence with `[yellow element, document.body, html]`");
}, "First element to get mouse events with pointer-events css");
diff --git a/tests/wpt/web-platform-tests/cssom-view/historical.html b/tests/wpt/web-platform-tests/cssom-view/historical.html
index cd5b16ef841..bf82eac1157 100644
--- a/tests/wpt/web-platform-tests/cssom-view/historical.html
+++ b/tests/wpt/web-platform-tests/cssom-view/historical.html
@@ -6,6 +6,10 @@
<div id="log"></div>
<script>
test(function() {
- assert_false("DOMRectList" in self);
-}, "Support for DOMRectList");
+ assert_false("ClientRectList" in self);
+}, "Support for ClientRectList");
+
+test(function() {
+ assert_false("ClientRect" in self);
+}, "Support for ClientRect");
</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/interfaces.html b/tests/wpt/web-platform-tests/cssom-view/interfaces.html
new file mode 100644
index 00000000000..c6e3662334e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/interfaces.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<meta charset=utf-8>
+<!-- WARNING: These tests are preliminary and probably partly incorrect. -->
+<title>CSSOM View automated IDL tests</title>
+<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com">
+<link rel="help" href="https://drafts.csswg.org/cssom-1/#idl-index">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/WebIDLParser.js></script>
+<script src=/resources/idlharness.js></script>
+
+<input id="caretPositionInput" style="position: absolute; top: 0; left: 0; border: 0;">
+
+<h1>CSSOM View IDL tests</h1>
+<div id=log></div>
+
+<script>
+"use strict";
+
+function doTest([html, dom, cssom, geometry, cssom_view]) {
+
+ var idlArray = new IdlArray();
+ var svg = "interface SVGElement : Element {};";
+ idlArray.add_untested_idls(html + dom + svg + cssom + geometry);
+ idlArray.add_idls(cssom_view);
+
+ idlArray.add_objects({
+ "Window": ["window"],
+ "MediaQueryList": ["matchMedia('all')"],
+ "MediaQueryListEvent": ["new MediaQueryListEvent('change')"],
+ "Screen": ["screen"],
+ "Document": ["document"],
+ "CaretPosition": ["document.caretPositionFromPoint(5, 5)"],
+ "Element": ["document.createElementNS('x', 'y')"],
+ "HTMLElement": ["document.createElement('div')"],
+ "HTMLImageElement": ["document.createElement('img')"],
+ "Range": ["new Range()"],
+ // "MouseEvent": ["new MouseEvent('foo')"],
+ "Text": ["document.createTextNode('x')"],
+ // "CSSPseudoElement": [],
+ "Document": ["document"],
+ });
+ idlArray.test();
+};
+
+function fetchData(url) {
+ return fetch(url).then((response) => response.text());
+}
+
+function waitForLoad() {
+ return new Promise(function(resolve) {
+ addEventListener("load", resolve);
+ });
+}
+
+promise_test(function() {
+ // Have to wait for onload
+ return Promise.all([fetchData("/interfaces/html.idl"),
+ fetchData("/interfaces/dom.idl"),
+ fetchData("/interfaces/cssom.idl"),
+ fetchData("/interfaces/geometry.idl"),
+ fetchData("/interfaces/cssom-view.idl"),
+ waitForLoad()])
+ .then(doTest);
+}, "Test driver");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/resources/elementsFromPoint.js b/tests/wpt/web-platform-tests/cssom-view/resources/elementsFromPoint.js
new file mode 100644
index 00000000000..ba986ef3f56
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/resources/elementsFromPoint.js
@@ -0,0 +1,48 @@
+function nodeToString(node) {
+ var str = '';
+ if (node.nodeType == Node.ELEMENT_NODE) {
+ str += node.nodeName;
+ if (node.id)
+ str += '#' + node.id;
+ else if (node.class)
+ str += '.' + node.class;
+ } else if (node.nodeType == Node.TEXT_NODE) {
+ str += '\'' + node.data + '\'';
+ } else if (node.nodeType == Node.DOCUMENT_NODE) {
+ str += '#document';
+ }
+ return str;
+}
+
+function nodeListToString(nodes) {
+ var nodeString = '';
+
+ for (var i = 0; i < nodes.length; i++) {
+ var str = nodeToString(nodes[i]);
+ if (!str)
+ continue;
+ nodeString += str;
+ if (i + 1 < nodes.length)
+ nodeString += ', ';
+ }
+ return nodeString;
+}
+
+function assertElementsFromPoint(doc, x, y, expected) {
+ var query = doc + '.elementsFromPoint(' + x + ',' + y + ')';
+ var sequence = eval(query);
+ assert_equals(nodeListToString(sequence), nodeListToString(expected), query);
+}
+
+function checkElementsFromPointFourCorners(doc, element, expectedTopLeft, expectedTopRight, expectedBottomLeft, expectedBottomRight) {
+ var rect = eval(doc + '.getElementById(\'' + element + '\')').getBoundingClientRect();
+ var topLeft = {x: rect.left + 1, y: rect.top + 1};
+ var topRight = {x: rect.right - 1, y: rect.top + 1};
+ var bottomLeft = {x: rect.left + 1, y: rect.bottom - 1};
+ var bottomRight = {x: rect.right - 1, y: rect.bottom - 1};
+
+ assertElementsFromPoint(doc, topLeft.x, topLeft.y, expectedTopLeft);
+ assertElementsFromPoint(doc, topRight.x, topRight.y, expectedTopRight);
+ assertElementsFromPoint(doc, bottomLeft.x, bottomLeft.y, expectedBottomLeft);
+ assertElementsFromPoint(doc, bottomRight.x, bottomRight.y, expectedBottomRight);
+}
diff --git a/tests/wpt/web-platform-tests/cssom-view/resources/iframe1.html b/tests/wpt/web-platform-tests/cssom-view/resources/iframe1.html
new file mode 100644
index 00000000000..ec4699465de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/resources/iframe1.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML>
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+}
+#div {
+ width: 100px;
+ height: 100px;
+ background: red;
+}
+</style>
+<div id='div'></div>
+<script>
+window.onload = window.parent.onFrameLoaded();
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/resources/iframe2.html b/tests/wpt/web-platform-tests/cssom-view/resources/iframe2.html
new file mode 100644
index 00000000000..7bb944c9d59
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/resources/iframe2.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<style>
+html, body {
+ margin: 0;
+ padding: 0;
+}
+#big {
+ width: 125px;
+ height: 500px;
+ background: blue;
+}
+#small {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100px;
+ height: 100px;
+ background: green;
+}
+</style>
+<div id='big'></div>
+<div id='small'></div>
+<script>
+window.onload = window.parent.onFrameLoaded();
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/scrollBoundaryBehavior-manual.html b/tests/wpt/web-platform-tests/cssom-view/scrollBoundaryBehavior-manual.html
new file mode 100644
index 00000000000..efd00437bde
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/scrollBoundaryBehavior-manual.html
@@ -0,0 +1,151 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style>
+.outer {
+ height: 400px;
+ width: 1000px;
+ background: white
+}
+.content {
+ height: 600px;
+ width: 1200px;
+}
+#root {
+ overflow: scroll;
+ height: 600px;
+ width: 800px;
+ background: white;
+}
+#container {
+ overflow: scroll;
+}
+#non_scrollable {
+ overflow: none;
+}
+#green {
+ background: repeating-linear-gradient(to bottom right, green 15%, white 30%);
+}
+#blue {
+ background: repeating-linear-gradient(to bottom right, blue 15%, white 30%);
+}
+</style>
+
+<div id='root'>
+ <div id='non_scrollable' class='outer'>
+ <div id='green' class='content'></div>
+ </div>
+ <div id='container' class='outer'>
+ <div id='blue' class='content'></div>
+ </div>
+</div>
+<input type="button" id="btnDone" value="DONE" style="width: 100px; height: 50px;"/>
+<h1>scroll-boundary-behavior</h1>
+<h4>Tests that scroll-boundary-behavior prevents scroll-propagation in the area and direction as specified.</h4>
+<ol>
+ <li id="i1">Make two scrolls on <span style="color: blue">BLUE</span>, in this order: scroll UP (or drag down), then scroll LEFT (or drag right). Scroll (or drag) until nothing is scrolling. Then tap on DONE.</li>
+ <li id="i2">Repeat the same scrolls as in step 1 and then tap on DONE.</li>
+ <li id="i3">Repeat the same scrolls as in step 1 and then tap on DONE.</li>
+ <li id="i4">Make two separate scrolls on <span style="color: green">GREEN</span>, in this order: scroll UP (or drag down), then scroll LEFT (or drag right). Scroll (or drag) until nothing is scrolling. Then tap on DONE.</li>
+</ol>
+
+
+<script>
+const container = document.getElementById('container');
+const non_scrollable = document.getElementById('non_scrollable');
+const root = document.getElementById('root');
+var test = async_test("scroll-boundary-behavior prevents scroll-propagation in the area and direction as specified");
+var instruction1 = document.getElementById("i1");
+var instruction2 = document.getElementById("i2");
+var instruction3 = document.getElementById("i3");
+var instruction4 = document.getElementById("i4");
+
+function setUpForRoot(offset) {
+ root.scrollTop = offset;
+ root.scrollLeft = offset;
+}
+
+function setUpForContainer(offset) {
+ container.scrollTop = offset;
+ container.scrollLeft = offset
+}
+
+function set_boundary_prevents_y() {
+ instruction1.style.color = 'red';
+ instruction1.style.fontWeight = 'bold';
+ container.style.scrollBoundaryBehaviorX = 'auto';
+ container.style.scrollBoundaryBehaviorY = 'none';
+ setUpForRoot(100);
+ setUpForContainer(0);
+}
+
+function verify_y_prevented_and_set_boundary_prevents_x() {
+ instruction1.style.fontWeight = 'normal';
+ instruction2.style.fontWeight = 'bold';
+ test.step(function() {
+ assert_equals(root.scrollTop, 100);
+ assert_equals(root.scrollLeft, 0);
+ }, "scroll-boundary-behavior-y: none should only prevent scroll propagation on y axis.");
+
+ container.style.scrollBoundaryBehaviorX = 'none';
+ container.style.scrollBoundaryBehaviorY = 'auto';
+ setUpForRoot(100);
+ setUpForContainer(0);
+}
+
+function verify_x_prevented_and_set_boundary_allows_inner() {
+ instruction2.style.fontWeight = 'normal';
+ instruction3.style.fontWeight = 'bold';
+ test.step(function() {
+ assert_equals(root.scrollTop, 0);
+ assert_equals(root.scrollLeft, 100);
+ }, "scroll-boundary-behavior-x: none should only prevent scroll propagation on x axis.");
+
+ container.style.scrollBoundaryBehaviorX = 'none';
+ container.style.scrollBoundaryBehaviorY = 'none';
+ setUpForRoot(100);
+ setUpForContainer(100);
+}
+
+function verify_inner_allowed_and_set_nonscrollable_allows_propagation() {
+ instruction1.style.color = 'black';
+ instruction4.style.color = 'red';
+ instruction3.style.fontWeight = 'normal';
+ instruction4.style.fontWeight = 'bold';
+ test.step(function() {
+ assert_equals(container.scrollTop, 0);
+ assert_equals(container.scrollLeft, 0);
+ assert_equals(root.scrollTop, 100);
+ assert_equals(root.scrollLeft, 100);
+ }, "scroll-boundary-behavior should latch the scroll to the inner container.");
+
+ non_scrollable.style.scrollBoundaryBehaviorX = 'none';
+ non_scrollable.style.scrollBoundaryBehaviorY = 'none';
+ setUpForRoot(100);
+}
+
+function verify_non_scrollable_allows_propagation() {
+ test.step(function() {
+ assert_equals(root.scrollLeft, 0);
+ assert_equals(root.scrollTop, 0);
+ }, "scroll-boundary-behavior on non-scrollable area should not affect scroll propagation.");
+ test.done();
+}
+
+var verifyAndSetupForNext = [
+ set_boundary_prevents_y,
+ verify_y_prevented_and_set_boundary_prevents_x,
+ verify_x_prevented_and_set_boundary_allows_inner,
+ verify_inner_allowed_and_set_nonscrollable_allows_propagation,
+ verify_non_scrollable_allows_propagation];
+
+on_event(document.getElementById("btnDone"), "click", function() {
+ if (current_test < verifyAndSetupForNext.length)
+ verifyAndSetupForNext[current_test++]();
+});
+
+var current_test = 0;
+verifyAndSetupForNext[current_test++]();
+
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/scrollIntoView-empty-args.html b/tests/wpt/web-platform-tests/cssom-view/scrollIntoView-empty-args.html
index 8ffd68a4149..3ea8cfc5720 100644
--- a/tests/wpt/web-platform-tests/cssom-view/scrollIntoView-empty-args.html
+++ b/tests/wpt/web-platform-tests/cssom-view/scrollIntoView-empty-args.html
@@ -2,49 +2,82 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<title>Check End Position of scrollIntoView when arg is not fully specified</title>
-<div id="container" style="height: 2500px; width: 2500px;">
- <div id="content" style="height: 500px; width: 500px;margin-left: 1000px; margin-right: 1000px; margin-top: 1000px;margin-bottom: 1000px;background-color: red">
- </div>
+
+<style>
+ #container {
+ position: relative;
+ height: 1000px;
+ width: 800px;
+ overflow: scroll;
+ }
+
+ #content {
+ position: absolute;
+ height: 500px;
+ width: 400px;
+ left: 1000px;
+ top: 1000px;
+ background-color: red;
+ }
+</style>
+
+<div id="container">
+ <div id="filler" style="height: 2500px; width: 2500px"></div>
+ <div id="content">I must become visible</div>
</div>
+
<script>
-add_completion_callback(() => document.getElementById("container").remove());
-var content_height = 500;
-var content_width = 500;
-var window_height = document.documentElement.clientHeight;
-var window_width = document.documentElement.clientWidth;
-var content = document.getElementById("content");
-
-function instantScrollToTestArgs(arg, expected_x, expected_y) {
- window.scrollTo(0, 0);
- assert_not_equals(window.scrollX, expected_x);
- assert_not_equals(window.scrollY, expected_y);
- if (arg == "omitted")
- content.scrollIntoView();
- else
- content.scrollIntoView(arg);
- assert_approx_equals(window.scrollX, expected_x, 1);
- assert_approx_equals(window.scrollY, expected_y, 1);
-}
-
-test(t => {
+ add_completion_callback(() => document.getElementById("container").remove());
+ var content = document.getElementById("content");
+ var container = document.getElementById("container");
+
+ var remaining_width = container.clientWidth - content.clientWidth;
+ var remaining_height = container.clientHeight - content.clientHeight;
+
+ function instantScrollToTestArgs(arg, expected_x, expected_y) {
+ test(t => {
+ container.scrollTop = container.scrollLeft = 0;
+
+ assert_not_equals(container.scrollLeft, expected_x);
+ assert_not_equals(container.scrollTop, expected_y);
+ if (arg == "omitted")
+ content.scrollIntoView();
+ else
+ content.scrollIntoView(arg);
+ assert_approx_equals(container.scrollTop, expected_y, 1, "verify scroll top");
+ assert_approx_equals(container.scrollLeft, expected_x, 1, "verify scroll left");
+
+ }, "scrollIntoView should behave correctly when the arg is " + arg);
+ }
+
+ // expected alignment: inline => nearest, block => start
instantScrollToTestArgs("omitted",
- content.offsetLeft + content_width - window_width,
+ content.offsetLeft - remaining_width,
content.offsetTop);
+
+ // expected alignment: inline => nearest, block => start
instantScrollToTestArgs(true,
- content.offsetLeft + content_width - window_width,
+ content.offsetLeft - remaining_width,
content.offsetTop);
+
+ // expected alignment: inline => nearest, block => end
instantScrollToTestArgs(false,
- content.offsetLeft + content_width - window_width,
- content.offsetTop + content_height - window_height);
+ content.offsetLeft - remaining_width,
+ content.offsetTop - remaining_height);
+
+ // expected alignment: inline => center, block => center
instantScrollToTestArgs({},
- content.offsetLeft + (content_width - window_width) / 2,
- content.offsetTop + (content_height - window_height) / 2);
+ content.offsetLeft - remaining_width / 2,
+ content.offsetTop - remaining_height / 2);
+
+ // expected alignment: inline => center, block => center
instantScrollToTestArgs(null,
- content.offsetLeft + (content_width - window_width) / 2,
- content.offsetTop + (content_height - window_height) / 2);
+ content.offsetLeft - remaining_width / 2,
+ content.offsetTop - remaining_height / 2);
+
+ // expected alignment: inline => nearest, block => start
instantScrollToTestArgs(undefined,
- content.offsetLeft + content_width - window_width,
+ content.offsetLeft - remaining_width,
content.offsetTop);
-}, "scrollIntoView should behave correctly when the arg is not fully specified as ScrollIntoViewOptions");
</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-001-ref.html b/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-001-ref.html
new file mode 100644
index 00000000000..683198a1623
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-001-ref.html
@@ -0,0 +1,3 @@
+<!-- quirks mode -->
+<html style="overflow:scroll">
+<body style="overflow:scroll">The body box should have scrollbars.
diff --git a/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-001.html b/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-001.html
new file mode 100644
index 00000000000..344e299d0da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-001.html
@@ -0,0 +1,17 @@
+<!-- quirks mode -->
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>CSSOM View Test: Dynamically changing scrollingElement to html in quirks mode</title>
+ <link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+ <link rel="help" href="https://www.w3.org/TR/cssom-view-1/#dom-document-scrollingelement">
+ <link rel="match" href="scrollingElement-quirks-dynamic-001-ref.html">
+ <meta name="assert" content="Checks that setting the overflow on html to scroll will stop propagating body scrollbars to viewport.">
+ </head>
+ <body style="overflow:scroll">The body box should have scrollbars.
+ <script>
+ document.body.offsetTop; // force layout
+ document.documentElement.style.overflow = "scroll";
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-002-ref.html b/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-002-ref.html
new file mode 100644
index 00000000000..c8a783980f8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-002-ref.html
@@ -0,0 +1,2 @@
+<!-- quirks mode -->
+<body style="overflow:scroll">The body box should not have scrollbars.
diff --git a/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-002.html b/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-002.html
new file mode 100644
index 00000000000..8495be2f4ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/scrollingElement-quirks-dynamic-002.html
@@ -0,0 +1,17 @@
+<!-- quirks mode -->
+<html style="overflow:scroll">
+ <head>
+ <meta charset="utf-8">
+ <title>CSSOM View Test: Dynamically changing scrollingElement to body in quirks mode</title>
+ <link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+ <link rel="help" href="https://www.w3.org/TR/cssom-view-1/#dom-document-scrollingelement">
+ <link rel="match" href="scrollingElement-quirks-dynamic-002-ref.html">
+ <meta name="assert" content="Checks that setting the overflow on html to visible will propagate body scrollbars to viewport.">
+ </head>
+ <body style="overflow:scroll">The body box should not have scrollbars.
+ <script>
+ document.body.offsetTop; // force layout
+ document.documentElement.style.overflow = "visible";
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/cssom-view/scrollintoview.html b/tests/wpt/web-platform-tests/cssom-view/scrollintoview.html
new file mode 100644
index 00000000000..c69025b4943
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom-view/scrollintoview.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<title>CSSOM View - scrollIntoView</title>
+<meta charset="utf-8">
+<link rel="author" title="Chris Wu" href="mailto:pwx.frontend@gmail.com">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview">
+<link rel="help" href="https://heycam.github.io/webidl/#es-operations">
+<link rel="help" href="https://heycam.github.io/webidl/#es-overloads">
+<meta name="flags" content="dom">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+body.running { margin: 0; padding: 4000px; overflow: hidden }
+body.running #testDiv {
+ width: 200px;
+ height: 200px;
+ background-color: lightgreen;
+}
+</style>
+<body class=running>
+<div id=testDiv></div>
+<div id="log"></div>
+<script>
+var testDiv = document.getElementById('testDiv');
+
+var expectedXLeft = 4000;
+var expectedXRight = 4000 - window.innerWidth + testDiv.clientWidth;
+var expectedXCenter = 4000 - (window.innerWidth / 2) + (testDiv.clientWidth / 2);
+
+var expectedYTop = 4000;
+var expectedYBottom = 4000 - window.innerHeight + testDiv.clientHeight;
+var expectedYCenter = 4000 - (window.innerHeight / 2) + (testDiv.clientHeight / 2);
+
+[
+ ["omitted argument", "nearest", expectedYTop],
+ [true, "nearest", expectedYTop],
+ [false, "nearest", expectedYBottom],
+ [undefined, "nearest", expectedYTop],
+ [null, "nearest", expectedYTop],
+ [{}, "nearest", expectedYTop],
+ [{block: "center", inline: "center"}, expectedXCenter, expectedYCenter],
+ [{block: "start", inline: "start"}, expectedXLeft, expectedYTop],
+ [{block: "end", inline: "end"}, expectedXRight, expectedYBottom],
+ [{block: "nearest", inline: "nearest"}, "nearest", "nearest"],
+].forEach(([input, expectedX, expectedY]) => {
+ test(() => {
+ window.scrollTo(0, 0);
+ testScrollIntoView(input);
+ var x = (expectedX === "nearest") ? expectedXRight : expectedX;
+ var y = (expectedY === "nearest") ? expectedYBottom : expectedY;
+ assert_approx_equals(window.scrollX, x, 0.5, 'scrollX');
+ assert_approx_equals(window.scrollY, y, 0.5, 'scrollY');
+ }, `scrollIntoView(${format_input(input)}) starting at left,top`);
+
+ test(() => {
+ window.scrollTo(0, 12000);
+ testScrollIntoView(input);
+ var x = (expectedX === "nearest") ? expectedXRight : expectedX;
+ var y = (expectedY === "nearest") ? expectedYTop : expectedY;
+ assert_approx_equals(window.scrollX, x, 0.5, 'scrollX');
+ assert_approx_equals(window.scrollY, y, 0.5, 'scrollY');
+ }, `scrollIntoView(${format_input(input)}) starting at left,bottom`);
+
+ test(() => {
+ window.scrollTo(12000, 0);
+ testScrollIntoView(input);
+ var x = (expectedX === "nearest") ? expectedXLeft : expectedX;
+ var y = (expectedY === "nearest") ? expectedYBottom : expectedY;
+ assert_approx_equals(window.scrollX, x, 0.5, 'scrollX');
+ assert_approx_equals(window.scrollY, y, 0.5, 'scrollY');
+ }, `scrollIntoView(${format_input(input)}) starting at right,top`);
+
+ test(() => {
+ window.scrollTo(12000, 12000);
+ testScrollIntoView(input);
+ var x = (expectedX === "nearest") ? expectedXLeft : expectedX;
+ var y = (expectedY === "nearest") ? expectedYTop : expectedY;
+ assert_approx_equals(window.scrollX, x, 0.5, 'scrollX');
+ assert_approx_equals(window.scrollY, y, 0.5, 'scrollY');
+ }, `scrollIntoView(${format_input(input)}) starting at right,bottom`);
+});
+
+function testScrollIntoView(input) {
+ if (input === "omitted argument") {
+ testDiv.scrollIntoView();
+ } else {
+ testDiv.scrollIntoView(input);
+ }
+}
+
+// This formats dict as a string suitable as test name.
+// format_value() is provided by testharness.js,
+// which also preserves sign for -0.
+function format_dict(dict) {
+ const props = [];
+ for (let prop in dict) {
+ props.push(`${prop}: ${format_value(dict[prop])}`);
+ }
+ return `{${props.join(', ')}}`;
+}
+
+function format_input(input) {
+ if (input === "omitted argument") {
+ return "";
+ } else if (input === null || typeof input !== "object") {
+ return format_value(input);
+ }
+ return format_dict(input);
+}
+
+document.body.classList.remove('running');
+window.scrollTo(0, 0);
+</script>
diff --git a/tests/wpt/web-platform-tests/cssom-view/ttwf-scrollintoview.html b/tests/wpt/web-platform-tests/cssom-view/ttwf-scrollintoview.html
deleted file mode 100644
index 1ccb9c580de..00000000000
--- a/tests/wpt/web-platform-tests/cssom-view/ttwf-scrollintoview.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>CSSOM View - 6 - scrollIntoView tests</title>
- <meta charset="utf-8">
- <link rel="author" title="Chris Wu" href="mailto:pwx.frontend@gmail.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-view/#dom-element-scrollintoview">
- <meta name="flags" content="dom">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <style type="text/css">
- #phitem{height: 2000px;}
- #viewitem{width:300px;height:200px;margin:0 auto;background-color: lightgreen;}
- </style>
-</head>
-<body>
- <div id="myDiv">
- <div id="phitem"></div>
- <div id="viewitem"></div>
- </div>
- <div id="log"></div>
- <script>
- var asytest = async_test('check scrollIntoView');
- asytest.step(function(){
- var viewitem = document.getElementById('viewitem');
- viewitem.scrollIntoView();
- assert_true(window.pageYOffset + window.innerHeight > viewitem.offsetTop, "The element isn't in the viewport")
- })
- asytest.done()
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/cssom/CSSStyleRule.html b/tests/wpt/web-platform-tests/cssom/CSSStyleRule.html
index 3acdfb12852..b103d3310a9 100644
--- a/tests/wpt/web-platform-tests/cssom/CSSStyleRule.html
+++ b/tests/wpt/web-platform-tests/cssom/CSSStyleRule.html
@@ -67,24 +67,7 @@
assert_idl_attribute(rule, "selectorText");
assert_equals(typeof rule.selectorText, "string");
assert_idl_attribute(rule, "style");
- }, "Existence and type of CSSStyleRule attributes");
-
- test(function() {
- // CSSStyleRule.style has PutForwards=cssText and SameObject.
- var initial = rule.style.cssText;
- var style = rule.style;
-
- rule.style = "";
- assert_equals(rule.style.cssText, "");
- assert_equals(rule.style, style);
-
- rule.style = "margin: 42px;";
- assert_equals(rule.style.margin, "42px");
- assert_equals(rule.style, style);
-
- rule.style = initial;
- assert_equals(rule.style, style);
- }, "Assigning to CSSStyleRule.style assigns to cssText; CSSStyleRule.style returns the same object");
+ }, "Existence, writability and type of CSSStyleRule attributes");
test(function() {
assert_equals(rule.selectorText, "div");
diff --git a/tests/wpt/web-platform-tests/cssom/MediaList.xhtml b/tests/wpt/web-platform-tests/cssom/MediaList2.xhtml
index fb1062cba87..fb1062cba87 100644
--- a/tests/wpt/web-platform-tests/cssom/MediaList.xhtml
+++ b/tests/wpt/web-platform-tests/cssom/MediaList2.xhtml
diff --git a/tests/wpt/web-platform-tests/cssom/OWNERS b/tests/wpt/web-platform-tests/cssom/OWNERS
index fc98874a322..607f8e85cc2 100644
--- a/tests/wpt/web-platform-tests/cssom/OWNERS
+++ b/tests/wpt/web-platform-tests/cssom/OWNERS
@@ -1,6 +1,4 @@
-@zcorpan
@dbaron
@plinss
-@rune-opera
@lilles
@therealglazou
diff --git a/tests/wpt/web-platform-tests/cssom/cssom-ruleTypeAndOrder.html b/tests/wpt/web-platform-tests/cssom/cssom-ruleTypeAndOrder.html
new file mode 100644
index 00000000000..19aab35357c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom/cssom-ruleTypeAndOrder.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<head>
+ <title>CSS OM: CSS Rule Types and Order</title>
+ <link rel="help" href="https://drafts.csswg.org/cssom-1/#the-cssrule-interface">
+ <meta name="flags" content="dom">
+ <meta name="assert" content="Testing Serialization of Style Rules">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <style id="s-0">
+ @namespace svg "http://www.w3.org/2000/svg";
+ </style>
+ <style id="s-1">
+ @import url('main.css');
+ </style>
+ <style id="s-2">
+ h1 { background: indianred; }
+ </style>
+ <style id="s-3">
+ @namespace svg "http://www.w3.org/2000/svg";
+ svg|a { color: white; }
+ </style>
+ <style id="s-4">
+ @font-face {
+ font-family: 'Megalopolis';
+ src: url('fonts/megalopolisextra-webfont.eot');
+ src: url('fonts/megalopolisextra-webfont.eot?#iefix') format('embedded-opentype'),
+ url('fonts/megalopolisextra-webfont.woff') format('woff'),
+ url('fonts/megalopolisextra-webfont.ttf') format('truetype'),
+ url('fonts/megalopolisextra-webfont.svg#MEgalopolisExtraRegular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+ }
+ </style>
+ <style id="s-5">
+ @media (min-width: 200px) {
+ h1 { background: aliceblue; }
+ }
+ </style>
+ <style id="s-6">
+ @page :first {
+ h1 { color: #444; }
+ }
+ </style>
+</head>
+<body>
+ <div id="log"></div>
+ <script type="text/javascript">
+ "use strict";
+
+ var stylesheets = document.styleSheets;
+
+ var expectedOrderOfTypes = [10, 3, 1, 1, 5, 4, 6];
+
+ var typesText = {
+ 1: 'style rule',
+ 3: '@import rule',
+ 4: 'media rule',
+ 5: '@font-face rule',
+ 6: 'page rule',
+ 10: 'namespace rule'
+ };
+
+ for (var i = 0; i < stylesheets.length; i++) {
+ test( function () {
+ if (i === 3) {
+ var cssType = stylesheets[i].cssRules[1].type;
+ } else {
+ var cssType = stylesheets[i].cssRules[0].type;
+ }
+ assert_equals(typesText[cssType], typesText[expectedOrderOfTypes[i]]);
+ }, 'Type of #s-' + i + ' is expected to be ' + typesText[expectedOrderOfTypes[i]]);
+ }
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/cssom/getComputedStyle-pseudo.html b/tests/wpt/web-platform-tests/cssom/getComputedStyle-pseudo.html
index 8efd484fc21..fa358d6d3d3 100644
--- a/tests/wpt/web-platform-tests/cssom/getComputedStyle-pseudo.html
+++ b/tests/wpt/web-platform-tests/cssom/getComputedStyle-pseudo.html
@@ -17,15 +17,33 @@
#test::before,
#test::after,
#contents::before,
-#contents::after {
+#contents::after,
+#flex::before,
+#flex::after {
content: " ";
width: 50%;
height: 10px;
display: block;
}
+#none {
+ display: none;
+}
+#none::before,
+#none::after {
+ content: "Foo";
+}
+#flex {
+ display: flex;
+}
+#flex-no-pseudo {
+ display: flex;
+}
</style>
<div id="test">
<div id="contents"></div>
+ <div id="none"></div>
+ <div id="flex"></div>
+ <div id="flex-no-pseudo"></div>
</div>
<script>
test(function() {
@@ -40,4 +58,37 @@ test(function() {
assert_equals(getComputedStyle(contents, pseudo).width, "50px");
});
}, "Resolution of width is correct for ::before and ::after pseudo-elements of display: contents elements");
+test(function() {
+ var has_no_pseudos = document.body;
+ has_no_pseudos.style.position = "relative";
+ [":before", ":after"].forEach(function(pseudo) {
+ assert_equals(getComputedStyle(has_no_pseudos, pseudo).position, "static",
+ "Nonexistent " + pseudo + " pseudo-element shouldn't claim to have " +
+ "the same style as the originating element");
+ assert_equals(getComputedStyle(has_no_pseudos, pseudo).width, "auto",
+ "Nonexistent " + pseudo + " pseudo-element shouldn't claim to have " +
+ "definite size");
+ });
+}, "Resolution of nonexistent pseudo-element styles");
+test(function() {
+ var none = document.getElementById('none');
+ [":before", ":after"].forEach(function(pseudo) {
+ assert_equals(getComputedStyle(none, pseudo).content, "\"Foo\"",
+ "Pseudo-styles of display: none elements should be correct");
+ });
+}, "Resolution of pseudo-element styles in display: none elements");
+test(function() {
+ var flex = document.getElementById('flex');
+ [":before", ":after"].forEach(function(pseudo) {
+ assert_equals(getComputedStyle(flex, pseudo).display, "block",
+ "Pseudo-styles of display: flex elements should get blockified");
+ });
+}, "Item-based blockification of pseudo-elements");
+test(function() {
+ var flexNoPseudo = document.getElementById('flex-no-pseudo');
+ [":before", ":after"].forEach(function(pseudo) {
+ assert_equals(getComputedStyle(flexNoPseudo, pseudo).display, "block",
+ "Pseudo-styles of display: flex elements should get blockified");
+ });
+}, "Item-based blockification of nonexistent pseudo-elements");
</script>
diff --git a/tests/wpt/web-platform-tests/cssom/index-003.html b/tests/wpt/web-platform-tests/cssom/index-003.html
deleted file mode 100644
index 354afd3c6c1..00000000000
--- a/tests/wpt/web-platform-tests/cssom/index-003.html
+++ /dev/null
@@ -1,95 +0,0 @@
-<!doctype html>
-<head>
- <title>CSS OM: CSS Values</title>
- <link rel="author" title="Divya Manian" href="mailto:manian@adobe.com">
- <link rel="help" href="http://www.w3.org/TR/cssom-1/#the-cssrulelist-interface">
- <meta name="flags" content="dom">
- <meta name="assert" content="Testing Serialization of Style Rules">
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <style id="s-0">
- @namespace svg "http://www.w3.org/2000/svg";
- </style>
- <style id="s-1">
- @import url('main.css');
- </style>
- <style id="s-2">
- h1 { background: indianred; }
- </style>
- <style id="s-3">
- @namespace svg "http://www.w3.org/2000/svg";
- svg|a { color: white; }
- </style>
- <style id="s-4">
- @font-face {
- font-family: 'Megalopolis';
- src: url('fonts/megalopolisextra-webfont.eot');
- src: url('fonts/megalopolisextra-webfont.eot?#iefix') format('embedded-opentype'),
- url('fonts/megalopolisextra-webfont.woff') format('woff'),
- url('fonts/megalopolisextra-webfont.ttf') format('truetype'),
- url('fonts/megalopolisextra-webfont.svg#MEgalopolisExtraRegular') format('svg');
- font-weight: normal;
- font-style: normal;
- }
- </style>
- <style id="s-5">
- @media (min-width: 200px) {
- h1 { background: aliceblue; }
- }
- </style>
- <style id="s-6">
- @page :first {
- h1 { color: #444; }
- }
- </style>
-</head>
-<body>
- <div id="log"></div>
- <script>
- var stylesheets = document.styleSheets;
- var ruletypes = {
- 1: 'Style Rule',
- 3: '@import rule',
- 4: 'media rule',
- 5: '@font-face rule',
- 6: 'page rule',
- 10: 'Namespace rule',
- 11: 'unrecognized rule'
- };
-
- var types = {
- 's-0': '@namespace svg "http://www.w3.org/2000/svg"',
- 's-1': '@import url("main.css")',
- 's-2': 'h1',
- 's-3': 'svg|a',
- 's-4': '@font-face',
- 's-5': '@media (min-width: 200px)',
- 's-6': '@page :first'
- }
-
- var ruleOrder = [10, 3, 1, 1, 5, 4, 6];
-
- var results = [];
-
-
- for (i = 0; i < stylesheets.length; i++) {
- if(i == 3) {
- cssType = stylesheets[i].cssRules.length > 0 && stylesheets[i].cssRules[1] ? stylesheets[i].cssRules[1].type : 11;
- } else {
- cssType = stylesheets[i].cssRules.length > 0 ? stylesheets[i].cssRules[0].type : 11;
- }
-
- results.push([
- ruletypes[ruleOrder[i]] + ' is expected to be ' + types['s-' + i],
- ruletypes[cssType],
- ruletypes[ruleOrder[i]]
- ]);
-
- }
-
- generate_tests(assert_equals, results);
-
- </script>
- </body>
- </html>
-
diff --git a/tests/wpt/web-platform-tests/cssom/interfaces.html b/tests/wpt/web-platform-tests/cssom/interfaces.html
index cf43e94bc11..e289c5a3496 100644
--- a/tests/wpt/web-platform-tests/cssom/interfaces.html
+++ b/tests/wpt/web-platform-tests/cssom/interfaces.html
@@ -1,174 +1,89 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
+<!doctype html>
+<meta charset=utf-8>
+<!-- WARNING: These tests are preliminary and probably partly incorrect. -->
<title>CSSOM automated IDL tests</title>
<link rel="author" title="Ms2ger" href="mailto:Ms2ger@gmail.com">
<link rel="help" href="https://drafts.csswg.org/cssom-1/#idl-index">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/WebIDLParser.js"></script>
-<script src="/resources/idlharness.js"></script>
-<style id="styleElement">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/WebIDLParser.js></script>
+<script src=/resources/idlharness.js></script>
+<!--
+Provide some objects to test.
+Use a non-empty style attribute to get a non-empty CSSStyleDeclaration.
+-->
+<style id="styleElement" style="z-index: 0;">
+@import url("data:text/css,");
+@namespace x "y";
+@page { @top-left {} }
+@media all {}
#test { color: green; }
</style>
-<div id="log"></div>
-<script type=text/plain id=untested_idl>
-interface EventTarget {};
-interface Node : EventTarget {};
-interface Document : Node {};
-interface ProcessingInstruction : Node {};
-interface Element : Node {};
-interface HTMLElement : Element {};
-interface SVGElement : Element {};
-[PrimaryGlobal] interface Window {};
-</script>
-<script type=text/plain id=idl>
-[LegacyArrayClass]
-interface MediaList {
- [TreatNullAs=EmptyString] stringifier attribute DOMString mediaText;
- readonly attribute unsigned long length;
- getter DOMString? item(unsigned long index);
- void appendMedium(DOMString medium);
- void deleteMedium(DOMString medium);
-};
-
-interface StyleSheet {
- readonly attribute DOMString type;
- readonly attribute DOMString? href;
- readonly attribute (Element or ProcessingInstruction)? ownerNode;
- readonly attribute StyleSheet? parentStyleSheet;
- readonly attribute DOMString? title;
- [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
- attribute boolean disabled;
-};
-
-interface CSSStyleSheet : StyleSheet {
- readonly attribute CSSRule? ownerRule;
- [SameObject] readonly attribute CSSRuleList cssRules;
- unsigned long insertRule(DOMString rule, unsigned long index);
- void deleteRule(unsigned long index);
-};
-[LegacyArrayClass]
-interface StyleSheetList {
- getter StyleSheet? item(unsigned long index);
- readonly attribute unsigned long length;
-};
-
-partial interface Document {
- [SameObject] readonly attribute StyleSheetList styleSheets;
-};
+<svg id="svgElement" style="height: 0;"></svg>
-[NoInterfaceObject]
-interface LinkStyle {
- readonly attribute StyleSheet? sheet;
-};
-
-ProcessingInstruction implements LinkStyle;
-[LegacyArrayClass]
-interface CSSRuleList {
- getter CSSRule? item(unsigned long index);
- readonly attribute unsigned long length;
-};
+<iframe id="xmlssPiIframe" src="support/xmlss-pi.xhtml" style="display: none;"></iframe>
-interface CSSRule {
- const unsigned short STYLE_RULE = 1;
- const unsigned short CHARSET_RULE = 2; // historical
- const unsigned short IMPORT_RULE = 3;
- const unsigned short MEDIA_RULE = 4;
- const unsigned short FONT_FACE_RULE = 5;
- const unsigned short PAGE_RULE = 6;
- const unsigned short MARGIN_RULE = 9;
- const unsigned short NAMESPACE_RULE = 10;
- readonly attribute unsigned short type;
- attribute DOMString cssText;
- readonly attribute CSSRule? parentRule;
- readonly attribute CSSStyleSheet? parentStyleSheet;
-};
-
-interface CSSStyleRule : CSSRule {
- attribute DOMString selectorText;
- [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
-};
-
-interface CSSImportRule : CSSRule {
- readonly attribute DOMString href;
- [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
- [SameObject] readonly attribute CSSStyleSheet styleSheet;
-};
-
-interface CSSGroupingRule : CSSRule {
- [SameObject] readonly attribute CSSRuleList cssRules;
- unsigned long insertRule(DOMString rule, unsigned long index);
- void deleteRule(unsigned long index);
-};
-
-interface CSSMediaRule : CSSGroupingRule {
- [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
-};
-
-interface CSSPageRule : CSSGroupingRule {
- attribute DOMString selectorText;
- [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
-};
+<h1>CSSOM IDL tests</h1>
+<div id=log></div>
-interface CSSMarginRule : CSSRule {
- readonly attribute DOMString name;
- [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
-};
-
-interface CSSNamespaceRule : CSSRule {
- readonly attribute DOMString namespaceURI;
- readonly attribute DOMString prefix;
-};
-
-interface CSSStyleDeclaration {
- [CEReactions] attribute DOMString cssText;
- readonly attribute unsigned long length;
- getter DOMString item(unsigned long index);
- DOMString getPropertyValue(DOMString property);
- DOMString getPropertyPriority(DOMString property);
- [CEReactions] void setProperty(DOMString property, [TreatNullAs=EmptyString] DOMString value, [TreatNullAs=EmptyString] optional DOMString priority = "");
- [CEReactions] void setPropertyValue(DOMString property, [TreatNullAs=EmptyString] DOMString value);
- [CEReactions] void setPropertyPriority(DOMString property, [TreatNullAs=EmptyString] DOMString priority);
- [CEReactions] DOMString removeProperty(DOMString property);
- readonly attribute CSSRule? parentRule;
- [CEReactions, TreatNullAs=EmptyString] attribute DOMString cssFloat;
-};
-
-[NoInterfaceObject]
-interface ElementCSSInlineStyle {
- [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
-};
-
-HTMLElement implements ElementCSSInlineStyle;
-
-SVGElement implements ElementCSSInlineStyle;
-
-partial interface Window {
- [NewObject] CSSStyleDeclaration getComputedStyle(Element elt, optional DOMString? pseudoElt);
-};
-
-interface CSS {
- static DOMString escape(DOMString ident);
-};
-</script>
<script>
-var idl_array, style_element;
-setup(function() {
- idl_array = new IdlArray();
- var idls = document.getElementById("idl").textContent;
- var untested_idls = document.getElementById("untested_idl").textContent;
- idl_array.add_untested_idls(untested_idls);
- idl_array.add_idls(idls);
+"use strict";
+var style_element, svg_element, xmlss_pi;
+function doTest([html, dom, cssom]) {
style_element = document.getElementById('styleElement');
- idl_array.add_objects({
+ svg_element = document.getElementById('svgElement');
+ xmlss_pi = document.getElementById('xmlssPiIframe').contentDocument.firstChild;
+
+ var idlArray = new IdlArray();
+ var svg = "interface SVGElement : Element {};";
+ idlArray.add_untested_idls(html + dom + svg);
+ idlArray.add_idls(cssom);
+
+ idlArray.add_objects({
"Document": ["document", "new Document()"],
"StyleSheetList": ["document.styleSheets"],
"CSSStyleSheet": ["style_element.sheet"],
+ "MediaList": ["style_element.sheet.media"],
"CSSRuleList": ["style_element.sheet.cssRules"],
- "CSSStyleRule": ["style_element.sheet.cssRules[0]"],
+ "CSSImportRule": ["style_element.sheet.cssRules[0]"],
+ "CSSNamespaceRule": ["style_element.sheet.cssRules[1]"],
+ "CSSPageRule": ["style_element.sheet.cssRules[2]"],
+ "CSSMarginRule": ["style_element.sheet.cssRules[2].cssRules[0]"],
+ "CSSMediaRule": ["style_element.sheet.cssRules[3]"],
+ "CSSStyleRule": ["style_element.sheet.cssRules[4]"],
+ "CSSStyleDeclaration": ["style_element.sheet.cssRules[4].style", // CSSStyleRule
+ "style_element.sheet.cssRules[2].style", // CSSPageRule
+ "style_element.sheet.cssRules[2].cssRules[0].style", // CSSMarginRule
+ "style_element.style", // ElementCSSInlineStyle for HTMLElement
+ "svg_element.style", // ElementCSSInlineStyle for SVGElement
+ "getComputedStyle(svg_element)"],
+ "ProcessingInstruction": ["xmlss_pi"],
+ "Window": ["window"],
+ "HTMLElement": ["style_element", "document.createElement('unknownelement')"],
+ "SVGElement": ["svg_element"],
});
-});
-idl_array.test();
+ idlArray.test();
+};
+
+function fetchData(url) {
+ return fetch(url).then((response) => response.text());
+}
+
+function waitForLoad() {
+ return new Promise(function(resolve) {
+ addEventListener("load", resolve);
+ });
+}
+
+promise_test(function() {
+ // Have to wait for onload
+ return Promise.all([fetchData("/interfaces/html.idl"),
+ fetchData("/interfaces/dom.idl"),
+ fetchData("/interfaces/cssom.idl"),
+ waitForLoad()])
+ .then(doTest);
+}, "Test driver");
+
</script>
diff --git a/tests/wpt/web-platform-tests/cssom/stylesheet-same-origin.sub.html b/tests/wpt/web-platform-tests/cssom/stylesheet-same-origin.sub.html
index b259e4369dd..9df0a54b7d8 100644
--- a/tests/wpt/web-platform-tests/cssom/stylesheet-same-origin.sub.html
+++ b/tests/wpt/web-platform-tests/cssom/stylesheet-same-origin.sub.html
@@ -8,10 +8,12 @@
<link id="crossorigin" href="http://www1.{{host}}:{{ports[http][1]}}/stylesheet-same-origin.css" rel="stylesheet">
<link id="sameorigin" href="stylesheet-same-origin.css" rel="stylesheet">
+ <link id="sameorigindata" href="data:text/css,.green-text{color:rgb(0, 255, 0)}" rel="stylesheet">
<script>
var crossorigin = document.getElementById("crossorigin").sheet;
var sameorigin = document.getElementById("sameorigin").sheet;
+ var sameorigindata = document.getElementById("sameorigindata").sheet;
test(function() {
assert_throws("SecurityError",
@@ -32,13 +34,22 @@
"Cross origin stylesheet.deleteRule should throw SecurityError.");
}, "Origin-clean check in cross-origin CSSOM Stylesheets");
+ function doOriginCleanCheck(sheet, name) {
+ assert_equals(sheet.cssRules.length, 1, name + " stylesheet.cssRules should be accessible.");
+ sheet.insertRule("#test { margin: 10px; }", 1);
+ assert_equals(sheet.cssRules.length, 2, name + " stylesheet.insertRule should be accessible.");
+ sheet.deleteRule(0);
+ assert_equals(sheet.cssRules.length, 1, name + " stylesheet.deleteRule should be accessible.");
+ }
+
test(function() {
- assert_equals(sameorigin.cssRules.length, 1, "Same origin stylesheet.cssRules should be accessible.");
- sameorigin.insertRule("#test { margin: 10px; }", 1);
- assert_equals(sameorigin.cssRules.length, 2, "Same origin stylesheet.insertRule should be accessible.");
- sameorigin.deleteRule(0);
- assert_equals(sameorigin.cssRules.length, 1, "Same origin stylesheet.deleteRule should be accessible.");
+ doOriginCleanCheck(sameorigin, "Same-origin");
}, "Origin-clean check in same-origin CSSOM Stylesheets");
+
+ test(function() {
+ doOriginCleanCheck(sameorigindata, "data:css");
+ }, "Origin-clean check in data:css CSSOM Stylesheets");
+
</script>
</head>
<body>
diff --git a/tests/wpt/web-platform-tests/cssom/support/xmlss-pi.xhtml b/tests/wpt/web-platform-tests/cssom/support/xmlss-pi.xhtml
new file mode 100644
index 00000000000..8e22b50b25a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/cssom/support/xmlss-pi.xhtml
@@ -0,0 +1 @@
+<?xml-stylesheet href='data:text/css,'?><html xmlns='http://www.w3.org/1999/xhtml'/>
diff --git a/tests/wpt/web-platform-tests/custom-elements/historical.html b/tests/wpt/web-platform-tests/custom-elements/historical.html
new file mode 100644
index 00000000000..70981ce59c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/custom-elements/historical.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<title>Custom Elements v0 features</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+test(() => {
+ assert_false('registerElement' in document)
+}, 'document.registerElement should not exist')
+
+// These tests should pass as long as v0 isn't supported:
+// v0: a 2nd string argument for createElement.
+// v1: a ElementCreationOptions (dictionary) argument.
+test(() => {
+ try {
+ const element = document.createElement('x', 'string')
+ // If neither v0/v1 are supported, then there should be no is attribute.
+ assert_false(element.hasAttribute('is'))
+ } catch (e) {
+ // If v1 is supported, then converting string to dictionary should throw.
+ assert_throws(new TypeError, function() { throw e })
+ }
+}, 'document.createElement(localName, "string") should not work')
+
+// createElementNS is analagous, but for the 3rd argument
+test(() => {
+ try {
+ const element = document.createElementNS(null, 'x', 'string')
+ // If neither v0/v1 are supported, then there should be no is attribute.
+ assert_false(element.hasAttribute('is'))
+ } catch (e) {
+ // If v1 is supported, then converting string to dictionary should throw.
+ assert_throws(new TypeError, function() { throw e })
+ }
+}, 'document.createElementNS(namespace, qualifiedName, "string") should not work')
+</script>
diff --git a/tests/wpt/web-platform-tests/custom-elements/reactions/ChildNode.html b/tests/wpt/web-platform-tests/custom-elements/reactions/ChildNode.html
index 756f1722988..f808b67a80a 100644
--- a/tests/wpt/web-platform-tests/custom-elements/reactions/ChildNode.html
+++ b/tests/wpt/web-platform-tests/custom-elements/reactions/ChildNode.html
@@ -3,8 +3,8 @@
<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">
+<meta name="assert" content="before, after, replaceWith, and remove of ChildNode interface must have CEReactions">
+<meta name="help" content="https://dom.spec.whatwg.org/#childnode">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../resources/custom-elements-helpers.js"></script>
@@ -28,7 +28,7 @@ testNodeConnector(function (newContainer, customElement) {
testNodeDisconnector(function (customElement) {
customElement.remove();
-}, 'replaceWith on ChildNode');
+}, 'remove on ChildNode');
</script>
</body>
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
index 61580f4184b..0d158fd59e4 100644
--- a/tests/wpt/web-platform-tests/custom-elements/upgrading/Node-cloneNode.html
+++ b/tests/wpt/web-platform-tests/custom-elements/upgrading/Node-cloneNode.html
@@ -12,6 +12,7 @@
<body>
<div id="log"></div>
<script>
+setup({allow_uncaught_exception:true});
test(function () {
class MyCustomElement extends HTMLElement {}
@@ -99,69 +100,70 @@ test_with_window(function (contentWindow) {
'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 {
+// The error reporting isn't clear yet when multiple globals involved in custom
+// element, see w3c/webcomponents#635, so using test_with_window is not a good
+// idea here.
+test(function () {
+ class MyCustomElement extends HTMLElement {
constructor(doNotCreateItself) {
super();
if (!doNotCreateItself)
new MyCustomElement(true);
}
}
- contentWindow.customElements.define('my-custom-element', MyCustomElement);
+ customElements.define('my-custom-element-constructed-after-super', MyCustomElement);
var instance = new MyCustomElement(false);
var uncaughtError;
- contentWindow.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ window.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 {
+test(function () {
+ class MyCustomElement extends HTMLElement {
constructor(doNotCreateItself) {
if (!doNotCreateItself)
new MyCustomElement(true);
super();
}
}
- contentWindow.customElements.define('my-custom-element', MyCustomElement);
+ customElements.define('my-custom-element-constructed-before-super', MyCustomElement);
var instance = new MyCustomElement(false);
var uncaughtError;
- contentWindow.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ window.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;
+test(function () {
var returnSpan = false;
- class MyCustomElement extends contentWindow.HTMLElement {
+ class MyCustomElement extends HTMLElement {
constructor() {
super();
if (returnSpan)
- return contentDocument.createElement('span');
+ return document.createElement('span');
}
}
- contentWindow.customElements.define('my-custom-element', MyCustomElement);
+ customElements.define('my-custom-element-return-another', MyCustomElement);
var instance = new MyCustomElement(false);
returnSpan = true;
var uncaughtError;
- contentWindow.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ window.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);
+test(function () {
+ var instance = document.createElement('my-custom-element-throw-exception');
+ document.body.appendChild(instance);
var calls = [];
- class MyCustomElement extends contentWindow.HTMLElement {
+ class MyCustomElement extends HTMLElement {
constructor() {
super();
calls.push(this);
@@ -170,13 +172,13 @@ test_with_window(function (contentWindow) {
}
var uncaughtError;
- contentWindow.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
- contentWindow.customElements.define('my-custom-element', MyCustomElement);
+ window.onerror = function (message, url, lineNumber, columnNumber, error) { uncaughtError = error; return true; }
+ customElements.define('my-custom-element-throw-exception', MyCustomElement);
assert_equals(uncaughtError, 'bad');
assert_array_equals(calls, [instance]);
- contentDocument.body.removeChild(instance);
- contentDocument.body.appendChild(instance);
+ document.body.removeChild(instance);
+ document.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');
diff --git a/tests/wpt/web-platform-tests/docs/.ruby-version b/tests/wpt/web-platform-tests/docs/.ruby-version
index bed811b08e2..262714f1d7b 100644
--- a/tests/wpt/web-platform-tests/docs/.ruby-version
+++ b/tests/wpt/web-platform-tests/docs/.ruby-version
@@ -1 +1 @@
-ruby-2.3.3
+ruby-2.4.0
diff --git a/tests/wpt/web-platform-tests/docs/OWNERS b/tests/wpt/web-platform-tests/docs/OWNERS
index 20ea37eae2d..8b80152b3e8 100644
--- a/tests/wpt/web-platform-tests/docs/OWNERS
+++ b/tests/wpt/web-platform-tests/docs/OWNERS
@@ -1,4 +1,3 @@
@sideshowbarker
@dontcallmedom
-@zcorpan
@gsnedders
diff --git a/tests/wpt/web-platform-tests/docs/_running-tests/index.md b/tests/wpt/web-platform-tests/docs/_running-tests/index.md
index 661ada14e37..4cd6c73585d 100644
--- a/tests/wpt/web-platform-tests/docs/_running-tests/index.md
+++ b/tests/wpt/web-platform-tests/docs/_running-tests/index.md
@@ -7,7 +7,28 @@ in a browser window. For running larger groups of tests, or running
tests frequently, this is not a practical approach and several better
options exist.
+## From the Command Line
+
+The simplest way to run tests is to use the `wpt run` command from the
+root of the repository. This will automatically load the tests in the
+chosen browser, and extract the test results. For example to run the
+`dom/historical.html` tests in a local copy of Chrome:
+
+ ./wpt run chrome dom/historical.html
+
+Or to run in a specified copy of Firefox:
+
+ ./wpt run --binary ~/local/firefox/firefox firefox dom/historical.html
+
+On Windows `edge` is also supported, and if you have a sauce labs
+account, any browser can be run using product `sauce`. For details on
+how to pass information to sauce, including credentials see `./wpt run
+--help`. That also details a large number of other options for
+customising the test run.
+
+
## From Inside a Browser
+Tests that have been merged on GitHub are mirrored at [http://w3c-test.org/].
For running multiple tests inside a browser, there is a test runner
located at `/tools/runner/index.html`.
@@ -24,27 +45,13 @@ more than one reference involved.
Because it runs entirely in-browser, this runner cannot deal with
edge-cases like tests that cause the browser to crash or hang.
-## By Automating the Browser
-
-For automated test running designed to be robust enough to use in a CI
-environment, the [wptrunner](https://github.com/w3c/wptrunner) test runner
-can be used. This is a test runner written in Python and designed to
-control the browser from the outside using some remote control
-protocol such as WebDriver. This allows it to handle cases such as the
-browser crashing that cannot be handled by an in-browser harness. It
-also has the ability to automatically run both testharness-based tests
-and reftests.
-
-Full instructions for using wptrunner are provided in its own
-[documentation](https://wptrunner.readthedocs.org).
-
## Writing Your Own Runner
Most test runners have two stages: finding all tests, followed by
executing them (or a subset thereof).
To find all tests in the repository, it is **strongly** recommended to
-use the included `manifest` tool: the required behaviors are more
+use the included `wpt manifest` tool: the required behaviors are more
complex than what are documented (especially when it comes to
precedence of the various possibilities and some undocumented legacy
ways to define test types), and hence its behavior should be
diff --git a/tests/wpt/web-platform-tests/docs/_writing-tests/ahem.md b/tests/wpt/web-platform-tests/docs/_writing-tests/ahem.md
index 58e527c170c..f0980a82b1e 100644
--- a/tests/wpt/web-platform-tests/docs/_writing-tests/ahem.md
+++ b/tests/wpt/web-platform-tests/docs/_writing-tests/ahem.md
@@ -86,4 +86,4 @@ On Linux, copy the file to `~/.local/share/fonts` and then run
`fc-cache`.
[ahem-readme]: https://www.w3.org/Style/CSS/Test/Fonts/Ahem/README
-[download-ahem]: https://www.w3.org/Style/CSS/Test/Fonts/Ahem/AHEM____.TTF
+[download-ahem]: https://github.com/w3c/web-platform-tests/raw/master/fonts/Ahem.ttf
diff --git a/tests/wpt/web-platform-tests/docs/_writing-tests/file-names.md b/tests/wpt/web-platform-tests/docs/_writing-tests/file-names.md
new file mode 100644
index 00000000000..065be4e9f02
--- /dev/null
+++ b/tests/wpt/web-platform-tests/docs/_writing-tests/file-names.md
@@ -0,0 +1,65 @@
+---
+layout: page
+title: File Name Flags
+order: 2
+---
+
+The test filename is significant in determining the type of test it
+contains, and enabling specific optional features. This page documents
+the various flags available and their meaning.
+
+
+### Test Type
+
+These flags must be the last element in the filename before the
+extension e.g. `foo-manual.html` will indicate a manual test, but
+`foo-manual-other.html` will not. Unlike test features, test types
+are mutually exclusive.
+
+
+`-manual`
+ : Indicates that a test is a non-automated test.
+
+`-support`
+ : Indicates that a file is not a test but a support file. Not
+ required for files in a directory called `resources`, `tools` or
+ `support`.
+
+`-visual`
+ : Indicates that a file is a visual test.
+
+
+### Test Features
+
+These flags are preceded by a `.` in the filename, and must
+themselves precede any test type flag, but are otherwise unordered.
+
+
+`.https`
+ : Indicates that a test is loaded over HTTPS.
+
+`.sub`
+ : Indicates that a test uses the [server-side substitution][]
+ feature.
+
+`.window`
+ : (js files only) Indicates that the file generates a test in which
+ it is run in a Window environment.
+
+`.worker`
+ : (js files only) Indicates that the file generates a test in which
+ it is run in a dedicated worker environment.
+
+`.any`
+ : (js files only) Indicates that the file generates tests in which it
+ is run in Window and dedicated worker environments.
+
+`.tentative`
+ : Indicates that a test makes assertions not yet required by any specification,
+ or in contradiction to some specification. This is useful when implementation
+ experience is needed to inform the specification. It should be apparent in
+ context why the test is tentative and what needs to be resolved to make it
+ non-tentative.
+
+
+[server-side substitution]: https://wptserve.readthedocs.io/en/latest/pipes.html#sub
diff --git a/tests/wpt/web-platform-tests/docs/_writing-tests/general-guidelines.md b/tests/wpt/web-platform-tests/docs/_writing-tests/general-guidelines.md
index fdcb5d3a491..a07d55b9e1b 100644
--- a/tests/wpt/web-platform-tests/docs/_writing-tests/general-guidelines.md
+++ b/tests/wpt/web-platform-tests/docs/_writing-tests/general-guidelines.md
@@ -25,14 +25,24 @@ integer that follows is normally just increased incrementally, and
padded to three digits. (If you'd end up with more than 999 tests,
your `test-topic` is probably too broad!)
-In csswg-test, the file names should be unique within the repository,
-regardless of where they are in the directory structure.
+The test filename is significant in enabling specific optional features, such as HTTPS
+or server-side substitution. See the documentation on [file names flags][file-name-flags]
+for more details.
+In the css directory, the file names should be unique within the whole
+css/ directory, regardless of where they are in the directory structure.
+
+### HTTPS
+
+By default, tests are served over plain HTTP. If a test requires HTTPS
+it must be given a filename containing `.https` before the extension,
+e.g. `test-secure.https.html`. For more details see the documentation
+on [file names][file-name-flags].
#### Support Files
Various support files are available in in the `/common/` and `/media/`
-directories (web-platform-tests) and `/support/` (csswg-test). Reusing
+directories (web-platform-tests) and `/support/` (in css/). Reusing
existing resources is encouraged where possible, as is adding
generally useful files to these common areas rather than to specific
testsuites.
@@ -138,17 +148,16 @@ not uniformly enforced throughout the existing tests, but will be for
new tests. Any of these rules may be broken if the test demands it:
* No trailing whitespace
-
* Use spaces rather than tabs for indentation
-
- * Use UNIX-style line endings (i.e. no CR characters at EOL).
+ * Use UNIX-style line endings (i.e. no CR characters at EOL)
We have a lint tool for catching these and other common mistakes. You
-can run it manually by starting the `lint` executable from the root of
-your local web-platform-tests working directory like this:
+can run it manually by starting the `wpt` executable from the root of
+your local web-platform-tests working directory, and invoking the
+`lint` subcommand, like this:
```
-./lint
+./wpt lint
```
The lint tool is also run automatically for every submitted pull request,
@@ -178,3 +187,4 @@ for CSS have some additional requirements for:
[lint-tool]: {{ site.baseurl }}{% link _writing-tests/lint-tool.md %}
[css-metadata]: {{ site.baseurl }}{% link _writing-tests/css-metadata.md %}
[css-user-styles]: {{ site.baseurl }}{% link _writing-tests/css-user-styles.md %}
+[file-name-flags]: {{ site.baseurl }}{% link _writing-tests/file-names.md %}
diff --git a/tests/wpt/web-platform-tests/docs/_writing-tests/idlharness.md b/tests/wpt/web-platform-tests/docs/_writing-tests/idlharness.md
index 76c121953c0..dfa46d3efdf 100644
--- a/tests/wpt/web-platform-tests/docs/_writing-tests/idlharness.md
+++ b/tests/wpt/web-platform-tests/docs/_writing-tests/idlharness.md
@@ -26,7 +26,11 @@ var s = "";
//https://www.w3.org/Bugs/Public/show_bug.cgi?id=14914
if (!idl.classList.contains("extract"))
{
- s += idl.textContent + "\n\n";
+ if (s !== "")
+ {
+ s += "\n\n";
+ }
+ s += idl.textContent.replace(/ +$/mg, "");
}
});
document.body.innerHTML = '<pre></pre>';
diff --git a/tests/wpt/web-platform-tests/docs/_writing-tests/lint-tool.md b/tests/wpt/web-platform-tests/docs/_writing-tests/lint-tool.md
index 210b4bd6cd3..c5369755fbc 100644
--- a/tests/wpt/web-platform-tests/docs/_writing-tests/lint-tool.md
+++ b/tests/wpt/web-platform-tests/docs/_writing-tests/lint-tool.md
@@ -4,11 +4,11 @@ title: Lint Tool
order: 9
---
We have a lint tool for catching common mistakes in test files. You can run
-it manually by starting the `lint` executable from the root of your local
+it manually by running the `wpt lint` command from the root of your local
web-platform-tests working directory like this:
```
-./lint
+./wpt lint
```
The lint tool is also run automatically for every submitted pull request,
@@ -37,6 +37,9 @@ below to fix all errors reported.
`<script src='/resources/testharnessreport.js'>` prior to
`<script src='/resources/testharness.js'>`; **fix**: flip the order.
+* **GENERATE_TESTS**: Test file line has a generate_tests call; **fix**: remove
+ the call and call `test()` a number of times instead.
+
* **INDENT TABS**: Test-file line starts with one or more tab characters;
**fix**: use spaces to replace any tab characters at beginning of lines.
@@ -48,6 +51,9 @@ below to fix all errors reported.
`<script src='/resources/testharnessreport.js'>` element ; **fix**: move
the `<meta name="timeout"...>` element to precede the `script` element.
+* **LAYOUTTESTS APIS**: Test file uses `eventSender`, `testRunner`, or
+ `window.internals` which are LayoutTests-specific APIs used in WebKit/Blink.
+
* **MALFORMED-VARIANT**: Test file with a `<meta name='variant'...>`
element whose `content` attribute has a malformed value; **fix**: ensure
the value of the `content` attribute starts with `?` or `#` or is empty.
diff --git a/tests/wpt/web-platform-tests/docs/_writing-tests/server-features.md b/tests/wpt/web-platform-tests/docs/_writing-tests/server-features.md
index 02558d77a92..b8f50ab2e4f 100644
--- a/tests/wpt/web-platform-tests/docs/_writing-tests/server-features.md
+++ b/tests/wpt/web-platform-tests/docs/_writing-tests/server-features.md
@@ -8,7 +8,7 @@ order: 12
Certain test scenarios require more than just static HTML
generation. This is supported through the
-[wptserve](https://github.com/w3c/wptserve) server. Several scenarios
+[wptserve](http://wptserve.readthedocs.io) server. Several scenarios
in particular are common:
diff --git a/tests/wpt/web-platform-tests/docs/_writing-tests/testharness-api.md b/tests/wpt/web-platform-tests/docs/_writing-tests/testharness-api.md
index d091d148e6a..d750086c6a3 100644
--- a/tests/wpt/web-platform-tests/docs/_writing-tests/testharness-api.md
+++ b/tests/wpt/web-platform-tests/docs/_writing-tests/testharness-api.md
@@ -261,7 +261,7 @@ tests".
In order for a test to be interpreted as a single page test, then
it must simply not call `test()` or `async_test()` anywhere on the page, and
must call the `done()` function to indicate that the test is complete. All
-the `assert_*` functions are avaliable as normal, but are called without
+the `assert_*` functions are available as normal, but are called without
the normal step function wrapper. For example:
```html
@@ -281,7 +281,7 @@ The test title for single page tests is always taken from `document.title`.
## Making assertions ##
Functions for making assertions start `assert_`. The full list of
-asserts avaliable is documented in the [asserts](#list-of-assertions) section
+asserts available is documented in the [asserts](#list-of-assertions) section
below. The general signature is:
```js
@@ -428,7 +428,7 @@ event in a document. Therefore these worker tests always behave as if the
event which is fired following the completion of [running the
worker](https://html.spec.whatwg.org/multipage/workers.html#run-a-worker).
-## Generating tests ##
+## **DEPRECATED** Generating tests ##
There are scenarios in which is is desirable to create a large number of
(synchronous) tests that are internally similar but vary in the parameters
@@ -451,8 +451,14 @@ generate_tests(assert_equals, [
Is equivalent to:
```js
-test(function() {assert_equals(1+1, 2)}, "Sum one and one")
-test(function() {assert_equals(1+0, 1)}, "Sum one and zero")
+var a_got = 1+1;
+var a_exp = 2;
+var a_nam = "Sum one and one";
+var b_got = 1+0;
+var b_exp = 1;
+var b_nam = "Sum one and zero";
+test(function() {assert_equals(a_got, a_exp)}, a_nam);
+test(function() {assert_equals(b_got, b_exp)}, b_nam);
```
Note that the first item in each parameter list corresponds to the name of
@@ -461,6 +467,11 @@ the test.
The properties argument is identical to that for `test()`. This may be a
single object (used for all generated tests) or an array.
+This is deprecated because it runs all the tests outside of the test functions
+and as a result any test throwing an exception will result in no tests being
+run. In almost all cases, you should simply call test within the loop you would
+use to generate the parameter list array.
+
## Callback API ##
The framework provides callbacks corresponding to 4 events:
@@ -594,7 +605,7 @@ workers](https://slightlyoff.github.io/ServiceWorker/spec/service_worker/).
Testing from a worker script is different from testing from an HTML document in
several ways:
-* Workers have no reporting capability since they are runing in the background.
+* Workers have no reporting capability since they are running in the background.
Hence they rely on `testharness.js` running in a companion client HTML document
for reporting.
@@ -683,6 +694,11 @@ asserts that `actual` and `expected` have the same
length and the value of each indexed property in `actual` is the strictly equal
to the corresponding property value in `expected`
+### `assert_array_approx_equals(actual, expected, epsilon, description)`
+asserts that `actual` and `expected` have the same
+length and each indexed property in `actual` is a number
+within ±`epsilon` of the corresponding property in `expected`
+
### `assert_approx_equals(actual, expected, epsilon, description)`
asserts that `actual` is a number within ±`epsilon` of `expected`
diff --git a/tests/wpt/web-platform-tests/docs/introduction.md b/tests/wpt/web-platform-tests/docs/introduction.md
index 2845b7d0f98..94156f77d97 100644
--- a/tests/wpt/web-platform-tests/docs/introduction.md
+++ b/tests/wpt/web-platform-tests/docs/introduction.md
@@ -74,7 +74,7 @@ The testsuite has a few types of tests, outlined below:
## GitHub
-GitHub is used both for issue tracking and test submissions; we
+[GitHub](https://github.com/w3c/web-platform-tests/) is used both for [issue tracking](https://github.com/w3c/web-platform-tests/issues) and [test submissions](https://github.com/w3c/web-platform-tests/pulls); we
provide [a limited introduction][github-intro] to both git and
GitHub.
diff --git a/tests/wpt/web-platform-tests/dom/OWNERS b/tests/wpt/web-platform-tests/dom/OWNERS
index 7b9191bbd82..487f8ddbc0e 100644
--- a/tests/wpt/web-platform-tests/dom/OWNERS
+++ b/tests/wpt/web-platform-tests/dom/OWNERS
@@ -1,4 +1,3 @@
@ayg
@jdm
-@zcorpan
@zqzhang
diff --git a/tests/wpt/web-platform-tests/dom/abort/event.any.js b/tests/wpt/web-platform-tests/dom/abort/event.any.js
new file mode 100644
index 00000000000..3b25702c2e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/abort/event.any.js
@@ -0,0 +1,22 @@
+test(t => {
+ const c = new AbortController(),
+ s = c.signal;
+ let state = "begin";
+
+ assert_false(s.aborted);
+
+ s.addEventListener("abort",
+ t.step_func(e => {
+ assert_equals(state, "begin");
+ state = "aborted";
+ })
+ );
+ c.abort();
+
+ assert_equals(state, "aborted");
+ assert_true(s.aborted);
+
+ c.abort();
+}, "AbortController() basics");
+
+done();
diff --git a/tests/wpt/web-platform-tests/dom/events/Event-timestamp-high-resolution.html b/tests/wpt/web-platform-tests/dom/events/Event-timestamp-high-resolution.html
new file mode 100644
index 00000000000..15aa014cfb7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/events/Event-timestamp-high-resolution.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script type="text/javascript">
+'use strict';
+for (let eventType of [MouseEvent, KeyboardEvent, WheelEvent, GamepadEvent, FocusEvent]) {
+ test(function() {
+ let before = performance.now();
+ let e = new eventType('test');
+ let after = performance.now();
+ assert_greater_than_equal(e.timeStamp, before, "Event timestamp should be greater than performance.now() timestamp taken before its creation");
+ assert_less_than_equal(e.timeStamp, after, "Event timestamp should be less than performance.now() timestamp taken after its creation");
+ }, `Constructed ${eventType.prototype.constructor.name} timestamp should be high resolution and have the same time origin as performance.now()`);
+}
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/dom/events/Event-timestamp-safe-resolution.html b/tests/wpt/web-platform-tests/dom/events/Event-timestamp-safe-resolution.html
new file mode 100644
index 00000000000..5009c8a4ec0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/events/Event-timestamp-safe-resolution.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script type="text/javascript">
+'use strict';
+
+// Computes greatest common divisor of a and b using Euclid's algorithm
+function computeGCD(a, b) {
+ if (!Number.isInteger(a) || !Number.isInteger(b)) {
+ throw new Error('Parameters must be integer numbers');
+ }
+
+ var r;
+ while (b != 0) {
+ r = a % b;
+ a = b;
+ b = r;
+ }
+ return (a < 0) ? -a : a;
+}
+
+// Finds minimum resolution Δ given a set of samples which are known to be in the form of N*Δ.
+// We use GCD of all samples as a simple estimator.
+function estimateMinimumResolution(samples) {
+ var gcd;
+ for (const sample of samples) {
+ gcd = gcd ? computeGCD(gcd, sample) : sample;
+ }
+
+ return gcd;
+}
+
+test(function() {
+ const samples = [];
+ for (var i = 0; i < 1e3; i++) {
+ var deltaInMicroSeconds = 0;
+ const e1 = new MouseEvent('test1');
+ do {
+ const e2 = new MouseEvent('test2');
+ deltaInMicroSeconds = Math.round((e2.timeStamp - e1.timeStamp) * 1000);
+ } while (deltaInMicroSeconds == 0) // only collect non-zero samples
+
+ samples.push(deltaInMicroSeconds);
+ }
+
+ const minResolution = estimateMinimumResolution(samples);
+ assert_greater_than_equal(minResolution, 5);
+}, 'Event timestamp should not have a resolution better that 5 microseconds');
+</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/dom/events/EventTarget-constructible.any.js b/tests/wpt/web-platform-tests/dom/events/EventTarget-constructible.any.js
new file mode 100644
index 00000000000..b0e7614e625
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/events/EventTarget-constructible.any.js
@@ -0,0 +1,62 @@
+"use strict";
+
+test(() => {
+ const target = new EventTarget();
+ const event = new Event("foo", { bubbles: true, cancelable: false });
+ let callCount = 0;
+
+ function listener(e) {
+ assert_equals(e, event);
+ ++callCount;
+ }
+
+ target.addEventListener("foo", listener);
+
+ target.dispatchEvent(event);
+ assert_equals(callCount, 1);
+
+ target.dispatchEvent(event);
+ assert_equals(callCount, 2);
+
+ target.removeEventListener("foo", listener);
+ target.dispatchEvent(event);
+ assert_equals(callCount, 2);
+}, "A constructed EventTarget can be used as expected");
+
+test(() => {
+ class NicerEventTarget extends EventTarget {
+ on(...args) {
+ this.addEventListener(...args);
+ }
+
+ off(...args) {
+ this.removeEventListener(...args);
+ }
+
+ dispatch(type, detail) {
+ this.dispatchEvent(new CustomEvent(type, { detail }));
+ }
+ }
+
+ const target = new NicerEventTarget();
+ const event = new Event("foo", { bubbles: true, cancelable: false });
+ const detail = "some data";
+ let callCount = 0;
+
+ function listener(e) {
+ assert_equals(e.detail, detail);
+ ++callCount;
+ }
+
+ target.on("foo", listener);
+
+ target.dispatch("foo", detail);
+ assert_equals(callCount, 1);
+
+ target.dispatch("foo", detail);
+ assert_equals(callCount, 2);
+
+ target.off("foo", listener);
+ target.dispatch("foo", detail);
+ assert_equals(callCount, 2);
+}, "EventTarget can be subclassed");
diff --git a/tests/wpt/web-platform-tests/dom/interface-objects.html b/tests/wpt/web-platform-tests/dom/interface-objects.html
index df4ca51e477..936d63517ea 100644
--- a/tests/wpt/web-platform-tests/dom/interface-objects.html
+++ b/tests/wpt/web-platform-tests/dom/interface-objects.html
@@ -15,6 +15,8 @@ var interfaces = [
"Event",
"CustomEvent",
"EventTarget",
+ "AbortController",
+ "AbortSignal",
"Node",
"Document",
"DOMImplementation",
diff --git a/tests/wpt/web-platform-tests/dom/interfaces.html b/tests/wpt/web-platform-tests/dom/interfaces.html
index e6b12e3cbd4..8e9572d0f09 100644
--- a/tests/wpt/web-platform-tests/dom/interfaces.html
+++ b/tests/wpt/web-platform-tests/dom/interfaces.html
@@ -21,8 +21,11 @@ var idlArray = new IdlArray();
function doTest(idl) {
idlArray.add_idls(idl);
idlArray.add_objects({
+ EventTarget: ['new EventTarget()'],
Event: ['document.createEvent("Event")', 'new Event("foo")'],
CustomEvent: ['new CustomEvent("foo")'],
+ AbortController: ['new AbortController()'],
+ AbortSignal: ['new AbortController().signal'],
Document: ['new Document()'],
XMLDocument: ['xmlDoc'],
DOMImplementation: ['document.implementation'],
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 60a24388e2f..72519dd38d9 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createDocument.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createDocument.html
@@ -131,6 +131,7 @@ test(function() {
if (expected === null) {
test(function() {
var doc = document.implementation.createDocument(namespace, qualifiedName, doctype)
+ assert_equals(doc.location, null)
assert_equals(doc.compatMode, "CSS1Compat")
assert_equals(doc.characterSet, "UTF-8")
assert_equals(doc.contentType, namespace == htmlNamespace ? "application/xhtml+xml"
diff --git a/tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createHTMLDocument.html b/tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createHTMLDocument.html
index 57f475c9c5f..c6e0beaf75f 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createHTMLDocument.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/DOMImplementation-createHTMLDocument.html
@@ -87,4 +87,10 @@ test(function() {
a.href = "http://example.org/?\u00E4";
assert_equals(a.href, "http://example.org/?%C3%A4");
}, "createHTMLDocument(): URL parsing")
+
+// Test the document location getter is null outside of browser context
+test(function() {
+ var doc = document.implementation.createHTMLDocument();
+ assert_equals(doc.location, null);
+}, "createHTMLDocument(): document location getter is null")
</script>
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Document-constructor.html b/tests/wpt/web-platform-tests/dom/nodes/Document-constructor.html
index 3ebc780e327..2f26982c965 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Document-constructor.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Document-constructor.html
@@ -28,6 +28,7 @@ test(function() {
test(function() {
var doc = new Document();
+ assert_equals(doc.location, null);
assert_equals(doc.URL, "about:blank");
assert_equals(doc.documentURI, "about:blank");
assert_equals(doc.compatMode, "CSS1Compat");
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html b/tests/wpt/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html
deleted file mode 100644
index 79c63644d84..00000000000
--- a/tests/wpt/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_01.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<title>Data URI document.contentType === 'text/plain' when data URI MIME type is not set</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id=log></div>
-<script>
-async_test(function() {
- var iframe = document.createElement('iframe');
- iframe.addEventListener('load', this.step_func_done(function() {
- assert_equals(iframe.contentDocument.contentType, "text/plain");
- }), false);
- iframe.src = "data:;,<!DOCTYPE html>";
- document.body.appendChild(iframe);
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_02.html b/tests/wpt/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_02.html
index 2e82c7c1faa..c124cb39798 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_02.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Document-contentType/contentType/contenttype_datauri_02.html
@@ -6,10 +6,10 @@
<script>
async_test(function() {
var iframe = document.createElement('iframe');
- iframe.addEventListener('load', this.step_func_done(function() {
- assert_equals(iframe.contentDocument.contentType, "text/html");
- }), false);
- iframe.src = "data:text/html;charset=utf-8,<!DOCTYPE html>";
+ self.onmessage = this.step_func_done(e => {
+ assert_equals(e.data, "text/html");
+ });
+ iframe.src = "data:text/html;charset=utf-8,<!DOCTYPE html><script>parent.postMessage(document.contentType,'*')<\/script>";
document.body.appendChild(iframe);
});
</script>
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 93b5ec4efef..8108f20f659 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.html
@@ -71,6 +71,7 @@ test(function() {
* interfaces that it is known some UA does or did not throw for.
*/
var someNonCreateableEvents = [
+ "AnimationEvent",
"AnimationPlaybackEvent",
"AnimationPlayerEvent",
"ApplicationCacheErrorEvent",
@@ -79,14 +80,17 @@ var someNonCreateableEvents = [
"BeforeInstallPromptEvent",
"BlobEvent",
"ClipboardEvent",
+ "CloseEvent",
"CommandEvent",
"DataContainerEvent",
+ "ErrorEvent",
"ExtendableEvent",
"ExtendableMessageEvent",
"FetchEvent",
"FontFaceSetLoadEvent",
"GamepadEvent",
"GeofencingEvent",
+ "IDBVersionChangeEvent",
"InstallEvent",
"KeyEvent",
"MIDIConnectionEvent",
@@ -104,7 +108,9 @@ var someNonCreateableEvents = [
"OfflineAudioCompletionEvent",
"OrientationEvent",
"PageTransition", // Yes, with no "Event"
+ "PageTransitionEvent",
"PointerEvent",
+ "PopStateEvent",
"PopUpEvent",
"PresentationConnectionAvailableEvent",
"PresentationConnectionCloseEvent",
@@ -128,8 +134,12 @@ var someNonCreateableEvents = [
"SpeechSynthesisEvent",
"SyncEvent",
"TimeEvent",
+ "TrackEvent",
+ "TransitionEvent",
+ "WebGLContextEvent",
"WebKitAnimationEvent",
"WebKitTransitionEvent",
+ "WheelEvent",
"XULCommandEvent",
];
someNonCreateableEvents.forEach(function (eventInterface) {
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 481ccf93b92..9e614ab16b8 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.js
+++ b/tests/wpt/web-platform-tests/dom/nodes/Document-createEvent.js
@@ -1,33 +1,23 @@
var aliases = {
- "AnimationEvent": "AnimationEvent",
"BeforeUnloadEvent": "BeforeUnloadEvent",
- "CloseEvent": "CloseEvent",
"CompositionEvent": "CompositionEvent",
"CustomEvent": "CustomEvent",
"DeviceMotionEvent": "DeviceMotionEvent",
"DeviceOrientationEvent": "DeviceOrientationEvent",
"DragEvent": "DragEvent",
- "ErrorEvent": "ErrorEvent",
"Event": "Event",
"Events": "Event",
"FocusEvent": "FocusEvent",
"HashChangeEvent": "HashChangeEvent",
"HTMLEvents": "Event",
- "IDBVersionChangeEvent": "IDBVersionChangeEvent",
"KeyboardEvent": "KeyboardEvent",
"MessageEvent": "MessageEvent",
"MouseEvent": "MouseEvent",
"MouseEvents": "MouseEvent",
- "PageTransitionEvent": "PageTransitionEvent",
- "PopStateEvent": "PopStateEvent",
"StorageEvent": "StorageEvent",
"SVGEvents": "Event",
"TextEvent": "CompositionEvent",
"TouchEvent": "TouchEvent",
- "TrackEvent": "TrackEvent",
- "TransitionEvent": "TransitionEvent",
"UIEvent": "UIEvent",
"UIEvents": "UIEvent",
- "WebGLContextEvent": "WebGLContextEvent",
- "WheelEvent": "WheelEvent",
};
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Element-classlist.html b/tests/wpt/web-platform-tests/dom/nodes/Element-classlist.html
index ece938e6f90..bc28b1c6678 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Element-classlist.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Element-classlist.html
@@ -199,15 +199,22 @@ function testClassList(e, desc) {
// add() method
- function checkAdd(before, argument, after, expectedException) {
+ function checkAdd(before, argument, after, param) {
+ var expectedException = undefined;
+ var noop = false;
+ if (param == "noop") {
+ noop = true;
+ } else {
+ expectedException = param;
+ }
checkModification(e, "add", argument, undefined, before, after,
expectedException, desc);
- // Also check force toggle
- // XXX https://github.com/whatwg/dom/issues/443
- //if (!Array.isArray(argument)) {
- // checkModification(e, "toggle", [argument, true], true, before, after,
- // expectedException);
- //}
+ // Also check force toggle. The only difference is that it doesn't run the
+ // update steps for a no-op.
+ if (!Array.isArray(argument)) {
+ checkModification(e, "toggle", [argument, true], true, before,
+ noop ? before : after, expectedException, desc);
+ }
}
checkAdd(null, "", null, "SyntaxError");
@@ -229,7 +236,7 @@ function testClassList(e, desc) {
checkAdd("a", "a", "a");
checkAdd("aa", "AA", "aa AA");
checkAdd("a b c", "a", "a b c");
- checkAdd("a a a b", "a", "a b");
+ checkAdd("a a a b", "a", "a b", "noop");
checkAdd(null, "a", "a");
checkAdd("", "a", "a");
checkAdd(" ", "a", "a");
@@ -238,7 +245,7 @@ function testClassList(e, desc) {
checkAdd("a b c", "d", "a b c d");
checkAdd("a b c ", "d", "a b c d");
checkAdd(" a a b", "c", "a b c");
- checkAdd(" a a b", "a", "a b");
+ checkAdd(" a a b", "a", "a b", "noop");
checkAdd("\t\n\f\r a\t\n\f\r b\t\n\f\r ", "c", "a b c");
// multiple add
@@ -254,15 +261,22 @@ function testClassList(e, desc) {
// remove() method
- function checkRemove(before, argument, after, expectedException) {
+ function checkRemove(before, argument, after, param) {
+ var expectedException = undefined;
+ var noop = false;
+ if (param == "noop") {
+ noop = true;
+ } else {
+ expectedException = param;
+ }
checkModification(e, "remove", argument, undefined, before, after,
expectedException, desc);
- // Also check force toggle
- // XXX https://github.com/whatwg/dom/issues/443
- //if (!Array.isArray(argument)) {
- // checkModification(e, "toggle", [argument, false], false, before, after,
- // expectedException);
- //}
+ // Also check force toggle. The only difference is that it doesn't run the
+ // update steps for a no-op.
+ if (!Array.isArray(argument)) {
+ checkModification(e, "toggle", [argument, false], false, before,
+ noop ? before : after, expectedException, desc);
+ }
}
checkRemove(null, "", null, "SyntaxError");
@@ -281,8 +295,8 @@ function testClassList(e, desc) {
checkRemove(null, "a", null);
checkRemove("", "a", "");
- checkRemove("a b c", "d", "a b c");
- checkRemove("a b c", "A", "a b c");
+ checkRemove("a b c", "d", "a b c", "noop");
+ checkRemove("a b c", "A", "a b c", "noop");
checkRemove(" a a a ", "a", "");
checkRemove("a b", "a", "b");
checkRemove("a b ", "a", "b");
@@ -355,24 +369,6 @@ function testClassList(e, desc) {
checkToggle("", undefined, true, "undefined");
- // tests for the force argument handling
- // XXX Remove these if https://github.com/whatwg/dom/issues/443 is fixed
-
- function checkForceToggle(before, argument, force, expectedRes, after, expectedException) {
- checkModification(e, "toggle", [argument, force], expectedRes, before,
- after, expectedException, desc);
- }
-
- checkForceToggle("", "a", true, true, "a");
- checkForceToggle("a", "a", true, true, "a");
- checkForceToggle("a", "b", true, true, "a b");
- checkForceToggle("a b", "b", true, true, "a b");
- checkForceToggle("", "a", false, false, "");
- checkForceToggle("a", "a", false, false, "");
- checkForceToggle("a", "b", false, false, "a");
- checkForceToggle("a b", "b", false, false, "a");
-
-
// replace() method
function checkReplace(before, token, newToken, after, expectedException) {
checkModification(e, "replace", [token, newToken], undefined, before,
@@ -420,9 +416,6 @@ function testClassList(e, desc) {
checkReplace(" ", "a", "b", " ");
checkReplace(" a \f", "a", "b", "b");
checkReplace("a b c", "b", "d", "a d c");
- // https://github.com/whatwg/dom/issues/442
- // Implementations agree on the first one here, so I test it, but disagree on
- // the second, so no test until the spec decides what to say.
checkReplace("a b c", "c", "a", "a b");
checkReplace("c b a", "c", "a", "a b");
checkReplace("a b a", "a", "c", "c b");
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Element-matches-init.js b/tests/wpt/web-platform-tests/dom/nodes/Element-matches-init.js
new file mode 100644
index 00000000000..254af615655
--- /dev/null
+++ b/tests/wpt/web-platform-tests/dom/nodes/Element-matches-init.js
@@ -0,0 +1,65 @@
+function init(e, method) {
+ /*
+ * This test suite tests Selectors API methods in 4 different contexts:
+ * 1. Document node
+ * 2. In-document Element node
+ * 3. Detached Element node (an element with no parent, not in the document)
+ * 4. Document Fragment node
+ *
+ * For each context, the following tests are run:
+ *
+ * The interface check tests ensure that each type of node exposes the Selectors API methods.
+ *
+ * The matches() tests are run
+ * All the selectors tested for both the valid and invalid selector tests are found in selectors.js.
+ * See comments in that file for documentation of the format used.
+ *
+ * The level2-lib.js file contains all the common test functions for running each of the aforementioned tests
+ */
+
+ var docType = "html"; // Only run tests suitable for HTML
+
+ // Prepare the nodes for testing
+ var doc = e.target.contentDocument; // Document Node tests
+
+ var element = doc.getElementById("root"); // In-document Element Node tests
+
+ //Setup the namespace tests
+ setupSpecialElements(doc, element);
+
+ var outOfScope = element.cloneNode(true); // Append this to the body before running the in-document
+ // Element tests, but after running the Document tests. This
+ // tests that no elements that are not descendants of element
+ // are selected.
+
+ traverse(outOfScope, function(elem) { // Annotate each element as being a clone; used for verifying
+ elem.setAttribute("data-clone", ""); // that none of these elements ever match.
+ });
+
+
+ var detached = element.cloneNode(true); // Detached Element Node tests
+
+ var fragment = doc.createDocumentFragment(); // Fragment Node tests
+ fragment.appendChild(element.cloneNode(true));
+
+ // Setup Tests
+ interfaceCheckMatches(method, "Document", doc);
+ interfaceCheckMatches(method, "Detached Element", detached);
+ interfaceCheckMatches(method, "Fragment", fragment);
+ interfaceCheckMatches(method, "In-document Element", element);
+
+ runSpecialMatchesTests(method, "DIV Element", element);
+ runSpecialMatchesTests(method, "NULL Element", document.createElement("null"));
+ runSpecialMatchesTests(method, "UNDEFINED Element", document.createElement("undefined"));
+
+ runInvalidSelectorTestMatches(method, "Document", doc, invalidSelectors);
+ runInvalidSelectorTestMatches(method, "Detached Element", detached, invalidSelectors);
+ runInvalidSelectorTestMatches(method, "Fragment", fragment, invalidSelectors);
+ runInvalidSelectorTestMatches(method, "In-document Element", element, invalidSelectors);
+
+ runMatchesTest(method, "In-document", doc, validSelectors, "html");
+ runMatchesTest(method, "Detached", detached, validSelectors, "html");
+ runMatchesTest(method, "Fragment", fragment, validSelectors, "html");
+
+ runMatchesTest(method, "In-document", doc, scopedSelectors, "html");
+}
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Element-matches.html b/tests/wpt/web-platform-tests/dom/nodes/Element-matches.html
index b5d92748924..de234b66390 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Element-matches.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Element-matches.html
@@ -7,83 +7,16 @@
<script src="/dom/nodes/selectors.js"></script>
<script src="/dom/nodes/ParentNode-querySelector-All.js"></script>
<script src="Element-matches.js"></script>
+<script src="Element-matches-init.js"></script>
<style>iframe { visibility: hidden; position: absolute; }</style>
<div id="log">This test requires JavaScript.</div>
<script>
-async_test(function() {
- var frame = document.createElement("iframe");
- frame.onload = this.step_func_done(init);
- frame.src = "/dom/nodes/ParentNode-querySelector-All-content.html#target";
- document.body.appendChild(frame);
-});
-
-function init(e) {
- /*
- * This test suite tests Selectors API methods in 4 different contexts:
- * 1. Document node
- * 2. In-document Element node
- * 3. Detached Element node (an element with no parent, not in the document)
- * 4. Document Fragment node
- *
- * For each context, the following tests are run:
- *
- * The interface check tests ensure that each type of node exposes the Selectors API methods.
- *
- * The matches() tests are run
- * All the selectors tested for both the valid and invalid selector tests are found in selectors.js.
- * See comments in that file for documentation of the format used.
- *
- * The level2-lib.js file contains all the common test functions for running each of the aforementioned tests
- */
-
- var method = "matches";
-
- var docType = "html"; // Only run tests suitable for HTML
-
- // Prepare the nodes for testing
- var doc = e.target.contentDocument; // Document Node tests
-
- var element = doc.getElementById("root"); // In-document Element Node tests
-
- //Setup the namespace tests
- setupSpecialElements(doc, element);
-
- var outOfScope = element.cloneNode(true); // Append this to the body before running the in-document
- // Element tests, but after running the Document tests. This
- // tests that no elements that are not descendants of element
- // are selected.
-
- traverse(outOfScope, function(elem) { // Annotate each element as being a clone; used for verifying
- elem.setAttribute("data-clone", ""); // that none of these elements ever match.
+ async_test(function() {
+ var frame = document.createElement("iframe");
+ frame.onload = this.step_func_done(e => init(e, "matches" ));
+ frame.src = "/dom/nodes/ParentNode-querySelector-All-content.html#target";
+ document.body.appendChild(frame);
});
-
-
- var detached = element.cloneNode(true); // Detached Element Node tests
-
- var fragment = doc.createDocumentFragment(); // Fragment Node tests
- fragment.appendChild(element.cloneNode(true));
-
- // Setup Tests
- interfaceCheckMatches(method, "Document", doc);
- interfaceCheckMatches(method, "Detached Element", detached);
- interfaceCheckMatches(method, "Fragment", fragment);
- interfaceCheckMatches(method, "In-document Element", element);
-
- runSpecialMatchesTests(method, "DIV Element", element);
- runSpecialMatchesTests(method, "NULL Element", document.createElement("null"));
- runSpecialMatchesTests(method, "UNDEFINED Element", document.createElement("undefined"));
-
- runInvalidSelectorTestMatches(method, "Document", doc, invalidSelectors);
- runInvalidSelectorTestMatches(method, "Detached Element", detached, invalidSelectors);
- runInvalidSelectorTestMatches(method, "Fragment", fragment, invalidSelectors);
- runInvalidSelectorTestMatches(method, "In-document Element", element, invalidSelectors);
-
- runMatchesTest(method, "In-document", doc, validSelectors, "html");
- runMatchesTest(method, "Detached", detached, validSelectors, "html");
- runMatchesTest(method, "Fragment", fragment, validSelectors, "html");
-
- runMatchesTest(method, "In-document", doc, scopedSelectors, "html");
-}
</script>
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Element-webkitMatchesSelector.html b/tests/wpt/web-platform-tests/dom/nodes/Element-webkitMatchesSelector.html
index d37d7235d2a..107f8102036 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Element-webkitMatchesSelector.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Element-webkitMatchesSelector.html
@@ -7,83 +7,16 @@
<script src="/dom/nodes/selectors.js"></script>
<script src="/dom/nodes/ParentNode-querySelector-All.js"></script>
<script src="Element-matches.js"></script>
+<script src="Element-matches-init.js"></script>
<style>iframe { visibility: hidden; position: absolute; }</style>
<div id="log">This test requires JavaScript.</div>
<script>
-async_test(function() {
- var frame = document.createElement("iframe");
- frame.onload = this.step_func_done(init);
- frame.src = "/dom/nodes/ParentNode-querySelector-All-content.html#target";
- document.body.appendChild(frame);
-});
-
-function init(e) {
- /*
- * This test suite tests Selectors API methods in 4 different contexts:
- * 1. Document node
- * 2. In-document Element node
- * 3. Detached Element node (an element with no parent, not in the document)
- * 4. Document Fragment node
- *
- * For each context, the following tests are run:
- *
- * The interface check tests ensure that each type of node exposes the Selectors API methods.
- *
- * The matches() tests are run
- * All the selectors tested for both the valid and invalid selector tests are found in selectors.js.
- * See comments in that file for documentation of the format used.
- *
- * The level2-lib.js file contains all the common test functions for running each of the aforementioned tests
- */
-
- var method = "webkitMatchesSelector";
-
- var docType = "html"; // Only run tests suitable for HTML
-
- // Prepare the nodes for testing
- var doc = e.target.contentDocument; // Document Node tests
-
- var element = doc.getElementById("root"); // In-document Element Node tests
-
- //Setup the namespace tests
- setupSpecialElements(doc, element);
-
- var outOfScope = element.cloneNode(true); // Append this to the body before running the in-document
- // Element tests, but after running the Document tests. This
- // tests that no elements that are not descendants of element
- // are selected.
-
- traverse(outOfScope, function(elem) { // Annotate each element as being a clone; used for verifying
- elem.setAttribute("data-clone", ""); // that none of these elements ever match.
+ async_test(function() {
+ var frame = document.createElement("iframe");
+ frame.onload = this.step_func_done(e => init(e, "webkitMatchesSelector" ));
+ frame.src = "/dom/nodes/ParentNode-querySelector-All-content.html#target";
+ document.body.appendChild(frame);
});
-
-
- var detached = element.cloneNode(true); // Detached Element Node tests
-
- var fragment = doc.createDocumentFragment(); // Fragment Node tests
- fragment.appendChild(element.cloneNode(true));
-
- // Setup Tests
- interfaceCheckMatches(method, "Document", doc);
- interfaceCheckMatches(method, "Detached Element", detached);
- interfaceCheckMatches(method, "Fragment", fragment);
- interfaceCheckMatches(method, "In-document Element", element);
-
- runSpecialMatchesTests(method, "DIV Element", element);
- runSpecialMatchesTests(method, "NULL Element", document.createElement("null"));
- runSpecialMatchesTests(method, "UNDEFINED Element", document.createElement("undefined"));
-
- runInvalidSelectorTestMatches(method, "Document", doc, invalidSelectors);
- runInvalidSelectorTestMatches(method, "Detached Element", detached, invalidSelectors);
- runInvalidSelectorTestMatches(method, "Fragment", fragment, invalidSelectors);
- runInvalidSelectorTestMatches(method, "In-document Element", element, invalidSelectors);
-
- runMatchesTest(method, "In-document", doc, validSelectors, "html");
- runMatchesTest(method, "Detached", detached, validSelectors, "html");
- runMatchesTest(method, "Fragment", fragment, validSelectors, "html");
-
- runMatchesTest(method, "In-document", doc, scopedSelectors, "html");
-}
</script>
diff --git a/tests/wpt/web-platform-tests/dom/nodes/Node-cloneNode.html b/tests/wpt/web-platform-tests/dom/nodes/Node-cloneNode.html
index 9f4f8fc74c5..6c8663076a4 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/Node-cloneNode.html
+++ b/tests/wpt/web-platform-tests/dom/nodes/Node-cloneNode.html
@@ -11,27 +11,33 @@ function assert_equal_node(nodeA, nodeB) {
assert_equals(nodeB.nodeName, nodeA.nodeName, "nodeName");
if (nodeA.nodeType === Node.ELEMENT_NODE) {
- assert_equals(nodeB.prefix, nodeA.prefix);
- assert_equals(nodeB.namespaceURI, nodeA.namespaceURI);
- assert_equals(nodeB.localName, nodeA.localName);
- assert_equals(nodeB.tagName, nodeA.tagName);
- assert_not_equals(nodeB.attributes != nodeA.attributes);
- assert_equals(nodeB.attributes.length, nodeA.attributes.length);
+ assert_equals(nodeB.prefix, nodeA.prefix, "prefix");
+ assert_equals(nodeB.namespaceURI, nodeA.namespaceURI, "namespaceURI");
+ assert_equals(nodeB.localName, nodeA.localName, "localName");
+ assert_equals(nodeB.tagName, nodeA.tagName, "tagName");
+ assert_not_equals(nodeB.attributes != nodeA.attributes, "attributes");
+ assert_equals(nodeB.attributes.length, nodeA.attributes.length,
+ "attributes.length");
for (var i = 0, il = nodeA.attributes.length; i < il; ++i) {
- assert_not_equals(nodeB.attributes[i], nodeA.attributes[i]);
- assert_equals(nodeB.attributes[i].name, nodeA.attributes[i].name);
- assert_equals(nodeB.attributes[i].prefix, nodeA.attributes[i].prefix);
- assert_equals(nodeB.attributes[i].namespaceURI, nodeA.attributes[i].namespaceURI);
- assert_equals(nodeB.attributes[i].value, nodeA.attributes[i].value);
+ assert_not_equals(nodeB.attributes[i], nodeA.attributes[i],
+ "attributes[" + i + "]");
+ assert_equals(nodeB.attributes[i].name, nodeA.attributes[i].name,
+ "attributes[" + i + "].name");
+ assert_equals(nodeB.attributes[i].prefix, nodeA.attributes[i].prefix,
+ "attributes[" + i + "].prefix");
+ assert_equals(nodeB.attributes[i].namespaceURI, nodeA.attributes[i].namespaceURI,
+ "attributes[" + i + "].namespaceURI");
+ assert_equals(nodeB.attributes[i].value, nodeA.attributes[i].value,
+ "attributes[" + i + "].value");
}
}
}
function check_copy(orig, copy, type) {
- assert_not_equals(orig, copy);
- assert_equal_node(orig, copy);
- assert_true(orig instanceof type, "Should be type");
- assert_true(copy instanceof type, "Should be type");
+ assert_not_equals(orig, copy, "Object equality");
+ assert_equal_node(orig, copy, "Node equality");
+ assert_true(orig instanceof type, "original instanceof " + type);
+ assert_true(copy instanceof type, "copy instanceof " + type);
}
function create_element_and_check(localName, typeName) {
@@ -48,7 +54,6 @@ create_element_and_check("a", "HTMLAnchorElement");
create_element_and_check("abbr", "HTMLElement");
create_element_and_check("acronym", "HTMLElement");
create_element_and_check("address", "HTMLElement");
-create_element_and_check("applet", "HTMLAppletElement");
create_element_and_check("area", "HTMLAreaElement");
create_element_and_check("article", "HTMLElement");
create_element_and_check("aside", "HTMLElement");
@@ -212,40 +217,40 @@ test(function() {
var pi = document.createProcessingInstruction("target", "data");
var copy = pi.cloneNode();
check_copy(pi, copy, ProcessingInstruction);
- assert_equals(pi.data, copy.data);
- assert_equals(pi.target, pi.target);
+ assert_equals(pi.data, copy.data, "data");
+ assert_equals(pi.target, pi.target, "target");
}, "createProcessingInstruction");
test(function() {
var doctype = document.implementation.createDocumentType("html", "public", "system");
var copy = doctype.cloneNode();
check_copy(doctype, copy, DocumentType);
- assert_equals(doctype.name, copy.name);
- assert_equals(doctype.publicId, copy.publicId);
- assert_equals(doctype.systemId, copy.systemId);
+ assert_equals(doctype.name, copy.name, "name");
+ assert_equals(doctype.publicId, copy.publicId, "publicId");
+ assert_equals(doctype.systemId, copy.systemId, "systemId");
}, "implementation.createDocumentType");
test(function() {
var doc = document.implementation.createDocument(null, null);
var copy = doc.cloneNode();
check_copy(doc, copy, Document);
- assert_equals(doc.charset, "UTF-8");
- assert_equals(doc.charset, copy.charset);
- assert_equals(doc.contentType, "application/xml");
- assert_equals(doc.contentType, copy.contentType);
- assert_equals(doc.URL, "about:blank")
- assert_equals(doc.URL, copy.URL);
- assert_equals(doc.origin, "null")
- assert_equals(doc.origin, copy.origin);
- assert_equals(doc.compatMode, "CSS1Compat");
- assert_equals(doc.compatMode, copy.compatMode);
+ assert_equals(doc.charset, "UTF-8", "charset value");
+ assert_equals(doc.charset, copy.charset, "charset equality");
+ assert_equals(doc.contentType, "application/xml", "contentType value");
+ assert_equals(doc.contentType, copy.contentType, "contentType equality");
+ assert_equals(doc.URL, "about:blank", "URL value")
+ assert_equals(doc.URL, copy.URL, "URL equality");
+ assert_equals(doc.origin, "null", "origin value")
+ assert_equals(doc.origin, copy.origin, "origin equality");
+ assert_equals(doc.compatMode, "CSS1Compat", "compatMode value");
+ assert_equals(doc.compatMode, copy.compatMode, "compatMode equality");
}, "implementation.createDocument");
test(function() {
var html = document.implementation.createHTMLDocument("title");
var copy = html.cloneNode();
check_copy(html, copy, Document);
- assert_equals(copy.title, "");
+ assert_equals(copy.title, "", "title value");
}, "implementation.createHTMLDocument");
test(function() {
@@ -262,19 +267,23 @@ test(function() {
var copy = parent.cloneNode(deep);
check_copy(parent, copy, HTMLDivElement);
- assert_equals(copy.childNodes.length, 2);
+ assert_equals(copy.childNodes.length, 2,
+ "copy.childNodes.length with deep copy");
check_copy(child1, copy.childNodes[0], HTMLDivElement);
- assert_equals(copy.childNodes[0].childNodes.length, 0);
+ assert_equals(copy.childNodes[0].childNodes.length, 0,
+ "copy.childNodes[0].childNodes.length");
check_copy(child2, copy.childNodes[1], HTMLDivElement);
- assert_equals(copy.childNodes[1].childNodes.length, 1);
+ assert_equals(copy.childNodes[1].childNodes.length, 1,
+ "copy.childNodes[1].childNodes.length");
check_copy(grandChild, copy.childNodes[1].childNodes[0], HTMLDivElement);
deep = false;
copy = parent.cloneNode(deep);
check_copy(parent, copy, HTMLDivElement);
- assert_equals(copy.childNodes.length, 0);
+ assert_equals(copy.childNodes.length, 0,
+ "copy.childNodes.length with non-deep copy");
}, "node with children");
</script>
diff --git a/tests/wpt/web-platform-tests/dom/nodes/selectors.js b/tests/wpt/web-platform-tests/dom/nodes/selectors.js
index 2b84df14561..95d6204f076 100644
--- a/tests/wpt/web-platform-tests/dom/nodes/selectors.js
+++ b/tests/wpt/web-platform-tests/dom/nodes/selectors.js
@@ -41,7 +41,8 @@ var invalidSelectors = [
{name: "Undeclared namespace", selector: "ns|div"},
{name: "Undeclared namespace", selector: ":not(ns|div)"},
{name: "Invalid namespace", selector: "^|div"},
- {name: "Invalid namespace", selector: "$|div"}
+ {name: "Invalid namespace", selector: "$|div"},
+ {name: "Relative selector", selector: ">*"},
];
/*
@@ -309,14 +310,20 @@ 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},
+ /* The future of this combinator is uncertain, see
+ * https://github.com/w3c/csswg-drafts/issues/641
+ * These tests are commented out until a final decision is made on whether to
+ * keep the feature in the spec.
+ */
+
+ // // - 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},
@@ -440,9 +447,6 @@ var scopedSelectors = [
//{name: "", selector: "", ctx: "", ref: "", expect: [], level: 1, testType: TEST_FIND | TEST_MATCH},
// Universal Selector
- {name: "Universal selector, matching all children of the specified reference element", selector: ">*", ctx: "#universal", expect: ["universal-p1", "universal-hr1", "universal-pre1", "universal-p2", "universal-address1"], unexpected: ["universal", "empty"], level: 2, testType: TEST_FIND | TEST_MATCH},
- {name: "Universal selector, matching all grandchildren of the specified reference element", selector: ">*>*", ctx: "#universal", expect: ["universal-code1", "universal-span1", "universal-a1", "universal-code2"], unexpected: ["universal", "empty"], level: 2, testType: TEST_FIND | TEST_MATCH},
- {name: "Universal selector, matching all children of the specified empty reference element", selector: ">*", ctx: "#empty", expect: [] /*no matches*/, unexpected: ["universal", "empty"], level: 2, testType: TEST_QSA},
{name: "Universal selector, matching all descendants of the specified reference element", selector: "*", ctx: "#universal", expect: ["universal-p1", "universal-code1", "universal-hr1", "universal-pre1", "universal-span1",
"universal-p2", "universal-a1", "universal-address1", "universal-code2", "universal-a2"], unexpected: ["universal", "empty"], level: 2, testType: TEST_FIND | TEST_MATCH},
@@ -684,14 +688,14 @@ 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},
+ // // - 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},
diff --git a/tests/wpt/web-platform-tests/dom/traversal/NodeIterator.html b/tests/wpt/web-platform-tests/dom/traversal/NodeIterator.html
index 0f618efb4d7..677858d2a51 100644
--- a/tests/wpt/web-platform-tests/dom/traversal/NodeIterator.html
+++ b/tests/wpt/web-platform-tests/dom/traversal/NodeIterator.html
@@ -52,6 +52,23 @@ test(function() {
assert_throws({name: "failed"}, function() { iter.nextNode() });
}, "Propagate exception from filter function");
+test(function() {
+ var depth = 0;
+ var iter = document.createNodeIterator(document, NodeFilter.SHOW_ALL,
+ function() {
+ if (iter.referenceNode != document && depth == 0) {
+ depth++;
+ iter.nextNode();
+ }
+ return NodeFilter.FILTER_ACCEPT;
+ });
+ iter.nextNode();
+ iter.nextNode();
+ assert_throws("InvalidStateError", function() { iter.nextNode() });
+ depth--;
+ assert_throws("InvalidStateError", function() { iter.previousNode() });
+}, "Recursive filters need to throw");
+
function testIterator(root, whatToShow, filter) {
var iter = document.createNodeIterator(root, whatToShow, filter);
diff --git a/tests/wpt/web-platform-tests/dom/traversal/TreeWalker.html b/tests/wpt/web-platform-tests/dom/traversal/TreeWalker.html
index e0e285a779d..2570c9a2006 100644
--- a/tests/wpt/web-platform-tests/dom/traversal/TreeWalker.html
+++ b/tests/wpt/web-platform-tests/dom/traversal/TreeWalker.html
@@ -11,6 +11,32 @@
// TODO .previousNode, .nextNode
+test(function() {
+ var depth = 0;
+ var walker = document.createTreeWalker(document, NodeFilter.SHOW_ALL,
+ function() {
+ if (depth == 0) {
+ depth++;
+ walker.firstChild();
+ }
+ return NodeFilter.FILTER_ACCEPT;
+ });
+ walker.currentNode = document.body;
+ assert_throws("InvalidStateError", function() { walker.parentNode() });
+ depth--;
+ assert_throws("InvalidStateError", function() { walker.firstChild() });
+ depth--;
+ assert_throws("InvalidStateError", function() { walker.lastChild() });
+ depth--;
+ assert_throws("InvalidStateError", function() { walker.previousSibling() });
+ depth--;
+ assert_throws("InvalidStateError", function() { walker.nextSibling() });
+ depth--;
+ assert_throws("InvalidStateError", function() { walker.previousNode() });
+ depth--;
+ assert_throws("InvalidStateError", function() { walker.nextNode() });
+}, "Recursive filters need to throw");
+
function filterNode(node, whatToShow, filter) {
// "If active flag is set throw an "InvalidStateError"."
// Ignore active flag for these tests, we aren't calling recursively
diff --git a/tests/wpt/web-platform-tests/domparsing/XMLSerializer-serializeToString.html b/tests/wpt/web-platform-tests/domparsing/XMLSerializer-serializeToString.html
index 60932ee37f9..23323b98635 100644
--- a/tests/wpt/web-platform-tests/domparsing/XMLSerializer-serializeToString.html
+++ b/tests/wpt/web-platform-tests/domparsing/XMLSerializer-serializeToString.html
@@ -9,18 +9,36 @@
<body>
<h1>domparsing_XMLSerializer_serializeToString</h1>
<script>
- function createXmlDoc(){
- var input = '<?xml version="1.0" encoding="UTF-8"?><root><child1>value1</child1></root>';
- var parser = new DOMParser();
- var doc = parser.parseFromString(input, 'text/xml');
- return doc;
- }
- test(function() {
- var serializer = new XMLSerializer ();
- var root = createXmlDoc().documentElement;
- var xmlString=serializer.serializeToString(root);
- assert_equals(xmlString, "<root><child1>value1</child1></root>");
- }, 'check XMLSerializer.serializeToString method could parsing xmldoc to string');
- </script>
+function createXmlDoc(){
+ var input = '<?xml version="1.0" encoding="UTF-8"?><root><child1>value1</child1></root>';
+ var parser = new DOMParser();
+ return parser.parseFromString(input, 'text/xml');
+}
+
+test(function() {
+ var serializer = new XMLSerializer();
+ var root = createXmlDoc().documentElement;
+ var xmlString = serializer.serializeToString(root);
+ assert_equals(xmlString, '<root><child1>value1</child1></root>');
+}, 'check XMLSerializer.serializeToString method could parsing xmldoc to string');
+
+test(function() {
+ var serializer = new XMLSerializer();
+ var root = createXmlDoc().documentElement;
+ var element = root.ownerDocument.createElementNS('urn:foo', 'another');
+ var child1 = root.firstChild;
+ root.replaceChild(element, child1);
+ element.appendChild(child1);
+ var xmlString = serializer.serializeToString(root);
+ assert_equals(xmlString, '<root><another xmlns="urn:foo"><child1 xmlns="">value1</child1></another></root>');
+}, 'Check if the default namespace is correctly reset.');
+
+test(function() {
+ var input = '<root xmlns="urn:bar"><outer xmlns=""><inner>value1</inner></outer></root>';
+ var root = (new DOMParser()).parseFromString(input, 'text/xml').documentElement;
+ var xmlString = (new XMLSerializer()).serializeToString(root);
+ assert_equals(xmlString, '<root xmlns="urn:bar"><outer xmlns=""><inner>value1</inner></outer></root>');
+}, 'Check if there is no redundant empty namespace declaration.');
+</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/domparsing/innerhtml-mxss.sub.html b/tests/wpt/web-platform-tests/domparsing/innerhtml-mxss.sub.html
new file mode 100644
index 00000000000..7563d892d9f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domparsing/innerhtml-mxss.sub.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <div><a></a></div>
+ <script>
+ var whitespaces = [
+ "1680", "2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007",
+ "2008", "2009", "200a", "2028", "205f", "3000"
+ ];
+
+ for (var i = 0; i < whitespaces.length; i++) {
+ var container = document.querySelector('a').parentNode;
+ var entity = `&#x${whitespaces[i]};`;
+ var character = String.fromCharCode(parseInt(whitespaces[i], 16));
+ var url = encodeURIComponent(character);
+ container.innerHTML = `<a href="${entity}javascript:alert(1)">Link</a>`;
+
+ var a = document.querySelector('a');
+
+ test(_ => {
+ assert_equals(
+ container.innerHTML,
+ `<a href="${character}javascript:alert(1)">Link</a>`);
+ }, `innerHTML before setter: ${whitespaces[i]}`);
+ test(_ => {
+ assert_equals(
+ a.href,
+ `http://{{host}}:{{ports[http][0]}}/domparsing/${url}javascript:alert(1)`);
+ }, `href before setter: ${whitespaces[i]}`);
+
+ a.parentNode.innerHTML += 'foo';
+ a = document.querySelector('a');
+
+ test(_ => {
+ assert_equals(
+ container.innerHTML,
+ `<a href="${character}javascript:alert(1)">Link</a>foo`);
+ }, `innerHTML after setter: ${whitespaces[i]}`);
+ test(_ => {
+ assert_equals(
+ a.href,
+ `http://{{host}}:{{ports[http][0]}}/domparsing/${url}javascript:alert(1)`);
+ }, `href after setter: ${whitespaces[i]}`);
+ }
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/domparsing/xml-serialization.xhtml b/tests/wpt/web-platform-tests/domparsing/xml-serialization.xhtml
index 678523d1e9d..852bbcc9fd1 100644
--- a/tests/wpt/web-platform-tests/domparsing/xml-serialization.xhtml
+++ b/tests/wpt/web-platform-tests/domparsing/xml-serialization.xhtml
@@ -68,6 +68,18 @@ test(function() {
}, "DocumentType: 'APOSTROPHE' (U+0027) and 'QUOTATION MARK' (U+0022)");
test(function() {
+ var el = document.createElement("a");
+ el.setAttribute("href", "\u3042\u3044\u3046 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~");
+ assert_equals(serialize(el), "<a xmlns=\"http://www.w3.org/1999/xhtml\" href=\"\u3042\u3044\u3046 !&quot;#$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\"></a>");
+}, "Element: href attributes are not percent-encoded");
+
+test(function() {
+ var el = document.createElement("a");
+ el.setAttribute("href", "?\u3042\u3044\u3046 !\"$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~");
+ assert_equals(serialize(el), "<a xmlns=\"http://www.w3.org/1999/xhtml\" href=\"?\u3042\u3044\u3046 !&quot;$%&amp;'()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\"></a>");
+}, "Element: query parts in href attributes are not percent-encoded");
+
+test(function() {
var pi = document.createProcessingInstruction("a", "");
assert_equals(serialize(pi), "<?a ?>");
}, "ProcessingInstruction: empty data");
diff --git a/tests/wpt/web-platform-tests/domxpath/interfaces.html b/tests/wpt/web-platform-tests/domxpath/interfaces.html
deleted file mode 100644
index dab085c623e..00000000000
--- a/tests/wpt/web-platform-tests/domxpath/interfaces.html
+++ /dev/null
@@ -1,80 +0,0 @@
-<!doctype html>
-<title>XPath tests</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script src='/resources/WebIDLParser.js'></script>
-<script src='/resources/idlharness.js'></script>
-<script type='text/plain'>
-[Constructor] interface XPathEvaluator {
- [NewObject] XPathExpression createExpression(DOMString expression,
- optional XPathNSResolver? resolver);
- Node createNSResolver(Node nodeResolver);
- XPathResult evaluate(DOMString expression, Node contextNode,
- optional XPathNSResolver? resolver,
- optional unsigned short type,
- optional object? result);
-};
-
-interface XPathExpression {
- XPathResult evaluate(Node contextNode,
- optional unsigned short type,
- optional object? result);
-};
-
-callback interface XPathNSResolver {
- DOMString? lookupNamespaceURI(DOMString? prefix);
-};
-
-interface XPathResult {
- const unsigned short ANY_TYPE = 0;
- const unsigned short NUMBER_TYPE = 1;
- const unsigned short STRING_TYPE = 2;
- const unsigned short BOOLEAN_TYPE = 3;
- const unsigned short UNORDERED_NODE_ITERATOR_TYPE = 4;
- const unsigned short ORDERED_NODE_ITERATOR_TYPE = 5;
- const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE = 6;
- const unsigned short ORDERED_NODE_SNAPSHOT_TYPE = 7;
- const unsigned short ANY_UNORDERED_NODE_TYPE = 8;
- const unsigned short FIRST_ORDERED_NODE_TYPE = 9;
- readonly attribute unsigned short resultType;
- readonly attribute double numberValue;
- readonly attribute DOMString stringValue;
- readonly attribute boolean booleanValue;
- readonly attribute Node? singleNodeValue;
- readonly attribute boolean invalidIteratorState;
- readonly attribute unsigned long snapshotLength;
- Node? iterateNext();
- Node? snapshotItem(unsigned long index);
-};
-</script>
-<script type='text/plain' class='untested'>
-interface Document {};
-Document implements XPathEvaluator;
-</script>
-<script>
-"use strict";
-var evaluator = document;
-var resolver = function() {};
-var resolver2 = document.createNSResolver(document.documentElement);
-var expression = document.createExpression("//*", resolver);
-var result = document.evaluate("//*", document.documentElement, resolver, 0, null);
-
-var idlArray;
-setup(function() {
- idlArray = new IdlArray();
- [].forEach.call(document.querySelectorAll("script[type=text\\/plain]"), function(node) {
- if (node.className == "untested") {
- idlArray.add_untested_idls(node.textContent);
- } else {
- idlArray.add_idls(node.textContent);
- }
- });
- idlArray.add_objects({
- Document: ["document"],
- XPathExpression: ["expression"],
- XPathResolver: ["resolver", "resolver2"],
- XPathResult: ["result"]
- });
-});
-idlArray.test();
-</script>
diff --git a/tests/wpt/web-platform-tests/domxpath/interfaces.tentative.html b/tests/wpt/web-platform-tests/domxpath/interfaces.tentative.html
new file mode 100644
index 00000000000..780844ee7b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/domxpath/interfaces.tentative.html
@@ -0,0 +1,83 @@
+<!doctype html>
+<title>XPath tests</title>
+<!-- This is a tentative test because there's no real spec for XPath IDL.
+ The closest thing is: -->
+<link rel="help" href="https://wiki.whatwg.org/wiki/DOM_XPath">
+<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'>
+[Constructor] interface XPathEvaluator {
+ [NewObject] XPathExpression createExpression(DOMString expression,
+ optional XPathNSResolver? resolver);
+ Node createNSResolver(Node nodeResolver);
+ XPathResult evaluate(DOMString expression, Node contextNode,
+ optional XPathNSResolver? resolver,
+ optional unsigned short type,
+ optional object? result);
+};
+
+interface XPathExpression {
+ XPathResult evaluate(Node contextNode,
+ optional unsigned short type,
+ optional object? result);
+};
+
+callback interface XPathNSResolver {
+ DOMString? lookupNamespaceURI(DOMString? prefix);
+};
+
+interface XPathResult {
+ const unsigned short ANY_TYPE = 0;
+ const unsigned short NUMBER_TYPE = 1;
+ const unsigned short STRING_TYPE = 2;
+ const unsigned short BOOLEAN_TYPE = 3;
+ const unsigned short UNORDERED_NODE_ITERATOR_TYPE = 4;
+ const unsigned short ORDERED_NODE_ITERATOR_TYPE = 5;
+ const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE = 6;
+ const unsigned short ORDERED_NODE_SNAPSHOT_TYPE = 7;
+ const unsigned short ANY_UNORDERED_NODE_TYPE = 8;
+ const unsigned short FIRST_ORDERED_NODE_TYPE = 9;
+ readonly attribute unsigned short resultType;
+ readonly attribute double numberValue;
+ readonly attribute DOMString stringValue;
+ readonly attribute boolean booleanValue;
+ readonly attribute Node? singleNodeValue;
+ readonly attribute boolean invalidIteratorState;
+ readonly attribute unsigned long snapshotLength;
+ Node? iterateNext();
+ Node? snapshotItem(unsigned long index);
+};
+</script>
+<script type='text/plain' class='untested'>
+interface Document {};
+Document implements XPathEvaluator;
+</script>
+<script>
+"use strict";
+var evaluator = document;
+var resolver = function() {};
+var resolver2 = document.createNSResolver(document.documentElement);
+var expression = document.createExpression("//*", resolver);
+var result = document.evaluate("//*", document.documentElement, resolver, 0, null);
+
+var idlArray;
+setup(function() {
+ idlArray = new IdlArray();
+ [].forEach.call(document.querySelectorAll("script[type=text\\/plain]"), function(node) {
+ if (node.className == "untested") {
+ idlArray.add_untested_idls(node.textContent);
+ } else {
+ idlArray.add_idls(node.textContent);
+ }
+ });
+ idlArray.add_objects({
+ Document: ["document"],
+ XPathExpression: ["expression"],
+ XPathResolver: ["resolver", "resolver2"],
+ XPathResult: ["result"]
+ });
+});
+idlArray.test();
+</script>
diff --git a/tests/wpt/web-platform-tests/editing/data/insert-list-items-in-table-cells.js b/tests/wpt/web-platform-tests/editing/data/insert-list-items-in-table-cells.js
new file mode 100644
index 00000000000..e1c1e15c6bd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/editing/data/insert-list-items-in-table-cells.js
@@ -0,0 +1,43 @@
+// For documentation of the format, see README in this directory.
+var browserTests = [
+['<div contenteditable="true"><table><tr><td>[fsdf]</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>',
+ [["insertOrderedList",""]],
+ '<div contenteditable="true"><table><tbody><tr><td><ol><li>fsdf<br></li></ol></td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></div>',
+ [true],
+ {"insertOrderedList":[false,false,"false",false,true,"true"]}],
+['<div contenteditable="true"><table><tr data-start=0 data-end=2><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>',
+ [["insertOrderedList",""]],
+ '<div contenteditable="true"><table><tbody><tr><td><ol><li>fsdf<br></li></ol></td><td><ol><li>fsdf<br></li></ol></td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></div>',
+ [true],
+ {"insertOrderedList":[false,false,"false",false,false,"false"]}],
+['<div contenteditable="true"><table><tr data-start=0><td>fsdf</td><td>fsdf</td></tr><tr data-end=2><td>gghfg</td><td>fsfg</td></tr></table></div>',
+ [["insertOrderedList",""]],
+ '<div contenteditable="true"><table><tbody><tr><td><ol><li>fsdf<br></li></ol></td><td><ol><li>fsdf<br></li></ol></td></tr><tr><td><ol><li>gghfg<br></li></ol></td><td><ol><li>fsfg<br></li></ol></td></tr></tbody></table></div>',
+ [true],
+ {"insertOrderedList":[false,false,"false",false,false,"false"]}],
+['<div contenteditable="true"><table data-start=0 data-end=1><tr><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>',
+ [["insertOrderedList",""]],
+ '<div contenteditable="true"><ol><li><table><tbody><tr><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></li></ol></div>',
+ [true],
+ {"insertOrderedList":[false,false,"false",false,true,"true"]}],
+['<div contenteditable="true"><table><tr><td>[fsdf]</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>',
+ [["insertOrderedList",""], ["insertOrderedList","1"]],
+ '<div contenteditable="true"><table><tbody><tr><td>fsdf<br></td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></div>',
+ [true, true],
+ {"insertOrderedList":[false,false,"false",false,true,"true"], "insertOrderedList":[false,false,"false",false,false,"false"]}],
+['<div contenteditable="true"><table><tr data-start=0 data-end=2><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>',
+ [["insertOrderedList",""], ["insertOrderedList","1"]],
+ '<div contenteditable="true"><table><tbody><tr><td>fsdf<br></td><td>fsdf<br></td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></div>',
+ [true, true],
+ {"insertOrderedList":[false,false,"false",false,true,"true"], "insertOrderedList":[false,false,"false",false,false,"false"]}],
+['<div contenteditable="true"><table><tr data-start=0><td>fsdf</td><td>fsdf</td></tr><tr data-end=2><td>gghfg</td><td>fsfg</td></tr></table></div>',
+ [["insertOrderedList",""], ["insertOrderedList","1"]],
+ '<div contenteditable="true"><table><tbody><tr><td>fsdf<br></td><td>fsdf<br></td></tr><tr><td>gghfg<br></td><td>fsfg<br></td></tr></tbody></table></div>',
+ [true, true],
+ {"insertOrderedList":[false,false,"false",false,true,"true"], "insertOrderedList":[false,false,"false",false,false,"false"]}],
+['<div contenteditable="true"><table data-start=0 data-end=1><tr><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></table></div>',
+ [["insertOrderedList",""], ["insertOrderedList","1"]],
+ '<div contenteditable="true"><table><tbody><tr><td>fsdf</td><td>fsdf</td></tr><tr><td>gghfg</td><td>fsfg</td></tr></tbody></table></div>',
+ [true, true],
+ {"insertOrderedList":[false,false,"false",false,true,"true"], "insertOrderedList":[false,false,"false",false,false,"false"]}]
+]
diff --git a/tests/wpt/web-platform-tests/editing/run/insert-list-items-in-table-cell.html b/tests/wpt/web-platform-tests/editing/run/insert-list-items-in-table-cell.html
new file mode 100644
index 00000000000..ebb14f49d09
--- /dev/null
+++ b/tests/wpt/web-platform-tests/editing/run/insert-list-items-in-table-cell.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<meta charset=utf-8>
+<link rel=stylesheet href=../include/reset.css>
+<title>Insert list items in table cells - HTML editing conformance tests</title>
+
+<p id=timing></p>
+
+<div id=log></div>
+
+<div id=test-container></div>
+
+<script src=../include/implementation.js></script>
+<script>var testsJsLibraryOnly = true</script>
+<script src=../include/tests.js></script>
+<script src=../data/insert-list-items-in-table-cells.js></script>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+"use strict";
+
+(function() {
+ var startTime = Date.now();
+
+ // Make document.body.innerHTML more tidy by removing unnecessary things.
+ [].forEach.call(document.querySelectorAll("script"), function(node) {
+ node.parentNode.removeChild(node);
+ });
+
+ if (true) {
+ // Silly hack: the CSS styling flag should be true, not false, to match
+ // expected results. This is because every group of tests except the
+ // last (multitest) sets styleWithCSS automatically, and it sets it
+ // first to false and then to true. Thus it's left at true at the end
+ // of each group of tests, so in gentest.html it will be true when
+ // starting each group of tests other than the first. But browsers are
+ // supposed to default it to false when the page loads, so flip it.
+ try { document.execCommand("styleWithCSS", false, "true") } catch(e) {}
+ }
+
+ browserTests.forEach(runConformanceTest);
+
+ document.getElementById("test-container").parentNode
+ .removeChild(document.getElementById("test-container"));
+
+ var elapsed = Math.round(Date.now() - startTime)/1000;
+ document.getElementById("timing").textContent =
+ "Time elapsed: " + Math.floor(elapsed/60) + ":"
+ + ((elapsed % 60) < 10 ? "0" : "")
+ + (elapsed % 60).toFixed(3) + " min.";
+})();
+</script>
diff --git a/tests/wpt/web-platform-tests/encoding/api-invalid-label.html b/tests/wpt/web-platform-tests/encoding/api-invalid-label.html
index f15c184aa89..3c7486fa0fa 100644
--- a/tests/wpt/web-platform-tests/encoding/api-invalid-label.html
+++ b/tests/wpt/web-platform-tests/encoding/api-invalid-label.html
@@ -8,9 +8,7 @@
var tests = ["invalid-invalidLabel"];
setup(function() {
encodings_table.forEach(function(section) {
- section.encodings.filter(function(encoding) {
- return encoding.name !== 'replacement';
- }).forEach(function(encoding) {
+ section.encodings.forEach(function(encoding) {
encoding.labels.forEach(function(label) {
["\u0000", "\u000b", "\u00a0", "\u2028", "\u2029"].forEach(function(ws) {
tests.push(ws + label);
diff --git a/tests/wpt/web-platform-tests/encoding/api-replacement-encodings.html b/tests/wpt/web-platform-tests/encoding/api-replacement-encodings.html
index 2dffd72e7b4..63402636fa7 100644
--- a/tests/wpt/web-platform-tests/encoding/api-replacement-encodings.html
+++ b/tests/wpt/web-platform-tests/encoding/api-replacement-encodings.html
@@ -5,10 +5,6 @@
<script src="resources/encodings.js"></script>
<script>
-test(function() {
- assert_throws(new RangeError(), function() { new TextDecoder('replacement'); });
-}, 'The "replacement" label should not be a known encoding.');
-
encodings_table.forEach(function(section) {
section.encodings.filter(function(encoding) {
return encoding.name === 'replacement';
diff --git a/tests/wpt/web-platform-tests/encoding/eof-shift_jis-ref.html b/tests/wpt/web-platform-tests/encoding/eof-shift_jis-ref.html
new file mode 100644
index 00000000000..b90f8032a31
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/eof-shift_jis-ref.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<meta charset=shift_jis>
+<title>Shift_JIS file ending with a truncated sequence</title>
+One-byte truncated sequence:&#xFFFD;
diff --git a/tests/wpt/web-platform-tests/encoding/eof-shift_jis.html b/tests/wpt/web-platform-tests/encoding/eof-shift_jis.html
new file mode 100644
index 00000000000..9858e65836c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/eof-shift_jis.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<meta charset=shift_jis>
+<title>Shift_JIS file ending with a truncated sequence</title>
+<link rel=match href=/encoding/eof-shift_jis-ref.html>
+One-byte truncated sequence: \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encoding/eof-utf-8-one-ref.html b/tests/wpt/web-platform-tests/encoding/eof-utf-8-one-ref.html
new file mode 100644
index 00000000000..0654776532d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/eof-utf-8-one-ref.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>UTF-8 file ending with a one-byte truncated sequence</title>
+One-byte truncated sequence:&#xFFFD;
diff --git a/tests/wpt/web-platform-tests/encoding/eof-utf-8-one.html b/tests/wpt/web-platform-tests/encoding/eof-utf-8-one.html
new file mode 100644
index 00000000000..7f7f7ecd195
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/eof-utf-8-one.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>UTF-8 file ending with a one-byte truncated sequence</title>
+<link rel=match href="eof-utf-8-one-ref.html">
+One-byte truncated sequence: \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encoding/eof-utf-8-three-ref.html b/tests/wpt/web-platform-tests/encoding/eof-utf-8-three-ref.html
new file mode 100644
index 00000000000..e7c145848fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/eof-utf-8-three-ref.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>UTF-8 file ending with a three-byte truncated sequence</title>
+Three-byte truncated sequence:&#xFFFD;
diff --git a/tests/wpt/web-platform-tests/encoding/eof-utf-8-three.html b/tests/wpt/web-platform-tests/encoding/eof-utf-8-three.html
new file mode 100644
index 00000000000..d19137b1795
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/eof-utf-8-three.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>UTF-8 file ending with a three-byte truncated sequence</title>
+<link rel=match href="eof-utf-8-three-ref.html">
+Three-byte truncated sequence: \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encoding/eof-utf-8-two-ref.html b/tests/wpt/web-platform-tests/encoding/eof-utf-8-two-ref.html
new file mode 100644
index 00000000000..76f39862339
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/eof-utf-8-two-ref.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>UTF-8 file ending with a two-byte truncated sequence</title>
+Two-byte truncated sequence:&#xFFFD;
diff --git a/tests/wpt/web-platform-tests/encoding/eof-utf-8-two.html b/tests/wpt/web-platform-tests/encoding/eof-utf-8-two.html
new file mode 100644
index 00000000000..464d03b771f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/eof-utf-8-two.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>UTF-8 file ending with a two-byte truncated sequence</title>
+<link rel=match href="eof-utf-8-two-ref.html">
+Two-byte truncated sequence: \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/encoding/iso-2022-jp-decoder.html b/tests/wpt/web-platform-tests/encoding/iso-2022-jp-decoder.html
index c86ffc15899..c0b858c74f4 100644
--- a/tests/wpt/web-platform-tests/encoding/iso-2022-jp-decoder.html
+++ b/tests/wpt/web-platform-tests/encoding/iso-2022-jp-decoder.html
@@ -17,8 +17,8 @@
}
decode([0x1b, 0x24], "�$", "Error ESC")
decode([0x1b, 0x24, 0x50], "�$P", "Error ESC, character")
- decode([0x1b, 0x28, 0x42, 0x50], "�P", "ASCII ESC, character")
- decode([0x1b, 0x28, 0x42, 0x1b, 0x28, 0x42, 0x50], "��P", "Double ASCII ESC, character")
+ decode([0x1b, 0x28, 0x42, 0x50], "P", "ASCII ESC, character")
+ decode([0x1b, 0x28, 0x42, 0x1b, 0x28, 0x42, 0x50], "�P", "Double ASCII ESC, character")
decode([0x50, 0x1b, 0x28, 0x42, 0x50], "PP", "character, ASCII ESC, character")
decode([0x5C, 0x5D, 0x7E], "\\]~", "characters")
decode([0x0D, 0x0E, 0x0F, 0x10], "\x0D��\x10", "SO / SI")
diff --git a/tests/wpt/web-platform-tests/encoding/replacement-encodings.html b/tests/wpt/web-platform-tests/encoding/replacement-encodings.html
new file mode 100644
index 00000000000..4be3c858b23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/replacement-encodings.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<title>Encoding API: replacement encoding</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/encodings.js"></script>
+<script src="resources/decoding-helpers.js"></script>
+<script>
+
+const replacement_labels = [];
+encodings_table.forEach(section => {
+ section.encodings
+ .filter(encoding => encoding.name === 'replacement')
+ .forEach(encoding => {
+ encoding.labels.forEach(label => { replacement_labels.push(label); })
+ });
+});
+
+replacement_labels.forEach(label => {
+ decode_test(
+ label,
+ '%41%42%43%61%62%63%31%32%33%A0',
+ 'U+FFFD',
+ `${label} - non-empty input decodes to one replacement character.`);
+
+ decode_test(
+ label,
+ '',
+ '', `${label} - empty input decodes to empty output.`);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/encoding/resources/decoding-helpers.js b/tests/wpt/web-platform-tests/encoding/resources/decoding-helpers.js
new file mode 100644
index 00000000000..78e52da014b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/resources/decoding-helpers.js
@@ -0,0 +1,32 @@
+// Decode an URL encoded string, using XHR and data: URL. Returns a Promise.
+function decode(label, url_encoded_string) {
+ return new Promise((resolve, reject) => {
+ const req = new XMLHttpRequest;
+ req.open('GET', `data:text/plain,${url_encoded_string}`);
+ req.overrideMimeType(`text/plain; charset="${label}"`);
+ req.send();
+ req.onload = () => resolve(req.responseText);
+ req.onerror = () => reject(new Error(req.statusText));
+ });
+}
+
+// Convert code units in a decoded string into: "U+0001/U+0002/...'
+function to_code_units(string) {
+ return string.split('')
+ .map(unit => unit.charCodeAt(0))
+ .map(code => 'U+' + ('0000' + code.toString(16).toUpperCase()).slice(-4))
+ .join('/');
+}
+
+function decode_test(label,
+ url_encoded_input,
+ expected_code_units,
+ description) {
+ promise_test(() => {
+ return decode(label, url_encoded_input)
+ .then(decoded => to_code_units(decoded))
+ .then(actual => {
+ assert_equals(actual, expected_code_units, `Decoding with ${label}`);
+ });
+ }, description);
+}
diff --git a/tests/wpt/web-platform-tests/encoding/resources/encodings.js b/tests/wpt/web-platform-tests/encoding/resources/encodings.js
index fabbbd1f2bc..c7a2a5a8b28 100644
--- a/tests/wpt/web-platform-tests/encoding/resources/encodings.js
+++ b/tests/wpt/web-platform-tests/encoding/resources/encodings.js
@@ -431,7 +431,8 @@ var encodings_table =
"hz-gb-2312",
"iso-2022-cn",
"iso-2022-cn-ext",
- "iso-2022-kr"
+ "iso-2022-kr",
+ "replacement"
],
"name": "replacement"
},
diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.html b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.html
new file mode 100644
index 00000000000..79679cac759
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.html
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.xml b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.xml
new file mode 100644
index 00000000000..399c35af827
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-bom.xml
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.html b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.html
new file mode 100644
index 00000000000..fa2d3fe4a7d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.html
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.xml b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.xml
new file mode 100644
index 00000000000..a237e853a08
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-big-endian-nobom.xml
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.html b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.html
new file mode 100644
index 00000000000..5648fca2835
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.html
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.xml b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.xml
new file mode 100644
index 00000000000..8f5e8cba400
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-bom.xml
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.html b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.html
new file mode 100644
index 00000000000..eda12372134
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.html
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.xml b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.xml
new file mode 100644
index 00000000000..a9a7bf96e6e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/resources/utf-32-little-endian-nobom.xml
Binary files differ
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 43989211151..1833fdad8b1 100644
--- a/tests/wpt/web-platform-tests/encoding/single-byte-decoder.html
+++ b/tests/wpt/web-platform-tests/encoding/single-byte-decoder.html
@@ -25,7 +25,7 @@
"ISO-8859-15":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,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],
"ISO-8859-16":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255],
"KOI8-R":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],
- "KOI8-U":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,9565,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],
+ "KOI8-U":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],
"macintosh":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711],
"windows-874":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null],
"windows-1250":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],
diff --git a/tests/wpt/web-platform-tests/encoding/unsupported-encodings.html b/tests/wpt/web-platform-tests/encoding/unsupported-encodings.html
new file mode 100644
index 00000000000..7584d3d17ca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/unsupported-encodings.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>Encoding API: unsupported encodings</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/decoding-helpers.js"></script>
+<script>
+
+// Attempting to decode '<' as UTF-7 (+AD4) ends up as '+AD4'.
+['UTF-7', 'utf-7'].forEach(label => {
+ decode_test(label, '+AD4', 'U+002B/U+0041/U+0044/U+0034',
+ `${label} should not be supported`);
+});
+
+// UTF-32 will be detected as UTF-16LE if leading BOM, or windows-1252 otherwise.
+['UTF-32', 'utf-32', 'UTF-32LE', 'utf-32le'].forEach(label => {
+ decode_test(label,
+ '%FF%FE%00%00%41%00%00%00%42%00%00%00',
+ 'U+0000/U+0041/U+0000/U+0042/U+0000',
+ `${label} with BOM should decode as UTF-16LE`);
+
+ decode_test(label,
+ '%41%00%00%00%42%00%00%00',
+ 'U+0041/U+0000/U+0000/U+0000/U+0042/U+0000/U+0000/U+0000',
+ `${label} with no BOM should decode as windows-1252`);;
+});
+['UTF-32be', 'utf-32be'].forEach(label => {
+ decode_test(label,
+ '%00%00%00%41%00%00%00%42',
+ 'U+0000/U+0000/U+0000/U+0041/U+0000/U+0000/U+0000/U+0042',
+ `${label} with no BOM should decode as windows-1252`);
+
+ decode_test(label,
+ '%00%00%FE%FF%00%00%00%41%00%00%00%42',
+ 'U+0000/U+0000/U+00FE/U+00FF/U+0000/U+0000/U+0000/U+0041/U+0000/U+0000/U+0000/U+0042',
+ `${label} with BOM should decode as windows-1252`);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/encoding/utf-32.html b/tests/wpt/web-platform-tests/encoding/utf-32.html
new file mode 100644
index 00000000000..7b173055d35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encoding/utf-32.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>Character Decoding: UTF-32 (not supported)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+
+// Since UTF-32 is not supported, such content will be interpreted
+// as the default HTML encoding (windows-1252) unless it has a
+// leading little endian BOM (FF FE 00 00), in which case it will
+// be interpreted as UTF-16LE.
+
+const samples = [
+ {file: 'resources/utf-32-big-endian-bom.html', expected: 'windows-1252'},
+ {file: 'resources/utf-32-big-endian-bom.xml', expected: 'windows-1252'},
+ {file: 'resources/utf-32-big-endian-nobom.html', expected: 'windows-1252'},
+ {file: 'resources/utf-32-big-endian-nobom.xml', expected: 'windows-1252'},
+
+ {file: 'resources/utf-32-little-endian-bom.html', expected: 'UTF-16LE'},
+ {file: 'resources/utf-32-little-endian-bom.xml', expected: 'UTF-16LE'},
+ {file: 'resources/utf-32-little-endian-nobom.html', expected: 'windows-1252'},
+ {file: 'resources/utf-32-little-endian-nobom.xml', expected: 'windows-1252'}
+];
+
+samples.forEach(sample => async_test(t => {
+ const iframe = document.createElement('iframe');
+ iframe.src = sample.file;
+ iframe.onload = t.step_func(() => {
+ assert_equals(iframe.contentDocument.characterSet, sample.expected);
+ t.done();
+ });
+ document.body.appendChild(iframe);
+ t.add_cleanup(() => iframe.remove());
+}, `Expect ${sample.file} to parse as ${sample.expected}`));
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-creation-with-gc.html b/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-creation-with-gc.html
deleted file mode 100644
index 4dd705f9f4c..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-creation-with-gc.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Test asynchronous creation of MediaKeys and MediaKeySession while running garbage collection</title>
- <script src="encrypted-media-utils.js"></script>
-<!--
- Test requires Chromium specific content and is being disabled.
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
--->
- </head>
- <body>
- <div id="log"></div>
- <script>
- async_test(function(test)
- {
- // Run garbage collection often.
- setInterval(asyncGC, 0);
-
- var initDataType;
- var initData;
- var mediaKeySession;
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- mediaKeySession = mediaKeys.createSession();
- return mediaKeySession.generateRequest(initDataType, initData);
- }).then(function() {
- return mediaKeySession.close();
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Test asynchronous creation of MediaKeys and MediaKeySession while running garbage collection.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-setcert-with-gc.html b/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-setcert-with-gc.html
deleted file mode 100644
index 4da562894d6..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-async-setcert-with-gc.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Test asynchronous setServerCertificate while running garbage collection</title>
- <script src="encrypted-media-utils.js"></script>
-<!--
- Test requires Chromium specific content and is being disabled.
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
--->
- </head>
- <body>
- <div id="log"></div>
- <script>
- // Run garbage collection continuously.
- setInterval(asyncGC, 0);
-
- promise_test(function(test)
- {
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var cert = new Uint8Array(200);
- return mediaKeys.setServerCertificate(cert);
- }).then(function(result) {
- assert_false(result);
- });
- }, 'Test asynchronous setServerCertificate while running garbage collection.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys-with-session.html b/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys-with-session.html
deleted file mode 100644
index a892b969c49..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys-with-session.html
+++ /dev/null
@@ -1,104 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Test MediaKeys lifetime when adding a session</title>
- <script src="encrypted-media-utils.js"></script>
-<!--
- Test requires Chromium specific content and is being disabled.
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
--->
- </head>
- <body>
- <div id="log"></div>
- <script>
- // MediaKeySessions remain as long as:
- // JavaScript has a reference to it
- // OR (MediaKeys is around
- // AND the session has not received a close() event)
- // In the tests below, we do not close any session nor keep a
- // Javascript reference to any session, so MediaKeySessions remain
- // as long as the associated MediaKeys object is around.
-
- // For this test, create a MediaKeySession and verify lifetime.
- async_test(function(test)
- {
- var initDataType;
- var initData;
- var mediaKeys;
- var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
-
- function numActiveDOMObjectsCreated()
- {
- return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
- }
-
- // Create a MediaKeys object with a session.
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(result) {
- mediaKeys = result;
-
- // Verify MediaKeys is an ActiveDOMObject.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 1.
- // In Oilpan, numActiveDOMObjectsCreate() <= 4.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer and
- // 1 MediaKeySystemAccessInitializer (navigator.requestMediaKeySystemAccess() use above),
- // 1 MediaKeySystemAccessInitializer (isInitDataSupported() (via getSupportedInitDataType())))
- assert_between_inclusive(numActiveDOMObjectsCreated(), 1, 4, 'MediaKeys.create()');
-
- var mediaKeySession = mediaKeys.createSession();
- return mediaKeySession.generateRequest(initDataType, initData);
- }).then(function() {
- // Should be 1 MediaKeys + 1 MediaKeySession.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 2.
- // In Oilpan, numActiveDOMObjectsCreate() <= 6.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer and
- // 2 MediaKeySystemAccessInitializer,
- // 1 ContentDecryptionModuleResultPromise and
- // 1 MediaKeySession).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 2, 6, 'MediaKeys.createSession()');
-
- // Run gc(), should not affect MediaKeys object nor the
- // session since we still have a reference to it.
-
- // When enabling oilpan GC, the in-active
- // ScriptPromiseResolvers will be destroyed.
- return createGCPromise();
- }).then(function(result) {
- assert_equals(typeof mediaKeys.createSession, 'function');
-
- // MediaKeys + MediaKeySessions should remain.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 2, 3, 'After gc()');
-
- // Drop reference to the MediaKeys object and run gc()
- // again. Object should be collected this time. Since
- // MediaKeySessions remain alive as long as MediaKeys is
- // around, it is possible that gc() checks the
- // MediaKeySession object first, and doesn't collect it
- // since MediaKeys hasn't been collected yet. Thus run gc()
- // twice, to ensure that the unreferenced MediaKeySession
- // object get collected.
- mediaKeys = null;
- return createGCPromise();
- }).then(function(result) {
- return createGCPromise();
- }).then(function(result) {
- // No MediaKeySessions should remain.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 0, 1, 'After final gc()');
-
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'MediaKeys lifetime with session');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys.html
deleted file mode 100644
index b8e79ac8bbb..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeys.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Test MediaKeys lifetime</title>
- <script src="encrypted-media-utils.js"></script>
-<!--
- Test requires Chromium specific content and is being disabled.
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
--->
- </head>
- <body>
- <div id="log"></div>
- <script>
- async_test(function(test)
- {
- // Create a MediaKeys object and free immediately.
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- return access.createMediaKeys();
- }).then(function(result) {
- // Do nothing with the created object
- }).then(function(result) {
- // No way to verify that MediaKeys object is actually
- // collected, but make sure it doesn't crash.
- return createGCPromise();
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Creating and destroying MediaKeys does not crash');
-
- async_test(function(test)
- {
- var mediaKeys;
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- return access.createMediaKeys();
- }).then(function(result) {
- mediaKeys = result;
- return createGCPromise();
- }).then(function(result) {
- // Check that the object still exists.
- assert_equals(typeof mediaKeys.createSession, 'function');
- mediaKeys = null;
-
- // Now that the reference is dropped, it should be
- // collected. No way to verify that it is actually
- // collected, but make sure it doesn't crash.
- return createGCPromise();
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'MediaKeys is not collected as long as we have a reference');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-reference.html b/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-reference.html
deleted file mode 100644
index 4b8ad1b46dd..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-reference.html
+++ /dev/null
@@ -1,157 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Test MediaKeySession lifetime without release()</title>
- <script src="encrypted-media-utils.js"></script>
-<!--
- Test requires Chromium specific content and is being disabled.
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
--->
- </head>
- <body>
- <div id="log"></div>
- <script>
- // Since MediaKeySession (and MediaKeys) are ActiveDOMObjects,
- // we can determine when they are garbage collected.
- // MediaKeySessions remain as long as:
- // JavaScript has a reference to it
- // OR (MediaKeys is around
- // AND the session has not received a close() event)
-
- async_test(function(test)
- {
- var mediaKeys;
- var mediaKeySession1;
- var mediaKeySession2;
- var mediaKeySession3;
- var initDataType;
- var initData;
- var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
-
- function numActiveDOMObjectsCreated()
- {
- return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(result) {
- mediaKeys = result;
- assert_equals(typeof mediaKeys.createSession, 'function');
-
- // Verify MediaKeys is an ActiveDOMObject.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 1.
- // In Oilpan, numActiveDOMObjectsCreate() <= 4.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer and
- // 1 MediaKeySystemAccessInitializer (navigator.requestMediaKeySystemAccess() use above),
- // 1 MediaKeySystemAccessInitializer (isInitDataSupported() (via getSupportedInitDataType())))
- assert_between_inclusive(numActiveDOMObjectsCreated(), 1, 4, 'MediaKeys.create()');
-
- // Create 3 sessions.
- mediaKeySession1 = mediaKeys.createSession();
- return mediaKeySession1.generateRequest(initDataType, initData);
- }).then(function() {
- assert_true(mediaKeySession1.sessionId && mediaKeySession1.sessionId.length > 0);
-
- // Should be 1 MediaKeys + 1 MediaKeySession.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 2.
- // In Oilpan, numActiveDOMObjectsCreate() <= 6.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer and
- // 2 MediaKeySystemAccessInitializer,
- // 1 ContentDecryptionModuleResultPromise and
- // 1 MediaKeySession).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 2, 6, 'MediaKeys.createSession(1)');
-
- mediaKeySession2 = mediaKeys.createSession();
- return mediaKeySession2.generateRequest(initDataType, initData);
- }).then(function() {
- assert_true(mediaKeySession2.sessionId && mediaKeySession2.sessionId.length > 0);
-
- // Should be 1 MediaKeys + 2 MediaKeySessions.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 3.
- // In Oilpan, numActiveDOMObjectsCreate() <= 8.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer and
- // 2 MediaKeySystemAccessInitializers,
- // 2 ContentDecryptionModuleResultPromise and
- // 2 MediaKeySession).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 3, 8, 'mediaKeys.createSession(2)');
-
- mediaKeySession3 = mediaKeys.createSession();
- return mediaKeySession3.generateRequest(initDataType, initData);
- }).then(function() {
- assert_true(mediaKeySession3.sessionId && mediaKeySession3.sessionId.length > 0);
-
- // Should be 1 MediaKeys + 3 MediaKeySessions.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 4.
- // In Oilpan, numActiveDOMObjectsCreate() <= 10.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer and
- // 2 MediaKeySystemAccessInitializers,
- // 3 ContentDecryptionModuleResultPromise and
- // 3 MediaKeySession).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 4, 10, 'mediaKeys.createSession(3)');
-
- // Run gc(). All sessions should remain as we have a
- // reference to each one. However, running gc()
- // asynchronously should free up the last PromiseResolver.
- return createGCPromise();
- }).then(function(result) {
- // Only MediaKeys + 3 MediaKeySessions should remain.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 4, 5, 'After gc()');
-
- // Now drop references to 2 of the sessions. Even though we
- // don't have a reference, MediaKeys is still around (and
- // the sessions aren't closed), so the objects won't be
- // collected.
- mediaKeySession1 = null;
- mediaKeySession2 = null;
- return createGCPromise();
- }).then(function(result) {
- return createGCPromise();
- }).then(function(result) {
- // MediaKeys + 3 MediaKeySessions should remain.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 4, 5, 'After second gc()');
-
- // Now drop the reference to MediaKeys. It and the 2
- // unreferenced sessions should be collected. Since
- // MediaKeySessions remain alive as long as MediaKeys is
- // around, it is possible that gc() checks one or both
- // MediaKeySession objects first, and doesn't collect them
- // since MediaKeys hasn't been collected yet. Thus run gc()
- // twice, to ensure that the unreferenced MediaKeySession
- // objects get collected.
- mediaKeys = null;
- return createGCPromise();
- }).then(function(result) {
- return createGCPromise();
- }).then(function(result) {
- // Only 1 MediaKeySessions should remain.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 1, 2, 'After mediaKeys = null');
-
- // Drop the reference to the last session. It should get
- // collected now since MediaKeys is gone.
- mediaKeySession3 = null;
- return createGCPromise();
- }).then(function(result) {
- // No MediaKeySessions should remain.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 0, 1, 'After final gc()');
-
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'MediaKeySession lifetime without release()');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release-noreference.html b/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release-noreference.html
deleted file mode 100644
index a962844a39a..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release-noreference.html
+++ /dev/null
@@ -1,131 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Test MediaKeySession lifetime after release() without references</title>
- <script src="encrypted-media-utils.js"></script>
-<!--
- Test requires Chromium specific content and is being disabled.
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
--->
- </head>
- <body>
- <div id="log"></div>
- <script>
- // Since MediaKeySession (and MediaKeys) are ActiveDOMObjects,
- // we can determine when they are garbage collected.
- // MediaKeySessions remain as long as:
- // JavaScript has a reference to it
- // OR (MediaKeys is around
- // AND the session has not received a close() event)
- async_test(function(test)
- {
- var initDataType;
- var initData;
- var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
-
- function numActiveDOMObjectsCreated()
- {
- return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
- }
-
- // Create 2 sessions.
- var mediaKeys;
- var mediaKeySession1;
- var mediaKeySession2;
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(result) {
- mediaKeys = result;
-
- // Verify MediaKeys is an ActiveDOMObject.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 1.
- // In Oilpan, numActiveDOMObjectsCreate() <= 4.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer and
- // 1 MediaKeySystemAccessInitializer (navigator.requestMediaKeySystemAccess() use above),
- // 1 MediaKeySystemAccessInitializer (isInitDataSupported() (via getSupportedInitDataType())))
- assert_between_inclusive(numActiveDOMObjectsCreated(), 1, 4, 'MediaKeys.create()');
-
- mediaKeySession1 = mediaKeys.createSession();
- return mediaKeySession1.generateRequest(initDataType, initData);
- }).then(function() {
- assert_true(mediaKeySession1.sessionId && mediaKeySession1.sessionId.length > 0);
-
- // Should be 1 MediaKeys + 1 MediaKeySession.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 2.
- // In Oilpan, numActiveDOMObjectsCreate() <= 6.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer and
- // 2 MediaKeySystemAccessInitializer,
- // 1 ContentDecryptionModuleResultPromise and
- // 1 MediaKeySession).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 2, 6, 'MediaKeys.createSession(1)');
-
- mediaKeySession2 = mediaKeys.createSession();
- return mediaKeySession2.generateRequest(initDataType, initData);
- }).then(function() {
- assert_true(mediaKeySession2.sessionId && mediaKeySession2.sessionId.length > 0);
-
- // Should be 1 MediaKeys + 2 MediaKeySessions.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 3.
- // In Oilpan, numActiveDOMObjectsCreate() <= 8.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer and
- // 2 MediaKeySystemAccessInitializers,
- // 2 ContentDecryptionModuleResultPromise and
- // 2 MediaKeySession).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 3, 8, 'mediaKeys.createSession(2)');
- }).then(function(result) {
- // Run gc(). All sessions should remain as we have a
- // reference to each one.
- return createGCPromise();
- }).then(function(result) {
- // Should be just 1 MediaKeys + 2 MediaKeySessions.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 3, 4, 'After gc()');
-
- // Close the sessions. Once the close() event is received,
- // they should get garbage collected as there are no JS
- // references to them.
- var promise = mediaKeySession1.close();
- mediaKeySession1 = null;
- return promise;
- }).then(function(result) {
- // Give time so that the close event can be processed by
- // MediaKeySession.
- return delayToAllowEventProcessingPromise();
- }).then(function(result) {
- return createGCPromise();
- }).then(function(result) {
- // Only MediaKeys + mediaKeySession2 should remain.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 2, 3, 'mediaKeySession1 not collected');
-
- var promise = mediaKeySession2.close();
- mediaKeySession2 = null;
- return promise;
- }).then(function(result) {
- // Provide time for the mediaKeySession2 close event to be
- // handled.
- return delayToAllowEventProcessingPromise();
- }).then(function(result) {
- return createGCPromise();
- }).then(function(result) {
- // Only MediaKeys should remain.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 1, 2, 'mediaKeySession2 not collected');
-
- assert_not_equals(mediaKeys, null);
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'MediaKeySession lifetime after release() without references');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release.html b/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release.html
deleted file mode 100644
index 6265267615e..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-mediakeysession-release.html
+++ /dev/null
@@ -1,118 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>MediaKeySession lifetime after release()</title>
- <script src="encrypted-media-utils.js"></script>
-<!--
- Test requires Chromium specific content and is being disabled.
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
--->
- </head>
- <body>
- <div id="log"></div>
- <script>
- // Since MediaKeySession (and MediaKeys) are ActiveDOMObjects,
- // we can determine when they are garbage collected.
- // MediaKeySessions remain as long as:
- // JavaScript has a reference to it
- // OR (MediaKeys is around
- // AND the session has not received a close() event)
- async_test(function(test)
- {
- var mediaKeys;
- var mediaKeySession1;
- var mediaKeySession2;
- var initDataType;
- var initData;
- var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
-
- function numActiveDOMObjectsCreated()
- {
- return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
- }
-
- // Create 2 sessions.
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(result) {
- mediaKeys = result;
-
- // Verify MediaKeys is an ActiveDOMObject.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 1.
- // In Oilpan, numActiveDOMObjectsCreate() <= 4.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer and
- // 1 MediaKeySystemAccessInitializer (navigator.requestMediaKeySystemAccess() use above),
- // 1 MediaKeySystemAccessInitializer (isInitDataSupported() (via getSupportedInitDataType())))
- assert_between_inclusive(numActiveDOMObjectsCreated(), 1, 4, 'MediaKeys.create()');
-
- mediaKeySession1 = mediaKeys.createSession();
- return mediaKeySession1.generateRequest(initDataType, initData);
- }).then(function() {
- // Should be 1 MediaKeys + 1 MediaKeySession.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 2.
- // In Oilpan, numActiveDOMObjectsCreate() <= 6.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer,
- // 2 MediaKeySystemAccessInitializers,
- // 1 ContentDecryptionModuleResultPromise and
- // 1 MediaKeySession).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 2, 6, 'MediaKeys.createSession(1)');
-
- mediaKeySession2 = mediaKeys.createSession();
- return mediaKeySession2.generateRequest(initDataType, initData);
- }).then(function() {
- // Should be 1 MediaKeys + 2 MediaKeySessions.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 3.
- // In Oilpan, numActiveDOMObjectsCreate() <= 8.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer,
- // 2 MediaKeySystemAccessInitializers,
- // 2 ContentDecryptionModuleResultPromise and
- // 2 MediaKeySession).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 3, 8, 'mediaKeys.createSession(2)');
-
- // Close the sessions. Once completed, only the JS
- // reference to them keeps them around.
- return mediaKeySession1.close();
- }).then(function(result) {
- return mediaKeySession2.close();
- }).then(function(result) {
- // Since both sessions have been closed, dropping the
- // reference to them from JS will result in the session
- // being garbage-collected.
- // Should be 1 MediaKeys + 2 MediaKeySessions.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 3.
- // In Oilpan, numActiveDOMObjectsCreate() <= 10.
- // (1 MediaKeys,
- // 1 MediaKeysInitializer,
- // 2 MediaKeySystemAccessInitializers,
- // 4 ContentDecryptionModuleResultPromise and
- // 2 MediaKeySession).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 3, 10, 'after close');
-
- mediaKeySession1 = null;
- return createGCPromise();
- }).then(function() {
- // Only MediaKeys + mediaKeySession2 should remain.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 2, 3, 'mediaKeySession1 not collected');
-
- mediaKeySession2 = null;
- return createGCPromise();
- }).then(function() {
- // Only MediaKeys should remain.
- // In non-Oilpan, there is also something from createGCPromise().
- assert_between_inclusive(numActiveDOMObjectsCreated(), 1, 2, 'mediaKeySession2 not collected');
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'MediaKeySession lifetime after release()');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-multiple-mediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-multiple-mediakeys.html
deleted file mode 100644
index 42638a0695b..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-multiple-mediakeys.html
+++ /dev/null
@@ -1,131 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Test multiple MediaKeys lifetimes</title>
- <script src="encrypted-media-utils.js"></script>
-<!--
- Test requires Chromium specific content and is being disabled.
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
--->
- </head>
- <body>
- <div id="log"></div>
- <script>
- // For this test, create several MediaKeys and verify lifetime.
- async_test(function(test)
- {
- var mediaKeys;
- var startingActiveDOMObjectCount = window.internals.activeDOMObjectCount(document);
-
- function numActiveDOMObjectsCreated()
- {
- return window.internals.activeDOMObjectCount(document) - startingActiveDOMObjectCount;
- }
-
- // Create a MediaKeys object. Returns a promise that resolves
- // with the new MediaKeys object.
- function createMediaKeys()
- {
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- return mediaKeys;
- });
- }
-
- // Create a few MediaKeys objects. Only keep a reference to the
- // last one created.
- createMediaKeys().then(function(result) {
- // Should be 1 MediaKeys.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 1.
- // In Oilpan, numActiveDOMObjectsCreated() <= 4.
- // (1 MediaKeysInitializer,
- // 1 MediaKeySystemAccessInitializer (navigator.requestMediaKeySystemAccess() use above),
- // 1 MediaKeySystemAccessInitializer (isInitDataSupported() (via getSupportedInitDataType())) and
- // 1 ContentDecryptionModuleResultPromise).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 1, 4);
-
- return createMediaKeys();
- }).then(function(result) {
- // Should be 2 MediaKeys.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 2.
- // In Oilpan, numActiveDOMObjectsCreate() <= 8.
- // (2 MediaKeysInitializer,
- // 4 MediaKeySystemAccessInitializer and
- // 2 ContentDecryptionModuleResultPromise).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 2, 8);
-
- return createMediaKeys();
- }).then(function(result) {
- // Should be 3 MediaKeys.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 3.
- // In Oilpan, numActiveDOMObjectsCreate() <= 12.
- // (3 MediaKeysInitializer,
- // 6 MediaKeySystemAccessInitializer and
- // 3 ContentDecryptionModuleResultPromise).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 3, 12);
-
- return createMediaKeys();
- }).then(function(result) {
- // Should be 4 MediaKeys.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 4.
- // In Oilpan, numActiveDOMObjectsCreate() <= 16.
- // (4 MediaKeysInitializer,
- // 8 MediaKeySystemAccessInitializer and
- // 4 ContentDecryptionModuleResultPromise).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 4, 16);
-
- return createMediaKeys();
- }).then(function(result) {
- // Should be 5 MediaKeys.
- // In non-Oilpan, numActiveDOMObjectsCreate() == 5.
- // In Oilpan, numActiveDOMObjectsCreate() <= 20.
- // (5 MediaKeysInitializer,
- // 10 MediaKeySystemAccessInitializer and
- // 5 ContentDecryptionModuleResultPromise).
- assert_between_inclusive(numActiveDOMObjectsCreated(), 5, 20);
-
- // |mediaKeys| refers to the most recently created MediaKeys
- // object.
- mediaKeys = result;
-
- // In order for the MediaKey objects to be garbage
- // collected, it needs time to process any pending events.
- return delayToAllowEventProcessingPromise();
- }).then(function(result) {
- // In non-Oilpan, numActiveDOMObjectsCreated() == 5
- // (5 MediaKeySession objects).
- // In Oilpan, numActiveDOMObjectsCreated() <= 23
- // (5 MediaKeysInitializer,
- // 12 MediaKeySystemAccessInitializer,
- // 5 ContentDecryptionModuleResultPromise and
- // 1 DOMTimer (in delayToAllowEventProcessingPromise))
- assert_between_inclusive(numActiveDOMObjectsCreated(), 5, 23);
-
- // As we only have a reference (|mediaKeys|) to the last
- // created MediaKeys object, the other 4 MediaKeys objects
- // are available to be garbage collected.
- return createGCPromise();
- }).then(function(result) {
- // Should be 1 MediaKeys and DOMTimer.
- assert_less_than_equal(numActiveDOMObjectsCreated(), 2);
- assert_equals(typeof mediaKeys.createSession, 'function');
-
- // Release the last MediaKeys object created.
- mediaKeys = null;
-
- // Run gc() again to reclaim the remaining MediaKeys object.
- return createGCPromise();
- }).then(function(result) {
- // Should be just a DOMTimer.
- assert_less_than_equal(numActiveDOMObjectsCreated(), 1);
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Multiple MediaKeys lifetime');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-reload.html b/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-reload.html
deleted file mode 100644
index b2f8ffb1f54..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/chromium_specific_disabled/encrypted-media-lifetime-reload.html
+++ /dev/null
@@ -1,103 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Reloading during encrypted media playback</title>
- <script src="encrypted-media-utils.js"></script>
-<!--
- Test requires Chromium specific content and is being disabled.
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
--->
- </head>
- <body>
- <video id="testVideo"></video>
- <div id="log"></div>
- <script>
- async_test(function(test)
- {
- var video = document.getElementById('testVideo');
- var content = 'webm/test-encrypted.webm';
- var mediaKeySession = null;
- var hasSessionUpdateSucceeded = false;
- var encryptedEventCount = 0;
-
- var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
-
- function onEncrypted(event)
- {
- assert_equals(event.target, video);
- assert_true(event instanceof window.MediaEncryptedEvent);
- assert_equals(event.type, 'encrypted');
-
- // The same decryption key is used by both the audio and
- // the video streams so only create a session once. To
- // avoid issues when comparing the expected.txt file
- // (which logs the events in the order they occur), create
- // the session on the second event. This also ensures we
- // see both events.
- if (++encryptedEventCount != 2)
- return;
-
- mediaKeySession = video.mediaKeys.createSession();
- waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
- mediaKeySession.generateRequest(event.initDataType, event.initData).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function onMessage(event)
- {
- assert_true(event instanceof window.MediaKeyMessageEvent);
- assert_equals(event.target, mediaKeySession);
- assert_equals(event.type, 'message');
- assert_equals(event.messageType, 'license-request');
-
- var keyId = extractSingleKeyIdFromMessage(event.message);
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
- mediaKeySession.update(jwkSet).then(function(result) {
- hasSessionUpdateSucceeded = true;
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function onPlaying(event)
- {
- // Not using waitForEventAndRunStep() to avoid too many
- // EVENT(onTimeUpdate) logs.
- video.addEventListener('timeupdate', onTimeUpdate, true);
- }
-
- function onTimeUpdate(event)
- {
- if (event.target.currentTime < 0.2 || !hasSessionUpdateSucceeded)
- return;
-
- // Reload the page to catch any possible teardown issues.
- if (location.hash == '#x') {
- test.done();
- return;
- }
-
- location.hash += 'x';
- location.reload();
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- waitForEventAndRunStep('encrypted', video, onEncrypted, test);
- waitForEventAndRunStep('playing', video, onPlaying, test);
- video.src = content;
- return video.setMediaKeys(mediaKeys);
- }).then(function(result) {
- video.play();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Reloading during encrypted media playback.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-check-init-data-type.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-check-init-data-type.html
deleted file mode 100644
index f71cf48a825..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-check-init-data-type.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Test support of different initDataTypes.</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>
- <script>
- function checkInitDataType(initDataType)
- {
- return isInitDataTypeSupported(initDataType).then(function(result) {
- // If |initDataType| is not supported, simply succeed.
- if (!result)
- return Promise.resolve('Not supported');
-
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfigurationForInitDataType(initDataType))
- .then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var mediaKeySession = mediaKeys.createSession();
- var initData = getInitData(initDataType);
- return mediaKeySession.generateRequest(initDataType, initData);
- });
- });
- }
-
- promise_test(function()
- {
- return checkInitDataType('webm');
- }, 'Clear key support for "webm".');
-
- promise_test(function()
- {
- return checkInitDataType('cenc');
- }, 'Clear key support for "cenc".');
-
- promise_test(function()
- {
- return checkInitDataType('keyids');
- }, 'Clear key support for "keyids".');
- </script>
- </body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index f145dfad77e..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clear-key-invalid-license.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <script>
- async_test(function(test)
- {
- var initDataType;
- var initData;
- var invalidLicense = new Uint8Array(
- [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77]);
-
- function handleMessage(event) {
- event.target.update(invalidLicense).then(function(event) {
- assert_unreached('Error: update() succeeded unexpectedly.');
- test.done();
- }).catch(function(error) {
- assert_equals(error.name, 'InvalidAccessError');
- test.done();
- });
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var keySession = mediaKeys.createSession();
- keySession.addEventListener('message', handleMessage, false);
- keySession.generateRequest(initDataType, initData);
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Invalid Clear Key License.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index cf237a7da8e..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-clearkey-update-non-ascii-input.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <script>
- // This test passes |response| to update() as a JSON Web Key Set.
- // CDMs other than Clear Key won't expect |response| in this format.
-
- async_test(function(test)
- {
- var initDataType;
- var initData;
- var mediaKeySession;
-
- function processMessage(event)
- {
- // |jwkSet| includes some non-ASCII characters.
- var jwkSet = '{"keys":[{'
- + '"kty":"oct\uDC00\uD800",'
- + '"k":"MDEyMzQ1Njc4OTAxMjM0NQ",'
- + '"kid":"MDEyMzQ1Njc4OTAxMjM0NQ"'
- + '\xff\xfe}]';
- mediaKeySession.update(stringToUint8Array(jwkSet)).then(function() {
- forceTestFailureFromPromise(test, 'Error: update() succeeded');
- }, function(error) {
- assert_equals(error.name, 'InvalidAccessError');
- test.done();
- });
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- mediaKeySession = mediaKeys.createSession();
- waitForEventAndRunStep('message', mediaKeySession, processMessage, test);
- return mediaKeySession.generateRequest(initDataType, initData);
- });
- }, 'Clear Key update() with non-ASCII response.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-events.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-events.html
deleted file mode 100644
index a2a70f169c5..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-events.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Verify v2 events</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>
- <script>
- // Currently Clear Key only generates aynchronous "message" and
- // "keychange" events.
- async_test(function(test)
- {
- var initDataType;
- var initData;
- var mediaKeySession;
- var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
-
- function processMessage(event)
- {
- assert_true(event instanceof window.MediaKeyMessageEvent);
- assert_equals(event.target, mediaKeySession);
- assert_equals(event.type, 'message');
- assert_equals(event.messageType, 'license-request');
-
- var keyId = extractSingleKeyIdFromMessage(event.message);
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
-
- waitForEventAndRunStep('keystatuseschange', mediaKeySession, test.step_func(processKeyStatusesChange), test);
-
- mediaKeySession.update(jwkSet).catch(test.step_func(function(error) {
- forceTestFailureFromPromise(test, error);
- }));
- }
-
- function processKeyStatusesChange(event)
- {
- assert_true(event instanceof Event);
- assert_equals(event.target, mediaKeySession);
- assert_equals(event.type, 'keystatuseschange');
- test.done();
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(test.step_func(function(mediaKeys) {
- 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);
- }));
- }, 'Verify v2 events.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-generate-request-disallowed-input.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-generate-request-disallowed-input.html
deleted file mode 100644
index 53e5c95b78a..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-generate-request-disallowed-input.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Test handling of invalid initData for generateRequest().</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>
- <script>
- // Create a session and call generateRequest() with |initDataType|
- // and |initData|. generateRequest() should fail with an
- // InvalidAccessError. Returns a promise that resolves successfully
- // if the error happened, rejects otherwise.
- function test_session(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('org.w3.clearkey', getSimpleConfigurationForInitDataType(initDataType)).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var mediaKeySession = mediaKeys.createSession();
- return mediaKeySession.generateRequest(initDataType, initData);
- }).then(function() {
- assert_unreached('generateRequest() succeeded');
- }, function(error) {
- assert_equals(error.name, 'InvalidAccessError');
- return Promise.resolve('success');
- });
- })
- }
-
- promise_test(function()
- {
- var initData = new Uint8Array(70000);
- return test_session('webm', initData);
- }, 'generateRequest() with webm initData longer than 64Kb characters.');
-
- promise_test(function()
- {
- var initData = new Uint8Array(70000);
- return test_session('cenc', initData);
- }, 'generateRequest() with cenc initData longer than 64Kb characters.');
-
- promise_test(function()
- {
- var initData = new Uint8Array(70000);
- return test_session('keyids', initData);
- }, 'generateRequest() with keyids initData longer than 64Kb characters.');
-
- 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('cenc', initData);
- }, 'generateRequest() with invalid pssh box size.');
-
- promise_test(function()
- {
- // Invalid data as type = 'psss'.
- var initData = new Uint8Array([
- 0x00, 0x00, 0x00, 0x20, // size = 32
- 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('cenc', initData);
- }, 'generateRequest() with non pssh data.');
-
- 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('keyids', initData);
- }, 'generateRequest() with too short 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('keyids', initData);
- }, 'generateRequest() with too long key ID.');
- </script>
- </body>
-</html>
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
deleted file mode 100644
index 3ee4e8c542d..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-sessions.html
+++ /dev/null
@@ -1,121 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <script>
- async_test(function(test)
- {
- var mediaKeySession1;
- var mediaKeySession2;
- var initDataType;
- var initData;
-
- // Even though key ids are uint8, using printable values so that
- // they can be verified easily.
- var key1 = stringToUint8Array('123');
- var key2 = stringToUint8Array('4567890');
- var rawKey1 = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
- var rawKey2 = new Uint8Array([0x3c, 0xae, 0xe4, 0xfc, 0x2a, 0x12, 0xef, 0x68,
- 0x7b, 0xd2, 0x14, 0x68, 0xf1, 0x62, 0xdd, 0xeb]);
-
- function processMessage1(event)
- {
- // This should only be called for session1.
- assert_equals(event.target, mediaKeySession1);
-
- // No keys added yet.
- verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [], unexpected: [key1, key2] });
-
- // Add key1 to session1.
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(key1, rawKey1)));
- mediaKeySession1.update(jwkSet).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function processKeyStatusesChange1(event)
- {
- // This should only be called for session1.
- assert_equals(event.target, mediaKeySession1);
-
- // Check that keyStatuses contains the expected key1 only.
- dumpKeyStatuses(mediaKeySession1.keyStatuses);
- verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] });
-
- // Now trigger a message event on session2.
- mediaKeySession2.generateRequest(initDataType, initData).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function processMessage2(event)
- {
- // This should only be called for session2.
- assert_equals(event.target, mediaKeySession2);
-
- // session2 has no keys added yet.
- verifyKeyStatuses(mediaKeySession2.keyStatuses, { expected: [], unexpected: [key1, key2] });
-
- // session1 should still have 1 key.
- verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] });
-
- // Add key2 to session2.
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(key2, rawKey2)));
- mediaKeySession2.update(jwkSet).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function processKeyStatusesChange2(event)
- {
- // This should only be called for session2.
- assert_equals(event.target, mediaKeySession2);
-
- // Check that keyStatuses contains the expected key2 only.
- dumpKeyStatuses(mediaKeySession2.keyStatuses);
- verifyKeyStatuses(mediaKeySession2.keyStatuses, { expected: [key2], unexpected: [key1] });
-
- // session1 should still have 1 key.
- verifyKeyStatuses(mediaKeySession1.keyStatuses, { expected: [key1], unexpected: [key2] });
-
- test.done();
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- 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] });
-
- // Bind all the event handlers now.
- waitForEventAndRunStep('message', mediaKeySession1, processMessage1, test);
- waitForEventAndRunStep('message', mediaKeySession2, processMessage2, test);
- waitForEventAndRunStep('keystatuseschange', mediaKeySession1, processKeyStatusesChange1, test);
- waitForEventAndRunStep('keystatuseschange', mediaKeySession2, processKeyStatusesChange2, test);
-
- // Generate a request on session1.
- return mediaKeySession1.generateRequest(initDataType, initData);
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Verify MediaKeySession.keyStatuses with multiple sessions.');
- </script>
- </body>
-</html>
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
deleted file mode 100644
index 809045d99e5..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses-multiple-updates.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <script>
- async_test(function(test)
- {
- var initDataType;
- var initData;
- var mediaKeySession;
- var firstEvent;
-
- // Even though key ids are uint8, using printable values so that
- // they can be verified easily.
- var key1 = stringToUint8Array('123');
- var key2 = stringToUint8Array('4567890');
- var rawKey1 = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
- var rawKey2 = new Uint8Array([0x3c, 0xae, 0xe4, 0xfc, 0x2a, 0x12, 0xef, 0x68,
- 0x7b, 0xd2, 0x14, 0x68, 0xf1, 0x62, 0xdd, 0xeb]);
-
- function processMessage(event)
- {
- // No keys added yet.
- verifyKeyStatuses(mediaKeySession.keyStatuses, { expected: [], unexpected: [key1, key2] });
-
- // Add key1 to the session.
- firstEvent = true;
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(key1, rawKey1)));
- mediaKeySession.update(jwkSet).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function processKeyStatusesChange(event)
- {
- if (firstEvent) {
- // Verify that the session only contains key1.
- dumpKeyStatuses(mediaKeySession.keyStatuses);
- verifyKeyStatuses(mediaKeySession.keyStatuses, { expected: [key1], unexpected: [key2] });
-
- // Now add key2 to the session.
- firstEvent = false;
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(key2, rawKey2)));
- mediaKeySession.update(jwkSet).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- } else {
- // Verify that the session now contains key1 and key2.
- dumpKeyStatuses(mediaKeySession.keyStatuses);
- verifyKeyStatuses(mediaKeySession.keyStatuses, { expected: [key1, key2] });
-
- test.done();
- }
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- mediaKeySession = mediaKeys.createSession();
-
- // There should be no keys defined yet.
- assert_equals(mediaKeySession.keyStatuses.size, 0);
-
- waitForEventAndRunStep('message', mediaKeySession, processMessage, test);
- waitForEventAndRunStep('keystatuseschange', mediaKeySession, processKeyStatusesChange, test);
-
- return mediaKeySession.generateRequest(initDataType, initData);
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Verify MediaKeySession.keyStatuses with multiple updates.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses.html
deleted file mode 100644
index 043bc132241..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-keystatuses.html
+++ /dev/null
@@ -1,174 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Verify MediaKeySession.keyStatuses</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>
- <script>
- async_test(function(test)
- {
- var mediaKeySession;
- var initDataType;
- var initData;
- var closed = false;
-
- // Even though key ids are uint8, using printable values so that
- // they can be verified easily.
- var key1String = '123';
- var key2String = '4567890';
- var key1 = stringToUint8Array(key1String);
- var key2 = stringToUint8Array(key2String);
- var rawKey1 = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
- var rawKey2 = new Uint8Array([0x3c, 0xae, 0xe4, 0xfc, 0x2a, 0x12, 0xef, 0x68,
- 0x7b, 0xd2, 0x14, 0x68, 0xf1, 0x62, 0xdd, 0xeb]);
-
- function processMessage(event)
- {
- // No keys added yet.
- assert_equals(mediaKeySession.keyStatuses.size, 0);
-
- waitForEventAndRunStep('keystatuseschange', mediaKeySession, processKeyStatusesChange, test);
-
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(key1, rawKey1), createJWK(key2, rawKey2)));
- mediaKeySession.update(jwkSet).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function checkKeyStatusFor2Keys()
- {
- // Two keys added, so both should show up in |keyStatuses|.
- assert_equals(mediaKeySession.keyStatuses.size, 2);
- dumpKeyStatuses(mediaKeySession.keyStatuses);
-
- // Check |keyStatuses| for 2 entries.
- var result = [];
- for (let [keyId, status] of mediaKeySession.keyStatuses) {
- result.push({ key: arrayBufferAsString(keyId), value: status });
- }
- assert_object_equals(result,
- [{ key: key1String, value: 'usable'}, { key: key2String, value: 'usable'}],
- 'keyStatuses fails');
-
- // |keyStatuses| must contain both keys.
- result = [];
- for (var key of mediaKeySession.keyStatuses.keys()) {
- result.push(arrayBufferAsString(key));
- }
- assert_array_equals(result,
- [key1String, key2String],
- 'keyStatuses.keys() fails');
-
- // Both values in |mediaKeySession| should be 'usable'.
- result = [];
- for (var value of mediaKeySession.keyStatuses.values()) {
- result.push(value);
- }
- assert_array_equals(result,
- ['usable', 'usable'],
- 'keyStatuses.values() fails');
-
- // Check |keyStatuses.entries()|.
- result = [];
- for (var entry of mediaKeySession.keyStatuses.entries()) {
- result.push({ key: arrayBufferAsString(entry[0]), value: entry[1] });
- }
- assert_object_equals(result,
- [{ key: key1String, value: 'usable'}, { key: key2String, value: 'usable'}],
- 'keyStatuses.entries() fails');
-
- // forEach() should return both entries.
- result = [];
- mediaKeySession.keyStatuses.forEach(function(status, keyId) {
- result.push({ key: arrayBufferAsString(keyId), value: status });
- });
- assert_object_equals(result,
- [{ key: key1String, value: 'usable'}, { key: key2String, value: 'usable'}],
- 'keyStatuses.forEach() fails');
-
- // has() and get() should return the expected values.
- assert_true(mediaKeySession.keyStatuses.has(key1));
- assert_true(mediaKeySession.keyStatuses.has(key2));
- assert_equals(mediaKeySession.keyStatuses.get(key1), 'usable');
- assert_equals(mediaKeySession.keyStatuses.get(key2), 'usable');
-
- // Try some invalid keyIds.
- var invalid1 = key1.subarray(0, key1.length - 1);
- assert_false(mediaKeySession.keyStatuses.has(invalid1));
- assert_equals(mediaKeySession.keyStatuses.get(invalid1), undefined);
-
- var invalid2 = key1.subarray(1);
- assert_false(mediaKeySession.keyStatuses.has(invalid2));
- assert_equals(mediaKeySession.keyStatuses.get(invalid2), undefined);
-
- var invalid3 = new Uint8Array(key1);
- invalid3[0] += 1;
- assert_false(mediaKeySession.keyStatuses.has(invalid3));
- assert_equals(mediaKeySession.keyStatuses.get(invalid3), undefined);
-
- var invalid4 = new Uint8Array(key1);
- invalid4[invalid4.length - 1] -= 1;
- assert_false(mediaKeySession.keyStatuses.has(invalid4));
- assert_equals(mediaKeySession.keyStatuses.get(invalid4), undefined);
-
- var invalid5 = new Uint8Array(key1.length + 1);
- invalid5.set(key1, 1); // First element will be 0.
- assert_false(mediaKeySession.keyStatuses.has(invalid5));
- assert_equals(mediaKeySession.keyStatuses.get(invalid5), undefined);
-
- var invalid6 = new Uint8Array(key1.length + 1);
- invalid6.set(key1, 0); // Last element will be 0.
- assert_false(mediaKeySession.keyStatuses.has(invalid6));
- assert_equals(mediaKeySession.keyStatuses.get(invalid6), undefined);
- }
-
- function processKeyStatusesChange(event)
- {
- if ( !closed )
- {
- // The first keystatuseschange (caused by update())
- // should include both keys.
- checkKeyStatusFor2Keys();
-
- mediaKeySession.close().catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- closed = true;
- }
- else
- {
- // The second keystatuseschange (caused by close())
- // should not have any keys.
- assert_equals(mediaKeySession.keyStatuses.size, 0);
- test.done();
- }
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- mediaKeySession = mediaKeys.createSession();
-
- // There should be no keys defined yet.
- assert_equals(mediaKeySession.keyStatuses.size, 0);
-
- waitForEventAndRunStep('message', mediaKeySession, processMessage, test);
- return mediaKeySession.generateRequest(initDataType, initData);
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Verify MediaKeySession.keyStatuses.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-not-callable-after-createsession.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-not-callable-after-createsession.html
deleted file mode 100644
index 9b92c69053f..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-not-callable-after-createsession.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Test MediaKeySession not callable immediately after CreateSession().</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>
- <script>
- // After creation, the MediaKeySession object is not
- // callable, and we should get a InvalidStateError.
-
- promise_test(function()
- {
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var mediaKeySession = mediaKeys.createSession();
-
- var arbitraryResponse = new Uint8Array([0x00, 0x11]);
- return mediaKeySession.update(arbitraryResponse).then(function(result) {
- assert_unreached('update() succeeded unexpectedly.');
- }).catch(function(error) {
- assert_equals(error.name, 'InvalidStateError');
- });
- });
- }, 'Update() immediately after CreateSession().');
-
- promise_test(function()
- {
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var mediaKeySession = mediaKeys.createSession();
-
- return mediaKeySession.close().then(function(result) {
- assert_unreached('close() succeeded unexpectedly.');
- }).catch(function(error) {
- assert_equals(error.name, 'InvalidStateError');
- });
- });
- }, 'Close() immediately after CreateSession().');
-
- promise_test(function()
- {
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var mediaKeySession = mediaKeys.createSession();
-
- return mediaKeySession.remove().then(function(result) {
- assert_unreached('remove() succeeded unexpectedly.');
- }).catch(function(error) {
- assert_equals(error.name, 'InvalidStateError');
- });
- });
- }, 'Remove() immediately after CreateSession().');
- </script>
- </body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-onencrypted.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-onencrypted.html
deleted file mode 100644
index ad408f0f313..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-onencrypted.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- var expectedInitData = stringToUint8Array('0123456789012345');
-
- // Will get 2 identical events, one for audio, one for video.
- var expectedEvents = 2;
-
- async_test(function(test)
- {
- var video = document.getElementById('testVideo');
- var content = 'webm/test-encrypted.webm';
-
- var onEncrypted = function(event)
- {
- assert_equals(event.target, video);
- assert_true(event instanceof window.MediaEncryptedEvent);
- assert_equals(event.type, 'encrypted');
- assert_equals(event.initDataType, 'webm');
- assert_array_equals(new Uint8Array(event.initData), expectedInitData);
-
- if (--expectedEvents == 0)
- test.done();
- };
-
- waitForEventAndRunStep('encrypted', video, onEncrypted, test);
- video.src = content;
- }, 'encrypted fired on encrypted media file.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index 495ba418803..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-encrypted-and-clear-sources.html
+++ /dev/null
@@ -1,130 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- async_test(function(test)
- {
- var video = document.getElementById('testVideo');
- var isUpdatePromiseResolved = false;
- var encryptedEventCount = 0;
- var playbackCount = 0;
-
- // Content to be played. These files must be the same format.
- var encryptedContent = 'webm/test-encrypted.webm';
- var unencryptedContent = 'webm/test.webm';
-
- var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
-
- function onEncrypted(event)
- {
- assert_equals(event.target, video);
- assert_true(event instanceof window.MediaEncryptedEvent);
- assert_equals(event.type, 'encrypted');
-
- // The same decryption key is used by both the audio and
- // the video streams so only create a session once. To
- // avoid issues when comparing the expected.txt file
- // (which logs the events in the order they occur), create
- // the session on the second event. This also ensures we
- // see both events.
- if (++encryptedEventCount != 2)
- return;
-
- assert_false(video.mediaKeys === null, "video.mediaKeys is null.");
- var mediaKeySession = video.mediaKeys.createSession();
- waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
- mediaKeySession.generateRequest(event.initDataType, event.initData).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function onMessage(event)
- {
- assert_true(event instanceof window.MediaKeyMessageEvent);
- assert_equals(event.type, 'message');
- assert_equals(event.messageType, 'license-request');
-
- var keyId = extractSingleKeyIdFromMessage(event.message);
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
- event.target.update(jwkSet).then(function(result) {
- isUpdatePromiseResolved = true;
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function onPlaying(event)
- {
- // Not using waitForEventAndRunStep() to avoid too many
- // EVENT(onTimeUpdate) logs.
- video.addEventListener('timeupdate', onTimeUpdate, true);
- }
-
- function onTimeUpdate(event)
- {
- if (event.target.currentTime < 0.2 || !isUpdatePromiseResolved)
- return;
-
- video.removeEventListener('timeupdate', onTimeUpdate, true);
-
- if (playbackCount > 2) {
- test.done();
- return;
- }
-
- playbackCount++;
-
- resetSrc().then(function(){
- startPlayback();
- });
- }
-
- function resetSrc() {
- encryptedEventCount = 0;
- 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.
- video.src = unencryptedContent;
- video.play();
- return;
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(encryptedContent)).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- return video.setMediaKeys(mediaKeys);
- }).then(function(result) {
- video.src = encryptedContent;
- assert_false(video.mediaKeys === null, "video.mediaKeys is null.");
- video.play();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- waitForEventAndRunStep('playing', video, onPlaying, test);
- waitForEventAndRunStep('encrypted', video, onEncrypted, test);
- startPlayback();
- }, 'Multiple playbacks alternating between encrypted and clear sources.');
- </script>
- </body>
-</html>
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
deleted file mode 100644
index 8bf94e13c9d..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-multiple-sessions.html
+++ /dev/null
@@ -1,143 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- async_test(function(test)
- {
- var video = document.getElementById('testVideo');
- var content = 'webm/test-encrypted-different-av-keys.webm';
- var audioMediaKeySession = null;
- var videoMediaKeySession = null;
- var audioInitDataType = null;
- var videoInitDataType = null;
- var audioInitData = null;
- var videoInitData = null;
- var audioKeyProvided = false;
- var videoKeyProvided = false;
-
- // The 2 streams use different key ids and different keys.
- var audioKeyId = '1234567890123456';
- var audioKey = new Uint8Array([0x30, 0x30, 0x62, 0xF1, 0x68, 0x14, 0xD2, 0x7B,
- 0x68, 0xEF, 0x12, 0x2A, 0xFC, 0xE4, 0xAE, 0x0A]);
- var videoKeyId = '0123456789012345';
- var videoKey = new Uint8Array([0x7A, 0x7A, 0x62, 0xF1, 0x68, 0x14, 0xD2, 0x7B,
- 0x68, 0xEF, 0x12, 0x2A, 0xFC, 0xE4, 0xAE, 0x0A]);
-
- function onEncrypted(event)
- {
- var keyId = String.fromCharCode.apply(null, new Uint8Array(event.initData));
-
- // To avoid issues when comparing the expected.txt file
- // (which logs the events in the order they occur), save
- // the initData and make the calls to generateRequest()
- // only after both "onencrypted" events are received.
- // This prevents a "message" event from occurring before
- // both "onencrypted" events are received.
- var mediaKeySession = video.mediaKeys.createSession();
- if (keyId == videoKeyId) {
- assert_equals(videoMediaKeySession, null);
- videoMediaKeySession = mediaKeySession;
- videoInitDataType = event.initDataType;
- videoInitData = event.initData;
- // Return if audio "onencrypted" event not yet received.
- if (audioMediaKeySession == null)
- return;
- } else {
- assert_equals(keyId, audioKeyId);
- assert_equals(audioMediaKeySession, null);
- audioMediaKeySession = mediaKeySession;
- audioInitDataType = event.initDataType;
- audioInitData = event.initData;
- // Return if video "onencrypted" event not yet received.
- if (videoMediaKeySession == null)
- return;
- }
-
- // Both sessions have been created.
- assert_not_equals(videoMediaKeySession, null);
- assert_not_equals(audioMediaKeySession, null);
-
- var promises = [];
- waitForEventAndRunStep('message', videoMediaKeySession, onMessage, test);
- promises.push(videoMediaKeySession.generateRequest(videoInitDataType, videoInitData));
-
- waitForEventAndRunStep('message', audioMediaKeySession, onMessage, test);
- promises.push(audioMediaKeySession.generateRequest(audioInitDataType, audioInitData));
-
- Promise.all(promises).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function onMessage(event)
- {
- assert_equals(event.messageType, 'license-request');
- var keyId = extractSingleKeyIdFromMessage(event.message);
- if (event.target == videoMediaKeySession) {
- assert_equals(String.fromCharCode.apply(null, keyId), videoKeyId);
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, videoKey)));
- videoMediaKeySession.update(jwkSet).then(function(result) {
- videoKeyProvided = true;
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- } else {
- assert_equals(event.target, audioMediaKeySession);
- assert_equals(String.fromCharCode.apply(null, keyId), audioKeyId);
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, audioKey)));
- audioMediaKeySession.update(jwkSet).then(function(result) {
- audioKeyProvided = true;
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
- }
-
- function onPlaying(event)
- {
- // Video should not start playing until both keys have been
- // provided.
- assert_true(videoKeyProvided);
- assert_true(audioKeyProvided);
-
- // Not using waitForEventAndRunStep() to avoid too many
- // EVENT(onTimeUpdate) logs.
- video.addEventListener('timeupdate', onTimeUpdate, true);
- }
-
- function onTimeUpdate(event)
- {
- if (event.target.currentTime < 0.2)
- return;
-
- test.done();
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- waitForEventAndRunStep('encrypted', video, onEncrypted, test);
- waitForEventAndRunStep('playing', video, onPlaying, test);
- video.src = content;
- return video.setMediaKeys(mediaKeys);
- }).then(function(result) {
- video.play();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Playback using Clear Key key system with multiple sessions.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-after-src.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-after-src.html
deleted file mode 100644
index 2a8cac48661..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-after-src.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Clear Key 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>
- <div id="log"></div>
- <script>
- async_test(function(test)
- {
- var video = document.getElementById('testVideo');
- var content = 'webm/test-encrypted.webm';
- var isUpdatePromiseResolved = false;
- var encryptedEventCount = 0;
-
- var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
-
- function onEncrypted(event)
- {
- assert_equals(event.target, video);
- assert_true(event instanceof window.MediaEncryptedEvent);
- assert_equals(event.type, 'encrypted');
-
- // The same decryption key is used by both the audio and
- // the video streams so only create a session once. To
- // avoid issues when comparing the expected.txt file
- // (which logs the events in the order they occur), create
- // the session on the second event. This also ensures we
- // see both events.
- if (++encryptedEventCount != 2)
- return;
-
- var mediaKeySession = video.mediaKeys.createSession();
- waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
- mediaKeySession.generateRequest(event.initDataType, event.initData).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function onMessage(event)
- {
- assert_true(event instanceof window.MediaKeyMessageEvent);
- assert_equals(event.type, 'message');
- assert_equals(event.messageType, 'license-request');
-
- var keyId = extractSingleKeyIdFromMessage(event.message);
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
- event.target.update(jwkSet).then(function(result) {
- isUpdatePromiseResolved = true;
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function onPlaying(event)
- {
- // Not using waitForEventAndRunStep() to avoid too many
- // EVENT(onTimeUpdate) logs.
- video.addEventListener('timeupdate', onTimeUpdate, true);
- }
-
- function onTimeUpdate(event)
- {
- if (event.target.currentTime < 0.2 || !isUpdatePromiseResolved)
- return;
-
- test.done();
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
-
- waitForEventAndRunStep('encrypted', video, onEncrypted, test);
- waitForEventAndRunStep('playing', video, onPlaying, test);
-
- video.src = content;
- return video.setMediaKeys(mediaKeys);
- }).then(function(result) {
- video.play();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Playback using Clear Key key system, calling setMediaKeys() after setting src attribute.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-before-src.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-before-src.html
deleted file mode 100644
index 84100570c22..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-setmediakeys-before-src.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Clear Key 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>
- <div id="log"></div>
- <script>
- async_test(function(test)
- {
- var video = document.getElementById('testVideo');
- var content = 'webm/test-encrypted.webm';
- var isUpdatePromiseResolved = false;
- var encryptedEventCount = 0;
-
- var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
-
- function onEncrypted(event)
- {
- assert_equals(event.target, video);
- assert_true(event instanceof window.MediaEncryptedEvent);
- assert_equals(event.type, 'encrypted');
-
- // The same decryption key is used by both the audio and
- // the video streams so only create a session once. To
- // avoid issues when comparing the expected.txt file
- // (which logs the events in the order they occur), create
- // the session on the second event. This also ensures we
- // see both events.
- if (++encryptedEventCount != 2)
- return;
-
- var mediaKeySession = video.mediaKeys.createSession();
- waitForEventAndRunStep('message', mediaKeySession, onMessage, test);
- mediaKeySession.generateRequest(event.initDataType, event.initData).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function onMessage(event)
- {
- assert_true(event instanceof window.MediaKeyMessageEvent);
- assert_equals(event.type, 'message');
- assert_equals(event.messageType, 'license-request');
-
- var keyId = extractSingleKeyIdFromMessage(event.message);
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
- event.target.update(jwkSet).then(function(result) {
- isUpdatePromiseResolved = true;
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }
-
- function onPlaying(event)
- {
- // Not using waitForEventAndRunStep() to avoid too many
- // EVENT(onTimeUpdate) logs.
- video.addEventListener('timeupdate', onTimeUpdate, true);
- }
-
- function onTimeUpdate(event)
- {
- if (event.target.currentTime < 0.2 || !isUpdatePromiseResolved)
- return;
-
- test.done();
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
-
- waitForEventAndRunStep('encrypted', video, onEncrypted, test);
- waitForEventAndRunStep('playing', video, onPlaying, test);
-
- return video.setMediaKeys(mediaKeys);
- }).then(function(result) {
- video.src = content;
- video.play();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Playback using Clear Key key system, calling setMediaKeys() before setting src attribute.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-two-videos.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-two-videos.html
deleted file mode 100644
index 0bdc7757ba0..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-playback-two-videos.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <head>
- <title>Clear Key Play Two Videos At Same Time</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>
- <video id="secondVideo"></video>
- <div id="log"></div>
- <script>
- // As this code doesn't wait for the 'message' event to simplify
- // the code, specify the key ID and key used by the encrypted
- // content.
- var keyId = stringToUint8Array('0123456789012345');
- var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
- var content = 'webm/test-encrypted.webm';
-
- promise_test(function(test)
- {
- var promises = [
- play_video_as_promise(document.getElementById('testVideo'), content),
- play_video_as_promise(document.getElementById('secondVideo'), content)
- ];
- return Promise.all(promises);
- }, 'Play two videos at the same time.');
-
- function play_video_as_promise(video, content)
- {
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- return video.setMediaKeys(mediaKeys);
- }).then(function(result) {
- video.src = content;
- video.play();
- return wait_for_encrypted_message(video);
- }).then(function(result) {
- return wait_for_timeupdate_message(video);
- });
- };
-
- function wait_for_encrypted_message(video)
- {
- var encryptedEventCount = 0;
- return new Promise(function(resolve) {
- video.addEventListener('encrypted', function listener(e) {
- // The same decryption key is used by both the audio
- // and the video streams so only create a session once.
- // Create the session on the second event. This also
- // ensures we see both events.
- if (++encryptedEventCount != 2)
- return;
- video.removeEventListener('encrypted', listener);
-
- var mediaKeySession = video.mediaKeys.createSession();
- mediaKeySession.generateRequest(e.initDataType, e.initData).then(function(result) {
- // Don't bother waiting for the 'message' event.
- // Just call update() since we know the keyId
- // needed.
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
- return mediaKeySession.update(jwkSet);
- }).then(function(result) {
- resolve(result);
- });
- });
- });
- };
-
- function wait_for_timeupdate_message(video)
- {
- return new Promise(function(resolve) {
- video.addEventListener('timeupdate', function listener(e) {
- if (e.target.currentTime < 0.2)
- return;
- video.removeEventListener('timeupdate', listener);
- resolve(e);
- });
- });
- };
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-requestmediakeysystemaccess.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-requestmediakeysystemaccess.html
deleted file mode 100644
index 456f37f5774..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-requestmediakeysystemaccess.html
+++ /dev/null
@@ -1,322 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <script>
- function expect_error(keySystem, configurations, expectedError, testName) {
- promise_test(function(test) {
- return navigator.requestMediaKeySystemAccess(keySystem, configurations).then(function(a) {
- assert_unreached('Unexpected requestMediaKeySystemAccess() success.');
- }, function(e) {
- assert_equals(e.name, expectedError);
- });
- }, testName);
- }
-
- 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, 'getConfiguration()');
- });
- }, testName);
- }
-
- // Tests for keySystem.
- expect_error('', [{}], 'InvalidAccessError', 'Empty keySystem');
- expect_error('com.example.unsupported', [{}], 'NotSupportedError', 'Unsupported keySystem');
- expect_error('org.w3.clearkey.', [{}], 'NotSupportedError', 'keySystem ends with "."');
- expect_error('org.w3.ClearKey', [{}], 'NotSupportedError', 'Capitalized keySystem');
- expect_error('org.w3.clearke\u028F', [{}], 'NotSupportedError', 'Non-ASCII keySystem');
-
- // Parent of Clear Key not supported.
- expect_error('org', [{}], 'NotSupportedError', 'Parent of Clear Key (org)');
- expect_error('org.', [{}], 'NotSupportedError', 'Parent of Clear Key (org.)');
- expect_error('org.w3', [{}], 'NotSupportedError', 'Parent of Clear Key (org.w3)');
- expect_error('org.w3.', [{}], 'NotSupportedError', 'Parent of Clear Key (org.w3.)');
-
- // Child of Clear Key not supported.
- expect_error('org.w3.clearkey.foo', [{}], 'NotSupportedError', 'Child of Clear Key');
-
- // Prefixed Clear Key not supported.
- expect_error('webkit-org.w3.clearkey', [{}], 'NotSupportedError', 'Prefixed Clear Key');
-
- // Incomplete names.
- expect_error('org.w3.learkey', [{}], 'NotSupportedError', 'Incomplete name org.w3.learkey');
- expect_error('org.w3.clearke', [{}], 'NotSupportedError', 'Incomplete name org.w3.clearke');
- expect_error('or.w3.clearkey', [{}], 'NotSupportedError', 'Incomplete name or.w3.clearkey');
-
- // Spaces in key system name not supported.
- expect_error(' org.w3.clearkey', [{}], 'NotSupportedError', 'Leading space in key system name');
- expect_error('org.w3. clearkey', [{}], 'NotSupportedError', 'Extra space in key system name');
- expect_error('org.w3.clearkey ', [{}], 'NotSupportedError', 'Trailing space in key system name');
-
- // Extra dots in key systems names not supported.
- expect_error('.org.w3.clearkey', [{}], 'NotSupportedError', 'Leading dot in key systems name');
- expect_error('org.w3.clearkey.', [{}], 'NotSupportedError', 'Trailing dot in key systems name');
- expect_error('org.w3..clearkey', [{}], 'NotSupportedError', 'Double dot in key systems name');
- expect_error('org.w3.clear.key', [{}], 'NotSupportedError', 'Extra dot in key systems name');
-
- // Key system name is case sensitive.
- expect_error('org.w3.Clearkey', [{}], 'NotSupportedError', 'Key system name is case sensitive');
- expect_error('Org.w3.clearkey', [{}], 'NotSupportedError', 'Key system name is case sensitive');
-
- // Tests for trivial configurations.
- expect_error('org.w3.clearkey', [], 'InvalidAccessError', 'Empty supportedConfigurations');
- expect_config('org.w3.clearkey', [{}], {}, 'Empty configuration');
-
- // Various combinations of supportedConfigurations.
- // TODO(jrummell): Specifying contentType without codecs is
- // deprecated, so this test should fail. http://crbug.com/605661.
- expect_config('org.w3.clearkey', [{
- initDataTypes: ['webm'],
- audioCapabilities: [{contentType: 'audio/webm'}],
- videoCapabilities: [{contentType: 'video/webm'}],
- }], {
- initDataTypes: ['webm'],
- audioCapabilities: [{contentType: 'audio/webm'}],
- videoCapabilities: [{contentType: 'video/webm'}],
- }, 'Basic supported configuration');
-
- // TODO(jrummell): Specifying contentType without codecs is
- // deprecated, so this test should fail. http://crbug.com/605661.
- expect_config('org.w3.clearkey', [{
- initDataTypes: ['fakeidt', 'webm'],
- audioCapabilities: [{contentType: 'audio/fake'}, {contentType: 'audio/webm'}],
- videoCapabilities: [{contentType: 'video/fake'}, {contentType: 'video/webm'}],
- }], {
- initDataTypes: ['webm'],
- audioCapabilities: [{contentType: 'audio/webm'}],
- videoCapabilities: [{contentType: 'video/webm'}],
- }, 'Partially supported configuration');
-
- expect_config('org.w3.clearkey', [{
- audioCapabilities: [{contentType: 'audio/webm; codecs=vorbis'}],
- }], {
- audioCapabilities: [{contentType: 'audio/webm; codecs=vorbis'}],
- }, 'Supported audio codec');
-
- expect_config('org.w3.clearkey', [{
- audioCapabilities: [{contentType: 'audio/webm; codecs="vorbis"'}],
- }], {
- audioCapabilities: [{contentType: 'audio/webm; codecs="vorbis"'}],
- }, 'ContentType formatting must be preserved');
-
- expect_error('org.w3.clearkey', [{
- audioCapabilities: [{contentType: 'audio/webm; codecs=fake'}],
- }], 'NotSupportedError', 'Unsupported audio codec');
-
- expect_error('org.w3.clearkey', [{
- audioCapabilities: [
- {contentType: 'audio/webm; codecs=mp4a'},
- {contentType: 'audio/webm; codecs=mp4a.40.2'}
- ],
- }], 'NotSupportedError', 'Mismatched audio container/codec');
-
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; codecs=vp8'}],
- }], {
- videoCapabilities: [{contentType: 'video/webm; codecs=vp8'}],
- }, 'Supported video codec');
-
- expect_error('org.w3.clearkey', [{
- audioCapabilities: [{contentType: 'video/webm; codecs=vp8'}],
- }], 'NotSupportedError', 'Video codec specified in audio field');
-
- expect_error('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'audio/webm; codecs=vorbis'}],
- }], 'NotSupportedError', 'Audio codec specified in video field');
-
- expect_error('org.w3.clearkey', [{
- audioCapabilities: [{contentType: 'video/webm; codecs=fake'}],
- }], 'NotSupportedError', 'Unsupported video codec');
-
- expect_error('org.w3.clearkey', [{
- audioCapabilities: [
- {contentType: 'audio/webm; codecs=avc1'},
- {contentType: 'audio/webm; codecs=avc1.42e01e'}
- ],
- }], 'NotSupportedError', 'Mismatched video container/codec');
-
- expect_config('org.w3.clearkey', [
- {initDataTypes: ['fakeidt']},
- {initDataTypes: ['webm']}
- ], {initDataTypes: ['webm']}, 'Two configurations, one supported');
-
- expect_config('org.w3.clearkey', [
- {initDataTypes: ['webm']},
- {}
- ], {initDataTypes: ['webm']}, 'Two configurations, both supported');
-
- // Audio MIME type does not support video codecs.
- expect_error('org.w3.clearkey', [{
- 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.');
-
- // Video MIME type does not support audio codecs.
- expect_error('org.w3.clearkey', [{
- 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 does not support AVC1/AAC.
- expect_error('org.w3.clearkey', [{
- 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.');
-
- expect_error('org.w3.clearkey', [{
- 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.');
-
- // Extra space is allowed in contentType.
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: ' video/webm; codecs="vp8"'}],
- }], {
- videoCapabilities: [{contentType: ' video/webm; codecs="vp8"'}],
- }, 'Leading space in contentType');
-
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm ; codecs="vp8"'}],
- }], {
- videoCapabilities: [{contentType: 'video/webm ; codecs="vp8"'}],
- }, 'Space before ; in contentType');
-
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; codecs="vp8"'}],
- }], {
- videoCapabilities: [{contentType: 'video/webm; codecs="vp8"'}],
- }, 'Extra spaces after ; in contentType');
-
- // TODO(jrummell): contentType should allow white space at the
- // end of the string. http://crbug.com/487392
-// expect_config('org.w3.clearkey', [{
-// videoCapabilities: [{contentType: 'video/webm; codecs="vp8" '}],
-// }], {
-// videoCapabilities: [{contentType: 'video/webm; codecs="vp8" '}],
-// }, 'Trailing space in contentType');
-
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; codecs=" vp8"'}],
- }], {
- videoCapabilities: [{contentType: 'video/webm; codecs=" vp8"'}],
- }, 'Space at start of codecs parameter');
-
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; codecs="vp8 "'}],
- }], {
- videoCapabilities: [{contentType: 'video/webm; codecs="vp8 "'}],
- }, 'Space at end of codecs parameter');
-
- // contentType is not case sensitive (except the codec names).
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'Video/webm; codecs="vp8"'}],
- }], {
- videoCapabilities: [{contentType: 'Video/webm; codecs="vp8"'}],
- }, 'Video/webm');
-
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/Webm; codecs="vp8"'}],
- }], {
- videoCapabilities: [{contentType: 'video/Webm; codecs="vp8"'}],
- }, 'video/Webm');
-
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; Codecs="vp8"'}],
- }], {
- videoCapabilities: [{contentType: 'video/webm; Codecs="vp8"'}],
- }, 'Codecs=');
-
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'VIDEO/WEBM; codecs="vp8"'}],
- }], {
- videoCapabilities: [{contentType: 'VIDEO/WEBM; codecs="vp8"'}],
- }, 'VIDEO/WEBM');
-
- expect_config('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; CODECS="vp8"'}],
- }], {
- videoCapabilities: [{contentType: 'video/webm; CODECS="vp8"'}],
- }, 'CODECS=');
-
- // Unrecognized attributes are not allowed.
- // TODO(jrummell): Unrecognized attributes are ignored currently.
- // http://crbug.com/449690
-// expect_error('org.w3.clearkey', [{
-// videoCapabilities: [{contentType: 'video/webm; foo="bar"'}],
-// }], 'NotSupportedError', 'Unrecognized foo');
-// expect_error('org.w3.clearkey', [{
-// videoCapabilities: [{contentType: 'video/webm; foo="bar"; codecs="vp8"'}],
-// }], 'NotSupportedError', 'Unrecognized foo with codecs');
-
- // Invalid contentTypes.
- expect_error('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'fake'}],
- }], 'NotSupportedError', 'contentType fake');
-
- expect_error('org.w3.clearkey', [{
- audioCapabilities: [{contentType: 'audio/fake'}],
- }], 'NotSupportedError', 'contentType audio/fake');
-
- expect_error('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/fake'}],
- }], 'NotSupportedError', 'contentType video/fake');
-
- // The actual codec names are case sensitive.
- expect_error('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; codecs="Vp8"'}],
- }], 'NotSupportedError', 'codecs Vp8');
-
- expect_error('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; codecs="VP8"'}],
- }], 'NotSupportedError', 'codecs VP8');
-
- // Extra comma is not allowed in codecs.
- expect_error('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; codecs=",vp8"'}],
- }], 'NotSupportedError', 'Leading , in codecs');
-
- expect_error('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; codecs="vp8,"'}],
- }], 'NotSupportedError', 'Trailing , in codecs');
-
- expect_error('org.w3.clearkey', [{
- videoCapabilities: [{contentType: 'video/webm; codecs=",vp8,"'}],
- }], 'NotSupportedError', 'Leading and trailing , in codecs');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index 15c91a001c3..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-reset-src-after-setmediakeys.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- async_test(function(test)
- {
- var mediaKeys;
- var encryptedEventIndex = 0;
- var video = document.getElementById('testVideo');
- assert_not_equals(video, null);
-
- // Content to be played. These files must be the same format.
- var content = 'webm/test-encrypted.webm';
- var alternateContent = 'webm/test-encrypted-different-av-keys.webm';
-
- var onEncrypted = function(event)
- {
- ++encryptedEventIndex;
- assert_not_equals(video.mediaKeys, null);
- assert_true(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; set src to a different video.
- video.src = alternateContent;
- } else if (encryptedEventIndex == 4) {
- // Finished second video.
- test.done();
- }
- };
-
- // Create a MediaKeys object and assign it to video.
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content))
- .then(function(access) {
- assert_equals(access.keySystem, 'org.w3.clearkey');
- return access.createMediaKeys();
- }).then(function(result) {
- mediaKeys = result;
- assert_not_equals(mediaKeys, null);
- return video.setMediaKeys(mediaKeys);
- }).then(function(result) {
- assert_not_equals(video.mediaKeys, null, 'not set initially');
- assert_true(video.mediaKeys === mediaKeys);
-
- // Set src to a video.
- waitForEventAndRunStep('encrypted', video, onEncrypted, test);
- video.src = content;
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Reset src after setMediaKeys().');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index 577047a251d..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-session-closed-event.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <script>
- async_test(function(test)
- {
- var initDataType;
- var initData;
- var mediaKeySession;
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- mediaKeySession = mediaKeys.createSession();
- return mediaKeySession.generateRequest(initDataType, initData);
- }).then(function() {
- // Wait for the session to be closed.
- 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);
- test.done();
- });
-
- // release() should result in the closed promise being
- // fulfilled.
- return mediaKeySession.close();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Test MediaKeySession closed event.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index 29f53b31d7a..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-playback.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- promise_test(function(test)
- {
- var video = document.getElementById('testVideo');
- var keyId = stringToUint8Array('0123456789012345');
- var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
- var content = 'webm/test-encrypted.webm';
- var duration = 0.2;
-
- return createMediaKeys(keyId, rawKey).then(function(mediaKeys) {
- return video.setMediaKeys(mediaKeys);
- }).then(function() {
- return playVideoAndWaitForTimeupdate(video, content, duration);
- }).then(function() {
- // Now create a second MediaKeys.
- return createMediaKeys(keyId, rawKey);
- }).then(function(mediaKeys) {
- // video is currently playing, so should not be able to
- // change MediaKeys now.
- assert_false(video.ended);
- return video.setMediaKeys(mediaKeys);
- }).then(function() {
- assert_unreached('Able to change MediaKeys while playing.');
- }, function(error) {
- // Error expected.
- assert_equals(error.name, 'InvalidStateError');
- return Promise.resolve('success');
- });
- }, 'setMediaKeys() again after playback');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index 8f6891b79c1..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-again-after-resetting-src.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- promise_test(function(test)
- {
- var video = document.getElementById('testVideo');
- var keyId = stringToUint8Array('0123456789012345');
- var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
- var content = 'webm/test-encrypted.webm';
- var duration = 0.2;
-
- return createMediaKeys(keyId, rawKey).then(function(mediaKeys) {
- return video.setMediaKeys(mediaKeys);
- }).then(function() {
- return playVideoAndWaitForTimeupdate(video, content, duration);
- }).then(function() {
- // Now create a second MediaKeys and repeat.
- return createMediaKeys(keyId, rawKey);
- }).then(function(mediaKeys) {
- // MediaKeys is use by previous video, so clear .src
- // so that MediaKeys can be assigned.
- video.src = '';
- return video.setMediaKeys(mediaKeys);
- }).then(function() {
- return playVideoAndWaitForTimeupdate(video, content, duration);
- });
- }, 'setMediaKeys() again after resetting src');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index 01fd7b19402..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-at-same-time.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- // Wait for an 'encrypted' event as a promise.
- function wait_for_encrypted_event(video)
- {
- return new Promise(function(resolve) {
- video.addEventListener('encrypted', function listener(e) {
- video.removeEventListener('encrypted', listener);
- resolve();
- });
- });
- };
-
- // Return a promise that calls setMediaKeys() and returns 1 if
- // resolved, 0 if rejected. If |must_succeed| is true, then
- // setMediaKeys() should not fail.
- function setMediaKeys_as_count(video, mediaKeys, must_succeed)
- {
- return video.setMediaKeys(mediaKeys).then(function() {
- return 1;
- }, function() {
- assert_false(must_succeed);
- return 0;
- });
- };
-
- // Return the sum of the results from |promises|. Each promise
- // must return a number.
- function count_promise_results(promises)
- {
- var count = 0;
- var result = Promise.resolve(null);
-
- promises.forEach(function(promise) {
- result = result.then(function() {
- return promise;
- }).then(function(i) {
- count += i;
- });
- });
-
- return result.then(function() { return count; });
- };
-
- promise_test(function(test)
- {
- var video = document.getElementById('video');
- var content = 'webm/test-encrypted.webm';
- var access;
- var mediaKeys1;
- var mediaKeys2;
- var mediaKeys3;
- var mediaKeys4;
- var mediaKeys5;
-
- // Start a video now so that it is waiting for MediaKeys
- // in order to continue.
- video.src = content;
- video.play();
- return wait_for_encrypted_event(video).then(function() {
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content));
- }).then(function(result) {
- access = result;
- 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;
- // Create 5 calls to setMediaKeys(). The first one must
- // succeed, the others are optional.
- var p1 = setMediaKeys_as_count(video, mediaKeys1, true);
- var p2 = setMediaKeys_as_count(video, mediaKeys2, false);
- var p3 = setMediaKeys_as_count(video, mediaKeys3, false);
- var p4 = setMediaKeys_as_count(video, mediaKeys4, false);
- var p5 = setMediaKeys_as_count(video, mediaKeys5, false);
- return count_promise_results([p1, p2, p3, p4, p5]);
- }).then(function(count) {
- // At least one of the setMediaKeys() calls should have
- // succeeded.
- assert_greater_than(count, 0);
- });
- }, 'Set MediaKeys multiple times in parallel.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index 31cc6107964..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-different-mediakeys.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- promise_test(function(test)
- {
- var video = document.getElementById('video');
- var content = 'webm/test-encrypted.webm';
- var keySystemAccess;
- var mediaKeys1;
- var mediaKeys2;
-
- assert_equals(video.mediaKeys, null);
-
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) {
- keySystemAccess = access;
- // Create a mediaKeys.
- return keySystemAccess.createMediaKeys();
- }).then(function(result) {
- mediaKeys1 = result;
- assert_not_equals(mediaKeys1, null);
- // Create a second mediaKeys.
- return keySystemAccess.createMediaKeys();
- }).then(function(result) {
- mediaKeys2 = result;
- assert_not_equals(mediaKeys2, null);
- // Set mediaKeys1 on video.
- return video.setMediaKeys(mediaKeys1);
- }).then(function() {
- assert_true(video.mediaKeys === mediaKeys1);
- // Set mediaKeys2 on video (switching MediaKeys).
- return video.setMediaKeys(mediaKeys2);
- }).then(function() {
- assert_true(video.mediaKeys === mediaKeys2);
- // Clear mediaKeys from video.
- return video.setMediaKeys(null);
- }).then(function() {
- assert_equals(video.mediaKeys, null);
- // Set mediaKeys1 on video again.
- return video.setMediaKeys(mediaKeys1);
- }).then(function() {
- assert_true(video.mediaKeys === mediaKeys1);
- // Load the media element to create the WebMediaPlayer.
- video.src = content;
- // Set mediaKeys2 on video (switching MediaKeys) not
- // supported after WebMediaPlayer is created.
- return video.setMediaKeys(mediaKeys2);
- }).then(function() {
- assert_unreached('Switching mediaKeys after setting src should have failed.');
- }, function(error) {
- assert_true(video.mediaKeys === mediaKeys1);
- assert_equals(error.name, 'InvalidStateError');
- assert_not_equals(error.message, '');
- // Return something so the promise resolves properly.
- return Promise.resolve();
- }).then(function() {
- // Set null mediaKeys on video (clearing MediaKeys) not
- // supported after WebMediaPlayer is created.
- return video.setMediaKeys(null);
- }).then(function() {
- assert_unreached('Clearing mediaKeys after setting src should have failed.');
- }, function(error) {
- assert_true(video.mediaKeys === mediaKeys1);
- assert_equals(error.name, 'InvalidStateError');
- assert_not_equals(error.message, '');
- return Promise.resolve();
- });
- }, 'setMediaKeys() multiple times with different MediaKeys.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index 64ed315e0c9..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-multiple-times-with-the-same-mediakeys.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- promise_test(function(test)
- {
- var video = document.getElementById('video');
- var content = 'webm/test-encrypted.webm';
- var mediaKeys;
-
- assert_equals(video.mediaKeys, null);
-
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) {
- return access.createMediaKeys();
- }).then(function(result) {
- mediaKeys = result;
- assert_not_equals(mediaKeys, null);
- // Set mediaKeys on video should work.
- return video.setMediaKeys(mediaKeys);
- }).then(function() {
- assert_true(video.mediaKeys === mediaKeys);
- // Set mediaKeys on video again should return a resolved
- // promise.
- return video.setMediaKeys(mediaKeys);
- }).then(function() {
- assert_true(video.mediaKeys === mediaKeys);
- // Load the media element to create the WebMediaPlayer.
- video.src = content;
- // Set mediaKeys again on video should still return a
- // resolved promise.
- return video.setMediaKeys(mediaKeys);
- }).then(function() {
- assert_true(video.mediaKeys === mediaKeys);
- });
- }, 'setMediaKeys() multiple times with the same MediaKeys.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index fb8386e8cff..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys-to-multiple-video-elements.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <video id="video2"></video>
- <div id="log"></div>
- <script>
- promise_test(function(test)
- {
- var video1 = document.getElementById('video1');
- var video2 = document.getElementById('video2');
- var mediaKeys;
-
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- return access.createMediaKeys();
- }).then(function(result) {
- mediaKeys = result;
- // Assignment to video1 should work.
- return video1.setMediaKeys(mediaKeys);
- }).then(function() {
- // Assignment to video2 should fail.
- return video2.setMediaKeys(mediaKeys);
- }).then(function() {
- assert_unreached('Second setMediaKeys should have failed.');
- }, 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);
- });
- }, 'setMediaKeys() on multiple video elements.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys.html
deleted file mode 100644
index 96b0fed974f..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-setmediakeys.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- async_test(function(test)
- {
- var mediaKeys;
- var video = document.getElementById('video');
- assert_not_equals(video, null);
-
- // Test MediaKeys assignment.
- assert_equals(video.mediaKeys, null);
- assert_equals(typeof video.setMediaKeys, 'function');
-
- // Try setting mediaKeys to null.
- video.setMediaKeys(null).then(function(result) {
- assert_equals(video.mediaKeys, null);
-
- // Try setting mediaKeys to the wrong type of object.
- return video.setMediaKeys(new Date());
- }).then(function(result) {
- assert_unreached('setMediaKeys did not fail when setting to Date()');
- }, function(error) {
- // TypeError expected.
- assert_equals(error.name, 'TypeError');
-
- // Create a MediaKeys object and assign it to video.
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration());
- }).then(function(access) {
- assert_equals(access.keySystem, 'org.w3.clearkey');
- 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_true(video.mediaKeys === mediaKeys);
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error);
- });
- }, 'Setting MediaKeys on a video object.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-syntax.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-syntax.html
deleted file mode 100644
index 5c4c667cb99..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-syntax.html
+++ /dev/null
@@ -1,1017 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- // Since promises catch any exception and convert it into a
- // rejected Promise, there is no current way to have the W3C
- // test framework report a failed test. For now, simply force
- // a timeout to indicate failure.
- // FIXME: Once W3C test framework handles Promises, fix this.
-
- // 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));
- }
- }
-
- var kRequestMediaKeySystemAccessExceptionsTestCases = [
- // Too few parameters.
- {
- exception: 'TypeError',
- func: function() { return navigator.requestMediaKeySystemAccess(); }
- },
- {
- exception: 'TypeError',
- func: function() { return navigator.requestMediaKeySystemAccess('org.w3.clearkey'); }
- },
- // 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: 'InvalidAccessError',
- func: function() { return navigator.requestMediaKeySystemAccess(new Uint8Array(0), [{}]); }
- },
- {
- exception: 'InvalidAccessError',
- func: function() { return navigator.requestMediaKeySystemAccess('', [{}]); }
- },
- {
- exception: 'NotSupportedError',
- func: function() { return navigator.requestMediaKeySystemAccess('unsupported', [{}]); }
- },
- // Non-ASCII names.
- {
- exception: 'NotSupportedError',
- func: function() { return navigator.requestMediaKeySystemAccess('org.w3\u263A.clearkey', [{}]); }
- },
- // Empty sequence of MediaKeySystemConfiguration.
- {
- exception: 'InvalidAccessError',
- func: function() { return navigator.requestMediaKeySystemAccess('org.w3.clearkey', []); }
- },
- // Invalid sequences of MediaKeySystemConfigurations.
- {
- exception: 'TypeError',
- func: function() { return navigator.requestMediaKeySystemAccess('org.w3.clearkey', {}); }
- },
- {
- exception: 'TypeError',
- func: function() { return navigator.requestMediaKeySystemAccess('org.w3.clearkey', "invalid"); }
- },
- {
- exception: 'TypeError',
- func: function() { return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}, 6]); }
- },
- {
- exception: 'TypeError',
- func: function() { return navigator.requestMediaKeySystemAccess('org.w3.clearkey', ["invalid", "upsupported"]); }
- }
- ];
-
- async_test(function(test)
- {
- var createPromises = kRequestMediaKeySystemAccessExceptionsTestCases.map(function(testCase) {
- return test_exception(testCase);
- });
-
- Promise.all(createPromises).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'requestMediaKeySystemAccess() tests failed');
- });
- }, 'Test Navigator.requestMediaKeySystemAccess() exceptions.');
-
- async_test(function(test)
- {
- assert_equals(typeof navigator.requestMediaKeySystemAccess, 'function');
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) {
- assert_not_equals(access, null);
- assert_equals(typeof access, 'object');
- assert_equals(access.keySystem, 'org.w3.clearkey');
- assert_equals(typeof access.getConfiguration, 'function');
- assert_equals(typeof access.createMediaKeys, 'function');
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'requestMediaKeySystemAccess() tests failed');
- });
- }, 'Test Navigator.requestMediaKeySystemAccess().');
-
- async_test(function(test)
- {
- var access;
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(result) {
- access = result;
- assert_equals(access.keySystem, 'org.w3.clearkey');
- 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');
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'create() tests failed');
- });
- }, 'Test MediaKeySystemAccess createMediaKeys().');
-
- var kCreateSessionExceptionsTestCases = [
- // 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.
-
- // Invalid parameters.
- {
- exception: 'TypeError',
- func: function(mk) { return mk.createSession(); }
- },
- {
- exception: 'TypeError',
- func: function(mk) { return mk.createSession(''); }
- },
- {
- exception: 'TypeError',
- func: function(mk) { return mk.createSession(null); }
- },
- {
- exception: 'TypeError',
- func: function(mk) { return mk.createSession(undefined); }
- },
- {
- exception: 'TypeError',
- func: function(mk) { return mk.createSession(1); }
- },
- {
- exception: 'TypeError',
- func: function(mk) { return mk.createSession(new Uint8Array(0)); }
- },
- {
- exception: 'TypeError',
- func: function(mk) { return mk.createSession('TEMPORARY'); }
- }
- ];
-
- // This function checks that calling createSession() with an
- // unsupported session type doesn't create a MediaKeySession object.
- // Since requestMediaKeySystemAccess() is called without specifying
- // persistent sessions, only temporary sessions will be allowed.
- function test_unsupported_sessionType(mediaKeys)
- {
- var mediaKeySession = 'test';
-
- try {
- mediaKeySession = mediaKeys.createSession('persistent-license');
- assert_unreached('Session should not be created.');
- } catch (error) {
- assert_equals(error.name, 'NotSupportedError');
- assert_not_equals(error.message, "");
-
- // Since createSession() failed, |mediaKeySession| is not
- // touched.
- assert_equals(mediaKeySession, 'test');
- }
- }
-
- async_test(function(test)
- {
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var sessionPromises = kCreateSessionExceptionsTestCases.map(function(testCase) {
- return test_exception(testCase, mediaKeys);
- });
- sessionPromises = sessionPromises.concat(test_unsupported_sessionType(mediaKeys));
-
- assert_not_equals(sessionPromises.length, 0);
- return Promise.all(sessionPromises);
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'createSession() tests failed');
- });
- }, 'Test MediaKeys createSession() exceptions.');
-
- var kGenerateRequestExceptionsTestCases = [
- // 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) { return mk1.createSession().generateRequest(); }
- },
- {
- exception: 'TypeError',
- func: function(mk2) { return mk2.createSession().generateRequest(''); }
- },
- {
- exception: 'TypeError',
- func: function(mk3) { return mk3.createSession().generateRequest(null); }
- },
- {
- exception: 'TypeError',
- func: function(mk4) { return mk4.createSession().generateRequest(undefined); }
- },
- {
- exception: 'TypeError',
- func: function(mk5) { return mk5.createSession().generateRequest(1); }
- },
- {
- exception: 'TypeError',
- func: function(mk6) { return mk6.createSession().generateRequest(new Uint8Array(0)); }
- },
- {
- exception: 'TypeError',
- func: function(mk7, _, initData) { return mk7.createSession().generateRequest(initData); }
- },
- // Invalid parameters.
- {
- exception: 'InvalidAccessError',
- func: function(mk8, _, initData) { return mk8.createSession().generateRequest('', initData); }
- },
- // Not supported initDataTypes.
- {
- exception: 'NotSupportedError',
- func: function(mk9, _, initData) { return mk9.createSession().generateRequest(null, initData); }
- },
- {
- exception: 'NotSupportedError',
- func: function(mk10, _, initData) { return mk10.createSession().generateRequest(undefined, initData); }
- },
- {
- exception: 'NotSupportedError',
- func: function(mk11, _, initData) { return mk11.createSession().generateRequest(1, initData); }
- },
- {
- exception: 'InvalidAccessError',
- func: function(mk12, _, initData) { return mk12.createSession().generateRequest(new Uint8Array(0), initData); }
- },
- {
- exception: 'NotSupportedError',
- func: function(mk13, _, initData) { return mk13.createSession().generateRequest('unsupported', initData); }
- },
- {
- exception: 'NotSupportedError',
- func: function(mk14, _, initData) { return mk14.createSession().generateRequest('video/webm', initData); }
- },
- {
- exception: 'NotSupportedError',
- func: function(mk15, _, initData) { return mk15.createSession().generateRequest('video/mp4', initData); }
- },
- {
- exception: 'NotSupportedError',
- func: function(mk16, _, initData) { return mk16.createSession().generateRequest('video/cenc', initData); }
- },
- {
- exception: 'NotSupportedError',
- func: function(mk17, _, initData) { return mk17.createSession().generateRequest('web\u263A', initData); }
- }
- ];
-
- 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); }
- },
- {
- exception: 'InvalidAccessError',
- func: function(mk6, type) { return mk6.createSession().generateRequest(type, new Uint8Array(0)); }
- }
- ];
-
- async_test(function(test)
- {
- var isWebmSupported;
- var isCencSupported;
-
- isInitDataTypeSupported('webm').then(function(result) {
- isWebmSupported = result;
- return isInitDataTypeSupported('cenc');
- }).then(function(result) {
- isCencSupported = result;
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]);
- }).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var initData = stringToUint8Array('init data');
- var sessionPromises = kGenerateRequestExceptionsTestCases.map(function(testCase) {
- return test_exception(testCase, mediaKeys, '', initData);
- });
-
- // Test that WebM sessions generate the expected error, if
- // supported.
- if (isWebmSupported) {
- var WebmSessionPromises = kTypeSpecificGenerateRequestExceptionsTestCases.map(function(testCase) {
- return test_exception(testCase, mediaKeys, 'webm', getInitData('webm'));
- });
- sessionPromises = sessionPromises.concat(WebmSessionPromises);
- }
-
- // Repeat for MP4, if supported.
- if (isCencSupported) {
- var mp4SessionPromises = kTypeSpecificGenerateRequestExceptionsTestCases.map(function(testCase) {
- return test_exception(testCase, mediaKeys, 'cenc', getInitData('cenc'));
- });
- sessionPromises = sessionPromises.concat(mp4SessionPromises);
- }
-
- assert_not_equals(sessionPromises.length, 0);
- return Promise.all(sessionPromises);
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'generateRequest() tests failed');
- });
- }, 'Test MediaKeys generateRequest() exceptions.');
-
- var kLoadExceptionsTestCases = [
- // Too few parameters.
- {
- exception: 'TypeError',
- func: function(mk1) { return mk1.createSession('temporary').load(); }
- },
- // 'temporary' sessions are never allowed, so always return
- // 'InvalidAccessError'.
- {
- exception: 'InvalidAccessError',
- func: function(mk3) { return mk3.createSession('temporary').load(''); }
- },
- {
- exception: 'InvalidAccessError',
- func: function(mk4) { return mk4.createSession('temporary').load(1); }
- },
- {
- exception: 'InvalidAccessError',
- func: function(mk5) { return mk5.createSession('temporary').load('!@#$%^&*()'); }
- },
- {
- exception: 'InvalidAccessError',
- func: function(mk6) { return mk6.createSession('temporary').load('1234'); }
- }
- ];
-
- async_test(function(test)
- {
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var initData = stringToUint8Array('init data');
- var sessionPromises = kLoadExceptionsTestCases.map(function(testCase) {
- return test_exception(testCase, mediaKeys);
- });
-
- assert_not_equals(sessionPromises.length, 0);
- return Promise.all(sessionPromises);
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'load() tests failed');
- });
- }, 'Test MediaKeys 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 |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, '');
- assert_equals(typeof mediaKeySession.onopen, 'undefined');
- assert_equals(typeof mediaKeySession.onclose, 'undefined');
- assert_equals(typeof mediaKeySession.onerror, 'undefined');
- }
-
- async_test(function(test)
- {
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- kCreateSessionTestCases.map(function(testCase) {
- test_createSession(testCase, mediaKeys);
- });
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'createSession() tests failed');
- });
- }, 'Test MediaKeys createSession().');
-
- // 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)
- {
- try {
- var mediaKeySession = testCase.func.call(null, mediaKeys);
- return mediaKeySession.generateRequest(type, initData);
- } catch (e) {
- assert_true(testCase.isNotSupportedAllowed);
- }
- }
-
- async_test(function(test)
- {
- var isWebmSupported;
- var isCencSupported;
-
- isInitDataTypeSupported('webm').then(function(result) {
- isWebmSupported = result;
- return isInitDataTypeSupported('cenc');
- }).then(function(result) {
- isCencSupported = result;
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]);
- }).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var sessionPromises = [];
-
- // Test that WebM sessions generate the expected error, if
- // supported.
- if (isWebmSupported) {
- var WebmSessionPromises = kCreateSessionTestCases.map(function(testCase) {
- return test_generateRequest(testCase, mediaKeys, 'webm', getInitData('webm'));
- });
- sessionPromises = sessionPromises.concat(WebmSessionPromises);
- }
-
- // Repeat for MP4, if supported.
- if (isCencSupported) {
- var mp4SessionPromises = kCreateSessionTestCases.map(function(testCase) {
- return test_generateRequest(testCase, mediaKeys, 'cenc', getInitData('cenc'));
- });
- sessionPromises = sessionPromises.concat(mp4SessionPromises);
- }
-
- assert_not_equals(sessionPromises.length, 0);
- return Promise.all(sessionPromises);
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'generateRequest() tests failed');
- });
- }, 'Test MediaKeys generateRequest().');
-
- 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); }
- },
- {
- exception: 'InvalidAccessError',
- func: function(s) { return s.update(new Uint8Array(0)); }
- }
- ];
-
- async_test(function(test)
- {
- var isWebmSupported;
- var isCencSupported;
-
- isInitDataTypeSupported('webm').then(function(result) {
- isWebmSupported = result;
- return isInitDataTypeSupported('cenc');
- }).then(function(result) {
- isCencSupported = result;
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]);
- }).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var promises = [];
-
- if (isWebmSupported) {
- var WebmSessionPromises = kUpdateSessionExceptionsTestCases.map(function(testCase) {
- var mediaKeySession = mediaKeys.createSession();
- return mediaKeySession.generateRequest('webm', getInitData('webm')).then(function(result) {
- return test_exception(testCase, mediaKeySession);
- });
- });
- promises = promises.concat(WebmSessionPromises);
- }
-
- if (isCencSupported) {
- var mp4SessionPromises = kUpdateSessionExceptionsTestCases.map(function(testCase) {
- var mediaKeySession = mediaKeys.createSession();
- return mediaKeySession.generateRequest('cenc', getInitData('cenc')).then(function(result) {
- return test_exception(testCase, mediaKeySession);
- });
- });
- promises = promises.concat(mp4SessionPromises);
- }
-
- assert_not_equals(promises.length, 0);
- return Promise.all(promises);
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'update() tests failed');
- });
- }, 'Test MediaKeySession update() exceptions.');
-
- function create_update_test(mediaKeys, type, initData)
- {
- var mediaKeySession = mediaKeys.createSession();
- var promise = mediaKeySession.generateRequest(type, initData).then(function(result) {
- var validLicense = stringToUint8Array(createJWKSet(createJWK(stringToUint8Array('123'), stringToUint8Array('1234567890abcdef'))));
- return mediaKeySession.update(validLicense);
- }).then(function(result) {
- // Call update() with a different license and an extra
- // parameter. The extra parameter is ignored.
- var validLicense = stringToUint8Array(createJWKSet(createJWK(stringToUint8Array('4567890'), stringToUint8Array('01234567890abcde'))));
- return mediaKeySession.update(validLicense, 'extra');
- });
- return promise;
- }
-
- async_test(function(test)
- {
- var isWebmSupported;
- var isCencSupported;
-
- isInitDataTypeSupported('webm').then(function(result) {
- isWebmSupported = result;
- return isInitDataTypeSupported('cenc');
- }).then(function(result) {
- isCencSupported = result;
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]);
- }).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var promises = [];
-
- if (isWebmSupported) {
- promises.push(create_update_test(mediaKeys, 'webm', getInitData('webm')));
- }
-
- if (isCencSupported) {
- promises.push(create_update_test(mediaKeys, 'cenc', getInitData('cenc')));
- }
-
- assert_not_equals(promises.length, 0);
- return Promise.all(promises);
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'update() tests failed');
- });
- }, 'Test MediaKeySession update().');
-
- function create_close_exception_test(mediaKeys, type, initData)
- {
- 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();
- });
- }
-
- async_test(function(test)
- {
- var isWebmSupported;
- var isCencSupported;
-
- isInitDataTypeSupported('webm').then(function(result) {
- isWebmSupported = result;
- return isInitDataTypeSupported('cenc');
- }).then(function(result) {
- isCencSupported = result;
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]);
- }).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var promises = [];
-
- if (isWebmSupported) {
- promises.push(create_close_exception_test(mediaKeys, 'webm', getInitData('webm')));
- }
-
- if (isCencSupported) {
- promises.push(create_close_exception_test(mediaKeys, 'cenc', getInitData('cenc')));
- }
-
- assert_not_equals(promises.length, 0);
- return Promise.all(promises);
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'close() exception tests failed');
- });
- }, 'Test MediaKeySession close() exceptions.');
-
-
- function create_close_test(mediaKeys, type, initData)
- {
- var mediaKeySession = mediaKeys.createSession();
- var promise = mediaKeySession.generateRequest(type, initData).then(function(result) {
- return mediaKeySession.close();
- }).then(function(result) {
- // Call close() again with an extra parameter. The extra
- // parameter is ignored.
- return mediaKeySession.close('extra');
- });
- return promise;
- }
-
- async_test(function(test)
- {
- var isWebmSupported;
- var isCencSupported;
-
- isInitDataTypeSupported('webm').then(function(result) {
- isWebmSupported = result;
- return isInitDataTypeSupported('cenc');
- }).then(function(result) {
- isCencSupported = result;
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]);
- }).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var promises = [];
-
- if (isWebmSupported) {
- promises.push(create_close_test(mediaKeys, 'webm', getInitData('webm')));
- }
-
- if (isCencSupported) {
- promises.push(create_close_test(mediaKeys, 'cenc', getInitData('cenc')));
- }
-
- assert_not_equals(promises.length, 0);
- return Promise.all(promises);
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'close() tests failed');
- });
- }, 'Test MediaKeySession close().');
-
- 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');
-
- // remove() on a temporary session should fail.
- return mediaKeySession.generateRequest(type, initData);
- }).then(function(result) {
- return mediaKeySession.remove();
- }).then(function(result) {
- assert_unreached('remove() should not succeed for temporary sessions');
- }, function(error) {
- assert_equals(error.name, 'InvalidAccessError');
- });
- }
-
- async_test(function(test)
- {
- var isWebmSupported;
- var isCencSupported;
-
- isInitDataTypeSupported('webm').then(function(result) {
- isWebmSupported = result;
- return isInitDataTypeSupported('cenc');
- }).then(function(result) {
- isCencSupported = result;
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]);
- }).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var promises = [];
-
- if (isWebmSupported) {
- promises.push(create_remove_exception_test(mediaKeys, 'webm', getInitData('webm')));
- }
-
- if (isCencSupported) {
- promises.push(create_remove_exception_test(mediaKeys, 'cenc', getInitData('cenc')));
- }
-
- assert_not_equals(promises.length, 0);
- return Promise.all(promises);
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'remove() exception tests failed');
- });
- }, 'Test MediaKeySession remove() exceptions.');
-
- function create_remove_test(mediaKeys, type, initData)
- {
- // Clear Key may not support persistent-license sessions.
- var mediaKeySession;
- try {
- mediaKeySession = mediaKeys.createSession('persistent-license');
- } catch (error) {
- // Not supported, so return a resolved promise.
- assert_equals(error.name, 'NotSupportedError');
- return Promise.resolve();
- }
- return mediaKeySession.generateRequest(type, initData).then(function(result) {
- return mediaKeySession.remove();
- });
- }
-
- async_test(function(test)
- {
- var isWebmSupported;
- var isCencSupported;
-
- isInitDataTypeSupported('webm').then(function(result) {
- isWebmSupported = result;
- return isInitDataTypeSupported('cenc');
- }).then(function(result) {
- isCencSupported = result;
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]);
- }).then(function(access) {
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- var promises = [];
-
- if (isWebmSupported) {
- promises.push(create_remove_test(mediaKeys, 'webm', getInitData('webm')));
- }
-
- if (isCencSupported) {
- promises.push(create_remove_test(mediaKeys, 'cenc', getInitData('cenc')));
- }
-
- assert_not_equals(promises.length, 0);
- return Promise.all(promises);
- }).then(function(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'remove() tests failed');
- });
- }, 'Test MediaKeySession remove().');
-
- 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: 'InvalidAccessError',
- func: function(mk) { return mk.setServerCertificate(new Uint8Array(0)); }
- }
- ];
-
- async_test(function(test)
- {
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).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(result) {
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'setServerCertificate() exception tests failed');
- });
- }, 'Test MediaKeys setServerCertificate() exceptions.');
-
- // All calls to |func| in this group are expected to resolve.
- var kSetServerCertificateTestCases = [
- {
- // Pass in ArrayBufferView
- func: function(mk) {
- var cert = new Uint8Array(200);
- assert_true(ArrayBuffer.isView(cert));
- return mk.setServerCertificate(cert);
- },
- expected: false,
- },
- {
- // Pass in ArrayBuffer
- func: function(mk) {
- var buffer = new ArrayBuffer(200);
- assert_false(ArrayBuffer.isView(buffer));
- return mk.setServerCertificate(buffer);
- },
- expected: false,
- }
- ];
-
- async_test(function(test)
- {
- var expected_result;
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{}]).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);
- test.done();
- }).catch(function(error) {
- forceTestFailureFromPromise(test, error, 'setServerCertificate() test failed');
- });
- }, 'Test MediaKeys setServerCertificate().');
-
-
- // FIXME: Add syntax checks for MediaKeys.IsTypeSupported().
- // FIXME: Add syntax checks for MediaKeyError and MediaKeySession events.
- // FIXME: Add HTMLMediaElement syntax checks, e.g. setMediaKeys, mediakeys, onencrypted.
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-unique-origin.html b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-unique-origin.html
deleted file mode 100644
index ffb67679f11..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-unique-origin.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<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>
- <script>
- // 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(\'org.w3.clearkey\', [{' +
- ' initDataTypes: [ \'keyids\' ],' +
- ' audioCapabilities: [' +
- ' { contentType: \'audio/mp4; codecs="mp4a.40.2"\' },' +
- ' { contentType: \'audio/webm; codecs="opus"\' }' +
- ' ]' +
- ' }]).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.
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{
- initDataTypes: [ 'keyids' ],
- audioCapabilities: [
- { contentType: 'audio/mp4; codecs="mp4a.40.2"' },
- { contentType: 'audio/webm; codecs="opus"' }
- ]
- }]).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');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index e829a885c65..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-update-disallowed-input.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <script>
- // This test passes |response| to update() as a JSON Web Key Set.
- // CDMs other than Clear Key won't expect |response| in this format.
-
- async_test(function(test)
- {
- var initDataType;
- var initData;
- var mediaKeySession;
-
- function repeat(pattern, count) {
- var result = '';
- while (count > 1) {
- if (count & 1) result += pattern;
- count >>= 1;
- pattern += pattern;
- }
- return result + pattern;
- }
-
- 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 + repeat(',"test":"unknown"', 4000) + '}';
- }
-
- function processMessage(event)
- {
- var jwkSet = createReallyLongJWKSet();
- assert_greater_than(jwkSet.length, 65536);
- var jwkSetArray = stringToUint8Array(jwkSet);
- mediaKeySession.update(jwkSetArray).then(function() {
- forceTestFailureFromPromise(test, 'Error: update() succeeded');
- }, function(error) {
- assert_equals(error.name, 'InvalidAccessError');
- test.done();
- });
- }
-
- navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfiguration()).then(function(access) {
- initDataType = access.getConfiguration().initDataTypes[0];
- initData = getInitData(initDataType);
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- mediaKeySession = mediaKeys.createSession();
- waitForEventAndRunStep('message', mediaKeySession, processMessage, test);
- return mediaKeySession.generateRequest(initDataType, initData);
- });
- }, 'update() with response longer than 64Kb characters.');
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-utils.js b/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-utils.js
deleted file mode 100644
index 5fbcdf689a5..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-utils.js
+++ /dev/null
@@ -1,333 +0,0 @@
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-
-var consoleDiv = null;
-
-function consoleWrite(text)
-{
- if (!consoleDiv && document.body) {
- consoleDiv = document.createElement('div');
- document.body.appendChild(consoleDiv);
- }
- var span = document.createElement('span');
- span.appendChild(document.createTextNode(text));
- span.appendChild(document.createElement('br'));
- consoleDiv.appendChild(span);
-}
-
-// Returns a promise that is fulfilled with true if |initDataType| is supported,
-// or false if not.
-function isInitDataTypeSupported(initDataType)
-{
- return navigator.requestMediaKeySystemAccess(
- "org.w3.clearkey", getSimpleConfigurationForInitDataType(initDataType))
- .then(function() { return true; }, function() { return false; });
-}
-
-function getInitData(initDataType)
-{
- if (initDataType == 'webm') {
- return new Uint8Array([
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
- ]);
- }
-
- if (initDataType == 'cenc') {
- return new Uint8Array([
- 0x00, 0x00, 0x00, 0x34, // size = 52
- 0x70, 0x73, 0x73, 0x68, // 'pssh'
- 0x01, // version = 1
- 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, 0x01, // key count
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // key
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- 0x00, 0x00, 0x00, 0x00 // datasize
- ]);
- }
-
- if (initDataType == 'keyids') {
- var keyId = new Uint8Array([
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
- ]);
- return stringToUint8Array(createKeyIDs(keyId));
- }
-
- throw 'initDataType ' + initDataType + ' not supported.';
-}
-
-// Returns an array of audioCapabilities that includes entries for a set of
-// codecs that should cover all user agents.
-function getPossibleAudioCapabilities()
-{
- return [
- { contentType: 'audio/mp4; codecs="mp4a.40.2"' },
- { contentType: 'audio/webm; codecs="opus"' },
- ];
-}
-
-// Returns a trivial MediaKeySystemConfiguration that should be accepted,
-// possibly as a subset of the specified capabilities, by all user agents.
-function getSimpleConfiguration()
-{
- return [ {
- initDataTypes : [ 'webm', 'cenc', 'keyids' ],
- audioCapabilities: getPossibleAudioCapabilities()
- } ];
-}
-
-// Returns a MediaKeySystemConfiguration for |initDataType| that should be
-// accepted, possibly as a subset of the specified capabilities, by all
-// user agents.
-function getSimpleConfigurationForInitDataType(initDataType)
-{
- return [ {
- initDataTypes: [ initDataType ],
- audioCapabilities: getPossibleAudioCapabilities()
- } ];
-}
-
-// Returns a MediaKeySystemConfiguration for |mediaFile| that specifies
-// both audio and video capabilities for the specified file..
-function getConfigurationForFile(mediaFile)
-{
- if (mediaFile.toLowerCase().endsWith('webm')) {
- return [ {
- initDataTypes: [ 'webm' ],
- audioCapabilities: [ { contentType: 'audio/webm; codecs="opus"' } ],
- videoCapabilities: [ { contentType: 'video/webm; codecs="vp8"' } ]
- } ];
- }
-
- // NOTE: Supporting other mediaFormats is not currently implemented as
- // Chromium only tests with WebM files.
- throw 'mediaFile ' + mediaFile + ' not supported.';
-}
-
-function waitForEventAndRunStep(eventName, element, func, stepTest)
-{
- var eventCallback = function(event) {
- if (func)
- func(event);
- }
- if (stepTest)
- eventCallback = stepTest.step_func(eventCallback);
-
- element.addEventListener(eventName, eventCallback, true);
-}
-
-// Copied from LayoutTests/resources/js-test.js.
-// See it for details of why this is necessary.
-function asyncGC(callback)
-{
- GCController.collectAll();
- setTimeout(callback, 0);
-}
-
-function createGCPromise()
-{
- // Run gc() as a promise.
- return new Promise(
- function(resolve, reject) {
- asyncGC(resolve);
- });
-}
-
-function delayToAllowEventProcessingPromise()
-{
- return new Promise(
- function(resolve, reject) {
- setTimeout(resolve, 0);
- });
-}
-
-function stringToUint8Array(str)
-{
- var result = new Uint8Array(str.length);
- for(var i = 0; i < str.length; i++) {
- result[i] = str.charCodeAt(i);
- }
- return result;
-}
-
-function arrayBufferAsString(buffer)
-{
- // MediaKeySession.keyStatuses iterators return an ArrayBuffer,
- // so convert it into a printable string.
- return String.fromCharCode.apply(null, new Uint8Array(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]);
- }
- consoleWrite("keyStatuses.forEach()");
- keyStatuses.forEach(function(status, keyId) {
- consoleWrite(arrayBufferAsString(keyId) + ": " + status);
- });
-}
-
-// Verify that |keyStatuses| contains just the keys in |keys.expected|
-// and none of the keys in |keys.unexpected|. All keys should have status
-// 'usable'. Example call: verifyKeyStatuses(mediaKeySession.keyStatuses,
-// { expected: [key1], unexpected: [key2] });
-function verifyKeyStatuses(keyStatuses, keys)
-{
- var expected = keys.expected || [];
- var unexpected = keys.unexpected || [];
-
- // |keyStatuses| should have same size as number of |keys.expected|.
- assert_equals(keyStatuses.size, expected.length);
-
- // All |keys.expected| should be found.
- expected.map(function(key) {
- assert_true(keyStatuses.has(key));
- assert_equals(keyStatuses.get(key), 'usable');
- });
-
- // All |keys.unexpected| should not be found.
- unexpected.map(function(key) {
- assert_false(keyStatuses.has(key));
- assert_equals(keyStatuses.get(key), undefined);
- });
-}
-
-// Encodes |data| into base64url string. There is no '=' padding, and the
-// characters '-' and '_' must be used instead of '+' and '/', respectively.
-function base64urlEncode(data)
-{
- var result = btoa(String.fromCharCode.apply(null, data));
- return result.replace(/=+$/g, '').replace(/\+/g, "-").replace(/\//g, "_");
-}
-
-// Decode |encoded| using base64url decoding.
-function base64urlDecode(encoded)
-{
- return atob(encoded.replace(/\-/g, "+").replace(/\_/g, "/"));
-}
-
-// For Clear Key, the License Format is a JSON Web Key (JWK) Set, which contains
-// a set of cryptographic keys represented by JSON. These helper functions help
-// wrap raw keys into a JWK set.
-// See:
-// https://w3c.github.io/encrypted-media/#clear-key-license-format
-// http://tools.ietf.org/html/draft-ietf-jose-json-web-key
-//
-// Creates a JWK from raw key ID and key.
-// |keyId| and |key| are expected to be ArrayBufferViews, not base64-encoded.
-function createJWK(keyId, key)
-{
- var jwk = '{"kty":"oct","alg":"A128KW","kid":"';
- jwk += base64urlEncode(keyId);
- jwk += '","k":"';
- jwk += base64urlEncode(key);
- jwk += '"}';
- return jwk;
-}
-
-// Creates a JWK Set from multiple JWKs.
-function createJWKSet()
-{
- var jwkSet = '{"keys":[';
- for (var i = 0; i < arguments.length; i++) {
- if (i != 0)
- jwkSet += ',';
- jwkSet += arguments[i];
- }
- jwkSet += ']}';
- return jwkSet;
-}
-
-// Clear Key can also support Key IDs Initialization Data.
-// ref: http://w3c.github.io/encrypted-media/keyids-format.html
-// Each parameter is expected to be a key id in an Uint8Array.
-function createKeyIDs()
-{
- var keyIds = '{"kids":["';
- for (var i = 0; i < arguments.length; i++) {
- if (i != 0)
- keyIds += '","';
- keyIds += base64urlEncode(arguments[i]);
- }
- keyIds += '"]}';
- return keyIds;
-}
-
-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();
-}
-
-function extractSingleKeyIdFromMessage(message)
-{
- var json = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(message)));
- // Decode the first element of 'kids'.
- assert_equals(1, json.kids.length);
- var decoded_key = base64urlDecode(json.kids[0]);
- // Convert to an Uint8Array and return it.
- return stringToUint8Array(decoded_key);
-}
-
-// Create a MediaKeys object for Clear Key with 1 session. KeyId and key
-// required for the video are already known and provided. Returns a promise
-// that resolves to the MediaKeys object created.
-function createMediaKeys(keyId, key)
-{
- var mediaKeys;
- var mediaKeySession;
- var request = stringToUint8Array(createKeyIDs(keyId));
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, key)));
-
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getSimpleConfigurationForInitDataType('keyids')).then(function(access) {
- return access.createMediaKeys();
- }).then(function(result) {
- mediaKeys = result;
- mediaKeySession = mediaKeys.createSession();
- return mediaKeySession.generateRequest('keyids', request);
- }).then(function() {
- return mediaKeySession.update(jwkSet);
- }).then(function() {
- return Promise.resolve(mediaKeys);
- });
-}
-
-// Play the specified |content| on |video|. Returns a promise that is resolved
-// after the video plays for |duration| seconds.
-function playVideoAndWaitForTimeupdate(video, content, duration)
-{
- video.src = content;
- video.play();
- return new Promise(function(resolve) {
- video.addEventListener('timeupdate', function listener(event) {
- if (event.target.currentTime < duration)
- return;
- video.removeEventListener('timeupdate', listener);
- resolve('success');
- });
- });
-}
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/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
deleted file mode 100644
index 2af37cfb9af..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/migrated_to_root_disabled/encrypted-media-waiting-for-a-key.html
+++ /dev/null
@@ -1,168 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<html>
- <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>
- <div id="log"></div>
- <script>
- // For debugging timeouts, keep track of the number of the
- // various events received.
- var debugEncryptedEventCount = 0;
- var debugWaitingForKeyEventCount = 0;
- var debugTimeUpdateEventCount = 0;
- var debugMessage = '';
-
- promise_test(function(test)
- {
- var video = document.getElementById('testVideo');
- var content = 'webm/test-encrypted.webm';
- var initData;
- var initDataType;
- var mediaKeySession;
-
- test.timeout = function()
- {
- var message = 'timeout. message = ' + debugMessage
- + ', encrypted: ' + debugEncryptedEventCount
- + ', waitingforkey: ' + debugWaitingForKeyEventCount
- + ', timeupdate: ' + debugTimeUpdateEventCount;
- test.force_timeout();
- test.timeout_id = null;
- test.set_status(2, message);
- test.done();
- };
-
- // As this code doesn't wait for the 'message' event to avoid
- // race conditions with 'waitingforkey', specify the key ID and
- // key used by the encrypted content.
- var keyId = stringToUint8Array('0123456789012345');
- var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
- 0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
-
- return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) {
- debugMessage = 'createMediaKeys()';
- return access.createMediaKeys();
- }).then(function(mediaKeys) {
- debugMessage = 'setMediaKeys()';
- return video.setMediaKeys(mediaKeys);
- }).then(function() {
- video.src = content;
- video.play();
- debugMessage = 'wait_for_encrypted_event()';
- 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.
- initData = e.initData;
- initDataType = e.initDataType;
-
- // 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_equals(video.currentTime, 0);
-
- // Create a session.
- mediaKeySession = video.mediaKeys.createSession();
- debugMessage = 'generateRequest()';
- return mediaKeySession.generateRequest(initDataType, initData);
- }).then(function() {
- // generateRequest() will cause a 'message' event to
- // occur specifying the keyId that is needed, but we
- // ignore it since we already know what keyId is needed.
- // Add the key needed to decrypt.
- var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
- debugMessage = 'update()';
- return mediaKeySession.update(jwkSet);
- }).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);
- });
-
- // Typical test duration is 6 seconds on release builds
- // (12 seconds on debug). Since the test is timing out anyway,
- // make the duration 5 seconds so that the timeout function
- // is actually called (instead of simply aborting the test).
- }, 'Waiting for a key.', { timeout: 5000 });
-
- // Wait for a pair of 'encrypted' events. Promise resolved on
- // second event.
- function wait_for_encrypted_event(video)
- {
- var encryptedEventCount = 0;
- 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');
-
- // The same decryption key is used by both the audio
- // and the video streams so wait for the second event
- // to ensure we see both events.
- ++debugEncryptedEventCount;
- if (++encryptedEventCount != 2)
- return;
-
- video.removeEventListener('encrypted', listener);
- resolve(e);
- });
- });
- };
-
- // Wait for a 'waitingforkey' event. Promise resolved when the
- // event is received.
- function wait_for_waitingforkey_event(video)
- {
- var waitingForKeyEventCount = 0;
- return new Promise(function(resolve) {
- video.addEventListener('waitingforkey', function listener(e) {
- assert_equals(e.target, video);
- assert_equals(e.type, 'waitingforkey');
-
- ++debugWaitingForKeyEventCount;
- ++waitingForKeyEventCount;
- // TODO(jrummell): waitingforkey event should only
- // occur once. http://crbug.com/461903
-// assert_equals(waitingForKeyEventCount, 1, 'Multiple waitingforkey events');
-
- 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);
- });
- });
- };
- </script>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/webm/test-encrypted-different-av-keys.webm b/tests/wpt/web-platform-tests/encrypted-media/Google/webm/test-encrypted-different-av-keys.webm
deleted file mode 100644
index 5a29f659b72..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/webm/test-encrypted-different-av-keys.webm
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/webm/test-encrypted.webm b/tests/wpt/web-platform-tests/encrypted-media/Google/webm/test-encrypted.webm
deleted file mode 100644
index 8d44931e8dc..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/webm/test-encrypted.webm
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encrypted-media/Google/webm/test.webm b/tests/wpt/web-platform-tests/encrypted-media/Google/webm/test.webm
deleted file mode 100644
index 6c2138d4eca..00000000000
--- a/tests/wpt/web-platform-tests/encrypted-media/Google/webm/test.webm
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/encrypted-media/encrypted-media-default-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/encrypted-media/encrypted-media-default-feature-policy.https.sub.html
new file mode 100644
index 00000000000..1514d306f30
--- /dev/null
+++ b/tests/wpt/web-platform-tests/encrypted-media/encrypted-media-default-feature-policy.https.sub.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+ <script src=util/utils.js></script>
+ <script>
+ 'use strict';
+ run_all_fp_tests_allow_self(
+ 'https://{{domains[www]}}:{{ports[https][0]}}',
+ 'encrypted-media',
+ 'NotSupportedError: requestMediaKeySystemAccess is disabled by feature ' +
+ 'policy.',
+ function() {
+ return navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{
+ sessionTypes: [ 'temporary' ],
+ audioCapabilities: getPossibleAudioCapabilities()
+ }]);
+ });
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/entries-api/OWNERS b/tests/wpt/web-platform-tests/entries-api/OWNERS
new file mode 100644
index 00000000000..5fb693f9b8f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/OWNERS
@@ -0,0 +1,2 @@
+@aliams
+@inexorabletash
diff --git a/tests/wpt/web-platform-tests/entries-api/errors-manual.html b/tests/wpt/web-platform-tests/entries-api/errors-manual.html
new file mode 100644
index 00000000000..f7134982af1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/errors-manual.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: Errors manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+entry_test((t, entry) => {
+ entry.getFile(
+ NOT_FOUND_PATHS[0],
+ {},
+ t.unreached_func('getFile should fail'),
+ t.step_func(error => {
+ assert_equals(typeof error.name, 'string', 'Error has name property');
+ assert_equals(typeof error.message, 'string', 'Error has message property');
+ assert_equals(error.name, 'NotFoundError', 'error is NotFoundError');
+ t.done();
+ }));
+}, 'Errors - NotFoundError');
+
+entry_test((t, entry) => {
+ entry.getFile(
+ DIR_PATHS[0],
+ {},
+ t.unreached_func('getFile should fail'),
+ t.step_func(error => {
+ assert_equals(typeof error.name, 'string', 'Error has name property');
+ assert_equals(typeof error.message, 'string', 'Error has message property');
+ assert_equals(error.name, 'TypeMismatchError', 'error is TypeMismatchError');
+ t.done();
+ }));
+}, 'Errors - TypeMismatchError');
+
+entry_test((t, entry) => {
+ entry.getFile(
+ FILE_PATHS[0],
+ {create: true},
+ t.unreached_func('getFile should fail'),
+ t.step_func(error => {
+ assert_equals(typeof error.name, 'string', 'Error has name property');
+ assert_equals(typeof error.message, 'string', 'Error has message property');
+ assert_equals(error.name, 'SecurityError', 'error is SecurityError');
+ t.done();
+ }));
+}, 'Errors - SecurityError');
+
+entry_test((t, entry) => {
+ const reader = entry.createReader();
+ reader.readEntries(() => {}, t.unreached_func('readEntries should succeed'));
+ reader.readEntries(
+ t.unreached_func('readEntries() should fail if already reading'),
+ t.step_func(error => {
+ assert_equals(typeof error.name, 'string', 'Error has name property');
+ assert_equals(typeof error.message, 'string', 'Error has message property');
+ assert_equals(error.name, 'InvalidStateError', 'error is InvalidStateError');
+ t.done();
+ }));
+}, 'Errors - InvalidStateError');
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/file-webkitRelativePath-manual.html b/tests/wpt/web-platform-tests/entries-api/file-webkitRelativePath-manual.html
new file mode 100644
index 00000000000..e36b821c9d3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/file-webkitRelativePath-manual.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: File webitRelativePath manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#file-interface">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+Select the <b>support/a</b> directory:
+
+<input type=file multiple webkitdirectory>
+
+<script>
+setup({explicit_timeout: true});
+
+const filesPromise = new Promise(resolve => {
+ const elem = document.querySelector('input[type=file]');
+ elem.addEventListener('change', e => resolve(elem.files));
+});
+
+promise_test(t => filesPromise.then(files => {
+ assert_equals(files.length, 3, 'expected 3 items');
+ files = Array.from(files).sort(
+ (a, b) => a.name < b.name ? -1 : b.name < a.name ? 1 : 0);
+ assert_equals(files[0].name, '1.txt');
+ assert_equals(files[1].name, '2.txt');
+ assert_equals(files[0].webkitRelativePath, 'c/d/1.txt');
+ assert_equals(files[1].webkitRelativePath, 'c/d/2.txt');
+ assert_equals(files[2].webkitRelativePath, 'c/3.txt');
+
+}), 'webkitRelativePath is shortest common ancestor');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystem-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystem-manual.html
new file mode 100644
index 00000000000..9e84b10c083
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystem-manual.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystem manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#api-domfilesystem">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+entry_test((t, entry) => {
+ const fs = entry.filesystem;
+
+ assert_idl_attribute(fs, 'name', 'has name attribute');
+ assert_equals(typeof fs.name, 'string', 'name is a string');
+
+ assert_idl_attribute(fs, 'root', 'has root attribute');
+ assert_true(fs.root.isDirectory,
+ 'FileSystem root is a directory entry');
+
+ assert_equals(fs.root.name, '', 'root name is empty string');
+
+ assert_equals(fs.root.fullPath, '/', 'root path is /');
+
+ t.done();
+
+}, 'FileSystem - API');
+
+entry_test((t, entry) => {
+ const fs = entry.filesystem;
+
+ getChildEntry(entry, 'file.txt', t.step_func(child => {
+ const cfs = child.filesystem;
+ assert_not_equals(fs, cfs.filesystem, 'FileSystem objects do not have object identity');
+ assert_equals(fs.name, cfs.name, 'FileSystem names match');
+
+ t.done();
+ }), t.unreached_func('child entry file.txt should be present'));
+
+}, 'FileSystem - name consistency and object identity');
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-attributes-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-attributes-manual.html
new file mode 100644
index 00000000000..9422c014ac6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-attributes-manual.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemDirectoryEntry attributes manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#api-directoryentry">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+entry_test((t, entry) => {
+ assert_idl_attribute(entry, 'isFile', 'FileSystemDirectoryEntry has isFile attribute');
+ assert_equals(typeof entry.isFile, 'boolean', 'isFile is boolean');
+
+ assert_idl_attribute(entry, 'isDirectory', 'FileSystemDirectoryEntry has isDirectory attribute');
+ assert_equals(typeof entry.isDirectory, 'boolean', 'isDirectory is boolean');
+
+ assert_idl_attribute(entry, 'name', 'FileSystemDirectoryEntry has name attribute');
+ assert_equals(typeof entry.name, 'string', 'name is a string');
+
+ assert_idl_attribute(entry, 'fullPath', 'FileSystemDirectoryEntry has fullPath attribute');
+ assert_equals(typeof entry.fullPath, 'string', 'fullPath is a string');
+
+ assert_idl_attribute(entry, 'filesystem', 'FileSystemDirectoryEntry has filesystem attribute');
+ assert_equals(typeof entry.filesystem, 'object', 'filesystem is an object');
+
+ t.done();
+}, 'FileSystemDirectoryEntry - attribute types');
+
+entry_test((t, entry) => {
+ assert_false(entry.isFile, 'isFile is false');
+ assert_true(entry.isDirectory, 'isDirectory is true');
+ assert_equals(entry.name, 'upload', 'expected directory was uploaded');
+ assert_equals(entry.fullPath, '/upload', 'directory is child of root directory');
+ t.done();
+}, 'FileSystemDirectoryEntry - attribute values');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-createReader-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-createReader-manual.html
new file mode 100644
index 00000000000..f9369c6f74e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-createReader-manual.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemDirectoryEntry createReader() manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#api-directoryentry">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+entry_test((t, entry) => {
+
+ assert_idl_attribute(entry, 'createReader', 'FileSystemDirectoryEntry has createReader');
+ assert_equals(typeof entry.createReader, 'function', 'createReader() is a method');
+
+ t.done();
+}, 'FileSystemDirectoryEntry - createReader()');
+
+entry_test((t, entry) => {
+ assert_not_equals(entry.createReader(), entry.createReader(),
+ 'createReader() returns a new object each time');
+ t.done();
+}, 'FileSystemDirectoryEntry - createReader() distinct objects');
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getDirectory-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getDirectory-manual.html
new file mode 100644
index 00000000000..d78bb66df79
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getDirectory-manual.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemDirectoryEntry.getDirectory() manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#dom-filesystemdirectoryentry-getdirectory">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+entry_test((t, entry) => {
+ assert_idl_attribute(entry, 'getDirectory', 'FileSystemDirectoryEntry has getDirectory');
+ assert_equals(typeof entry.getDirectory, 'function', 'getDirectory() is a method');
+
+ t.done();
+}, 'FileSystemDirectoryEntry - getDirectory()');
+
+INVALID_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getDirectory(
+ path,
+ {},
+ t.unreached_func('getDirectory should fail'),
+ t.step_func(error => {
+ assert_equals(error.name, 'TypeMismatchError',
+ 'getDirectory() should fail if given invalid path');
+ t.done();
+ }));
+ }, 'FileSystemDirectoryEntry.getDirectory() - invalid path: ' + JSON.stringify(path));
+});
+
+EMPTY_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getDirectory(
+ path,
+ {},
+ t.step_func(dir => {
+ assert_true(dir.isDirectory,
+ 'empty path should yield FileSystemDirectoryEntry');
+ assert_equals(dir.name, entry.name,
+ 'empty path should yield same directory');
+ assert_equals(dir.fullPath, entry.fullPath,
+ 'empty path should yield same directory');
+ t.done();
+ }),
+ t.unreached_func('getDirectory should not fail')
+ );
+ }, 'FileSystemDirectoryEntry.getDirectory() - empty path: '
+ + JSON.stringify(path) || 'undefined');
+});
+
+DIR_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getDirectory(
+ path,
+ {create: true},
+ t.unreached_func('getDirectory should fail'),
+ t.step_func(error => {
+ assert_equals(error.name, 'SecurityError',
+ 'getDirectory() should fail with security error if ' +
+ 'create option is set');
+ t.done();
+ }));
+ }, 'FileSystemDirectoryEntry.getDirectory() - {create:true}: ' + path);
+});
+
+NOT_FOUND_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getDirectory(
+ path,
+ {},
+ t.unreached_func('getDirectory should fail'),
+ t.step_func(error => {
+ assert_equals(error.name, 'NotFoundError',
+ 'getDirectory() should fail with not found');
+ t.done();
+ }));
+ }, 'FileSystemDirectoryEntry.getDirectory() - not found: ' + path);
+});
+
+FILE_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getDirectory(
+ path,
+ {},
+ t.unreached_func('getDirectory should fail'),
+ t.step_func(error => {
+ assert_equals(error.name, 'TypeMismatchError',
+ 'getDirectory() should fail if type is file');
+ t.done();
+ }));
+ }, 'FileSystemDirectoryEntry.getDirectory() - directory: ' + path);
+});
+
+DIR_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getDirectory(
+ path,
+ {},
+ t.step_func(e => {
+ assert_false(e.isFile);
+ assert_true(e.isDirectory);
+ assert_equals(e.name, 'subdir');
+ t.done();
+ }),
+ t.unreached_func('getDirectory should not fail')
+ );
+ }, 'FileSystemDirectoryEntry.getDirectory() - directory: ' + path);
+});
+
+[
+ {path: '.', name: 'upload'},
+ {path: '/', name: ''}
+].forEach(test_case => {
+ entry_test((t, entry) => {
+ entry.getDirectory(
+ test_case.path,
+ {},
+ t.step_func(e => {
+ assert_false(e.isFile);
+ assert_true(e.isDirectory);
+ assert_equals(e.name, test_case.name);
+ t.done();
+ }),
+ t.unreached_func('getDirectory should not fail')
+ );
+ }, 'FileSystemDirectoryEntry.getDirectory() - directory: ' + test_case.path);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getFile-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getFile-manual.html
new file mode 100644
index 00000000000..3acd2fbd763
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getFile-manual.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemDirectoryEntry.getFile() manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#dom-filesystemdirectoryentry-getfile">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+entry_test((t, entry) => {
+ assert_idl_attribute(entry, 'getFile', 'FileSystemDirectoryEntry has getFile');
+ assert_equals(typeof entry.getFile, 'function', 'getFile() is a method');
+
+ t.done();
+}, 'FileSystemDirectoryEntry - getFile()');
+
+INVALID_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getFile(
+ path,
+ {},
+ t.unreached_func('getFile should fail'),
+ t.step_func(error => {
+ assert_equals(error.name, 'TypeMismatchError',
+ 'getFile() should fail if given invalid path');
+ t.done();
+ }));
+ }, 'FileSystemDirectoryEntry.getFile() - invalid path: ' + JSON.stringify(path));
+});
+
+EMPTY_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getFile(
+ path,
+ {},
+ t.unreached_func('getFile should fail'),
+ t.step_func(error => {
+ assert_equals(error.name, 'TypeMismatchError',
+ 'getFile() on empty path should fail because the ' +
+ 'path resolves to the directory itself');
+ t.done();
+ }));
+ }, 'FileSystemDirectoryEntry.getFile() - empty path: ' + JSON.stringify(path) || 'undefined');
+});
+
+FILE_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getFile(
+ path,
+ {create: true},
+ t.unreached_func('getFile should fail'),
+ t.step_func(error => {
+ assert_equals(error.name, 'SecurityError',
+ 'getFile() should fail with security error if ' +
+ 'create option is set');
+ t.done();
+ }));
+ }, 'FileSystemDirectoryEntry.getFile() - {create:true}: ' + path);
+});
+
+NOT_FOUND_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getFile(
+ path,
+ {},
+ t.unreached_func('getFile should fail'),
+ t.step_func(error => {
+ assert_equals(error.name, 'NotFoundError',
+ 'getFile() should fail with not found');
+ t.done();
+ }));
+ }, 'FileSystemDirectoryEntry.getFile() - not found: ' + path);
+});
+
+DIR_PATHS.concat(['/', '.']).forEach(path => {
+ entry_test((t, entry) => {
+ entry.getFile(
+ path,
+ {},
+ t.unreached_func('getFile should fail'),
+ t.step_func(error => {
+ assert_equals(error.name, 'TypeMismatchError',
+ 'getFile() should fail if type is directory');
+ t.done();
+ }));
+ }, 'FileSystemDirectoryEntry.getFile() - directory: ' + path);
+});
+
+FILE_PATHS.forEach(path => {
+ entry_test((t, entry) => {
+ entry.getFile(
+ path,
+ {},
+ t.step_func(e => {
+ assert_true(e.isFile);
+ assert_false(e.isDirectory);
+ assert_equals(e.name, 'file.txt');
+ t.done();
+ }),
+ t.unreached_func('getFile should not fail')
+ );
+ }, 'FileSystemDirectoryEntry.getFile() - file: ' + path);
+});
+
+entry_test((t, entry) => {
+ entry.getFile(FILE_PATHS[0], {}, t.step_func(e1 => {
+ entry.getFile(FILE_PATHS[0], {}, t.step_func(e2 => {
+ assert_equals(e1.name, e2.name, 'names should match');
+ assert_equals(e1.fullPath, e2.fullPath, 'names should match');
+ assert_not_equals(e1, e2, 'objects should be distinct');
+ t.done();
+ }), t.unreached_func('getFile should not fail'));
+ }), t.unreached_func('getFile should not fail'));
+}, 'FileSystemDirectoryEntry.getFile() - object identity');
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getParent-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getParent-manual.html
new file mode 100644
index 00000000000..20c2a707d38
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryentry-getParent-manual.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemDirectoryEntry getParent() manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#api-directoryentry">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+entry_test((t, entry) => {
+
+ assert_idl_attribute(entry, 'getParent', 'FileSystemDirectoryEntry has getParent');
+ assert_equals(typeof entry.getParent, 'function', 'getParent() is a method');
+
+ t.done();
+}, 'FileSystemDirectoryEntry - getParent()');
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryreader-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryreader-manual.html
new file mode 100644
index 00000000000..55f0fc4e70c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystemdirectoryreader-manual.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemDirectoryReader manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#api-directoryreader">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+entry_test((t, entry) => {
+ const reader = entry.createReader();
+
+ assert_idl_attribute(reader, 'readEntries', 'FileSystemDirectoryReader has readEntries');
+ assert_equals(typeof reader.readEntries, 'function', 'readEntries() is a method');
+
+ t.done();
+}, 'FileSystemDirectoryReader - interface');
+
+
+entry_test((t, entry) => {
+ getChildEntry(entry, 'subdir', t.step_func(dir => {
+ const reader = dir.createReader();
+ assert_equals(typeof reader.readEntries, 'function');
+
+ const found_names = [];
+ const do_chunk = t.step_func(() =>
+ reader.readEntries(t.step_func(entries => {
+
+ if (entries.length > 0) {
+ entries.forEach(t.step_func(entry => found_names.push(entry.name)));
+ do_chunk();
+ return;
+ }
+
+ found_names.sort();
+ assert_array_equals(found_names, ['1.txt', '2.txt', '3.txt'],
+ 'directory contents should match');
+ t.done();
+ })));
+
+ do_chunk();
+ }), t.unreached_func('A child entry should be found'));
+}, 'FileSystemDirectoryReader - basic enumeration');
+
+entry_test((t, entry) => {
+ const reader = entry.createReader();
+ reader.readEntries(() => {}, t.unreached_func('readEntries should succeed'));
+ reader.readEntries(
+ t.unreached_func('readEntries() should fail if already reading'),
+ t.step_func(error => {
+ assert_equals(error.name, 'InvalidStateError', 'invalid state if already reading');
+ t.done();
+ }));
+}, 'FileSystemDirectoryReader - reading flag');
+
+entry_test((t, entry) => {
+ const reader = entry.createReader();
+
+ const do_chunk = t.step_func(() =>
+ reader.readEntries(t.step_func(entries => {
+ if (entries.length > 0) {
+ do_chunk();
+ return;
+ }
+ reader.readEntries(t.step_func(entries => {
+ assert_equals(
+ entries.length, 0,
+ 'calling readEntries() when done should yield and empty sequence');
+ t.done();
+ }));
+ })));
+
+ do_chunk();
+}, 'FileSystemDirectoryReader - done flag');
+
+// TODO: Manual tests where directory contents are changed during the test.
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystementry-attributes-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystementry-attributes-manual.html
new file mode 100644
index 00000000000..9f2431b87e0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystementry-attributes-manual.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemEntry attributes manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#api-entry">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+entry_test((t, entry) => {
+ assert_idl_attribute(entry, 'isFile', 'FileSystemEntry has isFile attribute');
+ assert_equals(typeof entry.isFile, 'boolean', 'isFile is boolean');
+
+ assert_idl_attribute(entry, 'isDirectory', 'FileSystemEntry has isDirectory attribute');
+ assert_equals(typeof entry.isDirectory, 'boolean', 'isFile is boolean');
+
+ assert_idl_attribute(entry, 'name', 'FileSystemEntry has name attribute');
+ assert_equals(typeof entry.name, 'string', 'name is a string');
+
+ assert_idl_attribute(entry, 'fullPath', 'FileSystemEntry has fullPath attribute');
+ assert_equals(typeof entry.fullPath, 'string', 'fullPath is a string');
+
+ assert_idl_attribute(entry, 'filesystem', 'FileSystemEntry has filesystem attribute');
+ assert_equals(typeof entry.filesystem, 'object', 'filesystem is an object');
+
+ t.done();
+}, 'FileSystemEntry - attribute types');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystementry-getParent-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystementry-getParent-manual.html
new file mode 100644
index 00000000000..7110bdcfbcb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystementry-getParent-manual.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemEntry getParent() manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#dom-filesystementry-getparentapi-entry">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+entry_test((t, entry) => {
+ assert_idl_attribute(entry, 'getParent', 'FileSystemEntry has getParent method');
+ assert_equals(typeof entry.getParent, 'function', 'FileSystemEntry has a getParent() method');
+
+ assert_equals(entry.getParent(), void 0, 'getParent() arguments are optional');
+
+ entry.getParent(t.step_func(parent => {
+ assert_true(parent.isDirectory, 'parent should be a directory');
+
+ assert_equals(parent.fullPath, '/', 'parent should be root');
+ assert_equals(parent.name, '', 'root name is empty string');
+
+ t.done();
+ }), t.unreached_func('getParent() should not fail'));
+}, 'FileSystemEntry - getParent()');
+
+// TODO: Manual test for getParent() where containing directory is removed before getParent() is called.
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystemfileentry-attributes-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystemfileentry-attributes-manual.html
new file mode 100644
index 00000000000..113773e82dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystemfileentry-attributes-manual.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemFileEntry attributes manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#api-entry">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+file_entry_test('file.txt', (t, entry) => {
+
+ assert_idl_attribute(entry, 'isFile', 'FileSystemEntry has isFile attribute');
+ assert_equals(typeof entry.isFile, 'boolean', 'isFile is boolean');
+
+ assert_idl_attribute(entry, 'isDirectory', 'FileSystemEntry has isDirectory attribute');
+ assert_equals(typeof entry.isDirectory, 'boolean', 'isFile is boolean');
+
+ assert_idl_attribute(entry, 'name', 'FileSystemEntry has name attribute');
+ assert_equals(typeof entry.name, 'string', 'name is a string');
+
+ assert_idl_attribute(entry, 'fullPath', 'FileSystemEntry has fullPath attribute');
+ assert_equals(typeof entry.fullPath, 'string', 'fullPath is a string');
+
+ assert_idl_attribute(entry, 'filesystem', 'FileSystemEntry has filesystem attribute');
+
+ t.done();
+}, 'FileSystemFileEntry - attribute types');
+
+file_entry_test('file.txt', (t, entry) => {
+ assert_true(entry.isFile);
+ assert_false(entry.isDirectory);
+ assert_equals(entry.name, 'file.txt');
+ assert_equals(entry.fullPath, '/upload/file.txt');
+ t.done();
+}, 'FileSystemFileEntry - attribute values');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystemfileentry-file-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystemfileentry-file-manual.html
new file mode 100644
index 00000000000..d6c62f30a3c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystemfileentry-file-manual.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemFileEntry file() manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#api-entry">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+
+file_entry_test('file.txt', (t, entry) => {
+ assert_idl_attribute(entry, 'file', 'FileSystemFileEntry has a file() method');
+ assert_equals(typeof entry.file, 'function', 'FileSystemFileEntry has a file() method');
+
+ assert_throws(TypeError(), () => entry.file(), 'file() has a required argument');
+ entry.file(t.step_func(file => {
+
+ assert_class_string(file, 'File', 'file() should yield a File');
+ assert_equals(entry.name, file.name, 'entry and file names should match');
+ t.done();
+
+ }), t.unreached_func('file() should not fail'));
+}, 'FileSystemFileEntry - file()');
+
+// TODO: Manual test where file is replaced with directory before file() called
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/filesystemfileentry-getParent-manual.html b/tests/wpt/web-platform-tests/entries-api/filesystemfileentry-getParent-manual.html
new file mode 100644
index 00000000000..fea77348a6d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/filesystemfileentry-getParent-manual.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: FileSystemFileEntry getParent() manual test</title>
+<link rel=help href="https://wicg.github.io/entries-api/#api-entry">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="support.js"></script>
+
+<script>
+
+file_entry_test('file.txt', (t, entry) => {
+ assert_idl_attribute(entry, 'getParent', 'FileSystemFileEntry has a getParent method');
+ assert_equals(typeof entry.getParent, 'function', 'FileSystemFileEntry has a getParent() method');
+ t.done();
+}, 'FileSystemFileEntry - getParent() method');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/interfaces-manual.html b/tests/wpt/web-platform-tests/entries-api/interfaces-manual.html
new file mode 100644
index 00000000000..8b4841675c8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/interfaces-manual.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: IDL Tests</title>
+<link rel=help href="https://wicg.github.io/entries-api/#idl-index">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="support.js"></script>
+<script>
+'use strict';
+
+entry_test((t, entry, item) => {
+ assert_true(entry.isDirectory);
+ Promise.all([
+ getEntriesAsPromise(entry),
+ fetch('interfaces.idl').then(r => r.text())
+ ]).then(t.step_func(([entries, idls]) => {
+ window.samples = {
+ item: item,
+ dirEntry: entries.filter(entry => entry.isDirectory)[0],
+ fileEntry: entries.filter(entry => entry.isFile)[0],
+ fileSystem: entry.filesystem,
+ };
+
+ const idl_array = new IdlArray();
+
+ // https://w3c.github.io/FileAPI/#dfn-file
+ idl_array.add_untested_idls('[Exposed=(Window,Worker)] interface File {};');
+
+ // https://html.spec.whatwg.org/multipage/forms.html#htmlinputelement
+ idl_array.add_untested_idls('interface HTMLInputElement {};');
+
+ // https://html.spec.whatwg.org/multipage/interaction.html#datatransferitem
+ idl_array.add_untested_idls('interface DataTransferItem {};');
+
+ idl_array.add_idls(idls);
+
+ idl_array.add_objects({
+ File: ['new File([], "example.txt")'],
+ HTMLInputElement: ['document.createElement("input")'],
+ DataTransferItem: ['samples.item'],
+ FileSystemEntry: [],
+ FileSystemDirectoryEntry: ['samples.dirEntry'],
+ FileSystemDirectoryReader: ['samples.dirEntry.createReader()'],
+ FileSystemFileEntry: ['samples.fileEntry'],
+ FileSystem: ['samples.fileSystem'],
+ });
+
+ idl_array.test();
+ t.done();
+ }));
+}, 'Entries API: IDL');
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/interfaces.html b/tests/wpt/web-platform-tests/entries-api/interfaces.html
new file mode 100644
index 00000000000..77141557318
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/interfaces.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Entries API: IDL Tests</title>
+<link rel=help href="https://wicg.github.io/entries-api/#idl-index">
+<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>
+'use strict';
+
+promise_test(t => {
+ return fetch('interfaces.idl')
+ .then(r => r.text())
+ .then(idls => {
+
+ const idl_array = new IdlArray();
+
+ // https://w3c.github.io/FileAPI/#dfn-file
+ idl_array.add_untested_idls('[Exposed=(Window,Worker)] interface File {};');
+
+ // https://html.spec.whatwg.org/multipage/forms.html#htmlinputelement
+ idl_array.add_untested_idls('interface HTMLInputElement {};');
+
+ // https://html.spec.whatwg.org/multipage/interaction.html#datatransferitem
+ idl_array.add_untested_idls('interface DataTransferItem {};');
+
+ idl_array.add_idls(idls);
+
+ idl_array.add_objects({
+ File: ['new File([], "example.txt")'],
+ HTMLInputElement: ['document.createElement("input")'],
+ });
+
+ idl_array.test();
+ });
+
+}, 'Entries API: IDL');
+</script>
diff --git a/tests/wpt/web-platform-tests/entries-api/interfaces.idl b/tests/wpt/web-platform-tests/entries-api/interfaces.idl
new file mode 100644
index 00000000000..bef08ab30fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/interfaces.idl
@@ -0,0 +1,70 @@
+
+partial interface File {
+ readonly attribute USVString webkitRelativePath;
+};
+
+partial interface HTMLInputElement {
+ attribute boolean webkitdirectory;
+ readonly attribute FrozenArray<FileSystemEntry> webkitEntries;
+};
+
+partial interface DataTransferItem {
+ FileSystemEntry? webkitGetAsEntry();
+};
+
+callback interface ErrorCallback {
+ void handleEvent(DOMException err);
+};
+
+interface FileSystemEntry {
+ readonly attribute boolean isFile;
+ readonly attribute boolean isDirectory;
+ readonly attribute USVString name;
+ readonly attribute USVString fullPath;
+ readonly attribute FileSystem filesystem;
+
+ void getParent(optional FileSystemEntryCallback successCallback,
+ optional ErrorCallback errorCallback);
+};
+
+interface FileSystemDirectoryEntry : FileSystemEntry {
+ FileSystemDirectoryReader createReader();
+ void getFile(optional USVString? path,
+ optional FileSystemFlags options,
+ optional FileSystemEntryCallback successCallback,
+ optional ErrorCallback errorCallback);
+ void getDirectory(optional USVString? path,
+ optional FileSystemFlags options,
+ optional FileSystemEntryCallback successCallback,
+ optional ErrorCallback errorCallback);
+};
+
+dictionary FileSystemFlags {
+ boolean create = false;
+ boolean exclusive = false;
+};
+
+callback interface FileSystemEntryCallback {
+ void handleEvent(FileSystemEntry entry);
+};
+
+interface FileSystemDirectoryReader {
+ void readEntries(FileSystemEntriesCallback successCallback,
+ optional ErrorCallback errorCallback);
+};
+callback interface FileSystemEntriesCallback {
+ void handleEvent(sequence<FileSystemEntry> entries);
+};
+
+interface FileSystemFileEntry : FileSystemEntry {
+ void file(FileCallback successCallback,
+ optional ErrorCallback errorCallback);
+};
+callback interface FileCallback {
+ void handleEvent(File file);
+};
+
+interface FileSystem {
+ readonly attribute USVString name;
+ readonly attribute FileSystemDirectoryEntry root;
+};
diff --git a/tests/wpt/web-platform-tests/entries-api/support.js b/tests/wpt/web-platform-tests/entries-api/support.js
new file mode 100644
index 00000000000..79720ce56b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/entries-api/support.js
@@ -0,0 +1,131 @@
+// ----------------------------------------
+// Test Utilities
+// ----------------------------------------
+
+setup({explicit_timeout: true});
+
+const tests = [];
+window.addEventListener('DOMContentLoaded', e => {
+ const header = document.createElement('h1');
+ header.innerText = document.title;
+ document.body.appendChild(header);
+ const elem = document.createElement('div');
+ elem.style.cssText = 'height: 50px; border: 1px dotted red;';
+ elem.innerHTML = 'Drop the <b>support/upload</b> directory here.</div>';
+ document.body.appendChild(elem);
+ elem.addEventListener('dragover', e => {
+ e.preventDefault();
+ });
+ elem.addEventListener('drop', e => {
+ e.preventDefault();
+ for (let i = 0; i < e.dataTransfer.items.length; ++i) {
+ const item = e.dataTransfer.items[i];
+ if (item.kind !== 'file')
+ continue;
+ const entry = item.webkitGetAsEntry();
+ elem.parentElement.removeChild(elem);
+ tests.forEach(f => f(entry, item));
+ break;
+ }
+ });
+});
+
+
+// Registers a test to be run when an entry is dropped. Calls |func|
+// with (test, entry, item); |func| must call `test.done()` when complete.
+function entry_test(func, description) {
+ const test = async_test(description);
+ tests.push(test.step_func((entry, item) => func(test, entry, item)));
+}
+
+// Registers a test to be run when an entry is dropped. Digs the named
+// |file| out of the dropped entry and calls |func| with
+// (test, file_entry); |func| must call `test.done()` when complete.
+function file_entry_test(name, func, description) {
+ return entry_test((t, entry, item) => {
+ getChildEntry(entry, name,
+ t.step_func((entry) => func(t, entry)),
+ t.unreached_func('Did not find expected file: ' + name));
+ }, description);
+}
+
+
+// ----------------------------------------
+// Paths
+// ----------------------------------------
+
+const INVALID_PATHS = [
+ '\x00', 'a-\x00-b',
+ '\\', 'a-\\-b'
+];
+const EMPTY_PATHS = ['', null, undefined];
+const NOT_FOUND_PATHS = [
+ 'nope',
+ '/upload/nope',
+ './nope',
+ 'subdir/../nope',
+ '\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f',
+ '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f',
+];
+
+const DIR_PATHS = [
+ 'subdir',
+ '/upload/subdir',
+ './subdir',
+ 'subdir/.',
+ 'subdir/../subdir',
+ 'subdir/./../subdir',
+ 'subdir/../subdir/.',
+ '//upload/subdir',
+ '/upload//subdir',
+ './/subdir',
+ 'subdir//.',
+];
+const FILE_PATHS = [
+ 'file.txt',
+ '/upload/file.txt',
+ 'subdir/../file.txt',
+ '//upload/file.txt',
+ '/upload//file.txt',
+ 'subdir/./../file.txt',
+];
+
+// ----------------------------------------
+// Helpers
+// ----------------------------------------
+
+// Wrapper for FileSystemDirectoryReader that yields all entries via a
+// Promise.
+
+function getEntriesAsPromise(dirEntry) {
+ return new Promise((resolve, reject) => {
+ const result = [];
+ const reader = dirEntry.createReader();
+ const doBatch = () => {
+ reader.readEntries(entries => {
+ if (entries.length > 0) {
+ entries.forEach(e => result.push(e));
+ doBatch();
+ } else {
+ resolve(result);
+ }
+ }, reject);
+ };
+ doBatch();
+ });
+}
+
+
+// Wrapper for FileSystemDirectoryReader that yields a single entry by
+// name via a callback. Can be used instead of getFile() or
+// getDirectory() since not all implementations support those.
+
+function getChildEntry(dirEntry, name, callback, errback) {
+ getEntriesAsPromise(dirEntry)
+ .then(entries => {
+ const entry = entries.filter(entry => entry.name === name)[0];
+ if (!entry)
+ throw new Error('No such file: ' + name);
+ return entry;
+ }).then(callback, errback);
+}
diff --git a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/achicu/css-exclusions/exclusions-pos-01.xht b/tests/wpt/web-platform-tests/entries-api/support/a/b/c/3.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/css/work-in-progress/ttwf_sf/achicu/css-exclusions/exclusions-pos-01.xht
+++ b/tests/wpt/web-platform-tests/entries-api/support/a/b/c/3.txt
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-progress-element/.gitkeep b/tests/wpt/web-platform-tests/entries-api/support/a/b/c/d/1.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-progress-element/.gitkeep
+++ b/tests/wpt/web-platform-tests/entries-api/support/a/b/c/d/1.txt
diff --git a/tests/wpt/web-platform-tests/microdata/conformance-requirements/.gitkeep b/tests/wpt/web-platform-tests/entries-api/support/a/b/c/d/2.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/conformance-requirements/.gitkeep
+++ b/tests/wpt/web-platform-tests/entries-api/support/a/b/c/d/2.txt
diff --git a/tests/wpt/web-platform-tests/microdata/converting-html-to-other-formats/.gitkeep b/tests/wpt/web-platform-tests/entries-api/support/upload.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/converting-html-to-other-formats/.gitkeep
+++ b/tests/wpt/web-platform-tests/entries-api/support/upload.txt
diff --git a/tests/wpt/web-platform-tests/microdata/converting-html-to-other-formats/json/.gitkeep b/tests/wpt/web-platform-tests/entries-api/support/upload/file.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/converting-html-to-other-formats/json/.gitkeep
+++ b/tests/wpt/web-platform-tests/entries-api/support/upload/file.txt
diff --git a/tests/wpt/web-platform-tests/microdata/dependencies/.gitkeep b/tests/wpt/web-platform-tests/entries-api/support/upload/subdir/1.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/dependencies/.gitkeep
+++ b/tests/wpt/web-platform-tests/entries-api/support/upload/subdir/1.txt
diff --git a/tests/wpt/web-platform-tests/microdata/encoding-microdata/.gitkeep b/tests/wpt/web-platform-tests/entries-api/support/upload/subdir/2.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/encoding-microdata/.gitkeep
+++ b/tests/wpt/web-platform-tests/entries-api/support/upload/subdir/2.txt
diff --git a/tests/wpt/web-platform-tests/microdata/encoding-microdata/associating-names-with-items/.gitkeep b/tests/wpt/web-platform-tests/entries-api/support/upload/subdir/3.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/encoding-microdata/associating-names-with-items/.gitkeep
+++ b/tests/wpt/web-platform-tests/entries-api/support/upload/subdir/3.txt
diff --git a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm
index 9fe515d2a70..934bf2fde66 100644
--- a/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm
+++ b/tests/wpt/web-platform-tests/eventsource/dedicated-worker/eventsource-constructor-non-same-origin.htm
@@ -35,8 +35,6 @@ try {
}
})
}
- fetchFail("http://example.not/")
- fetchFail("https://example.not/test")
fetchFail("ftp://example.not/")
fetchFail("about:blank")
fetchFail("mailto:whatwg@awesome.example")
diff --git a/tests/wpt/web-platform-tests/eventsource/eventsource-constructor-non-same-origin.htm b/tests/wpt/web-platform-tests/eventsource/eventsource-constructor-non-same-origin.htm
index dd4ab84a52a..58639cf17e0 100644
--- a/tests/wpt/web-platform-tests/eventsource/eventsource-constructor-non-same-origin.htm
+++ b/tests/wpt/web-platform-tests/eventsource/eventsource-constructor-non-same-origin.htm
@@ -7,7 +7,6 @@
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
- <div id="log"></div>
<script>
function fetchFail(url) {
var test = async_test(document.title + " (" + url + ")", { timeout: 20000 })
@@ -22,8 +21,6 @@
}
})
}
- fetchFail("http://example.not/")
- fetchFail("https://example.not/test")
fetchFail("ftp://example.not/")
fetchFail("about:blank")
fetchFail("mailto:whatwg@awesome.example")
diff --git a/tests/wpt/web-platform-tests/eventsource/format-field-id-null.htm b/tests/wpt/web-platform-tests/eventsource/format-field-id-null.htm
new file mode 100644
index 00000000000..9eea1a2af07
--- /dev/null
+++ b/tests/wpt/web-platform-tests/eventsource/format-field-id-null.htm
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>EventSource: U+0000 in id field</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script>
+ var test = async_test()
+ test.step(function() {
+ var source = new EventSource("resources/last-event-id.py?idvalue=%00%00"),
+ seenhello = false
+ source.onmessage = function(e) {
+ test.step(function() {
+ if(e.data == "hello" && !seenhello) {
+ seenhello = true
+ assert_equals(e.lastEventId, "")
+ } else if(seenhello) {
+ assert_equals(e.data, "hello")
+ assert_equals(e.lastEventId, "")
+ source.close()
+ test.done()
+ } else
+ assert_unreached()
+ })
+ }
+ })
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/eventsource/resources/last-event-id.py b/tests/wpt/web-platform-tests/eventsource/resources/last-event-id.py
index 4306fbaa3f1..09e4f29731a 100644
--- a/tests/wpt/web-platform-tests/eventsource/resources/last-event-id.py
+++ b/tests/wpt/web-platform-tests/eventsource/resources/last-event-id.py
@@ -1,11 +1,9 @@
- # -*- coding: utf-8 -*-
-
def main(request, response):
response.headers.set("Content-Type", "text/event-stream")
- last_event_id = request.headers.get('Last-Event-ID', None)
- if(last_event_id):
- return "data: " + last_event_id + "\n\n"
+ last_event_id = request.headers.get("Last-Event-ID", None)
+ if last_event_id:
+ return "data: " + last_event_id + "\n\n"
else:
- return "id: …\nretry: 200\ndata: hello\n\n"
-
+ idvalue = request.GET.first("idvalue", u"\u2026")
+ return "id: " + idvalue + "\nretry: 200\ndata: hello\n\n"
diff --git a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm
index 277fbd40102..fb8d125d6fb 100644
--- a/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm
+++ b/tests/wpt/web-platform-tests/eventsource/shared-worker/eventsource-constructor-non-same-origin.htm
@@ -38,8 +38,6 @@ try {
}
})
}
- fetchFail("http://example.not")
- fetchFail("https://example.not/test")
fetchFail("ftp://example.not")
fetchFail("about:blank")
fetchFail("mailto:whatwg@awesome.example")
diff --git a/tests/wpt/web-platform-tests/feature-policy/OWNERS b/tests/wpt/web-platform-tests/feature-policy/OWNERS
new file mode 100644
index 00000000000..ceb5bd9981b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/OWNERS
@@ -0,0 +1 @@
+@clelland
diff --git a/tests/wpt/web-platform-tests/feature-policy/README.md b/tests/wpt/web-platform-tests/feature-policy/README.md
new file mode 100644
index 00000000000..a5276f0a7f3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/README.md
@@ -0,0 +1,59 @@
+# Feature Policy Guide
+## How to Test a New Feature with Feature Policy
+
+This directory contains a framework to test features with feature policy.
+
+When adding a new feature to feature policy, the following cases should be tested:
+* feature enabled by header policy [HTTP tests]
+ + test when feature is enabled by feature policy HTTP headerr;
+* feature disabled by header policy [HTTP tests]
+ + test when feature is disabled by feature policy HTTP header;
+* feature enabled on self origin by header policy [HTTP tests]
+ + test when feature is enabled only on self origin by feature policy HTTP
+ header.
+* feature allowed by container policy (iframe "allow" attribute);
+ + test when feature is enabled by iframe "allow" attribute on self and cross
+ origins.
+* feature allowed by container policy, redirect on load.
+ + test when feature is enabled by iframe "allow" attribute when the iframe
+ is being redirected to a new origin upon loading
+
+### How to Use the Test Framework
+Use `test_feature_availability()` defined in
+`/feature-policy/resources/featurepolicy.js`. Please refer to the comments
+in `/feature-policy/resources/featurepolicy.js` for how this function works.
+
+### How to Write Header Policy Tests
+HTTP tests are used to test features with header policy.
+
+* Define the header policy in `<feature-name>-<enabled | disabled | enabled-on-self-origin>-by-feature-policy.https.sub.html.headers`. Example:
+
+ Feature-Policy: {"feature-name": ["*"]}
+
+
+* In `<feature-name>-<enabled | disabled | enabled-on-self-origin>-by-feature-policy.https.sub.html`:
+* test if feature is enabled / disabled in the main frame;
+* test if feature is enabled / disabled in a same-origin iframe;
+* test if feature is enabled / disabled in a cross-origin iframe.
+
+Examples:
+`/feature-policy/payment-disabled-by-feature-policy.https.sub.html`
+`/feature-policy/payment-disabled-by-feature-policy.https.sub.html.headers`
+
+### How to Write Container Policy Tests
+Simply use `test_feature_availability()` with the optional argument
+`feature_name` specified to test if:
+* feature is enabled / disabled in a same-origin iframe;
+* feature is enabled / disabled in a cross-origin iframe.
+
+Example:
+`/feature-policy/payment-allowed-by-feature-policy-attribute.https.sub.html`
+
+### How to Write Container Policy Tests with Redirect
+Similar to the section above, append
+`/feature-policy/resources/redirect-on-load.html#` to the argument `src`
+passed to `test_feature_availability()`.
+
+Example:
+`/feature-policy/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html`
+
diff --git a/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html b/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html
new file mode 100644
index 00000000000..9a792173f4a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+ <script>
+ 'use strict';
+ var relative_path = '/feature-policy/resources/feature-policy-payment.html';
+ var base_src = '/feature-policy/resources/redirect-on-load.html#';
+ var same_origin_src = base_src + relative_path;
+ var cross_origin_src = base_src + 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ relative_path;
+ var header = 'Feature-Policy allow="payment"';
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, same_origin_src,
+ expect_feature_available_default, 'payment');
+ }, header + ' allows same-origin relocation.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, cross_origin_src,
+ expect_feature_unavailable_default, 'payment');
+ }, header + ' disallows cross-origin relocation.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, same_origin_src,
+ expect_feature_available_default, 'payment', 'allowpaymentrequest');
+ }, header + ' allowpaymentrequest=true allows same-origin relocation.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, cross_origin_src,
+ expect_feature_unavailable_default, 'payment', 'allowpaymentrequest');
+ }, header + ' allowpaymentrequest=true disallows cross-origin relocation.');
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy-attribute.https.sub.html b/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy-attribute.https.sub.html
new file mode 100644
index 00000000000..eeebe399acf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy-attribute.https.sub.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+ <script>
+ 'use strict';
+ var same_origin_src = '/feature-policy/resources/feature-policy-payment.html';
+ var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+ var feature_name = 'Feature policy "payment"';
+ var header = 'allow="payment" attribute';
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, same_origin_src,
+ expect_feature_available_default, 'payment');
+ }, feature_name + ' can be enabled in same-origin iframe using ' + header);
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, cross_origin_src,
+ expect_feature_available_default, 'payment');
+ }, feature_name + ' can be enabled in cross-origin iframe using ' + header);
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy.https.sub.html
new file mode 100644
index 00000000000..ccf5f698b41
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy.https.sub.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+ <script>
+ 'use strict';
+ var same_origin_src = '/feature-policy/resources/feature-policy-payment.html';
+ var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+ var header = 'Feature-Policy header {"payment" : ["*"]}';
+
+ test(() => {
+ var supportedMethods = [ { supportedMethods: 'https://wpt.fyi/payment-request' } ];
+ var details = {
+ total: { label: 'Test', amount: { currency: 'USD', value: '5.00' } }
+ };
+ try {
+ new PaymentRequest(supportedMethods, details);
+ } catch (e) {
+ assert_unreached();
+ }
+ }, header + ' allows the top-level document.');
+
+ async_test(t => {
+ test_feature_availability('PaymentRequest()', t, same_origin_src,
+ expect_feature_available_default);
+ }, header + ' allows same-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability('PaymentRequest()', t, cross_origin_src,
+ expect_feature_available_default);
+ }, header + ' allows cross-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, same_origin_src,
+ expect_feature_available_default, undefined, 'allowpaymentrequest');
+ }, header + ' allowpaymentrequest=true allows same-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, cross_origin_src,
+ expect_feature_available_default, undefined, 'allowpaymentrequest');
+ }, header + ' allowpaymentrequest=true allows cross-origin iframes.');
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy.https.sub.html.headers b/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy.https.sub.html.headers
new file mode 100644
index 00000000000..a5c010bd68c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/payment-allowed-by-feature-policy.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: payment *
diff --git a/tests/wpt/web-platform-tests/feature-policy/payment-default-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/feature-policy/payment-default-feature-policy.https.sub.html
new file mode 100644
index 00000000000..ad4bbdcee60
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/payment-default-feature-policy.https.sub.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+ <script>
+ 'use strict';
+ var same_origin_src = '/feature-policy/resources/feature-policy-payment.html';
+ var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+ var header = 'Default "payment" feature policy ["self"]';
+
+ test(() => {
+ var supportedInstruments = [ { supportedMethods: 'visa' } ];
+ var details = {
+ total: { label: 'Test', amount: { currency: 'USD', value: '5.00' } }
+ };
+ try {
+ new PaymentRequest(supportedInstruments, details);
+ } catch (e) {
+ assert_unreached();
+ }
+ }, header + ' allows the top-level document.');
+
+ async_test(t => {
+ test_feature_availability('PaymentRequest()', t, same_origin_src,
+ expect_feature_available_default);
+ }, header + ' allows same-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability('PaymentRequest()', t, cross_origin_src,
+ expect_feature_unavailable_default);
+ }, header + ' disallows cross-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, same_origin_src,
+ expect_feature_available_default, undefined, 'allowpaymentrequest');
+ }, header + ' allowpaymentrequest=true allows same-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, cross_origin_src,
+ expect_feature_available_default, undefined, 'allowpaymentrequest');
+ }, header + ' allowpaymentrequest=true allows cross-origin iframes.');
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/feature-policy/payment-disabled-by-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/feature-policy/payment-disabled-by-feature-policy.https.sub.html
new file mode 100644
index 00000000000..98e434a2a5c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/payment-disabled-by-feature-policy.https.sub.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+ <script>
+ 'use strict';
+ var same_origin_src = '/feature-policy/resources/feature-policy-payment.html';
+ var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+ var header = 'Feature-Policy header {"payment" : []}';
+
+ test(() => {
+ var supportedInstruments = [ { supportedMethods: 'visa' } ];
+ var details = {
+ total: { label: 'Test', amount: { currency: 'USD', value: '5.00' } }
+ };
+ assert_throws('SecurityError', () => {
+ new PaymentRequest(supportedInstruments, details);
+ });
+ }, header + ' disallows the top-level document.');
+
+ async_test(t => {
+ test_feature_availability('PaymentRequest()', t, same_origin_src,
+ expect_feature_unavailable_default);
+ }, header + ' disallows same-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability('PaymentRequest()', t, cross_origin_src,
+ expect_feature_unavailable_default,);
+ }, header + ' disallows cross-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, same_origin_src,
+ expect_feature_unavailable_default, undefined, 'allowpaymentrequest');
+ }, header + ' allowpaymentrequest=true disallows same-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'PaymentRequest()', t, cross_origin_src,
+ expect_feature_unavailable_default, undefined, 'allowpaymentrequest');
+ }, header + ' allowpaymentrequest=true disallows cross-origin iframes.');
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/feature-policy/payment-disabled-by-feature-policy.https.sub.html.headers b/tests/wpt/web-platform-tests/feature-policy/payment-disabled-by-feature-policy.https.sub.html.headers
new file mode 100644
index 00000000000..a2836778bc5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/payment-disabled-by-feature-policy.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: payment 'none'
diff --git a/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-payment.html b/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-payment.html
new file mode 100644
index 00000000000..401a86eb235
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-payment.html
@@ -0,0 +1,16 @@
+<script>
+'use strict';
+
+window.onload = function() {
+ var supportedInstruments = [ { supportedMethods: [ 'visa' ] } ];
+ var details = {
+ total: { label: 'Test', amount: { currency: 'USD', value: '5.00' } }
+ };
+ try {
+ new PaymentRequest(supportedInstruments, details);
+ parent.postMessage({ enabled: true }, '*');
+ } catch (e) {
+ parent.postMessage({ enabled: false }, '*');
+ }
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-usb.html b/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-usb.html
new file mode 100644
index 00000000000..99d47c6f392
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-usb.html
@@ -0,0 +1,9 @@
+<script>
+'use strict';
+
+Promise.resolve().then(() => navigator.usb.getDevices()).then(devices => {
+ window.parent.postMessage({ enabled: true }, '*');
+}, error => {
+ window.parent.postMessage({ enabled: false }, '*');
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-webvr.html b/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-webvr.html
new file mode 100644
index 00000000000..64a152bf1ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/resources/feature-policy-webvr.html
@@ -0,0 +1,9 @@
+<script>
+'use strict';
+
+Promise.resolve().then(() => navigator.getVRDisplays()).then(displays => {
+ window.parent.postMessage({ enabled: true }, '*');
+}, error => {
+ window.parent.postMessage({ enabled: false }, '*');
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/feature-policy/resources/featurepolicy.js b/tests/wpt/web-platform-tests/feature-policy/resources/featurepolicy.js
new file mode 100644
index 00000000000..12679c89a75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/resources/featurepolicy.js
@@ -0,0 +1,154 @@
+// Tests whether a feature that is enabled/disabled by feature policy works
+// as expected.
+// Arguments:
+// feature_description: a short string describing what feature is being
+// tested. Examples: "usb.GetDevices()", "PaymentRequest()".
+// test: test created by testharness. Examples: async_test, promise_test.
+// src: URL where a feature's availability is checked. Examples:
+// "/feature-policy/resources/feature-policy-payment.html",
+// "/feature-policy/resources/feature-policy-usb.html".
+// expect_feature_available: a callback(data, feature_description) to
+// verify if a feature is avaiable or unavailable as expected.
+// The file under the path "src" defines what "data" is sent back as a
+// pistMessage. Inside the callback, some tests (e.g., EXPECT_EQ,
+// EXPECT_TRUE, etc) are run accordingly to test a feature's
+// availability.
+// Example: expect_feature_available_default(data, feature_description).
+// feature_name: Optional argument, only provided when testing iframe allow
+// attribute. "feature_name" is the feature name of a policy controlled
+// feature (https://wicg.github.io/feature-policy/#features).
+// See examples at:
+// https://github.com/WICG/feature-policy/blob/gh-pages/features.md
+// allow_attribute: Optional argument, only used for testing fullscreen or
+// payment: either "allowfullscreen" or "allowpaymentrequest" is passed.
+function test_feature_availability(
+ feature_description, test, src, expect_feature_available, feature_name,
+ allow_attribute) {
+ let frame = document.createElement('iframe');
+ frame.src = src;
+
+ if (typeof feature_name !== 'undefined') {
+ frame.allow = frame.allow.concat(";" + feature_name);
+ }
+
+ if (typeof allow_attribute !== 'undefined') {
+ frame.setAttribute(allow_attribute, true);
+ }
+
+ window.addEventListener('message', test.step_func(function handler(evt) {
+ if (evt.source === frame.contentWindow) {
+ expect_feature_available(evt.data, feature_description);
+ document.body.removeChild(frame);
+ window.removeEventListener('message', handler);
+ test.done();
+ }
+ }));
+
+ document.body.appendChild(frame);
+}
+
+// Default helper functions to test a feature's availability:
+function expect_feature_available_default(data, feature_description) {
+ assert_true(data.enabled, feature_description);
+}
+
+function expect_feature_unavailable_default(data, feature_description) {
+ assert_false(data.enabled, feature_description);
+}
+
+// This is the same as test_feature_availability() but instead of passing in a
+// function to check the result of the message sent back from an iframe, instead
+// just compares the result to an expected result passed in.
+// Arguments:
+// test: test created by testharness. Examples: async_test, promise_test.
+// src: the URL to load in an iframe in which to test the feature.
+// expected_result: the expected value to compare to the data passed back
+// from the src page by postMessage.
+// allow_attribute: Optional argument, only provided when an allow
+// attribute should be specified on the iframe.
+function test_feature_availability_with_post_message_result(
+ test, src, expected_result, allow_attribute) {
+ var test_result = function(data, feature_description) {
+ assert_equals(data, expected_result);
+ };
+ test_feature_availability(null, test, src, test_result, allow_attribute);
+}
+
+// This function runs all feature policy tests for a particular feature that
+// has a default policy of "self". This includes testing:
+// 1. Feature usage succeeds by default in the top level frame.
+// 2. Feature usage succeeds by default in a same-origin iframe.
+// 3. Feature usage fails by default in a cross-origin iframe.
+// 4. Feature usage suceeds when an allow attribute is specified on a
+// cross-origin iframe.
+//
+// The same page which called this function will be loaded in the iframe in
+// order to test feature usage there. When this function is called in that
+// context it will simply run the feature and return a result back via
+// postMessage.
+//
+// Arguments:
+// cross_origin: A cross-origin URL base to be used to load the page which
+// called into this function.
+// feature_name: The name of the feature as it should be specified in an
+// allow attribute.
+// error_name: If feature usage does not succeed, this is the string
+// representation of the error that will be passed in the rejected
+// promise.
+// feature_promise_factory: A function which returns a promise which tests
+// feature usage. If usage succeeds, the promise should resolve. If it
+// fails, the promise should reject with an error that can be
+// represented as a string.
+function run_all_fp_tests_allow_self(
+ cross_origin, feature_name, error_name, feature_promise_factory) {
+ // This may be the version of the page loaded up in an iframe. If so, just
+ // post the result of running the feature promise back to the parent.
+ if (location.hash.startsWith('#iframe')) {
+ // This makes it possible to test multiple features in the one test file.
+ if (!location.hash.includes(feature_name))
+ return;
+ feature_promise_factory().then(
+ () => window.parent.postMessage('#OK', '*'),
+ (e) => window.parent.postMessage('#' + e.toString(), '*'));
+ return;
+ }
+
+ // Run the various tests.
+ // 1. Top level frame.
+ promise_test(
+ () => feature_promise_factory(),
+ 'Default "' + feature_name +
+ '" feature policy ["self"] allows the top-level document.');
+
+ // 2. Same-origin iframe.
+ // Append #iframe to the URL so we can detect the iframe'd version of the
+ // page.
+ const same_origin_frame_pathname =
+ location.pathname + '#iframe#' + feature_name;
+ async_test(
+ t => {
+ test_feature_availability_with_post_message_result(
+ t, same_origin_frame_pathname, '#OK');
+ },
+ 'Default "' + feature_name +
+ '" feature policy ["self"] allows same-origin iframes.');
+
+ // 3. Cross-origin iframe.
+ const cross_origin_frame_url = cross_origin + same_origin_frame_pathname;
+ async_test(
+ t => {
+ test_feature_availability_with_post_message_result(
+ t, cross_origin_frame_url, '#' + error_name);
+ },
+ 'Default "' + feature_name +
+ '" feature policy ["self"] disallows cross-origin iframes.');
+
+ // 4. Cross-origin iframe with "allow" attribute.
+ async_test(
+ t => {
+ test_feature_availability_with_post_message_result(
+ t, cross_origin_frame_url, '#OK', feature_name);
+ },
+ 'Feature policy "' + feature_name +
+ '" can be enabled in cross-origin iframes using "allow" attribute.');
+}
diff --git a/tests/wpt/web-platform-tests/feature-policy/resources/redirect-on-load.html b/tests/wpt/web-platform-tests/feature-policy/resources/redirect-on-load.html
new file mode 100644
index 00000000000..1711655b035
--- /dev/null
+++ b/tests/wpt/web-platform-tests/feature-policy/resources/redirect-on-load.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<body>
+<script>
+// Automatically redirects the page to a new URL on load.
+// Load this document with a URL like:
+// "feature-policy/resources/redirect-on-load.html#https://www.example.com/"
+window.onload = function () {
+ document.location = document.location.hash.substring(1);
+}
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/fetch/OWNERS b/tests/wpt/web-platform-tests/fetch/OWNERS
index 64550d0d4e4..e2f2428209f 100644
--- a/tests/wpt/web-platform-tests/fetch/OWNERS
+++ b/tests/wpt/web-platform-tests/fetch/OWNERS
@@ -2,3 +2,4 @@
@youennf
@annevk
@mnot
+@yutakahirano
diff --git a/tests/wpt/web-platform-tests/fetch/api/abort/cache.https.html b/tests/wpt/web-platform-tests/fetch/api/abort/cache.https.html
new file mode 100644
index 00000000000..25ed0e1e918
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/abort/cache.https.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Request signals &amp; the cache API</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+ promise_test(async () => {
+ await caches.delete('test');
+ const controller = new AbortController();
+ const signal = controller.signal;
+ const request = new Request('../resources/data.json', { signal });
+
+ const cache = await caches.open('test');
+ await cache.put(request, new Response(''));
+
+ const requests = await cache.keys();
+
+ assert_equals(requests.length, 1, 'Ensuring cleanup worked');
+
+ const [cachedRequest] = requests;
+
+ controller.abort();
+
+ assert_false(cachedRequest.signal.aborted, "Request from cache shouldn't be aborted");
+
+ const data = await fetch(cachedRequest).then(r => r.json());
+ assert_equals(data.key, 'value', 'Fetch fully completes');
+ }, "Signals are not stored in the cache API");
+
+ promise_test(async () => {
+ await caches.delete('test');
+ const controller = new AbortController();
+ const signal = controller.signal;
+ const request = new Request('../resources/data.json', { signal });
+ controller.abort();
+
+ const cache = await caches.open('test');
+ await cache.put(request, new Response(''));
+
+ const requests = await cache.keys();
+
+ assert_equals(requests.length, 1, 'Ensuring cleanup worked');
+
+ const [cachedRequest] = requests;
+
+ assert_false(cachedRequest.signal.aborted, "Request from cache shouldn't be aborted");
+
+ const data = await fetch(cachedRequest).then(r => r.json());
+ assert_equals(data.key, 'value', 'Fetch fully completes');
+ }, "Signals are not stored in the cache API, even if they're already aborted");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/abort/general-serviceworker.https.html b/tests/wpt/web-platform-tests/fetch/api/abort/general-serviceworker.https.html
new file mode 100644
index 00000000000..74de2874a90
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/abort/general-serviceworker.https.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>General fetch abort tests in a service worker</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+ (async function() {
+ const scope = 'does/not/exist';
+
+ let reg = await navigator.serviceWorker.getRegistration(scope);
+ if (reg) await reg.unregister();
+
+ reg = await navigator.serviceWorker.register('general.any.worker.js', {scope});
+
+ fetch_tests_from_worker(reg.installing);
+ })();
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/abort/general-sharedworker.html b/tests/wpt/web-platform-tests/fetch/api/abort/general-sharedworker.html
new file mode 100644
index 00000000000..9378e166ead
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/abort/general-sharedworker.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>General fetch abort tests - shared worker</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+ fetch_tests_from_worker(new SharedWorker("general.any.worker.js"));
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js b/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js
new file mode 100644
index 00000000000..e2c6e8deeb4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/abort/general.any.js
@@ -0,0 +1,524 @@
+// META: script=/common/utils.js
+// META: script=../request/request-error.js
+
+const BODY_METHODS = ['arrayBuffer', 'blob', 'formData', 'json', 'text'];
+
+// This is used to close connections that weren't correctly closed during the tests,
+// otherwise you can end up running out of HTTP connections.
+let requestAbortKeys = [];
+
+function abortRequests() {
+ const keys = requestAbortKeys;
+ requestAbortKeys = [];
+ return Promise.all(
+ keys.map(key => fetch(`../resources/stash-put.py?key=${key}&value=close`))
+ );
+}
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const fetchPromise = fetch('../resources/data.json', { signal });
+
+ await promise_rejects(t, "AbortError", fetchPromise);
+}, "Aborting rejects with AbortError");
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const url = new URL('../resources/data.json', location);
+ url.hostname = 'www1.' + url.hostname;
+
+ const fetchPromise = fetch(url, {
+ signal,
+ mode: 'no-cors'
+ });
+
+ await promise_rejects(t, "AbortError", fetchPromise);
+}, "Aborting rejects with AbortError - no-cors");
+
+// Test that errors thrown from the request constructor take priority over abort errors.
+// badRequestArgTests is from response-error.js
+for (const { args, testName } of badRequestArgTests) {
+ promise_test(async t => {
+ try {
+ // If this doesn't throw, we'll effectively skip the test.
+ // It'll fail properly in ../request/request-error.html
+ new Request(...args);
+ }
+ catch (err) {
+ const controller = new AbortController();
+ controller.abort();
+
+ // Add signal to 2nd arg
+ args[1] = args[1] || {};
+ args[1].signal = controller.signal;
+ await promise_rejects(t, err, fetch(...args));
+ }
+ }, `TypeError from request constructor takes priority - ${testName}`);
+}
+
+test(() => {
+ const request = new Request('');
+ assert_true(Boolean(request.signal), "Signal member is present & truthy");
+ assert_equals(request.signal.constructor, AbortSignal);
+}, "Request objects have a signal property");
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const request = new Request('../resources/data.json', { signal });
+
+ assert_true(Boolean(request.signal), "Signal member is present & truthy");
+ assert_equals(request.signal.constructor, AbortSignal);
+ assert_not_equals(request.signal, signal, 'Request has a new signal, not a reference');
+
+ const fetchPromise = fetch(request);
+
+ await promise_rejects(t, "AbortError", fetchPromise);
+}, "Signal on request object");
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const request = new Request('../resources/data.json', { signal });
+ const requestFromRequest = new Request(request);
+
+ const fetchPromise = fetch(requestFromRequest);
+
+ await promise_rejects(t, "AbortError", fetchPromise);
+}, "Signal on request object created from request object");
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const request = new Request('../resources/data.json');
+ const requestFromRequest = new Request(request, { signal });
+
+ const fetchPromise = fetch(requestFromRequest);
+
+ await promise_rejects(t, "AbortError", fetchPromise);
+}, "Signal on request object created from request object, with signal on second request");
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const request = new Request('../resources/data.json', { signal: new AbortController().signal });
+ const requestFromRequest = new Request(request, { signal });
+
+ const fetchPromise = fetch(requestFromRequest);
+
+ await promise_rejects(t, "AbortError", fetchPromise);
+}, "Signal on request object created from request object, with signal on second request overriding another");
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const request = new Request('../resources/data.json', { signal });
+
+ const fetchPromise = fetch(request, {method: 'POST'});
+
+ await promise_rejects(t, "AbortError", fetchPromise);
+}, "Signal retained after unrelated properties are overridden by fetch");
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const request = new Request('../resources/data.json', { signal });
+
+ const data = await fetch(request, { signal: null }).then(r => r.json());
+ assert_equals(data.key, 'value', 'Fetch fully completes');
+}, "Signal removed by setting to null");
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const log = [];
+
+ await Promise.all([
+ fetch('../resources/data.json', { signal }).then(
+ () => assert_unreached("Fetch must not resolve"),
+ () => log.push('fetch-reject')
+ ),
+ Promise.resolve().then(() => log.push('next-microtask'))
+ ]);
+
+ assert_array_equals(log, ['fetch-reject', 'next-microtask']);
+}, "Already aborted signal rejects immediately");
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const request = new Request('../resources/data.json', {
+ signal,
+ method: 'POST',
+ body: 'foo',
+ headers: { 'Content-Type': 'text/plain' }
+ });
+
+ await fetch(request).catch(() => {});
+
+ assert_true(request.bodyUsed, "Body has been used");
+}, "Request is still 'used' if signal is aborted before fetching");
+
+for (const bodyMethod of BODY_METHODS) {
+ promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+
+ const log = [];
+ const response = await fetch('../resources/data.json', { signal });
+
+ controller.abort();
+
+ const bodyPromise = response[bodyMethod]();
+
+ await Promise.all([
+ bodyPromise.catch(() => log.push(`${bodyMethod}-reject`)),
+ Promise.resolve().then(() => log.push('next-microtask'))
+ ]);
+
+ await promise_rejects(t, "AbortError", bodyPromise);
+
+ assert_array_equals(log, [`${bodyMethod}-reject`, 'next-microtask']);
+ }, `response.${bodyMethod}() rejects if already aborted`);
+}
+
+promise_test(async t => {
+ await abortRequests();
+
+ const controller = new AbortController();
+ const signal = controller.signal;
+ const stateKey = token();
+ const abortKey = token();
+ requestAbortKeys.push(abortKey);
+ controller.abort();
+
+ await fetch(`../resources/infinite-slow-response.py?stateKey=${stateKey}&abortKey=${abortKey}`, { signal }).catch(() => {});
+
+ // I'm hoping this will give the browser enough time to (incorrectly) make the request
+ // above, if it intends to.
+ await fetch('../resources/data.json').then(r => r.json());
+
+ const response = await fetch(`../resources/stash-take.py?key=${stateKey}`);
+ const data = await response.json();
+
+ assert_equals(data, null, "Request hasn't been made to the server");
+}, "Already aborted signal does not make request");
+
+promise_test(async t => {
+ await abortRequests();
+
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const fetches = [];
+
+ for (let i = 0; i < 3; i++) {
+ const abortKey = token();
+ requestAbortKeys.push(abortKey);
+
+ fetches.push(
+ fetch(`../resources/infinite-slow-response.py?${i}&abortKey=${abortKey}`, { signal })
+ );
+ }
+
+ for (const fetchPromise of fetches) {
+ await promise_rejects(t, "AbortError", fetchPromise);
+ }
+}, "Already aborted signal can be used for many fetches");
+
+promise_test(async t => {
+ await abortRequests();
+
+ const controller = new AbortController();
+ const signal = controller.signal;
+
+ await fetch('../resources/data.json', { signal }).then(r => r.json());
+
+ controller.abort();
+
+ const fetches = [];
+
+ for (let i = 0; i < 3; i++) {
+ const abortKey = token();
+ requestAbortKeys.push(abortKey);
+
+ fetches.push(
+ fetch(`../resources/infinite-slow-response.py?${i}&abortKey=${abortKey}`, { signal })
+ );
+ }
+
+ for (const fetchPromise of fetches) {
+ await promise_rejects(t, "AbortError", fetchPromise);
+ }
+}, "Signal can be used to abort other fetches, even if another fetch succeeded before aborting");
+
+promise_test(async t => {
+ await abortRequests();
+
+ const controller = new AbortController();
+ const signal = controller.signal;
+ const stateKey = token();
+ const abortKey = token();
+ requestAbortKeys.push(abortKey);
+
+ await fetch(`../resources/infinite-slow-response.py?stateKey=${stateKey}&abortKey=${abortKey}`, { signal });
+
+ const beforeAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json());
+ assert_equals(beforeAbortResult, "open", "Connection is open");
+
+ controller.abort();
+
+ // The connection won't close immediately, but it should close at some point:
+ const start = Date.now();
+
+ while (true) {
+ // Stop spinning if 10 seconds have passed
+ if (Date.now() - start > 10000) throw Error('Timed out');
+
+ const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json());
+ if (afterAbortResult == 'closed') break;
+ }
+}, "Underlying connection is closed when aborting after receiving response");
+
+promise_test(async t => {
+ await abortRequests();
+
+ const controller = new AbortController();
+ const signal = controller.signal;
+ const stateKey = token();
+ const abortKey = token();
+ requestAbortKeys.push(abortKey);
+
+ const url = new URL(`../resources/infinite-slow-response.py?stateKey=${stateKey}&abortKey=${abortKey}`, location);
+ url.hostname = 'www1.' + url.hostname;
+
+ await fetch(url, {
+ signal,
+ mode: 'no-cors'
+ });
+
+ const stashTakeURL = new URL(`../resources/stash-take.py?key=${stateKey}`, location);
+ stashTakeURL.hostname = 'www1.' + stashTakeURL.hostname;
+
+ const beforeAbortResult = await fetch(stashTakeURL).then(r => r.json());
+ assert_equals(beforeAbortResult, "open", "Connection is open");
+
+ controller.abort();
+
+ // The connection won't close immediately, but it should close at some point:
+ const start = Date.now();
+
+ while (true) {
+ // Stop spinning if 10 seconds have passed
+ if (Date.now() - start > 10000) throw Error('Timed out');
+
+ const afterAbortResult = await fetch(stashTakeURL).then(r => r.json());
+ if (afterAbortResult == 'closed') break;
+ }
+}, "Underlying connection is closed when aborting after receiving response - no-cors");
+
+for (const bodyMethod of BODY_METHODS) {
+ promise_test(async t => {
+ await abortRequests();
+
+ const controller = new AbortController();
+ const signal = controller.signal;
+ const stateKey = token();
+ const abortKey = token();
+ requestAbortKeys.push(abortKey);
+
+ const response = await fetch(`../resources/infinite-slow-response.py?stateKey=${stateKey}&abortKey=${abortKey}`, { signal });
+
+ const beforeAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json());
+ assert_equals(beforeAbortResult, "open", "Connection is open");
+
+ const bodyPromise = response[bodyMethod]();
+
+ controller.abort();
+
+ await promise_rejects(t, "AbortError", bodyPromise);
+
+ const start = Date.now();
+
+ while (true) {
+ // Stop spinning if 10 seconds have passed
+ if (Date.now() - start > 10000) throw Error('Timed out');
+
+ const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json());
+ if (afterAbortResult == 'closed') break;
+ }
+ }, `Fetch aborted & connection closed when aborted after calling response.${bodyMethod}()`);
+}
+
+promise_test(async t => {
+ await abortRequests();
+
+ const controller = new AbortController();
+ const signal = controller.signal;
+ const stateKey = token();
+ const abortKey = token();
+ requestAbortKeys.push(abortKey);
+
+ const response = await fetch(`../resources/infinite-slow-response.py?stateKey=${stateKey}&abortKey=${abortKey}`, { signal });
+ const reader = response.body.getReader();
+
+ controller.abort();
+
+ await promise_rejects(t, "AbortError", reader.read());
+ await promise_rejects(t, "AbortError", reader.closed);
+
+ // The connection won't close immediately, but it should close at some point:
+ const start = Date.now();
+
+ while (true) {
+ // Stop spinning if 10 seconds have passed
+ if (Date.now() - start > 10000) throw Error('Timed out');
+
+ const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json());
+ if (afterAbortResult == 'closed') break;
+ }
+}, "Stream errors once aborted. Underlying connection closed.");
+
+promise_test(async t => {
+ await abortRequests();
+
+ const controller = new AbortController();
+ const signal = controller.signal;
+ const stateKey = token();
+ const abortKey = token();
+ requestAbortKeys.push(abortKey);
+
+ const response = await fetch(`../resources/infinite-slow-response.py?stateKey=${stateKey}&abortKey=${abortKey}`, { signal });
+ const reader = response.body.getReader();
+
+ await reader.read();
+
+ controller.abort();
+
+ await promise_rejects(t, "AbortError", reader.read());
+ await promise_rejects(t, "AbortError", reader.closed);
+
+ // The connection won't close immediately, but it should close at some point:
+ const start = Date.now();
+
+ while (true) {
+ // Stop spinning if 10 seconds have passed
+ if (Date.now() - start > 10000) throw Error('Timed out');
+
+ const afterAbortResult = await fetch(`../resources/stash-take.py?key=${stateKey}`).then(r => r.json());
+ if (afterAbortResult == 'closed') break;
+ }
+}, "Stream errors once aborted, after reading. Underlying connection closed.");
+
+promise_test(async t => {
+ await abortRequests();
+
+ const controller = new AbortController();
+ const signal = controller.signal;
+
+ const response = await fetch(`../resources/empty.txt`, { signal });
+
+ // Read whole response to ensure close signal has sent.
+ await response.clone().text();
+
+ const reader = response.body.getReader();
+
+ controller.abort();
+
+ const item = await reader.read();
+
+ assert_true(item.done, "Stream is done");
+}, "Stream will not error if body is empty. It's closed with an empty queue before it errors.");
+
+promise_test(async t => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ let cancelReason;
+
+ const body = new ReadableStream({
+ pull(controller) {
+ controller.enqueue(new Uint8Array([42]));
+ },
+ cancel(reason) {
+ cancelReason = reason;
+ }
+ });
+
+ const fetchPromise = fetch('../resources/empty.txt', {
+ body, signal,
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'text/plain'
+ }
+ });
+
+ assert_true(!!cancelReason, 'Cancel called sync');
+ assert_equals(cancelReason.constructor, DOMException);
+ assert_equals(cancelReason.name, 'AbortError');
+
+ await promise_rejects(t, "AbortError", fetchPromise);
+
+ const fetchErr = await fetchPromise.catch(e => e);
+
+ assert_equals(cancelReason, fetchErr, "Fetch rejects with same error instance");
+}, "Readable stream synchronously cancels with AbortError if aborted before reading");
+
+test(() => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const request = new Request('.', { signal });
+ const requestSignal = request.signal;
+
+ const clonedRequest = request.clone();
+
+ assert_equals(requestSignal, request.signal, "Original request signal the same after cloning");
+ assert_true(request.signal.aborted, "Original request signal aborted");
+ assert_not_equals(clonedRequest.signal, request.signal, "Cloned request has different signal");
+ assert_true(clonedRequest.signal.aborted, "Cloned request signal aborted");
+}, "Signal state is cloned");
+
+test(() => {
+ const controller = new AbortController();
+ const signal = controller.signal;
+
+ const request = new Request('.', { signal });
+ const clonedRequest = request.clone();
+
+ const log = [];
+
+ request.signal.addEventListener('abort', () => log.push('original-aborted'));
+ clonedRequest.signal.addEventListener('abort', () => log.push('clone-aborted'));
+
+ controller.abort();
+
+ assert_array_equals(log, ['clone-aborted', 'original-aborted'], "Abort events fired in correct order");
+ assert_true(request.signal.aborted, 'Signal aborted');
+ assert_true(clonedRequest.signal.aborted, 'Signal aborted');
+}, "Clone aborts with original controller");
diff --git a/tests/wpt/web-platform-tests/fetch/api/abort/serviceworker-intercepted.https.html b/tests/wpt/web-platform-tests/fetch/api/abort/serviceworker-intercepted.https.html
new file mode 100644
index 00000000000..6df6aef2cda
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/abort/serviceworker-intercepted.https.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Aborting fetch when intercepted by a service worker</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>
+</head>
+<body>
+<script>
+ // Duplicating this resource to make service worker scoping simpler.
+ const SCOPE = '../resources/basic.html';
+ const BODY_METHODS = ['arrayBuffer', 'blob', 'formData', 'json', 'text'];
+
+ async function cleanup() {
+ for (const iframe of document.querySelectorAll('.test-iframe')) {
+ iframe.parentNode.removeChild(iframe);
+ }
+
+ const reg = await navigator.serviceWorker.getRegistration(SCOPE);
+ if (reg) await reg.unregister();
+ }
+
+ async function setupRegistration(t) {
+ await cleanup();
+ const reg = await navigator.serviceWorker.register('../resources/sw-intercept.js', { scope: SCOPE });
+ await wait_for_state(t, reg.installing, 'activated');
+ return reg;
+ }
+
+ promise_test(async t => {
+ await setupRegistration(t);
+ const iframe = await with_iframe(SCOPE);
+ const w = iframe.contentWindow;
+
+ const controller = new w.AbortController();
+ const signal = controller.signal;
+ controller.abort();
+
+ const nextData = new Promise(resolve => {
+ w.navigator.serviceWorker.addEventListener('message', function once(event) {
+ w.navigator.serviceWorker.removeEventListener('message', once);
+ resolve(event.data);
+ })
+ });
+
+ const fetchPromise = w.fetch('data.json', { signal });
+
+ await promise_rejects(t, "AbortError", fetchPromise);
+
+ await w.fetch('data.json?no-abort');
+
+ assert_true((await nextData).endsWith('?no-abort'), "Aborted request does not go through service worker");
+ }, "Already aborted request does not land in service worker");
+
+ for (const bodyMethod of BODY_METHODS) {
+ promise_test(async t => {
+ await setupRegistration(t);
+ const iframe = await with_iframe(SCOPE);
+ const w = iframe.contentWindow;
+
+ const controller = new w.AbortController();
+ const signal = controller.signal;
+
+ const log = [];
+ const response = await w.fetch('data.json', { signal });
+
+ controller.abort();
+
+ const bodyPromise = response[bodyMethod]();
+
+ await Promise.all([
+ bodyPromise.catch(() => log.push(`${bodyMethod}-reject`)),
+ Promise.resolve().then(() => log.push('next-microtask'))
+ ]);
+
+ await promise_rejects(t, "AbortError", bodyPromise);
+
+ assert_array_equals(log, [`${bodyMethod}-reject`, 'next-microtask']);
+ }, `response.${bodyMethod}() rejects if already aborted`);
+ }
+
+ promise_test(async t => {
+ await setupRegistration(t);
+ const iframe = await with_iframe(SCOPE);
+ const w = iframe.contentWindow;
+
+ const controller = new w.AbortController();
+ const signal = controller.signal;
+
+ const response = await w.fetch('data.json', { signal });
+ const reader = response.body.getReader();
+
+ controller.abort();
+
+ await promise_rejects(t, "AbortError", reader.read());
+ await promise_rejects(t, "AbortError", reader.closed);
+ }, "Stream errors once aborted.");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/block-mime-as-script.html b/tests/wpt/web-platform-tests/fetch/api/basic/block-mime-as-script.html
index 37c38839d17..afc2bbbafb0 100644
--- a/tests/wpt/web-platform-tests/fetch/api/basic/block-mime-as-script.html
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/block-mime-as-script.html
@@ -7,23 +7,27 @@
<script>
var noop = function() {};
- ["text/csv",
- "audio/aiff",
- "audio/midi",
- "audio/whatever",
- "video/avi",
- "video/fli",
- "video/whatever",
- "image/jpeg",
- "image/gif",
- "image/whatever"].forEach(function(test_case) {
- async_test(function(t) {
- var script = document.createElement("script");
- script.onerror = t.step_func_done(noop);
- script.onload = t.unreached_func("Unexpected load event");
- script.src = "../resources/script-with-header.py?mime=" + test_case;
- document.body.appendChild(script);
- }, "Should fail loading script with " + test_case + " MIME type");
+ ["non-empty", "empty"].forEach(function(content) {
+ ["text/csv",
+ "audio/aiff",
+ "audio/midi",
+ "audio/whatever",
+ "video/avi",
+ "video/fli",
+ "video/whatever",
+ "image/jpeg",
+ "image/gif",
+ "image/whatever"].forEach(function(test_case) {
+ async_test(function(t) {
+ var script = document.createElement("script");
+ script.onerror = t.step_func_done(noop);
+ script.onload = t.unreached_func("Unexpected load event");
+ script.src = "../resources/script-with-header.py?content=" + content +
+ "&mime=" + test_case;
+ document.body.appendChild(script);
+ }, "Should fail loading " + content + " script with " + test_case +
+ " MIME type");
+ });
});
["html", "plain"].forEach(function(test_case) {
diff --git a/tests/wpt/web-platform-tests/fetch/api/basic/integrity.js b/tests/wpt/web-platform-tests/fetch/api/basic/integrity.js
index a436dabe402..0a3c298cb0e 100644
--- a/tests/wpt/web-platform-tests/fetch/api/basic/integrity.js
+++ b/tests/wpt/web-platform-tests/fetch/api/basic/integrity.js
@@ -3,16 +3,26 @@ if (this.document === undefined) {
importScripts("../resources/utils.js");
}
-function integrity(desc, url, integrity, shouldPass) {
- if (shouldPass) {
+function integrity(desc, url, integrity, initRequestMode, shouldPass) {
+ var fetchRequestInit = {'integrity': integrity}
+ if (!!initRequestMode && initRequestMode !== "") {
+ fetchRequestInit.mode = initRequestMode;
+ }
+
+ if (shouldPass) {
promise_test(function(test) {
- return fetch(url, {'integrity': integrity}).then(function(resp) {
- assert_equals(resp.status, 200, "Response's status is 200");
+ return fetch(url, fetchRequestInit).then(function(resp) {
+ if (initRequestMode !== "no-cors") {
+ assert_equals(resp.status, 200, "Response's status is 200");
+ } else {
+ assert_equals(resp.status, 0, "Opaque response's status is 0");
+ assert_equals(resp.type, "opaque");
+ }
});
}, desc);
} else {
promise_test(function(test) {
- return promise_rejects(test, new TypeError(), fetch(url, {'integrity': integrity}));
+ return promise_rejects(test, new TypeError(), fetch(url, fetchRequestInit));
}, desc);
}
}
@@ -27,19 +37,43 @@ var url = "../resources/top.txt";
var corsUrl = "http://{{host}}:{{ports[http][1]}}" + dirname(location.pathname) + RESOURCES_DIR + "top.txt";
/* Enable CORS*/
corsUrl += "?pipe=header(Access-Control-Allow-Origin,*)";
+var corsUrl2 = "https://{{host}}:{{ports[https][0]}}/fetch/api/resource/top.txt";
+
+integrity("Empty string integrity", url, "", /* initRequestMode */ undefined,
+ /* shouldPass */ true);
+integrity("SHA-256 integrity", url, topSha256, /* initRequestMode */ undefined,
+ /* shouldPass */ true);
+integrity("SHA-384 integrity", url, topSha384, /* initRequestMode */ undefined,
+ /* shouldPass */ true);
+integrity("SHA-512 integrity", url, topSha512, /* initRequestMode */ undefined,
+ /* shouldPass */ true);
+integrity("Invalid integrity", url, invalidSha256,
+ /* initRequestMode */ undefined, /* shouldPass */ false);
+integrity("Multiple integrities: valid stronger than invalid", url,
+ invalidSha256 + " " + topSha384, /* initRequestMode */ undefined,
+ /* shouldPass */ true);
+integrity("Multiple integrities: invalid stronger than valid",
+ url, invalidSha512 + " " + topSha384, /* initRequestMode */ undefined,
+ /* shouldPass */ false);
+integrity("Multiple integrities: invalid as strong as valid", url,
+ invalidSha512 + " " + topSha512, /* initRequestMode */ undefined,
+ /* shouldPass */ true);
+integrity("Multiple integrities: both are valid", url,
+ topSha384 + " " + topSha512, /* initRequestMode */ undefined,
+ /* shouldPass */ true);
+integrity("Multiple integrities: both are invalid", url,
+ invalidSha256 + " " + invalidSha512, /* initRequestMode */ undefined,
+ /* shouldPass */ false);
+integrity("CORS empty integrity", corsUrl, "", /* initRequestMode */ undefined,
+ /* shouldPass */ true);
+integrity("CORS SHA-512 integrity", corsUrl, topSha512,
+ /* initRequestMode */ undefined, /* shouldPass */ true);
+integrity("CORS invalid integrity", corsUrl, invalidSha512,
+ /* initRequestMode */ undefined, /* shouldPass */ false);
-integrity("Empty string integrity", url, "", true);
-integrity("SHA-256 integrity", url, topSha256, true);
-integrity("SHA-384 integrity", url, topSha384, true);
-integrity("SHA-512 integrity", url, topSha512, true);
-integrity("Invalid integrity", url, invalidSha256, false);
-integrity("Multiple integrities: valid stronger than invalid", url, invalidSha256 + " " + topSha384, true);
-integrity("Multiple integrities: invalid stronger than valid", url, invalidSha512 + " " + topSha384, false);
-integrity("Multiple integrities: invalid as strong as valid", url, invalidSha512 + " " + topSha512, true);
-integrity("Multiple integrities: both are valid", url, topSha384 + " " + topSha512, true);
-integrity("Multiple integrities: both are invalid", url, invalidSha256 + " " + invalidSha512, false);
-integrity("CORS empty integrity", corsUrl, "", true);
-integrity("CORS SHA-512 integrity", corsUrl, topSha512, true);
-integrity("CORS invalid integrity", corsUrl, invalidSha512, false);
+integrity("Empty string integrity for opaque response", corsUrl2, "",
+ /* initRequestMode */ "no-cors", /* shouldPass */ true);
+integrity("SHA-* integrity for opaque response", corsUrl2, topSha512,
+ /* initRequestMode */ "no-cors", /* shouldPass */ false);
done();
diff --git a/tests/wpt/web-platform-tests/fetch/api/cors/cors-expose-star.js b/tests/wpt/web-platform-tests/fetch/api/cors/cors-expose-star.js
index 90a9351d1e8..e37ddb4c3f2 100644
--- a/tests/wpt/web-platform-tests/fetch/api/cors/cors-expose-star.js
+++ b/tests/wpt/web-platform-tests/fetch/api/cors/cors-expose-star.js
@@ -4,7 +4,7 @@ if (this.document === undefined) {
}
const url = "http://{{host}}:{{ports[http][1]}}" + dirname(location.pathname) + RESOURCES_DIR + "top.txt",
- sharedHeaders = "?pipe=header(Access-Control-Expose-Headers,*)|header(Test,X)|header(Set-Cookie,X)|"
+ sharedHeaders = "?pipe=header(Access-Control-Expose-Headers,*)|header(Test,X)|header(Set-Cookie,X)|header(*,whoa)|"
promise_test(() => {
const headers = "header(Access-Control-Allow-Origin,*)"
@@ -13,6 +13,7 @@ promise_test(() => {
assert_equals(resp.type , "cors")
assert_equals(resp.headers.get("test"), "X")
assert_equals(resp.headers.get("set-cookie"), null)
+ assert_equals(resp.headers.get("*"), "whoa")
})
}, "Basic Access-Control-Expose-Headers: * support")
@@ -25,7 +26,19 @@ promise_test(() => {
assert_equals(resp.headers.get("content-type"), "text/plain") // safelisted
assert_equals(resp.headers.get("test"), null)
assert_equals(resp.headers.get("set-cookie"), null)
+ assert_equals(resp.headers.get("*"), "whoa")
})
-}, "Cannot use * for credentialed fetches")
+}, "* for credentialed fetches only matches literally")
+
+promise_test(() => {
+ const headers = "header(Access-Control-Allow-Origin,*)|header(Access-Control-Expose-Headers,set-cookie)"
+ return fetch(url + sharedHeaders + headers).then(resp => {
+ assert_equals(resp.status, 200)
+ assert_equals(resp.type , "cors")
+ assert_equals(resp.headers.get("test"), "X")
+ assert_equals(resp.headers.get("set-cookie"), null)
+ assert_equals(resp.headers.get("*"), "whoa")
+ })
+}, "* can be one of several values")
done();
diff --git a/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-cache.any.js b/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-cache.any.js
new file mode 100644
index 00000000000..ce6a169d814
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-cache.any.js
@@ -0,0 +1,46 @@
+// META: script=/common/utils.js
+// META: script=../resources/utils.js
+// META: script=/common/get-host-info.sub.js
+
+var cors_url = get_host_info().HTTP_REMOTE_ORIGIN +
+ dirname(location.pathname) +
+ RESOURCES_DIR +
+ "preflight.py";
+
+promise_test((test) => {
+ var uuid_token = token();
+ var request_url =
+ cors_url + "?token=" + uuid_token + "&max_age=12000&allow_methods=POST" +
+ "&allow_headers=x-test-header";
+ return fetch(cors_url + "?token=" + uuid_token + "&clear-stash")
+ .then(() => {
+ return fetch(
+ new Request(request_url,
+ {
+ mode: "cors",
+ method: "POST",
+ headers: [["x-test-header", "test1"]]
+ }));
+ })
+ .then((resp) => {
+ assert_equals(resp.status, 200, "Response's status is 200");
+ assert_equals(resp.headers.get("x-did-preflight"), "1", "Preflight request has been made");
+ return fetch(cors_url + "?token=" + uuid_token + "&clear-stash");
+ })
+ .then((res) => res.text())
+ .then((txt) => {
+ assert_equals(txt, "1", "Server stash must be cleared.");
+ return fetch(
+ new Request(request_url,
+ {
+ mode: "cors",
+ method: "POST",
+ headers: [["x-test-header", "test2"]]
+ }));
+ })
+ .then((resp) => {
+ assert_equals(resp.status, 200, "Response's status is 200");
+ assert_equals(resp.headers.get("x-did-preflight"), "0", "Preflight request has not been made");
+ return fetch(cors_url + "?token=" + uuid_token + "&clear-stash");
+ });
+});
diff --git a/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-star.any.js b/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-star.any.js
index 213d805ea5b..8a18b514e96 100644
--- a/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-star.any.js
+++ b/tests/wpt/web-platform-tests/fetch/api/cors/cors-preflight-star.any.js
@@ -16,7 +16,7 @@ function preflightTest(succeeds, withCredentials, allowMethod, allowHeader, useM
if (useMethod) {
requestInit.method = useMethod
}
- if (useHeader) {
+ if (useHeader.length > 0) {
requestInit.headers = [useHeader]
}
testURL += "allow_methods=" + allowMethod + "&"
@@ -36,7 +36,9 @@ preflightTest(true, false, "get", "x-test", "GET", ["X-Test", "1"])
preflightTest(true, false, "*", "x-test", "SUPER", ["X-Test", "1"])
preflightTest(true, false, "*", "*", "OK", ["X-Test", "1"])
preflightTest(false, true, "*", "*", "OK", ["X-Test", "1"])
-preflightTest(false, true, "*", "", "PUT", undefined)
-preflightTest(false, true, "put", "*", "PUT", undefined)
+preflightTest(false, true, "*", "", "PUT", [])
+preflightTest(true, true, "PUT", "*", "PUT", [])
+preflightTest(false, true, "put", "*", "PUT", [])
preflightTest(false, true, "get", "*", "GET", ["X-Test", "1"])
preflightTest(false, true, "*", "*", "GET", ["X-Test", "1"])
+preflightTest(true, true, "*", "*", "*", ["*", "1"])
diff --git a/tests/wpt/web-platform-tests/fetch/api/headers/headers-combine.html b/tests/wpt/web-platform-tests/fetch/api/headers/headers-combine.html
index 115df7adf4f..7341b77e86b 100644
--- a/tests/wpt/web-platform-tests/fetch/api/headers/headers-combine.html
+++ b/tests/wpt/web-platform-tests/fetch/api/headers/headers-combine.html
@@ -2,7 +2,7 @@
<html>
<head>
<meta charset="utf-8">
- <title>Headers nameshake</title>
+ <title>Headers have combined (and sorted) values</title>
<meta name="help" href="https://fetch.spec.whatwg.org/#headers">
<meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
<script src="/resources/testharness.js"></script>
@@ -53,6 +53,24 @@
assert_equals(headers.get(name), (value + ", " + "newSingleValue"));
}
}, "Check append methods when called with already used name");
+
+ test(() => {
+ const headers = new Headers([["1", "a"],["1", "b"]]);
+ for(let header of headers) {
+ assert_array_equals(header, ["1", "a, b"]);
+ }
+ }, "Iterate combined values");
+
+ test(() => {
+ const headers = new Headers([["2", "a"], ["1", "b"], ["2", "b"]]),
+ expected = [["1", "b"], ["2", "a, b"]];
+ let i = 0;
+ for(let header of headers) {
+ assert_array_equals(header, expected[i]);
+ i++;
+ }
+ assert_equals(i, 2);
+ }, "Iterate combined values in sorted order")
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/headers/headers-record.html b/tests/wpt/web-platform-tests/fetch/api/headers/headers-record.html
index 173daf0a235..85dfadd269d 100644
--- a/tests/wpt/web-platform-tests/fetch/api/headers/headers-record.html
+++ b/tests/wpt/web-platform-tests/fetch/api/headers/headers-record.html
@@ -251,59 +251,21 @@ test(function() {
ownKeys: function() {
return [ "a", "c", "a", "c" ];
},
- getCalls: 0,
- gotCOnce: false,
- get: function(target, name, receiver) {
- if (name == "c") {
- this.gotCOnce = true;
- }
- if (typeof name == "string") {
- return ++this.getCalls;
- }
- return Reflect.get(target, name, receiver);
- },
- getOwnPropertyDescriptor: function(target, name) {
- var desc = Reflect.getOwnPropertyDescriptor(target, name);
- if (name == "c" && this.gotCOnce) {
- desc.enumerable = false;
- }
- return desc;
- }
};
var lyingProxy = new Proxy(record, lyingHandler);
var proxy = new Proxy(lyingProxy, loggingHandler);
- var h = new Headers(proxy);
- assert_equals(log.length, 9);
+ // Returning duplicate keys from ownKeys() throws a TypeError.
+ assert_throws(new TypeError(),
+ function() { var h = new Headers(proxy); });
+
+ assert_equals(log.length, 2);
// The first thing is the [[Get]] of Symbol.iterator to figure out whether
// we're a sequence, during overload resolution.
assert_array_equals(log[0], ["get", lyingProxy, Symbol.iterator, proxy]);
// Then we have the [[OwnPropertyKeys]] from
// https://heycam.github.io/webidl/#es-to-record step 4.
assert_array_equals(log[1], ["ownKeys", lyingProxy]);
- // Then the [[GetOwnProperty]] from step 5.1.
- assert_array_equals(log[2], ["getOwnPropertyDescriptor", lyingProxy, "a"]);
- // Then the [[Get]] from step 5.2.
- assert_array_equals(log[3], ["get", lyingProxy, "a", proxy]);
- // Then the second [[GetOwnProperty]] from step 5.1.
- assert_array_equals(log[4], ["getOwnPropertyDescriptor", lyingProxy, "c"]);
- // Then the second [[Get]] from step 5.2.
- assert_array_equals(log[5], ["get", lyingProxy, "c", proxy]);
- // Then the third [[GetOwnProperty]] from step 5.1.
- assert_array_equals(log[6], ["getOwnPropertyDescriptor", lyingProxy, "a"]);
- // Then the third [[Get]] from step 5.2.
- assert_array_equals(log[7], ["get", lyingProxy, "a", proxy]);
- // Then the fourth [[GetOwnProperty]] from step 5.1.
- assert_array_equals(log[8], ["getOwnPropertyDescriptor", lyingProxy, "c"]);
- // No [[Get]] because not enumerable.
-
- // Check the results.
- assert_equals([...h].length, 2);
- assert_array_equals([...h.keys()], ["a", "c"]);
- assert_true(h.has("a"));
- assert_equals(h.get("a"), "3");
- assert_true(h.has("c"));
- assert_equals(h.get("c"), "2");
}, "Correct operation ordering with repeated keys");
test(function() {
@@ -395,5 +357,4 @@ test(function() {
assert_true(h.has("c"));
assert_equals(h.get("c"), "d");
}, "Operation with non-enumerable Symbol keys");
-
</script>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-error.html b/tests/wpt/web-platform-tests/fetch/api/request/request-error.html
index 1777b89d299..70be9fb0e7c 100644
--- a/tests/wpt/web-platform-tests/fetch/api/request/request-error.html
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-error.html
@@ -8,54 +8,20 @@
<meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+ <script src="request-error.js"></script>
</head>
<body>
<script>
- test(function() {
- assert_throws(new TypeError() , function() { new Request("", {"window" : "http://test.url"}); },
- "Expect TypeError exception");
- },"RequestInit's window is not null");
-
- test(function() {
- assert_throws(new TypeError() , function() { new Request("http://:not a valid URL"); },
- "Expect TypeError exception");
- },"Input URL is not valid")
-
- test(function() {
- assert_throws(new TypeError() , function() { new Request("http://user:pass@test.url"); },
- "Expect TypeError exception");
- },"Input URL has credentials");
-
- test(function() {
- assert_throws(new TypeError() , function() { new Request("", {"mode" : "navigate"}); },
- "Expect TypeError exception");
- },"RequestInit's mode is navigate");
-
- test(function() {
- assert_throws(new TypeError() , function() { new Request("", {"referrer" : "http://:not a valid URL"}); },
- "Expect TypeError exception");
- },"RequestInit's referrer is invalid");
-
- test(function() {
- assert_throws(new TypeError() , function() { new Request("", {"method" : "IN VALID"}); },
- "Expect TypeError exception");
- }, "RequestInit's method is invalid");
-
- test(function() {
- assert_throws(new TypeError() , function() { new Request("", {"method" : "TRACE"}); },
- "Expect TypeError exception");
- }, "RequestInit's method is forbidden");
-
- test(function() {
- assert_throws(new TypeError() , function() { new Request("", {"mode" : "no-cors", "method" : "PUT"}); },
- "Expect TypeError exception");
- },"RequestInit's mode is no-cors and method is not simple");
-
- test(function() {
- assert_throws(new TypeError() ,
- function() { new Request("", {"mode" : "cors", "cache" : "only-if-cached"}); },
- "Expect TypeError exception");
- },"RequestInit's cache mode is only-if-cached and mode is not same-origin");
+ // badRequestArgTests is from response-error.js
+ for (const { args, testName } of badRequestArgTests) {
+ test(() => {
+ assert_throws(
+ new TypeError(),
+ () => new Request(...args),
+ "Expect TypeError exception"
+ );
+ }, testName);
+ }
test(function() {
var initialHeaders = new Headers([["Content-Type", "potato"]]);
@@ -86,28 +52,10 @@
assert_equals(request.headers.get("Content-Type"), "potato");
}, "Request should get its content-type from init headers if one is provided");
- var parameters = ["referrerPolicy", "mode", "credentials", "cache", "redirect"];
- parameters.forEach(function(parameter) {
- test(function() {
- var options = { };
- options[parameter] = "BAD";
- assert_throws(new TypeError(), function() { new Request("", options); });
- },"Bad " + parameter +" init parameter value");
- });
-
- function testOnlyIfCachedMode(fetchMode, ok) {
- test(function() {
- var options = {"cache": "only-if-cached", "mode": fetchMode};
- if (ok)
- new Request("test", options);
- else
- assert_throws(new TypeError(), function() { new Request("test", options); });
- }, "Request with cache mode: only-if-cached and fetch mode: " + fetchMode);
- }
- testOnlyIfCachedMode("same-origin", true);
- testOnlyIfCachedMode("cors", false);
- testOnlyIfCachedMode("no-cors", false);
-
+ test(function() {
+ var options = {"cache": "only-if-cached", "mode": "same-origin"};
+ new Request("test", options);
+ }, "Request with cache mode: only-if-cached and fetch mode: same-origin");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-error.js b/tests/wpt/web-platform-tests/fetch/api/request/request-error.js
new file mode 100644
index 00000000000..cf77313f5bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-error.js
@@ -0,0 +1,57 @@
+const badRequestArgTests = [
+ {
+ args: ["", { "window": "http://test.url" }],
+ testName: "RequestInit's window is not null"
+ },
+ {
+ args: ["http://:not a valid URL"],
+ testName: "Input URL is not valid"
+ },
+ {
+ args: ["http://user:pass@test.url"],
+ testName: "Input URL has credentials"
+ },
+ {
+ args: ["", { "mode": "navigate" }],
+ testName: "RequestInit's mode is navigate"
+ },
+ {
+ args: ["", { "referrer": "http://:not a valid URL" }],
+ testName: "RequestInit's referrer is invalid"
+ },
+ {
+ args: ["", { "method": "IN VALID" }],
+ testName: "RequestInit's method is invalid"
+ },
+ {
+ args: ["", { "method": "TRACE" }],
+ testName: "RequestInit's method is forbidden"
+ },
+ {
+ args: ["", { "mode": "no-cors", "method": "PUT" }],
+ testName: "RequestInit's mode is no-cors and method is not simple"
+ },
+ {
+ args: ["", { "mode": "cors", "cache": "only-if-cached" }],
+ testName: "RequestInit's cache mode is only-if-cached and mode is not same-origin"
+ },
+ {
+ args: ["test", { "cache": "only-if-cached", "mode": "cors" }],
+ testName: "Request with cache mode: only-if-cached and fetch mode cors"
+ },
+ {
+ args: ["test", { "cache": "only-if-cached", "mode": "no-cors" }],
+ testName: "Request with cache mode: only-if-cached and fetch mode no-cors"
+ }
+];
+
+badRequestArgTests.push(
+ ...["referrerPolicy", "mode", "credentials", "cache", "redirect"].map(optionProp => {
+ const options = {};
+ options[optionProp] = "BAD";
+ return {
+ args: ["", options],
+ testName: `Bad ${optionProp} init parameter value`
+ };
+ })
+);
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-headers.html b/tests/wpt/web-platform-tests/fetch/api/request/request-headers.html
index 1d54728b7da..014f2fb2d58 100644
--- a/tests/wpt/web-platform-tests/fetch/api/request/request-headers.html
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-headers.html
@@ -168,6 +168,19 @@
});
}, "Testing empty Request Content-Type header");
+ test(function() {
+ const request1 = new Request("");
+ assert_equals(request1.headers, request1.headers);
+
+ const request2 = new Request("", {"headers": {"X-Foo": "bar"}});
+ assert_equals(request2.headers, request2.headers);
+ const headers = request2.headers;
+ request2.headers.set("X-Foo", "quux");
+ assert_equals(headers, request2.headers);
+ headers.set("X-Other-Header", "baz");
+ assert_equals(headers, request2.headers);
+ }, "Test that Request.headers has the [SameObject] extended attribute");
+
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-idl.html b/tests/wpt/web-platform-tests/fetch/api/request/request-idl.html
index 608a129231a..f78f0ca894a 100644
--- a/tests/wpt/web-platform-tests/fetch/api/request/request-idl.html
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-idl.html
@@ -37,7 +37,6 @@
readonly attribute USVString url;
[SameObject] readonly attribute Headers headers;
- readonly attribute RequestType type;
readonly attribute RequestDestination destination;
readonly attribute USVString referrer;
readonly attribute ReferrerPolicy referrerPolicy;
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-structure.html b/tests/wpt/web-platform-tests/fetch/api/request/request-structure.html
index cbe6cee999f..98c24517e66 100644
--- a/tests/wpt/web-platform-tests/fetch/api/request/request-structure.html
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-structure.html
@@ -22,7 +22,6 @@
var attributes = ["method",
"url",
"headers",
- "type",
"destination",
"referrer",
"referrerPolicy",
@@ -56,11 +55,6 @@
return;
break;
- case "type":
- defaultValue = "";
- newValue = "style";
- break;
-
case "destination":
defaultValue = "";
newValue = "worker";
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/request-type-attribute-historical.html b/tests/wpt/web-platform-tests/fetch/api/request/request-type-attribute-historical.html
new file mode 100644
index 00000000000..e0768759b00
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/request-type-attribute-historical.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Request.type attribute should not exist</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<script>
+ var request = new Request("https://domfarolino.com");
+ test(() => {
+ assert_equals(request.type, undefined, "request.type should be undefined");
+ }, "'type' getter should not exist on Request objects");
+</script>
diff --git a/tests/wpt/web-platform-tests/fetch/api/request/url-encoding.html b/tests/wpt/web-platform-tests/fetch/api/request/url-encoding.html
new file mode 100644
index 00000000000..31c1ed3920b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/request/url-encoding.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<meta charset=windows-1252>
+<title>Fetch: URL encoding</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+const expectedURL = new URL("?%C3%9F", location.href).href;
+const expectedURL2 = new URL("?%EF%BF%BD", location.href).href;
+test(() => {
+ let r = new Request("?\u00DF");
+ assert_equals(r.url, expectedURL);
+
+ r = new Request("?\uD83D");
+ assert_equals(r.url, expectedURL2);
+}, "URL encoding and Request");
+
+promise_test(() => {
+ return fetch("?\u00DF").then(res => {
+ assert_equals(res.url, expectedURL);
+ return fetch("?\uD83D").then(res2 => {
+ assert_equals(res2.url, expectedURL2);
+ });
+ });
+}, "URL encoding and fetch()");
+</script>
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/basic.html b/tests/wpt/web-platform-tests/fetch/api/resources/basic.html
new file mode 100644
index 00000000000..e23afd4bf6a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/basic.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<!--
+ Duplicating /common/blank.html to make service worker scoping simpler in
+ ../abort/serviceworker-intercepted.https.html
+-->
diff --git a/tests/wpt/web-platform-tests/microdata/encoding-microdata/items/.gitkeep b/tests/wpt/web-platform-tests/fetch/api/resources/empty.txt
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/encoding-microdata/items/.gitkeep
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/empty.txt
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/infinite-slow-response.py b/tests/wpt/web-platform-tests/fetch/api/resources/infinite-slow-response.py
new file mode 100644
index 00000000000..fa2c482ec19
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/infinite-slow-response.py
@@ -0,0 +1,36 @@
+import time
+
+
+def url_dir(request):
+ return '/'.join(request.url_parts.path.split('/')[:-1]) + '/'
+
+
+def stash_write(request, key, value):
+ """Write to the stash, overwriting any previous value"""
+ request.server.stash.take(key, url_dir(request))
+ request.server.stash.put(key, value, url_dir(request))
+
+
+def main(request, response):
+ stateKey = request.GET.first("stateKey", "")
+ abortKey = request.GET.first("abortKey", "")
+
+ if stateKey:
+ stash_write(request, stateKey, 'open')
+
+ response.headers.set("Content-type", "text/plain")
+ response.write_status_headers()
+
+ # Writing an initial 2k so browsers realise it's there. *shrug*
+ response.writer.write("." * 2048)
+
+ while True:
+ if not response.writer.flush():
+ break
+ if abortKey and request.server.stash.take(abortKey, url_dir(request)):
+ break
+ response.writer.write(".")
+ time.sleep(0.01)
+
+ if stateKey:
+ stash_write(request, stateKey, 'closed')
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/preflight.py b/tests/wpt/web-platform-tests/fetch/api/resources/preflight.py
index 857ce8f4084..6263eaef621 100644
--- a/tests/wpt/web-platform-tests/fetch/api/resources/preflight.py
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/preflight.py
@@ -12,6 +12,12 @@ def main(request, response):
else:
headers.append(("Access-Control-Allow-Origin", "*"))
+ if "clear-stash" in request.GET:
+ if request.server.stash.take(token) is not None:
+ return headers, "1"
+ else:
+ return headers, "0"
+
if "credentials" in request.GET:
headers.append(("Access-Control-Allow-Credentials", "true"))
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/script-with-header.py b/tests/wpt/web-platform-tests/fetch/api/resources/script-with-header.py
index 778871b4406..5337cc97bdd 100644
--- a/tests/wpt/web-platform-tests/fetch/api/resources/script-with-header.py
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/script-with-header.py
@@ -1,4 +1,7 @@
def main(request, response):
headers = [("Content-type", request.GET.first("mime"))]
- content = "console.log('Script loaded')"
+ if "content" in request.GET and request.GET.first("content") == "empty":
+ content = ''
+ else:
+ content = "console.log('Script loaded')"
return 200, headers, content
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/stash-put.py b/tests/wpt/web-platform-tests/fetch/api/resources/stash-put.py
new file mode 100644
index 00000000000..dd84ff1fc85
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/stash-put.py
@@ -0,0 +1,7 @@
+def main(request, response):
+ url_dir = '/'.join(request.url_parts.path.split('/')[:-1]) + '/'
+ key = request.GET.first("key")
+ value = request.GET.first("value")
+ request.server.stash.put(key, value, url_dir)
+ response.headers.set('Access-Control-Allow-Origin', '*')
+ return "done"
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/stash-take.py b/tests/wpt/web-platform-tests/fetch/api/resources/stash-take.py
new file mode 100644
index 00000000000..fcaf96c96a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/stash-take.py
@@ -0,0 +1,9 @@
+from wptserve.handlers import json_handler
+
+
+@json_handler
+def main(request, response):
+ dir = '/'.join(request.url_parts.path.split('/')[:-1]) + '/'
+ key = request.GET.first("key")
+ response.headers.set('Access-Control-Allow-Origin', '*')
+ return request.server.stash.take(key, dir)
diff --git a/tests/wpt/web-platform-tests/fetch/api/resources/sw-intercept.js b/tests/wpt/web-platform-tests/fetch/api/resources/sw-intercept.js
new file mode 100644
index 00000000000..b8166b62a5c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/sw-intercept.js
@@ -0,0 +1,10 @@
+async function broadcast(msg) {
+ for (const client of await clients.matchAll()) {
+ client.postMessage(msg);
+ }
+}
+
+addEventListener('fetch', event => {
+ event.waitUntil(broadcast(event.request.url));
+ event.respondWith(fetch(event.request));
+});
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 f290c22ee7f..213d01a8bbf 100644
--- a/tests/wpt/web-platform-tests/fetch/api/resources/utils.js
+++ b/tests/wpt/web-platform-tests/fetch/api/resources/utils.js
@@ -81,6 +81,26 @@ function validateStreamFromString(reader, expectedValue, retrievedArrayBuffer) {
});
}
+function validateStreamFromPartialString(reader, expectedValue, retrievedArrayBuffer) {
+ return reader.read().then(function(data) {
+ if (!data.done) {
+ assert_true(data.value instanceof Uint8Array, "Fetch ReadableStream chunks should be Uint8Array");
+ var newBuffer;
+ if (retrievedArrayBuffer) {
+ newBuffer = new ArrayBuffer(data.value.length + retrievedArrayBuffer.length);
+ newBuffer.set(retrievedArrayBuffer, 0);
+ newBuffer.set(data.value, retrievedArrayBuffer.length);
+ } else {
+ newBuffer = data.value;
+ }
+ return validateStreamFromPartialString(reader, expectedValue, newBuffer);
+ }
+
+ var string = new TextDecoder("utf-8").decode(retrievedArrayBuffer);
+ return assert_true(string.search(expectedValue) != -1, "Retrieve and verify stream");
+ });
+}
+
// From streams tests
function delay(milliseconds)
{
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-cancel-stream.html b/tests/wpt/web-platform-tests/fetch/api/response/response-cancel-stream.html
index 2a02e1f60ac..58d6745a12a 100644
--- a/tests/wpt/web-platform-tests/fetch/api/response/response-cancel-stream.html
+++ b/tests/wpt/web-platform-tests/fetch/api/response/response-cancel-stream.html
@@ -12,7 +12,6 @@
<body>
<script src="../resources/utils.js"></script>
<script>
-
promise_test(function(test) {
return new Response(new Blob([], { "type" : "text/plain" })).body.cancel();
}, "Cancelling a starting blob Response stream");
@@ -51,16 +50,19 @@ promise_test(function() {
}, "Cancelling a loading Response stream");
promise_test(function() {
+ async function readAll(reader) {
+ while (true) {
+ const {value, done} = await reader.read();
+ if (done)
+ return;
+ }
+ }
+
return fetch(RESOURCES_DIR + "top.txt").then(function(response) {
var reader = response.body.getReader();
- var closedPromise = reader.closed.then(function() {
- return reader.cancel();
- });
- reader.read();
- return closedPromise;
+ return readAll(reader).then(() => reader.cancel());
});
}, "Cancelling a closed Response stream");
-
</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 54d55fcb45f..8a97fa0c90f 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
@@ -57,15 +57,16 @@ promise_test(function(test) {
promise_test(function(test) {
var response = new Response(formData);
- return validateStreamFromString(response.body.getReader(), "name=value");
+ return validateStreamFromPartialString(response.body.getReader(),
+ "Content-Disposition: form-data; name=\"name\"\r\n\r\nvalue");
}, "Read form data response's body as readableStream");
test(function() {
assert_equals(Response.error().body, null);
}, "Getting an error Response stream");
-promise_test(function(test) {
- assert_equals(Response.redirect(301).body, null);
+test(function() {
+ assert_equals(Response.redirect("/").body, null);
}, "Getting a redirect Response stream");
</script>
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-init-001.html b/tests/wpt/web-platform-tests/fetch/api/response/response-init-001.html
index 4a8a7bd80cc..cd89448bbbe 100644
--- a/tests/wpt/web-platform-tests/fetch/api/response/response-init-001.html
+++ b/tests/wpt/web-platform-tests/fetch/api/response/response-init-001.html
@@ -58,6 +58,19 @@
"Expect response.ok is " + isOkStatus(response.status));
}
}, "Check " + attributeName + " init values and associated getter");
+
+ test(function() {
+ const response1 = new Response("");
+ assert_equals(response1.headers, response1.headers);
+
+ const response2 = new Response("", {"headers": {"X-Foo": "bar"}});
+ assert_equals(response2.headers, response2.headers);
+ const headers = response2.headers;
+ response2.headers.set("X-Foo", "quux");
+ assert_equals(headers, response2.headers);
+ headers.set("X-Other-Header", "baz");
+ assert_equals(headers, response2.headers);
+ }, "Test that Response.headers has the [SameObject] extended attribute");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/fetch/api/response/response-stream-disturbed-6.html b/tests/wpt/web-platform-tests/fetch/api/response/response-stream-disturbed-6.html
new file mode 100644
index 00000000000..15c8dfd477d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/api/response/response-stream-disturbed-6.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>ReadableStream disturbed tests, via Response's bodyUsed property</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="author" title="Takeshi Yoshino" href="mailto:tyoshino@chromium.org">
+
+<link rel="help" href="https://streams.spec.whatwg.org/#is-readable-stream-disturbed">
+<link rel="help" href="https://fetch.spec.whatwg.org/#dom-body-bodyused">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+"use strict";
+
+test(() => {
+ const stream = new ReadableStream();
+ const response = new Response(stream);
+ assert_false(response.bodyUsed, "On construction");
+
+ const reader = stream.getReader();
+ assert_false(response.bodyUsed, "After getting a reader");
+
+ reader.read();
+ assert_true(response.bodyUsed, "After calling stream.read()");
+}, "A non-closed stream on which read() has been called");
+
+test(() => {
+ const stream = new ReadableStream();
+ const response = new Response(stream);
+ assert_false(response.bodyUsed, "On construction");
+
+ const reader = stream.getReader();
+ assert_false(response.bodyUsed, "After getting a reader");
+
+ reader.cancel();
+ assert_true(response.bodyUsed, "After calling stream.cancel()");
+}, "A non-closed stream on which cancel() has been called");
+
+test(() => {
+ const stream = new ReadableStream({
+ start(c) {
+ c.close();
+ }
+ });
+ const response = new Response(stream);
+ assert_false(response.bodyUsed, "On construction");
+
+ const reader = stream.getReader();
+ assert_false(response.bodyUsed, "After getting a reader");
+
+ reader.read();
+ assert_true(response.bodyUsed, "After calling stream.read()");
+}, "A closed stream on which read() has been called");
+
+test(() => {
+ const stream = new ReadableStream({
+ start(c) {
+ c.error(new Error("some error"));
+ }
+ });
+ const response = new Response(stream);
+ assert_false(response.bodyUsed, "On construction");
+
+ const reader = stream.getReader();
+ assert_false(response.bodyUsed, "After getting a reader");
+
+ reader.read();
+ assert_true(response.bodyUsed, "After calling stream.read()");
+}, "An errored stream on which read() has been called");
+
+test(() => {
+ const stream = new ReadableStream({
+ start(c) {
+ c.error(new Error("some error"));
+ }
+ });
+ const response = new Response(stream);
+ assert_false(response.bodyUsed, "On construction");
+
+ const reader = stream.getReader();
+ assert_false(response.bodyUsed, "After getting a reader");
+
+ reader.cancel();
+ assert_true(response.bodyUsed, "After calling stream.cancel()");
+}, "An errored stream on which cancel() has been called");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html b/tests/wpt/web-platform-tests/fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html
new file mode 100644
index 00000000000..3b13fccdc4b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fetch/security/dangling-markup-mitigation-data-url.tentative.sub.html
@@ -0,0 +1,228 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ function readableURL(url) {
+ return url.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t");
+ }
+
+ // For each of the following tests, we'll inject a frame containing the HTML we'd like to poke at
+ // as a `srcdoc` attribute. Because we're injecting markup via `srcdoc`, we need to entity-escape
+ // the content we'd like to treat as "raw" (e.g. `\n` => `&#10;`, `<` => `&lt;`), and
+ // double-escape the "escaped" content.
+ var rawBrace = "&lt;";
+ var escapedBrace = "&amp;lt;";
+ var doubleEscapedBrace = "&amp;amp;lt;";
+ var rawNewline = "&#10;";
+ var escapedNewline = "&amp;#10;";
+ var doubleEscapedNewline = "&amp;amp;#10;";
+
+ function appendFrameAndGetElement(test, frame) {
+ return new Promise((resolve, reject) => {
+ frame.onload = test.step_func(_ => {
+ frame.onload = null;
+ resolve(frame.contentDocument.querySelector('#dangling'));
+ });
+ document.body.appendChild(frame);
+ });
+ }
+
+ function assert_img_loaded(test, frame) {
+ appendFrameAndGetElement(test, frame)
+ .then(test.step_func_done(img => {
+ assert_equals(img.naturalHeight, 1, "Height");
+ frame.remove();
+ }));
+ }
+
+ function assert_img_not_loaded(test, frame) {
+ appendFrameAndGetElement(test, frame)
+ .then(test.step_func_done(img => {
+ assert_equals(img.naturalHeight, 0, "Height");
+ assert_equals(img.naturalWidth, 0, "Width");
+ }));
+ }
+
+ function assert_nested_img_not_loaded(test, frame) {
+ window.addEventListener('message', test.step_func(e => {
+ if (e.source != frame.contentWindow)
+ return;
+
+ assert_equals(e.data, 'error');
+ test.done();
+ }));
+ appendFrameAndGetElement(test, frame);
+ }
+
+ function assert_nested_img_loaded(test, frame) {
+ window.addEventListener('message', test.step_func(e => {
+ if (e.source != frame.contentWindow)
+ return;
+
+ assert_equals(e.data, 'loaded');
+ test.done();
+ }));
+ appendFrameAndGetElement(test, frame);
+ }
+
+ function createFrame(markup) {
+ var i = document.createElement('iframe');
+ i.srcdoc = `${markup}sekrit`;
+ return i;
+ }
+
+ // Subresource requests:
+ [
+ // Data URLs don't themselves trigger blocking:
+ `<img id="dangling" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">`,
+ `<img id="dangling" src="data:image/png;base64,${rawNewline}iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">`,
+ `<img id="dangling" src="data:image/png;base64,i${rawNewline}VBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">`,
+
+ // Data URLs with visual structure don't trigger blocking
+ `<img id="dangling" src="data:image/svg+xml;utf8,
+ <svg width='1' height='1' xmlns='http://www.w3.org/2000/svg'>
+ <rect width='100%' height='100%' fill='rebeccapurple'/>
+ <rect x='10%' y='10%' width='80%' height='80%' fill='lightgreen'/>
+ </svg>">`
+ ].forEach(markup => {
+ async_test(t => {
+ var i = createFrame(`${markup} <element attr="" another=''>`);
+ assert_img_loaded(t, i);
+ }, readableURL(markup));
+ });
+
+ // Nested subresource requests:
+ //
+ // The following tests load a given HTML string into `<iframe srcdoc="...">`, so we'll
+ // end up with a frame with an ID of `dangling` inside the srcdoc frame. That frame's
+ // `src` is a `data:` URL that resolves to an HTML document containing an `<img>`. The
+ // error/load handlers on that image are piped back up to the top-level document to
+ // determine whether the tests' expectations were met. *phew*
+
+ // Allowed:
+ [
+ // Just a newline:
+ `<iframe id="dangling"
+ src="data:text/html,
+ <img
+ onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'
+ onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'
+ src='http://{{host}}:{{ports[http][0]}}/images/gr${rawNewline}een-256x256.png'>
+ ">
+ </iframe>`,
+
+ // Just a brace:
+ `<iframe id="dangling"
+ src="data:text/html,
+ <img
+ onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'
+ onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'
+ src='http://{{host}}:{{ports[http][0]}}/images/green-256x256.png?${rawBrace}'>
+ ">
+ </iframe>`,
+
+ // Newline and escaped brace.
+ `<iframe id="dangling"
+ src="data:text/html,
+ <img
+ onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'
+ onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'
+ src='http://{{host}}:{{ports[http][0]}}/images/gr${rawNewline}een-256x256.png?${doubleEscapedBrace}'>
+ ">
+ </iframe>`,
+
+ // Brace and escaped newline:
+ `<iframe id="dangling"
+ src="data:text/html,
+ <img
+ onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'
+ onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'
+ src='http://{{host}}:{{ports[http][0]}}/images/green-256x256.png?${doubleEscapedNewline}${rawBrace}'>
+ ">
+ </iframe>`,
+ ].forEach(markup => {
+ async_test(t => {
+ var i = createFrame(`
+ <script>
+ // Repeat the message so that the parent can track this frame as the source.
+ window.onmessage = e => window.parent.postMessage(e.data, '*');
+ </scr`+`ipt>
+ ${markup}
+ `);
+ assert_nested_img_loaded(t, i);
+ }, readableURL(markup));
+ });
+
+ // Nested requests that should fail:
+ [
+ // Newline and brace:
+ `<iframe id="dangling"
+ src="data:text/html,
+ <img
+ onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'
+ onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'
+ src='http://{{host}}:{{ports[http][0]}}/images/gr${rawNewline}een-256x256.png?${rawBrace}'>
+ ">
+ </iframe>`,
+
+ // Leading whitespace:
+ `<iframe id="dangling"
+ src=" data:text/html,
+ <img
+ onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'
+ onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'
+ src='http://{{host}}:{{ports[http][0]}}/images/gr${rawNewline}een-256x256.png?${rawBrace}'>
+ ">
+ </iframe>`,
+
+ // Leading newline:
+ `<iframe id="dangling"
+ src="\ndata:text/html,
+ <img
+ onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'
+ onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'
+ src='http://{{host}}:{{ports[http][0]}}/images/gr${rawNewline}een-256x256.png?${rawBrace}'>
+ ">
+ </iframe>`,
+ `<iframe id="dangling"
+ src="${rawNewline}data:text/html,
+ <img
+ onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'
+ onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'
+ src='http://{{host}}:{{ports[http][0]}}/images/gr${rawNewline}een-256x256.png?${rawBrace}'>
+ ">
+ </iframe>`,
+
+ // Leading tab:
+ `<iframe id="dangling"
+ src="\tdata:text/html,
+ <img
+ onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'
+ onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'
+ src='http://{{host}}:{{ports[http][0]}}/images/gr${rawNewline}een-256x256.png?${rawBrace}'>
+ ">
+ </iframe>`,
+
+ // Leading carrige return:
+ `<iframe id="dangling"
+ src="\rdata:text/html,
+ <img
+ onload='window.parent.postMessage(&quot;loaded&quot;, &quot;*&quot;);'
+ onerror='window.parent.postMessage(&quot;error&quot;, &quot;*&quot;);'
+ src='http://{{host}}:{{ports[http][0]}}/images/gr${rawNewline}een-256x256.png?${rawBrace}'>
+ ">
+ </iframe>`,
+ ].forEach(markup => {
+ async_test(t => {
+ var i = createFrame(`
+ <script>
+ // Repeat the message so that the parent can track this frame as the source.
+ window.onmessage = e => window.parent.postMessage(e.data, '*');
+ </scr`+`ipt>
+ ${markup}
+ `);
+ assert_nested_img_not_loaded(t, i);
+ }, readableURL(markup));
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/fetch/security/dangling-markup-mitigation.tentative.html b/tests/wpt/web-platform-tests/fetch/security/dangling-markup-mitigation.tentative.html
index 53d74ba00b0..61a931608ba 100644
--- a/tests/wpt/web-platform-tests/fetch/security/dangling-markup-mitigation.tentative.html
+++ b/tests/wpt/web-platform-tests/fetch/security/dangling-markup-mitigation.tentative.html
@@ -1,7 +1,6 @@
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-<script src="./resources/helper.js"></script>
<body>
<script>
function readableURL(url) {
@@ -118,16 +117,6 @@
/images/green-1x1.png?img=${escapedNewline}
">
`,
-
- // Data URLs don't trigger blocking:
- `<img id="dangling" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">`,
- `<img id="dangling" src="data:image/png;base64,${rawNewline}iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">`,
- `<img id="dangling" src="data:image/png;base64,i${rawNewline}VBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">`,
- `<img id="dangling" src="data:image/svg+xml;utf8,
- <svg width='1' height='1' xmlns='http://www.w3.org/2000/svg'>
- <rect width='100%' height='100%' fill='rebeccapurple'/>
- <rect x='10%' y='10%' width='80%' height='80%' fill='lightgreen'/>
- </svg>">`
];
should_load.forEach(markup => {
diff --git a/tests/wpt/web-platform-tests/fonts/Ahem.ttf b/tests/wpt/web-platform-tests/fonts/Ahem.ttf
new file mode 100644
index 00000000000..4d4785a4123
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/Ahem.ttf
Binary files differ
diff --git a/tests/wpt/web-platform-tests/fonts/README.md b/tests/wpt/web-platform-tests/fonts/README.md
new file mode 100644
index 00000000000..f69b95ab652
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fonts/README.md
@@ -0,0 +1,2 @@
+This directory only contains auxiliary font files used by other tests. See
+/css-fonts for tests covering the CSS Fonts Module specification.
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-nested-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-nested-manual.html
index dfd53bc745e..eefc7b46bed 100644
--- a/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-nested-manual.html
+++ b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-nested-manual.html
@@ -15,12 +15,20 @@ async_test(t => {
assert_equals(document.fullscreenElement, outer);
// Then request fullscreen for the inner element.
- trusted_request(t, inner);
+ trusted_click(t, t.step_func(() => {
+ inner.requestFullscreen();
+ // Even though we are already in fullscreen, the change in
+ // document.fullscreenElement should not happen synchronously.
+ assert_equals(document.fullscreenElement, outer);
+ }), outer);
document.onfullscreenchange = t.step_func(() => {
assert_equals(document.fullscreenElement, inner);
// Now exit fullscreen.
document.exitFullscreen();
+ // Even though we don't need to exit fullscreen, the change in
+ // document.fullscreenElement should not happen synchronously.
+ assert_equals(document.fullscreenElement, inner);
document.onfullscreenchange = t.step_func_done(() => {
assert_equals(document.fullscreenElement, outer);
});
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-timing-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-timing-manual.html
index 5aeb04a90c3..7a536363a21 100644
--- a/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-timing-manual.html
+++ b/tests/wpt/web-platform-tests/fullscreen/api/document-exit-fullscreen-timing-manual.html
@@ -19,6 +19,8 @@ async_test(t => {
// The resize event should fire before the fullscreenchange event.
const events = [];
const callback = t.step_func(event => {
+ // fullscreenElement should have changed before either event is fired.
+ assert_equals(document.fullscreenElement, null, `fullscreenElement in {event.type} event`);
events.push(event.type);
if (event.type == 'fullscreenchange') {
step_timeout(t.unreached_func('timer callback'));
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html b/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html
new file mode 100644
index 00000000000..61a22e14dcf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>Document#fullscreenEnabled</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<iframe src="resources/report-fullscreen-enabled.html" name="same-origin-default"></iframe>
+<iframe src="resources/report-fullscreen-enabled.html" allowfullscreen name="same-origin-allow"></iframe>
+<iframe src="http://{{domains[www1]}}:{{ports[http][0]}}/fullscreen/api/resources/report-fullscreen-enabled.html" name="cross-origin-default"></iframe>
+<iframe src="http://{{domains[www1]}}:{{ports[http][0]}}/fullscreen/api/resources/report-fullscreen-enabled.html" allowfullscreen name="cross-origin-allow"></iframe>
+<script>
+var expectations = {
+ "same-origin-default": false,
+ "same-origin-allow": true,
+ "cross-origin-default": false,
+ "cross-origin-allow": true
+};
+
+var tests = {};
+for (var name in expectations) {
+ tests[name] = async_test( 'Fullscreen enabled test: ' + name);
+}
+
+// When a message is received from a child frame, ensure that the report
+// matches the expectations.
+window.addEventListener('message', e => {
+ if (e.data.report && e.data.report.api == "fullscreen") {
+ if (e.data.report.frame in expectations) {
+ tests[e.data.report.frame].step(() => {
+ assert_equals(e.data.report.enabled, expectations[e.data.report.frame],
+ e.data.report.frame + " frame fullscreenEnabled");
+ });
+ delete expectations[e.data.report.frame];
+ tests[e.data.report.frame].done();
+ }
+ }
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-allowed-cross-origin-manual.sub.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-allowed-cross-origin-manual.sub.html
new file mode 100644
index 00000000000..fa753f8b41b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-allowed-cross-origin-manual.sub.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<title>Element ready check with allowfullscreen attribute</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<iframe src="http://{{domains[www1]}}:{{ports[http][0]}}/fullscreen/api/resources/attempt-fullscreen.html" name="cross-origin-allowed" allowfullscreen></iframe>
+<script>
+
+async_test((t) => {
+ t.add_cleanup(() => document.exitFullscreen());
+
+ // When a message is received from a child frame, ensure that the report
+ // matches the expectations.
+ window.addEventListener('message', t.step_func(e => {
+ if (e.data.report && e.data.report.api == "fullscreen") {
+ assert_equals(e.data.report.result, true,
+ e.data.report.frame + " frame did enter fullscreen");
+ t.done();
+ }
+ }));
+
+ // Trigger the child frame to report as soon as its content is loaded.
+ var elem = document.querySelector('iframe');
+ elem.addEventListener('load', () => {
+ trusted_click(t, () => {
+ elem.contentWindow.postMessage({"action": "report"}, "*");
+ }, document.body);
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-not-allowed-cross-origin-manual.sub.html b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-not-allowed-cross-origin-manual.sub.html
new file mode 100644
index 00000000000..8aabe97ba14
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-ready-check-not-allowed-cross-origin-manual.sub.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<title>Element ready check with no allowfullscreen attribute</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<iframe src="http://{{domains[www1]}}:{{ports[http][0]}}/fullscreen/api/resources/attempt-fullscreen.html" name="cross-origin-default"></iframe>
+<script>
+
+async_test((t) => {
+ document.onfullscreenchange = t.unreached_func("document fullscreenchange event");
+ document.onfullscreenerror = t.unreached_func("document fullscreenerror event");
+
+ // When a message is received from a child frame, ensure that the report
+ // matches the expectations.
+ window.addEventListener('message', t.step_func(e => {
+ if (e.data.report && e.data.report.api == "fullscreen") {
+ assert_equals(e.data.report.result, false,
+ e.data.report.frame + " frame did enter fullscreen");
+ t.done();
+ }
+ }));
+
+ // Trigger the child frame to report as soon as its content is loaded.
+ var elem = document.querySelector('iframe');
+ elem.addEventListener('load', () => {
+ trusted_click(t, () => {
+ elem.contentWindow.postMessage({"action": "report"}, "*");
+ }, document.body);
+ });
+});
+</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-not-allowed-manual.html
index 1e18be5e677..1e18be5e677 100644
--- 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-not-allowed-manual.html
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html
index 40ca3ce8427..fc7f57525c6 100644
--- a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html
@@ -15,8 +15,12 @@ async_test(t => {
document.onfullscreenchange = iframeDoc.onfullscreenchange = t.step_func(event => {
count++;
assert_between_inclusive(count, 1, 4, 'number of fullscreenchange events');
+ // Both when entering and exiting, the fullscreenchange event is fired first
+ // on the outer document and then on the iframe's document. This is because
+ // the events are fired in animation frame tasks, which run in "frame tree"
+ // order.
const expected = {
- target: count == 1 || count == 4 ? iframe : iframeBody,
+ target: count == 1 || count == 3 ? iframe : iframeBody,
outerFullscreenElement: count <= 2 ? iframe : null,
innerFullscreenElement: count <= 2 ? iframeBody : null,
};
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-manual.html
index c09cebb8a2e..f86e75f215c 100644
--- a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-manual.html
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-and-move-manual.html
@@ -15,7 +15,7 @@ async_test(t => {
assert_equals(document.fullscreenElement, target);
assert_equals(target.parentNode, moveTo);
});
- document.onfullscreenerror = t.unreached_func("fullscreenchange event");
+ document.onfullscreenerror = t.unreached_func("fullscreenerror event");
trusted_click(t, () => {
target.requestFullscreen();
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-dialog-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-dialog-manual.html
new file mode 100644
index 00000000000..360ade0724d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-dialog-manual.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>Element#requestFullscreen() for dialog element</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div id="log"></div>
+<dialog></dialog>
+<script>
+async_test(t => {
+ var dialog = document.querySelector("dialog");
+ assert_true(dialog instanceof HTMLDialogElement);
+ trusted_request(t, dialog);
+ document.onfullscreenchange = t.unreached_func("fullscreenchange event");
+ document.onfullscreenerror = t.step_func_done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-null-ns-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-null-ns-manual.html
new file mode 100644
index 00000000000..443346be7c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-null-ns-manual.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>Element#requestFullscreen() for an element in null namespace</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(t => {
+ const element = document.createElementNS(null, 'a');
+ assert_equals(Object.getPrototypeOf(element), Element.prototype);
+ document.body.appendChild(element);
+ trusted_request(t, element);
+ document.onfullscreenchange = t.unreached_func("fullscreenchange event");
+ 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
index 77ea2b2352d..56ae56eec17 100644
--- 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
@@ -11,7 +11,7 @@ async_test(function(t)
var rect = document.querySelector("rect");
assert_true(rect instanceof SVGRectElement);
trusted_request(t, rect, document.body);
- document.onfullscreenchange = t.unreached_func("fullscreenerror event");
+ document.onfullscreenchange = t.unreached_func("fullscreenchange event");
document.onfullscreenerror = t.step_func_done();
});
</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-timing-manual.html b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-timing-manual.html
index 792cb0fe4d7..1ccfc7a3fe4 100644
--- a/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-timing-manual.html
+++ b/tests/wpt/web-platform-tests/fullscreen/api/element-request-fullscreen-timing-manual.html
@@ -6,13 +6,16 @@
<div id="log"></div>
<script>
async_test(t => {
- trusted_request(t, document.querySelector('div'));
+ const div = document.querySelector('div');
+ trusted_request(t, div);
// If fullscreenchange is an animation frame event, then animation frame
// callbacks should be run after it is fired, before the timer callback.
// The resize event should fire before the fullscreenchange event.
const events = [];
const callback = t.step_func(event => {
+ // fullscreenElement should have changed before either event is fired.
+ assert_equals(document.fullscreenElement, div, `fullscreenElement in {event.type} event`);
events.push(event.type);
if (event.type == 'fullscreenchange') {
step_timeout(t.unreached_func('timer callback'));
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/resources/attempt-fullscreen.html b/tests/wpt/web-platform-tests/fullscreen/api/resources/attempt-fullscreen.html
new file mode 100644
index 00000000000..9885466ebb5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/resources/attempt-fullscreen.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>IFrame Fullscreen API success reporter</title>
+<body>
+<script>
+reportFullscreenSuccessful = (success) => {
+ return () => {
+ parent.postMessage({"report": {
+ "api": "fullscreen",
+ "result": success,
+ "frame": window.name
+ }}, "*");
+ };
+};
+
+window.addEventListener('message', e => {
+ if (e.data.action == "report") {
+ document.onfullscreenchange = reportFullscreenSuccessful(true);
+ document.onfullscreenerror = reportFullscreenSuccessful(false);
+ document.body.requestFullscreen();
+ }
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/api/resources/report-fullscreen-enabled.html b/tests/wpt/web-platform-tests/fullscreen/api/resources/report-fullscreen-enabled.html
new file mode 100644
index 00000000000..ee8d4cfab70
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/api/resources/report-fullscreen-enabled.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>IFrame fullscreenEnabled attribute reporter</title>
+<body>
+<script>
+parent.postMessage({"report": {
+ "api": "fullscreen",
+ "enabled": document.fullscreenEnabled,
+ "frame": window.name
+}}, "*");
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/model/move-to-inactive-document-manual.html b/tests/wpt/web-platform-tests/fullscreen/model/move-to-inactive-document-manual.html
new file mode 100644
index 00000000000..5a1dd2b1e38
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/model/move-to-inactive-document-manual.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>Move the fullscreen element to an inactive document</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div></div>
+<script>
+async_test(t => {
+ const div = document.querySelector("div");
+ document.onfullscreenchange = t.step_func(event => {
+ const inactiveDocument = document.implementation.createDocument(null, "");
+ inactiveDocument.appendChild(div);
+
+ div.onfullscreenchange = t.unreached_func("fullscreenchange fired on element");
+ inactiveDocument.onfullscreenchange = t.unreached_func("fullscreenchange fired on other document");
+ document.onfullscreenchange = t.step_func_done();
+ });
+ trusted_request(t, div);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/rendering/fullscreen-pseudo-class-manual.html b/tests/wpt/web-platform-tests/fullscreen/rendering/fullscreen-pseudo-class-manual.html
new file mode 100644
index 00000000000..0c06ba3c6df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/rendering/fullscreen-pseudo-class-manual.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<title>:fullscreen pseudo-class</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../trusted-click.js"></script>
+<div><div></div></div>
+<script>
+async_test(t => {
+ const outer = document.querySelector("div");
+ const inner = outer.firstChild;
+
+ // First request fullscreen for the outer element.
+ trusted_request(t, outer);
+ document.onfullscreenchange = t.step_func(() => {
+ assert_equals(document.fullscreenElement, outer);
+ assert_true(outer.matches(':fullscreen'),
+ 'outer:fullscreen in simple fullscreen');
+ assert_false(inner.matches(':fullscreen'),
+ 'inner:fullscreen in simple fullscreen');
+
+ // Then request fullscreen for the inner element.
+ trusted_request(t, inner);
+ document.onfullscreenchange = t.step_func_done(() => {
+ // Although inner is the fullscreen element, both elements match the
+ // selector, as both have their fullscreen flag set.
+ assert_equals(document.fullscreenElement, inner);
+ assert_true(inner.matches(':fullscreen'),
+ 'inner:fullscreen in nested fullscreen');
+ assert_true(outer.matches(':fullscreen'),
+ 'outer:fullscreen in nested fullscreen');
+ });
+ });
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/fullscreen/rendering/fullscreen-pseudo-class-support.html b/tests/wpt/web-platform-tests/fullscreen/rendering/fullscreen-pseudo-class-support.html
new file mode 100644
index 00000000000..ccd3f0e22be
--- /dev/null
+++ b/tests/wpt/web-platform-tests/fullscreen/rendering/fullscreen-pseudo-class-support.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>:fullscreen pseudo-class support</title>
+<link rel="help" href="https://fullscreen.spec.whatwg.org/#:fullscreen-pseudo-class">
+<link rel="help" href="https://dom.spec.whatwg.org/#dom-element-matches">
+<link rel="help" href="https://dom.spec.whatwg.org/#dom-parentnode-queryselector">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+// This is a separate test so that support for :fullscreen can be detected
+// without actually going fullscreen. If it were not supported, then this test
+// would fail.
+test(t => {
+ // precondition is to throw for unknown pseudo-classes:
+ assert_throws(new SyntaxError(), () => document.body.matches(':halfscreen'));
+ assert_throws(new SyntaxError(), () => document.querySelector(':halfscreen'));
+ // the actual test:
+ assert_false(document.body.matches(':fullscreen'));
+ assert_equals(document.querySelector(':fullscreen'), null);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/gamepad/events-manual.html b/tests/wpt/web-platform-tests/gamepad/events-manual.html
index 321c9b2b0c3..cbade65a8fb 100644
--- a/tests/wpt/web-platform-tests/gamepad/events-manual.html
+++ b/tests/wpt/web-platform-tests/gamepad/events-manual.html
@@ -2,8 +2,8 @@
<html>
<head>
<title>Manual Gamepad events tests</title>
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#the-gamepadconnected-event">
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#the-gamepaddisconnected-event">
+<link rel="help" href="https://w3c.github.io/gamepad/#the-gamepadconnected-event">
+<link rel="help" href="https://w3c.github.io/gamepad/#the-gamepaddisconnected-event">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
diff --git a/tests/wpt/web-platform-tests/gamepad/getgamepads-polling-manual.html b/tests/wpt/web-platform-tests/gamepad/getgamepads-polling-manual.html
index bcbb5eb2fd9..4330fec5a59 100644
--- a/tests/wpt/web-platform-tests/gamepad/getgamepads-polling-manual.html
+++ b/tests/wpt/web-platform-tests/gamepad/getgamepads-polling-manual.html
@@ -2,7 +2,7 @@
<html>
<head>
<title>Manual Gamepad getGamepads polling tests</title>
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#navigator-interface-extension">
+<link rel="help" href="https://w3c.github.io/gamepad/#navigator-interface-extension">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
diff --git a/tests/wpt/web-platform-tests/gamepad/idlharness-manual.html b/tests/wpt/web-platform-tests/gamepad/idlharness-manual.html
index 54f25796e04..3b96073790c 100644
--- a/tests/wpt/web-platform-tests/gamepad/idlharness-manual.html
+++ b/tests/wpt/web-platform-tests/gamepad/idlharness-manual.html
@@ -2,10 +2,10 @@
<html>
<head>
<title>Manual Gamepad IDL tests</title>
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepad-interface">
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepadbutton-interface">
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepadevent-interface">
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#navigator-interface-extension">
+<link rel="help" href="https://w3c.github.io/gamepad/#gamepad-interface">
+<link rel="help" href="https://w3c.github.io/gamepad/#gamepadbutton-interface">
+<link rel="help" href="https://w3c.github.io/gamepad/#gamepadevent-interface">
+<link rel="help" href="https://w3c.github.io/gamepad/#navigator-interface-extension">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
@@ -43,8 +43,8 @@ interface Gamepad {
readonly attribute boolean connected;
readonly attribute DOMHighResTimeStamp timestamp;
readonly attribute GamepadMappingType mapping;
- readonly attribute double[] axes;
- readonly attribute GamepadButton[] buttons;
+ readonly attribute FrozenArray<double> axes;
+ readonly attribute FrozenArray<GamepadButton> buttons;
};
enum GamepadMappingType {
diff --git a/tests/wpt/web-platform-tests/gamepad/idlharness.html b/tests/wpt/web-platform-tests/gamepad/idlharness.html
index 5ec141ec82d..559d2ef8ad2 100644
--- a/tests/wpt/web-platform-tests/gamepad/idlharness.html
+++ b/tests/wpt/web-platform-tests/gamepad/idlharness.html
@@ -2,10 +2,10 @@
<html>
<head>
<title>Gamepad IDL tests</title>
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepad-interface">
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepadbutton-interface">
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#gamepadevent-interface">
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#navigator-interface-extension">
+<link rel="help" href="https://w3c.github.io/gamepad/#gamepad-interface">
+<link rel="help" href="https://w3c.github.io/gamepad/#gamepadbutton-interface">
+<link rel="help" href="https://w3c.github.io/gamepad/#gamepadevent-interface">
+<link rel="help" href="https://w3c.github.io/gamepad/#navigator-interface-extension">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
@@ -26,8 +26,8 @@ interface Gamepad {
readonly attribute boolean connected;
readonly attribute DOMHighResTimeStamp timestamp;
readonly attribute GamepadMappingType mapping;
- readonly attribute double[] axes;
- readonly attribute GamepadButton[] buttons;
+ readonly attribute FrozenArray<double> axes;
+ readonly attribute FrozenArray<GamepadButton> buttons;
};
enum GamepadMappingType {
diff --git a/tests/wpt/web-platform-tests/gamepad/timestamp-manual.html b/tests/wpt/web-platform-tests/gamepad/timestamp-manual.html
index dec74a000ce..a2808dd0e07 100644
--- a/tests/wpt/web-platform-tests/gamepad/timestamp-manual.html
+++ b/tests/wpt/web-platform-tests/gamepad/timestamp-manual.html
@@ -2,7 +2,7 @@
<html>
<head>
<title>Manual Gamepad timestamp tests</title>
-<link rel="help" href="https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#widl-Gamepad-timestamp">
+<link rel="help" href="https://w3c.github.io/gamepad/#dom-gamepad-timestamp">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
diff --git a/tests/wpt/web-platform-tests/generic-sensor/OWNERS b/tests/wpt/web-platform-tests/generic-sensor/OWNERS
index 387490fd173..06bc2d81d87 100644
--- a/tests/wpt/web-platform-tests/generic-sensor/OWNERS
+++ b/tests/wpt/web-platform-tests/generic-sensor/OWNERS
@@ -1,4 +1,6 @@
@zqzhang
@dontcallmedom
-@tobie
@riju
+@alexshalamov
+@pozdnyakov
+@Honry
diff --git a/tests/wpt/web-platform-tests/generic-sensor/generic-sensor-tests.js b/tests/wpt/web-platform-tests/generic-sensor/generic-sensor-tests.js
index 222bde9539f..b0671634622 100644
--- a/tests/wpt/web-platform-tests/generic-sensor/generic-sensor-tests.js
+++ b/tests/wpt/web-platform-tests/generic-sensor/generic-sensor-tests.js
@@ -1,12 +1,15 @@
let unreached = event => {
- assert_unreached(event.error.name + ":" + event.error.message);
+ assert_unreached(event.error.name + ": " + event.error.message);
};
let properties = {
- 'AmbientLightSensor' : ['timestamp', 'illuminance'],
- 'Accelerometer' : ['timestamp', 'x', 'y', 'z'],
- 'Gyroscope' : ['timestamp', 'x', 'y', 'z'],
- 'Magnetometer' : ['timestamp', 'x', 'y', 'z']
+ 'AmbientLightSensor' : ['timestamp', 'illuminance'],
+ 'Accelerometer' : ['timestamp', 'x', 'y', 'z'],
+ 'LinearAccelerationSensor' : ['timestamp', 'x', 'y', 'z'],
+ 'Gyroscope' : ['timestamp', 'x', 'y', 'z'],
+ 'Magnetometer' : ['timestamp', 'x', 'y', 'z'],
+ 'AbsoluteOrientationSensor' : ['timestamp', 'quaternion'],
+ 'RelativeOrientationSensor' : ['timestamp', 'quaternion']
};
function assert_reading_not_null(sensor) {
@@ -35,14 +38,14 @@ function reading_to_array(sensor) {
function runGenericSensorTests(sensorType) {
async_test(t => {
let sensor = new sensorType();
- sensor.onchange = t.step_func_done(() => {
+ sensor.onreading = t.step_func_done(() => {
assert_reading_not_null(sensor);
sensor.stop();
assert_reading_null(sensor);
});
sensor.onerror = t.step_func_done(unreached);
sensor.start();
- }, "Test that 'onchange' is called and sensor reading is valid");
+ }, `${sensorType.name}: Test that 'onreading' is called and sensor reading is valid`);
async_test(t => {
let sensor1 = new sensorType();
@@ -64,7 +67,7 @@ function runGenericSensorTests(sensorType) {
sensor2.onerror = t.step_func_done(unreached);
sensor1.start();
sensor2.start();
- }, "sensor reading is correct");
+ }, `${sensorType.name}: sensor reading is correct`);
async_test(t => {
let sensor = new sensorType();
@@ -75,27 +78,27 @@ function runGenericSensorTests(sensorType) {
sensor.onerror = t.step_func_done(unreached);
sensor.start();
t.step_timeout(() => {
- sensor.onchange = t.step_func_done(() => {
+ sensor.onreading = t.step_func_done(() => {
//sensor.timestamp changes.
let cachedTimeStamp2 = sensor.timestamp;
assert_greater_than(cachedTimeStamp2, cachedTimeStamp1);
sensor.stop();
});
}, 1000);
- }, "sensor timestamp is updated when time passes");
+ }, `${sensorType.name}: sensor timestamp is updated when time passes`);
async_test(t => {
let sensor = new sensorType();
sensor.onerror = t.step_func_done(unreached);
assert_false(sensor.activated);
- sensor.onchange = t.step_func_done(() => {
+ sensor.onreading = t.step_func_done(() => {
assert_true(sensor.activated);
sensor.stop();
assert_false(sensor.activated);
});
sensor.start();
assert_false(sensor.activated);
- }, "Test that sensor can be successfully created and its states are correct.");
+ }, `${sensorType.name}: Test that sensor can be successfully created and its states are correct.`);
test(() => {
let sensor, start_return;
@@ -104,7 +107,7 @@ function runGenericSensorTests(sensorType) {
start_return = sensor.start();
assert_equals(start_return, undefined);
sensor.stop();
- }, "sensor.start() returns undefined");
+ }, `${sensorType.name}: sensor.start() returns undefined`);
test(() => {
try {
@@ -117,7 +120,7 @@ function runGenericSensorTests(sensorType) {
} catch (e) {
assert_unreached(e.name + ": " + e.message);
}
- }, "no exception is thrown when calling start() on already started sensor");
+ }, `${sensorType.name}: no exception is thrown when calling start() on already started sensor`);
test(() => {
let sensor, stop_return;
@@ -126,7 +129,7 @@ function runGenericSensorTests(sensorType) {
sensor.start();
stop_return = sensor.stop();
assert_equals(stop_return, undefined);
- }, "sensor.stop() returns undefined");
+ }, `${sensorType.name}: sensor.stop() returns undefined`);
test(() => {
try {
@@ -139,14 +142,34 @@ function runGenericSensorTests(sensorType) {
} catch (e) {
assert_unreached(e.name + ": " + e.message);
}
- }, "no exception is thrown when calling stop() on already stopped sensor");
-
- async_test(t => {
- window.onmessage = t.step_func(e => {
- assert_equals(e.data, "SecurityError");
- t.done();
+ }, `${sensorType.name}: no exception is thrown when calling stop() on already stopped sensor`);
+
+ promise_test(() => {
+ return new Promise((resolve,reject) => {
+ let iframe = document.createElement('iframe');
+ iframe.srcdoc = '<script>' +
+ ' window.onmessage = message => {' +
+ ' if (message.data === "LOADED") {' +
+ ' try {' +
+ ' new ' + sensorType.name + '();' +
+ ' parent.postMessage("FAIL", "*");' +
+ ' } catch (e) {' +
+ ' parent.postMessage(e.name, "*");' +
+ ' }' +
+ ' }' +
+ ' };' +
+ '<\/script>';
+ iframe.onload = () => iframe.contentWindow.postMessage('LOADED', '*');
+ document.body.appendChild(iframe);
+ window.onmessage = message => {
+ if (message.data == 'SecurityError') {
+ resolve();
+ } else {
+ reject();
+ }
+ }
});
- }, "throw a 'SecurityError' when firing sensor readings within iframes");
+ }, `${sensorType.name}: throw a 'SecurityError' when constructing sensor object within iframe`);
async_test(t => {
let sensor = new sensorType();
@@ -164,13 +187,13 @@ function runGenericSensorTests(sensorType) {
});
sensor.onerror = t.step_func_done(unreached);
sensor.start();
- }, "sensor readings can not be fired on the background tab");
+ }, `${sensorType.name}: sensor readings can not be fired on the background tab`);
}
function runGenericSensorInsecureContext(sensorType) {
test(() => {
assert_throws('SecurityError', () => { new sensorType(); });
- }, "throw a 'SecurityError' when construct sensor in an insecure context");
+ }, `${sensorType.name}: throw a 'SecurityError' when construct sensor in an insecure context`);
}
function runGenericSensorOnerror(sensorType) {
@@ -182,5 +205,5 @@ function runGenericSensorOnerror(sensorType) {
assert_equals(event.error.name, 'NotReadableError');
});
sensor.start();
- }, "'onerror' event is fired when sensor is not supported");
+ }, `${sensorType.name}: 'onerror' event is fired when sensor is not supported`);
}
diff --git a/tests/wpt/web-platform-tests/generic-sensor/idlharness.html b/tests/wpt/web-platform-tests/generic-sensor/idlharness.html
deleted file mode 100644
index 07a43cf1cf8..00000000000
--- a/tests/wpt/web-platform-tests/generic-sensor/idlharness.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Generic Sensor IDL tests</title>
-<link rel="author" title="Tobie Langel" href="http://www.codespeaks.com">
-<link rel="help" href="http://www.w3.org/TR/generic-sensor/">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/WebIDLParser.js"></script>
-<script src="/resources/idlharness.js"></script>
-<style>
- pre {
- display: none;
- }
-</style>
-<div id="log"></div>
-
-<pre id="idl">
-interface Event {
-};
-
-interface Error {
-};
-
-dictionary EventInit {
-};
-
-interface Sensor : EventTarget {
- readonly attribute SensorState state;
- readonly attribute SensorReading? reading;
- void start();
- void stop();
- attribute EventHandler onchange;
- attribute EventHandler onstatechange;
- attribute EventHandler onerror;
-};
-
-dictionary SensorOptions {
- double? frequency;
-};
-
-enum SensorState {
- "idle",
- "activating",
- "active",
- "errored"
-};
-
-interface SensorReading {
- readonly attribute DOMHighResTimeStamp timeStamp;
-};
-
-[Constructor(DOMString type, SensorReadingEventInit eventInitDict)]
-interface SensorReadingEvent : Event {
- readonly attribute SensorReading reading;
-};
-
-dictionary SensorReadingEventInit : EventInit {
- SensorReading reading;
-};
-</pre>
-
-<pre id="generic-idl">
-[Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)]
-interface SensorErrorEvent : Event {
- readonly attribute Error error;
-};
-
-dictionary SensorErrorEventInit : EventInit {
- Error error;
-};
-</pre>
-
-<script>
-(function() {
- "use strict";
- var idl_array = new IdlArray();
- idl_array.add_untested_idls(document.getElementById('idl').textContent);
- idl_array.add_idls(document.getElementById('generic-idl').textContent);
-
- idl_array.add_objects({
- SensorErrorEvent: ['new SensorErrorEvent({ error: new TypeError("Boom!") });']
- });
-
- idl_array.test();
-})();
-</script> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/generic-sensor/idlharness.https.html b/tests/wpt/web-platform-tests/generic-sensor/idlharness.https.html
new file mode 100644
index 00000000000..da0bb71aa4a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/generic-sensor/idlharness.https.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Generic Sensor IDL tests</title>
+<link rel="author" title="Tobie Langel" href="http://www.codespeaks.com">
+<link rel="help" href="http://www.w3.org/TR/generic-sensor/">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<div id="log"></div>
+
+<script id="idl" type="text/plain">
+interface Event {
+};
+
+interface Error {
+};
+
+dictionary EventInit {
+};
+
+[SecureContext, Exposed=Window]
+interface Sensor : EventTarget {
+ readonly attribute boolean activated;
+ readonly attribute DOMHighResTimeStamp? timestamp;
+ void start();
+ void stop();
+ attribute EventHandler onreading;
+ attribute EventHandler onactivate;
+ attribute EventHandler onerror;
+};
+
+dictionary SensorOptions {
+ double? frequency;
+};
+</script>
+
+<script id="generic-idl" type="text/plain">
+[Constructor(DOMString type, SensorErrorEventInit errorEventInitDict),
+ SecureContext, Exposed=Window]
+interface SensorErrorEvent : Event {
+ readonly attribute Error error;
+};
+
+dictionary SensorErrorEventInit : EventInit {
+ required Error error;
+};
+</script>
+
+<script>
+(() => {
+ "use strict";
+ let idl_array = new IdlArray();
+ idl_array.add_untested_idls(document.getElementById('idl').textContent);
+ idl_array.add_idls(document.getElementById('generic-idl').textContent);
+
+ idl_array.add_objects({
+ SensorErrorEvent: ['new SensorErrorEvent("SECURITY_ERR", { errorCode: 18 });']
+ });
+
+ idl_array.test();
+})();
+</script>
diff --git a/tests/wpt/web-platform-tests/gyroscope/Gyroscope.https.html b/tests/wpt/web-platform-tests/gyroscope/Gyroscope.https.html
index 8435912fb07..81cdfddee7b 100644
--- a/tests/wpt/web-platform-tests/gyroscope/Gyroscope.https.html
+++ b/tests/wpt/web-platform-tests/gyroscope/Gyroscope.https.html
@@ -7,8 +7,6 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/generic-sensor/generic-sensor-tests.js"></script>
<div id="log"></div>
-<iframe src="support-iframe.html" id="frame" style="display:none" sandbox="allow-scripts">
-</iframe>
<script>
runGenericSensorTests(Gyroscope);
diff --git a/tests/wpt/web-platform-tests/gyroscope/OWNERS b/tests/wpt/web-platform-tests/gyroscope/OWNERS
index cc7c3879319..eb920ae0f1e 100644
--- a/tests/wpt/web-platform-tests/gyroscope/OWNERS
+++ b/tests/wpt/web-platform-tests/gyroscope/OWNERS
@@ -1,5 +1,6 @@
@zqzhang
@dontcallmedom
-@tobie
@riju
@Honry
+@alexshalamov
+@pozdnyakov
diff --git a/tests/wpt/web-platform-tests/gyroscope/idlharness.https.html b/tests/wpt/web-platform-tests/gyroscope/idlharness.https.html
index da1f67b6583..ca8f69d94d5 100644
--- a/tests/wpt/web-platform-tests/gyroscope/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/gyroscope/idlharness.https.html
@@ -8,72 +8,43 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
-<style>
- pre {
- display: none;
- }
-</style>
<div id="log"></div>
-<pre id="idl">
-interface Event {
-};
-
-interface Error {
-};
-
-dictionary EventInit {
-};
-
+<script id="idl" type="text/plain">
interface EventTarget {
};
interface EventHandler {
};
-</pre>
+</script>
-<pre id="generic-idl">
-[SecureContext]
+<script id="gyroscope-idl" type="text/plain">
+// The interface of Sensor is defined in
+// https://www.w3.org/TR/generic-sensor/#idl-index
+[SecureContext, Exposed=Window]
interface Sensor : EventTarget {
readonly attribute boolean activated;
readonly attribute DOMHighResTimeStamp? timestamp;
void start();
void stop();
- attribute EventHandler onchange;
+ attribute EventHandler onreading;
attribute EventHandler onactivate;
attribute EventHandler onerror;
};
-dictionary SensorOptions {
- double? frequency;
-};
-
-[SecureContext, Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)]
-interface SensorErrorEvent : Event {
- readonly attribute Error error;
-};
-
-dictionary SensorErrorEventInit : EventInit {
- required Error error;
-};
-</pre>
-
-<pre id="gyroscope-idl">
-[Constructor(optional SensorOptions sensorOptions)]
+[Constructor(optional SensorOptions sensorOptions), Exposed=Window]
interface Gyroscope : Sensor {
readonly attribute unrestricted double? x;
readonly attribute unrestricted double? y;
readonly attribute unrestricted double? z;
};
-</pre>
+</script>
<script>
-
(() => {
"use strict";
let idl_array = new IdlArray();
idl_array.add_untested_idls(document.getElementById('idl').textContent);
- idl_array.add_untested_idls(document.getElementById('generic-idl').textContent);
idl_array.add_idls(document.getElementById('gyroscope-idl').textContent);
idl_array.add_objects({
@@ -82,5 +53,4 @@ interface Gyroscope : Sensor {
idl_array.test();
})();
-
</script>
diff --git a/tests/wpt/web-platform-tests/gyroscope/support-iframe.html b/tests/wpt/web-platform-tests/gyroscope/support-iframe.html
deleted file mode 100644
index 5efbbcd54cf..00000000000
--- a/tests/wpt/web-platform-tests/gyroscope/support-iframe.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE HTML>
-<meta charset="utf-8">
-<script>
-try {
- let sensor = new Gyroscope();
- parent.postMessage("sensor.start() can be fired within iframes", '*');
-} catch (e) {
- parent.postMessage(e.name, '*');
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/hr-time/idlharness.html b/tests/wpt/web-platform-tests/hr-time/idlharness.html
index 9dfea66e914..d0c648c1bb7 100644
--- a/tests/wpt/web-platform-tests/hr-time/idlharness.html
+++ b/tests/wpt/web-platform-tests/hr-time/idlharness.html
@@ -15,17 +15,30 @@
<div id="log"></div>
<pre id='untested_idl' style='display:none'>
-[PrimaryGlobal]
-interface Window {
-};
-
-[Exposed=Worker]
-interface WorkerGlobalScope {
+[Exposed=Windows,Worker]
+interface WindowOrWorkerGlobalScope {
};
[Exposed=(Window,Worker)]
interface EventTarget {
};
+
+[Exposed=Window]
+interface PerformanceTiming {
+};
+
+[Exposed=Window]
+interface PerformanceNavigation {
+};
+
+// from nav-timing
+partial interface Performance {
+ [SameObject]
+ readonly attribute PerformanceTiming timing;
+ [SameObject]
+ readonly attribute PerformanceNavigation navigation;
+ [Default] object toJSON();
+};
</pre>
<pre id='idl'>
@@ -34,19 +47,14 @@ typedef double DOMHighResTimeStamp;
[Exposed=(Window,Worker)]
interface Performance : EventTarget {
DOMHighResTimeStamp now();
- serializer = {attribute};
+ readonly attribute DOMHighResTimeStamp timeOrigin;
+ [Default] object toJSON();
};
-[NoInterfaceObject,
- Exposed=(Window,Worker)]
-interface GlobalPerformance {
+partial interface WindowOrWorkerGlobalScope {
[Replaceable]
readonly attribute Performance performance;
};
-
-Window implements GlobalPerformance;
-
-WorkerGlobalScope implements GlobalPerformance;
</pre>
<script>
@@ -57,7 +65,7 @@ WorkerGlobalScope implements GlobalPerformance;
idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
idl_array.add_idls(document.getElementById("idl").textContent);
- idl_array.add_objects({Performance: ["window.performance"]});
+ idl_array.add_objects({Performance: [window.performance]});
idl_array.test();
})();
diff --git a/tests/wpt/web-platform-tests/hr-time/timeOrigin.html b/tests/wpt/web-platform-tests/hr-time/timeOrigin.html
new file mode 100644
index 00000000000..20aea750845
--- /dev/null
+++ b/tests/wpt/web-platform-tests/hr-time/timeOrigin.html
@@ -0,0 +1,45 @@
+<!doctype html>
+<html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+const windowOrigin = performance.timeOrigin;
+
+test(() => {
+ // Use a 30ms cushion when comparing with Date() to account for inaccuracy.
+ const startTime = Date.now();
+ assert_greater_than_equal(startTime + 30, windowOrigin, 'Date.now() should be at least as large as the window timeOrigin.');
+ const startNow = performance.now();
+ assert_less_than_equal(startTime, windowOrigin + startNow + 30, 'Date.now() should be close to window timeOrigin.');
+}, 'Window timeOrigin is close to Date.now() when there is no system clock adjustment.');
+
+const workerScript = 'postMessage({timeOrigin: performance.timeOrigin})';
+const blob = new Blob([workerScript]);
+
+async_test(function(t) {
+ const beforeWorkerCreation = performance.now();
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', t.step_func_done(function(event) {
+ const workerOrigin = event.data.timeOrigin;
+ assert_greater_than_equal(workerOrigin, windowOrigin + beforeWorkerCreation, 'Worker timeOrigin should be greater than the window timeOrigin.');
+ const afterWorkerCreation = performance.now();
+ assert_less_than_equal(workerOrigin - windowOrigin, afterWorkerCreation, 'Window and worker timeOrigins should be close.');
+ }));
+}, 'Window and worker timeOrigins are close when created one after another.');
+
+async_test(function(t) {
+ this.step_timeout(function() {
+ const workerCreation = performance.now();
+ const worker = new Worker(URL.createObjectURL(blob));
+ worker.addEventListener('message', t.step_func_done(function(event) {
+ const workerOrigin = event.data.timeOrigin;
+ assert_greater_than_equal(workerOrigin - windowOrigin, 200, 'We waited 200ms to spawn the second worker, so its timeOrigin should be greater than that of the window.');
+ }));
+ }, 200);
+}, 'Window and worker timeOrigins differ when worker is created after a delay.');
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/hr-time/timing-attack.html b/tests/wpt/web-platform-tests/hr-time/timing-attack.html
new file mode 100644
index 00000000000..71ade4a8c48
--- /dev/null
+++ b/tests/wpt/web-platform-tests/hr-time/timing-attack.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8" />
+<title>window.performance.now should not enable timing attacks</title>
+<link rel="author" title="W3C" href="http://www.w3.org/" />
+<link rel="help" href="http://w3c.github.io/hr-time/#privacy-security"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(function() {
+ function check_resolutions(times, length) {
+ var end = length - 2;
+
+ // we compare each value with the following ones
+ for (var i = 0; i < end; i++) {
+ var h1 = times[i];
+ for (var j = i+1; j < end; j++) {
+ var h2 = times[j];
+ var diff = h2 - h1;
+ assert_true((diff === 0) || ((diff * 1000) >= 5),
+ "Differences smaller than 5 microseconds: " + diff);
+ }
+ }
+ return true;
+ }
+
+ var times = new Array(10);
+ var index = 0;
+ var hrt1, hrt2, hrt;
+
+ // rapid firing of performance.now
+ hrt1 = performance.now();
+ hrt2 = performance.now();
+ times[index++] = hrt1;
+ times[index++] = hrt2;
+
+ // ensure that we get performance.now() to return a different value
+ do {
+ hrt = performance.now();
+ times[index++] = hrt;
+ } while ((hrt - hrt1) === 0);
+
+ assert_true(check_resolutions(times, index), 'Difference should be at least 5 microseconds.');
+}, 'The recommended minimum resolution of the Performance interface has been set to 5 microseconds');
+</script>
+</head>
+<body>
+<h1>Description</h1>
+<p>The recommended minimum resolution of the Performance interface should be set to 5 microseconds.</p>
+
+<div id="log"></div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/hr-time/window-worker-time-origin.html b/tests/wpt/web-platform-tests/hr-time/window-worker-time-origin.html
deleted file mode 100644
index d7031c43947..00000000000
--- a/tests/wpt/web-platform-tests/hr-time/window-worker-time-origin.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>performance.now() time origin</title>
-<meta name="author" title="JosephPecoraro" href="mailto:joepeck@webkit.org">
-<meta name="assert" content="Time origin in Worker should be Worker's moment of creation.">
-<link rel="help" href="https://w3c.github.io/hr-time/#time-origin-1">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-async_test(function(t) {
- this.step_timeout(function() {
- var workerScript = 'postMessage({now: performance.now()})';
- var blob = new Blob([workerScript]);
- var worker = new Worker(URL.createObjectURL(blob));
- var windowWorkerCreationTime = performance.now();
- worker.addEventListener("message", t.step_func_done(function(event) {
- var workerNow = event.data.now;
-
- // We waited 1s to spawn the worker. So verify the worker timestamp is at least less then 0.5 seconds.
- assert_less_than(workerNow, 500, "worker performance.now() must be very close to its creation time");
-
- // We waited 1s to spawn the worker. Window's now is ~1000, Worker's now will be much lower.
- assert_greater_than(windowWorkerCreationTime - workerNow, 500, "window's time origin must be before worker's time origin");
- }));
- }, 1000);
-}, 'Worker time origin is approximately its creation time');
-</script>
-</head>
-<body>
-<h1>Description</h1>
-<p>This test validates that a Worker's time origin is its moment of creation and differs from its spawner's.</p>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/hr-time/window-worker-timeOrigin.window.js b/tests/wpt/web-platform-tests/hr-time/window-worker-timeOrigin.window.js
new file mode 100644
index 00000000000..1e5ef1cdffe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/hr-time/window-worker-timeOrigin.window.js
@@ -0,0 +1,30 @@
+"use strict"
+// https://w3c.github.io/hr-time/#time-origin
+
+async_test(function(test) {
+ // Cache global time before starting worker
+ const globalTimeOrigin = performance.timeOrigin;
+ const globalNowBeforeWorkerStart = performance.now();
+
+ // Start worker and retrieve time
+ const workerScript = "postMessage({timeOrigin: performance.timeOrigin, now: performance.now()})";
+ const blob = new Blob([workerScript]);
+ let worker = new Worker(URL.createObjectURL(blob));
+
+ worker.addEventListener("message", test.step_func_done(function(event) {
+ const workerTimeOrigin = event.data.timeOrigin;
+ const workerNow = event.data.now;
+
+ assert_not_equals(workerTimeOrigin, 0, "worker timeOrigin must not be 0");
+ assert_not_equals(performance.timeOrigin, 0, "Document timeOrigin must not be 0");
+
+ assert_equals(globalTimeOrigin, performance.timeOrigin, "timeOrigin should not be changed in same document mode");
+ assert_less_than(globalTimeOrigin, workerTimeOrigin, "Document timeOrigin must be earlier than worker timeOrigin");
+
+ // Document and worker's now() start from their respective timeOrigins.
+ const timeDiff = workerTimeOrigin - globalTimeOrigin; // convert worker's time to Document time.
+ assert_less_than(globalTimeOrigin + globalNowBeforeWorkerStart, globalTimeOrigin + timeDiff + workerNow, "Document old now is earlier than worker now.");
+
+ // Comparing timing between Document and worker threads could be delicate as it relies on the thread implementation and could be subject to race conditions.
+ }));
+}, 'timeOrigin and now() should be correctly ordered between window and worker');
diff --git a/tests/wpt/web-platform-tests/html-media-capture/idlharness.html b/tests/wpt/web-platform-tests/html-media-capture/idlharness.html
index 22b3e05ee9d..93014f36f53 100644
--- a/tests/wpt/web-platform-tests/html-media-capture/idlharness.html
+++ b/tests/wpt/web-platform-tests/html-media-capture/idlharness.html
@@ -25,11 +25,8 @@
<pre id='idl' style='display:none'>
partial interface HTMLInputElement {
- attribute CaptureFacingMode capture;
- };
- enum CaptureFacingMode {
- "user",
- "environment"
+ [CEReactions]
+ attribute DOMString capture;
};
</pre>
@@ -39,12 +36,12 @@
<script>
(function() {
- var idl_array = new IdlArray();
+ let idl_array = new IdlArray();
idl_array.add_untested_idls(document.getElementById('untested_idl').textContent);
idl_array.add_idls(document.getElementById('idl').textContent);
- var testElement = document.getElementById('testElement');
+ let testElement = document.getElementById('testElement');
idl_array.add_objects({HTMLInputElement: [testElement]});
idl_array.test();
})();
diff --git a/tests/wpt/web-platform-tests/html/OWNERS b/tests/wpt/web-platform-tests/html/OWNERS
index 627071770bd..1f659c8f6bf 100644
--- a/tests/wpt/web-platform-tests/html/OWNERS
+++ b/tests/wpt/web-platform-tests/html/OWNERS
@@ -1,4 +1,3 @@
@jdm
@jgraham
-@zcorpan
@zqzhang
diff --git a/tests/wpt/web-platform-tests/html/README.md b/tests/wpt/web-platform-tests/html/README.md
new file mode 100644
index 00000000000..53421840526
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/README.md
@@ -0,0 +1,21 @@
+# HTML
+
+This directory contains tests for [HTML](https://html.spec.whatwg.org/multipage/).
+
+Sub-directory names should be based on the URL of the corresponding part of the
+multipage-version specification. For example, The URL of
+"8.3 Base64 utility methods" is [https://html.spec.whatwg.org/multipage/webappapis.html#atob](https://html.spec.whatwg.org/multipage/webappapis.html#atob). So the directory in WPT is [webappapis/atob/](/html/webappapis/atob).
+
+For historical reasons, parts of HTML have their own directories:
+
+* [/2dcontext](/2dcontext)
+* [/custom-elements](/custom-elements)
+* [/eventsource](/eventsource)
+* [/imagebitmap-renderingcontext](/imagebitmap-renderingcontext)
+* [/innerText](/innerText)
+* [/offscreen-canvas](/offscreen-canvas)
+* [/shadow-dom](/shadow-dom)
+* [/webmessaging](/webmessaging)
+* [/websockets](/websockets)
+* [/webstorage](/webstorage)
+* [/workers](/workers)
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html
index ace09e57454..85205c1497b 100644
--- a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/PopStateEvent.html
@@ -6,12 +6,6 @@
<div id="log"></div>
<script>
test(function () {
- var e = document.createEvent('PopStateEvent');
- var eProto = Object.getPrototypeOf(e);
- assert_equals(eProto, PopStateEvent.prototype);
-}, 'document.createEvent');
-
-test(function () {
assert_false('initPopStateEvent' in PopStateEvent.prototype,
'There should be no PopStateEvent#initPopStateEvent');
}, 'initPopStateEvent');
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/support/window-name-navigation.sub.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/support/window-name-navigation.sub.html
new file mode 100644
index 00000000000..1bf76c4938d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/support/window-name-navigation.sub.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+ <script>
+ var url = new URL(window.location.href);
+ url.hostname = "{{GET[hostname]}}";
+ url.pathname = "/html/browsers/browsing-the-web/history-traversal/support/window-name-test.sub.html";
+ url.search = "shouldhavename={{GET[shouldhavename]}}&sendmessage={{GET[sendmessage]}}";
+ window.name = "test";
+ document.location = url.href;
+ </script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/support/window-name-test.sub.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/support/window-name-test.sub.html
new file mode 100644
index 00000000000..65662031a04
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/support/window-name-test.sub.html
@@ -0,0 +1,23 @@
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script>
+ function process_test_result(passed, test_name) {
+ if ({{GET[sendmessage]}}) {
+ if (window.opener) {
+ window.opener.postMessage(passed, "*");
+ } else {
+ parent.postMessage(passed, "*");
+ }
+ } else {
+ test(function(t) {
+ assert_equals(passed, true);
+ }, test_name);
+ }
+ }
+
+ if ({{GET[shouldhavename]}}) {
+ process_test_result(window.name == "test", "Test that window name is present");
+ } else {
+ process_test_result(window.name == "", "Test that window name is not present");
+ }
+</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html
new file mode 100644
index 00000000000..6bc64c63736
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-aux-frame-navigation.sub.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <!-- window.name should equal "test" after a cross-origin auxiliary frame navigation. -->
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script>
+ t = async_test("Test that the window name is correct");
+ window.addEventListener("message", t.step_func_done(function(e) {
+ assert_equals(e.data, true);
+ }));
+ window.open("support/window-name-navigation.sub.html?hostname={{domains[www1]}}&shouldhavename=true&sendmessage=true");
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html
new file mode 100644
index 00000000000..3f26c05fb6e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-main-frame-navigation.sub.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <!-- window.name should equal "" after a cross-origin main frame navigation. -->
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script>
+ document.location = "support/window-name-navigation.sub.html?hostname={{domains[www1]}}&shouldhavename=false&sendmessage=false";
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html
new file mode 100644
index 00000000000..a309be6d801
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-cross-origin-sub-frame-navigation.sub.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <!-- window.name should equal "test" after a cross-origin sub frame navigation. -->
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script>
+ t = async_test("Test that the window name is correct");
+ window.addEventListener("message", t.step_func_done(function(e) {
+ assert_equals(e.data, true);
+ }));
+ </script>
+ <iframe src="support/window-name-navigation.sub.html?hostname={{domains[www1]}}&shouldhavename=true&sendmessage=true";
+ </iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html
new file mode 100644
index 00000000000..8e0a95d8c08
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-aux-frame-navigation.sub.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <!-- window.name should equal "test" after a same-origin auxiliary frame navigation. -->
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script>
+ t = async_test("Test that the window name is correct");
+ window.addEventListener("message", t.step_func_done(function(e) {
+ assert_equals(e.data, true);
+ }));
+ window.open("support/window-name-navigation.sub.html?hostname={{host}}&shouldhavename=true&sendmessage=true");
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html
new file mode 100644
index 00000000000..03365b98008
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-main-frame-navigation.sub.html
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <!-- window.name should equal "test" after a same-origin main frame navigation. -->
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script>
+ document.location = "support/window-name-navigation.sub.html?hostname={{host}}&shouldhavename=true&sendmessage=false";
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html
new file mode 100644
index 00000000000..48a6e247b05
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/history-traversal/window-name-after-same-origin-sub-frame-navigation.sub.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <!-- window.name should equal "test" after a same-origin sub frame navigation. -->
+ <script src='/resources/testharness.js'></script>
+ <script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+ <script>
+ t = async_test("Test that the window name is correct");
+ window.addEventListener("message", t.step_func_done(function(e) {
+ assert_equals(e.data, true);
+ }));
+ </script>
+ <iframe src="support/window-name-navigation.sub.html?hostname={{host}}&shouldhavename=true&sendmessage=true";
+ </iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html
new file mode 100644
index 00000000000..45f7e38ba3e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/forward-triggers-hashchange.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Navigating forward after replace() should still trigger hashchange</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#history-traversal">
+<link rel="author" href="mailto:d@domenic.me" title="Domenic Denicola">
+
+<!-- While writing ./replacement-enabled.html, a bug was discovered in Firefox where it does not
+fire hashchange when using history.forward(), at least under certain conditions. So, this test
+exercises that specifically. -->
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="navigate-helpers.js"></script>
+
+<body>
+
+<script>
+"use strict";
+let resolve, iframe;
+promise_test(() => {
+ iframe = document.createElement("iframe");
+ iframe.src = "/common/blank.html";
+ iframe.addEventListener("load", runTest);
+ document.body.appendChild(iframe);
+
+ return new Promise(r => resolve = r);
+});
+
+function runTest() {
+ iframe.removeEventListener("load", runTest);
+ const frameWindow = iframe.contentWindow;
+
+ resolve((async () => {
+ await navigateAndWaitForChange(frameWindow, w => w.location.href = "/common/blank.html#apple");
+ await navigateAndWaitForChange(frameWindow, w => w.location.href = "/common/blank.html#banana");
+ await navigateAndWaitForChange(frameWindow, w => w.location.href = "/common/blank.html#cat");
+
+ await navigateAndWaitForChange(frameWindow, w => w.history.back());
+ await navigateAndWaitForChange(frameWindow,
+ w => w.location.replace("/common/blank.html#zebra"));
+ await navigateAndWaitForChange(frameWindow, w => w.history.forward());
+ })());
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/navigate-helpers.js b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/navigate-helpers.js
new file mode 100644
index 00000000000..7a9adeb3d2e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/navigate-helpers.js
@@ -0,0 +1,23 @@
+"use strict";
+
+// Usage examples:
+// navigateAndWaitForChange(frameWindow, w => w.location.href = "...");
+// navigateAndWaitForChange(frameWindow, w => w.history.back());
+// navigateAndWaitForChange(frameWindow, w => w.history.back(), { assumeSuccessAfter: 100 });
+
+window.navigateAndWaitForChange = (w, navigationAction, { assumeSuccessAfter } = {}) => {
+ return new Promise(resolve => {
+ w.addEventListener("hashchange", listener);
+
+ function listener() {
+ w.removeEventListener("hashchange", listener);
+ resolve();
+ }
+
+ if (assumeSuccessAfter !== undefined) {
+ step_timeout(resolve, assumeSuccessAfter);
+ }
+
+ navigationAction(w);
+ });
+};
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html
new file mode 100644
index 00000000000..f684bcb3628
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/replacement-enabled.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Navigating to a fragment should not clear forward history</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#scroll-to-fragid">
+<link rel="help" href="https://github.com/whatwg/html/issues/2796">
+<link rel="help" href="https://github.com/whatwg/html/pull/2869">
+<link rel="author" href="mailto:d@domenic.me" title="Domenic Denicola">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="navigate-helpers.js"></script>
+
+<body>
+
+<script>
+"use strict";
+let resolve, iframe;
+promise_test(() => {
+ iframe = document.createElement("iframe");
+ iframe.src = "/common/blank.html";
+ iframe.addEventListener("load", runTest);
+ document.body.appendChild(iframe);
+
+ return new Promise(r => resolve = r);
+});
+
+function runTest() {
+ iframe.removeEventListener("load", runTest);
+ const frameWindow = iframe.contentWindow;
+
+ resolve((async () => {
+ await navigateAndWaitForChange(frameWindow, w => w.location.href = "/common/blank.html#apple");
+ await navigateAndWaitForChange(frameWindow, w => w.location.href = "/common/blank.html#banana");
+ await navigateAndWaitForChange(frameWindow, w => w.location.href = "/common/blank.html#cat");
+
+ assert_equals(frameWindow.location.hash, "#cat");
+
+ // Might not be 4 (= 3 for iframe + 1 initial) due to cross-browser differences or if people are
+ // running this test in a window that has previously been places. The important thing for this
+ // test is the delta from this value.
+ const afterThreeNavigations = frameWindow.history.length;
+
+ await navigateAndWaitForChange(frameWindow, w => w.history.back());
+
+ assert_equals(frameWindow.location.hash, "#banana");
+ assert_equals(frameWindow.history.length, afterThreeNavigations,
+ "back() must not change the history length");
+
+ await navigateAndWaitForChange(frameWindow,
+ w => w.location.replace("/common/blank.html#zebra"));
+
+ assert_equals(frameWindow.location.hash, "#zebra");
+ assert_equals(frameWindow.history.length, afterThreeNavigations,
+ "replace() must not change the history length");
+
+ // As of the time of this writing (2017-08-14), Firefox is not firing hashchange on forward, so
+ // we automatically assume navigation succeeded after 100 ms. A sibling test will test this
+ // particular Firefox bug.
+ await navigateAndWaitForChange(frameWindow, w => w.history.forward(),
+ { assumeSuccessAfter: 100 });
+
+ assert_equals(frameWindow.location.hash, "#cat");
+ assert_equals(frameWindow.history.length, afterThreeNavigations,
+ "forward() must not change the history length");
+
+ })());
+}
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html
index 3196d8be8bb..e8a1e9fd767 100644
--- a/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html
+++ b/tests/wpt/web-platform-tests/html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html
@@ -5,8 +5,9 @@
<script src="/resources/testharnessreport.js"></script>
<body>
<div></div>
-<div id="has two spaces" style="position:absolute; top:200px;"></div>
-<div id="escape%20collision" style="position:absolute; top:300px;"></div>
+<div id="has two spaces" style="position:absolute; top:100px;"></div>
+<div id="escape%20collision" style="position:absolute; top:200px;"></div>
+<div id="%20has%20two%20spaces" style="position:absolute; top:300px;"></div>
<div id="escape collision" style="position:absolute; top:400px;"></div>
<div id="do%20not%20go%20here" style="position:absolute; top:400px;"></div>
<div style="height:200em;"></div>
@@ -14,12 +15,18 @@
var steps = [{
fragid:'has%20two%20spaces',
handler: function(){
- assert_equals( scrollPosition(), 200 );
+ assert_equals( scrollPosition(), 100 );
}
},{
fragid:'escape%20collision',
handler: function(){
- assert_equals( scrollPosition(), 400 );
+ assert_equals( scrollPosition(), 200 );
+ document.getElementById("%20has%20two%20spaces").setAttribute("id", "has%20two%20spaces");
+ }
+ },{
+ fragid:'has%20two%20spaces',
+ handler: function(){
+ assert_equals( scrollPosition(), 300 );
}
},{
fragid:'do%20not%20go%20here',
diff --git a/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_properties_only_fully_active.html b/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_properties_only_fully_active.html
new file mode 100644
index 00000000000..0404a6b2e02
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/history/the-history-interface/history_properties_only_fully_active.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<title>history properties should throw SecurityError when not in a fully active Document</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+ <iframe id="child"></iframe>
+</body>
+<script>
+ test(function(t) {
+ var ifr = document.getElementById("child");
+ var cached_history = ifr.contentWindow.history;
+ ifr.remove();
+ assert_throws("SecurityError", function() { cached_history.length; });
+ assert_throws("SecurityError", function() { cached_history.scrollRestoration; });
+ assert_throws("SecurityError", function() { cached_history.state; });
+ assert_throws("SecurityError", function() { cached_history.go(0); });
+ assert_throws("SecurityError", function() { cached_history.back(); });
+ assert_throws("SecurityError", function() { cached_history.forward(); });
+ assert_throws("SecurityError", function() { cached_history.pushState(1, document.title, "?x=1"); });
+ assert_throws("SecurityError", function() { cached_history.replaceState(2, document.title, "?x=2"); });
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/appcache-worker.html b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/appcache-worker.html
new file mode 100644
index 00000000000..96fe5f2b7d2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/appcache-worker.html
@@ -0,0 +1,81 @@
+<html manifest="resources/appcache-worker.manifest">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+var resolveInitPromise;
+var initPromise = new Promise(r => { resolveInitPromise = r; });
+
+applicationCache.addEventListener('cached', resolveInitPromise, false);
+applicationCache.addEventListener('noupdate', resolveInitPromise, false);
+
+promise_test(t => {
+ return initPromise.then(_ => {
+ var worker =
+ new Worker('resources/appcache-worker.py?type=cached');
+ return new Promise(r => { worker.onmessage = r; });
+ }).then(event => {
+ assert_equals(event.data, 'Done: cached');
+ });
+ }, 'Dedicated worker of the cached script');
+
+promise_test(t => {
+ return initPromise.then(_ => {
+ var worker =
+ new Worker('resources/appcache-worker.py?type=fallingback');
+ return new Promise(r => { worker.onmessage = r; });
+ }).then(event => {
+ assert_equals(event.data, 'Done: fallbacked');
+ });
+ }, 'Dedicated worker of the fallbacked script');
+
+promise_test(t => {
+ return initPromise.then(_ => {
+ var worker =
+ new Worker('resources/appcache-dedicated-worker-not-in-cache.js');
+ return new Promise((resolve, reject) => {
+ worker.onerror = resolve;
+ worker.onmessage = _ => {
+ reject('The worker not in the AppCache must not be executed.');
+ };
+ });
+ });
+ }, 'Dedicated worker of the not-in-cache script');
+
+promise_test(t => {
+ return initPromise.then(_ => {
+ var worker =
+ new SharedWorker('resources/appcache-worker.py?type=cached');
+ var promise = new Promise(r => { worker.port.onmessage = r; });
+ worker.port.start();
+ return promise;
+ }).then(event => {
+ assert_equals(event.data, 'Done: cached');
+ });
+ }, 'Shared worker of the cached script');
+
+promise_test(t => {
+ return initPromise.then(_ => {
+ var worker =
+ new SharedWorker('resources/appcache-worker.py?type=fallingback');
+ var promise = new Promise(r => { worker.port.onmessage = r; });
+ worker.port.start();
+ return promise;
+ }).then(event => {
+ assert_equals(event.data, 'Done: fallbacked');
+ });
+ }, 'Shared worker of the fallbacked script');
+
+promise_test(t => {
+ return initPromise.then(_ => {
+ var worker =
+ new SharedWorker(
+ 'resources/appcache-shared-worker-not-in-cache.js');
+ var promise = new Promise(r => { worker.port.onmessage = r; });
+ worker.port.start();
+ return promise;
+ }).then(event => {
+ assert_equals(event.data, 'Done');
+ });
+ }, 'Shared worker of the not-in-cache script');
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-dedicated-worker-not-in-cache.js b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-dedicated-worker-not-in-cache.js
new file mode 100644
index 00000000000..d4ed500496b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-dedicated-worker-not-in-cache.js
@@ -0,0 +1 @@
+postMessage('Done');
diff --git a/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-shared-worker-not-in-cache.js b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-shared-worker-not-in-cache.js
new file mode 100644
index 00000000000..303595ca376
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-shared-worker-not-in-cache.js
@@ -0,0 +1,64 @@
+var info = '';
+
+var initPromise = new Promise(resolve => {
+ self.addEventListener('connect', event => {
+ self.postMessage = msg => { event.ports[0].postMessage(msg); };
+ resolve();
+ });
+});
+
+function importNotInCacheSciptTest() {
+ return new Promise((resolve, reject) => {
+ try {
+ importScripts('appcache-worker-import.py?type=not-in-cache');
+ } catch(e) {
+ reject(new Error('Error while importing the not-in-cache script: ' +
+ e.toString()));
+ return;
+ }
+ if (info != 'Set by the not-in-cache script') {
+ reject(new Error('The not-in-cache script was not correctly executed'));
+ }
+ resolve();
+ });
+}
+
+function importFallbackSciptTest() {
+ return new Promise((resolve, reject) => {
+ try {
+ importScripts('appcache-worker-import.py?type=fallingback');
+ reject(new Error('Importing a fallback script must fail.'));
+ } catch(e) {
+ resolve();
+ }
+ });
+}
+
+function fetchNotInCacheFileTest() {
+ return fetch('appcache-worker-data.py?type=not-in-cache')
+ .then(res => res.text(),
+ _ => { throw new Error('Failed to fetch not-in-cache file'); })
+ .then(text => {
+ if (text != 'not-in-cache') {
+ throw new Error('not-in-cache file mismatch');
+ }
+ })
+}
+
+function fetchFallbackFileTest() {
+ return fetch('appcache-worker-data.py?type=fallingback')
+ .then(res => {
+ if (res.status != 404) {
+ throw new Error(
+ 'Fetching fallback file must resolve with 404 response');
+ }
+ },
+ _ => { throw new Error('Fetching fallback file must not fail'); });
+}
+
+initPromise
+ .then(importNotInCacheSciptTest)
+ .then(importFallbackSciptTest)
+ .then(fetchNotInCacheFileTest)
+ .then(fetchFallbackFileTest)
+ .then(_ => postMessage('Done'), error => postMessage(error.toString()));
diff --git a/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker-data.py b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker-data.py
new file mode 100644
index 00000000000..f92c5116c08
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker-data.py
@@ -0,0 +1,5 @@
+def main(request, response):
+ type = request.GET['type']
+ if request.GET['type'] == 'fallingback':
+ return 404, [('Content-Type', 'text/plain')], "Page not found"
+ return [('Content-Type', 'text/plain')], type
diff --git a/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker-import.py b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker-import.py
new file mode 100644
index 00000000000..650975b9127
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker-import.py
@@ -0,0 +1,7 @@
+script = 'info = \'Set by the %s script\';'
+
+def main(request, response):
+ type = request.GET['type']
+ if request.GET['type'] == 'fallingback':
+ return 404, [('Content-Type', 'text/plain')], "Page not found"
+ return [('Content-Type', 'text/javascript')], script % type
diff --git a/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker.manifest b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker.manifest
new file mode 100644
index 00000000000..f369a766404
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker.manifest
@@ -0,0 +1,10 @@
+CACHE MANIFEST
+
+appcache-worker.py?type=cached
+appcache-worker-import.py?type=cached
+appcache-worker-data.py?type=cached
+
+FALLBACK:
+appcache-worker.py?type=fallingback appcache-worker.py?type=fallbacked
+appcache-worker-import.py?type=fallingback appcache-worker-import.py?type=fallbacked
+appcache-worker-data.py?type=fallingback appcache-worker-data.py?type=fallbacked
diff --git a/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker.py b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker.py
new file mode 100644
index 00000000000..22d02feaf1d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/browsers/offline/appcache/workers/resources/appcache-worker.py
@@ -0,0 +1,102 @@
+script = '''
+var initPromise = Promise.resolve();
+
+if ('SharedWorkerGlobalScope' in self &&
+ self instanceof SharedWorkerGlobalScope) {
+ initPromise = new Promise(resolve => {
+ self.addEventListener('connect', event => {
+ self.postMessage = msg => { event.ports[0].postMessage(msg); };
+ resolve();
+ });
+ });
+}
+
+var info = '';
+
+function importCachedScriptTest() {
+ return new Promise((resolve, reject) => {
+ info = '';
+ try {
+ importScripts('appcache-worker-import.py?type=cached');
+ } catch(e) {
+ reject(new Error('Error while importing the cached script: ' +
+ e.toString()));
+ return;
+ }
+ if (info != 'Set by the cached script') {
+ reject(new Error('The cached script was not correctly executed'));
+ }
+ resolve();
+ });
+}
+
+function importNotInCacheSciptTest() {
+ return new Promise((resolve, reject) => {
+ try {
+ importScripts('appcache-worker-import.py?type=not-in-cache');
+ reject(new Error('Importing a non-cached script must fail.'));
+ } catch(e) {
+ resolve();
+ }
+ });
+}
+
+function importFallbackSciptTest() {
+ return new Promise((resolve, reject) => {
+ info = '';
+ try {
+ importScripts('appcache-worker-import.py?type=fallingback');
+ } catch(e) {
+ reject(new Error('Error while importing the fallingback script: ' +
+ e.toString()));
+ }
+ if (info != 'Set by the fallbacked script') {
+ reject(new Error('The fallingback script was not correctly executed'));
+ }
+ resolve();
+ });
+}
+
+function fetchCachedFileTest() {
+ return fetch('appcache-worker-data.py?type=cached')
+ .then(res => res.text(),
+ _ => { throw new Error('Failed to fetch cached file'); })
+ .then(text => {
+ if (text != 'cached') {
+ throw new Error('cached file missmatch');
+ }
+ });
+}
+
+function fetchNotInCacheFileTest() {
+ return fetch('appcache-worker-data.py?type=not-in-cache')
+ .then(_ => { throw new Error('Fetching not-in-cache file must fail'); },
+ _ => {});
+}
+
+function fetchFallbackFileTest() {
+ return fetch('appcache-worker-data.py?type=fallingback')
+ .then(res => res.text(),
+ _ => { throw new Error('Failed to fetch fallingback file'); })
+ .then(text => {
+ if (text != 'fallbacked') {
+ throw new Error('fallbacked file miss match');
+ }
+ });
+}
+
+initPromise
+ .then(importCachedScriptTest)
+ .then(importNotInCacheSciptTest)
+ .then(importFallbackSciptTest)
+ .then(fetchCachedFileTest)
+ .then(fetchNotInCacheFileTest)
+ .then(_ => postMessage('Done: %s'),
+ error => postMessage(error.toString()));
+'''
+
+def main(request, response):
+ type = request.GET['type']
+ if request.GET['type'] == 'fallingback':
+ return 404, [('Content-Type', 'text/plain')], "Page not found"
+ return [('Content-Type', 'text/javascript')], script % type
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 442620b299e..06d96b11372 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
@@ -187,14 +187,16 @@ function checkPropertyDescriptor(desc, propName, expectWritable) {
var isSymbol = (typeof(propName) == "symbol");
propName = String(propName);
assert_true(isObject(desc), "property descriptor for " + propName + " should exist");
- assert_equals(desc.enumerable, false, "property descriptor for " + propName + " should be non-enumerable");
assert_equals(desc.configurable, true, "property descriptor for " + propName + " should be configurable");
if (isSymbol) {
+ assert_equals(desc.enumerable, false, "symbol-property descriptor for " + propName + " should not be enumerable");
assert_true("value" in desc,
"property descriptor for " + propName + " should be a value descriptor");
assert_equals(desc.value, undefined,
"symbol-named cross-origin visible prop " + propName +
" should come back as undefined");
+ } else {
+ assert_equals(desc.enumerable, true, "property descriptor for " + propName + " should be enumerable");
}
if ('value' in desc)
assert_equals(desc.writable, expectWritable, "property descriptor for " + propName + " should have writable: " + expectWritable);
@@ -256,15 +258,23 @@ addTest(function() {
}, "[[DefineOwnProperty]] Should throw for cross-origin objects");
/*
- * [[Enumerate]]
+ * EnumerateObjectProperties (backed by [[OwnPropertyKeys]])
*/
addTest(function() {
- for (var prop in C)
- assert_unreached("Shouldn't have been able to enumerate " + prop + " on cross-origin Window");
- for (var prop in C.location)
- assert_unreached("Shouldn't have been able to enumerate " + prop + " on cross-origin Location");
-}, "[[Enumerate]] should return an empty iterator");
+ let i = 0;
+ for (var prop in C) {
+ i++;
+ assert_true(whitelistedWindowPropNames.includes(prop), prop + " is not safelisted for a cross-origin Window");
+ }
+ assert_equals(i, whitelistedWindowPropNames.length, "Enumerate all safelisted cross-origin Window properties");
+ i = 0;
+ for (var prop in C.location) {
+ i++;
+ assert_true(whitelistedLocationPropNames.includes(prop), prop + " is not safelisted for a cross-origin Location");
+ }
+ assert_equals(i, whitelistedLocationPropNames.length, "Enumerate all safelisted cross-origin Location properties");
+}, "Can only enumerate safelisted properties");
/*
* [[OwnPropertyKeys]]
@@ -274,9 +284,15 @@ addTest(function() {
assert_array_equals(Object.getOwnPropertyNames(C).sort(),
whitelistedWindowPropNames,
"Object.getOwnPropertyNames() gives the right answer for cross-origin Window");
+ assert_array_equals(Object.keys(C).sort(),
+ whitelistedWindowPropNames,
+ "Object.keys() gives the right answer for cross-origin Window");
assert_array_equals(Object.getOwnPropertyNames(C.location).sort(),
whitelistedLocationPropNames,
"Object.getOwnPropertyNames() gives the right answer for cross-origin Location");
+ assert_array_equals(Object.keys(C.location).sort(),
+ whitelistedLocationPropNames,
+ "Object.keys() gives the right answer for cross-origin Location");
}, "[[OwnPropertyKeys]] should return all properties from cross-origin objects");
addTest(function() {
diff --git a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/frame.html b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/frame.html
index 0a7769dc967..341da6a9788 100644
--- a/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/frame.html
+++ b/tests/wpt/web-platform-tests/html/browsers/origin/cross-origin-objects/frame.html
@@ -37,6 +37,6 @@
<body>
<!-- Two subframes to give us some indexed properties -->
<iframe></iframe>
- <iframe></iframe>
+ <iframe name=donotleakme></iframe><!-- "donotleakme" is excluded as cross-origin named property due to [[HideFromKeys]] -->
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/browsers/origin/origin-of-data-document.html b/tests/wpt/web-platform-tests/html/browsers/origin/origin-of-data-document.html
index cedb2513fbd..345a3a6b73b 100644
--- a/tests/wpt/web-platform-tests/html/browsers/origin/origin-of-data-document.html
+++ b/tests/wpt/web-platform-tests/html/browsers/origin/origin-of-data-document.html
@@ -10,17 +10,28 @@
<body>
<script>
async_test(function (t) {
+ var i = document.createElement('iframe');
+ i.src = "data:text/html,<script>" +
+ " window.parent.postMessage('Hello!', '*');" +
+ "</scr" + "ipt>";
+
window.addEventListener("message", t.step_func_done(function (e) {
assert_equals(e.origin, "null", "Messages sent from a 'data:' URL should have an opaque origin (which serializes to 'null').");
assert_throws("SecurityError", function () {
var couldAccessCrossOriginProperty = e.source.location.href;
- }, "The 'data:' frame should be cross-origin.")
+ }, "The 'data:' frame should be cross-origin: 'window.location.href'");
+
+ // Try to access contentDocument of the 'data: ' frame. Some browsers
+ // (i.e. Firefox, Safari) will return |null| and some (i.e. Chrome)
+ // will throw an exception.
+ var dataFrameContentDocument = null;
+ try {
+ dataFrameContentDocument = i.contentDocument;
+ } catch (ex) {
+ }
+ assert_equals(dataFrameContentDocument, null, "The 'data:' iframe should be unable to access its contentDocument.");
}));
- var i = document.createElement('iframe');
- i.src = "data:text/html,<script>" +
- " window.parent.postMessage('Hello!', '*');" +
- "</scr" + "ipt>";
document.body.appendChild(i);
}, "The origin of a 'data:' document in a frame is opaque.");
</script>
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 f020e0ecbe1..d5b1789d594 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
@@ -9,7 +9,6 @@
<div style="display:none">
<p name="a" id="p1"></p>
<a name="a" id="a1" href="#"></a>
- <applet name="a" id="app1"></applet>
<area name="a" id="area1"></area>
<embed name="a" id="embed1"></embed>
<form name="a" id="form1"></form>
@@ -33,10 +32,9 @@ test(function() {
}, "Check if the first nested browsing context is returned by window['c']");
test(function() {
- assert_equals(window['a'].length, 5, "The length should be 5.");
assert_true(window['a'] instanceof HTMLCollection);
assert_array_equals(window['a'],
- [ document.getElementById('app1'), document.getElementById('embed1'),
+ [ document.getElementById('embed1'),
document.getElementById('form1'), document.getElementById('img1'),
document.getElementById('obj1') ],
"The elements are not in tree order.");
@@ -44,10 +42,10 @@ test(function() {
document.getElementById('form1').setAttribute("name", "");
document.getElementById('embed1').setAttribute("name", "");
assert_array_equals(window['a'],
- [ document.getElementById('app1'), document.getElementById('img1'),
+ [ document.getElementById('img1'),
document.getElementById('obj1') ],
"Window['a'] should not contain the elements with empty name attribute.");
-}, "Check if window['a'] contains all applet, embed, form, img, and object elements, and their order");
+}, "Check if window['a'] contains all embed, form, img, and object elements, and their order");
var t = async_test("Check that window['fs'] does not return the frameset element with name='fs' (historical)");
function on_load () {
diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-indexed-properties.html b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-indexed-properties.html
index 17d0eb729ae..49247179738 100644
--- a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-indexed-properties.html
+++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-indexed-properties.html
@@ -17,6 +17,12 @@ test(function() {
window[-1] = "foo";
assert_equals(window[-1], "foo");
});
+test(() => {
+ const desc = Object.getOwnPropertyDescriptor(window, "0");
+ assert_true(desc.configurable);
+ assert_true(desc.enumerable);
+ assert_false(desc.writable);
+}, "Ensure indexed properties have the correct configuration");
test(function() {
window[0] = "foo";
assert_throws(new TypeError(), () => Object.defineProperty(window, 0, { value: "bar" }))
diff --git a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-named-properties.html b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-named-properties.html
index 54f37bbdcc6..e001fb0f020 100644
--- a/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-named-properties.html
+++ b/tests/wpt/web-platform-tests/html/browsers/the-window-object/window-named-properties.html
@@ -60,7 +60,7 @@ var t = async_test("Dynamic name")
var t2 = async_test("Ghost name")
t.step(function() {
var iframe = document.getElementsByTagName("iframe")[0];
- iframe.setAttribute("src", "data:text/html,<script>window.name='foo'<\/script>");
+ iframe.setAttribute("srcdoc", "<script>window.name='foo'<\/script>");
iframe.onload = function() {
t.step(function() {
assert_true("foo" in window, "foo not in window");
diff --git a/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.html b/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.html
index 76f1b64de23..34b3ec9a254 100644
--- a/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.html
+++ b/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/Document.currentScript.html
@@ -14,7 +14,6 @@ var data = {
"dom-inline" : [],
"dom-ext" : [],
"nested" : ["nested-outer","nested-inner","nested-outer"],
- "script-exec" : ["script-exec-before-after","script-exec-before-after"],
"script-load-error" : [null],
"script-window-error" : ["script-error-compile","script-error-runtime"],
"timeout" : [null],
diff --git a/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/nameditem-03.html b/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/nameditem-03.html
index 4c330b6a367..be2ca173b02 100644
--- a/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/nameditem-03.html
+++ b/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/nameditem-03.html
@@ -6,105 +6,13 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
-<div id="test">
<applet name=test1></applet>
-
-<applet name=test2></applet>
-<applet name=test2></applet>
-
-<applet id=test3></applet>
-
-<applet id=test4></applet>
-<applet id=test4></applet>
-
-<applet name=test5></applet>
-<applet id=test5></applet>
-
-<applet id=test6></applet>
-<applet name=test6></applet>
-
-<applet id=test7 name=fail></applet>
-
-<applet name=test8 id=fail></applet>
-</div>
<script>
test(function() {
var applet = document.getElementsByTagName("applet")[0];
- assert_equals(applet.name, "test1");
-
- assert_true("test1" in document, '"test1" in document should be true');
- assert_equals(document.test1, applet);
-}, "If there is one applet, it should be returned (name)");
-
-test(function() {
- var applet1 = document.getElementsByTagName("applet")[1];
- assert_equals(applet1.name, "test2");
- var applet2 = document.getElementsByTagName("applet")[2];
- assert_equals(applet2.name, "test2");
-
- assert_true("test2" in document, '"test2" in document should be true');
- var collection = document.test2;
- assert_class_string(collection, "HTMLCollection", "collection should be an HTMLCollection");
- assert_array_equals(collection, [applet1, applet2]);
-}, "If there are two applets, a collection should be returned. (name)");
-
-test(function() {
- var applet = document.getElementsByTagName("applet")[3];
- assert_equals(applet.id, "test3");
-
- assert_true("test3" in document, '"test3" in document should be true');
- assert_equals(document.test3, applet);
-}, "If there is one applet, it should be returned (id)");
-
-test(function() {
- var applet1 = document.getElementsByTagName("applet")[4];
- assert_equals(applet1.id, "test4");
- var applet2 = document.getElementsByTagName("applet")[5];
- assert_equals(applet2.id, "test4");
-
- assert_true("test4" in document, '"test4" in document should be true');
- var collection = document.test4;
- assert_class_string(collection, "HTMLCollection", "collection should be an HTMLCollection");
- assert_array_equals(collection, [applet1, applet2]);
-}, "If there are two applets, a collection should be returned. (id)");
-
-test(function() {
- var applet1 = document.getElementsByTagName("applet")[6];
- assert_equals(applet1.name, "test5");
- var applet2 = document.getElementsByTagName("applet")[7];
- assert_equals(applet2.id, "test5");
-
- assert_true("test5" in document, '"test5" in document should be true');
- var collection = document.test5;
- assert_class_string(collection, "HTMLCollection", "collection should be an HTMLCollection");
- assert_array_equals(collection, [applet1, applet2]);
-}, "If there are two applets, a collection should be returned. (name and id)");
-
-test(function() {
- var applet1 = document.getElementsByTagName("applet")[8];
- assert_equals(applet1.id, "test6");
- var applet2 = document.getElementsByTagName("applet")[9];
- assert_equals(applet2.name, "test6");
-
- assert_true("test6" in document, '"test6" in document should be true');
- var collection = document.test6;
- assert_class_string(collection, "HTMLCollection", "collection should be an HTMLCollection");
- assert_array_equals(collection, [applet1, applet2]);
-}, "If there are two applets, a collection should be returned. (id and name)");
-
-test(function() {
- var applet = document.getElementsByTagName("applet")[10];
- assert_equals(applet.id, "test7");
-
- assert_true("test7" in document, '"test7" in document should be true');
- assert_equals(document.test7, applet);
-}, "A name shouldn't affect getting an applet by id");
-
-test(function() {
- var applet = document.getElementsByTagName("applet")[11];
- assert_equals(applet.name, "test8");
+ assert_equals(applet.name, undefined);
- assert_true("test8" in document, '"test8" in document should be true');
- assert_equals(document.test8, applet);
-}, "An id shouldn't affect getting an applet by name");
+ assert_false("test1" in document, '"test1" in document should be false');
+ assert_equals(document.test1, undefined);
+}, "applet elements are (mostly) gone");
</script>
diff --git a/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/nameditem-08.html b/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/nameditem-08.html
index a5c26f39eed..bb024d9e781 100644
--- a/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/nameditem-08.html
+++ b/tests/wpt/web-platform-tests/html/dom/documents/dom-tree-accessors/nameditem-08.html
@@ -1,14 +1,11 @@
<!DOCTYPE html>
<meta charset=utf-8>
-<title>Named items: duplicate id attributes for applet, object and img</title>
+<title>Named items: duplicate id attributes for object and img</title>
<link rel="help" href="https://html.spec.whatwg.org/multipage/dom.html#dom-document-nameditem">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<div id="test">
-<div id=test1></div>
-<applet id=test1></applet>
-
<div id=test2></div>
<object id=test2></object>
@@ -17,14 +14,6 @@
</div>
<script>
test(function() {
- var applet = document.querySelector("applet");
- assert_equals(applet.id, "test1");
-
- assert_true("test1" in document);
- assert_equals(document.test1, applet);
-}, "If there is a div and applet with same id, the applet should be returned");
-
-test(function() {
var object = document.querySelector("object");
assert_equals(object.id, "test2");
diff --git a/tests/wpt/web-platform-tests/html/dom/elements-embedded.js b/tests/wpt/web-platform-tests/html/dom/elements-embedded.js
index 1b6e4215aa6..64e7416cb94 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements-embedded.js
+++ b/tests/wpt/web-platform-tests/html/dom/elements-embedded.js
@@ -1,5 +1,5 @@
-// Up-to-date as of 2013-04-06.
var embeddedElements = {
+ picture: {},
img: {
// Conforming
alt: "string",
@@ -92,7 +92,6 @@ var embeddedElements = {
preload: {type: "enum", keywords: ["none", "metadata", "auto"], nonCanon: {"": "auto"}, defaultVal: null},
autoplay: "boolean",
loop: "boolean",
- mediaGroup: "string",
controls: "boolean",
defaultMuted: {type: "boolean", domAttrName: "muted"},
@@ -108,13 +107,14 @@ var embeddedElements = {
preload: {type: "enum", keywords: ["none", "metadata", "auto"], nonCanon: {"": "auto"}, defaultVal: null},
autoplay: "boolean",
loop: "boolean",
- mediaGroup: "string",
controls: "boolean",
defaultMuted: {type: "boolean", domAttrName: "muted"}
},
source: {
src: "url",
type: "string",
+ srcset: "string",
+ sizes: "string",
media: "string"
},
track: {
diff --git a/tests/wpt/web-platform-tests/html/dom/elements-forms.js b/tests/wpt/web-platform-tests/html/dom/elements-forms.js
index 06dcd661f7d..fc455352578 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements-forms.js
+++ b/tests/wpt/web-platform-tests/html/dom/elements-forms.js
@@ -1,9 +1,22 @@
-// Up-to-date as of 2013-04-07.
+var inputModeKeywords = [
+ "verbatim",
+ "latin",
+ "latin-name",
+ "latin-prose",
+ "full-width-latin",
+ "kana",
+ "kana-name",
+ "katakana",
+ "numeric",
+ "tel",
+ "email",
+ "url",
+];
var formElements = {
form: {
acceptCharset: {type: "string", domAttrName: "accept-charset"},
- // TODO: action is special
- // action: "url",
+ // "action" has magic hard-coded in reflection.js
+ action: "url",
autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
enctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], defaultVal: "application/x-www-form-urlencoded"},
encoding: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], defaultVal: "application/x-www-form-urlencoded", domAttrName: "enctype"},
@@ -27,41 +40,39 @@ var formElements = {
// Conforming
accept: "string",
alt: "string",
- // TODO: autocomplete is special.
- // autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
+ autocomplete: {type: "string", customGetter: true},
autofocus: "boolean",
defaultChecked: {type: "boolean", domAttrName: "checked"},
dirName: "string",
disabled: "boolean",
- // TODO: formAction is special
- // formAction: "url",
+ // "formAction" has magic hard-coded in reflection.js
+ formAction: "url",
formEnctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], invalidVal: "application/x-www-form-urlencoded"},
formMethod: {type: "enum", keywords: ["get", "post"], invalidVal: "get"},
formNoValidate: "boolean",
formTarget: "string",
- //TODO: only reflected on setting
- //height: "unsigned long",
- inputMode: {type: "enum", keywords: ["verbatim", "latin", "latin-name", "latin-prose", "full-width-latin", "kana", "katakana", "numeric", "tel", "email", "url"]},
+ height: {type: "unsigned long", customGetter: true},
+ inputMode: {type: "enum", keywords: inputModeKeywords},
max: "string",
maxLength: "limited long",
min: "string",
+ minLength: "limited long",
multiple: "boolean",
name: "string",
pattern: "string",
placeholder: "string",
readOnly: "boolean",
required: "boolean",
- // https://html.spec.whatwg.org/multipage/#attr-input-size
+ // https://html.spec.whatwg.org/#attr-input-size
size: {type: "limited unsigned long", defaultVal: 20},
src: "url",
step: "string",
type: {type: "enum", keywords: ["hidden", "text", "search", "tel",
- "url", "email", "password", "datetime", "date", "month", "week",
+ "url", "email", "password", "date", "month", "week",
"time", "datetime-local", "number", "range", "color", "checkbox",
"radio", "file", "submit", "image", "reset", "button"], defaultVal:
"text"},
- //TODO: only reflected on setting
- //width: "unsigned long",
+ width: {type: "unsigned long", customGetter: true},
defaultValue: {type: "string", domAttrName: "value"},
// Obsolete
@@ -71,8 +82,8 @@ var formElements = {
button: {
autofocus: "boolean",
disabled: "boolean",
- // TODO: formAction is special
- // formAction: "url",
+ // "formAction" has magic hard-coded in reflection.js
+ formAction: "url",
formEnctype: {type: "enum", keywords: ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"], invalidVal: "application/x-www-form-urlencoded"},
formMethod: {type: "enum", keywords: ["get", "post", "dialog"], invalidVal: "get"},
formNoValidate: "boolean",
@@ -82,6 +93,7 @@ var formElements = {
value: "string"
},
select: {
+ autocomplete: {type: "string", customGetter: true},
autofocus: "boolean",
disabled: "boolean",
multiple: "boolean",
@@ -101,14 +113,14 @@ var formElements = {
value: {type: "string", customGetter: true},
},
textarea: {
- // TODO: autocomplete is special.
- // autocomplete: {type: "enum", keywords: ["on", "off"], defaultVal: "on"},
+ autocomplete: {type: "string", customGetter: true},
autofocus: "boolean",
cols: {type: "limited unsigned long with fallback", defaultVal: 20},
dirName: "string",
disabled: "boolean",
- inputMode: {type: "enum", keywords: ["verbatim", "latin", "latin-name", "latin-prose", "full-width-latin", "kana", "katakana", "numeric", "tel", "email", "url"]},
+ inputMode: {type: "enum", keywords: inputModeKeywords},
maxLength: "limited long",
+ minLength: "limited long",
name: "string",
placeholder: "string",
readOnly: "boolean",
@@ -116,19 +128,6 @@ var formElements = {
rows: {type: "limited unsigned long with fallback", defaultVal: 2},
wrap: "string",
},
- keygen: {
- autofocus: "boolean",
- challenge: "string",
- disabled: "boolean",
- // The invalid value default is the "unknown" state, which for our
- // purposes seems to be the same as having no invalid value default.
- // The missing value default depends on whether "rsa" is implemented,
- // so we use null, which is magically reserved for "don't try testing
- // this", since no one default is required. (TODO: we could test that
- // it's either the RSA state or the unknown state.)
- keytype: {type: "enum", keywords: ["rsa"], defaultVal: null},
- name: "string",
- },
output: {
htmlFor: {type: "settable tokenlist", domAttrName: "for" },
name: "string",
@@ -136,7 +135,14 @@ var formElements = {
progress: {
max: {type: "limited double", defaultVal: 1.0},
},
- meter: {},
+ meter: {
+ value: {type: "double", customGetter: true},
+ min: {type: "double", customGetter: true},
+ max: {type: "double", customGetter: true},
+ low: {type: "double", customGetter: true},
+ high: {type: "double", customGetter: true},
+ optimum: {type: "double", customGetter: true},
+ },
};
mergeElements(formElements);
diff --git a/tests/wpt/web-platform-tests/html/dom/elements-grouping.js b/tests/wpt/web-platform-tests/html/dom/elements-grouping.js
index c33f49da1bf..4c9a29131ad 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements-grouping.js
+++ b/tests/wpt/web-platform-tests/html/dom/elements-grouping.js
@@ -1,4 +1,3 @@
-// Up-to-date as of 2013-04-08.
var groupingElements = {
p: {
// Obsolete
@@ -22,8 +21,6 @@ var groupingElements = {
ol: {
// Conforming
reversed: "boolean",
- // TODO: This should have a default value of the list's length if the
- // reversed attribute is set.
start: {type: "long", defaultVal: 1},
type: "string",
diff --git a/tests/wpt/web-platform-tests/html/dom/elements-metadata.js b/tests/wpt/web-platform-tests/html/dom/elements-metadata.js
index 1b23a27a330..f30459013cb 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements-metadata.js
+++ b/tests/wpt/web-platform-tests/html/dom/elements-metadata.js
@@ -1,9 +1,8 @@
-// Up-to-date as of 2013-04-08.
var metadataElements = {
head: {},
title: {},
base: {
- // XXX href is weird. href: "url",
+ href: {type: "url", customGetter: true},
target: "string",
},
link: {
@@ -11,13 +10,13 @@ var metadataElements = {
href: "url",
crossOrigin: {type: "enum", keywords: ["anonymous", "use-credentials"], nonCanon:{"": "anonymous"}, isNullable: true, defaultVal: null, invalidVal: "anonymous"},
rel: "string",
- relList: {type: "tokenlist", domAttrName: "rel"},
as: {
type: "enum",
keywords: ["fetch", "audio", "document", "embed", "font", "image", "manifest", "object", "report", "script", "serviceworker", "sharedworker", "style", "track", "video", "worker", "xslt"],
defaultVal: "",
invalidVal: ""
},
+ relList: {type: "tokenlist", domAttrName: "rel"},
media: "string",
nonce: "string",
integrity: "string",
@@ -25,6 +24,19 @@ var metadataElements = {
type: "string",
sizes: "settable tokenlist",
referrerPolicy: {type: "enum", keywords: ["", "no-referrer", "no-referrer-when-downgrade", "same-origin", "origin", "strict-origin", "origin-when-cross-origin", "strict-origin-when-cross-origin", "unsafe-url"]},
+ scope: "string",
+ workerType: {
+ type: "enum",
+ keywords: ["classic", "module"],
+ defaultVal: "classic",
+ invalidVal: "",
+ },
+ updateViaCache: {
+ type: "enum",
+ keywords: ["imports", "all", "none"],
+ defaultVal: "imports",
+ invalidVal: "imports"
+ },
// Obsolete
charset: "string",
@@ -42,6 +54,7 @@ var metadataElements = {
},
style: {
media: "string",
+ nonce: "string",
type: "string",
},
};
diff --git a/tests/wpt/web-platform-tests/html/dom/elements-misc.js b/tests/wpt/web-platform-tests/html/dom/elements-misc.js
index eb68e10936f..43cdf5f32da 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements-misc.js
+++ b/tests/wpt/web-platform-tests/html/dom/elements-misc.js
@@ -1,4 +1,3 @@
-// Up-to-date as of 2013-04-09.
var miscElements = {
// "The root element" section
html: {
@@ -24,6 +23,11 @@ var miscElements = {
},
noscript: {},
+ template: {},
+ slot: {
+ name: "string",
+ },
+
// "Edits" section
ins: {
cite: "url",
diff --git a/tests/wpt/web-platform-tests/html/dom/elements-obsolete.js b/tests/wpt/web-platform-tests/html/dom/elements-obsolete.js
index 3b6ae363bba..e37e34280f6 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements-obsolete.js
+++ b/tests/wpt/web-platform-tests/html/dom/elements-obsolete.js
@@ -1,6 +1,4 @@
-// Up-to-date as of 2013-04-13.
var obsoleteElements = {
- // https://html.spec.whatwg.org/multipage/#the-applet-element
applet: {
align: "string",
alt: "string",
@@ -14,7 +12,6 @@ var obsoleteElements = {
vspace: "unsigned long",
width: "string",
},
- // https://html.spec.whatwg.org/multipage/#the-marquee-element-2
marquee: {
behavior: "string",
bgColor: "string",
@@ -27,12 +24,10 @@ var obsoleteElements = {
vspace: "unsigned long",
width: "string",
},
- // https://html.spec.whatwg.org/multipage/#frameset
frameset: {
cols: "string",
rows: "string",
},
- // https://html.spec.whatwg.org/multipage/#frame
frame: {
name: "string",
scrolling: "string",
@@ -43,11 +38,9 @@ var obsoleteElements = {
marginHeight: {type: "string", treatNullAsEmptyString: true},
marginWidth: {type: "string", treatNullAsEmptyString: true},
},
- // https://html.spec.whatwg.org/multipage/#htmldirectoryelement
dir: {
compact: "boolean",
},
- // https://html.spec.whatwg.org/multipage/#htmlfontelement
font: {
color: {type: "string", treatNullAsEmptyString: true},
face: "string",
diff --git a/tests/wpt/web-platform-tests/html/dom/elements-sections.js b/tests/wpt/web-platform-tests/html/dom/elements-sections.js
index a22aed9f696..bbad85e5132 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements-sections.js
+++ b/tests/wpt/web-platform-tests/html/dom/elements-sections.js
@@ -1,4 +1,3 @@
-// Up-to-date as of 2013-04-12.
var sectionElements = {
body: {
// Obsolete
@@ -54,6 +53,8 @@ extraTests.push(function() {
ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "vlinkColor", document, "vlink", document.body);
ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "alinkColor", document, "alink", document.body);
ReflectionTests.reflects({type: "string", treatNullAsEmptyString: true}, "bgColor", document, "bgcolor", document.body);
+ // Edge remains RTL if we don't do this, despite removing the attribute
+ document.dir = "ltr";
// Don't mess up the colors :)
document.documentElement.removeAttribute("dir");
var attrs = ["text", "bgcolor", "link", "alink", "vlink"];
diff --git a/tests/wpt/web-platform-tests/html/dom/elements-tabular.js b/tests/wpt/web-platform-tests/html/dom/elements-tabular.js
index db7683c79e0..88fc8d31ec9 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements-tabular.js
+++ b/tests/wpt/web-platform-tests/html/dom/elements-tabular.js
@@ -70,7 +70,7 @@ var tabularElements = {
// HTMLTableCellElement (Conforming)
colSpan: {type: "clamped unsigned long", defaultVal: 1, min: 1, max: 1000},
rowSpan: {type: "clamped unsigned long", defaultVal: 1, min: 0, max: 65534},
- headers: "settable tokenlist",
+ headers: "string",
scope: {type: "enum", keywords: ["row", "col", "rowgroup", "colgroup"]},
abbr: "string",
@@ -89,7 +89,7 @@ var tabularElements = {
// HTMLTableCellElement (Conforming)
colSpan: {type: "clamped unsigned long", defaultVal: 1, min: 1, max: 1000},
rowSpan: {type: "clamped unsigned long", defaultVal: 1, min: 0, max: 65534},
- headers: "settable tokenlist",
+ headers: "string",
scope: {type: "enum", keywords: ["row", "col", "rowgroup", "colgroup"]},
abbr: "string",
diff --git a/tests/wpt/web-platform-tests/html/dom/elements-text.js b/tests/wpt/web-platform-tests/html/dom/elements-text.js
index 56157fabf19..f71df48ee3c 100644
--- a/tests/wpt/web-platform-tests/html/dom/elements-text.js
+++ b/tests/wpt/web-platform-tests/html/dom/elements-text.js
@@ -31,6 +31,9 @@ var textElements = {
},
dfn: {},
abbr: {},
+ ruby: {},
+ rt: {},
+ rp: {},
data: {
value: "string",
},
@@ -38,9 +41,7 @@ var textElements = {
dateTime: "string",
},
code: {},
- // Opera 11.50 doesn't allow unquoted "var" here, although ES5 does and
- // other browsers support it.
- "var": {},
+ var: {},
samp: {},
kbd: {},
sub: {},
@@ -49,9 +50,6 @@ var textElements = {
b: {},
u: {},
mark: {},
- ruby: {},
- rt: {},
- rp: {},
bdi: {},
bdo: {},
span: {},
diff --git a/tests/wpt/web-platform-tests/html/dom/historical.html b/tests/wpt/web-platform-tests/html/dom/historical.html
new file mode 100644
index 00000000000..a36b4b2e92b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/dom/historical.html
@@ -0,0 +1,33 @@
+<!doctype html>
+<title>Historical HTML APIs</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<applet name=war align=left></applet>
+<script>
+test(() => {
+ assert_array_equals(document.applets, []);
+}, "document.applets is always empty");
+
+test(() => {
+ const ap = document.getElementsByTagName("applet")[0];
+ assert_equals(self.HTMLAppletElement, undefined);
+ assert_true(ap instanceof window.HTMLUnknownElement);
+}, "HTMLAppletElement is no more")
+
+test(() => {
+ assert_equals(document.all.war, undefined);
+}, "document.all cannot find applet")
+
+test(() => {
+ assert_equals(document.war, undefined);
+}, "document cannot find applet")
+
+test(() => {
+ assert_equals(self.war, undefined);
+}, "window cannot find applet")
+
+test(() => {
+ assert_equals(self.getComputedStyle(document.getElementsByTagName("applet")[0], "").cssFloat, "none");
+}, "applet is not styled")
+</script>
diff --git a/tests/wpt/web-platform-tests/html/dom/interfaces.html b/tests/wpt/web-platform-tests/html/dom/interfaces.html
index 84406156e8a..b8c2af39eae 100644
--- a/tests/wpt/web-platform-tests/html/dom/interfaces.html
+++ b/tests/wpt/web-platform-tests/html/dom/interfaces.html
@@ -32,7 +32,8 @@ function createInput(type) {
function doTest([html, dom, cssom, uievents, touchevents]) {
var idlArray = new IdlArray();
- idlArray.add_untested_idls(dom + cssom + uievents + touchevents);
+ var svg = "interface SVGElement : Element {};";
+ idlArray.add_untested_idls(dom + svg + cssom + uievents + touchevents);
idlArray.add_idls(html);
idlArray.add_objects({
@@ -204,7 +205,6 @@ function doTest([html, dom, cssom, uievents, touchevents]) {
MessageEvent: ['new MessageEvent("message", { data: 5 })'],
MessageChannel: [],
MessagePort: [],
- HTMLAppletElement: ['document.createElement("applet")'],
HTMLMarqueeElement: ['document.createElement("marquee")'],
HTMLFrameSetElement: ['document.createElement("frameset")'],
HTMLFrameElement: ['document.createElement("frame")'],
diff --git a/tests/wpt/web-platform-tests/html/dom/interfaces.worker.js b/tests/wpt/web-platform-tests/html/dom/interfaces.worker.js
index 5bd08f30785..9fc3dccc66b 100644
--- a/tests/wpt/web-platform-tests/html/dom/interfaces.worker.js
+++ b/tests/wpt/web-platform-tests/html/dom/interfaces.worker.js
@@ -3,10 +3,10 @@
importScripts("/resources/testharness.js");
importScripts("/resources/WebIDLParser.js", "/resources/idlharness.js");
-function doTest([untested, tested]) {
+function doTest([html, dom, cssom, touchevents, uievents]) {
var idlArray = new IdlArray();
- idlArray.add_untested_idls(untested);
- idlArray.add_idls(tested);
+ idlArray.add_untested_idls(dom + cssom + touchevents + uievents);
+ idlArray.add_idls(html);
idlArray.add_objects({
WorkerNavigator: ['self.navigator'],
@@ -25,8 +25,11 @@ function fetchData(url) {
}
promise_test(function() {
- return Promise.all([fetchData("resources/untested-interfaces.idl"),
- fetchData("resources/interfaces.idl")])
+ return Promise.all([fetchData("/interfaces/html.idl"),
+ fetchData("/interfaces/dom.idl"),
+ fetchData("/interfaces/cssom.idl"),
+ fetchData("/interfaces/touchevents.idl"),
+ fetchData("/interfaces/uievents.idl")])
.then(doTest);
}, "Test driver");
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 113da5f9b28..89a80670334 100644
--- a/tests/wpt/web-platform-tests/html/dom/original-harness.js
+++ b/tests/wpt/web-platform-tests/html/dom/original-harness.js
@@ -141,7 +141,8 @@ ReflectionHarness.assertThrows = function(exceptionName, fn) {
try {
fn();
} catch (e) {
- if (e instanceof DOMException && e.code == DOMException[exceptionName]) {
+ if (e instanceof DOMException && (e.code == DOMException[exceptionName] ||
+ e.name == exceptionName)) {
this.increment(this.passed);
return true;
}
diff --git a/tests/wpt/web-platform-tests/html/dom/reflection.js b/tests/wpt/web-platform-tests/html/dom/reflection.js
index d1b3abe8a89..337e053d0c8 100644
--- a/tests/wpt/web-platform-tests/html/dom/reflection.js
+++ b/tests/wpt/web-platform-tests/html/dom/reflection.js
@@ -630,6 +630,12 @@ ReflectionTests.reflects = function(data, idlName, idlObj, domName, domObj) {
if (defaultVal === undefined) {
defaultVal = typeInfo.defaultVal;
}
+ if ((domObj.localName === "form" && domName === "action") ||
+ (["button", "input"].includes(domObj.localName) &&
+ domName === "formAction")) {
+ // Hard-coded special case
+ defaultVal = domObj.ownerDocument.URL;
+ }
if (defaultVal !== null || data.isNullable) {
ReflectionHarness.test(function() {
ReflectionHarness.assertEquals(idlObj[idlName], defaultVal);
@@ -776,25 +782,44 @@ ReflectionTests.reflects = function(data, idlName, idlObj, domName, domObj) {
idlDomExpected = idlDomExpected.filter(function(element, index, array) { return idlIdlExpected[index] < 1000; });
idlIdlExpected = idlIdlExpected.filter(function(element, index, array) { return idlIdlExpected[index] < 1000; });
}
-
- if (!data.customGetter) {
+ if ((domObj.localName === "form" && domName === "action") ||
+ (["button", "input"].includes(domObj.localName) &&
+ domName === "formAction")) {
+ // Hard-coded special case
for (var i = 0; i < domTests.length; i++) {
- if (domExpected[i] === null && !data.isNullable) {
- // If you follow all the complicated logic here, you'll find that
- // this will only happen if there's no expected value at all (like
- // for tabIndex, where the default is too complicated). So skip
- // the test.
- continue;
+ if (domTests[i] === "") {
+ domExpected[i] = domObj.ownerDocument.URL;
+ }
+ }
+ for (var i = 0; i < idlTests.length; i++) {
+ if (idlTests[i] === "") {
+ idlIdlExpected[i] = domObj.ownerDocument.URL;
}
- ReflectionHarness.test(function() {
- domObj.setAttribute(domName, domTests[i]);
- ReflectionHarness.assertEquals(domObj.getAttribute(domName),
- String(domTests[i]), "getAttribute()");
- ReflectionHarness.assertEquals(idlObj[idlName], domExpected[i],
- "IDL get");
- }, "setAttribute() to " + ReflectionHarness.stringRep(domTests[i]));
}
}
+ if (data.customGetter) {
+ // These are reflected only on setting, not getting
+ domTests = [];
+ domExpected = [];
+ idlIdlExpected = idlIdlExpected.map(() => null);
+ }
+
+ for (var i = 0; i < domTests.length; i++) {
+ if (domExpected[i] === null && !data.isNullable) {
+ // If you follow all the complicated logic here, you'll find that
+ // this will only happen if there's no expected value at all (like
+ // for tabIndex, where the default is too complicated). So skip
+ // the test.
+ continue;
+ }
+ ReflectionHarness.test(function() {
+ domObj.setAttribute(domName, domTests[i]);
+ 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++) {
ReflectionHarness.test(function() {
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/001.xhtml
index fbb45211749..7b959be2840 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/001.xhtml
@@ -4,47 +4,47 @@
<title>Canvas drag and drop carrying image as dataURL</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list'));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list'));
+ document.querySelector('div').appendChild(c);}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));}
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern above to the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
<script type="application/ecmascript">
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/002.xhtml
index 9cd8eed0696..6cd8ee7a1ca 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/002.xhtml
@@ -4,32 +4,32 @@
<title>Drag and drop: dropping block element onto canvas</title>
<style type="text/css">
div
- {width:20px;
- height:20px;
- background-color:green;}
+ {width:20px;
+ height:20px;
+ background-color:green;}
</style>
<script type="application/ecmascript">
function paint(color)
- {var canvas = document.querySelector('canvas'),
- c = canvas.getContext('2d');
- c.fillStyle = color;
- c.beginPath();
- c.moveTo(0,0);
- c.lineTo(100,0);
- c.lineTo(100,100);
- c.lineTo(0,100);
- c.closePath();
- c.fill();}
+ {var canvas = document.querySelector('canvas'),
+ c = canvas.getContext('2d');
+ c.fillStyle = color;
+ c.beginPath();
+ c.moveTo(0,0);
+ c.lineTo(100,0);
+ c.lineTo(100,100);
+ c.lineTo(0,100);
+ c.closePath();
+ c.fill();}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body onload="paint('gray')">
<div draggable="true" ondragstart="start(event)"/>
<p>Drag green box above to the gray canvas below. Canvas should turn green when you drop green box on it.</p>
<p>
- <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
+ <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/003-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/003-1.xhtml
index fe1e4ab30de..b9eeb29a574 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/003-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/003-1.xhtml
@@ -4,17 +4,17 @@
<title>Canvas drag and drop: helper file</title>
<style type="text/css">
div
- {width:20px;
- height:20px;
- background-color:green;}
+ {width:20px;
+ height:20px;
+ background-color:green;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body>
<div draggable="true" ondragstart="start(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/003.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/003.xhtml
index fa98ebe8dc8..a30ec22a564 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/003.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/003.xhtml
@@ -4,32 +4,32 @@
<title>Drag and drop from iframe: dropping block element onto canvas</title>
<style type="text/css">
iframe
- {width:150px;
- height:150px;
- border-style:none;}
+ {width:150px;
+ height:150px;
+ border-style:none;}
</style>
<script type="application/ecmascript">
function paint(color)
- {var canvas = document.querySelector('canvas'),
- c = canvas.getContext('2d');
- c.fillStyle = color;
- c.beginPath();
- c.moveTo(0,0);
- c.lineTo(100,0);
- c.lineTo(100,100);
- c.lineTo(0,100);
- c.closePath();
- c.fill();}
+ {var canvas = document.querySelector('canvas'),
+ c = canvas.getContext('2d');
+ c.fillStyle = color;
+ c.beginPath();
+ c.moveTo(0,0);
+ c.lineTo(100,0);
+ c.lineTo(100,100);
+ c.lineTo(0,100);
+ c.closePath();
+ c.fill();}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body onload="paint('gray')">
<p><iframe src="003-1.xhtml">Green box</iframe></p>
<p>Drag green box above to the gray canvas below. Canvas should turn green when you drop green box on it.</p>
<p>
- <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
+ <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/004.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/004.xhtml
index d1c2ef06e81..5b03ed22f5a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/004.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/004.xhtml
@@ -4,32 +4,32 @@
<title>Drag and drop from object: dropping block element onto canvas</title>
<style type="text/css">
object
- {width:150px;
- height:150px;
- border-style:none;}
+ {width:150px;
+ height:150px;
+ border-style:none;}
</style>
<script type="application/ecmascript">
function paint(color)
- {var canvas = document.querySelector('canvas'),
- c = canvas.getContext('2d');
- c.fillStyle = color;
- c.beginPath();
- c.moveTo(0,0);
- c.lineTo(100,0);
- c.lineTo(100,100);
- c.lineTo(0,100);
- c.closePath();
- c.fill();}
+ {var canvas = document.querySelector('canvas'),
+ c = canvas.getContext('2d');
+ c.fillStyle = color;
+ c.beginPath();
+ c.moveTo(0,0);
+ c.lineTo(100,0);
+ c.lineTo(100,100);
+ c.lineTo(0,100);
+ c.closePath();
+ c.fill();}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body onload="paint('gray')">
<p><object type="application/xhtml+xml" data="data:application/xhtml+xml,%3Chtml%20xmlns%3D%22http%3A//www.w3.org/1999/xhtml%22%3E%3Chead%3E%3Ctitle%3ECanvas%20drag%20and%20drop%3C/title%3E%3Cstyle%20type%3D%22text/css%22%3Ediv%7Bwidth%3A20px%3Bheight%3A20px%3Bbackground-color%3Agreen%3B%7D%3C/style%3E%3Cscript%20type%3D%22application/ecmascript%22%3Efunction%20start%28event%29%7Bevent.dataTransfer.effectAllowed%20%3D%20%27copy%27%3Bevent.dataTransfer.setData%28%27text/plain%27%2C%20%27green%27%29%3B%7D%3C/script%3E%3C/head%3E%3Cbody%3E%3Cdiv%20draggable%3D%22true%22%20ondragstart%3D%22start%28event%29%22/%3E%3C/body%3E%3C/html%3E">Green box</object></p>
<p>Drag green box above to the gray canvas below. Canvas should turn green when you drop green box on it.</p>
<p>
- <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
+ <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/005.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/005.xhtml
index fd9c9389e5b..655b4ae74fe 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/005.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/005.xhtml
@@ -4,18 +4,18 @@
<title>Drag and drop to iframe: dropping block element onto canvas</title>
<style type="text/css">
div
- {width:20px;
- height:20px;
- background-color:green;}
+ {width:20px;
+ height:20px;
+ background-color:green;}
iframe
- {width:200px;
- height:200px;
- border-style:none;}
+ {width:200px;
+ height:200px;
+ border-style:none;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body>
@@ -23,4 +23,4 @@ function start(event)
<p>Drag green box above to the gray canvas below. Canvas should turn green when you drop green box on it.</p>
<p><iframe src="helper-drop-here-canvas.xhtml">Canvas</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/006.xhtml
index 003df8f06fa..39274f4213a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/006.xhtml
@@ -4,17 +4,17 @@
<title>Drag and drop to object: dropping block element onto canvas</title>
<style type="text/css">
div
- {width:20px;
- height:20px;
- background-color:green;}
+ {width:20px;
+ height:20px;
+ background-color:green;}
object
- {width:200px;
- height:200px;}
+ {width:200px;
+ height:200px;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body>
@@ -22,4 +22,4 @@ function start(event)
<p>Drag green box above to the gray canvas below. Canvas should turn green when you drop green box on it.</p>
<p><object type="application/xhtml+xml" data="data:application/xhtml+xml,%3Chtml%20xmlns%3D%22http%3A//www.w3.org/1999/xhtml%22%3E%3Chead%3E%3Ctitle%3ECanvas%20drag%20and%20drop%3C/title%3E%3Cscript%20type%3D%22application/ecmascript%22%3Efunction%20paint%28color%29%7Bvar%20canvas%20%3D%20document.querySelector%28%27canvas%27%29%2Cc%20%3D%20canvas.getContext%28%272d%27%29%3Bc.fillStyle%20%3D%20color%3Bc.beginPath%28%29%3Bc.moveTo%280%2C0%29%3Bc.lineTo%28100%2C0%29%3Bc.lineTo%28100%2C100%29%3Bc.lineTo%280%2C100%29%3Bc.closePath%28%29%3Bc.fill%28%29%3B%7Dfunction%20start%28event%29%7Bevent.dataTransfer.effectAllowed%20%3D%20%27copy%27%3Bevent.dataTransfer.setData%28%27text/plain%27%2C%20document.querySelector%28%27input%27%29.value%29%3B%7D%3C/script%3E%3C/head%3E%3Cbody%20onload%3D%22paint%28%27gray%27%29%22%3E%3Cp%3E%3Ccanvas%20width%3D%22100%22%20height%3D%22100%22%20ondragenter%3D%22event.preventDefault%28%29%22%20ondragover%3D%22return%20false%22%20ondrop%3D%22paint%28event.dataTransfer.getData%28%27text/plain%27%29%29%22%3ECanvas%3C/canvas%3E%3C/p%3E%3C/body%3E%3C/html%3E">Canvas</object></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/007.xhtml
index 8ee869f0b4a..33ff5e611a5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/007.xhtml
@@ -4,9 +4,9 @@
<title>Drag and drop between iframes: dropping block element onto canvas</title>
<style type="text/css">
iframe
- {width:300px;
- height:200px;
- border-style:none;}
+ {width:300px;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
@@ -14,4 +14,4 @@ iframe
<p>Drag green box above to the gray canvas below. Canvas should turn green when you drop green box on it.</p>
<p><iframe src="helper-drop-here-canvas.xhtml">Canvas</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/008.xhtml
index d3f21acd728..aa857691651 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/008.xhtml
@@ -4,9 +4,9 @@
<title>Drag and drop from iframe to object: dropping block element onto canvas</title>
<style type="text/css">
iframe, object
- {width:300px;
- height:200px;
- border-style:none;}
+ {width:300px;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
@@ -14,4 +14,4 @@ iframe, object
<p>Drag green box above to the gray canvas below. Canvas should turn green when you drop green box on it.</p>
<p><object type="application/xhtml+xml" data="data:application/xhtml+xml,%3Chtml%20xmlns%3D%22http%3A//www.w3.org/1999/xhtml%22%3E%3Chead%3E%3Ctitle%3ECanvas%20drag%20and%20drop%3C/title%3E%3Cscript%20type%3D%22application/ecmascript%22%3Efunction%20paint%28color%29%7Bvar%20canvas%20%3D%20document.querySelector%28%27canvas%27%29%2Cc%20%3D%20canvas.getContext%28%272d%27%29%3Bc.fillStyle%20%3D%20color%3Bc.beginPath%28%29%3Bc.moveTo%280%2C0%29%3Bc.lineTo%28100%2C0%29%3Bc.lineTo%28100%2C100%29%3Bc.lineTo%280%2C100%29%3Bc.closePath%28%29%3Bc.fill%28%29%3B%7Dfunction%20start%28event%29%7Bevent.dataTransfer.effectAllowed%20%3D%20%27copy%27%3Bevent.dataTransfer.setData%28%27text/plain%27%2C%20document.querySelector%28%27input%27%29.value%29%3B%7D%3C/script%3E%3C/head%3E%3Cbody%20onload%3D%22paint%28%27gray%27%29%22%3E%3Cp%3E%3Ccanvas%20width%3D%22100%22%20height%3D%22100%22%20ondragenter%3D%22event.preventDefault%28%29%22%20ondragover%3D%22return%20false%22%20ondrop%3D%22paint%28event.dataTransfer.getData%28%27text/plain%27%29%29%22%3ECanvas%3C/canvas%3E%3C/p%3E%3C/body%3E%3C/html%3E">Canvas</object></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/009.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/009.xhtml
index 9f73037bb0a..94e95c6a98b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/009.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/009.xhtml
@@ -4,8 +4,8 @@
<title>Drag and drop between objects: dropping block element onto canvas</title>
<style type="text/css">
object
- {width:300px;
- height:200px;}
+ {width:300px;
+ height:200px;}
</style>
</head>
<body>
@@ -13,4 +13,4 @@ object
<p>Drag green box above to the gray canvas below. Canvas should turn green when you drop green box on it.</p>
<p><object type="application/xhtml+xml" data="data:application/xhtml+xml,%3Chtml%20xmlns%3D%22http%3A//www.w3.org/1999/xhtml%22%3E%3Chead%3E%3Ctitle%3ECanvas%20drag%20and%20drop%3C/title%3E%3Cscript%20type%3D%22application/ecmascript%22%3Efunction%20paint%28color%29%7Bvar%20canvas%20%3D%20document.querySelector%28%27canvas%27%29%2Cc%20%3D%20canvas.getContext%28%272d%27%29%3Bc.fillStyle%20%3D%20color%3Bc.beginPath%28%29%3Bc.moveTo%280%2C0%29%3Bc.lineTo%28100%2C0%29%3Bc.lineTo%28100%2C100%29%3Bc.lineTo%280%2C100%29%3Bc.closePath%28%29%3Bc.fill%28%29%3B%7Dfunction%20start%28event%29%7Bevent.dataTransfer.effectAllowed%20%3D%20%27copy%27%3Bevent.dataTransfer.setData%28%27text/plain%27%2C%20document.querySelector%28%27input%27%29.value%29%3B%7D%3C/script%3E%3C/head%3E%3Cbody%20onload%3D%22paint%28%27gray%27%29%22%3E%3Cp%3E%3Ccanvas%20width%3D%22100%22%20height%3D%22100%22%20ondragenter%3D%22event.preventDefault%28%29%22%20ondragover%3D%22return%20false%22%20ondrop%3D%22paint%28event.dataTransfer.getData%28%27text/plain%27%29%29%22%3ECanvas%3C/canvas%3E%3C/p%3E%3C/body%3E%3C/html%3E">Canvas</object></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/010-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/010-1.xhtml
index 0f12e6fcd0f..19f43581c7f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/010-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/010-1.xhtml
@@ -4,18 +4,18 @@
<title>Canvas drag and drop: helper file</title>
<style type="text/css">
div
- {width:20px;
- height:20px;
- background-color:green;}
+ {width:20px;
+ height:20px;
+ background-color:green;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body>
<div draggable="true" ondragstart="start(event)"/>
<p>Drag green box above to the gray canvas below. Canvas should turn green when you drop green box on it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/012.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/012.xhtml
index d2069142c80..b4f30c652b0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/012.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/012.xhtml
@@ -4,39 +4,39 @@
<title>Drag and drop and vertical scrolling: dropping block element onto canvas inside scrollable container</title>
<style type="text/css">
div[draggable]
- {width:20px;
- height:20px;
- background-color:green;}
+ {width:20px;
+ height:20px;
+ background-color:green;}
p + div
- {height:100px;
- width:150px;
- overflow-y:scroll;}
+ {height:100px;
+ width:150px;
+ overflow-y:scroll;}
canvas
- {display:block;
- margin-top:100px;}
+ {display:block;
+ margin-top:100px;}
</style>
<script type="application/ecmascript">
function paint(color)
- {var canvas = document.querySelector('canvas'),
- c = canvas.getContext('2d');
- c.fillStyle = color;
- c.beginPath();
- c.moveTo(0,0);
- c.lineTo(100,0);
- c.lineTo(100,100);
- c.lineTo(0,100);
- c.closePath();
- c.fill();}
+ {var canvas = document.querySelector('canvas'),
+ c = canvas.getContext('2d');
+ c.fillStyle = color;
+ c.beginPath();
+ c.moveTo(0,0);
+ c.lineTo(100,0);
+ c.lineTo(100,100);
+ c.lineTo(0,100);
+ c.closePath();
+ c.fill();}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body onload="paint('gray')">
<div draggable="true" ondragstart="start(event)"/>
<p>You should be able to drag green box above to the gray canvas at the bottom of scrollable container (dragging towards the bottom edge triggers scrolling). Canvas should be repainted to match dropped color.</p>
<div>
- <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
+ <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/013.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/013.xhtml
index c63a5d4d056..e2e3646c869 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/013.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/013.xhtml
@@ -4,39 +4,39 @@
<title>Drag and drop and horizontal scrolling: dropping block element onto canvas inside scrollable container</title>
<style type="text/css">
div[draggable]
- {width:20px;
- height:20px;
- background-color:green;}
+ {width:20px;
+ height:20px;
+ background-color:green;}
p + div
- {height:150px;
- width:100px;
- overflow-x:scroll;}
+ {height:150px;
+ width:100px;
+ overflow-x:scroll;}
canvas
- {display:block;
- margin-left:100px;}
+ {display:block;
+ margin-left:100px;}
</style>
<script type="application/ecmascript">
function paint(color)
- {var canvas = document.querySelector('canvas'),
- c = canvas.getContext('2d');
- c.fillStyle = color;
- c.beginPath();
- c.moveTo(0,0);
- c.lineTo(100,0);
- c.lineTo(100,100);
- c.lineTo(0,100);
- c.closePath();
- c.fill();}
+ {var canvas = document.querySelector('canvas'),
+ c = canvas.getContext('2d');
+ c.fillStyle = color;
+ c.beginPath();
+ c.moveTo(0,0);
+ c.lineTo(100,0);
+ c.lineTo(100,100);
+ c.lineTo(0,100);
+ c.closePath();
+ c.fill();}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body onload="paint('gray')">
<div draggable="true" ondragstart="start(event)"/>
<p>You should be able to drag green box above to the gray canvas at the right edge of scrollable container (dragging towards the right edge triggers scrolling). Canvas should be repainted to match dropped color.</p>
<div>
- <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
+ <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/014.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/014.xhtml
index 561597eeaa8..425c97b6c48 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/014.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/014.xhtml
@@ -4,39 +4,39 @@
<title>Drag and drop and scrolling: dropping block element onto canvas inside scrollable container</title>
<style type="text/css">
div[draggable]
- {width:20px;
- height:20px;
- background-color:green;}
+ {width:20px;
+ height:20px;
+ background-color:green;}
p + div
- {height:100px;
- width:100px;
- overflow:scroll;}
+ {height:100px;
+ width:100px;
+ overflow:scroll;}
canvas
- {display:block;
- margin:100px 0 0 100px;}
+ {display:block;
+ margin:100px 0 0 100px;}
</style>
<script type="application/ecmascript">
function paint(color)
- {var canvas = document.querySelector('canvas'),
- c = canvas.getContext('2d');
- c.fillStyle = color;
- c.beginPath();
- c.moveTo(0,0);
- c.lineTo(100,0);
- c.lineTo(100,100);
- c.lineTo(0,100);
- c.closePath();
- c.fill();}
+ {var canvas = document.querySelector('canvas'),
+ c = canvas.getContext('2d');
+ c.fillStyle = color;
+ c.beginPath();
+ c.moveTo(0,0);
+ c.lineTo(100,0);
+ c.lineTo(100,100);
+ c.lineTo(0,100);
+ c.closePath();
+ c.fill();}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body onload="paint('gray')">
<div draggable="true" ondragstart="start(event)"/>
<p>You should be able to drag green box above to the gray canvas in the right-bottom corner of the scrollable container (dragging towards the corner triggers scrolling). Canvas should be repainted to match dropped color.</p>
<div>
- <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
+ <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.manual.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.manual.xhtml
index 2a2c7f547cc..08512add47d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.manual.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/cross-domain/001.manual.xhtml
@@ -5,22 +5,22 @@
<script src="../../resources/crossorigin.sub.js"></script>
<style type="text/css">
div {
- width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;
+ width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;
}
p:first-child {
- padding-left:12px;
+ padding-left:12px;
}
#image { visibility: hidden; }
</style>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true">Canvas</canvas>
</p>
<p>Drag the navy square above to the box below.</p>
<div></div>
@@ -30,29 +30,29 @@ p:first-child {
document.getElementsByTagName("img")[0].src = crossOriginUrl("www", "../../resources/100x100-navy.png");
window.onload = function() {
- var canvas = document.getElementsByTagName('canvas')[0], div = document.getElementsByTagName('div')[0], failed = [];
- var context = canvas.getContext('2d');
- var image = document.getElementById('image');
- context.drawImage(image, 0, 0);
+ var canvas = document.getElementsByTagName('canvas')[0], div = document.getElementsByTagName('div')[0], failed = [];
+ var context = canvas.getContext('2d');
+ var image = document.getElementById('image');
+ context.drawImage(image, 0, 0);
div.ondragover = div.ondragenter = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
+ };
+ div.ondrop = canvas.ondragstart = function(e) {
+ if( e.type == 'dragstart' ) {
+ e.dataTransfer.setData('Text', 'dummy text');
+ e.dataTransfer.dropEffect = 'copy';
+ }
+ for( var i = 0; i < e.dataTransfer.types.length; i++ ) {
+ if( e.dataTransfer.types[i].match(/image\//) ) {
+ failed[failed.length] = e.dataTransfer.types[i];
+ }
+ }
+ if( e.type == 'drop' ) {
+ e.preventDefault();
+ document.getElementsByTagName('p')[1].innerHTML = failed.length ? ( 'FAIL (found ' + failed.join() + ')' ) : 'PASS';
+ }
};
- div.ondrop = canvas.ondragstart = function(e) {
- if( e.type == 'dragstart' ) {
- e.dataTransfer.setData('Text', 'dummy text');
- e.dataTransfer.dropEffect = 'copy';
- }
- for( var i = 0; i < e.dataTransfer.types.length; i++ ) {
- if( e.dataTransfer.types[i].match(/image\//) ) {
- failed[failed.length] = e.dataTransfer.types[i];
- }
- }
- if( e.type == 'drop' ) {
- e.preventDefault();
- document.getElementsByTagName('p')[1].innerHTML = failed.length ? ( 'FAIL (found ' + failed.join() + ')' ) : 'PASS';
- }
- };
};
]]></script>
</body>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/helper-drag-me-green-box.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/helper-drag-me-green-box.xhtml
index cb722babd4e..c6a8fca4c0f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/helper-drag-me-green-box.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/helper-drag-me-green-box.xhtml
@@ -4,16 +4,16 @@
<title>Canvas drag and drop: helper file</title>
<style type="text/css">
div
- {width:20px;
- height:20px;
- background-color:green;}
+ {width:20px;
+ height:20px;
+ background-color:green;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body>
<div draggable="true" ondragstart="start(event)"/></body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/helper-drop-here-canvas.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/helper-drop-here-canvas.xhtml
index dcbf7e33f1f..db305689f55 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/canvas/helper-drop-here-canvas.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/canvas/helper-drop-here-canvas.xhtml
@@ -4,24 +4,24 @@
<title>Canvas drag and drop: helper file</title>
<script type="application/ecmascript">
function paint(color)
- {var canvas = document.querySelector('canvas'),
- c = canvas.getContext('2d');
- c.fillStyle = color;
- c.beginPath();
- c.moveTo(0,0);
- c.lineTo(100,0);
- c.lineTo(100,100);
- c.lineTo(0,100);
- c.closePath();
- c.fill();}
+ {var canvas = document.querySelector('canvas'),
+ c = canvas.getContext('2d');
+ c.fillStyle = color;
+ c.beginPath();
+ c.moveTo(0,0);
+ c.lineTo(100,0);
+ c.lineTo(100,100);
+ c.lineTo(0,100);
+ c.closePath();
+ c.fill();}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain', 'green');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain', 'green');}
</script>
</head>
<body onload="paint('gray')">
<p>
- <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
+ <canvas width="100" height="100" ondragenter="event.preventDefault()" ondragover="return false" ondrop="paint(event.dataTransfer.getData('text/plain'))">Canvas</canvas>
</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/crashers/dialog-001.html b/tests/wpt/web-platform-tests/html/editing/dnd/crashers/dialog-001.html
index 23484c7bdd9..9ab62787b0d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/crashers/dialog-001.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/crashers/dialog-001.html
@@ -24,10 +24,10 @@
<script>
window.onload = function() {
- var doneonce = false;
+ var doneonce = false;
document.getElementsByTagName('div')[0].ondragstart = function(e) {
- alert( doneonce ? 'Dismiss this dialog. PASS if the browser does not crash.' : 'Dismiss this dialog. The browser should not crash. Without re-focusing the page first, try dragging the orange square a second time. If a second alert does not appear, release the drag, and then try dragging the orange square a third time.' );
- doneonce = true;
+ alert( doneonce ? 'Dismiss this dialog. PASS if the browser does not crash.' : 'Dismiss this dialog. The browser should not crash. Without re-focusing the page first, try dragging the orange square a second time. If a second alert does not appear, release the drag, and then try dragging the orange square a third time.' );
+ doneonce = true;
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/001-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/001-1.html
index 8eb79d17f04..1b3540b0350 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/001-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/001-1.html
@@ -12,31 +12,31 @@
window.onload = function() {
var blue = document.getElementsByTagName('div')[0], fails = [];
blue.ondragover = blue.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
if( e.dataTransfer.getData('text') ) {
- fails[fails.length] = '"' + e.dataTransfer.getData('text') + '" exposed during event ' + e.type;
- }
+ fails[fails.length] = '"' + e.dataTransfer.getData('text') + '" exposed during event ' + e.type;
+ }
};
- blue.ondrop = function(e) {
- e.preventDefault();
+ blue.ondrop = function(e) {
+ e.preventDefault();
if( !e.dataTransfer.types.length ) {
- fails[fails.length] = 'no types found during event drop';
- }
- var foundtext = false;
+ fails[fails.length] = 'no types found during event drop';
+ }
+ var foundtext = false;
for( var i = 0; i < e.dataTransfer.types.length; i++ ) {
- if( e.dataTransfer.types[i] == 'text/plain' ) {
- foundtext = true;
- break;
- }
- }
- if( !foundtext ) {
- fails[fails.length] = 'text/plain type not found during event drop';
- }
+ if( e.dataTransfer.types[i] == 'text/plain' ) {
+ foundtext = true;
+ break;
+ }
+ }
+ if( !foundtext ) {
+ fails[fails.length] = 'text/plain type not found during event drop';
+ }
if( e.dataTransfer.getData('text') != 'dummy text' ) {
- fails[fails.length] = 'getData returned ' + e.dataTransfer.getData('text') + ' instead of "dummy text"';
- }
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
+ fails[fails.length] = 'getData returned ' + e.dataTransfer.getData('text') + ' instead of "dummy text"';
+ }
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/001.html b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/001.html
index 02012e86bbc..dd9906e8c1e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/001.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/001.html
@@ -13,7 +13,7 @@ window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text', 'dummy text');
+ e.dataTransfer.setData('text', 'dummy text');
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.manual.html
index b64038e915b..cd7c18c888e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/002.manual.html
@@ -14,7 +14,7 @@ window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text', 'dummy text');
+ e.dataTransfer.setData('text', 'dummy text');
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/003-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/003-1.html
index b1357c10a45..2cefd83209a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/003-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/003-1.html
@@ -12,88 +12,88 @@
window.onload = function() {
var blue = document.getElementsByTagName('div')[0], fails = [];
blue.ondragover = blue.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
- if( !parent.evs[e.type] ) { parent.evs[e.type] = {}; }
- parent.evs[e.type].dataTransfer = e.dataTransfer;
- parent.evs[e.type].items = e.dataTransfer.items;
- parent.evs[e.type].types = e.dataTransfer.types;
- parent.evs[e.type].files = e.dataTransfer.files;
- if( parent.evs[e.type].dataTransfer != e.dataTransfer ) {
- fails[fails.length] = '.dataTransfer is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.items ) {
- fails[fails.length] = '.items is not returning anything during '+e.type;
- } else if( parent.evs[e.type].items !== e.dataTransfer.items ) {
- fails[fails.length] = '.items is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.types ) {
- fails[fails.length] = '.types is not returning anything during '+e.type;
- } else if( parent.evs[e.type].types !== e.dataTransfer.types ) {
- fails[fails.length] = '.types is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.files ) {
- fails[fails.length] = '.files is not returning anything during '+e.type;
- } else if( parent.evs[e.type].files !== e.dataTransfer.files ) {
- fails[fails.length] = '.files is not returning the same object during '+e.type;
- }
- //http://dev.w3.org/html5/spec/dnd.html#datatransfer
- //"The * attribute must return a * object associated with the DataTransfer object."
- //Note that it is associated with the DataTransfer object, *not* the data store
- //http://dev.w3.org/html5/spec/dnd.html#dragevent
- //"when a user agent is required to fire a DND event named e at an element, using a particular drag data store...
- //Let dataTransfer be a newly created DataTransfer object associated with the given drag data store."
- //A new DataTransfer object therefore means a new set of properties, not the same ones as last event
- if( parent.evs.dragstart.dataTransfer === e.dataTransfer ) {
- fails[fails.length] = '.dataTransfer is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.items && parent.evs.dragstart.items === e.dataTransfer.items ) {
- fails[fails.length] = '.items is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.types && parent.evs.dragstart.types === e.dataTransfer.types ) {
- fails[fails.length] = '.types is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.files && parent.evs.dragstart.files === e.dataTransfer.files ) {
- fails[fails.length] = '.files is returning the same object during '+e.type+' as it did during dragstart';
- }
+ if( !parent.evs[e.type] ) { parent.evs[e.type] = {}; }
+ parent.evs[e.type].dataTransfer = e.dataTransfer;
+ parent.evs[e.type].items = e.dataTransfer.items;
+ parent.evs[e.type].types = e.dataTransfer.types;
+ parent.evs[e.type].files = e.dataTransfer.files;
+ if( parent.evs[e.type].dataTransfer != e.dataTransfer ) {
+ fails[fails.length] = '.dataTransfer is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.items ) {
+ fails[fails.length] = '.items is not returning anything during '+e.type;
+ } else if( parent.evs[e.type].items !== e.dataTransfer.items ) {
+ fails[fails.length] = '.items is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.types ) {
+ fails[fails.length] = '.types is not returning anything during '+e.type;
+ } else if( parent.evs[e.type].types !== e.dataTransfer.types ) {
+ fails[fails.length] = '.types is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = '.files is not returning anything during '+e.type;
+ } else if( parent.evs[e.type].files !== e.dataTransfer.files ) {
+ fails[fails.length] = '.files is not returning the same object during '+e.type;
+ }
+ //http://dev.w3.org/html5/spec/dnd.html#datatransfer
+ //"The * attribute must return a * object associated with the DataTransfer object."
+ //Note that it is associated with the DataTransfer object, *not* the data store
+ //http://dev.w3.org/html5/spec/dnd.html#dragevent
+ //"when a user agent is required to fire a DND event named e at an element, using a particular drag data store...
+ //Let dataTransfer be a newly created DataTransfer object associated with the given drag data store."
+ //A new DataTransfer object therefore means a new set of properties, not the same ones as last event
+ if( parent.evs.dragstart.dataTransfer === e.dataTransfer ) {
+ fails[fails.length] = '.dataTransfer is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.items && parent.evs.dragstart.items === e.dataTransfer.items ) {
+ fails[fails.length] = '.items is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.types && parent.evs.dragstart.types === e.dataTransfer.types ) {
+ fails[fails.length] = '.types is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.files && parent.evs.dragstart.files === e.dataTransfer.files ) {
+ fails[fails.length] = '.files is returning the same object during '+e.type+' as it did during dragstart';
+ }
};
- blue.ondrop = function(e) {
- parent.evs[e.type] = {};
- parent.evs[e.type].dataTransfer = e.dataTransfer;
- parent.evs[e.type].items = e.dataTransfer.items;
- parent.evs[e.type].types = e.dataTransfer.types;
- parent.evs[e.type].files = e.dataTransfer.files;
- if( parent.evs[e.type].dataTransfer !== e.dataTransfer ) {
- fails[fails.length] = '.dataTransfer is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.items ) {
- fails[fails.length] = '.items is not returning anything during '+e.type;
- } else if( parent.evs[e.type].items !== e.dataTransfer.items ) {
- fails[fails.length] = '.items is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.types ) {
- fails[fails.length] = '.types is not returning anything during '+e.type;
- } else if( parent.evs[e.type].types !== e.dataTransfer.types ) {
- fails[fails.length] = '.types is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.files ) {
- fails[fails.length] = '.files is not returning anything during '+e.type;
- } else if( parent.evs[e.type].files !== e.dataTransfer.files ) {
- fails[fails.length] = '.files is not returning the same object during '+e.type;
- }
- if( parent.evs.dragstart.dataTransfer === e.dataTransfer ) {
- fails[fails.length] = '.dataTransfer is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.items && parent.evs.dragstart.items === e.dataTransfer.items ) {
- fails[fails.length] = '.items is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.types && parent.evs.dragstart.types === e.dataTransfer.types ) {
- fails[fails.length] = '.types is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.files && parent.evs.dragstart.files === e.dataTransfer.files ) {
- fails[fails.length] = '.files is returning the same object during '+e.type+' as it did during dragstart';
- }
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
+ blue.ondrop = function(e) {
+ parent.evs[e.type] = {};
+ parent.evs[e.type].dataTransfer = e.dataTransfer;
+ parent.evs[e.type].items = e.dataTransfer.items;
+ parent.evs[e.type].types = e.dataTransfer.types;
+ parent.evs[e.type].files = e.dataTransfer.files;
+ if( parent.evs[e.type].dataTransfer !== e.dataTransfer ) {
+ fails[fails.length] = '.dataTransfer is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.items ) {
+ fails[fails.length] = '.items is not returning anything during '+e.type;
+ } else if( parent.evs[e.type].items !== e.dataTransfer.items ) {
+ fails[fails.length] = '.items is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.types ) {
+ fails[fails.length] = '.types is not returning anything during '+e.type;
+ } else if( parent.evs[e.type].types !== e.dataTransfer.types ) {
+ fails[fails.length] = '.types is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = '.files is not returning anything during '+e.type;
+ } else if( parent.evs[e.type].files !== e.dataTransfer.files ) {
+ fails[fails.length] = '.files is not returning the same object during '+e.type;
+ }
+ if( parent.evs.dragstart.dataTransfer === e.dataTransfer ) {
+ fails[fails.length] = '.dataTransfer is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.items && parent.evs.dragstart.items === e.dataTransfer.items ) {
+ fails[fails.length] = '.items is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.types && parent.evs.dragstart.types === e.dataTransfer.types ) {
+ fails[fails.length] = '.types is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.files && parent.evs.dragstart.files === e.dataTransfer.files ) {
+ fails[fails.length] = '.files is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/003.html b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/003.html
index 6b7c4d07458..ba44f9b7700 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/003.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/cross-document/003.html
@@ -14,12 +14,12 @@ window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text', 'dummy text');
- evs[e.type] = {};
- evs[e.type].dataTransfer = e.dataTransfer;
- evs[e.type].items = e.dataTransfer.items;
- evs[e.type].types = e.dataTransfer.types;
- evs[e.type].files = e.dataTransfer.files;
+ e.dataTransfer.setData('text', 'dummy text');
+ evs[e.type] = {};
+ evs[e.type].dataTransfer = e.dataTransfer;
+ evs[e.type].items = e.dataTransfer.items;
+ evs[e.type].types = e.dataTransfer.types;
+ evs[e.type].files = e.dataTransfer.files;
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/001.xhtml
index a6f53871042..d46170d61b2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/001.xhtml
@@ -4,51 +4,51 @@
<title>dataTransfer.setData/getData during canvas drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
@@ -57,15 +57,15 @@ function say(it)
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
data[1] = canvas.toDataURL('image/png');
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/002.xhtml
index 5bbfb9a4ddd..b9fb47d7655 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/002.xhtml
@@ -4,44 +4,44 @@
<title>dataTransfer.setData/getData during PNG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -51,4 +51,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/003.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/003.xhtml
index dbd5851a501..e7baaa37ea0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/003.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/003.xhtml
@@ -4,45 +4,45 @@
<title>dataTransfer.setData/getData during SVG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -52,4 +52,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/004.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/004.xhtml
index cdf2d16c7a7..c7f8dc8db61 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/004.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/004.xhtml
@@ -4,46 +4,46 @@
<title>dataTransfer.setData/getData during text input selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['Drag me', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -53,4 +53,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/005.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/005.xhtml
index 949e6c3ca7a..78655c82b7d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/005.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/005.xhtml
@@ -4,46 +4,46 @@
<title>dataTransfer.setData/getData during selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['Drag me', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -53,4 +53,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/006.xhtml
index 24e30bd8307..c6c96842a9a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/006.xhtml
@@ -4,45 +4,45 @@
<title>dataTransfer.setData/getData during link drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['data:text/plain,1', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -52,4 +52,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/007.xhtml
index 66c89a24fdf..b6b3cdafe6f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/007.xhtml
@@ -4,47 +4,47 @@
<title>dataTransfer.setData/getData during block element drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:green;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('p + div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -54,4 +54,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/008.xhtml
index 1ff328d9e9c..2d80f751f07 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/008.xhtml
@@ -4,46 +4,46 @@
<title>Influence of reload during drag and drop on datastore</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:green;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- window.location.reload();}
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ window.location.reload();}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('p + div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -53,4 +53,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/009-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/009-1.xhtml
index ed55dc5a42b..fd2c117524a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/009-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/009-1.xhtml
@@ -4,27 +4,27 @@
<title>Redirect during drag and drop: helper file</title>
<style type="text/css">
html, body
- {height:100%;}
+ {height:100%;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('body').setAttribute('style','background-color:teal;color:white;');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('body').setAttribute('style','background-color:teal;color:white;');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -32,4 +32,4 @@ function say(it)
<p>Drop box here. Page should turn green and test results should appear below.</p>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/009.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/009.xhtml
index d0719fdfd4c..9d6c321f63e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/009.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/009.xhtml
@@ -4,22 +4,22 @@
<title>Influence of redirect during drag and drop on datastore</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:navy;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:navy;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- window.location = '009-1.xhtml'}
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ window.location = '009-1.xhtml'}
]]>
</script>
</head>
@@ -27,4 +27,4 @@ function start(event)
<div draggable="true" ondragstart="start(event)"/>
<p>Try to drag box above. You should be redirected to the new page and be able to drop it there.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/010-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/010-1.xhtml
index 427624a6ff6..086ae709adc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/010-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/010-1.xhtml
@@ -4,24 +4,24 @@
<title>History navigation during drag and drop: helper file</title>
<style type="text/css">
div[ondragenter]
- {margin:200px 0 0 200px;
- width:200px;
- height:100px;
- color:white;
- background-color:navy;}
+ {margin:200px 0 0 200px;
+ width:200px;
+ height:100px;
+ color:white;
+ background-color:navy;}
div[ondragenter]:before
- {display:block;
- content:"";
- border-style:solid;
- position:relative;
- top:-50px;
- left:-200px;
- border-width:100px;
- border-color:transparent navy transparent transparent;}
+ {display:block;
+ content:"";
+ border-style:solid;
+ position:relative;
+ top:-50px;
+ left:-200px;
+ border-width:100px;
+ border-color:transparent navy transparent transparent;}
</style>
</head>
<body>
<p>Drag box to the blue arrow but don't drop it yet. You should be returned back to start page.</p>
<div ondragenter="event.preventDefault()" ondragover="history.go(-1)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/010.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/010.xhtml
index 9e32b36f32d..5df966ba1b9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/010.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/010.xhtml
@@ -4,37 +4,37 @@
<title>Influence of history navigation during drag and drop on datastore</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:green;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- window.location = '010-1.xhtml'}
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ window.location = '010-1.xhtml'}
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('p + div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -44,4 +44,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/011.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/011.xhtml
index 6b51611ebfb..96e38993f0e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/011.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/011.xhtml
@@ -4,23 +4,23 @@
<title>Drag and drop datastore: dragging element to iframe</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:navy;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:navy;}
iframe
- {width:500px;
- height:500px;}
+ {width:500px;
+ height:500px;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ }
]]>
</script>
</head>
@@ -29,4 +29,4 @@ function start(event)
<p>Drag box above to the frame below.</p>
<iframe src="helper-drop-box-here.xhtml">XHTML document</iframe>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/012.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/012.xhtml
index b80ed24fa16..42986c0b588 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/012.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/012.xhtml
@@ -4,24 +4,24 @@
<title>Drag and drop datastore: dragging element to object</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:navy;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:navy;}
object
- {width:500px;
- height:500px;
- border:solid medium navy;}
+ {width:500px;
+ height:500px;
+ border:solid medium navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ }
]]>
</script>
</head>
@@ -30,4 +30,4 @@ function start(event)
<p>Drag box above to the frame below.</p>
<object type="application/xhtml+xml" data="helper-drop-box-here.xhtml">XHTML document</object>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/013-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/013-1.xhtml
index d724679e6d1..538a9645527 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/013-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/013-1.xhtml
@@ -4,20 +4,20 @@
<title>Drag and drop datastore: helper file</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:navy;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ }
]]>
</script>
</head>
@@ -25,4 +25,4 @@ function start(event)
<div draggable="true" ondragstart="start(event)"/>
<p>Drag box above to the frame below.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/014-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/014-1.xhtml
index 7a506931777..1163bde5afc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/014-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/014-1.xhtml
@@ -4,45 +4,45 @@
<title>Drag and drop datastore: helper file</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['data:text/plain,1', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -52,4 +52,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/015-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/015-manual.html
index 74fff038d4b..6bb3cad3aee 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/015-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/015-manual.html
@@ -1,62 +1,62 @@
<!doctype html>
<html>
- <head>
- <title>Using dataTransfer in new thread</title>
- <style type="text/css">
+ <head>
+ <title>Using dataTransfer in new thread</title>
+ <style type="text/css">
blockquote { height: 100px; width: 100px; background: orange; margin: 0; padding: 0; float: left; }
blockquote + blockquote { background: blue; }
blockquote + blockquote + blockquote { background: fuchsia; }
blockquote + div { clear: left; }
- </style>
- <script type="text/javascript" src="/resources/testharness.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript">
setup(function () {},{explicit_done:true,explicit_timeout:true});
window.onload = function () {
- var orange = document.getElementsByTagName('blockquote')[0],
- blue = document.getElementsByTagName('blockquote')[1],
- fuchsia = document.getElementsByTagName('blockquote')[2],
- evtdone = {};
+ var orange = document.getElementsByTagName('blockquote')[0],
+ blue = document.getElementsByTagName('blockquote')[1],
+ fuchsia = document.getElementsByTagName('blockquote')[2],
+ evtdone = {};
- orange.ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dragstart real data');
- var dataTransfer = e.dataTransfer;
- setTimeout(function () {
- test(function () {
- assert_equals( dataTransfer.getData('text'), '', 'step 1' );
- dataTransfer.setData('text','new thread after dragstart');
- assert_equals( dataTransfer.getData('text'), '', 'step 2' );
- },'dragstart data store should be protected after new thread starts');
- },0);
- };
+ orange.ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dragstart real data');
+ var dataTransfer = e.dataTransfer;
+ setTimeout(function () {
+ test(function () {
+ assert_equals( dataTransfer.getData('text'), '', 'step 1' );
+ dataTransfer.setData('text','new thread after dragstart');
+ assert_equals( dataTransfer.getData('text'), '', 'step 2' );
+ },'dragstart data store should be protected after new thread starts');
+ },0);
+ };
- fuchsia.ondragenter = fuchsia.ondragover = function (e) {
- e.preventDefault();
- };
+ fuchsia.ondragenter = fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- var dataTransfer = e.dataTransfer;
- setTimeout(function () {
- test(function () {
- assert_equals( dataTransfer.getData('text'), '', 'step 1' );
- dataTransfer.setData('text','new thread after dragstart');
- assert_equals( dataTransfer.getData('text'), '', 'step 2' );
- },'drop data store should be protected after new thread starts');
- done();
- },0);
- };
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ var dataTransfer = e.dataTransfer;
+ setTimeout(function () {
+ test(function () {
+ assert_equals( dataTransfer.getData('text'), '', 'step 1' );
+ dataTransfer.setData('text','new thread after dragstart');
+ assert_equals( dataTransfer.getData('text'), '', 'step 2' );
+ },'drop data store should be protected after new thread starts');
+ done();
+ },0);
+ };
};
- </script>
- </head>
- <body>
- <p>Drag the orange square over the blue square then the fuchsia square, then release it.</p>
- <blockquote draggable="true"></blockquote>
- <blockquote></blockquote>
- <blockquote></blockquote>
- <div id="log"></div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <p>Drag the orange square over the blue square then the fuchsia square, then release it.</p>
+ <blockquote draggable="true"></blockquote>
+ <blockquote></blockquote>
+ <blockquote></blockquote>
+ <div id="log"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/016.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/016.xhtml
index 5c5a49a2aff..6370fe52400 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/016.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/016.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.clearData during PNG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,37 +15,37 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:text/plain,FAIL', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
l = 0;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.clearData(dataTypes[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length > l)
- {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -55,4 +55,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/017.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/017.xhtml
index 2cf031c1238..ef0cf9fe11f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/017.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/017.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.clearData during SVG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,37 +15,37 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
l = 0;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.clearData(dataTypes[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length > l)
- {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -55,4 +55,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/018.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/018.xhtml
index ecf703b7325..f68d722a994 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/018.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/018.xhtml
@@ -4,11 +4,11 @@
<title>dataTransfer.clearData during text input selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -16,37 +16,37 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
l = 0;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.clearData(dataTypes[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length > l)
- {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -56,4 +56,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/019.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/019.xhtml
index 2aa803c614b..0734a231647 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/019.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/019.xhtml
@@ -4,11 +4,11 @@
<title>dataTransfer.clearData during selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -16,37 +16,37 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
l = 0;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.clearData(dataTypes[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length > l)
- {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -56,4 +56,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/020.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/020.xhtml
index 73689e1da67..b57ab102adc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/020.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/020.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.clearData during link drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,43 +15,43 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:text/plain,FAIL', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
l = 0;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.clearData(dataTypes[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length > l)
- {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -61,4 +61,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/021.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/021.xhtml
index a32ce7280f1..428a5cf3927 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/021.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/021.xhtml
@@ -4,12 +4,12 @@
<title>dataTransfer.clearData during block element drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:green;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -17,37 +17,37 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
l = 0;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.clearData(dataTypes[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length > l)
- {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('p + div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -57,4 +57,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/022.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/022.xhtml
index 1e1eb64ceb4..660a4b44354 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/022.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/022.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.clearData during canvas drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,43 +15,43 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
l = 0;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.clearData(dataTypes[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length > l)
- {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length > l)
+ {say('items.length (dragover) : FAIL' + event.dataTransfer.items.length)}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length < l)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
@@ -60,15 +60,15 @@ function say(it)
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
data[1] = canvas.toDataURL('image/png');
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/023.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/023.xhtml
index bf58316e61b..fd236ca98af 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/023.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/023.xhtml
@@ -4,45 +4,45 @@
<title>dataTransfer.clearData and reload during block element drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:green;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.clearData(dataTypes[i]);}
- window.location.reload();}
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.clearData(dataTypes[i]);}
+ window.location.reload();}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- }
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ }
function dataDrop(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('p + div').setAttribute('style','background-color:green');}
+ {for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -52,4 +52,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/024.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/024.xhtml
index 5629bd746c5..93a35f31602 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/024.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/024.xhtml
@@ -4,46 +4,46 @@
<title>Clear datastore data during PNG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['data:text/plain,FAIL', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- event.dataTransfer.clearData();
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length != 0)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -53,4 +53,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/025.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/025.xhtml
index 7ac04e6e31f..6b803518b72 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/025.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/025.xhtml
@@ -4,46 +4,46 @@
<title>Clear datastore data during SVG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- event.dataTransfer.clearData();
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length != 0)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -53,4 +53,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/026.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/026.xhtml
index 8b2fd371406..50523e2d90b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/026.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/026.xhtml
@@ -4,47 +4,47 @@
<title>Clear datastore data during text input selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- event.dataTransfer.clearData();
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length != 0)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -54,4 +54,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/027.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/027.xhtml
index ecd57b3acef..9d69ddddc98 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/027.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/027.xhtml
@@ -4,11 +4,11 @@
<title>Clear datastore data during selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -16,36 +16,36 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'],
l = 0;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- event.dataTransfer.clearData();
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length != 0)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -55,4 +55,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/028.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/028.xhtml
index e6aec005ea3..145864fce39 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/028.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/028.xhtml
@@ -4,52 +4,52 @@
<title>Clear datastore data during link drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['data:text/plain,FAIL', 'FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- event.dataTransfer.clearData();
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length != 0)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -59,4 +59,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/029.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/029.xhtml
index e8471a19878..f752f3c9002 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/029.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/029.xhtml
@@ -4,48 +4,48 @@
<title>Clear datastore data during block element drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:green;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- event.dataTransfer.clearData();
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length != 0)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('p + div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -55,4 +55,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/030.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/030.xhtml
index 31263c3f53b..ad9bee4ce13 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/030.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/030.xhtml
@@ -4,52 +4,52 @@
<title>Clear datastore data during canvas drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['FAIL', 'data:text/plain,FAIL', '<result>FAIL</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">FAIL</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>FAIL</p></body></html>', 'FAIL'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- l = event.dataTransfer.items.length;
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- event.dataTransfer.clearData();
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ l = event.dataTransfer.items.length;
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ event.dataTransfer.clearData();
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length != 0)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length != 0)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length == 0)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == '')?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green and test results should appear below.</p>
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
@@ -58,15 +58,15 @@ function say(it)
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
data[1] = canvas.toDataURL('image/png');
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/031.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/031.xhtml
index a275fcb748c..138142632ca 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/031.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/031.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.items during canvas drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,110 +15,110 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
- {delete event.dataTransfer.items[i-1]}
- }
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
+ {delete event.dataTransfer.items[i-1]}
+ }
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green.</p>
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
@@ -127,15 +127,15 @@ function say(it)
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
data[1] = canvas.toDataURL('image/png');
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/032.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/032.xhtml
index 9aca2959767..130ce38821f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/032.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/032.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.items during PNG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,104 +15,104 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
- {delete event.dataTransfer.items[i-1]}
- }
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
+ {delete event.dataTransfer.items[i-1]}
+ }
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -122,4 +122,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/033.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/033.xhtml
index d7aa67d3a32..a91be799174 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/033.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/033.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.items during SVG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,104 +15,104 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
- {delete event.dataTransfer.items[i-1]}
- }
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
+ {delete event.dataTransfer.items[i-1]}
+ }
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -122,4 +122,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/034.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/034.xhtml
index 1eeb227fc11..89a1a78dd31 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/034.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/034.xhtml
@@ -4,11 +4,11 @@
<title>dataTransfer.items during text input selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -16,104 +16,104 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['Drag me', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
- {delete event.dataTransfer.items[i-1]}
- }
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
+ {delete event.dataTransfer.items[i-1]}
+ }
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -123,4 +123,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/035.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/035.xhtml
index 797f7669e30..37b85bdb0b8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/035.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/035.xhtml
@@ -4,11 +4,11 @@
<title>dataTransfer.items during selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -16,104 +16,104 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['Drag me', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
- {delete event.dataTransfer.items[i-1]}
- }
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
+ {delete event.dataTransfer.items[i-1]}
+ }
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -123,4 +123,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/036.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/036.xhtml
index ce4bd16abb6..4799bc222ef 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/036.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/036.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.items during link drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,104 +15,104 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:text/plain,1', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
- {delete event.dataTransfer.items[i-1]}
- }
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
+ {delete event.dataTransfer.items[i-1]}
+ }
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -122,4 +122,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/037.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/037.xhtml
index 4a2023ac73f..75ebf11ab14 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/037.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/037.xhtml
@@ -4,12 +4,12 @@
<title>dataTransfer.items during block element drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:green;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -17,104 +17,104 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
- {delete event.dataTransfer.items[i-1]}
- }
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
+ {delete event.dataTransfer.items[i-1]}
+ }
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('p + div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('p + div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -124,4 +124,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/038.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/038.xhtml
index 35826b0cd93..afb69024166 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/038.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/038.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.items and getData during canvas drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,115 +15,115 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.items.clear();
- event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green.</p>
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
@@ -132,15 +132,15 @@ function say(it)
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
data[1] = canvas.toDataURL('image/png');
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/039.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/039.xhtml
index 37f165fe1ac..fd73adab2ad 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/039.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/039.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.items and getData during PNG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,110 +15,110 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {delete event.dataTransfer.items[i-1]}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -128,4 +128,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/040.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/040.xhtml
index 19ed6e146f6..fe545fa9ade 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/040.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/040.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.items and getData during SVG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,110 +15,110 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {delete event.dataTransfer.items[i-1]}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -128,4 +128,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/041.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/041.xhtml
index 7bd22d848f5..433dcf090f0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/041.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/041.xhtml
@@ -4,11 +4,11 @@
<title>dataTransfer.items and getData during text input selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -16,110 +16,110 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['Drag me', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {delete event.dataTransfer.items[i-1]}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -129,4 +129,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/042.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/042.xhtml
index 945de1171fd..785889d9811 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/042.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/042.xhtml
@@ -4,11 +4,11 @@
<title>dataTransfer.items and getData during selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -16,110 +16,110 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['Drag me', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {delete event.dataTransfer.items[i-1]}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -129,4 +129,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/043.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/043.xhtml
index c42baa09dfc..76fe70a99b4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/043.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/043.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.items and getData during link drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,110 +15,110 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:text/plain,1', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {delete event.dataTransfer.items[i-1]}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -128,4 +128,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/044.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/044.xhtml
index 9a1efdcc06a..d3e08515df2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/044.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/044.xhtml
@@ -4,12 +4,12 @@
<title>dataTransfer.items and getData during block element drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:green;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -17,109 +17,109 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.items.clear();
- event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('p + div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('p + div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -129,4 +129,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/045.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/045.xhtml
index e354ff7f143..a98cba4ed86 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/045.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/045.xhtml
@@ -4,47 +4,47 @@
<title>Text and url aliases</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:green;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text', 'url', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('p + div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('p + div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -54,4 +54,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/046.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/046.xhtml
index 8a4a3cbaecf..a766f52ecfd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/046.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/046.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.types during canvas drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,141 +15,141 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.items.clear();
- event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondrag="dragElement(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern to the silver box below and drop it. Silver box should turn green.</p>
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
@@ -158,15 +158,15 @@ function say(it)
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
data[1] = canvas.toDataURL('image/png');
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/047.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/047.xhtml
index fc43f811ceb..c3148bff701 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/047.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/047.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.types during PNG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,136 +15,136 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {delete event.dataTransfer.items[i-1]}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -154,4 +154,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/048.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/048.xhtml
index 49c87f722c8..c87793b6de7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/048.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/048.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.types during SVG image drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,136 +15,136 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {delete event.dataTransfer.items[i-1]}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -154,4 +154,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/049.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/049.xhtml
index 5c810dd2ad2..06e2107ae48 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/049.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/049.xhtml
@@ -4,11 +4,11 @@
<title>dataTransfer.types during text input selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -16,136 +16,136 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['Drag me', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {delete event.dataTransfer.items[i-1]}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -155,4 +155,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/050.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/050.xhtml
index 33e41c65346..1cf766fed7b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/050.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/050.xhtml
@@ -4,11 +4,11 @@
<title>dataTransfer.types during selection drag and drop</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -16,136 +16,136 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['Drag me', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {delete event.dataTransfer.items[i-1]}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -155,4 +155,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/051.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/051.xhtml
index f073c60786e..378af23f4b3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/051.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/051.xhtml
@@ -4,10 +4,10 @@
<title>dataTransfer.types during link drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -15,136 +15,136 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:text/plain,1', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {delete event.dataTransfer.items[i-1]}
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {delete event.dataTransfer.items[i-1]}
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -154,4 +154,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/052.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/052.xhtml
index 65983990f29..597d31ac64a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/052.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/052.xhtml
@@ -4,12 +4,12 @@
<title>dataTransfer.types during block element drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:green;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:green;}
p + div
- {background-color:gray;}
+ {background-color:gray;}
</style>
<script type="application/ecmascript">
<![CDATA[
@@ -17,135 +17,135 @@ var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
e = 0, result = true;
function start(event)
- {event.dataTransfer.items.clear();
- event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.items.add(data[i],dataTypes[i])}
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.items.add(data[i],dataTypes[i])}
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondragstart): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragstart): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ }
function dragElement(event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrag): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function enterElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragenter): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ }
function overElement(event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- }
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondragover): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ }
function dataDrop(event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- if(event.dataTransfer.types.length != dataTypes.length)
- {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.types[i] != dataTypes[i])
- {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
- if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
- }
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- document.querySelector('p + div').setAttribute('style','background-color:' + (result?'green':'red'));}
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ if(event.dataTransfer.types.length != dataTypes.length)
+ {say('types.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.types[i] != dataTypes[i])
+ {say('Types (ondrop): FAIL (dataTransfer.types[' + i + '] returns wrong value)')}
+ if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData (ondrop): FAIL (getData(' + dataTypes[i] + ') returns wrong data)')}
+ }
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ document.querySelector('p + div').setAttribute('style','background-color:' + (result?'green':'red'));}
function say(it)
- {result = false;
- document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {result = false;
+ document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -155,4 +155,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="overElement(event)" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/053.html b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/053.html
index 9f1a0d730ac..a893b8e4891 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/053.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/053.html
@@ -1,83 +1,83 @@
<!doctype html>
<html>
- <head>
- <title>Adding a file to dnd data store</title>
- <style type="text/css">
+ <head>
+ <title>Adding a file to dnd data store</title>
+ <style type="text/css">
span { display: inline-block; height: 100px; width: 100px; background: orange; }
span + span { background: blue; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('span')[0];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'copy';
- var filein = document.getElementsByTagName('input')[0];
- if( !filein.files ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
- return;
- }
- if( !filein.files[0] ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
- return;
- }
- var thefile = filein.files[0];
- try {
- e.dataTransfer.items.add(thefile);
- } catch(err) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
- e.preventDefault();
- return;
- }
- if( e.dataTransfer.files.length != 1 ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
- e.preventDefault();
- return;
- }
- };
- var drop = document.getElementsByTagName('span')[1];
- drop.ondragenter = drop.ondragover = function (e) {
- e.preventDefault();
- };
- drop.ondrop = function (e) {
- e.preventDefault();
- if( document.getElementsByTagName('p')[0].innerHTML ) { return; }
- if( e.dataTransfer.files.length != 1 ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store during drop';
- e.preventDefault();
- return;
- }
- if( !window.FileReader ) {
- document.getElementsByTagName('p')[0].innerHTML = 'No FileReader constructor';
- e.preventDefault();
- return;
- }
- var reader = new FileReader();
- reader.onload = function () {
- if( !reader.result ) {
- document.getElementsByTagName('p')[0].innerHTML = 'No file data after load';
- } else if( !document.getElementsByTagName('p')[0].innerHTML ) {
- document.getElementsByTagName('p')[0].innerHTML = 'PASS';
- }
- };
- reader.readAsBinaryString(e.dataTransfer.files[0]);
- setTimeout(function () {
- if( !reader.result ) {
- document.getElementsByTagName('p')[0].innerHTML = 'No file data after timeout';
- }
- },1000);
- };
+ var drag = document.getElementsByTagName('span')[0];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'copy';
+ var filein = document.getElementsByTagName('input')[0];
+ if( !filein.files ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
+ return;
+ }
+ if( !filein.files[0] ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
+ return;
+ }
+ var thefile = filein.files[0];
+ try {
+ e.dataTransfer.items.add(thefile);
+ } catch(err) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
+ e.preventDefault();
+ return;
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
+ e.preventDefault();
+ return;
+ }
+ };
+ var drop = document.getElementsByTagName('span')[1];
+ drop.ondragenter = drop.ondragover = function (e) {
+ e.preventDefault();
+ };
+ drop.ondrop = function (e) {
+ e.preventDefault();
+ if( document.getElementsByTagName('p')[0].innerHTML ) { return; }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store during drop';
+ e.preventDefault();
+ return;
+ }
+ if( !window.FileReader ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No FileReader constructor';
+ e.preventDefault();
+ return;
+ }
+ var reader = new FileReader();
+ reader.onload = function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after load';
+ } else if( !document.getElementsByTagName('p')[0].innerHTML ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'PASS';
+ }
+ };
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ setTimeout(function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after timeout';
+ }
+ },1000);
+ };
};
- </script>
- </head>
- <body>
- <ol>
- <li>Select a non-empty file on your computer using the following input: <input type="file"></li>
- <li>Drag the orange square onto the blue square and release it:<br><span draggable="true"></span> <span></span><br>
- If a prompt appears, accept it.</li>
- <li>Fail if new text does not appear below.</li>
- </ol>
- <p></p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <ol>
+ <li>Select a non-empty file on your computer using the following input: <input type="file"></li>
+ <li>Drag the orange square onto the blue square and release it:<br><span draggable="true"></span> <span></span><br>
+ If a prompt appears, accept it.</li>
+ <li>Fail if new text does not appear below.</li>
+ </ol>
+ <p></p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/054.html b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/054.html
index 0c6a1200a30..cd42e633989 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/054.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/054.html
@@ -1,83 +1,83 @@
<!doctype html>
<html>
- <head>
- <title>Adding a file to dnd data store with drag out of window</title>
- <style type="text/css">
+ <head>
+ <title>Adding a file to dnd data store with drag out of window</title>
+ <style type="text/css">
span { display: inline-block; height: 100px; width: 100px; background: orange; }
span + span { background: blue; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('span')[0];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'copy';
- var filein = document.getElementsByTagName('input')[0];
- if( !filein.files ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
- return;
- }
- if( !filein.files[0] ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
- return;
- }
- var thefile = filein.files[0];
- try {
- e.dataTransfer.items.add(thefile);
- } catch(err) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
- e.preventDefault();
- return;
- }
- if( e.dataTransfer.files.length != 1 ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
- e.preventDefault();
- return;
- }
- };
- var drop = document.getElementsByTagName('span')[1];
- drop.ondragenter = drop.ondragover = function (e) {
- e.preventDefault();
- };
- drop.ondrop = function (e) {
- e.preventDefault();
- if( document.getElementsByTagName('p')[0].innerHTML ) { return; }
- if( e.dataTransfer.files.length != 1 ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store during drop';
- e.preventDefault();
- return;
- }
- if( !window.FileReader ) {
- document.getElementsByTagName('p')[0].innerHTML = 'No FileReader constructor';
- e.preventDefault();
- return;
- }
- var reader = new FileReader();
- reader.onload = function () {
- if( !reader.result ) {
- document.getElementsByTagName('p')[0].innerHTML = 'No file data after load';
- } else if( !document.getElementsByTagName('p')[0].innerHTML ) {
- document.getElementsByTagName('p')[0].innerHTML = 'PASS';
- }
- };
- reader.readAsBinaryString(e.dataTransfer.files[0]);
- setTimeout(function () {
- if( !reader.result ) {
- document.getElementsByTagName('p')[0].innerHTML = 'No file data after timeout';
- }
- },1000);
- };
+ var drag = document.getElementsByTagName('span')[0];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'copy';
+ var filein = document.getElementsByTagName('input')[0];
+ if( !filein.files ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
+ return;
+ }
+ if( !filein.files[0] ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
+ return;
+ }
+ var thefile = filein.files[0];
+ try {
+ e.dataTransfer.items.add(thefile);
+ } catch(err) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
+ e.preventDefault();
+ return;
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
+ e.preventDefault();
+ return;
+ }
+ };
+ var drop = document.getElementsByTagName('span')[1];
+ drop.ondragenter = drop.ondragover = function (e) {
+ e.preventDefault();
+ };
+ drop.ondrop = function (e) {
+ e.preventDefault();
+ if( document.getElementsByTagName('p')[0].innerHTML ) { return; }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store during drop';
+ e.preventDefault();
+ return;
+ }
+ if( !window.FileReader ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No FileReader constructor';
+ e.preventDefault();
+ return;
+ }
+ var reader = new FileReader();
+ reader.onload = function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after load';
+ } else if( !document.getElementsByTagName('p')[0].innerHTML ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'PASS';
+ }
+ };
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ setTimeout(function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after timeout';
+ }
+ },1000);
+ };
};
- </script>
- </head>
- <body>
- <ol>
- <li>Select a non-empty file on your computer using the following input: <input type="file"></li>
- <li>Drag the orange square outside the browser window (not over the taskbar), then back onto the blue square and release it:<br><span draggable="true"></span> <span></span><br>
- If a prompt appears, accept it.</li>
- <li>Fail if new text does not appear below.</li>
- </ol>
- <p></p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <ol>
+ <li>Select a non-empty file on your computer using the following input: <input type="file"></li>
+ <li>Drag the orange square outside the browser window (not over the taskbar), then back onto the blue square and release it:<br><span draggable="true"></span> <span></span><br>
+ If a prompt appears, accept it.</li>
+ <li>Fail if new text does not appear below.</li>
+ </ol>
+ <p></p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/055.html b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/055.html
index 570571e9bd7..ac2e64ed354 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/055.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/055.html
@@ -1,46 +1,46 @@
<!doctype html>
<html>
- <head>
- <title>text/uri-list conversion</title>
- <style type="text/css">
+ <head>
+ <title>text/uri-list conversion</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('div')[0], fails = [];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('url','http://example.com/');
- if( !e.dataTransfer.getData('url') ) {
- document.getElementsByTagName('p')[0].innerHTML = "FAIL - getData('url') returned nothing";
- } else if( e.dataTransfer.getData('url') != e.dataTransfer.getData('text/uri-list') ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - text/uri-list is not the same as url';
- } else {
+ var drag = document.getElementsByTagName('div')[0], fails = [];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('url','http://example.com/');
+ if( !e.dataTransfer.getData('url') ) {
+ document.getElementsByTagName('p')[0].innerHTML = "FAIL - getData('url') returned nothing";
+ } else if( e.dataTransfer.getData('url') != e.dataTransfer.getData('text/uri-list') ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - text/uri-list is not the same as url';
+ } else {
- e.dataTransfer.setData('url','#foo\r\n http://example.com/#bar \r\n http://example.org/');
- if( e.dataTransfer.getData('url') != 'http://example.com/#bar' ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - only the first URL should be returned - "'+e.dataTransfer.getData('url')+'"';
- } else if( e.dataTransfer.getData('text/uri-list') != '#foo\r\n http://example.com/#bar \r\n http://example.org/' ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - text/uri-list should return the full data';
- } else {
+ e.dataTransfer.setData('url','#foo\r\n http://example.com/#bar \r\n http://example.org/');
+ if( e.dataTransfer.getData('url') != 'http://example.com/#bar' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - only the first URL should be returned - "'+e.dataTransfer.getData('url')+'"';
+ } else if( e.dataTransfer.getData('text/uri-list') != '#foo\r\n http://example.com/#bar \r\n http://example.org/' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - text/uri-list should return the full data';
+ } else {
- e.dataTransfer.setData('url',' ');
- if( e.dataTransfer.getData('url') ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - space was not a valid URL so an empty string should have been returned';
- } else {
- document.getElementsByTagName('p')[0].innerHTML = 'PASS';
- }
+ e.dataTransfer.setData('url',' ');
+ if( e.dataTransfer.getData('url') ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - space was not a valid URL so an empty string should have been returned';
+ } else {
+ document.getElementsByTagName('p')[0].innerHTML = 'PASS';
+ }
- }
+ }
- }
- e.preventDefault();
- };
+ }
+ e.preventDefault();
+ };
};
- </script>
- </head>
- <body>
- <div draggable="true"></div>
- <p>Attempt to drag the orange square.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <div draggable="true"></div>
+ <p>Attempt to drag the orange square.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/056.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/056.xhtml
index dd85dbe881b..c9a3e700dee 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/056.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/056.xhtml
@@ -4,45 +4,45 @@
<title>Caseinsensitivity in dataTransfer.setData/getData</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['data:text/plain,1', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData((i%2 == 0)?(dataTypes[i].toUpperCase()):(dataTypes[i].replace(/i/g,'I')), data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData((i%2 == 0)?(dataTypes[i].toUpperCase()):(dataTypes[i].replace(/i/g,'I')), data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData((i%2 == 0)?(dataTypes[i].replace(/t/g,'T')):(dataTypes[i].toUpperCase())) == data[i])?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData((i%2 == 0)?(dataTypes[i].replace(/t/g,'T')):(dataTypes[i].toUpperCase())) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -52,4 +52,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/057.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/057.xhtml
index 4c6f6f5798b..b4f5659d276 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/057.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/057.xhtml
@@ -4,46 +4,46 @@
<title>Various data item type strings in dataTransfer.setData/getData</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'http://', '<?xml version="1.0" encoding="utf-8"?>', '<html xmlns="http://www.w3.org/1999/xhtml"/>', '<mn>1</mn>', '☺', 'type="text/html"', '[({#;:,.`~*-_=+\|/%!?&$@^})]'],
data = ['Drag me', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- }
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ say('items.length (dragstart) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ }
function dragElement(event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- }
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ }
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(string' + i + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('div').setAttribute('style','background-color:green');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(string' + i + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('div').setAttribute('style','background-color:green');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -53,4 +53,4 @@ function say(it)
<div ondragenter="enterElement(event)" ondragover="return false;" ondrop="dataDrop(event)"/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/058.html b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/058.html
index 1bf9e58018f..c1e7ad95b62 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/058.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/058.html
@@ -1,79 +1,79 @@
<!doctype html>
<html>
- <head>
- <title>Dropping file into dropzone</title>
- <style type="text/css">
+ <head>
+ <title>Dropping file into dropzone</title>
+ <style type="text/css">
span { display: inline-block; height: 100px; width: 100px; background: orange; }
span + span { background: blue; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('span')[0];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'copy';
- var filein = document.getElementsByTagName('input')[0];
- if( !filein.files ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
- return;
- }
- if( !filein.files[0] ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
- return;
- }
- var thefile = filein.files[0];
- try {
- e.dataTransfer.items.add(thefile);
- } catch(err) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
- e.preventDefault();
- return;
- }
- if( e.dataTransfer.files.length != 1 ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
- e.preventDefault();
- return;
- }
- };
- document.getElementsByTagName('span')[1].ondrop = function (e) {
- e.preventDefault();
- if( document.getElementsByTagName('p')[0].innerHTML ) { return; }
- if( e.dataTransfer.files.length != 1 ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store during drop';
- e.preventDefault();
- return;
- }
- if( !window.FileReader ) {
- document.getElementsByTagName('p')[0].innerHTML = 'No FileReader constructor';
- e.preventDefault();
- return;
- }
- var reader = new FileReader();
- reader.onload = function () {
- if( !reader.result ) {
- document.getElementsByTagName('p')[0].innerHTML = 'No file data after load';
- } else if( !document.getElementsByTagName('p')[0].innerHTML ) {
- document.getElementsByTagName('p')[0].innerHTML = 'PASS';
- }
- };
- reader.readAsBinaryString(e.dataTransfer.files[0]);
- setTimeout(function () {
- if( !reader.result ) {
- document.getElementsByTagName('p')[0].innerHTML = 'No file data after timeout';
- }
- },1000);
- };
+ var drag = document.getElementsByTagName('span')[0];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'copy';
+ var filein = document.getElementsByTagName('input')[0];
+ if( !filein.files ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
+ return;
+ }
+ if( !filein.files[0] ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
+ return;
+ }
+ var thefile = filein.files[0];
+ try {
+ e.dataTransfer.items.add(thefile);
+ } catch(err) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
+ e.preventDefault();
+ return;
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
+ e.preventDefault();
+ return;
+ }
+ };
+ document.getElementsByTagName('span')[1].ondrop = function (e) {
+ e.preventDefault();
+ if( document.getElementsByTagName('p')[0].innerHTML ) { return; }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store during drop';
+ e.preventDefault();
+ return;
+ }
+ if( !window.FileReader ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No FileReader constructor';
+ e.preventDefault();
+ return;
+ }
+ var reader = new FileReader();
+ reader.onload = function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after load';
+ } else if( !document.getElementsByTagName('p')[0].innerHTML ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'PASS';
+ }
+ };
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ setTimeout(function () {
+ if( !reader.result ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'No file data after timeout';
+ }
+ },1000);
+ };
};
- </script>
- </head>
- <body>
- <ol>
- <li>Select a non-empty plain text file on your computer using the following input: <input type="file"></li>
- <li>Drag the orange square onto the blue square and release it:<br><span draggable="true"></span> <span dropzone="copy file:text/plain"></span><br>
- If a prompt appears, accept it.</li>
- <li>Fail if new text does not appear below.</li>
- </ol>
- <p></p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <ol>
+ <li>Select a non-empty plain text file on your computer using the following input: <input type="file"></li>
+ <li>Drag the orange square onto the blue square and release it:<br><span draggable="true"></span> <span dropzone="copy file:text/plain"></span><br>
+ If a prompt appears, accept it.</li>
+ <li>Fail if new text does not appear below.</li>
+ </ol>
+ <p></p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/helper-drop-box-here.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/helper-drop-box-here.xhtml
index 70341c5c6f5..d6b9d6fcefd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/datastore/helper-drop-box-here.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/datastore/helper-drop-box-here.xhtml
@@ -4,27 +4,27 @@
<title>Drag and drop datastore: helper file</title>
<style type="text/css">
html, body
- {height:100%;}
+ {height:100%;}
</style>
<script type="application/ecmascript">
<![CDATA[
var dataTypes = ['text/plain', 'text/uri-list', 'application/xml', 'application/xhtml+xml', 'application/mathml+xml', 'image/svg+xml', 'text/html', 'text/x-example'],
data = ['PASS', 'data:text/plain,1', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'];
function enterElement(event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ say('items.length (dragenter) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));}
function dataDrop(event)
- {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
- for(var i = 0; i != dataTypes.length; i++)
- {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
- document.querySelector('body').setAttribute('style','background-color:teal;color:white;');}
+ {say('items.length (drop) : ' + ((event.dataTransfer.items.length >= dataTypes.length)?'PASS':'FAIL'));
+ for(var i = 0; i != dataTypes.length; i++)
+ {say('getData(' + dataTypes[i] + ') : ' + ((event.dataTransfer.getData(dataTypes[i]) == data[i])?'PASS':'FAIL'));}
+ document.querySelector('body').setAttribute('style','background-color:teal;color:white;');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
]]>
</script>
</head>
@@ -32,4 +32,4 @@ function say(it)
<p>Drop box here. Frame should turn green and test results should appear below.</p>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dom/specials.html b/tests/wpt/web-platform-tests/html/editing/dnd/dom/specials.html
index e83eb68aadc..4327eac8727 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dom/specials.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dom/specials.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Exposing drag &amp; drop events on document and window</title>
- <script type="text/javascript" src="/resources/testharness.js"></script>
- <script type="text/javascript" src="/resources/testharnessreport.js"></script>
- </head>
- <body>
+ <head>
+ <title>Exposing drag &amp; drop events on document and window</title>
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
- <div id="log">Enable script and reload</div>
- <script type="text/javascript">
+ <div id="log">Enable script and reload</div>
+ <script type="text/javascript">
var allEvents = ['ondragstart','ondrag','ondragover','ondragenter','ondragleave','ondrop','ondragend'];
var allObjects = [['window',window],['document',document],['HTMLElement',document.createElement('div')]];
var fails = [];
for( var i = 0; i < allObjects.length; i++ ) {
- for( var j = 0; j < allEvents.length; j++ ) {
- test(function () {
- assert_true(allEvents[j] in allObjects[i][1]);
- }, allEvents[j] + ' in ' + allObjects[i][0]);
- }
+ for( var j = 0; j < allEvents.length; j++ ) {
+ test(function () {
+ assert_true(allEvents[j] in allObjects[i][1]);
+ }, allEvents[j] + ' in ' + allObjects[i][0]);
+ }
}
- </script>
+ </script>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/001.xhtml
index 970e077e688..c34aef97349 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/001.xhtml
@@ -4,28 +4,28 @@
<title>Selection drag and drop: allowed effects 'copy','move','link'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'], i = 0;
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;
- selectText();}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;
+ selectText();}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
@@ -35,4 +35,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/002.xhtml
index 13c64251a3d..19da353097a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/002.xhtml
@@ -4,28 +4,28 @@
<title>Text input selection drag and drop: allowed effects 'copy','move','link'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'], i = 0;
function selectText()
- {document.querySelector('input').select()}
+ {document.querySelector('input').select()}
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;
- selectText();}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;
+ selectText();}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
@@ -35,4 +35,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/003.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/003.xhtml
index 44b907ac7d0..b114c3770e7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/003.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/003.xhtml
@@ -4,25 +4,25 @@
<title>Link drag and drop: allowed effects 'copy','move','link'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'], i = 0;
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
@@ -32,4 +32,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag link and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/004.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/004.xhtml
index 7376d045b03..715792f8ef1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/004.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/004.xhtml
@@ -4,25 +4,25 @@
<title>PNG image drag and drop: allowed effects 'copy','move','link'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'], i = 0;
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
@@ -32,4 +32,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag circle and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/005.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/005.xhtml
index c74572f0e80..a6c237c29de 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/005.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/005.xhtml
@@ -4,25 +4,25 @@
<title>SVG image drag and drop: allowed effects 'copy','move','link'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'], i = 0;
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
@@ -32,4 +32,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag circle and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/006.xhtml
index 03deb62f2b9..3faea1803ff 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/006.xhtml
@@ -4,30 +4,30 @@
<title>Canvas drag and drop: allowed effects 'copy','move','link'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'], i = 0;
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)">Canvas</canvas>
</p>
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
@@ -37,14 +37,14 @@ function start(event)
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/007.xhtml
index 0072eb12330..b326b25ee4f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/007.xhtml
@@ -4,28 +4,28 @@
<title>Selection drag and drop: allowed effects 'copy','copyLink','copyMove'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','copyLink','copyMove'], i = 0;
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == 'copy' &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;
- selectText();}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == 'copy' &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;
+ selectText();}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
@@ -35,4 +35,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/008.xhtml
index 79b743ff901..d1ec557e735 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/008.xhtml
@@ -4,25 +4,25 @@
<title>Link drag and drop: allowed effects 'link','linkMove','uninitialized'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['link','linkMove','copyMove'], i = 0;
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i].substring(0,4) &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i].substring(0,4) &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
@@ -32,4 +32,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag link and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/009.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/009.xhtml
index fcd38df4ae2..e9e41c6f83c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/009.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/009.xhtml
@@ -4,27 +4,27 @@
<title>Text input selection drag and drop: allowed effects 'move','uninitialized'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
</style>
<script type="application/ecmascript">
var effects = ['move','uninitialized'], i = 0;
function selectText()
- {document.querySelector('input').select()}
+ {document.querySelector('input').select()}
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == 'move' &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%2;
- selectText();}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == 'move' &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%2;
+ selectText();}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i];
- event.dataTransfer.dropEffect = 'move'}
+ {event.dataTransfer.effectAllowed = effects[i];
+ event.dataTransfer.dropEffect = 'move'}
</script>
</head>
<body onload="selectText()">
@@ -33,4 +33,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/010.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/010.xhtml
index 50fc1e2367c..3758fdd32a3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/010.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/010.xhtml
@@ -4,26 +4,26 @@
<title>Selection drag and drop: allowed effects 'all','uninitialized'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
</style>
<script type="application/ecmascript">
var effects = ['all','uninitialized'], i = 0;
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == 'copy' &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%2;
- selectText();}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == 'copy' &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%2;
+ selectText();}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
@@ -32,4 +32,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/011.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/011.xhtml
index aa8c411c79d..ab81380feb2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/011.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/011.xhtml
@@ -4,28 +4,28 @@
<title>Selection drag and drop: allowed effects 'link','copyLink','linkMove'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['link','copyLink','linkMove'], i = 0;
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i].substring(0,4) &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;
- selectText();}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i].substring(0,4) &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;
+ selectText();}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i];}
+ {event.dataTransfer.effectAllowed = effects[i];}
</script>
</head>
<body onload="selectText()">
@@ -35,4 +35,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/012.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/012.xhtml
index e5b4b7b5545..a19e6d42d1f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/012.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/012.xhtml
@@ -4,28 +4,28 @@
<title>Selection drag and drop: allowed effects 'move','copyMove','linkMove'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['move','copyMove','linkMove'], i = 0;
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i].substring(0,4) &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;
- selectText();}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i].substring(0,4) &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;
+ selectText();}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i];}
+ {event.dataTransfer.effectAllowed = effects[i];}
</script>
</head>
<body onload="selectText()">
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/013.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/013.xhtml
index 629b66ddd2b..5dc10ea3853 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/013.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/013.xhtml
@@ -4,28 +4,28 @@
<title>Selection drag and drop: allowed effects 'copy','all','uninitialized'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','all','uninitialized'], i = 0;
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == 'copy' &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;
- selectText();}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == 'copy' &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;
+ selectText();}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
@@ -35,4 +35,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/014.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/014.xhtml
index 93747099e10..91bc6efb3ed 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/014.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/014.xhtml
@@ -4,28 +4,28 @@
<title>Selection drag and drop: allowed effects 'copy','copyMove','invalid'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','all','uninitialized'], i = 0;
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == 'copy' &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;
- selectText();}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == 'copy' &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;
+ selectText();}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i]}
+ {event.dataTransfer.effectAllowed = effects[i]}
</script>
</head>
<body onload="selectText()">
@@ -35,4 +35,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/015.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/015.xhtml
index 23b4b43ee10..952abd2e152 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/015.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/015.xhtml
@@ -4,25 +4,25 @@
<title>Selection drag and drop: dropzone 'copy','move' and 'link'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'];
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event,element)
- {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
- selectText();}
+ {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
+ selectText();}
</script>
</head>
<body onload="selectText()">
@@ -32,4 +32,4 @@ function dropSelection(event,element)
<p>Drag me</p>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/016.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/016.xhtml
index 23fc81907bc..a1b80c5198a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/016.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/016.xhtml
@@ -4,25 +4,25 @@
<title>Text input selection drag and drop: dropzone 'copy','move' and 'link'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'];
function selectText()
- {document.querySelector('input').select()}
+ {document.querySelector('input').select()}
function dropSelection(event,element)
- {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
- selectText();}
+ {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
+ selectText();}
</script>
</head>
<body onload="selectText()">
@@ -32,4 +32,4 @@ function dropSelection(event,element)
<p><input value="Drag me"/></p>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/017.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/017.xhtml
index a9dd0d74d75..36fdbc873fc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/017.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/017.xhtml
@@ -4,22 +4,22 @@
<title>Link drag and drop: dropzone 'copy','move' and 'link'</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'];
function dropSelection(event,element)
- {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));}
+ {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));}
</script>
</head>
<body>
@@ -29,4 +29,4 @@ function dropSelection(event,element)
<p><a href="data:text/plain,1">Drag me</a></p>
<p>You should be able to drag link and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/018.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/018.xhtml
index 055448f1d49..2a84d75e39c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/018.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/018.xhtml
@@ -4,29 +4,29 @@
<title>Selection drag and drop: setting dropzone attribute ondragstart</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'];
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event,element)
- {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
- selectText();}
+ {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
+ selectText();}
function start(event)
- {for(var i = 0; i != 3; i++)
- {document.querySelectorAll('div')[i].setAttribute('dropzone',effects[i] + ' string:text/plain')}
- }
+ {for(var i = 0; i != 3; i++)
+ {document.querySelectorAll('div')[i].setAttribute('dropzone',effects[i] + ' string:text/plain')}
+ }
</script>
</head>
<body onload="selectText()">
@@ -36,4 +36,4 @@ function start(event)
<p ondragstart="start(event)">Drag me</p>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/019.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/019.xhtml
index 5dd86f21106..66ca95c424e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/019.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/019.xhtml
@@ -4,29 +4,29 @@
<title>Text input selection drag and drop: setting dropzone attribute ondragstart</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'];
function selectText()
- {document.querySelector('input').select()}
+ {document.querySelector('input').select()}
function dropSelection(event,element)
- {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
- selectText();}
+ {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
+ selectText();}
function start(event)
- {for(var i = 0; i != 3; i++)
- {document.querySelectorAll('div')[i].setAttribute('dropzone',effects[i] + ' string:text/plain')}
- }
+ {for(var i = 0; i != 3; i++)
+ {document.querySelectorAll('div')[i].setAttribute('dropzone',effects[i] + ' string:text/plain')}
+ }
</script>
</head>
<body onload="selectText()">
@@ -36,4 +36,4 @@ function start(event)
<p ondragstart="start(event)"><input value="Drag me" ondragstart="start(event)"/></p>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/020.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/020.xhtml
index 8fa4c0622ef..a06f41968d4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/020.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/020.xhtml
@@ -4,26 +4,26 @@
<title>Link drag and drop: setting dropzone attribute ondragstart</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'];
function dropSelection(event,element)
- {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));}
+ {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));}
function start(event)
- {for(var i = 0; i != 3; i++)
- {document.querySelectorAll('div')[i].setAttribute('dropzone',effects[i] + ' string:text/uri-list')}
- }
+ {for(var i = 0; i != 3; i++)
+ {document.querySelectorAll('div')[i].setAttribute('dropzone',effects[i] + ' string:text/uri-list')}
+ }
</script>
</head>
<body>
@@ -33,4 +33,4 @@ function start(event)
<p ondragstart="start(event)"><a href="data:text/plain,1" ondragstart="start(event)">Drag me</a></p>
<p>You should be able to drag link and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/021.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/021.xhtml
index 5e9f249281d..441c860b730 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/021.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/021.xhtml
@@ -4,28 +4,28 @@
<title>Selection drag and drop: removing dropzone attribute ondragstart</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:maroon;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:maroon;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:purple;}
+ {background-color:purple;}
div:nth-child(3)
- {background-color:fuchsia;}
+ {background-color:fuchsia;}
</style>
<script type="application/ecmascript">
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event,element)
- {document.querySelectorAll('div')[element].appendChild(document.createTextNode(' FAIL '));
- selectText();}
+ {document.querySelectorAll('div')[element].appendChild(document.createTextNode(' FAIL '));
+ selectText();}
function start(event)
- {for(var i = 0; i != 3; i++)
- {document.querySelectorAll('div')[i].removeAttribute('dropzone')}
- }
+ {for(var i = 0; i != 3; i++)
+ {document.querySelectorAll('div')[i].removeAttribute('dropzone')}
+ }
</script>
</head>
<body onload="selectText()">
@@ -35,4 +35,4 @@ function start(event)
<p ondragstart="start(event)">Drag me</p>
<p>You should not be able to drop selection onto any of the red boxes above.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/022.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/022.xhtml
index ed1b0265969..7318d556ca8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/022.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/022.xhtml
@@ -4,29 +4,29 @@
<title>Selection drag and drop: changing dropzone attribute ondragstart</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'];
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event,element)
- {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
- selectText();}
+ {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
+ selectText();}
function start(event)
- {for(var i = 0; i != 3; i++)
- {document.querySelectorAll('div')[i].setAttribute('dropzone',effects[i] + ' string:text/plain')}
- }
+ {for(var i = 0; i != 3; i++)
+ {document.querySelectorAll('div')[i].setAttribute('dropzone',effects[i] + ' string:text/plain')}
+ }
</script>
</head>
<body onload="selectText()">
@@ -36,4 +36,4 @@ function start(event)
<p ondragstart="start(event)">Drag me</p>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/023.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/023.xhtml
index be2ffae9a1b..eb5dd04f222 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/023.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/023.xhtml
@@ -4,30 +4,30 @@
<title>drofEffect after drop event is cancelled</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'], result = false, e = 0;
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event,element)
- {event.preventDefault();
- e = element;
- if(event.dataTransfer.dropEffect == effects[element])
- {result = true}
- selectText();}
+ {event.preventDefault();
+ e = element;
+ if(event.dataTransfer.dropEffect == effects[element])
+ {result = true}
+ selectText();}
function endDrag(event)
- {document.querySelectorAll('div')[e].appendChild(document.createTextNode((result &amp;&amp; event.dataTransfer.dropEffect == effects[e])?' PASS ':' FAIL '));}
+ {document.querySelectorAll('div')[e].appendChild(document.createTextNode((result &amp;&amp; event.dataTransfer.dropEffect == effects[e])?' PASS ':' FAIL '));}
</script>
</head>
<body onload="selectText()">
@@ -37,4 +37,4 @@ function endDrag(event)
<p ondragend="endDrag(event)">Drag me</p>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/024.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/024.xhtml
index 4f880974e28..ec5acdb9497 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/024.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/024.xhtml
@@ -4,29 +4,29 @@
<title>Selection drag and drop: invalid value of effectAllowed</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'], i = 0;
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event)
- {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
- i = (i + 1)%3;
- selectText();}
+ {event.target.appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[i] &amp;&amp; event.dataTransfer.effectAllowed == effects[i])?' PASS ':' FAIL '));
+ i = (i + 1)%3;
+ selectText();}
function start(event)
- {event.dataTransfer.effectAllowed = effects[i];
- event.dataTransfer.effectAllowed = 'fail';}
+ {event.dataTransfer.effectAllowed = effects[i];
+ event.dataTransfer.effectAllowed = 'fail';}
</script>
</head>
<body onload="selectText()">
@@ -36,4 +36,4 @@ function start(event)
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="dropSelection(event)"/>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/025.html b/tests/wpt/web-platform-tests/html/editing/dnd/drop/025.html
index 288836fe4d0..491006b3ffe 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/025.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/025.html
@@ -28,129 +28,129 @@
<script>
window.onload = function() {
- var orange = document.getElementsByTagName('div')[0], fails = [], doneonce = false, seenevent = {};
+ var orange = document.getElementsByTagName('div')[0], fails = [], doneonce = false, seenevent = {};
orange.ondragstart = function(e) {
e.dataTransfer.setData('Text', 'dummy text');
- e.dataTransfer.effectAllowed = 'all';
- if( seenevent[e.type] ) { return; }
- seenevent[e.type] = true;
+ e.dataTransfer.effectAllowed = 'all';
+ if( seenevent[e.type] ) { return; }
+ seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'none' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of none';
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of none';
}
try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
- fails[fails.length] = e.type + ' dropEffect threw on setting';
+ fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'move' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
}
};
orange.ondrag = orange.nextSibling.ondragleave = function(e) {
- if( seenevent[e.type] ) { return; }
- seenevent[e.type] = true;
+ if( seenevent[e.type] ) { return; }
+ seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'none' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of none';
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of none';
}
try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
- fails[fails.length] = e.type + ' dropEffect threw on setting';
+ fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'move' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
}
};
orange.nextSibling.ondragenter = function(e) {
- e.preventDefault();
- if( seenevent[e.type] ) { return; }
- seenevent[e.type] = true;
+ e.preventDefault();
+ if( seenevent[e.type] ) { return; }
+ seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'copy' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy';
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy';
}
try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
- fails[fails.length] = e.type + ' dropEffect threw on setting';
+ fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'move' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
}
};
orange.nextSibling.ondragover = function(e) {
- e.preventDefault();
- if( seenevent[e.type] ) {
- e.dataTransfer.dropEffect = 'link';
- return;
- }
- if( !doneonce ) {
- if( e.dataTransfer.dropEffect != 'copy' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy';
- }
- try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
- fails[fails.length] = e.type + ' dropEffect threw on setting';
- }
- if( e.dataTransfer.dropEffect != 'move' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
- }
- doneonce = true;
- } else {
- seenevent[e.type] = true;
- if( e.dataTransfer.dropEffect != 'copy' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy on second attempt';
- }
- try{ e.dataTransfer.dropEffect = 'link' } catch(err2) {
- fails[fails.length] = e.type + ' dropEffect threw on setting';
- }
- if( e.dataTransfer.dropEffect != 'link' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of link on second attempt (seems to be readonly)';
- }
- doneonce = true;
- }
+ e.preventDefault();
+ if( seenevent[e.type] ) {
+ e.dataTransfer.dropEffect = 'link';
+ return;
+ }
+ if( !doneonce ) {
+ if( e.dataTransfer.dropEffect != 'copy' ) {
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy';
+ }
+ try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
+ fails[fails.length] = e.type + ' dropEffect threw on setting';
+ }
+ if( e.dataTransfer.dropEffect != 'move' ) {
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
+ }
+ doneonce = true;
+ } else {
+ seenevent[e.type] = true;
+ if( e.dataTransfer.dropEffect != 'copy' ) {
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy on second attempt';
+ }
+ try{ e.dataTransfer.dropEffect = 'link' } catch(err2) {
+ fails[fails.length] = e.type + ' dropEffect threw on setting';
+ }
+ if( e.dataTransfer.dropEffect != 'link' ) {
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of link on second attempt (seems to be readonly)';
+ }
+ doneonce = true;
+ }
};
orange.nextSibling.ondrop = function(e) {
- e.preventDefault();
- if( seenevent[e.type] ) { return; }
- seenevent[e.type] = true;
+ e.preventDefault();
+ if( seenevent[e.type] ) { return; }
+ seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'link' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of link';
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of link';
}
try{ e.dataTransfer.dropEffect = 'move' } catch(err) {
- fails[fails.length] = e.type + ' dropEffect threw on setting';
+ fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'move' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move (seems to be readonly)';
}
};
orange.ondragend = function(e) {
- if( seenevent[e.type] ) { return; }
- seenevent[e.type] = true;
+ if( seenevent[e.type] ) { return; }
+ seenevent[e.type] = true;
if( e.dataTransfer.dropEffect != 'move' ) {
- //under-specified in the spec, but part of the spec related to cancelling a drag says:
- //"set the current drag operation to the value of the dropEffect attribute of the DragEvent
- //object's dataTransfer object as it stood after the event dispatch finished."
- //this does not cover successful drags, but it makes sense to be consistent
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move';
+ //under-specified in the spec, but part of the spec related to cancelling a drag says:
+ //"set the current drag operation to the value of the dropEffect attribute of the DragEvent
+ //object's dataTransfer object as it stood after the event dispatch finished."
+ //this does not cover successful drags, but it makes sense to be consistent
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of move';
}
try{ e.dataTransfer.dropEffect = 'copy' } catch(err) {
- fails[fails.length] = e.type + ' dropEffect threw on setting';
+ fails[fails.length] = e.type + ' dropEffect threw on setting';
}
if( e.dataTransfer.dropEffect != 'copy' ) {
- fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy (seems to be readonly)';
+ fails[fails.length] = e.type + ' dropEffect ' + e.dataTransfer.dropEffect + ' instead of copy (seems to be readonly)';
}
if( !seenevent.dragstart ) {
- fails[fails.length] = 'dragstart did not fire';
+ fails[fails.length] = 'dragstart did not fire';
}
if( !seenevent.drag ) {
- fails[fails.length] = 'drag did not fire';
+ fails[fails.length] = 'drag did not fire';
}
if( !seenevent.dragenter ) {
- fails[fails.length] = 'dragenter did not fire';
+ fails[fails.length] = 'dragenter did not fire';
}
if( !seenevent.dragover ) {
- fails[fails.length] = 'dragover did not fire enough times';
+ fails[fails.length] = 'dragover did not fire enough times';
}
if( !seenevent.dragleave ) {
- fails[fails.length] = 'dragleave did not fire';
+ fails[fails.length] = 'dragleave did not fire';
}
if( !seenevent.drop ) {
- fails[fails.length] = 'drop did not fire';
+ fails[fails.length] = 'drop did not fire';
}
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/026.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/026.xhtml
index d3ae0d82756..f7f838b7637 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/026.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/026.xhtml
@@ -4,25 +4,25 @@
<title>Selection drag and drop: multiple values in dropzone</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:olive;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:olive;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:green;}
+ {background-color:green;}
div:nth-child(3)
- {background-color:teal;}
+ {background-color:teal;}
</style>
<script type="application/ecmascript">
var effects = ['copy','move','link'];
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event,element)
- {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
- selectText();}
+ {document.querySelectorAll('div')[element].appendChild(document.createTextNode((event.dataTransfer.dropEffect == effects[element])?' PASS ':' FAIL '));
+ selectText();}
</script>
</head>
<body onload="selectText()">
@@ -32,4 +32,4 @@ function dropSelection(event,element)
<p>Drag me</p>
<p>You should be able to drag selection and drop it onto any of the green boxes.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/027.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/drop/027.xhtml
index 482a655c182..5e2b41544ba 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/027.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/027.xhtml
@@ -4,24 +4,24 @@
<title>Selection drag and drop: non matching values in dropzone</title>
<style type="text/css">
div
- {display:inline-block;
- vertical-align:top;
- background-color:maroon;
- color:white;
- padding:20px;
- width:100px;
- height:100px;}
+ {display:inline-block;
+ vertical-align:top;
+ background-color:maroon;
+ color:white;
+ padding:20px;
+ width:100px;
+ height:100px;}
div:nth-child(2)
- {background-color:purple;}
+ {background-color:purple;}
div:nth-child(3)
- {background-color:fuchsia;}
+ {background-color:fuchsia;}
</style>
<script type="application/ecmascript">
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropSelection(event,element)
- {document.querySelectorAll('div')[element].appendChild(document.createTextNode(' FAIL '));
- selectText();}
+ {document.querySelectorAll('div')[element].appendChild(document.createTextNode(' FAIL '));
+ selectText();}
</script>
</head>
<body onload="selectText()">
@@ -31,4 +31,4 @@ function dropSelection(event,element)
<p ondragstart="start(event)">Drag me</p>
<p>You should not be able to drop selection onto any of the red boxes above.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/drop/028.html b/tests/wpt/web-platform-tests/html/editing/dnd/drop/028.html
index 22b823f70a7..ab5725ad002 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/drop/028.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/drop/028.html
@@ -1,42 +1,42 @@
<!doctype html>
<html>
- <head>
- <title>Dropping element with uninitialized effectAllowed</title>
- <style type="text/css">
+ <head>
+ <title>Dropping element with uninitialized effectAllowed</title>
+ <style type="text/css">
div, p {
- margin: 0.2em;
- height: 70px;
- width: 400px;
- background: orange;
- color: black;
+ margin: 0.2em;
+ height: 70px;
+ width: 400px;
+ background: orange;
+ color: black;
}
p {
- background: navy;
- color: white;
+ background: navy;
+ color: white;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var dragmicro = document.getElementsByTagName('div')[0];
- dragmicro.ondragstart = function (e) {
- e.dataTransfer.setData('text/plain','dummy text');
- };
- var droptarget = document.getElementsByTagName('p')[0];
- droptarget.ondragenter = droptarget.ondragover = function (e) {
- e.preventDefault();
- };
- droptarget.ondrop = function (e) {
- e.preventDefault();
- this.innerHTML = 'PASS';
- };
+ var dragmicro = document.getElementsByTagName('div')[0];
+ dragmicro.ondragstart = function (e) {
+ e.dataTransfer.setData('text/plain','dummy text');
+ };
+ var droptarget = document.getElementsByTagName('p')[0];
+ droptarget.ondragenter = droptarget.ondragover = function (e) {
+ e.preventDefault();
+ };
+ droptarget.ondrop = function (e) {
+ e.preventDefault();
+ this.innerHTML = 'PASS';
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <div draggable="true">Drag this rectangle.</div>
- <p>Drop onto this rectangle. Fail if this text does not change.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true">Drag this rectangle.</div>
+ <p>Drop onto this rectangle. Fail if this text does not change.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/001.xhtml
index 4fc405af3cc..aa929f57247 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/001.xhtml
@@ -4,11 +4,11 @@
<title>Dropzone attribute: copy</title>
<style type="text/css">
div
- {background-color:navy;
- width:40px;
- height:40px;
- padding:40px;
- color:white;}
+ {background-color:navy;
+ width:40px;
+ height:40px;
+ padding:40px;
+ color:white;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -16,4 +16,4 @@ div
<div dropzone="copy string:text/plain" ondrop="document.querySelector('div').appendChild(document.createTextNode((event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'))"/>
<p>You should be able to drag selection to navy box below. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/002.xhtml
index 87a64b3ee76..1c4f4837167 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/002.xhtml
@@ -4,11 +4,11 @@
<title>Dropzone attribute: move</title>
<style type="text/css">
div
- {background-color:navy;
- width:40px;
- height:40px;
- padding:40px;
- color:white;}
+ {background-color:navy;
+ width:40px;
+ height:40px;
+ padding:40px;
+ color:white;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -16,4 +16,4 @@ div
<div dropzone="move string:text/plain" ondrop="document.querySelector('div').appendChild(document.createTextNode((event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'))"/>
<p>You should be able to drag selection to navy box below. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/003.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/003.xhtml
index 7683b1c1757..baf359bc52b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/003.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/003.xhtml
@@ -4,11 +4,11 @@
<title>Dropzone attribute: link</title>
<style type="text/css">
div
- {background-color:navy;
- width:40px;
- height:40px;
- padding:40px;
- color:white;}
+ {background-color:navy;
+ width:40px;
+ height:40px;
+ padding:40px;
+ color:white;}
</style>
</head>
<body>
@@ -16,4 +16,4 @@ div
<div dropzone="link string:text/plain" ondrop="document.querySelector('div').appendChild(document.createTextNode((event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'))"/>
<p>You should be able to drag link to navy box below. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/004.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/004.xhtml
index 683956899de..b367435e1c0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/004.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/004.xhtml
@@ -4,28 +4,28 @@
<title>Dropzone and link drag and drop: allowed effects 'link','copyLink','linkMove' and 'all'</title>
<style type="text/css">
div
- {background-color:gray;
- width:200px;
- height:200px;}
+ {background-color:gray;
+ width:200px;
+ height:200px;}
</style>
<script type="application/ecmascript">
var effects = ['link','copyLink','linkMove','all'];
function start(event)
- {var e = parseInt(event.target.href.substring(16));
- event.dataTransfer.effectAllowed = effects[e];}
+ {var e = parseInt(event.target.href.substring(16));
+ event.dataTransfer.effectAllowed = effects[e];}
function finish(event)
- {var e = parseInt(event.dataTransfer.getData('text/uri-list').substring(16,17));
- document.querySelectorAll('a')[e].firstChild.nodeValue = (event.dataTransfer.dropEffect == 'link' &amp;&amp; event.dataTransfer.effectAllowed == effects[e])?'PASS':'FAIL';}
+ {var e = parseInt(event.dataTransfer.getData('text/uri-list').substring(16,17));
+ document.querySelectorAll('a')[e].firstChild.nodeValue = (event.dataTransfer.dropEffect == 'link' &amp;&amp; event.dataTransfer.effectAllowed == effects[e])?'PASS':'FAIL';}
</script>
</head>
<body>
<p>Drag links one by one and drop them into gray box below, link text should be updated as you drop them.</p>
<p ondragstart="start(event)">
- <a href="data:text/plain,0">Link</a>
- <a href="data:text/plain,1">Link</a>
- <a href="data:text/plain,2">Link</a>
- <a href="data:text/plain,3">Link</a>
+ <a href="data:text/plain,0">Link</a>
+ <a href="data:text/plain,1">Link</a>
+ <a href="data:text/plain,2">Link</a>
+ <a href="data:text/plain,3">Link</a>
</p>
<div dropzone="link string:text/uri-list" ondrop="finish(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/005.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/005.xhtml
index 5cdba423fec..bdc61fde7c9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/005.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/005.xhtml
@@ -4,28 +4,28 @@
<title>Dropzone and link drag and drop: allowed effects 'copy','copyMove','copyLink' and 'all'</title>
<style type="text/css">
div
- {background-color:gray;
- width:200px;
- height:200px;}
+ {background-color:gray;
+ width:200px;
+ height:200px;}
</style>
<script type="application/ecmascript">
var effects = ['copy','copyMove','copyLink','all'];
function start(event)
- {var e = parseInt(event.target.href.substring(16));
- event.dataTransfer.effectAllowed = effects[e];}
+ {var e = parseInt(event.target.href.substring(16));
+ event.dataTransfer.effectAllowed = effects[e];}
function finish(event)
- {var e = parseInt(event.dataTransfer.getData('text/uri-list').substring(16,17));
- document.querySelectorAll('a')[e].firstChild.nodeValue = (event.dataTransfer.dropEffect == 'copy' &amp;&amp; event.dataTransfer.effectAllowed == effects[e])?'PASS':'FAIL';}
+ {var e = parseInt(event.dataTransfer.getData('text/uri-list').substring(16,17));
+ document.querySelectorAll('a')[e].firstChild.nodeValue = (event.dataTransfer.dropEffect == 'copy' &amp;&amp; event.dataTransfer.effectAllowed == effects[e])?'PASS':'FAIL';}
</script>
</head>
<body>
<p>Drag links one by one and drop them into gray box below, link text should be updated as you drop them.</p>
<p ondragstart="start(event)">
- <a href="data:text/plain,0">Link</a>
- <a href="data:text/plain,1">Link</a>
- <a href="data:text/plain,2">Link</a>
- <a href="data:text/plain,3">Link</a>
+ <a href="data:text/plain,0">Link</a>
+ <a href="data:text/plain,1">Link</a>
+ <a href="data:text/plain,2">Link</a>
+ <a href="data:text/plain,3">Link</a>
</p>
<div dropzone="copy string:text/uri-list" ondrop="finish(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/006.xhtml
index eb5da24fc25..a0bca3312dc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/006.xhtml
@@ -4,28 +4,28 @@
<title>Dropzone and link drag and drop: allowed effects 'move','copyMove','linkMove' and 'all'</title>
<style type="text/css">
div
- {background-color:gray;
- width:200px;
- height:200px;}
+ {background-color:gray;
+ width:200px;
+ height:200px;}
</style>
<script type="application/ecmascript">
var effects = ['move','copyMove','linkMove','all'];
function start(event)
- {var e = parseInt(event.target.href.substring(16));
- event.dataTransfer.effectAllowed = effects[e];}
+ {var e = parseInt(event.target.href.substring(16));
+ event.dataTransfer.effectAllowed = effects[e];}
function finish(event)
- {var e = parseInt(event.dataTransfer.getData('text/uri-list').substring(16,17));
- document.querySelectorAll('a')[e].firstChild.nodeValue = (event.dataTransfer.dropEffect == 'move' &amp;&amp; event.dataTransfer.effectAllowed == effects[e])?'PASS':'FAIL';}
+ {var e = parseInt(event.dataTransfer.getData('text/uri-list').substring(16,17));
+ document.querySelectorAll('a')[e].firstChild.nodeValue = (event.dataTransfer.dropEffect == 'move' &amp;&amp; event.dataTransfer.effectAllowed == effects[e])?'PASS':'FAIL';}
</script>
</head>
<body>
<p>Drag links one by one and drop them into gray box below, link text should be updated as you drop them.</p>
<p ondragstart="start(event)">
- <a href="data:text/plain,0">Link</a>
- <a href="data:text/plain,1">Link</a>
- <a href="data:text/plain,2">Link</a>
- <a href="data:text/plain,3">Link</a>
+ <a href="data:text/plain,0">Link</a>
+ <a href="data:text/plain,1">Link</a>
+ <a href="data:text/plain,2">Link</a>
+ <a href="data:text/plain,3">Link</a>
</p>
<div dropzone="move string:text/uri-list" ondrop="finish(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/007.html b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/007.html
index 3140e768f72..ef0627a1e49 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/007.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/007.html
@@ -1,54 +1,54 @@
<!doctype html>
<html>
- <head>
- <title>Dropzone should not affect the dropEffect seen by dragenter and dragover</title>
- <style type="text/css">
+ <head>
+ <title>Dropzone should not affect the dropEffect seen by dragenter and dragover</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('div')[0];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'all';
- };
- var drop = document.getElementsByTagName('div')[1], dragenter, dragover;
- drop.ondragenter = function (e) {
- dragenter = e.dataTransfer.dropEffect;
- };
- drop.ondragover = function (e) {
- dragover = e.dataTransfer.dropEffect;
- };
- drop.ondrop = function (e) {
- var sequence = ([dragenter,dragover,e.dataTransfer.dropEffect]).join('=&gt;')
- var desiredsequence = (['copy','copy','link']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[2].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var drag = document.getElementsByTagName('div')[0];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ var drop = document.getElementsByTagName('div')[1], dragenter, dragover;
+ drop.ondragenter = function (e) {
+ dragenter = e.dataTransfer.dropEffect;
+ };
+ drop.ondragover = function (e) {
+ dragover = e.dataTransfer.dropEffect;
+ };
+ drop.ondrop = function (e) {
+ var sequence = ([dragenter,dragover,e.dataTransfer.dropEffect]).join('=&gt;')
+ var desiredsequence = (['copy','copy','link']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[2].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div dropzone="link string:text/plain"></div>
- <div>&nbsp;</div>
- <p>Drag the orange square onto the blue square and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ <div dropzone="link string:text/plain"></div>
+ <div>&nbsp;</div>
+ <p>Drag the orange square onto the blue square and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/008.html b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/008.html
index a82813c0430..4213e9f5579 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/008.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/008.html
@@ -1,56 +1,56 @@
<!doctype html>
<html>
- <head>
- <title>Dropzone should not affect the dropEffect if dragover is cancelled</title>
- <style type="text/css">
+ <head>
+ <title>Dropzone should not affect the dropEffect if dragover is cancelled</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('div')[0];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'all';
- };
- var drop = document.getElementsByTagName('div')[1], dragenter, dragover;
- drop.ondragenter = function (e) {
- dragenter = e.dataTransfer.dropEffect;
- e.preventDefault();
- };
- drop.ondragover = function (e) {
- dragover = e.dataTransfer.dropEffect;
- e.preventDefault();
- };
- drop.ondrop = function (e) {
- var sequence = ([dragenter,dragover,e.dataTransfer.dropEffect]).join('=&gt;')
- var desiredsequence = (['copy','copy','copy']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[2].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var drag = document.getElementsByTagName('div')[0];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ var drop = document.getElementsByTagName('div')[1], dragenter, dragover;
+ drop.ondragenter = function (e) {
+ dragenter = e.dataTransfer.dropEffect;
+ e.preventDefault();
+ };
+ drop.ondragover = function (e) {
+ dragover = e.dataTransfer.dropEffect;
+ e.preventDefault();
+ };
+ drop.ondrop = function (e) {
+ var sequence = ([dragenter,dragover,e.dataTransfer.dropEffect]).join('=&gt;')
+ var desiredsequence = (['copy','copy','copy']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[2].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div dropzone="link string:text/plain"></div>
- <div>&nbsp;</div>
- <p>Drag the orange square onto the blue square and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ <div dropzone="link string:text/plain"></div>
+ <div>&nbsp;</div>
+ <p>Drag the orange square onto the blue square and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/009.html b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/009.html
index cc94dba0315..c5ae10739ac 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/009.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/009.html
@@ -1,16 +1,16 @@
<!doctype html>
<html>
- <head>
- <title>Dropping selection onto dropzone with JS disabled</title>
- </head>
- <body>
+ <head>
+ <title>Dropping selection onto dropzone with JS disabled</title>
+ </head>
+ <body>
- <ol>
- <li>Disable JavaScript</li>
- <li>Select some text in this sentence.</li>
- <li dropzone="copy string:text/plain">Drag the selection over this text.</li>
- <li>If supported by the platform, the mouse cursor should show the drop-allowed cursor.</li>
- </ol>
+ <ol>
+ <li>Disable JavaScript</li>
+ <li>Select some text in this sentence.</li>
+ <li dropzone="copy string:text/plain">Drag the selection over this text.</li>
+ <li>If supported by the platform, the mouse cursor should show the drop-allowed cursor.</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/010.html b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/010.html
index ff787b829a3..44e112b2ba8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/010.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/dropzone/010.html
@@ -1,16 +1,16 @@
<!doctype html>
<html>
- <head>
- <title>Dropping selection onto dropzone with no padding</title>
- </head>
- <body>
+ <head>
+ <title>Dropping selection onto dropzone with no padding</title>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Select some text in this sentence.</li>
- <li dropzone="copy string:text/plain" ondrop="this.parentNode.getElementsByTagName('li')[2].textContent='PASS';">Drag the selection over this text and release it.</li>
- <li>This text should change.</li>
- </ol>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Select some text in this sentence.</li>
+ <li dropzone="copy string:text/plain" ondrop="this.parentNode.getElementsByTagName('li')[2].textContent='PASS';">Drag the selection over this text and release it.</li>
+ <li>This text should change.</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/001-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/001-1.xhtml
index 14eab24ca2f..001d0b5c908 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/001-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/001-1.xhtml
@@ -4,42 +4,42 @@
<title>Cross frame drag and drop: helper file</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))" ondragleave="leavePage(event)">
@@ -48,4 +48,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/002-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/002-1.xhtml
index ef47895d66b..7e575b2eb63 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/002-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/002-1.xhtml
@@ -4,42 +4,42 @@
<title>Cross frame drag and drop: helper file</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body onload="document.querySelector('input').select()" ondragleave="leavePage(event)">
@@ -48,4 +48,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/003-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/003-1.xhtml
index 8990404b1fa..2c7d3b9191c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/003-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/003-1.xhtml
@@ -4,42 +4,42 @@
<title>Cross frame drag and drop: helper file</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragleave="leavePage(event)">
@@ -48,4 +48,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/004.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/004.xhtml
index f8a27e69f82..85753621bb9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/004.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/004.xhtml
@@ -4,45 +4,45 @@
<title>Drag and drop of selection to iframe</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
iframe
- {width:100%;
- height:500px;}
+ {width:100%;
+ height:500px;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))" ondragleave="leavePage(event)">
@@ -52,4 +52,4 @@ function setColor(c)
<pre/>
<iframe src="helper-drop-here-body-circle.xhtml">XHTML document</iframe>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/005.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/005.xhtml
index b84055fec8d..4ea0a9058df 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/005.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/005.xhtml
@@ -4,45 +4,45 @@
<title>Drag and drop of text input selection to iframe</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
iframe
- {width:100%;
- height:500px;}
+ {width:100%;
+ height:500px;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body onload="document.querySelector('input').select()" ondragleave="leavePage(event)">
@@ -52,4 +52,4 @@ function setColor(c)
<pre/>
<iframe src="helper-drop-here-body-circle.xhtml">XHTML document</iframe>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/006.xhtml
index 40369c5701a..f9d659f31ae 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/006.xhtml
@@ -4,45 +4,45 @@
<title>Drag and drop of link to iframe</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
iframe
- {width:100%;
- height:500px;}
+ {width:100%;
+ height:500px;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragleave="leavePage(event)">
@@ -52,4 +52,4 @@ function setColor(c)
<pre/>
<iframe src="helper-drop-here-body-circle.xhtml">XHTML document</iframe>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/007.xhtml
index a7e91cdd0ab..3c1c217a894 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/007.xhtml
@@ -4,46 +4,46 @@
<title>Drag and drop of selection to object</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
object
- {width:100%;
- height:500px;
- border:solid medium navy;}
+ {width:100%;
+ height:500px;
+ border:solid medium navy;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))" ondragleave="leavePage(event)">
@@ -53,4 +53,4 @@ function setColor(c)
<pre/>
<object type="application/xhtml+xml" data="helper-drop-here-body-circle.xhtml">XHTML document</object>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/008.xhtml
index 8b275241413..e22695a6926 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/008.xhtml
@@ -4,46 +4,46 @@
<title>Drag and drop of text input selection to object</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
object
- {width:100%;
- height:500px;
- border:solid medium navy;}
+ {width:100%;
+ height:500px;
+ border:solid medium navy;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body onload="document.querySelector('input').select()" ondragleave="leavePage(event)">
@@ -53,4 +53,4 @@ function setColor(c)
<pre/>
<object type="application/xhtml+xml" data="helper-drop-here-body-circle.xhtml">XHTML document</object>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/009.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/009.xhtml
index d2eac96932c..d2ddd32bdcd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/009.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/009.xhtml
@@ -4,46 +4,46 @@
<title>Drag and drop of link to object</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
object
- {width:100%;
- height:500px;
- border:solid medium navy;}
+ {width:100%;
+ height:500px;
+ border:solid medium navy;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragleave="leavePage(event)">
@@ -53,4 +53,4 @@ function setColor(c)
<pre/>
<object type="application/xhtml+xml" data="helper-drop-here-body-circle.xhtml">XHTML document</object>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/010.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/010.xhtml
index 1a9566822eb..bbc22542825 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/010.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/010.xhtml
@@ -4,47 +4,47 @@
<title>Drag and drop of selection from iframe</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
iframe
- {width:100%;
- height:300px;}
+ {width:100%;
+ height:300px;}
</style>
<script type="application/ecmascript">
var step = 1;
function enterPage(event)
- {event.preventDefault();
- if(step++ > 0)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragenter should fire before dragover and drop');}
- }
+ {event.preventDefault();
+ if(step++ > 0)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragenter should fire before dragover and drop');}
+ }
function overPage(event)
- {event.preventDefault();
- if(step++ > 1)
- {setColor('green green silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {event.preventDefault();
+ if(step++ > 1)
+ {setColor('green green silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function dropIt(event)
- {if(step++ > 1)
- {setColor('green');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {if(step++ > 1)
+ {setColor('green');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragenter="enterPage(event)" ondragover="overPage(event)" ondrop="dropIt(event)">
@@ -52,4 +52,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/011.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/011.xhtml
index a4564bcba82..3ec4e5c40b4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/011.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/011.xhtml
@@ -4,47 +4,47 @@
<title>Drag and drop of text input selection from iframe</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
iframe
- {width:100%;
- height:300px;}
+ {width:100%;
+ height:300px;}
</style>
<script type="application/ecmascript">
var step = 1;
function enterPage(event)
- {event.preventDefault();
- if(step++ > 0)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragenter should fire before dragover and drop');}
- }
+ {event.preventDefault();
+ if(step++ > 0)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragenter should fire before dragover and drop');}
+ }
function overPage(event)
- {event.preventDefault();
- if(step++ > 1)
- {setColor('green green silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {event.preventDefault();
+ if(step++ > 1)
+ {setColor('green green silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function dropIt(event)
- {if(step++ > 1)
- {setColor('green');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {if(step++ > 1)
+ {setColor('green');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragenter="enterPage(event)" ondragover="overPage(event)" ondrop="dropIt(event)">
@@ -52,4 +52,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/012.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/012.xhtml
index 875d4ef562c..0cebe5d8959 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/012.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/012.xhtml
@@ -4,47 +4,47 @@
<title>Drag and drop of link from iframe</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
iframe
- {width:100%;
- height:300px;}
+ {width:100%;
+ height:300px;}
</style>
<script type="application/ecmascript">
var step = 1;
function enterPage(event)
- {event.preventDefault();
- if(step++ > 0)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragenter should fire before dragover and drop');}
- }
+ {event.preventDefault();
+ if(step++ > 0)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragenter should fire before dragover and drop');}
+ }
function overPage(event)
- {event.preventDefault();
- if(step++ > 1)
- {setColor('green green silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {event.preventDefault();
+ if(step++ > 1)
+ {setColor('green green silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function dropIt(event)
- {if(step++ > 1)
- {setColor('green');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {if(step++ > 1)
+ {setColor('green');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragenter="enterPage(event)" ondragover="overPage(event)" ondrop="dropIt(event)">
@@ -52,4 +52,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/013.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/013.xhtml
index e6df03c1a25..3e6c19c402c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/013.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/013.xhtml
@@ -4,48 +4,48 @@
<title>Drag and drop of selection from object</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
object
- {width:100%;
- height:300px;
- border:solid medium navy;}
+ {width:100%;
+ height:300px;
+ border:solid medium navy;}
</style>
<script type="application/ecmascript">
var step = 1;
function enterPage(event)
- {event.preventDefault();
- if(step++ > 0)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragenter should fire before dragover and drop');}
- }
+ {event.preventDefault();
+ if(step++ > 0)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragenter should fire before dragover and drop');}
+ }
function overPage(event)
- {event.preventDefault();
- if(step++ > 1)
- {setColor('green green silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {event.preventDefault();
+ if(step++ > 1)
+ {setColor('green green silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function dropIt(event)
- {if(step++ > 1)
- {setColor('green');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {if(step++ > 1)
+ {setColor('green');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragenter="enterPage(event)" ondragover="overPage(event)" ondrop="dropIt(event)">
@@ -53,4 +53,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/014.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/014.xhtml
index f82d57b1567..09abedd1f15 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/014.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/014.xhtml
@@ -4,48 +4,48 @@
<title>Drag and drop of text input selection from object</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
object
- {width:100%;
- height:300px;
- border:solid medium navy;}
+ {width:100%;
+ height:300px;
+ border:solid medium navy;}
</style>
<script type="application/ecmascript">
var step = 1;
function enterPage(event)
- {event.preventDefault();
- if(step++ > 0)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragenter should fire before dragover and drop');}
- }
+ {event.preventDefault();
+ if(step++ > 0)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragenter should fire before dragover and drop');}
+ }
function overPage(event)
- {event.preventDefault();
- if(step++ > 1)
- {setColor('green green silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {event.preventDefault();
+ if(step++ > 1)
+ {setColor('green green silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function dropIt(event)
- {if(step++ > 1)
- {setColor('green');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {if(step++ > 1)
+ {setColor('green');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragenter="enterPage(event)" ondragover="overPage(event)" ondrop="dropIt(event)">
@@ -53,4 +53,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/015.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/015.xhtml
index bcd076b2163..7baf086b774 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/015.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/015.xhtml
@@ -4,48 +4,48 @@
<title>Drag and drop of link from object</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
object
- {width:100%;
- height:300px;
- border:solid medium navy;}
+ {width:100%;
+ height:300px;
+ border:solid medium navy;}
</style>
<script type="application/ecmascript">
var step = 1;
function enterPage(event)
- {event.preventDefault();
- if(step++ > 0)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragenter should fire before dragover and drop');}
- }
+ {event.preventDefault();
+ if(step++ > 0)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragenter should fire before dragover and drop');}
+ }
function overPage(event)
- {event.preventDefault();
- if(step++ > 1)
- {setColor('green green silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {event.preventDefault();
+ if(step++ > 1)
+ {setColor('green green silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function dropIt(event)
- {if(step++ > 1)
- {setColor('green');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {if(step++ > 1)
+ {setColor('green');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragenter="enterPage(event)" ondragover="overPage(event)" ondrop="dropIt(event)">
@@ -53,4 +53,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/016.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/016.xhtml
index 91e991fdb85..e6f9972a4da 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/016.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/016.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop: events after dragenter is cancelled</title>
<script type="application/ecmascript">
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function start(event)
- {event.preventDefault();}
+ {event.preventDefault();}
function dragMe(event)
- {say('FAIL (drag event should not fire if dragstart is cancelled)');}
+ {say('FAIL (drag event should not fire if dragstart is cancelled)');}
function enterBody(event)
- {event.preventDefault();
- say('FAIL (dragover event should not fire if dragstart is cancelled)');}
+ {event.preventDefault();
+ say('FAIL (dragover event should not fire if dragstart is cancelled)');}
function overBody(event)
- {event.preventDefault();
- say('FAIL (dragover event should not fire if dragstart is cancelled)');}
+ {event.preventDefault();
+ say('FAIL (dragover event should not fire if dragstart is cancelled)');}
function dropIt(event)
- {say('FAIL (drop event should not fire if dragstart is cancelled)');}
+ {say('FAIL (drop event should not fire if dragstart is cancelled)');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
</script>
</head>
<body onload="selectText()" ondragenter="enterBody(event)" ondragover="overBody(event)" ondrop="dropIt(event)">
@@ -26,4 +26,4 @@ function say(it)
<p>You should not be able to drag text selection above.</p>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/017.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/017.xhtml
index e679ac0d35d..0a372b53374 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/017.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/017.xhtml
@@ -4,21 +4,21 @@
<title>Text input selection drag and drop: events after dragenter is cancelled</title>
<script type="application/ecmascript">
function selectText()
- {document.querySelector('input').select()}
+ {document.querySelector('input').select()}
function start(event)
- {event.preventDefault();}
+ {event.preventDefault();}
function dragMe(event)
- {say('FAIL (drag event should not fire if dragstart is cancelled)');}
+ {say('FAIL (drag event should not fire if dragstart is cancelled)');}
function enterBody(event)
- {event.preventDefault();
- say('FAIL (dragover event should not fire if dragstart is cancelled)');}
+ {event.preventDefault();
+ say('FAIL (dragover event should not fire if dragstart is cancelled)');}
function overBody(event)
- {event.preventDefault();
- say('FAIL (dragover event should not fire if dragstart is cancelled)');}
+ {event.preventDefault();
+ say('FAIL (dragover event should not fire if dragstart is cancelled)');}
function dropIt(event)
- {say('FAIL (drop event should not fire if dragstart is cancelled)');}
+ {say('FAIL (drop event should not fire if dragstart is cancelled)');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
</script>
</head>
<body onload="selectText()" ondragenter="enterBody(event)" ondragover="overBody(event)" ondrop="dropIt(event)">
@@ -26,4 +26,4 @@ function say(it)
<p>You should not be able to drag text selection above.</p>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/018.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/018.xhtml
index 65110f5c2b5..4aa8ba0997a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/018.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/018.xhtml
@@ -4,19 +4,19 @@
<title>Link drag and drop: events after dragenter is cancelled</title>
<script type="application/ecmascript">
function start(event)
- {event.preventDefault();}
+ {event.preventDefault();}
function dragMe(event)
- {say('FAIL (drag event should not fire if dragstart is cancelled)');}
+ {say('FAIL (drag event should not fire if dragstart is cancelled)');}
function enterBody(event)
- {event.preventDefault();
- say('FAIL (dragover event should not fire if dragstart is cancelled)');}
+ {event.preventDefault();
+ say('FAIL (dragover event should not fire if dragstart is cancelled)');}
function overBody(event)
- {event.preventDefault();
- say('FAIL (dragover event should not fire if dragstart is cancelled)');}
+ {event.preventDefault();
+ say('FAIL (dragover event should not fire if dragstart is cancelled)');}
function dropIt(event)
- {say('FAIL (drop event should not fire if dragstart is cancelled)');}
+ {say('FAIL (drop event should not fire if dragstart is cancelled)');}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
</script>
</head>
<body ondragenter="enterBody(event)" ondragover="overBody(event)" ondrop="dropIt(event)">
@@ -24,4 +24,4 @@ function say(it)
<p>You should not be able to drag link above.</p>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/019.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/019.xhtml
index 3c4928fc2eb..4e718dda274 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/019.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/019.xhtml
@@ -4,13 +4,13 @@
<title>Selection drag and drop: events after drag is cancelled</title>
<script type="application/ecmascript">
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dragMe(event)
- {event.preventDefault();}
+ {event.preventDefault();}
function dropIt(event)
- {say('FAIL (no drop should occur after drag is cancelled)')}
+ {say('FAIL (no drop should occur after drag is cancelled)')}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
</script>
</head>
<body onload="selectText()" dropzone="copy string:text/plain" ondrop="dropIt(event)">
@@ -18,4 +18,4 @@ function say(it)
<p>You should not be able to drop text selection above.</p>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/020.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/020.xhtml
index dfd9138b1df..4a1d60a647d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/020.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/020.xhtml
@@ -4,13 +4,13 @@
<title>Text input selection drag and drop: events after drag is cancelled</title>
<script type="application/ecmascript">
function selectText()
- {document.querySelector('input').select()}
+ {document.querySelector('input').select()}
function dragMe(event)
- {event.preventDefault();}
+ {event.preventDefault();}
function dropIt(event)
- {say('FAIL (no drop should occur after drag is cancelled)')}
+ {say('FAIL (no drop should occur after drag is cancelled)')}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
</script>
</head>
<body onload="selectText()" dropzone="copy string:text/plain" ondrop="dropIt(event)">
@@ -18,4 +18,4 @@ function say(it)
<p>You should not be able to drop text selection above.</p>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/021.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/021.xhtml
index 87313e9db8c..6cca911f1d1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/021.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/021.xhtml
@@ -4,11 +4,11 @@
<title>Link drag and drop: events after drag is cancelled</title>
<script type="application/ecmascript">
function dragMe(event)
- {event.preventDefault();}
+ {event.preventDefault();}
function dropIt(event)
- {say('FAIL (no drop should occur after drag is cancelled)')}
+ {say('FAIL (no drop should occur after drag is cancelled)')}
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
</script>
</head>
<body dropzone="copy string:text/uri-list" ondrop="dropIt(event)">
@@ -16,4 +16,4 @@ function say(it)
<p>You should not be able to drag link above.</p>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/022.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/022.xhtml
index 7d85f4218d8..98773f2cb69 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/022.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/022.xhtml
@@ -4,27 +4,27 @@
<title>Selection drag and drop: events after drag and drop is cancelled</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;}
</style>
<script type="application/ecmascript">
var result = true;
function selectText()
- {window.getSelection().selectAllChildren(document.querySelector('p'))}
+ {window.getSelection().selectAllChildren(document.querySelector('p'))}
function dropIt(event)
- {result = false;
- setColor('maroon');
- say('drop event : FAIL (no drop should occur once drag and drop is cancelled)')}
+ {result = false;
+ setColor('maroon');
+ say('drop event : FAIL (no drop should occur once drag and drop is cancelled)')}
function endDrag(event)
- {if(result)
- {setColor('teal')}
- }
+ {if(result)
+ {setColor('teal')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body onload="selectText()" dropzone="copy string:text/plain" ondrop="dropIt(event)">
@@ -33,4 +33,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/023.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/023.xhtml
index 7a10c5b394e..fadf76bf277 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/023.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/023.xhtml
@@ -4,27 +4,27 @@
<title>Text input selection drag and drop: events after drag and drop is cancelled</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;}
</style>
<script type="application/ecmascript">
var result = true;
function selectText()
- {document.querySelector('input').select()}
+ {document.querySelector('input').select()}
function dropIt(event)
- {result = false;
- setColor('maroon');
- say('drop event : FAIL (no drop should occur once drag and drop is cancelled)')}
+ {result = false;
+ setColor('maroon');
+ say('drop event : FAIL (no drop should occur once drag and drop is cancelled)')}
function endDrag(event)
- {if(result)
- {setColor('teal')}
- }
+ {if(result)
+ {setColor('teal')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body onload="selectText()" dropzone="copy string:text/plain" ondrop="dropIt(event)">
@@ -33,4 +33,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/024.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/024.xhtml
index cb079da399a..9afa8f709af 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/024.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/024.xhtml
@@ -4,25 +4,25 @@
<title>Link drag and drop: events after drag and drop is cancelled</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;}
</style>
<script type="application/ecmascript">
var result = true;
function dropIt(event)
- {result = false;
- setColor('maroon');
- say('drop event : FAIL (no drop should occur once drag and drop is cancelled)')}
+ {result = false;
+ setColor('maroon');
+ say('drop event : FAIL (no drop should occur once drag and drop is cancelled)')}
function endDrag(event)
- {if(result)
- {setColor('teal')}
- }
+ {if(result)
+ {setColor('teal')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'));}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body dropzone="copy string:text/uri-list" ondrop="dropIt(event)">
@@ -31,4 +31,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/025.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/025.html
index 043b40eedad..b4bbbc547ec 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/025.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/025.html
@@ -1,69 +1,69 @@
<!doctype html>
<html>
- <head>
- <title>Dragover repeating</title>
- <style type="text/css">
+ <head>
+ <title>Dragover repeating</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var numsecs = 5, maxpolltime = 0.550, minpolltime = 0.150;
- var blue = document.getElementsByTagName('div')[1], p = document.getElementsByTagName('p')[0];
- var numfired = 0, readytocount = false;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'all';
- e.dataTransfer.setData('text','dummy text');
- };
- blue.ondrop = function (e) {
- e.preventDefault();
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( readytocount ) { numfired++; }
- };
- blue.ondragenter = function (e) {
- e.preventDefault();
- p.innerHTML = 'Keep the mouse perfectly still...';
- //give the tester a second to get ready
- setTimeout(function () {
- readytocount = true;
- numfired = 0;
- p.innerHTML = 'Keep the mouse perfectly still for '+numsecs+' seconds';
- var countsecs = numsecs;
- var intr = setInterval(function () {
- countsecs--;
- if( countsecs ) {
- p.innerHTML = 'Keep the mouse perfectly still for '+countsecs+' seconds';
- } else {
- clearInterval(intr);
- var passed = numfired >= Math.floor( numsecs / maxpolltime ) && numfired <= Math.floor( numsecs / minpolltime );
- document.getElementsByTagName('p')[0].innerHTML = ( passed ? 'PASS' : 'FAIL' ) +
- '<br><br>(Fired ' + numfired + ' times in ' + numsecs + ' seconds, must be between ' +
- Math.floor( numsecs / maxpolltime ) + ' and ' + Math.floor( numsecs / minpolltime ) + ')<br>You can release the drag now';
- }
- },1000);
- },1000);
- };
+ var numsecs = 5, maxpolltime = 0.550, minpolltime = 0.150;
+ var blue = document.getElementsByTagName('div')[1], p = document.getElementsByTagName('p')[0];
+ var numfired = 0, readytocount = false;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'all';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ blue.ondrop = function (e) {
+ e.preventDefault();
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( readytocount ) { numfired++; }
+ };
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ p.innerHTML = 'Keep the mouse perfectly still...';
+ //give the tester a second to get ready
+ setTimeout(function () {
+ readytocount = true;
+ numfired = 0;
+ p.innerHTML = 'Keep the mouse perfectly still for '+numsecs+' seconds';
+ var countsecs = numsecs;
+ var intr = setInterval(function () {
+ countsecs--;
+ if( countsecs ) {
+ p.innerHTML = 'Keep the mouse perfectly still for '+countsecs+' seconds';
+ } else {
+ clearInterval(intr);
+ var passed = numfired >= Math.floor( numsecs / maxpolltime ) && numfired <= Math.floor( numsecs / minpolltime );
+ document.getElementsByTagName('p')[0].innerHTML = ( passed ? 'PASS' : 'FAIL' ) +
+ '<br><br>(Fired ' + numfired + ' times in ' + numsecs + ' seconds, must be between ' +
+ Math.floor( numsecs / maxpolltime ) + ' and ' + Math.floor( numsecs / minpolltime ) + ')<br>You can release the drag now';
+ }
+ },1000);
+ },1000);
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <p>Drag the orange square over the blue square, then keep the mouse perfectly still until the result appears.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ <div></div>
+ <p>Drag the orange square over the blue square, then keep the mouse perfectly still until the result appears.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/026.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/026.html
index 7ea1755538d..816155a09de 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/026.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/026.html
@@ -1,61 +1,61 @@
<!doctype html>
<html>
- <head>
- <title>Drag repeating</title>
- <style type="text/css">
+ <head>
+ <title>Drag repeating</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var numsecs = 5, maxpolltime = 0.550, minpolltime = 0.150;
- var orange = document.getElementsByTagName('div')[0], p = document.getElementsByTagName('p')[0];
- var numfired = 0, readytocount = false;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'all';
- e.dataTransfer.setData('text','dummy text');
- p.innerHTML = 'Keep the mouse perfectly still...';
- //give the tester a second to get ready
- setTimeout(function () {
- readytocount = true;
- numfired = 0;
- p.innerHTML = 'Keep the mouse perfectly still for '+numsecs+' seconds';
- var countsecs = numsecs;
- var intr = setInterval(function () {
- countsecs--;
- if( countsecs ) {
- p.innerHTML = 'Keep the mouse perfectly still for '+countsecs+' seconds';
- } else {
- clearInterval(intr);
- var passed = numfired >= Math.floor( numsecs / maxpolltime ) && numfired <= Math.floor( numsecs / minpolltime );
- document.getElementsByTagName('p')[0].innerHTML = ( passed ? 'PASS' : 'FAIL' ) +
- '<br><br>(Fired ' + numfired + ' times in ' + numsecs + ' seconds, must be between ' +
- Math.floor( numsecs / maxpolltime ) + ' and ' + Math.floor( numsecs / minpolltime ) + ')<br>You can release the drag now';
- }
- },1000);
- },1000);
- };
- orange.ondrag = function (e) {
- if( readytocount ) { numfired++; }
- };
+ var numsecs = 5, maxpolltime = 0.550, minpolltime = 0.150;
+ var orange = document.getElementsByTagName('div')[0], p = document.getElementsByTagName('p')[0];
+ var numfired = 0, readytocount = false;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'all';
+ e.dataTransfer.setData('text','dummy text');
+ p.innerHTML = 'Keep the mouse perfectly still...';
+ //give the tester a second to get ready
+ setTimeout(function () {
+ readytocount = true;
+ numfired = 0;
+ p.innerHTML = 'Keep the mouse perfectly still for '+numsecs+' seconds';
+ var countsecs = numsecs;
+ var intr = setInterval(function () {
+ countsecs--;
+ if( countsecs ) {
+ p.innerHTML = 'Keep the mouse perfectly still for '+countsecs+' seconds';
+ } else {
+ clearInterval(intr);
+ var passed = numfired >= Math.floor( numsecs / maxpolltime ) && numfired <= Math.floor( numsecs / minpolltime );
+ document.getElementsByTagName('p')[0].innerHTML = ( passed ? 'PASS' : 'FAIL' ) +
+ '<br><br>(Fired ' + numfired + ' times in ' + numsecs + ' seconds, must be between ' +
+ Math.floor( numsecs / maxpolltime ) + ' and ' + Math.floor( numsecs / minpolltime ) + ')<br>You can release the drag now';
+ }
+ },1000);
+ },1000);
+ };
+ orange.ondrag = function (e) {
+ if( readytocount ) { numfired++; }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <p>Drag the orange square sideways until the drag placeholder appears, then keep the mouse perfectly still until the result appears.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ <p>Drag the orange square sideways until the drag placeholder appears, then keep the mouse perfectly still until the result appears.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/027.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/027.xhtml
index f6103619713..983bcd298b6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/027.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/027.xhtml
@@ -4,16 +4,16 @@
<title>PNG image drag and drop: 'return false' should not cancel event</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body onload="document.querySelector('img').addEventListener('drag',function (){return false},false)">
@@ -21,4 +21,4 @@ function addImage(event)
<p>Drag green circle to the silver box below and drop it. It should be copied to the box once you drop it there.</p>
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/028.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/028.xhtml
index ce4944106a1..35c69766f61 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/028.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/028.xhtml
@@ -4,11 +4,11 @@
<title>Link drag and drop: 'return false' should not cancel event</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('a').addEventListener('drag',function (){return false},false)">
@@ -16,4 +16,4 @@ div
<p>Drag link above to the navy box below and drop it. You should see word PASS once you drop it in the box.</p>
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="document.querySelector('div').appendChild(document.createTextNode((event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'))"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/029.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/029.html
index c02cd95b3a4..70c243d9936 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/029.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/029.html
@@ -1,79 +1,79 @@
<!doctype html>
<html>
- <head>
- <title>Drag and drop without cancelling dragenter</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop without cancelling dragenter</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('div')[0], sequence = [];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'copy';
- };
- drag.ondragenter = drag.ondragover = function (e) {
- e.preventDefault();
- };
- var drop = document.getElementsByTagName('div')[1], dragoverhasfired = false;
- drop.ondragenter = function (e) {
- dragoverhasfired = true; //events targeting body will be ignored until this event has fired
- sequence[sequence.length] = 'drop.dragenter';
- };
- drop.ondragover = function (e) {
- e.preventDefault();
- if( sequence[sequence.length-1] != 'drop.dragover' ) {
- sequence[sequence.length] = 'drop.dragover';
- }
- };
- drop.ondrop = function (e) {
- e.preventDefault();
- sequence[sequence.length] = 'drop.ondrop';
- };
- document.body.ondragenter = function (e) {
- if( e.target != this ) { return; }
- if( dragoverhasfired ) {
- sequence[sequence.length] = 'body.dragenter';
- }
- };
- document.body.ondragover = function (e) {
- if( e.target != this ) { return; }
- if( dragoverhasfired ) {
- if( sequence[sequence.length-1] != 'body.dragover' ) {
- sequence[sequence.length] = 'body.dragover';
- }
- }
- };
- drag.ondragend = function (e) {
- sequence = sequence.join('=&gt;')
- var desiredsequence = (['drop.dragenter','body.dragenter','body.dragover']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[2].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var drag = document.getElementsByTagName('div')[0], sequence = [];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ drag.ondragenter = drag.ondragover = function (e) {
+ e.preventDefault();
+ };
+ var drop = document.getElementsByTagName('div')[1], dragoverhasfired = false;
+ drop.ondragenter = function (e) {
+ dragoverhasfired = true; //events targeting body will be ignored until this event has fired
+ sequence[sequence.length] = 'drop.dragenter';
+ };
+ drop.ondragover = function (e) {
+ e.preventDefault();
+ if( sequence[sequence.length-1] != 'drop.dragover' ) {
+ sequence[sequence.length] = 'drop.dragover';
+ }
+ };
+ drop.ondrop = function (e) {
+ e.preventDefault();
+ sequence[sequence.length] = 'drop.ondrop';
+ };
+ document.body.ondragenter = function (e) {
+ if( e.target != this ) { return; }
+ if( dragoverhasfired ) {
+ sequence[sequence.length] = 'body.dragenter';
+ }
+ };
+ document.body.ondragover = function (e) {
+ if( e.target != this ) { return; }
+ if( dragoverhasfired ) {
+ if( sequence[sequence.length-1] != 'body.dragover' ) {
+ sequence[sequence.length] = 'body.dragover';
+ }
+ }
+ };
+ drag.ondragend = function (e) {
+ sequence = sequence.join('=&gt;')
+ var desiredsequence = (['drop.dragenter','body.dragenter','body.dragover']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[2].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div><div></div>
- <div>&nbsp;</div>
- <p>Drag the orange square onto the blue square and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div><div></div>
+ <div>&nbsp;</div>
+ <p>Drag the orange square onto the blue square and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/030.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/030.html
index 5d5eaa28409..8dc573474d1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/030.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/030.html
@@ -1,23 +1,23 @@
<!doctype html>
<html>
- <head>
- <title>Drag and drop without cancelling dragenter on body</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop without cancelling dragenter on body</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- margin-left: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ margin-left: 100px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
//If dragenter is cancelled the body should then become the target element, receiving both a dragenter and a dragover event.
//When the body is the actual immediate user selection (first time over the body), that means it gets *2* dragenter events
//Then when a div becomes immediate user selection (blue) but does not cancel the dragenter event, dragenter does not need
@@ -25,37 +25,37 @@ div:first-child + div {
//Then when the body is the actual immediate user selection again (second time over the body), it is already the current
//target element, so does not get a dragenter event
window.onload = function () {
- var drag = document.getElementsByTagName('div')[0], beforecount = 0, aftercount = 0, switchcount = false;
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'copy';
- };
- drag.ondragenter = drag.ondrop = drag.ondragover = function (e) {
- e.preventDefault();
- };
- var drop = document.getElementsByTagName('div')[1];
- drop.ondragenter = function (e) {
- switchcount = true;
- };
- drop.ondragover = function (e) {
- e.preventDefault();
- };
- document.body.ondragenter = function (e) {
- if( e.target != this ) { return; }
- if( switchcount ) { aftercount++; } else { beforecount++; }
- };
- drag.ondragend = function (e) {
- document.getElementsByTagName('div')[2].innerHTML = ( beforecount == 2 && aftercount == 0 ) ? 'PASS' : ( 'FAIL, dragenter fired on body '+beforecount+' time(s) before blue.ondragenter and '+aftercount+' time(s) afterwards, instead of 2 and 0 times respectively' );
- };
+ var drag = document.getElementsByTagName('div')[0], beforecount = 0, aftercount = 0, switchcount = false;
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ drag.ondragenter = drag.ondrop = drag.ondragover = function (e) {
+ e.preventDefault();
+ };
+ var drop = document.getElementsByTagName('div')[1];
+ drop.ondragenter = function (e) {
+ switchcount = true;
+ };
+ drop.ondragover = function (e) {
+ e.preventDefault();
+ };
+ document.body.ondragenter = function (e) {
+ if( e.target != this ) { return; }
+ if( switchcount ) { aftercount++; } else { beforecount++; }
+ };
+ drag.ondragend = function (e) {
+ document.getElementsByTagName('div')[2].innerHTML = ( beforecount == 2 && aftercount == 0 ) ? 'PASS' : ( 'FAIL, dragenter fired on body '+beforecount+' time(s) before blue.ondragenter and '+aftercount+' time(s) afterwards, instead of 2 and 0 times respectively' );
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div><div></div>
- <div>&nbsp;</div>
- <p>Drag the orange square onto the blue square, then back to the orange square, and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div><div></div>
+ <div>&nbsp;</div>
+ <p>Drag the orange square onto the blue square, then back to the orange square, and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/031-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/031-1.html
index 1574c590471..b70082ba21e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/031-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/031-1.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Non-rendered body should still become current target element</title>
- <style type="text/css">
+ <head>
+ <title>Non-rendered body should still become current target element</title>
+ <style type="text/css">
html { background: blue; }
- </style>
- </head>
- <body>
+ </style>
+ </head>
+ <body>
- <script type="text/javascript">
+ <script type="text/javascript">
var seentypes = {};
document.body.ondragenter = document.body.ondragover = document.body.ondrop = function (e) {
- e.preventDefault();
- //document.body.innerHTML += e.type;
- if( e.type == 'drop' ) {
- document.body.innerHTML = ( seentypes.dragenter && seentypes.dragover ) ? 'PASS' : 'FAIL';
- } else {
- seentypes[e.type] = true;
- }
+ e.preventDefault();
+ //document.body.innerHTML += e.type;
+ if( e.type == 'drop' ) {
+ document.body.innerHTML = ( seentypes.dragenter && seentypes.dragover ) ? 'PASS' : 'FAIL';
+ } else {
+ seentypes[e.type] = true;
+ }
}
- </script>
+ </script>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/031.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/031.html
index 101edeafb49..92220e30e11 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/031.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/031.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Non-rendered body should still become current target element</title>
- <style type="text/css">
+ <head>
+ <title>Non-rendered body should still become current target element</title>
+ <style type="text/css">
span { background: orange; display: inline-block; height: 200px; width: 200px; }
iframe { border: none; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('span')[0].ondragstart = function (e) {
- e.dataTransfer.setData('text','dummy text');
- e.dataTransfer.effectAllowed = 'copy';
- };
+ document.getElementsByTagName('span')[0].ondragstart = function (e) {
+ e.dataTransfer.setData('text','dummy text');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Drag the orange square onto the blue square and release it. Fail if text does not appear in the blue square.</p>
- <p><span draggable="true"></span> <iframe height="200" width="200" src="031-1.html"></iframe></p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. Fail if text does not appear in the blue square.</p>
+ <p><span draggable="true"></span> <iframe height="200" width="200" src="031-1.html"></iframe></p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/032.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/032.html
index af1e2253f1d..a928a3c425e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/032.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/032.html
@@ -1,81 +1,81 @@
<!doctype html>
<html>
- <head>
- <title>Drag and drop passing over body without cancelling dragenter</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop passing over body without cancelling dragenter</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- margin-left: 200px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ margin-left: 200px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
//this test enforces the following spec statement:
//"if this immediate user selection is not the same as the current target element"
window.onload = function () {
- var drag = document.getElementsByTagName('div')[0], sequence = [];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'copy';
- };
- drag.ondragenter = function (e) {
- sequence[sequence.length] = 'drag.dragenter';
- };
- drag.ondragover = function (e) {
- if( sequence[sequence.length-1] != 'drag.dragover' ) {
- sequence[sequence.length] = 'drag.dragover';
- }
- };
- var drop = document.getElementsByTagName('div')[1];
- drop.ondragenter = function (e) {
- e.preventDefault();
- sequence[sequence.length] = 'drop.dragenter';
- };
- drop.ondragover = function (e) {
- e.preventDefault();
- if( sequence[sequence.length-1] != 'drop.dragover' ) {
- sequence[sequence.length] = 'drop.dragover';
- }
- };
- drop.ondrop = function (e) {
- e.preventDefault();
- sequence[sequence.length] = 'drop.ondrop';
- };
- document.body.ondragenter = function (e) {
- sequence[sequence.length] = ( e.target == this ) ? 'body.dragenter' : 'bubble.dragenter';
- };
- document.body.ondragover = function (e) {
- if( e.target != this ) { return; }
- if( sequence[sequence.length-1] != 'body.dragover' ) {
- sequence[sequence.length] = 'body.dragover';
- }
- };
- drag.ondragend = function (e) {
- sequence = sequence.join('=&gt;')
- var desiredsequence = (['drag.dragenter','bubble.dragenter','body.dragenter','body.dragover','drop.dragenter','bubble.dragenter','drop.dragover','drop.ondrop']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[2].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var drag = document.getElementsByTagName('div')[0], sequence = [];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ drag.ondragenter = function (e) {
+ sequence[sequence.length] = 'drag.dragenter';
+ };
+ drag.ondragover = function (e) {
+ if( sequence[sequence.length-1] != 'drag.dragover' ) {
+ sequence[sequence.length] = 'drag.dragover';
+ }
+ };
+ var drop = document.getElementsByTagName('div')[1];
+ drop.ondragenter = function (e) {
+ e.preventDefault();
+ sequence[sequence.length] = 'drop.dragenter';
+ };
+ drop.ondragover = function (e) {
+ e.preventDefault();
+ if( sequence[sequence.length-1] != 'drop.dragover' ) {
+ sequence[sequence.length] = 'drop.dragover';
+ }
+ };
+ drop.ondrop = function (e) {
+ e.preventDefault();
+ sequence[sequence.length] = 'drop.ondrop';
+ };
+ document.body.ondragenter = function (e) {
+ sequence[sequence.length] = ( e.target == this ) ? 'body.dragenter' : 'bubble.dragenter';
+ };
+ document.body.ondragover = function (e) {
+ if( e.target != this ) { return; }
+ if( sequence[sequence.length-1] != 'body.dragover' ) {
+ sequence[sequence.length] = 'body.dragover';
+ }
+ };
+ drag.ondragend = function (e) {
+ sequence = sequence.join('=&gt;')
+ var desiredsequence = (['drag.dragenter','bubble.dragenter','body.dragenter','body.dragover','drop.dragenter','bubble.dragenter','drop.dragover','drop.ondrop']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[2].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div><div></div>
- <div>&nbsp;</div>
- <p>Drag the orange square onto the blue square and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div><div></div>
+ <div>&nbsp;</div>
+ <p>Drag the orange square onto the blue square and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/033.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/033.html
index c33aa554606..d06bee3d8d3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/033.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/033.html
@@ -1,79 +1,79 @@
<!doctype html>
<html>
- <head>
- <title>Drag and drop without cancelling dragenter from non-target to non-target</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop without cancelling dragenter from non-target to non-target</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('div')[0], sequence = [];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'copy';
- };
- drag.ondragenter = function (e) {
- sequence[sequence.length] = 'drag.dragenter';
- };
- drag.ondragover = function (e) {
- if( sequence[sequence.length-1] != 'drag.dragover' ) {
- sequence[sequence.length] = 'drag.dragover';
- }
- };
- drag.ondragleave = function (e) {
- sequence[sequence.length] = 'drag.dragleave';
- };
- var drop = document.getElementsByTagName('div')[1];
- drop.ondragenter = function (e) {
- sequence[sequence.length] = 'drop.dragenter';
- };
- drop.ondragover = function (e) {
- if( sequence[sequence.length-1] != 'drop.dragover' ) {
- sequence[sequence.length] = 'drop.dragover';
- }
- };
- drop.ondrop = function (e) {
- e.preventDefault();
- sequence[sequence.length] = 'drop.ondrop';
- };
- document.body.ondragenter = function (e) {
- sequence[sequence.length] = ( e.target == this ) ? 'body.dragenter' : 'bubble.dragenter';
- };
- document.body.ondragover = function (e) {
- if( e.target != this ) { return; }
- if( sequence[sequence.length-1] != 'body.dragover' ) {
- sequence[sequence.length] = 'body.dragover';
- }
- };
- drag.ondragend = function (e) {
- sequence = sequence.join('=&gt;')
- var desiredsequence = (['drag.dragenter','bubble.dragenter','body.dragenter','body.dragover','drop.dragenter','bubble.dragenter','body.dragover']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[2].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var drag = document.getElementsByTagName('div')[0], sequence = [];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ drag.ondragenter = function (e) {
+ sequence[sequence.length] = 'drag.dragenter';
+ };
+ drag.ondragover = function (e) {
+ if( sequence[sequence.length-1] != 'drag.dragover' ) {
+ sequence[sequence.length] = 'drag.dragover';
+ }
+ };
+ drag.ondragleave = function (e) {
+ sequence[sequence.length] = 'drag.dragleave';
+ };
+ var drop = document.getElementsByTagName('div')[1];
+ drop.ondragenter = function (e) {
+ sequence[sequence.length] = 'drop.dragenter';
+ };
+ drop.ondragover = function (e) {
+ if( sequence[sequence.length-1] != 'drop.dragover' ) {
+ sequence[sequence.length] = 'drop.dragover';
+ }
+ };
+ drop.ondrop = function (e) {
+ e.preventDefault();
+ sequence[sequence.length] = 'drop.ondrop';
+ };
+ document.body.ondragenter = function (e) {
+ sequence[sequence.length] = ( e.target == this ) ? 'body.dragenter' : 'bubble.dragenter';
+ };
+ document.body.ondragover = function (e) {
+ if( e.target != this ) { return; }
+ if( sequence[sequence.length-1] != 'body.dragover' ) {
+ sequence[sequence.length] = 'body.dragover';
+ }
+ };
+ drag.ondragend = function (e) {
+ sequence = sequence.join('=&gt;')
+ var desiredsequence = (['drag.dragenter','bubble.dragenter','body.dragenter','body.dragover','drop.dragenter','bubble.dragenter','body.dragover']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[2].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div><div></div>
- <div>&nbsp;</div>
- <p>Drag the orange square onto the blue square and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div><div></div>
+ <div>&nbsp;</div>
+ <p>Drag the orange square onto the blue square and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/034.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/034.html
index ed13d00ca64..ea8867ba2c7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/034.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/034.html
@@ -1,56 +1,56 @@
<!doctype html>
<html>
- <head>
- <title>Drag and drop with cancelling dragenter on body</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with cancelling dragenter on body</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- margin-left: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ margin-left: 100px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('div')[0], beforecount = 0, aftercount = 0, switchcount = false;
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'copy';
- };
- drag.ondragenter = drag.ondrop = drag.ondragover = function (e) {
- e.preventDefault();
- };
- var drop = document.getElementsByTagName('div')[1];
- drop.ondragenter = function (e) {
- switchcount = true;
- };
- drop.ondragover = function (e) {
- e.preventDefault();
- };
- document.body.ondragenter = function (e) {
- if( e.target != this ) { return; }
- e.preventDefault(); //don't cancel when it bubbles from the child elements
- if( switchcount ) { aftercount++; } else { beforecount++; }
- };
- drag.ondragend = function (e) {
- document.getElementsByTagName('div')[2].innerHTML = ( beforecount == 1 && aftercount == 0 ) ? 'PASS' : ( 'FAIL, dragenter fired on body '+beforecount+' time(s) before blue.ondragenter and '+aftercount+' time(s) afterwards, instead of 1 and 0 times respectively' );
- };
+ var drag = document.getElementsByTagName('div')[0], beforecount = 0, aftercount = 0, switchcount = false;
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ drag.ondragenter = drag.ondrop = drag.ondragover = function (e) {
+ e.preventDefault();
+ };
+ var drop = document.getElementsByTagName('div')[1];
+ drop.ondragenter = function (e) {
+ switchcount = true;
+ };
+ drop.ondragover = function (e) {
+ e.preventDefault();
+ };
+ document.body.ondragenter = function (e) {
+ if( e.target != this ) { return; }
+ e.preventDefault(); //don't cancel when it bubbles from the child elements
+ if( switchcount ) { aftercount++; } else { beforecount++; }
+ };
+ drag.ondragend = function (e) {
+ document.getElementsByTagName('div')[2].innerHTML = ( beforecount == 1 && aftercount == 0 ) ? 'PASS' : ( 'FAIL, dragenter fired on body '+beforecount+' time(s) before blue.ondragenter and '+aftercount+' time(s) afterwards, instead of 1 and 0 times respectively' );
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div><div></div>
- <div>&nbsp;</div>
- <p>Drag the orange square onto the blue square, then back to the orange square, and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div><div></div>
+ <div>&nbsp;</div>
+ <p>Drag the orange square onto the blue square, then back to the orange square, and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/035.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/035.html
index 3d1ba04c710..8a7cb174912 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/035.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/035.html
@@ -1,83 +1,83 @@
<!doctype html>
<html>
- <head>
- <title>Drag and drop passing over body with cancelling dragenter</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop passing over body with cancelling dragenter</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- margin-left: 200px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ margin-left: 200px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
//this test enforces the following spec statement:
//"if this immediate user selection is not the same as the current target element"
window.onload = function () {
- var drag = document.getElementsByTagName('div')[0], sequence = [];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'copy';
- };
- drag.ondragenter = function (e) {
- sequence[sequence.length] = 'drag.dragenter';
- };
- drag.ondragover = function (e) {
- if( sequence[sequence.length-1] != 'drag.dragover' ) {
- sequence[sequence.length] = 'drag.dragover';
- }
- };
- var drop = document.getElementsByTagName('div')[1];
- drop.ondragenter = function (e) {
- e.preventDefault();
- sequence[sequence.length] = 'drop.dragenter';
- };
- drop.ondragover = function (e) {
- e.preventDefault();
- if( sequence[sequence.length-1] != 'drop.dragover' ) {
- sequence[sequence.length] = 'drop.dragover';
- }
- };
- drop.ondrop = function (e) {
- e.preventDefault();
- sequence[sequence.length] = 'drop.ondrop';
- };
- document.body.ondragenter = function (e) {
- sequence[sequence.length] = ( e.target == this ) ? 'body.dragenter' : 'bubble.dragenter';
- if( e.target != this ) { return; }
- e.preventDefault(); //don't cancel when it bubbles from the child elements
- };
- document.body.ondragover = function (e) {
- if( e.target != this ) { return; }
- if( sequence[sequence.length-1] != 'body.dragover' ) {
- sequence[sequence.length] = 'body.dragover';
- }
- };
- drag.ondragend = function (e) {
- sequence = sequence.join('=&gt;')
- var desiredsequence = (['drag.dragenter','bubble.dragenter','body.dragenter','body.dragover','drop.dragenter','bubble.dragenter','drop.dragover','drop.ondrop']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[2].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var drag = document.getElementsByTagName('div')[0], sequence = [];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ drag.ondragenter = function (e) {
+ sequence[sequence.length] = 'drag.dragenter';
+ };
+ drag.ondragover = function (e) {
+ if( sequence[sequence.length-1] != 'drag.dragover' ) {
+ sequence[sequence.length] = 'drag.dragover';
+ }
+ };
+ var drop = document.getElementsByTagName('div')[1];
+ drop.ondragenter = function (e) {
+ e.preventDefault();
+ sequence[sequence.length] = 'drop.dragenter';
+ };
+ drop.ondragover = function (e) {
+ e.preventDefault();
+ if( sequence[sequence.length-1] != 'drop.dragover' ) {
+ sequence[sequence.length] = 'drop.dragover';
+ }
+ };
+ drop.ondrop = function (e) {
+ e.preventDefault();
+ sequence[sequence.length] = 'drop.ondrop';
+ };
+ document.body.ondragenter = function (e) {
+ sequence[sequence.length] = ( e.target == this ) ? 'body.dragenter' : 'bubble.dragenter';
+ if( e.target != this ) { return; }
+ e.preventDefault(); //don't cancel when it bubbles from the child elements
+ };
+ document.body.ondragover = function (e) {
+ if( e.target != this ) { return; }
+ if( sequence[sequence.length-1] != 'body.dragover' ) {
+ sequence[sequence.length] = 'body.dragover';
+ }
+ };
+ drag.ondragend = function (e) {
+ sequence = sequence.join('=&gt;')
+ var desiredsequence = (['drag.dragenter','bubble.dragenter','body.dragenter','body.dragover','drop.dragenter','bubble.dragenter','drop.dragover','drop.ondrop']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[2].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div><div></div>
- <div>&nbsp;</div>
- <p>Drag the orange square onto the blue square and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div><div></div>
+ <div>&nbsp;</div>
+ <p>Drag the orange square onto the blue square and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/036.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/036.html
index 5a2d3c337c4..1c66f184830 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/036.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/036.html
@@ -1,70 +1,70 @@
<!doctype html>
<html>
- <head>
- <title>Drag and drop passing over body with all events handled at body</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop passing over body with all events handled at body</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- margin-left: 200px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ margin-left: 200px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('div')[0], drop = document.getElementsByTagName('div')[1], sequence = [];
- function targ(el) {
- if( el == drag ) { return 'drag'; }
- else if( el == drop ) { return 'drop'; }
- else if( el == document.body ) { return 'body'; }
- else { return el; }
- }
- document.body.ondragstart = function (e) {
- e.dataTransfer.setData('text','data');
- e.dataTransfer.effectAllowed = 'copy';
- };
- document.body.ondragenter = function (e) {
- e.preventDefault();
- sequence[sequence.length] = targ(e.target)+'.ondragenter';
- };
- document.body.ondragover = function (e) {
- e.preventDefault();
- var seqname = targ(e.target)+'.ondragover';
- if( sequence[sequence.length-1] != seqname ) {
- sequence[sequence.length] = seqname;
- }
- };
- document.body.ondrop = function (e) {
- e.preventDefault();
- sequence[sequence.length] = targ(e.target)+'.ondrop';
- sequence[sequence.length] = e.dataTransfer.getData('text');
- };
- document.body.ondragend = function (e) {
- sequence[sequence.length] = targ(e.target)+'.ondragend';
- sequence = sequence.join('=&gt;')
- var desiredsequence = (['drag.ondragenter','drag.ondragover','body.ondragenter','body.ondragover','drop.ondragenter','drop.ondragover','drop.ondrop','data','drag.ondragend']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[2].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var drag = document.getElementsByTagName('div')[0], drop = document.getElementsByTagName('div')[1], sequence = [];
+ function targ(el) {
+ if( el == drag ) { return 'drag'; }
+ else if( el == drop ) { return 'drop'; }
+ else if( el == document.body ) { return 'body'; }
+ else { return el; }
+ }
+ document.body.ondragstart = function (e) {
+ e.dataTransfer.setData('text','data');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ document.body.ondragenter = function (e) {
+ e.preventDefault();
+ sequence[sequence.length] = targ(e.target)+'.ondragenter';
+ };
+ document.body.ondragover = function (e) {
+ e.preventDefault();
+ var seqname = targ(e.target)+'.ondragover';
+ if( sequence[sequence.length-1] != seqname ) {
+ sequence[sequence.length] = seqname;
+ }
+ };
+ document.body.ondrop = function (e) {
+ e.preventDefault();
+ sequence[sequence.length] = targ(e.target)+'.ondrop';
+ sequence[sequence.length] = e.dataTransfer.getData('text');
+ };
+ document.body.ondragend = function (e) {
+ sequence[sequence.length] = targ(e.target)+'.ondragend';
+ sequence = sequence.join('=&gt;')
+ var desiredsequence = (['drag.ondragenter','drag.ondragover','body.ondragenter','body.ondragover','drop.ondragenter','drop.ondragover','drop.ondrop','data','drag.ondragend']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[2].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[2].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div><div></div>
- <div>&nbsp;</div>
- <p>Drag the orange square onto the blue square and release it. For the entire duration of the drag, if supported by the platform, the mouse cursor should show as a drop-allowed or drop-copy-allowed cursor.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div><div></div>
+ <div>&nbsp;</div>
+ <p>Drag the orange square onto the blue square and release it. For the entire duration of the drag, if supported by the platform, the mouse cursor should show as a drop-allowed or drop-copy-allowed cursor.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/037-proposed.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/037-proposed.xhtml
index 6fdd1b2f4d7..3c94177f02e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/037-proposed.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/037-proposed.xhtml
@@ -1,25 +1,25 @@
<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Drag and drop without cancelling dragenter and without body</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop without cancelling dragenter and without body</title>
+ <style type="text/css">
html {
- padding:20px;
+ padding:20px;
}
head + div {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
head + div + div {
- height: 100px;
- width: 100px;
- margin-left: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ margin-left: 100px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript"><![CDATA[
+ </style>
+ <script type="text/javascript"><![CDATA[
//Drag passes from orange to root element. Dragenter fires at root element.
//Dragenter is not cancelled. Body does not exist. Dragenter fires at root element again.
//Drag passes from root element to blue. Dragenter fires at blue.
@@ -27,60 +27,60 @@ head + div + div {
//Drag passes from blue to root element. Current target element is already root element.
//Drag passes from root element to orange. Dragenter fires at orange, and is cancelled.
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], sequence = [];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'copy';
- };
- orange.ondragenter = orange.ondrop = function (e) {
- sequence[sequence.length] = 'orange.'+e.type;
- e.preventDefault();
- };
- orange.ondragleave = function (e) {
- sequence[sequence.length] = 'orange.dragleave';
- };
- orange.ondragover = function (e) {
- if( sequence[sequence.length-1] != 'orange.dragover' ) {
- sequence[sequence.length] = 'orange.dragover';
- }
- e.preventDefault();
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = blue.ondragover = blue.ondragleave = function (e) {
- sequence[sequence.length] = 'blue.'+e.type;
- };
- document.documentElement.ondragenter = document.documentElement.ondragleave = function (e) {
- if( e.target != this ) { return; }
- sequence[sequence.length] = 'html.'+e.type;
- };
- document.documentElement.ondragover = function (e) {
- if( e.target != this ) { return; }
- if( sequence[sequence.length-1] != 'html.dragover' ) {
- sequence[sequence.length] = 'html.dragover';
- }
- };
- document.ondragenter = document.ondragleave = document.ondragover = document.ondragleave = function (e) {
- if( e.target != this ) { return; }
- sequence[sequence.length] = 'document.'+e.type;
- };
- orange.ondragend = function (e) {
- sequence = sequence.join('=>')
- var desiredsequence = (['orange.dragenter','orange.dragover','html.dragenter','html.dragenter','orange.dragleave','html.dragover','blue.dragenter','html.dragover','orange.dragenter','html.dragleave','orange.dragover','orange.drop']).join('=>')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[2].textContent = 'PASS';
- } else {
- document.getElementsByTagName('div')[2].textContent = 'FAIL, got: '+sequence+' instead of: '+desiredsequence;
- }
- };
+ var orange = document.getElementsByTagName('div')[0], sequence = [];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ orange.ondragenter = orange.ondrop = function (e) {
+ sequence[sequence.length] = 'orange.'+e.type;
+ e.preventDefault();
+ };
+ orange.ondragleave = function (e) {
+ sequence[sequence.length] = 'orange.dragleave';
+ };
+ orange.ondragover = function (e) {
+ if( sequence[sequence.length-1] != 'orange.dragover' ) {
+ sequence[sequence.length] = 'orange.dragover';
+ }
+ e.preventDefault();
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = blue.ondragover = blue.ondragleave = function (e) {
+ sequence[sequence.length] = 'blue.'+e.type;
+ };
+ document.documentElement.ondragenter = document.documentElement.ondragleave = function (e) {
+ if( e.target != this ) { return; }
+ sequence[sequence.length] = 'html.'+e.type;
+ };
+ document.documentElement.ondragover = function (e) {
+ if( e.target != this ) { return; }
+ if( sequence[sequence.length-1] != 'html.dragover' ) {
+ sequence[sequence.length] = 'html.dragover';
+ }
+ };
+ document.ondragenter = document.ondragleave = document.ondragover = document.ondragleave = function (e) {
+ if( e.target != this ) { return; }
+ sequence[sequence.length] = 'document.'+e.type;
+ };
+ orange.ondragend = function (e) {
+ sequence = sequence.join('=>')
+ var desiredsequence = (['orange.dragenter','orange.dragover','html.dragenter','html.dragenter','orange.dragleave','html.dragover','blue.dragenter','html.dragover','orange.dragenter','html.dragleave','orange.dragover','orange.drop']).join('=>')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[2].textContent = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[2].textContent = 'FAIL, got: '+sequence+' instead of: '+desiredsequence;
+ }
+ };
};
- ]]></script>
- </head>
- <!--body-->
+ ]]></script>
+ </head>
+ <!--body-->
- <div draggable="true"></div><div></div>
- <div>&#160;</div>
- <p>Drag the orange square onto the blue square, then back to the orange square, and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div><div></div>
+ <div>&#160;</div>
+ <p>Drag the orange square onto the blue square, then back to the orange square, and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- <!--/body-->
-</html> \ No newline at end of file
+ <!--/body-->
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/037-spec.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/037-spec.xhtml
index 611891cb787..c4c76fe8061 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/037-spec.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/037-spec.xhtml
@@ -1,22 +1,22 @@
<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Drag and drop without cancelling dragenter and without body (spec compliant)</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop without cancelling dragenter and without body (spec compliant)</title>
+ <style type="text/css">
head + div {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
head + div + div {
- height: 100px;
- width: 100px;
- margin-left: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ margin-left: 100px;
+ background: blue;
+ display: inline-block;
}
- </style>
- <script type="text/javascript"><![CDATA[
+ </style>
+ <script type="text/javascript"><![CDATA[
//Drag passes from orange to root element. Dragenter fires at root element.
//Dragenter is not cancelled. Body does not exist. Dragenter fires at document.
//Spec says the body (which does not exist) becomes current target element => null.
@@ -29,60 +29,60 @@ head + div + div {
//Current target is set to null. Yet again.
//Drag passes from root element to orange. Dragenter fires at orange, and is cancelled.
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], sequence = [];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'copy';
- };
- orange.ondragenter = orange.ondrop = function (e) {
- sequence[sequence.length] = 'orange.'+e.type;
- e.preventDefault();
- };
- orange.ondragleave = function (e) {
- sequence[sequence.length] = 'orange.dragleave';
- };
- orange.ondragover = function (e) {
- if( sequence[sequence.length-1] != 'orange.dragover' ) {
- sequence[sequence.length] = 'orange.dragover';
- }
- e.preventDefault();
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = blue.ondragover = blue.ondragleave = function (e) {
- sequence[sequence.length] = 'blue.'+e.type;
- };
- document.documentElement.ondragenter = document.documentElement.ondragleave = function (e) {
- if( e.target != this ) { return; }
- sequence[sequence.length] = 'html.'+e.type;
- };
- document.documentElement.ondragover = function (e) {
- if( e.target != this ) { return; }
- if( sequence[sequence.length-1] != 'html.dragover' ) {
- sequence[sequence.length] = 'html.dragover';
- }
- };
- document.ondragenter = document.ondragleave = document.ondragover = document.ondragleave = function (e) {
- if( e.target != this ) { return; }
- sequence[sequence.length] = 'document.'+e.type;
- };
- orange.ondragend = function (e) {
- sequence = sequence.join('=>')
- var desiredsequence = (['orange.dragenter','orange.dragover','html.dragenter','document.dragenter','orange.dragleave','blue.dragenter','document.dragenter','document.dragenter','orange.dragenter','orange.dragover','orange.drop']).join('=>')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[2].textContent = 'PASS';
- } else {
- document.getElementsByTagName('div')[2].textContent = 'FAIL, got: '+sequence+' instead of: '+desiredsequence;
- }
- };
+ var orange = document.getElementsByTagName('div')[0], sequence = [];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ orange.ondragenter = orange.ondrop = function (e) {
+ sequence[sequence.length] = 'orange.'+e.type;
+ e.preventDefault();
+ };
+ orange.ondragleave = function (e) {
+ sequence[sequence.length] = 'orange.dragleave';
+ };
+ orange.ondragover = function (e) {
+ if( sequence[sequence.length-1] != 'orange.dragover' ) {
+ sequence[sequence.length] = 'orange.dragover';
+ }
+ e.preventDefault();
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = blue.ondragover = blue.ondragleave = function (e) {
+ sequence[sequence.length] = 'blue.'+e.type;
+ };
+ document.documentElement.ondragenter = document.documentElement.ondragleave = function (e) {
+ if( e.target != this ) { return; }
+ sequence[sequence.length] = 'html.'+e.type;
+ };
+ document.documentElement.ondragover = function (e) {
+ if( e.target != this ) { return; }
+ if( sequence[sequence.length-1] != 'html.dragover' ) {
+ sequence[sequence.length] = 'html.dragover';
+ }
+ };
+ document.ondragenter = document.ondragleave = document.ondragover = document.ondragleave = function (e) {
+ if( e.target != this ) { return; }
+ sequence[sequence.length] = 'document.'+e.type;
+ };
+ orange.ondragend = function (e) {
+ sequence = sequence.join('=>')
+ var desiredsequence = (['orange.dragenter','orange.dragover','html.dragenter','document.dragenter','orange.dragleave','blue.dragenter','document.dragenter','document.dragenter','orange.dragenter','orange.dragover','orange.drop']).join('=>')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[2].textContent = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[2].textContent = 'FAIL, got: '+sequence+' instead of: '+desiredsequence;
+ }
+ };
};
- ]]></script>
- </head>
- <!--body-->
+ ]]></script>
+ </head>
+ <!--body-->
- <div draggable="true"></div><div></div>
- <div>&#160;</div>
- <p>Drag the orange square onto the blue square, then back to the orange square, and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div><div></div>
+ <div>&#160;</div>
+ <p>Drag the orange square onto the blue square, then back to the orange square, and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- <!--/body-->
-</html> \ No newline at end of file
+ <!--/body-->
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/038-proposed.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/038-proposed.html
index 85d987612f4..ee1cc8ed0eb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/038-proposed.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/038-proposed.html
@@ -1,84 +1,84 @@
<!doctype html>
<html>
- <head>
- <title>Drag and drop without cancelling dragenter and without body or html</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop without cancelling dragenter and without body or html</title>
+ <style type="text/css">
body > div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
iframe {
- height: 100px;
- width: 100px;
- margin-left: 100px;
- display: inline-block;
- border: none;
+ height: 100px;
+ width: 100px;
+ margin-left: 100px;
+ display: inline-block;
+ border: none;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
//Drag passes from parent to blue. Dragenter fires at blue. Root element is deleted.
//Dragenter is not cancelled. Body does not exist. Root element does not exist.
//Current target element is set to null. Drag now points at unrendered document - null.
//Current target element remains null.
//Drag passes over parent to orange. Dragenter fires at orange, and is cancelled.
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], sequence = [];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','hello');
- e.dataTransfer.effectAllowed = 'copy';
- };
- orange.ondragenter = orange.ondrop = function (e) {
- sequence[sequence.length] = 'orange.'+e.type;
- e.preventDefault();
- };
- orange.ondragleave = function (e) {
- sequence[sequence.length] = 'orange.dragleave';
- };
- orange.ondragover = function (e) {
- if( sequence[sequence.length-1] != 'orange.dragover' ) {
- sequence[sequence.length] = 'orange.dragover';
- }
- e.preventDefault();
- };
- var blue = document.getElementsByTagName('iframe')[0].contentDocument;
- if( !blue.documentElement ) { blue.appendChild(blue.createElement('html')); }
- blue.documentElement.style.margin = '0';
- blue.documentElement.style.padding = '0';
- if( !blue.body ) { blue.documentElement.appendChild(blue.createElement('body')); }
- blue.body.style.margin = '0';
- blue.body.style.padding = '0';
- var bluediv = blue.body.appendChild(blue.createElement('div'));
- bluediv.style.height = '100px';
- bluediv.style.width = '100px';
- bluediv.style.background = 'blue';
- bluediv.ondragenter = bluediv.ondragover = function (e) {
- sequence[sequence.length] = 'blue.'+e.type;
- if( blue.documentElement ) { blue.removeChild(blue.documentElement); }
- };
- blue.ondragenter = blue.ondragover = blue.ondragleave = function (e) {
- if( e.target != this ) { return; }
- sequence[sequence.length] = 'bluedocument.'+e.type;
- };
- orange.ondragend = function (e) {
- sequence = sequence.join('=&gt;')
- var desiredsequence = (['orange.dragenter','orange.dragover','orange.dragleave','blue.dragenter','orange.dragenter','orange.dragover','orange.drop']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[1].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[1].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var orange = document.getElementsByTagName('div')[0], sequence = [];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','hello');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ orange.ondragenter = orange.ondrop = function (e) {
+ sequence[sequence.length] = 'orange.'+e.type;
+ e.preventDefault();
+ };
+ orange.ondragleave = function (e) {
+ sequence[sequence.length] = 'orange.dragleave';
+ };
+ orange.ondragover = function (e) {
+ if( sequence[sequence.length-1] != 'orange.dragover' ) {
+ sequence[sequence.length] = 'orange.dragover';
+ }
+ e.preventDefault();
+ };
+ var blue = document.getElementsByTagName('iframe')[0].contentDocument;
+ if( !blue.documentElement ) { blue.appendChild(blue.createElement('html')); }
+ blue.documentElement.style.margin = '0';
+ blue.documentElement.style.padding = '0';
+ if( !blue.body ) { blue.documentElement.appendChild(blue.createElement('body')); }
+ blue.body.style.margin = '0';
+ blue.body.style.padding = '0';
+ var bluediv = blue.body.appendChild(blue.createElement('div'));
+ bluediv.style.height = '100px';
+ bluediv.style.width = '100px';
+ bluediv.style.background = 'blue';
+ bluediv.ondragenter = bluediv.ondragover = function (e) {
+ sequence[sequence.length] = 'blue.'+e.type;
+ if( blue.documentElement ) { blue.removeChild(blue.documentElement); }
+ };
+ blue.ondragenter = blue.ondragover = blue.ondragleave = function (e) {
+ if( e.target != this ) { return; }
+ sequence[sequence.length] = 'bluedocument.'+e.type;
+ };
+ orange.ondragend = function (e) {
+ sequence = sequence.join('=&gt;')
+ var desiredsequence = (['orange.dragenter','orange.dragover','orange.dragleave','blue.dragenter','orange.dragenter','orange.dragover','orange.drop']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[1].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[1].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div><iframe src="about:blank"></iframe>
- <div>&nbsp;</div>
- <p>Drag the orange square onto the blue square, then back to the orange square, and release it.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div><iframe src="about:blank"></iframe>
+ <div>&nbsp;</div>
+ <p>Drag the orange square onto the blue square, then back to the orange square, and release it.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-HELPER-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-HELPER-1.html
index efd53c6b8c5..4019610533d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-HELPER-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-HELPER-1.html
@@ -1,13 +1,13 @@
<!DOCTYPE html>
<title>drag &amp; drop - event sequence for cross-document drag</title>
<style type="text/css">
- /* use margins instead of padding to make sure the body begins at the top of the page */
- html, body {
- margin: 0;
- }
- body {
- padding: 116px 8px 8px;
- }
+ /* use margins instead of padding to make sure the body begins at the top of the page */
+ html, body {
+ margin: 0;
+ }
+ body {
+ padding: 116px 8px 8px;
+ }
#testhere div {
height: 100px;
width: 100px;
@@ -17,7 +17,7 @@
#orange {
background-color: orange;
left: 8px;
- }
+ }
#fuchsia {
background-color: fuchsia;
left: 158px;
@@ -27,172 +27,172 @@
<script>
parent.setup(function () {},{explicit_done:true,explicit_timeout:true});
window.onload = function () {
- var orange = document.querySelector('#orange')
- var fuchsia = document.querySelector('#fuchsia')
- var body = document.body;
-
- orange.ondragstart = function (e) {
- parent.events.push('doc1.orange.ondragstart');
- e.dataTransfer.effectAllowed = 'all';
- e.dataTransfer.setData('Text', 'foo');
- };
- orange.ondrag = function () { parent.events.push('doc1.orange.ondrag'); };
- orange.ondragenter = function () { parent.events.push('doc1.orange.ondragenter'); };
- orange.ondragover = function () { parent.events.push('doc1.orange.ondragover'); };
- orange.ondrop = function () { parent.events.push('doc1.orange.ondrop'); return false; };
- orange.ondragend = function () { parent.events.push('doc1.orange.ondragend'); setTimeout(finish,100); };
- orange.onmousedown = function () { parent.events.push('doc1.orange.onmousedown'); };
- orange.onmouseup = function () { parent.events.push('doc1.orange.onmouseup'); };
-
- /* Events for the fuchsia box */
- fuchsia.ondragstart = function () { parent.events.push('doc1.pink.ondragstart'); };
- fuchsia.ondrag = function () { parent.events.push('doc1.pink.ondrag'); };
- fuchsia.ondragenter = function () { parent.events.push('doc1.pink.ondragenter'); };
- fuchsia.ondragover = function () { parent.events.push('doc1.pink.ondragover'); };
- fuchsia.ondrop = function () { parent.events.push('doc1.pink.ondrop'); return false; };
- fuchsia.ondragend = function () { parent.events.push('doc1.pink.ondragend'); };
- fuchsia.onmousedown = function () { parent.events.push('doc1.pink.onmousedown'); };
- fuchsia.onmouseup = function () { parent.events.push('doc1.pink.onmouseup'); };
-
- /* Events for the page body */
- body.ondragstart = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondragstart': 'doc1.bubble.ondragstart' ); };
- body.ondrag = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondrag': 'doc1.bubble.ondrag' ); };
- body.ondragenter = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondragenter': 'doc1.bubble.ondragenter' ); };
- body.ondragover = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondragover': 'doc1.bubble.ondragover' ); };
- body.ondrop = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondrop': 'doc1.bubble.ondrop' ); };
- body.ondragend = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondragend': 'doc1.bubble.ondragend' ); };
- body.onmousedown = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.onmousedown': 'doc1.bubble.onmousedown' ); };
- body.onmouseup = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.onmouseup': 'doc1.bubble.onmouseup' ); };
-
- function finish(e) {
- var i, evindex;
- var events = parent.events.join('-');
- /*
- Normalise; reduce repeating event sequences to only 2 occurrences.
- This makes the final event sequence predictable, no matter how many times the drag->dragover sequences repeat.
- Two occurrances are kept in each case to allow testing to make sure the sequence really is repeating.
- */
- //spec compliant - div dragenter is not cancelled, so body dragenter fires and body becomes current target
- //repeats while drag is over orange or fuchsia or the body
- events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc1\.body\.ondragover){3,}/g,'$1$1');
- events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc2\.body\.ondragover){3,}/g,'$1$1');
- //repeats while dragging over yellow
- events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc2\.yellow\.ondragover-doc2\.bubble\.ondragover){3,}/g,'$1$1');
- //repeats while dragging over blue
- events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc2\.blue\.ondragover-doc2\.bubble\.ondragover){3,}/g,'$1$1');
- //non-spec-compliant repeats while dragging over orange
- events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc1\.orange\.ondragover-doc1\.bubble\.ondragover){3,}/g,'$1$1');
- //non-spec-compliant repeats while dragging over fuchsia
- events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc1\.pink\.ondragover-doc1\.bubble\.ondragover){3,}/g,'$1$1');
- events = events.split(/-/g);
-
- parent.test(function () {
- parent.assert_array_equals(events,
-
- ['doc1.orange.onmousedown', //mouse down
- 'doc1.bubble.onmousedown',
-
- 'doc1.orange.ondragstart', //dragging begins
- 'doc1.bubble.ondragstart',
-
- 'doc1.orange.ondrag', //mouse is over orange
- 'doc1.bubble.ondrag',
- 'doc1.orange.ondragenter', //not cancelled
- 'doc1.bubble.ondragenter',
- 'doc1.body.ondragenter', //so body becomes current target, and the event fires there as well
- 'doc1.body.ondragover',
-
- 'doc1.orange.ondrag', //start repeating (some over orange, some over body)
- 'doc1.bubble.ondrag',
- 'doc1.body.ondragover',
- 'doc1.orange.ondrag', //...twice to make sure it actually repeats
- 'doc1.bubble.ondrag',
- 'doc1.body.ondragover', //end repeating
-
- 'doc1.orange.ondrag', //mouse moves over pink
- 'doc1.bubble.ondrag',
- 'doc1.pink.ondragenter', //not cancelled
- 'doc1.bubble.ondragenter',
- 'doc1.body.ondragover', //so body becomes current target, but since it was already the target, dragenter does not need to fire again
-
- 'doc1.orange.ondrag', //start repeating (some over pink, some over body)
- 'doc1.bubble.ondrag',
- 'doc1.body.ondragover',
- 'doc1.orange.ondrag', //...twice to make sure it actually repeats
- 'doc1.bubble.ondrag',
- 'doc1.body.ondragover', //end repeating
-
- 'doc1.orange.ondrag', //mouse moves over second frame
- 'doc1.bubble.ondrag',
- 'doc2.body.ondragenter', //not cancelled
- 'doc2.body.ondragenter', //so it fires again and sets body as current target
- 'doc2.body.ondragover',
-
- 'doc1.orange.ondrag', //start repeating (over second body)
- 'doc1.bubble.ondrag',
- 'doc2.body.ondragover',
- 'doc1.orange.ondrag', //...twice to make sure it actually repeats
- 'doc1.bubble.ondrag',
- 'doc2.body.ondragover', //end repeating
-
- 'doc1.orange.ondrag', //mouse moves over yellow
- 'doc1.bubble.ondrag',
- 'doc2.yellow.ondragenter',
- 'doc2.bubble.ondragenter',
- 'doc2.yellow.ondragover',
- 'doc2.bubble.ondragover',
-
- 'doc1.orange.ondrag', //start repeating (over yellow)
- 'doc1.bubble.ondrag',
- 'doc2.yellow.ondragover',
- 'doc2.bubble.ondragover',
- 'doc1.orange.ondrag', //...twice to make sure it actually repeats
- 'doc1.bubble.ondrag',
- 'doc2.yellow.ondragover',
- 'doc2.bubble.ondragover', //end repeating
-
- 'doc1.orange.ondrag', //mouse moves over body
- 'doc1.bubble.ondrag',
- 'doc2.body.ondragenter', //not cancelled
- 'doc2.body.ondragenter', //so it fires again and sets body as current target
- 'doc2.body.ondragover',
-
- 'doc1.orange.ondrag', //start repeating (over body)
- 'doc1.bubble.ondrag',
- 'doc2.body.ondragover',
- 'doc1.orange.ondrag', //...twice to make sure it actually repeats
- 'doc1.bubble.ondrag',
- 'doc2.body.ondragover', //end repeating
-
- 'doc1.orange.ondrag', //mouse moves over blue
- 'doc1.bubble.ondrag',
- 'doc2.blue.ondragenter',
- 'doc2.bubble.ondragenter',
- 'doc2.blue.ondragover',
- 'doc2.bubble.ondragover',
-
- 'doc1.orange.ondrag', //start repeating (over blue)
- 'doc1.bubble.ondrag',
- 'doc2.blue.ondragover',
- 'doc2.bubble.ondragover',
- 'doc1.orange.ondrag', //...twice to make sure it actually repeats
- 'doc1.bubble.ondrag',
- 'doc2.blue.ondragover',
- 'doc2.bubble.ondragover', //end repeating
-
- 'doc2.blue.ondrop', //release
- 'doc2.bubble.ondrop',
- 'doc1.orange.ondragend',
- 'doc1.bubble.ondragend']
-
- );
- }, 'Overall sequence');
- var div = parent.document.createElement("div");
- div.setAttribute("id", "log");
- parent.document.documentElement.appendChild(div);
- parent.done();
- document.body.appendChild(parent.document.querySelector("div"));
- }
+ var orange = document.querySelector('#orange')
+ var fuchsia = document.querySelector('#fuchsia')
+ var body = document.body;
+
+ orange.ondragstart = function (e) {
+ parent.events.push('doc1.orange.ondragstart');
+ e.dataTransfer.effectAllowed = 'all';
+ e.dataTransfer.setData('Text', 'foo');
+ };
+ orange.ondrag = function () { parent.events.push('doc1.orange.ondrag'); };
+ orange.ondragenter = function () { parent.events.push('doc1.orange.ondragenter'); };
+ orange.ondragover = function () { parent.events.push('doc1.orange.ondragover'); };
+ orange.ondrop = function () { parent.events.push('doc1.orange.ondrop'); return false; };
+ orange.ondragend = function () { parent.events.push('doc1.orange.ondragend'); setTimeout(finish,100); };
+ orange.onmousedown = function () { parent.events.push('doc1.orange.onmousedown'); };
+ orange.onmouseup = function () { parent.events.push('doc1.orange.onmouseup'); };
+
+ /* Events for the fuchsia box */
+ fuchsia.ondragstart = function () { parent.events.push('doc1.pink.ondragstart'); };
+ fuchsia.ondrag = function () { parent.events.push('doc1.pink.ondrag'); };
+ fuchsia.ondragenter = function () { parent.events.push('doc1.pink.ondragenter'); };
+ fuchsia.ondragover = function () { parent.events.push('doc1.pink.ondragover'); };
+ fuchsia.ondrop = function () { parent.events.push('doc1.pink.ondrop'); return false; };
+ fuchsia.ondragend = function () { parent.events.push('doc1.pink.ondragend'); };
+ fuchsia.onmousedown = function () { parent.events.push('doc1.pink.onmousedown'); };
+ fuchsia.onmouseup = function () { parent.events.push('doc1.pink.onmouseup'); };
+
+ /* Events for the page body */
+ body.ondragstart = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondragstart': 'doc1.bubble.ondragstart' ); };
+ body.ondrag = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondrag': 'doc1.bubble.ondrag' ); };
+ body.ondragenter = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondragenter': 'doc1.bubble.ondragenter' ); };
+ body.ondragover = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondragover': 'doc1.bubble.ondragover' ); };
+ body.ondrop = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondrop': 'doc1.bubble.ondrop' ); };
+ body.ondragend = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.ondragend': 'doc1.bubble.ondragend' ); };
+ body.onmousedown = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.onmousedown': 'doc1.bubble.onmousedown' ); };
+ body.onmouseup = function (e) { parent.events.push( ( e.target == body ) ? 'doc1.body.onmouseup': 'doc1.bubble.onmouseup' ); };
+
+ function finish(e) {
+ var i, evindex;
+ var events = parent.events.join('-');
+ /*
+ Normalise; reduce repeating event sequences to only 2 occurrences.
+ This makes the final event sequence predictable, no matter how many times the drag->dragover sequences repeat.
+ Two occurrances are kept in each case to allow testing to make sure the sequence really is repeating.
+ */
+ //spec compliant - div dragenter is not cancelled, so body dragenter fires and body becomes current target
+ //repeats while drag is over orange or fuchsia or the body
+ events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc1\.body\.ondragover){3,}/g,'$1$1');
+ events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc2\.body\.ondragover){3,}/g,'$1$1');
+ //repeats while dragging over yellow
+ events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc2\.yellow\.ondragover-doc2\.bubble\.ondragover){3,}/g,'$1$1');
+ //repeats while dragging over blue
+ events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc2\.blue\.ondragover-doc2\.bubble\.ondragover){3,}/g,'$1$1');
+ //non-spec-compliant repeats while dragging over orange
+ events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc1\.orange\.ondragover-doc1\.bubble\.ondragover){3,}/g,'$1$1');
+ //non-spec-compliant repeats while dragging over fuchsia
+ events = events.replace(/(-doc1\.orange\.ondrag-doc1\.bubble\.ondrag-doc1\.pink\.ondragover-doc1\.bubble\.ondragover){3,}/g,'$1$1');
+ events = events.split(/-/g);
+
+ parent.test(function () {
+ parent.assert_array_equals(events,
+
+ ['doc1.orange.onmousedown', //mouse down
+ 'doc1.bubble.onmousedown',
+
+ 'doc1.orange.ondragstart', //dragging begins
+ 'doc1.bubble.ondragstart',
+
+ 'doc1.orange.ondrag', //mouse is over orange
+ 'doc1.bubble.ondrag',
+ 'doc1.orange.ondragenter', //not cancelled
+ 'doc1.bubble.ondragenter',
+ 'doc1.body.ondragenter', //so body becomes current target, and the event fires there as well
+ 'doc1.body.ondragover',
+
+ 'doc1.orange.ondrag', //start repeating (some over orange, some over body)
+ 'doc1.bubble.ondrag',
+ 'doc1.body.ondragover',
+ 'doc1.orange.ondrag', //...twice to make sure it actually repeats
+ 'doc1.bubble.ondrag',
+ 'doc1.body.ondragover', //end repeating
+
+ 'doc1.orange.ondrag', //mouse moves over pink
+ 'doc1.bubble.ondrag',
+ 'doc1.pink.ondragenter', //not cancelled
+ 'doc1.bubble.ondragenter',
+ 'doc1.body.ondragover', //so body becomes current target, but since it was already the target, dragenter does not need to fire again
+
+ 'doc1.orange.ondrag', //start repeating (some over pink, some over body)
+ 'doc1.bubble.ondrag',
+ 'doc1.body.ondragover',
+ 'doc1.orange.ondrag', //...twice to make sure it actually repeats
+ 'doc1.bubble.ondrag',
+ 'doc1.body.ondragover', //end repeating
+
+ 'doc1.orange.ondrag', //mouse moves over second frame
+ 'doc1.bubble.ondrag',
+ 'doc2.body.ondragenter', //not cancelled
+ 'doc2.body.ondragenter', //so it fires again and sets body as current target
+ 'doc2.body.ondragover',
+
+ 'doc1.orange.ondrag', //start repeating (over second body)
+ 'doc1.bubble.ondrag',
+ 'doc2.body.ondragover',
+ 'doc1.orange.ondrag', //...twice to make sure it actually repeats
+ 'doc1.bubble.ondrag',
+ 'doc2.body.ondragover', //end repeating
+
+ 'doc1.orange.ondrag', //mouse moves over yellow
+ 'doc1.bubble.ondrag',
+ 'doc2.yellow.ondragenter',
+ 'doc2.bubble.ondragenter',
+ 'doc2.yellow.ondragover',
+ 'doc2.bubble.ondragover',
+
+ 'doc1.orange.ondrag', //start repeating (over yellow)
+ 'doc1.bubble.ondrag',
+ 'doc2.yellow.ondragover',
+ 'doc2.bubble.ondragover',
+ 'doc1.orange.ondrag', //...twice to make sure it actually repeats
+ 'doc1.bubble.ondrag',
+ 'doc2.yellow.ondragover',
+ 'doc2.bubble.ondragover', //end repeating
+
+ 'doc1.orange.ondrag', //mouse moves over body
+ 'doc1.bubble.ondrag',
+ 'doc2.body.ondragenter', //not cancelled
+ 'doc2.body.ondragenter', //so it fires again and sets body as current target
+ 'doc2.body.ondragover',
+
+ 'doc1.orange.ondrag', //start repeating (over body)
+ 'doc1.bubble.ondrag',
+ 'doc2.body.ondragover',
+ 'doc1.orange.ondrag', //...twice to make sure it actually repeats
+ 'doc1.bubble.ondrag',
+ 'doc2.body.ondragover', //end repeating
+
+ 'doc1.orange.ondrag', //mouse moves over blue
+ 'doc1.bubble.ondrag',
+ 'doc2.blue.ondragenter',
+ 'doc2.bubble.ondragenter',
+ 'doc2.blue.ondragover',
+ 'doc2.bubble.ondragover',
+
+ 'doc1.orange.ondrag', //start repeating (over blue)
+ 'doc1.bubble.ondrag',
+ 'doc2.blue.ondragover',
+ 'doc2.bubble.ondragover',
+ 'doc1.orange.ondrag', //...twice to make sure it actually repeats
+ 'doc1.bubble.ondrag',
+ 'doc2.blue.ondragover',
+ 'doc2.bubble.ondragover', //end repeating
+
+ 'doc2.blue.ondrop', //release
+ 'doc2.bubble.ondrop',
+ 'doc1.orange.ondragend',
+ 'doc1.bubble.ondragend']
+
+ );
+ }, 'Overall sequence');
+ var div = parent.document.createElement("div");
+ div.setAttribute("id", "log");
+ parent.document.documentElement.appendChild(div);
+ parent.done();
+ document.body.appendChild(parent.document.querySelector("div"));
+ }
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-HELPER-2.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-HELPER-2.html
index ba5a250099d..343fc095432 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-HELPER-2.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-HELPER-2.html
@@ -1,12 +1,12 @@
<!DOCTYPE html>
<title>drag &amp; drop - event sequence for cross-document drag</title>
<style type="text/css">
- /* use margins instead of padding to make sure the body begins at the top of the page */
- html, body {
- margin: 0;
- padding: 0;
- height: 100%;
- }
+ /* use margins instead of padding to make sure the body begins at the top of the page */
+ html, body {
+ margin: 0;
+ padding: 0;
+ height: 100%;
+ }
#testhere div {
height: 100px;
width: 100px;
@@ -34,39 +34,39 @@
<script>
window.onload = function () {
- var yellow = document.querySelector('#yellow')
- var blue = document.querySelector('#blue')
- var body = document.body;
+ var yellow = document.querySelector('#yellow')
+ var blue = document.querySelector('#blue')
+ var body = document.body;
- /* Events for the fuchsia box */
- yellow.ondragstart = function () { parent.events.push('doc2.yellow.ondragstart'); };
- yellow.ondrag = function () { parent.events.push('doc2.yellow.ondrag'); };
- yellow.ondragenter = function () { parent.events.push('doc2.yellow.ondragenter'); return false; };
- yellow.ondragover = function () { parent.events.push('doc2.yellow.ondragover'); return false; };
- yellow.ondrop = function () { parent.events.push('doc2.yellow.ondrop'); return false; };
- yellow.ondragend = function () { parent.events.push('doc2.yellow.ondragend'); };
- yellow.onmousedown = function () { parent.events.push('doc2.yellow.onmousedown'); };
- yellow.onmouseup = function () { parent.events.push('doc2.yellow.onmouseup'); };
+ /* Events for the fuchsia box */
+ yellow.ondragstart = function () { parent.events.push('doc2.yellow.ondragstart'); };
+ yellow.ondrag = function () { parent.events.push('doc2.yellow.ondrag'); };
+ yellow.ondragenter = function () { parent.events.push('doc2.yellow.ondragenter'); return false; };
+ yellow.ondragover = function () { parent.events.push('doc2.yellow.ondragover'); return false; };
+ yellow.ondrop = function () { parent.events.push('doc2.yellow.ondrop'); return false; };
+ yellow.ondragend = function () { parent.events.push('doc2.yellow.ondragend'); };
+ yellow.onmousedown = function () { parent.events.push('doc2.yellow.onmousedown'); };
+ yellow.onmouseup = function () { parent.events.push('doc2.yellow.onmouseup'); };
- /* Events for the blue box (droppable) */
- blue.ondragstart = function () { parent.events.push('doc2.blue.ondragstart'); };
- blue.ondrag = function () { parent.events.push('doc2.blue.ondrag'); };
- blue.ondragenter = function () { parent.events.push('doc2.blue.ondragenter'); return false; };
- blue.ondragover = function () { parent.events.push('doc2.blue.ondragover'); return false; };
- blue.ondrop = function () { parent.events.push('doc2.blue.ondrop'); return false; };
- blue.ondragend = function () { parent.events.push('doc2.blue.ondragend'); };
- blue.onmousedown = function () { parent.events.push('doc2.blue.onmousedown'); };
- blue.onmouseup = function () { parent.events.push('doc2.blue.onmouseup'); };
+ /* Events for the blue box (droppable) */
+ blue.ondragstart = function () { parent.events.push('doc2.blue.ondragstart'); };
+ blue.ondrag = function () { parent.events.push('doc2.blue.ondrag'); };
+ blue.ondragenter = function () { parent.events.push('doc2.blue.ondragenter'); return false; };
+ blue.ondragover = function () { parent.events.push('doc2.blue.ondragover'); return false; };
+ blue.ondrop = function () { parent.events.push('doc2.blue.ondrop'); return false; };
+ blue.ondragend = function () { parent.events.push('doc2.blue.ondragend'); };
+ blue.onmousedown = function () { parent.events.push('doc2.blue.onmousedown'); };
+ blue.onmouseup = function () { parent.events.push('doc2.blue.onmouseup'); };
- /* Events for the page body */
- body.ondragstart = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondragstart': 'doc2.bubble.ondragstart' ); };
- body.ondrag = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondrag': 'doc2.bubble.ondrag' ); };
- body.ondragenter = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondragenter': 'doc2.bubble.ondragenter' ); };
- body.ondragover = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondragover': 'doc2.bubble.ondragover' ); };
- body.ondrop = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondrop': 'doc2.bubble.ondrop' ); };
- body.ondragend = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondragend': 'doc2.bubble.ondragend' ); };
- body.onmousedown = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.onmousedown': 'doc2.bubble.onmousedown' ); };
- body.onmouseup = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.onmouseup': 'doc2.bubble.onmouseup' ); };
+ /* Events for the page body */
+ body.ondragstart = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondragstart': 'doc2.bubble.ondragstart' ); };
+ body.ondrag = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondrag': 'doc2.bubble.ondrag' ); };
+ body.ondragenter = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondragenter': 'doc2.bubble.ondragenter' ); };
+ body.ondragover = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondragover': 'doc2.bubble.ondragover' ); };
+ body.ondrop = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondrop': 'doc2.bubble.ondrop' ); };
+ body.ondragend = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.ondragend': 'doc2.bubble.ondragend' ); };
+ body.onmousedown = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.onmousedown': 'doc2.bubble.onmousedown' ); };
+ body.onmouseup = function (e) { parent.events.push( ( e.target == body ) ? 'doc2.body.onmouseup': 'doc2.bubble.onmouseup' ); };
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-manual.html
index 689c7523720..1a07a943a7f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/events-cross-document-suite-manual.html
@@ -6,6 +6,6 @@ var events = new Array();
</script>
<frameset cols="308,*" frameborder="no" border="0">
- <frame src="events-cross-document-suite-HELPER-1.html">
- <frame src="events-cross-document-suite-HELPER-2.html">
+ <frame src="events-cross-document-suite-HELPER-1.html">
+ <frame src="events-cross-document-suite-HELPER-2.html">
</frameset>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/events-file-suite-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/events-file-suite-manual.html
index 7f78749cf2d..380247b8a1b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/events-file-suite-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/events-file-suite-manual.html
@@ -2,13 +2,13 @@
<title>drag &amp; drop - event sequence for file drops</title>
<script type="text/javascript" src="/resources/testharness.js"></script>
<style type="text/css">
- /* use margins instead of padding to make sure the body begins at the top of the page */
- html, body {
- margin: 0;
- }
- body {
- padding: 116px 8px 8px;
- }
+ /* use margins instead of padding to make sure the body begins at the top of the page */
+ html, body {
+ margin: 0;
+ }
+ body {
+ padding: 116px 8px 8px;
+ }
body::before {
height: 108px;
width: 108px;
@@ -41,125 +41,125 @@
<script>
setup(function () {},{explicit_done:true,explicit_timeout:true});
window.onload = function () {
- var fuchsia = document.querySelector('#fuchsia')
- var yellow = document.querySelector('#yellow')
- var blue = document.querySelector('#blue')
- var body = document.body;
-
- var events = new Array
-
- /* Events for the fuchsia box */
- fuchsia.ondragstart = function () { events.push('pink.ondragstart'); };
- fuchsia.ondrag = function () { events.push('pink.ondrag'); };
- fuchsia.ondragenter = function () { events.push('pink.ondragenter'); };
- fuchsia.ondragover = function () { events.push('pink.ondragover'); };
- fuchsia.ondragleave = function () { events.push('pink.ondragleave'); };
- fuchsia.ondrop = function () { events.push('pink.ondrop'); return false; };
- fuchsia.ondragend = function () { events.push('pink.ondragend'); };
- fuchsia.onmousedown = function () { events.push('pink.onmousedown'); };
- fuchsia.onmouseup = function () { events.push('pink.onmouseup'); };
-
- /* Events for the fuchsia box */
- yellow.ondragstart = function () { events.push('yellow.ondragstart'); };
- yellow.ondrag = function () { events.push('yellow.ondrag'); };
- yellow.ondragenter = function () { events.push('yellow.ondragenter'); return false; };
- yellow.ondragover = function () { events.push('yellow.ondragover'); return false; };
- yellow.ondragleave = function () { events.push('yellow.ondragleave'); };
- yellow.ondrop = function () { events.push('yellow.ondrop'); return false; };
- yellow.ondragend = function () { events.push('yellow.ondragend'); };
- yellow.onmousedown = function () { events.push('yellow.onmousedown'); };
- yellow.onmouseup = function () { events.push('yellow.onmouseup'); };
-
- /* Events for the blue box (droppable) */
- blue.ondragstart = function () { events.push('blue.ondragstart'); };
- blue.ondrag = function () { events.push('blue.ondrag'); };
- blue.ondragenter = function () { events.push('blue.ondragenter'); return false; };
- blue.ondragover = function () { events.push('blue.ondragover'); return false; };
- blue.ondragleave = function () { events.push('blue.ondragleave'); };
- blue.ondrop = function () { events.push('blue.ondrop'); return false; };
- blue.ondragend = function () { events.push('blue.ondragend'); };
- blue.onmousedown = function () { events.push('blue.onmousedown'); };
- blue.onmouseup = function () { events.push('blue.onmouseup'); };
-
- /* Events for the page body */
- body.ondragstart = function (e) { events.push( ( e.target == body ) ? 'body.ondragstart': 'bubble.ondragstart' ); };
- body.ondrag = function (e) { events.push( ( e.target == body ) ? 'body.ondrag': 'bubble.ondrag' ); };
- body.ondragenter = function (e) { events.push( ( e.target == body ) ? 'body.ondragenter': 'bubble.ondragenter' ); };
- body.ondragover = function (e) { events.push( ( e.target == body ) ? 'body.ondragover': 'bubble.ondragover' ); };
- body.ondragleave = function (e) { events.push( ( e.target == body ) ? 'body.ondragleave': 'bubble.ondragleave' ); };
- body.ondrop = function (e) { events.push( ( e.target == body ) ? 'body.ondrop': 'bubble.ondrop' ); setTimeout(finish,200); };
- body.ondragend = function (e) { events.push( ( e.target == body ) ? 'body.ondragend': 'bubble.ondragend' ); };
- body.onmousedown = function (e) { events.push( ( e.target == body ) ? 'body.onmousedown': 'bubble.onmousedown' ); };
- body.onmouseup = function (e) { events.push( ( e.target == body ) ? 'body.onmouseup': 'bubble.onmouseup' ); };
-
- function finish(e) {
- var i, evindex;
- events = events.join('-');
- /*
- Normalise; reduce repeating event sequences to only 2 occurrences.
- This makes the final event sequence predictable, no matter how many times the drag->dragover sequences repeat.
- Two occurrances are kept in each case to allow testing to make sure the sequence really is repeating.
- */
- //spec compliant - div dragenter is not cancelled, so body dragenter fires and body becomes current target
- //repeats while drag is over fuchsia or the body
- events = events.replace(/(-body\.ondragover){3,}/g,'$1$1');
- //repeats while dragging over yellow
- events = events.replace(/(-yellow\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
- //repeats while dragging over blue
- events = events.replace(/(-blue\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
- //non-spec-compliant repeats while dragging over fuchsia
- events = events.replace(/(-pink\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
- events = events.split(/-/g);
-
- test(function () {
- assert_array_equals(events,
-
- [/* 1 */ 'body.ondragenter', //mouse moves over body, which does not cancel event
- /* 2 */ 'body.ondragenter', //so it fires again and sets body as current target
-
- /* 3 */ 'body.ondragover', //start repeating over body
- /* 4 */ 'body.ondragover', //...twice to make sure it actually repeats
-
- /* 5 */ 'pink.ondragenter', //mouse moves over pink - not cancelled
- /* 6 */ 'bubble.ondragenter',
-
- /* 7 */ 'body.ondragover', //so body becomes current target, but since it was already the target, dragenter does not need to fire again
- /* 8 */ 'body.ondragover', //...twice to make sure it actually repeats
-
- /* 9 */ 'yellow.ondragenter', //mouse moves over yellow
- /* 10 */ 'bubble.ondragenter',
- /* 11 */ 'body.ondragleave',
-
- /* 12 */ 'yellow.ondragover', //start repeating (over yellow)
- /* 13 */ 'bubble.ondragover',
- /* 14 */ 'yellow.ondragover', //...twice to make sure it actually repeats
- /* 15 */ 'bubble.ondragover', //end repeating
-
- /* 16 */ 'body.ondragenter', //mouse moves over body, not cancelled
- /* 17 */ 'body.ondragenter', //so it fires again and sets body as current target
- /* 18 */ 'yellow.ondragleave',
- /* 19 */ 'bubble.ondragleave',
-
- /* 20 */ 'body.ondragover', //start repeating (over body)
- /* 21 */ 'body.ondragover', //...twice to make sure it actually repeats
-
- /* 22 */ 'blue.ondragenter', //mouse moves over blue
- /* 23 */ 'bubble.ondragenter',
- /* 24 */ 'body.ondragleave',
-
- /* 25 */ 'blue.ondragover', //start repeating (over blue)
- /* 26 */ 'bubble.ondragover',
- /* 27 */ 'blue.ondragover', //...twice to make sure it actually repeats
- /* 28 */ 'bubble.ondragover',
-
- /* 29 */ 'blue.ondrop', //release
- /* 30 */ 'bubble.ondrop']
-
- );
- }, 'Overall sequence');
-
- done();
- }
+ var fuchsia = document.querySelector('#fuchsia')
+ var yellow = document.querySelector('#yellow')
+ var blue = document.querySelector('#blue')
+ var body = document.body;
+
+ var events = new Array
+
+ /* Events for the fuchsia box */
+ fuchsia.ondragstart = function () { events.push('pink.ondragstart'); };
+ fuchsia.ondrag = function () { events.push('pink.ondrag'); };
+ fuchsia.ondragenter = function () { events.push('pink.ondragenter'); };
+ fuchsia.ondragover = function () { events.push('pink.ondragover'); };
+ fuchsia.ondragleave = function () { events.push('pink.ondragleave'); };
+ fuchsia.ondrop = function () { events.push('pink.ondrop'); return false; };
+ fuchsia.ondragend = function () { events.push('pink.ondragend'); };
+ fuchsia.onmousedown = function () { events.push('pink.onmousedown'); };
+ fuchsia.onmouseup = function () { events.push('pink.onmouseup'); };
+
+ /* Events for the fuchsia box */
+ yellow.ondragstart = function () { events.push('yellow.ondragstart'); };
+ yellow.ondrag = function () { events.push('yellow.ondrag'); };
+ yellow.ondragenter = function () { events.push('yellow.ondragenter'); return false; };
+ yellow.ondragover = function () { events.push('yellow.ondragover'); return false; };
+ yellow.ondragleave = function () { events.push('yellow.ondragleave'); };
+ yellow.ondrop = function () { events.push('yellow.ondrop'); return false; };
+ yellow.ondragend = function () { events.push('yellow.ondragend'); };
+ yellow.onmousedown = function () { events.push('yellow.onmousedown'); };
+ yellow.onmouseup = function () { events.push('yellow.onmouseup'); };
+
+ /* Events for the blue box (droppable) */
+ blue.ondragstart = function () { events.push('blue.ondragstart'); };
+ blue.ondrag = function () { events.push('blue.ondrag'); };
+ blue.ondragenter = function () { events.push('blue.ondragenter'); return false; };
+ blue.ondragover = function () { events.push('blue.ondragover'); return false; };
+ blue.ondragleave = function () { events.push('blue.ondragleave'); };
+ blue.ondrop = function () { events.push('blue.ondrop'); return false; };
+ blue.ondragend = function () { events.push('blue.ondragend'); };
+ blue.onmousedown = function () { events.push('blue.onmousedown'); };
+ blue.onmouseup = function () { events.push('blue.onmouseup'); };
+
+ /* Events for the page body */
+ body.ondragstart = function (e) { events.push( ( e.target == body ) ? 'body.ondragstart': 'bubble.ondragstart' ); };
+ body.ondrag = function (e) { events.push( ( e.target == body ) ? 'body.ondrag': 'bubble.ondrag' ); };
+ body.ondragenter = function (e) { events.push( ( e.target == body ) ? 'body.ondragenter': 'bubble.ondragenter' ); };
+ body.ondragover = function (e) { events.push( ( e.target == body ) ? 'body.ondragover': 'bubble.ondragover' ); };
+ body.ondragleave = function (e) { events.push( ( e.target == body ) ? 'body.ondragleave': 'bubble.ondragleave' ); };
+ body.ondrop = function (e) { events.push( ( e.target == body ) ? 'body.ondrop': 'bubble.ondrop' ); setTimeout(finish,200); };
+ body.ondragend = function (e) { events.push( ( e.target == body ) ? 'body.ondragend': 'bubble.ondragend' ); };
+ body.onmousedown = function (e) { events.push( ( e.target == body ) ? 'body.onmousedown': 'bubble.onmousedown' ); };
+ body.onmouseup = function (e) { events.push( ( e.target == body ) ? 'body.onmouseup': 'bubble.onmouseup' ); };
+
+ function finish(e) {
+ var i, evindex;
+ events = events.join('-');
+ /*
+ Normalise; reduce repeating event sequences to only 2 occurrences.
+ This makes the final event sequence predictable, no matter how many times the drag->dragover sequences repeat.
+ Two occurrances are kept in each case to allow testing to make sure the sequence really is repeating.
+ */
+ //spec compliant - div dragenter is not cancelled, so body dragenter fires and body becomes current target
+ //repeats while drag is over fuchsia or the body
+ events = events.replace(/(-body\.ondragover){3,}/g,'$1$1');
+ //repeats while dragging over yellow
+ events = events.replace(/(-yellow\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
+ //repeats while dragging over blue
+ events = events.replace(/(-blue\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
+ //non-spec-compliant repeats while dragging over fuchsia
+ events = events.replace(/(-pink\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
+ events = events.split(/-/g);
+
+ test(function () {
+ assert_array_equals(events,
+
+ [/* 1 */ 'body.ondragenter', //mouse moves over body, which does not cancel event
+ /* 2 */ 'body.ondragenter', //so it fires again and sets body as current target
+
+ /* 3 */ 'body.ondragover', //start repeating over body
+ /* 4 */ 'body.ondragover', //...twice to make sure it actually repeats
+
+ /* 5 */ 'pink.ondragenter', //mouse moves over pink - not cancelled
+ /* 6 */ 'bubble.ondragenter',
+
+ /* 7 */ 'body.ondragover', //so body becomes current target, but since it was already the target, dragenter does not need to fire again
+ /* 8 */ 'body.ondragover', //...twice to make sure it actually repeats
+
+ /* 9 */ 'yellow.ondragenter', //mouse moves over yellow
+ /* 10 */ 'bubble.ondragenter',
+ /* 11 */ 'body.ondragleave',
+
+ /* 12 */ 'yellow.ondragover', //start repeating (over yellow)
+ /* 13 */ 'bubble.ondragover',
+ /* 14 */ 'yellow.ondragover', //...twice to make sure it actually repeats
+ /* 15 */ 'bubble.ondragover', //end repeating
+
+ /* 16 */ 'body.ondragenter', //mouse moves over body, not cancelled
+ /* 17 */ 'body.ondragenter', //so it fires again and sets body as current target
+ /* 18 */ 'yellow.ondragleave',
+ /* 19 */ 'bubble.ondragleave',
+
+ /* 20 */ 'body.ondragover', //start repeating (over body)
+ /* 21 */ 'body.ondragover', //...twice to make sure it actually repeats
+
+ /* 22 */ 'blue.ondragenter', //mouse moves over blue
+ /* 23 */ 'bubble.ondragenter',
+ /* 24 */ 'body.ondragleave',
+
+ /* 25 */ 'blue.ondragover', //start repeating (over blue)
+ /* 26 */ 'bubble.ondragover',
+ /* 27 */ 'blue.ondragover', //...twice to make sure it actually repeats
+ /* 28 */ 'bubble.ondragover',
+
+ /* 29 */ 'blue.ondrop', //release
+ /* 30 */ 'bubble.ondrop']
+
+ );
+ }, 'Overall sequence');
+
+ done();
+ }
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/events-suite-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/events/events-suite-manual.html
index a29ea56a6c6..b848fa9467d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/events-suite-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/events-suite-manual.html
@@ -2,13 +2,13 @@
<title>drag &amp; drop - event sequence for draggable elements</title>
<script type="text/javascript" src="/resources/testharness.js"></script>
<style type="text/css">
- /* use margins instead of padding to make sure the body begins at the top of the page */
- html, body {
- margin: 0;
- }
- body {
- padding: 116px 8px 8px;
- }
+ /* use margins instead of padding to make sure the body begins at the top of the page */
+ html, body {
+ margin: 0;
+ }
+ body {
+ padding: 116px 8px 8px;
+ }
#testhere div {
height: 100px;
width: 100px;
@@ -18,7 +18,7 @@
#orange {
background-color: orange;
left: 8px;
- }
+ }
#fuchsia {
background-color: fuchsia;
left: 158px;
@@ -36,324 +36,324 @@
<script>
setup(function () {},{explicit_done:true,explicit_timeout:true});
window.onload = function () {
- var orange = document.querySelector('#orange')
- var fuchsia = document.querySelector('#fuchsia')
- var yellow = document.querySelector('#yellow')
- var blue = document.querySelector('#blue')
- var body = document.body;
-
- var events = new Array
-
- orange.ondragstart = function (e) {
- events.push('orange.ondragstart');
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('Text', 'foo');
- };
- orange.ondrag = function () { events.push('orange.ondrag'); };
- orange.ondragenter = function () { events.push('orange.ondragenter'); };
- orange.ondragover = function () { events.push('orange.ondragover'); };
- orange.ondragleave = function () { events.push('orange.ondragleave'); };
- orange.ondrop = function () { events.push('orange.ondrop'); return false; };
- orange.ondragend = function () { events.push('orange.ondragend'); };
- orange.onmousedown = function () { events.push('orange.onmousedown'); };
- orange.onmouseup = function () { events.push('orange.onmouseup'); };
-
- /* Events for the fuchsia box */
- fuchsia.ondragstart = function () { events.push('pink.ondragstart'); };
- fuchsia.ondrag = function () { events.push('pink.ondrag'); };
- fuchsia.ondragenter = function () { events.push('pink.ondragenter'); };
- fuchsia.ondragover = function () { events.push('pink.ondragover'); };
- fuchsia.ondragleave = function () { events.push('pink.ondragleave'); };
- fuchsia.ondrop = function () { events.push('pink.ondrop'); return false; };
- fuchsia.ondragend = function () { events.push('pink.ondragend'); };
- fuchsia.onmousedown = function () { events.push('pink.onmousedown'); };
- fuchsia.onmouseup = function () { events.push('pink.onmouseup'); };
-
- /* Events for the fuchsia box */
- yellow.ondragstart = function () { events.push('yellow.ondragstart'); };
- yellow.ondrag = function () { events.push('yellow.ondrag'); };
- yellow.ondragenter = function () { events.push('yellow.ondragenter'); return false; };
- yellow.ondragover = function () { events.push('yellow.ondragover'); return false; };
- yellow.ondragleave = function () { events.push('yellow.ondragleave'); };
- yellow.ondrop = function () { events.push('yellow.ondrop'); return false; };
- yellow.ondragend = function () { events.push('yellow.ondragend'); };
- yellow.onmousedown = function () { events.push('yellow.onmousedown'); };
- yellow.onmouseup = function () { events.push('yellow.onmouseup'); };
-
- /* Events for the blue box (droppable) */
- blue.ondragstart = function () { events.push('blue.ondragstart'); };
- blue.ondrag = function () { events.push('blue.ondrag'); };
- blue.ondragenter = function () { events.push('blue.ondragenter'); return false; };
- blue.ondragover = function () { events.push('blue.ondragover'); return false; };
- blue.ondragleave = function () { events.push('blue.ondragleave'); };
- blue.ondrop = function () { events.push('blue.ondrop'); return false; };
- blue.ondragend = function () { events.push('blue.ondragend'); };
- blue.onmousedown = function () { events.push('blue.onmousedown'); };
- blue.onmouseup = function () { events.push('blue.onmouseup'); };
-
- /* Events for the page body */
- body.ondragstart = function (e) { events.push( ( e.target == body ) ? 'body.ondragstart': 'bubble.ondragstart' ); };
- body.ondrag = function (e) { events.push( ( e.target == body ) ? 'body.ondrag': 'bubble.ondrag' ); };
- body.ondragenter = function (e) { events.push( ( e.target == body ) ? 'body.ondragenter': 'bubble.ondragenter' ); };
- body.ondragover = function (e) { events.push( ( e.target == body ) ? 'body.ondragover': 'bubble.ondragover' ); };
- body.ondragleave = function (e) { events.push( ( e.target == body ) ? 'body.ondragleave': 'bubble.ondragleave' ); };
- body.ondrop = function (e) { events.push( ( e.target == body ) ? 'body.ondrop': 'bubble.ondrop' ); };
- body.ondragend = function (e) { events.push( ( e.target == body ) ? 'body.ondragend': 'bubble.ondragend' ); setTimeout(finish,100); };
- body.onmousedown = function (e) { events.push( ( e.target == body ) ? 'body.onmousedown': 'bubble.onmousedown' ); };
- body.onmouseup = function (e) { events.push( ( e.target == body ) ? 'body.onmouseup': 'bubble.onmouseup' ); };
-
- function finish(e) {
- var i, evindex;
- events = events.join('-');
- /*
- Normalise; reduce repeating event sequences to only 2 occurrences.
- This makes the final event sequence predictable, no matter how many times the drag->dragover sequences repeat.
- Two occurrances are kept in each case to allow testing to make sure the sequence really is repeating.
- */
- //spec compliant - div dragenter is not cancelled, so body dragenter fires and body becomes current target
- //repeats while drag is over orange or fuchsia or the body
- events = events.replace(/(-orange\.ondrag-bubble\.ondrag-body\.ondragover){3,}/g,'$1$1');
- //repeats while dragging over yellow
- events = events.replace(/(-orange\.ondrag-bubble\.ondrag-yellow\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
- //repeats while dragging over blue
- events = events.replace(/(-orange\.ondrag-bubble\.ondrag-blue\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
- //non-spec-compliant repeats while dragging over orange
- events = events.replace(/(-orange\.ondrag-bubble\.ondrag-orange\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
- //non-spec-compliant repeats while dragging over fuchsia
- events = events.replace(/(-orange\.ondrag-bubble\.ondrag-pink\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
- events = events.split(/-/g);
-
- test(function () {
- assert_array_equals(events,
-
- [/* 1 */ 'orange.onmousedown', //mouse down
- /* 2 */ 'bubble.onmousedown',
-
- /* 3 */ 'orange.ondragstart', //dragging begins
- /* 4 */ 'bubble.ondragstart',
-
- /* 5 */ 'orange.ondrag', //mouse is over orange
- /* 6 */ 'bubble.ondrag',
- /* 7 */ 'orange.ondragenter', //not cancelled
- /* 8 */ 'bubble.ondragenter',
- /* 9 */ 'body.ondragenter', //so body becomes current target, and the event fires there as well
- /* 10 */ 'body.ondragover',
-
- /* 11 */ 'orange.ondrag', //start repeating (some over orange, some over body)
- /* 12 */ 'bubble.ondrag',
- /* 13 */ 'body.ondragover',
- /* 14 */ 'orange.ondrag', //...twice to make sure it actually repeats
- /* 15 */ 'bubble.ondrag',
- /* 16 */ 'body.ondragover', //end repeating
-
- /* 17 */ 'orange.ondrag', //mouse moves over pink
- /* 18 */ 'bubble.ondrag',
- /* 19 */ 'pink.ondragenter', //not cancelled
- /* 20 */ 'bubble.ondragenter',
- /* 21 */ 'body.ondragover', //so body becomes current target, but since it was already the target, dragenter does not need to fire again
-
- /* 22 */ 'orange.ondrag', //start repeating (some over pink, some over body)
- /* 23 */ 'bubble.ondrag',
- /* 24 */ 'body.ondragover',
- /* 25 */ 'orange.ondrag', //...twice to make sure it actually repeats
- /* 26 */ 'bubble.ondrag',
- /* 27 */ 'body.ondragover', //end repeating
-
- /* 28 */ 'orange.ondrag', //mouse moves over yellow
- /* 29 */ 'bubble.ondrag',
- /* 30 */ 'yellow.ondragenter',
- /* 31 */ 'bubble.ondragenter',
- /* 32 */ 'body.ondragleave',
- /* 33 */ 'yellow.ondragover',
- /* 34 */ 'bubble.ondragover',
-
- /* 35 */ 'orange.ondrag', //start repeating (over yellow)
- /* 36 */ 'bubble.ondrag',
- /* 37 */ 'yellow.ondragover',
- /* 38 */ 'bubble.ondragover',
- /* 39 */ 'orange.ondrag', //...twice to make sure it actually repeats
- /* 40 */ 'bubble.ondrag',
- /* 41 */ 'yellow.ondragover',
- /* 42 */ 'bubble.ondragover', //end repeating
-
- /* 43 */ 'orange.ondrag', //mouse moves over body
- /* 44 */ 'bubble.ondrag',
- /* 45 */ 'body.ondragenter', //not cancelled
- /* 46 */ 'body.ondragenter', //so it fires again and sets body as current target
- /* 47 */ 'yellow.ondragleave',
- /* 48 */ 'bubble.ondragleave',
- /* 49 */ 'body.ondragover',
-
- /* 50 */ 'orange.ondrag', //start repeating (over body)
- /* 51 */ 'bubble.ondrag',
- /* 52 */ 'body.ondragover',
- /* 53 */ 'orange.ondrag', //...twice to make sure it actually repeats
- /* 54 */ 'bubble.ondrag',
- /* 55 */ 'body.ondragover', //end repeating
-
- /* 56 */ 'orange.ondrag', //mouse moves over blue
- /* 57 */ 'bubble.ondrag',
- /* 58 */ 'blue.ondragenter',
- /* 59 */ 'bubble.ondragenter',
- /* 60 */ 'body.ondragleave',
- /* 61 */ 'blue.ondragover',
- /* 62 */ 'bubble.ondragover',
-
- /* 63 */ 'orange.ondrag', //start repeating (over blue)
- /* 64 */ 'bubble.ondrag',
- /* 65 */ 'blue.ondragover',
- /* 66 */ 'bubble.ondragover',
- /* 67 */ 'orange.ondrag', //...twice to make sure it actually repeats
- /* 68 */ 'bubble.ondrag',
- /* 69 */ 'blue.ondragover',
- /* 70 */ 'bubble.ondragover', //end repeating
-
- /* 71 */ 'blue.ondrop', //release
- /* 72 */ 'bubble.ondrop',
- /* 73 */ 'orange.ondragend',
- /* 74 */ 'bubble.ondragend']
-
- );
- }, 'Overall sequence');
-
- /* ondragstart */
- test(function () { assert_true( events.indexOf('orange.ondragstart') != -1 ); }, "orange.ondragstart should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'orange.ondragstart') return e; }).length, 1); }, "orange.ondragstart should fire 1 time");
- test(function () { assert_equals( events[2], 'orange.ondragstart' ); }, "orange.ondragstart should be event handler #3");
- test(function () { assert_equals( events.indexOf('pink.ondragstart'), -1 ); }, "pink.ondragstart should not fire");
- test(function () { assert_equals( events.indexOf('yellow.ondragstart'), -1 ); }, "yellow.ondragstart should not fire");
- test(function () { assert_equals( events.indexOf('blue.ondragstart'), -1 ); }, "blue.ondragstart should not fire");
- test(function () { assert_equals( events.indexOf('body.ondragstart'), -1 ); }, "ondragstart should not fire at the body");
- test(function () { assert_true( events.indexOf('bubble.ondragstart') != -1 ); }, "ondragstart should bubble to body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondragstart') return e; }).length, 1); }, "ondragstart should only bubble to body 1 time");
- test(function () { assert_equals( events[3], 'bubble.ondragstart' ); }, "ondragstart should bubble to body as event handler #4");
-
- /* ondrag */
- test(function () { assert_true( events.indexOf('orange.ondrag') != -1 ); }, "orange.ondrag should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'orange.ondrag') return e; }).length, 15); }, "orange.ondrag should fire 15 times");
- for( var i = 0, evindex = [4,10,13,16,21,24,27,34,38,42,49,52,55,62,66]; i < evindex.length; i++ ) {
- test(function () { assert_equals( events[evindex[i]], 'orange.ondrag' ); }, "orange.ondrag should be event handler #"+(evindex[i]+1));
- }
- test(function () { assert_equals( events.indexOf('pink.ondrag'), -1 ); }, "pink.ondrag should not fire");
- test(function () { assert_equals( events.indexOf('yellow.ondrag'), -1 ); }, "yellow.ondrag should not fire");
- test(function () { assert_equals( events.indexOf('blue.ondrag'), -1 ); }, "blue.ondrag should not fire");
- test(function () { assert_equals( events.indexOf('body.ondrag'), -1 ); }, "ondrag should not fire at the body");
- test(function () { assert_true( events.indexOf('bubble.ondrag') != -1 ); }, "ondrag should bubble to body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondrag') return e; }).length, 15); }, "ondrag should bubble to body 15 times");
- for( var i = 0, evindex = [5,11,14,17,22,25,28,35,39,43,50,53,56,63,67]; i < evindex.length; i++ ) {
- test(function () { assert_equals( events[evindex[i]], 'bubble.ondrag' ); }, "ondrag should bubble to body as event handler #"+(evindex[i]+1));
- }
-
- /* ondragenter */
- test(function () { assert_true( events.indexOf('orange.ondragenter') != -1 ); }, "orange.ondragenter should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'orange.ondragenter') return e; }).length, 1); }, "orange.ondragenter should fire 1 time");
- test(function () { assert_equals( events[6], 'orange.ondragenter' ); }, "orange.ondragenter should be event handler #7");
- test(function () { assert_true( events.indexOf('pink.ondragenter') != -1 ); }, "pink.ondragenter should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'pink.ondragenter') return e; }).length, 1); }, "pink.ondragenter should fire 1 time");
- test(function () { assert_equals( events[18], 'pink.ondragenter' ); }, "pink.ondragenter should be event handler #19");
- test(function () { assert_true( events.indexOf('yellow.ondragenter') != -1 ); }, "yellow.ondragenter should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'yellow.ondragenter') return e; }).length, 1); }, "yellow.ondragenter should fire 1 time");
- test(function () { assert_equals( events[29], 'yellow.ondragenter' ); }, "yellow.ondragenter should be event handler #30");
- test(function () { assert_true( events.indexOf('blue.ondragenter') != -1 ); }, "blue.ondragenter should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'blue.ondragenter') return e; }).length, 1); }, "blue.ondragenter should fire 1 time");
- test(function () { assert_equals( events[57], 'blue.ondragenter' ); }, "blue.ondragenter should be event handler #58");
- test(function () { assert_true( events.indexOf('body.ondragenter') != -1 ); }, "ondragenter should fire at body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'body.ondragenter') return e; }).length, 3); }, "ondragenter should fire at body 2 times");
- for( var i = 0, evindex = [8,44,45]; i < evindex.length; i++ ) {
- test(function () { assert_equals( events[evindex[i]], 'body.ondragenter' ); }, "ondragenter should fire at body as event handler #"+(evindex[i]+1));
- }
- test(function () { assert_true( events.indexOf('bubble.ondragenter') != -1 ); }, "ondragenter should bubble to body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondragenter') return e; }).length, 4); }, "ondragenter should bubble to body 4 times");
- for( var i = 0, evindex = [7,19,30,58]; i < evindex.length; i++ ) {
- test(function () { assert_equals( events[evindex[i]], 'bubble.ondragenter' ); }, "ondragenter should bubble to body as event handler #"+(evindex[i]+1));
- }
-
- /* ondragover */
- test(function () { assert_equals( events.indexOf('orange.ondragover'), -1 ); }, "orange.ondragover should not fire");
- test(function () { assert_equals( events.indexOf('pink.ondragover'), -1 ); }, "pink.ondragover should not fire");
- test(function () { assert_true( events.indexOf('yellow.ondragover') != -1 ); }, "yellow.ondragover should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'yellow.ondragover') return e; }).length, 3); }, "yellow.ondragover should fire 3 times");
- for( var i = 0, evindex = [32,36,40]; i < evindex.length; i++ ) {
- test(function () { assert_equals( events[evindex[i]], 'yellow.ondragover' ); }, "yellow.ondragover should be event handler #"+(evindex[i]+1));
- }
- test(function () { assert_true( events.indexOf('blue.ondragover') != -1 ); }, "blue.ondragover should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'blue.ondragover') return e; }).length, 3); }, "blue.ondragover should fire 9 times");
- for( var i = 0, evindex = [60,64,68]; i < evindex.length; i++ ) {
- test(function () { assert_equals( events[evindex[i]], 'blue.ondragover' ); }, "blue.ondragover should be event handler #"+(evindex[i]+1));
- }
- test(function () { assert_true( events.indexOf('body.ondragover') != -1 ); }, "ondragover should fire at body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'body.ondragover') return e; }).length, 9); }, "ondragover should fire at body 2 times");
- for( var i = 0, evindex = [9,12,15,20,23,26,48,51,54]; i < evindex.length; i++ ) {
- test(function () { assert_equals( events[evindex[i]], 'body.ondragover' ); }, "ondragover should fire at body as event handler #"+(evindex[i]+1));
- }
- test(function () { assert_true( events.indexOf('bubble.ondragover') != -1 ); }, "ondragover should bubble to body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondragover') return e; }).length, 6); }, "ondragover should bubble to body 6 times");
- for( var i = 0, evindex = [33,37,41,61,65,69]; i < evindex.length; i++ ) {
- test(function () { assert_equals( events[evindex[i]], 'bubble.ondragover' ); }, "ondragover should bubble to body as event handler #"+(evindex[i]+1));
- }
-
- /* ondragleave */
- test(function () { assert_equals( events.indexOf('orange.ondragleave'), -1 ); }, "orange.ondragleave should not fire");
- test(function () { assert_equals( events.indexOf('pink.ondragleave'), -1 ); }, "pink.ondragleave should not fire");
- test(function () { assert_true( events.indexOf('yellow.ondragleave') != -1 ); }, "yellow.ondragleave should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'yellow.ondragleave') return e; }).length, 1); }, "yellow.ondragleave should fire 1 time");
- test(function () { assert_equals( events[46], 'yellow.ondragleave' ); }, "yellow.ondragleave should be event handler #47");
- test(function () { assert_equals( events.indexOf('blue.ondragleave'), -1 ); }, "blue.ondragleave should not fire");
- test(function () { assert_true( events.indexOf('body.ondragleave') != -1 ); }, "ondragleave should fire at body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'body.ondragleave') return e; }).length, 2); }, "ondragleave should fire at body 2 times");
- for( var i = 0, evindex = [31,59]; i < evindex.length; i++ ) {
- test(function () { assert_equals( events[evindex[i]], 'body.ondragleave' ); }, "ondragleave should fire at body as event handler #"+(evindex[i]+1));
- }
- test(function () { assert_true( events.indexOf('bubble.ondragleave') != -1 ); }, "ondragleave should bubble to body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondragleave') return e; }).length, 1); }, "ondragleave should bubble to body 1 time");
- test(function () { assert_equals( events[47], 'bubble.ondragleave' ); }, "ondragleave should bubble to body as event handler #48");
-
- /* ondrop */
- test(function () { assert_equals( events.indexOf('orange.ondrop'), -1 ); }, "orange.ondrop should not fire");
- test(function () { assert_equals( events.indexOf('pink.ondrop'), -1 ); }, "pink.ondrop should not fire");
- test(function () { assert_equals( events.indexOf('yellow.ondrop'), -1 ); }, "yellow.ondrop should not fire");
- test(function () { assert_true( events.indexOf('blue.ondrop') != -1 ); }, "blue.ondrop should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'blue.ondrop') return e; }).length, 1); }, "blue.ondrop should fire 1 time");
- test(function () { assert_equals( events[70], 'blue.ondrop' ); }, "blue.ondrop should be event handler #71");
- test(function () { assert_equals( events.indexOf('body.ondrop'), -1 ); }, "ondrop should not fire at body");
- test(function () { assert_true( events.indexOf('bubble.ondrop') != -1 ); }, "ondrop should bubble to body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondrop') return e; }).length, 1); }, "ondrop should bubble to body 1 time");
- test(function () { assert_equals( events[71], 'bubble.ondrop' ); }, "ondrop should bubble to body as event handler #72");
-
- /* ondragend */
- test(function () { assert_true( events.indexOf('orange.ondragend') != -1 ); }, "orange.ondragend should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'orange.ondragend') return e; }).length, 1); }, "orange.ondragend should fire 1 time");
- test(function () { assert_equals( events[72], 'orange.ondragend' ); }, "orange.ondragend should be event handler #73");
- test(function () { assert_equals( events.indexOf('pink.ondragend'), -1 ); }, "pink.ondragend should not fire");
- test(function () { assert_equals( events.indexOf('yellow.ondragend'), -1 ); }, "yellow.ondragend should not fire");
- test(function () { assert_equals( events.indexOf('blue.ondragend'), -1 ); }, "blue.ondragend should not fire");
- test(function () { assert_equals( events.indexOf('body.ondragend'), -1 ); }, "ondragend should not fire at body");
- test(function () { assert_true( events.indexOf('bubble.ondragend') != -1 ); }, "ondragend should bubble to body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondragend') return e; }).length, 1); }, "ondragend should bubble to body 1 time");
- test(function () { assert_equals( events[73], 'bubble.ondragend' ); }, "ondragend should bubble to body as event handler #74");
-
- /* onmousedown */
- test(function () { assert_true( events.indexOf('orange.onmousedown') != -1 ); }, "orange.onmousedown should fire");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'orange.onmousedown') return e; }).length, 1); }, "orange.onmousedown should fire 1 time");
- test(function () { assert_equals( events[0], 'orange.onmousedown' ); }, "orange.onmousedown should be event handler #1");
- test(function () { assert_equals( events.indexOf('pink.onmousedown'), -1 ); }, "pink.onmousedown should not fire");
- test(function () { assert_equals( events.indexOf('yellow.onmousedown'), -1 ); }, "yellow.onmousedown should not fire");
- test(function () { assert_equals( events.indexOf('blue.onmousedown'), -1 ); }, "blue.onmousedown should not fire");
- test(function () { assert_equals( events.indexOf('body.onmousedown'), -1 ); }, "onmousedown should not fire at body");
- test(function () { assert_true( events.indexOf('bubble.onmousedown') != -1 ); }, "onmousedown should bubble to body");
- test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.onmousedown') return e; }).length, 1); }, "onmousedown should bubble to body 1 time");
- test(function () { assert_equals( events[1], 'bubble.onmousedown' ); }, "onmousedown should bubble to body as event handler #1");
-
- /* onmouseup */
- test(function () { assert_equals( events.indexOf('orange.onmouseup'), -1 ); }, "orange.onmouseup should not fire");
- test(function () { assert_equals( events.indexOf('pink.onmouseup'), -1 ); }, "pink.onmouseup should not fire");
- test(function () { assert_equals( events.indexOf('yellow.onmouseup'), -1 ); }, "yellow.onmouseup should not fire");
- test(function () { assert_equals( events.indexOf('blue.onmouseup'), -1 ); }, "blue.onmouseup should not fire");
- test(function () { assert_equals( events.indexOf('body.onmouseup'), -1 ); }, "onmouseup should not fire at body");
- test(function () { assert_equals( events.indexOf('bubble.onmouseup'), -1 ); }, "onmouseup should not bubble to body");
-
- done();
- }
+ var orange = document.querySelector('#orange')
+ var fuchsia = document.querySelector('#fuchsia')
+ var yellow = document.querySelector('#yellow')
+ var blue = document.querySelector('#blue')
+ var body = document.body;
+
+ var events = new Array
+
+ orange.ondragstart = function (e) {
+ events.push('orange.ondragstart');
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('Text', 'foo');
+ };
+ orange.ondrag = function () { events.push('orange.ondrag'); };
+ orange.ondragenter = function () { events.push('orange.ondragenter'); };
+ orange.ondragover = function () { events.push('orange.ondragover'); };
+ orange.ondragleave = function () { events.push('orange.ondragleave'); };
+ orange.ondrop = function () { events.push('orange.ondrop'); return false; };
+ orange.ondragend = function () { events.push('orange.ondragend'); };
+ orange.onmousedown = function () { events.push('orange.onmousedown'); };
+ orange.onmouseup = function () { events.push('orange.onmouseup'); };
+
+ /* Events for the fuchsia box */
+ fuchsia.ondragstart = function () { events.push('pink.ondragstart'); };
+ fuchsia.ondrag = function () { events.push('pink.ondrag'); };
+ fuchsia.ondragenter = function () { events.push('pink.ondragenter'); };
+ fuchsia.ondragover = function () { events.push('pink.ondragover'); };
+ fuchsia.ondragleave = function () { events.push('pink.ondragleave'); };
+ fuchsia.ondrop = function () { events.push('pink.ondrop'); return false; };
+ fuchsia.ondragend = function () { events.push('pink.ondragend'); };
+ fuchsia.onmousedown = function () { events.push('pink.onmousedown'); };
+ fuchsia.onmouseup = function () { events.push('pink.onmouseup'); };
+
+ /* Events for the fuchsia box */
+ yellow.ondragstart = function () { events.push('yellow.ondragstart'); };
+ yellow.ondrag = function () { events.push('yellow.ondrag'); };
+ yellow.ondragenter = function () { events.push('yellow.ondragenter'); return false; };
+ yellow.ondragover = function () { events.push('yellow.ondragover'); return false; };
+ yellow.ondragleave = function () { events.push('yellow.ondragleave'); };
+ yellow.ondrop = function () { events.push('yellow.ondrop'); return false; };
+ yellow.ondragend = function () { events.push('yellow.ondragend'); };
+ yellow.onmousedown = function () { events.push('yellow.onmousedown'); };
+ yellow.onmouseup = function () { events.push('yellow.onmouseup'); };
+
+ /* Events for the blue box (droppable) */
+ blue.ondragstart = function () { events.push('blue.ondragstart'); };
+ blue.ondrag = function () { events.push('blue.ondrag'); };
+ blue.ondragenter = function () { events.push('blue.ondragenter'); return false; };
+ blue.ondragover = function () { events.push('blue.ondragover'); return false; };
+ blue.ondragleave = function () { events.push('blue.ondragleave'); };
+ blue.ondrop = function () { events.push('blue.ondrop'); return false; };
+ blue.ondragend = function () { events.push('blue.ondragend'); };
+ blue.onmousedown = function () { events.push('blue.onmousedown'); };
+ blue.onmouseup = function () { events.push('blue.onmouseup'); };
+
+ /* Events for the page body */
+ body.ondragstart = function (e) { events.push( ( e.target == body ) ? 'body.ondragstart': 'bubble.ondragstart' ); };
+ body.ondrag = function (e) { events.push( ( e.target == body ) ? 'body.ondrag': 'bubble.ondrag' ); };
+ body.ondragenter = function (e) { events.push( ( e.target == body ) ? 'body.ondragenter': 'bubble.ondragenter' ); };
+ body.ondragover = function (e) { events.push( ( e.target == body ) ? 'body.ondragover': 'bubble.ondragover' ); };
+ body.ondragleave = function (e) { events.push( ( e.target == body ) ? 'body.ondragleave': 'bubble.ondragleave' ); };
+ body.ondrop = function (e) { events.push( ( e.target == body ) ? 'body.ondrop': 'bubble.ondrop' ); };
+ body.ondragend = function (e) { events.push( ( e.target == body ) ? 'body.ondragend': 'bubble.ondragend' ); setTimeout(finish,100); };
+ body.onmousedown = function (e) { events.push( ( e.target == body ) ? 'body.onmousedown': 'bubble.onmousedown' ); };
+ body.onmouseup = function (e) { events.push( ( e.target == body ) ? 'body.onmouseup': 'bubble.onmouseup' ); };
+
+ function finish(e) {
+ var i, evindex;
+ events = events.join('-');
+ /*
+ Normalise; reduce repeating event sequences to only 2 occurrences.
+ This makes the final event sequence predictable, no matter how many times the drag->dragover sequences repeat.
+ Two occurrances are kept in each case to allow testing to make sure the sequence really is repeating.
+ */
+ //spec compliant - div dragenter is not cancelled, so body dragenter fires and body becomes current target
+ //repeats while drag is over orange or fuchsia or the body
+ events = events.replace(/(-orange\.ondrag-bubble\.ondrag-body\.ondragover){3,}/g,'$1$1');
+ //repeats while dragging over yellow
+ events = events.replace(/(-orange\.ondrag-bubble\.ondrag-yellow\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
+ //repeats while dragging over blue
+ events = events.replace(/(-orange\.ondrag-bubble\.ondrag-blue\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
+ //non-spec-compliant repeats while dragging over orange
+ events = events.replace(/(-orange\.ondrag-bubble\.ondrag-orange\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
+ //non-spec-compliant repeats while dragging over fuchsia
+ events = events.replace(/(-orange\.ondrag-bubble\.ondrag-pink\.ondragover-bubble\.ondragover){3,}/g,'$1$1');
+ events = events.split(/-/g);
+
+ test(function () {
+ assert_array_equals(events,
+
+ [/* 1 */ 'orange.onmousedown', //mouse down
+ /* 2 */ 'bubble.onmousedown',
+
+ /* 3 */ 'orange.ondragstart', //dragging begins
+ /* 4 */ 'bubble.ondragstart',
+
+ /* 5 */ 'orange.ondrag', //mouse is over orange
+ /* 6 */ 'bubble.ondrag',
+ /* 7 */ 'orange.ondragenter', //not cancelled
+ /* 8 */ 'bubble.ondragenter',
+ /* 9 */ 'body.ondragenter', //so body becomes current target, and the event fires there as well
+ /* 10 */ 'body.ondragover',
+
+ /* 11 */ 'orange.ondrag', //start repeating (some over orange, some over body)
+ /* 12 */ 'bubble.ondrag',
+ /* 13 */ 'body.ondragover',
+ /* 14 */ 'orange.ondrag', //...twice to make sure it actually repeats
+ /* 15 */ 'bubble.ondrag',
+ /* 16 */ 'body.ondragover', //end repeating
+
+ /* 17 */ 'orange.ondrag', //mouse moves over pink
+ /* 18 */ 'bubble.ondrag',
+ /* 19 */ 'pink.ondragenter', //not cancelled
+ /* 20 */ 'bubble.ondragenter',
+ /* 21 */ 'body.ondragover', //so body becomes current target, but since it was already the target, dragenter does not need to fire again
+
+ /* 22 */ 'orange.ondrag', //start repeating (some over pink, some over body)
+ /* 23 */ 'bubble.ondrag',
+ /* 24 */ 'body.ondragover',
+ /* 25 */ 'orange.ondrag', //...twice to make sure it actually repeats
+ /* 26 */ 'bubble.ondrag',
+ /* 27 */ 'body.ondragover', //end repeating
+
+ /* 28 */ 'orange.ondrag', //mouse moves over yellow
+ /* 29 */ 'bubble.ondrag',
+ /* 30 */ 'yellow.ondragenter',
+ /* 31 */ 'bubble.ondragenter',
+ /* 32 */ 'body.ondragleave',
+ /* 33 */ 'yellow.ondragover',
+ /* 34 */ 'bubble.ondragover',
+
+ /* 35 */ 'orange.ondrag', //start repeating (over yellow)
+ /* 36 */ 'bubble.ondrag',
+ /* 37 */ 'yellow.ondragover',
+ /* 38 */ 'bubble.ondragover',
+ /* 39 */ 'orange.ondrag', //...twice to make sure it actually repeats
+ /* 40 */ 'bubble.ondrag',
+ /* 41 */ 'yellow.ondragover',
+ /* 42 */ 'bubble.ondragover', //end repeating
+
+ /* 43 */ 'orange.ondrag', //mouse moves over body
+ /* 44 */ 'bubble.ondrag',
+ /* 45 */ 'body.ondragenter', //not cancelled
+ /* 46 */ 'body.ondragenter', //so it fires again and sets body as current target
+ /* 47 */ 'yellow.ondragleave',
+ /* 48 */ 'bubble.ondragleave',
+ /* 49 */ 'body.ondragover',
+
+ /* 50 */ 'orange.ondrag', //start repeating (over body)
+ /* 51 */ 'bubble.ondrag',
+ /* 52 */ 'body.ondragover',
+ /* 53 */ 'orange.ondrag', //...twice to make sure it actually repeats
+ /* 54 */ 'bubble.ondrag',
+ /* 55 */ 'body.ondragover', //end repeating
+
+ /* 56 */ 'orange.ondrag', //mouse moves over blue
+ /* 57 */ 'bubble.ondrag',
+ /* 58 */ 'blue.ondragenter',
+ /* 59 */ 'bubble.ondragenter',
+ /* 60 */ 'body.ondragleave',
+ /* 61 */ 'blue.ondragover',
+ /* 62 */ 'bubble.ondragover',
+
+ /* 63 */ 'orange.ondrag', //start repeating (over blue)
+ /* 64 */ 'bubble.ondrag',
+ /* 65 */ 'blue.ondragover',
+ /* 66 */ 'bubble.ondragover',
+ /* 67 */ 'orange.ondrag', //...twice to make sure it actually repeats
+ /* 68 */ 'bubble.ondrag',
+ /* 69 */ 'blue.ondragover',
+ /* 70 */ 'bubble.ondragover', //end repeating
+
+ /* 71 */ 'blue.ondrop', //release
+ /* 72 */ 'bubble.ondrop',
+ /* 73 */ 'orange.ondragend',
+ /* 74 */ 'bubble.ondragend']
+
+ );
+ }, 'Overall sequence');
+
+ /* ondragstart */
+ test(function () { assert_true( events.indexOf('orange.ondragstart') != -1 ); }, "orange.ondragstart should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'orange.ondragstart') return e; }).length, 1); }, "orange.ondragstart should fire 1 time");
+ test(function () { assert_equals( events[2], 'orange.ondragstart' ); }, "orange.ondragstart should be event handler #3");
+ test(function () { assert_equals( events.indexOf('pink.ondragstart'), -1 ); }, "pink.ondragstart should not fire");
+ test(function () { assert_equals( events.indexOf('yellow.ondragstart'), -1 ); }, "yellow.ondragstart should not fire");
+ test(function () { assert_equals( events.indexOf('blue.ondragstart'), -1 ); }, "blue.ondragstart should not fire");
+ test(function () { assert_equals( events.indexOf('body.ondragstart'), -1 ); }, "ondragstart should not fire at the body");
+ test(function () { assert_true( events.indexOf('bubble.ondragstart') != -1 ); }, "ondragstart should bubble to body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondragstart') return e; }).length, 1); }, "ondragstart should only bubble to body 1 time");
+ test(function () { assert_equals( events[3], 'bubble.ondragstart' ); }, "ondragstart should bubble to body as event handler #4");
+
+ /* ondrag */
+ test(function () { assert_true( events.indexOf('orange.ondrag') != -1 ); }, "orange.ondrag should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'orange.ondrag') return e; }).length, 15); }, "orange.ondrag should fire 15 times");
+ for( var i = 0, evindex = [4,10,13,16,21,24,27,34,38,42,49,52,55,62,66]; i < evindex.length; i++ ) {
+ test(function () { assert_equals( events[evindex[i]], 'orange.ondrag' ); }, "orange.ondrag should be event handler #"+(evindex[i]+1));
+ }
+ test(function () { assert_equals( events.indexOf('pink.ondrag'), -1 ); }, "pink.ondrag should not fire");
+ test(function () { assert_equals( events.indexOf('yellow.ondrag'), -1 ); }, "yellow.ondrag should not fire");
+ test(function () { assert_equals( events.indexOf('blue.ondrag'), -1 ); }, "blue.ondrag should not fire");
+ test(function () { assert_equals( events.indexOf('body.ondrag'), -1 ); }, "ondrag should not fire at the body");
+ test(function () { assert_true( events.indexOf('bubble.ondrag') != -1 ); }, "ondrag should bubble to body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondrag') return e; }).length, 15); }, "ondrag should bubble to body 15 times");
+ for( var i = 0, evindex = [5,11,14,17,22,25,28,35,39,43,50,53,56,63,67]; i < evindex.length; i++ ) {
+ test(function () { assert_equals( events[evindex[i]], 'bubble.ondrag' ); }, "ondrag should bubble to body as event handler #"+(evindex[i]+1));
+ }
+
+ /* ondragenter */
+ test(function () { assert_true( events.indexOf('orange.ondragenter') != -1 ); }, "orange.ondragenter should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'orange.ondragenter') return e; }).length, 1); }, "orange.ondragenter should fire 1 time");
+ test(function () { assert_equals( events[6], 'orange.ondragenter' ); }, "orange.ondragenter should be event handler #7");
+ test(function () { assert_true( events.indexOf('pink.ondragenter') != -1 ); }, "pink.ondragenter should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'pink.ondragenter') return e; }).length, 1); }, "pink.ondragenter should fire 1 time");
+ test(function () { assert_equals( events[18], 'pink.ondragenter' ); }, "pink.ondragenter should be event handler #19");
+ test(function () { assert_true( events.indexOf('yellow.ondragenter') != -1 ); }, "yellow.ondragenter should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'yellow.ondragenter') return e; }).length, 1); }, "yellow.ondragenter should fire 1 time");
+ test(function () { assert_equals( events[29], 'yellow.ondragenter' ); }, "yellow.ondragenter should be event handler #30");
+ test(function () { assert_true( events.indexOf('blue.ondragenter') != -1 ); }, "blue.ondragenter should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'blue.ondragenter') return e; }).length, 1); }, "blue.ondragenter should fire 1 time");
+ test(function () { assert_equals( events[57], 'blue.ondragenter' ); }, "blue.ondragenter should be event handler #58");
+ test(function () { assert_true( events.indexOf('body.ondragenter') != -1 ); }, "ondragenter should fire at body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'body.ondragenter') return e; }).length, 3); }, "ondragenter should fire at body 2 times");
+ for( var i = 0, evindex = [8,44,45]; i < evindex.length; i++ ) {
+ test(function () { assert_equals( events[evindex[i]], 'body.ondragenter' ); }, "ondragenter should fire at body as event handler #"+(evindex[i]+1));
+ }
+ test(function () { assert_true( events.indexOf('bubble.ondragenter') != -1 ); }, "ondragenter should bubble to body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondragenter') return e; }).length, 4); }, "ondragenter should bubble to body 4 times");
+ for( var i = 0, evindex = [7,19,30,58]; i < evindex.length; i++ ) {
+ test(function () { assert_equals( events[evindex[i]], 'bubble.ondragenter' ); }, "ondragenter should bubble to body as event handler #"+(evindex[i]+1));
+ }
+
+ /* ondragover */
+ test(function () { assert_equals( events.indexOf('orange.ondragover'), -1 ); }, "orange.ondragover should not fire");
+ test(function () { assert_equals( events.indexOf('pink.ondragover'), -1 ); }, "pink.ondragover should not fire");
+ test(function () { assert_true( events.indexOf('yellow.ondragover') != -1 ); }, "yellow.ondragover should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'yellow.ondragover') return e; }).length, 3); }, "yellow.ondragover should fire 3 times");
+ for( var i = 0, evindex = [32,36,40]; i < evindex.length; i++ ) {
+ test(function () { assert_equals( events[evindex[i]], 'yellow.ondragover' ); }, "yellow.ondragover should be event handler #"+(evindex[i]+1));
+ }
+ test(function () { assert_true( events.indexOf('blue.ondragover') != -1 ); }, "blue.ondragover should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'blue.ondragover') return e; }).length, 3); }, "blue.ondragover should fire 9 times");
+ for( var i = 0, evindex = [60,64,68]; i < evindex.length; i++ ) {
+ test(function () { assert_equals( events[evindex[i]], 'blue.ondragover' ); }, "blue.ondragover should be event handler #"+(evindex[i]+1));
+ }
+ test(function () { assert_true( events.indexOf('body.ondragover') != -1 ); }, "ondragover should fire at body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'body.ondragover') return e; }).length, 9); }, "ondragover should fire at body 2 times");
+ for( var i = 0, evindex = [9,12,15,20,23,26,48,51,54]; i < evindex.length; i++ ) {
+ test(function () { assert_equals( events[evindex[i]], 'body.ondragover' ); }, "ondragover should fire at body as event handler #"+(evindex[i]+1));
+ }
+ test(function () { assert_true( events.indexOf('bubble.ondragover') != -1 ); }, "ondragover should bubble to body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondragover') return e; }).length, 6); }, "ondragover should bubble to body 6 times");
+ for( var i = 0, evindex = [33,37,41,61,65,69]; i < evindex.length; i++ ) {
+ test(function () { assert_equals( events[evindex[i]], 'bubble.ondragover' ); }, "ondragover should bubble to body as event handler #"+(evindex[i]+1));
+ }
+
+ /* ondragleave */
+ test(function () { assert_equals( events.indexOf('orange.ondragleave'), -1 ); }, "orange.ondragleave should not fire");
+ test(function () { assert_equals( events.indexOf('pink.ondragleave'), -1 ); }, "pink.ondragleave should not fire");
+ test(function () { assert_true( events.indexOf('yellow.ondragleave') != -1 ); }, "yellow.ondragleave should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'yellow.ondragleave') return e; }).length, 1); }, "yellow.ondragleave should fire 1 time");
+ test(function () { assert_equals( events[46], 'yellow.ondragleave' ); }, "yellow.ondragleave should be event handler #47");
+ test(function () { assert_equals( events.indexOf('blue.ondragleave'), -1 ); }, "blue.ondragleave should not fire");
+ test(function () { assert_true( events.indexOf('body.ondragleave') != -1 ); }, "ondragleave should fire at body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'body.ondragleave') return e; }).length, 2); }, "ondragleave should fire at body 2 times");
+ for( var i = 0, evindex = [31,59]; i < evindex.length; i++ ) {
+ test(function () { assert_equals( events[evindex[i]], 'body.ondragleave' ); }, "ondragleave should fire at body as event handler #"+(evindex[i]+1));
+ }
+ test(function () { assert_true( events.indexOf('bubble.ondragleave') != -1 ); }, "ondragleave should bubble to body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondragleave') return e; }).length, 1); }, "ondragleave should bubble to body 1 time");
+ test(function () { assert_equals( events[47], 'bubble.ondragleave' ); }, "ondragleave should bubble to body as event handler #48");
+
+ /* ondrop */
+ test(function () { assert_equals( events.indexOf('orange.ondrop'), -1 ); }, "orange.ondrop should not fire");
+ test(function () { assert_equals( events.indexOf('pink.ondrop'), -1 ); }, "pink.ondrop should not fire");
+ test(function () { assert_equals( events.indexOf('yellow.ondrop'), -1 ); }, "yellow.ondrop should not fire");
+ test(function () { assert_true( events.indexOf('blue.ondrop') != -1 ); }, "blue.ondrop should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'blue.ondrop') return e; }).length, 1); }, "blue.ondrop should fire 1 time");
+ test(function () { assert_equals( events[70], 'blue.ondrop' ); }, "blue.ondrop should be event handler #71");
+ test(function () { assert_equals( events.indexOf('body.ondrop'), -1 ); }, "ondrop should not fire at body");
+ test(function () { assert_true( events.indexOf('bubble.ondrop') != -1 ); }, "ondrop should bubble to body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondrop') return e; }).length, 1); }, "ondrop should bubble to body 1 time");
+ test(function () { assert_equals( events[71], 'bubble.ondrop' ); }, "ondrop should bubble to body as event handler #72");
+
+ /* ondragend */
+ test(function () { assert_true( events.indexOf('orange.ondragend') != -1 ); }, "orange.ondragend should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'orange.ondragend') return e; }).length, 1); }, "orange.ondragend should fire 1 time");
+ test(function () { assert_equals( events[72], 'orange.ondragend' ); }, "orange.ondragend should be event handler #73");
+ test(function () { assert_equals( events.indexOf('pink.ondragend'), -1 ); }, "pink.ondragend should not fire");
+ test(function () { assert_equals( events.indexOf('yellow.ondragend'), -1 ); }, "yellow.ondragend should not fire");
+ test(function () { assert_equals( events.indexOf('blue.ondragend'), -1 ); }, "blue.ondragend should not fire");
+ test(function () { assert_equals( events.indexOf('body.ondragend'), -1 ); }, "ondragend should not fire at body");
+ test(function () { assert_true( events.indexOf('bubble.ondragend') != -1 ); }, "ondragend should bubble to body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.ondragend') return e; }).length, 1); }, "ondragend should bubble to body 1 time");
+ test(function () { assert_equals( events[73], 'bubble.ondragend' ); }, "ondragend should bubble to body as event handler #74");
+
+ /* onmousedown */
+ test(function () { assert_true( events.indexOf('orange.onmousedown') != -1 ); }, "orange.onmousedown should fire");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'orange.onmousedown') return e; }).length, 1); }, "orange.onmousedown should fire 1 time");
+ test(function () { assert_equals( events[0], 'orange.onmousedown' ); }, "orange.onmousedown should be event handler #1");
+ test(function () { assert_equals( events.indexOf('pink.onmousedown'), -1 ); }, "pink.onmousedown should not fire");
+ test(function () { assert_equals( events.indexOf('yellow.onmousedown'), -1 ); }, "yellow.onmousedown should not fire");
+ test(function () { assert_equals( events.indexOf('blue.onmousedown'), -1 ); }, "blue.onmousedown should not fire");
+ test(function () { assert_equals( events.indexOf('body.onmousedown'), -1 ); }, "onmousedown should not fire at body");
+ test(function () { assert_true( events.indexOf('bubble.onmousedown') != -1 ); }, "onmousedown should bubble to body");
+ test(function () { assert_equals( events.filter(function (e) { if (e == 'bubble.onmousedown') return e; }).length, 1); }, "onmousedown should bubble to body 1 time");
+ test(function () { assert_equals( events[1], 'bubble.onmousedown' ); }, "onmousedown should bubble to body as event handler #1");
+
+ /* onmouseup */
+ test(function () { assert_equals( events.indexOf('orange.onmouseup'), -1 ); }, "orange.onmouseup should not fire");
+ test(function () { assert_equals( events.indexOf('pink.onmouseup'), -1 ); }, "pink.onmouseup should not fire");
+ test(function () { assert_equals( events.indexOf('yellow.onmouseup'), -1 ); }, "yellow.onmouseup should not fire");
+ test(function () { assert_equals( events.indexOf('blue.onmouseup'), -1 ); }, "blue.onmouseup should not fire");
+ test(function () { assert_equals( events.indexOf('body.onmouseup'), -1 ); }, "onmouseup should not fire at body");
+ test(function () { assert_equals( events.indexOf('bubble.onmouseup'), -1 ); }, "onmouseup should not bubble to body");
+
+ done();
+ }
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-input-with-circle.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-input-with-circle.xhtml
index 77e6a1301b8..966afe44000 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-input-with-circle.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-input-with-circle.xhtml
@@ -4,42 +4,42 @@
<title>Cross frame drag and drop: helper file</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body onload="document.querySelector('input').select()" ondragleave="leavePage(event)">
@@ -48,4 +48,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-link-with-circle.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-link-with-circle.xhtml
index 813a06a7dfa..c85f2286197 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-link-with-circle.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-link-with-circle.xhtml
@@ -4,42 +4,42 @@
<title>Cross frame drag and drop: helper file</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragleave="leavePage(event)">
@@ -48,4 +48,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-p-with-circle.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-p-with-circle.xhtml
index bd27af79a60..efbd4b76141 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-p-with-circle.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drag-me-p-with-circle.xhtml
@@ -4,42 +4,42 @@
<title>Cross frame drag and drop: helper file</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
</style>
<script type="application/ecmascript">
var step = 1;
function start(event)
- {if(step++ == 1)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragstart should be first event to fire.')}
- }
+ {if(step++ == 1)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragstart should be first event to fire.')}
+ }
function leavePage(event)
- {if(step++ > 1)
- {setColor('green green silver silver')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragleave should fire after dragstart.')}
- }
+ {if(step++ > 1)
+ {setColor('green green silver silver')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragleave should fire after dragstart.')}
+ }
function endDrag(event)
- {if(step++ > 2)
- {setColor('green')}
- else
- {step = 0;
- setColor('maroon');
- say('Dragend should fire after dragstart and dragleave.')}
- }
+ {if(step++ > 2)
+ {setColor('green')}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragend should fire after dragstart and dragleave.')}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))" ondragleave="leavePage(event)">
@@ -48,4 +48,4 @@ function setColor(c)
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drop-here-body-circle.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drop-here-body-circle.xhtml
index 10f66d764f1..bb8c0e36f00 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drop-here-body-circle.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/events/helper-drop-here-body-circle.xhtml
@@ -4,48 +4,48 @@
<title>Cross frame drag and drop: helper file</title>
<style type="text/css">
div
- {width:0;
- height:0;
- border:solid 50px silver;
- border-radius:50px;
- margin-left:auto;}
+ {width:0;
+ height:0;
+ border:solid 50px silver;
+ border-radius:50px;
+ margin-left:auto;}
</style>
<script type="application/ecmascript">
var step = 1;
function enterPage(event)
- {event.preventDefault();
- if(step++ > 0)
- {setColor('green silver silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragenter should fire before dragover and drop');}
- }
+ {event.preventDefault();
+ if(step++ > 0)
+ {setColor('green silver silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragenter should fire before dragover and drop');}
+ }
function overPage(event)
- {event.preventDefault();
- if(step++ > 1)
- {setColor('green green silver silver');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {event.preventDefault();
+ if(step++ > 1)
+ {setColor('green green silver silver');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function dropIt(event)
- {if(step++ > 1)
- {setColor('green');}
- else
- {step = 0;
- setColor('maroon');
- say('Dragover should fire after dragenter');}
- }
+ {if(step++ > 1)
+ {setColor('green');}
+ else
+ {step = 0;
+ setColor('maroon');
+ say('Dragover should fire after dragenter');}
+ }
function say(it)
- {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
+ {document.querySelector('pre').appendChild(document.createTextNode(it + '\n'))}
function setColor(c)
- {document.querySelector('div').setAttribute('style','border-color:' + c)}
+ {document.querySelector('div').setAttribute('style','border-color:' + c)}
</script>
</head>
<body ondragenter="enterPage(event)" ondragover="overPage(event)" ondrop="dropIt(event)">
<div/>
<pre/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/001.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/001.html
index 45a44c394cd..07ef4dbbb77 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/001.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/001.html
@@ -14,86 +14,86 @@ var fails = [], finished = false;
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragover = orange.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- }
- if( e.dataTransfer.files.length ) {
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 0 for '+e.type;
- }
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ }
+ if( e.dataTransfer.files.length ) {
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 0 for '+e.type;
+ }
};
- orange.ondrop = function(e) {
- e.preventDefault();
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- finish();
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- }
- if( e.dataTransfer.files.length != 1 ) {
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 1 for '+e.type;
- }
- if( !e.dataTransfer.files[0] ) {
- fails[fails.length] = 'no dataTransfer.files[0] for drop';
- finish();
- return;
- }
- if( e.dataTransfer.files[0].size != filesize ) {
- fails[fails.length] = 'dataTransfer.files[0].size '+e.dataTransfer.files[0].size+' instead of '+filesize;
- }
- /*
- if( !e.dataTransfer.files[0].lastModifiedDate ) {
- fails[fails.length] = 'no dataTransfer.files[0].lastModifiedDate';
- }
- */
- if( e.dataTransfer.files[0].name != filename ) {
- fails[fails.length] = 'dataTransfer.files[0].name '+e.dataTransfer.files[0].name+' instead of '+filename;
- }
- if( e.dataTransfer.files[0].type != filetype ) {
- fails[fails.length] = 'dataTransfer.files[0].type '+e.dataTransfer.files[0].type+' instead of '+filetype;
- }
- if( !window.FileReader ) {
- fails[fails.length] = 'No FileReader constructor';
- finish();
- return;
- }
- var reader = new FileReader();
- reader.onload = function () {
- if( !reader.result ) {
- fails[fails.length] = 'No file data after load';
- }
- if( reader.result.length != filesize ) {
- fails[fails.length] = 'File data length '+reader.result.length+' instead of '+filesize;
- }
- finish();
- };
- reader.readAsBinaryString(e.dataTransfer.files[0]);
- setTimeout(function () {
- if( !reader.result ) {
- fails[fails.length] = 'No file data after timeout';
- }
- finish();
- },1000);
+ orange.ondrop = function(e) {
+ e.preventDefault();
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ finish();
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 1 for '+e.type;
+ }
+ if( !e.dataTransfer.files[0] ) {
+ fails[fails.length] = 'no dataTransfer.files[0] for drop';
+ finish();
+ return;
+ }
+ if( e.dataTransfer.files[0].size != filesize ) {
+ fails[fails.length] = 'dataTransfer.files[0].size '+e.dataTransfer.files[0].size+' instead of '+filesize;
+ }
+ /*
+ if( !e.dataTransfer.files[0].lastModifiedDate ) {
+ fails[fails.length] = 'no dataTransfer.files[0].lastModifiedDate';
+ }
+ */
+ if( e.dataTransfer.files[0].name != filename ) {
+ fails[fails.length] = 'dataTransfer.files[0].name '+e.dataTransfer.files[0].name+' instead of '+filename;
+ }
+ if( e.dataTransfer.files[0].type != filetype ) {
+ fails[fails.length] = 'dataTransfer.files[0].type '+e.dataTransfer.files[0].type+' instead of '+filetype;
+ }
+ if( !window.FileReader ) {
+ fails[fails.length] = 'No FileReader constructor';
+ finish();
+ return;
+ }
+ var reader = new FileReader();
+ reader.onload = function () {
+ if( !reader.result ) {
+ fails[fails.length] = 'No file data after load';
+ }
+ if( reader.result.length != filesize ) {
+ fails[fails.length] = 'File data length '+reader.result.length+' instead of '+filesize;
+ }
+ finish();
+ };
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ setTimeout(function () {
+ if( !reader.result ) {
+ fails[fails.length] = 'No file data after timeout';
+ }
+ finish();
+ },1000);
};
};
function finish() {
- if( finished ) { return; }
- finished = true;
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ if( finished ) { return; }
+ finished = true;
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/002.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/002.html
index a60b2b201ce..b029afb3ef8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/002.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/002.html
@@ -14,129 +14,129 @@ var fails = [], finished = false, donecount = 0;
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragover = orange.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- }
- if( e.dataTransfer.files.length ) {
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 0 for '+e.type;
- }
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ }
+ if( e.dataTransfer.files.length ) {
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 0 for '+e.type;
+ }
};
- orange.ondrop = function(e) {
- e.preventDefault();
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- finish();
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- }
- if( e.dataTransfer.files.length != 2 ) {
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 2 for '+e.type;
- }
- if( !e.dataTransfer.files[0] ) {
- fails[fails.length] = 'no dataTransfer.files[0] for drop';
- finish();
- return;
- }
- if( !e.dataTransfer.files[1] ) {
- fails[fails.length] = 'no dataTransfer.files[1] for drop';
- finish();
- return;
- }
- //allow files to be dropped in any order, since this will be determined by the OS
- var i0 = 0, i1 = 1;
- if( e.dataTransfer.files[0].name == filename2 ) {
- i0 = 1;
- i1 = 0;
- }
- if( e.dataTransfer.files[i0].size != filesize1 ) {
- fails[fails.length] = 'dataTransfer.files['+i0+'].size '+e.dataTransfer.files[i0].size+' instead of '+filesize1;
- }
- /*
- if( !e.dataTransfer.files[i0].lastModifiedDate ) {
- fails[fails.length] = 'no dataTransfer.files['+i0+'].lastModifiedDate';
- }
- */
- if( e.dataTransfer.files[i0].name != filename1 ) {
- fails[fails.length] = 'dataTransfer.files['+i0+'].name '+e.dataTransfer.files[i0].name+' instead of '+filename1;
- }
- if( e.dataTransfer.files[i0].type != filetype1 ) {
- fails[fails.length] = 'dataTransfer.files['+i0+'].type '+e.dataTransfer.files[i0].type+' instead of '+filetype1;
- }
- if( e.dataTransfer.files[i1].size != filesize2 ) {
- fails[fails.length] = 'dataTransfer.files['+i1+'].size '+e.dataTransfer.files[i1].size+' instead of '+filesize2;
- }
- /*
- if( !e.dataTransfer.files[i1].lastModifiedDate ) {
- fails[fails.length] = 'no dataTransfer.files['+i1+'].lastModifiedDate';
- }
- */
- if( e.dataTransfer.files[i1].name != filename2 ) {
- fails[fails.length] = 'dataTransfer.files['+i1+'].name '+e.dataTransfer.files[i1].name+' instead of '+filename2;
- }
- if( e.dataTransfer.files[i1].type != filetype2 ) {
- fails[fails.length] = 'dataTransfer.files['+i1+'].type '+e.dataTransfer.files[i1].type+' instead of '+filetype2;
- }
- if( !window.FileReader ) {
- fails[fails.length] = 'No FileReader constructor';
- finish();
- return;
- }
- var reader1 = new FileReader();
- reader1.readAsBinaryString(e.dataTransfer.files[i0]);
- reader1.onload = function () {
- if( !reader1.result ) {
- fails[fails.length] = 'No files['+i0+'] data after load';
- }
- if( reader1.result.length != filesize1 ) {
- fails[fails.length] = 'files['+i0+'] file data length '+reader1.result.length+' instead of '+filesize1;
- }
- if( donecount++ ) {
- finish();
- }
- };
- var reader2 = new FileReader();
- reader2.onload = function () {
- if( !reader2.result ) {
- fails[fails.length] = 'No files['+i1+'] data after load';
- }
- if( reader2.result.length != filesize2 ) {
- fails[fails.length] = 'files['+i1+'] file data length '+reader2.result.length+' instead of '+filesize2;
- }
- if( donecount++ ) {
- finish();
- }
- };
- reader2.readAsBinaryString(e.dataTransfer.files[i1]);
- setTimeout(function () {
- if( !reader1.result ) {
- fails[fails.length] = 'No files['+i0+'] data after timeout';
- }
- if( !reader2.result ) {
- fails[fails.length] = 'No files['+i1+'] data after timeout';
- }
- finish();
- },1000);
+ orange.ondrop = function(e) {
+ e.preventDefault();
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ finish();
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ }
+ if( e.dataTransfer.files.length != 2 ) {
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 2 for '+e.type;
+ }
+ if( !e.dataTransfer.files[0] ) {
+ fails[fails.length] = 'no dataTransfer.files[0] for drop';
+ finish();
+ return;
+ }
+ if( !e.dataTransfer.files[1] ) {
+ fails[fails.length] = 'no dataTransfer.files[1] for drop';
+ finish();
+ return;
+ }
+ //allow files to be dropped in any order, since this will be determined by the OS
+ var i0 = 0, i1 = 1;
+ if( e.dataTransfer.files[0].name == filename2 ) {
+ i0 = 1;
+ i1 = 0;
+ }
+ if( e.dataTransfer.files[i0].size != filesize1 ) {
+ fails[fails.length] = 'dataTransfer.files['+i0+'].size '+e.dataTransfer.files[i0].size+' instead of '+filesize1;
+ }
+ /*
+ if( !e.dataTransfer.files[i0].lastModifiedDate ) {
+ fails[fails.length] = 'no dataTransfer.files['+i0+'].lastModifiedDate';
+ }
+ */
+ if( e.dataTransfer.files[i0].name != filename1 ) {
+ fails[fails.length] = 'dataTransfer.files['+i0+'].name '+e.dataTransfer.files[i0].name+' instead of '+filename1;
+ }
+ if( e.dataTransfer.files[i0].type != filetype1 ) {
+ fails[fails.length] = 'dataTransfer.files['+i0+'].type '+e.dataTransfer.files[i0].type+' instead of '+filetype1;
+ }
+ if( e.dataTransfer.files[i1].size != filesize2 ) {
+ fails[fails.length] = 'dataTransfer.files['+i1+'].size '+e.dataTransfer.files[i1].size+' instead of '+filesize2;
+ }
+ /*
+ if( !e.dataTransfer.files[i1].lastModifiedDate ) {
+ fails[fails.length] = 'no dataTransfer.files['+i1+'].lastModifiedDate';
+ }
+ */
+ if( e.dataTransfer.files[i1].name != filename2 ) {
+ fails[fails.length] = 'dataTransfer.files['+i1+'].name '+e.dataTransfer.files[i1].name+' instead of '+filename2;
+ }
+ if( e.dataTransfer.files[i1].type != filetype2 ) {
+ fails[fails.length] = 'dataTransfer.files['+i1+'].type '+e.dataTransfer.files[i1].type+' instead of '+filetype2;
+ }
+ if( !window.FileReader ) {
+ fails[fails.length] = 'No FileReader constructor';
+ finish();
+ return;
+ }
+ var reader1 = new FileReader();
+ reader1.readAsBinaryString(e.dataTransfer.files[i0]);
+ reader1.onload = function () {
+ if( !reader1.result ) {
+ fails[fails.length] = 'No files['+i0+'] data after load';
+ }
+ if( reader1.result.length != filesize1 ) {
+ fails[fails.length] = 'files['+i0+'] file data length '+reader1.result.length+' instead of '+filesize1;
+ }
+ if( donecount++ ) {
+ finish();
+ }
+ };
+ var reader2 = new FileReader();
+ reader2.onload = function () {
+ if( !reader2.result ) {
+ fails[fails.length] = 'No files['+i1+'] data after load';
+ }
+ if( reader2.result.length != filesize2 ) {
+ fails[fails.length] = 'files['+i1+'] file data length '+reader2.result.length+' instead of '+filesize2;
+ }
+ if( donecount++ ) {
+ finish();
+ }
+ };
+ reader2.readAsBinaryString(e.dataTransfer.files[i1]);
+ setTimeout(function () {
+ if( !reader1.result ) {
+ fails[fails.length] = 'No files['+i0+'] data after timeout';
+ }
+ if( !reader2.result ) {
+ fails[fails.length] = 'No files['+i1+'] data after timeout';
+ }
+ finish();
+ },1000);
};
};
function finish() {
- if( finished ) { return; }
- finished = true;
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ if( finished ) { return; }
+ finished = true;
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/003.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/003.html
index 86a3e7fced8..0c532ea5c3e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/003.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/003.html
@@ -14,73 +14,73 @@ var fails = [], finished = false;
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragover = orange.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
};
- orange.ondrop = function(e) {
- e.preventDefault();
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- finish();
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- }
- if( e.dataTransfer.files.length != 1 ) {
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 1 for '+e.type;
- }
- if( !e.dataTransfer.files[0] ) {
- fails[fails.length] = 'no dataTransfer.files[0] for drop';
- finish();
- return;
- }
- if( e.dataTransfer.files[0].size != filesize ) {
- fails[fails.length] = 'dataTransfer.files[0].size '+e.dataTransfer.files[0].size+' instead of '+filesize;
- }
- /*
- if( !e.dataTransfer.files[0].lastModifiedDate ) {
- fails[fails.length] = 'no dataTransfer.files[0].lastModifiedDate';
- }
- */
- if( e.dataTransfer.files[0].name != filename ) {
- fails[fails.length] = 'dataTransfer.files[0].name '+e.dataTransfer.files[0].name+' instead of '+filename;
- }
- if( e.dataTransfer.files[0].type != filetype ) {
- fails[fails.length] = 'dataTransfer.files[0].type '+e.dataTransfer.files[0].type+' instead of '+filetype;
- }
- if( !window.FileReader ) {
- fails[fails.length] = 'No FileReader constructor';
- finish();
- return;
- }
- var reader = new FileReader();
- reader.onload = function () {
- if( !reader.result ) {
- fails[fails.length] = 'No file data after load';
- }
- if( reader.result.length != filesize ) {
- fails[fails.length] = 'File data length '+reader.result.length+' instead of '+filesize;
- }
- finish();
- };
- reader.readAsBinaryString(e.dataTransfer.files[0]);
- setTimeout(function () {
- if( !reader.result ) {
- fails[fails.length] = 'No file data after timeout';
- }
- finish();
- },1000);
+ orange.ondrop = function(e) {
+ e.preventDefault();
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ finish();
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 1 for '+e.type;
+ }
+ if( !e.dataTransfer.files[0] ) {
+ fails[fails.length] = 'no dataTransfer.files[0] for drop';
+ finish();
+ return;
+ }
+ if( e.dataTransfer.files[0].size != filesize ) {
+ fails[fails.length] = 'dataTransfer.files[0].size '+e.dataTransfer.files[0].size+' instead of '+filesize;
+ }
+ /*
+ if( !e.dataTransfer.files[0].lastModifiedDate ) {
+ fails[fails.length] = 'no dataTransfer.files[0].lastModifiedDate';
+ }
+ */
+ if( e.dataTransfer.files[0].name != filename ) {
+ fails[fails.length] = 'dataTransfer.files[0].name '+e.dataTransfer.files[0].name+' instead of '+filename;
+ }
+ if( e.dataTransfer.files[0].type != filetype ) {
+ fails[fails.length] = 'dataTransfer.files[0].type '+e.dataTransfer.files[0].type+' instead of '+filetype;
+ }
+ if( !window.FileReader ) {
+ fails[fails.length] = 'No FileReader constructor';
+ finish();
+ return;
+ }
+ var reader = new FileReader();
+ reader.onload = function () {
+ if( !reader.result ) {
+ fails[fails.length] = 'No file data after load';
+ }
+ if( reader.result.length != filesize ) {
+ fails[fails.length] = 'File data length '+reader.result.length+' instead of '+filesize;
+ }
+ finish();
+ };
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ setTimeout(function () {
+ if( !reader.result ) {
+ fails[fails.length] = 'No file data after timeout';
+ }
+ finish();
+ },1000);
};
};
function finish() {
- if( finished ) { return; }
- finished = true;
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ if( finished ) { return; }
+ finished = true;
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/004.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/004.html
index ea2d3575968..ee0d63455f2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/004.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/004.html
@@ -13,35 +13,35 @@ var fails = [];
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragover = orange.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
};
- orange.ondrop = function(e) {
- //if the browser simulates a drop, it must do so with an empty FileList
- e.preventDefault();
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- finish();
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- }
- if( e.dataTransfer.files.length ) {
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 0 for '+e.type;
- }
- if( e.dataTransfer.files[0] ) {
- fails[fails.length] = 'dataTransfer.files[0] exists for drop';
- finish();
- }
+ orange.ondrop = function(e) {
+ //if the browser simulates a drop, it must do so with an empty FileList
+ e.preventDefault();
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ finish();
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ }
+ if( e.dataTransfer.files.length ) {
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 0 for '+e.type;
+ }
+ if( e.dataTransfer.files[0] ) {
+ fails[fails.length] = 'dataTransfer.files[0] exists for drop';
+ finish();
+ }
};
};
function finish() {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/005.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/005.html
index 007d2b20f01..afb40e2199b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/005.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/005.html
@@ -2,11 +2,11 @@
<title>drag &amp; drop - dragging text onto a file input</title>
<ol>
- <li>Save <a href="../resources/filler.html">this file</a> to your computer.</li>
- <li>Write the full /path/and/name to that file, into the first input below, then select all of the text you just entered.</li>
- <li>Drag selected text to the file input. If no prompt appears, and the text is not added to the file input, pass and ignore further steps.</li>
- <li>If a prompt appears, accept it. Fail if the file input's value is set without any prompts.</li>
- <li>If a prompt appears; fail if the file input's value is not set after accepting the prompt.</li>
+ <li>Save <a href="../resources/filler.html">this file</a> to your computer.</li>
+ <li>Write the full /path/and/name to that file, into the first input below, then select all of the text you just entered.</li>
+ <li>Drag selected text to the file input. If no prompt appears, and the text is not added to the file input, pass and ignore further steps.</li>
+ <li>If a prompt appears, accept it. Fail if the file input's value is set without any prompts.</li>
+ <li>If a prompt appears; fail if the file input's value is not set after accepting the prompt.</li>
</ol>
<p><input value="/tmp/filler.html"></p>
<p><input type="file"></p>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/006.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/006.html
index 58d65187019..d25c5491e43 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/006.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/006.html
@@ -2,11 +2,11 @@
<title>drag &amp; drop - cancelling dragging text onto a file input</title>
<ol>
- <li>Save <a href="../resources/filler.html">this file</a> to your computer.</li>
- <li>Write the full /path/and/name to that file, into the first input below, then select all of the text you just entered.</li>
- <li>Drag selected text to the file input. If no prompt appears, and the text is not added to the file input, pass and ignore further steps.</li>
- <li>If a prompt appears, refuse it. Fail if the file input's value is set without any prompts.</li>
- <li>If a prompt appears; fail if the file input's value is set after refusing the prompt.</li>
+ <li>Save <a href="../resources/filler.html">this file</a> to your computer.</li>
+ <li>Write the full /path/and/name to that file, into the first input below, then select all of the text you just entered.</li>
+ <li>Drag selected text to the file input. If no prompt appears, and the text is not added to the file input, pass and ignore further steps.</li>
+ <li>If a prompt appears, refuse it. Fail if the file input's value is set without any prompts.</li>
+ <li>If a prompt appears; fail if the file input's value is set after refusing the prompt.</li>
</ol>
<p><input value="/tmp/filler.html"></p>
<p><input type="file"></p>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/007.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/007.html
index 60be19b0aff..f3e511791c9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/007.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/007.html
@@ -16,80 +16,80 @@ var fails = [], finished = false;
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragover = orange.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- }
- if( e.dataTransfer.files.length ) {
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 0 for '+e.type;
- }
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ }
+ if( e.dataTransfer.files.length ) {
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 0 for '+e.type;
+ }
};
- orange.ondrop = function(e) {
- e.preventDefault();
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- finish();
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- }
- if( e.dataTransfer.files.length != 1 ) {
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 1 for '+e.type;
- }
- if( !e.dataTransfer.files[0] ) {
- fails[fails.length] = 'no dataTransfer.files[0] for drop';
- finish();
- return;
- }
- if( e.dataTransfer.files[0].size != filesize1 && e.dataTransfer.files[0].size != filesize2 ) {
- fails[fails.length] = 'dataTransfer.files[0].size '+e.dataTransfer.files[0].size+' instead of '+filesize1+' or '+filesize2;
- }
- /*
- if( !e.dataTransfer.files[0].lastModifiedDate ) {
- fails[fails.length] = 'no dataTransfer.files[0].lastModifiedDate';
- }
- */
- if( !window.FileReader ) {
- fails[fails.length] = 'No FileReader constructor';
- finish();
- return;
- }
- var reader = new FileReader();
- reader.readAsBinaryString(e.dataTransfer.files[0]);
- reader.onload = function () {
- if( !reader.result ) {
- fails[fails.length] = 'No file data after load';
- }
- if( reader.result.length != filesize1 && reader.result.length != filesize2 ) {
- fails[fails.length] = 'File data length '+reader.result.length+' instead of '+filesize1+' or '+filesize2;
- }
- finish();
- };
- setTimeout(function () {
- if( !reader.result ) {
- fails[fails.length] = 'No file data after timeout';
- }
- finish();
- },1000);
+ orange.ondrop = function(e) {
+ e.preventDefault();
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ finish();
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 1 for '+e.type;
+ }
+ if( !e.dataTransfer.files[0] ) {
+ fails[fails.length] = 'no dataTransfer.files[0] for drop';
+ finish();
+ return;
+ }
+ if( e.dataTransfer.files[0].size != filesize1 && e.dataTransfer.files[0].size != filesize2 ) {
+ fails[fails.length] = 'dataTransfer.files[0].size '+e.dataTransfer.files[0].size+' instead of '+filesize1+' or '+filesize2;
+ }
+ /*
+ if( !e.dataTransfer.files[0].lastModifiedDate ) {
+ fails[fails.length] = 'no dataTransfer.files[0].lastModifiedDate';
+ }
+ */
+ if( !window.FileReader ) {
+ fails[fails.length] = 'No FileReader constructor';
+ finish();
+ return;
+ }
+ var reader = new FileReader();
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ reader.onload = function () {
+ if( !reader.result ) {
+ fails[fails.length] = 'No file data after load';
+ }
+ if( reader.result.length != filesize1 && reader.result.length != filesize2 ) {
+ fails[fails.length] = 'File data length '+reader.result.length+' instead of '+filesize1+' or '+filesize2;
+ }
+ finish();
+ };
+ setTimeout(function () {
+ if( !reader.result ) {
+ fails[fails.length] = 'No file data after timeout';
+ }
+ finish();
+ },1000);
};
};
function finish() {
- if( finished ) { return; }
- finished = true;
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS if the UI did not lock up';
+ if( finished ) { return; }
+ finished = true;
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS if the UI did not lock up';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/008.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/008.html
index d610d8ee60e..3ba282766cb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/008.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/008.html
@@ -13,88 +13,88 @@ var fails = [], finished = false;
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragover = orange.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- } else if( e.dataTransfer.files.length ) {
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 0 for '+e.type;
- }
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ } else if( e.dataTransfer.files.length ) {
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 0 for '+e.type;
+ }
};
- orange.ondrop = function(e) {
- e.preventDefault();
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- finish();
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- }
- //browsers represent it as a single file (name matching the folder)
- //also allow no files, since that is a valid solution
- if( e.dataTransfer.files.length > 1 ) {
- //dropping the contents of the folder would be crazy, since there could literally be millions of files, or the entire disk contents
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 1 for '+e.type;
- }
- if( !e.dataTransfer.files[0] ) {
- finish();
- return;
- }
- /*
- Windows 7 sometimes randomly assigns size to folders, and that is presented to the browser.
- Strangely, packing and unpacking that folder can remove its size.
- Since this is an OS quirk that we have no control over, the test will not check the size.
- if( e.dataTransfer.files[0].size ) {
- fails[fails.length] = 'dataTransfer.files[0].size '+e.dataTransfer.files[0].size+' instead of 0';
- }
- */
- /*
- if( !e.dataTransfer.files[0].lastModifiedDate ) {
- fails[fails.length] = 'no dataTransfer.files[0].lastModifiedDate';
- }
- */
- if( !window.FileReader ) {
- fails[fails.length] = 'No FileReader constructor';
- finish();
- return;
- }
- var reader = new FileReader();
- reader.onload = function () {
- fails[fails.length] = 'File managed to load even though it was a folder '+e.type;
- finish();
- };
- reader.onerror = function () {
- finish();
- };
- try {
- reader.readAsBinaryString(e.dataTransfer.files[0]);
- } catch(err) {
- fails[fails.length] = 'Threw an error when trying to read the file '+e.type;
- finish();
- return;
- }
- setTimeout(function () {
- fails[fails.length] = 'Onerror failed to fire '+reader.error.code;
- finish();
- },1000);
+ orange.ondrop = function(e) {
+ e.preventDefault();
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ finish();
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ }
+ //browsers represent it as a single file (name matching the folder)
+ //also allow no files, since that is a valid solution
+ if( e.dataTransfer.files.length > 1 ) {
+ //dropping the contents of the folder would be crazy, since there could literally be millions of files, or the entire disk contents
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 1 for '+e.type;
+ }
+ if( !e.dataTransfer.files[0] ) {
+ finish();
+ return;
+ }
+ /*
+ Windows 7 sometimes randomly assigns size to folders, and that is presented to the browser.
+ Strangely, packing and unpacking that folder can remove its size.
+ Since this is an OS quirk that we have no control over, the test will not check the size.
+ if( e.dataTransfer.files[0].size ) {
+ fails[fails.length] = 'dataTransfer.files[0].size '+e.dataTransfer.files[0].size+' instead of 0';
+ }
+ */
+ /*
+ if( !e.dataTransfer.files[0].lastModifiedDate ) {
+ fails[fails.length] = 'no dataTransfer.files[0].lastModifiedDate';
+ }
+ */
+ if( !window.FileReader ) {
+ fails[fails.length] = 'No FileReader constructor';
+ finish();
+ return;
+ }
+ var reader = new FileReader();
+ reader.onload = function () {
+ fails[fails.length] = 'File managed to load even though it was a folder '+e.type;
+ finish();
+ };
+ reader.onerror = function () {
+ finish();
+ };
+ try {
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ } catch(err) {
+ fails[fails.length] = 'Threw an error when trying to read the file '+e.type;
+ finish();
+ return;
+ }
+ setTimeout(function () {
+ fails[fails.length] = 'Onerror failed to fire '+reader.error.code;
+ finish();
+ },1000);
};
};
function finish() {
- if( finished ) { return; }
- finished = true;
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ if( finished ) { return; }
+ finished = true;
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
}
</script>
@@ -103,11 +103,11 @@ function finish() {
<p>Drag a folder containing at least 2 files, from your computer's file manager, onto the orange box above. If a no-drop cursor was shown and no text changes when the folder is dropped, pass and ignore further conditions. If a prompt appears, accept it. Fail if the mouse cursor makes it look like it will work but nothing happens.</p>
<p>This test needs to be repeated with:</p>
<ul>
- <li>A regular folder containing at least 2 items</li>
- <li>A disk drive (if your OS exposes them) containing at least 2 items</li>
- <li>The system trash/recycle bin folder (if your OS exposes one) containing at least 2 items</li>
- <li>The &quot;My Computer&quot; folder (if your OS provides it)</li>
- <li>Your &quot;My Documents&quot; folder (if your OS provides it)</li>
- <li>A folder that you do not have permissions to access</li>
+ <li>A regular folder containing at least 2 items</li>
+ <li>A disk drive (if your OS exposes them) containing at least 2 items</li>
+ <li>The system trash/recycle bin folder (if your OS exposes one) containing at least 2 items</li>
+ <li>The &quot;My Computer&quot; folder (if your OS provides it)</li>
+ <li>Your &quot;My Documents&quot; folder (if your OS provides it)</li>
+ <li>A folder that you do not have permissions to access</li>
</ul>
<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/010.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/010.html
index ba24ae600cf..331cafc5ef8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/010.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/010.html
@@ -13,11 +13,11 @@
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragover = orange.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'none';
};
- orange.ondrop = function(e) {
- e.preventDefault();
+ orange.ondrop = function(e) {
+ e.preventDefault();
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/011.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/011.html
index f05929c777f..2c12d64eceb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/011.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/011.html
@@ -13,77 +13,77 @@ var filename = 'fail.png', filesize = '759', filetype = 'image/png';
var fails = [], finished = false;
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
- orange.ondragenter = function(e) {
+ orange.ondragenter = function(e) {
e.dataTransfer.dropEffect = 'copy';
};
/* orange.ondragover = function(e) {
- e.preventDefault();
+ e.preventDefault();
};
*/
- orange.ondrop = function(e) {
- e.preventDefault();
- if( !e.dataTransfer.files ) {
- fails[fails.length] = 'No dataTransfer.files for '+e.type;
- }
- if( !window.FileList ) {
- fails[fails.length] = 'No FileList interface object';
- finish();
- return;
- }
- if( !( e.dataTransfer.files instanceof FileList ) ) {
- fails[fails.length] = 'dataTransfer.files is not a FileList';
- }
- if( e.dataTransfer.files.length != 1 ) {
- fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 1 for '+e.type;
- }
- if( !e.dataTransfer.files[0] ) {
- fails[fails.length] = 'no dataTransfer.files[0] for drop';
- finish();
- return;
- }
- if( e.dataTransfer.files[0].size != filesize ) {
- fails[fails.length] = 'dataTransfer.files[0].size '+e.dataTransfer.files[0].size+' instead of '+filesize;
- }
- /*
- if( !e.dataTransfer.files[0].lastModifiedDate ) {
- fails[fails.length] = 'no dataTransfer.files[0].lastModifiedDate';
- }
- */
- if( e.dataTransfer.files[0].name != filename ) {
- fails[fails.length] = 'dataTransfer.files[0].name '+e.dataTransfer.files[0].name+' instead of '+filename;
- }
- if( e.dataTransfer.files[0].type != filetype ) {
- fails[fails.length] = 'dataTransfer.files[0].type '+e.dataTransfer.files[0].type+' instead of '+filetype;
- }
- if( !window.FileReader ) {
- fails[fails.length] = 'No FileReader constructor';
- finish();
- return;
- }
- var reader = new FileReader();
- reader.onload = function () {
- if( !reader.result ) {
- fails[fails.length] = 'No file data after load';
- }
- if( reader.result.length != filesize ) {
- fails[fails.length] = 'File data length '+reader.result.length+' instead of '+filesize;
- }
- finish();
- };
- reader.readAsBinaryString(e.dataTransfer.files[0]);
- setTimeout(function () {
- if( !reader.result ) {
- fails[fails.length] = 'No file data after timeout';
- }
- finish();
- },1000);
+ orange.ondrop = function(e) {
+ e.preventDefault();
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = 'No dataTransfer.files for '+e.type;
+ }
+ if( !window.FileList ) {
+ fails[fails.length] = 'No FileList interface object';
+ finish();
+ return;
+ }
+ if( !( e.dataTransfer.files instanceof FileList ) ) {
+ fails[fails.length] = 'dataTransfer.files is not a FileList';
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ fails[fails.length] = 'dataTransfer.files.length is '+e.dataTransfer.files.length+' instead of 1 for '+e.type;
+ }
+ if( !e.dataTransfer.files[0] ) {
+ fails[fails.length] = 'no dataTransfer.files[0] for drop';
+ finish();
+ return;
+ }
+ if( e.dataTransfer.files[0].size != filesize ) {
+ fails[fails.length] = 'dataTransfer.files[0].size '+e.dataTransfer.files[0].size+' instead of '+filesize;
+ }
+ /*
+ if( !e.dataTransfer.files[0].lastModifiedDate ) {
+ fails[fails.length] = 'no dataTransfer.files[0].lastModifiedDate';
+ }
+ */
+ if( e.dataTransfer.files[0].name != filename ) {
+ fails[fails.length] = 'dataTransfer.files[0].name '+e.dataTransfer.files[0].name+' instead of '+filename;
+ }
+ if( e.dataTransfer.files[0].type != filetype ) {
+ fails[fails.length] = 'dataTransfer.files[0].type '+e.dataTransfer.files[0].type+' instead of '+filetype;
+ }
+ if( !window.FileReader ) {
+ fails[fails.length] = 'No FileReader constructor';
+ finish();
+ return;
+ }
+ var reader = new FileReader();
+ reader.onload = function () {
+ if( !reader.result ) {
+ fails[fails.length] = 'No file data after load';
+ }
+ if( reader.result.length != filesize ) {
+ fails[fails.length] = 'File data length '+reader.result.length+' instead of '+filesize;
+ }
+ finish();
+ };
+ reader.readAsBinaryString(e.dataTransfer.files[0]);
+ setTimeout(function () {
+ if( !reader.result ) {
+ fails[fails.length] = 'No file data after timeout';
+ }
+ finish();
+ },1000);
};
};
function finish() {
- if( finished ) { return; }
- finished = true;
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ if( finished ) { return; }
+ finished = true;
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/001.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/001.html
index dc54aac5e14..52f6e8d01f6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/001.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/001.html
@@ -10,13 +10,13 @@
<script>
window.onload = function() {
- if( location.protocol != 'http:' && location.protocol != 'https:' ) {
- document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded over http or https.';
- return;
- }
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
- e.preventDefault();
+ if( location.protocol != 'http:' && location.protocol != 'https:' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded over http or https.';
+ return;
+ }
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
+ e.preventDefault();
};
document.getElementsByTagName('span')[0].innerHTML = location.hostname;
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/002.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/002.html
index 7bad40a2f04..f913aedfacb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/002.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/002.html
@@ -10,24 +10,24 @@
<script>
window.onload = function() {
- if( location.protocol != 'http:' && location.protocol != 'https:' ) {
- document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded over http or https.';
- return;
- }
- if( !location.hostname.match(/[^\.]\.[^\.]+\.[^\.]/) ) {
- document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded from a subdomain that allows document.domain to be set to a parent domain (try using a server name that contains at least two or three dots, for example www.example.org).';
- return;
- }
- var realhost = location.hostname, newdomain = location.hostname.replace(/^[^.]+\./,'');
- try {
- document.domain = location.hostname.replace(/^[^.]+\./,'');
- } catch(e) {
- document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded from a subdomain that allows document.domain to be set to a parent domain.';
- return;
- }
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
- e.preventDefault();
+ if( location.protocol != 'http:' && location.protocol != 'https:' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded over http or https.';
+ return;
+ }
+ if( !location.hostname.match(/[^\.]\.[^\.]+\.[^\.]/) ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded from a subdomain that allows document.domain to be set to a parent domain (try using a server name that contains at least two or three dots, for example www.example.org).';
+ return;
+ }
+ var realhost = location.hostname, newdomain = location.hostname.replace(/^[^.]+\./,'');
+ try {
+ document.domain = location.hostname.replace(/^[^.]+\./,'');
+ } catch(e) {
+ document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded from a subdomain that allows document.domain to be set to a parent domain.';
+ return;
+ }
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
+ e.preventDefault();
};
document.getElementsByTagName('span')[0].innerHTML = realhost;
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/003.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/003.html
index 4b7a98aae06..ada495bd193 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/003.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/003.html
@@ -10,13 +10,13 @@
<script>
window.onload = function() {
- if( location.protocol != 'ftp:' ) {
- document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded over ftp.';
- return;
- }
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
- e.preventDefault();
+ if( location.protocol != 'ftp:' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded over ftp.';
+ return;
+ }
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
+ e.preventDefault();
};
document.getElementsByTagName('span')[0].innerHTML = location.hostname;
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/004.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/004.html
index 53966881922..0232638ef8e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/004.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/004.html
@@ -10,13 +10,13 @@
<script>
window.onload = function() {
- if( location.protocol != 'file:' ) {
- document.getElementsByTagName('p')[0].innerHTML = 'Save this page to your local filesystem, and load it from there.';
- return;
- }
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
- e.preventDefault();
+ if( location.protocol != 'file:' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'Save this page to your local filesystem, and load it from there.';
+ return;
+ }
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
+ e.preventDefault();
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/005.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/005.html
index 395d37d626c..3a6c356c2ee 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/005.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/005.html
@@ -10,13 +10,13 @@
<script>
window.onload = function() {
- if( location.protocol == 'file:' || location.protocol == 'http:' || location.protocol == 'https:' ) {
- document.getElementsByTagName('p')[0].innerHTML = 'Use the source of this file as the source of special-case URLs within your browser, such as scriptable chrome: or opera: or attachment: URLs (eg. opera:config and send yourself the file as an email attachments and open the attachment in the browser).';
- return;
- }
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
- e.preventDefault();
+ if( location.protocol == 'file:' || location.protocol == 'http:' || location.protocol == 'https:' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'Use the source of this file as the source of special-case URLs within your browser, such as scriptable chrome: or opera: or attachment: URLs (eg. opera:config and send yourself the file as an email attachments and open the attachment in the browser).';
+ return;
+ }
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
+ e.preventDefault();
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/006.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/006.html
index 5f0f9b306d1..a0f919595bc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/006.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/006.html
@@ -6,11 +6,11 @@ iframe { border: none; height: 250px; width: 250px; }
<script>
window.onload = function() {
- if( location.protocol != 'http:' && location.protocol != 'https:' ) {
- document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded over http or https.';
- return;
- }
- var url = "data:text/html,"+escape(
+ if( location.protocol != 'http:' && location.protocol != 'https:' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded over http or https.';
+ return;
+ }
+ var url = "data:text/html,"+escape(
'<!DOCTYPE html>\
<title>drag &amp; drop - file drop prompt for data URI with inherited origin<\/title>\
<style>\
@@ -22,20 +22,20 @@ window.onload = function() {
<\/style>\
<script>\
window.onload = function() {\
- var orange = document.getElementsByTagName("div")[0];\
- orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {\
- e.preventDefault();\
+ var orange = document.getElementsByTagName("div")[0];\
+ orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {\
+ e.preventDefault();\
};\
};\
<\/script>\
<div><\/div>'
- );
- var frame = document.createElement('iframe');
- frame.setAttribute('src',url);
- document.body.appendChild(frame);
+ );
+ var frame = document.createElement('iframe');
+ frame.setAttribute('src',url);
+ document.body.appendChild(frame);
document.getElementsByTagName('span')[0].innerHTML = location.hostname;
};
</script>
<p>Drag a file from your desktop onto the orange square. A prompt should appear, correctly identifying the server name <span></span>.</p>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/007.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/007.html
index 5a5b982d6c1..be839f99c96 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/007.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/007.html
@@ -2,7 +2,7 @@
<title>drag &amp; drop - file drop prompt for data URI without inherited origin</title>
<script>
window.onload = function() {
- var url = "data:text/html,"+escape(
+ var url = "data:text/html,"+escape(
'<!DOCTYPE html>\
<title>drag &amp; drop - file drop prompt for data URI with inherited origin<\/title>\
<style>\
@@ -14,19 +14,19 @@ window.onload = function() {
<\/style>\
<script>\
window.onload = function() {\
- var orange = document.getElementsByTagName("div")[0];\
- orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {\
- e.preventDefault();\
+ var orange = document.getElementsByTagName("div")[0];\
+ orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {\
+ e.preventDefault();\
};\
};\
<\/script>\
<div><\/div>\
<p>Drag a file from your desktop onto the orange square. A prompt should appear, either showing the server name as unknown, or otherwise identifying this URL as the target of the upload.<\/p>'
- );
- document.getElementsByTagName('p')[1].textContent = url;
+ );
+ document.getElementsByTagName('p')[1].textContent = url;
};
</script>
<p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
<p></p>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/008.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/008.html
index ff07b78deb2..903808ea0d5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/008.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/008.html
@@ -6,11 +6,11 @@ iframe { border: none; height: 250px; width: 250px; }
<script>
window.onload = function() {
- if( location.protocol != 'http:' && location.protocol != 'https:' ) {
- document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded over http or https.';
- return;
- }
- var url = "javascript:'"+escape(
+ if( location.protocol != 'http:' && location.protocol != 'https:' ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'This test should be loaded over http or https.';
+ return;
+ }
+ var url = "javascript:'"+escape(
'<!DOCTYPE html>\
<title>drag &amp; drop - file drop prompt for data URI with inherited origin<\/title>\
<style>\
@@ -22,20 +22,20 @@ window.onload = function() {
<\/style>\
<script>\
window.onload = function() {\
- var orange = document.getElementsByTagName("div")[0];\
- orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {\
- e.preventDefault();\
+ var orange = document.getElementsByTagName("div")[0];\
+ orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {\
+ e.preventDefault();\
};\
};\
<\/script>\
<div><\/div>'
- +"'");
- var frame = document.createElement('iframe');
- frame.setAttribute('src',url);
- document.body.appendChild(frame);
+ +"'");
+ var frame = document.createElement('iframe');
+ frame.setAttribute('src',url);
+ document.body.appendChild(frame);
document.getElementsByTagName('span')[0].innerHTML = location.hostname;
};
</script>
<p>Drag a file from your desktop onto the orange square. A prompt should appear, correctly identifying the server name <span></span></p>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/009.html b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/009.html
index 6fa18b97597..b620ad6f155 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/009.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/file/prompt/009.html
@@ -2,7 +2,7 @@
<title>drag &amp; drop - file drop prompt for javascript URL without inherited origin</title>
<script>
window.onload = function() {
- var url = "javascript:'"+escape(
+ var url = "javascript:'"+escape(
'<!DOCTYPE html>\
<title>drag &amp; drop - file drop prompt for data URI with inherited origin<\/title>\
<style>\
@@ -14,19 +14,19 @@ window.onload = function() {
<\/style>\
<script>\
window.onload = function() {\
- var orange = document.getElementsByTagName("div")[0];\
- orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {\
- e.preventDefault();\
+ var orange = document.getElementsByTagName("div")[0];\
+ orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {\
+ e.preventDefault();\
};\
};\
<\/script>\
<div><\/div>\
<p>Drag a file from your desktop onto the orange square. A prompt should appear, either showing the server name as unknown, or otherwise identifying this URL as the target of the upload (it may alternatively identify the security context about:blank).<\/p>'
- +"'");
- document.getElementsByTagName('p')[1].textContent = url;
+ +"'");
+ document.getElementsByTagName('p')[1].textContent = url;
};
</script>
<p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
<p></p>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/001.xhtml
index e5ea49969b1..ef7d17b59e2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/001.xhtml
@@ -4,29 +4,29 @@
<title>Image drag and drop</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<p><img src="../resources/circle.png" alt="PNG circle" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/002.xhtml
index 65584e85733..a7d79f20ebe 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/002.xhtml
@@ -4,29 +4,29 @@
<title>dataURL image drag and drop</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/003.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/003.xhtml
index ae94a8b3f1e..a8c623b2bca 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/003.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/003.xhtml
@@ -4,29 +4,29 @@
<title>Image drag and drop outside browser window</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Drag circle above outside the window and then back inside and drop in the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/004.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/004.xhtml
index e0fff952380..c7b39432d83 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/004.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/004.xhtml
@@ -4,32 +4,32 @@
<title>Object with image drag and drop</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/uri-list', document.querySelector('object').getAttribute('data'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/uri-list', document.querySelector('object').getAttribute('data'));}
</script>
</head>
<body>
<p><object draggable="true" ondragstart="start(event)" type="image/png" data="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle">PNG image</object></p>
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/005.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/005.xhtml
index 49eaabdfc9b..a57d0857571 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/005.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/005.xhtml
@@ -4,29 +4,29 @@
<title>JPG image drag and drop</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<p><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6AQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgsRAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/AABEIAGQAZAMBIgACEQEDEQH/2gAMAwEAAhEDEQA/AP7+KKK8v+Mvxl+Gn7P3w08V/F74veK9P8GfD/wZp51HXdd1EuVRS6wWtlZWsCy3mp6tqd5LBp+k6Tp8FxqGp6hcQWdnBLPKiHOtWo4ejVxGIq06FChTnVrVqs406VKlTi5VKlSpJqMIQinKUpNKKV2Y4jEUMJQrYrFVqWHw2HpTr4jEV5xpUaFGlFzqVatSbUKdOnBOU5yajGKbbsekXV1a2Frc319cwWdlZwTXV5eXU0dva2trbxtLcXNzcSskUEEESNLNNKyxxxqzuwUE1+B37ZX/AAcDfsvfAK61bwV8BNOm/aZ+ImnyS2U+p6Fqa6J8ItIvIzsk8zx19mv5/FjQEiVE8G6VqOiX6rJB/wAJZYTg7f54f+Clf/BX34z/ALc2tax4C8H3OrfCv9mS1v2TR/h7ZXX2bXfHVvayA2mt/FTULKd11SeaRBfWvhC0nbwvob/ZVZdd1bTo/EU/47V/KHHn0gsQ61bLeB4wp0YN055/iqKqVKzWnNl2ErL2dOn/AC18XTqyqLbDUbKcv4l8TPpR4t4jEZR4cQp0cPTcqU+JsZQVatXa0csqwNePsqVH+TE46nWnVT0wmHtGcv14+PH/AAXF/wCCiHxvub+Kx+LsPwV8NXe8ReGfgpo1t4Ra0jPCGPxndtrHxEFxs/1kkPi63gaTMkVrB8qJ+bPjH44fGr4iXLXnxA+L/wAUfHN2+4vdeMfH/ivxNcvu+9un1rVr2Rt38WW5715bRX87ZpxLxDnVSVTNs6zTMJS6YrG4irBeUKTn7KnHtCnCMV0R/KWc8XcU8Q1ZVs84hznNJTd7Y3McVWpR1vy06EqnsaMO1OlThCP2Yo19P17XNJm+0aVrOraZcbt/n6fqN3Zzb+u/zbeaN93+1nNfV/ws/wCChP7b/wAF7q2ufh3+1N8a9JhtMeRo2qeONX8X+Fl29N3g/wAZTeIPCsvp+90d8r8p+XivjmiuHCZlmOXzVXAY/G4GqndVMJiq+Gmn3U6M4SX3nm4DN81yqoq2WZnmGXVou8auAxuJwlRNdVPD1Kck/mf01/swf8HJ3xp8KXOmaF+1d8LvD/xY8OhkhvvHfw4it/BHxDt4f+Wt/c+HJZT4F8S3I6R6fp6/D+DDZa8ymJP6if2Vv21/2bP2zvCT+K/gB8SNL8VNYxRN4i8JXYbRvHnhGSU7BH4l8I6h5eq2MLTboLbV4Y7rQNTljl/sjVtQjQvX+YXXoXwt+K/xI+CXjnQviX8JfGniDwB478NXQu9G8S+G7+Sw1C2bjzbeXbmC+068jzb6lpOoQ3Wl6pZvLZajZ3VpNLC/7Pwf48cVZHVpUM/m+JMruoz+scsc1ow6yoY2y+sSXxOGO9q6nwLEUF7x/QXAX0l+NOG61HC8T1JcW5LeMan1pxjneHp7OeHzGy+tSXxOnmKryrP3FisNfnP9V6ivwp/4JQf8FjfCv7altYfBP43f2N4G/af0+ykNh9kA0/wr8Y7HT7dprrVPCsMsjLpXi+0tYpLvX/B3msk9vHPr3hkyaYmp6T4a/dav7H4e4iyjinK6Gb5Lio4rB1tP5atCskvaYbE0vio4indc1OXRxnBzpThOX99cK8V5Fxpk2Gz7h7GxxuAxGj+zXw1eKTq4TGUX72HxVHmXPTl0calOU6NSnUkUUUV7h9GVru7tNPtLq/v7q3srGyt5ru9vbuaO2tLS0to2muLm5uJmSGC3ghR5ZppXWOKNWd2Cgmv8/L/gr9/wUq1r9uX40XPg7wFrF9a/syfCvVrqx+HukRtJbW/jvXbbzrHUPiprdr8rzTaorz2vg+2vRv0Pwu6sttp+ra74hjm/ob/4OB/2y7v4Bfsv6b8A/BWrSaf8RP2mJdU0PVLiyl2XmkfCHRFtv+E5fehLW7+Lbi/0vwdGkqbL/Q7/AMXCCRZ7HK/wtV/Jn0gePKzxEeB8srOFGnClic/nTlrWqVEq2Ey6Vv8Al3Tp8mLrx2qSq4Zaexmpfw/9KPxMxDxcPDjKMRKnh6VOhjOJp0pWderVUa+ByqTX/LmlS9njsTDVVZ1sItPYTUiiiiv5aP4vCiiigAooooAKKKKANnw94h13wlr2jeKfC+sal4e8SeHdUsdb0HXdGvJ9O1bRtY0u5jvNO1PTb+1eO5s76yu4Yri1uYJElhmjV0YMK/0If+CRf/BROz/b0+ARj8YXFpa/tBfCSPStA+LWnRJDax+Io7qKZNA+JOk2kISGKx8VpY3S6vZWscUWj+JrPU7aK1tdJudDa6/zxa+5P+CdP7XWr/sUftY/DT4zw3d4ngz+0U8JfFnSrXzGGufDDxJcW1t4mie1jBa9utE2WnizRbYbfM1/w/palxGZAf1Dwp47r8E8SUHWqy/sLM6lLCZxRb/dwhJ8tLMEtlVwMpe0k0rzw3t6O84uP7L4J+JWJ8O+LcNKvXn/AKt5zVo4HPsO5fuqdOcuShmkY7Ktl05+1lJLmqYT6zQ3qRlH/S8oqnp9/Y6tYWWqaZd29/pupWltf6ffWkqT2t7Y3kKXFpd208ZMc1vcQSJNDKhKSRurKSDVyv8AQhO+q1T1TXU/1LTTSad09U1s13R/nq/8Fw/jvc/G/wD4KI/F+zivzeeGvgvHo3wT8MQhhssz4PtjdeMoSq/J53/CxtY8YI8nMphitoZD/o6JH+RNen/G3xlc/Eb4z/Fz4g3jmW78d/E7x74yupCdxkufE/irVdbnctxuLSXrHOBnNeYV/mHxJmlTOuIM6zapJylmGaY3Fa9IVcROVKC/u06XJTgukIpH+OPF2c1OIeKOIc8qyc5ZrnOY41X+zTr4qpKjTX9ylR5KVNfZhCK6BRRRXhnzoUUUUAFFFFABRRRQAUUUUAf6JX/BFr483Xx8/wCCeHwR1HV9Q/tHxN8MYNW+CviSZpfOlWT4eXK2fhZLh2Jka6f4eXfg24uXmJllmneYlvMDH9Vq/gD/AOCc/wC3h4v/AGXvgl4o8A6BdGGz1f4p634wkUTXEf8ApN/4S8EaK7YikRf9V4fhGcZ4+lfff/D4H4l/9BB//Aq9/wDj9f1XknjdWwWS5RgqsKdWrhMrwGFqVZqTnUnQwtKlOpN9ZTlFyk+rZ/bHDn0iq+XcPZFl9anSrVsDk2V4OrWqKUqlWphsFQozqVJdZzlByk+rZ/LrrlhNpetavplzu+06dql/YXG773nWl3Lby7s87t8Zz71lV9i/8FB/hZc/Bf8Abe/am+HVxbfY4dI+NfjnU9FgwRt8LeLtXm8Y+D2+b/nr4V1/R5s/dbflSVINfHVfzFmWEqZfmOPwFVctXBY3FYSonuqmGrzozT9JQZ/HGbYCrlea5nllZONbLswxmAqp7qrhMRUw80/SVNhRRRXCecFFFFABRRRQAUUUUAFFFFAHv3wr+Feu+OPD95qumTarHBb6zcaewsSfK82Ky0+5JbH/AC02XaZ/2dtel/8ADPPi/wD5+/EX5tX9Mn/BCL9jPwZ48/YeuviJ8R9HjuZvHXxr8fat4UnNtBKZPC2j6T4Q8FtlriJj8vinwt4oj+Q+X8n9/fX7P/8ADBnwE/6AEP8A4Baf/wDGK/Xst8Lc6zDLsBj6WFrSpY3BYXF02oTs4YmhCtBrXrGaP3jKPBniLNMpyvM6ODryo5jl2Cx1KSpztKni8NTrwa8nGomfzN/8HJv7MFz4S+Nnww/au0HTHHh34teHofh147voUYwwfETwPbSP4eub+Y8JceJfAfk6fp0K8GH4f38h2t9/+Zev9PP9tj9lXwl+2f8As1/Ej4A+K2hspPFGli88IeIpIzI/hHx7ox+3+EfEsewGbybLVEjg1e3tzHLqXh+71fSPMSPUHNf5pvxW+F3jn4J/Efxn8JviXoN34Z8d+AdfvvDfiXRbxfntdQsZMeZBL/q7zTr6Aw6hpWpW5ez1TTLq01GylmtLqGV/X8eOD6uRcVTz7D0n/ZfEjeI54r3KOaxivrtCVtpYj/foOWtR1cQo/wACR7f0l+Aq3DfGlTibC0X/AGNxbJ4r2kV7mHzuMV/aOHm+ksVZZjTcv4sq+KUNMNM8+ooor8KP5sCiiigAooooAKKKKACt/wAK+GNf8b+J/DngzwppdzrfijxdrukeGfDejWSh7zVte16/t9L0jTLVSQGuL6/ure1hBIBklXJFYFf0zf8ABvV+wJd/EP4lT/ts/EnRpo/Afwru7zR/gxb31uVt/FvxKkgmsdX8VW6y8XWkfD6ynltbScRNBL4y1CCWzvEv/B2oW9fT8H8M4zi/iHLsiwal/tVZPFVktMJgabUsXipdF7KlfkUv4lZ0qK96pFH2PAXB+P474qynhrARl/ttdPGYhK8cDltJqeOxs/sr2NC/s1K3tcRKjQXv1Yo/q4/ZT+BWlfsy/s3/AAY+A2j+S0Pwy8A6H4ev7q3/ANVqniMW/wBt8W64vyR8694pvNY1l/3afPfN8q9K+gqKK/0qwuGo4LC4bB4aCp4fCUKOGw9NbU6NCnGlSgvKMIpH+u2CweHy7B4TL8JTVHCYHDUMHhaUdqWHw1KNGjTXlCnCMV6BX4Uf8Fjf+CUNt+2n4V/4Xf8ABPT7Kw/af8DaMtp9gMlvp9j8Y/Cmn75IvCuqXU7w2tp4u0lXl/4Q/X7uSOCeNj4Y12ZdNk0jUvDf7r0V5XEXD2V8U5Rislzeh7bB4qPSyrUKsf4WJw1Sz9niKMvepys1vCcZ0pzhLxeK+Fcm40yLG8PZ9hvrGAxsd1aNfDV460cZhKrUvY4rDy96nOzXxU6kalGdSnL/ACePEPh7XvCWu6x4X8U6Nqnh3xJ4e1K80bXdB1uxudL1jRtW06d7W/03U9OvI4buyvrO5jkgubW4ijmhlRkdQwrGr/Q4/wCCin/BIv4Cft6WVz4xhMPwk/aEtrSOLTvi1oOlRXMXiNLSFYLTSfiVoMc1iniqxjgjitLLWFubTxNosMVrHbald6TaNoV1/FV+13/wTq/aw/Yo1i7h+M/w01H/AIQxLz7LpXxZ8JJceJPhfrgdxHavD4mtraP+xLq8Y4t9E8WWnh/X5NrsulmICVv4T478KuI+Ca9as6FTM8i5m6OcYWlKUIU+izClHmlgaq0TdT/Z5v8AhV5u8Y/5reJXgnxb4d4mvXlhquccN8zeHz7BUZTpwpX92OaUYc88urxVlKVX/ZKkn+4xNR80Y/DlFFFfl5+NhRRRQAUVv+GPCvifxtr+l+FPBnhzXfFvijW7lbLRvDnhnSL/AF7XtXvHyUtNM0jS4Lq/vrlgCVhtbeWQgE7eK/pH/YD/AODer4lfEO80X4k/tszXfws8BJLBf2/wY0e+gf4meK4VIlS38V6tZSXFj8P9Hu12C5tLWe/8ZyQG6spYPB9+sGoL9PwzwfxDxfjFg8iy6tiveSr4pp08DhE/t4rFyXsqWnvKF3WqWtRpVJe6fY8H8BcVcd4+OA4byqvjPfUcRjXF0stwMX/y8xuOkvY0Uo+8qd5YiqlahRqztE/OT/gmP/wTH+Jf/BQD4lwXNzBqvg/9nbwfqsA+J3xOEAi+0+UI7p/A3gZ7qN7fVPGmqW7xiaYR3On+EtPuU1vW0lkl0bRtd/0Hfhr8N/BPwf8AAPhL4X/Dfw9Y+FPAvgXQ7Hw54Y8P6arC103S9PiEcKb5Gee6uZTuub6/u5Z77Ub6a4v7+4uLy4nmc+G/w18A/B/wT4e+G/wv8JaH4F8C+FLFdN8P+GPDljFp+l6bahmkfZDGMy3N1O8t3f31y019qN9PcX9/cXF5cTTv3Ff3T4ceHGW8AZbKEJLG5zjVH+08z5eXm5dY4XCxfvUsHSlqk/3lep+9q/8ALqlR/wBJPCbwmynwvymdOnOOYcQZhGH9sZxycvPy6xwWCi/eo5fRlqk/3mJqfv69rUaNAooor9IP1sKKKKACqd/YWGq2V1puqWVpqWnX0EtrfWF/bw3lleWsylJra6tbhJILiCVCUkhlRo3UlWUirlFG+j1TBpNNNXT0aezXZn5TfHj/AIIr/wDBO/493N/q198Eofhf4l1De0viL4Katc/Dtkkk5eaPwpaJefDv7Q7/AL2S4m8GSzyyEtK77mz/ACn/ALev/BO/4K/st+Lb7Qfh/wCJ/ijq9pbPdKknjHWvCl/cnyDhdzaL4J8Px8/xYhHtiv8AQJr+On/gsR/yUjVv+u2o/wDoQr+UfG/JMlwNSNXBZRleDq1aXPUqYXAYXDzqTb1nOdKlGUpPrKTbP4l+kZw5w9ltWFfLsiybAVq1KNWtVwWWYLC1atSU/eqVJ0KEJTnLrKTbZ/PJ8LfhrofjfX20rVbrVre3F6Lffp89pFNs3hc7rixuk3f9s8e1f1c/sX/8EJP2H/H/AIM0n4kfES7+NfjiabyvP8Kap4+0jR/C02UEh3N4N8H+F/FS5+7+68UR/L0+b5q/mI/Z8/5HOT/sKL/6NFf6Cn7Av/JBNF/7Y/8ApOtfmXhZluXZhneGpY/AYLHUnXgnTxeFoYmDV9nCtCcX9x+PeCuUZVmnEWEo5nlmX5jRlXpKVLH4LD4um05vRwxFOpFr5Hq/wI/ZR/Zu/Zj0r+x/gL8F/APwyhkhFvd6h4e0OD/hJNVhBBVdd8XX/wBs8Va/t2ja2tazfsuBg8V9CUUV/emGwuFwVGGGweGoYTDUlanh8NRp0KNNdoUqUYwiv8KR/plg8Fg8uw9PB5fhMNgcJRXLRwuDoUsNh6Ue1OjRjCnBeUYoKKKK3OkKKKKAAP/Z" alt="JPG circle" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/006.xhtml
index 4011085ca06..db8285feec9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/006.xhtml
@@ -4,31 +4,31 @@
<title>dataURL image drag and drop from iframe</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
iframe
- {width:150px;
- height:150px;
- border-style:none;}
+ {width:150px;
+ height:150px;
+ border-style:none;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<p><iframe src="helper-drag-me-data-url-image.xhtml">XHTML with image</iframe></p>
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/007.xhtml
index e257a28c7b4..6443363abc2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/007.xhtml
@@ -4,9 +4,9 @@
<title>dataURL image drag and drop to iframe</title>
<style type="text/css">
iframe
- {width:160px;
- height:160px;
- border-style:none;}
+ {width:160px;
+ height:160px;
+ border-style:none;}
</style>
</head>
<body>
@@ -14,4 +14,4 @@ iframe
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<p><iframe src="helper-drop-image-here.xhtml">XHTML with image</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/008.xhtml
index b3f1042c918..09cbdae03cc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/008.xhtml
@@ -4,9 +4,9 @@
<title>dataURL image drag and drop between iframes</title>
<style type="text/css">
iframe
- {width:160px;
- height:160px;
- border-style:none;}
+ {width:160px;
+ height:160px;
+ border-style:none;}
</style>
</head>
<body>
@@ -14,4 +14,4 @@ iframe
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<p><iframe src="helper-drop-image-here.xhtml">XHTML with image</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/009.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/009.xhtml
index c8da488e83d..0bb3bce3b51 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/009.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/009.xhtml
@@ -4,31 +4,31 @@
<title>Image drag and drop from iframe</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
iframe
- {width:150px;
- height:150px;
- border-style:none;}
+ {width:150px;
+ height:150px;
+ border-style:none;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<p><iframe src="helper-circle.xhtml">XHTML with image</iframe></p>
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/010.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/010.xhtml
index bec92d9f7c8..6ff3a3d7ccb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/010.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/010.xhtml
@@ -4,11 +4,11 @@
<title>Image drag and drop to iframe</title>
<style type="text/css">
p:first-child
- {padding-left:20px;}
+ {padding-left:20px;}
iframe
- {width:160px;
- height:160px;
- border-style:none;}
+ {width:160px;
+ height:160px;
+ border-style:none;}
</style>
</head>
<body>
@@ -16,4 +16,4 @@ iframe
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<p><iframe src="helper-drop-image-here.xhtml">XHTML with image</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/011.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/011.xhtml
index 4fa7c3eff8b..905ce2c4f81 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/011.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/011.xhtml
@@ -4,9 +4,9 @@
<title>Image drag and drop between iframes</title>
<style type="text/css">
iframe
- {width:160px;
- height:160px;
- border-style:none;}
+ {width:160px;
+ height:160px;
+ border-style:none;}
</style>
</head>
<body>
@@ -14,4 +14,4 @@ iframe
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<p><iframe src="helper-drop-image-here.xhtml">XHTML with image</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/014-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/014-1.xhtml
index a433bde987f..13d8e43f989 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/014-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/014-1.xhtml
@@ -4,29 +4,29 @@
<title>Image drag and drop: helper file</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- background-color:silver;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ background-color:silver;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<p><img src="../resources/circle.png" alt="PNG circle" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Drag circle from one frame to the silver box in <strong>another</strong> frame. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/015.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/015.xhtml
index 656f059530e..9a8edfebd22 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/015.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/015.xhtml
@@ -4,21 +4,21 @@
<title>Dropping image on horizontal scrollbar of a scrollable block element</title>
<style type="text/css">
div[ondragenter]
- {width:3em;
- height:3em;
- margin-top:1em;
- font-size:1.5em;
- white-space:nowrap;
- overflow-x:scroll;}
+ {width:3em;
+ height:3em;
+ margin-top:1em;
+ font-size:1.5em;
+ white-space:nowrap;
+ overflow-x:scroll;}
p:first-child
- {padding-left:1em;}
+ {padding-left:1em;}
img
- {width:5px;
- height:5px;}
+ {width:5px;
+ height:5px;}
</style>
<script type="application/ecmascript">
function checkImage(event)
- {document.querySelector('div').firstChild.nodeValue = (document.querySelector('img').getAttribute('src') == event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''))?'PASS':'FAIL';}
+ {document.querySelector('div').firstChild.nodeValue = (document.querySelector('img').getAttribute('src') == event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''))?'PASS':'FAIL';}
</script>
</head>
<body>
@@ -26,4 +26,4 @@ function checkImage(event)
<p>Drag little square above and drop it on scrollbar below. You should see word PASS when you drop it on scrollbar.</p>
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="checkImage(event)">↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/016.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/016.xhtml
index 3479c8f5013..e44cd525f03 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/016.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/016.xhtml
@@ -4,20 +4,20 @@
<title>Dropping image on vertical scrollbar of a scrollable block element</title>
<style type="text/css">
div[ondragenter]
- {width:2em;
- height:5em;
- margin-top:1em;
- font-size:1.5em;
- overflow-y:scroll;}
+ {width:2em;
+ height:5em;
+ margin-top:1em;
+ font-size:1.5em;
+ overflow-y:scroll;}
p:first-child
- {padding-left:1em;}
+ {padding-left:1em;}
img
- {width:5px;
- height:5px;}
+ {width:5px;
+ height:5px;}
</style>
<script type="application/ecmascript">
function checkImage(event)
- {document.querySelector('div').firstChild.nodeValue = (document.querySelector('img').getAttribute('src') == event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''))?'P A S S':'F A I L';}
+ {document.querySelector('div').firstChild.nodeValue = (document.querySelector('img').getAttribute('src') == event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''))?'P A S S':'F A I L';}
</script>
</head>
<body>
@@ -25,4 +25,4 @@ function checkImage(event)
<p>Drag little square above and drop it on scrollbar below. You should see word PASS when you drop it on scrollbar.</p>
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="checkImage(event)">→ → → → → → → → → → → → → → → → → → → →</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/017.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/017.xhtml
index 0231c719e28..f6cdd6006a0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/017.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/017.xhtml
@@ -4,22 +4,22 @@
<title>Dropping image on horizontal page scrollbar</title>
<style type="text/css">
p:first-child
- {padding-left:1em;}
+ {padding-left:1em;}
div
- {position:fixed;
- bottom:0;
- left:0;}
+ {position:fixed;
+ bottom:0;
+ left:0;}
img
- {width:5px;
- height:5px;}
+ {width:5px;
+ height:5px;}
body
- {width:3000px;}
+ {width:3000px;}
</style>
<script type="application/ecmascript">
function dragImage()
- {event.dataTransfer.effectAllowed = 'copy';}
+ {event.dataTransfer.effectAllowed = 'copy';}
function dropImage(event)
- {document.querySelector('div').firstChild.nodeValue = 'PASS';}
+ {document.querySelector('div').firstChild.nodeValue = 'PASS';}
</script>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false">
@@ -27,4 +27,4 @@ function dropImage(event)
<p>Drag little square above and drop it on vertical scrollbar. Word PASS should appear near scrollbar once you drop it.</p>
<div>↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/018.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/018.xhtml
index a4b6cca356e..7f38f9d8388 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/018.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/018.xhtml
@@ -4,21 +4,21 @@
<title>Dropping image on vertical page scrollbar</title>
<style type="text/css">
p:first-child
- {padding-left:1em;}
+ {padding-left:1em;}
div
- {width:1ex;
- margin-left:auto;}
+ {width:1ex;
+ margin-left:auto;}
img
- {width:5px;
- height:5px;}
+ {width:5px;
+ height:5px;}
body
- {height:3000px;}
+ {height:3000px;}
</style>
<script type="application/ecmascript">
function dragImage()
- {event.dataTransfer.effectAllowed = 'copy';}
+ {event.dataTransfer.effectAllowed = 'copy';}
function dropImage(event)
- {document.querySelector('div').firstChild.nodeValue = 'P A S S';}
+ {document.querySelector('div').firstChild.nodeValue = 'P A S S';}
</script>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false">
@@ -26,4 +26,4 @@ function dropImage(event)
<p>Drag little square above and drop it on vertical scrollbar. Word PASS should appear near scrollbar once you drop it.</p>
<div>→ → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → →</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/021.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/021.xhtml
index 33acd920350..239f9ccdc83 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/021.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/021.xhtml
@@ -4,19 +4,19 @@
<title>Dropping image on horizontal iframe scrollbar</title>
<style type="text/css">
p:first-child
- {padding-left:1em;}
+ {padding-left:1em;}
iframe
- {height:3em;
- width:4em;}
+ {height:3em;
+ width:4em;}
img
- {width:5px;
- height:5px;}
+ {width:5px;
+ height:5px;}
</style>
<script type="application/ecmascript">
function dragImage()
- {event.dataTransfer.effectAllowed = 'copy';}
+ {event.dataTransfer.effectAllowed = 'copy';}
function dropImage(event)
- {document.querySelector('p + p').firstChild.nodeValue = 'PASS';}
+ {document.querySelector('p + p').firstChild.nodeValue = 'PASS';}
</script>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false">
@@ -24,4 +24,4 @@ function dropImage(event)
<p>Drag little square above and drop it on horizontal scrollbar. Word PASS should appear once you drop it.</p>
<iframe src="helper-drop-horizontal-scrollbar.xhtml">XHTML document</iframe>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/022.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/022.xhtml
index 41edef04af4..a85f8c10f11 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/022.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/022.xhtml
@@ -4,19 +4,19 @@
<title>Dropping image on vertical iframe scrollbar</title>
<style type="text/css">
p:first-child
- {padding-left:1em;}
+ {padding-left:1em;}
iframe
- {height:6em;
- width:3em;}
+ {height:6em;
+ width:3em;}
img
- {width:5px;
- height:5px;}
+ {width:5px;
+ height:5px;}
</style>
<script type="application/ecmascript">
function dragImage()
- {event.dataTransfer.effectAllowed = 'copy';}
+ {event.dataTransfer.effectAllowed = 'copy';}
function dropImage(event)
- {document.querySelector('p + p').firstChild.nodeValue = 'PASS';}
+ {document.querySelector('p + p').firstChild.nodeValue = 'PASS';}
</script>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false">
@@ -24,4 +24,4 @@ function dropImage(event)
<p>Drag little square above and drop it on vertical scrollbar. Word PASS should appear once you drop it.</p>
<iframe src="helper-drop-vertical-scrollbar.xhtml">XHTML document</iframe>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/023.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/023.xhtml
index a282570d0e5..0d9e3401e62 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/023.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/023.xhtml
@@ -4,19 +4,19 @@
<title>Dropping image on horizontal object scrollbar</title>
<style type="text/css">
p:first-child
- {padding-left:1em;}
+ {padding-left:1em;}
object
- {height:3em;
- width:4em;}
+ {height:3em;
+ width:4em;}
img
- {width:5px;
- height:5px;}
+ {width:5px;
+ height:5px;}
</style>
<script type="application/ecmascript">
function dragImage()
- {event.dataTransfer.effectAllowed = 'copy';}
+ {event.dataTransfer.effectAllowed = 'copy';}
function dropImage(event)
- {document.querySelector('p + p').firstChild.nodeValue = 'PASS';}
+ {document.querySelector('p + p').firstChild.nodeValue = 'PASS';}
</script>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false">
@@ -24,4 +24,4 @@ function dropImage(event)
<p>Drag little square above and drop it on horizontal scrollbar. Word PASS should appear once you drop it.</p>
<object type="application/xhtml+xml" data="helper-drop-horizontal-scrollbar.xhtml">XHTML document</object>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/024.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/024.xhtml
index 789f8ea8b2a..0c3a456064d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/024.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/024.xhtml
@@ -4,19 +4,19 @@
<title>Dropping image on vertical object scrollbar</title>
<style type="text/css">
p:first-child
- {padding-left:1em;}
+ {padding-left:1em;}
object
- {height:6em;
- width:3em;}
+ {height:6em;
+ width:3em;}
img
- {width:5px;
- height:5px;}
+ {width:5px;
+ height:5px;}
</style>
<script type="application/ecmascript">
function dragImage()
- {event.dataTransfer.effectAllowed = 'copy';}
+ {event.dataTransfer.effectAllowed = 'copy';}
function dropImage(event)
- {document.querySelector('p + p').firstChild.nodeValue = 'PASS';}
+ {document.querySelector('p + p').firstChild.nodeValue = 'PASS';}
</script>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false">
@@ -24,4 +24,4 @@ function dropImage(event)
<p>Drag little square above and drop it on vertical scrollbar. Word PASS should appear once you drop it.</p>
<object type="application/xhtml+xml" data="helper-drop-vertical-scrollbar.xhtml">XHTML document</object>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/025.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/025.xhtml
index d0b44383001..c077aa8b61b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/025.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/025.xhtml
@@ -4,24 +4,24 @@
<title>Drag and drop of image to scrollable container with horizontal scrollbar</title>
<style type="text/css">
p + div
- {height:150px;
- width:150px;
- overflow-x:scroll;}
+ {height:150px;
+ width:150px;
+ overflow-x:scroll;}
div[ondragenter]
- {margin-left:200px;
- width:105px;
- min-height:105px;
- text-align:center;
- padding:10px;
- background-color:silver;}
+ {margin-left:200px;
+ width:105px;
+ min-height:105px;
+ text-align:center;
+ padding:10px;
+ background-color:silver;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div > div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div > div').appendChild(c);}
</script>
</head>
<body>
@@ -29,11 +29,11 @@ function addImage(event)
<p>Drag circle above to the silver box inside scrollable container below (dragging towards edge of container triggers scrolling).</p>
<p>It should be copied to the silver box once you drop it there.</p>
<div>
- <div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
- />
+ <div
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
+ />
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/026.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/026.xhtml
index 68ad4eb953b..23063c7b4d0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/026.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/026.xhtml
@@ -4,24 +4,24 @@
<title>Drag and drop of image to scrollable container with vertical scrollbar</title>
<style type="text/css">
p + div
- {height:150px;
- width:150px;
- overflow-y:scroll;}
+ {height:150px;
+ width:150px;
+ overflow-y:scroll;}
div[ondragenter]
- {margin-top:200px;
- width:105px;
- min-height:105px;
- text-align:center;
- padding:10px;
- background-color:silver;}
+ {margin-top:200px;
+ width:105px;
+ min-height:105px;
+ text-align:center;
+ padding:10px;
+ background-color:silver;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div > div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div > div').appendChild(c);}
</script>
</head>
<body>
@@ -30,11 +30,11 @@ function addImage(event)
<p>It should be copied to the silver box once you drop it there.</p>
<div>
↓↓↓↓↓↓↓↓↓
- <div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
- />
+ <div
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
+ />
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/027.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/027.xhtml
index 51428a1ac3f..aa40e7e4804 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/027.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/027.xhtml
@@ -4,24 +4,24 @@
<title>Drag and drop of image to scrollable container</title>
<style type="text/css">
p + div
- {height:150px;
- width:150px;
- overflow:scroll;}
+ {height:150px;
+ width:150px;
+ overflow:scroll;}
div[ondragenter]
- {margin:200px 0 0 200px;
- width:105px;
- min-height:105px;
- text-align:center;
- padding:10px;
- background-color:silver;}
+ {margin:200px 0 0 200px;
+ width:105px;
+ min-height:105px;
+ text-align:center;
+ padding:10px;
+ background-color:silver;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div > div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div > div').appendChild(c);}
</script>
</head>
<body>
@@ -30,11 +30,11 @@ function addImage(event)
<p>It should be copied to the silver box once you drop it there.</p>
<div>
- <div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
- />
+ <div
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
+ />
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/028.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/028.xhtml
index 1bb7a5e9370..fe4474cceb6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/028.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/028.xhtml
@@ -4,29 +4,29 @@
<title>Image drag and drop and url alias</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('url'));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('url'));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Drag circle above outside the window and then back inside and drop in the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.manual.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.manual.xhtml
index 1c777a8f767..f0646334107 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.manual.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/cross-domain/001.manual.xhtml
@@ -5,12 +5,12 @@
<script src="../../resources/crossorigin.sub.js"></script>
<style type="text/css">
div {
- width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;
+ width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;
}
</style>
</head>
@@ -23,26 +23,26 @@ div {
document.getElementsByTagName("img")[0].src = crossOriginUrl("www", "../../resources/100x100-navy.png");
window.onload = function() {
- var image = document.getElementsByTagName('img')[0], div = document.getElementsByTagName('div')[0], failed = [];
+ var image = document.getElementsByTagName('img')[0], div = document.getElementsByTagName('div')[0], failed = [];
div.ondragover = div.ondragenter = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
+ };
+ div.ondrop = image.ondragstart = function(e) {
+ if( e.type == 'dragstart' ) {
+ e.dataTransfer.setData('Text', 'dummy text');
+ e.dataTransfer.dropEffect = 'copy';
+ }
+ for( var i = 0; i < e.dataTransfer.types.length; i++ ) {
+ if( e.dataTransfer.types[i].match(/image\//) ) {
+ failed[failed.length] = e.dataTransfer.types[i];
+ }
+ }
+ if( e.type == 'drop' ) {
+ e.preventDefault();
+ document.getElementsByTagName('p')[1].innerHTML = failed.length ? ( 'FAIL (found ' + failed.join() + ')' ) : 'PASS';
+ }
};
- div.ondrop = image.ondragstart = function(e) {
- if( e.type == 'dragstart' ) {
- e.dataTransfer.setData('Text', 'dummy text');
- e.dataTransfer.dropEffect = 'copy';
- }
- for( var i = 0; i < e.dataTransfer.types.length; i++ ) {
- if( e.dataTransfer.types[i].match(/image\//) ) {
- failed[failed.length] = e.dataTransfer.types[i];
- }
- }
- if( e.type == 'drop' ) {
- e.preventDefault();
- document.getElementsByTagName('p')[1].innerHTML = failed.length ? ( 'FAIL (found ' + failed.join() + ')' ) : 'PASS';
- }
- };
};
]]></script>
</body>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/helper-drop-image-here.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/helper-drop-image-here.xhtml
index 00fb97a63bc..78fa33bf093 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/helper-drop-image-here.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/helper-drop-image-here.xhtml
@@ -4,25 +4,25 @@
<title>Image drag and drop: helper file</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/images/helper-drop-vertical-scrollbar.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/images/helper-drop-vertical-scrollbar.xhtml
index 619723882ce..2c3913bfc38 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/images/helper-drop-vertical-scrollbar.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/images/helper-drop-vertical-scrollbar.xhtml
@@ -4,10 +4,10 @@
<title>Image drag and drop: helper file</title>
<style type="text/css">
div
- {width:1ex;}
+ {width:1ex;}
</style>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false">
<div>→ → → → → → → → → → → → → → → → → → → →</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactive/frames-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactive/frames-1.html
index 7df4fab4ef8..b1a4f5fdef3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactive/frames-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactive/frames-1.html
@@ -1,18 +1,18 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop should allow dragging of iframes and object iframes</title>
- <style type="text/css">
+ <head>
+ <title>drag and drop should allow dragging of iframes and object iframes</title>
+ <style type="text/css">
html { background: black; color: white; }
- </style>
- </head>
- <body>
+ </style>
+ </head>
+ <body>
- <script type="text/javascript">
+ <script type="text/javascript">
if( self == top ) {
- document.write('<p>This is a helper file, not a testcase.<\/p>');
+ document.write('<p>This is a helper file, not a testcase.<\/p>');
}
- </script>
+ </script>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactive/frames.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactive/frames.html
index 0414c524981..ae14232e5a8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactive/frames.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactive/frames.html
@@ -1,22 +1,22 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop should allow dragging of iframes and object iframes</title>
- <style type="text/css">
+ <head>
+ <title>drag and drop should allow dragging of iframes and object iframes</title>
+ <style type="text/css">
iframe, object {
- border: 10px solid orange;
- background: blue;
- padding: 10px;
- height: 100px;
- width: 100px;
+ border: 10px solid orange;
+ background: blue;
+ padding: 10px;
+ height: 100px;
+ width: 100px;
}
- </style>
- </head>
- <body>
+ </style>
+ </head>
+ <body>
- <p>It should be possible to drag the following two blocks by both their orange and blue borders.</p>
- <p><iframe draggable="true" src="frames-1.html"></iframe></p>
- <p><object draggable="true" data="frames-1.html"></object></p>
+ <p>It should be possible to drag the following two blocks by both their orange and blue borders.</p>
+ <p><iframe draggable="true" src="frames-1.html"></iframe></p>
+ <p><object draggable="true" data="frames-1.html"></object></p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactive/object-retention.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactive/object-retention.html
index 92a71d526b7..d1d26034212 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactive/object-retention.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactive/object-retention.html
@@ -7,7 +7,7 @@
background-color: orange;
}
body > div + div {
- margin-top: 10px;
+ margin-top: 10px;
height: 200px;
width: 200px;
background-color: blue;
@@ -20,119 +20,119 @@ window.onload = function() {
orange.ondragstart = function(e) {
e.dataTransfer.effectAllowed = 'copy';
var foo = {};
- e.dataTransfer.setData('text', foo);
- if( e.dataTransfer.getData('text') === foo ) {
- fails[fails.length] = 'object was not cast to string';
- }
- evs[e.type] = {};
- evs[e.type].dataTransfer = e.dataTransfer;
- evs[e.type].items = e.dataTransfer.items;
- evs[e.type].types = e.dataTransfer.types;
- evs[e.type].files = e.dataTransfer.files;
- //"The same object must be returned each time."
- if( evs[e.type].dataTransfer !== e.dataTransfer ) {
- fails[fails.length] = '.dataTransfer is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.items ) {
- fails[fails.length] = '.items is not returning anything during '+e.type;
- } else if( evs[e.type].items !== e.dataTransfer.items ) {
- fails[fails.length] = '.items is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.types ) {
- fails[fails.length] = '.types is not returning anything during '+e.type;
- } else if( evs[e.type].types !== e.dataTransfer.types ) {
- fails[fails.length] = '.types is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.files ) {
- fails[fails.length] = '.files is not returning anything during '+e.type;
- } else if( evs[e.type].files !== e.dataTransfer.files ) {
- fails[fails.length] = '.files is not returning the same object during '+e.type;
- }
+ e.dataTransfer.setData('text', foo);
+ if( e.dataTransfer.getData('text') === foo ) {
+ fails[fails.length] = 'object was not cast to string';
+ }
+ evs[e.type] = {};
+ evs[e.type].dataTransfer = e.dataTransfer;
+ evs[e.type].items = e.dataTransfer.items;
+ evs[e.type].types = e.dataTransfer.types;
+ evs[e.type].files = e.dataTransfer.files;
+ //"The same object must be returned each time."
+ if( evs[e.type].dataTransfer !== e.dataTransfer ) {
+ fails[fails.length] = '.dataTransfer is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.items ) {
+ fails[fails.length] = '.items is not returning anything during '+e.type;
+ } else if( evs[e.type].items !== e.dataTransfer.items ) {
+ fails[fails.length] = '.items is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.types ) {
+ fails[fails.length] = '.types is not returning anything during '+e.type;
+ } else if( evs[e.type].types !== e.dataTransfer.types ) {
+ fails[fails.length] = '.types is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = '.files is not returning anything during '+e.type;
+ } else if( evs[e.type].files !== e.dataTransfer.files ) {
+ fails[fails.length] = '.files is not returning the same object during '+e.type;
+ }
};
blue.ondragover = blue.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
- if( !evs[e.type] ) { evs[e.type] = {}; }
- evs[e.type].dataTransfer = e.dataTransfer;
- evs[e.type].items = e.dataTransfer.items;
- evs[e.type].types = e.dataTransfer.types;
- evs[e.type].files = e.dataTransfer.files;
- if( evs[e.type].dataTransfer != e.dataTransfer ) {
- fails[fails.length] = '.dataTransfer is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.items ) {
- fails[fails.length] = '.items is not returning anything during '+e.type;
- } else if( evs[e.type].items !== e.dataTransfer.items ) {
- fails[fails.length] = '.items is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.types ) {
- fails[fails.length] = '.types is not returning anything during '+e.type;
- } else if( evs[e.type].types !== e.dataTransfer.types ) {
- fails[fails.length] = '.types is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.files ) {
- fails[fails.length] = '.files is not returning anything during '+e.type;
- } else if( evs[e.type].files !== e.dataTransfer.files ) {
- fails[fails.length] = '.files is not returning the same object during '+e.type;
- }
- //http://dev.w3.org/html5/spec/dnd.html#datatransfer
- //"The * attribute must return a * object associated with the DataTransfer object."
- //Note that it is associated with the DataTransfer object, *not* the data store
- //http://dev.w3.org/html5/spec/dnd.html#dragevent
- //"when a user agent is required to fire a DND event named e at an element, using a particular drag data store...
- //Let dataTransfer be a newly created DataTransfer object associated with the given drag data store."
- //A new DataTransfer object therefore means a new set of properties, not the same ones as last event
- if( evs.dragstart.dataTransfer === e.dataTransfer ) {
- fails[fails.length] = '.dataTransfer is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.items && evs.dragstart.items === e.dataTransfer.items ) {
- fails[fails.length] = '.items is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.types && evs.dragstart.types === e.dataTransfer.types ) {
- fails[fails.length] = '.types is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.files && evs.dragstart.files === e.dataTransfer.files ) {
- fails[fails.length] = '.files is returning the same object during '+e.type+' as it did during dragstart';
- }
+ if( !evs[e.type] ) { evs[e.type] = {}; }
+ evs[e.type].dataTransfer = e.dataTransfer;
+ evs[e.type].items = e.dataTransfer.items;
+ evs[e.type].types = e.dataTransfer.types;
+ evs[e.type].files = e.dataTransfer.files;
+ if( evs[e.type].dataTransfer != e.dataTransfer ) {
+ fails[fails.length] = '.dataTransfer is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.items ) {
+ fails[fails.length] = '.items is not returning anything during '+e.type;
+ } else if( evs[e.type].items !== e.dataTransfer.items ) {
+ fails[fails.length] = '.items is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.types ) {
+ fails[fails.length] = '.types is not returning anything during '+e.type;
+ } else if( evs[e.type].types !== e.dataTransfer.types ) {
+ fails[fails.length] = '.types is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = '.files is not returning anything during '+e.type;
+ } else if( evs[e.type].files !== e.dataTransfer.files ) {
+ fails[fails.length] = '.files is not returning the same object during '+e.type;
+ }
+ //http://dev.w3.org/html5/spec/dnd.html#datatransfer
+ //"The * attribute must return a * object associated with the DataTransfer object."
+ //Note that it is associated with the DataTransfer object, *not* the data store
+ //http://dev.w3.org/html5/spec/dnd.html#dragevent
+ //"when a user agent is required to fire a DND event named e at an element, using a particular drag data store...
+ //Let dataTransfer be a newly created DataTransfer object associated with the given drag data store."
+ //A new DataTransfer object therefore means a new set of properties, not the same ones as last event
+ if( evs.dragstart.dataTransfer === e.dataTransfer ) {
+ fails[fails.length] = '.dataTransfer is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.items && evs.dragstart.items === e.dataTransfer.items ) {
+ fails[fails.length] = '.items is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.types && evs.dragstart.types === e.dataTransfer.types ) {
+ fails[fails.length] = '.types is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.files && evs.dragstart.files === e.dataTransfer.files ) {
+ fails[fails.length] = '.files is returning the same object during '+e.type+' as it did during dragstart';
+ }
};
- blue.ondrop = function(e) {
- e.preventDefault();
- evs[e.type] = {};
- evs[e.type].dataTransfer = e.dataTransfer;
- evs[e.type].items = e.dataTransfer.items;
- evs[e.type].types = e.dataTransfer.types;
- evs[e.type].files = e.dataTransfer.files;
- if( evs[e.type].dataTransfer !== e.dataTransfer ) {
- fails[fails.length] = '.dataTransfer is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.items ) {
- fails[fails.length] = '.items is not returning anything during '+e.type;
- } else if( evs[e.type].items !== e.dataTransfer.items ) {
- fails[fails.length] = '.items is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.types ) {
- fails[fails.length] = '.types is not returning anything during '+e.type;
- } else if( evs[e.type].types !== e.dataTransfer.types ) {
- fails[fails.length] = '.types is not returning the same object during '+e.type;
- }
- if( !e.dataTransfer.files ) {
- fails[fails.length] = '.files is not returning anything during '+e.type;
- } else if( evs[e.type].files !== e.dataTransfer.files ) {
- fails[fails.length] = '.files is not returning the same object during '+e.type;
- }
- if( evs.dragstart.dataTransfer === e.dataTransfer ) {
- fails[fails.length] = '.dataTransfer is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.items && evs.dragstart.items === e.dataTransfer.items ) {
- fails[fails.length] = '.items is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.types && evs.dragstart.types === e.dataTransfer.types ) {
- fails[fails.length] = '.types is returning the same object during '+e.type+' as it did during dragstart';
- }
- if( e.dataTransfer.files && evs.dragstart.files === e.dataTransfer.files ) {
- fails[fails.length] = '.files is returning the same object during '+e.type+' as it did during dragstart';
- }
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
+ blue.ondrop = function(e) {
+ e.preventDefault();
+ evs[e.type] = {};
+ evs[e.type].dataTransfer = e.dataTransfer;
+ evs[e.type].items = e.dataTransfer.items;
+ evs[e.type].types = e.dataTransfer.types;
+ evs[e.type].files = e.dataTransfer.files;
+ if( evs[e.type].dataTransfer !== e.dataTransfer ) {
+ fails[fails.length] = '.dataTransfer is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.items ) {
+ fails[fails.length] = '.items is not returning anything during '+e.type;
+ } else if( evs[e.type].items !== e.dataTransfer.items ) {
+ fails[fails.length] = '.items is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.types ) {
+ fails[fails.length] = '.types is not returning anything during '+e.type;
+ } else if( evs[e.type].types !== e.dataTransfer.types ) {
+ fails[fails.length] = '.types is not returning the same object during '+e.type;
+ }
+ if( !e.dataTransfer.files ) {
+ fails[fails.length] = '.files is not returning anything during '+e.type;
+ } else if( evs[e.type].files !== e.dataTransfer.files ) {
+ fails[fails.length] = '.files is not returning the same object during '+e.type;
+ }
+ if( evs.dragstart.dataTransfer === e.dataTransfer ) {
+ fails[fails.length] = '.dataTransfer is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.items && evs.dragstart.items === e.dataTransfer.items ) {
+ fails[fails.length] = '.items is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.types && evs.dragstart.types === e.dataTransfer.types ) {
+ fails[fails.length] = '.types is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ if( e.dataTransfer.files && evs.dragstart.files === e.dataTransfer.files ) {
+ fails[fails.length] = '.files is returning the same object during '+e.type+' as it did during dragstart';
+ }
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactive/plugins.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactive/plugins.html
index 7be5ec9397a..70eb97bf42c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactive/plugins.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactive/plugins.html
@@ -1,28 +1,28 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop should not remove styling of plugin object elements</title>
- <style type="text/css">
+ <head>
+ <title>drag and drop should not remove styling of plugin object elements</title>
+ <style type="text/css">
div {
- border: 10px solid orange;
- background: yellow;
- padding: 10px;
- height: 140px;
- width: 140px;
+ border: 10px solid orange;
+ background: yellow;
+ padding: 10px;
+ height: 140px;
+ width: 140px;
}
object {
- border: 10px solid gray;
- background: fuchsia;
- padding: 10px;
- height: 100px;
- width: 100px;
+ border: 10px solid gray;
+ background: fuchsia;
+ padding: 10px;
+ height: 100px;
+ width: 100px;
}
- </style>
- </head>
- <body>
+ </style>
+ </head>
+ <body>
- <p>Drag the following block by the orange border. The drag placeholder should contain all inner borders, but may optionally show white or pink instead of the navy square.</p>
- <div draggable="true" ondragstart="event.dataTransfer.setData('Text','dummy text');"><object data="../resources/boxnavy.swf"></object></div>
+ <p>Drag the following block by the orange border. The drag placeholder should contain all inner borders, but may optionally show white or pink instead of the navy square.</p>
+ <div draggable="true" ondragstart="event.dataTransfer.setData('Text','dummy text');"><object data="../resources/boxnavy.swf"></object></div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/001.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/001.html
index 33c6518e083..25acccbef92 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/001.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/001.html
@@ -1,29 +1,29 @@
<!doctype html>
<html>
- <head>
- <title>Select input inside draggable element</title>
- <style type="text/css">
+ <head>
+ <title>Select input inside draggable element</title>
+ <style type="text/css">
select { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should open and select items in the dropdown, and should <strong>not</strong> drag the block or text.</p>
- <div draggable="true">
- <select>
- <option>Option 1</option>
- <option>Option 2</option>
- <option>Option 3</option>
- </select>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should open and select items in the dropdown, and should <strong>not</strong> drag the block or text.</p>
+ <div draggable="true">
+ <select>
+ <option>Option 1</option>
+ <option>Option 2</option>
+ <option>Option 3</option>
+ </select>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/002.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/002.html
index 8734a3e3aca..146676e5d0b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/002.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/002.html
@@ -1,29 +1,29 @@
<!doctype html>
<html>
- <head>
- <title>Select multiple input inside draggable element</title>
- <style type="text/css">
+ <head>
+ <title>Select multiple input inside draggable element</title>
+ <style type="text/css">
select { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should open and select items in the dropdown, and should <strong>not</strong> drag the block or text.</p>
- <div draggable="true">
- <select multiple size="3">
- <option>Option 1</option>
- <option>Option 2</option>
- <option>Option 3</option>
- </select>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should open and select items in the dropdown, and should <strong>not</strong> drag the block or text.</p>
+ <div draggable="true">
+ <select multiple size="3">
+ <option>Option 1</option>
+ <option>Option 2</option>
+ <option>Option 3</option>
+ </select>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/003.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/003.html
index 3399c2f0262..76ba2568315 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/003.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/003.html
@@ -1,29 +1,29 @@
<!doctype html>
<html>
- <head>
- <title>Draggable select</title>
- <style type="text/css">
+ <head>
+ <title>Draggable select</title>
+ <style type="text/css">
select { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('select')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('select')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should open and select items in the dropdown, and should <strong>not</strong> drag the block or text.</p>
- <div>
- <select draggable="true">
- <option>Option 1</option>
- <option>Option 2</option>
- <option>Option 3</option>
- </select>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should open and select items in the dropdown, and should <strong>not</strong> drag the block or text.</p>
+ <div>
+ <select draggable="true">
+ <option>Option 1</option>
+ <option>Option 2</option>
+ <option>Option 3</option>
+ </select>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/004.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/004.html
index 5f58b207ae1..9bd02771f07 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/004.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/004.html
@@ -1,29 +1,29 @@
<!doctype html>
<html>
- <head>
- <title>Draggable select multiple</title>
- <style type="text/css">
+ <head>
+ <title>Draggable select multiple</title>
+ <style type="text/css">
select { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('select')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('select')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should open and select items in the dropdown, and should <strong>not</strong> drag the block or text.</p>
- <div>
- <select multiple size="3" draggable="true">
- <option>Option 1</option>
- <option>Option 2</option>
- <option>Option 3</option>
- </select>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should open and select items in the dropdown, and should <strong>not</strong> drag the block or text.</p>
+ <div>
+ <select multiple size="3" draggable="true">
+ <option>Option 1</option>
+ <option>Option 2</option>
+ <option>Option 3</option>
+ </select>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/005.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/005.html
index 6647375c676..c08a5104db7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/005.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/005.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Text input inside draggable element</title>
- <style type="text/css">
+ <head>
+ <title>Text input inside draggable element</title>
+ <style type="text/css">
input { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should focus the dummy text. Use your mouse to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
- <div draggable="true">
- <input value="Dummy text">
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should focus the dummy text. Use your mouse to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
+ <div draggable="true">
+ <input value="Dummy text">
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/006.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/006.html
index 0ca35321220..46b1dc58d4a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/006.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/006.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Draggable text input</title>
- <style type="text/css">
+ <head>
+ <title>Draggable text input</title>
+ <style type="text/css">
input { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('input')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('input')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should focus the dummy text. Use your mouse to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
- <div>
- <input value="Dummy text" draggable="true">
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should focus the dummy text. Use your mouse to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
+ <div>
+ <input value="Dummy text" draggable="true">
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/007.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/007.html
index 6bcdc80e940..51d558ccf23 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/007.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/007.html
@@ -1,23 +1,23 @@
<!doctype html>
<html>
- <head>
- <title>Textarea inside draggable element</title>
- <style type="text/css">
+ <head>
+ <title>Textarea inside draggable element</title>
+ <style type="text/css">
textarea { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It may optionally focus the dummy text. Use your mouse to select part of the dummy text, moving the mouse vertically and horizontally. It should select the text. Try to drag the input's scrollbar thumb. It should <strong>not</strong> drag the block or text in any case.</p>
- <div draggable="true">
+ <p>Press your mouse button down on the orange block and drag downwards. It may optionally focus the dummy text. Use your mouse to select part of the dummy text, moving the mouse vertically and horizontally. It should select the text. Try to drag the input's scrollbar thumb. It should <strong>not</strong> drag the block or text in any case.</p>
+ <div draggable="true">
<textarea rows="5" cols="50" wrap="off">Dummy text
Dummy text
Dummy text
@@ -30,7 +30,7 @@ Dummy text
Dummy text
Dummy text
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</textarea>
- </div>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/008.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/008.html
index 7cb97518fee..780c82de20c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/008.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/008.html
@@ -1,23 +1,23 @@
<!doctype html>
<html>
- <head>
- <title>Draggable textarea</title>
- <style type="text/css">
+ <head>
+ <title>Draggable textarea</title>
+ <style type="text/css">
textarea { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('textarea')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('textarea')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It may optionally focus the dummy text. Use your mouse to select part of the dummy text, moving the mouse vertically and horizontally. It should select the text. Try to drag the input's scrollbar thumb. It should <strong>not</strong> drag the block or text in any case.</p>
- <div>
+ <p>Press your mouse button down on the orange block and drag downwards. It may optionally focus the dummy text. Use your mouse to select part of the dummy text, moving the mouse vertically and horizontally. It should select the text. Try to drag the input's scrollbar thumb. It should <strong>not</strong> drag the block or text in any case.</p>
+ <div>
<textarea rows="5" cols="50" wrap="off">Dummy text
Dummy text
Dummy text
@@ -30,7 +30,7 @@ Dummy text
Dummy text
Dummy text
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</textarea>
- </div>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/009.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/009.html
index 6c240c06fae..08859bbdae5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/009.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/009.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Input button inside draggable element</title>
- <style type="text/css">
+ <head>
+ <title>Input button inside draggable element</title>
+ <style type="text/css">
input { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the block or text.</p>
- <div draggable="true">
- <input type="button" value="Dummy text">
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the block or text.</p>
+ <div draggable="true">
+ <input type="button" value="Dummy text">
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/010.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/010.html
index 2253e8bae2e..48d67943d8c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/010.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/010.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Draggable input button</title>
- <style type="text/css">
+ <head>
+ <title>Draggable input button</title>
+ <style type="text/css">
input { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('input')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('input')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the block or text.</p>
- <div>
- <input type="button" value="Dummy text" draggable="true">
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the block or text.</p>
+ <div>
+ <input type="button" value="Dummy text" draggable="true">
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/011.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/011.html
index e90cfc3496a..315307a5eff 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/011.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/011.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Button inside draggable element</title>
- <style type="text/css">
+ <head>
+ <title>Button inside draggable element</title>
+ <style type="text/css">
button { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the block or text.</p>
- <div draggable="true">
- <button>Dummy text</button>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the block or text.</p>
+ <div draggable="true">
+ <button>Dummy text</button>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/012.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/012.html
index 15659cdc9d0..46a37240240 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/012.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/012.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Draggable button</title>
- <style type="text/css">
+ <head>
+ <title>Draggable button</title>
+ <style type="text/css">
button { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('button')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('button')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the block or text.</p>
- <div>
- <button draggable="true">Dummy text</button>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the block or text.</p>
+ <div>
+ <button draggable="true">Dummy text</button>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/015.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/015.html
index a2c66a145e8..28e8966bd4b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/015.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/015.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Contenteditable inside draggable element</title>
- <style type="text/css">
+ <head>
+ <title>Contenteditable inside draggable element</title>
+ <style type="text/css">
div div { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the text or the orange block. Use your mouse to select the dummy text. It should <strong>not</strong> drag the text or the orange block.</p>
- <div draggable="true">
- <div contenteditable="true">Dummy text</div>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the text or the orange block. Use your mouse to select the dummy text. It should <strong>not</strong> drag the text or the orange block.</p>
+ <div draggable="true">
+ <div contenteditable="true">Dummy text</div>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/016.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/016.html
index b9bc169e459..53145787b3f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/016.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/016.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Draggable contenteditable element</title>
- <style type="text/css">
+ <head>
+ <title>Draggable contenteditable element</title>
+ <style type="text/css">
div div { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[1].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[1].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the text or the orange block. Use your mouse to select the dummy text. It should <strong>not</strong> drag the text or the orange block.</p>
- <div>
- <div draggable="true" contenteditable="true">Dummy text</div>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. It should <strong>not</strong> drag the text or the orange block. Use your mouse to select the dummy text. It should <strong>not</strong> drag the text or the orange block.</p>
+ <div>
+ <div draggable="true" contenteditable="true">Dummy text</div>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/017.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/017.html
index 8de64c08bff..b99e5546821 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/017.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/017.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Scrollable element inside draggable element</title>
- <style type="text/css">
+ <head>
+ <title>Scrollable element inside draggable element</title>
+ <style type="text/css">
div div { width: 300px; height: 100px; overflow: auto; border: 1px solid orange; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>It should be possible to drag the scrollbar thumbs of the box below without dragging the whole box.</p>
- <div draggable="true">
- <div>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</div>
- </div>
+ <p>It should be possible to drag the scrollbar thumbs of the box below without dragging the whole box.</p>
+ <div draggable="true">
+ <div>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</div>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/018.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/018.html
index 67d8ad0f85f..57a5aaf4176 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/018.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/018.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Draggable scrollable element</title>
- <style type="text/css">
+ <head>
+ <title>Draggable scrollable element</title>
+ <style type="text/css">
div div { width: 300px; height: 100px; overflow: auto; border: 1px solid orange; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[1].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[1].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>It should be possible to drag the scrollbar thumbs of the box below without dragging the whole box.</p>
- <div>
- <div draggable="true">Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</div>
- </div>
+ <p>It should be possible to drag the scrollbar thumbs of the box below without dragging the whole box.</p>
+ <div>
+ <div draggable="true">Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>Dummy text<br>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</div>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/019.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/019.html
index 77e6e813ccb..79d3c4ec475 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/019.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/019.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Disabled text input with inside draggable element</title>
- <style type="text/css">
+ <head>
+ <title>Disabled text input with inside draggable element</title>
+ <style type="text/css">
input { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. Use your mouse to attempt to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
- <div draggable="true">
- <input value="Dummy text" disabled>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. Use your mouse to attempt to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
+ <div draggable="true">
+ <input value="Dummy text" disabled>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/020.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/020.html
index 2bad553120a..a64c74d05b7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/020.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/020.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Disabled draggable text input</title>
- <style type="text/css">
+ <head>
+ <title>Disabled draggable text input</title>
+ <style type="text/css">
input { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('input')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('input')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. Use your mouse to attempt to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
- <div>
- <input value="Dummy text" draggable="true" disabled>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. Use your mouse to attempt to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
+ <div>
+ <input value="Dummy text" draggable="true" disabled>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/021.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/021.html
index 954c59509f4..eee0efaef25 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/021.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/021.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Readonly text input with inside draggable element</title>
- <style type="text/css">
+ <head>
+ <title>Readonly text input with inside draggable element</title>
+ <style type="text/css">
input { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. Use your mouse to attempt to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
- <div draggable="true">
- <input value="Dummy text" readonly>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. Use your mouse to attempt to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
+ <div draggable="true">
+ <input value="Dummy text" readonly>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/022.html b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/022.html
index fb1d796bacf..48d85d5f425 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/022.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/interactiveelements/022.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Readonly draggable text input</title>
- <style type="text/css">
+ <head>
+ <title>Readonly draggable text input</title>
+ <style type="text/css">
input { border: 1px solid orange; border-top-width: 20px; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('input')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
+ document.getElementsByTagName('input')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- };
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Press your mouse button down on the orange block and drag downwards. Use your mouse to attempt to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
- <div>
- <input value="Dummy text" draggable="true" readonly>
- </div>
+ <p>Press your mouse button down on the orange block and drag downwards. Use your mouse to attempt to select part of the dummy text. It should <strong>not</strong> drag the block or text in either case.</p>
+ <div>
+ <input value="Dummy text" draggable="true" readonly>
+ </div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/media/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/media/001.xhtml
index 2f90f5c3ec6..28984b54482 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/media/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/media/001.xhtml
@@ -4,33 +4,33 @@
<title>Video drag and drop</title>
<style type="text/css">
canvas
- {background-color:silver;}
+ {background-color:silver;}
</style>
<script type="application/ecmascript">
var draggedFrame = 'data:text/plain,FAIL';
function dropIt(event)
- {document.querySelector('p + p').firstChild.nodeValue = (draggedFrame == event.dataTransfer.getData('text/uri-list'))?'PASS':'FAIL';}
+ {document.querySelector('p + p').firstChild.nodeValue = (draggedFrame == event.dataTransfer.getData('text/uri-list'))?'PASS':'FAIL';}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- var canvas = document.querySelector('canvas'),
- c = canvas.getContext('2d');
- c.drawImage(document.querySelector('video'),0,0,640,360);
- draggedFrame = canvas.toDataURL('image/png');
- event.dataTransfer.setData('text/uri-list',draggedFrame);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ var canvas = document.querySelector('canvas'),
+ c = canvas.getContext('2d');
+ c.drawImage(document.querySelector('video'),0,0,640,360);
+ draggedFrame = canvas.toDataURL('image/png');
+ event.dataTransfer.setData('text/uri-list',draggedFrame);}
</script>
<script src="/common/media.js"></script>
</head>
<body dropzone="copy string:text/uri-list" ondrop="dropIt(event)">
<p>
- <video draggable="true" ondragstart="start(event)" controls="true"/>
- <script>
- var video = document.querySelector('video');
- video.src = getVideoURI('/media/movie_5');
- </script>
+ <video draggable="true" ondragstart="start(event)" controls="true"/>
+ <script>
+ var video = document.querySelector('video');
+ video.src = getVideoURI('/media/movie_5');
+ </script>
</p>
<p>Drag video and drop it somewhere on the page. Dragged frame should be copied to the canvas below and you should see word PASS once you drop video.</p>
<p>
- <canvas width="640" height="360">Canvas</canvas>
+ <canvas width="640" height="360">Canvas</canvas>
</p>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/000.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/000.html
index 6ec402e7d6a..b6e641d08fd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/000.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/000.html
@@ -28,61 +28,61 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items collection'; }
- if( md.items.length != 0 ) { return 'unexpected items found'; }
- return '';
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items collection'; }
+ if( md.items.length != 0 ) { return 'unexpected items found'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/001.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/001.html
index eda592fc684..3f135658686 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/001.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/001.html
@@ -28,96 +28,96 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[0];
- orange.appendChild( makeEl('meta',{itemprop:'foo',content:'test'}) );
- orange.appendChild( makeEl('audio',{itemprop:'bar',src:'test'},'fail') );
- orange.appendChild( makeEl('embed',{itemprop:'foo',src:'test'}) );
- orange.appendChild( makeEl('iframe',{itemprop:'bar',src:'test'},'fail') );
- orange.appendChild( makeEl('img',{itemprop:'foo',src:'test'}) );
- orange.appendChild( makeEl('source',{itemprop:'bar',src:'test'}) );
- orange.appendChild( makeEl('track',{itemprop:'foo',src:'test'}) );
- orange.appendChild( makeEl('video',{itemprop:'bar',src:'test'},'fail') );
- orange.appendChild( makeEl('a',{itemprop:'foo',href:'test'},'fail') );
- orange.appendChild( makeEl('area',{itemprop:'bar',href:'test'}) );
- orange.appendChild( makeEl('link',{itemprop:'foo',href:'test'}) );
- orange.appendChild( makeEl('object',{itemprop:'bar',data:'test'},'fail') );
- orange.appendChild( makeEl('time',{itemprop:'foo'},'fail') );
- orange.appendChild( makeEl('time',{itemprop:'baz',datetime:'test'},'fail') );
- orange.appendChild( makeEl('div',{itemprop:'baz'},'test') );
- orange.appendChild( makeEl('madeuponthespot',{itemprop:'foo'},'test') );
- orange.appendChild( makeEl('madeuponthespot',{itemprop:'foo',content:'test',src:'test',href:'test',data:'test',datetime:'test',value:'test'},'test') );
- orange.appendChild( makeEl('input',{itemprop:'foo',value:'test'},'test') );
+ orange.appendChild( makeEl('meta',{itemprop:'foo',content:'test'}) );
+ orange.appendChild( makeEl('audio',{itemprop:'bar',src:'test'},'fail') );
+ orange.appendChild( makeEl('embed',{itemprop:'foo',src:'test'}) );
+ orange.appendChild( makeEl('iframe',{itemprop:'bar',src:'test'},'fail') );
+ orange.appendChild( makeEl('img',{itemprop:'foo',src:'test'}) );
+ orange.appendChild( makeEl('source',{itemprop:'bar',src:'test'}) );
+ orange.appendChild( makeEl('track',{itemprop:'foo',src:'test'}) );
+ orange.appendChild( makeEl('video',{itemprop:'bar',src:'test'},'fail') );
+ orange.appendChild( makeEl('a',{itemprop:'foo',href:'test'},'fail') );
+ orange.appendChild( makeEl('area',{itemprop:'bar',href:'test'}) );
+ orange.appendChild( makeEl('link',{itemprop:'foo',href:'test'}) );
+ orange.appendChild( makeEl('object',{itemprop:'bar',data:'test'},'fail') );
+ orange.appendChild( makeEl('time',{itemprop:'foo'},'fail') );
+ orange.appendChild( makeEl('time',{itemprop:'baz',datetime:'test'},'fail') );
+ orange.appendChild( makeEl('div',{itemprop:'baz'},'test') );
+ orange.appendChild( makeEl('madeuponthespot',{itemprop:'foo'},'test') );
+ orange.appendChild( makeEl('madeuponthespot',{itemprop:'foo',content:'test',src:'test',href:'test',data:'test',datetime:'test',value:'test'},'test') );
+ orange.appendChild( makeEl('input',{itemprop:'foo',value:'test'},'test') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items || md.items.length != 1 ) { return 'no items'; }
- if( !md.items[0].properties ) { return 'no properties'; }
- if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
- if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
- if( !md.items[0].properties.baz ) { return 'no properties.baz'; }
- if( md.items[0].properties.foo.length != 10 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 10'; }
- if( md.items[0].properties.bar.length != 6 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 6'; }
- if( md.items[0].properties.baz.length != 2 ) { return 'properties.baz length '+md.items[0].properties.baz.length+' instead of 2'; }
- for( i = 0; i < 10; i++ ) {
- if( md.items[0].properties.foo[i] != orange.properties.namedItem('foo').getValues()[i] ) { return 'properties.foo['+i+'] <i>'+md.items[0].properties.foo[i]+'</i> instead of <i>'+orange.properties.namedItem('foo').getValues()[i]+'</i>'; }
- }
- for( i = 0; i < 6; i++ ) {
- if( md.items[0].properties.bar[i] != orange.properties.namedItem('bar').getValues()[i] ) { return 'properties.bar['+i+'] <i>'+md.items[0].properties.bar[i]+'</i> instead of <i>'+orange.properties.namedItem('bar').getValues()[i]+'</i>'; }
- }
- for( i = 0; i < 2; i++ ) {
- if( md.items[0].properties.baz[i] != orange.properties.namedItem('baz').getValues()[i] ) { return 'properties.baz['+i+'] <i>'+md.items[0].properties.baz[i]+'</i> instead of <i>'+orange.properties.namedItem('baz').getValues()[i]+'</i>'; }
- }
- return '';
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items || md.items.length != 1 ) { return 'no items'; }
+ if( !md.items[0].properties ) { return 'no properties'; }
+ if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
+ if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
+ if( !md.items[0].properties.baz ) { return 'no properties.baz'; }
+ if( md.items[0].properties.foo.length != 10 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 10'; }
+ if( md.items[0].properties.bar.length != 6 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 6'; }
+ if( md.items[0].properties.baz.length != 2 ) { return 'properties.baz length '+md.items[0].properties.baz.length+' instead of 2'; }
+ for( i = 0; i < 10; i++ ) {
+ if( md.items[0].properties.foo[i] != orange.properties.namedItem('foo').getValues()[i] ) { return 'properties.foo['+i+'] <i>'+md.items[0].properties.foo[i]+'</i> instead of <i>'+orange.properties.namedItem('foo').getValues()[i]+'</i>'; }
+ }
+ for( i = 0; i < 6; i++ ) {
+ if( md.items[0].properties.bar[i] != orange.properties.namedItem('bar').getValues()[i] ) { return 'properties.bar['+i+'] <i>'+md.items[0].properties.bar[i]+'</i> instead of <i>'+orange.properties.namedItem('bar').getValues()[i]+'</i>'; }
+ }
+ for( i = 0; i < 2; i++ ) {
+ if( md.items[0].properties.baz[i] != orange.properties.namedItem('baz').getValues()[i] ) { return 'properties.baz['+i+'] <i>'+md.items[0].properties.baz[i]+'</i> instead of <i>'+orange.properties.namedItem('baz').getValues()[i]+'</i>'; }
+ }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/002.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/002.html
index bf75986bbfe..4e9a5e6de12 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/002.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/002.html
@@ -28,74 +28,74 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[0];
- orange.parentNode.insertBefore( makeEl('span',{itemprop:'foo',id:'id1'},'dummytext1 '), orange );
- orange.parentNode.appendChild( makeEl('span',{itemprop:'bar',id:'id2'},'dummytext2 ') );
- orange.parentNode.appendChild( makeEl('span',{itemprop:'foo',id:'id3'},'dummytext3 ') );
+ orange.parentNode.insertBefore( makeEl('span',{itemprop:'foo',id:'id1'},'dummytext1 '), orange );
+ orange.parentNode.appendChild( makeEl('span',{itemprop:'bar',id:'id2'},'dummytext2 ') );
+ orange.parentNode.appendChild( makeEl('span',{itemprop:'foo',id:'id3'},'dummytext3 ') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items || md.items.length != 1 ) { return 'no items'; }
- if( !md.items[0].properties ) { return 'no properties'; }
- if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
- if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
- if( md.items[0].properties.foo.length != 2 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 2'; }
- if( md.items[0].properties.bar.length != 1 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 1'; }
- for( i = 0; i < 2; i++ ) {
- if( md.items[0].properties.foo[i] != orange.properties.namedItem('foo').getValues()[i] ) { return 'properties.foo['+i+'] <i>'+md.items[0].properties.foo[i]+'</i> instead of <i>'+orange.properties.namedItem('foo').getValues()[i]+'</i>'; }
- }
- if( md.items[0].properties.bar[0] != orange.properties.namedItem('bar').getValues()[0] ) { return 'properties.bar[0] <i>'+md.items[0].properties.bar[i]+'</i> instead of <i>'+orange.properties.namedItem('bar').getValues()[0]+'</i>'; }
- return '';
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items || md.items.length != 1 ) { return 'no items'; }
+ if( !md.items[0].properties ) { return 'no properties'; }
+ if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
+ if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
+ if( md.items[0].properties.foo.length != 2 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 2'; }
+ if( md.items[0].properties.bar.length != 1 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 1'; }
+ for( i = 0; i < 2; i++ ) {
+ if( md.items[0].properties.foo[i] != orange.properties.namedItem('foo').getValues()[i] ) { return 'properties.foo['+i+'] <i>'+md.items[0].properties.foo[i]+'</i> instead of <i>'+orange.properties.namedItem('foo').getValues()[i]+'</i>'; }
+ }
+ if( md.items[0].properties.bar[0] != orange.properties.namedItem('bar').getValues()[0] ) { return 'properties.bar[0] <i>'+md.items[0].properties.bar[i]+'</i> instead of <i>'+orange.properties.namedItem('bar').getValues()[0]+'</i>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/003.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/003.html
index 0b9cca7f339..1bd0ced463a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/003.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/003.html
@@ -28,100 +28,100 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[0];
- orange.appendChild( makeEl('meta',{itemprop:'foo',content:'test'}) );
- orange.appendChild( makeEl('audio',{itemprop:'bar',src:'test'},'fail') );
- orange.appendChild( makeEl('embed',{itemprop:'foo',src:'test'}) );
- orange.appendChild( makeEl('iframe',{itemprop:'bar',src:'test'},'fail') );
- orange.appendChild( makeEl('img',{itemprop:'foo',src:'test'}) );
- orange.appendChild( makeEl('source',{itemprop:'bar',src:'test'}) );
- orange.appendChild( makeEl('track',{itemprop:'foo',src:'test'}) );
- orange.appendChild( makeEl('video',{itemprop:'bar',src:'test'},'fail') );
- orange.appendChild( makeEl('a',{itemprop:'foo',href:'test'},'fail') );
- orange.appendChild( makeEl('area',{itemprop:'bar',href:'test'}) );
- orange.appendChild( makeEl('link',{itemprop:'foo',href:'test'}) );
- orange.appendChild( makeEl('object',{itemprop:'bar',data:'test'},'fail') );
- orange.appendChild( makeEl('time',{itemprop:'foo'},'fail') );
- orange.appendChild( makeEl('time',{itemprop:'baz',datetime:'test'},'fail') );
- orange.appendChild( makeEl('div',{itemprop:'baz'},'test') );
- orange.appendChild( makeEl('madeuponthespot',{itemprop:'foo'},'test') );
- orange.appendChild( makeEl('madeuponthespot',{itemprop:'foo',content:'test',src:'test',href:'test',data:'test',datetime:'test',value:'test'},'test') );
- orange.appendChild( makeEl('input',{itemprop:'foo',value:'test'},'test') );
+ orange.appendChild( makeEl('meta',{itemprop:'foo',content:'test'}) );
+ orange.appendChild( makeEl('audio',{itemprop:'bar',src:'test'},'fail') );
+ orange.appendChild( makeEl('embed',{itemprop:'foo',src:'test'}) );
+ orange.appendChild( makeEl('iframe',{itemprop:'bar',src:'test'},'fail') );
+ orange.appendChild( makeEl('img',{itemprop:'foo',src:'test'}) );
+ orange.appendChild( makeEl('source',{itemprop:'bar',src:'test'}) );
+ orange.appendChild( makeEl('track',{itemprop:'foo',src:'test'}) );
+ orange.appendChild( makeEl('video',{itemprop:'bar',src:'test'},'fail') );
+ orange.appendChild( makeEl('a',{itemprop:'foo',href:'test'},'fail') );
+ orange.appendChild( makeEl('area',{itemprop:'bar',href:'test'}) );
+ orange.appendChild( makeEl('link',{itemprop:'foo',href:'test'}) );
+ orange.appendChild( makeEl('object',{itemprop:'bar',data:'test'},'fail') );
+ orange.appendChild( makeEl('time',{itemprop:'foo'},'fail') );
+ orange.appendChild( makeEl('time',{itemprop:'baz',datetime:'test'},'fail') );
+ orange.appendChild( makeEl('div',{itemprop:'baz'},'test') );
+ orange.appendChild( makeEl('madeuponthespot',{itemprop:'foo'},'test') );
+ orange.appendChild( makeEl('madeuponthespot',{itemprop:'foo',content:'test',src:'test',href:'test',data:'test',datetime:'test',value:'test'},'test') );
+ orange.appendChild( makeEl('input',{itemprop:'foo',value:'test'},'test') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- //microdata should be stored and reused after the dragstart event
- //removing the item should not cause the microdata tohave disappeared when the drop event fires
- this.itemScope = false;
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ //microdata should be stored and reused after the dragstart event
+ //removing the item should not cause the microdata tohave disappeared when the drop event fires
+ this.itemScope = false;
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err, md = e.dataTransfer.getData('application/microdata+json');
- orange.itemScope = true;
- if( err = checkprops(md) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err, md = e.dataTransfer.getData('application/microdata+json');
+ orange.itemScope = true;
+ if( err = checkprops(md) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items || md.items.length != 1 ) { return 'no items'; }
- if( !md.items[0].properties ) { return 'no properties'; }
- if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
- if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
- if( !md.items[0].properties.baz ) { return 'no properties.baz'; }
- if( md.items[0].properties.foo.length != 10 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 10'; }
- if( md.items[0].properties.bar.length != 6 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 6'; }
- if( md.items[0].properties.baz.length != 2 ) { return 'properties.baz length '+md.items[0].properties.baz.length+' instead of 2'; }
- for( i = 0; i < 10; i++ ) {
- if( md.items[0].properties.foo[i] != orange.properties.namedItem('foo').getValues()[i] ) { return 'properties.foo['+i+'] <i>'+md.items[0].properties.foo[i]+'</i> instead of <i>'+orange.properties.namedItem('foo').getValues()[i]+'</i>'; }
- }
- for( i = 0; i < 6; i++ ) {
- if( md.items[0].properties.bar[i] != orange.properties.namedItem('bar').getValues()[i] ) { return 'properties.bar['+i+'] <i>'+md.items[0].properties.bar[i]+'</i> instead of <i>'+orange.properties.namedItem('bar').getValues()[i]+'</i>'; }
- }
- for( i = 0; i < 2; i++ ) {
- if( md.items[0].properties.baz[i] != orange.properties.namedItem('baz').getValues()[i] ) { return 'properties.baz['+i+'] <i>'+md.items[0].properties.baz[i]+'</i> instead of <i>'+orange.properties.namedItem('baz').getValues()[i]+'</i>'; }
- }
- return '';
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items || md.items.length != 1 ) { return 'no items'; }
+ if( !md.items[0].properties ) { return 'no properties'; }
+ if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
+ if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
+ if( !md.items[0].properties.baz ) { return 'no properties.baz'; }
+ if( md.items[0].properties.foo.length != 10 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 10'; }
+ if( md.items[0].properties.bar.length != 6 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 6'; }
+ if( md.items[0].properties.baz.length != 2 ) { return 'properties.baz length '+md.items[0].properties.baz.length+' instead of 2'; }
+ for( i = 0; i < 10; i++ ) {
+ if( md.items[0].properties.foo[i] != orange.properties.namedItem('foo').getValues()[i] ) { return 'properties.foo['+i+'] <i>'+md.items[0].properties.foo[i]+'</i> instead of <i>'+orange.properties.namedItem('foo').getValues()[i]+'</i>'; }
+ }
+ for( i = 0; i < 6; i++ ) {
+ if( md.items[0].properties.bar[i] != orange.properties.namedItem('bar').getValues()[i] ) { return 'properties.bar['+i+'] <i>'+md.items[0].properties.bar[i]+'</i> instead of <i>'+orange.properties.namedItem('bar').getValues()[i]+'</i>'; }
+ }
+ for( i = 0; i < 2; i++ ) {
+ if( md.items[0].properties.baz[i] != orange.properties.namedItem('baz').getValues()[i] ) { return 'properties.baz['+i+'] <i>'+md.items[0].properties.baz[i]+'</i> instead of <i>'+orange.properties.namedItem('baz').getValues()[i]+'</i>'; }
+ }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/004.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/004.html
index 33553326403..7ed821e54f5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/004.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/004.html
@@ -28,84 +28,84 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[0];
- orange.appendChild( makeEl('div',{itemprop:'foo',itemscope:'itemscope'},'') );
- orange.appendChild( makeEl('div',{itemprop:'foo',itemscope:'itemscope'},'') );
- orange.lastChild.appendChild( makeEl('div',{itemprop:'bar'},'test') );
- orange.appendChild( makeEl('div',{itemprop:'bar',itemscope:'itemscope'},'') );
+ orange.appendChild( makeEl('div',{itemprop:'foo',itemscope:'itemscope'},'') );
+ orange.appendChild( makeEl('div',{itemprop:'foo',itemscope:'itemscope'},'') );
+ orange.lastChild.appendChild( makeEl('div',{itemprop:'bar'},'test') );
+ orange.appendChild( makeEl('div',{itemprop:'bar',itemscope:'itemscope'},'') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
- if( !md.items[0].properties ) { return 'no properties'; }
- if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
- if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
- if( md.items[0].properties.foo.length != 2 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 2'; }
- if( md.items[0].properties.bar.length != 1 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 1'; }
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
+ if( !md.items[0].properties ) { return 'no properties'; }
+ if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
+ if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
+ if( md.items[0].properties.foo.length != 2 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 2'; }
+ if( md.items[0].properties.bar.length != 1 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 1'; }
- if( !md.items[0].properties.foo[0] ) { return 'properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>{properties:{}}</i>'; }
- if( !md.items[0].properties.foo[0].properties ) { return 'properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of <i>{}</i>'; }
+ if( !md.items[0].properties.foo[0] ) { return 'properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>{properties:{}}</i>'; }
+ if( !md.items[0].properties.foo[0].properties ) { return 'properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of <i>{}</i>'; }
- if( !md.items[0].properties.foo[1] ) { return 'properties.foo[1] <i>'+md.items[0].properties.foo[1]+'</i> instead of <i>{properties:{bar:[test]}}</i>'; }
- if( !md.items[0].properties.foo[1].properties ) { return 'properties.foo[1].properties <i>'+md.items[0].properties.foo[1].properties+'</i> instead of <i>{bar:[test]}</i>'; }
- if( !md.items[0].properties.foo[1].properties.bar ) { return 'properties.foo[1].properties.bar <i>'+md.items[0].properties.foo[1].properties.bar+'</i> instead of <i>[test]</i>'; }
- if( !md.items[0].properties.foo[1].properties.bar.length ) { return 'properties.foo[1].properties.bar.length <i>'+md.items[0].properties.foo[1].properties.bar.length+'</i> instead of 1'; }
- if( md.items[0].properties.foo[1].properties.bar[0] != 'test') { return 'properties.foo[1].properties.bar[0] <i>'+md.items[0].properties.foo[1].properties.bar[0]+'</i> instead of <i>test</i>'; }
+ if( !md.items[0].properties.foo[1] ) { return 'properties.foo[1] <i>'+md.items[0].properties.foo[1]+'</i> instead of <i>{properties:{bar:[test]}}</i>'; }
+ if( !md.items[0].properties.foo[1].properties ) { return 'properties.foo[1].properties <i>'+md.items[0].properties.foo[1].properties+'</i> instead of <i>{bar:[test]}</i>'; }
+ if( !md.items[0].properties.foo[1].properties.bar ) { return 'properties.foo[1].properties.bar <i>'+md.items[0].properties.foo[1].properties.bar+'</i> instead of <i>[test]</i>'; }
+ if( !md.items[0].properties.foo[1].properties.bar.length ) { return 'properties.foo[1].properties.bar.length <i>'+md.items[0].properties.foo[1].properties.bar.length+'</i> instead of 1'; }
+ if( md.items[0].properties.foo[1].properties.bar[0] != 'test') { return 'properties.foo[1].properties.bar[0] <i>'+md.items[0].properties.foo[1].properties.bar[0]+'</i> instead of <i>test</i>'; }
- if( !md.items[0].properties.bar[0] ) { return 'properties.bar[0] <i>'+md.items[0].properties.bar[0]+'</i> instead of <i>{properties:{}}</i>'; }
- if( !md.items[0].properties.bar[0].properties ) { return 'properties.bar[0].properties <i>'+md.items[0].properties.bar[0].properties+'</i> instead of <i>{}</i>'; }
- return '';
+ if( !md.items[0].properties.bar[0] ) { return 'properties.bar[0] <i>'+md.items[0].properties.bar[0]+'</i> instead of <i>{properties:{}}</i>'; }
+ if( !md.items[0].properties.bar[0].properties ) { return 'properties.bar[0].properties <i>'+md.items[0].properties.bar[0].properties+'</i> instead of <i>{}</i>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/005.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/005.html
index 3a10d90a12e..ae83f6d5f52 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/005.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/005.html
@@ -28,83 +28,83 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[0];
- orange.appendChild( makeEl('div',{itemprop:'foo',itemscope:'itemscope'},'') );
- orange.appendChild( makeEl('div',{itemscope:'itemscope'},'') );
- orange.lastChild.appendChild( makeEl('div',{itemprop:'bar'},'test') );
- orange.appendChild( makeEl('div',{itemprop:'bar',itemscope:'itemscope'},'') );
+ orange.appendChild( makeEl('div',{itemprop:'foo',itemscope:'itemscope'},'') );
+ orange.appendChild( makeEl('div',{itemscope:'itemscope'},'') );
+ orange.lastChild.appendChild( makeEl('div',{itemprop:'bar'},'test') );
+ orange.appendChild( makeEl('div',{itemprop:'bar',itemscope:'itemscope'},'') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- // http://dev.w3.org/html5/md/#drag-and-drop
- //"The user agent must take the list of dragged nodes and extract the microdata from those nodes into a JSON form"
- // http://dev.w3.org/html5/spec/dnd.html#drag-and-drop-processing-model
- //"the list of dragged nodes contains only the source node, if any."
- //nested items should only be in the items list if they are in a dragged *selection*
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
- if( !md.items[0].properties ) { return 'no properties'; }
- if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
- if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
- if( md.items[0].properties.foo.length != 1 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
- if( md.items[0].properties.bar.length != 1 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 1'; }
+ // http://dev.w3.org/html5/md/#drag-and-drop
+ //"The user agent must take the list of dragged nodes and extract the microdata from those nodes into a JSON form"
+ // http://dev.w3.org/html5/spec/dnd.html#drag-and-drop-processing-model
+ //"the list of dragged nodes contains only the source node, if any."
+ //nested items should only be in the items list if they are in a dragged *selection*
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
+ if( !md.items[0].properties ) { return 'no properties'; }
+ if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
+ if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
+ if( md.items[0].properties.foo.length != 1 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
+ if( md.items[0].properties.bar.length != 1 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 1'; }
- if( !md.items[0].properties.foo[0] ) { return 'properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>{properties:{}}</i>'; }
- if( !md.items[0].properties.foo[0].properties ) { return 'properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of <i>{}</i>'; }
+ if( !md.items[0].properties.foo[0] ) { return 'properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>{properties:{}}</i>'; }
+ if( !md.items[0].properties.foo[0].properties ) { return 'properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of <i>{}</i>'; }
- if( !md.items[0].properties.bar[0] ) { return 'properties.bar[0] <i>'+md.items[0].properties.bar[0]+'</i> instead of <i>{properties:{}}</i>'; }
- if( !md.items[0].properties.bar[0].properties ) { return 'properties.bar[0].properties <i>'+md.items[0].properties.bar[0].properties+'</i> instead of <i>{}</i>'; }
- return '';
+ if( !md.items[0].properties.bar[0] ) { return 'properties.bar[0] <i>'+md.items[0].properties.bar[0]+'</i> instead of <i>{properties:{}}</i>'; }
+ if( !md.items[0].properties.bar[0].properties ) { return 'properties.bar[0].properties <i>'+md.items[0].properties.bar[0].properties+'</i> instead of <i>{}</i>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/006.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/006.html
index ce45f47ed37..b9e2ba229e4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/006.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/006.html
@@ -28,73 +28,73 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[0];
- orange.appendChild( makeEl('div',{itemprop:'foo',itemscope:'itemscope',itemtype:'http://example.com/',id:'id2',itemid:'http://example.com/bar'},'') );
+ orange.appendChild( makeEl('div',{itemprop:'foo',itemscope:'itemscope',itemtype:'http://example.com/',id:'id2',itemid:'http://example.com/bar'},'') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
- if( md.items[0].type != orange.getAttribute('itemtype') ) { return 'items[0].type <i>'+md.items[0].type+'</i> instead of <i>'+orange.getAttribute('itemtype')+'</i>'; }
- if( md.items[0].id != orange.getAttribute('itemid') ) { return 'items[0].id <i>'+md.items[0].id+'</i> instead of <i>'+orange.getAttribute('itemid')+'</i>'; }
- if( !md.items[0].properties ) { return 'no properties'; }
- if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
- if( md.items[0].properties.foo.length != 1 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
- if( !md.items[0].properties.foo[0] ) { return 'properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>{...}</i>'; }
- if( md.items[0].properties.foo[0].type != orange.firstChild.getAttribute('itemtype') ) { return 'items[0].properties.foo[0].type <i>'+md.items[0].properties.foo[0].type+'</i> instead of <i>'+orange.firstChild.getAttribute('itemtype')+'</i>'; }
- if( md.items[0].properties.foo[0].id != orange.firstChild.getAttribute('itemid') ) { return 'items[0].properties.foo[0].id <i>'+md.items[0].properties.foo[0].id+'</i> instead of <i>'+orange.firstChild.getAttribute('itemid')+'</i>'; }
- if( !md.items[0].properties.foo[0].properties ) { return 'properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of <i>{}</i>'; }
- return '';
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
+ if( md.items[0].type != orange.getAttribute('itemtype') ) { return 'items[0].type <i>'+md.items[0].type+'</i> instead of <i>'+orange.getAttribute('itemtype')+'</i>'; }
+ if( md.items[0].id != orange.getAttribute('itemid') ) { return 'items[0].id <i>'+md.items[0].id+'</i> instead of <i>'+orange.getAttribute('itemid')+'</i>'; }
+ if( !md.items[0].properties ) { return 'no properties'; }
+ if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
+ if( md.items[0].properties.foo.length != 1 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
+ if( !md.items[0].properties.foo[0] ) { return 'properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>{...}</i>'; }
+ if( md.items[0].properties.foo[0].type != orange.firstChild.getAttribute('itemtype') ) { return 'items[0].properties.foo[0].type <i>'+md.items[0].properties.foo[0].type+'</i> instead of <i>'+orange.firstChild.getAttribute('itemtype')+'</i>'; }
+ if( md.items[0].properties.foo[0].id != orange.firstChild.getAttribute('itemid') ) { return 'items[0].properties.foo[0].id <i>'+md.items[0].properties.foo[0].id+'</i> instead of <i>'+orange.firstChild.getAttribute('itemid')+'</i>'; }
+ if( !md.items[0].properties.foo[0].properties ) { return 'properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of <i>{}</i>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/007.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/007.html
index e890d803546..e6eb87d82a2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/007.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/007.html
@@ -28,84 +28,84 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[0];
- orange.appendChild( makeEl('div',{itemprop:'foo bar',itemscope:'itemscope'},'') );
- orange.lastChild.appendChild( makeEl('div',{itemprop:'baz'},'test') );
+ orange.appendChild( makeEl('div',{itemprop:'foo bar',itemscope:'itemscope'},'') );
+ orange.lastChild.appendChild( makeEl('div',{itemprop:'baz'},'test') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
- if( !md.items[0].properties ) { return 'no properties'; }
- if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
- if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
- if( md.items[0].properties.baz ) { return 'properties.baz should not exist'; }
- if( md.items[0].properties.foo.length != 1 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
- if( md.items[0].properties.bar.length != 1 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 1'; }
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
+ if( !md.items[0].properties ) { return 'no properties'; }
+ if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
+ if( !md.items[0].properties.bar ) { return 'no properties.bar'; }
+ if( md.items[0].properties.baz ) { return 'properties.baz should not exist'; }
+ if( md.items[0].properties.foo.length != 1 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
+ if( md.items[0].properties.bar.length != 1 ) { return 'properties.bar length '+md.items[0].properties.bar.length+' instead of 1'; }
- if( !md.items[0].properties.foo[0] ) { return 'properties.foo[1] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>{properties:{baz:[test]}}</i>'; }
- if( !md.items[0].properties.foo[0].properties ) { return 'properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of <i>{baz:[test]}</i>'; }
- if( !md.items[0].properties.foo[0].properties.baz ) { return 'properties.foo[0].properties.baz <i>'+md.items[0].properties.foo[0].properties.baz+'</i> instead of <i>[test]</i>'; }
- if( !md.items[0].properties.foo[0].properties.baz.length ) { return 'properties.foo[0].properties.baz.length <i>'+md.items[0].properties.foo[0].properties.baz.length+'</i> instead of 1'; }
- if( md.items[0].properties.foo[0].properties.baz[0] != 'test') { return 'properties.foo[0].properties.baz[0] <i>'+md.items[0].properties.foo[0].properties.baz[0]+'</i> instead of <i>test</i>'; }
+ if( !md.items[0].properties.foo[0] ) { return 'properties.foo[1] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>{properties:{baz:[test]}}</i>'; }
+ if( !md.items[0].properties.foo[0].properties ) { return 'properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of <i>{baz:[test]}</i>'; }
+ if( !md.items[0].properties.foo[0].properties.baz ) { return 'properties.foo[0].properties.baz <i>'+md.items[0].properties.foo[0].properties.baz+'</i> instead of <i>[test]</i>'; }
+ if( !md.items[0].properties.foo[0].properties.baz.length ) { return 'properties.foo[0].properties.baz.length <i>'+md.items[0].properties.foo[0].properties.baz.length+'</i> instead of 1'; }
+ if( md.items[0].properties.foo[0].properties.baz[0] != 'test') { return 'properties.foo[0].properties.baz[0] <i>'+md.items[0].properties.foo[0].properties.baz[0]+'</i> instead of <i>test</i>'; }
- if( !md.items[0].properties.bar[0] ) { return 'properties.bar[1] <i>'+md.items[0].properties.bar[0]+'</i> instead of <i>{properties:{baz:[test]}}</i>'; }
- if( !md.items[0].properties.bar[0].properties ) { return 'properties.bar[0].properties <i>'+md.items[0].properties.bar[0].properties+'</i> instead of <i>{baz:[test]}</i>'; }
- if( !md.items[0].properties.bar[0].properties.baz ) { return 'properties.bar[0].properties.baz <i>'+md.items[0].properties.bar[0].properties.baz+'</i> instead of <i>[test]</i>'; }
- if( !md.items[0].properties.bar[0].properties.baz.length ) { return 'properties.bar[0].properties.baz.length <i>'+md.items[0].properties.bar[0].properties.baz.length+'</i> instead of 1'; }
- if( md.items[0].properties.bar[0].properties.baz[0] != 'test') { return 'properties.bar[0].properties.baz[0] <i>'+md.items[0].properties.bar[0].properties.baz[0]+'</i> instead of <i>test</i>'; }
+ if( !md.items[0].properties.bar[0] ) { return 'properties.bar[1] <i>'+md.items[0].properties.bar[0]+'</i> instead of <i>{properties:{baz:[test]}}</i>'; }
+ if( !md.items[0].properties.bar[0].properties ) { return 'properties.bar[0].properties <i>'+md.items[0].properties.bar[0].properties+'</i> instead of <i>{baz:[test]}</i>'; }
+ if( !md.items[0].properties.bar[0].properties.baz ) { return 'properties.bar[0].properties.baz <i>'+md.items[0].properties.bar[0].properties.baz+'</i> instead of <i>[test]</i>'; }
+ if( !md.items[0].properties.bar[0].properties.baz.length ) { return 'properties.bar[0].properties.baz.length <i>'+md.items[0].properties.bar[0].properties.baz.length+'</i> instead of 1'; }
+ if( md.items[0].properties.bar[0].properties.baz[0] != 'test') { return 'properties.bar[0].properties.baz[0] <i>'+md.items[0].properties.bar[0].properties.baz[0]+'</i> instead of <i>test</i>'; }
- return '';
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/008.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/008.html
index 00ca61e05d1..d4cd7978174 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/008.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/008.html
@@ -28,61 +28,61 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[2];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.previousSibling.ondragenter = orange.previousSibling.ondragleave = orange.previousSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.previousSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.previousSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items collection'; }
- if( md.items.length != 0 ) { return 'unexpected items found'; }
- return '';
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items collection'; }
+ if( md.items.length != 0 ) { return 'unexpected items found'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/009.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/009.html
index 7ac0a6576e5..637cabe017a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/009.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/009.html
@@ -28,65 +28,65 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[2];
- orange.childNodes[1].appendChild( makeEl('span',{itemprop:'foo'},'test') );
+ orange.childNodes[1].appendChild( makeEl('span',{itemprop:'foo'},'test') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.previousSibling.ondragenter = orange.previousSibling.ondragleave = orange.previousSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.previousSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.previousSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items || md.items.length != 1 ) { return 'no items'; }
- if( !md.items[0].properties ) { return 'no properties'; }
- if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
- if( md.items[0].properties.foo.length != 1 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
- if( md.items[0].properties.foo[0] != orange.childNodes[1].properties.namedItem('foo').getValues()[0] ) { return 'properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>'+orange.childNodes[1].properties.namedItem('foo').getValues()[0]+'</i>'; }
- return '';
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items || md.items.length != 1 ) { return 'no items'; }
+ if( !md.items[0].properties ) { return 'no properties'; }
+ if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
+ if( md.items[0].properties.foo.length != 1 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
+ if( md.items[0].properties.foo[0] != orange.childNodes[1].properties.namedItem('foo').getValues()[0] ) { return 'properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>'+orange.childNodes[1].properties.namedItem('foo').getValues()[0]+'</i>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/010.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/010.html
index bada1b706a5..53a6321a3e5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/010.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/010.html
@@ -28,71 +28,71 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[2];
- orange.childNodes[1].appendChild( makeEl('span',{itemprop:'foo'},'test') );
- orange.childNodes[3].appendChild( makeEl('span',{itemprop:'bar'},'test') );
+ orange.childNodes[1].appendChild( makeEl('span',{itemprop:'foo'},'test') );
+ orange.childNodes[3].appendChild( makeEl('span',{itemprop:'bar'},'test') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.previousSibling.ondragenter = orange.previousSibling.ondragleave = orange.previousSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.previousSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.previousSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 2 ) { return md.items.length+' items instead of 2'; }
- if( !md.items[0].properties ) { return 'no items[0].properties'; }
- if( !md.items[0].properties.foo ) { return 'no items[0].properties.foo'; }
- if( md.items[0].properties.foo.length != 1 ) { return 'items[0].properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
- if( md.items[0].properties.foo[0] != orange.childNodes[1].properties.namedItem('foo').getValues()[0] ) { return 'items[0].properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>'+orange.childNodes[1].properties.namedItem('foo').getValues()[0]+'</i>'; }
- if( !md.items[1].properties ) { return 'no items[1].properties'; }
- if( !md.items[1].properties.bar ) { return 'no items[1].properties.bar'; }
- if( md.items[1].properties.bar.length != 1 ) { return 'items[1].properties.bar length '+md.items[1].properties.bar.length+' instead of 1'; }
- if( md.items[1].properties.bar[0] != orange.childNodes[1].properties.namedItem('foo').getValues()[0] ) { return 'items[1].properties.bar[0] <i>'+md.items[1].properties.bar[0]+'</i> instead of <i>'+orange.childNodes[1].properties.namedItem('foo').getValues()[0]+'</i>'; }
- return '';
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 2 ) { return md.items.length+' items instead of 2'; }
+ if( !md.items[0].properties ) { return 'no items[0].properties'; }
+ if( !md.items[0].properties.foo ) { return 'no items[0].properties.foo'; }
+ if( md.items[0].properties.foo.length != 1 ) { return 'items[0].properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
+ if( md.items[0].properties.foo[0] != orange.childNodes[1].properties.namedItem('foo').getValues()[0] ) { return 'items[0].properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>'+orange.childNodes[1].properties.namedItem('foo').getValues()[0]+'</i>'; }
+ if( !md.items[1].properties ) { return 'no items[1].properties'; }
+ if( !md.items[1].properties.bar ) { return 'no items[1].properties.bar'; }
+ if( md.items[1].properties.bar.length != 1 ) { return 'items[1].properties.bar length '+md.items[1].properties.bar.length+' instead of 1'; }
+ if( md.items[1].properties.bar[0] != orange.childNodes[1].properties.namedItem('foo').getValues()[0] ) { return 'items[1].properties.bar[0] <i>'+md.items[1].properties.bar[0]+'</i> instead of <i>'+orange.childNodes[1].properties.namedItem('foo').getValues()[0]+'</i>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/011.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/011.html
index 04b49992b61..819e5ceab0f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/011.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/011.html
@@ -28,74 +28,74 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[2];
- orange.childNodes[1].appendChild( makeEl('span',{itemprop:'foo'},'test') );
- orange.childNodes[3].appendChild( makeEl('span',{itemprop:'bar'},'test') );
+ orange.childNodes[1].appendChild( makeEl('span',{itemprop:'foo'},'test') );
+ orange.childNodes[3].appendChild( makeEl('span',{itemprop:'bar'},'test') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.previousSibling.ondragenter = orange.previousSibling.ondragleave = orange.previousSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.previousSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.previousSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- // http://dev.w3.org/html5/spec/dnd.html#list-of-dragged-nodes
- //"If it is a selection that is being dragged, then the list of dragged nodes contains, in tree order, every node that is partially or completely included in the selection (including all their ancestors)."
- //given this "ancestors" situation, what is to stop every item in the body from being included? oversight perhaps? tests 18-20 cover this more extensively
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 2 ) { return md.items.length+' items instead of 2'; }
- if( !md.items[0].properties ) { return 'no items[0].properties'; }
- if( !md.items[0].properties.foo ) { return 'no items[0].properties.foo'; }
- if( md.items[0].properties.foo.length != 1 ) { return 'items[0].properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
- if( md.items[0].properties.foo[0] != orange.childNodes[1].properties.namedItem('foo').getValues()[0] ) { return 'items[0].properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>'+orange.childNodes[1].properties.namedItem('foo').getValues()[0]+'</i>'; }
- if( !md.items[1].properties ) { return 'no items[1].properties'; }
- if( !md.items[1].properties.bar ) { return 'no items[1].properties.bar'; }
- if( md.items[1].properties.bar.length != 1 ) { return 'items[1].properties.bar length '+md.items[1].properties.bar.length+' instead of 1'; }
- if( md.items[1].properties.bar[0] != orange.childNodes[1].properties.namedItem('foo').getValues()[0] ) { return 'items[1].properties.bar[0] <i>'+md.items[1].properties.bar[0]+'</i> instead of <i>'+orange.childNodes[1].properties.namedItem('foo').getValues()[0]+'</i>'; }
- return '';
+ // http://dev.w3.org/html5/spec/dnd.html#list-of-dragged-nodes
+ //"If it is a selection that is being dragged, then the list of dragged nodes contains, in tree order, every node that is partially or completely included in the selection (including all their ancestors)."
+ //given this "ancestors" situation, what is to stop every item in the body from being included? oversight perhaps? tests 18-20 cover this more extensively
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 2 ) { return md.items.length+' items instead of 2'; }
+ if( !md.items[0].properties ) { return 'no items[0].properties'; }
+ if( !md.items[0].properties.foo ) { return 'no items[0].properties.foo'; }
+ if( md.items[0].properties.foo.length != 1 ) { return 'items[0].properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
+ if( md.items[0].properties.foo[0] != orange.childNodes[1].properties.namedItem('foo').getValues()[0] ) { return 'items[0].properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>'+orange.childNodes[1].properties.namedItem('foo').getValues()[0]+'</i>'; }
+ if( !md.items[1].properties ) { return 'no items[1].properties'; }
+ if( !md.items[1].properties.bar ) { return 'no items[1].properties.bar'; }
+ if( md.items[1].properties.bar.length != 1 ) { return 'items[1].properties.bar length '+md.items[1].properties.bar.length+' instead of 1'; }
+ if( md.items[1].properties.bar[0] != orange.childNodes[1].properties.namedItem('foo').getValues()[0] ) { return 'items[1].properties.bar[0] <i>'+md.items[1].properties.bar[0]+'</i> instead of <i>'+orange.childNodes[1].properties.namedItem('foo').getValues()[0]+'</i>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/012.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/012.html
index c09453faa42..307d610e90f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/012.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/012.html
@@ -28,71 +28,71 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[2];
- orange.childNodes[1].appendChild( makeEl('span',{itemscope:'itemscope',itemprop:'foo'},'test') );
- orange.childNodes[1].lastChild.appendChild( makeEl('span',{itemprop:'bar'},'test') );
+ orange.childNodes[1].appendChild( makeEl('span',{itemscope:'itemscope',itemprop:'foo'},'test') );
+ orange.childNodes[1].lastChild.appendChild( makeEl('span',{itemprop:'bar'},'test') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.previousSibling.ondragenter = orange.previousSibling.ondragleave = orange.previousSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.previousSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.previousSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- //items should be represented at the top level only if they do not have the itemprop attribute
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
- if( !md.items[0].properties ) { return 'no items[0].properties'; }
- if( !md.items[0].properties.foo ) { return 'no items[0].properties.foo'; }
- if( md.items[0].properties.foo.length != 1 ) { return 'items[0].properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
- if( !md.items[0].properties.foo[0].properties ) { return 'items[1].properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of <i>{bar:[test]}</i>'; }
- if( !md.items[0].properties.foo[0].properties.bar ) { return 'items[1].properties.foo[0].properties.bar <i>'+md.items[0].properties.foo[0].properties.bar+'</i> instead of <i>[test]</i>'; }
- if( md.items[0].properties.foo[0].properties.bar.length != 1 ) { return 'items[1].properties.foo[0].properties.bar.length <i>'+md.items[0].properties.foo[0].properties.bar.length+'</i> instead of 1'; }
- if( md.items[0].properties.foo[0].properties.bar[0] != 'test') { return 'items[1].properties.foo[0].properties.bar[0] <i>'+md.items[0].properties.foo[0].properties.bar[0]+'</i> instead of <i>test</i>'; }
- return '';
+ //items should be represented at the top level only if they do not have the itemprop attribute
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
+ if( !md.items[0].properties ) { return 'no items[0].properties'; }
+ if( !md.items[0].properties.foo ) { return 'no items[0].properties.foo'; }
+ if( md.items[0].properties.foo.length != 1 ) { return 'items[0].properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
+ if( !md.items[0].properties.foo[0].properties ) { return 'items[1].properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of <i>{bar:[test]}</i>'; }
+ if( !md.items[0].properties.foo[0].properties.bar ) { return 'items[1].properties.foo[0].properties.bar <i>'+md.items[0].properties.foo[0].properties.bar+'</i> instead of <i>[test]</i>'; }
+ if( md.items[0].properties.foo[0].properties.bar.length != 1 ) { return 'items[1].properties.foo[0].properties.bar.length <i>'+md.items[0].properties.foo[0].properties.bar.length+'</i> instead of 1'; }
+ if( md.items[0].properties.foo[0].properties.bar[0] != 'test') { return 'items[1].properties.foo[0].properties.bar[0] <i>'+md.items[0].properties.foo[0].properties.bar[0]+'</i> instead of <i>test</i>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/013.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/013.html
index 67f3b31f225..000a9d7f05d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/013.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/013.html
@@ -28,71 +28,71 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[2];
- orange.childNodes[1].appendChild( makeEl('span',{itemscope:'itemscope'},'test') );
- orange.childNodes[1].lastChild.appendChild( makeEl('span',{itemprop:'bar'},'test') );
+ orange.childNodes[1].appendChild( makeEl('span',{itemscope:'itemscope'},'test') );
+ orange.childNodes[1].lastChild.appendChild( makeEl('span',{itemprop:'bar'},'test') );
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.previousSibling.ondragenter = orange.previousSibling.ondragleave = orange.previousSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.previousSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.previousSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- //*all* items should be represented at the top level, even if they are nested
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 2 ) { return md.items.length+' items instead of 2'; }
- if( !md.items[0].properties ) { return 'no items[0].properties'; }
- if( md.items[0].properties.bar ) { return 'unexpected items[0].properties.bar'; }
+ //*all* items should be represented at the top level, even if they are nested
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 2 ) { return md.items.length+' items instead of 2'; }
+ if( !md.items[0].properties ) { return 'no items[0].properties'; }
+ if( md.items[0].properties.bar ) { return 'unexpected items[0].properties.bar'; }
- if( !md.items[1].properties ) { return 'no items[1].properties'; }
- if( !md.items[1].properties.bar ) { return 'no items[1].properties.bar'; }
- if( md.items[1].properties.bar.length != 1 ) { return 'items[1].properties.bar length '+md.items[1].properties.bar.length+' instead of 1'; }
- if( md.items[1].properties.bar[0] != 'test' ) { return 'items[1].properties.bar[0] <i>'+md.items[1].properties.bar[0]+'</i> instead of <i>test</i>'; }
- return '';
+ if( !md.items[1].properties ) { return 'no items[1].properties'; }
+ if( !md.items[1].properties.bar ) { return 'no items[1].properties.bar'; }
+ if( md.items[1].properties.bar.length != 1 ) { return 'items[1].properties.bar length '+md.items[1].properties.bar.length+' instead of 1'; }
+ if( md.items[1].properties.bar[0] != 'test' ) { return 'items[1].properties.bar[0] <i>'+md.items[1].properties.bar[0]+'</i> instead of <i>test</i>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/014.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/014.html
index bd0b84c2fd7..785c059a31e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/014.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/014.html
@@ -28,16 +28,16 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
@@ -45,48 +45,48 @@ window.onload = function() {
orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- // http://dev.w3.org/html5/md/#extracting-json
- //"check if the element is a top-level microdata item, and if it is"
- //as it has itemprop, it is not a top-level item, and should be ignored
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 0 ) { return md.items.length+' items instead of 0'; }
- return '';
+ // http://dev.w3.org/html5/md/#extracting-json
+ //"check if the element is a top-level microdata item, and if it is"
+ //as it has itemprop, it is not a top-level item, and should be ignored
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 0 ) { return md.items.length+' items instead of 0'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/015.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/015.html
index 597a9e405ef..36f26432930 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/015.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/015.html
@@ -28,16 +28,16 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
@@ -45,48 +45,48 @@ window.onload = function() {
orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- // http://dev.w3.org/html5/md/#extracting-json
- //"check if the element is a top-level microdata item, and if it is"
- //as it has itemprop, it is not a top-level item, and should be ignored
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 0 ) { return md.items.length+' items instead of 0'; }
- return '';
+ // http://dev.w3.org/html5/md/#extracting-json
+ //"check if the element is a top-level microdata item, and if it is"
+ //as it has itemprop, it is not a top-level item, and should be ignored
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 0 ) { return md.items.length+' items instead of 0'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/016.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/016.html
index 4d37d65a2b7..153098bf89f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/016.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/016.html
@@ -28,16 +28,16 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
@@ -45,111 +45,111 @@ window.onload = function() {
orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- // http://dev.w3.org/html5/md/#extracting-json
- //"If value is an item, then: If value is in memory, then let value be the string "ERROR"."
- /*
+ // http://dev.w3.org/html5/md/#extracting-json
+ //"If value is an item, then: If value is in memory, then let value be the string "ERROR"."
+ /*
Loop detection happens only after the loop has been created, at which point it returns a property value
of "ERROR" instead of the value which has already been encountered on the stringifying stack.
Should create the following construct:
{
- items:[
- {
- properties:{
- foo:[
- {
- properties:{
- bar:[
- {
- properties:{
- foo:[
- "ERROR"
- ]
- }
- }
- ]
- }
- }
- ],
- bar:[
- {
- properties:{
- foo:[
- {
- properties:{
- bar:[
- "ERROR"
- ]
- }
- }
- ]
- }
- }
- ]
- }
- }
- ]
+ items:[
+ {
+ properties:{
+ foo:[
+ {
+ properties:{
+ bar:[
+ {
+ properties:{
+ foo:[
+ "ERROR"
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ],
+ bar:[
+ {
+ properties:{
+ foo:[
+ {
+ properties:{
+ bar:[
+ "ERROR"
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
}
- */
+ */
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
- if( !md.items[0].properties ) { return 'no items[0].properties'; }
- if( !md.items[0].properties.foo ) { return 'no items[0].properties.foo'; }
- if( md.items[0].properties.foo.length != 1 ) { return 'items[0].properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
- if( !md.items[0].properties.foo[0].properties ) { return 'items[1].properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of object'; }
- if( !md.items[0].properties.foo[0].properties.bar ) { return 'items[1].properties.foo[0].properties.bar <i>'+md.items[0].properties.foo[0].properties.bar+'</i> instead of array'; }
- if( md.items[0].properties.foo[0].properties.bar.length != 1 ) { return 'items[1].properties.foo[0].properties.bar.length <i>'+md.items[0].properties.foo[0].properties.bar.length+'</i> instead of 1'; }
- if( !md.items[0].properties.foo[0].properties.bar[0].properties ) { return 'items[1].properties.foo[0].properties.bar[0].properties <i>'+md.properties.foo[0].properties.bar[0].properties+'</i> instead of object'; }
- if( !md.items[0].properties.foo[0].properties.bar[0].properties.foo ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo+'</i> instead of array'; }
- if( md.items[0].properties.foo[0].properties.bar[0].properties.foo.length != 1 ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo.length <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo.length+'</i> instead of 1'; }
- if( md.items[0].properties.foo[0].properties.bar[0].properties.foo[0] != 'ERROR' ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo.length <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo[0]+'</i> instead of <i>ERROR</a>'; }
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
+ if( !md.items[0].properties ) { return 'no items[0].properties'; }
+ if( !md.items[0].properties.foo ) { return 'no items[0].properties.foo'; }
+ if( md.items[0].properties.foo.length != 1 ) { return 'items[0].properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
+ if( !md.items[0].properties.foo[0].properties ) { return 'items[1].properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of object'; }
+ if( !md.items[0].properties.foo[0].properties.bar ) { return 'items[1].properties.foo[0].properties.bar <i>'+md.items[0].properties.foo[0].properties.bar+'</i> instead of array'; }
+ if( md.items[0].properties.foo[0].properties.bar.length != 1 ) { return 'items[1].properties.foo[0].properties.bar.length <i>'+md.items[0].properties.foo[0].properties.bar.length+'</i> instead of 1'; }
+ if( !md.items[0].properties.foo[0].properties.bar[0].properties ) { return 'items[1].properties.foo[0].properties.bar[0].properties <i>'+md.properties.foo[0].properties.bar[0].properties+'</i> instead of object'; }
+ if( !md.items[0].properties.foo[0].properties.bar[0].properties.foo ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo+'</i> instead of array'; }
+ if( md.items[0].properties.foo[0].properties.bar[0].properties.foo.length != 1 ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo.length <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo.length+'</i> instead of 1'; }
+ if( md.items[0].properties.foo[0].properties.bar[0].properties.foo[0] != 'ERROR' ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo.length <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo[0]+'</i> instead of <i>ERROR</a>'; }
- if( !md.items[0].properties.bar ) { return 'no items[0].properties.bar'; }
- if( md.items[0].properties.bar.length != 1 ) { return 'items[0].properties.bar length '+md.items[0].properties.bar.length+' instead of 1'; }
- if( !md.items[0].properties.bar[0].properties ) { return 'items[1].properties.bar[0].properties <i>'+md.items[0].properties.bar[0].properties+'</i> instead of object'; }
- if( !md.items[0].properties.bar[0].properties.foo ) { return 'items[1].properties.bar[0].properties.foo <i>'+md.items[0].properties.bar[0].properties.foo+'</i> instead of array'; }
- if( md.items[0].properties.bar[0].properties.foo.length != 1 ) { return 'items[1].properties.bar[0].properties.foo.length <i>'+md.items[0].properties.bar[0].properties.foo.length+'</i> instead of 1'; }
- if( !md.items[0].properties.bar[0].properties.foo[0].properties ) { return 'items[1].properties.bar[0].properties.foo[0].properties <i>'+md.properties.bar[0].properties.foo[0].properties+'</i> instead of object'; }
- if( !md.items[0].properties.bar[0].properties.foo[0].properties.bar ) { return 'items[1].properties.bar[0].properties.foo[0].properties.bar <i>'+md.items[0].properties.bar[0].properties.foo[0].properties.bar+'</i> instead of array'; }
- if( md.items[0].properties.bar[0].properties.foo[0].properties.bar.length != 1 ) { return 'items[1].properties.bar[0].properties.foo[0].properties.bar.length <i>'+md.items[0].properties.bar[0].properties.foo[0].properties.bar.length+'</i> instead of 1'; }
- if( md.items[0].properties.bar[0].properties.foo[0].properties.bar[0] != 'ERROR' ) { return 'items[1].properties.bar[0].properties.foo[0].properties.bar.length <i>'+md.items[0].properties.bar[0].properties.foo[0].properties.bar[0]+'</i> instead of <i>ERROR</a>'; }
- return '';
+ if( !md.items[0].properties.bar ) { return 'no items[0].properties.bar'; }
+ if( md.items[0].properties.bar.length != 1 ) { return 'items[0].properties.bar length '+md.items[0].properties.bar.length+' instead of 1'; }
+ if( !md.items[0].properties.bar[0].properties ) { return 'items[1].properties.bar[0].properties <i>'+md.items[0].properties.bar[0].properties+'</i> instead of object'; }
+ if( !md.items[0].properties.bar[0].properties.foo ) { return 'items[1].properties.bar[0].properties.foo <i>'+md.items[0].properties.bar[0].properties.foo+'</i> instead of array'; }
+ if( md.items[0].properties.bar[0].properties.foo.length != 1 ) { return 'items[1].properties.bar[0].properties.foo.length <i>'+md.items[0].properties.bar[0].properties.foo.length+'</i> instead of 1'; }
+ if( !md.items[0].properties.bar[0].properties.foo[0].properties ) { return 'items[1].properties.bar[0].properties.foo[0].properties <i>'+md.properties.bar[0].properties.foo[0].properties+'</i> instead of object'; }
+ if( !md.items[0].properties.bar[0].properties.foo[0].properties.bar ) { return 'items[1].properties.bar[0].properties.foo[0].properties.bar <i>'+md.items[0].properties.bar[0].properties.foo[0].properties.bar+'</i> instead of array'; }
+ if( md.items[0].properties.bar[0].properties.foo[0].properties.bar.length != 1 ) { return 'items[1].properties.bar[0].properties.foo[0].properties.bar.length <i>'+md.items[0].properties.bar[0].properties.foo[0].properties.bar.length+'</i> instead of 1'; }
+ if( md.items[0].properties.bar[0].properties.foo[0].properties.bar[0] != 'ERROR' ) { return 'items[1].properties.bar[0].properties.foo[0].properties.bar.length <i>'+md.items[0].properties.bar[0].properties.foo[0].properties.bar[0]+'</i> instead of <i>ERROR</a>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/017.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/017.html
index 378c7c97952..dab270e643a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/017.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/017.html
@@ -28,16 +28,16 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
@@ -45,92 +45,92 @@ window.onload = function() {
orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- // http://dev.w3.org/html5/md/#extracting-json
- //"If value is an item, then: If value is in memory, then let value be the string "ERROR"."
- /*
+ // http://dev.w3.org/html5/md/#extracting-json
+ //"If value is an item, then: If value is in memory, then let value be the string "ERROR"."
+ /*
Loop detection happens only after the loop has been created, at which point it returns a property value
of "ERROR" instead of the value which has already been encountered on the stringifying stack.
Should create the following construct:
{
- items:[
- {
- properties:{
- foo:[
- {
- properties:{
- bar:[
- {
- properties:{
- foo:[
- "ERROR"
- ]
- }
- }
- ]
- }
- }
- ]
- }
- }
- ]
+ items:[
+ {
+ properties:{
+ foo:[
+ {
+ properties:{
+ bar:[
+ {
+ properties:{
+ foo:[
+ "ERROR"
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ ]
}
- */
+ */
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
- if( !md.items[0].properties ) { return 'no items[0].properties'; }
- if( !md.items[0].properties.foo ) { return 'no items[0].properties.foo'; }
- if( md.items[0].properties.foo.length != 1 ) { return 'items[0].properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
- if( !md.items[0].properties.foo[0].properties ) { return 'items[1].properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of object'; }
- if( !md.items[0].properties.foo[0].properties.bar ) { return 'items[1].properties.foo[0].properties.bar <i>'+md.items[0].properties.foo[0].properties.bar+'</i> instead of array'; }
- if( md.items[0].properties.foo[0].properties.bar.length != 1 ) { return 'items[1].properties.foo[0].properties.bar.length <i>'+md.items[0].properties.foo[0].properties.bar.length+'</i> instead of 1'; }
- if( !md.items[0].properties.foo[0].properties.bar[0].properties ) { return 'items[1].properties.foo[0].properties.bar[0].properties <i>'+md.properties.foo[0].properties.bar[0].properties+'</i> instead of object'; }
- if( !md.items[0].properties.foo[0].properties.bar[0].properties.foo ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo+'</i> instead of array'; }
- if( md.items[0].properties.foo[0].properties.bar[0].properties.foo.length != 1 ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo.length <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo.length+'</i> instead of 1'; }
- if( md.items[0].properties.foo[0].properties.bar[0].properties.foo[0] != 'ERROR' ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo.length <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo[0]+'</i> instead of <i>ERROR</a>'; }
- return '';
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
+ if( !md.items[0].properties ) { return 'no items[0].properties'; }
+ if( !md.items[0].properties.foo ) { return 'no items[0].properties.foo'; }
+ if( md.items[0].properties.foo.length != 1 ) { return 'items[0].properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
+ if( !md.items[0].properties.foo[0].properties ) { return 'items[1].properties.foo[0].properties <i>'+md.items[0].properties.foo[0].properties+'</i> instead of object'; }
+ if( !md.items[0].properties.foo[0].properties.bar ) { return 'items[1].properties.foo[0].properties.bar <i>'+md.items[0].properties.foo[0].properties.bar+'</i> instead of array'; }
+ if( md.items[0].properties.foo[0].properties.bar.length != 1 ) { return 'items[1].properties.foo[0].properties.bar.length <i>'+md.items[0].properties.foo[0].properties.bar.length+'</i> instead of 1'; }
+ if( !md.items[0].properties.foo[0].properties.bar[0].properties ) { return 'items[1].properties.foo[0].properties.bar[0].properties <i>'+md.properties.foo[0].properties.bar[0].properties+'</i> instead of object'; }
+ if( !md.items[0].properties.foo[0].properties.bar[0].properties.foo ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo+'</i> instead of array'; }
+ if( md.items[0].properties.foo[0].properties.bar[0].properties.foo.length != 1 ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo.length <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo.length+'</i> instead of 1'; }
+ if( md.items[0].properties.foo[0].properties.bar[0].properties.foo[0] != 'ERROR' ) { return 'items[1].properties.foo[0].properties.bar[0].properties.foo.length <i>'+md.items[0].properties.foo[0].properties.bar[0].properties.foo[0]+'</i> instead of <i>ERROR</a>'; }
+ return '';
}
</script>
<div draggable='true' itemscope>
- <span id='id1' itemprop='foo' itemscope><span itemscope itemprop='bar' itemref='id1'></span></span>
+ <span id='id1' itemprop='foo' itemscope><span itemscope itemprop='bar' itemref='id1'></span></span>
</div><div></div><div></div>
<p>Use your pointing device to drag the orange box to the pink box, then back to the blue box, and release it.</p>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/018.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/018.html
index 2dcaeaa75b4..357ba4f0fea 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/018.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/018.html
@@ -25,65 +25,65 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[2];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.previousSibling.ondragenter = orange.previousSibling.ondragleave = orange.previousSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.previousSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.previousSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- // http://dev.w3.org/html5/spec/dnd.html#list-of-dragged-nodes
- //"If it is a selection that is being dragged, then the list of dragged nodes contains, in tree order, every node that is partially or completely included in the selection (including all their ancestors)."
- //this test checks that the parent of the text node is included
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
- if( md.items[0].id != 'http://example.com/item1' ) { return 'items[0].id incorrect'; }
- return '';
+ // http://dev.w3.org/html5/spec/dnd.html#list-of-dragged-nodes
+ //"If it is a selection that is being dragged, then the list of dragged nodes contains, in tree order, every node that is partially or completely included in the selection (including all their ancestors)."
+ //this test checks that the parent of the text node is included
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 1 ) { return md.items.length+' items instead of 1'; }
+ if( md.items[0].id != 'http://example.com/item1' ) { return 'items[0].id incorrect'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/019.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/019.html
index 95224174cb0..11525214e29 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/019.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/019.html
@@ -25,66 +25,66 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[2];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.previousSibling.ondragenter = orange.previousSibling.ondragleave = orange.previousSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.previousSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.previousSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- // http://dev.w3.org/html5/spec/dnd.html#list-of-dragged-nodes
- //"If it is a selection that is being dragged, then the list of dragged nodes contains, in tree order, every node that is partially or completely included in the selection (including all their ancestors)."
- //this test checks that all ancestors of the text node are included
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 2 ) { return md.items.length+' items instead of 2'; }
- if( md.items[0].id != 'http://example.com/item1' ) { return 'items[0].id incorrect'; }
- if( md.items[1].id != 'http://example.com/item2' ) { return 'items[1].id incorrect'; }
- return '';
+ // http://dev.w3.org/html5/spec/dnd.html#list-of-dragged-nodes
+ //"If it is a selection that is being dragged, then the list of dragged nodes contains, in tree order, every node that is partially or completely included in the selection (including all their ancestors)."
+ //this test checks that all ancestors of the text node are included
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 2 ) { return md.items.length+' items instead of 2'; }
+ if( md.items[0].id != 'http://example.com/item1' ) { return 'items[0].id incorrect'; }
+ if( md.items[1].id != 'http://example.com/item2' ) { return 'items[1].id incorrect'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/020.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/020.html
index 007aecc3ab8..33667224ca5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/020.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/020.html
@@ -25,69 +25,69 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[2];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.previousSibling.ondragenter = orange.previousSibling.ondragleave = orange.previousSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.previousSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.previousSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- // http://dev.w3.org/html5/spec/dnd.html#list-of-dragged-nodes
- //"If it is a selection that is being dragged, then the list of dragged nodes contains, in tree order, every node that is partially or completely included in the selection (including all their ancestors)."
- //this test checks that all ancestors of the selection's end points are included, and all elements enclosed by the selection are included, but no non-selected siblings of ancestors are included
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 5 ) { return md.items.length+' items instead of 5'; }
- if( md.items[0].id != 'http://example.com/item1' ) { return 'items[0].id incorrect'; }
- if( md.items[1].id != 'http://example.com/item4' ) { return 'items[1].id incorrect'; }
- if( md.items[2].id != 'http://example.com/item5' ) { return 'items[2].id incorrect'; }
- if( md.items[3].id != 'http://example.com/item6' ) { return 'items[3].id incorrect'; }
- if( md.items[4].id != 'http://example.com/item7' ) { return 'items[4].id incorrect'; }
- return '';
+ // http://dev.w3.org/html5/spec/dnd.html#list-of-dragged-nodes
+ //"If it is a selection that is being dragged, then the list of dragged nodes contains, in tree order, every node that is partially or completely included in the selection (including all their ancestors)."
+ //this test checks that all ancestors of the selection's end points are included, and all elements enclosed by the selection are included, but no non-selected siblings of ancestors are included
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 5 ) { return md.items.length+' items instead of 5'; }
+ if( md.items[0].id != 'http://example.com/item1' ) { return 'items[0].id incorrect'; }
+ if( md.items[1].id != 'http://example.com/item4' ) { return 'items[1].id incorrect'; }
+ if( md.items[2].id != 'http://example.com/item5' ) { return 'items[2].id incorrect'; }
+ if( md.items[3].id != 'http://example.com/item6' ) { return 'items[3].id incorrect'; }
+ if( md.items[4].id != 'http://example.com/item7' ) { return 'items[4].id incorrect'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/021.html b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/021.html
index 792e3e2ce4a..62e1864beff 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/microdata/021.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/microdata/021.html
@@ -28,71 +28,71 @@
<script>
function makeEl(eltype,props,contents) {
- var elem = document.createElement(eltype);
- for( var i in props ) {
- if( props.hasOwnProperty(i) ) {
- elem.setAttribute(i,props[i]);
- }
- }
- if( contents ) {
- elem.innerHTML = contents;
- }
- return elem;
+ var elem = document.createElement(eltype);
+ for( var i in props ) {
+ if( props.hasOwnProperty(i) ) {
+ elem.setAttribute(i,props[i]);
+ }
+ }
+ if( contents ) {
+ elem.innerHTML = contents;
+ }
+ return elem;
}
var orange, fails = [], doneonce = false;
window.onload = function() {
orange = document.getElementsByTagName('div')[0];
- orange.appendChild( makeEl('div',{itemprop:'foo'},'test') );
+ orange.appendChild( makeEl('div',{itemprop:'foo'},'test') );
orange.ondragstart = function(e) {
- e.dataTransfer.addElement(document.getElementById('side1'));
- e.dataTransfer.addElement(document.getElementById('side2'));
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.addElement(document.getElementById('side1'));
+ e.dataTransfer.addElement(document.getElementById('side2'));
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
};
orange.nextSibling.ondragenter = orange.nextSibling.ondragleave = orange.nextSibling.ondragover =
orange.ondrag = orange.ondragend = function(e) {
if( e.type == 'dragover' || e.type == 'dragenter' ) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
}
if( e.dataTransfer.getData('application/microdata+json') ) {
- fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
+ fails[fails.length] = e.type + ' unexpectedly had microdata (security restriction)';
}
};
- orange.nextSibling.ondrop = function(e) {
- var err;
- if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
- fails[fails.length] = e.type + ' ' + err;
- }
- if( e.type != 'drop' ) { return; }
- if( doneonce ) { return; }
- doneonce = true;
+ orange.nextSibling.ondrop = function(e) {
+ var err;
+ if( err = checkprops(e.dataTransfer.getData('application/microdata+json')) ) {
+ fails[fails.length] = e.type + ' ' + err;
+ }
+ if( e.type != 'drop' ) { return; }
+ if( doneonce ) { return; }
+ doneonce = true;
setTimeout(function () {
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
- fails = [];
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL: ' + fails.join('<br>') ) : 'PASS';
+ fails = [];
}, 200 );
};
};
function checkprops(md) {
- var i;
- if( !md ) { return 'no microdata'; }
- md = JSON.parse(md);
- if( !md.items ) { return 'no items'; }
- if( md.items.length != 1 ) { return 'items.length '+md.items.length+' instead of 1'; }
- if( !md.items[0].properties ) { return 'no properties'; }
- if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
- if( md.items[0].properties.bar ) { return 'unexpected properties.bar'; }
- if( md.items[0].properties.foo.length != 1 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
- if( md.items[0].properties.foo[0] != orange.properties.namedItem('foo').getValues()[0] ) { return 'properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>'+orange.properties.namedItem('foo').getValues()[0]+'</i>'; }
- return '';
+ var i;
+ if( !md ) { return 'no microdata'; }
+ md = JSON.parse(md);
+ if( !md.items ) { return 'no items'; }
+ if( md.items.length != 1 ) { return 'items.length '+md.items.length+' instead of 1'; }
+ if( !md.items[0].properties ) { return 'no properties'; }
+ if( !md.items[0].properties.foo ) { return 'no properties.foo'; }
+ if( md.items[0].properties.bar ) { return 'unexpected properties.bar'; }
+ if( md.items[0].properties.foo.length != 1 ) { return 'properties.foo length '+md.items[0].properties.foo.length+' instead of 1'; }
+ if( md.items[0].properties.foo[0] != orange.properties.namedItem('foo').getValues()[0] ) { return 'properties.foo[0] <i>'+md.items[0].properties.foo[0]+'</i> instead of <i>'+orange.properties.namedItem('foo').getValues()[0]+'</i>'; }
+ return '';
}
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/001-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/001-1.xhtml
index 63175342152..a0599667871 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/001-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/001-1.xhtml
@@ -4,16 +4,16 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
html, body
- {height:100%;}
+ {height:100%;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('body').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('body').appendChild(c);}
</script>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)">
<p>Drop canvas now, it should be copied to this page once you drop it here.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/001.xhtml
index 8c297c2030b..2e8a2ca65e9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/001.xhtml
@@ -4,28 +4,28 @@
<title>Canvas cross page drag and drop</title>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));
- window.location = '001-1.xhtml';}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));
+ window.location = '001-1.xhtml';}
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern. You should be redirected to the new page and be able to drop it there.</p>
<script type="application/ecmascript">
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/002.xhtml
index 252bf33ba50..a3d9f97d04a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/002.xhtml
@@ -4,11 +4,11 @@
<title>PNG image cross page drag and drop</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
</head>
<body>
<p><img ondragstart="event.dataTransfer.effectAllowed = 'copy';window.location = 'helper-drop-image-now.xhtml'" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
<p>Drag circle above. You should be redirected to the new page and be able to drop it there.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/007-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/007-1.xhtml
index a1c982e72b8..821edf8cbde 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/007-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/007-1.xhtml
@@ -4,10 +4,10 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
html, body
- {height:100%;}
+ {height:100%;}
</style>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false" ondrop="event.preventDefault();document.querySelector('p').firstChild.nodeValue = event.dataTransfer.getData('text/plain')">
<p>Drop box now, you should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/007.xhtml
index 5cabbbd3ebb..a40bc260539 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/007.xhtml
@@ -4,16 +4,16 @@
<title>Cross page drag and drop with text/plain data</title>
<style type="text/css">
div[ondragstart]
- {width:40px;
- min-height:40px;
- margin-top:20px;
- padding:40px;
- color:white;
- background-color:navy;}
+ {width:40px;
+ min-height:40px;
+ margin-top:20px;
+ padding:40px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/plain','PASS');window.location = '007-1.xhtml'"/>
<p>Drag blue box. You should be redirected to the new page and be able to drop it there.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/008-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/008-1.xhtml
index 218b5873f3c..2ae9f4f9357 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/008-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/008-1.xhtml
@@ -4,10 +4,10 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
html, body
- {height:100%;}
+ {height:100%;}
</style>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false" ondrop="event.preventDefault();document.querySelector('p').firstChild.nodeValue = event.dataTransfer.getData('text/uri-list').substr(16,4)">
<p>Drop box now, you should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/008.xhtml
index 11b29a8f462..e6dbab4e465 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/008.xhtml
@@ -4,16 +4,16 @@
<title>Cross page drag and drop with text/uri-list data</title>
<style type="text/css">
div[ondragstart]
- {width:40px;
- min-height:40px;
- margin-top:20px;
- padding:40px;
- color:white;
- background-color:navy;}
+ {width:40px;
+ min-height:40px;
+ margin-top:20px;
+ padding:40px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/uri-list','data:text/plain,PASS');window.location = '008-1.xhtml'"/>
<p>Drag blue box. You should be redirected to the new page and be able to drop it there.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/009-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/009-1.xhtml
index 8604fd534b3..54e23c7643c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/009-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/009-1.xhtml
@@ -4,10 +4,10 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
html, body
- {height:100%;}
+ {height:100%;}
</style>
</head>
<body ondragenter="event.preventDefault()" ondragover="window.location = 'helper-drop-link-now.xhtml'">
<p>Don't drop link yet, you should be redirected to another page.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/010-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/010-1.xhtml
index 620f1af871b..e3d6b4d7d02 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/010-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/010-1.xhtml
@@ -4,24 +4,24 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
div[ondragenter]
- {margin:200px 0 0 200px;
- width:200px;
- height:100px;
- color:white;
- background-color:navy;}
+ {margin:200px 0 0 200px;
+ width:200px;
+ height:100px;
+ color:white;
+ background-color:navy;}
div[ondragenter]:before
- {display:block;
- content:"";
- border-style:solid;
- position:relative;
- top:-50px;
- left:-200px;
- border-width:100px;
- border-color:transparent navy transparent transparent;}
+ {display:block;
+ content:"";
+ border-style:solid;
+ position:relative;
+ top:-50px;
+ left:-200px;
+ border-width:100px;
+ border-color:transparent navy transparent transparent;}
</style>
</head>
<body>
<p>Drag link to the blue arrow but don't drop it yet. You should be returned back to start page.</p>
<div ondragenter="event.preventDefault()" ondragover="history.go(-1)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/010.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/010.xhtml
index 0af5b258fcc..74aabea371b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/010.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/010.xhtml
@@ -4,11 +4,11 @@
<title>Link drag and drop and history navigation roundtrip</title>
<script type="application/ecmascript">
function checkLink(event)
- {document.querySelector('a').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'}
+ {document.querySelector('a').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'}
</script>
</head>
<body>
<p><a href="data:text/plain,1" ondragstart="event.dataTransfer.effectAllowed = 'copy';window.location = '010-1.xhtml'" ondragenter="event.preventDefault()" ondrop="checkLink(event)" ondragover="return false">Drag me around and drop here once you return back</a></p>
<p>Drag link around. You will be redirected to new page. When you return back drop link on itself. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/011-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/011-1.xhtml
index 85f016441ca..95a4015a7a5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/011-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/011-1.xhtml
@@ -4,24 +4,24 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
div[ondragenter]
- {margin:200px 0 0 200px;
- width:200px;
- height:100px;
- color:white;
- background-color:navy;}
+ {margin:200px 0 0 200px;
+ width:200px;
+ height:100px;
+ color:white;
+ background-color:navy;}
div[ondragenter]:before
- {display:block;
- content:"";
- border-style:solid;
- position:relative;
- top:-50px;
- left:-200px;
- border-width:100px;
- border-color:transparent navy transparent transparent;}
+ {display:block;
+ content:"";
+ border-style:solid;
+ position:relative;
+ top:-50px;
+ left:-200px;
+ border-width:100px;
+ border-color:transparent navy transparent transparent;}
</style>
</head>
<body>
<p>Drag canvas to the blue arrow but don't drop it yet. You should be returned back to start page.</p>
<div ondragenter="event.preventDefault()" ondragover="history.go(-1)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/011.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/011.xhtml
index a4d86a1d28d..56955a899f8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/011.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/011.xhtml
@@ -4,36 +4,36 @@
<title>Canvas drag and drop and history navigation roundtrip</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));
- window.location = '011-1.xhtml'}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));
+ window.location = '011-1.xhtml'}
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)">Canvas</canvas>
</p>
<p>Drag canvas around. You will be redirected to new page. When you return back drop canvas on itself. It should be duplicated once you drop it.</p>
<script type="application/ecmascript">
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/012.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/012.xhtml
index 842b75fa60a..e9d72dbca5b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/012.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/012.xhtml
@@ -4,17 +4,17 @@
<title>PNG image drag and drop and history navigation roundtrip</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
</script>
</head>
<body>
<p><img ondragstart="event.dataTransfer.effectAllowed = 'copy';window.location = 'helper-drag-image-dont-drop.xhtml'" ondragenter="event.preventDefault()" ondrop="addImage(event)" ondragover="return false" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
<p>Drag circle around. You will be redirected to new page. When you return back drop circle on itself. It should be duplicated once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/013.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/013.xhtml
index 59d48a04183..d263a378623 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/013.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/013.xhtml
@@ -4,17 +4,17 @@
<title>SVG image drag and drop and history navigation roundtrip</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
</script>
</head>
<body>
<p><img ondragstart="event.dataTransfer.effectAllowed = 'copy';window.location = 'helper-drag-image-dont-drop.xhtml'" ondragenter="event.preventDefault()" ondrop="addImage(event)" ondragover="return false" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle"/></p>
<p>Drag circle around. You will be redirected to new page. When you return back drop circle on itself. It should be duplicated once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/016-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/016-1.xhtml
index 5e25edaad02..564469779e0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/016-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/016-1.xhtml
@@ -4,22 +4,22 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
p
- {border:solid medium navy;
- height:200px;
- padding:1em;
- margin:0;}
+ {border:solid medium navy;
+ height:200px;
+ padding:1em;
+ margin:0;}
div
- {margin:100px;
- padding:50px;}
+ {margin:100px;
+ padding:50px;}
img
- {display:block;
- margin:1em;}
+ {display:block;
+ margin:1em;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
</script>
</head>
<body>
@@ -27,4 +27,4 @@ function addImage(event)
<p ondragenter="event.stopPropagation()" dropzone="copy string:text/uri-list" ondrop="addImage(event)">Drop canvas here, it should be copied to this page once you drop it here.</p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/016.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/016.xhtml
index 1ac642fe136..d70fd4d5424 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/016.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/016.xhtml
@@ -4,28 +4,28 @@
<title>Reload during canvas cross page drag and drop</title>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));
- window.location = '016-1.xhtml';}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));
+ window.location = '016-1.xhtml';}
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern. You should be redirected to the new page and be able to drop it there.</p>
<script type="application/ecmascript">
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/017.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/017.xhtml
index 36b8987a270..ea2dea268cb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/017.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/017.xhtml
@@ -4,11 +4,11 @@
<title>Reload during PNG image cross page drag and drop</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
</head>
<body>
<p><img ondragstart="event.dataTransfer.effectAllowed = 'copy';window.location = 'helper-drop-here-reload.xhtml'" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
<p>Drag circle above. You should be redirected to the new page and be able to drop it there.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/021-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/021-1.xhtml
index e38204ca422..75af8a61d61 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/021-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/021-1.xhtml
@@ -4,17 +4,17 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
p
- {border:solid medium navy;
- height:200px;
- padding:1em;
- margin:0;}
+ {border:solid medium navy;
+ height:200px;
+ padding:1em;
+ margin:0;}
div
- {margin:100px;
- padding:50px;}
+ {margin:100px;
+ padding:50px;}
</style>
<script type="application/ecmascript">
function checkLink(event)
- {document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'}
+ {document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'}
</script>
</head>
<body>
@@ -22,4 +22,4 @@ function checkLink(event)
<p ondragenter="event.stopPropagation()" dropzone="copy string:text/uri-list" ondrop="checkLink(event)">Drop link here, you should see word PASS once you drop it.</p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/022-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/022-1.xhtml
index ff96e273b6d..1aa795b892b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/022-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/022-1.xhtml
@@ -4,13 +4,13 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
p
- {border:solid medium navy;
- height:200px;
- padding:1em;
- margin:0;}
+ {border:solid medium navy;
+ height:200px;
+ padding:1em;
+ margin:0;}
div
- {margin:100px;
- padding:50px;}
+ {margin:100px;
+ padding:50px;}
</style>
</head>
<body>
@@ -18,4 +18,4 @@ div
<p ondragenter="event.stopPropagation()" dropzone="copy string:text/plain" ondrop="event.preventDefault();document.querySelector('p').firstChild.nodeValue = event.dataTransfer.getData('text/plain')">Drop box here, you should see word PASS once you drop it.</p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/022.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/022.xhtml
index 70aa3d93bcf..38cbef3eed8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/022.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/022.xhtml
@@ -4,16 +4,16 @@
<title>Reload during cross page drag and drop with text/plain data</title>
<style type="text/css">
div[ondragstart]
- {width:40px;
- min-height:40px;
- margin-top:20px;
- padding:40px;
- color:white;
- background-color:navy;}
+ {width:40px;
+ min-height:40px;
+ margin-top:20px;
+ padding:40px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/plain','PASS');window.location = '022-1.xhtml'"/>
<p>Drag blue box. You should be redirected to the new page and be able to drop it there.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/023-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/023-1.xhtml
index 29f51732f29..e29cdd5d0fb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/023-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/023-1.xhtml
@@ -4,13 +4,13 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
p
- {border:solid medium navy;
- height:200px;
- padding:1em;
- margin:0;}
+ {border:solid medium navy;
+ height:200px;
+ padding:1em;
+ margin:0;}
div
- {margin:100px;
- padding:50px;}
+ {margin:100px;
+ padding:50px;}
</style>
</head>
<body>
@@ -18,4 +18,4 @@ div
<p ondragenter="event.stopPropagation()" dropzone="copy string:text/uri-list" ondrop="event.preventDefault();document.querySelector('p').firstChild.nodeValue = event.dataTransfer.getData('text/uri-list').substr(16,4)">Drop box here, you should see word PASS once you drop it.</p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/023.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/023.xhtml
index eb286ace89c..4f7b80939b8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/023.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/023.xhtml
@@ -4,16 +4,16 @@
<title>Reload during cross page drag and drop with text/uri-list data</title>
<style type="text/css">
div[ondragstart]
- {width:40px;
- min-height:40px;
- margin-top:20px;
- padding:40px;
- color:white;
- background-color:navy;}
+ {width:40px;
+ min-height:40px;
+ margin-top:20px;
+ padding:40px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/uri-list','data:text/plain,PASS');window.location = '023-1.xhtml'"/>
<p>Drag blue box. You should be redirected to the new page and be able to drop it there.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drag-image-dont-drop.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drag-image-dont-drop.xhtml
index 883649e43e1..2967d315c15 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drag-image-dont-drop.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drag-image-dont-drop.xhtml
@@ -4,24 +4,24 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
div[ondragenter]
- {margin:200px 0 0 200px;
- width:200px;
- height:100px;
- color:white;
- background-color:navy;}
+ {margin:200px 0 0 200px;
+ width:200px;
+ height:100px;
+ color:white;
+ background-color:navy;}
div[ondragenter]:before
- {display:block;
- content:"";
- border-style:solid;
- position:relative;
- top:-50px;
- left:-200px;
- border-width:100px;
- border-color:transparent navy transparent transparent;}
+ {display:block;
+ content:"";
+ border-style:solid;
+ position:relative;
+ top:-50px;
+ left:-200px;
+ border-width:100px;
+ border-color:transparent navy transparent transparent;}
</style>
</head>
<body>
<p>Drag image to the blue arrow but don't drop it yet. You should be returned back to start page.</p>
<div ondragenter="event.preventDefault()" ondragover="history.go(-1)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drag-selection-dont-drop.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drag-selection-dont-drop.xhtml
index 76712a6db39..db1edb81d60 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drag-selection-dont-drop.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drag-selection-dont-drop.xhtml
@@ -4,24 +4,24 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
div[ondragenter]
- {margin:200px 0 0 200px;
- width:200px;
- height:100px;
- color:white;
- background-color:navy;}
+ {margin:200px 0 0 200px;
+ width:200px;
+ height:100px;
+ color:white;
+ background-color:navy;}
div[ondragenter]:before
- {display:block;
- content:"";
- border-style:solid;
- position:relative;
- top:-50px;
- left:-200px;
- border-width:100px;
- border-color:transparent navy transparent transparent;}
+ {display:block;
+ content:"";
+ border-style:solid;
+ position:relative;
+ top:-50px;
+ left:-200px;
+ border-width:100px;
+ border-color:transparent navy transparent transparent;}
</style>
</head>
<body>
<p>Drag selection to the blue arrow but don't drop it yet. You should be returned back to start page.</p>
<div ondragenter="event.preventDefault()" ondragover="history.go(-1)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-here-reload.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-here-reload.xhtml
index 481692f79a2..a0465036513 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-here-reload.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-here-reload.xhtml
@@ -4,22 +4,22 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
p
- {border:solid medium navy;
- height:200px;
- padding:1em;
- margin:0;}
+ {border:solid medium navy;
+ height:200px;
+ padding:1em;
+ margin:0;}
div
- {margin:100px;
- padding:50px;}
+ {margin:100px;
+ padding:50px;}
img
- {display:block;
- margin:1em;}
+ {display:block;
+ margin:1em;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
</script>
</head>
<body>
@@ -27,4 +27,4 @@ function addImage(event)
<p ondragenter="event.stopPropagation()" dropzone="copy string:text/uri-list" ondrop="addImage(event)">Drop image here, it should be copied to this page once you drop it here.</p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-image-now.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-image-now.xhtml
index a2c5ce4dbe9..ccd38b55882 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-image-now.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-image-now.xhtml
@@ -4,16 +4,16 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
html, body
- {height:100%;}
+ {height:100%;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('body').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('body').appendChild(c);}
</script>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)">
<p>Drop image now, it should be copied to this page once you drop it here.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-link-now.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-link-now.xhtml
index f6a3c6c30f6..286b5586da5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-link-now.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-link-now.xhtml
@@ -4,14 +4,14 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
html, body
- {height:100%;}
+ {height:100%;}
</style>
<script type="application/ecmascript">
function checkLink(event)
- {document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'}
+ {document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'}
</script>
</head>
<body ondragenter="event.preventDefault()" ondrop="checkLink(event)" ondragover="return false">
<p>Drop link now, you should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-now.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-now.xhtml
index e391b342a12..046c4bbd214 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-now.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-now.xhtml
@@ -4,10 +4,10 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
html, body
- {height:100%;}
+ {height:100%;}
</style>
</head>
<body ondragenter="event.preventDefault()" ondragover="return false" ondrop="event.preventDefault();document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<p>Drop selection now, you should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-selection-here.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-selection-here.xhtml
index a88d34eb83c..074f5b3d89d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-selection-here.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/navigation/helper-drop-selection-here.xhtml
@@ -4,13 +4,13 @@
<title>Cross page drag and drop: helper file</title>
<style type="text/css">
p
- {border:solid medium navy;
- height:200px;
- padding:1em;
- margin:0;}
+ {border:solid medium navy;
+ height:200px;
+ padding:1em;
+ margin:0;}
div
- {margin:100px;
- padding:50px;}
+ {margin:100px;
+ padding:50px;}
</style>
</head>
<body>
@@ -18,4 +18,4 @@ div
<p ondragenter="event.stopPropagation()" dropzone="copy string:text/plain" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">Drop selection here, you should see word PASS once you drop it.</p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/001.xhtml
index 58e2811c333..56924d7a7fa 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/001.xhtml
@@ -4,12 +4,12 @@
<title>Drag feedback overlay size</title>
<style type="text/css">
img
- {height:100px;
- width:100px;}
+ {height:100px;
+ width:100px;}
</style>
</head>
<body>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEElEQVR42mNgaGD4D8YwBgAw9AX9Y9zBwwAAAABJRU5ErkJggg==" alt="PNG green pixel" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Try to drag green box above. Size of feedback overlay should match size of green box.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/002.xhtml
index 4e30fa79026..b8d2e8cb052 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/002.xhtml
@@ -4,17 +4,17 @@
<title>Setting drag image during drag and drop</title>
<style type="text/css">
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
</script>
</head>
<body>
<p><a href="data:text/plain,1" ondragstart="start(event)">Drag me</a></p>
<p>Try to drag link above. You should see word <span>PASS</span> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/003.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/003.xhtml
index 2683013ae75..344a7da7dba 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/003.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/003.xhtml
@@ -4,17 +4,17 @@
<title>Adding element to datastore</title>
<style type="text/css">
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector('span'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector('span'));}
</script>
</head>
<body>
<p><a href="data:text/plain,1" ondragstart="start(event)">Drag me</a></p>
<p>Try to drag link above. You should see word <span>PASS</span> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/004.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/004.xhtml
index 1bb85f771e9..2ba73e3737a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/004.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/004.xhtml
@@ -4,23 +4,23 @@
<title>Resetting drag image on dragenter</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {width:100px;
- height:100px;
- background-color:silver;
- margin-top:20px;}
+ {width:100px;
+ height:100px;
+ background-color:silver;
+ margin-top:20px;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
function resetImage(event)
- {event.preventDefault();
- event.dataTransfer.setDragImage(document.querySelector('strong'), 1, 1);}
+ {event.preventDefault();
+ event.dataTransfer.setDragImage(document.querySelector('strong'), 1, 1);}
</script>
</head>
<body>
@@ -28,4 +28,4 @@ function resetImage(event)
<p>Try to drag link above to the silver box. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
<div ondragenter="resetImage(event)" ondragover="return false"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/005.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/005.xhtml
index 4b9fd33d3a1..bf156f36fad 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/005.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/005.xhtml
@@ -4,23 +4,23 @@
<title>Adding element to datastore on dragenter</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {width:100px;
- height:100px;
- background-color:silver;
- margin-top:20px;}
+ {width:100px;
+ height:100px;
+ background-color:silver;
+ margin-top:20px;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector('span'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector('span'));}
function resetImage(event)
- {event.preventDefault();
- event.dataTransfer.addElement(document.querySelector('strong'));}
+ {event.preventDefault();
+ event.dataTransfer.addElement(document.querySelector('strong'));}
</script>
</head>
<body>
@@ -28,4 +28,4 @@ function resetImage(event)
<p>Try to drag link above to the silver box. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
<div ondragenter="resetImage(event)" ondragover="return false"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/006.xhtml
index 1681adb064c..4c0295bf9bd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/006.xhtml
@@ -4,23 +4,23 @@
<title>Resetting drag image on dragover</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {width:100px;
- height:100px;
- background-color:silver;
- margin-top:20px;}
+ {width:100px;
+ height:100px;
+ background-color:silver;
+ margin-top:20px;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
function resetImage(event)
- {event.preventDefault();
- event.dataTransfer.setDragImage(document.querySelector('strong'), 1, 1);}
+ {event.preventDefault();
+ event.dataTransfer.setDragImage(document.querySelector('strong'), 1, 1);}
</script>
</head>
<body>
@@ -28,4 +28,4 @@ function resetImage(event)
<p>Try to drag link above to the silver box. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
<div ondragenter="event.preventDefault()" ondragover="resetImage(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/007.xhtml
index c8461ea3ca8..d91aae50562 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/007.xhtml
@@ -4,23 +4,23 @@
<title>Adding element to datastore on dragover</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {width:100px;
- height:100px;
- background-color:silver;
- margin-top:20px;}
+ {width:100px;
+ height:100px;
+ background-color:silver;
+ margin-top:20px;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector('span'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector('span'));}
function resetImage(event)
- {event.preventDefault()
- event.dataTransfer.addElement(document.querySelector('strong'));}
+ {event.preventDefault()
+ event.dataTransfer.addElement(document.querySelector('strong'));}
</script>
</head>
<body>
@@ -28,4 +28,4 @@ function resetImage(event)
<p>Try to drag link above to the silver box. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
<div ondragenter="event.preventDefault()" ondragover="resetImage(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/008.xhtml
index 9c94229fac8..9d01553c541 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/008.xhtml
@@ -4,21 +4,21 @@
<title>Resetting drag image on drag</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
function resetImage(event)
- {event.dataTransfer.setDragImage(document.querySelector('strong'), 1, 1);}
+ {event.dataTransfer.setDragImage(document.querySelector('strong'), 1, 1);}
</script>
</head>
<body>
<p><a href="data:text/plain,1" ondragstart="start(event)" ondrag="resetImage(event)">Drag me</a></p>
<p>Try to drag link above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/009.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/009.xhtml
index d9ffbcfcfa4..23c786e9a01 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/009.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/009.xhtml
@@ -4,21 +4,21 @@
<title>Adding element to datastore on drag</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector('span'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector('span'));}
function resetImage(event)
- {event.dataTransfer.addElement(document.querySelector('strong'));}
+ {event.dataTransfer.addElement(document.querySelector('strong'));}
</script>
</head>
<body>
<p><a href="data:text/plain,1" ondragstart="start(event)" ondrag="resetImage(event)">Drag me</a></p>
<p>Try to drag link above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/010.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/010.xhtml
index 1401823ec6c..5108bdd5e97 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/010.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/010.xhtml
@@ -4,14 +4,14 @@
<title>Resetting drag image on new drag</title>
<style type="text/css">
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
</style>
<script type="application/ecmascript">
var i = 0;
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelectorAll('span')[i++%2], 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelectorAll('span')[i++%2], 1, 1);}
</script>
</head>
<body>
@@ -19,4 +19,4 @@ function start(event)
<p>Drag link above around the page drop it and try to drag again.</p>
<p>First time you drag it you should see word <span>Odd</span> in feedback overlay, second time overlay should change to <span>Even</span>.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/011.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/011.xhtml
index d62be17f6db..5fc17de1f44 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/011.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/011.xhtml
@@ -4,14 +4,14 @@
<title>Feedback image for circle</title>
<style type="text/css">
body
- {background-color:silver;
- margin:0;}
+ {background-color:silver;
+ margin:0;}
div
- {background-color:white;}
+ {background-color:white;}
</style>
</head>
<body>
<div><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG green pixel" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></div>
<p>Try to drag green circle above. Feedback overlay should be a circle.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/012.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/012.xhtml
index 5b069b99dd7..49739bc2b73 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/012.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/012.xhtml
@@ -4,22 +4,22 @@
<title>Feedback image and border-radius</title>
<style type="text/css">
body
- {background-color:silver;
- margin:0;}
+ {background-color:silver;
+ margin:0;}
div
- {background-color:white;}
+ {background-color:white;}
div > div
- {display:block;
- width:100px;
- height:100px;
- border:solid thin green;
- border-radius:50px;}
+ {display:block;
+ width:100px;
+ height:100px;
+ border:solid thin green;
+ border-radius:50px;}
</style>
</head>
<body>
<div>
- <div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/>
+ <div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/>
</div>
<p>Try to drag green circle above. Feedback overlay should be a circle.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/013.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/013.xhtml
index 17ba67d1927..07ac6b8e534 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/013.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/013.xhtml
@@ -4,25 +4,25 @@
<title>Feedback image and CSS transforms</title>
<style type="text/css">
body
- {background-color:silver;
- margin:0;}
+ {background-color:silver;
+ margin:0;}
div
- {background-color:white;}
+ {background-color:white;}
div > div
- {display:block;
- width:100px;
- height:87px;
- transform-origin:bottom right;
- transform:skew(-30deg);
- -o-transform-origin:bottom right;
- -o-transform:skew(-30deg);
- background-color:green;}
+ {display:block;
+ width:100px;
+ height:87px;
+ transform-origin:bottom right;
+ transform:skew(-30deg);
+ -o-transform-origin:bottom right;
+ -o-transform:skew(-30deg);
+ background-color:green;}
</style>
</head>
<body>
<div>
- <div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/>
+ <div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/>
</div>
<p>Try to drag green rhomb above. Feedback overlay should not be rectangular.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/014.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/014.xhtml
index c853fa9cb13..8c07f69a184 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/014.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/014.xhtml
@@ -4,17 +4,17 @@
<title>Setting drag image during drag and drop of selection</title>
<style type="text/css">
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
<p ondragstart="start(event)">Drag me</p>
<p>Try to drag selection above. You should see word <span>PASS</span> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/015.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/015.xhtml
index 63eb0f07e06..3e416524ee4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/015.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/015.xhtml
@@ -4,17 +4,17 @@
<title>Adding element to datastore during drag and drop of selection</title>
<style type="text/css">
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector('span'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector('span'));}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
<p ondragstart="start(event)">Drag me</p>
<p>Try to drag selection above. You should see word <span>PASS</span> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/016.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/016.xhtml
index d60351b7421..081ee913300 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/016.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/016.xhtml
@@ -4,22 +4,22 @@
<title>Setting drag image during drag and drop of PNG image</title>
<style type="text/css">
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
img
- {height:100px;
- width:100px;}
+ {height:100px;
+ width:100px;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
</script>
</head>
<body>
<p ondragstart="start(event)">
- <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEElEQVR42mNgaGD4D8YwBgAw9AX9Y9zBwwAAAABJRU5ErkJggg==" alt="PNG green pixel"/>
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEElEQVR42mNgaGD4D8YwBgAw9AX9Y9zBwwAAAABJRU5ErkJggg==" alt="PNG green pixel"/>
</p>
<p>Try to drag green box above. You should see word <span>PASS</span> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/017.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/017.xhtml
index 6bae357d614..7b1d9320ffa 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/017.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/017.xhtml
@@ -4,22 +4,22 @@
<title>Adding element to datastore during drag and drop of PNG image</title>
<style type="text/css">
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
img
- {height:100px;
- width:100px;}
+ {height:100px;
+ width:100px;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector('span'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector('span'));}
</script>
</head>
<body>
<p ondragstart="start(event)">
- <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEElEQVR42mNgaGD4D8YwBgAw9AX9Y9zBwwAAAABJRU5ErkJggg==" alt="PNG green pixel"/>
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEElEQVR42mNgaGD4D8YwBgAw9AX9Y9zBwwAAAABJRU5ErkJggg==" alt="PNG green pixel"/>
</p>
<p>Try to drag green box above. You should see word <span>PASS</span> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/018.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/018.xhtml
index bfde05660ba..b82080a7fbb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/018.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/018.xhtml
@@ -4,17 +4,17 @@
<title>Setting drag image during drag and drop of SVG image</title>
<style type="text/css">
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
</script>
</head>
<body>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle" ondragstart="start(event)"/></p>
<p>Try to drag green circle above. You should see word <span>PASS</span> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/019.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/019.xhtml
index 130e716d6f4..325be4e8c35 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/019.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/019.xhtml
@@ -4,17 +4,17 @@
<title>Adding element to datastore during drag and drop of SVG image</title>
<style type="text/css">
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector('span'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector('span'));}
</script>
</head>
<body>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle" ondragstart="start(event)"/></p>
<p>Try to drag green circle above. You should see word <span>PASS</span> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/020.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/020.xhtml
index 80257d1d73d..f5d1a2636dd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/020.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/020.xhtml
@@ -4,21 +4,21 @@
<title>Setting drag image during drag and drop of block element</title>
<style type="text/css">
div
- {width:100px;
- height:100px;
- background-color:navy;}
+ {width:100px;
+ height:100px;
+ background-color:navy;}
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
</script>
</head>
<body>
<div draggable="true" ondragstart="start(event)"/>
<p>Try to drag blue box above. You should see word <span>PASS</span> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/021.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/021.xhtml
index d9400c71176..268ef17c8cb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/021.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/021.xhtml
@@ -4,21 +4,21 @@
<title>Adding element to datastore during drag and drop of block element</title>
<style type="text/css">
div
- {width:100px;
- height:100px;
- background-color:navy;}
+ {width:100px;
+ height:100px;
+ background-color:navy;}
span
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector('span'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector('span'));}
</script>
</head>
<body>
<div draggable="true" ondragstart="start(event)"/>
<p>Try to drag blue box above. You should see word <span>PASS</span> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/022.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/022.xhtml
index 8b8a0925a53..fedc0344edb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/022.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/022.xhtml
@@ -4,13 +4,13 @@
<title>Block element drag and drop: changing draggable attribute</title>
<style type="text/css">
div
- {width:100px;
- height:100px;
- background-color:navy;}
+ {width:100px;
+ height:100px;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('div').setAttribute('draggable','false')">
<div draggable="true" ondragstart="document.querySelector('p').firstChild.nodeValue = 'FAIL'"/>
<p>You should not be able to drag blue box.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/024.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/024.xhtml
index f514b208c7a..a7a3eb3320a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/024.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/024.xhtml
@@ -4,12 +4,12 @@
<title>PNG image drag and drop: changing draggable attribute</title>
<style type="text/css">
img
- {width:100px;
- height:100px;}
+ {width:100px;
+ height:100px;}
</style>
</head>
<body onload="document.querySelector('img').setAttribute('draggable','false')">
<p><img ondragstart="document.querySelector('p').firstChild.nodeValue = 'FAIL'" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEElEQVR42mNgaGD4D8YwBgAw9AX9Y9zBwwAAAABJRU5ErkJggg==" alt="PNG green pixel"/></p>
<p>You should not be able to drag green box.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/025.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/025.xhtml
index 7bb8debd622..ac2005377bc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/025.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/025.xhtml
@@ -4,12 +4,12 @@
<title>SVG image drag and drop: changing draggable attribute</title>
<style type="text/css">
img
- {width:100px;
- height:100px;}
+ {width:100px;
+ height:100px;}
</style>
</head>
<body onload="document.querySelector('img').setAttribute('draggable','false')">
<p><img ondragstart="document.querySelector('p').firstChild.nodeValue = 'FAIL'" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle"/></p>
<p>You should not be able to drag green circle.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/026.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/026.xhtml
index 0793daaee52..8d4b07411dc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/026.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/026.xhtml
@@ -4,29 +4,29 @@
<title>Drag and drop of overlapping links: zero height</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {width:4em;
- padding:1em;
- line-height:0;}
+ {width:4em;
+ padding:1em;
+ line-height:0;}
a
- {background-color:white;
- padding:1ex;}
+ {background-color:white;
+ padding:1ex;}
</style>
<script type="application/ecmascript">
function start(event,feedback)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector(feedback));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector(feedback));}
</script>
</head>
<body>
<div>
- <a href="data:text/plain,1" ondragstart="start(event,'strong')">    </a>
- <a href="data:text/plain,2" ondragstart="start(event,'span')">Link</a>
+ <a href="data:text/plain,1" ondragstart="start(event,'strong')">    </a>
+ <a href="data:text/plain,2" ondragstart="start(event,'span')">Link</a>
</div>
<p>Try to drag link above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/027.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/027.xhtml
index 7b2945ed90c..e34e2e88f12 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/027.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/027.xhtml
@@ -4,28 +4,28 @@
<title>Drag and drop of overlapping links: negative margin</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {height:2em;}
+ {height:2em;}
div + div
- {margin-top:-2em;}
+ {margin-top:-2em;}
</style>
<script type="application/ecmascript">
function start(event,feedback)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector(feedback));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector(feedback));}
</script>
</head>
<body>
<div>
- <a href="data:text/plain,1" ondragstart="start(event,'strong')">   </a>
+ <a href="data:text/plain,1" ondragstart="start(event,'strong')">   </a>
</div>
<div>
- <a href="data:text/plain,2" ondragstart="start(event,'span')">Link</a>
+ <a href="data:text/plain,2" ondragstart="start(event,'span')">Link</a>
</div>
<p>Try to drag link above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/028.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/028.xhtml
index cba934b6d02..0afd8a70cc7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/028.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/028.xhtml
@@ -4,29 +4,29 @@
<title>Drag and drop of overlapping links: relative position</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {height:2em;}
+ {height:2em;}
div + div
- {position:relative;
- top:-2em;}
+ {position:relative;
+ top:-2em;}
</style>
<script type="application/ecmascript">
function start(event,feedback)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector(feedback));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector(feedback));}
</script>
</head>
<body>
<div>
- <a href="data:text/plain,1" ondragstart="start(event,'strong')">   </a>
+ <a href="data:text/plain,1" ondragstart="start(event,'strong')">   </a>
</div>
<div>
- <a href="data:text/plain,2" ondragstart="start(event,'span')">Link</a>
+ <a href="data:text/plain,2" ondragstart="start(event,'span')">Link</a>
</div>
<p>Try to drag link above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/029.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/029.xhtml
index dd02b1cdaf9..8741e8a3748 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/029.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/029.xhtml
@@ -4,33 +4,33 @@
<title>Drag and drop of overlapping links: absolute position</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {height:2em;
- position:absolute;
- top:10px;
- left:10px;}
+ {height:2em;
+ position:absolute;
+ top:10px;
+ left:10px;}
div + div
- {z-index:2;}
+ {z-index:2;}
p
- {margin-top:3em;}
+ {margin-top:3em;}
</style>
<script type="application/ecmascript">
function start(event,feedback)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector(feedback));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector(feedback));}
</script>
</head>
<body>
<div>
- <a href="data:text/plain,1" ondragstart="start(event,'strong')">   </a>
+ <a href="data:text/plain,1" ondragstart="start(event,'strong')">   </a>
</div>
<div>
- <a href="data:text/plain,2" ondragstart="start(event,'span')">Link</a>
+ <a href="data:text/plain,2" ondragstart="start(event,'span')">Link</a>
</div>
<p>Try to drag link above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/030.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/030.xhtml
index d86072dc852..3dcfae69fc4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/030.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/030.xhtml
@@ -4,33 +4,33 @@
<title>Drag and drop of overlapping links: fixed position</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {height:2em;
- position:fixed;
- top:10px;
- left:10px;}
+ {height:2em;
+ position:fixed;
+ top:10px;
+ left:10px;}
div + div
- {z-index:2;}
+ {z-index:2;}
p
- {margin-top:3em;}
+ {margin-top:3em;}
</style>
<script type="application/ecmascript">
function start(event,feedback)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector(feedback));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector(feedback));}
</script>
</head>
<body>
<div>
- <a href="data:text/plain,1" ondragstart="start(event,'strong')">   </a>
+ <a href="data:text/plain,1" ondragstart="start(event,'strong')">   </a>
</div>
<div>
- <a href="data:text/plain,2" ondragstart="start(event,'span')">Link</a>
+ <a href="data:text/plain,2" ondragstart="start(event,'span')">Link</a>
</div>
<p>Try to drag link above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/031.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/031.xhtml
index 72ed959725a..009f19a9d14 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/031.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/031.xhtml
@@ -4,28 +4,28 @@
<title>Drag and drop of overlapping images: negative margin</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
img
- {display:block;
- width:100px;
- height:100px;}
+ {display:block;
+ width:100px;
+ height:100px;}
img + img
- {margin-top:-100px;}
+ {margin-top:-100px;}
</style>
<script type="application/ecmascript">
function start(event,feedback)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector(feedback));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector(feedback));}
</script>
</head>
<body>
<div>
- <img ondragstart="start(event,'strong')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4z8DwHwAFAAH/VscvDQAAAABJRU5ErkJggg=="/>
- <img ondragstart="start(event,'span')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNgaGD4DwAChAGAJVtEDQAAAABJRU5ErkJggg=="/>
+ <img ondragstart="start(event,'strong')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4z8DwHwAFAAH/VscvDQAAAABJRU5ErkJggg=="/>
+ <img ondragstart="start(event,'span')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNgaGD4DwAChAGAJVtEDQAAAABJRU5ErkJggg=="/>
</div>
<p>Try to drag box above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/032.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/032.xhtml
index 22ae40193af..d041ec9d5f1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/032.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/032.xhtml
@@ -4,32 +4,32 @@
<title>Drag and drop of overlapping images: absolute position</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {height:100px;
- position:relative;}
+ {height:100px;
+ position:relative;}
img
- {display:block;
- position:absolute;
- top:0;
- bottom:0;
- width:100px;
- height:100px;}
+ {display:block;
+ position:absolute;
+ top:0;
+ bottom:0;
+ width:100px;
+ height:100px;}
</style>
<script type="application/ecmascript">
function start(event,feedback)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector(feedback));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector(feedback));}
</script>
</head>
<body>
<div>
- <img ondragstart="start(event,'strong')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4z8DwHwAFAAH/VscvDQAAAABJRU5ErkJggg=="/>
- <img ondragstart="start(event,'span')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNgaGD4DwAChAGAJVtEDQAAAABJRU5ErkJggg=="/>
+ <img ondragstart="start(event,'strong')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4z8DwHwAFAAH/VscvDQAAAABJRU5ErkJggg=="/>
+ <img ondragstart="start(event,'span')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNgaGD4DwAChAGAJVtEDQAAAABJRU5ErkJggg=="/>
</div>
<p>Try to drag box above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/033.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/033.xhtml
index ba597bdcd60..b91f58181a1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/033.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/033.xhtml
@@ -4,32 +4,32 @@
<title>Drag and drop of overlapping images: fixed position</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
div
- {height:100px;
- position:relative;}
+ {height:100px;
+ position:relative;}
img
- {display:block;
- position:fixed;
- top:0;
- bottom:0;
- width:100px;
- height:100px;}
+ {display:block;
+ position:fixed;
+ top:0;
+ bottom:0;
+ width:100px;
+ height:100px;}
</style>
<script type="application/ecmascript">
function start(event,feedback)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector(feedback));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector(feedback));}
</script>
</head>
<body>
<div>
- <img ondragstart="start(event,'strong')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4z8DwHwAFAAH/VscvDQAAAABJRU5ErkJggg=="/>
- <img ondragstart="start(event,'span')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNgaGD4DwAChAGAJVtEDQAAAABJRU5ErkJggg=="/>
+ <img ondragstart="start(event,'strong')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP4z8DwHwAFAAH/VscvDQAAAABJRU5ErkJggg=="/>
+ <img ondragstart="start(event,'span')" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNgaGD4DwAChAGAJVtEDQAAAABJRU5ErkJggg=="/>
</div>
<p>Try to drag box above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay all the time.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/034.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/034.xhtml
index d6b64da7540..3fbbfcce320 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/034.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/034.xhtml
@@ -4,15 +4,15 @@
<title>Drag and drop of overlapping elements: negative margins</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- margin-top:-50px;
- background-color:navy;}
+ {height:100px;
+ width:100px;
+ margin-top:-50px;
+ background-color:navy;}
div:nth-child(odd)
- {background-color:maroon;
- margin-left:50px;}
+ {background-color:maroon;
+ margin-left:50px;}
div[draggable]
- {background-color:teal;}
+ {background-color:teal;}
</style>
</head>
<body>
@@ -26,4 +26,4 @@ div[draggable]
<div/>
<p>Only green areas should be draggable.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/035.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/035.xhtml
index e0d26ce7d0d..c2a13f7ea6e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/035.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/035.xhtml
@@ -4,16 +4,16 @@
<title>Drag and drop of floated overlapping elements: negative margins</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- float:left;
- margin-left:-50px;
- background-color:navy;}
+ {height:100px;
+ width:100px;
+ float:left;
+ margin-left:-50px;
+ background-color:navy;}
div:nth-child(odd)
- {background-color:maroon;
- margin-top:50px;}
+ {background-color:maroon;
+ margin-top:50px;}
div[draggable]
- {background-color:teal;}
+ {background-color:teal;}
</style>
</head>
<body>
@@ -27,4 +27,4 @@ div[draggable]
<div/>
<div/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/036.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/036.xhtml
index 6ccb58fc217..94ba9f24e44 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/036.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/036.xhtml
@@ -4,32 +4,32 @@
<title>Drag feedback when multiple elements are added to dragstore</title>
<style type="text/css">
div > div
- {height:100px;
- width:100px;
- float:left;
- background-color:navy;}
+ {height:100px;
+ width:100px;
+ float:left;
+ background-color:navy;}
div + div
- {margin-left:-60px;
- background-color:maroon;}
+ {margin-left:-60px;
+ background-color:maroon;}
div[draggable]
- {background-color:teal;
- margin-top:50px;}
+ {background-color:teal;
+ margin-top:50px;}
</style>
<script type="application/ecmascript">
function start(event)
- {var div = document.querySelectorAll('div > div:nth-child(odd)');
- event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != div.length; i++)
- {event.dataTransfer.addElement(div[i]);}
- }
+ {var div = document.querySelectorAll('div > div:nth-child(odd)');
+ event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != div.length; i++)
+ {event.dataTransfer.addElement(div[i]);}
+ }
</script>
</head>
<body>
<p>Try to drag green box below. Feedback overlay should include all three boxes when you drag green one.</p>
<div ondragstart="start(event)">
- <div/>
- <div draggable="true"/>
- <div/>
+ <div/>
+ <div draggable="true"/>
+ <div/>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/038.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/038.xhtml
index db3f747ade5..d146ecf8abd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/038.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/038.xhtml
@@ -4,20 +4,20 @@
<title>Resetting drag image after element was added to dragstore</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelector('strong'));
- event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelector('strong'));
+ event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
</script>
</head>
<body>
<p><a href="data:text/plain,1" ondragstart="start(event)">Drag me</a></p>
<p>Try to drag link above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/039.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/039.xhtml
index 500f5dabe71..49ce01c9123 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/039.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/039.xhtml
@@ -4,20 +4,20 @@
<title>Resetting drag image during drag and drop of link</title>
<style type="text/css">
span, strong
- {color:green;
- background-color:yellow;}
+ {color:green;
+ background-color:yellow;}
strong
- {color:red;}
+ {color:red;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('strong'), 1, 1);
- event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('strong'), 1, 1);
+ event.dataTransfer.setDragImage(document.querySelector('span'), 1, 1);}
</script>
</head>
<body>
<p><a href="data:text/plain,1" ondragstart="start(event)">Drag me</a></p>
<p>Try to drag link above. You should see word <span>PASS</span> not <strong>FAIL</strong> in feedback overlay.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/040.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/040.xhtml
index 73ab31aacd1..0bad3d2f655 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/040.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/040.xhtml
@@ -4,28 +4,28 @@
<title>Cursor position and drag image</title>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('canvas'), 50, 50);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('canvas'), 50, 50);}
</script>
</head>
<body>
<p><a href="data:text/plain,1" ondragstart="start(event)">Drag me</a></p>
<p>Try to drag link above. Feedback overlay should be based on canvas below and mouse pointer should be anchored in its center.</p>
<p>
- <canvas width="100" height="100">Canvas</canvas>
+ <canvas width="100" height="100">Canvas</canvas>
</p>
<script type="application/ecmascript">
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/041.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/041.xhtml
index 2b1bc06369b..73e8c4dc3b7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/041.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/041.xhtml
@@ -4,14 +4,14 @@
<title>Cursor position and drag image after new element is added to dragstore</title>
<script type="application/ecmascript">
function start(event,element)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelectorAll('canvas')[element]);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelectorAll('canvas')[element]);}
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event,1)">Canvas</canvas>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event,0)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event,1)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event,0)">Canvas</canvas>
</p>
<p>Try to drag canvas above. Feedback overlay should include both canvases and mouse pointer should be anchored in dragged ones center.</p>
<script type="application/ecmascript">
@@ -19,17 +19,17 @@ var canvases = document.querySelectorAll('canvas');
paintCanvas(canvases[0],'navy');
paintCanvas(canvases[1],'green');
function paintCanvas(canvas,color)
- {var c = canvas.getContext('2d');
- for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?color:'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
- }
+ {var c = canvas.getContext('2d');
+ for(var x = 0; x != 50; x++)
+ {c.fillStyle = (x%2 == 0)?color:'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
+ }
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/042.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/042.html
index 8a7db0e5dbc..574153fc0d5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/042.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/042.html
@@ -31,22 +31,22 @@ window.onload = function() {
var passed = true, orange = document.getElementsByTagName('div')[1], blue = document.getElementsByTagName('div')[0], fuchsia = document.getElementsByTagName('div')[2];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('text/plain', 'PASS');
};
blue.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('text/plain', 'FAIL');
};
fuchsia.ondragenter = fuchsia.ondragover = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
};
- fuchsia.ondrop = function(e) {
- //it's possible this could get called twice if the browser drags both items, so it uses the "passed" variable to make sure
- //that if blue gets dropped first, it remains false when orange then gets dropped
- passed = passed && ( e.dataTransfer.getData('text/plain') == 'PASS' );
- document.getElementsByTagName('p')[0].innerHTML = passed ? 'PASS' : 'FAIL';
+ fuchsia.ondrop = function(e) {
+ //it's possible this could get called twice if the browser drags both items, so it uses the "passed" variable to make sure
+ //that if blue gets dropped first, it remains false when orange then gets dropped
+ passed = passed && ( e.dataTransfer.getData('text/plain') == 'PASS' );
+ document.getElementsByTagName('p')[0].innerHTML = passed ? 'PASS' : 'FAIL';
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/043.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/043.html
index 3b8093244d8..49108b9dbb2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/043.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/043.html
@@ -35,27 +35,27 @@ window.onload = function() {
var passed = true, orange = document.getElementsByTagName('div')[1], blue = document.getElementsByTagName('div')[0], fuchsia = document.getElementsByTagName('div')[2];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('text/plain', 'child targeted');
};
blue.ondragstart = function(e) {
- if( e.target == this ) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text/plain', 'parent targeted');
- } else {
- e.dataTransfer.setData('extra/data', 'parent bubble');
- }
+ if( e.target == this ) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text/plain', 'parent targeted');
+ } else {
+ e.dataTransfer.setData('extra/data', 'parent bubble');
+ }
};
fuchsia.ondragenter = fuchsia.ondragover = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
};
- fuchsia.ondrop = function(e) {
- e.preventDefault();
- //it's possible this could get called twice if the browser drags both items, so it uses the "passed" variable to make sure
- //that if blue gets dropped first, it remains false when orange then gets dropped
- passed = passed && ( e.dataTransfer.getData('text/plain') == 'child targeted' ) && ( e.dataTransfer.getData('extra/data') == 'parent bubble' );
- document.getElementsByTagName('p')[0].innerHTML = passed ? 'PASS' : 'FAIL';
+ fuchsia.ondrop = function(e) {
+ e.preventDefault();
+ //it's possible this could get called twice if the browser drags both items, so it uses the "passed" variable to make sure
+ //that if blue gets dropped first, it remains false when orange then gets dropped
+ passed = passed && ( e.dataTransfer.getData('text/plain') == 'child targeted' ) && ( e.dataTransfer.getData('extra/data') == 'parent bubble' );
+ document.getElementsByTagName('p')[0].innerHTML = passed ? 'PASS' : 'FAIL';
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/044.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/044.html
index a24ca2b7b38..6632738207a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/044.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/044.html
@@ -24,17 +24,17 @@ window.onload = function() {
var orange = document.getElementsByTagName('div')[0], fuchsia = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('extra/data', 'parent bubble');
};
fuchsia.ondragenter = fuchsia.ondragover = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
};
- fuchsia.ondrop = function(e) {
- e.preventDefault();
- var passed = ( e.dataTransfer.getData('text/plain') == 'text dummy' ) && ( e.dataTransfer.getData('extra/data') == 'parent bubble' );
- document.getElementsByTagName('p')[0].innerHTML = passed ? 'PASS' : 'FAIL';
+ fuchsia.ondrop = function(e) {
+ e.preventDefault();
+ var passed = ( e.dataTransfer.getData('text/plain') == 'text dummy' ) && ( e.dataTransfer.getData('extra/data') == 'parent bubble' );
+ document.getElementsByTagName('p')[0].innerHTML = passed ? 'PASS' : 'FAIL';
};
var range = document.createRange();
range.selectNodeContents(orange);
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/045.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/045.html
index 80cd27c2835..1efed6a110e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/045.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/045.html
@@ -32,16 +32,16 @@ window.onload = function() {
var orange = document.getElementsByTagName('div')[0], fuchsia = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('text/plain', 'FAIL');
};
fuchsia.ondragenter = fuchsia.ondragover = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
};
- fuchsia.ondrop = function(e) {
- e.preventDefault();
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL';
+ fuchsia.ondrop = function(e) {
+ e.preventDefault();
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL';
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/046.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/046.html
index 89d67cd7bf0..8d03cd5d95e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/046.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/046.html
@@ -32,16 +32,16 @@ window.onload = function() {
var orange = document.getElementsByTagName('div')[0], fuchsia = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('text/plain', 'FAIL');
};
fuchsia.ondragenter = fuchsia.ondragover = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
};
- fuchsia.ondrop = function(e) {
- e.preventDefault();
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL';
+ fuchsia.ondrop = function(e) {
+ e.preventDefault();
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL';
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/047.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/047.html
index 10f167a871c..9b4c09ab935 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/047.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/047.html
@@ -32,16 +32,16 @@ window.onload = function() {
var orange = document.getElementsByTagName('div')[0], fuchsia = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('text/plain', 'FAIL');
};
fuchsia.ondragenter = fuchsia.ondragover = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
};
- fuchsia.ondrop = function(e) {
- e.preventDefault();
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL';
+ fuchsia.ondrop = function(e) {
+ e.preventDefault();
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL';
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/048.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/048.html
index d319fa27239..54bb72c5ed4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/048.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/048.html
@@ -32,16 +32,16 @@ window.onload = function() {
var orange = document.getElementsByTagName('div')[0], fuchsia = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('text/plain', 'FAIL');
};
fuchsia.ondragenter = fuchsia.ondragover = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
};
- fuchsia.ondrop = function(e) {
- e.preventDefault();
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL';
+ fuchsia.ondrop = function(e) {
+ e.preventDefault();
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL';
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/049.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/049.xhtml
index 4f63d6ebaa9..70c57acea7d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/049.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/049.xhtml
@@ -4,14 +4,14 @@
<title>Drag feedback for partly visible image: negative margins</title>
<style type="text/css">
p:first-child
- {margin:-50px 0 0 -50px;}
+ {margin:-50px 0 0 -50px;}
img
- {height:100px;
- width:100px;}
+ {height:100px;
+ width:100px;}
</style>
</head>
<body>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEElEQVR42mNgaGD4D8YwBgAw9AX9Y9zBwwAAAABJRU5ErkJggg==" alt="PNG green pixel" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Try to drag green box above. Feedback overlay should be green square.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/050.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/050.xhtml
index 112fbd0a78c..28f218f8134 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/050.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/050.xhtml
@@ -4,18 +4,18 @@
<title>Drag feedback for partly visible image: relative position</title>
<style type="text/css">
p:first-child
- {margin:0;
- position:relative;
- top:-50px;
- left:-50px;}
+ {margin:0;
+ position:relative;
+ top:-50px;
+ left:-50px;}
img
- {display:block;
- height:100px;
- width:100px;}
+ {display:block;
+ height:100px;
+ width:100px;}
</style>
</head>
<body>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEElEQVR42mNgaGD4D8YwBgAw9AX9Y9zBwwAAAABJRU5ErkJggg==" alt="PNG green pixel" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Try to drag green box above. Feedback overlay should be green square.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/051.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/051.xhtml
index befd0779098..fc85f014803 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/051.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/051.xhtml
@@ -4,18 +4,18 @@
<title>Drag feedback for partly visible image: absolute position</title>
<style type="text/css">
img
- {position:absolute;
- top:-50px;
- left:-50px;}
+ {position:absolute;
+ top:-50px;
+ left:-50px;}
p + p
- {margin-top:100px;}
+ {margin-top:100px;}
img
- {height:100px;
- width:100px;}
+ {height:100px;
+ width:100px;}
</style>
</head>
<body>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEElEQVR42mNgaGD4D8YwBgAw9AX9Y9zBwwAAAABJRU5ErkJggg==" alt="PNG green pixel" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Try to drag green box above. Feedback overlay should be green square.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/052.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/052.xhtml
index 36e9e704c8f..af40bf20b23 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/052.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/052.xhtml
@@ -4,18 +4,18 @@
<title>Drag feedback for partly visible image: fixed position</title>
<style type="text/css">
img
- {position:fixed;
- top:-50px;
- left:-50px;}
+ {position:fixed;
+ top:-50px;
+ left:-50px;}
p + p
- {margin-top:100px;}
+ {margin-top:100px;}
img
- {height:100px;
- width:100px;}
+ {height:100px;
+ width:100px;}
</style>
</head>
<body>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEElEQVR42mNgaGD4D8YwBgAw9AX9Y9zBwwAAAABJRU5ErkJggg==" alt="PNG green pixel" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Try to drag green box above. Feedback overlay should be green square.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/053.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/053.xhtml
index b66a6e6f6ed..2d427fdcc2a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/053.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/053.xhtml
@@ -4,14 +4,14 @@
<title>Drag feedback for partly visible element: negative margins</title>
<style type="text/css">
div
- {margin:-160px 0 0 -160px;
- height:200px;
- width:200px;
- background-color:navy;}
+ {margin:-160px 0 0 -160px;
+ height:200px;
+ width:200px;
+ background-color:navy;}
</style>
</head>
<body>
<div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/>
<p>Try to drag blue box above. Feedback overlay should be square.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/054.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/054.xhtml
index 2b34d647e15..f46c3251180 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/054.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/054.xhtml
@@ -4,16 +4,16 @@
<title>Drag feedback for partly visible element: relative position</title>
<style type="text/css">
div
- {position:relative;
- top:-150px;
- left:-150px;
- height:200px;
- width:200px;
- background-color:navy;}
+ {position:relative;
+ top:-150px;
+ left:-150px;
+ height:200px;
+ width:200px;
+ background-color:navy;}
</style>
</head>
<body>
<div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/>
<p>Try to drag blue box above. Feedback overlay should be square.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/055.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/055.xhtml
index 93df7ebc36e..d693a60b9be 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/055.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/055.xhtml
@@ -4,18 +4,18 @@
<title>Drag feedback for partly visible element: absolute position</title>
<style type="text/css">
div
- {position:absolute;
- top:-150px;
- left:-150px;
- height:200px;
- width:200px;
- background-color:navy;}
+ {position:absolute;
+ top:-150px;
+ left:-150px;
+ height:200px;
+ width:200px;
+ background-color:navy;}
p
- {margin-top:100px;}
+ {margin-top:100px;}
</style>
</head>
<body>
<div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/>
<p>Try to drag blue box above. Feedback overlay should be square.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/056.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/056.xhtml
index 838d4389178..77e86f97fbc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/056.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/056.xhtml
@@ -4,18 +4,18 @@
<title>Drag feedback for partly visible element: fixed position</title>
<style type="text/css">
div
- {position:fixed;
- top:-150px;
- left:-150px;
- height:200px;
- width:200px;
- background-color:navy;}
+ {position:fixed;
+ top:-150px;
+ left:-150px;
+ height:200px;
+ width:200px;
+ background-color:navy;}
p
- {margin-top:100px;}
+ {margin-top:100px;}
</style>
</head>
<body>
<div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/>
<p>Try to drag blue box above. Feedback overlay should be square.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/057.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/057.xhtml
index 5f5805b2eb7..0e22142f196 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/057.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/057.xhtml
@@ -4,17 +4,17 @@
<title>Drag feedback for partly visible float: negative margins</title>
<style type="text/css">
p
- {margin-top:0;}
+ {margin-top:0;}
div
- {float:left;
- margin:-150px 0 0 -150px;
- height:200px;
- width:200px;
- background-color:navy;}
+ {float:left;
+ margin:-150px 0 0 -150px;
+ height:200px;
+ width:200px;
+ background-color:navy;}
</style>
</head>
<body>
<div draggable="true" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/>
<p>Try to drag blue box above. Feedback overlay should be square.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/058.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/058.html
index 560c6fdfefc..2fa4b60fb6c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/058.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/058.html
@@ -2,28 +2,28 @@
<title>drag &amp; drop - dragging elements by children that extend out of them</title>
<style type="text/css">
div {
- height: 200px;
- width: 200px;
- background: blue;
- white-space: nowrap;
+ height: 200px;
+ width: 200px;
+ background: blue;
+ white-space: nowrap;
}
span {
- display: inline-block;
- width: 210px;
- height: 100px;
+ display: inline-block;
+ width: 210px;
+ height: 100px;
}
span + span {
- background: orange;
- width: 100px;
+ background: orange;
+ width: 100px;
}
</style>
<script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
</script>
<div draggable="true"><span></span><span></span></div>
-<p>Drag the orange square sideways. Pass if the drag placeholder shows that both the blue and orange squares are being dragged.</p> \ No newline at end of file
+<p>Drag the orange square sideways. Pass if the drag placeholder shows that both the blue and orange squares are being dragged.</p>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/059.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/059.html
index db6572033c6..0afb72e029e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/059.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/059.html
@@ -2,19 +2,19 @@
<title>drag &amp; drop - dragging elements by text that extends out of them</title>
<style type="text/css">
div {
- height: 200px;
- width: 200px;
- background: blue;
- white-space: nowrap;
+ height: 200px;
+ width: 200px;
+ background: blue;
+ white-space: nowrap;
}
</style>
<script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
</script>
<div draggable="true">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Drag me</div>
-<p>Drag the above text sideways. Pass if the drag placeholder shows that both the text and blue square are being dragged.</p> \ No newline at end of file
+<p>Drag the above text sideways. Pass if the drag placeholder shows that both the text and blue square are being dragged.</p>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/060.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/060.html
index b8d169f0e64..0a90cadd4a3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/060.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/060.html
@@ -2,29 +2,29 @@
<title>drag &amp; drop - dragging elements by children that are positioned outside them</title>
<style type="text/css">
div {
- height: 200px;
- width: 200px;
- background: blue;
- white-space: nowrap;
- position: relative;
+ height: 200px;
+ width: 200px;
+ background: blue;
+ white-space: nowrap;
+ position: relative;
}
span {
- display: block;
- top: 0;
- left: 210px;
- position: absolute;
- width: 100px;
- height: 100px;
- background: orange;
+ display: block;
+ top: 0;
+ left: 210px;
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ background: orange;
}
</style>
<script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
</script>
<div draggable="true"><span></span></div>
-<p>Drag the orange square sideways. Pass if the drag placeholder shows that both the blue and orange squares are being dragged.</p> \ No newline at end of file
+<p>Drag the orange square sideways. Pass if the drag placeholder shows that both the blue and orange squares are being dragged.</p>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/061.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/061.html
index b1665171f08..3081676bf09 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/061.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/061.html
@@ -2,29 +2,29 @@
<title>drag &amp; drop - dragging elements by overflowing children that are positioned outside them</title>
<style type="text/css">
div {
- height: 200px;
- width: 200px;
- background: blue;
- white-space: nowrap;
- position: relative;
+ height: 200px;
+ width: 200px;
+ background: blue;
+ white-space: nowrap;
+ position: relative;
}
span {
- display: block;
- top: 0;
- left: 210px;
- position: absolute;
- width: 100px;
- height: 100px;
- background: yellow;
+ display: block;
+ top: 0;
+ left: 210px;
+ position: absolute;
+ width: 100px;
+ height: 100px;
+ background: yellow;
}
</style>
<script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
</script>
<div draggable="true"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Drag me</span></div>
-<p>Drag the above text sideways. Pass if the drag placeholder shows that the text and both the yellow and blue squares are being dragged.</p> \ No newline at end of file
+<p>Drag the above text sideways. Pass if the drag placeholder shows that the text and both the yellow and blue squares are being dragged.</p>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/062.html b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/062.html
index 43fc8342d0b..d48577e451e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/overlay/062.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/overlay/062.html
@@ -1,8 +1,8 @@
<!doctype html>
<html>
- <head>
- <title>Selection spanning hidden elements</title>
- <script type="text/javascript">
+ <head>
+ <title>Selection spanning hidden elements</title>
+ <script type="text/javascript">
window.onload = function () {
var range = document.createRange(), p = document.getElementsByTagName('p')[0];
range.selectNodeContents(p);
@@ -10,13 +10,13 @@ window.onload = function () {
range.setEnd(p.lastChild.firstChild,5);
window.getSelection().addRange(range);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p><span style="display:none">FAILPASS_</span>drag<span style="display:none">_THIS_</span>text<span style="display:none">_PASSFAIL</span></p>
- <p><textarea rows="3" cols="50"></textarea></p>
- <p>Drag the selected text into the input box. The drag placeholder should match the visible text that is being dragged. When dropped, either &quot;dragtext&quot; or &quot;PASS_drag_THIS_text_PASS&quot; should appear in the input.</p>
+ <p><span style="display:none">FAILPASS_</span>drag<span style="display:none">_THIS_</span>text<span style="display:none">_PASSFAIL</span></p>
+ <p><textarea rows="3" cols="50"></textarea></p>
+ <p>Drag the selected text into the input box. The drag placeholder should match the visible text that is being dragged. When dropped, either &quot;dragtext&quot; or &quot;PASS_drag_THIS_text_PASS&quot; should appear in the input.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/alttab.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/alttab.html
index c3375d3d840..b03c5dfd6ab 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/alttab.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/alttab.html
@@ -1,12 +1,12 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - alt+tab while dragging</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - alt+tab while dragging</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where alt+tab (or some equivalent) switches applications.</p>
- <p>Ensure that at least one other application is open. Select this text. Drag the selection downwards a little, then alt+tab (or your system's equivalent) to the other application. Pass if the drag placeholder continues to follow the mouse/pointing device. Release the drag. Pass if the drag placeholder disappears.</p>
+ <p>This test is only relevant on platforms where alt+tab (or some equivalent) switches applications.</p>
+ <p>Ensure that at least one other application is open. Select this text. Drag the selection downwards a little, then alt+tab (or your system's equivalent) to the other application. Pass if the drag placeholder continues to follow the mouse/pointing device. Release the drag. Pass if the drag placeholder disappears.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cancel-middle-click.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cancel-middle-click.html
index 4136e2be711..40fcff41fc1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cancel-middle-click.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cancel-middle-click.html
@@ -1,50 +1,50 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with middle click</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with middle click</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: orange;
- float: left;
+ width: 100px;
+ height: 100px;
+ background: orange;
+ float: left;
}
div + div {
- background: blue;
+ background: blue;
}
div + div + div {
- background: fuchsia;
+ background: fuchsia;
}
ol {
- clear: left;
+ clear: left;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the orange square over the blue square.</li>
- <li>Without releasing the drag, click the middle mouse button.</li>
- <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled;<ul>
- <li>The drag placeholder should disappear, and the cursor should return to the normal mouse cursor.</li>
- <li>Move the mouse over the pink square and release the drag. The mouse cursor should remain the normal mouse cursor.</li>
- </ul></li>
- <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled;<ul>
- <li>The drag placeholder should not disappear, and the cursor should be the no-drop cursor.</li>
- <li>Move the mouse over the pink square and release the drag. The drag placeholder should disappear, and the cursor should return to the normal mouse cursor.</li>
- </ul></li>
- <li>Fail in either case if an inappropriate middle click function begins (eg. paste-and-go).</li>
- </ol>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the orange square over the blue square.</li>
+ <li>Without releasing the drag, click the middle mouse button.</li>
+ <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled;<ul>
+ <li>The drag placeholder should disappear, and the cursor should return to the normal mouse cursor.</li>
+ <li>Move the mouse over the pink square and release the drag. The mouse cursor should remain the normal mouse cursor.</li>
+ </ul></li>
+ <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled;<ul>
+ <li>The drag placeholder should not disappear, and the cursor should be the no-drop cursor.</li>
+ <li>Move the mouse over the pink square and release the drag. The drag placeholder should disappear, and the cursor should return to the normal mouse cursor.</li>
+ </ul></li>
+ <li>Fail in either case if an inappropriate middle click function begins (eg. paste-and-go).</li>
+ </ol>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cancel-right-click.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cancel-right-click.html
index 85416da52fc..e5159716f4f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cancel-right-click.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cancel-right-click.html
@@ -1,50 +1,50 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with right click</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with right click</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: orange;
- float: left;
+ width: 100px;
+ height: 100px;
+ background: orange;
+ float: left;
}
div + div {
- background: blue;
+ background: blue;
}
div + div + div {
- background: fuchsia;
+ background: fuchsia;
}
ol {
- clear: left;
+ clear: left;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the orange square over the blue square.</li>
- <li>Without releasing the drag, click the right mouse button.</li>
- <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled;<ul>
- <li>The drag placeholder should disappear, and the cursor should return to the normal mouse cursor.</li>
- <li>Move the mouse over the pink square and release the drag. The mouse cursor should remain the normal mouse cursor.</li>
- </ul></li>
- <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled;<ul>
- <li>The drag placeholder should not disappear, and the cursor should be the no-drop cursor.</li>
- <li>Move the mouse over the pink square and release the drag. The drag placeholder should disappear, and the cursor should return to the normal mouse cursor.</li>
- </ul></li>
- <li>Fail in either case if an inappropriate right click function begins (eg. context menu opens).</li>
- </ol>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the orange square over the blue square.</li>
+ <li>Without releasing the drag, click the right mouse button.</li>
+ <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled;<ul>
+ <li>The drag placeholder should disappear, and the cursor should return to the normal mouse cursor.</li>
+ <li>Move the mouse over the pink square and release the drag. The mouse cursor should remain the normal mouse cursor.</li>
+ </ul></li>
+ <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled;<ul>
+ <li>The drag placeholder should not disappear, and the cursor should be the no-drop cursor.</li>
+ <li>Move the mouse over the pink square and release the drag. The drag placeholder should disappear, and the cursor should return to the normal mouse cursor.</li>
+ </ul></li>
+ <li>Fail in either case if an inappropriate right click function begins (eg. context menu opens).</li>
+ </ol>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-001.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-001.html
index ed275943c45..fc8db3db7d7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-001.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-001.html
@@ -6,19 +6,19 @@ p.gone + ul { display: block; }
</style>
<script type="text/javascript">
window.onload = function() {
- if( location.href.match(/#popup$/) ) { document.getElementsByTagName('p')[0].className = 'gone'; }
+ if( location.href.match(/#popup$/) ) { document.getElementsByTagName('p')[0].className = 'gone'; }
document.getElementsByTagName('ul')[0].ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- setTimeout(function () { window.close(); },100);
+ setTimeout(function () { window.close(); },100);
};
};
</script>
<p><a href="javascript:alert('Click the link normally');" onclick="window.open('close-drag-001.html#popup','_blank');return false;">Open this page in a popup</a>.</p>
<ul draggable='true'>
- <li>Drag this text downwards, and do not release the drag.</li>
- <li>The browser may optionally cancel the drag. The browser may optionally close the popup. Fail if the drag placeholder gets stuck. Fail if the browser crashes. Fail if anything horrible happens. Fail if your pet kitten gets sick.</li>
- <li>Release the drag.</li>
- <li>Fail if the drag placeholder gets stuck. Fail if the browser crashes.</li>
+ <li>Drag this text downwards, and do not release the drag.</li>
+ <li>The browser may optionally cancel the drag. The browser may optionally close the popup. Fail if the drag placeholder gets stuck. Fail if the browser crashes. Fail if anything horrible happens. Fail if your pet kitten gets sick.</li>
+ <li>Release the drag.</li>
+ <li>Fail if the drag placeholder gets stuck. Fail if the browser crashes.</li>
</ul>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-002.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-002.html
index 3ca09e8b54f..35e8a5a5370 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-002.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-002.html
@@ -6,20 +6,20 @@ p.gone + ul { display: block; }
</style>
<script type="text/javascript">
window.onload = function() {
- if( location.href.match(/#popup$/) ) { document.getElementsByTagName('p')[0].className = 'gone'; }
+ if( location.href.match(/#popup$/) ) { document.getElementsByTagName('p')[0].className = 'gone'; }
document.getElementsByTagName('ul')[0].ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- setTimeout(function () { window.close(); },100);
+ setTimeout(function () { window.close(); },100);
};
};
</script>
<p><a href="javascript:alert('Click the link normally');" onclick="window.open('close-drag-002.html#popup','_blank');return false;">Open this page in a popup</a>.</p>
<ul draggable='true'>
- <li>Close all pages/browser windows except the popup.</li>
- <li>Drag this text downwards, and do not release the drag.</li>
- <li>The browser may optionally cancel the drag. The browser may optionally close the popup/window. Fail if the drag placeholder gets stuck. Fail if the browser crashes. Fail if anything horrible happens. Fail if zombie Michael Jackson resurects.</li>
- <li>Release the drag.</li>
- <li>Fail if the drag placeholder gets stuck. Fail if the browser crashes.</li>
+ <li>Close all pages/browser windows except the popup.</li>
+ <li>Drag this text downwards, and do not release the drag.</li>
+ <li>The browser may optionally cancel the drag. The browser may optionally close the popup/window. Fail if the drag placeholder gets stuck. Fail if the browser crashes. Fail if anything horrible happens. Fail if zombie Michael Jackson resurects.</li>
+ <li>Release the drag.</li>
+ <li>Fail if the drag placeholder gets stuck. Fail if the browser crashes.</li>
</ul>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-003.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-003.html
index 6d67ac1feb1..7a118a2208b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-003.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-003.html
@@ -6,23 +6,23 @@ p.gone + ul { display: block; }
</style>
<script type="text/javascript">
window.onload = function() {
- if( location.href.match(/#popup$/) ) { document.getElementsByTagName('p')[0].className = 'gone'; }
+ if( location.href.match(/#popup$/) ) { document.getElementsByTagName('p')[0].className = 'gone'; }
document.getElementsByTagName('ul')[0].ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- setTimeout(function () { window.close(); },2000);
+ setTimeout(function () { window.close(); },2000);
};
};
</script>
<p><a href="javascript:alert('Click the link normally');" onclick="window.open('close-drag-003.html#popup','_blank');return false;">Open this page in a popup</a>.</p>
<ul draggable='true'>
- <li>Close all pages/browser windows except the popup.</li>
- <li>Ensure that the browser window is not maximised.</li>
- <li>Quickly drag this text out of the browser window (not over the taskbar), and do not release the drag.</li>
- <li>The browser may optionally cancel the drag. The browser may optionally close the popup/window. Fail if the drag placeholder gets stuck. Fail if the browser crashes. Fail if anything horrible happens. Fail if your grandmother does not invite you over for Christmas.</li>
- <li>After 2 seconds, fail if the address field shows that the page has closed, but it is still visibly rendered.</li>
- <li>Continue dragging back into the browser window (if it is still open).</li>
- <li>Release the drag.</li>
- <li>Fail if the drag placeholder gets stuck. Fail if the browser crashes or hangs.</li>
+ <li>Close all pages/browser windows except the popup.</li>
+ <li>Ensure that the browser window is not maximised.</li>
+ <li>Quickly drag this text out of the browser window (not over the taskbar), and do not release the drag.</li>
+ <li>The browser may optionally cancel the drag. The browser may optionally close the popup/window. Fail if the drag placeholder gets stuck. Fail if the browser crashes. Fail if anything horrible happens. Fail if your grandmother does not invite you over for Christmas.</li>
+ <li>After 2 seconds, fail if the address field shows that the page has closed, but it is still visibly rendered.</li>
+ <li>Continue dragging back into the browser window (if it is still open).</li>
+ <li>Release the drag.</li>
+ <li>Fail if the drag placeholder gets stuck. Fail if the browser crashes or hangs.</li>
</ul>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-004.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-004.html
index 49337e2b853..c93f5a35088 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-004.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-004.html
@@ -6,17 +6,17 @@ p.gone + ul { display: block; }
</style>
<script type="text/javascript">
window.onload = function() {
- if( location.href.match(/#popup$/) ) { document.getElementsByTagName('p')[0].className = 'gone'; }
+ if( location.href.match(/#popup$/) ) { document.getElementsByTagName('p')[0].className = 'gone'; }
document.getElementsByTagName('ul')[0].ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
};
};
</script>
<p><a href="#popup" target="_blank">Open this page in a new tab</a>.</p>
<ul draggable='true'>
- <li>Drag this text downwards, and do not release the drag.</li>
- <li>Use a keyboard shortcut (eg. Ctrl+W on Windows) to close the tab.</li>
- <li>The browser may optionally cancel the drag. The browser may optionally close the tab. Fail if the drag placeholder gets stuck. Fail if the browser crashes.</li>
+ <li>Drag this text downwards, and do not release the drag.</li>
+ <li>Use a keyboard shortcut (eg. Ctrl+W on Windows) to close the tab.</li>
+ <li>The browser may optionally cancel the drag. The browser may optionally close the tab. Fail if the drag placeholder gets stuck. Fail if the browser crashes.</li>
</ul>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-005.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-005.html
index 3f6b479af07..1a364113a39 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-005.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-005.html
@@ -3,14 +3,14 @@
<script type="text/javascript">
window.onload = function() {
document.getElementsByTagName('ul')[0].ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
};
};
</script>
<ul draggable='true'>
- <li>Drag this text downwards, and do not release the drag.</li>
- <li>Use a keyboard shortcut (eg. Alt+F4 on Windows) to close the window.</li>
- <li>The browser may optionally cancel the drag. The browser may optionally close the window. Fail if the drag placeholder gets stuck. Fail if the browser crashes.</li>
+ <li>Drag this text downwards, and do not release the drag.</li>
+ <li>Use a keyboard shortcut (eg. Alt+F4 on Windows) to close the window.</li>
+ <li>The browser may optionally cancel the drag. The browser may optionally close the window. Fail if the drag placeholder gets stuck. Fail if the browser crashes.</li>
</ul>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-006.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-006.html
index 4e00a847242..12f95349e8f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-006.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/close-drag-006.html
@@ -6,20 +6,20 @@ p.gone + ul { display: block; }
</style>
<script type="text/javascript">
window.onload = function() {
- if( location.href.match(/#popup$/) ) { document.getElementsByTagName('p')[0].className = 'gone'; }
+ if( location.href.match(/#popup$/) ) { document.getElementsByTagName('p')[0].className = 'gone'; }
document.getElementsByTagName('ul')[0].ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
- setTimeout(function () { window.close(); },2000);
+ setTimeout(function () { window.close(); },2000);
};
};
</script>
<p><a href="javascript:alert('Click the link normally');" onclick="window.open('close-drag-006.html#popup','_blank');return false;">Open this page in a popup</a>.</p>
<ul draggable='true'>
- <li>Ensure the browser window is not maximised.</li>
- <li>Quickly drag this text upwards out of the browser window, and do not release the drag.</li>
- <li>This tab should close after a couple of seconds.</li>
- <li>Dragging downwards over the browser window's title bar, then release the drag.</li>
- <li>Fail if the drag placeholder gets stuck. Fail if the browser crashes.</li>
+ <li>Ensure the browser window is not maximised.</li>
+ <li>Quickly drag this text upwards out of the browser window, and do not release the drag.</li>
+ <li>This tab should close after a couple of seconds.</li>
+ <li>Dragging downwards over the browser window's title bar, then release the drag.</li>
+ <li>Fail if the drag placeholder gets stuck. Fail if the browser crashes.</li>
</ul>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/003.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/003.html
index a1a5c491871..3e4407ff69a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/003.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/003.html
@@ -23,7 +23,7 @@
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/004.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/004.html
index 640ad37caa4..8bd8dbfd5e7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/004.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/004.html
@@ -26,7 +26,7 @@
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/005.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/005.html
index 9aa78f25a33..d5b33788276 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/005.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/005.html
@@ -23,15 +23,15 @@
window.onload = function() {
var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
};
blue.ondragenter = blue.ondragover = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'none';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'none';
};
blue.ondrop = function(e) {
- e.preventDefault();
+ e.preventDefault();
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/006.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/006.html
index 61eb8ec30fb..1d36e2e6ad2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/006.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/006.html
@@ -23,15 +23,15 @@
window.onload = function() {
var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
};
blue.ondragenter = blue.ondragover = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
};
blue.ondrop = function(e) {
- e.preventDefault();
+ e.preventDefault();
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/007.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/007.html
index c2abfaa310b..70b9506637d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/007.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/007.html
@@ -23,15 +23,15 @@
window.onload = function() {
var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'move';
+ e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('Text', 'dummy text');
};
blue.ondragenter = blue.ondragover = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'move';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'move';
};
blue.ondrop = function(e) {
- e.preventDefault();
+ e.preventDefault();
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/008.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/008.html
index 53b84346774..827e636ceef 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/008.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/008.html
@@ -27,16 +27,16 @@
window.onload = function() {
var blue = document.getElementsByTagName('div')[1], fuchsia = document.getElementsByTagName('div')[2];
blue.ondragenter = blue.ondragover = function(e) {
- //this test assumes the browser will default to opening the file if the page does not want it
- e.preventDefault();
- e.dataTransfer.dropEffect = 'none';
+ //this test assumes the browser will default to opening the file if the page does not want it
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'none';
};
fuchsia.ondragenter = fuchsia.ondragover = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
};
fuchsia.ondrop = function(e) {
- e.preventDefault();
+ e.preventDefault();
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/009.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/009.html
index 4f09539322c..7917ba320e6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/009.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/009.html
@@ -23,15 +23,15 @@
window.onload = function() {
var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'link';
+ e.dataTransfer.effectAllowed = 'link';
e.dataTransfer.setData('Text', 'dummy text');
};
blue.ondragenter = blue.ondragover = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'link';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'link';
};
blue.ondrop = function(e) {
- e.preventDefault();
+ e.preventDefault();
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/010.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/010.html
index bcc408e8039..d62bcba27aa 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/010.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/010.html
@@ -13,7 +13,7 @@
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'link';
+ e.dataTransfer.effectAllowed = 'link';
e.dataTransfer.setData('Text', 'dummy text');
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/011.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/011.html
index 15f78849f91..657245ebaeb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/011.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/cursors/011.html
@@ -18,28 +18,28 @@
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'all';
+ e.dataTransfer.effectAllowed = 'all';
e.dataTransfer.setData('Text', 'dummy text');
};
var copydiv = document.getElementsByTagName('div')[1];
copydiv.ondragenter = copydiv.ondragover = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'copy';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'copy';
};
var movediv = document.getElementsByTagName('div')[2];
movediv.ondragenter = movediv.ondragover = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'move';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'move';
};
var linkdiv = document.getElementsByTagName('div')[3];
linkdiv.ondragenter = linkdiv.ondragover = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'link';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'link';
};
var nodrop = document.getElementsByTagName('div')[4];
nodrop.ondragenter = nodrop.ondragover = function(e) {
- e.preventDefault();
- e.dataTransfer.dropEffect = 'none';
+ e.preventDefault();
+ e.dataTransfer.dropEffect = 'none';
};
};
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-keypress.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-keypress.html
index adb543ad424..113c10dc686 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-keypress.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-keypress.html
@@ -10,19 +10,19 @@
height: 5000px;
}
p {
- margin-top: 1000px;
+ margin-top: 1000px;
}
</style>
<script>
window.onload = function() {
- window.scrollBy(0,1000);
+ window.scrollBy(0,1000);
document.getElementsByTagName('div')[0].ondragstart = function(e) {
e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text', 'dummy text');
+ e.dataTransfer.setData('text', 'dummy text');
};
};
</script>
<noscript>Enable JavaScript and reload</noscript>
<p>Drag the orange square. While still dragging, press the Tab key on your keyboard. Fail if the page scrolls.</p>
-<div draggable="true"></div> \ No newline at end of file
+<div draggable="true"></div>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-link.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-link.html
index c308d504f25..2da41950831 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-link.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-link.html
@@ -1,12 +1,12 @@
<!doctype html>
<html>
- <head>
- <title>Dragging vs selecting links</title>
- </head>
- <body>
+ <head>
+ <title>Dragging vs selecting links</title>
+ </head>
+ <body>
- <p><a href="">Test link, test link, test link, test link, test link, test link, test link, test link, test link</a></p>
- <p>Drag the test link above. When dragging vertically, it should drag the link. When dragging horizontally, it should select the text within the link.</p>
+ <p><a href="">Test link, test link, test link, test link, test link, test link, test link, test link, test link</a></p>
+ <p>Drag the test link above. When dragging vertically, it should drag the link. When dragging horizontally, it should select the text within the link.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-to-title.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-to-title.html
index b7fe31c131d..fee1299b838 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-to-title.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/drag-to-title.html
@@ -2,15 +2,15 @@
<title>Dropping onto the title bar and UI</title>
<script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('ul')[0].ondragstart = function () {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','c');
- };
+ document.getElementsByTagName('ul')[0].ondragstart = function () {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','c');
+ };
};
</script>
<ul draggable="true">
- <li>Drag this text upwards to the browser window's title bar.</li>
- <li>Release the drag. Fail if the drag placeholder does not disappear.</li>
- <li>Start dragging again over a blank part of the page (below the text). Fail if the placeholder starts following the mouse again.</li>
- <li>Release the drag over the browser's UI (e.g. the address bar). Fail if the browser crashes.</li>
-</ul> \ No newline at end of file
+ <li>Drag this text upwards to the browser window's title bar.</li>
+ <li>Release the drag. Fail if the drag placeholder does not disappear.</li>
+ <li>Start dragging again over a blank part of the page (below the text). Fail if the placeholder starts following the mouse again.</li>
+ <li>Release the drag over the browser's UI (e.g. the address bar). Fail if the browser crashes.</li>
+</ul>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-drop-position.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-drop-position.html
index 62115c7cf36..7657f359b63 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-drop-position.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-drop-position.html
@@ -10,10 +10,10 @@
<script>
window.onload = function() {
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
- e.preventDefault();
- };
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragover = orange.ondragenter = orange.ondrop = function(e) {
+ e.preventDefault();
+ };
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-os-to-os.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-os-to-os.html
index b3db18077b5..a67905d888f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-os-to-os.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-os-to-os.html
@@ -1,13 +1,13 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - dragging items from the OS to the OS, via the browser window</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - dragging items from the OS to the OS, via the browser window</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
- <p>This testcase requires an external application that accepts dragging and dropping of files - eg. your system's file manager. Ensure that two application windows are open for the external application, showing different folders.</p>
- <p>Select a file in the first external application window. Drag the file over the browser window, then over the other external application window and release it. Pass if the file is copied/moved to the second window, as expected by the system.</p>
+ <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
+ <p>This testcase requires an external application that accepts dragging and dropping of files - eg. your system's file manager. Ensure that two application windows are open for the external application, showing different folders.</p>
+ <p>Select a file in the first external application window. Drag the file over the browser window, then over the other external application window and release it. Pass if the file is copied/moved to the second window, as expected by the system.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-to-system.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-to-system.html
index af9840e8c44..f80d5f43c20 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-to-system.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/file-to-system.html
@@ -1,50 +1,50 @@
<!doctype html>
<html>
- <head>
- <title>Dragging a file to the system</title>
- <style type="text/css">
+ <head>
+ <title>Dragging a file to the system</title>
+ <style type="text/css">
span { display: inline-block; height: 100px; width: 100px; background: orange; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var drag = document.getElementsByTagName('span')[0];
- drag.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'copy';
- var filein = document.getElementsByTagName('input')[0];
- if( !filein.files ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
- return;
- }
- if( !filein.files[0] ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
- return;
- }
- var thefile = filein.files[0];
- try {
- e.dataTransfer.items.add(thefile);
- } catch(err) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
- e.preventDefault();
- return;
- }
- if( e.dataTransfer.files.length != 1 ) {
- document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
- e.preventDefault();
- }
- };
+ var drag = document.getElementsByTagName('span')[0];
+ drag.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'copy';
+ var filein = document.getElementsByTagName('input')[0];
+ if( !filein.files ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file API is not supported.';
+ return;
+ }
+ if( !filein.files[0] ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - no file was found in the file input.';
+ return;
+ }
+ var thefile = filein.files[0];
+ try {
+ e.dataTransfer.items.add(thefile);
+ } catch(err) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - error when adding file';
+ e.preventDefault();
+ return;
+ }
+ if( e.dataTransfer.files.length != 1 ) {
+ document.getElementsByTagName('p')[0].innerHTML = 'FAIL - file was not attached to data store';
+ e.preventDefault();
+ }
+ };
};
- </script>
- </head>
- <body>
- <div>This test only applies to platforms where dropping a file onto a folder in the system's file manager copies/moves the file to that folder.</div>
- <ol>
- <li>Open an empty folder in your system's file manager.</li>
- <li>Select a non-empty file on your computer using the following input: <input type="file"></li>
- <li>Drag the orange square onto the folder in your system's file manager, and release it:<br><span draggable="true"></span></li>
- <li>Pass if the file is copied to the folder.</li>
- </ol>
- <p></p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <div>This test only applies to platforms where dropping a file onto a folder in the system's file manager copies/moves the file to that folder.</div>
+ <ol>
+ <li>Open an empty folder in your system's file manager.</li>
+ <li>Select a non-empty file on your computer using the following input: <input type="file"></li>
+ <li>Drag the orange square onto the folder in your system's file manager, and release it:<br><span draggable="true"></span></li>
+ <li>Pass if the file is copied to the folder.</li>
+ </ol>
+ <p></p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-to-os-HELPER-FILE.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-to-os-HELPER-FILE.html
index 608026f208b..56fa975d436 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-to-os-HELPER-FILE.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-to-os-HELPER-FILE.html
@@ -1,14 +1,14 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - dragging HTML onto the OS - helper file</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - dragging HTML onto the OS - helper file</title>
+ </head>
+ <body>
- <p>This is the helper file. Drop the paragraph here --&gt;</p>
- <script type="text/javascript">
+ <p>This is the helper file. Drop the paragraph here --&gt;</p>
+ <script type="text/javascript">
document.body.contentEditable = true;
- </script>
+ </script>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-to-os.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-to-os.html
index 6283c24cef8..5aaf33b42b7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-to-os.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-to-os.html
@@ -1,20 +1,20 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - dragging HTML onto the OS</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - dragging HTML onto the OS</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
- <p>This testcase requires an external application that accepts dropping of HTML from other applications - eg. Google Chrome and Internet Explorer (not Firefox). Load <a href="html-to-os-HELPER-FILE.html">the helper file</a> in the external application.</p>
- <p draggable="true">Drag this paragraph to the other application and release it. De-select the text in that application if it is selected. Pass if &quot;Pass if this text is on a green background&quot; appears in the other application, and if it has a green background, and if the drag placeholder disappears when the drag is released.</p>
- <script type="text/javascript">
+ <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
+ <p>This testcase requires an external application that accepts dropping of HTML from other applications - eg. Google Chrome and Internet Explorer (not Firefox). Load <a href="html-to-os-HELPER-FILE.html">the helper file</a> in the external application.</p>
+ <p draggable="true">Drag this paragraph to the other application and release it. De-select the text in that application if it is selected. Pass if &quot;Pass if this text is on a green background&quot; appears in the other application, and if it has a green background, and if the drag placeholder disappears when the drag is released.</p>
+ <script type="text/javascript">
document.getElementsByTagName('p')[2].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text/html', '<span style="background:lime;color:black;">Pass if this text is on a green background</span>');
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text/html', '<span style="background:lime;color:black;">Pass if this text is on a green background</span>');
};
- </script>
- <p>Disable JavaScript in this browser and repeat the test. Pass if the entire dragged paragraph appears in the other application. Vendors may optionally choose to ignore this requirement.</p>
+ </script>
+ <p>Disable JavaScript in this browser and repeat the test. Pass if the entire dragged paragraph appears in the other application. Vendors may optionally choose to ignore this requirement.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-unicode-to-os.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-unicode-to-os.html
index b915865d458..433d59d1038 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-unicode-to-os.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/html-unicode-to-os.html
@@ -1,19 +1,19 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - dragging HTML onto the OS</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - dragging HTML onto the OS</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
- <p>This testcase requires an external application that accepts dropping of unicode HTML from other applications - eg. Google Chrome (not Firefox or Internet Explorer). Load <a href="html-to-os-HELPER-FILE.html">the helper file</a> in the external application.</p>
- <p draggable="true">Drag this paragraph to the other application and release it. De-select the text in that application if it is selected. Pass if &quot;Pass if this text is on a green background 中文אידישрусский&quot; appears in the other application, and if it has a green background, and if the drag placeholder disappears when the drag is released.</p>
- <script type="text/javascript">
+ <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
+ <p>This testcase requires an external application that accepts dropping of unicode HTML from other applications - eg. Google Chrome (not Firefox or Internet Explorer). Load <a href="html-to-os-HELPER-FILE.html">the helper file</a> in the external application.</p>
+ <p draggable="true">Drag this paragraph to the other application and release it. De-select the text in that application if it is selected. Pass if &quot;Pass if this text is on a green background 中文אידישрусский&quot; appears in the other application, and if it has a green background, and if the drag placeholder disappears when the drag is released.</p>
+ <script type="text/javascript">
document.getElementsByTagName('p')[2].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text/html', '<span style="background:lime;color:black;">Pass if this text is on a green background 中文אידישрусский</span>');
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text/html', '<span style="background:lime;color:black;">Pass if this text is on a green background 中文אידישрусский</span>');
};
- </script>
+ </script>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/inputs-no-js.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/inputs-no-js.html
index 876f0b58aaa..f5f2fbc4023 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/inputs-no-js.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/inputs-no-js.html
@@ -1,15 +1,15 @@
<!doctype html>
<html>
- <head>
- <title>Dropping selections with JS disabled</title>
- </head>
- <body>
+ <head>
+ <title>Dropping selections with JS disabled</title>
+ </head>
+ <body>
- <ol>
- <li>Disable JavaScript</li>
- <li>Select some text in <input type="text" value="this input"> and drag it into the following input: <input type="text" value=""> - the text you dragged should appear in there.</li>
- <li>Select some text in this sentence and drag it into the following input: <input type="text" value=""> - the text you dragged should appear in there.</li>
- </ol>
+ <ol>
+ <li>Disable JavaScript</li>
+ <li>Select some text in <input type="text" value="this input"> and drag it into the following input: <input type="text" value=""> - the text you dragged should appear in there.</li>
+ <li>Select some text in this sentence and drag it into the following input: <input type="text" value=""> - the text you dragged should appear in there.</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/001.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/001.html
index 0a527b4992a..563cee9ea54 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/001.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/001.html
@@ -16,21 +16,21 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], fuchsia = document.getElementsByTagName('div')[2];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = function (e) {
- alert('JS alert');
- };
- fuchsia.ondragenter = fuchsia.ondragover = function (e) {
- e.preventDefault();
- };
- fuchsia.ondrop = function (e) {
- document.getElementsByTagName('ol')[0].textContent = e.dataTransfer.getData('text');
- e.preventDefault();
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], fuchsia = document.getElementsByTagName('div')[2];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = function (e) {
+ alert('JS alert');
+ };
+ fuchsia.ondragenter = fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ };
+ fuchsia.ondrop = function (e) {
+ document.getElementsByTagName('ol')[0].textContent = e.dataTransfer.getData('text');
+ e.preventDefault();
+ };
};
</script>
<div draggable="true"></div>
@@ -38,10 +38,10 @@ window.onload = function () {
<div></div>
<ol>
- <li>Drag the orange square over the blue square.</li>
- <li>An alert may appear. Do not dismiss it. If an alert does not appear, PASS, and ignore any further steps.</li>
- <li>Drag a file that your browser cannot open natively from your computer onto a blank part of the page. If a download dialog appears at any point after this, cancel it, and return to this page.</li>
- <li>Dismiss the alert without using the left mouse button (eg. use keyboard, or mouse gestures such as gesture-down,gesture-right).</li>
- <li>Do a short drag and drop within the pink square. If nothing happens, PASS, and ignore any further steps.</li>
- <li>The word &quot;PASS&quot; should appear in place of this text.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square over the blue square.</li>
+ <li>An alert may appear. Do not dismiss it. If an alert does not appear, PASS, and ignore any further steps.</li>
+ <li>Drag a file that your browser cannot open natively from your computer onto a blank part of the page. If a download dialog appears at any point after this, cancel it, and return to this page.</li>
+ <li>Dismiss the alert without using the left mouse button (eg. use keyboard, or mouse gestures such as gesture-down,gesture-right).</li>
+ <li>Do a short drag and drop within the pink square. If nothing happens, PASS, and ignore any further steps.</li>
+ <li>The word &quot;PASS&quot; should appear in place of this text.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/002.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/002.html
index 4b1806ac023..2091f39a7ff 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/002.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/002.html
@@ -16,21 +16,21 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], fuchsia = document.getElementsByTagName('div')[2];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = function (e) {
- alert('JS alert');
- };
- fuchsia.ondragenter = fuchsia.ondragover = function (e) {
- e.preventDefault();
- };
- fuchsia.ondrop = function (e) {
- document.getElementsByTagName('ol')[0].textContent = e.dataTransfer.getData('text');
- e.preventDefault();
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], fuchsia = document.getElementsByTagName('div')[2];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = function (e) {
+ alert('JS alert');
+ };
+ fuchsia.ondragenter = fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ };
+ fuchsia.ondrop = function (e) {
+ document.getElementsByTagName('ol')[0].textContent = e.dataTransfer.getData('text');
+ e.preventDefault();
+ };
};
</script>
<div draggable="true"></div>
@@ -38,12 +38,12 @@ window.onload = function () {
<div></div>
<ol>
- <li>Make sure at least one other tab is open.</li>
- <li>Drag the orange square over the blue square.</li>
- <li>An alert may appear. Do not dismiss it. If an alert does not appear, PASS, and ignore any further steps.</li>
- <li>Click the other tab to focus it (or focus it in whatever way works). If you cannot change tabs, PASS, and ignore any further steps.</li>
- <li>Drag a file that your browser cannot open natively from your computer and drop onto that page, then click the tab for this page to return here. If a download dialog appears at any point after this, cancel it, and return to this page.</li>
- <li>Dismiss the alert without using the left mouse button (eg. use keyboard, or mouse gestures such as gesture-down,gesture-right).</li>
- <li>Do a short drag and drop within the pink square. If nothing happens, PASS, and ignore any further steps.</li>
- <li>The word &quot;PASS&quot; should appear in place of this text.</li>
-</ol> \ No newline at end of file
+ <li>Make sure at least one other tab is open.</li>
+ <li>Drag the orange square over the blue square.</li>
+ <li>An alert may appear. Do not dismiss it. If an alert does not appear, PASS, and ignore any further steps.</li>
+ <li>Click the other tab to focus it (or focus it in whatever way works). If you cannot change tabs, PASS, and ignore any further steps.</li>
+ <li>Drag a file that your browser cannot open natively from your computer and drop onto that page, then click the tab for this page to return here. If a download dialog appears at any point after this, cancel it, and return to this page.</li>
+ <li>Dismiss the alert without using the left mouse button (eg. use keyboard, or mouse gestures such as gesture-down,gesture-right).</li>
+ <li>Do a short drag and drop within the pink square. If nothing happens, PASS, and ignore any further steps.</li>
+ <li>The word &quot;PASS&quot; should appear in place of this text.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/003.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/003.html
index 85f20badf9c..c09f9a53ecd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/003.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/003.html
@@ -19,25 +19,25 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], yellow = document.getElementsByTagName('div')[2], fuchsia = document.getElementsByTagName('div')[3];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- yellow.ondragstart = function (e) {
- e.dataTransfer.setData('text','FAIL');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = function (e) {
- alert('JS alert');
- };
- fuchsia.ondragenter = fuchsia.ondragover = function (e) {
- e.preventDefault();
- };
- fuchsia.ondrop = function (e) {
- document.getElementsByTagName('ol')[0].textContent = e.dataTransfer.getData('text');
- e.preventDefault();
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], yellow = document.getElementsByTagName('div')[2], fuchsia = document.getElementsByTagName('div')[3];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ yellow.ondragstart = function (e) {
+ e.dataTransfer.setData('text','FAIL');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = function (e) {
+ alert('JS alert');
+ };
+ fuchsia.ondragenter = fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ };
+ fuchsia.ondrop = function (e) {
+ document.getElementsByTagName('ol')[0].textContent = e.dataTransfer.getData('text');
+ e.preventDefault();
+ };
};
</script>
<div draggable="true"></div>
@@ -46,14 +46,14 @@ window.onload = function () {
<div></div>
<ol>
- <li>Open this page in two separate tabs, and start on tab #1.</li>
- <li>Drag the orange square over the blue square.</li>
- <li>An alert may appear. Do not dismiss it. If an alert does not appear, PASS, and ignore any further steps.</li>
- <li>Click the other tab to focus it (or focus it in whatever way works). If you cannot change tabs, PASS, and ignore any further steps.</li>
- <li>On tab #2, drag the yellow square over the blue square. If you cannot drag the yellow square, PASS, and ignore any further steps.</li>
- <li>An alert may appear. Do not dismiss it.</li>
- <li>Return to tab #1.</li>
- <li>Dismiss the alert without using the left mouse button (eg. use keyboard, or mouse gestures such as gesture-down,gesture-right).</li>
- <li>Do a short drag and drop within the pink square. If nothing happens, PASS, and ignore any further steps.</li>
- <li>The word &quot;PASS&quot; should appear in place of this text.</li>
-</ol> \ No newline at end of file
+ <li>Open this page in two separate tabs, and start on tab #1.</li>
+ <li>Drag the orange square over the blue square.</li>
+ <li>An alert may appear. Do not dismiss it. If an alert does not appear, PASS, and ignore any further steps.</li>
+ <li>Click the other tab to focus it (or focus it in whatever way works). If you cannot change tabs, PASS, and ignore any further steps.</li>
+ <li>On tab #2, drag the yellow square over the blue square. If you cannot drag the yellow square, PASS, and ignore any further steps.</li>
+ <li>An alert may appear. Do not dismiss it.</li>
+ <li>Return to tab #1.</li>
+ <li>Dismiss the alert without using the left mouse button (eg. use keyboard, or mouse gestures such as gesture-down,gesture-right).</li>
+ <li>Do a short drag and drop within the pink square. If nothing happens, PASS, and ignore any further steps.</li>
+ <li>The word &quot;PASS&quot; should appear in place of this text.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/004.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/004.html
index c66c4681a52..41492fe9922 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/004.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/004.html
@@ -10,22 +10,22 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragenter = orange.ondragover = function (e) {
- e.preventDefault();
- };
- orange.ondrop = function (e) {
- e.preventDefault();
- document.getElementsByTagName('ol')[0].innerHTML = ( e.dataTransfer.files[0] && e.dataTransfer.files[0].name == 'pass.txt' ) ? 'PASS' : 'FAIL';
- };
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragenter = orange.ondragover = function (e) {
+ e.preventDefault();
+ };
+ orange.ondrop = function (e) {
+ e.preventDefault();
+ document.getElementsByTagName('ol')[0].innerHTML = ( e.dataTransfer.files[0] && e.dataTransfer.files[0].name == 'pass.txt' ) ? 'PASS' : 'FAIL';
+ };
};
</script>
<div draggable="true"></div>
<ol>
- <li>Save <a href="pass.txt">pass.txt</a> and <a href="fail.txt">fail.txt</a> onto your computer.</li>
- <li>Drag pass.txt from your computer onto the orange square.</li>
- <li>A prompt should appear. Do not dismiss it. If a prompt does not appear, ignore any further steps, and check the tests in ../../file/</li>
- <li>Drag fail.txt from your computer onto a blank part of this page. Fail if this page is replaced.</li>
- <li>Accept the prompt. Fail if nothing happens.</li>
-</ol> \ No newline at end of file
+ <li>Save <a href="pass.txt">pass.txt</a> and <a href="fail.txt">fail.txt</a> onto your computer.</li>
+ <li>Drag pass.txt from your computer onto the orange square.</li>
+ <li>A prompt should appear. Do not dismiss it. If a prompt does not appear, ignore any further steps, and check the tests in ../../file/</li>
+ <li>Drag fail.txt from your computer onto a blank part of this page. Fail if this page is replaced.</li>
+ <li>Accept the prompt. Fail if nothing happens.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/005.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/005.html
index efb5a5b794c..a0bdae3f494 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/005.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/005.html
@@ -10,26 +10,26 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragenter = orange.ondragover = function (e) {
- e.preventDefault();
- };
- orange.ondrop = function (e) {
- e.preventDefault();
- document.getElementsByTagName('ol')[0].innerHTML = ( e.dataTransfer.files[0] && e.dataTransfer.files[0].name );
- };
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragenter = orange.ondragover = function (e) {
+ e.preventDefault();
+ };
+ orange.ondrop = function (e) {
+ e.preventDefault();
+ document.getElementsByTagName('ol')[0].innerHTML = ( e.dataTransfer.files[0] && e.dataTransfer.files[0].name );
+ };
};
</script>
<div draggable="true"></div>
<ol>
- <li>Save <a href="file1.txt">file1.txt</a> and <a href="file2.txt">file2.txt</a> onto your computer.</li>
- <li>Open this page in two separate tabs, and start on tab #1.</li>
- <li>Drag file1.txt from your computer onto the orange square.</li>
- <li>A prompt should appear. Do not dismiss it. If a prompt does not appear, ignore any further steps, and check the tests in ../../file/</li>
- <li>Click the other tab to focus it (or focus it in whatever way works). If you cannot change tabs, PASS, and ignore any further steps.</li>
- <li>Drag file2.txt from your computer onto the orange square. Fail if this text (but not the orange square) is replaced without any prompt.</li>
- <li>If a prompt appears, do not dismiss it.</li>
- <li>Return to tab #1.</li>
- <li>Accept the prompt. Fail if it cannot be accepted. Pass if this text (but not the orange square) is replaced with the text: file1.txt</li>
-</ol> \ No newline at end of file
+ <li>Save <a href="file1.txt">file1.txt</a> and <a href="file2.txt">file2.txt</a> onto your computer.</li>
+ <li>Open this page in two separate tabs, and start on tab #1.</li>
+ <li>Drag file1.txt from your computer onto the orange square.</li>
+ <li>A prompt should appear. Do not dismiss it. If a prompt does not appear, ignore any further steps, and check the tests in ../../file/</li>
+ <li>Click the other tab to focus it (or focus it in whatever way works). If you cannot change tabs, PASS, and ignore any further steps.</li>
+ <li>Drag file2.txt from your computer onto the orange square. Fail if this text (but not the orange square) is replaced without any prompt.</li>
+ <li>If a prompt appears, do not dismiss it.</li>
+ <li>Return to tab #1.</li>
+ <li>Accept the prompt. Fail if it cannot be accepted. Pass if this text (but not the orange square) is replaced with the text: file1.txt</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/006.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/006.html
index 83e6fa7f4cb..73cfb2d6968 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/006.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/006.html
@@ -10,23 +10,23 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- if( hasfired ) { return; }
- hasfired = true;
- alert('JS alert');
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ if( hasfired ) { return; }
+ hasfired = true;
+ alert('JS alert');
+ };
};
</script>
<div draggable="true"></div>
<ol>
- <li>Drag the orange square downwards until the drag placeholder appears.</li>
- <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards again. Fail if that is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square downwards until the drag placeholder appears.</li>
+ <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards again. Fail if that is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/007.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/007.html
index 1d79b85ef94..6c8daba2001 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/007.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/007.html
@@ -10,25 +10,25 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- orange.ondrag = function (e) {
- if( hasfired ) { return; }
- hasfired = true;
- alert('JS alert');
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ orange.ondrag = function (e) {
+ if( hasfired ) { return; }
+ hasfired = true;
+ alert('JS alert');
+ };
};
</script>
<div draggable="true"></div>
<ol>
- <li>Drag the orange square downwards until the drag placeholder appears.</li>
- <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards again. Fail if that is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square downwards until the drag placeholder appears.</li>
+ <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards again. Fail if that is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/008.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/008.html
index b2de74169ff..2339e294312 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/008.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/008.html
@@ -13,28 +13,28 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = function (e) {
- e.preventDefault();
- alert('JS alert');
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ alert('JS alert');
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ };
};
</script>
<div draggable="true"></div>
<div></div>
<ol>
- <li>Drag the orange square over the blue square.</li>
- <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square over the blue square.</li>
+ <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/009.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/009.html
index ce1fec80865..e19b1c5d72a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/009.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/009.html
@@ -13,30 +13,30 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = function (e) {
- e.preventDefault();
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( hasfired ) { return; }
- hasfired = true;
- alert('JS alert');
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( hasfired ) { return; }
+ hasfired = true;
+ alert('JS alert');
+ };
};
</script>
<div draggable="true"></div>
<div></div>
<ol>
- <li>Drag the orange square over the blue square.</li>
- <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square over the blue square.</li>
+ <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/010.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/010.html
index c5ec6648874..583746bbadc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/010.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/010.html
@@ -13,27 +13,27 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = blue.ondragover = function (e) {
- e.preventDefault();
- };
- blue.ondragleave = function (e) {
- alert('JS alert');
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = blue.ondragover = function (e) {
+ e.preventDefault();
+ };
+ blue.ondragleave = function (e) {
+ alert('JS alert');
+ };
};
</script>
<div draggable="true"></div>
<div></div>
<ol>
- <li>Drag the orange square over the blue square, then back over the orange square.</li>
- <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square over the blue square, then back over the orange square.</li>
+ <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/011.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/011.html
index 61b73ba8402..8b72b637688 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/011.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/011.html
@@ -13,28 +13,28 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = blue.ondragover = function (e) {
- e.preventDefault();
- };
- blue.ondrop = function (e) {
- e.preventDefault();
- alert('JS alert');
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = blue.ondragover = function (e) {
+ e.preventDefault();
+ };
+ blue.ondrop = function (e) {
+ e.preventDefault();
+ alert('JS alert');
+ };
};
</script>
<div draggable="true"></div>
<div></div>
<ol>
- <li>Drag the orange square over the blue square, then release it.</li>
- <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right).</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square over the blue square, then release it.</li>
+ <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right).</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/012.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/012.html
index bcf65ce9e70..1b31468b43f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/012.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/012.html
@@ -13,32 +13,32 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = blue.ondragover = function (e) {
- e.preventDefault();
- };
- blue.ondrop = function (e) {
- e.preventDefault();
- };
- orange.ondragend = function (e) {
- if( hasfired ) { return; }
- hasfired = true;
- alert('JS alert');
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = blue.ondragover = function (e) {
+ e.preventDefault();
+ };
+ blue.ondrop = function (e) {
+ e.preventDefault();
+ };
+ orange.ondragend = function (e) {
+ if( hasfired ) { return; }
+ hasfired = true;
+ alert('JS alert');
+ };
};
</script>
<div draggable="true"></div>
<div></div>
<ol>
- <li>Drag the orange square over the blue square, then release it.</li>
- <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right).</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square over the blue square, then release it.</li>
+ <li>An alert may appear - release the mouse over the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right).</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/013.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/013.html
index 31dd82e5113..9e9747601a2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/013.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/013.html
@@ -7,7 +7,7 @@
background-color: orange;
}
body > div + div {
- margin-top: 10px;
+ margin-top: 10px;
height: 200px;
width: 200px;
background-color: blue;
@@ -19,23 +19,23 @@ window.onload = function() {
var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text', 'dummy text');
+ e.dataTransfer.setData('text', 'dummy text');
};
blue.ondragover = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
- if( !window.doneonce ) {
- alert('2. It should also ideally be possible to dismiss this dialog with your mouse/pointing device (do not use mouse gestures).');
- }
- window.doneonce = true;
+ if( !window.doneonce ) {
+ alert('2. It should also ideally be possible to dismiss this dialog with your mouse/pointing device (do not use mouse gestures).');
+ }
+ window.doneonce = true;
};
blue.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
- alert('1. It should ideally be possible to dismiss this dialog with your mouse/pointing device (do not use mouse gestures).');
+ alert('1. It should ideally be possible to dismiss this dialog with your mouse/pointing device (do not use mouse gestures).');
};
- blue.ondrop = function(e) {
- e.preventDefault();
+ blue.ondrop = function(e) {
+ e.preventDefault();
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/014.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/014.html
index 94258e44a6f..23f6a3e4db1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/014.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/014.html
@@ -7,7 +7,7 @@
background-color: orange;
}
body > div + div {
- margin-top: 10px;
+ margin-top: 10px;
height: 200px;
width: 200px;
background-color: blue;
@@ -19,15 +19,15 @@ window.onload = function() {
var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
orange.ondragstart = function(e) {
e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text', 'dummy text');
+ e.dataTransfer.setData('text', 'dummy text');
};
blue.ondragover = blue.ondragenter = function(e) {
- e.preventDefault();
+ e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
};
- blue.ondrop = function(e) {
- e.preventDefault();
- alert('It should ideally be possible to dismiss this dialog with your mouse/pointing device (do not use mouse gestures).');
+ blue.ondrop = function(e) {
+ e.preventDefault();
+ alert('It should ideally be possible to dismiss this dialog with your mouse/pointing device (do not use mouse gestures).');
};
};
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/015.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/015.html
index 1fc6ef84dcf..650c15ac3ec 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/015.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/015.html
@@ -10,23 +10,23 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- if( hasfired ) { return; }
- hasfired = true;
- alert('Release the mouse over this dialog');
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ if( hasfired ) { return; }
+ hasfired = true;
+ alert('Release the mouse over this dialog');
+ };
};
</script>
<div draggable="true"></div>
<ol>
- <li>Drag the orange square downwards until the drag placeholder appears.</li>
- <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards again. Fail if that is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square downwards until the drag placeholder appears.</li>
+ <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards again. Fail if that is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/016.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/016.html
index f28191d46e5..d4c42941e3a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/016.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/016.html
@@ -10,25 +10,25 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- orange.ondrag = function (e) {
- if( hasfired ) { return; }
- hasfired = true;
- alert('Release the mouse over this dialog');
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ orange.ondrag = function (e) {
+ if( hasfired ) { return; }
+ hasfired = true;
+ alert('Release the mouse over this dialog');
+ };
};
</script>
<div draggable="true"></div>
<ol>
- <li>Drag the orange square downwards until the drag placeholder appears.</li>
- <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards again. Fail if that is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square downwards until the drag placeholder appears.</li>
+ <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards again. Fail if that is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/017.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/017.html
index 6e3926c9d59..1c10d8a370a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/017.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/017.html
@@ -13,28 +13,28 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = function (e) {
- e.preventDefault();
- alert('Release the mouse over this dialog');
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ alert('Release the mouse over this dialog');
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ };
};
</script>
<div draggable="true"></div>
<div></div>
<ol>
- <li>Drag the orange square over the blue square.</li>
- <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square over the blue square.</li>
+ <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/018.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/018.html
index 6fdb79aa952..c0067d00d84 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/018.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/018.html
@@ -13,30 +13,30 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = function (e) {
- e.preventDefault();
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( hasfired ) { return; }
- hasfired = true;
- alert('Release the mouse over this dialog');
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1], hasfired = false;
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( hasfired ) { return; }
+ hasfired = true;
+ alert('Release the mouse over this dialog');
+ };
};
</script>
<div draggable="true"></div>
<div></div>
<ol>
- <li>Drag the orange square over the blue square.</li>
- <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square over the blue square.</li>
+ <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/019.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/019.html
index d9af799a58c..dca273d9d49 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/019.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/019.html
@@ -13,27 +13,27 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','PASS');
- e.dataTransfer.effectAllowed = 'all';
- };
- blue.ondragenter = blue.ondragover = function (e) {
- e.preventDefault();
- };
- blue.ondragleave = function (e) {
- alert('Release the mouse over this dialog');
- };
+ var orange = document.getElementsByTagName('div')[0], blue = document.getElementsByTagName('div')[1];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','PASS');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ blue.ondragenter = blue.ondragover = function (e) {
+ e.preventDefault();
+ };
+ blue.ondragleave = function (e) {
+ alert('Release the mouse over this dialog');
+ };
};
</script>
<div draggable="true"></div>
<div></div>
<ol>
- <li>Drag the orange square over the blue square, then back over the orange square.</li>
- <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
- <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag the orange square over the blue square, then back over the orange square.</li>
+ <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+ <li>Try to drag the orange square downwards. Fail if it is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/020.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/020.html
index c57b25dcb0a..e10fa46f2a4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/020.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/020.html
@@ -10,24 +10,24 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragenter = function (e) {
- e.preventDefault();
- alert('JS alert');
- };
- orange.ondragover = orange.ondrop = function (e) {
- e.preventDefault();
- };
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragenter = function (e) {
+ e.preventDefault();
+ alert('JS alert');
+ };
+ orange.ondragover = orange.ondrop = function (e) {
+ e.preventDefault();
+ };
};
</script>
<div draggable="true"></div>
<ol>
- <li>Drag a file (one that your browser cannot open natively, such as an executable file) from your system file manager over the orange square.</li>
- <li>An alert may appear - release the mouse over a blank part of the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag and accept any prompt to upload the file.</li>
- <li>If a file download dialog appears, cancel it and return to this page.</li>
- <li>Fail if the alert reappears.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag a file (one that your browser cannot open natively, such as an executable file) from your system file manager over the orange square.</li>
+ <li>An alert may appear - release the mouse over a blank part of the page, not the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag and accept any prompt to upload the file.</li>
+ <li>If a file download dialog appears, cancel it and return to this page.</li>
+ <li>Fail if the alert reappears.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/021.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/021.html
index e30416b4fbc..d393e0846cf 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/021.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/interrupt/021.html
@@ -10,24 +10,24 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragenter = function (e) {
- e.preventDefault();
- alert('JS alert');
- };
- orange.ondragover = orange.ondrop = function (e) {
- e.preventDefault();
- };
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragenter = function (e) {
+ e.preventDefault();
+ alert('JS alert');
+ };
+ orange.ondragover = orange.ondrop = function (e) {
+ e.preventDefault();
+ };
};
</script>
<div draggable="true"></div>
<ol>
- <li>Drag a file (one that your browser cannot open natively, such as an executable file) from your system file manager over the orange square.</li>
- <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag and accept any prompt to upload the file.</li>
- <li>If a file download dialog appears, cancel it and return to this page.</li>
- <li>Fail if the alert reappears.</li>
- <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
- <li>Fail if the mouse continues to show that a drag is in operation.</li>
- <li>Try to select some text in this sentence. Fail if it is not possible.</li>
-</ol> \ No newline at end of file
+ <li>Drag a file (one that your browser cannot open natively, such as an executable file) from your system file manager over the orange square.</li>
+ <li>An alert may appear - release the mouse over the dialog. Dismiss it (you may need to use keyboard or mouse gestures such as gesture-down,gesture-right). If it does not appear, release the drag and accept any prompt to upload the file.</li>
+ <li>If a file download dialog appears, cancel it and return to this page.</li>
+ <li>Fail if the alert reappears.</li>
+ <li>The mouse cursor may continue to show that a drag is in operation. If so, attempt to select some of this text with the mouse before continuing to the text step.</li>
+ <li>Fail if the mouse continues to show that a drag is in operation.</li>
+ <li>Try to select some text in this sentence. Fail if it is not possible.</li>
+</ol>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/keyboardshortcuts.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/keyboardshortcuts.html
index 13340f44234..441ffd3df1e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/keyboardshortcuts.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/keyboardshortcuts.html
@@ -1,18 +1,18 @@
<!doctype html>
<html>
- <head>
- <title>Keyboard shortcuts during drag/drop</title>
- </head>
- <body>
+ <head>
+ <title>Keyboard shortcuts during drag/drop</title>
+ </head>
+ <body>
- <ol>
- <li>Select some text in this sentence and begin dragging it.</li>
- <li>While dragging, use your keyboard shortcut to reload the page. It should work without cancelling the drag.</li>
- <li>While dragging, use your keyboard shortcut to select all text on the page. It should work without cancelling the drag.</li>
- <li>While dragging, use your keyboard shortcut to open a new tab. It should work without cancelling the drag.</li>
- <li>While dragging, use your keyboard shortcut to switch to another tab. It should work without cancelling the drag.</li>
- <li>While dragging, use your keyboard shortcuts to go back and forward in history (<a href="#next">use this link first to add a history entry if needed</a>). It should work without cancelling the drag.</li>
- </ol>
+ <ol>
+ <li>Select some text in this sentence and begin dragging it.</li>
+ <li>While dragging, use your keyboard shortcut to reload the page. It should work without cancelling the drag.</li>
+ <li>While dragging, use your keyboard shortcut to select all text on the page. It should work without cancelling the drag.</li>
+ <li>While dragging, use your keyboard shortcut to open a new tab. It should work without cancelling the drag.</li>
+ <li>While dragging, use your keyboard shortcut to switch to another tab. It should work without cancelling the drag.</li>
+ <li>While dragging, use your keyboard shortcuts to go back and forward in history (<a href="#next">use this link first to add a history entry if needed</a>). It should work without cancelling the drag.</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/all.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/all.html
index 3f91fb5fec9..bb76d3a0cdc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/all.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/all.html
@@ -1,175 +1,175 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys selecting dropEffect with 'all'</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys selecting dropEffect with 'all'</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','http://example.com/');
- e.dataTransfer.effectAllowed = 'all';
- bde = bdo = bdo2 = fde = fdo = fdr = '';
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = function (e) {
- e.preventDefault();
- if( !bde ) { bde = e.dataTransfer.dropEffect; }
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( !bdo ) {
- bdo = e.dataTransfer.dropEffect;
- }
- //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
- //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
- bdo2 = e.dataTransfer.dropEffect;
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondragenter = function (e) {
- e.preventDefault();
- if( !fde ) { fde = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- fdr = e.dataTransfer.dropEffect;
- };
- orange.ondragend = function (e) {
- var ode = e.dataTransfer.dropEffect, temparray;
- if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
- if( bde == fdr ) {
- tmparray = [fdr];
- } else {
- tmparray = [bde,fdr];
- }
- } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
- tmparray = [bde,fdo,ode];
- } else {
- tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
- }
- tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
- document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
- };
+ var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','http://example.com/');
+ e.dataTransfer.effectAllowed = 'all';
+ bde = bdo = bdo2 = fde = fdo = fdr = '';
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ if( !bde ) { bde = e.dataTransfer.dropEffect; }
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( !bdo ) {
+ bdo = e.dataTransfer.dropEffect;
+ }
+ //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
+ //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
+ bdo2 = e.dataTransfer.dropEffect;
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondragenter = function (e) {
+ e.preventDefault();
+ if( !fde ) { fde = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ fdr = e.dataTransfer.dropEffect;
+ };
+ orange.ondragend = function (e) {
+ var ode = e.dataTransfer.dropEffect, temparray;
+ if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
+ if( bde == fdr ) {
+ tmparray = [fdr];
+ } else {
+ tmparray = [bde,fdr];
+ }
+ } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
+ tmparray = [bde,fdo,ode];
+ } else {
+ tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
+ }
+ tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
+ document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <div><strong>&nbsp;</strong></div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform</li>
- <li>Continue dragging over the pink square</li>
- <li>Release the drag, then the keys</li>
- <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
- </ol>
- <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
- <!-- Anything else invalidates the modifiers, and reverts to default. -->
- <table>
- <caption>Windows</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td>None</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Alt</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Alt+Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td><strong>copy</strong></td></tr>
- </tbody>
- </table>
- <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
- <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Unix/Linux</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td>None</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Alt+Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
- </tbody>
- </table>
- <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Mac</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td>None</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Option/alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Command</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <div><strong>&nbsp;</strong></div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform</li>
+ <li>Continue dragging over the pink square</li>
+ <li>Release the drag, then the keys</li>
+ <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
+ </ol>
+ <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
+ <!-- Anything else invalidates the modifiers, and reverts to default. -->
+ <table>
+ <caption>Windows</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td>None</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Alt</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Alt+Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td><strong>copy</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
+ <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Unix/Linux</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td>None</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Alt+Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Mac</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td>None</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Option/alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Command</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Shift+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Shift+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Shift+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Ctrl+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Shift+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Shift+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Ctrl+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Shift+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
- </tbody>
- </table>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <tr><td>Ctrl+Shift+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
+ </tbody>
+ </table>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copy.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copy.html
index 6366dd4dcd7..597fdc03a94 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copy.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copy.html
@@ -1,175 +1,175 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys selecting dropEffect with 'copy'</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys selecting dropEffect with 'copy'</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','http://example.com/');
- e.dataTransfer.effectAllowed = 'copy';
- bde = bdo = bdo2 = fde = fdo = fdr = '';
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = function (e) {
- e.preventDefault();
- if( !bde ) { bde = e.dataTransfer.dropEffect; }
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( !bdo ) {
- bdo = e.dataTransfer.dropEffect;
- }
- //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
- //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
- bdo2 = e.dataTransfer.dropEffect;
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondragenter = function (e) {
- e.preventDefault();
- if( !fde ) { fde = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- fdr = e.dataTransfer.dropEffect;
- };
- orange.ondragend = function (e) {
- var ode = e.dataTransfer.dropEffect, temparray;
- if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
- if( bde == fdr ) {
- tmparray = [fdr];
- } else {
- tmparray = [bde,fdr];
- }
- } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
- tmparray = [bde,fdo,ode];
- } else {
- tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
- }
- tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
- document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
- };
+ var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','http://example.com/');
+ e.dataTransfer.effectAllowed = 'copy';
+ bde = bdo = bdo2 = fde = fdo = fdr = '';
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ if( !bde ) { bde = e.dataTransfer.dropEffect; }
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( !bdo ) {
+ bdo = e.dataTransfer.dropEffect;
+ }
+ //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
+ //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
+ bdo2 = e.dataTransfer.dropEffect;
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondragenter = function (e) {
+ e.preventDefault();
+ if( !fde ) { fde = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ fdr = e.dataTransfer.dropEffect;
+ };
+ orange.ondragend = function (e) {
+ var ode = e.dataTransfer.dropEffect, temparray;
+ if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
+ if( bde == fdr ) {
+ tmparray = [fdr];
+ } else {
+ tmparray = [bde,fdr];
+ }
+ } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
+ tmparray = [bde,fdo,ode];
+ } else {
+ tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
+ }
+ tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
+ document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <div><strong>&nbsp;</strong></div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform</li>
- <li>Continue dragging over the pink square</li>
- <li>Release the drag, then the keys</li>
- <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
- </ol>
- <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
- <!-- Anything else invalidates the modifiers, and reverts to default. -->
- <table>
- <caption>Windows</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td>None</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Alt</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Alt+Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td><strong>copy</strong></td></tr>
- </tbody>
- </table>
- <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
- <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Unix/Linux</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Alt+Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- </tbody>
- </table>
- <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Mac</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Option/alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <div><strong>&nbsp;</strong></div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform</li>
+ <li>Continue dragging over the pink square</li>
+ <li>Release the drag, then the keys</li>
+ <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
+ </ol>
+ <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
+ <!-- Anything else invalidates the modifiers, and reverts to default. -->
+ <table>
+ <caption>Windows</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td>None</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Alt</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Alt+Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td><strong>copy</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
+ <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Unix/Linux</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Alt+Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Mac</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Option/alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Shift+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Shift+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- </tbody>
- </table>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <tr><td>Ctrl+Shift+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ </tbody>
+ </table>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copylink.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copylink.html
index 27d9126a959..042031d0040 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copylink.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copylink.html
@@ -1,175 +1,175 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys selecting dropEffect with 'copyLink'</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys selecting dropEffect with 'copyLink'</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','http://example.com/');
- e.dataTransfer.effectAllowed = 'copyLink';
- bde = bdo = bdo2 = fde = fdo = fdr = '';
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = function (e) {
- e.preventDefault();
- if( !bde ) { bde = e.dataTransfer.dropEffect; }
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( !bdo ) {
- bdo = e.dataTransfer.dropEffect;
- }
- //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
- //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
- bdo2 = e.dataTransfer.dropEffect;
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondragenter = function (e) {
- e.preventDefault();
- if( !fde ) { fde = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- fdr = e.dataTransfer.dropEffect;
- };
- orange.ondragend = function (e) {
- var ode = e.dataTransfer.dropEffect, temparray;
- if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
- if( bde == fdr ) {
- tmparray = [fdr];
- } else {
- tmparray = [bde,fdr];
- }
- } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
- tmparray = [bde,fdo,ode];
- } else {
- tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
- }
- tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
- document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
- };
+ var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','http://example.com/');
+ e.dataTransfer.effectAllowed = 'copyLink';
+ bde = bdo = bdo2 = fde = fdo = fdr = '';
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ if( !bde ) { bde = e.dataTransfer.dropEffect; }
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( !bdo ) {
+ bdo = e.dataTransfer.dropEffect;
+ }
+ //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
+ //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
+ bdo2 = e.dataTransfer.dropEffect;
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondragenter = function (e) {
+ e.preventDefault();
+ if( !fde ) { fde = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ fdr = e.dataTransfer.dropEffect;
+ };
+ orange.ondragend = function (e) {
+ var ode = e.dataTransfer.dropEffect, temparray;
+ if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
+ if( bde == fdr ) {
+ tmparray = [fdr];
+ } else {
+ tmparray = [bde,fdr];
+ }
+ } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
+ tmparray = [bde,fdo,ode];
+ } else {
+ tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
+ }
+ tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
+ document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <div><strong>&nbsp;</strong></div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform</li>
- <li>Continue dragging over the pink square</li>
- <li>Release the drag, then the keys</li>
- <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
- </ol>
- <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
- <!-- Anything else invalidates the modifiers, and reverts to default. -->
- <table>
- <caption>Windows</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td>None</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Alt</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Alt+Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td><strong>copy</strong></td></tr>
- </tbody>
- </table>
- <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
- <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Unix/Linux</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Alt+Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
- </tbody>
- </table>
- <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Mac</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Option/alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <div><strong>&nbsp;</strong></div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform</li>
+ <li>Continue dragging over the pink square</li>
+ <li>Release the drag, then the keys</li>
+ <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
+ </ol>
+ <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
+ <!-- Anything else invalidates the modifiers, and reverts to default. -->
+ <table>
+ <caption>Windows</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td>None</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Alt</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Alt+Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td><strong>copy</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
+ <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Unix/Linux</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Alt+Shift</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td>copy=&gt;<strong>link</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Mac</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Option/alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Shift+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Shift+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Shift+Command</td><td>copy=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
+ <tr><td>Shift+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
- </tbody>
- </table>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <tr><td>Ctrl+Shift+Command+Option</td><td>copy=&gt;<strong>link</strong></td></tr>
+ </tbody>
+ </table>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copymove.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copymove.html
index 352e831dc6a..b03e4f26775 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copymove.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/copymove.html
@@ -1,175 +1,175 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys selecting dropEffect with 'copyMove'</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys selecting dropEffect with 'copyMove'</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','http://example.com/');
- e.dataTransfer.effectAllowed = 'copyMove';
- bde = bdo = bdo2 = fde = fdo = fdr = '';
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = function (e) {
- e.preventDefault();
- if( !bde ) { bde = e.dataTransfer.dropEffect; }
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( !bdo ) {
- bdo = e.dataTransfer.dropEffect;
- }
- //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
- //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
- bdo2 = e.dataTransfer.dropEffect;
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondragenter = function (e) {
- e.preventDefault();
- if( !fde ) { fde = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- fdr = e.dataTransfer.dropEffect;
- };
- orange.ondragend = function (e) {
- var ode = e.dataTransfer.dropEffect, temparray;
- if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
- if( bde == fdr ) {
- tmparray = [fdr];
- } else {
- tmparray = [bde,fdr];
- }
- } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
- tmparray = [bde,fdo,ode];
- } else {
- tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
- }
- tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
- document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
- };
+ var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','http://example.com/');
+ e.dataTransfer.effectAllowed = 'copyMove';
+ bde = bdo = bdo2 = fde = fdo = fdr = '';
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ if( !bde ) { bde = e.dataTransfer.dropEffect; }
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( !bdo ) {
+ bdo = e.dataTransfer.dropEffect;
+ }
+ //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
+ //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
+ bdo2 = e.dataTransfer.dropEffect;
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondragenter = function (e) {
+ e.preventDefault();
+ if( !fde ) { fde = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ fdr = e.dataTransfer.dropEffect;
+ };
+ orange.ondragend = function (e) {
+ var ode = e.dataTransfer.dropEffect, temparray;
+ if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
+ if( bde == fdr ) {
+ tmparray = [fdr];
+ } else {
+ tmparray = [bde,fdr];
+ }
+ } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
+ tmparray = [bde,fdo,ode];
+ } else {
+ tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
+ }
+ tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
+ document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <div><strong>&nbsp;</strong></div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform</li>
- <li>Continue dragging over the pink square</li>
- <li>Release the drag, then the keys</li>
- <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
- </ol>
- <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
- <!-- Anything else invalidates the modifiers, and reverts to default. -->
- <table>
- <caption>Windows</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td>None</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Alt</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Alt+Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td><strong>copy</strong></td></tr>
- </tbody>
- </table>
- <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
- <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Unix/Linux</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Alt+Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- </tbody>
- </table>
- <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Mac</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Option/alt</td><td><strong>copy</strong></td></tr>
- <tr><td>Command</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <div><strong>&nbsp;</strong></div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform</li>
+ <li>Continue dragging over the pink square</li>
+ <li>Release the drag, then the keys</li>
+ <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
+ </ol>
+ <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
+ <!-- Anything else invalidates the modifiers, and reverts to default. -->
+ <table>
+ <caption>Windows</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td>None</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Alt</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Alt+Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td><strong>copy</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
+ <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Unix/Linux</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Alt+Shift</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Mac</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Option/alt</td><td><strong>copy</strong></td></tr>
+ <tr><td>Command</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Shift+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Shift+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Shift+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Shift+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift+Option</td><td><strong>copy</strong></td></tr>
- <tr><td>Ctrl+Shift+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
- <tr><td>Ctrl+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift+Option</td><td><strong>copy</strong></td></tr>
+ <tr><td>Ctrl+Shift+Command</td><td>copy=&gt;<strong>move</strong></td></tr>
+ <tr><td>Ctrl+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
- </tbody>
- </table>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <tr><td>Ctrl+Shift+Command+Option</td><td>copy=&gt;link=&gt;<strong>none</strong></td></tr>
+ </tbody>
+ </table>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/link.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/link.html
index d5281a4b465..db13709f655 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/link.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/link.html
@@ -1,175 +1,175 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys selecting dropEffect with 'link'</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys selecting dropEffect with 'link'</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','http://example.com/');
- e.dataTransfer.effectAllowed = 'link';
- bde = bdo = bdo2 = fde = fdo = fdr = '';
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = function (e) {
- e.preventDefault();
- if( !bde ) { bde = e.dataTransfer.dropEffect; }
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( !bdo ) {
- bdo = e.dataTransfer.dropEffect;
- }
- //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
- //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
- bdo2 = e.dataTransfer.dropEffect;
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondragenter = function (e) {
- e.preventDefault();
- if( !fde ) { fde = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- fdr = e.dataTransfer.dropEffect;
- };
- orange.ondragend = function (e) {
- var ode = e.dataTransfer.dropEffect, temparray;
- if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
- if( bde == fdr ) {
- tmparray = [fdr];
- } else {
- tmparray = [bde,fdr];
- }
- } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
- tmparray = [bde,fdo,ode];
- } else {
- tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
- }
- tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
- document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
- };
+ var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','http://example.com/');
+ e.dataTransfer.effectAllowed = 'link';
+ bde = bdo = bdo2 = fde = fdo = fdr = '';
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ if( !bde ) { bde = e.dataTransfer.dropEffect; }
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( !bdo ) {
+ bdo = e.dataTransfer.dropEffect;
+ }
+ //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
+ //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
+ bdo2 = e.dataTransfer.dropEffect;
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondragenter = function (e) {
+ e.preventDefault();
+ if( !fde ) { fde = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ fdr = e.dataTransfer.dropEffect;
+ };
+ orange.ondragend = function (e) {
+ var ode = e.dataTransfer.dropEffect, temparray;
+ if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
+ if( bde == fdr ) {
+ tmparray = [fdr];
+ } else {
+ tmparray = [bde,fdr];
+ }
+ } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
+ tmparray = [bde,fdo,ode];
+ } else {
+ tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
+ }
+ tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
+ document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <div><strong>&nbsp;</strong></div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform</li>
- <li>Continue dragging over the pink square</li>
- <li>Release the drag, then the keys</li>
- <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
- </ol>
- <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
- <!-- Anything else invalidates the modifiers, and reverts to default. -->
- <table>
- <caption>Windows</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td>None</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Alt</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>link</strong></td></tr>
- <tr><td>Alt+Shift</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td><strong>link</strong></td></tr>
- </tbody>
- </table>
- <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
- <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Unix/Linux</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Alt</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Alt+Shift</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td><strong>link</strong></td></tr>
- </tbody>
- </table>
- <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Mac</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>link</strong></td></tr>
- <tr><td>Shift</td><td><strong>link</strong></td></tr>
- <tr><td>Option/alt</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Command</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <div><strong>&nbsp;</strong></div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform</li>
+ <li>Continue dragging over the pink square</li>
+ <li>Release the drag, then the keys</li>
+ <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
+ </ol>
+ <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
+ <!-- Anything else invalidates the modifiers, and reverts to default. -->
+ <table>
+ <caption>Windows</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td>None</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Alt</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>link</strong></td></tr>
+ <tr><td>Alt+Shift</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td><strong>link</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
+ <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Unix/Linux</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Alt</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Alt+Shift</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td><strong>link</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Mac</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>link</strong></td></tr>
+ <tr><td>Shift</td><td><strong>link</strong></td></tr>
+ <tr><td>Option/alt</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Command</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Command</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift+Command</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Command+Option</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Command</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift+Command</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Command+Option</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift+Command</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Command+Option</td><td><strong>link</strong></td></tr>
- <tr><td>Shift+Command+Option</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift+Command</td><td>link=&gt;move=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Command+Option</td><td><strong>link</strong></td></tr>
+ <tr><td>Shift+Command+Option</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift+Command+Option</td><td><strong>link</strong></td></tr>
- </tbody>
- </table>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <tr><td>Ctrl+Shift+Command+Option</td><td><strong>link</strong></td></tr>
+ </tbody>
+ </table>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/linkmove.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/linkmove.html
index 3e19f10de20..ed564a0f3af 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/linkmove.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/linkmove.html
@@ -1,175 +1,175 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys selecting dropEffect with 'linkMove'</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys selecting dropEffect with 'linkMove'</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','http://example.com/');
- e.dataTransfer.effectAllowed = 'linkMove';
- bde = bdo = bdo2 = fde = fdo = fdr = '';
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = function (e) {
- e.preventDefault();
- if( !bde ) { bde = e.dataTransfer.dropEffect; }
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( !bdo ) {
- bdo = e.dataTransfer.dropEffect;
- }
- //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
- //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
- bdo2 = e.dataTransfer.dropEffect;
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondragenter = function (e) {
- e.preventDefault();
- if( !fde ) { fde = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- fdr = e.dataTransfer.dropEffect;
- };
- orange.ondragend = function (e) {
- var ode = e.dataTransfer.dropEffect, temparray;
- if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
- if( bde == fdr ) {
- tmparray = [fdr];
- } else {
- tmparray = [bde,fdr];
- }
- } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
- tmparray = [bde,fdo,ode];
- } else {
- tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
- }
- tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
- document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
- };
+ var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','http://example.com/');
+ e.dataTransfer.effectAllowed = 'linkMove';
+ bde = bdo = bdo2 = fde = fdo = fdr = '';
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ if( !bde ) { bde = e.dataTransfer.dropEffect; }
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( !bdo ) {
+ bdo = e.dataTransfer.dropEffect;
+ }
+ //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
+ //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
+ bdo2 = e.dataTransfer.dropEffect;
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondragenter = function (e) {
+ e.preventDefault();
+ if( !fde ) { fde = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ fdr = e.dataTransfer.dropEffect;
+ };
+ orange.ondragend = function (e) {
+ var ode = e.dataTransfer.dropEffect, temparray;
+ if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
+ if( bde == fdr ) {
+ tmparray = [fdr];
+ } else {
+ tmparray = [bde,fdr];
+ }
+ } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
+ tmparray = [bde,fdo,ode];
+ } else {
+ tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
+ }
+ tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
+ document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <div><strong>&nbsp;</strong></div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform</li>
- <li>Continue dragging over the pink square</li>
- <li>Release the drag, then the keys</li>
- <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
- </ol>
- <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
- <!-- Anything else invalidates the modifiers, and reverts to default. -->
- <table>
- <caption>Windows</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td>None</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift</td><td>link=&gt;<strong>move</strong></td></tr>
- <tr><td>Alt</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>link</strong></td></tr>
- <tr><td>Alt+Shift</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td><strong>link</strong></td></tr>
- </tbody>
- </table>
- <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
- <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Unix/Linux</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift</td><td>link=&gt;<strong>move</strong></td></tr>
- <tr><td>Alt</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Alt+Shift</td><td>link=&gt;<strong>move</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td><strong>link</strong></td></tr>
- </tbody>
- </table>
- <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Mac</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>link</strong></td></tr>
- <tr><td>Shift</td><td><strong>link</strong></td></tr>
- <tr><td>Option/alt</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Command</td><td>link=&gt;<strong>move</strong></td></tr>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <div><strong>&nbsp;</strong></div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform</li>
+ <li>Continue dragging over the pink square</li>
+ <li>Release the drag, then the keys</li>
+ <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
+ </ol>
+ <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
+ <!-- Anything else invalidates the modifiers, and reverts to default. -->
+ <table>
+ <caption>Windows</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td>None</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift</td><td>link=&gt;<strong>move</strong></td></tr>
+ <tr><td>Alt</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>link</strong></td></tr>
+ <tr><td>Alt+Shift</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td><strong>link</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
+ <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Unix/Linux</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift</td><td>link=&gt;<strong>move</strong></td></tr>
+ <tr><td>Alt</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Alt+Shift</td><td>link=&gt;<strong>move</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td><strong>link</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Mac</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>link</strong></td></tr>
+ <tr><td>Shift</td><td><strong>link</strong></td></tr>
+ <tr><td>Option/alt</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Command</td><td>link=&gt;<strong>move</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Command</td><td>link=&gt;<strong>move</strong></td></tr>
- <tr><td>Shift+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift+Command</td><td>link=&gt;<strong>move</strong></td></tr>
- <tr><td>Command+Option</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Command</td><td>link=&gt;<strong>move</strong></td></tr>
+ <tr><td>Shift+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift+Command</td><td>link=&gt;<strong>move</strong></td></tr>
+ <tr><td>Command+Option</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift+Command</td><td>link=&gt;<strong>move</strong></td></tr>
- <tr><td>Ctrl+Command+Option</td><td><strong>link</strong></td></tr>
- <tr><td>Shift+Command+Option</td><td><strong>link</strong></td></tr>
+ <tr><td>Ctrl+Shift+Option</td><td>link=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift+Command</td><td>link=&gt;<strong>move</strong></td></tr>
+ <tr><td>Ctrl+Command+Option</td><td><strong>link</strong></td></tr>
+ <tr><td>Shift+Command+Option</td><td><strong>link</strong></td></tr>
- <tr><td>Ctrl+Shift+Command+Option</td><td><strong>link</strong></td></tr>
- </tbody>
- </table>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <tr><td>Ctrl+Shift+Command+Option</td><td><strong>link</strong></td></tr>
+ </tbody>
+ </table>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/move.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/move.html
index ca3e83c24a2..7e9caf12ca4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/move.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/move.html
@@ -1,175 +1,175 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys selecting dropEffect with 'move'</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys selecting dropEffect with 'move'</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','http://example.com/');
- e.dataTransfer.effectAllowed = 'move';
- bde = bdo = bdo2 = fde = fdo = fdr = '';
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = function (e) {
- e.preventDefault();
- if( !bde ) { bde = e.dataTransfer.dropEffect; }
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( !bdo ) {
- bdo = e.dataTransfer.dropEffect;
- }
- //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
- //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
- bdo2 = e.dataTransfer.dropEffect;
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondragenter = function (e) {
- e.preventDefault();
- if( !fde ) { fde = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
- };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- fdr = e.dataTransfer.dropEffect;
- };
- orange.ondragend = function (e) {
- var ode = e.dataTransfer.dropEffect, temparray;
- if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
- if( bde == fdr ) {
- tmparray = [fdr];
- } else {
- tmparray = [bde,fdr];
- }
- } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
- tmparray = [bde,fdo,ode];
- } else {
- tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
- }
- tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
- document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
- };
+ var countedDrops = 0, bde, bdo, bdo2, fde, fdo, fdr;
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','http://example.com/');
+ e.dataTransfer.effectAllowed = 'move';
+ bde = bdo = bdo2 = fde = fdo = fdr = '';
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ if( !bde ) { bde = e.dataTransfer.dropEffect; }
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( !bdo ) {
+ bdo = e.dataTransfer.dropEffect;
+ }
+ //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
+ //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
+ bdo2 = e.dataTransfer.dropEffect;
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondragenter = function (e) {
+ e.preventDefault();
+ if( !fde ) { fde = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
+ };
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ fdr = e.dataTransfer.dropEffect;
+ };
+ orange.ondragend = function (e) {
+ var ode = e.dataTransfer.dropEffect, temparray;
+ if( bde == bdo && bdo2 == fdr && fde == fdr && fdo == fdr && ode == fdr ) {
+ if( bde == fdr ) {
+ tmparray = [fdr];
+ } else {
+ tmparray = [bde,fdr];
+ }
+ } else if( bde == bdo && bdo2 == fdo && fde == fdo && !fdr ) {
+ tmparray = [bde,fdo,ode];
+ } else {
+ tmparray = [bde,bdo,bdo2,fde,fdo,fdr,ode];
+ }
+ tmparray[ tmparray.length - 1 ] = '<strong>' + tmparray[ tmparray.length - 1 ] + '<\/strong>';
+ document.getElementsByTagName('div')[3].innerHTML = (++countedDrops) + '. ' + tmparray.join('=&gt;');
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <div><strong>&nbsp;</strong></div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform</li>
- <li>Continue dragging over the pink square</li>
- <li>Release the drag, then the keys</li>
- <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
- </ol>
- <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
- <!-- Anything else invalidates the modifiers, and reverts to default. -->
- <table>
- <caption>Windows</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td>None</td><td><strong>move</strong></td></tr>
- <tr><td>Ctrl</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift</td><td><strong>move</strong></td></tr>
- <tr><td>Alt</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td><strong>move</strong></td></tr>
- <tr><td>Alt+Shift</td><td><strong>move</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td><strong>move</strong></td></tr>
- </tbody>
- </table>
- <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
- <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Unix/Linux</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>move</strong></td></tr>
- <tr><td>Ctrl</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift</td><td><strong>move</strong></td></tr>
- <tr><td>Alt</td><td><strong>move</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Alt</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Alt+Shift</td><td><strong>move</strong></td></tr>
- <tr><td>Ctrl+Alt+Shift</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
- </tbody>
- </table>
- <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
- <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
- <table>
- <caption>Mac</caption>
- <thead>
- <tr><th>Modifier</th><th>Drop effect</th></tr>
- </thead>
- <tbody>
- <tr><td><strong>none</td><td><strong>move</strong></td></tr>
- <tr><td>Ctrl</td><td><strong>move</strong></td></tr>
- <tr><td>Shift</td><td><strong>move</strong></td></tr>
- <tr><td>Option/alt</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Command</td><td><strong>move</strong></td></tr>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <div><strong>&nbsp;</strong></div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform</li>
+ <li>Continue dragging over the pink square</li>
+ <li>Release the drag, then the keys</li>
+ <li>Check that the correct drop effect is produced in each case. If the mouse cursor can change to indicate the final type of drop effect that will take place, it should change to the relevant type (the one in bold) once the modifier keys are pressed.</li>
+ </ol>
+ <!-- Windows Explorer uses Ctrl for copy, Shift for move, Alt or Ctrl+Shift for link. -->
+ <!-- Anything else invalidates the modifiers, and reverts to default. -->
+ <table>
+ <caption>Windows</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td>None</td><td><strong>move</strong></td></tr>
+ <tr><td>Ctrl</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift</td><td><strong>move</strong></td></tr>
+ <tr><td>Alt</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td><strong>move</strong></td></tr>
+ <tr><td>Alt+Shift</td><td><strong>move</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td><strong>move</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- KDE Konqueror uses Ctrl for copy, Shift for move, Ctrl+Shift for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <!-- Gnome Nautilus uses Ctrl for copy, Shift for move, Ctrl+Shift for link (and Alt to open a context menu). -->
+ <!-- Anything else (including Alt when combined with other modifiers) is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Unix/Linux</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>move</strong></td></tr>
+ <tr><td>Ctrl</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift</td><td><strong>move</strong></td></tr>
+ <tr><td>Alt</td><td><strong>move</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Alt</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Alt+Shift</td><td><strong>move</strong></td></tr>
+ <tr><td>Ctrl+Alt+Shift</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
+ </tbody>
+ </table>
+ <!-- Mac Finder uses Option for copy, Command for move, Command+Option for link. -->
+ <!-- Anything else is ignored completely, and has no effect on the modifier sequence. -->
+ <table>
+ <caption>Mac</caption>
+ <thead>
+ <tr><th>Modifier</th><th>Drop effect</th></tr>
+ </thead>
+ <tbody>
+ <tr><td><strong>none</td><td><strong>move</strong></td></tr>
+ <tr><td>Ctrl</td><td><strong>move</strong></td></tr>
+ <tr><td>Shift</td><td><strong>move</strong></td></tr>
+ <tr><td>Option/alt</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Command</td><td><strong>move</strong></td></tr>
- <tr><td>Ctrl+Shift</td><td><strong>move</strong></td></tr>
- <tr><td>Ctrl+Option</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Command</td><td><strong>move</strong></td></tr>
- <tr><td>Shift+Option</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift+Command</td><td><strong>move</strong></td></tr>
- <tr><td>Command+Option</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift</td><td><strong>move</strong></td></tr>
+ <tr><td>Ctrl+Option</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Command</td><td><strong>move</strong></td></tr>
+ <tr><td>Shift+Option</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift+Command</td><td><strong>move</strong></td></tr>
+ <tr><td>Command+Option</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift+Option</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift+Command</td><td><strong>move</strong></td></tr>
- <tr><td>Ctrl+Command+Option</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Shift+Command+Option</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift+Option</td><td>move=&gt;copy=&gt;<strong>none</strong></td></tr>
+ <tr><td>Ctrl+Shift+Command</td><td><strong>move</strong></td></tr>
+ <tr><td>Ctrl+Command+Option</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
+ <tr><td>Shift+Command+Option</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
- <tr><td>Ctrl+Shift+Command+Option</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
- </tbody>
- </table>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <tr><td>Ctrl+Shift+Command+Option</td><td>move=&gt;link=&gt;<strong>none</strong></td></tr>
+ </tbody>
+ </table>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/onlydropzone.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/onlydropzone.html
index f5c7bab061d..973d240878d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/onlydropzone.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/onlydropzone.html
@@ -1,70 +1,70 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys being used with a dropzone attribute</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys being used with a dropzone attribute</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text/plain','http://example.com/');
- e.dataTransfer.effectAllowed = 'copy';
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondrop = function (e) {
- //dropzone overrides the modifier, always, and ignores effectAllowed
- e.preventDefault();
- document.getElementsByTagName('div')[3].innerHTML = ( e.dataTransfer.dropEffect == 'link' ) ? 'PASS' : 'FAIL';
- };
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text/plain','http://example.com/');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondrop = function (e) {
+ //dropzone overrides the modifier, always, and ignores effectAllowed
+ e.preventDefault();
+ document.getElementsByTagName('div')[3].innerHTML = ( e.dataTransfer.dropEffect == 'link' ) ? 'PASS' : 'FAIL';
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div dropzone="link string:text/plain"></div>
- <div>&nbsp;</div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform to request a &quot;move&quot; drop effect (eg. Shift on Windows/Unix/Linux, Command on Mac)</li>
- <li>Continue dragging over the pink square</li>
- <li>If supported by the platform, the mouse cursor should show that a &quot;link&quot; drop effect will be used</li>
- <li>Release the drag, then the keys</li>
- <li>Fail if no new text appears above this list</li>
- </ol>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ <div></div>
+ <div dropzone="link string:text/plain"></div>
+ <div>&nbsp;</div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform to request a &quot;move&quot; drop effect (eg. Shift on Windows/Unix/Linux, Command on Mac)</li>
+ <li>Continue dragging over the pink square</li>
+ <li>If supported by the platform, the mouse cursor should show that a &quot;link&quot; drop effect will be used</li>
+ <li>Release the drag, then the keys</li>
+ <li>Fail if no new text appears above this list</li>
+ </ol>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/onlydropzoneevents.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/onlydropzoneevents.html
index a8033603267..8c5d5334e19 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/onlydropzoneevents.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/onlydropzoneevents.html
@@ -1,82 +1,82 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys being used with a dropzone attribute and dragenter/dragover events</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys being used with a dropzone attribute and dragenter/dragover events</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text/plain','http://example.com/');
- e.dataTransfer.effectAllowed = 'copy';
- };
- var fuchsia = document.getElementsByTagName('div')[2], fde, fdo;
- fuchsia.ondragenter = function (e) {
- fde = e.dataTransfer.dropEffect;
- };
- fuchsia.ondragover = function (e) {
- fdo = e.dataTransfer.dropEffect;
- };
- fuchsia.ondrop = function (e) {
- //dropzone overrides the modifier, always, and ignores effectAllowed
- e.preventDefault();
- var sequence = ([fde,fdo,e.dataTransfer.dropEffect]).join('=&gt;')
- var desiredsequence = (['move','move','link']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[3].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[3].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text/plain','http://example.com/');
+ e.dataTransfer.effectAllowed = 'copy';
+ };
+ var fuchsia = document.getElementsByTagName('div')[2], fde, fdo;
+ fuchsia.ondragenter = function (e) {
+ fde = e.dataTransfer.dropEffect;
+ };
+ fuchsia.ondragover = function (e) {
+ fdo = e.dataTransfer.dropEffect;
+ };
+ fuchsia.ondrop = function (e) {
+ //dropzone overrides the modifier, always, and ignores effectAllowed
+ e.preventDefault();
+ var sequence = ([fde,fdo,e.dataTransfer.dropEffect]).join('=&gt;')
+ var desiredsequence = (['move','move','link']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[3].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[3].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div dropzone="link string:text/plain"></div>
- <div>&nbsp;</div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform to request a &quot;move&quot; drop effect (eg. Shift on Windows/Unix/Linux, Command on Mac)</li>
- <li>Continue dragging over the pink square</li>
- <li>If supported by the platform, the mouse cursor should show that a &quot;link&quot; drop effect will be used</li>
- <li>Release the drag, then the keys</li>
- <li>Fail if no new text appears above this list</li>
- </ol>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ <div></div>
+ <div dropzone="link string:text/plain"></div>
+ <div>&nbsp;</div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform to request a &quot;move&quot; drop effect (eg. Shift on Windows/Unix/Linux, Command on Mac)</li>
+ <li>Continue dragging over the pink square</li>
+ <li>If supported by the platform, the mouse cursor should show that a &quot;link&quot; drop effect will be used</li>
+ <li>Release the drag, then the keys</li>
+ <li>Fail if no new text appears above this list</li>
+ </ol>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/releasemodifiersdrag.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/releasemodifiersdrag.html
index 3468d0a53fd..91c0c584bb5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/releasemodifiersdrag.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/releasemodifiersdrag.html
@@ -1,125 +1,125 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys being released before end of drag</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys being released before end of drag</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
div:first-child + div + div + div {
- height: 100px;
- width: 100px;
- background: yellow;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: yellow;
+ display: inline-block;
}
div {
- font-family: monospace;
+ font-family: monospace;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var bde, bdo, bdo2, fde, fdo, fdo2, yde, ydo, ydr;
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','http://example.com/');
- e.dataTransfer.effectAllowed = 'linkMove';
- bde = bdo = bdo2 = fde = fdo = fdo2 = yde = ydo = ydr = '';
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = function (e) {
- e.preventDefault();
- bde = e.dataTransfer.dropEffect;
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( !bdo ) {
- bdo = e.dataTransfer.dropEffect;
- }
- //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
- //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
- bdo2 = e.dataTransfer.dropEffect;
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondragenter = function (e) {
- e.preventDefault();
- fde = e.dataTransfer.dropEffect;
- };
- fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
- fdo2 = e.dataTransfer.dropEffect;
- };
- var yellow = document.getElementsByTagName('div')[3];
- yellow.ondragenter = function (e) {
- e.preventDefault();
- yde = e.dataTransfer.dropEffect;
- };
- yellow.ondragover = function (e) {
- e.preventDefault();
- if( !ydo ) { ydo = e.dataTransfer.dropEffect; }
- };
- yellow.ondrop = function (e) {
- e.preventDefault();
- ydr = e.dataTransfer.dropEffect;
- };
- orange.ondragend = function (e) {
- var sequence = ([bde,bdo,bdo2,fde,fdo,fdo2,yde,ydo,ydr,e.dataTransfer.dropEffect]).join('=&gt;')
- var desiredsequence = (['link','link','move','move','move','link','link','link','link','link']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[4].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[4].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var bde, bdo, bdo2, fde, fdo, fdo2, yde, ydo, ydr;
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','http://example.com/');
+ e.dataTransfer.effectAllowed = 'linkMove';
+ bde = bdo = bdo2 = fde = fdo = fdo2 = yde = ydo = ydr = '';
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ bde = e.dataTransfer.dropEffect;
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( !bdo ) {
+ bdo = e.dataTransfer.dropEffect;
+ }
+ //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
+ //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
+ bdo2 = e.dataTransfer.dropEffect;
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondragenter = function (e) {
+ e.preventDefault();
+ fde = e.dataTransfer.dropEffect;
+ };
+ fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
+ fdo2 = e.dataTransfer.dropEffect;
+ };
+ var yellow = document.getElementsByTagName('div')[3];
+ yellow.ondragenter = function (e) {
+ e.preventDefault();
+ yde = e.dataTransfer.dropEffect;
+ };
+ yellow.ondragover = function (e) {
+ e.preventDefault();
+ if( !ydo ) { ydo = e.dataTransfer.dropEffect; }
+ };
+ yellow.ondrop = function (e) {
+ e.preventDefault();
+ ydr = e.dataTransfer.dropEffect;
+ };
+ orange.ondragend = function (e) {
+ var sequence = ([bde,bdo,bdo2,fde,fdo,fdo2,yde,ydo,ydr,e.dataTransfer.dropEffect]).join('=&gt;')
+ var desiredsequence = (['link','link','move','move','move','link','link','link','link','link']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[4].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[4].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <div></div>
- <div><strong>&nbsp;</strong></div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform to request a &quot;move&quot; drop effect (eg. Shift on Windows/Unix/Linux, Command on Mac)</li>
- <li>If supported by the platform, the mouse cursor should show that a &quot;move&quot; drop effect will be used</li>
- <li>Continue dragging over the pink square</li>
- <li>Release the modifier keys</li>
- <li>If supported by the platform, the mouse cursor should show that a &quot;link&quot; drop effect will be used</li>
- <li>Continue dragging over the yellow square</li>
- <li>Release the drag</li>
- <li>Fail if no new text appears above this list</li>
- </ol>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <div></div>
+ <div><strong>&nbsp;</strong></div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform to request a &quot;move&quot; drop effect (eg. Shift on Windows/Unix/Linux, Command on Mac)</li>
+ <li>If supported by the platform, the mouse cursor should show that a &quot;move&quot; drop effect will be used</li>
+ <li>Continue dragging over the pink square</li>
+ <li>Release the modifier keys</li>
+ <li>If supported by the platform, the mouse cursor should show that a &quot;link&quot; drop effect will be used</li>
+ <li>Continue dragging over the yellow square</li>
+ <li>Release the drag</li>
+ <li>Fail if no new text appears above this list</li>
+ </ol>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/releasemodifiersdrop.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/releasemodifiersdrop.html
index 678a2139a6b..adaa92e8e2f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/releasemodifiersdrop.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/releasemodifiersdrop.html
@@ -1,108 +1,108 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys being released before drop</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys being released before drop</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
div {
- font-family: monospace;
+ font-family: monospace;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var bde, bdo, bdo2, fde, fdo, fdo2, fdr;
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','http://example.com/');
- e.dataTransfer.effectAllowed = 'linkMove';
- bde = bdo = bdo2 = fde = fdo = fdo2 = fdr = '';
- };
- var blue = document.getElementsByTagName('div')[1];
- blue.ondragenter = function (e) {
- e.preventDefault();
- bde = e.dataTransfer.dropEffect;
- };
- blue.ondragover = function (e) {
- e.preventDefault();
- if( !bdo ) {
- bdo = e.dataTransfer.dropEffect;
- }
- //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
- //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
- bdo2 = e.dataTransfer.dropEffect;
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondragenter = function (e) {
- e.preventDefault();
- fde = e.dataTransfer.dropEffect;
- };
- fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
- fdo2 = e.dataTransfer.dropEffect;
- };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- fdr = e.dataTransfer.dropEffect;
- };
- orange.ondragend = function (e) {
- var sequence = ([bde,bdo,bdo2,fde,fdo,fdo2,fdr,e.dataTransfer.dropEffect]).join('=&gt;')
- var desiredsequence = (['link','link','move','move','move','link','link','link']).join('=&gt;')
- if( sequence == desiredsequence ) {
- document.getElementsByTagName('div')[3].innerHTML = 'PASS';
- } else {
- document.getElementsByTagName('div')[3].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
- }
- };
+ var bde, bdo, bdo2, fde, fdo, fdo2, fdr;
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','http://example.com/');
+ e.dataTransfer.effectAllowed = 'linkMove';
+ bde = bdo = bdo2 = fde = fdo = fdo2 = fdr = '';
+ };
+ var blue = document.getElementsByTagName('div')[1];
+ blue.ondragenter = function (e) {
+ e.preventDefault();
+ bde = e.dataTransfer.dropEffect;
+ };
+ blue.ondragover = function (e) {
+ e.preventDefault();
+ if( !bdo ) {
+ bdo = e.dataTransfer.dropEffect;
+ }
+ //bdo2 always collects dropEffect, since it can change multiple times in rapid succession when pressing multiple modifiers
+ //test cares about the last dropEffect that was seen before leaving the blue square, and that will be stored in bdo2
+ bdo2 = e.dataTransfer.dropEffect;
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondragenter = function (e) {
+ e.preventDefault();
+ fde = e.dataTransfer.dropEffect;
+ };
+ fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( !fdo ) { fdo = e.dataTransfer.dropEffect; }
+ fdo2 = e.dataTransfer.dropEffect;
+ };
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ fdr = e.dataTransfer.dropEffect;
+ };
+ orange.ondragend = function (e) {
+ var sequence = ([bde,bdo,bdo2,fde,fdo,fdo2,fdr,e.dataTransfer.dropEffect]).join('=&gt;')
+ var desiredsequence = (['link','link','move','move','move','link','link','link']).join('=&gt;')
+ if( sequence == desiredsequence ) {
+ document.getElementsByTagName('div')[3].innerHTML = 'PASS';
+ } else {
+ document.getElementsByTagName('div')[3].innerHTML = 'FAIL, got:<br>'+sequence+'<br>instead of:<br>'+desiredsequence;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <div><strong>&nbsp;</strong></div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform to request a &quot;move&quot; drop effect (eg. Shift on Windows/Unix/Linux, Command on Mac)</li>
- <li>If supported by the platform, the mouse cursor should show that a &quot;move&quot; drop effect will be used</li>
- <li>Continue dragging over the pink square</li>
- <li>Release the modifier keys, and wait for at least half a second</li>
- <li>If supported by the platform, the mouse cursor should show that a &quot;link&quot; drop effect will be used</li>
- <li>Release the drag, then the keys</li>
- <li>Fail if no new text appears above this list</li>
- </ol>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <div><strong>&nbsp;</strong></div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform to request a &quot;move&quot; drop effect (eg. Shift on Windows/Unix/Linux, Command on Mac)</li>
+ <li>If supported by the platform, the mouse cursor should show that a &quot;move&quot; drop effect will be used</li>
+ <li>Continue dragging over the pink square</li>
+ <li>Release the modifier keys, and wait for at least half a second</li>
+ <li>If supported by the platform, the mouse cursor should show that a &quot;link&quot; drop effect will be used</li>
+ <li>Release the drag, then the keys</li>
+ <li>Fail if no new text appears above this list</li>
+ </ol>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/scriptmodified.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/scriptmodified.html
index 7053fc9aa2b..c5b17b463f8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/scriptmodified.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/modifiers/scriptmodified.html
@@ -1,99 +1,99 @@
<!doctype html>
<html>
- <head>
- <title>Modifier keys selecting dropEffect with script overriding it</title>
- <style type="text/css">
+ <head>
+ <title>Modifier keys selecting dropEffect with script overriding it</title>
+ <style type="text/css">
div:first-child {
- height: 100px;
- width: 100px;
- background: orange;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: orange;
+ display: inline-block;
}
div:first-child + div {
- height: 100px;
- width: 100px;
- background: blue;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: blue;
+ display: inline-block;
}
div:first-child + div + div {
- height: 100px;
- width: 100px;
- background: fuchsia;
- display: inline-block;
+ height: 100px;
+ width: 100px;
+ background: fuchsia;
+ display: inline-block;
}
table {
- display: inline-table;
- margin-right: 1em;
- border-collapse: collapse;
+ display: inline-table;
+ margin-right: 1em;
+ border-collapse: collapse;
}
table, th, td {
- border: 1px solid black;
+ border: 1px solid black;
}
thead th {
- background: silver;
- color: black;
+ background: silver;
+ color: black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var dragenterbefore = '', dragenterafter = '', dragoverbefore = '', dragoverafter = '';
- var orange = document.getElementsByTagName('div')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','http://example.com/');
- e.dataTransfer.effectAllowed = 'all';
- };
- var fuchsia = document.getElementsByTagName('div')[2];
- fuchsia.ondragenter = function (e) {
- e.preventDefault();
- if( e.dataTransfer.dropEffect != 'link' ) {
- dragenterbefore = e.dataTransfer.dropEffect;
- }
- try {
- e.dataTransfer.dropEffect = 'move';
- } catch(e) {}
- if( e.dataTransfer.dropEffect != 'move' ) {
- dragenterafter = e.dataTransfer.dropEffect;
- }
- };
- fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( e.dataTransfer.dropEffect != 'link' ) {
- dragoverbefore = e.dataTransfer.dropEffect;
- }
- try {
- e.dataTransfer.dropEffect = 'move';
- } catch(e) {}
- if( e.dataTransfer.dropEffect != 'move' ) {
- dragoverafter = e.dataTransfer.dropEffect;
- }
- };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- document.getElementsByTagName('div')[3].innerHTML = ( dragenterbefore || dragenterafter || dragoverbefore || dragoverafter || e.dataTransfer.dropEffect != 'move' ) ? ( 'FAIL' +
- ( dragenterbefore ? ( '<br>dragenter.dropEffect was '+dragenterbefore+' instead of link' ) : '' ) +
- ( dragenterafter ? ( '<br>dragenter.dropEffect after writing was '+dragenterafter+' instead of move' ) : '' ) +
- ( dragoverbefore ? ( '<br>dragover.dropEffect was '+dragoverbefore+' instead of link' ) : '' ) +
- ( dragoverafter ? ( '<br>dragover.dropEffect after writing was '+dragoverafter+' instead of move' ) : '' ) +
- ( ( e.dataTransfer.dropEffect != 'move' ) ? ( '<br>drop.dropEffect was '+e.dataTransfer.dropEffect+' instead of move' ) : '' )
- ) : 'PASS';
- };
+ var dragenterbefore = '', dragenterafter = '', dragoverbefore = '', dragoverafter = '';
+ var orange = document.getElementsByTagName('div')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','http://example.com/');
+ e.dataTransfer.effectAllowed = 'all';
+ };
+ var fuchsia = document.getElementsByTagName('div')[2];
+ fuchsia.ondragenter = function (e) {
+ e.preventDefault();
+ if( e.dataTransfer.dropEffect != 'link' ) {
+ dragenterbefore = e.dataTransfer.dropEffect;
+ }
+ try {
+ e.dataTransfer.dropEffect = 'move';
+ } catch(e) {}
+ if( e.dataTransfer.dropEffect != 'move' ) {
+ dragenterafter = e.dataTransfer.dropEffect;
+ }
+ };
+ fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( e.dataTransfer.dropEffect != 'link' ) {
+ dragoverbefore = e.dataTransfer.dropEffect;
+ }
+ try {
+ e.dataTransfer.dropEffect = 'move';
+ } catch(e) {}
+ if( e.dataTransfer.dropEffect != 'move' ) {
+ dragoverafter = e.dataTransfer.dropEffect;
+ }
+ };
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ document.getElementsByTagName('div')[3].innerHTML = ( dragenterbefore || dragenterafter || dragoverbefore || dragoverafter || e.dataTransfer.dropEffect != 'move' ) ? ( 'FAIL' +
+ ( dragenterbefore ? ( '<br>dragenter.dropEffect was '+dragenterbefore+' instead of link' ) : '' ) +
+ ( dragenterafter ? ( '<br>dragenter.dropEffect after writing was '+dragenterafter+' instead of move' ) : '' ) +
+ ( dragoverbefore ? ( '<br>dragover.dropEffect was '+dragoverbefore+' instead of link' ) : '' ) +
+ ( dragoverafter ? ( '<br>dragover.dropEffect after writing was '+dragoverafter+' instead of move' ) : '' ) +
+ ( ( e.dataTransfer.dropEffect != 'move' ) ? ( '<br>drop.dropEffect was '+e.dataTransfer.dropEffect+' instead of move' ) : '' )
+ ) : 'PASS';
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
- <div></div>
- <div></div>
- <div>&nbsp;</div>
- <ol>
- <li>Drag the orange square over the blue square</li>
- <li>Press the relevant modifier keys for your platform to request a &quot;link&quot; drop effect (eg. Alt on Windows, Ctrl+Shift on Unix/Linux, Command+Option on Mac)</li>
- <li>Continue dragging over the pink square</li>
- <li>If supported by the platform, the mouse cursor should show that a &quot;move&quot; drop effect will be used</li>
- <li>Release the drag, then the keys</li>
- <li>Fail if no new text appears above this list</li>
- </ol>
+ <div draggable="true"></div>
+ <div></div>
+ <div></div>
+ <div>&nbsp;</div>
+ <ol>
+ <li>Drag the orange square over the blue square</li>
+ <li>Press the relevant modifier keys for your platform to request a &quot;link&quot; drop effect (eg. Alt on Windows, Ctrl+Shift on Unix/Linux, Command+Option on Mac)</li>
+ <li>Continue dragging over the pink square</li>
+ <li>If supported by the platform, the mouse cursor should show that a &quot;move&quot; drop effect will be used</li>
+ <li>Release the drag, then the keys</li>
+ <li>Fail if no new text appears above this list</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/moving-window.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/moving-window.html
index 810ade95fff..a11c1018006 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/moving-window.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/moving-window.html
@@ -5,23 +5,23 @@
window.onload = function() {
var li1 = document.getElementsByTagName('li')[3], li2 = document.getElementsByTagName('li')[4];
li1.ondragstart = li2.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
this.innerHTML = 'FAIL';
};
li1.onmousedown = function () { window.moveBy(0,10); };
li2.onmousedown = function () { setTimeout(function () {
- window.moveBy(0,10);
+ window.moveBy(0,10);
},10); };
};
</script>
<p></p>
<ol>
- <li onclick="window.open(location.href,'_blank','width=500,height=300');">Click here to open this page in a popup window.</li>
- <li>Ensure that this popup window is not maximised (or tab, in the case of tabs being rendered as an MDI).</li>
- <li>Ensure that your browser settings allow browser windows to be moved by scripts.</li>
- <li draggable='true'>Press your mouse down on this text but do not move it afterwards. Fail if a drag operation has started (eg. if the mouse cursor shows that you are dragging something, or if some drag placeholder text appears, or if this text changes).</li>
- <li draggable='true'>Press your mouse down on this text but do not move it afterwards. Fail if a drag operation has started (eg. if the mouse cursor shows that you are dragging something, or if some drag placeholder text appears, or if this text changes).</li>
+ <li onclick="window.open(location.href,'_blank','width=500,height=300');">Click here to open this page in a popup window.</li>
+ <li>Ensure that this popup window is not maximised (or tab, in the case of tabs being rendered as an MDI).</li>
+ <li>Ensure that your browser settings allow browser windows to be moved by scripts.</li>
+ <li draggable='true'>Press your mouse down on this text but do not move it afterwards. Fail if a drag operation has started (eg. if the mouse cursor shows that you are dragging something, or if some drag placeholder text appears, or if this text changes).</li>
+ <li draggable='true'>Press your mouse down on this text but do not move it afterwards. Fail if a drag operation has started (eg. if the mouse cursor shows that you are dragging something, or if some drag placeholder text appears, or if this text changes).</li>
</ol>
<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/overlappingwindows.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/overlappingwindows.html
index cac76acf405..ed707478da4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/overlappingwindows.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/overlappingwindows.html
@@ -11,13 +11,13 @@
list-style-position: inside;
}
div {
- height: 100px;
- width: 100px;
- position: absolute;
- top: 50%;
- left: 50%;
- margin-top: -50px;
- margin-left: -50px;
+ height: 100px;
+ width: 100px;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-top: -50px;
+ margin-left: -50px;
background: orange;
}
</style>
@@ -27,30 +27,30 @@
window.onload = function() {
var orange = document.getElementsByTagName('div')[0];
orange.ondragstart = function(e) {
- e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', 'dummy text');
};
var blue = document.getElementsByTagName('ol')[0];
blue.ondragenter = blue.ondragover = function(e) {
- e.preventDefault();
+ e.preventDefault();
};
blue.ondrop = function(e) {
- e.preventDefault();
- this.innerHTML = 'FAIL';
+ e.preventDefault();
+ this.innerHTML = 'FAIL';
};
};
</script>
<ol>
- <li>Position the browser window so that the blue part of this page extends behind the system taskbar.</li>
- <li>Use your mouse to drag the orange box over a part of the taskbar that overlays the blue part of this page.</li>
- <li>If supported by the platform, the mouse cursor should <em>not</em> show the browser's custom &quot;copy&quot; cursor, and should instead show the system's expected cursor for dropping on that part of the taskbar.</li>
- <li>Release the drag. Fail if the text on this page changes.</li>
- <li>Reload and repeat this test for:<ul>
- <li>Where the blue part of this page extends under an always-on-top window (eg. the Windows Task Manager).</li>
- <li>Where the blue part of this page extends under an always-on-top notification (eg. a system tray info balloon).</li>
- </ul></li>
+ <li>Position the browser window so that the blue part of this page extends behind the system taskbar.</li>
+ <li>Use your mouse to drag the orange box over a part of the taskbar that overlays the blue part of this page.</li>
+ <li>If supported by the platform, the mouse cursor should <em>not</em> show the browser's custom &quot;copy&quot; cursor, and should instead show the system's expected cursor for dropping on that part of the taskbar.</li>
+ <li>Release the drag. Fail if the text on this page changes.</li>
+ <li>Reload and repeat this test for:<ul>
+ <li>Where the blue part of this page extends under an always-on-top window (eg. the Windows Task Manager).</li>
+ <li>Where the blue part of this page extends under an always-on-top notification (eg. a system tray info balloon).</li>
+ </ul></li>
</ol>
<div draggable='true'></div>
<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/placeholderposition1.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/placeholderposition1.html
index ff61224a34c..b79bd4fbcee 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/placeholderposition1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/placeholderposition1.html
@@ -1,14 +1,14 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - position of the placeholder for a dragged element</title>
- <style type="text/css">
+ <head>
+ <title>drag and drop - position of the placeholder for a dragged element</title>
+ <style type="text/css">
div { background: orange; color: black; width: 200px; padding: 10px; border: 10px solid orange; margin: 10px; }
- </style>
- </head>
- <body>
+ </style>
+ </head>
+ <body>
- <div draggable="true">Drag the orange block around the page (and only over the page), using the pixel in its top-left corner. When dragging, the top-left corner of the dragged placeholder should exactly match the position of the mouse cursor.</div>
+ <div draggable="true">Drag the orange block around the page (and only over the page), using the pixel in its top-left corner. When dragging, the top-left corner of the dragged placeholder should exactly match the position of the mouse cursor.</div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/placeholderposition2.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/placeholderposition2.html
index 5899f726639..373309d1a92 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/placeholderposition2.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/placeholderposition2.html
@@ -1,14 +1,14 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - position of the placeholder for a dragged selection</title>
- <style type="text/css">
+ <head>
+ <title>drag and drop - position of the placeholder for a dragged selection</title>
+ <style type="text/css">
p { cursor: default; }
- </style>
- </head>
- <body>
+ </style>
+ </head>
+ <body>
- <p>Select the first word in this sentence. Drag the selection downwards, using the pixel in the top-left corner of the selection highlight. When dragging, the top-left corner of the dragged placeholder should exactly match the position of the mouse cursor.</p>
+ <p>Select the first word in this sentence. Drag the selection downwards, using the pixel in the top-left corner of the selection highlight. When dragging, the top-left corner of the dragged placeholder should exactly match the position of the mouse cursor.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-001.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-001.html
index 62dc5847ad2..96a50200441 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-001.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-001.html
@@ -1,21 +1,21 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop in Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop in Flash</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow.</p>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow.</p>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-002.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-002.html
index caa5f1a9d3e..2958458e7ea 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-002.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-002.html
@@ -1,39 +1,39 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop alternating between Flash and page</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop alternating between Flash and page</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the pink square onto the blue square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal.</li>
- <li>Without moving your mouse outside the black square, drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow. Fail if the orange square does not immediately respond to the drag attempt.</li>
- <li>Drag the pink square onto the yellow square and release it. The drag placeholder should disappear, and the mouse cursor should return to normal. Fail if the pink square does not immediately respond to the drag attempt.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the pink square onto the blue square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal.</li>
+ <li>Without moving your mouse outside the black square, drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow. Fail if the orange square does not immediately respond to the drag attempt.</li>
+ <li>Drag the pink square onto the yellow square and release it. The drag placeholder should disappear, and the mouse cursor should return to normal. Fail if the pink square does not immediately respond to the drag attempt.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-003.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-003.html
index 15c672e622b..592192124ff 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-003.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-003.html
@@ -1,22 +1,22 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Incomplete drag and drop in Flash</title>
- <style type="text/css">
+ <head>
+ <title>Incomplete drag and drop in Flash</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <!-- Test is based on expected behaviour where the mouseup is sent to the plugin because a drag was in operation. -->
- <p>Drag the orange square until the mouse is outside the black square, then release it. Move the mouse over the blue square. Fail if the orange square continues to follow the mouse.</p>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <!-- Test is based on expected behaviour where the mouseup is sent to the plugin because a drag was in operation. -->
+ <p>Drag the orange square until the mouse is outside the black square, then release it. Move the mouse over the blue square. Fail if the orange square continues to follow the mouse.</p>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-004.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-004.html
index 430eae42b68..a4e776be74e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-004.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-004.html
@@ -1,41 +1,41 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop alternating between incompleted Flash drag and page</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop alternating between incompleted Flash drag and page</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the orange square until the mouse is outside the right side of the black square but the edge of the orange square can still be seen, then release it.</li>
- <li>Without passing over the black square again, move the mouse to the pink square.</li>
- <li>Drag the pink square onto the blue square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal. Fail if the pink square does not immediately respond to the drag attempt.</li>
- <li>Without passing over the black square again, move the mouse to the orange square. Fail if the orange square moves.</li>
- <li>Drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow. Fail if the orange square does not immediately respond to the drag attempt.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the orange square until the mouse is outside the right side of the black square but the edge of the orange square can still be seen, then release it.</li>
+ <li>Without passing over the black square again, move the mouse to the pink square.</li>
+ <li>Drag the pink square onto the blue square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal. Fail if the pink square does not immediately respond to the drag attempt.</li>
+ <li>Without passing over the black square again, move the mouse to the orange square. Fail if the orange square moves.</li>
+ <li>Drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow. Fail if the orange square does not immediately respond to the drag attempt.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-005.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-005.html
index cf5343f2aa4..67035acc71a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-005.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-005.html
@@ -1,26 +1,26 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop in Flash with Alt+Tab</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop in Flash with Alt+Tab</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the orange square over the blue square.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>Move the mouse around inside the black square. The orange square should continue to follow the mouse.</li>
- </ol>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the orange square over the blue square.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>Move the mouse around inside the black square. The orange square should continue to follow the mouse.</li>
+ </ol>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-006.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-006.html
index b77539fa2be..5322edd7d66 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-006.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-006.html
@@ -1,26 +1,26 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop in Flash with Alt+Tab over page</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop in Flash with Alt+Tab over page</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the orange square around until the mouse is outside the black square.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>Move the mouse inside the black square. The orange square should continue to follow the mouse.</li>
- </ol>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the orange square around until the mouse is outside the black square.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>Move the mouse inside the black square. The orange square should continue to follow the mouse.</li>
+ </ol>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-007.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-007.html
index 44a69a4ce2d..8ec0bebd3b2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-007.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-007.html
@@ -1,42 +1,42 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with Alt+Tab over Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with Alt+Tab over Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the pink square over the blue square. The mouse cursor should be the no-drop cursor, or the platform's drop-allowed cursor.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>The mouse cursor should be the same cursor as in step 2.</li>
- <li>Move the mouse outside the black square. The drag placeholder should follow the mouse (reappearing if it disappeared in step 2).</li>
- <li>Release the drag. The drag placeholder should disappear, and the cursor should revert to the default mouse cursor.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the pink square over the blue square. The mouse cursor should be the no-drop cursor, or the platform's drop-allowed cursor.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>The mouse cursor should be the same cursor as in step 2.</li>
+ <li>Move the mouse outside the black square. The drag placeholder should follow the mouse (reappearing if it disappeared in step 2).</li>
+ <li>Release the drag. The drag placeholder should disappear, and the cursor should revert to the default mouse cursor.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-008.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-008.html
index 31d3b8d5168..017696e6079 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-008.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-008.html
@@ -1,41 +1,41 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with right click over Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with right click over Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the pink square over the blue square.</li>
- <li>Without releasing the drag, click the right mouse button.</li>
- <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled; moving the mouse outside the black square should not cause the drag placeholder to continue following the mouse, and the mouse cursor should revert to default.</li>
- <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled; moving the mouse outside the black square should cause the drag placeholder to continue following the mouse, and the mouse cursor should show as no-drop or drop-allowed.</li>
- <li>Fail in either case if the drag placeholder gets stuck temporarily or permanently over the blue square. Fail if an inappropriate right click function begins (eg. context menu opens).</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the pink square over the blue square.</li>
+ <li>Without releasing the drag, click the right mouse button.</li>
+ <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled; moving the mouse outside the black square should not cause the drag placeholder to continue following the mouse, and the mouse cursor should revert to default.</li>
+ <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled; moving the mouse outside the black square should cause the drag placeholder to continue following the mouse, and the mouse cursor should show as no-drop or drop-allowed.</li>
+ <li>Fail in either case if the drag placeholder gets stuck temporarily or permanently over the blue square. Fail if an inappropriate right click function begins (eg. context menu opens).</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-009.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-009.html
index 4c9cb2cab02..74761894d32 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-009.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-009.html
@@ -1,40 +1,40 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with right click and release over Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with right click and release over Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the pink square over the blue square.</li>
- <li>Without releasing the drag, click the right mouse button, then release the drag.</li>
- <li>Fail if the drag placeholder gets stuck over the blue square.</li>
- <li>Move the mouse outside the black square. The mouse cursor should be the default mouse cursor.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the pink square over the blue square.</li>
+ <li>Without releasing the drag, click the right mouse button, then release the drag.</li>
+ <li>Fail if the drag placeholder gets stuck over the blue square.</li>
+ <li>Move the mouse outside the black square. The mouse cursor should be the default mouse cursor.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-010.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-010.html
index f1f8933933d..7ce900d8fd8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-010.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-010.html
@@ -1,41 +1,41 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with middle click over Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with middle click over Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the pink square over the blue square.</li>
- <li>Without releasing the drag, click the middle mouse button.</li>
- <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled; moving the mouse outside the black square should not cause the drag placeholder to continue following the mouse, and the mouse cursor should revert to default.</li>
- <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled; moving the mouse outside the black square should cause the drag placeholder to continue following the mouse, and the mouse cursor should show as no-drop or drop-allowed.</li>
- <li>Fail in either case if the drag placeholder gets stuck temporarily or permanently over the blue square. Fail if an inappropriate middle click function begins (eg. paste-and-go).</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the pink square over the blue square.</li>
+ <li>Without releasing the drag, click the middle mouse button.</li>
+ <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled; moving the mouse outside the black square should not cause the drag placeholder to continue following the mouse, and the mouse cursor should revert to default.</li>
+ <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled; moving the mouse outside the black square should cause the drag placeholder to continue following the mouse, and the mouse cursor should show as no-drop or drop-allowed.</li>
+ <li>Fail in either case if the drag placeholder gets stuck temporarily or permanently over the blue square. Fail if an inappropriate middle click function begins (eg. paste-and-go).</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-011.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-011.html
index 8a5753b0cb9..e22c4eec224 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-011.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-011.html
@@ -1,40 +1,40 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with middle click and release over Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with middle click and release over Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the pink square over the blue square.</li>
- <li>Without releasing the drag, click the middle mouse button, then release the drag.</li>
- <li>Fail if the drag placeholder gets stuck over the blue square.</li>
- <li>Move the mouse outside the black square. The mouse cursor should be the default mouse cursor.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the pink square over the blue square.</li>
+ <li>Without releasing the drag, click the middle mouse button, then release the drag.</li>
+ <li>Fail if the drag placeholder gets stuck over the blue square.</li>
+ <li>Move the mouse outside the black square. The mouse cursor should be the default mouse cursor.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-101.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-101.html
index 58d03fde851..5f28430aa8f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-101.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-101.html
@@ -1,21 +1,21 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop in windowless Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop in windowless Flash</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow.</p>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow.</p>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-102.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-102.html
index 428c191fb22..79bb0dfd7e6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-102.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-102.html
@@ -1,39 +1,39 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop alternating between windowless Flash and page</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop alternating between windowless Flash and page</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the pink square onto the blue square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal.</li>
- <li>Without moving your mouse outside the black square, drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow. Fail if the orange square does not immediately respond to the drag attempt.</li>
- <li>Drag the pink square onto the yellow square and release it. The drag placeholder should disappear, and the mouse cursor should return to normal. Fail if the pink square does not immediately respond to the drag attempt.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the pink square onto the blue square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal.</li>
+ <li>Without moving your mouse outside the black square, drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow. Fail if the orange square does not immediately respond to the drag attempt.</li>
+ <li>Drag the pink square onto the yellow square and release it. The drag placeholder should disappear, and the mouse cursor should return to normal. Fail if the pink square does not immediately respond to the drag attempt.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-103.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-103.html
index 2ac8f1df635..3166b054f51 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-103.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-103.html
@@ -1,22 +1,22 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Incomplete drag and drop in windowless Flash</title>
- <style type="text/css">
+ <head>
+ <title>Incomplete drag and drop in windowless Flash</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <!-- Test is based on expected behaviour of windowless plugin where the mouseup is not sent to the plugin even though a drag was in operation. -->
- <p>Drag the orange square until the mouse is outside the black square, then release it. Move the mouse over the blue square. Pass if the orange square follows the mouse.</p>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <!-- Test is based on expected behaviour of windowless plugin where the mouseup is not sent to the plugin even though a drag was in operation. -->
+ <p>Drag the orange square until the mouse is outside the black square, then release it. Move the mouse over the blue square. Pass if the orange square follows the mouse.</p>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-104.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-104.html
index 9f4a3ec1c01..53128eeb4b3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-104.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-104.html
@@ -1,41 +1,41 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop alternating between incompleted windowless Flash drag and page</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop alternating between incompleted windowless Flash drag and page</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the orange square until the mouse is outside the right side of the black square but the edge of the orange square can still be seen, then release it.</li>
- <li>Without passing over the black square again, move the mouse to the pink square.</li>
- <li>Drag the pink square onto the white area inside the black square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal. The orange square should jump to the mouse position. Fail if the pink square does not immediately respond to the drag attempt.</li>
- <li>The orange square may optionally continue to follow the mouse.</li>
- <!-- There are no rules here. Browsers may mask the mouseup event from the plugin (since a dnd operation was in progress), or they may pass the mouseup to the plugin (since the dnd operation has completed). -->
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the orange square until the mouse is outside the right side of the black square but the edge of the orange square can still be seen, then release it.</li>
+ <li>Without passing over the black square again, move the mouse to the pink square.</li>
+ <li>Drag the pink square onto the white area inside the black square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal. The orange square should jump to the mouse position. Fail if the pink square does not immediately respond to the drag attempt.</li>
+ <li>The orange square may optionally continue to follow the mouse.</li>
+ <!-- There are no rules here. Browsers may mask the mouseup event from the plugin (since a dnd operation was in progress), or they may pass the mouseup to the plugin (since the dnd operation has completed). -->
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-105.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-105.html
index 3b072a4237e..a146a4608df 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-105.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-105.html
@@ -1,26 +1,26 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop in windowless Flash with Alt+Tab</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop in windowless Flash with Alt+Tab</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the orange square over the blue square.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>Move the mouse around inside the black square. The orange square should continue to follow the mouse.</li>
- </ol>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the orange square over the blue square.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>Move the mouse around inside the black square. The orange square should continue to follow the mouse.</li>
+ </ol>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-106.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-106.html
index f38fd302f78..4ee1923d2e4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-106.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-106.html
@@ -1,26 +1,26 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop in windowless Flash with Alt+Tab over page</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop in windowless Flash with Alt+Tab over page</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the orange square around until the mouse is outside the black square.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>Move the mouse inside the black square. The orange square should continue to follow the mouse.</li>
- </ol>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the orange square around until the mouse is outside the black square.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>Move the mouse inside the black square. The orange square should continue to follow the mouse.</li>
+ </ol>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-107.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-107.html
index 972df68847b..96dc126a26d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-107.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-107.html
@@ -1,43 +1,43 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with Alt+Tab over windowless Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with Alt+Tab over windowless Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <p><strong>Note:</strong> Mac has no no-drop cursor.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the pink square over the blue square. The mouse cursor should be the no-drop cursor, or the platform's drop-allowed cursor.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>The mouse cursor should be the same cursor as in step 2.</li>
- <li>Move the mouse outside the black square. The drag placeholder should follow the mouse (reappearing if it disappeared in step 2).</li>
- <li>Release the drag. The drag placeholder should disappear, and the cursor should revert to the default mouse cursor.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <p><strong>Note:</strong> Mac has no no-drop cursor.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the pink square over the blue square. The mouse cursor should be the no-drop cursor, or the platform's drop-allowed cursor.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>The mouse cursor should be the same cursor as in step 2.</li>
+ <li>Move the mouse outside the black square. The drag placeholder should follow the mouse (reappearing if it disappeared in step 2).</li>
+ <li>Release the drag. The drag placeholder should disappear, and the cursor should revert to the default mouse cursor.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-108.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-108.html
index 7a145d06004..ba69dfedb30 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-108.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-108.html
@@ -1,41 +1,41 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with right click over windowless Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with right click over windowless Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the pink square over the blue square.</li>
- <li>Without releasing the drag, click the right mouse button.</li>
- <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled; moving the mouse outside the black square should not cause the drag placeholder to continue following the mouse, and the mouse cursor should revert to default.</li>
- <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled; moving the mouse outside the black square should cause the drag placeholder to continue following the mouse, and the mouse cursor should show as no-drop or drop-allowed.</li>
- <li>Fail in either case if the drag placeholder gets stuck temporarily or permanently over the blue square. Fail if an inappropriate right click function begins (eg. context menu opens).</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the pink square over the blue square.</li>
+ <li>Without releasing the drag, click the right mouse button.</li>
+ <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled; moving the mouse outside the black square should not cause the drag placeholder to continue following the mouse, and the mouse cursor should revert to default.</li>
+ <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled; moving the mouse outside the black square should cause the drag placeholder to continue following the mouse, and the mouse cursor should show as no-drop or drop-allowed.</li>
+ <li>Fail in either case if the drag placeholder gets stuck temporarily or permanently over the blue square. Fail if an inappropriate right click function begins (eg. context menu opens).</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-109.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-109.html
index e28e166d5fd..8748d8745d4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-109.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-109.html
@@ -1,40 +1,40 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with right click and release over windowless Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with right click and release over windowless Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the pink square over the blue square.</li>
- <li>Without releasing the drag, click the right mouse button, then release the drag.</li>
- <li>Fail if the drag placeholder gets stuck over the blue square.</li>
- <li>Move the mouse outside the black square. The mouse cursor should be the default mouse cursor.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the pink square over the blue square.</li>
+ <li>Without releasing the drag, click the right mouse button, then release the drag.</li>
+ <li>Fail if the drag placeholder gets stuck over the blue square.</li>
+ <li>Move the mouse outside the black square. The mouse cursor should be the default mouse cursor.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-110.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-110.html
index 07e6241cfd1..fbf5b48fa4a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-110.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-110.html
@@ -1,41 +1,41 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with middle click over windowless Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with middle click over windowless Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the pink square over the blue square.</li>
- <li>Without releasing the drag, click the middle mouse button.</li>
- <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled; moving the mouse outside the black square should not cause the drag placeholder to continue following the mouse, and the mouse cursor should revert to default.</li>
- <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled; moving the mouse outside the black square should cause the drag placeholder to continue following the mouse, and the mouse cursor should show as no-drop or drop-allowed.</li>
- <li>Fail in either case if the drag placeholder gets stuck temporarily or permanently over the blue square. Fail if an inappropriate middle click function begins (eg. paste-and-go).</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the pink square over the blue square.</li>
+ <li>Without releasing the drag, click the middle mouse button.</li>
+ <li>If the platform's normal behaviour is to cancel a drag (eg. Windows and Unix+KDE), then the drag should be cancelled; moving the mouse outside the black square should not cause the drag placeholder to continue following the mouse, and the mouse cursor should revert to default.</li>
+ <li>If the platform's normal behaviour is not to cancel a drag (eg. Mac and Unix+Gnome), then the drag should not be cancelled; moving the mouse outside the black square should cause the drag placeholder to continue following the mouse, and the mouse cursor should show as no-drop or drop-allowed.</li>
+ <li>Fail in either case if the drag placeholder gets stuck temporarily or permanently over the blue square. Fail if an inappropriate middle click function begins (eg. paste-and-go).</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-111.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-111.html
index 587c70f24c4..8687c74b121 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-111.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-111.html
@@ -1,40 +1,40 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with middle click and release over windowless Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with middle click and release over windowless Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the pink square over the blue square.</li>
- <li>Without releasing the drag, click the middle mouse button, then release the drag.</li>
- <li>Fail if the drag placeholder gets stuck over the blue square.</li>
- <li>Move the mouse outside the black square. The mouse cursor should be the default mouse cursor.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the pink square over the blue square.</li>
+ <li>Without releasing the drag, click the middle mouse button, then release the drag.</li>
+ <li>Fail if the drag placeholder gets stuck over the blue square.</li>
+ <li>Move the mouse outside the black square. The mouse cursor should be the default mouse cursor.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndrop.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-203.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-203.html
index a4d08ecd44e..ed6048783bd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-203.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-203.html
@@ -1,22 +1,22 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Incomplete drag and drop with deactivate in Flash</title>
- <style type="text/css">
+ <head>
+ <title>Incomplete drag and drop with deactivate in Flash</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <!-- Test is based on expected behaviour where the mouseup is sent to the plugin because a drag was in operation. -->
- <p>Drag the orange square until the mouse is outside the black square, then release it. Move the mouse over the blue square. Fail if the orange square continues to follow the mouse.</p>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <!-- Test is based on expected behaviour where the mouseup is sent to the plugin because a drag was in operation. -->
+ <p>Drag the orange square until the mouse is outside the black square, then release it. Move the mouse over the blue square. Fail if the orange square continues to follow the mouse.</p>
+ <script type="text/javascript">
var plugincode = '<object data="dragndropleavedeactivate.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-204.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-204.html
index 4ba76e65294..e11ce92f0a3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-204.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-204.html
@@ -1,41 +1,41 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with deactivate alternating between incompleted Flash drag and page</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with deactivate alternating between incompleted Flash drag and page</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the orange square until the mouse is outside the right side of the black square but the edge of the orange square can still be seen, then release it.</li>
- <li>Without passing over the black square again, move the mouse to the pink square.</li>
- <li>Drag the pink square onto the blue square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal. Fail if the pink square does not immediately respond to the drag attempt.</li>
- <li>Without passing over the black square again, move the mouse to the orange square. Fail if the orange square moves.</li>
- <li>Drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow. Fail if the orange square does not immediately respond to the drag attempt.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the orange square until the mouse is outside the right side of the black square but the edge of the orange square can still be seen, then release it.</li>
+ <li>Without passing over the black square again, move the mouse to the pink square.</li>
+ <li>Drag the pink square onto the blue square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal. Fail if the pink square does not immediately respond to the drag attempt.</li>
+ <li>Without passing over the black square again, move the mouse to the orange square. Fail if the orange square moves.</li>
+ <li>Drag the orange square onto the blue square and release it. The orange square should disappear, and the blue square should turn yellow. Fail if the orange square does not immediately respond to the drag attempt.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndropleavedeactivate.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-205.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-205.html
index e49add30468..eaf3e188578 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-205.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-205.html
@@ -1,27 +1,27 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with deactivate in Flash with Alt+Tab</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with deactivate in Flash with Alt+Tab</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the orange square over the blue square.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>Move the mouse around inside the black square. The orange square should not follow the mouse.</li>
- <li>Release the mouse button over the white area inside the black square. The orange square should disappear, and the blue square should turn yellow.</li>
- </ol>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the orange square over the blue square.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>Move the mouse around inside the black square. The orange square should not follow the mouse.</li>
+ <li>Release the mouse button over the white area inside the black square. The orange square should disappear, and the blue square should turn yellow.</li>
+ </ol>
+ <script type="text/javascript">
var plugincode = '<object data="dragndropleavedeactivate.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-206.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-206.html
index b3bae6e48f9..a39ab0bcbf9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-206.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-206.html
@@ -1,26 +1,26 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with deactivate in Flash with Alt+Tab over page</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with deactivate in Flash with Alt+Tab over page</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the orange square around until the mouse is outside the black square.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>Move the mouse over the blue square. The orange square should not continue to follow the mouse.</li>
- </ol>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the orange square around until the mouse is outside the black square.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>Move the mouse over the blue square. The orange square should not continue to follow the mouse.</li>
+ </ol>
+ <script type="text/javascript">
var plugincode = '<object data="dragndropleavedeactivate.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-207.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-207.html
index bfb4c4d1062..a9ddcba494a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-207.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-207.html
@@ -1,43 +1,43 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with deactivate with Alt+Tab over Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with deactivate with Alt+Tab over Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <p><strong>Note:</strong> Mac has no no-drop cursor.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the pink square over the blue square. The mouse cursor should be the no-drop cursor, or the platform's drop-allowed cursor.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>The mouse cursor should be the same cursor as in step 2.</li>
- <li>Move the mouse outside the black square. The drag placeholder should follow the mouse (reappearing if it disappeared in step 2).</li>
- <li>Release the drag. The drag placeholder should disappear, and the cursor should revert to the default mouse cursor.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <p><strong>Note:</strong> Mac has no no-drop cursor.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the pink square over the blue square. The mouse cursor should be the no-drop cursor, or the platform's drop-allowed cursor.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>The mouse cursor should be the same cursor as in step 2.</li>
+ <li>Move the mouse outside the black square. The drag placeholder should follow the mouse (reappearing if it disappeared in step 2).</li>
+ <li>Release the drag. The drag placeholder should disappear, and the cursor should revert to the default mouse cursor.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndropleavedeactivate.swf" type="application/x-shockwave-flash">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-303.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-303.html
index 275e207df33..91307e61600 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-303.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-303.html
@@ -1,22 +1,22 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Incomplete drag and drop with deactivate in windowless Flash</title>
- <style type="text/css">
+ <head>
+ <title>Incomplete drag and drop with deactivate in windowless Flash</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <!-- Test is based on expected behaviour of windowless plugin where the mouseup is not sent to the plugin even though a drag was in operation. -->
- <p>Drag the orange square until the mouse is outside the black square, then release it. Move the mouse over the blue square. Pass if the orange square follows the mouse.</p>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <!-- Test is based on expected behaviour of windowless plugin where the mouseup is not sent to the plugin even though a drag was in operation. -->
+ <p>Drag the orange square until the mouse is outside the black square, then release it. Move the mouse over the blue square. Pass if the orange square follows the mouse.</p>
+ <script type="text/javascript">
var plugincode = '<object data="dragndropleavedeactivate.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-304.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-304.html
index a68a8c3fad0..d3d27ebb690 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-304.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-304.html
@@ -1,41 +1,41 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with deactivate alternating between incompleted windowless Flash drag and page</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with deactivate alternating between incompleted windowless Flash drag and page</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Drag the orange square until the mouse is outside the right side of the black square but the edge of the orange square can still be seen, then release it.</li>
- <li>Without passing over the black square again, move the mouse to the pink square.</li>
- <li>Drag the pink square onto the white area inside the black square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal. The orange square should jump to the mouse position. Fail if the pink square does not immediately respond to the drag attempt.</li>
- <li>The orange square may optionally continue to follow the mouse.</li>
- <!-- There are no rules here. Browsers may mask the mouseup event from the plugin (since a dnd operation was in progress), or they may pass the mouseup to the plugin (since the dnd operation has completed). -->
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Drag the orange square until the mouse is outside the right side of the black square but the edge of the orange square can still be seen, then release it.</li>
+ <li>Without passing over the black square again, move the mouse to the pink square.</li>
+ <li>Drag the pink square onto the white area inside the black square and release it. The drag placeholder should disappear (either when releasing, or when passing the black square), and the mouse cursor should return to normal. The orange square should jump to the mouse position. Fail if the pink square does not immediately respond to the drag attempt.</li>
+ <li>The orange square may optionally continue to follow the mouse.</li>
+ <!-- There are no rules here. Browsers may mask the mouseup event from the plugin (since a dnd operation was in progress), or they may pass the mouseup to the plugin (since the dnd operation has completed). -->
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndropleavedeactivate.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-305.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-305.html
index 3a702789aed..ed8561b9c3b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-305.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-305.html
@@ -1,26 +1,26 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with deactivate in windowless Flash with Alt+Tab</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with deactivate in windowless Flash with Alt+Tab</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the orange square over the blue square.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>Move the mouse around inside the black square. The orange square should continue to follow the mouse.</li>
- </ol>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the orange square over the blue square.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>Move the mouse around inside the black square. The orange square should continue to follow the mouse.</li>
+ </ol>
+ <script type="text/javascript">
var plugincode = '<object data="dragndropleavedeactivate.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-306.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-306.html
index a8248bd696d..8ea60019624 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-306.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-306.html
@@ -1,26 +1,26 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with deactivate in windowless Flash with Alt+Tab over page</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with deactivate in windowless Flash with Alt+Tab over page</title>
+ <style type="text/css">
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the orange square around until the mouse is outside the black square.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>Move the mouse inside the black square. The orange square should continue to follow the mouse.</li>
- </ol>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the orange square around until the mouse is outside the black square.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>Move the mouse inside the black square. The orange square should continue to follow the mouse.</li>
+ </ol>
+ <script type="text/javascript">
var plugincode = '<object data="dragndropleavedeactivate.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-307.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-307.html
index 1def298cc16..0e55a7b1bf4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-307.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugin/plugin-dnd-307.html
@@ -1,42 +1,42 @@
<!DOCTYPE html>
<html>
- <head>
- <title>Drag and drop with deactivate with Alt+Tab over windowless Flash</title>
- <style type="text/css">
+ <head>
+ <title>Drag and drop with deactivate with Alt+Tab over windowless Flash</title>
+ <style type="text/css">
div {
- width: 100px;
- height: 100px;
- background: fuchsia;
+ width: 100px;
+ height: 100px;
+ background: fuchsia;
}
object {
- width: 400px;
- height: 400px;
- border: 5px solid black;
+ width: 400px;
+ height: 400px;
+ border: 5px solid black;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <ol>
- <li>Ensure at least one other program is running, with its window maximised.</li>
- <li>Drag the pink square over the blue square. The mouse cursor should be the no-drop cursor, or the platform's drop-allowed cursor.</li>
- <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
- <li>The mouse cursor should be the same cursor as in step 2.</li>
- <li>Move the mouse outside the black square. The drag placeholder should follow the mouse (reappearing if it disappeared in step 2).</li>
- <li>Release the drag. The drag placeholder should disappear, and the cursor should revert to the default mouse cursor.</li>
- </ol>
- <div draggable="true"></div>
- <script type="text/javascript">
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <ol>
+ <li>Ensure at least one other program is running, with its window maximised.</li>
+ <li>Drag the pink square over the blue square. The mouse cursor should be the no-drop cursor, or the platform's drop-allowed cursor.</li>
+ <li>Without releasing the mouse button, use Alt+Tab (or your system's equivalent) to switch to the other program, then back to this one.</li>
+ <li>The mouse cursor should be the same cursor as in step 2.</li>
+ <li>Move the mouse outside the black square. The drag placeholder should follow the mouse (reappearing if it disappeared in step 2).</li>
+ <li>Release the drag. The drag placeholder should disappear, and the cursor should revert to the default mouse cursor.</li>
+ </ol>
+ <div draggable="true"></div>
+ <script type="text/javascript">
var plugincode = '<object data="dragndropleavedeactivate.swf" type="application/x-shockwave-flash"><param name="wmode" value="opaque">Flash plugin is required for this test.</object>';
- </script>
- <script type="text/javascript" src="click-to-activate.js"></script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <script type="text/javascript" src="click-to-activate.js"></script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugindrop.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugindrop.html
index 548e4da8c1e..c34e60c4a94 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugindrop.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/plugindrop.html
@@ -1,24 +1,24 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop sequence should end when dropping over a plugin</title>
- <style type="text/css">
+ <head>
+ <title>drag and drop sequence should end when dropping over a plugin</title>
+ <style type="text/css">
div {
- background: orange;
- height: 100px;
- width: 100px;
+ background: orange;
+ height: 100px;
+ width: 100px;
}
object {
- height: 100px;
- width: 100px;
+ height: 100px;
+ width: 100px;
}
- </style>
- </head>
- <body>
+ </style>
+ </head>
+ <body>
- <p>Use your pointing device to drag the orange square onto the blue square, and release it. The drag placeholder should disappear after releasing (or as the pointer moves over the blue square). Try dragging the orange square again. Fail if it does not respond when trying to drag it.</p>
- <div draggable="true" ondragstart="event.dataTransfer.setData('Text','dummy text');"></div>
- <p><object data="../resources/boxnavy.swf"></object></p>
+ <p>Use your pointing device to drag the orange square onto the blue square, and release it. The drag placeholder should disappear after releasing (or as the pointer moves over the blue square). Try dragging the orange square again. Fail if it does not respond when trying to drag it.</p>
+ <div draggable="true" ondragstart="event.dataTransfer.setData('Text','dummy text');"></div>
+ <p><object data="../resources/boxnavy.swf"></object></p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-between-ui.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-between-ui.html
index a0e94f65b7c..e2fc81089df 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-between-ui.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-between-ui.html
@@ -1,20 +1,20 @@
<!doctype html>
<html>
- <head>
- <title>Dragging text from UI widgets to each other</title>
- </head>
- <body>
+ <head>
+ <title>Dragging text from UI widgets to each other</title>
+ </head>
+ <body>
- <ol>
- <li>Select some text in the address bar.</li>
- <li>Drag the selection to another text input in the UI, and release it.</li>
- <li>Pass if:<ol>
- <li>A visible representation of the selected text appears to be dragged.</li>
- <li>The mouse cursor shows that the drop will be allowed over the input.</li>
- <li>The selected text appears in the input.</li>
- </ol></li>
- <li>Repeat the test with other UI text inputs as drag source/destination.</li>
- </ol>
+ <ol>
+ <li>Select some text in the address bar.</li>
+ <li>Drag the selection to another text input in the UI, and release it.</li>
+ <li>Pass if:<ol>
+ <li>A visible representation of the selected text appears to be dragged.</li>
+ <li>The mouse cursor shows that the drop will be allowed over the input.</li>
+ <li>The selected text appears in the input.</li>
+ </ol></li>
+ <li>Repeat the test with other UI text inputs as drag source/destination.</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-from-os.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-from-os.html
index 14f3db335d3..cdda1f40ca6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-from-os.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-from-os.html
@@ -1,17 +1,17 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - dragging a selection from the OS</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - dragging a selection from the OS</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
- <p>This testcase requires an external application that allows dragging of selections into other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
- <p>Move the browser window so it sits about 200 pixels down from the top of the screen.</p>
- <p>Subtest 1. Write some text into the external application (if needed), containing both unicode and Latin characters. Select the text in the external application, and drag the selection into the following input:<br><textarea rows="3" cols="50"></textarea><br>Pass if the text you selected appears in the input.</p>
- <p>Subtest 2. Select the text in the external application, and drag the selection into the following block:
- <span style="background:orange;display:block;min-height:100px;width:300px;" ondragenter="return false;" ondragover="return false;" ondrop="this.innerHTML = arguments[0].dataTransfer.getData('text/plain');return false;"></span>
- Pass if the text you selected appears in the block.</p>
+ <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
+ <p>This testcase requires an external application that allows dragging of selections into other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
+ <p>Move the browser window so it sits about 200 pixels down from the top of the screen.</p>
+ <p>Subtest 1. Write some text into the external application (if needed), containing both unicode and Latin characters. Select the text in the external application, and drag the selection into the following input:<br><textarea rows="3" cols="50"></textarea><br>Pass if the text you selected appears in the input.</p>
+ <p>Subtest 2. Select the text in the external application, and drag the selection into the following block:
+ <span style="background:orange;display:block;min-height:100px;width:300px;" ondragenter="return false;" ondragover="return false;" ondrop="this.innerHTML = arguments[0].dataTransfer.getData('text/plain');return false;"></span>
+ Pass if the text you selected appears in the block.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-from-ui.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-from-ui.html
index 1fc552ec6d5..a2a5d09f968 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-from-ui.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-from-ui.html
@@ -1,20 +1,20 @@
<!doctype html>
<html>
- <head>
- <title>Dragging text from UI widgets</title>
- </head>
- <body>
+ <head>
+ <title>Dragging text from UI widgets</title>
+ </head>
+ <body>
- <ol>
- <li>Select some text in the address bar.</li>
- <li>Drag the selection to the following textarea, and release it: <br><textarea rows="3" cols="50"></textarea></li>
- <li>Pass if:<ol>
- <li>A visible representation of the selected text appears to be dragged.</li>
- <li>The mouse cursor shows that the drop will be allowed over the textarea.</li>
- <li>The selected text appears in the textarea.</li>
- </ol></li>
- <li>Repeat the test with other UI text inputs, including ones that allow linebreaks (if any).</li>
- </ol>
+ <ol>
+ <li>Select some text in the address bar.</li>
+ <li>Drag the selection to the following textarea, and release it: <br><textarea rows="3" cols="50"></textarea></li>
+ <li>Pass if:<ol>
+ <li>A visible representation of the selected text appears to be dragged.</li>
+ <li>The mouse cursor shows that the drop will be allowed over the textarea.</li>
+ <li>The selected text appears in the textarea.</li>
+ </ol></li>
+ <li>Repeat the test with other UI text inputs, including ones that allow linebreaks (if any).</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-os.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-os.html
index c4c72954714..d596014695a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-os.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-os.html
@@ -1,14 +1,14 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - dragging a selection onto the OS</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - dragging a selection onto the OS</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
- <p>This testcase requires an external application that accepts dropping of text from other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
- <p>Select this text. Drag the selection to the other application and release it. Pass if the text you selected appears in the other application, and the drag placeholder disappears when the drag is released.</p>
- <p>Disable JavaScript and repeat the test. It should still pass.</p>
+ <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
+ <p>This testcase requires an external application that accepts dropping of text from other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
+ <p>Select this text. Drag the selection to the other application and release it. Pass if the text you selected appears in the other application, and the drag placeholder disappears when the drag is released.</p>
+ <p>Disable JavaScript and repeat the test. It should still pass.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-ui-via.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-ui-via.html
index f4f1cf15993..11eb2092e25 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-ui-via.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-ui-via.html
@@ -1,19 +1,19 @@
<!doctype html>
<html>
- <head>
- <title>Dragging text to UI widgets via window decoration</title>
- </head>
- <body>
+ <head>
+ <title>Dragging text to UI widgets via window decoration</title>
+ </head>
+ <body>
- <p>This test assumes that the address bar is positioned below the window's title bar, and above the page. If your browser uses an alternative layout, adjust your testing accordingly to ensure that the testing interacts with the edges of the window decoration.</p>
- <ol>
- <li>Select some text on this page.</li>
- <li>Drag the selection to your browser's title bar.</li>
- <li>Drag the selection back to your browser's address field. Fail if the mouse cursor shows that the text cannot be dropped.</li>
- <li>Fail if the cursor and/or input focus caret respond in the wrong position (ie. if the drag operation seems to think the address field is offset from its actual location).</li>
- <li>Release it. Pass if the selected text appears in the address field.</li>
- <li>Repeat the test with other UI text inputs.</li>
- </ol>
+ <p>This test assumes that the address bar is positioned below the window's title bar, and above the page. If your browser uses an alternative layout, adjust your testing accordingly to ensure that the testing interacts with the edges of the window decoration.</p>
+ <ol>
+ <li>Select some text on this page.</li>
+ <li>Drag the selection to your browser's title bar.</li>
+ <li>Drag the selection back to your browser's address field. Fail if the mouse cursor shows that the text cannot be dropped.</li>
+ <li>Fail if the cursor and/or input focus caret respond in the wrong position (ie. if the drag operation seems to think the address field is offset from its actual location).</li>
+ <li>Release it. Pass if the selected text appears in the address field.</li>
+ <li>Repeat the test with other UI text inputs.</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-ui.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-ui.html
index 9c3a60387fc..43b0877f8b6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-ui.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-to-ui.html
@@ -1,16 +1,16 @@
<!doctype html>
<html>
- <head>
- <title>Dragging text to UI widgets</title>
- </head>
- <body>
+ <head>
+ <title>Dragging text to UI widgets</title>
+ </head>
+ <body>
- <ol>
- <li>Select some text on this page.</li>
- <li>Drag the selection to your browser's address field. Fail if the mouse cursor shows that the text cannot be dropped.</li>
- <li>Release it. Pass if the selected text appears in the address field.</li>
- <li>Repeat the test with other UI text inputs.</li>
- </ol>
+ <ol>
+ <li>Select some text on this page.</li>
+ <li>Drag the selection to your browser's address field. Fail if the mouse cursor shows that the text cannot be dropped.</li>
+ <li>Release it. Pass if the selected text appears in the address field.</li>
+ <li>Repeat the test with other UI text inputs.</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-ui-to-self.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-ui-to-self.html
index 363416de840..897a2588389 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-ui-to-self.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-ui-to-self.html
@@ -1,21 +1,21 @@
<!doctype html>
<html>
- <head>
- <title>Dragging text from UI widgets to themselves</title>
- </head>
- <body>
+ <head>
+ <title>Dragging text from UI widgets to themselves</title>
+ </head>
+ <body>
- <ol>
- <li>Select all text in the address bar.</li>
- <li>Drag the selection around a little, and release it over the address bar again.</li>
- <li>Try to select the text in this sentence.</li>
- <li>Pass if:<ol>
- <li>A visible representation of the selected text appears to be dragged.</li>
- <li>The mouse cursor shows that the drop will be allowed over the address bar.</li>
- <li>The text on this page can be selected afterwards.</li>
- </ol></li>
- <li>Repeat the test with other UI text inputs as drag source/destination.</li>
- </ol>
+ <ol>
+ <li>Select all text in the address bar.</li>
+ <li>Drag the selection around a little, and release it over the address bar again.</li>
+ <li>Try to select the text in this sentence.</li>
+ <li>Pass if:<ol>
+ <li>A visible representation of the selected text appears to be dragged.</li>
+ <li>The mouse cursor shows that the drop will be allowed over the address bar.</li>
+ <li>The text on this page can be selected afterwards.</li>
+ </ol></li>
+ <li>Repeat the test with other UI text inputs as drag source/destination.</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-unicode-to-os.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-unicode-to-os.html
index ed093f6fa74..e43fac61734 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-unicode-to-os.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/selection-unicode-to-os.html
@@ -1,13 +1,13 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - dragging a selection containing unicode onto the OS</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - dragging a selection containing unicode onto the OS</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
- <p>This testcase requires an external application that accepts dropping of text from other applications, and supports unicode - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
- <p>Select the following non-English text --> 中文אידישрусский &lt;-- Drag the selection to the other application and release it. Pass if the text you selected appears in the other application, and the drag placeholder disappears when the drag is released.</p>
+ <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
+ <p>This testcase requires an external application that accepts dropping of text from other applications, and supports unicode - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
+ <p>Select the following non-English text --> 中文אידישрусский &lt;-- Drag the selection to the other application and release it. Pass if the text you selected appears in the other application, and the drag placeholder disappears when the drag is released.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/taskbardrop.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/taskbardrop.html
index 4b4e6c468ef..b96606cd377 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/taskbardrop.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/taskbardrop.html
@@ -1,23 +1,23 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - dropping on the taskbar</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - dropping on the taskbar</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where dragging over taskbar buttons will switch between applications.</p>
- <p>Ensure that at least one other application is open and visible on the taskbar. Maximise this browser window. Select this text. Drag the selection downwards, over a blank part of the system taskbar, and release the drag. Drag the selection again, over the taskbar button for the other application (without passing over any other buttons on the taskbar). Fail if the drag placeholder does not appear when dragging the selection. Pass if the other application becomes focused.</p>
- <p>Repeat this test while dropping on other parts of the taskbar, such as:</p>
- <ul>
- <li>The Start menu button (or your system's equivalent)</li>
- <li>The Quick Launch bar (or your system's equivalent)</li>
- <li>The System Tray (or your system's equivalent)</li>
- <li>The expander button for the System Tray (or your system's equivalent)</li>
- <li>The button for another application</li>
- <li>The label for a folder toolbar - drop a folder onto the Windows taskbar to create one (or your system's equivalent)</li>
- <li>The menu button for a folder toolbar (or your system's equivalent)</li>
- </ul>
- <p><strong>WARNING: different operating system versions handle this differently - Windows XP Taskbar in particular can cause several more problems than the Windows 7 Taskbar</strong></p>
+ <p>This test is only relevant on platforms where dragging over taskbar buttons will switch between applications.</p>
+ <p>Ensure that at least one other application is open and visible on the taskbar. Maximise this browser window. Select this text. Drag the selection downwards, over a blank part of the system taskbar, and release the drag. Drag the selection again, over the taskbar button for the other application (without passing over any other buttons on the taskbar). Fail if the drag placeholder does not appear when dragging the selection. Pass if the other application becomes focused.</p>
+ <p>Repeat this test while dropping on other parts of the taskbar, such as:</p>
+ <ul>
+ <li>The Start menu button (or your system's equivalent)</li>
+ <li>The Quick Launch bar (or your system's equivalent)</li>
+ <li>The System Tray (or your system's equivalent)</li>
+ <li>The expander button for the System Tray (or your system's equivalent)</li>
+ <li>The button for another application</li>
+ <li>The label for a folder toolbar - drop a folder onto the Windows taskbar to create one (or your system's equivalent)</li>
+ <li>The menu button for a folder toolbar (or your system's equivalent)</li>
+ </ul>
+ <p><strong>WARNING: different operating system versions handle this differently - Windows XP Taskbar in particular can cause several more problems than the Windows 7 Taskbar</strong></p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/taskbarminimise.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/taskbarminimise.html
index 8531ad93503..36ffe2f5c9e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/taskbarminimise.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/taskbarminimise.html
@@ -1,12 +1,12 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - minimising using the taskbar</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - minimising using the taskbar</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where dragging over the taskbar (or a specific button on it) will minimise all applications.</p>
- <p>Select this text. Drag the selection downwards, over a blank part of the system taskbar (or a minimise-all button if provided by the system). Hold the drag until all applications have minimised, then drag upwards over the desktop. Pass if the drag placeholder is still visible.</p>
+ <p>This test is only relevant on platforms where dragging over the taskbar (or a specific button on it) will minimise all applications.</p>
+ <p>Select this text. Drag the selection downwards, over a blank part of the system taskbar (or a minimise-all button if provided by the system). Hold the drag until all applications have minimised, then drag upwards over the desktop. Pass if the drag placeholder is still visible.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/text-os-to-os.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/text-os-to-os.html
index 030972b70ad..95ca8b597cf 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/text-os-to-os.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/text-os-to-os.html
@@ -1,13 +1,13 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - dragging items from the OS to the OS, via the browser window</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - dragging items from the OS to the OS, via the browser window</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
- <p>This testcase requires an external application that accepts dropping of text from other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
- <p>Select some text in the external application. Drag the selection over the browser window, then back to the other application and release it. Pass if the text you selected appears in the other application.</p>
+ <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
+ <p>This testcase requires an external application that accepts dropping of text from other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
+ <p>Select some text in the external application. Drag the selection over the browser window, then back to the other application and release it. Pass if the text you selected appears in the other application.</p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/platform/text-to-os.html b/tests/wpt/web-platform-tests/html/editing/dnd/platform/text-to-os.html
index ce57c43eb87..1bf754e2c36 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/platform/text-to-os.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/platform/text-to-os.html
@@ -1,19 +1,19 @@
<!doctype html>
<html>
- <head>
- <title>drag and drop - dragging plain text onto the OS</title>
- </head>
- <body>
+ <head>
+ <title>drag and drop - dragging plain text onto the OS</title>
+ </head>
+ <body>
- <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
- <p>This testcase requires an external application that accepts dropping of text from other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
- <p draggable="true">Drag this paragraph to the other application and release it. Pass if &quot;PASS&quot; appears in the other application, and the drag placeholder disappears when the drag is released.</p>
- <script type="text/javascript">
+ <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
+ <p>This testcase requires an external application that accepts dropping of text from other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
+ <p draggable="true">Drag this paragraph to the other application and release it. Pass if &quot;PASS&quot; appears in the other application, and the drag placeholder disappears when the drag is released.</p>
+ <script type="text/javascript">
document.getElementsByTagName('p')[2].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('Text', 'PASS');
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('Text', 'PASS');
};
- </script>
+ </script>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/reload/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/reload/001.xhtml
index 87b97d4153b..a4c0cba89ed 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/reload/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/reload/001.xhtml
@@ -4,36 +4,36 @@
<title>Reload during canvas drag and drop roundtrip</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));
- window.location.reload();}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));
+ window.location.reload();}
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern around page and then drag it back and drop on itself. It should be duplicated once you drop it.</p>
<script type="application/ecmascript">
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/reload/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/reload/002.xhtml
index 47d14528ae2..19ba5d03731 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/reload/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/reload/002.xhtml
@@ -4,17 +4,17 @@
<title>Reload during PNG image drag and drop roundtrip</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
</script>
</head>
<body>
<p><img ondragstart="event.dataTransfer.effectAllowed = 'copy';window.location.reload()" ondragenter="event.preventDefault()" ondrop="addImage(event)" ondragover="return false" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
<p>Drag circle around page and then drag it back and drop on itself. It should be duplicated once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/reload/003.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/reload/003.xhtml
index 9fadf392656..133df3525cf 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/reload/003.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/reload/003.xhtml
@@ -4,17 +4,17 @@
<title>Reload during SVG image drag and drop roundtrip</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
</script>
</head>
<body>
<p><img ondragstart="event.dataTransfer.effectAllowed = 'copy';window.location.reload()" ondragenter="event.preventDefault()" ondrop="addImage(event)" ondragover="return false" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle"/></p>
<p>Drag circle around page and then drag it back and drop on itself. It should be duplicated once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/reload/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/reload/006.xhtml
index 953dc47adf0..9d633554f12 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/reload/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/reload/006.xhtml
@@ -4,11 +4,11 @@
<title>Reload during link drag and drop roundtrip</title>
<script type="application/ecmascript">
function checkLink(event)
- {document.querySelector('a').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'}
+ {document.querySelector('a').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'}
</script>
</head>
<body>
<p><a href="data:text/plain,1" ondragstart="event.dataTransfer.effectAllowed = 'copy';window.location.reload()" ondragenter="event.preventDefault()" ondrop="checkLink(event)" ondragover="return false">Drag me</a></p>
<p>Drag link around page and then drag it back and drop on itself. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/reload/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/reload/007.xhtml
index 0a4160e9a5e..b5ab3e785c0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/reload/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/reload/007.xhtml
@@ -4,22 +4,22 @@
<title>Reload during drag and drop roundtrip with text/plain data</title>
<style type="text/css">
div[ondragenter]
- {width:40px;
- min-height:40px;
- margin-top:20px;
- padding:40px;
- color:white;
- background-color:navy;}
+ {width:40px;
+ min-height:40px;
+ margin-top:20px;
+ padding:40px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div
- draggable="true"
- ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/plain',' PASS ');window.location.reload();"
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ draggable="true"
+ ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/plain',' PASS ');window.location.reload();"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
<p>Drag blue box around page and then drag it back and drop on itself. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/reload/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/reload/008.xhtml
index a0c49e6eae1..1da66103e46 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/reload/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/reload/008.xhtml
@@ -4,22 +4,22 @@
<title>Reload during drag and drop roundtrip with text/uri-list data</title>
<style type="text/css">
div[ondragenter]
- {width:40px;
- min-height:40px;
- margin-top:20px;
- padding:40px;
- color:white;
- background-color:navy;}
+ {width:40px;
+ min-height:40px;
+ margin-top:20px;
+ padding:40px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div
- draggable="true"
- ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/uri-list','data:text/plain,PASS');window.location.reload()"
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/uri-list').substr(16,4) + ' '))"
+ draggable="true"
+ ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/uri-list','data:text/plain,PASS');window.location.reload()"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/uri-list').substr(16,4) + ' '))"
/>
<p>Drag blue box around page and then drag it back and drop on itself. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/reload/009.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/reload/009.xhtml
index 5cb61fb8d72..421e562dc76 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/reload/009.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/reload/009.xhtml
@@ -4,13 +4,13 @@
<title>Reload during link drag and drop from object</title>
<style type="text/css">
object
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body dropzone="copy string:text/uri-list" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'">
<object type="application/xhtml+xml" data="009-1.xhtml">XHTML document</object>
<p>Drag link above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/reload/010.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/reload/010.xhtml
index 86663f722ac..c214dff6deb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/reload/010.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/reload/010.xhtml
@@ -4,13 +4,13 @@
<title>Reload during text input selection drag and drop from object</title>
<style type="text/css">
object
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body dropzone="copy string:text/plain" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<object type="application/xhtml+xml" data="010-1.xhtml">XHTML document</object>
<p>Drag selection above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/reload/011.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/reload/011.xhtml
index 837b0853626..d24f5003fd8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/reload/011.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/reload/011.xhtml
@@ -4,13 +4,13 @@
<title>Reload during selection drag and drop from object</title>
<style type="text/css">
object
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body dropzone="copy string:text/plain" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<object type="application/xhtml+xml" data="011-1.xhtml">XHTML document</object>
<p>Drag selection above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/reload/012-2.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/reload/012-2.xhtml
index ae8560b14c2..84bd41f9e4e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/reload/012-2.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/reload/012-2.xhtml
@@ -4,25 +4,25 @@
<title>Reload during drag and drop: helper file</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/001.xhtml
index 1ab5013cc88..f8cd7575f8f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/001.xhtml
@@ -4,25 +4,25 @@
<title>Removing canvas element during drag and drop</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));
- document.querySelector('p').removeChild(canvas);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));
+ document.querySelector('p').removeChild(canvas);}
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern to the silver box below and drop it. It should be copied to the box once you drop it there.</p>
<div ondragover="return false" ondrop="addImage(event)"/>
@@ -30,14 +30,14 @@ function start(event)
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/002.xhtml
index 02a9dc7484c..8ebf1e2b8af 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/002.xhtml
@@ -4,16 +4,16 @@
<title>Removing image element during drag and drop of PNG image</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
@@ -21,4 +21,4 @@ function addImage(event)
<p>Drag green circle to the silver box below and drop it. It should be copied to the box once you drop it there.</p>
<div ondragover="return false" ondrop="addImage(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/003.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/003.xhtml
index 33eeb6a5793..e7a88093a6b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/003.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/003.xhtml
@@ -4,16 +4,16 @@
<title>Removing image element during drag and drop of SVG image</title>
<style type="text/css">
div
- {height:100px;
- width:100px;
- padding:20px;
- background-color:silver;}
+ {height:100px;
+ width:100px;
+ padding:20px;
+ background-color:silver;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
@@ -21,4 +21,4 @@ function addImage(event)
<p>Drag green circle to the silver box below and drop it. It should be copied to the box once you drop it there.</p>
<div ondragover="return false" ondrop="addImage(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/004.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/004.xhtml
index 44db0193349..4544b2e0a0e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/004.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/004.xhtml
@@ -4,11 +4,11 @@
<title>Removing input element during drag and drop of selection</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -16,4 +16,4 @@ div
<p>Drag selection above to the navy box below and drop it. You should see word PASS once you drop it in the box.</p>
<div ondragover="return false" ondrop="document.querySelector('div').appendChild(document.createTextNode((event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'))"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/005.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/005.xhtml
index 23faac7cd49..da07f5bdd49 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/005.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/005.xhtml
@@ -4,11 +4,11 @@
<title>Removing span element during drag and drop of selection</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('span'))">
@@ -16,4 +16,4 @@ div
<p>Drag selection above to the navy box below and drop it. You should see word PASS once you drop it in the box.</p>
<div ondragover="return false" ondrop="document.querySelector('div').appendChild(document.createTextNode((event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'))"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/006.xhtml
index 0b3b92c6033..86c1e66c390 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/006.xhtml
@@ -4,11 +4,11 @@
<title>Removing a element during drag and drop of link</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
@@ -16,4 +16,4 @@ div
<p>Drag link above to the navy box below and drop it. You should see word PASS once you drop it in the box.</p>
<div ondragover="return false" ondrop="document.querySelector('div').appendChild(document.createTextNode((event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'))"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/007.xhtml
index fbda1862325..e82c29bc752 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/007.xhtml
@@ -4,25 +4,25 @@
<title>Removing div element during drag and drop with text/plain data</title>
<style type="text/css">
div
- {width:40px;
- height:40px;
- margin-top:20px;
- padding:40px;
- color:white;
- background-color:gray;}
+ {width:40px;
+ height:40px;
+ margin-top:20px;
+ padding:40px;
+ color:white;
+ background-color:gray;}
p + div
- {background-color:navy;}
+ {background-color:navy;}
</style>
</head>
<body>
<div
- draggable="true"
- ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/plain','PASS');document.querySelector('body').removeChild(document.querySelector('div'))"
+ draggable="true"
+ ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/plain','PASS');document.querySelector('body').removeChild(document.querySelector('div'))"
/>
<p>Drag gray box above to the navy box below and drop it. You should see word PASS once you drop it.</p>
<div
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/008.xhtml
index 24aff7ea910..c52a1c9cf0a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/008.xhtml
@@ -4,25 +4,25 @@
<title>Removing div element during drag and drop with text/uri-list data</title>
<style type="text/css">
div
- {width:40px;
- height:40px;
- margin-top:20px;
- padding:40px;
- color:white;
- background-color:gray;}
+ {width:40px;
+ height:40px;
+ margin-top:20px;
+ padding:40px;
+ color:white;
+ background-color:gray;}
p + div
- {background-color:navy;}
+ {background-color:navy;}
</style>
</head>
<body>
<div
- draggable="true"
- ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/uri-list','data:text/plain,PASS');document.querySelector('body').removeChild(document.querySelector('div'))"
+ draggable="true"
+ ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/uri-list','data:text/plain,PASS');document.querySelector('body').removeChild(document.querySelector('div'))"
/>
<p>Drag gray box above to the navy box below and drop it. You should see word PASS once you drop it.</p>
<div
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/uri-list').substr(16,4)))"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/uri-list').substr(16,4)))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/009.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/009.xhtml
index 5d1aa6989d4..7ccf07402e5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/009.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/009.xhtml
@@ -4,13 +4,13 @@
<title>Changing iframe content during drag and drop of link</title>
<style type="text/css">
iframe
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('iframe').src = 'data:text/plain,Drop%20link%20outside%20this%20frame'" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'">
<iframe src="helper-drag-me-link.xhtml">XHTML document</iframe>
<p>Drag link above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/010.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/010.xhtml
index f0e60927704..151cbaeec8a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/010.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/010.xhtml
@@ -4,13 +4,13 @@
<title>Changing object content during drag and drop of link</title>
<style type="text/css">
object
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('object').setAttribute('data','data:text/plain,Drop%20link%20outside%20this%20frame')" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'">
<object type="application/xhtml+xml" data="helper-drag-me-link.xhtml">XHTML document</object>
<p>Drag link above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/011.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/011.xhtml
index 3fc9f0a07aa..43b04516a67 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/011.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/011.xhtml
@@ -4,13 +4,13 @@
<title>Changing iframe content during drag and drop of text input selection</title>
<style type="text/css">
iframe
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('iframe').src = 'data:text/plain,Drop%20selection%20outside%20this%20frame'" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<iframe src="helper-drag-me-input.xhtml">XHTML document</iframe>
<p>Drag selection above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/012.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/012.xhtml
index ab6e2db37e5..1bff73a477e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/012.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/012.xhtml
@@ -4,13 +4,13 @@
<title>Changing object content during drag and drop of text input selection</title>
<style type="text/css">
object
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('object').setAttribute('data','data:text/plain,Drop%20selection%20outside%20this%20frame')" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<object type="application/xhtml+xml" data="helper-drag-me-input.xhtml">XHTML document</object>
<p>Drag selection above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/013.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/013.xhtml
index 0bacf9e5676..8567afc52fb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/013.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/013.xhtml
@@ -4,13 +4,13 @@
<title>Changing iframe content during drag and drop of selection</title>
<style type="text/css">
iframe
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('iframe').src = 'data:text/plain,Drop%20selection%20outside%20this%20frame'" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<iframe src="helper-drag-me-p.xhtml">XHTML document</iframe>
<p>Drag selection above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/014.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/014.xhtml
index 93fae6f31a1..c3da31ef5e8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/014.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/014.xhtml
@@ -4,13 +4,13 @@
<title>Changing object content during drag and drop of selection</title>
<style type="text/css">
object
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('object').setAttribute('data','data:text/plain,Drop%20selection%20outside%20this%20frame')" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<object type="application/xhtml+xml" data="helper-drag-me-p.xhtml">XHTML document</object>
<p>Drag selection above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/015.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/015.xhtml
index dcba8d49025..59f2db7982c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/015.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/015.xhtml
@@ -4,13 +4,13 @@
<title>Removing iframe during drag and drop of link</title>
<style type="text/css">
iframe
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('body').removeChild(document.querySelector('iframe'))" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'">
<iframe src="helper-drag-me-link.xhtml">XHTML document</iframe>
<p>Drag link above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/016.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/016.xhtml
index 3e2881eb0b6..2f71d92f305 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/016.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/016.xhtml
@@ -4,13 +4,13 @@
<title>Removing object during drag and drop of link</title>
<style type="text/css">
object
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('body').removeChild(document.querySelector('object'))" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'">
<object type="application/xhtml+xml" data="helper-drag-me-link.xhtml">XHTML document</object>
<p>Drag link above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/017.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/017.xhtml
index d7c33101743..dfc8ed8cc04 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/017.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/017.xhtml
@@ -4,13 +4,13 @@
<title>Removing iframe during drag and drop of text input selection</title>
<style type="text/css">
iframe
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('body').removeChild(document.querySelector('iframe'))" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<iframe src="helper-drag-me-input.xhtml">XHTML document</iframe>
<p>Drag selection above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/018.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/018.xhtml
index 2dda93fe938..aaa35b7b477 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/018.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/018.xhtml
@@ -4,13 +4,13 @@
<title>Removing object during drag and drop of text input selection</title>
<style type="text/css">
object
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('body').removeChild(document.querySelector('object'))" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<object type="application/xhtml+xml" data="helper-drag-me-input.xhtml">XHTML document</object>
<p>Drag selection above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/019.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/019.xhtml
index 86969550f59..d8df327f334 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/019.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/019.xhtml
@@ -4,13 +4,13 @@
<title>Removing iframe during drag and drop of selection</title>
<style type="text/css">
iframe
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('body').removeChild(document.querySelector('iframe'))" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<iframe src="helper-drag-me-p.xhtml">XHTML document</iframe>
<p>Drag selection above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/020.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/020.xhtml
index f5bc7d464f9..6e56c4b8ffb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/020.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/020.xhtml
@@ -4,13 +4,13 @@
<title>Removing object during drag and drop of selection</title>
<style type="text/css">
object
- {height:100px;
- width:300px;
- border:solid medium navy;}
+ {height:100px;
+ width:300px;
+ border:solid medium navy;}
</style>
</head>
<body ondragenter="event.preventDefault();document.querySelector('body').removeChild(document.querySelector('object'))" ondragover="return false" ondrop="document.querySelector('p').firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL'">
<object type="application/xhtml+xml" data="helper-drag-me-p.xhtml">XHTML document</object>
<p>Drag selection above out of frame and drop it somewhere on the page. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/021.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/remove/021.xhtml
index fe67ded93c0..51d7c22015d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/021.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/021.xhtml
@@ -4,11 +4,11 @@
<title>Removing a element during drag and drop of url</title>
<style type="text/css">
div
- {min-height:100px;
- width:100px;
- padding:20px;
- color:white;
- background-color:navy;}
+ {min-height:100px;
+ width:100px;
+ padding:20px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
@@ -16,4 +16,4 @@ div
<p>Drag selection above to the navy box below and drop it. You should see word PASS once you drop it in the box.</p>
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="document.querySelector('div').appendChild(document.createTextNode((event.dataTransfer.getData('url') == 'data:text/plain,1')?'PASS':'FAIL'))"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/remove/022.html b/tests/wpt/web-platform-tests/html/editing/dnd/remove/022.html
index 6bb8e6adefb..17e8e0c449b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/remove/022.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/remove/022.html
@@ -11,18 +11,18 @@
</style>
<script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('span')[0];
- orange.ondragstart = function (e) {
- e.dataTransfer.setData('text','dummy text');
- e.dataTransfer.effectAllowed = 'all';
- document.getElementsByTagName('iframe')[0].contentWindow.postMessage('dummy message','*');
- setTimeout(function () {
- document.getElementsByTagName('p')[0].removeChild(document.getElementsByTagName('iframe')[0]);
- },4000);
- };
+ var orange = document.getElementsByTagName('span')[0];
+ orange.ondragstart = function (e) {
+ e.dataTransfer.setData('text','dummy text');
+ e.dataTransfer.effectAllowed = 'all';
+ document.getElementsByTagName('iframe')[0].contentWindow.postMessage('dummy message','*');
+ setTimeout(function () {
+ document.getElementsByTagName('p')[0].removeChild(document.getElementsByTagName('iframe')[0]);
+ },4000);
+ };
};
</script>
<p><span draggable="true"></span> <iframe height="200" width="200" src="022-1.html"></iframe></p>
<p>Drag the orange square over the blue square, then release it. Wait 5 seconds for the blue square to disappear. Pass if you can select this text.</li>
-<noscript><p>Enable JavaScript and reload</p></noscript> \ No newline at end of file
+<noscript><p>Enable JavaScript and reload</p></noscript>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/001.xhtml
index 671f143f5e2..235eca64a10 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/001.xhtml
@@ -4,35 +4,35 @@
<title>Canvas drag and drop roundtrip</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/uri-list', document.querySelector('canvas').toDataURL('image/png'));}
</script>
</head>
<body>
<p>
- <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)">Canvas</canvas>
+ <canvas width="100" height="100" draggable="true" ondragstart="start(event)" ondragenter="event.preventDefault()" ondragover="return false" ondrop="addImage(event)">Canvas</canvas>
</p>
<p>Drag canvas pattern outside browser window and then drag it back and drop on itself. It should be duplicated once you drop it.</p>
<script type="application/ecmascript">
var canvas = document.querySelector('canvas'),
c = canvas.getContext('2d');
for(var x = 0; x != 50; x++)
- {c.fillStyle = (x%2 == 0)?'navy':'white';
- c.beginPath();
- c.moveTo(x,x);
- c.lineTo(100-x,x);
- c.lineTo(100-x,100-x);
- c.lineTo(x,100-x);
- c.closePath();
- c.fill();}
+ {c.fillStyle = (x%2 == 0)?'navy':'white';
+ c.beginPath();
+ c.moveTo(x,x);
+ c.lineTo(100-x,x);
+ c.lineTo(100-x,100-x);
+ c.lineTo(x,100-x);
+ c.closePath();
+ c.fill();}
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/002.xhtml
index c7106fdd973..84bfda2d092 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/002.xhtml
@@ -4,17 +4,17 @@
<title>PNG image drag and drop roundtrip</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
</script>
</head>
<body>
<p><img ondragstart="event.dataTransfer.effectAllowed = 'copy'" ondragenter="event.preventDefault()" ondrop="addImage(event)" ondragover="return false" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAEq0lEQVR42u1dvU4bQRAeR0RCCilSp0peIoKGB4DSXYRDlcZlFClKBI4bB/kV/AymIDwCTahiicaioEOxhCsjWVTJziyKMfYZn+9ud3bvG2mEZB13u9+nndmf2Rki7fKFXtEBbVKD9o22jB4bPaND6hm9Mjo0enevw/vfevKMfbYl/8vv4HdBUkvFALhltG2A7dN3+pur8jv53fwN/hZkjjRo3eiuAatjdJA7CcnkDOSb/G1uQ6mFzUeDagaQrvl764yEJOU22LbUymXaGrRhOt40OvJOQvLIGUkbP9GLeIn4SM9NJ+tOTVI+Jq0ubY9sVFRNxy6DIWKWmEvpQ/ByQNumI+fBEjHrZ86lT8HJV3ptGn8aDRGzxJxKHwMZFe9Mg6+jJWNCyrX0VbUc0nuj4+jJmPiWsfRZodN+ZvSoNETMjpYjwUCFfKaXpjEnpSVjQsqJYOF5ZLw1elF6MiakXAgmnpw378DegIgZUm4EGw8jA2QsIuUbvXHpM2CmljFfhfsUO5uCA0/j6AudfZV5arv6WuVHcYs+ALwqKTkvHnmLoEwr8CJW9Llts9iNwvj3plzsfeWyIRnzrq37kfIzq6naBpA5a6bzlJgOl/SMkl+rklEFgIX5k5THwTYgIdwzcP2jhM/o19KsOeoArnBS6suaqo2gQnXCJWSwXNwXB4gBMFekNBeTwSGUmiMK4yNktDhsleNaAZRrUvYWmasuQHJOSDdpdKyriEIvo9maexWC70gAIF/bKTvzzFUH4HgbJZ3HdFSw9vC6lfKHpq7X8X07AOOblK2HhLQBindC2g/9Rx+gePcj/cnqHIDoUFm1c9gjwNAy/d0kyXIAMLSYrQ8kqScAhhbH3iLJBwIwtBByTJKkBWBoIeSMJHMOwNBCyG+SdEYAQ4tTvyLJMQUwtBAyJEn8BTC0EHIHQhQSApOlzGTBqaty6jzVAhhaCOlhYahuYYitE02EHGNzURchLZItX4ChhZB9HFBpUjmgwhGuHv0feI0gBw1T3j7CgHT5jzYC5XQRsjUdSsrhjADGl7ka0EylBgRb+ySkMy9rww7A8Waududf2MH9Qh9k3CbXLsGVNh/mqrvojuEeQHI+Qmq4Fq1ndIyeruaDxAEuCWk+ncmB0z3gepubtQenMUHyGTWELJl8xk6B15CeqVAyLtPXtUICsyJnVivWs+J0dAAwbzLOkQRTk2YuKsapTQFkXqPjlDILEinnRcZ1fpXdkGo866xqnH9FNyTjz0JIQZXcuPQCAE5rqo6oMEFBl7RknBRfTg8lj5Yl48JdGT0ueIWiYIvIuHFfPg9l85LJcF42b+JTUFjysZnyVlhy2qfA0asovTo9+0JxYnWC8t0KBQXuFYrdkIy3mBj3LbeNQrejZTuqOlbcl8znGTqcfjXoM3pboqgaPhEPxda1qgcVYsRt5TanDkgISWzcV1N1hCS3jdu4dNxUDMIhlBzXysHGGspkcBtsW2pPh3fGLrZ2ya5cXHFp0qxJ6si3E68EQCpy344vQRZxO5jfye+2d/oqgHsV02Z3lvcl9QTnA+EkLZw5h9MZcY4pTvxldXj/W0+esc+25H/5HQGYon+Q5f+MwFz+8QAAAABJRU5ErkJggg==" alt="PNG circle"/></p>
<p>Drag circle outside browser window and then drag it back and drop on itself. It should be duplicated once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/003.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/003.xhtml
index 0f89a367c5a..6cbdbf3bb81 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/003.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/003.xhtml
@@ -4,17 +4,17 @@
<title>SVG image drag and drop roundtrip</title>
<style type="text/css">
img
- {margin:0 2px;}
+ {margin:0 2px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
- document.querySelector('p').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,''));
+ document.querySelector('p').appendChild(c);}
</script>
</head>
<body>
<p><img ondragstart="event.dataTransfer.effectAllowed = 'copy'" ondragenter="event.preventDefault()" ondrop="addImage(event)" ondragover="return false" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle"/></p>
<p>Drag circle outside browser window and then drag it back and drop on itself. It should be duplicated once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/006.xhtml
index d609a72b85c..45e477aa29e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/006.xhtml
@@ -4,11 +4,11 @@
<title>Link drag and drop roundtrip</title>
<script type="application/ecmascript">
function checkLink(event)
- {document.querySelector('a').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'}
+ {document.querySelector('a').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL'}
</script>
</head>
<body>
<p><a href="data:text/plain,1" ondragstart="event.dataTransfer.effectAllowed = 'copy'" ondragenter="event.preventDefault()" ondrop="checkLink(event)" ondragover="return false">Drag me</a></p>
<p>Drag link outside browser window and then drag it back and drop on itself. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/007.xhtml
index cfe4cb26f50..a46cb33ee69 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/007.xhtml
@@ -4,22 +4,22 @@
<title>Drag and drop roundtrip with text/plain data</title>
<style type="text/css">
div[ondragenter]
- {width:40px;
- min-height:40px;
- margin-top:20px;
- padding:40px;
- color:white;
- background-color:navy;}
+ {width:40px;
+ min-height:40px;
+ margin-top:20px;
+ padding:40px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div
- draggable="true"
- ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/plain',' PASS ')"
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ draggable="true"
+ ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/plain',' PASS ')"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
<p>Drag blue box outside browser window and then drag it back and drop on itself. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/008.xhtml
index 21adfb50a6b..33caeebefe2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/roundtrip/008.xhtml
@@ -4,22 +4,22 @@
<title>Drag and drop roundtrip with text/uri-list data</title>
<style type="text/css">
div[ondragenter]
- {width:40px;
- min-height:40px;
- margin-top:20px;
- padding:40px;
- color:white;
- background-color:navy;}
+ {width:40px;
+ min-height:40px;
+ margin-top:20px;
+ padding:40px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div
- draggable="true"
- ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/uri-list','data:text/plain,PASS')"
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/uri-list').substr(16,4) + ' '))"
+ draggable="true"
+ ondragstart="event.dataTransfer.effectAllowed = 'copy';event.dataTransfer.setData('text/uri-list','data:text/plain,PASS')"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/uri-list').substr(16,4) + ' '))"
/>
<p>Drag blue box outside browser window and then drag it back and drop on itself. You should see word PASS once you drop it.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/001.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/001.xhtml
index e1806f8e232..37122c82513 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/001.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/001.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop from text input to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
<p>Drag selected text to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><input value="Drag me"/></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/002.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/002.xhtml
index 55c457e5384..c96a5e62a68 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/002.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/002.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop from search input to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
<p>Drag selected text to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><input type="search" value="Selection"/></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/003.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/003.xhtml
index 6430d603d58..eed4491a1ca 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/003.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/003.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop from tel input to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
<p>Drag selected number to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><input type="tel" value="123456789"/></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/004.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/004.xhtml
index 1c6904853db..a27dad9f42d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/004.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/004.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop from url input to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
<p>Drag selected url to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><input type="url" value="http://example.org"/></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/005.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/005.xhtml
index a8d7056e451..3ef9f805f2d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/005.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/005.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop from email input to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
<p>Drag selected email to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><input type="email" value="mail@example.org"/></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/006.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/006.xhtml
index 9a2b41e82b2..fe5cdf40e3c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/006.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/006.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop from number input to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
<p>Drag selected number to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><input type="number" value="123456789"/></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/007.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/007.xhtml
index 2b5d05a50a3..ad7379b72eb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/007.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/007.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop from short text input to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
<p>Drag selected date to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><input size="5" value="Drag me"/></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/008.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/008.xhtml
index 6abfe2c318c..4d0437213ec 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/008.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/008.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop from password input to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
<p>You should not be able to drag and drop selection from password field to the blue box.</p>
<p><input type="password" value="FAIL"/></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/009.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/009.xhtml
index 07509f6bcf6..3bc8b7b6544 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/009.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/009.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop from readonly text input to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
<p>Drag selected text to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><input readonly="readonly" value="Drag me"/></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/010.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/010.xhtml
index d26770ee647..220edea2eb1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/010.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/010.xhtml
@@ -4,24 +4,24 @@
<title>Selection drag and drop from texarea to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
textarea
- {height:1.5em;
- width:7em;}
+ {height:1.5em;
+ width:7em;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
<p>Drag selected text to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><textarea>Drag me</textarea></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/011.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/011.xhtml
index 1ea8cd592f8..df75fc964bf 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/011.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/011.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop from text input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input value="Drag me"/></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/012.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/012.xhtml
index 8013e28c391..c6cf54ea982 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/012.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/012.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop from search input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input type="search" value="Selection"/></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/013.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/013.xhtml
index 0f1defc8962..9799480ee91 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/013.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/013.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop from tel input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input type="tel" value="123456789"/></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/014.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/014.xhtml
index 6ed64a608f1..75bfed79c00 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/014.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/014.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop from url input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input type="url" value="http://opera.com"/></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/015.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/015.xhtml
index ecd3f88702b..546502a5e4d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/015.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/015.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop from email input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input type="email" value="mail@example.org"/></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/016.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/016.xhtml
index 64784d71f15..d2767c4f7a6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/016.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/016.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop from number input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input type="number" value="123456789"/></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/017.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/017.xhtml
index b8b64d1c5b5..58e7de831df 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/017.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/017.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop from short text input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input size="5" value="Drag me"/></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/018.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/018.xhtml
index 338bdd73ac9..76483483c3d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/018.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/018.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop from password input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input type="password" value="FAIL"/></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/019.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/019.xhtml
index d8f7d304dd2..63de9a58df2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/019.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/019.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop from readonly input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input readonly="readonly" value="Drag me"/></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/020.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/020.xhtml
index f6b860140dd..98c263abb91 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/020.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/020.xhtml
@@ -4,13 +4,13 @@
<title>Selection drag and drop between textareas</title>
<style type="text/css">
p:last-child > textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
p:first-child + p > textarea
- {height:1.5em;
- width:7em;}
+ {height:1.5em;
+ width:7em;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
@@ -18,4 +18,4 @@ p:first-child + p > textarea
<p><textarea>Drag me</textarea></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/021.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/021.xhtml
index 4526c1aaaa4..9f44f264b09 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/021.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/021.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop from text input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,4 +17,4 @@ div[contenteditable]
<p><input value="Drag me"/></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/022.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/022.xhtml
index e69d2419a4c..434e989a853 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/022.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/022.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop from search input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,4 +17,4 @@ div[contenteditable]
<p><input type="search" value="Selection"/></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/023.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/023.xhtml
index 0d1183d8c95..d1e3f5dff50 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/023.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/023.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop from tel input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,4 +17,4 @@ div[contenteditable]
<p><input type="tel" value="123456789"/></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/024.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/024.xhtml
index dc275e36645..4b3b0243709 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/024.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/024.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop from url input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/025.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/025.xhtml
index 25f123b147a..2f5391eb45d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/025.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/025.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop from email input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,4 +17,4 @@ div[contenteditable]
<p><input type="email" value="mail@example.org"/></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/026.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/026.xhtml
index a4ee2a18fe0..6c376c38e2d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/026.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/026.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop from number input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,4 +17,4 @@ div[contenteditable]
<p><input type="number" value="123456789"/></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/027.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/027.xhtml
index 593f62dc088..2a7a067901e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/027.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/027.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop from short input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,4 +17,4 @@ div[contenteditable]
<p><input size="5" value="Drag me"/></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/028.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/028.xhtml
index 6444e3c9205..e422a18497a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/028.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/028.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop from password input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,4 +17,4 @@ div[contenteditable]
<p><input type="password" value="FAIL"/></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/029.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/029.xhtml
index 3ffecf0ec23..e101dda24de 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/029.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/029.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop from readonly input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,4 +17,4 @@ div[contenteditable]
<p><input readonly="readonly" value="Drag me"/></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/030.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/030.xhtml
index 25536ec273b..deec97e5e8d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/030.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/030.xhtml
@@ -4,15 +4,15 @@
<title>Selection drag and drop from textarea to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
textarea
- {height:1.5em;
- width:7em;}
+ {height:1.5em;
+ width:7em;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
@@ -20,4 +20,4 @@ textarea
<p><textarea>Drag me</textarea></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/031.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/031.xhtml
index ecdd466f723..b3b3be923ca 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/031.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/031.xhtml
@@ -4,15 +4,15 @@
<title>Dragging two lines of text selection from textarea to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(25,56)">
@@ -26,9 +26,9 @@ Selected text should be moved to the blue box once you drop it there.
</textarea>
</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/032.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/032.xhtml
index 59070062e10..55358f98cf3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/032.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/032.xhtml
@@ -4,15 +4,15 @@
<title>Dragging multiline text selection from textarea to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(24,58)">
@@ -25,9 +25,9 @@ Copy of selection should end up in the blue box once you drop it there.
</textarea>
</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/033.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/033.xhtml
index edd53277661..a8011e54b8e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/033.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/033.xhtml
@@ -4,8 +4,8 @@
<title>Dragging two lines of text selection between textareas</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(25,56)">
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/034.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/034.xhtml
index 4643156feab..34ceec09a0a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/034.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/034.xhtml
@@ -4,8 +4,8 @@
<title>Dragging multiline text selection between textareas</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(24,58)">
@@ -19,4 +19,4 @@ Selected text should be moved to second textarea once you drop it there.
</p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/035.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/035.xhtml
index 1bc133431ef..54259f8a108 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/035.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/035.xhtml
@@ -4,15 +4,15 @@
<title>Dragging two lines of text selection from textarea to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(25,56)">
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/036.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/036.xhtml
index e819719840b..7c152a21e3a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/036.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/036.xhtml
@@ -4,15 +4,15 @@
<title>Dragging multiline text selection from textarea to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(24,58)">
@@ -26,4 +26,4 @@ Selected text should be moved to the blue box once you drop it there.
</p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/045.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/045.xhtml
index 1b44ad3e307..fe48994f40f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/045.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/045.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from text input to iframe</title>
<style type="text/css">
iframe
- {width:350px;
- height:150px;
- border-style:none;}
+ {width:350px;
+ height:150px;
+ border-style:none;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ iframe
<p><input value="Drag me"/></p>
<p><iframe src="helper-drop-here-blue-box.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/046.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/046.xhtml
index b5a8f9510d9..17434738828 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/046.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/046.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from textarea to iframe</title>
<style type="text/css">
iframe
- {width:350px;
- height:150px;
- border-style:none;}
+ {width:350px;
+ height:150px;
+ border-style:none;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
@@ -14,4 +14,4 @@ iframe
<p><textarea>Drag me</textarea></p>
<p><iframe src="helper-drop-here-blue-box.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/047.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/047.xhtml
index 61d4afca418..420269282ed 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/047.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/047.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from text input to textarea in iframe</title>
<style type="text/css">
iframe
- {width:500px;
- height:400px;
- border-style:none;}
+ {width:500px;
+ height:400px;
+ border-style:none;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ iframe
<p><input value="Drag me"/></p>
<p><iframe src="helper-drop-here-textarea.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/048.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/048.xhtml
index 73483036c80..7b2610cfc7c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/048.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/048.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from textarea to another textarea in iframe</title>
<style type="text/css">
iframe
- {width:500px;
- height:400px;
- border-style:none;}
+ {width:500px;
+ height:400px;
+ border-style:none;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
@@ -14,4 +14,4 @@ iframe
<p><textarea>Drag me</textarea></p>
<p><iframe src="helper-drop-here-textarea.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/049.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/049.xhtml
index 5bed43563bd..791c0180eb5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/049.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/049.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from text input to contenteditable element in iframe</title>
<style type="text/css">
iframe
- {width:350px;
- height:150px;
- border-style:none;}
+ {width:350px;
+ height:150px;
+ border-style:none;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ iframe
<p><input value="Drag me"/></p>
<p><iframe src="helper-drop-here-blue-box-contenteditable.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/050.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/050.xhtml
index 7a1545ec5bf..53b3997400e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/050.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/050.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from textarea to contenteditable element in iframe</title>
<style type="text/css">
iframe
- {width:350px;
- height:150px;
- border-style:none;}
+ {width:350px;
+ height:150px;
+ border-style:none;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
@@ -14,4 +14,4 @@ iframe
<p><textarea>Drag me</textarea></p>
<p><iframe src="helper-drop-here-blue-box-contenteditable.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/051.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/051.xhtml
index 41a94dd8c41..3cd1145f1a2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/051.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/051.xhtml
@@ -4,24 +4,24 @@
<title>Selection drag and drop from text input in iframe to block element</title>
<style type="text/css">
iframe
- {width:500px;
- height:200px;
- border-style:none;}
+ {width:500px;
+ height:200px;
+ border-style:none;}
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-input.xhtml">XHTML document</iframe></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/052.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/052.xhtml
index 32d713ff5a4..843115017a4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/052.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/052.xhtml
@@ -4,24 +4,24 @@
<title>Selection drag and drop from textarea in iframe to block element</title>
<style type="text/css">
iframe
- {width:500px;
- height:200px;
- border-style:none;}
+ {width:500px;
+ height:200px;
+ border-style:none;}
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-textarea-to-other-blue-box.xhtml">XHTML document</iframe></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/053.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/053.xhtml
index 52a3c148bab..f5f9c44a11b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/053.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/053.xhtml
@@ -4,18 +4,18 @@
<title>Selection drag and drop from text input in iframe to textarea</title>
<style type="text/css">
iframe
- {width:500px;
- height:200px;
- border-style:none;}
+ {width:500px;
+ height:200px;
+ border-style:none;}
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-input-to-other-textarea.xhtml">XHTML document</iframe></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/054.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/054.xhtml
index 22be4107158..ebc9fcf0dae 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/054.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/054.xhtml
@@ -4,18 +4,18 @@
<title>Selection drag and drop from textarea in iframe to another textarea</title>
<style type="text/css">
iframe
- {width:500px;
- height:200px;
- border-style:none;}
+ {width:500px;
+ height:200px;
+ border-style:none;}
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-textarea-to-other-textarea.xhtml">XHTML document</iframe></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/055.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/055.xhtml
index 9465b1beb80..29488c3a60f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/055.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/055.xhtml
@@ -4,20 +4,20 @@
<title>Selection drag and drop from text input in iframe to contenteditable element</title>
<style type="text/css">
iframe
- {width:500px;
- height:200px;
- border-style:none;}
+ {width:500px;
+ height:200px;
+ border-style:none;}
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-input.xhtml">XHTML document</iframe></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/056.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/056.xhtml
index 94a99a7917f..72a51c64b85 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/056.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/056.xhtml
@@ -4,20 +4,20 @@
<title>Selection drag and drop from textarea in iframe to contenteditable element</title>
<style type="text/css">
iframe
- {width:500px;
- height:200px;
- border-style:none;}
+ {width:500px;
+ height:200px;
+ border-style:none;}
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-textarea-to-other-blue-box.xhtml">XHTML document</iframe></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/057.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/057.xhtml
index 4fca493a7c0..950bccbdd0b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/057.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/057.xhtml
@@ -4,17 +4,17 @@
<title>Selection drag and drop from text input in iframe to another input element</title>
<style type="text/css">
iframe
- {width:500px;
- height:200px;
- border-style:none;}
+ {width:500px;
+ height:200px;
+ border-style:none;}
textarea
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-input-to-other-input.xhtml">XHTML document</iframe></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/058.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/058.xhtml
index 7f3c51a9705..d8a6380c385 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/058.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/058.xhtml
@@ -4,17 +4,17 @@
<title>Selection drag and drop from textarea in iframe to input element</title>
<style type="text/css">
iframe
- {width:500px;
- height:200px;
- border-style:none;}
+ {width:500px;
+ height:200px;
+ border-style:none;}
textarea
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-textarea-to-other-input.xhtml">XHTML document</iframe></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/059.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/059.xhtml
index 89a778b3ef4..b67547d482f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/059.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/059.xhtml
@@ -4,13 +4,13 @@
<title>Cross iframe selection drag and drop from text input to block element</title>
<style type="text/css">
iframe
- {width:100%;
- height:200px;
- border-style:none;}
+ {width:100%;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-input.xhtml">XHTML document</iframe></p>
<p><iframe src="helper-drop-here-blue-box.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/060.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/060.xhtml
index 73d49810aef..7ad69522220 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/060.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/060.xhtml
@@ -4,13 +4,13 @@
<title>Cross iframe selection drag and drop from textarea to block element</title>
<style type="text/css">
iframe
- {width:100%;
- height:200px;
- border-style:none;}
+ {width:100%;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-textarea-to-other-blue-box.xhtml">XHTML document</iframe></p>
<p><iframe src="helper-drop-here-blue-box.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/061.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/061.xhtml
index c30c031e22d..371673ffa1c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/061.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/061.xhtml
@@ -4,13 +4,13 @@
<title>Cross iframe selection drag and drop from text input to textarea</title>
<style type="text/css">
iframe
- {width:100%;
- height:200px;
- border-style:none;}
+ {width:100%;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-input-to-other-textarea.xhtml">XHTML document</iframe></p>
<p><iframe src="helper-drop-here-textarea.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/062.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/062.xhtml
index df64cfd8e64..5f38444f907 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/062.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/062.xhtml
@@ -4,13 +4,13 @@
<title>Cross iframe selection drag and drop between textareas</title>
<style type="text/css">
iframe
- {width:100%;
- height:200px;
- border-style:none;}
+ {width:100%;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-textarea-to-other-textarea.xhtml">XHTML document</iframe></p>
<p><iframe src="helper-drop-here-textarea.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/063.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/063.xhtml
index c07ab932a68..68d4f335095 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/063.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/063.xhtml
@@ -4,13 +4,13 @@
<title>Cross iframe selection drag and drop from text input to contenteditable element</title>
<style type="text/css">
iframe
- {width:100%;
- height:200px;
- border-style:none;}
+ {width:100%;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-input.xhtml">XHTML document</iframe></p>
<p><iframe src="helper-drop-here-blue-box-contenteditable.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/064-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/064-1.xhtml
index 8f164a60121..bf4df422907 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/064-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/064-1.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
textarea
- {height:1.5em;
- width:7em;}
+ {height:1.5em;
+ width:7em;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
<p>Drag selected text to the blue box. Selection should be moved to the blue box once you drop it there.</p>
<p><textarea>Drag me</textarea></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/064.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/064.xhtml
index cf585c6d53d..9e6be0d0346 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/064.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/064.xhtml
@@ -4,13 +4,13 @@
<title>Cross iframe selection drag and drop from textarea to contenteditable element</title>
<style type="text/css">
iframe
- {width:100%;
- height:200px;
- border-style:none;}
+ {width:100%;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
<p><iframe src="064-1.xhtml">XHTML document</iframe></p>
<p><iframe src="helper-drop-here-blue-box-contenteditable.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/065.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/065.xhtml
index d4bd8f3251b..0d8d21f04c6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/065.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/065.xhtml
@@ -4,13 +4,13 @@
<title>Cross iframe selection drag and drop between text inputs</title>
<style type="text/css">
iframe
- {width:100%;
- height:200px;
- border-style:none;}
+ {width:100%;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-input-to-other-input.xhtml">XHTML document</iframe></p>
<p><iframe src="helper-drop-here-input.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/066.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/066.xhtml
index 8f65061a16e..36907bc4929 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/066.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/066.xhtml
@@ -4,13 +4,13 @@
<title>Cross iframe selection drag and drop from textarea to text input</title>
<style type="text/css">
iframe
- {width:100%;
- height:200px;
- border-style:none;}
+ {width:100%;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-textarea-to-other-input.xhtml">XHTML document</iframe></p>
<p><iframe src="helper-drop-here-input.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/067-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/067-1.xhtml
index 206c5967562..a908282bb75 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/067-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/067-1.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
iframe
- {width:100%;
- height:200px;
- border-style:none;}
+ {width:100%;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
<p><iframe src="helper-drag-me-input.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/067-2.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/067-2.xhtml
index 3362fba6c45..22f8b550206 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/067-2.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/067-2.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
iframe
- {width:100%;
- height:200px;
- border-style:none;}
+ {width:100%;
+ height:200px;
+ border-style:none;}
</style>
</head>
<body>
<p><iframe src="helper-drop-here-blue-box.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/069.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/069.xhtml
index 02c12bd72e7..149a41df085 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/069.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/069.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop to textarea in iframe</title>
<style type="text/css">
iframe
- {width:500px;
- height:400px;
- border-style:none;}
+ {width:500px;
+ height:400px;
+ border-style:none;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -14,4 +14,4 @@ iframe
<p>Drag selected text to the textarea. Copy of selection should end up in the textarea once you drop it there.</p>
<p><iframe src="helper-drop-here-textarea.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/070.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/070.xhtml
index 73511debdf3..7255b2b21ec 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/070.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/070.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop to contenteditable element in iframe</title>
<style type="text/css">
iframe
- {width:500px;
- height:400px;
- border-style:none;}
+ {width:500px;
+ height:400px;
+ border-style:none;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -14,4 +14,4 @@ iframe
<p>Drag selected text to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><iframe src="helper-drop-here-blue-box-contenteditable.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/071.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/071.xhtml
index e3dcd57defb..73e6722c00d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/071.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/071.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop between text inputs of different size</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ input[placeholder]
<p><input value="Drag me"/></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/072.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/072.xhtml
index c44e2bd8db5..343cc3fc0c4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/072.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/072.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from search to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ input[placeholder]
<p><input type="search" value="Selection"/></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/073.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/073.xhtml
index ade164797b9..2a082b8a112 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/073.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/073.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from tel to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ input[placeholder]
<p><input type="tel" value="123456789"/></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/074.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/074.xhtml
index f441ad101ac..b8966e71bad 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/074.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/074.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from url to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/075.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/075.xhtml
index 8b5304f0e69..75af080efce 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/075.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/075.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from email to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ input[placeholder]
<p><input type="email" value="mail@example.org"/></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/076.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/076.xhtml
index bb5db839a41..c9c732e7e14 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/076.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/076.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from number to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ input[placeholder]
<p><input type="number" value="123456789"/></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/077.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/077.xhtml
index 42cee3e22d8..ecd4ab38018 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/077.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/077.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from short text input to another text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ input[placeholder]
<p><input size="5" value="Drag me"/></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/078.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/078.xhtml
index 1261a6a1350..853cf63b605 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/078.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/078.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from password to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ input[placeholder]
<p><input type="password" value="FAIL"/></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/079.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/079.xhtml
index d114cc68d45..1ad458df4b8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/079.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/079.xhtml
@@ -4,9 +4,9 @@
<title>Selection drag and drop from readonly text input to another text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ input[placeholder]
<p><input readonly="readonly" value="Drag me"/></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/080.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/080.xhtml
index 35fac3928a1..3ebc0aafd23 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/080.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/080.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop from textarea to text input</title>
<style type="text/css">
input
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
textarea
- {height:1.5em;
- width:7em;}
+ {height:1.5em;
+ width:7em;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
@@ -17,4 +17,4 @@ textarea
<p><textarea>Drag me</textarea></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/081.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/081.xhtml
index eb8c4124fb4..c65dd26a3ff 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/081.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/081.xhtml
@@ -4,21 +4,21 @@
<title>Events during selection drag and drop to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:50px;
- margin-top:20px;}
+ {width:300px;
+ height:50px;
+ margin-top:20px;}
.hidden
- {visibility:hidden;}
+ {visibility:hidden;}
</style>
<script type="application/ecmascript">
function evtChange()
- {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
function evtInput()
- {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
function evtDrop()
- {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL (selection is not properly added to data store)'}
+ {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL (selection is not properly added to data store)'}
function evtKeypress()
- {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
+ {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -33,4 +33,4 @@ function evtKeypress()
<li>Keypress event: <tt>PASS</tt></li>
</ul>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/082.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/082.xhtml
index 449ce932a46..57c2a53f4d6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/082.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/082.xhtml
@@ -4,21 +4,21 @@
<title>Events during selection drag and drop to search input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:50px;
- margin-top:20px;}
+ {width:300px;
+ height:50px;
+ margin-top:20px;}
.hidden
- {visibility:hidden;}
+ {visibility:hidden;}
</style>
<script type="application/ecmascript">
function evtChange()
- {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
function evtInput()
- {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
function evtDrop()
- {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL (selection is not properly added to data store)'}
+ {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'Drag me')?'PASS':'FAIL (selection is not properly added to data store)'}
function evtKeypress()
- {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
+ {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -33,4 +33,4 @@ function evtKeypress()
<li>Keypress event: <tt>PASS</tt></li>
</ul>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/083.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/083.xhtml
index 9ca21e9e35a..ba527ae4e28 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/083.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/083.xhtml
@@ -4,21 +4,21 @@
<title>Events during selection drag and drop to tel input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:50px;
- margin-top:20px;}
+ {width:300px;
+ height:50px;
+ margin-top:20px;}
.hidden
- {visibility:hidden;}
+ {visibility:hidden;}
</style>
<script type="application/ecmascript">
function evtChange()
- {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
function evtInput()
- {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
function evtDrop()
- {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == '123456789')?'PASS':'FAIL (selection is not properly added to data store)'}
+ {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == '123456789')?'PASS':'FAIL (selection is not properly added to data store)'}
function evtKeypress()
- {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
+ {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -33,4 +33,4 @@ function evtKeypress()
<li>Keypress event: <tt>PASS</tt></li>
</ul>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/084.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/084.xhtml
index baaae70d29c..f602d712bd3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/084.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/084.xhtml
@@ -4,21 +4,21 @@
<title>Events during selection drag and drop to url input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:50px;
- margin-top:20px;}
+ {width:300px;
+ height:50px;
+ margin-top:20px;}
.hidden
- {visibility:hidden;}
+ {visibility:hidden;}
</style>
<script type="application/ecmascript">
function evtChange()
- {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
function evtInput()
- {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
function evtDrop()
- {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'http://example.org')?'PASS':'FAIL (selection is not properly added to data store)'}
+ {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'http://example.org')?'PASS':'FAIL (selection is not properly added to data store)'}
function evtKeypress()
- {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
+ {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/085.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/085.xhtml
index 23f49f72033..842288f5585 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/085.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/085.xhtml
@@ -4,21 +4,21 @@
<title>Events during selection drag and drop to email input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:50px;
- margin-top:20px;}
+ {width:300px;
+ height:50px;
+ margin-top:20px;}
.hidden
- {visibility:hidden;}
+ {visibility:hidden;}
</style>
<script type="application/ecmascript">
function evtChange()
- {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
function evtInput()
- {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
function evtDrop()
- {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'mail@example.org')?'PASS':'FAIL (selection is not properly added to data store)'}
+ {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == 'mail@example.org')?'PASS':'FAIL (selection is not properly added to data store)'}
function evtKeypress()
- {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
+ {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -33,4 +33,4 @@ function evtKeypress()
<li>Keypress event: <tt>PASS</tt></li>
</ul>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/086.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/086.xhtml
index adb2fc7686d..349d7795e7b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/086.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/086.xhtml
@@ -4,21 +4,21 @@
<title>Events during selection drag and drop to number input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:50px;
- margin-top:20px;}
+ {width:300px;
+ height:50px;
+ margin-top:20px;}
.hidden
- {visibility:hidden;}
+ {visibility:hidden;}
</style>
<script type="application/ecmascript">
function evtChange()
- {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[0].firstChild.nodeValue = 'PASS'}
function evtInput()
- {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
+ {document.querySelectorAll('tt')[1].firstChild.nodeValue = 'PASS'}
function evtDrop()
- {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == '123456789')?'PASS':'FAIL (selection is not properly added to data store)'}
+ {document.querySelectorAll('tt')[2].firstChild.nodeValue = (event.dataTransfer.getData('text/plain') == '123456789')?'PASS':'FAIL (selection is not properly added to data store)'}
function evtKeypress()
- {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
+ {document.querySelectorAll('tt')[3].firstChild.nodeValue = 'FAIL (even is not supposed to fire)'}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -33,4 +33,4 @@ function evtKeypress()
<li>Keypress event: <tt>PASS</tt></li>
</ul>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/087.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/087.xhtml
index 6cb5b0f107d..64e02c1ef76 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/087.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/087.xhtml
@@ -4,13 +4,13 @@
<title>Scrolling during selection drag and drop to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:50px;
- margin-top:200px;}
+ {width:300px;
+ height:50px;
+ margin-top:200px;}
div
- {height:150px;
- width:500px;
- overflow-y:scroll;}
+ {height:150px;
+ width:500px;
+ overflow-y:scroll;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -21,4 +21,4 @@ div
<p>Copy of selection should end up in the input once you drop it there.</p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/088.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/088.xhtml
index 54d0ca088f5..4900b13c24f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/088.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/088.xhtml
@@ -4,26 +4,26 @@
<title>Vertical scrolling during selection drag and drop to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:50px;}
+ {width:300px;
+ height:50px;}
div > p:first-child
- {margin-bottom:200px;}
+ {margin-bottom:200px;}
body > div
- {height:150px;
- width:500px;
- overflow-y:scroll;}
+ {height:150px;
+ width:500px;
+ overflow-y:scroll;}
div > div
- {height:400px;}
+ {height:400px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
<p>Drag me</p>
<div>
- <div>
- <p>You should be able to drag selected text to the input at the bottom of scrollable container (dragging towards the bottom edge triggers scrolling).</p>
- <input placeholder="Drop selection here"/>
- <p>Copy of selection should end up in the input once you drop it there.</p>
- </div>
+ <div>
+ <p>You should be able to drag selected text to the input at the bottom of scrollable container (dragging towards the bottom edge triggers scrolling).</p>
+ <input placeholder="Drop selection here"/>
+ <p>Copy of selection should end up in the input once you drop it there.</p>
+ </div>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/089.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/089.xhtml
index da0f5e2f17d..26185e33891 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/089.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/089.xhtml
@@ -4,12 +4,12 @@
<title>Scrolling during selection drag and drop to iframe</title>
<style type="text/css">
iframe
- {width:350px;
- height:150px;}
+ {width:350px;
+ height:150px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
<p>Drag me</p>
<p><iframe src="helper-scroll-then-drop-input.xhtml">XHTML document</iframe></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/090.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/090.xhtml
index 5759be186de..62dfa0c6efe 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/090.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/090.xhtml
@@ -4,12 +4,12 @@
<title>Scrolling during selection drag and drop to object</title>
<style type="text/css">
object
- {width:350px;
- height:150px;}
+ {width:350px;
+ height:150px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
<p>Drag me</p>
<p><object type="application/xhtml+xml" data="helper-scroll-then-drop-input.xhtml">XHTML document</object></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/091-2.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/091-2.xhtml
index 205eff77152..12d5cef8a76 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/091-2.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/091-2.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:50px;}
+ {width:300px;
+ height:50px;}
p:first-child
- {margin-bottom:1000px;}
+ {margin-bottom:1000px;}
</style>
</head>
<body>
@@ -15,4 +15,4 @@ p:first-child
<input placeholder="Drop selection here"/>
<p>Copy of selection should end up in the input once you drop it there.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/092.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/092.xhtml
index dfd454a10d1..30d53f0f7d0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/092.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/092.xhtml
@@ -4,8 +4,8 @@
<title>Selection drag and drop from text input to element in object</title>
<style type="text/css">
object
- {width:350px;
- height:150px;}
+ {width:350px;
+ height:150px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -13,4 +13,4 @@ object
<p><input value="Drag me"/></p>
<p><object type="application/xhtml+xml" data="helper-drop-here-blue-box.xhtml">XHTML document</object></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/093.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/093.xhtml
index 88e8ecd8198..ffc32ce77e5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/093.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/093.xhtml
@@ -4,8 +4,8 @@
<title>Selection drag and drop from textarea to element in object</title>
<style type="text/css">
object
- {width:350px;
- height:150px;}
+ {width:350px;
+ height:150px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
@@ -13,4 +13,4 @@ object
<p><textarea>Drag me</textarea></p>
<p><object type="application/xhtml+xml" data="helper-drop-here-blue-box.xhtml">XHTML document</object></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/094.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/094.xhtml
index 114fa0fee6f..bd4d63ecf56 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/094.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/094.xhtml
@@ -4,8 +4,8 @@
<title>Selection drag and drop from text input to textarea in object</title>
<style type="text/css">
object
- {width:500px;
- height:400px;}
+ {width:500px;
+ height:400px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -13,4 +13,4 @@ object
<p><input value="Drag me"/></p>
<p><object type="application/xhtml+xml" data="helper-drop-here-textarea.xhtml">XHTML document</object></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/095.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/095.xhtml
index 9f2c761d619..8035f799005 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/095.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/095.xhtml
@@ -4,8 +4,8 @@
<title>Selection drag and drop from textarea to another textarea in object</title>
<style type="text/css">
object
- {width:500px;
- height:400px;}
+ {width:500px;
+ height:400px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
@@ -13,4 +13,4 @@ object
<p><textarea>Drag me</textarea></p>
<p><object type="application/xhtml+xml" data="helper-drop-here-textarea.xhtml">XHTML document</object></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/096.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/096.xhtml
index 0589ede6c7c..508d0858241 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/096.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/096.xhtml
@@ -4,8 +4,8 @@
<title>Selection drag and drop from text input to contenteditable element in object</title>
<style type="text/css">
object
- {width:350px;
- height:150px;}
+ {width:350px;
+ height:150px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -13,4 +13,4 @@ object
<p><input value="Drag me"/></p>
<p><object type="application/xhtml+xml" data="helper-drop-here-blue-box-contenteditable.xhtml">XHTML document</object></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/097.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/097.xhtml
index 7ee94f86a9b..915fa313565 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/097.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/097.xhtml
@@ -4,8 +4,8 @@
<title>Selection drag and drop from textarea to contenteditable element in object</title>
<style type="text/css">
object
- {width:350px;
- height:150px;}
+ {width:350px;
+ height:150px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
@@ -13,4 +13,4 @@ object
<p><textarea>Drag me</textarea></p>
<p><object type="application/xhtml+xml" data="helper-drop-here-blue-box-contenteditable.xhtml">XHTML document</object></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/098.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/098.xhtml
index c1595d9bbfc..10dc9b085a8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/098.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/098.xhtml
@@ -4,23 +4,23 @@
<title>Selection drag and drop from text input in object to block element</title>
<style type="text/css">
object
- {width:500px;
- height:200px;}
+ {width:500px;
+ height:200px;}
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<p><object type="application/xhtml+xml" data="helper-drag-me-input.xhtml">XHTML document</object></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/099.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/099.xhtml
index 8eaa0562ae6..79fbd954d85 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/099.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/099.xhtml
@@ -4,23 +4,23 @@
<title>Selection drag and drop from textarea in object to block element</title>
<style type="text/css">
object
- {width:500px;
- height:200px;}
+ {width:500px;
+ height:200px;}
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<p><object type="application/xhtml+xml" data="helper-drag-me-textarea-to-other-blue-box.xhtml">XHTML document</object></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/100.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/100.xhtml
index c6d5b52c78e..8e0ab2567d9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/100.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/100.xhtml
@@ -4,17 +4,17 @@
<title>Selection drag and drop from text input in object to textarea</title>
<style type="text/css">
object
- {width:500px;
- height:200px;}
+ {width:500px;
+ height:200px;}
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
<p><object type="application/xhtml+xml" data="helper-drag-me-input-to-other-textarea.xhtml">XHTML document</object></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/101.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/101.xhtml
index d1316c1af09..4c712c089f2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/101.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/101.xhtml
@@ -4,17 +4,17 @@
<title>Selection drag and drop from textarea in object to another textarea</title>
<style type="text/css">
object
- {width:500px;
- height:200px;}
+ {width:500px;
+ height:200px;}
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
<p><object type="application/xhtml+xml" data="helper-drag-me-textarea-to-other-textarea.xhtml">XHTML document</object></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/102.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/102.xhtml
index ca924483029..1420b35ab6b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/102.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/102.xhtml
@@ -4,19 +4,19 @@
<title>Selection drag and drop from text input in object to contenteditable element</title>
<style type="text/css">
object
- {width:500px;
- height:200px;}
+ {width:500px;
+ height:200px;}
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<p><object type="application/xhtml+xml" data="helper-drag-me-input.xhtml">XHTML document</object></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/103.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/103.xhtml
index 4f91db6990b..fef3439911b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/103.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/103.xhtml
@@ -4,19 +4,19 @@
<title>Selection drag and drop from textarea in object to contenteditable element</title>
<style type="text/css">
object
- {width:500px;
- height:200px;}
+ {width:500px;
+ height:200px;}
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<p><object type="application/xhtml+xml" data="helper-drag-me-textarea-to-other-blue-box.xhtml">XHTML document</object></p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/104.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/104.xhtml
index 9b23cc9eff8..62f174685f5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/104.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/104.xhtml
@@ -4,16 +4,16 @@
<title>Selection drag and drop from text input in object to another text input</title>
<style type="text/css">
object
- {width:500px;
- height:200px;}
+ {width:500px;
+ height:200px;}
textarea
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body>
<p><object type="application/xhtml+xml" data="helper-drag-me-input-to-other-input.xhtml">XHTML document</object></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/105.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/105.xhtml
index 432664793e1..d4b0aa5d6de 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/105.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/105.xhtml
@@ -4,16 +4,16 @@
<title>Selection drag and drop from textarea in object to text input</title>
<style type="text/css">
object
- {width:500px;
- height:200px;}
+ {width:500px;
+ height:200px;}
textarea
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body>
<p><object type="application/xhtml+xml" data="helper-drag-me-textarea-to-other-input.xhtml">XHTML document</object></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/107.html b/tests/wpt/web-platform-tests/html/editing/dnd/selection/107.html
index 0d7f75f3206..8a930e665bd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/107.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/107.html
@@ -1,5 +1,5 @@
<!doctype html>
<title>Dragging selection breaks layout</title>
<frameset rows="100%">
- <frame src="107-1.html">
-</frameset> \ No newline at end of file
+ <frame src="107-1.html">
+</frameset>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/108.html b/tests/wpt/web-platform-tests/html/editing/dnd/selection/108.html
index 967e99e0f4a..8e9ce72301f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/108.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/108.html
@@ -1,5 +1,5 @@
<!doctype html>
<title>Dragging custom selection breaks layout</title>
<frameset rows="100%">
- <frame src="108-1.html">
-</frameset> \ No newline at end of file
+ <frame src="108-1.html">
+</frameset>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/109.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/109.xhtml
index 7e4dc25c60c..fcf78f08782 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/109.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/109.xhtml
@@ -4,10 +4,10 @@
<title>RTL text selection drag and drop from text input to RTL textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input dir="rtl" value="&#x202E;FAIL|SSAP&#x202C;"/></p>
<p><textarea dir="rtl" placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/110.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/110.xhtml
index fce336fb7d1..16d7aebb15f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/110.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/110.xhtml
@@ -4,10 +4,10 @@
<title>RTL text selection drag and drop from text input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,4 +17,4 @@ textarea
<p><textarea placeholder="Drop selection here"/></p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/111.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/111.xhtml
index 4c3aa4094af..95117474d69 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/111.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/111.xhtml
@@ -4,10 +4,10 @@
<title>RTL text selection drag and drop from RTL element to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -15,4 +15,4 @@ textarea
<p>Drag selected text to the textarea. Copy of selection should end up in the textarea once you drop it there. Text direction should be preserved during drag and drop.</p>
<p dir="rtl"><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/112.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/112.xhtml
index 693d0301d57..f335fc065f9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/112.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/112.xhtml
@@ -4,10 +4,10 @@
<title>RTL text selection drag and drop to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -15,4 +15,4 @@ textarea
<p>Drag selected text to the textarea. Copy of selection should end up in the textarea once you drop it there. Text direction should be preserved during drag and drop.</p>
<p dir="rtl"><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/113.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/113.xhtml
index d8c92cb70d4..1d66332b6b2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/113.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/113.xhtml
@@ -4,10 +4,10 @@
<title>RTL text selection drag and drop between textareas</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,11)">
@@ -15,4 +15,4 @@ textarea
<p><textarea>&#x202E;FAIL|SSAP&#x202C;</textarea></p>
<p><textarea dir="rtl" placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/114.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/114.xhtml
index 4884ff2fef1..65a1de5ff9a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/114.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/114.xhtml
@@ -4,10 +4,10 @@
<title>RTL text selection drag and drop between RTL textareas</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,11)">
@@ -17,4 +17,4 @@ textarea
<p><textarea placeholder="Drop selection here"/></p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/115.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/115.xhtml
index a99d14f750c..5eb4ec5b3b2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/115.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/115.xhtml
@@ -4,9 +4,9 @@
<title>RTL text selection drag and drop between RTL inputs</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ input[placeholder]
<p><input dir="rtl" value="&#x202E;FAIL|SSAP&#x202C;"/></p>
<p><input dir="rtl" placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/116.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/116.xhtml
index c4ea9930db8..1e57aaf1372 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/116.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/116.xhtml
@@ -4,9 +4,9 @@
<title>RTL text selection drag and drop between text inputs</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -16,4 +16,4 @@ input[placeholder]
<p><input placeholder="Drop selection here"/></p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/117.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/117.xhtml
index daa30ca42ca..8be3d0e697d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/117.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/117.xhtml
@@ -4,9 +4,9 @@
<title>RTL text selection drag and drop from RTL element to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -14,4 +14,4 @@ input[placeholder]
<p>Drag selected text to the input below. Copy of selection should end up in the input once you drop it there. Text direction should be preserved during drag and drop.</p>
<p dir="rtl"><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/118.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/118.xhtml
index 0ea40e29993..e5ead99fd00 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/118.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/118.xhtml
@@ -4,9 +4,9 @@
<title>RTL text selection drag and drop to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -14,4 +14,4 @@ input[placeholder]
<p>Drag selected text to the input below. Copy of selection should end up in the input once you drop it there. Text direction should be preserved during drag and drop.</p>
<p dir="rtl"><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/119.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/119.xhtml
index 344679fada3..71507c1ab6c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/119.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/119.xhtml
@@ -4,9 +4,9 @@
<title>RTL text selection drag and drop from textarea to RTL text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,11)">
@@ -14,4 +14,4 @@ input[placeholder]
<p><textarea>&#x202E;FAIL|SSAP&#x202C;</textarea></p>
<p><input dir="rtl" placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/120.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/120.xhtml
index eb7b7472d5c..57be0f7ce75 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/120.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/120.xhtml
@@ -4,9 +4,9 @@
<title>RTL text selection drag and drop from textarea to text input</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,11)">
@@ -16,4 +16,4 @@ input[placeholder]
<p><input placeholder="Drop selection here"/></p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/121.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/121.xhtml
index 58de2b2d008..a5a709c3b9c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/121.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/121.xhtml
@@ -4,12 +4,12 @@
<title>RTL text selection drag and drop from RTL text input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,4 +17,4 @@ div[contenteditable]
<p><input dir="rtl" value="&#x202E;FAIL|SSAP&#x202C;"/></p>
<p><div dir="rtl" contenteditable="true"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/122.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/122.xhtml
index cb2ade8a853..84ec8c61ab2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/122.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/122.xhtml
@@ -4,12 +4,12 @@
<title>RTL text selection drag and drop from text input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -19,4 +19,4 @@ div[contenteditable]
<p><div contenteditable="true"/></p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/123.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/123.xhtml
index 597667a0eaf..68ff2e8218f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/123.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/123.xhtml
@@ -4,12 +4,12 @@
<title>RTL text selection drag and drop from RTL element to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -17,4 +17,4 @@ div[contenteditable]
<p>Drag selected text to the blue box. Copy of selection should end up in the box once you drop it there. Text direction should be preserved during drag and drop.</p>
<p dir="rtl"><div contenteditable="true"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/124.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/124.xhtml
index b60da71a6e0..5c5c1b822f9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/124.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/124.xhtml
@@ -4,12 +4,12 @@
<title>RTL text selection drag and drop to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -17,4 +17,4 @@ div[contenteditable]
<p>Drag selected text to the blue box. Copy of selection should end up in the box once you drop it there. Text direction should be preserved during drag and drop.</p>
<p dir="rtl"><div contenteditable="true"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/125.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/125.xhtml
index 65c074ca1c2..fc4b686dcca 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/125.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/125.xhtml
@@ -4,12 +4,12 @@
<title>RTL text selection drag and drop from textarea to RTL contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,11)">
@@ -17,4 +17,4 @@ div[contenteditable]
<p><textarea>&#x202E;FAIL|SSAP&#x202C;</textarea></p>
<p><div dir="rtl" contenteditable="true"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/126.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/126.xhtml
index 03d92ae7b7a..80b2e415ef3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/126.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/126.xhtml
@@ -4,12 +4,12 @@
<title>RTL text selection drag and drop from textarea to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,11)">
@@ -19,4 +19,4 @@ div[contenteditable]
<p><div contenteditable="true"/></p>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/127.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/127.xhtml
index 161ab64db06..20d73973e48 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/127.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/127.xhtml
@@ -4,22 +4,22 @@
<title>RTL text selection drag and drop from text input to RTL element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
<p>Drag selected text to the blue box. Copy of selection should end up in the box once you drop it there. Text direction should be preserved during drag and drop.</p>
<p><input dir="rtl" value="&#x202E;FAIL|SSAP&#x202C;"/></p>
<div
- dir="rtl"
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ dir="rtl"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/128.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/128.xhtml
index 504250686f4..4814fa29c37 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/128.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/128.xhtml
@@ -4,12 +4,12 @@
<title>RTL text selection drag and drop from text input to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -17,10 +17,10 @@ div[ondragenter]
<div dir="rtl">
<p><input value="&#x202E;FAIL|SSAP&#x202C;"/></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div > div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div > div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/129.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/129.xhtml
index e9aea186607..8bbc4d81e8b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/129.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/129.xhtml
@@ -4,22 +4,22 @@
<title>RTL text selection drag and drop from RTL element to another RTL element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
<p dir="rtl">&#x202E;FAIL|SSAP&#x202C;</p>
<p>Drag selected text to the blue box. Copy of selection should end up in the box once you drop it there. Text direction should be preserved during drag and drop.</p>
<div
- dir="rtl"
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ dir="rtl"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/130.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/130.xhtml
index 07343252684..f567e09f990 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/130.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/130.xhtml
@@ -4,22 +4,22 @@
<title>RTL text selection drag and drop to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
<p>&#x202E;FAIL|SSAP&#x202C;</p>
<p>Drag selected text to the blue box. Copy of selection should end up in the box once you drop it there. Text direction should be preserved during drag and drop.</p>
<div
- dir="rtl"
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ dir="rtl"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/131.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/131.xhtml
index 04e61773103..9e0539615bc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/131.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/131.xhtml
@@ -4,22 +4,22 @@
<title>RTL text selection drag and drop from textarea to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,11)">
<p>Drag selected text to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><textarea>&#x202E;FAIL|SSAP&#x202C;</textarea></p>
<div
- dir="rtl"
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ dir="rtl"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/132.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/132.xhtml
index d662b206fd3..d3d57dd843b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/132.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/132.xhtml
@@ -4,21 +4,21 @@
<title>RTL text selection drag and drop from RTL textarea to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,11)">
<p>Drag selected text to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><textarea dir="rtl">&#x202E;FAIL|SSAP&#x202C;</textarea></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/133.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/133.xhtml
index bf03eee9164..40196315f7f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/133.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/133.xhtml
@@ -4,17 +4,17 @@
<title>Multielement selection drag and drop</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('div'))">
<div>
- <p>Drag selected text to the textarea.</p>
- <p>Copy of selection should end up in the textarea once you drop it there.</p>
+ <p>Drag selected text to the textarea.</p>
+ <p>Copy of selection should end up in the textarea once you drop it there.</p>
</div>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/134.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/134.xhtml
index 0b61026da28..939e2957238 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/134.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/134.xhtml
@@ -4,14 +4,14 @@
<title>Drag and drop after selecting whole page content</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('body'))">
<p>Drag selected text to the textarea. Copy of selection should end up in the textarea once you drop it there.</p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/135.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/135.xhtml
index 34d63e720b8..44c8c39deae 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/135.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/135.xhtml
@@ -4,14 +4,14 @@
<title>Drag and drop after manually selecting whole page content</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
<p>Select whole page (Ctrl+A) and try to drag selection to the textarea. Copy of selection should end up in the textarea once you drop it there.</p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/136.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/136.xhtml
index c4ffc7d002a..d005718219b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/136.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/136.xhtml
@@ -4,10 +4,10 @@
<title>BiDi text selection drag and drop to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -15,4 +15,4 @@ textarea
<p>Drag selected text to the textarea. Copy of selection should end up in the textarea once you drop it there. Text direction should be preserved during drag and drop.</p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/137.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/137.xhtml
index a1841b367f4..8cec81cb6ef 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/137.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/137.xhtml
@@ -4,10 +4,10 @@
<title>Multielement BiDi text selection drag and drop to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -15,4 +15,4 @@ textarea
<p>Drag selected text to the textarea. Copy of selection should end up in the textarea once you drop it there. Text direction should be preserved during drag and drop.</p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/138.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/138.xhtml
index 4a9080a827f..eda68f1f12b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/138.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/138.xhtml
@@ -4,10 +4,10 @@
<title>BiDi text selection drag and drop from text input to textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -15,4 +15,4 @@ textarea
<p><input value="PASS|LIAF &#x202E;FAIL|SSAP&#x202C; PASS|LIAF"/></p>
<p><textarea dir="rtl" placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/139.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/139.xhtml
index f9b1f61b608..03c6a6bc2a2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/139.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/139.xhtml
@@ -4,10 +4,10 @@
<title>BiDi text selection drag and drop between textareas</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,32)">
@@ -15,4 +15,4 @@ textarea
<p><textarea>PASS|LIAF &#x202E;FAIL|SSAP&#x202C; PASS|LIAF</textarea></p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/140.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/140.xhtml
index c97468bfe2f..fb0c3ca1983 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/140.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/140.xhtml
@@ -4,9 +4,9 @@
<title>BiDi text selection drag and drop between text inputs</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ input[placeholder]
<p><input value="PASS|LIAF &#x202E;FAIL|SSAP&#x202C; PASS|LIAF"/></p>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/141.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/141.xhtml
index 820556cb9fd..79f550f05c3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/141.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/141.xhtml
@@ -4,12 +4,12 @@
<title>BiDi text selection drag and drop to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -17,4 +17,4 @@ div[contenteditable]
<p>Drag selected text to the blue box. Copy of selection should end up in the box once you drop it there. Text direction should be preserved during drag and drop.</p>
<p><div contenteditable="true"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/142.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/142.xhtml
index 428ce10c89e..1522a0cdbd9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/142.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/142.xhtml
@@ -4,21 +4,21 @@
<title>BiDi text selection drag and drop to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
<p>PASS|LIAF &#x202E;FAIL|SSAP&#x202C; PASS|LIAF</p>
<p>Drag selected text to the blue box. Copy of selection should end up in the box once you drop it there. Text direction should be preserved during drag and drop.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/143.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/143.xhtml
index 39e73d41b30..f38e1bfb4e8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/143.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/143.xhtml
@@ -4,18 +4,18 @@
<title>Large text selection drag and drop</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
<script type="application/ecmascript">
function start(event)
- {var p = document.querySelector('p:last-child'), s = p.firstChild.nodeValue;
- for(var i = 0; i != 12; i++)
- {s = s + ' ' + s;}
- p.firstChild.nodeValue = 'Start of selection. ' + s + ' End of selection';
- window.getSelection().selectAllChildren(p);}
+ {var p = document.querySelector('p:last-child'), s = p.firstChild.nodeValue;
+ for(var i = 0; i != 12; i++)
+ {s = s + ' ' + s;}
+ p.firstChild.nodeValue = 'Start of selection. ' + s + ' End of selection';
+ window.getSelection().selectAllChildren(p);}
</script>
</head>
<body onload="start()">
@@ -23,4 +23,4 @@ function start(event)
<p><textarea placeholder="Drop selection here"/></p>
<p>Large selection.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/144.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/144.xhtml
index 6dd04bd4b2c..90dd440f6c9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/144.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/144.xhtml
@@ -4,23 +4,23 @@
<title>Selection drag and drop from text input and text/plain aliases</title>
<style type="text/css">
div
- {min-height:40px;
- width:40px;
- padding:40px;
- text-align:center;
- color:white;
- background-color:navy;}
+ {min-height:40px;
+ width:40px;
+ padding:40px;
+ text-align:center;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('text/plain','PASS');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('text/plain','PASS');}
function checkText(event)
- {var a = event.dataTransfer.getData('text/plain'),
- b = event.dataTransfer.getData('text'),
- c = event.dataTransfer.getData('TEXT'),
- d = event.dataTransfer.getData('TexT');
- document.querySelector('div').appendChild(document.createTextNode((a == b &amp;&amp; b == c &amp;&amp; c == d &amp;&amp; d == 'PASS')?' PASS ':' FAIL '))}
+ {var a = event.dataTransfer.getData('text/plain'),
+ b = event.dataTransfer.getData('text'),
+ c = event.dataTransfer.getData('TEXT'),
+ d = event.dataTransfer.getData('TexT');
+ document.querySelector('div').appendChild(document.createTextNode((a == b &amp;&amp; b == c &amp;&amp; c == d &amp;&amp; d == 'PASS')?' PASS ':' FAIL '))}
</script>
</head>
<body onload="document.querySelector('input').select()">
@@ -28,4 +28,4 @@ function checkText(event)
<p>Drag selection above to the navy box below and drop it. You should see word PASS once you drop it.</p>
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="checkText(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/145.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/145.xhtml
index 9ab73d43e1e..addc92b4125 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/145.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/145.xhtml
@@ -4,23 +4,23 @@
<title>Selection drag and drop from inline element and text/plain aliases</title>
<style type="text/css">
div
- {min-height:40px;
- width:40px;
- padding:40px;
- text-align:center;
- color:white;
- background-color:navy;}
+ {min-height:40px;
+ width:40px;
+ padding:40px;
+ text-align:center;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
function start(event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setData('Text','PASS');}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setData('Text','PASS');}
function checkText(event)
- {var a = event.dataTransfer.getData('text/plain'),
- b = event.dataTransfer.getData('text'),
- c = event.dataTransfer.getData('TEXT'),
- d = event.dataTransfer.getData('TexT');
- document.querySelector('div').appendChild(document.createTextNode((a == b &amp;&amp; b == c &amp;&amp; c == d &amp;&amp; d == 'PASS')?'PASS':'FAIL'))}
+ {var a = event.dataTransfer.getData('text/plain'),
+ b = event.dataTransfer.getData('text'),
+ c = event.dataTransfer.getData('TEXT'),
+ d = event.dataTransfer.getData('TexT');
+ document.querySelector('div').appendChild(document.createTextNode((a == b &amp;&amp; b == c &amp;&amp; c == d &amp;&amp; d == 'PASS')?'PASS':'FAIL'))}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('span'))">
@@ -28,4 +28,4 @@ function checkText(event)
<p>Drag selection above to the navy box below and drop it. You should see word PASS once you drop it.</p>
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="checkText(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/146.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/146.xhtml
index 574345cd1d5..bc8d1f015c6 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/146.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/146.xhtml
@@ -4,20 +4,20 @@
<title>Selection drag and drop and text/plain aliases</title>
<style type="text/css">
div
- {min-height:40px;
- width:40px;
- padding:40px;
- text-align:center;
- color:white;
- background-color:navy;}
+ {min-height:40px;
+ width:40px;
+ padding:40px;
+ text-align:center;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
function checkText(event)
- {var a = event.dataTransfer.getData('text/plain'),
- b = event.dataTransfer.getData('text'),
- c = event.dataTransfer.getData('TEXT'),
- d = event.dataTransfer.getData('TexT');
- document.querySelector('div').appendChild(document.createTextNode((a == b &amp;&amp; b == c &amp;&amp; c == d &amp;&amp; d == 'Drag me')?'PASS':'FAIL'))}
+ {var a = event.dataTransfer.getData('text/plain'),
+ b = event.dataTransfer.getData('text'),
+ c = event.dataTransfer.getData('TEXT'),
+ d = event.dataTransfer.getData('TexT');
+ document.querySelector('div').appendChild(document.createTextNode((a == b &amp;&amp; b == c &amp;&amp; c == d &amp;&amp; d == 'Drag me')?'PASS':'FAIL'))}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -25,4 +25,4 @@ function checkText(event)
<p>Drag selection above to the navy box below and drop it. You should see word PASS once you drop it.</p>
<div ondragenter="event.preventDefault()" ondragover="return false" ondrop="checkText(event)"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/147.html b/tests/wpt/web-platform-tests/html/editing/dnd/selection/147.html
index da64ecd7398..814fe1b74e4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/147.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/147.html
@@ -1,15 +1,15 @@
<!doctype html>
<html>
- <head>
- <title>Selection should not be cleared on failed drop</title>
- </head>
- <body>
+ <head>
+ <title>Selection should not be cleared on failed drop</title>
+ </head>
+ <body>
- <ol>
- <li>Select some text in this sentence and begin dragging it.</li>
- <li>Drop it on this text.</li>
- <li>Pass if the text in step 1 is still selected.</li>
- </ol>
+ <ol>
+ <li>Select some text in this sentence and begin dragging it.</li>
+ <li>Drop it on this text.</li>
+ <li>Pass if the text in step 1 is still selected.</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/148.html b/tests/wpt/web-platform-tests/html/editing/dnd/selection/148.html
index 93219c59447..3552ad6f2df 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/148.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/148.html
@@ -1,15 +1,15 @@
<!doctype html>
<html>
- <head>
- <title>Selection in input should not be cleared on failed drop</title>
- </head>
- <body>
+ <head>
+ <title>Selection in input should not be cleared on failed drop</title>
+ </head>
+ <body>
- <ol>
- <li><textarea rows="3" cols="60">Select some text in this sentence and begin dragging it.</textarea></li>
- <li>Drop it on this text.</li>
- <li>Pass if the text in step 1 is still selected.</li>
- </ol>
+ <ol>
+ <li><textarea rows="3" cols="60">Select some text in this sentence and begin dragging it.</textarea></li>
+ <li>Drop it on this text.</li>
+ <li>Pass if the text in step 1 is still selected.</li>
+ </ol>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/149.html b/tests/wpt/web-platform-tests/html/editing/dnd/selection/149.html
index 66475937df6..53711211917 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/149.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/149.html
@@ -1,16 +1,16 @@
<!doctype html>
<html>
- <head>
- <title>Dragging selections from multiline inputs should show editing caret</title>
- </head>
- <body>
+ <head>
+ <title>Dragging selections from multiline inputs should show editing caret</title>
+ </head>
+ <body>
- <p>Select one word in the first input. Drag the selection around over the same input, and over the other inputs. It should show the input editing caret at the relevant insertion point within the target input's text.</p>
- <p><textarea rows="3" cols="60">Dummy text, dummy text, dummy text, dummy text, dummy text,
+ <p>Select one word in the first input. Drag the selection around over the same input, and over the other inputs. It should show the input editing caret at the relevant insertion point within the target input's text.</p>
+ <p><textarea rows="3" cols="60">Dummy text, dummy text, dummy text, dummy text, dummy text,
dummy text, dummy text, dummy text, dummy text, dummy text</textarea></p>
- <p><textarea rows="3" cols="60">Dummy text, dummy text, dummy text, dummy text, dummy text,
+ <p><textarea rows="3" cols="60">Dummy text, dummy text, dummy text, dummy text, dummy text,
dummy text, dummy text, dummy text, dummy text, dummy text</textarea></p>
- <p><input value="Dummy text, dummy text"></p>
+ <p><input value="Dummy text, dummy text"></p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/150.html b/tests/wpt/web-platform-tests/html/editing/dnd/selection/150.html
index ceecd35cde4..2861ad86f73 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/150.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/150.html
@@ -1,15 +1,15 @@
<!doctype html>
<html>
- <head>
- <title>Dragging selections from single-line inputs should show editing caret</title>
- </head>
- <body>
+ <head>
+ <title>Dragging selections from single-line inputs should show editing caret</title>
+ </head>
+ <body>
- <p>Select one word in the first input. Drag the selection around over the same input, and over the other inputs. It should show the input editing caret at the relevant insertion point within the target input's text.</p>
- <p><input value="Dummy text, dummy text"></p>
- <p><textarea rows="3" cols="60">Dummy text, dummy text, dummy text, dummy text, dummy text,
+ <p>Select one word in the first input. Drag the selection around over the same input, and over the other inputs. It should show the input editing caret at the relevant insertion point within the target input's text.</p>
+ <p><input value="Dummy text, dummy text"></p>
+ <p><textarea rows="3" cols="60">Dummy text, dummy text, dummy text, dummy text, dummy text,
dummy text, dummy text, dummy text, dummy text, dummy text</textarea></p>
- <p><input value="Dummy text, dummy text"></p>
+ <p><input value="Dummy text, dummy text"></p>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/151.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/151.xhtml
index c9b2bf9f33b..ed06757109f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/151.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/151.xhtml
@@ -4,8 +4,8 @@
<title>Dropping selection in readonly text input</title>
<style type="text/css">
input
- {padding:1em;
- width:300px;}
+ {padding:1em;
+ width:300px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -13,4 +13,4 @@ input
<p>Try to drag selected text into the input below. You should not be able to drop it here.</p>
<p><input readonly="readonly" placeholder="Try to drop selected text here" onchange="document.querySelector('p+p').firstChild.nodeValue = 'FAIL'"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/152.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/152.xhtml
index a9e24f3058b..4bf402cf15b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/152.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/152.xhtml
@@ -4,9 +4,9 @@
<title>Dropping selection in readonly textarea</title>
<style type="text/css">
textarea
- {padding:1em;
- width:300px;
- height:100px;}
+ {padding:1em;
+ width:300px;
+ height:100px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p'))">
@@ -14,4 +14,4 @@ textarea
<p>Try to drag selected text into the input below. You should not be able to drop it here.</p>
<p><textarea readonly="readonly" placeholder="Try to drop selected text here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/153.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/153.xhtml
index cb122364b5d..bb3eb29f0d1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/153.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/153.xhtml
@@ -4,8 +4,8 @@
<title>Dropping selection from text input into readonly text input</title>
<style type="text/css">
input
- {padding:1em;
- width:300px;}
+ {padding:1em;
+ width:300px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -13,4 +13,4 @@ input
<p>Try to drag selected text into the input below. You should not be able to drop it here.</p>
<p><input readonly="readonly" placeholder="Try to drop selected text here" onchange="document.querySelector('p+p').firstChild.nodeValue = 'FAIL'"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/154.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/154.xhtml
index 96937b641b2..d6a269acfad 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/154.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/154.xhtml
@@ -4,9 +4,9 @@
<title>Dropping selection from text input into readonly textarea</title>
<style type="text/css">
textarea
- {padding:1em;
- width:300px;
- height:100px;}
+ {padding:1em;
+ width:300px;
+ height:100px;}
</style>
</head>
<body onload="document.querySelector('input').select()">
@@ -14,4 +14,4 @@ textarea
<p>Try to drag selected text into the input below. You should not be able to drop it here.</p>
<p><textarea readonly="readonly" placeholder="Try to drop selected text here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/155.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/155.xhtml
index f58562b00ea..c3b4fa5bf64 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/155.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/155.xhtml
@@ -4,21 +4,21 @@
<title>Selection drag and drop from readonly textarea to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
<p>Drag selected text to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><textarea readonly="readonly">Drag me</textarea></p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/162.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/162.xhtml
index 49d4ba9164e..4c385c922f0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/162.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/162.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop between contenteditable elements</title>
<style type="text/css">
div + div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('div'))">
@@ -17,4 +17,4 @@ div + div[contenteditable]
<div contenteditable="true">Drag me</div>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/163.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/163.xhtml
index f94049a2503..51ed45bdf6e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/163.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/163.xhtml
@@ -4,8 +4,8 @@
<title>Moving text between text inputs</title>
<script type="application/ecmascript">
function check()
- {var input = document.querySelectorAll('input');
- document.querySelector('p').firstChild.nodeValue = (input[0].value == '' &amp;&amp; input[1].value == 'Drag me')?'PASS':'FAIL';}
+ {var input = document.querySelectorAll('input');
+ document.querySelector('p').firstChild.nodeValue = (input[0].value == '' &amp;&amp; input[1].value == 'Drag me')?'PASS':'FAIL';}
</script>
</head>
<body onload="document.querySelector('input').select()">
@@ -13,4 +13,4 @@ function check()
<p><input value="Drag me"/></p>
<p><input ondragenter="event.preventDefault()" ondragover="event.preventDefault();event.dataTransfer.effectAllowed = 'move'" ondrop="window.setTimeout('check()',100)" placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/164.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/164.xhtml
index 28d4d4864f3..4b7cb8c0483 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/164.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/164.xhtml
@@ -4,8 +4,8 @@
<title>Moving text between search inputs</title>
<script type="application/ecmascript">
function check()
- {var input = document.querySelectorAll('input');
- document.querySelector('p').firstChild.nodeValue = (input[0].value == '' &amp;&amp; input[1].value == 'Selection')?'PASS':'FAIL';}
+ {var input = document.querySelectorAll('input');
+ document.querySelector('p').firstChild.nodeValue = (input[0].value == '' &amp;&amp; input[1].value == 'Selection')?'PASS':'FAIL';}
</script>
</head>
<body onload="document.querySelector('input').select()">
@@ -13,4 +13,4 @@ function check()
<p><input type="search" value="Selection"/></p>
<p><input ondragenter="event.preventDefault()" ondragover="event.preventDefault();event.dataTransfer.effectAllowed = 'move'" ondrop="window.setTimeout('check()',100)" type="search" placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/165.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/165.xhtml
index 81ee12366d9..ed6e0c6f980 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/165.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/165.xhtml
@@ -4,8 +4,8 @@
<title>Moving text between tel inputs</title>
<script type="application/ecmascript">
function check()
- {var input = document.querySelectorAll('input');
- document.querySelector('p').firstChild.nodeValue = (input[0].value == '' &amp;&amp; input[1].value == '123456789')?'PASS':'FAIL';}
+ {var input = document.querySelectorAll('input');
+ document.querySelector('p').firstChild.nodeValue = (input[0].value == '' &amp;&amp; input[1].value == '123456789')?'PASS':'FAIL';}
</script>
</head>
<body onload="document.querySelector('input').select()">
@@ -13,4 +13,4 @@ function check()
<p><input type="tel" value="123456789"/></p>
<p><input ondragenter="event.preventDefault()" ondragover="event.preventDefault();event.dataTransfer.effectAllowed = 'move'" ondrop="window.setTimeout('check()',100)" type="tel" placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/166.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/166.xhtml
index de23321ddb0..467cf6eeac9 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/166.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/166.xhtml
@@ -4,8 +4,8 @@
<title>Moving text between url inputs</title>
<script type="application/ecmascript">
function check()
- {var input = document.querySelectorAll('input');
- document.querySelector('p').firstChild.nodeValue = (input[0].value == '' &amp;&amp; input[1].value == 'http://example.org')?'PASS':'FAIL';}
+ {var input = document.querySelectorAll('input');
+ document.querySelector('p').firstChild.nodeValue = (input[0].value == '' &amp;&amp; input[1].value == 'http://example.org')?'PASS':'FAIL';}
</script>
</head>
<body onload="document.querySelector('input').select()">
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/167.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/167.xhtml
index cc0a58008bd..b9f7beb9739 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/167.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/167.xhtml
@@ -4,8 +4,8 @@
<title>Moving text between email inputs</title>
<script type="application/ecmascript">
function check()
- {var input = document.querySelectorAll('input');
- document.querySelector('p').firstChild.nodeValue = (input[0].value == '' &amp;&amp; input[1].value == 'mail@example.org')?'PASS':'FAIL';}
+ {var input = document.querySelectorAll('input');
+ document.querySelector('p').firstChild.nodeValue = (input[0].value == '' &amp;&amp; input[1].value == 'mail@example.org')?'PASS':'FAIL';}
</script>
</head>
<body onload="document.querySelector('input').select()">
@@ -13,4 +13,4 @@ function check()
<p><input type="email" value="mail@example.org"/></p>
<p><input ondragenter="event.preventDefault()" ondragover="event.preventDefault();event.dataTransfer.effectAllowed = 'move'" ondrop="window.setTimeout('check()',100)" type="email" placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/168.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/168.xhtml
index 5b89314a8a2..a2c19c453db 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/168.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/168.xhtml
@@ -4,17 +4,17 @@
<title>Moving text between contenteditable elements</title>
<style type="text/css">
div + div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
function check()
- {var div = document.querySelectorAll('div');
- document.querySelector('p').firstChild.nodeValue = (!div[0].firstChild.nodeValue &amp;&amp; div[1].firstChild.nodeValue == 'Drag me')?'PASS':('FAIL(' + div[0].firstChild.nodeValue + ')');}
+ {var div = document.querySelectorAll('div');
+ document.querySelector('p').firstChild.nodeValue = (!div[0].firstChild.nodeValue &amp;&amp; div[1].firstChild.nodeValue == 'Drag me')?'PASS':('FAIL(' + div[0].firstChild.nodeValue + ')');}
</script>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('div'))">
@@ -22,4 +22,4 @@ function check()
<div contenteditable="true" ondragstart="event.dataTransfer.effectAllowed = 'move'">Drag me</div>
<div ondragenter="event.preventDefault()" ondragover="event.preventDefault();" ondrop="window.setTimeout('check()',100)" contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/169.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/169.xhtml
index d1f56734fe4..ce4dd213999 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/169.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/169.xhtml
@@ -4,16 +4,16 @@
<title>Moving text from text input to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
<script type="application/ecmascript">
function check()
- {document.querySelector('p').firstChild.nodeValue = (document.querySelector('input').value == '' &amp;&amp; document.querySelector('div').firstChild.nodeValue == 'Drag me')?'PASS':('FAIL(' + div[0].firstChild.nodeValue + ')');}
+ {document.querySelector('p').firstChild.nodeValue = (document.querySelector('input').value == '' &amp;&amp; document.querySelector('div').firstChild.nodeValue == 'Drag me')?'PASS':('FAIL(' + div[0].firstChild.nodeValue + ')');}
</script>
</head>
<body onload="document.querySelector('input').select()">
@@ -21,4 +21,4 @@ function check()
<p><input value="Drag me"/></p>
<div ondragenter="event.preventDefault()" ondragover="event.preventDefault();event.dataTransfer.effectAllowed = 'move'" ondrop="window.setTimeout('check()',100)" contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/170.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/170.xhtml
index ccc8e8bdb3b..cbcf3dc1640 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/170.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/170.xhtml
@@ -4,15 +4,15 @@
<title>Dragging multiline text selection from scrolled textarea to block element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(163,185)">
@@ -25,9 +25,9 @@ Try to drag this text.
</textarea>
</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/171.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/171.xhtml
index ce00dd71b4e..c8c16b0b16d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/171.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/171.xhtml
@@ -4,21 +4,21 @@
<title>Dragging text selection from scrollable container to block element</title>
<style type="text/css">
div
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
div:first-child
- {overflow-y:scroll;}
+ {overflow-y:scroll;}
div[ondragenter]
- {margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
p+p
- {margin-top:200px;
- padding-bottom:50px;}
+ {margin-top:200px;
+ padding-bottom:50px;}
</style>
</head>
<body onload="window.getSelection().selectAllChildren(document.querySelector('p + p'))">
@@ -31,9 +31,9 @@ Copy of selection should end up in the blue box once you drop it there.
<p>Try to drag this text.</p>
</div>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div + div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div + div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/172.html b/tests/wpt/web-platform-tests/html/editing/dnd/selection/172.html
index a9273370176..3e805e764ba 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/172.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/172.html
@@ -1,45 +1,45 @@
<!doctype html>
<html>
- <head>
- <title>Selection dragging should drag minimal HTML context</title>
- <style type="text/css">
+ <head>
+ <title>Selection dragging should drag minimal HTML context</title>
+ <style type="text/css">
p + div {
- background: orange;
- width: 4em;
+ background: orange;
+ width: 4em;
}
div + div {
- border: 1px solid black;
- min-height: 5em;
+ border: 1px solid black;
+ min-height: 5em;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var output = document.getElementsByTagName('div')[1];
- output.ondragenter = output.ondragover = function (e) { e.preventDefault(); };
- output.ondrop = function (e) {
- e.preventDefault();
- var drophtml = e.dataTransfer.getData('text/html').toUpperCase().replace(/\sSTYLE="[^"]*"/g,'').replace(/[\r\n]+/g,'\\n');
- var droptext = e.dataTransfer.getData('text/plain').replace(/[\r\n]+/g,'\\n');
- var expectedhtml = '<P><SPAN>C</SPAN>D</P><P>E<SPAN>F</SPAN></P>';
- var expectedtext = 'CD\\nEF';
- if( drophtml != expectedhtml ) {
- output.innerHTML = 'FAIL - normalised dropped HTML was:<br>'+drophtml.replace(/</g,'&lt;');
- } else if( droptext != expectedtext ) {
- output.innerHTML = 'FAIL - normalised dropped text was:<br>'+droptext.replace(/</g,'&lt;');
- } else {
- output.innerHTML = 'PASS';
- }
- };
+ var output = document.getElementsByTagName('div')[1];
+ output.ondragenter = output.ondragover = function (e) { e.preventDefault(); };
+ output.ondrop = function (e) {
+ e.preventDefault();
+ var drophtml = e.dataTransfer.getData('text/html').toUpperCase().replace(/\sSTYLE="[^"]*"/g,'').replace(/[\r\n]+/g,'\\n');
+ var droptext = e.dataTransfer.getData('text/plain').replace(/[\r\n]+/g,'\\n');
+ var expectedhtml = '<P><SPAN>C</SPAN>D</P><P>E<SPAN>F</SPAN></P>';
+ var expectedtext = 'CD\\nEF';
+ if( drophtml != expectedhtml ) {
+ output.innerHTML = 'FAIL - normalised dropped HTML was:<br>'+drophtml.replace(/</g,'&lt;');
+ } else if( droptext != expectedtext ) {
+ output.innerHTML = 'FAIL - normalised dropped text was:<br>'+droptext.replace(/</g,'&lt;');
+ } else {
+ output.innerHTML = 'PASS';
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Select the text from &quot;C&quot; to &quot;F&quot; (including both of those characters) in the text below.</p>
- <div>
- <p><span>A</span><span>BC</span>D</p><p>E<span>FG</span><span>H</span></p>
- </div>
- <div>Drag the selection and drop it here.</div>
+ <p>Select the text from &quot;C&quot; to &quot;F&quot; (including both of those characters) in the text below.</p>
+ <div>
+ <p><span>A</span><span>BC</span>D</p><p>E<span>FG</span><span>H</span></p>
+ </div>
+ <div>Drag the selection and drop it here.</div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/173.html b/tests/wpt/web-platform-tests/html/editing/dnd/selection/173.html
index 5ff15a219b6..8c074f7c5dc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/173.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/173.html
@@ -1,45 +1,45 @@
<!doctype html>
<html>
- <head>
- <title>Selection dragging should drag no HTML when inside a single element</title>
- <style type="text/css">
+ <head>
+ <title>Selection dragging should drag no HTML when inside a single element</title>
+ <style type="text/css">
p + div {
- background: orange;
- width: 4em;
+ background: orange;
+ width: 4em;
}
div + div {
- border: 1px solid black;
- min-height: 5em;
+ border: 1px solid black;
+ min-height: 5em;
}
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var output = document.getElementsByTagName('div')[1];
- output.ondragenter = output.ondragover = function (e) { e.preventDefault(); };
- output.ondrop = function (e) {
- e.preventDefault();
- var drophtml = e.dataTransfer.getData('text/html').toUpperCase().replace(/\sSTYLE="[^"]*"/g,'').replace(/[\r\n]+/g,'\\n');
- var droptext = e.dataTransfer.getData('text/plain').replace(/[\r\n]+/g,'\\n');
- var expectedhtml = 'B';
- var expectedtext = 'B';
- if( drophtml != expectedhtml ) {
- output.innerHTML = 'FAIL - normalised dropped HTML was:<br>'+drophtml.replace(/</g,'&lt;');
- } else if( droptext != expectedtext ) {
- output.innerHTML = 'FAIL - normalised dropped text was:<br>'+droptext.replace(/</g,'&lt;');
- } else {
- output.innerHTML = 'PASS';
- }
- };
+ var output = document.getElementsByTagName('div')[1];
+ output.ondragenter = output.ondragover = function (e) { e.preventDefault(); };
+ output.ondrop = function (e) {
+ e.preventDefault();
+ var drophtml = e.dataTransfer.getData('text/html').toUpperCase().replace(/\sSTYLE="[^"]*"/g,'').replace(/[\r\n]+/g,'\\n');
+ var droptext = e.dataTransfer.getData('text/plain').replace(/[\r\n]+/g,'\\n');
+ var expectedhtml = 'B';
+ var expectedtext = 'B';
+ if( drophtml != expectedhtml ) {
+ output.innerHTML = 'FAIL - normalised dropped HTML was:<br>'+drophtml.replace(/</g,'&lt;');
+ } else if( droptext != expectedtext ) {
+ output.innerHTML = 'FAIL - normalised dropped text was:<br>'+droptext.replace(/</g,'&lt;');
+ } else {
+ output.innerHTML = 'PASS';
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <p>Select &quot;B&quot; in the text below.</p>
- <div>
- <p>ABC</p>
- </div>
- <div>Drag the selection and drop it here.</div>
+ <p>Select &quot;B&quot; in the text below.</p>
+ <div>
+ <p>ABC</p>
+ </div>
+ <div>Drag the selection and drop it here.</div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-blue-box.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-blue-box.xhtml
index 6c76fbdbb34..e49967e1745 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-blue-box.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-blue-box.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
textarea
- {height:1.5em;
- width:7em;}
+ {height:1.5em;
+ width:7em;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
<p>Drag selected text to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<p><textarea>Drag me</textarea></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-input.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-input.xhtml
index 287e3bb5ebd..bf378525880 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-input.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-input.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
textarea
- {height:1.5em;
- width:7em;}
+ {height:1.5em;
+ width:7em;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
<p>Drag selected text to the input field below. Copy of selection should end up in the input once you drop it there.</p>
<p><textarea>Drag me</textarea></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-textarea.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-textarea.xhtml
index c7eb544784b..e7b72990af1 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-textarea.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drag-me-textarea-to-other-textarea.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
textarea
- {height:1.5em;
- width:7em;}
+ {height:1.5em;
+ width:7em;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
<p>Drag selected text to the textarea. Copy of selection should end up in the textarea once you drop it there.</p>
<p><textarea>Drag me</textarea></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-blue-box-contenteditable.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-blue-box-contenteditable.xhtml
index 20f3820a14e..67601b961cf 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-blue-box-contenteditable.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-blue-box-contenteditable.xhtml
@@ -4,15 +4,15 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-blue-box.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-blue-box.xhtml
index ccd32c227b9..575db934d87 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-blue-box.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-blue-box.xhtml
@@ -4,19 +4,19 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-input.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-input.xhtml
index 8be631888d0..bca49a016c2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-input.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-input.xhtml
@@ -4,12 +4,12 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;}
</style>
</head>
<body>
<p><input placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-textarea.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-textarea.xhtml
index cbe268374c3..c7617f5be8f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-textarea.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-drop-here-textarea.xhtml
@@ -4,13 +4,13 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-scroll-then-drop-input.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-scroll-then-drop-input.xhtml
index 14c01ccac71..af2aeae393c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-scroll-then-drop-input.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/selection/helper-scroll-then-drop-input.xhtml
@@ -4,10 +4,10 @@
<title>Selection drag and drop: helper file</title>
<style type="text/css">
input[placeholder]
- {width:300px;
- height:50px;}
+ {width:300px;
+ height:50px;}
p:first-child
- {margin-bottom:200px;}
+ {margin-bottom:200px;}
</style>
</head>
<body>
@@ -15,4 +15,4 @@ p:first-child
<input placeholder="Drop selection here"/>
<p>Copy of selection should end up in the input once you drop it there.</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/003.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/003.svg
index c1f30cfbc42..e59527938b5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/003.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/003.svg
@@ -2,12 +2,12 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.2" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of SVG text selection from tspan elements to textArea</title>
<text x="10" y="30" font-size="20">
- <tspan>Select part</tspan>
- <tspan>of this text</tspan>
- <tspan>and drag selection to</tspan>
+ <tspan>Select part</tspan>
+ <tspan>of this text</tspan>
+ <tspan>and drag selection to</tspan>
</text>
<text x="10" y="60" font-size="20">the box below. Content of selection should be</text>
<text x="10" y="90" font-size="20">copies once it's dropped in the box.</text>
<textArea x="10" y="110" width="480" height="380" font-size="20" editable="simple" pointer-events="boundingBox">Drop selection here</textArea>
<rect x="10" y="110" width="480" height="380" stroke="black" stroke-width="1" fill="none"/>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/004.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/004.svg
index e3c4828a8ca..000f52730c0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/004.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/004.svg
@@ -2,12 +2,12 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of SVG text selection from tref element to textArea</title>
<defs>
- <text id="text">Select me</text>
- </defs>
+ <text id="text">Select me</text>
+</defs>
<text x="10" y="30" font-size="20" fill="navy"><tref xlink:href="#text"/></text>
<text x="10" y="60" font-size="20">Select text above and drag selection to</text>
<text x="10" y="90" font-size="20">the box below. Content of selection should be</text>
<text x="10" y="120" font-size="20">copies once it's dropped in the box.</text>
<textArea x="10" y="130" width="480" height="360" font-size="20" editable="simple" pointer-events="boundingBox">Drop selection here</textArea>
<rect x="10" y="130" width="480" height="360" stroke="black" stroke-width="1" fill="none"/>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/008.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/008.svg
index 167f73febe7..51065c94410 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/008.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/008.svg
@@ -2,12 +2,12 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.2" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of SVG text selection from tspan element to editable text element</title>
<text x="10" y="30" font-size="20">
- <tspan>Select part</tspan>
- <tspan>of this text</tspan>
- <tspan>and drag selection to</tspan>
+ <tspan>Select part</tspan>
+ <tspan>of this text</tspan>
+ <tspan>and drag selection to</tspan>
</text>
<text x="10" y="60" font-size="20">the box below. Content of selection should be</text>
<text x="10" y="90" font-size="20">copies once it's dropped in the box.</text>
<text x="10" y="200" font-size="50" editable="simple">                             </text>
<rect x="10" y="160" width="480" height="50" stroke="black" stroke-width="1" fill="none"/>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/009.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/009.svg
index e7bd622a0f8..1996d256805 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/009.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/009.svg
@@ -2,12 +2,12 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of SVG text selection from tref element to editable text element</title>
<defs>
- <text id="text">Select me</text>
- </defs>
+ <text id="text">Select me</text>
+</defs>
<text x="10" y="30" font-size="20" fill="navy"><tref xlink:href="#text"/></text>
<text x="10" y="60" font-size="20">Select text above and drag selection to</text>
<text x="10" y="90" font-size="20">the box below. Content of selection should be</text>
<text x="10" y="120" font-size="20">copies once it's dropped in the box.</text>
<text x="10" y="200" font-size="50" editable="simple">                             </text>
<rect x="10" y="160" width="480" height="50" stroke="black" stroke-width="1" fill="none"/>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/011.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/011.svg
index 8f07c3c82ae..5618a89e292 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/011.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/011.svg
@@ -2,14 +2,14 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of SVG text selection from textpath to textArea</title>
<defs>
- <path id="path" d="M 10 40 C 10 20 480 20 480 40"/>
+ <path id="path" d="M 10 40 C 10 20 480 20 480 40"/>
</defs>
<text fill="navy">
- <textPath xlink:href="#path">Some selectable text rendered along curved text path</textPath>
+ <textPath xlink:href="#path">Some selectable text rendered along curved text path</textPath>
</text>
<text x="10" y="60" font-size="20">Select part of text above and drag selection to</text>
<text x="10" y="90" font-size="20">the box below. Content of selection should be</text>
<text x="10" y="120" font-size="20">copies once it's dropped in the box.</text>
<textArea x="10" y="130" width="480" height="360" font-size="20" editable="simple" pointer-events="boundingBox">Drop selection here</textArea>
<rect x="10" y="130" width="480" height="360" stroke="black" stroke-width="1" fill="none"/>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/012.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/012.svg
index 18c027655a9..8a50f06c978 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/012.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/012.svg
@@ -2,14 +2,14 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of SVG text selection from editable textpath to textArea</title>
<defs>
- <path id="path" d="M 10 40 C 10 20 480 20 480 40"/>
+ <path id="path" d="M 10 40 C 10 20 480 20 480 40"/>
</defs>
<text fill="navy" editable="simple">
- <textPath xlink:href="#path">Some selectable text rendered along curved text path</textPath>
+ <textPath xlink:href="#path">Some selectable text rendered along curved text path</textPath>
</text>
<text x="10" y="60" font-size="20">Select part of text above and drag selection to</text>
<text x="10" y="90" font-size="20">the box below. Content of selection should be</text>
<text x="10" y="120" font-size="20">copies once it's dropped in the box.</text>
<textArea x="10" y="130" width="480" height="360" font-size="20" editable="simple" pointer-events="boundingBox">Drop selection here</textArea>
<rect x="10" y="130" width="480" height="360" stroke="black" stroke-width="1" fill="none"/>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/013-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/013-1.xhtml
index a97dce1f2b9..7fc593e07ef 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/013-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/013-1.xhtml
@@ -4,12 +4,12 @@
<title>Drag and drop from SVG: helper file</title>
<style type="text/css">
textarea
- {width:400px;
- height:300px;
- padding:10px;}
+ {width:400px;
+ height:300px;
+ padding:10px;}
</style>
</head>
<body>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/013.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/013.svg
index d312135be01..9dc0a47e5fa 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/013.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/013.svg
@@ -5,7 +5,7 @@
<text x="10" y="60" font-size="20">the box below. Content of selection should be</text>
<text x="10" y="90" font-size="20">copies once it's dropped in the box.</text>
<switch>
- <foreignObject x="10" y="120" width="480" height="380" requiredExtensions="http://www.w3.org/1999/xhtml" xlink:href="013-1.xhtml"/>
- <text x="10" y="150" font-size="20">Skip the test (foreignObject is not supported).</text>
+ <foreignObject x="10" y="120" width="480" height="380" requiredExtensions="http://www.w3.org/1999/xhtml" xlink:href="013-1.xhtml"/>
+ <text x="10" y="150" font-size="20">Skip the test (foreignObject is not supported).</text>
</switch>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/014-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/014-1.xhtml
index 674870d05c6..93d6ab7d2f2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/014-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/014-1.xhtml
@@ -4,15 +4,15 @@
<title>Drag and drop from SVG: helper file</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/014.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/014.svg
index 772a9fdefba..acee8efbf4d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/014.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/014.svg
@@ -4,7 +4,7 @@
<textArea x="10" y="10" width="480" height="90" font-size="20">Select part of this text and drag selection to the box below.
Content of selection should be copied once it's dropped in the box.</textArea>
<switch>
- <foreignObject x="10" y="120" width="480" height="380" requiredExtensions="http://www.w3.org/1999/xhtml" xlink:href="014-1.xhtml"/>
- <text x="10" y="150" font-size="20">Skip the test (foreignObject is not supported).</text>
+ <foreignObject x="10" y="120" width="480" height="380" requiredExtensions="http://www.w3.org/1999/xhtml" xlink:href="014-1.xhtml"/>
+ <text x="10" y="150" font-size="20">Skip the test (foreignObject is not supported).</text>
</switch>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/015.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/015.svg
index 3f97727c5ca..de484d2b812 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/015.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/015.svg
@@ -4,7 +4,7 @@
<textArea x="10" y="10" width="480" height="90" font-size="20">Select part of this text and drag selection to the box below.
Content of selection should be copied once it's dropped in the box.</textArea>
<switch>
- <foreignObject x="10" y="120" width="480" height="380" requiredExtensions="http://www.w3.org/1999/xhtml" xlink:href="015-1.xhtml"/>
- <text x="10" y="150" font-size="20">Skip the test (foreignObject is not supported).</text>
+ <foreignObject x="10" y="120" width="480" height="380" requiredExtensions="http://www.w3.org/1999/xhtml" xlink:href="015-1.xhtml"/>
+ <text x="10" y="150" font-size="20">Skip the test (foreignObject is not supported).</text>
</switch>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/016-1.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/016-1.xhtml
index 484d4b4eb7e..d735cce60fa 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/016-1.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/016-1.xhtml
@@ -4,19 +4,19 @@
<title>Drag and drop from SVG: helper file</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<div
- ondragenter="event.preventDefault();event.dataTransfer.effectAllowed = 'copy'"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault();event.dataTransfer.effectAllowed = 'copy'"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/016.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/016.svg
index 60d9e40c70b..fe873924adb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/016.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/016.svg
@@ -4,7 +4,7 @@
<textArea x="10" y="10" width="480" height="90" font-size="20">Select part of this text and drag selection to the box below.
Content of selection should be copied once it's dropped in the box.</textArea>
<switch>
- <foreignObject x="10" y="120" width="480" height="380" requiredExtensions="http://www.w3.org/1999/xhtml" xlink:href="016-1.xhtml"/>
- <text x="10" y="150" font-size="20">Skip the test (foreignObject is not supported).</text>
+ <foreignObject x="10" y="120" width="480" height="380" requiredExtensions="http://www.w3.org/1999/xhtml" xlink:href="016-1.xhtml"/>
+ <text x="10" y="150" font-size="20">Skip the test (foreignObject is not supported).</text>
</switch>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/019.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/019.xhtml
index 6c16875a14d..9064a6049a0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/019.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/019.xhtml
@@ -4,8 +4,8 @@
<title>Dragging selection from XHTML textarea to SVG textArea</title>
<style type="text/css">
textarea
- {height:1.5em;
- width:7em;}
+ {height:1.5em;
+ width:7em;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(0,7)">
@@ -16,4 +16,4 @@ textarea
<rect x="10" y="10" width="480" height="280" stroke="black" stroke-width="1" fill="none"/>
</svg>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/020.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/020.xhtml
index c3c50fd9ece..7d96b4f12e2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/020.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/020.xhtml
@@ -4,8 +4,8 @@
<title>Dragging multiline selection from XHTML textarea to SVG textArea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body onload="var t = document.querySelector('textarea');t.select();t.setSelectionRange(25,56)">
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/021.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/021.xhtml
index 3cc07af2885..4d82e744286 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/021.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/021.xhtml
@@ -4,12 +4,12 @@
<title>Dragging selection from SVG text element to XHTML element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
@@ -18,9 +18,9 @@ div[ondragenter]
</svg>
<p>Select the text above and drag selection to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/022.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/022.xhtml
index bd619ca0054..7354aeef8bb 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/022.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/022.xhtml
@@ -4,12 +4,12 @@
<title>Dragging selection from SVG editable text element to XHTML element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
@@ -18,9 +18,9 @@ div[ondragenter]
</svg>
<p>Select the text above and drag selection to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/023.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/023.xhtml
index 3ada55cef67..65ede4bd8b4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/023.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/023.xhtml
@@ -4,12 +4,12 @@
<title>Dragging selection from SVG textArea to XHTML element</title>
<style type="text/css">
div[ondragenter]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
@@ -18,9 +18,9 @@ div[ondragenter]
Content of selection should be copied once it's dropped in the box.</textArea>
</svg>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/plain')))"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/024.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/024.xhtml
index 58349cdcf6a..5b4116c6c2d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/024.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/024.xhtml
@@ -4,12 +4,12 @@
<title>Dragging selection from SVG text element to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
@@ -19,4 +19,4 @@ div[contenteditable]
<p>Select the text above and drag selection to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/025.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/025.xhtml
index 236e1655e6b..86d68018fd8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/025.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/025.xhtml
@@ -4,12 +4,12 @@
<title>Dragging selection from SVG editable text element to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
@@ -19,4 +19,4 @@ div[contenteditable]
<p>Select the text above and drag selection to the blue box. Copy of selection should end up in the blue box once you drop it there.</p>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/026.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/026.xhtml
index b387f0a00fe..78699f1c6ea 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/026.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/026.xhtml
@@ -4,12 +4,12 @@
<title>Dragging selection from SVG textArea to contenteditable element</title>
<style type="text/css">
div[contenteditable]
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
@@ -19,4 +19,4 @@ Content of selection should be copied once it's dropped in the box.</textArea>
</svg>
<div contenteditable="true"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/027.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/027.xhtml
index d122bae1994..5dbce70ce9a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/027.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/027.xhtml
@@ -4,10 +4,10 @@
<title>Dragging selection from SVG text element to XHTML textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
@@ -17,4 +17,4 @@ textarea
<p>Select the text above and drag selection to the textarea. Copy of selection should end up in the textarea once you drop it there.</p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/028.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/028.xhtml
index 1d5437117c5..d60b518cd02 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/028.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/028.xhtml
@@ -4,10 +4,10 @@
<title>Dragging selection from SVG editable text element to XHTML textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
@@ -17,4 +17,4 @@ textarea
<p>Select the text above and drag selection to the textarea. Copy of selection should end up in the textarea once you drop it there.</p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/029.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/029.xhtml
index 02e258e8519..d469841fadc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/029.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/029.xhtml
@@ -4,10 +4,10 @@
<title>Dragging selection from SVG textArea to XHTML textarea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
@@ -18,4 +18,4 @@ Content of selection should be copied once it's dropped in the box.</textArea>
<p>Select the text above and drag selection to the textarea. Copy of selection should end up in the textarea once you drop it there.</p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/030.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/030.xhtml
index dd6f7fa22d5..b20d6468150 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/030.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/030.xhtml
@@ -4,29 +4,29 @@
<title>SVG image drag and drop</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list'));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list'));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<p><img src="030-1.svg" alt="SVG circle" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/031.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/031.xhtml
index a21fdc0f638..81c355d6c10 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/031.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/031.xhtml
@@ -4,29 +4,29 @@
<title>SVG dataURL image drag and drop</title>
<style type="text/css">
div[ondragenter]
- {width:105px;
- min-height:105px;
- text-align:center;
- margin-top:20px;
- padding:10px;
- border:solid thin navy;}
+ {width:105px;
+ min-height:105px;
+ text-align:center;
+ margin-top:20px;
+ padding:10px;
+ border:solid thin navy;}
p:first-child
- {padding-left:12px;}
+ {padding-left:12px;}
</style>
<script type="application/ecmascript">
function addImage(event)
- {var c = document.createElement('img');
- c.setAttribute('src',event.dataTransfer.getData('text/uri-list'));
- document.querySelector('div').appendChild(c);}
+ {var c = document.createElement('img');
+ c.setAttribute('src',event.dataTransfer.getData('text/uri-list'));
+ document.querySelector('div').appendChild(c);}
</script>
</head>
<body>
<p><img src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20version%3D%221.1%22%20width%3D%22100px%22%20height%3D%22100px%22%20viewBox%3D%220%200%20100%20100%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22green%22/%3E%3C/svg%3E" alt="SVG circle" ondragstart="event.dataTransfer.effectAllowed = 'copy'"/></p>
<p>Drag circle above to the box below. It should be copied to the box once you drop it there.</p>
<div
- ondragenter="event.preventDefault()"
- ondragover="return false"
- ondrop="addImage(event)"
+ ondragenter="event.preventDefault()"
+ ondragover="return false"
+ ondrop="addImage(event)"
/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/032.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/032.xhtml
index bdc6c990478..dc5592d475e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/032.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/032.xhtml
@@ -4,8 +4,8 @@
<title>Cross fragment drag and drop of SVG text selection from text element to textArea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body>
@@ -18,4 +18,4 @@ textarea
<rect x="10" y="10" width="480" height="280" stroke="black" stroke-width="1" fill="none"/>
</svg>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/033.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/033.xhtml
index 1888875ab02..7d55fec093e 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/033.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/033.xhtml
@@ -4,8 +4,8 @@
<title>Cross fragment drag and drop of SVG text selection from editable text element to textArea</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body>
@@ -18,4 +18,4 @@ textarea
<rect x="10" y="10" width="480" height="280" stroke="black" stroke-width="1" fill="none"/>
</svg>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/034.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/034.xhtml
index 0e9e4ea4440..5ac9dacc5cf 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/034.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/034.xhtml
@@ -4,8 +4,8 @@
<title>Cross fragment drag and drop of SVG text selection from textArea to editable text element</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body>
@@ -18,4 +18,4 @@ textarea
<rect x="10" y="10" width="480" height="280" stroke="black" stroke-width="1" fill="none"/>
</svg>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/035.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/035.xhtml
index a0dd437bd70..261ae2e995b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/035.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/035.xhtml
@@ -4,8 +4,8 @@
<title>Cross fragment drag and drop between SVG textAreas</title>
<style type="text/css">
textarea
- {width:300px;
- height:100px;}
+ {width:300px;
+ height:100px;}
</style>
</head>
<body>
@@ -18,4 +18,4 @@ textarea
<rect x="10" y="0" width="380" height="50" stroke="black" stroke-width="1" fill="none"/>
</svg>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/042.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/042.xhtml
index 25d360fcb37..8226e495933 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/042.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/042.xhtml
@@ -4,13 +4,13 @@
<title>Drag and drop from downsized SVG image</title>
<style type="text/css">
object
- {width:100px;
- height:30px;}
+ {width:100px;
+ height:30px;}
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
@@ -18,4 +18,4 @@ textarea
<p>Select the text above and drag selection to the textarea. Copy of selection should end up in the textarea once you drop it there.</p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/043.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/043.xhtml
index 7144e0f7efe..e11a4d82b2b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/043.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/043.xhtml
@@ -4,13 +4,13 @@
<title>Drag and drop from enlarged SVG image</title>
<style type="text/css">
object
- {width:300px;
- height:75px;}
+ {width:300px;
+ height:75px;}
textarea
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;}
</style>
</head>
<body>
@@ -18,4 +18,4 @@ textarea
<p>Select the text above and drag selection to the textarea. Copy of selection should end up in the textarea once you drop it there.</p>
<p><textarea placeholder="Drop selection here"/></p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/046.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/046.svg
index da9b03718e5..20c27a75d9d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/046.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/046.svg
@@ -2,13 +2,13 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of BiDi SVG text selection from tspan elements to textArea</title>
<text x="10" y="30" font-size="20" fill="navy">
- <tspan>PASS|LIAF</tspan>
- <tspan>&#x202E;FAIL|SSAP&#x202C;</tspan>
- <tspan>PASS|LIAF</tspan>
+ <tspan>PASS|LIAF</tspan>
+ <tspan>&#x202E;FAIL|SSAP&#x202C;</tspan>
+ <tspan>PASS|LIAF</tspan>
</text>
<text x="10" y="60" font-size="20">Select text above and drag selection to</text>
<text x="10" y="90" font-size="20">the box below. Content of selection should be</text>
<text x="10" y="120" font-size="20">copies once it's dropped in the box.</text>
<textArea x="10" y="130" width="480" height="360" font-size="20" editable="simple" pointer-events="boundingBox">Drop selection here</textArea>
<rect x="10" y="130" width="480" height="360" stroke="black" stroke-width="1" fill="none"/>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/047.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/047.svg
index f8f737c6d50..e10a5c5665d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/047.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/047.svg
@@ -2,12 +2,12 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of RTL SVG text selection from tref element to textArea</title>
<defs>
- <text id="text">&#x202E;FAIL|SSAP&#x202C;</text>
- </defs>
+ <text id="text">&#x202E;FAIL|SSAP&#x202C;</text>
+</defs>
<text x="10" y="30" font-size="20" fill="navy"><tref xlink:href="#text"/></text>
<text x="10" y="60" font-size="20">Select text above and drag selection to</text>
<text x="10" y="90" font-size="20">the box below. Content of selection should be</text>
<text x="10" y="120" font-size="20">copies once it's dropped in the box.</text>
<textArea x="10" y="130" width="480" height="360" font-size="20" editable="simple" pointer-events="boundingBox">Drop selection here</textArea>
<rect x="10" y="130" width="480" height="360" stroke="black" stroke-width="1" fill="none"/>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/048.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/048.svg
index fb41bc991cb..5a90f2144c0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/048.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/048.svg
@@ -2,12 +2,12 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of BiDi SVG text selection from tref element to textArea</title>
<defs>
- <text id="text">PASS|LIAF &#x202E;FAIL|SSAP&#x202C; PASS|LIAF</text>
- </defs>
+ <text id="text">PASS|LIAF &#x202E;FAIL|SSAP&#x202C; PASS|LIAF</text>
+</defs>
<text x="10" y="30" font-size="20" fill="navy"><tref xlink:href="#text"/></text>
<text x="10" y="60" font-size="20">Select text above and drag selection to</text>
<text x="10" y="90" font-size="20">the box below. Content of selection should be</text>
<text x="10" y="120" font-size="20">copies once it's dropped in the box.</text>
<textArea x="10" y="130" width="480" height="360" font-size="20" editable="simple" pointer-events="boundingBox">Drop selection here</textArea>
<rect x="10" y="130" width="480" height="360" stroke="black" stroke-width="1" fill="none"/>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/049.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/049.xhtml
index 155f75533b0..de81c7b3137 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/049.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/049.xhtml
@@ -5,10 +5,10 @@
</head>
<body>
<div draggable="true">
- <svg xmlns="http://www.w3.org/2000/svg" version="1.2" width="200px" height="50px" viewBox="0 0 200 50">
- <text x="10" y="45" font-size="30" fill="navy" editable="simple">Select me</text>
- </svg>
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.2" width="200px" height="50px" viewBox="0 0 200 50">
+ <text x="10" y="45" font-size="30" fill="navy" editable="simple">Select me</text>
+ </svg>
</div>
<p>You should be able to select text above</p>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/050.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/050.xhtml
index 56fef670f48..a8d73771b9f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/050.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/050.xhtml
@@ -5,9 +5,9 @@
</head>
<body>
<div draggable="true">
- <svg xmlns="http://www.w3.org/2000/svg" version="1.2" width="500px" height="100px" viewBox="0 0 500 100">
- <textArea x="10" y="10" width="480" height="90" font-size="20" editable="simple">You should be able to select this text</textArea>
- </svg>
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.2" width="500px" height="100px" viewBox="0 0 500 100">
+ <textArea x="10" y="10" width="480" height="90" font-size="20" editable="simple">You should be able to select this text</textArea>
+ </svg>
</div>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/051.xhtml b/tests/wpt/web-platform-tests/html/editing/dnd/svg/051.xhtml
index 2cb65636172..36a15c5491b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/051.xhtml
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/051.xhtml
@@ -4,21 +4,21 @@
<title>Drag and drop of link from SVG fragment to XHTML</title>
<style type="text/css">
div
- {width:300px;
- height:100px;
- margin-top:20px;
- padding:10px;
- color:white;
- background-color:navy;}
+ {width:300px;
+ height:100px;
+ margin-top:20px;
+ padding:10px;
+ color:white;
+ background-color:navy;}
</style>
</head>
<body>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="200px" height="50px" viewBox="0 0 200 50">
- <a xlink:href="data:text/plain,PASS">
- <text x="10" y="45" font-size="30" fill="navy">Drag me</text>
- </a>
+ <a xlink:href="data:text/plain,PASS">
+ <text x="10" y="45" font-size="30" fill="navy">Drag me</text>
+ </a>
</svg>
<p>Drag link to the blue box. You should see word PASS once you drop it there.</p>
<div dropzone="copy string:text/uri-list" ondrop="document.querySelector('div').appendChild(document.createTextNode(event.dataTransfer.getData('text/uri-list').substring(16)))"/>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/052.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/052.svg
index f559b234a39..5a780cb4e92 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/052.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/052.svg
@@ -2,7 +2,7 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of text link inside SVG</title>
<a xlink:href="data:text/plain,PASS">
- <text x="10" y="50" font-size="30" fill="navy">Drag me</text>
+ <text x="10" y="50" font-size="30" fill="navy">Drag me</text>
</a>
<textArea x="10" y="70" width="480" height="170" font-size="30">Drag link above and drop it in the gray box below. You should see word PASS once you drop it.</textArea>
<rect x="10" y="300" width="480" height="190" fill="gray"/>
@@ -10,19 +10,19 @@
var a = document.querySelector('a'), rect = document.querySelector('rect'), text = document.querySelector('textArea');
a.addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy'}
+ {event.dataTransfer.effectAllowed = 'copy'}
,false);
rect.addEventListener('dragenter',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('dragover',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('drop',
function (event)
- {text.firstChild.nodeValue = event.dataTransfer.getData('text/uri-list').substring(16,20)}
+ {text.firstChild.nodeValue = event.dataTransfer.getData('text/uri-list').substring(16,20)}
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/053.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/053.svg
index a116f63a188..6c1c4e64eb4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/053.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/053.svg
@@ -2,7 +2,7 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of circle link inside SVG</title>
<a xlink:href="data:text/plain,PASS">
- <circle cx="50" cy="50" r="50" fill="green"/>
+ <circle cx="50" cy="50" r="50" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="30">Drag green circle above and drop it in the gray box below. Gray box should turn green once you drop it.</textArea>
<rect x="10" y="300" width="480" height="190" fill="gray"/>
@@ -10,21 +10,21 @@
var a = document.querySelector('a'), rect = document.querySelector('rect');
a.addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy'}
+ {event.dataTransfer.effectAllowed = 'copy'}
,false);
rect.addEventListener('dragenter',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('dragover',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('drop',
function (event)
- {if(event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,PASS')
- {rect.setAttribute('fill','green');}
- }
+ {if(event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,PASS')
+ {rect.setAttribute('fill','green');}
+ }
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/054.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/054.svg
index 8029734cd83..b0daf03705d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/054.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/054.svg
@@ -2,9 +2,9 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of animated circle link inside SVG</title>
<a xlink:href="data:text/plain,PASS">
- <circle cx="50" cy="50" r="10" fill="green">
- <animate attributeName="r" to="50" dur="10s" begin="0s" fill="freeze"/>
- </circle>
+ <circle cx="50" cy="50" r="10" fill="green">
+ <animate attributeName="r" to="50" dur="10s" begin="0s" fill="freeze"/>
+ </circle>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="30">
Drag green circle above and drop it in the gray box below.
@@ -15,21 +15,21 @@ and gray box should turn green.</textArea>
var a = document.querySelector('a'), rect = document.querySelector('rect');
a.addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy'}
+ {event.dataTransfer.effectAllowed = 'copy'}
,false);
rect.addEventListener('dragenter',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('dragover',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('drop',
function (event)
- {if(event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,PASS')
- {rect.setAttribute('fill','green');}
- }
+ {if(event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,PASS')
+ {rect.setAttribute('fill','green');}
+ }
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/055.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/055.svg
index d23ca5f90c2..ee519baac8f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/055.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/055.svg
@@ -2,7 +2,7 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>Selection and drag and drop of link inside SVG</title>
<a xlink:href="data:text/plain,PASS">
- <rect x="10" y="10" width="80" height="80" fill="green"/>
+ <rect x="10" y="10" width="80" height="80" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="30">Select part of this text. Once text is selected drag green square above and drop it in the gray box below. Gray box should turn green.</textArea>
<rect x="10" y="300" width="480" height="190" fill="gray"/>
@@ -10,21 +10,21 @@
var a = document.querySelector('a'), rect = document.querySelector('svg > rect');
a.addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy'}
+ {event.dataTransfer.effectAllowed = 'copy'}
,false);
rect.addEventListener('dragenter',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('dragover',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('drop',
function (event)
- {if(event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,PASS')
- {rect.setAttribute('fill','green');}
- }
+ {if(event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,PASS')
+ {rect.setAttribute('fill','green');}
+ }
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/056.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/056.svg
index ff2bab82d7f..088b375a6ef 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/056.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/056.svg
@@ -2,7 +2,7 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>dataTransfer.setData/getData during SVG link drag and drop</title>
<a xlink:href="data:text/plain,PASS">
- <polygon points="0,0 100,0 0,100" fill="green"/>
+ <polygon points="0,0 100,0 0,100" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="15">Drag green triangle above and drop it in the gray box below. Gray box should turn green.</textArea>
<rect x="10" y="300" width="480" height="190" fill="gray"/>
@@ -12,58 +12,58 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:text/plain,PASS', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
a = document.querySelector('a'), rect = document.querySelector('rect'), text = document.querySelector('textArea'), result = true;
a.addEventListener('dragstart',
- function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragstart) : FAIL');}
- },false);
+ function (event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragstart) : FAIL');}
+ },false);
a.addEventListener('drag',
- function (event)
- {for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL')}
- },false);
+ function (event)
+ {for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during drag)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL')}
+ },false);
rect.addEventListener('dragenter',
- function (event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragenter) : FAIL')}
- },false);
+ function (event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragenter)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragenter) : FAIL')}
+ },false);
rect.addEventListener('dragover',
- function (event)
- {event.preventDefault();
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], 'FAIL');
- if(event.dataTransfer.getData(dataTypes[i]))
- {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragover)')}
- }
- if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (dragover) : FAIL');}
- },false);
+ function (event)
+ {event.preventDefault();
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], 'FAIL');
+ if(event.dataTransfer.getData(dataTypes[i]))
+ {say('getData(' + dataTypes[i] + ') : FAIL (data store should not be readable during dragover)')}
+ }
+ if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (dragover) : FAIL');}
+ },false);
rect.addEventListener('drop',
- function (event)
- {if(event.dataTransfer.items.length < dataTypes.length)
- {say('items.length (drop) : FAIL');}
- for(var i = 0; i != dataTypes.length; i++)
- {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
- {say('getData(' + dataTypes[i] + ') : FAIL');}
- }
- rect.setAttribute('fill',result?'green':'red');
- },false);
+ function (event)
+ {if(event.dataTransfer.items.length < dataTypes.length)
+ {say('items.length (drop) : FAIL');}
+ for(var i = 0; i != dataTypes.length; i++)
+ {if(event.dataTransfer.getData(dataTypes[i]) != data[i])
+ {say('getData(' + dataTypes[i] + ') : FAIL');}
+ }
+ rect.setAttribute('fill',result?'green':'red');
+ },false);
function say(it)
- {text.appendChild(document.createTextNode(it + '.'));
- result = false;}
+ {text.appendChild(document.createTextNode(it + '.'));
+ result = false;}
]]>
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/057.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/057.svg
index 709521beac4..165a45f3938 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/057.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/057.svg
@@ -2,7 +2,7 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>dataTransfer.items during SVG link drag and drop</title>
<a xlink:href="data:text/plain,PASS">
- <polygon points="0,0 100,0 100,100" fill="green"/>
+ <polygon points="0,0 100,0 100,100" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="15">Drag green triangle above and drop it in the gray box below. Gray box should turn green.</textArea>
<rect x="10" y="300" width="480" height="190" fill="gray"/>
@@ -12,110 +12,110 @@ var dataTypes = ['text/uri-list', 'text/plain', 'application/xml', 'application/
data = ['data:text/plain,PASS', 'PASS', '<result>PASS</result>', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Data store item</title></head><body><p>PASS</p></body></html>', '<math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn></math>', '<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100px" height="50px" viewBox="0 0 100 50"><text x="0" y="40" font-size="40" fill="green">PASS</text></svg>', '<!DOCTYPE html><html><head><title>Data store item</title></head><body><p>PASS</p></body></html>', 'PASS'],
a = document.querySelector('a'), rect = document.querySelector('rect'), text = document.querySelector('textArea'), e = 0, result = true;
a.addEventListener('dragstart',
- function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- for(var i = 0; i != dataTypes.length; i++)
- {event.dataTransfer.setData(dataTypes[i], data[i]);}
- for(var i = event.dataTransfer.items.length; i != 0; i--)
- {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
- {delete event.dataTransfer.items[i-1]}
- }
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- },false);
+ function (event)
+ {event.dataTransfer.effectAllowed = 'copy';
+ for(var i = 0; i != dataTypes.length; i++)
+ {event.dataTransfer.setData(dataTypes[i], data[i]);}
+ for(var i = event.dataTransfer.items.length; i != 0; i--)
+ {if(dataTypes.indexOf(event.dataTransfer.items[i-1].type) == -1)
+ {delete event.dataTransfer.items[i-1]}
+ }
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragstart) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragstart): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragstart): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ },false);
a.addEventListener('drag',
- function (event)
- {event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- },false);
+ function (event)
+ {event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrag) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrag): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrag): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ },false);
rect.addEventListener('dragenter',
- function (event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
- }
- );
- }
- },false);
+ function (event)
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragenter) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragenter): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragenter): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to drag event handler)')}
+ }
+ );
+ }
+ },false);
rect.addEventListener('dragover',
- function (event)
- {event.preventDefault();
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0])
- {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
- }
- );
- }
- },false);
+ function (event)
+ {event.preventDefault();
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondragover) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondragover): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondragover): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should not reveal data to dragover event handler)')}
+ }
+ );
+ }
+ },false);
rect.addEventListener('drop',
- function (event)
- {e = 0;
- event.dataTransfer.items.clear();
- if(event.dataTransfer.items.length != dataTypes.length)
- {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
- for(var i = 0; i != event.dataTransfer.items.length; i++)
- {delete event.dataTransfer.items[i];
- if(event.dataTransfer.items[i].kind != 'string')
- {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
- if(event.dataTransfer.items[i].type != dataTypes[i])
- {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
- event.dataTransfer.items[i].getAsString(
- function ()
- {if(arguments[0] != data[e++])
- {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
- }
- );
- }
- rect.setAttribute('fill',result?'green':'red');
- },false);
+ function (event)
+ {e = 0;
+ event.dataTransfer.items.clear();
+ if(event.dataTransfer.items.length != dataTypes.length)
+ {say('items.length (ondrop) : FAIL (items.length should be' + dataTypes.length + ')')}
+ for(var i = 0; i != event.dataTransfer.items.length; i++)
+ {delete event.dataTransfer.items[i];
+ if(event.dataTransfer.items[i].kind != 'string')
+ {say('Item kind (ondrop): FAIL (items[' + i + '].kind should be string)')}
+ if(event.dataTransfer.items[i].type != dataTypes[i])
+ {say('Item type (ondrop): FAIL (items[' + i + '].type should be' + dataTypes[i] + ')')}
+ event.dataTransfer.items[i].getAsString(
+ function ()
+ {if(arguments[0] != data[e++])
+ {say('getAsString : FAIL (items[' + i + '].getAsString should pass' + data[e] + ')')}
+ }
+ );
+ }
+ rect.setAttribute('fill',result?'green':'red');
+ },false);
function say(it)
- {text.appendChild(document.createTextNode(it + '.'));
- result = false;}
+ {text.appendChild(document.createTextNode(it + '.'));
+ result = false;}
]]>
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/058.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/058.svg
index f27626f66cf..d2bb91da8d3 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/058.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/058.svg
@@ -2,7 +2,7 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>SVG link drag and drop: allowed effects 'copy','move','link' and 'none'</title>
<a xlink:href="data:text/plain,1">
- <circle cx="50" cy="50" r="40" fill="green"/>
+ <circle cx="50" cy="50" r="40" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="30">You should be able to drag green circle and drop it onto any of the boxes below. Choosen box should turn green once circle is dropped on it.</textArea>
<rect x="10" y="300" width="100" height="100" fill="silver"/>
@@ -14,23 +14,23 @@ var a = document.querySelector('a'), rect = document.querySelectorAll('rect'),
effects = ['copy','move','link','all'], e = 0;
a.addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = effects[e]}
+ {event.dataTransfer.effectAllowed = effects[e]}
,false);
for(var i = 0; i != rect.length; i++)
- {rect[i].addEventListener('dragenter',
- function (event)
- {event.preventDefault();
- event.dataTransfer.effectAllowed = effects[e];}
- ,false);
- rect[i].addEventListener('dragover',
- function (event)
- {event.preventDefault()}
- ,false);
- rect[i].addEventListener('drop',
- function (event)
- {if(event.dataTransfer.dropEffect == effects[e] &amp;&amp; event.dataTransfer.effectAllowed == effects[e] &amp;&amp; i != 3)
- {event.target.setAttribute('fill','green');}
- e = (e+1)%3;}
- ,false);}
+ {rect[i].addEventListener('dragenter',
+ function (event)
+ {event.preventDefault();
+ event.dataTransfer.effectAllowed = effects[e];}
+ ,false);
+ rect[i].addEventListener('dragover',
+ function (event)
+ {event.preventDefault()}
+ ,false);
+ rect[i].addEventListener('drop',
+ function (event)
+ {if(event.dataTransfer.dropEffect == effects[e] &amp;&amp; event.dataTransfer.effectAllowed == effects[e] &amp;&amp; i != 3)
+ {event.target.setAttribute('fill','green');}
+ e = (e+1)%3;}
+ ,false);}
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/059-1.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/059-1.svg
index 634620a2fe0..492e9511a11 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/059-1.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/059-1.svg
@@ -7,15 +7,15 @@
var rect = document.querySelector('rect');
rect.addEventListener('dragenter',
function (event)
- {event.preventDefault();}
+ {event.preventDefault();}
,false);
rect.addEventListener('dragover',
function (event)
- {event.preventDefault();}
+ {event.preventDefault();}
,false);
rect.addEventListener('drop',
function (event)
- {rect.setAttribute('fill',(event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'green':'red');}
+ {rect.setAttribute('fill',(event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'green':'red');}
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/059.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/059.svg
index a289804e63d..3cc7815c69f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/059.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/059.svg
@@ -2,14 +2,14 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>SVG link cross page drag and drop</title>
<a xlink:href="data:text/plain,1">
- <circle cx="50" cy="50" r="40" fill="green"/>
+ <circle cx="50" cy="50" r="40" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="30">Drag circle above. You should be redirected to the new page and be able to drop it there.</textArea>
<script type="application/ecmascript">
document.querySelector('a').addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- window.location = '059-1.svg'}
+ {event.dataTransfer.effectAllowed = 'copy';
+ window.location = '059-1.svg'}
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/060-1.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/060-1.svg
index b78e04b2112..3dc6689e599 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/060-1.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/060-1.svg
@@ -6,7 +6,7 @@
<script type="application/ecmascript">
document.querySelector('polygon').addEventListener('dragenter',
function (event)
- {window.location = '060.svg'}
+ {window.location = '060.svg'}
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/060.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/060.svg
index da3efcc4954..fa7159abad8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/060.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/060.svg
@@ -2,27 +2,27 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>SVG link drag and drop and history navigation roundtrip</title>
<a xlink:href="data:text/plain,1">
- <circle cx="50" cy="50" r="40" fill="green"/>
+ <circle cx="50" cy="50" r="40" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="30">Drag circle above. You will be redirected to new page. When you return back drop circle on itself. You should see word PASS once you drop it.</textArea>
<script type="application/ecmascript">
var a = document.querySelector('a');
a.addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- window.location = '060-1.svg'}
+ {event.dataTransfer.effectAllowed = 'copy';
+ window.location = '060-1.svg'}
,false);
a.addEventListener('dragenter',
function (event)
- {event.preventDefault();}
+ {event.preventDefault();}
,false);
a.addEventListener('dragover',
function (event)
- {event.preventDefault();}
+ {event.preventDefault();}
,false);
a.addEventListener('drop',
function (event)
- {document.querySelector('textArea').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL';}
+ {document.querySelector('textArea').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL';}
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/061.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/061.svg
index 17f8734358d..20ed8a8360f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/061.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/061.svg
@@ -2,26 +2,26 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>SVG link drag and drop roundtrip</title>
<a xlink:href="data:text/plain,1">
- <circle cx="50" cy="50" r="40" fill="green"/>
+ <circle cx="50" cy="50" r="40" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="30">Drag circle outside browser window and then drag it back and drop on itself. You should see word PASS once you drop it.</textArea>
<script type="application/ecmascript">
var a = document.querySelector('a');
a.addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy';}
+ {event.dataTransfer.effectAllowed = 'copy';}
,false);
a.addEventListener('dragenter',
function (event)
- {event.preventDefault();}
+ {event.preventDefault();}
,false);
a.addEventListener('dragover',
function (event)
- {event.preventDefault();}
+ {event.preventDefault();}
,false);
a.addEventListener('drop',
function (event)
- {document.querySelector('textArea').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL';}
+ {document.querySelector('textArea').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL';}
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/062.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/062.svg
index 0bc8477e5a6..2cbf96e0ea4 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/062.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/062.svg
@@ -2,7 +2,7 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>Setting drag image during drag and drop of SVG link</title>
<a xlink:href="data:text/plain,1">
- <circle cx="60" cy="60" r="50" fill="gray"/>
+ <circle cx="60" cy="60" r="50" fill="gray"/>
</a>
<textArea x="10" y="200" width="480" height="200" font-size="30">Try to drag circle. Drag feedback should look like green rectangle.</textArea>
<rect x="300" y="10" width="100" height="100" fill="green"/>
@@ -10,8 +10,8 @@
var a = document.querySelector('a'), rect = document.querySelector('rect');
a.addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelector('rect'), 50, 50);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelector('rect'), 50, 50);}
,false);
</script>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/063.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/063.svg
index eda15495f41..3f570b6adb0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/063.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/063.svg
@@ -2,23 +2,23 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>Adding element to datastore while dragging SVG links</title>
<a xlink:href="data:text/plain,1">
- <rect x="10" y="10" width="100" height="100" fill="green"/>
+ <rect x="10" y="10" width="100" height="100" fill="green"/>
</a>
<a xlink:href="data:text/plain,2">
- <rect x="300" y="10" width="100" height="100" fill="teal"/>
+ <rect x="300" y="10" width="100" height="100" fill="teal"/>
</a>
<textArea x="10" y="200" width="480" height="200" font-size="30">Try to drag one of boxes above. Drag feedback should include both boxes.</textArea>
<script type="application/ecmascript">
var a = document.querySelectorAll('a');
a[0].addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelectorAll('rect')[1]);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelectorAll('rect')[1]);}
,false);
a[1].addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.addElement(document.querySelectorAll('rect')[0]);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.addElement(document.querySelectorAll('rect')[0]);}
,false);
</script>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/064.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/064.svg
index 913732360c8..5369de9f447 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/064.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/064.svg
@@ -2,25 +2,25 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of overlapping SVG links</title>
<a xlink:href="data:text/plain,1">
- <rect x="10" y="10" width="100" height="100" fill="silver"/>
+ <rect x="10" y="10" width="100" height="100" fill="silver"/>
</a>
<a xlink:href="data:text/plain,2">
- <rect x="10" y="10" width="100" height="100" fill="gray"/>
+ <rect x="10" y="10" width="100" height="100" fill="gray"/>
</a>
- <rect x="160" y="10" width="100" height="100" fill="green"/>
- <rect x="310" y="10" width="100" height="100" fill="maroon"/>
+ <rect x="160" y="10" width="100" height="100" fill="green"/>
+ <rect x="310" y="10" width="100" height="100" fill="maroon"/>
<textArea x="10" y="200" width="480" height="200" font-size="30">Try to drag gray boxe above. Drag feedback should be green, not red.</textArea>
<script type="application/ecmascript">
var a = document.querySelectorAll('a');
a[0].addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelectorAll('rect')[3], 50, 50);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelectorAll('rect')[3], 50, 50);}
,false);
a[1].addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- event.dataTransfer.setDragImage(document.querySelectorAll('rect')[2], 50, 50);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ event.dataTransfer.setDragImage(document.querySelectorAll('rect')[2], 50, 50);}
,false);
</script>
-</svg> \ No newline at end of file
+</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/065.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/065.svg
index 38cb9560ddf..89e158f2f9d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/065.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/065.svg
@@ -2,27 +2,27 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>Reload during SVG link drag and drop roundtrip</title>
<a xlink:href="data:text/plain,1">
- <circle cx="50" cy="50" r="40" fill="green"/>
+ <circle cx="50" cy="50" r="40" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="30">Drag circle around page and then drag it back and drop on itself. You should see word PASS once you drop it.</textArea>
<script type="application/ecmascript">
var a = document.querySelector('a');
a.addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- window.location.reload()}
+ {event.dataTransfer.effectAllowed = 'copy';
+ window.location.reload()}
,false);
a.addEventListener('dragenter',
function (event)
- {event.preventDefault();}
+ {event.preventDefault();}
,false);
a.addEventListener('dragover',
function (event)
- {event.preventDefault();}
+ {event.preventDefault();}
,false);
a.addEventListener('drop',
function (event)
- {document.querySelector('textArea').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL';}
+ {document.querySelector('textArea').firstChild.nodeValue = (event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')?'PASS':'FAIL';}
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/066.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/066.svg
index 1020ec82c80..f5066ac3574 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/066.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/066.svg
@@ -2,7 +2,7 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>Removing dragged element during drag and drop of SVG link</title>
<a xlink:href="data:text/plain,1">
- <circle cx="50" cy="50" r="50" fill="green"/>
+ <circle cx="50" cy="50" r="50" fill="green"/>
</a>
<textArea x="10" y="100" width="480" height="200" font-size="30">Drag green circle above and drop it in the gray box below. Gray box should turn green once you drop it.</textArea>
<rect x="10" y="300" width="480" height="190" fill="gray"/>
@@ -10,22 +10,22 @@
var a = document.querySelector('a'), rect = document.querySelector('rect');
a.addEventListener('dragstart',
function (event)
- {event.dataTransfer.effectAllowed = 'copy';
- document.documentElement.removeChild(a);}
+ {event.dataTransfer.effectAllowed = 'copy';
+ document.documentElement.removeChild(a);}
,false);
rect.addEventListener('dragenter',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('dragover',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('drop',
function (event)
- {if(event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')
- {rect.setAttribute('fill','green');}
- }
+ {if(event.dataTransfer.getData('text/uri-list').replace(/\r\n$/,'') == 'data:text/plain,1')
+ {rect.setAttribute('fill','green');}
+ }
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/svg/067.svg b/tests/wpt/web-platform-tests/html/editing/dnd/svg/067.svg
index ba1e5011f2f..9156a0ff2ee 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/svg/067.svg
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/svg/067.svg
@@ -2,34 +2,34 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="500px" height="500px" viewBox="0 0 500 500">
<title>Drag and drop of SVG links</title>
<a xlink:href="data:text/plain,olive">
- <circle cx="50" cy="50" r="50" fill="olive"/>
+ <circle cx="50" cy="50" r="50" fill="olive"/>
</a>
<a xlink:href="data:text/plain,green">
- <circle cx="200" cy="50" r="50" fill="green"/>
+ <circle cx="200" cy="50" r="50" fill="green"/>
</a>
<a xlink:href="data:text/plain,teal">
- <circle cx="350" cy="50" r="50" fill="teal"/>
+ <circle cx="350" cy="50" r="50" fill="teal"/>
</a>
<textArea x="10" y="120" width="480" height="200" font-size="30">Drag one of green circles above and drop it in the gray box below. Gray box should turn green.</textArea>
<rect x="10" y="300" width="480" height="190" fill="gray"/>
<script type="application/ecmascript">
var a = document.querySelectorAll('a'), rect = document.querySelector('rect');
for(var i = 0; i != a.length; i++)
- {a[i].addEventListener('dragstart',
- function (event)
- {event.dataTransfer.effectAllowed = 'copy';}
- ,false);}
+ {a[i].addEventListener('dragstart',
+ function (event)
+ {event.dataTransfer.effectAllowed = 'copy';}
+ ,false);}
rect.addEventListener('dragenter',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('dragover',
function (event)
- {event.preventDefault()}
+ {event.preventDefault()}
,false);
rect.addEventListener('drop',
function (event)
- {rect.setAttribute('fill',event.dataTransfer.getData('text/uri-list').substr(16).replace(/\r\n$/,''));}
+ {rect.setAttribute('fill',event.dataTransfer.getData('text/uri-list').substr(16).replace(/\r\n$/,''));}
,false);
</script>
</svg>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/001.html b/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/001.html
index bcc38e0e72c..ddad72095b2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/001.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/001.html
@@ -1,120 +1,120 @@
<!doctype html>
<html>
- <head>
- <title>Synthetic drag events</title>
- <script type="text/javascript" src="/resources/testharness.js"></script>
- <script type="text/javascript" src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <div id="log"></div>
- <script type="text/javascript">
-test(function() {
- assert_own_property(window,'DragEvent');
+ <head>
+ <title>Synthetic drag events</title>
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript" src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div id="log"></div>
+ <script type="text/javascript">
+test(function() {
+ assert_own_property(window,'DragEvent');
}, 'window.DragEvent should be exposed' );
test(function() {
- assert_throws('NOT_SUPPORTED_ERR', function() {
- var evt = document.createEvent('DragEvent');
- });
+ assert_throws('NOT_SUPPORTED_ERR', function() {
+ var evt = document.createEvent('DragEvent');
+ });
}, 'createEvent should not be able to create a DragEvent' );
test(function() {
- var evt = new DragEvent('dragstart');
- assert_false( !!evt.initDragEvent, 'initDragEvent' );
- assert_true( !!evt.initMouseEvent, 'initMouseEvent' );
- assert_true( !!evt.initUIEvent, 'initUIEvent' );
- assert_true( !!evt.initEvent, 'initEvent' );
+ var evt = new DragEvent('dragstart');
+ assert_false( !!evt.initDragEvent, 'initDragEvent' );
+ assert_true( !!evt.initMouseEvent, 'initMouseEvent' );
+ assert_true( !!evt.initUIEvent, 'initUIEvent' );
+ assert_true( !!evt.initEvent, 'initEvent' );
}, 'DragEvent should have all of the inherited init*Event methods' );
//cannot test non-synthetic dataTransfer objects as the param here because that needs a real DragEvent to create a proper one with global storage
//will be tested in another file
test(function() {
- var evt = new DragEvent('dragstart');
- evt.initMouseEvent('dragstart', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, document.body);
+ var evt = new DragEvent('dragstart');
+ evt.initMouseEvent('dragstart', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, document.body);
}, 'initMouseEvent should not throw' );
test(function() {
- var evt = new DragEvent('dragstart');
- evt.initUIEvent('dragstart', true, true, window, 1);
+ var evt = new DragEvent('dragstart');
+ evt.initUIEvent('dragstart', true, true, window, 1);
}, 'initUIEvent should not throw' );
test(function() {
- var evt = new DragEvent('dragstart');
- evt.initEvent('dragstart', true, true);
+ var evt = new DragEvent('dragstart');
+ evt.initEvent('dragstart', true, true);
}, 'initEvent should not throw' );
test(function() {
- var evt = new DragEvent('dragstart', {dataTransfer:null}), div = document.createElement('div'), ranlistener = false;
- div.ondragstart = function () { ranlistener = true; };
- div.dispatchEvent(evt);
- assert_true(ranlistener);
+ var evt = new DragEvent('dragstart', {dataTransfer:null}), div = document.createElement('div'), ranlistener = false;
+ div.ondragstart = function () { ranlistener = true; };
+ div.dispatchEvent(evt);
+ assert_true(ranlistener);
}, 'DragEvent constructor with null as the dataTransfer parameter should be able to fire the event' );
test(function() {
- var evt = new DragEvent('dragstart', {dataTransfer:undefined}), div = document.createElement('div'), ranlistener = false;
- div.ondragstart = function () { ranlistener = true; };
- div.dispatchEvent(evt);
- assert_true(ranlistener);
+ var evt = new DragEvent('dragstart', {dataTransfer:undefined}), div = document.createElement('div'), ranlistener = false;
+ div.ondragstart = function () { ranlistener = true; };
+ div.dispatchEvent(evt);
+ assert_true(ranlistener);
}, 'DragEvent constructor with undefined as the dataTransfer parameter should be able to fire the event' );
test(function() {
- assert_throws(new TypeError(), function() {
- var evt = new DragEvent('dragstart', {dataTransfer:{}});
- });
+ assert_throws(new TypeError(), function() {
+ var evt = new DragEvent('dragstart', {dataTransfer:{}});
+ });
}, 'DragEvent constructor with custom object as the dataTransfer parameter should throw TypeError' );
test(function() {
- var evt = new DragEvent('dragstart'), div = document.createElement('div'), ranlistener = false;
- div.ondragstart = function () { ranlistener = true; };
- evt.initMouseEvent('dragstart', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, document.body);
- div.dispatchEvent(evt);
- assert_true(ranlistener);
+ var evt = new DragEvent('dragstart'), div = document.createElement('div'), ranlistener = false;
+ div.ondragstart = function () { ranlistener = true; };
+ evt.initMouseEvent('dragstart', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, document.body);
+ div.dispatchEvent(evt);
+ assert_true(ranlistener);
}, 'initMouseEvent should be able to fire the event' );
test(function() {
- var evt = new DragEvent('dragstart'), div = document.createElement('div'), ranlistener = false;
- div.ondragstart = function () { ranlistener = true; };
- evt.initUIEvent('dragstart', true, true, window, 1);
- div.dispatchEvent(evt);
- assert_true(ranlistener);
+ var evt = new DragEvent('dragstart'), div = document.createElement('div'), ranlistener = false;
+ div.ondragstart = function () { ranlistener = true; };
+ evt.initUIEvent('dragstart', true, true, window, 1);
+ div.dispatchEvent(evt);
+ assert_true(ranlistener);
}, 'initUIEvent should be able to fire the event' );
test(function() {
- var evt = new DragEvent('dragstart'), div = document.createElement('div'), ranlistener = false;
- div.ondragstart = function () { ranlistener = true; };
- evt.initEvent('dragstart', true, true);
- div.dispatchEvent(evt);
- assert_true(ranlistener);
+ var evt = new DragEvent('dragstart'), div = document.createElement('div'), ranlistener = false;
+ div.ondragstart = function () { ranlistener = true; };
+ evt.initEvent('dragstart', true, true);
+ div.dispatchEvent(evt);
+ assert_true(ranlistener);
}, 'initEvent should be able to fire the event' );
test(function() {
- var evt = new DragEvent('dragstart', {dataTransfer:null}), div = document.createElement('div'), dTrans = 'fail';
- div.ondragstart = function (e) { dTrans = e.dataTransfer };
- div.dispatchEvent(evt);
- assert_equals(dTrans,null);
+ var evt = new DragEvent('dragstart', {dataTransfer:null}), div = document.createElement('div'), dTrans = 'fail';
+ div.ondragstart = function (e) { dTrans = e.dataTransfer };
+ div.dispatchEvent(evt);
+ assert_equals(dTrans,null);
}, 'DragEvent constructor with null as the dataTransfer parameter should give null as the dataTransfer' );
test(function() {
- var evt = new DragEvent('dragstart', {dataTransfer:undefined}), div = document.createElement('div'), dTrans = 'fail';
- div.ondragstart = function (e) { dTrans = e.dataTransfer };
- div.dispatchEvent(evt);
- assert_equals(dTrans,null);
+ var evt = new DragEvent('dragstart', {dataTransfer:undefined}), div = document.createElement('div'), dTrans = 'fail';
+ div.ondragstart = function (e) { dTrans = e.dataTransfer };
+ div.dispatchEvent(evt);
+ assert_equals(dTrans,null);
}, 'DragEvent constructor with undefined as the dataTransfer parameter should give null as the dataTransfer' );
test(function() {
- var evt = new DragEvent('dragstart'), div = document.createElement('div'), dTrans = 'fail';
- div.ondragstart = function (e) { dTrans = e.dataTransfer };
- evt.initMouseEvent('dragstart', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, document.body);
- div.dispatchEvent(evt);
- assert_equals(dTrans,null);
+ var evt = new DragEvent('dragstart'), div = document.createElement('div'), dTrans = 'fail';
+ div.ondragstart = function (e) { dTrans = e.dataTransfer };
+ evt.initMouseEvent('dragstart', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, document.body);
+ div.dispatchEvent(evt);
+ assert_equals(dTrans,null);
}, 'initMouseEvent should give null as the dataTransfer' );
test(function() {
- var evt = new DragEvent('dragstart'), div = document.createElement('div'), dTrans = 'fail';
- div.ondragstart = function (e) { dTrans = e.dataTransfer };
- evt.initUIEvent('dragstart', true, true, window, 1);
- div.dispatchEvent(evt);
- assert_equals(dTrans,null);
+ var evt = new DragEvent('dragstart'), div = document.createElement('div'), dTrans = 'fail';
+ div.ondragstart = function (e) { dTrans = e.dataTransfer };
+ evt.initUIEvent('dragstart', true, true, window, 1);
+ div.dispatchEvent(evt);
+ assert_equals(dTrans,null);
}, 'initUIEvent should give null as the dataTransfer' );
test(function() {
- var evt = new DragEvent('dragstart'), div = document.createElement('div'), dTrans = 'fail';
- div.ondragstart = function (e) { dTrans = e.dataTransfer };
- evt.initEvent('dragstart', true, true);
- div.dispatchEvent(evt);
- assert_equals(dTrans,null);
+ var evt = new DragEvent('dragstart'), div = document.createElement('div'), dTrans = 'fail';
+ div.ondragstart = function (e) { dTrans = e.dataTransfer };
+ evt.initEvent('dragstart', true, true);
+ div.dispatchEvent(evt);
+ assert_equals(dTrans,null);
}, 'initEvent should give null as the dataTransfer' );
//cannot test that synthetic event does not use the same data store as non-synthetic event because that needs a real DragEvent to create a proper one with global storage
//will be tested in another file
- </script>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/005-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/005-manual.html
index 0089b784b95..f3bb221b7f2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/005-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/005-manual.html
@@ -1,339 +1,339 @@
<!doctype html>
<html>
- <head>
- <title>Synthetic events with real data store must inherit protection status from real events</title>
- <style type="text/css">
+ <head>
+ <title>Synthetic events with real data store must inherit protection status from real events</title>
+ <style type="text/css">
blockquote { height: 100px; width: 100px; background: orange; margin: 0; padding: 0; float: left; }
blockquote + blockquote { background: blue; }
blockquote + blockquote + blockquote { background: fuchsia; }
blockquote + div { clear: left; }
- </style>
- <script type="text/javascript" src="/resources/testharness.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript">
setup(function () {},{explicit_done:true,explicit_timeout:true});
window.onload = function () {
- var orange = document.getElementsByTagName('blockquote')[0],
- blue = document.getElementsByTagName('blockquote')[1],
- fuchsia = document.getElementsByTagName('blockquote')[2],
- evtdone = {};
+ var orange = document.getElementsByTagName('blockquote')[0],
+ blue = document.getElementsByTagName('blockquote')[1],
+ fuchsia = document.getElementsByTagName('blockquote')[2],
+ evtdone = {};
- orange.ondragstart = function (e) {
- evtdone[e.type] = true;
- e.dataTransfer.effectAllowed = 'copy';
+ orange.ondragstart = function (e) {
+ evtdone[e.type] = true;
+ e.dataTransfer.effectAllowed = 'copy';
- var t = async_test(e.type+' should share its data with the synthetic event');
- blue.ondragstart = function (e) {
- t.step(function() {
- assert_equals( e.dataTransfer.getData('text'), 'dragstart real data', 'step 1' );
- e.dataTransfer.setData('text','dragstart-dragstart synthetic data');
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-dragstart synthetic data', 'step 2' );
- });
- };
- t.step(function() {
- var evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- e.dataTransfer.setData('text','dragstart real data'); //changing in between steps, just to make sure it uses the underlying data store, not a temporary clone
- blue.dispatchEvent(evt);
- });
- t.done();
+ var t = async_test(e.type+' should share its data with the synthetic event');
+ blue.ondragstart = function (e) {
+ t.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart real data', 'step 1' );
+ e.dataTransfer.setData('text','dragstart-dragstart synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-dragstart synthetic data', 'step 2' );
+ });
+ };
+ t.step(function() {
+ var evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
+ e.dataTransfer.setData('text','dragstart real data'); //changing in between steps, just to make sure it uses the underlying data store, not a temporary clone
+ blue.dispatchEvent(evt);
+ });
+ t.done();
- test(function() {
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-dragstart synthetic data' );
- }, e.type+' should see the data from the synthetic event' );
+ test(function() {
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-dragstart synthetic data' );
+ }, e.type+' should see the data from the synthetic event' );
- var t2 = async_test(e.type+' should share its protection status with the synthetic event');
- blue.ondrag = function (e) {
- t2.step(function() {
- e.dataTransfer.setData('text','dragstart-drag synthetic data');
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag synthetic data' );
- });
- };
- t2.step(function() {
- var evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t2.done();
+ var t2 = async_test(e.type+' should share its protection status with the synthetic event');
+ blue.ondrag = function (e) {
+ t2.step(function() {
+ e.dataTransfer.setData('text','dragstart-drag synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag synthetic data' );
+ });
+ };
+ t2.step(function() {
+ var evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
+ blue.dispatchEvent(evt);
+ });
+ t2.done();
- var t3 = async_test(e.type+' should share its protection status with the nested synthetic event');
- blue.ondrag = function (e) {
- blue.ondragend = function (e) {
- t3.step(function() {
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag synthetic data', 'step1' );
- e.dataTransfer.setData('text','dragstart-drag-dragend synthetic data');
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data', 'step2' );
- });
- };
- t3.step(function() {
- var evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- };
- t3.step(function() {
- var evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t3.done();
+ var t3 = async_test(e.type+' should share its protection status with the nested synthetic event');
+ blue.ondrag = function (e) {
+ blue.ondragend = function (e) {
+ t3.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag synthetic data', 'step1' );
+ e.dataTransfer.setData('text','dragstart-drag-dragend synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data', 'step2' );
+ });
+ };
+ t3.step(function() {
+ var evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
+ blue.dispatchEvent(evt);
+ });
+ };
+ t3.step(function() {
+ var evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
+ blue.dispatchEvent(evt);
+ });
+ t3.done();
- test(function() {
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data' );
- }, e.type+' should see the data from the nested synthetic event' );
- };
+ test(function() {
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data' );
+ }, e.type+' should see the data from the nested synthetic event' );
+ };
- blue.ondragenter = blue.ondragover = function (e) {
- e.preventDefault();
- };
- orange.ondrag = blue.ondragleave = function (e) {
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- var evtype = e.type;
+ blue.ondragenter = blue.ondragover = function (e) {
+ e.preventDefault();
+ };
+ orange.ondrag = blue.ondragleave = function (e) {
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ var evtype = e.type;
- var t = async_test(e.type+' should share its data with the synthetic event');
- blue.ondragstart = function (e) {
- t.step(function() {
- assert_true( e.dataTransfer.items.length > 0, 'items.length' );
- });
- };
- t.step(function() {
+ var t = async_test(e.type+' should share its data with the synthetic event');
+ blue.ondragstart = function (e) {
+ t.step(function() {
+ assert_true( e.dataTransfer.items.length > 0, 'items.length' );
+ });
+ };
+ t.step(function() {
var evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t.done();
+ blue.dispatchEvent(evt);
+ });
+ t.done();
- var t2 = async_test(e.type+' should share its protection status with the synthetic event');
- blue.ondragstart = function (e) {
- t2.step(function() {
- assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
- e.dataTransfer.setData('text',evtype+'-dragstart synthetic data');
- assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
- });
- };
- t2.step(function() {
+ var t2 = async_test(e.type+' should share its protection status with the synthetic event');
+ blue.ondragstart = function (e) {
+ t2.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
+ e.dataTransfer.setData('text',evtype+'-dragstart synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
+ });
+ };
+ t2.step(function() {
var evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t2.done();
+ blue.dispatchEvent(evt);
+ });
+ t2.done();
- test(function() {
- assert_equals( e.dataTransfer.getData('text'), '' );
- }, e.type+' protection status should not be modified by the synthetic event' );
+ test(function() {
+ assert_equals( e.dataTransfer.getData('text'), '' );
+ }, e.type+' protection status should not be modified by the synthetic event' );
- var t3 = async_test(e.type+' should share its protection status with the nested synthetic event');
- blue.ondragstart = function (e) {
- var div = document.createElement('div');
- div.ondragstart = function (e) {
- t3.step(function() {
- assert_equals( e.dataTransfer.getData('text'), '', 'step1' );
- e.dataTransfer.setData('text',evtype+'dragstart-dragstart synthetic data');
- assert_equals( e.dataTransfer.getData('text'), '', 'step2' );
- });
- };
- t3.step(function() {
+ var t3 = async_test(e.type+' should share its protection status with the nested synthetic event');
+ blue.ondragstart = function (e) {
+ var div = document.createElement('div');
+ div.ondragstart = function (e) {
+ t3.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), '', 'step1' );
+ e.dataTransfer.setData('text',evtype+'dragstart-dragstart synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), '', 'step2' );
+ });
+ };
+ t3.step(function() {
var evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
- div.dispatchEvent(evt);
- });
- };
- t3.step(function() {
+ div.dispatchEvent(evt);
+ });
+ };
+ t3.step(function() {
var evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t3.done();
- };
+ blue.dispatchEvent(evt);
+ });
+ t3.done();
+ };
- fuchsia.ondragenter = fuchsia.ondragover = function (e) {
- e.preventDefault();
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- var evtype = e.type;
+ fuchsia.ondragenter = fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ var evtype = e.type;
- var t = async_test(e.type+' should share its data with the synthetic event');
- blue.ondragstart = function (e) {
- t.step(function() {
- assert_true( e.dataTransfer.items.length > 0, 'items.length' );
- });
- };
- t.step(function() {
+ var t = async_test(e.type+' should share its data with the synthetic event');
+ blue.ondragstart = function (e) {
+ t.step(function() {
+ assert_true( e.dataTransfer.items.length > 0, 'items.length' );
+ });
+ };
+ t.step(function() {
var evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t.done();
+ blue.dispatchEvent(evt);
+ });
+ t.done();
- var t2 = async_test(e.type+' should share its protection status with the synthetic event');
- blue.ondragstart = function (e) {
- t2.step(function() {
- assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
- e.dataTransfer.setData('text',evtype+'-dragstart synthetic data');
- assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
- });
- };
- t2.step(function() {
+ var t2 = async_test(e.type+' should share its protection status with the synthetic event');
+ blue.ondragstart = function (e) {
+ t2.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
+ e.dataTransfer.setData('text',evtype+'-dragstart synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
+ });
+ };
+ t2.step(function() {
var evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t2.done();
+ blue.dispatchEvent(evt);
+ });
+ t2.done();
- test(function() {
- assert_equals( e.dataTransfer.getData('text'), '' );
- }, e.type+' protection status should not be modified by the synthetic event' );
+ test(function() {
+ assert_equals( e.dataTransfer.getData('text'), '' );
+ }, e.type+' protection status should not be modified by the synthetic event' );
- var t3 = async_test(e.type+' should share its protection status with the nested synthetic event');
- blue.ondragstart = function (e) {
- var div = document.createElement('div');
- div.ondragstart = function (e) {
- t3.step(function() {
- assert_equals( e.dataTransfer.getData('text'), '', 'step1' );
- e.dataTransfer.setData('text',evtype+'dragstart-dragstart synthetic data');
- assert_equals( e.dataTransfer.getData('text'), '', 'step2' );
- });
- };
- t3.step(function() {
+ var t3 = async_test(e.type+' should share its protection status with the nested synthetic event');
+ blue.ondragstart = function (e) {
+ var div = document.createElement('div');
+ div.ondragstart = function (e) {
+ t3.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), '', 'step1' );
+ e.dataTransfer.setData('text',evtype+'dragstart-dragstart synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), '', 'step2' );
+ });
+ };
+ t3.step(function() {
var evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
- div.dispatchEvent(evt);
- });
- };
- t3.step(function() {
+ div.dispatchEvent(evt);
+ });
+ };
+ t3.step(function() {
var evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t3.done();
- };
+ blue.dispatchEvent(evt);
+ });
+ t3.done();
+ };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- var evtype = e.type;
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ var evtype = e.type;
- var t = async_test(e.type+' should share its data with the synthetic event');
- blue.ondragstart = function (e) {
- t.step(function() {
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data' );
- });
- };
- t.step(function() {
+ var t = async_test(e.type+' should share its data with the synthetic event');
+ blue.ondragstart = function (e) {
+ t.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data' );
+ });
+ };
+ t.step(function() {
var evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t.done();
+ blue.dispatchEvent(evt);
+ });
+ t.done();
- var t2 = async_test(e.type+' should share its protection status with the synthetic event');
- blue.ondragstart = function (e) {
- t2.step(function() {
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data', 'step 1' );
- e.dataTransfer.setData('text',evtype+'-dragstart synthetic data');
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data', 'step 2' );
- });
- };
- t2.step(function() {
+ var t2 = async_test(e.type+' should share its protection status with the synthetic event');
+ blue.ondragstart = function (e) {
+ t2.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data', 'step 1' );
+ e.dataTransfer.setData('text',evtype+'-dragstart synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data', 'step 2' );
+ });
+ };
+ t2.step(function() {
var evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t2.done();
+ blue.dispatchEvent(evt);
+ });
+ t2.done();
- test(function() {
- e.dataTransfer.setData('text','drop synthetic data');
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data' );
- }, e.type+' protection status should not be modified by the synthetic event' );
+ test(function() {
+ e.dataTransfer.setData('text','drop synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data' );
+ }, e.type+' protection status should not be modified by the synthetic event' );
- var t3 = async_test(e.type+' should share its protection status with the nested synthetic event');
- blue.ondragstart = function (e) {
- var div = document.createElement('div');
- div.ondragstart = function (e) {
- t3.step(function() {
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data', 'step 1' );
- e.dataTransfer.setData('text',evtype+'dragstart-dragstart synthetic data');
- assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data', 'step 2' );
- });
- };
- t3.step(function() {
+ var t3 = async_test(e.type+' should share its protection status with the nested synthetic event');
+ blue.ondragstart = function (e) {
+ var div = document.createElement('div');
+ div.ondragstart = function (e) {
+ t3.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data', 'step 1' );
+ e.dataTransfer.setData('text',evtype+'dragstart-dragstart synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), 'dragstart-drag-dragend synthetic data', 'step 2' );
+ });
+ };
+ t3.step(function() {
var evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
- div.dispatchEvent(evt);
- });
- };
- t3.step(function() {
+ div.dispatchEvent(evt);
+ });
+ };
+ t3.step(function() {
var evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t3.done();
- };
+ blue.dispatchEvent(evt);
+ });
+ t3.done();
+ };
- orange.ondragend = function (e) {
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- var evtype = e.type;
+ orange.ondragend = function (e) {
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ var evtype = e.type;
- var t = async_test(e.type+' should share its data with the synthetic event');
- blue.ondragstart = function (e) {
- t.step(function() {
- assert_true( e.dataTransfer.items.length > 0, 'items.length' );
- });
- };
- t.step(function() {
+ var t = async_test(e.type+' should share its data with the synthetic event');
+ blue.ondragstart = function (e) {
+ t.step(function() {
+ assert_true( e.dataTransfer.items.length > 0, 'items.length' );
+ });
+ };
+ t.step(function() {
var evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t.done();
+ blue.dispatchEvent(evt);
+ });
+ t.done();
- var t2 = async_test(e.type+' should share its protection status with the synthetic event');
- blue.ondragstart = function (e) {
- t2.step(function() {
- assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
- e.dataTransfer.setData('text',evtype+'-dragstart synthetic data');
- assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
- });
- };
- t2.step(function() {
+ var t2 = async_test(e.type+' should share its protection status with the synthetic event');
+ blue.ondragstart = function (e) {
+ t2.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
+ e.dataTransfer.setData('text',evtype+'-dragstart synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
+ });
+ };
+ t2.step(function() {
var evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t2.done();
+ blue.dispatchEvent(evt);
+ });
+ t2.done();
- test(function() {
- assert_equals( e.dataTransfer.getData('text'), '' );
- }, e.type+' protection status should not be modified by the synthetic event' );
+ test(function() {
+ assert_equals( e.dataTransfer.getData('text'), '' );
+ }, e.type+' protection status should not be modified by the synthetic event' );
- var t3 = async_test(e.type+' should share its protection status with the nested synthetic event');
- blue.ondragstart = function (e) {
- var div = document.createElement('div');
- div.ondragstart = function (e) {
- t3.step(function() {
- assert_equals( e.dataTransfer.getData('text'), '', 'step1' );
- e.dataTransfer.setData('text',evtype+'dragstart-dragstart synthetic data');
- assert_equals( e.dataTransfer.getData('text'), '', 'step2' );
- });
- };
- t3.step(function() {
+ var t3 = async_test(e.type+' should share its protection status with the nested synthetic event');
+ blue.ondragstart = function (e) {
+ var div = document.createElement('div');
+ div.ondragstart = function (e) {
+ t3.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), '', 'step1' );
+ e.dataTransfer.setData('text',evtype+'dragstart-dragstart synthetic data');
+ assert_equals( e.dataTransfer.getData('text'), '', 'step2' );
+ });
+ };
+ t3.step(function() {
var evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
- div.dispatchEvent(evt);
- });
- };
- t3.step(function() {
+ div.dispatchEvent(evt);
+ });
+ };
+ t3.step(function() {
var evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
- blue.dispatchEvent(evt);
- });
- t3.done();
+ blue.dispatchEvent(evt);
+ });
+ t3.done();
- test(function() {
- var failtxt = '- Reload and try again';
- assert_true( evtdone.dragstart, 'dragstart event was not tested'+failtxt );
- assert_true( evtdone.drag, 'drag event was not tested'+failtxt );
- assert_true( evtdone.dragenter, 'dragenter event was not tested'+failtxt );
- assert_true( evtdone.dragleave, 'dragleave event was not tested'+failtxt );
- assert_true( evtdone.dragover, 'dragover event was not tested'+failtxt );
- assert_true( evtdone.drop, 'drop event was not tested'+failtxt );
- assert_true( evtdone.dragend, 'dragend event was not tested'+failtxt );
- }, 'all event types must now have been tested' );
- done();
- };
+ test(function() {
+ var failtxt = '- Reload and try again';
+ assert_true( evtdone.dragstart, 'dragstart event was not tested'+failtxt );
+ assert_true( evtdone.drag, 'drag event was not tested'+failtxt );
+ assert_true( evtdone.dragenter, 'dragenter event was not tested'+failtxt );
+ assert_true( evtdone.dragleave, 'dragleave event was not tested'+failtxt );
+ assert_true( evtdone.dragover, 'dragover event was not tested'+failtxt );
+ assert_true( evtdone.drop, 'drop event was not tested'+failtxt );
+ assert_true( evtdone.dragend, 'dragend event was not tested'+failtxt );
+ }, 'all event types must now have been tested' );
+ done();
+ };
};
- </script>
- </head>
- <body>
- <p>Drag the orange square over the blue square then the fuchsia square, then release it.</p>
- <blockquote draggable="true"></blockquote>
- <blockquote></blockquote>
- <blockquote></blockquote>
- <div id="log"></div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <p>Drag the orange square over the blue square then the fuchsia square, then release it.</p>
+ <blockquote draggable="true"></blockquote>
+ <blockquote></blockquote>
+ <blockquote></blockquote>
+ <div id="log"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/006-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/006-manual.html
index b03ec431b43..2007116668a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/006-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/synthetic/006-manual.html
@@ -1,78 +1,78 @@
<!doctype html>
<html>
- <head>
- <title>Synthetic events using real dataTransfer in new thread</title>
- <style type="text/css">
+ <head>
+ <title>Synthetic events using real dataTransfer in new thread</title>
+ <style type="text/css">
blockquote { height: 100px; width: 100px; background: orange; margin: 0; padding: 0; float: left; }
blockquote + blockquote { background: blue; }
blockquote + blockquote + blockquote { background: fuchsia; }
blockquote + div { clear: left; }
- </style>
- <script type="text/javascript" src="/resources/testharness.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript">
setup(function () {},{explicit_done:true,explicit_timeout:true});
window.onload = function () {
- var orange = document.getElementsByTagName('blockquote')[0],
- blue = document.getElementsByTagName('blockquote')[1],
- fuchsia = document.getElementsByTagName('blockquote')[2],
- evtdone = {};
+ var orange = document.getElementsByTagName('blockquote')[0],
+ blue = document.getElementsByTagName('blockquote')[1],
+ fuchsia = document.getElementsByTagName('blockquote')[2],
+ evtdone = {};
- orange.ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dragstart real data');
- var dataTransfer = e.dataTransfer;
- setTimeout(function () {
- var t = async_test('new thread should see data store in protected mode after dragstart');
- blue.ondragstart = function (e) {
- t.step(function() {
- assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
- e.dataTransfer.setData('text','new thread after dragstart');
- assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
- });
- };
- t.step(function() {
+ orange.ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dragstart real data');
+ var dataTransfer = e.dataTransfer;
+ setTimeout(function () {
+ var t = async_test('new thread should see data store in protected mode after dragstart');
+ blue.ondragstart = function (e) {
+ t.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
+ e.dataTransfer.setData('text','new thread after dragstart');
+ assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
+ });
+ };
+ t.step(function() {
var evt = new DragEvent('dragstart', {dataTransfer:dataTransfer});
- blue.dispatchEvent(evt);
- });
- t.done();
- },0);
- };
+ blue.dispatchEvent(evt);
+ });
+ t.done();
+ },0);
+ };
- fuchsia.ondragenter = fuchsia.ondragover = function (e) {
- e.preventDefault();
- };
+ fuchsia.ondragenter = fuchsia.ondragover = function (e) {
+ e.preventDefault();
+ };
- fuchsia.ondrop = function (e) {
- e.preventDefault();
- var dataTransfer = e.dataTransfer;
- setTimeout(function () {
- var t = async_test('new thread should see data store in protected mode after drop');
- blue.ondragstart = function (e) {
- t.step(function() {
- assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
- e.dataTransfer.setData('text','new thread after dragstart');
- assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
- });
- };
- t.step(function() {
+ fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ var dataTransfer = e.dataTransfer;
+ setTimeout(function () {
+ var t = async_test('new thread should see data store in protected mode after drop');
+ blue.ondragstart = function (e) {
+ t.step(function() {
+ assert_equals( e.dataTransfer.getData('text'), '', 'step 1' );
+ e.dataTransfer.setData('text','new thread after dragstart');
+ assert_equals( e.dataTransfer.getData('text'), '', 'step 2' );
+ });
+ };
+ t.step(function() {
var evt = new DragEvent('dragstart', {dataTransfer:dataTransfer});
- blue.dispatchEvent(evt);
- });
- t.done();
- done();
- },0);
- };
+ blue.dispatchEvent(evt);
+ });
+ t.done();
+ done();
+ },0);
+ };
};
- </script>
- </head>
- <body>
- <p>Drag the orange square over the blue square then the fuchsia square, then release it.</p>
- <blockquote draggable="true"></blockquote>
- <blockquote></blockquote>
- <blockquote></blockquote>
- <div id="log"></div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <p>Drag the orange square over the blue square then the fuchsia square, then release it.</p>
+ <blockquote draggable="true"></blockquote>
+ <blockquote></blockquote>
+ <blockquote></blockquote>
+ <div id="log"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/001-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/001-manual.html
index f64e1c4e030..13c6864d8bd 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/001-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/001-manual.html
@@ -1,110 +1,110 @@
<!doctype html>
<html>
- <head>
- <title>allowTargetOrigin syntax</title>
- <style type="text/css">
+ <head>
+ <title>allowTargetOrigin syntax</title>
+ <style type="text/css">
blockquote { height: 100px; width: 100px; background: orange; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="/resources/testharness.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript">
setup(function () {},{explicit_done:true});
window.onload = function () {
- document.getElementsByTagName('blockquote')[0].ondragstart = function (e) {
- test(function() {
- assert_true( !!e.dataTransfer.allowTargetOrigin );
- }, 'allowTargetOrigin should be supported' );
- test(function() {
- assert_throws( new TypeError(), function () { e.dataTransfer.allowTargetOrigin(); } );
- }, 'no parameter should throw TypeError' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin(''); } );
- }, 'empty string should be an invalid URL' );
- test(function() {
- e.dataTransfer.allowTargetOrigin('*');
- }, '* should be a valid URL' );
- test(function() {
- e.dataTransfer.allowTargetOrigin('/');
- }, '/ should be a valid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('/foo'); } );
- }, '/foo should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('foo'); } );
- }, 'foo should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('//foo'); } );
- }, '//foo should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://'); } );
- }, 'http:// should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://*'); } );
- }, 'http://* should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://foo*'); } );
- }, 'http://foo* should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://foo.*'); } );
- }, 'http://foo.* should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://*.foo'); } );
- }, 'http://*.foo should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://foo:bar'); } );
- }, 'http://foo:bar should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://foo:bar@'); } );
- }, 'http://foo:bar@ should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('file:'); } );
- }, 'file: should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('file://'); } );
- }, 'file:// should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('data:'); } );
- }, 'data: should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('data:text/html'); } );
- }, 'data:text/html should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('file://localhost/'); } );
- }, 'file://localhost/ should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('file:///'); } );
- }, 'file:/// should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('data:text/html,'); } );
- }, 'data:text/html, should be an invalid URL' );
- test(function() {
- assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('javascript:'); } );
- }, 'javascript: should be an invalid URL' );
- test(function() {
- e.dataTransfer.allowTargetOrigin('http://foo');
- }, 'http://foo should be a valid URL' );
- test(function() {
- e.dataTransfer.allowTargetOrigin('http://foo.bar');
- }, 'http://foo.bar should be a valid URL' );
- test(function() {
- e.dataTransfer.allowTargetOrigin('http://foo/bar');
- }, 'http://foo/bar should be a valid URL' );
- test(function() {
- e.dataTransfer.allowTargetOrigin('http://foo:123');
- }, 'http://foo:123 should be a valid URL' );
- test(function() {
- e.dataTransfer.allowTargetOrigin('http://foo:bar@baz');
- }, 'http://foo:bar@baz should be a valid URL' );
- test(function() {
- e.dataTransfer.allowTargetOrigin('http://foo:bar@baz:123/qux');
- }, 'http://foo:bar@baz:123/qux should be a valid URL' );
- done();
- };
+ document.getElementsByTagName('blockquote')[0].ondragstart = function (e) {
+ test(function() {
+ assert_true( !!e.dataTransfer.allowTargetOrigin );
+ }, 'allowTargetOrigin should be supported' );
+ test(function() {
+ assert_throws( new TypeError(), function () { e.dataTransfer.allowTargetOrigin(); } );
+ }, 'no parameter should throw TypeError' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin(''); } );
+ }, 'empty string should be an invalid URL' );
+ test(function() {
+ e.dataTransfer.allowTargetOrigin('*');
+ }, '* should be a valid URL' );
+ test(function() {
+ e.dataTransfer.allowTargetOrigin('/');
+ }, '/ should be a valid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('/foo'); } );
+ }, '/foo should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('foo'); } );
+ }, 'foo should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('//foo'); } );
+ }, '//foo should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://'); } );
+ }, 'http:// should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://*'); } );
+ }, 'http://* should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://foo*'); } );
+ }, 'http://foo* should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://foo.*'); } );
+ }, 'http://foo.* should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://*.foo'); } );
+ }, 'http://*.foo should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://foo:bar'); } );
+ }, 'http://foo:bar should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('http://foo:bar@'); } );
+ }, 'http://foo:bar@ should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('file:'); } );
+ }, 'file: should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('file://'); } );
+ }, 'file:// should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('data:'); } );
+ }, 'data: should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('data:text/html'); } );
+ }, 'data:text/html should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('file://localhost/'); } );
+ }, 'file://localhost/ should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('file:///'); } );
+ }, 'file:/// should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('data:text/html,'); } );
+ }, 'data:text/html, should be an invalid URL' );
+ test(function() {
+ assert_throws( 'SYNTAX_ERR', function () { e.dataTransfer.allowTargetOrigin('javascript:'); } );
+ }, 'javascript: should be an invalid URL' );
+ test(function() {
+ e.dataTransfer.allowTargetOrigin('http://foo');
+ }, 'http://foo should be a valid URL' );
+ test(function() {
+ e.dataTransfer.allowTargetOrigin('http://foo.bar');
+ }, 'http://foo.bar should be a valid URL' );
+ test(function() {
+ e.dataTransfer.allowTargetOrigin('http://foo/bar');
+ }, 'http://foo/bar should be a valid URL' );
+ test(function() {
+ e.dataTransfer.allowTargetOrigin('http://foo:123');
+ }, 'http://foo:123 should be a valid URL' );
+ test(function() {
+ e.dataTransfer.allowTargetOrigin('http://foo:bar@baz');
+ }, 'http://foo:bar@baz should be a valid URL' );
+ test(function() {
+ e.dataTransfer.allowTargetOrigin('http://foo:bar@baz:123/qux');
+ }, 'http://foo:bar@baz:123/qux should be a valid URL' );
+ done();
+ };
};
- </script>
- </head>
- <body>
- <blockquote draggable="true"></blockquote>
- <div id="log">Drag the orange square above until the drag placeholder appears, then release it.</div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <blockquote draggable="true"></blockquote>
+ <div id="log">Drag the orange square above until the drag placeholder appears, then release it.</div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/002-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/002-manual.html
index db46c6797bb..c4e8acdd9c5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/002-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/002-manual.html
@@ -1,86 +1,86 @@
<!doctype html>
<html>
- <head>
- <title>allowTargetOrigin events</title>
- <style type="text/css">
+ <head>
+ <title>allowTargetOrigin events</title>
+ <style type="text/css">
blockquote { height: 100px; width: 100px; background: orange; margin: 0; padding: 0; float: left; }
blockquote + blockquote { background: blue; }
blockquote + blockquote + blockquote { background: fuchsia; }
blockquote + div { clear: left; }
- </style>
- <script type="text/javascript" src="/resources/testharness.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript">
setup(function () {},{explicit_done:true});
window.onload = function () {
- var orange = document.getElementsByTagName('blockquote')[0],
- blue = document.getElementsByTagName('blockquote')[1],
- fuchsia = document.getElementsByTagName('blockquote')[2],
- evtdone = {};
- orange.ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- test(function() {
- assert_true( !!e.dataTransfer.allowTargetOrigin );
- }, 'allowTargetOrigin should exist in '+e.type );
- test(function() {
- e.dataTransfer.allowTargetOrigin('*');
- }, 'allowTargetOrigin should work in '+e.type );
- };
- blue.ondragenter = blue.ondragover = function (e) {
- e.preventDefault();
- };
- orange.ondrag = blue.ondragleave = function (e) {
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- test(function() {
- assert_true( !!e.dataTransfer.allowTargetOrigin );
- }, 'allowTargetOrigin should exist in '+e.type );
- test(function() {
- assert_throws( 'SECURITY_ERR', function () { e.dataTransfer.allowTargetOrigin('*'); } );
- }, 'allowTargetOrigin should throw a SECURITY_ERR in '+e.type );
- };
- fuchsia.ondragenter = fuchsia.ondragover = fuchsia.ondrop = function (e) {
- e.preventDefault();
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- test(function() {
- assert_true( !!e.dataTransfer.allowTargetOrigin );
- }, 'allowTargetOrigin should exist in '+e.type );
- test(function() {
- assert_throws( 'SECURITY_ERR', function () { e.dataTransfer.allowTargetOrigin('*'); } );
- }, 'allowTargetOrigin should throw a SECURITY_ERR in '+e.type );
- };
- orange.ondragend = function (e) {
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- test(function() {
- assert_true( !!e.dataTransfer.allowTargetOrigin );
- }, 'allowTargetOrigin should exist in '+e.type );
- test(function() {
- assert_throws( 'SECURITY_ERR', function () { e.dataTransfer.allowTargetOrigin('*'); } );
- }, 'allowTargetOrigin should throw a SECURITY_ERR in '+e.type );
- test(function() {
- var failtxt = '- Reload and try again';
- assert_true( evtdone.dragstart, 'dragstart event was not tested'+failtxt );
- assert_true( evtdone.drag, 'drag event was not tested'+failtxt );
- assert_true( evtdone.dragenter, 'dragenter event was not tested'+failtxt );
- assert_true( evtdone.dragleave, 'dragleave event was not tested'+failtxt );
- assert_true( evtdone.dragover, 'dragover event was not tested'+failtxt );
- assert_true( evtdone.drop, 'drop event was not tested'+failtxt );
- assert_true( evtdone.dragend, 'dragend event was not tested'+failtxt );
- }, 'all event types must now have been tested' );
- done();
- };
+ var orange = document.getElementsByTagName('blockquote')[0],
+ blue = document.getElementsByTagName('blockquote')[1],
+ fuchsia = document.getElementsByTagName('blockquote')[2],
+ evtdone = {};
+ orange.ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ test(function() {
+ assert_true( !!e.dataTransfer.allowTargetOrigin );
+ }, 'allowTargetOrigin should exist in '+e.type );
+ test(function() {
+ e.dataTransfer.allowTargetOrigin('*');
+ }, 'allowTargetOrigin should work in '+e.type );
+ };
+ blue.ondragenter = blue.ondragover = function (e) {
+ e.preventDefault();
+ };
+ orange.ondrag = blue.ondragleave = function (e) {
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ test(function() {
+ assert_true( !!e.dataTransfer.allowTargetOrigin );
+ }, 'allowTargetOrigin should exist in '+e.type );
+ test(function() {
+ assert_throws( 'SECURITY_ERR', function () { e.dataTransfer.allowTargetOrigin('*'); } );
+ }, 'allowTargetOrigin should throw a SECURITY_ERR in '+e.type );
+ };
+ fuchsia.ondragenter = fuchsia.ondragover = fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ test(function() {
+ assert_true( !!e.dataTransfer.allowTargetOrigin );
+ }, 'allowTargetOrigin should exist in '+e.type );
+ test(function() {
+ assert_throws( 'SECURITY_ERR', function () { e.dataTransfer.allowTargetOrigin('*'); } );
+ }, 'allowTargetOrigin should throw a SECURITY_ERR in '+e.type );
+ };
+ orange.ondragend = function (e) {
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ test(function() {
+ assert_true( !!e.dataTransfer.allowTargetOrigin );
+ }, 'allowTargetOrigin should exist in '+e.type );
+ test(function() {
+ assert_throws( 'SECURITY_ERR', function () { e.dataTransfer.allowTargetOrigin('*'); } );
+ }, 'allowTargetOrigin should throw a SECURITY_ERR in '+e.type );
+ test(function() {
+ var failtxt = '- Reload and try again';
+ assert_true( evtdone.dragstart, 'dragstart event was not tested'+failtxt );
+ assert_true( evtdone.drag, 'drag event was not tested'+failtxt );
+ assert_true( evtdone.dragenter, 'dragenter event was not tested'+failtxt );
+ assert_true( evtdone.dragleave, 'dragleave event was not tested'+failtxt );
+ assert_true( evtdone.dragover, 'dragover event was not tested'+failtxt );
+ assert_true( evtdone.drop, 'drop event was not tested'+failtxt );
+ assert_true( evtdone.dragend, 'dragend event was not tested'+failtxt );
+ }, 'all event types must now have been tested' );
+ done();
+ };
};
- </script>
- </head>
- <body>
- <blockquote draggable="true"></blockquote>
- <blockquote></blockquote>
- <blockquote></blockquote>
- <div id="log">Drag the orange square over the blue square then the fuchsia square, then release it.</div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <blockquote draggable="true"></blockquote>
+ <blockquote></blockquote>
+ <blockquote></blockquote>
+ <div id="log">Drag the orange square over the blue square then the fuchsia square, then release it.</div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/003-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/003-manual.html
index 5e0adbdd87b..febc2b0da6c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/003-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/003-manual.html
@@ -1,95 +1,95 @@
<!doctype html>
<html>
- <head>
- <title>allowTargetOrigin valid syntax</title>
- <style type="text/css">
+ <head>
+ <title>allowTargetOrigin valid syntax</title>
+ <style type="text/css">
div { float: left; height: 100px; width: 100px; margin-right: 10px; background: orange; }
iframe { height: 100px; width: 100px; border: none; }
.note { float: right; color: silver; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
function addNote(el,str) {
- var par = document.createElement(el);
- par.textContent = str;
- document.body.appendChild(par);
+ var par = document.createElement(el);
+ par.textContent = str;
+ document.body.appendChild(par);
}
function testFrame(text,frameorigin,framepath) {
- var persist = arguments;
- addNote('p',(done++)+'. '+text);
- var div = document.createElement('div');
- var frame = document.createElement('iframe');
- frame.src = frameorigin+framepath;
- div.draggable = true;
- div.ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- for( var i = 3; i < persist.length; i++ ) {
- e.dataTransfer.allowTargetOrigin(persist[i]);
- }
- };
- var par = document.createElement('p');
- par.className = 'note';
- par.appendChild(document.createTextNode('Target: '+frameorigin));
- par.appendChild(document.createElement('br'));
- par.appendChild(document.createTextNode('Allowing: '+([]).slice.call(persist,3).join(' and ')));
- if( framepath.match(/\?domain\b/) ) {
- par.appendChild(document.createElement('br'));
- par.appendChild(document.createTextNode('document.domain set to parent domain'));
- }
- document.body.appendChild(par);
- document.body.appendChild(div);
- document.body.appendChild(frame);
+ var persist = arguments;
+ addNote('p',(done++)+'. '+text);
+ var div = document.createElement('div');
+ var frame = document.createElement('iframe');
+ frame.src = frameorigin+framepath;
+ div.draggable = true;
+ div.ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ for( var i = 3; i < persist.length; i++ ) {
+ e.dataTransfer.allowTargetOrigin(persist[i]);
+ }
+ };
+ var par = document.createElement('p');
+ par.className = 'note';
+ par.appendChild(document.createTextNode('Target: '+frameorigin));
+ par.appendChild(document.createElement('br'));
+ par.appendChild(document.createTextNode('Allowing: '+([]).slice.call(persist,3).join(' and ')));
+ if( framepath.match(/\?domain\b/) ) {
+ par.appendChild(document.createElement('br'));
+ par.appendChild(document.createTextNode('document.domain set to parent domain'));
+ }
+ document.body.appendChild(par);
+ document.body.appendChild(div);
+ document.body.appendChild(frame);
}
var done = 1;
window.onload = function () {
- var allowText = 'Drag the orange box below over the blue box the right, and release it. Fail if nothing happens in the blue box.';
- var blockText = 'Drag the orange box below over the pink box the right, and release it. Pass if nothing happens in the pink box.';
- var allowHelper = location.pathname.replace(/[^\/]*$/,'HELPER-mustallow.html');
- var blockHelper = location.pathname.replace(/[^\/]*$/,'HELPER-mustblock.html');
- if( location.hostname != httpHostMain || location.host != httpHostMain ) {
- addNote('p','This test must be loaded over http:\/\/'+httpHostMain+'\/');
- } else {
- /* 01 */ testFrame(allowText,'http://'+httpHostMain,allowHelper);
- /* 02 */ testFrame(allowText,'http://'+httpHostAlias,allowHelper);
- /* 03 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'*');
- /* 04 */ testFrame(allowText,'http://'+httpHostAlias,allowHelper,'*');
- /* 05 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'/');
- /* 06 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'/');
- /* 07 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostMain);
- /* 08 */ testFrame(blockText,'http://'+httpHostMain+':'+httpPortAlias,blockHelper,'http://'+httpHostMain);
- /* 09 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'http://'+httpHostMain);
- /* 10 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'http://'+httpHostMain);
- /* 11 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostMain+':80');
- /* 12 */ testFrame(blockText,'http://'+httpHostMain+':'+httpPortAlias,blockHelper,'http://'+httpHostMain+':80');
- /* 13 */ testFrame(allowText,'http://'+httpHostMain+':'+httpPortAlias,allowHelper,'http://'+httpHostMain+':'+httpPortAlias);
- /* 14 */ testFrame(blockText,'http://'+httpHostMain,blockHelper,'http://'+httpHostMain+':'+httpPortAlias);
- /* 15 */ testFrame(blockText,'https://'+httpsHostAlias,blockHelper,'http://'+httpsHostAlias);
- /* 16 */ testFrame(allowText,'https://'+httpsHostAlias,allowHelper,'https://'+httpsHostAlias);
- /* 17 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://foo:bar@'+httpHostMain+'/baz');
- /* 18 */ testFrame(allowText,'http://foo:bar@'+httpHostMain,allowHelper,'http://'+httpHostMain);
- /* 19 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostAlias,'/');
- /* 20 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'/','http://'+httpHostAlias);
- /* 21 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostAlias,'*');
- /* 22 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostAlias,'http://'+httpHostMain);
- /* 23 */ testFrame(allowText,'http://'+httpHostAlias,allowHelper,'http://'+httpHostAlias,'http://'+httpHostMain);
- /* 24 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'http://dummy','http://'+httpHostMain);
- /* 25 */ testFrame(blockText,'https://'+httpsHostAlias,blockHelper,'https://'+httpsHostAlias+':'+httpsPortAlias);
- /* 26 */ testFrame(blockText,'https://'+httpsHostAlias+':'+httpsPortAlias,blockHelper,'https://'+httpsHostAlias);
- /* 27 */ testFrame(allowText,'https://'+httpsHostAlias+':'+httpsPortAlias,allowHelper,'https://'+httpsHostAlias+':'+httpsPortAlias);
- window.xhr = new XMLHttpRequest();
- xhr.open('GET',allowHelper,false);
- xhr.send(null);
- /* 28 */ testFrame(allowText,'data:text/html,',escape(xhr.responseText),'http://'+httpHostMain);
- /* 29 */ testFrame(allowText,'javascript:','parent.xhr.responseText','http://'+httpHostMain);
- /* 30 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'http://'+httpHostAlias.replace(/^[^.]+\./,''));
- /* 31 */ testFrame(allowText,'http://'+httpHostAlias,allowHelper+'?domain','http://'+httpHostAlias);
- /* 32 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper+'?domain','http://'+httpHostAlias.replace(/^[^.]+\./,''));
- }
+ var allowText = 'Drag the orange box below over the blue box the right, and release it. Fail if nothing happens in the blue box.';
+ var blockText = 'Drag the orange box below over the pink box the right, and release it. Pass if nothing happens in the pink box.';
+ var allowHelper = location.pathname.replace(/[^\/]*$/,'HELPER-mustallow.html');
+ var blockHelper = location.pathname.replace(/[^\/]*$/,'HELPER-mustblock.html');
+ if( location.hostname != httpHostMain || location.host != httpHostMain ) {
+ addNote('p','This test must be loaded over http:\/\/'+httpHostMain+'\/');
+ } else {
+ /* 01 */ testFrame(allowText,'http://'+httpHostMain,allowHelper);
+ /* 02 */ testFrame(allowText,'http://'+httpHostAlias,allowHelper);
+ /* 03 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'*');
+ /* 04 */ testFrame(allowText,'http://'+httpHostAlias,allowHelper,'*');
+ /* 05 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'/');
+ /* 06 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'/');
+ /* 07 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostMain);
+ /* 08 */ testFrame(blockText,'http://'+httpHostMain+':'+httpPortAlias,blockHelper,'http://'+httpHostMain);
+ /* 09 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'http://'+httpHostMain);
+ /* 10 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'http://'+httpHostMain);
+ /* 11 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostMain+':80');
+ /* 12 */ testFrame(blockText,'http://'+httpHostMain+':'+httpPortAlias,blockHelper,'http://'+httpHostMain+':80');
+ /* 13 */ testFrame(allowText,'http://'+httpHostMain+':'+httpPortAlias,allowHelper,'http://'+httpHostMain+':'+httpPortAlias);
+ /* 14 */ testFrame(blockText,'http://'+httpHostMain,blockHelper,'http://'+httpHostMain+':'+httpPortAlias);
+ /* 15 */ testFrame(blockText,'https://'+httpsHostAlias,blockHelper,'http://'+httpsHostAlias);
+ /* 16 */ testFrame(allowText,'https://'+httpsHostAlias,allowHelper,'https://'+httpsHostAlias);
+ /* 17 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://foo:bar@'+httpHostMain+'/baz');
+ /* 18 */ testFrame(allowText,'http://foo:bar@'+httpHostMain,allowHelper,'http://'+httpHostMain);
+ /* 19 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostAlias,'/');
+ /* 20 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'/','http://'+httpHostAlias);
+ /* 21 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostAlias,'*');
+ /* 22 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostAlias,'http://'+httpHostMain);
+ /* 23 */ testFrame(allowText,'http://'+httpHostAlias,allowHelper,'http://'+httpHostAlias,'http://'+httpHostMain);
+ /* 24 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'http://dummy','http://'+httpHostMain);
+ /* 25 */ testFrame(blockText,'https://'+httpsHostAlias,blockHelper,'https://'+httpsHostAlias+':'+httpsPortAlias);
+ /* 26 */ testFrame(blockText,'https://'+httpsHostAlias+':'+httpsPortAlias,blockHelper,'https://'+httpsHostAlias);
+ /* 27 */ testFrame(allowText,'https://'+httpsHostAlias+':'+httpsPortAlias,allowHelper,'https://'+httpsHostAlias+':'+httpsPortAlias);
+ window.xhr = new XMLHttpRequest();
+ xhr.open('GET',allowHelper,false);
+ xhr.send(null);
+ /* 28 */ testFrame(allowText,'data:text/html,',escape(xhr.responseText),'http://'+httpHostMain);
+ /* 29 */ testFrame(allowText,'javascript:','parent.xhr.responseText','http://'+httpHostMain);
+ /* 30 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'http://'+httpHostAlias.replace(/^[^.]+\./,''));
+ /* 31 */ testFrame(allowText,'http://'+httpHostAlias,allowHelper+'?domain','http://'+httpHostAlias);
+ /* 32 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper+'?domain','http://'+httpHostAlias.replace(/^[^.]+\./,''));
+ }
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/004-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/004-1.html
index f8a4e8e5562..94e43087434 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/004-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/004-1.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>Data URI does not match absolute HTTP URL</title>
- <style type="text/css">
+ <head>
+ <title>Data URI does not match absolute HTTP URL</title>
+ <style type="text/css">
html, body { margin: 0; padding: 0; }
div { height: 100px; width: 100px; background: orange; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- e.dataTransfer.allowTargetOrigin('http://'+httpHostMain);
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ e.dataTransfer.allowTargetOrigin('http://'+httpHostMain);
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/004-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/004-manual.html
index 2a3d3bbe4b2..a540e77b39f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/004-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/004-manual.html
@@ -1,36 +1,36 @@
<!doctype html>
<html>
- <head>
- <title>Data URI does not match absolute HTTP URL</title>
- </head>
- <body>
- <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <head>
+ <title>Data URI does not match absolute HTTP URL</title>
+ </head>
+ <body>
+ <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- <script type="text/javascript">
+ <script type="text/javascript">
document.write('data:text/html,'+escape(
'<!doctype html>\
<html>\
- <head>\
- <title>Data URI does not match absolute HTTP URL<\/title>\
- <style type="text/css">\
+ <head>\
+ <title>Data URI does not match absolute HTTP URL<\/title>\
+ <style type="text/css">\
iframe { border: none; height: 150px; width: 150px; }\
- <\/style>\
- <script type="text/javascript">\
+ <\/style>\
+ <script type="text/javascript">\
window.onload = function () {\
- document.body.ondragenter = document.body.ondragleave = document.body.ondragover = document.body.ondrop = function (e) {\
- e.preventDefault();\
- document.body.innerHTML = "FAIL";\
- };\
+ document.body.ondragenter = document.body.ondragleave = document.body.ondragover = document.body.ondrop = function (e) {\
+ e.preventDefault();\
+ document.body.innerHTML = "FAIL";\
+ };\
};\
- <\/script>\
- <\/head>\
- <body>\
- <p>Drag the orange square below over this text, and release it. Pass if this text does not change.<\/p>\
- <p><iframe src="'+location.href.replace(/\.html$/,'-1.html')+'"><\/iframe><\/p>\
- <\/body>\
+ <\/script>\
+ <\/head>\
+ <body>\
+ <p>Drag the orange square below over this text, and release it. Pass if this text does not change.<\/p>\
+ <p><iframe src="'+location.href.replace(/\.html$/,'-1.html')+'"><\/iframe><\/p>\
+ <\/body>\
<\/html>'));
- </script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/005-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/005-1.html
index 15f6a8c23cb..74156fcd7cc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/005-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/005-1.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>JavaScript URI does not match absolute HTTP URL</title>
- <style type="text/css">
+ <head>
+ <title>JavaScript URI does not match absolute HTTP URL</title>
+ <style type="text/css">
html, body { margin: 0; padding: 0; }
div { height: 100px; width: 100px; background: orange; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- e.dataTransfer.allowTargetOrigin('http://'+httpHostMain);
- };
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ e.dataTransfer.allowTargetOrigin('http://'+httpHostMain);
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div draggable="true"></div>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/005-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/005-manual.html
index 90a002cf0b4..54ceec889bc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/005-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/005-manual.html
@@ -1,36 +1,36 @@
<!doctype html>
<html>
- <head>
- <title>JavaScript URI does not match absolute HTTP URL</title>
- </head>
- <body>
- <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <head>
+ <title>JavaScript URI does not match absolute HTTP URL</title>
+ </head>
+ <body>
+ <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- <script type="text/javascript">
+ <script type="text/javascript">
document.write('javascript:unescape("'+escape(
'<!doctype html>\
<html>\
- <head>\
- <title>JavaScript does not match absolute HTTP URL<\/title>\
- <style type=\'text/css\'>\
+ <head>\
+ <title>JavaScript does not match absolute HTTP URL<\/title>\
+ <style type=\'text/css\'>\
iframe { border: none; height: 150px; width: 150px; }\
- <\/style>\
- <script type=\'text/javascript\'>\
+ <\/style>\
+ <script type=\'text/javascript\'>\
window.onload = function () {\
- document.body.ondragenter = document.body.ondragleave = document.body.ondragover = document.body.ondrop = function (e) {\
- e.preventDefault();\
- document.body.innerHTML = \'FAIL\';\
- };\
+ document.body.ondragenter = document.body.ondragleave = document.body.ondragover = document.body.ondrop = function (e) {\
+ e.preventDefault();\
+ document.body.innerHTML = \'FAIL\';\
+ };\
};\
- <\/script>\
- <\/head>\
- <body>\
- <p>Drag the orange square below over this text, and release it. Pass if this text does not change.<\/p>\
- <p><iframe src=\''+location.href.replace(/\.html$/,'-1.html')+'\'><\/iframe><\/p>\
- <\/body>\
+ <\/script>\
+ <\/head>\
+ <body>\
+ <p>Drag the orange square below over this text, and release it. Pass if this text does not change.<\/p>\
+ <p><iframe src=\''+location.href.replace(/\.html$/,'-1.html')+'\'><\/iframe><\/p>\
+ <\/body>\
<\/html>')+'")');
- </script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/006-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/006-manual.html
index e1674390c0d..f60430b4c0b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/006-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/006-manual.html
@@ -1,52 +1,52 @@
<!doctype html>
<html>
- <head>
- <title>Data URI does not match /</title>
- </head>
- <body>
- <!--
+ <head>
+ <title>Data URI does not match /</title>
+ </head>
+ <body>
+ <!--
/ sets an absolute URL pointing to the document's unique identifier - used as the script origin.
The script origin will in fact be inherited from the parent page, which is actually the same data URI.
That part works.
However, when it comes to matching against it, it will not match, as the global identifier does not
match because the origin does not match the scheme/host/port tuple required.
- -->
- <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ -->
+ <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- <script type="text/javascript">
+ <script type="text/javascript">
document.write('data:text/html,'+escape(
'<!doctype html>\
<html>\
- <head>\
- <title>Data URI does not match /<\/title>\
- <style type="text/css">\
+ <head>\
+ <title>Data URI does not match /<\/title>\
+ <style type="text/css">\
html, body { margin: 0; padding: 0; }\
div { height: 100px; width: 100px; background: orange; }\
iframe { border: none; height: 150px; width: 150px; }\
- <\/style>\
- <\/head>\
- <body>\
- <script type="text/javascript">\
+ <\/style>\
+ <\/head>\
+ <body>\
+ <script type="text/javascript">\
if( self == top ) {\
- document.body.ondragenter = document.body.ondragleave = document.body.ondragover = document.body.ondrop = function (e) {\
- e.preventDefault();\
- document.body.innerHTML = "FAIL";\
- };\
- document.write("<p>Drag the orange square below over this text, and release it. Pass if this text does not change.<\\\/p>");\
- document.write("<p><iframe src=\\""+location.href+"\\"><\\\/iframe><\\\/p>");\
+ document.body.ondragenter = document.body.ondragleave = document.body.ondragover = document.body.ondrop = function (e) {\
+ e.preventDefault();\
+ document.body.innerHTML = "FAIL";\
+ };\
+ document.write("<p>Drag the orange square below over this text, and release it. Pass if this text does not change.<\\\/p>");\
+ document.write("<p><iframe src=\\""+location.href+"\\"><\\\/iframe><\\\/p>");\
} else {\
- document.write("<div draggable=\\"true\\"><\\\/div>");\
- document.getElementsByTagName("div")[0].ondragstart = function (e) {\
- e.dataTransfer.effectAllowed = "copy";\
- e.dataTransfer.setData("text","dummy text");\
- e.dataTransfer.allowTargetOrigin("/");\
- };\
+ document.write("<div draggable=\\"true\\"><\\\/div>");\
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {\
+ e.dataTransfer.effectAllowed = "copy";\
+ e.dataTransfer.setData("text","dummy text");\
+ e.dataTransfer.allowTargetOrigin("/");\
+ };\
}\
- <\/script>\
- <\/body>\
+ <\/script>\
+ <\/body>\
<\/html>'));
- </script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/007-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/007-manual.html
index 4f35ed17e31..d3b45100b60 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/007-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/007-manual.html
@@ -1,52 +1,52 @@
<!doctype html>
<html>
- <head>
- <title>Data URI does not match its own URL</title>
- </head>
- <body>
- <!--
+ <head>
+ <title>Data URI does not match its own URL</title>
+ </head>
+ <body>
+ <!--
Sets an absolute URL pointing to the data URI.
The script origin will in fact be inherited from the parent page, which is actually the same data URI.
That part works.
However, when it comes to matching against it, it will not match, as the global identifier used as the
script origin does not match because the origin does not match the scheme/host/port tuple required.
- -->
- <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ -->
+ <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- <script type="text/javascript">
+ <script type="text/javascript">
document.write('data:text/html,'+escape(
'<!doctype html>\
<html>\
- <head>\
- <title>Data URI does not match its own URL<\/title>\
- <style type="text/css">\
+ <head>\
+ <title>Data URI does not match its own URL<\/title>\
+ <style type="text/css">\
html, body { margin: 0; padding: 0; }\
div { height: 100px; width: 100px; background: orange; }\
iframe { border: none; height: 150px; width: 150px; }\
- <\/style>\
- <\/head>\
- <body>\
- <script type="text/javascript">\
+ <\/style>\
+ <\/head>\
+ <body>\
+ <script type="text/javascript">\
if( self == top ) {\
- document.body.ondragenter = document.body.ondragleave = document.body.ondragover = document.body.ondrop = function (e) {\
- e.preventDefault();\
- document.body.innerHTML = "FAIL";\
- };\
- document.write("<p>Drag the orange square below over this text, and release it. Pass if this text does not change.<\\\/p>");\
- document.write("<p><iframe src=\\""+location.href+"\\"><\\\/iframe><\\\/p>");\
+ document.body.ondragenter = document.body.ondragleave = document.body.ondragover = document.body.ondrop = function (e) {\
+ e.preventDefault();\
+ document.body.innerHTML = "FAIL";\
+ };\
+ document.write("<p>Drag the orange square below over this text, and release it. Pass if this text does not change.<\\\/p>");\
+ document.write("<p><iframe src=\\""+location.href+"\\"><\\\/iframe><\\\/p>");\
} else {\
- document.write("<div draggable=\\"true\\"><\\\/div>");\
- document.getElementsByTagName("div")[0].ondragstart = function (e) {\
- e.dataTransfer.effectAllowed = "copy";\
- e.dataTransfer.setData("text","dummy text");\
- e.dataTransfer.allowTargetOrigin(location.href);\
- };\
+ document.write("<div draggable=\\"true\\"><\\\/div>");\
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {\
+ e.dataTransfer.effectAllowed = "copy";\
+ e.dataTransfer.setData("text","dummy text");\
+ e.dataTransfer.allowTargetOrigin(location.href);\
+ };\
}\
- <\/script>\
- <\/body>\
+ <\/script>\
+ <\/body>\
<\/html>'));
- </script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/008-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/008-manual.html
index 71e915c9cde..f8a7daf0229 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/008-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/008-manual.html
@@ -1,53 +1,53 @@
<!doctype html>
<html>
- <head>
- <title>Data URI does match *</title>
- </head>
- <body>
- <!--
+ <head>
+ <title>Data URI does match *</title>
+ </head>
+ <body>
+ <!--
* allows any URL at all, so it should work
- -->
- <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ -->
+ <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- <script type="text/javascript">
+ <script type="text/javascript">
document.write('data:text/html,'+escape(
'<!doctype html>\
<html>\
- <head>\
- <title>Data URI does match *<\/title>\
- <style type="text/css">\
+ <head>\
+ <title>Data URI does match *<\/title>\
+ <style type="text/css">\
html, body { margin: 0; padding: 0; }\
div { height: 100px; width: 100px; background: orange; }\
iframe { border: none; height: 150px; width: 150px; }\
- <\/style>\
- <\/head>\
- <body>\
- <script type="text/javascript">\
+ <\/style>\
+ <\/head>\
+ <body>\
+ <script type="text/javascript">\
var seentypes = {};\
if( self == top ) {\
- document.body.ondragenter = document.body.ondragover = document.body.ondrop = function (e) {\
- e.preventDefault();\
- if( e.type == "drop" ) {\
- document.body.innerHTML = ( seentypes.dragenter && seentypes.dragover ) ? "PASS" : "FAIL";\
- } else {\
- seentypes[e.type] = true;\
- }\
- };\
- document.write("<p>Drag the orange square below over this text, and release it. Fail if this text does not change.<\\\/p>");\
- document.write("<p><iframe src=\\""+location.href+"\\"><\\\/iframe><\\\/p>");\
+ document.body.ondragenter = document.body.ondragover = document.body.ondrop = function (e) {\
+ e.preventDefault();\
+ if( e.type == "drop" ) {\
+ document.body.innerHTML = ( seentypes.dragenter && seentypes.dragover ) ? "PASS" : "FAIL";\
+ } else {\
+ seentypes[e.type] = true;\
+ }\
+ };\
+ document.write("<p>Drag the orange square below over this text, and release it. Fail if this text does not change.<\\\/p>");\
+ document.write("<p><iframe src=\\""+location.href+"\\"><\\\/iframe><\\\/p>");\
} else {\
- document.write("<div draggable=\\"true\\"><\\\/div>");\
- document.getElementsByTagName("div")[0].ondragstart = function (e) {\
- e.dataTransfer.effectAllowed = "copy";\
- e.dataTransfer.setData("text","dummy text");\
- e.dataTransfer.allowTargetOrigin("*");\
- };\
+ document.write("<div draggable=\\"true\\"><\\\/div>");\
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {\
+ e.dataTransfer.effectAllowed = "copy";\
+ e.dataTransfer.setData("text","dummy text");\
+ e.dataTransfer.allowTargetOrigin("*");\
+ };\
}\
- <\/script>\
- <\/body>\
+ <\/script>\
+ <\/body>\
<\/html>'));
- </script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/009-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/009-manual.html
index 2fc7ef43ed2..181ca851214 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/009-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/009-manual.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>* should not prevent dropping on external applications</title>
- <style type="text/css">
+ <head>
+ <title>* should not prevent dropping on external applications</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName("div")[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = "copy";
- e.dataTransfer.setData("text","PASS");
- e.dataTransfer.allowTargetOrigin("*");
- };
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = "copy";
+ e.dataTransfer.setData("text","PASS");
+ e.dataTransfer.allowTargetOrigin("*");
+ };
};
- </script>
- </head>
- <body>
- <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
- <p>This testcase requires an external application that accepts dropping of text from other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
- <p>Drag the orange block to the other application and release it. Pass if the word &quot;PASS&quot; appears in the other application.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <div draggable="true"></div>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
+ <p>This testcase requires an external application that accepts dropping of text from other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
+ <p>Drag the orange block to the other application and release it. Pass if the word &quot;PASS&quot; appears in the other application.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/010-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/010-manual.html
index 74a20d7e0e9..4fd893f0526 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/010-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/010-manual.html
@@ -1,25 +1,25 @@
<!doctype html>
<html>
- <head>
- <title>A URL should prevent dropping on external applications</title>
- <style type="text/css">
+ <head>
+ <title>A URL should prevent dropping on external applications</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName("div")[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = "copy";
- e.dataTransfer.setData("text","FAIL");
- e.dataTransfer.allowTargetOrigin("http://foo");
- };
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = "copy";
+ e.dataTransfer.setData("text","FAIL");
+ e.dataTransfer.allowTargetOrigin("http://foo");
+ };
};
- </script>
- </head>
- <body>
- <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
- <p>This testcase requires an external application that accepts dropping of text from other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
- <p>Drag the orange block to the other application and release it. Fail if the word &quot;FAIL&quot; appears in the other application.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <div draggable="true"></div>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <p>This test is only relevant on platforms where it is possible to switch applications in mid-drag (eg. alt+tab, dragging over taskbar buttons, dragging between restored windows).</p>
+ <p>This testcase requires an external application that accepts dropping of text from other applications - eg. Wordpad (write.exe) on Windows. Ensure that the external application is open.</p>
+ <p>Drag the orange block to the other application and release it. Fail if the word &quot;FAIL&quot; appears in the other application.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/011-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/011-manual.html
index e0302712e52..d68e03ad49b 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/011-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/011-manual.html
@@ -1,63 +1,63 @@
<!doctype html>
<html>
- <head>
- <title>allowTargetOrigin should only block dragenter, dragover, dragleave and drop events</title>
- <style type="text/css">
+ <head>
+ <title>allowTargetOrigin should only block dragenter, dragover, dragleave and drop events</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; margin: 0; padding: 0; float: left; }
div + div { background: blue; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], evtdone = {}, fails = [];
- orange.ondragstart = function (e) {
- evtdone[e.type] = true;
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- try {
- e.dataTransfer.allowTargetOrigin('http://example.com');
- } catch(e) {
- fails[fails.length] = 'allowTargetOrigin threw an error: '+e;
- }
- };
- orange.ondragenter = orange.ondragover = orange.ondrop = function (e) {
- e.preventDefault();
- evtdone[e.type] = true;
- };
- orange.ondrag = orange.ondragleave = function (e) {
- evtdone[e.type] = true;
- };
- orange.ondragend = function (e) {
- evtdone[e.type] = true;
- if( !evtdone.dragstart ) {
- fails[fails.length] = 'dragstart did not fire - how did that happen?';
- }
- if( !evtdone.drag ) {
- fails[fails.length] = 'drag did not fire';
- }
- if( !evtdone.dragend ) {
- fails[fails.length] = 'dragend did not fire - OK, who broke the testcase?';
- }
- if( evtdone.dragenter ) {
- fails[fails.length] = 'dragenter fired';
- }
- if( evtdone.dragover ) {
- fails[fails.length] = 'dragover fired';
- }
- if( evtdone.dragleave ) {
- fails[fails.length] = 'dragleave fired';
- }
- if( evtdone.drop ) {
- fails[fails.length] = 'drop fired';
- }
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
- };
+ var orange = document.getElementsByTagName('div')[0], evtdone = {}, fails = [];
+ orange.ondragstart = function (e) {
+ evtdone[e.type] = true;
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ try {
+ e.dataTransfer.allowTargetOrigin('http://example.com');
+ } catch(e) {
+ fails[fails.length] = 'allowTargetOrigin threw an error: '+e;
+ }
+ };
+ orange.ondragenter = orange.ondragover = orange.ondrop = function (e) {
+ e.preventDefault();
+ evtdone[e.type] = true;
+ };
+ orange.ondrag = orange.ondragleave = function (e) {
+ evtdone[e.type] = true;
+ };
+ orange.ondragend = function (e) {
+ evtdone[e.type] = true;
+ if( !evtdone.dragstart ) {
+ fails[fails.length] = 'dragstart did not fire - how did that happen?';
+ }
+ if( !evtdone.drag ) {
+ fails[fails.length] = 'drag did not fire';
+ }
+ if( !evtdone.dragend ) {
+ fails[fails.length] = 'dragend did not fire - OK, who broke the testcase?';
+ }
+ if( evtdone.dragenter ) {
+ fails[fails.length] = 'dragenter fired';
+ }
+ if( evtdone.dragover ) {
+ fails[fails.length] = 'dragover fired';
+ }
+ if( evtdone.dragleave ) {
+ fails[fails.length] = 'dragleave fired';
+ }
+ if( evtdone.drop ) {
+ fails[fails.length] = 'drop fired';
+ }
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
+ };
};
- </script>
- </head>
- <body>
- <p>Drag the orange square over the blue square then back to the orange square, then release it. Fail if this text does not change.</p>
- <div draggable="true"></div>
- <div></div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <p>Drag the orange square over the blue square then back to the orange square, then release it. Fail if this text does not change.</p>
+ <div draggable="true"></div>
+ <div></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/012-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/012-manual.html
index 164e613edb9..997e8ef8018 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/012-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/012-manual.html
@@ -1,62 +1,62 @@
<!doctype html>
<html>
- <head>
- <title>allowTargetOrigin after leaving browser window</title>
- <style type="text/css">
+ <head>
+ <title>allowTargetOrigin after leaving browser window</title>
+ <style type="text/css">
div { float: left; height: 100px; width: 100px; margin-right: 10px; background: orange; }
iframe { height: 100px; width: 100px; border: none; }
.note { float: right; color: silver; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
function addNote(el,str) {
- var par = document.createElement(el);
- par.textContent = str;
- document.body.appendChild(par);
+ var par = document.createElement(el);
+ par.textContent = str;
+ document.body.appendChild(par);
}
function testFrame(text,frameorigin,framepath) {
- var persist = arguments;
- addNote('p',(done++)+'. '+text);
- var div = document.createElement('div');
- var frame = document.createElement('iframe');
- frame.src = frameorigin+framepath;
- div.draggable = true;
- div.ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- for( var i = 3; i < persist.length; i++ ) {
- e.dataTransfer.allowTargetOrigin(persist[i]);
- }
- };
- var par = document.createElement('p');
- par.className = 'note';
- par.appendChild(document.createTextNode('Target: '+frameorigin));
- par.appendChild(document.createElement('br'));
- par.appendChild(document.createTextNode('Allowing: '+([]).slice.call(persist,3).join(' and ')));
- if( framepath.match(/\?domain\b/) ) {
- par.appendChild(document.createElement('br'));
- par.appendChild(document.createTextNode('document.domain set to parent domain'));
- }
- document.body.appendChild(par);
- document.body.appendChild(div);
- document.body.appendChild(frame);
+ var persist = arguments;
+ addNote('p',(done++)+'. '+text);
+ var div = document.createElement('div');
+ var frame = document.createElement('iframe');
+ frame.src = frameorigin+framepath;
+ div.draggable = true;
+ div.ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ for( var i = 3; i < persist.length; i++ ) {
+ e.dataTransfer.allowTargetOrigin(persist[i]);
+ }
+ };
+ var par = document.createElement('p');
+ par.className = 'note';
+ par.appendChild(document.createTextNode('Target: '+frameorigin));
+ par.appendChild(document.createElement('br'));
+ par.appendChild(document.createTextNode('Allowing: '+([]).slice.call(persist,3).join(' and ')));
+ if( framepath.match(/\?domain\b/) ) {
+ par.appendChild(document.createElement('br'));
+ par.appendChild(document.createTextNode('document.domain set to parent domain'));
+ }
+ document.body.appendChild(par);
+ document.body.appendChild(div);
+ document.body.appendChild(frame);
}
var done = 1;
window.onload = function () {
- var allowText = 'Drag the orange box below outside the browser window (not onto the system taskbar) then back over the blue box the right, and release it. Fail if nothing happens in the blue box.';
- var blockText = 'Drag the orange box below outside the browser window (not onto the system taskbar) then back over the pink box the right, and release it. Pass if nothing happens in the pink box.';
- var allowHelper = location.pathname.replace(/[^\/]*$/,'HELPER-mustallow.html');
- var blockHelper = location.pathname.replace(/[^\/]*$/,'HELPER-mustblock.html');
- if( location.hostname != httpHostMain || location.host != httpHostMain ) {
- addNote('p','This test must be loaded over http:\/\/'+httpHostMain+'\/');
- } else {
- /* 07 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostMain);
- /* 09 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'http://'+httpHostMain);
- }
+ var allowText = 'Drag the orange box below outside the browser window (not onto the system taskbar) then back over the blue box the right, and release it. Fail if nothing happens in the blue box.';
+ var blockText = 'Drag the orange box below outside the browser window (not onto the system taskbar) then back over the pink box the right, and release it. Pass if nothing happens in the pink box.';
+ var allowHelper = location.pathname.replace(/[^\/]*$/,'HELPER-mustallow.html');
+ var blockHelper = location.pathname.replace(/[^\/]*$/,'HELPER-mustblock.html');
+ if( location.hostname != httpHostMain || location.host != httpHostMain ) {
+ addNote('p','This test must be loaded over http:\/\/'+httpHostMain+'\/');
+ } else {
+ /* 07 */ testFrame(allowText,'http://'+httpHostMain,allowHelper,'http://'+httpHostMain);
+ /* 09 */ testFrame(blockText,'http://'+httpHostAlias,blockHelper,'http://'+httpHostMain);
+ }
};
- </script>
- </head>
- <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </script>
+ </head>
+ <body>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/013-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/013-manual.html
index 39ee70cf579..92da7647da0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/013-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/013-manual.html
@@ -1,24 +1,24 @@
<!doctype html>
<html>
- <head>
- <title>A URL should prevent dropping on UI</title>
- <style type="text/css">
+ <head>
+ <title>A URL should prevent dropping on UI</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- document.getElementsByTagName("div")[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = "copy";
- e.dataTransfer.setData("text","FAIL");
- e.dataTransfer.allowTargetOrigin("http://foo");
- };
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = "copy";
+ e.dataTransfer.setData("text","FAIL");
+ e.dataTransfer.allowTargetOrigin("http://foo");
+ };
};
- </script>
- </head>
- <body>
- <p>This test is only relevant on platforms where it is possible to drop data onto the browser UI (eg. the address field).</p>
- <p>Drag the orange block to the address field and release it. Fail if the word &quot;FAIL&quot; appears in the address field. Repeat for other UI fields.</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <div draggable="true"></div>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <p>This test is only relevant on platforms where it is possible to drop data onto the browser UI (eg. the address field).</p>
+ <p>Drag the orange block to the address field and release it. Fail if the word &quot;FAIL&quot; appears in the address field. Repeat for other UI fields.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div draggable="true"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/101-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/101-manual.html
index 24ef0395744..e5bbd7fa3d2 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/101-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/101-manual.html
@@ -1,123 +1,123 @@
<!doctype html>
<html>
- <head>
- <title>.origin for all events</title>
- <style type="text/css">
+ <head>
+ <title>.origin for all events</title>
+ <style type="text/css">
blockquote { height: 100px; width: 100px; background: orange; margin: 0; padding: 0; float: left; }
blockquote + blockquote { background: blue; }
blockquote + blockquote + blockquote { background: fuchsia; }
blockquote + div { clear: left; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript" src="/resources/testharness.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript" src="/resources/testharness.js"></script>
+ <script type="text/javascript">
setup(function () {},{explicit_done:true});
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- done();
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var orange = document.getElementsByTagName('blockquote')[0],
- blue = document.getElementsByTagName('blockquote')[1],
- fuchsia = document.getElementsByTagName('blockquote')[2],
- evtdone = {};
- orange.ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- test(function() {
- assert_equals( e.dataTransfer.origin, origin );
- }, '.origin should exist in '+e.type );
- test(function () {
- //WebIDL and ECMAScript 5 - a readonly property has a getter but not a setter
- //ES5 makes [[Put]] fail but not throw
- var failed = false, oldorigin = e.dataTransfer.origin;
- try {
- e.dataTransfer.origin = 'http://example.com';
- } catch(e) {
- failed = e;
- }
- assert_equals(e.dataTransfer.origin,oldorigin);
- assert_false(failed,'an error was thrown');
- }, '.origin must be read-only in '+e.type);
- };
- blue.ondragenter = blue.ondragover = function (e) {
- e.preventDefault();
- };
- orange.ondrag = blue.ondragleave = function (e) {
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- test(function() {
- assert_equals( e.dataTransfer.origin, origin );
- }, '.origin should exist in '+e.type );
- test(function () {
- var failed = false, oldorigin = e.dataTransfer.origin;
- try {
- e.dataTransfer.origin = 'http://example.com';
- } catch(e) {
- failed = e;
- }
- assert_equals(e.dataTransfer.origin,oldorigin);
- assert_false(failed,'an error was thrown');
- }, '.origin must be read-only in '+e.type);
- };
- fuchsia.ondragenter = fuchsia.ondragover = fuchsia.ondrop = function (e) {
- e.preventDefault();
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- test(function() {
- assert_equals( e.dataTransfer.origin, origin );
- }, '.origin should exist in '+e.type );
- test(function () {
- var failed = false, oldorigin = e.dataTransfer.origin;
- try {
- e.dataTransfer.origin = 'http://example.com';
- } catch(e) {
- failed = e;
- }
- assert_equals(e.dataTransfer.origin,oldorigin);
- assert_false(failed,'an error was thrown');
- }, '.origin must be read-only in '+e.type);
- };
- orange.ondragend = function (e) {
- if( evtdone[e.type] ) { return; }
- evtdone[e.type] = true;
- test(function() {
- assert_equals( e.dataTransfer.origin, origin );
- }, '.origin should exist in '+e.type );
- test(function () {
- var failed = false, oldorigin = e.dataTransfer.origin;
- try {
- e.dataTransfer.origin = 'http://example.com';
- } catch(e) {
- failed = e;
- }
- assert_equals(e.dataTransfer.origin,oldorigin);
- assert_false(failed,'an error was thrown');
- }, '.origin must be read-only in '+e.type);
- test(function() {
- var failtxt = '- Reload and try again';
- assert_true( evtdone.dragstart, 'dragstart event was not tested'+failtxt );
- assert_true( evtdone.drag, 'drag event was not tested'+failtxt );
- assert_true( evtdone.dragenter, 'dragenter event was not tested'+failtxt );
- assert_true( evtdone.dragleave, 'dragleave event was not tested'+failtxt );
- assert_true( evtdone.dragover, 'dragover event was not tested'+failtxt );
- assert_true( evtdone.drop, 'drop event was not tested'+failtxt );
- assert_true( evtdone.dragend, 'dragend event was not tested'+failtxt );
- }, 'all event types must now have been tested' );
- done();
- };
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ done();
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var orange = document.getElementsByTagName('blockquote')[0],
+ blue = document.getElementsByTagName('blockquote')[1],
+ fuchsia = document.getElementsByTagName('blockquote')[2],
+ evtdone = {};
+ orange.ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ test(function() {
+ assert_equals( e.dataTransfer.origin, origin );
+ }, '.origin should exist in '+e.type );
+ test(function () {
+ //WebIDL and ECMAScript 5 - a readonly property has a getter but not a setter
+ //ES5 makes [[Put]] fail but not throw
+ var failed = false, oldorigin = e.dataTransfer.origin;
+ try {
+ e.dataTransfer.origin = 'http://example.com';
+ } catch(e) {
+ failed = e;
+ }
+ assert_equals(e.dataTransfer.origin,oldorigin);
+ assert_false(failed,'an error was thrown');
+ }, '.origin must be read-only in '+e.type);
+ };
+ blue.ondragenter = blue.ondragover = function (e) {
+ e.preventDefault();
+ };
+ orange.ondrag = blue.ondragleave = function (e) {
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ test(function() {
+ assert_equals( e.dataTransfer.origin, origin );
+ }, '.origin should exist in '+e.type );
+ test(function () {
+ var failed = false, oldorigin = e.dataTransfer.origin;
+ try {
+ e.dataTransfer.origin = 'http://example.com';
+ } catch(e) {
+ failed = e;
+ }
+ assert_equals(e.dataTransfer.origin,oldorigin);
+ assert_false(failed,'an error was thrown');
+ }, '.origin must be read-only in '+e.type);
+ };
+ fuchsia.ondragenter = fuchsia.ondragover = fuchsia.ondrop = function (e) {
+ e.preventDefault();
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ test(function() {
+ assert_equals( e.dataTransfer.origin, origin );
+ }, '.origin should exist in '+e.type );
+ test(function () {
+ var failed = false, oldorigin = e.dataTransfer.origin;
+ try {
+ e.dataTransfer.origin = 'http://example.com';
+ } catch(e) {
+ failed = e;
+ }
+ assert_equals(e.dataTransfer.origin,oldorigin);
+ assert_false(failed,'an error was thrown');
+ }, '.origin must be read-only in '+e.type);
+ };
+ orange.ondragend = function (e) {
+ if( evtdone[e.type] ) { return; }
+ evtdone[e.type] = true;
+ test(function() {
+ assert_equals( e.dataTransfer.origin, origin );
+ }, '.origin should exist in '+e.type );
+ test(function () {
+ var failed = false, oldorigin = e.dataTransfer.origin;
+ try {
+ e.dataTransfer.origin = 'http://example.com';
+ } catch(e) {
+ failed = e;
+ }
+ assert_equals(e.dataTransfer.origin,oldorigin);
+ assert_false(failed,'an error was thrown');
+ }, '.origin must be read-only in '+e.type);
+ test(function() {
+ var failtxt = '- Reload and try again';
+ assert_true( evtdone.dragstart, 'dragstart event was not tested'+failtxt );
+ assert_true( evtdone.drag, 'drag event was not tested'+failtxt );
+ assert_true( evtdone.dragenter, 'dragenter event was not tested'+failtxt );
+ assert_true( evtdone.dragleave, 'dragleave event was not tested'+failtxt );
+ assert_true( evtdone.dragover, 'dragover event was not tested'+failtxt );
+ assert_true( evtdone.drop, 'drop event was not tested'+failtxt );
+ assert_true( evtdone.dragend, 'dragend event was not tested'+failtxt );
+ }, 'all event types must now have been tested' );
+ done();
+ };
};
- </script>
- </head>
- <body>
- <blockquote draggable="true"></blockquote>
- <blockquote></blockquote>
- <blockquote></blockquote>
- <div id="log">Drag the orange square over the blue square then the fuchsia square, then release it.</div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </script>
+ </head>
+ <body>
+ <blockquote draggable="true"></blockquote>
+ <blockquote></blockquote>
+ <blockquote></blockquote>
+ <div id="log">Drag the orange square over the blue square then the fuchsia square, then release it.</div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/102-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/102-manual.html
index ebb3090ba33..7fc9d58f70f 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/102-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/102-manual.html
@@ -1,36 +1,36 @@
<!doctype html>
<html>
- <head>
- <title>Origin for http site to itself</title>
- <style type="text/css">
+ <head>
+ <title>Origin for http site to itself</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- var iframe = document.createElement('iframe');
- iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ var iframe = document.createElement('iframe');
+ iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/103-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/103-1.html
index 9904ceaa061..837135b3640 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/103-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/103-1.html
@@ -1,32 +1,32 @@
<!doctype html>
<html>
- <head>
- <title>Origin for http site with user/pass/port to itself</title>
- <style type="text/css">
+ <head>
+ <title>Origin for http site with user/pass/port to itself</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- var iframe = document.createElement('iframe');
- iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'http://'+httpHostMain;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ var iframe = document.createElement('iframe');
+ iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/103-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/103-manual.html
index 7bedf0958a3..945b22cd362 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/103-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/103-manual.html
@@ -1,27 +1,27 @@
<!doctype html>
<html>
- <head>
- <title>Origin for http site with user/pass/port to itself</title>
- <style type="text/css">
+ <head>
+ <title>Origin for http site with user/pass/port to itself</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var iframe = document.createElement('iframe');
- iframe.src = 'http://foo:bar@'+httpHostMain+':80'+location.pathname.replace(/.html$/,'-1.html');
- document.body.appendChild(iframe);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var iframe = document.createElement('iframe');
+ iframe.src = 'http://foo:bar@'+httpHostMain+':80'+location.pathname.replace(/.html$/,'-1.html');
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/104-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/104-1.html
index ada4a6f995c..6503b5f56be 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/104-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/104-1.html
@@ -1,32 +1,32 @@
<!doctype html>
<html>
- <head>
- <title>Origin for http site with non-default port to itself</title>
- <style type="text/css">
+ <head>
+ <title>Origin for http site with non-default port to itself</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain+':'+httpPortAlias;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- var iframe = document.createElement('iframe');
- iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'http://'+httpHostMain+':'+httpPortAlias;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ var iframe = document.createElement('iframe');
+ iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/104-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/104-manual.html
index 1262424624f..a881e5eda31 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/104-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/104-manual.html
@@ -1,27 +1,27 @@
<!doctype html>
<html>
- <head>
- <title>Origin for http site with non-default port to itself</title>
- <style type="text/css">
+ <head>
+ <title>Origin for http site with non-default port to itself</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var iframe = document.createElement('iframe');
- iframe.src = 'http://'+httpHostMain+':'+httpPortAlias+location.pathname.replace(/.html$/,'-1.html');
- document.body.appendChild(iframe);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var iframe = document.createElement('iframe');
+ iframe.src = 'http://'+httpHostMain+':'+httpPortAlias+location.pathname.replace(/.html$/,'-1.html');
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/105-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/105-1.html
index ccfe4f4c476..00bae5f16c5 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/105-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/105-1.html
@@ -1,32 +1,32 @@
<!doctype html>
<html>
- <head>
- <title>Origin for http site to site with non-default port</title>
- <style type="text/css">
+ <head>
+ <title>Origin for http site to site with non-default port</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- var iframe = document.createElement('iframe');
- iframe.src = origin+':'+httpPortAlias+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'http://'+httpHostMain;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ var iframe = document.createElement('iframe');
+ iframe.src = origin+':'+httpPortAlias+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/105-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/105-manual.html
index 4695888a6d3..39a44f542ac 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/105-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/105-manual.html
@@ -1,27 +1,27 @@
<!doctype html>
<html>
- <head>
- <title>Origin for http site to site with non-default port</title>
- <style type="text/css">
+ <head>
+ <title>Origin for http site to site with non-default port</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var iframe = document.createElement('iframe');
- iframe.src = 'http://'+httpHostMain+location.pathname.replace(/.html$/,'-1.html');
- document.body.appendChild(iframe);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var iframe = document.createElement('iframe');
+ iframe.src = 'http://'+httpHostMain+location.pathname.replace(/.html$/,'-1.html');
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/106-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/106-1.html
index d8ff88efc4f..e7f985c8ea7 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/106-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/106-1.html
@@ -1,32 +1,32 @@
<!doctype html>
<html>
- <head>
- <title>Origin for http site with non-default port to site</title>
- <style type="text/css">
+ <head>
+ <title>Origin for http site with non-default port to site</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain+':'+httpPortAlias;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- var iframe = document.createElement('iframe');
- iframe.src = 'http://'+httpHostMain+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'http://'+httpHostMain+':'+httpPortAlias;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ var iframe = document.createElement('iframe');
+ iframe.src = 'http://'+httpHostMain+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/106-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/106-manual.html
index 18017511beb..30db964c440 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/106-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/106-manual.html
@@ -1,27 +1,27 @@
<!doctype html>
<html>
- <head>
- <title>Origin for http site with non-default port to site</title>
- <style type="text/css">
+ <head>
+ <title>Origin for http site with non-default port to site</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var iframe = document.createElement('iframe');
- iframe.src = 'http://'+httpHostMain+':'+httpPortAlias+location.pathname.replace(/.html$/,'-1.html');
- document.body.appendChild(iframe);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var iframe = document.createElement('iframe');
+ iframe.src = 'http://'+httpHostMain+':'+httpPortAlias+location.pathname.replace(/.html$/,'-1.html');
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/107-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/107-1.html
index 2392b19eaa6..a3c82005195 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/107-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/107-1.html
@@ -1,32 +1,32 @@
<!doctype html>
<html>
- <head>
- <title>Origin for https site to itself</title>
- <style type="text/css">
+ <head>
+ <title>Origin for https site to itself</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'https://'+httpsHostAlias;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- var iframe = document.createElement('iframe');
- iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'https://'+httpsHostAlias;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ var iframe = document.createElement('iframe');
+ iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/107-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/107-manual.html
index ecd9e9b7b7d..136b61c4e54 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/107-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/107-manual.html
@@ -1,27 +1,27 @@
<!doctype html>
<html>
- <head>
- <title>Origin for https site to itself</title>
- <style type="text/css">
+ <head>
+ <title>Origin for https site to itself</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var iframe = document.createElement('iframe');
- iframe.src = 'https://'+httpsHostAlias+location.pathname.replace(/.html$/,'-1.html');
- document.body.appendChild(iframe);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var iframe = document.createElement('iframe');
+ iframe.src = 'https://'+httpsHostAlias+location.pathname.replace(/.html$/,'-1.html');
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/108-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/108-1.html
index b3027dbe248..4c11a7cd5d0 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/108-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/108-1.html
@@ -1,32 +1,32 @@
<!doctype html>
<html>
- <head>
- <title>Origin for https site with non-default port to itself</title>
- <style type="text/css">
+ <head>
+ <title>Origin for https site with non-default port to itself</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'https://'+httpsHostAlias+':'+httpsPortAlias;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- var iframe = document.createElement('iframe');
- iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'https://'+httpsHostAlias+':'+httpsPortAlias;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ var iframe = document.createElement('iframe');
+ iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/108-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/108-manual.html
index eb77db366a1..e73e592db1a 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/108-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/108-manual.html
@@ -1,27 +1,27 @@
<!doctype html>
<html>
- <head>
- <title>Origin for https site with non-default port to itself</title>
- <style type="text/css">
+ <head>
+ <title>Origin for https site with non-default port to itself</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var iframe = document.createElement('iframe');
- iframe.src = 'https://'+httpsHostAlias+':'+httpsPortAlias+location.pathname.replace(/.html$/,'-1.html');
- document.body.appendChild(iframe);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var iframe = document.createElement('iframe');
+ iframe.src = 'https://'+httpsHostAlias+':'+httpsPortAlias+location.pathname.replace(/.html$/,'-1.html');
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/109-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/109-1.html
index 6b4e1d80cf6..4ce1ad10b93 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/109-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/109-1.html
@@ -1,32 +1,32 @@
<!doctype html>
<html>
- <head>
- <title>Origin for https site to site with non-default port</title>
- <style type="text/css">
+ <head>
+ <title>Origin for https site to site with non-default port</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'https://'+httpsHostAlias;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- var iframe = document.createElement('iframe');
- iframe.src = origin+':'+httpsPortAlias+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'https://'+httpsHostAlias;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ var iframe = document.createElement('iframe');
+ iframe.src = origin+':'+httpsPortAlias+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/109-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/109-manual.html
index 7817a85509c..7919281dd20 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/109-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/109-manual.html
@@ -1,27 +1,27 @@
<!doctype html>
<html>
- <head>
- <title>Origin for https site to site with non-default port</title>
- <style type="text/css">
+ <head>
+ <title>Origin for https site to site with non-default port</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var iframe = document.createElement('iframe');
- iframe.src = 'https://'+httpsHostAlias+location.pathname.replace(/.html$/,'-1.html');
- document.body.appendChild(iframe);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var iframe = document.createElement('iframe');
+ iframe.src = 'https://'+httpsHostAlias+location.pathname.replace(/.html$/,'-1.html');
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/110-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/110-1.html
index ee584003a85..cd64c530f00 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/110-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/110-1.html
@@ -1,32 +1,32 @@
<!doctype html>
<html>
- <head>
- <title>Origin for https site with non-default port to site</title>
- <style type="text/css">
+ <head>
+ <title>Origin for https site with non-default port to site</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'https://'+httpsHostAlias+':'+httpsPortAlias;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- var iframe = document.createElement('iframe');
- iframe.src = 'https://'+httpsHostAlias+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'https://'+httpsHostAlias+':'+httpsPortAlias;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ var iframe = document.createElement('iframe');
+ iframe.src = 'https://'+httpsHostAlias+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/110-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/110-manual.html
index 663e162bd46..8b13ff12920 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/110-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/110-manual.html
@@ -1,27 +1,27 @@
<!doctype html>
<html>
- <head>
- <title>Origin for https site with non-default port to site</title>
- <style type="text/css">
+ <head>
+ <title>Origin for https site with non-default port to site</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var iframe = document.createElement('iframe');
- iframe.src = 'https://'+httpsHostAlias+':'+httpsPortAlias+location.pathname.replace(/.html$/,'-1.html');
- document.body.appendChild(iframe);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var iframe = document.createElement('iframe');
+ iframe.src = 'https://'+httpsHostAlias+':'+httpsPortAlias+location.pathname.replace(/.html$/,'-1.html');
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/111-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/111-manual.html
index c81efa01d06..57f2c9fbb30 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/111-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/111-manual.html
@@ -1,52 +1,52 @@
<!doctype html>
<html>
- <head>
- <title>Origin for file: to http:</title>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ <head>
+ <title>Origin for file: to http:</title>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var datastr =
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var datastr =
'<!doctype html>\
<html>\
- <head>\
- <title>Origin for file: to http:<\/title>\
- <style type="text/css">\
+ <head>\
+ <title>Origin for file: to http:<\/title>\
+ <style type="text/css">\
div { height: 100px; width: 100px; background: orange; }\
iframe { width: 500px; height: 120px; border: none; }\
- <\/style>\
- <script type="text/javascript">\
+ <\/style>\
+ <script type="text/javascript">\
window.onload = function () {\
- var origin = "null (string)";\
- document.getElementsByTagName("div")[0].ondragstart = function (e) {\
- e.dataTransfer.effectAllowed = "copy";\
- e.dataTransfer.setData("text","dummy text");\
- };\
- document.getElementsByTagName("span")[0].textContent = origin;\
- var iframe = document.createElement("iframe");\
- iframe.src = "'+location.href.replace(/[^\/]*$/,'HELPER-showorigin.html')+'";\
- document.body.insertBefore(iframe,document.getElementsByTagName("div")[0]);\
+ var origin = "null (string)";\
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {\
+ e.dataTransfer.effectAllowed = "copy";\
+ e.dataTransfer.setData("text","dummy text");\
+ };\
+ document.getElementsByTagName("span")[0].textContent = origin;\
+ var iframe = document.createElement("iframe");\
+ iframe.src = "'+location.href.replace(/[^\/]*$/,'HELPER-showorigin.html')+'";\
+ document.body.insertBefore(iframe,document.getElementsByTagName("div")[0]);\
};\
- <\/script>\
- <\/head>\
- <body>\
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>\
- <span><\/span><\/p>\
- <div draggable="true"></div>\
- <\/body>\
+ <\/script>\
+ <\/head>\
+ <body>\
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>\
+ <span><\/span><\/p>\
+ <div draggable="true"></div>\
+ <\/body>\
<\/html>';
- document.getElementsByTagName('a')[0].href = 'data:text/html,'+escape(datastr);
+ document.getElementsByTagName('a')[0].href = 'data:text/html,'+escape(datastr);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p><a href="">Download the linked file to your disk</a>, and open it locally. Follow further instructions in that file.</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p><a href="">Download the linked file to your disk</a>, and open it locally. Follow further instructions in that file.</p>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/112-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/112-manual.html
index 858e51d9c1c..c19638c9ba8 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/112-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/112-manual.html
@@ -1,56 +1,56 @@
<!doctype html>
<html>
- <head>
- <title>Origin for data: with inherited http origin to http:</title>
- <style type="text/css">
+ <head>
+ <title>Origin for data: with inherited http origin to http:</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var datastr =
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var datastr =
'<!doctype html>\
<html>\
- <head>\
- <title>Origin for data: with inherited http origin to http:<\/title>\
- <style type="text/css">\
+ <head>\
+ <title>Origin for data: with inherited http origin to http:<\/title>\
+ <style type="text/css">\
div { height: 100px; width: 100px; background: orange; }\
iframe { width: 500px; height: 120px; border: none; }\
- <\/style>\
- <script type="text/javascript">\
+ <\/style>\
+ <script type="text/javascript">\
window.onload = function () {\
- var origin = "http://'+httpHostMain+'";\
- document.getElementsByTagName("div")[0].ondragstart = function (e) {\
- e.dataTransfer.effectAllowed = "copy";\
- e.dataTransfer.setData("text","dummy text");\
- };\
- document.getElementsByTagName("span")[0].textContent = origin;\
- var iframe = document.createElement("iframe");\
- iframe.src = "'+location.href.replace(/[^\/]*$/,'HELPER-showorigin.html')+'";\
- document.body.insertBefore(iframe,document.getElementsByTagName("div")[0]);\
+ var origin = "http://'+httpHostMain+'";\
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {\
+ e.dataTransfer.effectAllowed = "copy";\
+ e.dataTransfer.setData("text","dummy text");\
+ };\
+ document.getElementsByTagName("span")[0].textContent = origin;\
+ var iframe = document.createElement("iframe");\
+ iframe.src = "'+location.href.replace(/[^\/]*$/,'HELPER-showorigin.html')+'";\
+ document.body.insertBefore(iframe,document.getElementsByTagName("div")[0]);\
};\
- <\/script>\
- <\/head>\
- <body>\
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>\
- <span><\/span><\/p>\
- <div draggable="true"></div>\
- <\/body>\
+ <\/script>\
+ <\/head>\
+ <body>\
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>\
+ <span><\/span><\/p>\
+ <div draggable="true"></div>\
+ <\/body>\
<\/html>';
- var iframe = document.createElement('iframe');
- iframe.src = 'data:text/html,'+escape(datastr);
- document.body.appendChild(iframe);
+ var iframe = document.createElement('iframe');
+ iframe.src = 'data:text/html,'+escape(datastr);
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/113-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/113-manual.html
index d3f889a9de3..aa4b2b1cd32 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/113-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/113-manual.html
@@ -1,50 +1,50 @@
<!doctype html>
<html>
- <head>
- <title>Origin for data: with no inherited origin to http:</title>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- </head>
- <body>
+ <head>
+ <title>Origin for data: with no inherited origin to http:</title>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ </head>
+ <body>
- <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- <script type="text/javascript">
+ <script type="text/javascript">
var origin = 'http://'+httpHostMain;
if( location.href.indexOf(origin+'/') ) {
- document.write('This must be tested on '+origin+'/');
+ document.write('This must be tested on '+origin+'/');
} else {
- document.write("data:text/html,"+escape(
+ document.write("data:text/html,"+escape(
'<!doctype html>\
<html>\
- <head>\
- <title>Origin for data: with no inherited origin to http:<\/title>\
- <style type="text/css">\
+ <head>\
+ <title>Origin for data: with no inherited origin to http:<\/title>\
+ <style type="text/css">\
div { height: 100px; width: 100px; background: orange; }\
iframe { width: 500px; height: 120px; border: none; }\
- <\/style>\
- <script type="text/javascript">\
+ <\/style>\
+ <script type="text/javascript">\
window.onload = function () {\
- var origin = "null (string)";\
- document.getElementsByTagName("div")[0].ondragstart = function (e) {\
- e.dataTransfer.effectAllowed = "copy";\
- e.dataTransfer.setData("text","dummy text");\
- };\
- document.getElementsByTagName("span")[0].textContent = origin;\
- var iframe = document.createElement("iframe");\
- iframe.src = "'+location.href.replace(/[^\/]*$/,'HELPER-showorigin.html')+'";\
- document.body.insertBefore(iframe,document.getElementsByTagName("div")[0]);\
+ var origin = "null (string)";\
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {\
+ e.dataTransfer.effectAllowed = "copy";\
+ e.dataTransfer.setData("text","dummy text");\
+ };\
+ document.getElementsByTagName("span")[0].textContent = origin;\
+ var iframe = document.createElement("iframe");\
+ iframe.src = "'+location.href.replace(/[^\/]*$/,'HELPER-showorigin.html')+'";\
+ document.body.insertBefore(iframe,document.getElementsByTagName("div")[0]);\
};\
- <\/script>\
- <\/head>\
- <body>\
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>\
- <span><\/span><\/p>\
- <div draggable="true"></div>\
- <\/body>\
+ <\/script>\
+ <\/head>\
+ <body>\
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>\
+ <span><\/span><\/p>\
+ <div draggable="true"></div>\
+ <\/body>\
<\/html>'));
}
- </script>
+ </script>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/114-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/114-manual.html
index b2532178a8a..9c7e7ff3387 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/114-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/114-manual.html
@@ -1,56 +1,56 @@
<!doctype html>
<html>
- <head>
- <title>Origin for javascript: with inherited http origin to http:</title>
- <style type="text/css">
+ <head>
+ <title>Origin for javascript: with inherited http origin to http:</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var datastr =
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var datastr =
'<!doctype html>\
<html>\
- <head>\
- <title>Origin for javascript: with inherited http origin to http:<\/title>\
- <style type="text/css">\
+ <head>\
+ <title>Origin for javascript: with inherited http origin to http:<\/title>\
+ <style type="text/css">\
div { height: 100px; width: 100px; background: orange; }\
iframe { width: 500px; height: 120px; border: none; }\
- <\/style>\
- <script type="text/javascript">\
+ <\/style>\
+ <script type="text/javascript">\
window.onload = function () {\
- var origin = "http://'+httpHostMain+'";\
- document.getElementsByTagName("div")[0].ondragstart = function (e) {\
- e.dataTransfer.effectAllowed = "copy";\
- e.dataTransfer.setData("text","dummy text");\
- };\
- document.getElementsByTagName("span")[0].textContent = origin;\
- var iframe = document.createElement("iframe");\
- iframe.src = "'+location.href.replace(/[^\/]*$/,'HELPER-showorigin.html')+'";\
- document.body.insertBefore(iframe,document.getElementsByTagName("div")[0]);\
+ var origin = "http://'+httpHostMain+'";\
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {\
+ e.dataTransfer.effectAllowed = "copy";\
+ e.dataTransfer.setData("text","dummy text");\
+ };\
+ document.getElementsByTagName("span")[0].textContent = origin;\
+ var iframe = document.createElement("iframe");\
+ iframe.src = "'+location.href.replace(/[^\/]*$/,'HELPER-showorigin.html')+'";\
+ document.body.insertBefore(iframe,document.getElementsByTagName("div")[0]);\
};\
- <\/script>\
- <\/head>\
- <body>\
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>\
- <span><\/span><\/p>\
- <div draggable="true"></div>\
- <\/body>\
+ <\/script>\
+ <\/head>\
+ <body>\
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>\
+ <span><\/span><\/p>\
+ <div draggable="true"></div>\
+ <\/body>\
<\/html>';
- var iframe = document.createElement('iframe');
- iframe.src = "javascript:'"+escape(datastr)+"'";
- document.body.appendChild(iframe);
+ var iframe = document.createElement('iframe');
+ iframe.src = "javascript:'"+escape(datastr)+"'";
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/115-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/115-manual.html
index 751757e1461..133b2200ffe 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/115-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/115-manual.html
@@ -1,50 +1,50 @@
<!doctype html>
<html>
- <head>
- <title>Origin for javascript: with no inherited origin to http:</title>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- </head>
- <body>
+ <head>
+ <title>Origin for javascript: with no inherited origin to http:</title>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ </head>
+ <body>
- <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Load the following URL in a new tab (copy &amp; paste it into the address bar):</p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- <script type="text/javascript">
+ <script type="text/javascript">
var origin = 'http://'+httpHostMain;
if( location.href.indexOf(origin+'/') ) {
- document.write('This must be tested on '+origin+'/');
+ document.write('This must be tested on '+origin+'/');
} else {
- document.write("javascript:'"+escape(
+ document.write("javascript:'"+escape(
'<!doctype html>\
<html>\
- <head>\
- <title>Origin for javascript: with no inherited origin to http:<\/title>\
- <style type="text/css">\
+ <head>\
+ <title>Origin for javascript: with no inherited origin to http:<\/title>\
+ <style type="text/css">\
div { height: 100px; width: 100px; background: orange; }\
iframe { width: 500px; height: 120px; border: none; }\
- <\/style>\
- <script type="text/javascript">\
+ <\/style>\
+ <script type="text/javascript">\
window.onload = function () {\
- var origin = "null (string)";\
- document.getElementsByTagName("div")[0].ondragstart = function (e) {\
- e.dataTransfer.effectAllowed = "copy";\
- e.dataTransfer.setData("text","dummy text");\
- };\
- document.getElementsByTagName("span")[0].textContent = origin;\
- var iframe = document.createElement("iframe");\
- iframe.src = "'+location.href.replace(/[^\/]*$/,'HELPER-showorigin.html')+'";\
- document.body.insertBefore(iframe,document.getElementsByTagName("div")[0]);\
+ var origin = "null (string)";\
+ document.getElementsByTagName("div")[0].ondragstart = function (e) {\
+ e.dataTransfer.effectAllowed = "copy";\
+ e.dataTransfer.setData("text","dummy text");\
+ };\
+ document.getElementsByTagName("span")[0].textContent = origin;\
+ var iframe = document.createElement("iframe");\
+ iframe.src = "'+location.href.replace(/[^\/]*$/,'HELPER-showorigin.html')+'";\
+ document.body.insertBefore(iframe,document.getElementsByTagName("div")[0]);\
};\
- <\/script>\
- <\/head>\
- <body>\
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>\
- <span><\/span><\/p>\
- <div draggable="true"></div>\
- <\/body>\
+ <\/script>\
+ <\/head>\
+ <body>\
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>\
+ <span><\/span><\/p>\
+ <div draggable="true"></div>\
+ <\/body>\
<\/html>')+"'");
}
- </script>
+ </script>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/116-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/116-manual.html
index fdeeeb3734e..dd6dbf57b03 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/116-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/116-manual.html
@@ -1,31 +1,31 @@
<!doctype html>
<html>
- <head>
- <title>Origin for dropped files</title>
- <style type="text/css">
+ <head>
+ <title>Origin for dropped files</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- document.getElementsByTagName('span')[0].textContent = 'null (string)';
- var iframe = document.createElement('iframe');
- iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ document.getElementsByTagName('span')[0].textContent = 'null (string)';
+ var iframe = document.createElement('iframe');
+ iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag a small file from your computer onto the blue square and release it. If a prompt appears, accept it. The blue square should be replaced with the text:<br>
- <span></span></p>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag a small file from your computer onto the blue square and release it. If a prompt appears, accept it. The blue square should be replaced with the text:<br>
+ <span></span></p>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/117-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/117-1.html
index c49b18ac9cc..40b0885f33c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/117-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/117-1.html
@@ -1,33 +1,33 @@
<!doctype html>
<html>
- <head>
- <title>Origin for site with document.domain set to a parent domain</title>
- <style type="text/css">
+ <head>
+ <title>Origin for site with document.domain set to a parent domain</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostAlias;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- document.domain = httpsHostAlias.replace(/^[^.]+\./,'');
- var iframe = document.createElement('iframe');
- iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'http://'+httpHostAlias;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ document.domain = httpsHostAlias.replace(/^[^.]+\./,'');
+ var iframe = document.createElement('iframe');
+ iframe.src = origin+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/117-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/117-manual.html
index d126fdaac66..88676a4b77c 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/117-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/117-manual.html
@@ -1,27 +1,27 @@
<!doctype html>
<html>
- <head>
- <title>Origin for site with document.domain set to a parent domain</title>
- <style type="text/css">
+ <head>
+ <title>Origin for site with document.domain set to a parent domain</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var iframe = document.createElement('iframe');
- iframe.src = 'http://'+httpHostAlias+location.pathname.replace(/.html$/,'-1.html');
- document.body.appendChild(iframe);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var iframe = document.createElement('iframe');
+ iframe.src = 'http://'+httpHostAlias+location.pathname.replace(/.html$/,'-1.html');
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/118-1.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/118-1.html
index d0212bd2a4c..5161661a76d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/118-1.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/118-1.html
@@ -1,32 +1,32 @@
<!doctype html>
<html>
- <head>
- <title>Origin after leaving browser window</title>
- <style type="text/css">
+ <head>
+ <title>Origin after leaving browser window</title>
+ <style type="text/css">
div { height: 100px; width: 100px; background: orange; }
iframe { width: 500px; height: 120px; border: none; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain+':'+httpPortAlias;
- document.getElementsByTagName('div')[0].ondragstart = function (e) {
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- };
- document.getElementsByTagName('span')[0].textContent = origin;
- var iframe = document.createElement('iframe');
- iframe.src = 'http://'+httpHostMain+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
- document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
+ var origin = 'http://'+httpHostMain+':'+httpPortAlias;
+ document.getElementsByTagName('div')[0].ondragstart = function (e) {
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ };
+ document.getElementsByTagName('span')[0].textContent = origin;
+ var iframe = document.createElement('iframe');
+ iframe.src = 'http://'+httpHostMain+location.pathname.replace(/[^\/]*$/,'HELPER-showorigin.html');
+ document.body.insertBefore(iframe,document.getElementsByTagName('div')[0]);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <p>Drag the orange square out of the browser window (not onto the system taskbar) then back onto the blue square and release it. The blue square should be replaced with the text:<br>
- <span></span></p>
- <div draggable="true"></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <p>Drag the orange square out of the browser window (not onto the system taskbar) then back onto the blue square and release it. The blue square should be replaced with the text:<br>
+ <span></span></p>
+ <div draggable="true"></div>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/118-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/118-manual.html
index 6b931692d31..0b9df2292df 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/118-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/118-manual.html
@@ -1,27 +1,27 @@
<!doctype html>
<html>
- <head>
- <title>Origin after leaving browser window</title>
- <style type="text/css">
+ <head>
+ <title>Origin after leaving browser window</title>
+ <style type="text/css">
html, body, iframe { display: block; width: 100%; height: 100%; border: none; margin: 0; padding: 0; }
- </style>
- <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript" src="../resources/crossorigin.sub.js"></script>
+ <script type="text/javascript">
window.onload = function () {
- var origin = 'http://'+httpHostMain;
- if( location.href.indexOf(origin+'/') ) {
- document.body.innerHTML = 'This must be tested on '+origin+'/';
- return;
- }
- var iframe = document.createElement('iframe');
- iframe.src = 'http://'+httpHostMain+':'+httpPortAlias+location.pathname.replace(/.html$/,'-1.html');
- document.body.appendChild(iframe);
+ var origin = 'http://'+httpHostMain;
+ if( location.href.indexOf(origin+'/') ) {
+ document.body.innerHTML = 'This must be tested on '+origin+'/';
+ return;
+ }
+ var iframe = document.createElement('iframe');
+ iframe.src = 'http://'+httpHostMain+':'+httpPortAlias+location.pathname.replace(/.html$/,'-1.html');
+ document.body.appendChild(iframe);
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <noscript><p>Enable JavaScript and reload</p></noscript>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
+ </body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/201-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/201-manual.html
index a687147c765..e19d5289ccc 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/201-manual.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/201-manual.html
@@ -1,83 +1,83 @@
<!doctype html>
<html>
- <head>
- <title>allowTargetOrigin with real dataTransfer should block dragenter, dragover, dragleave and drop synthetic events</title>
- <style type="text/css">
+ <head>
+ <title>allowTargetOrigin with real dataTransfer should block dragenter, dragover, dragleave and drop synthetic events</title>
+ <style type="text/css">
p + div { height: 100px; width: 100px; background: orange; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var orange = document.getElementsByTagName('div')[0], targ = document.getElementsByTagName('div')[1], evtdone = {}, fails = [];
- orange.ondragstart = function (e) {
- var evt;
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- try {
- e.dataTransfer.allowTargetOrigin('http://example.com');
- } catch(e) {
- fails[fails.length] = 'allowTargetOrigin threw an error: '+e;
- }
- try {
- evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('dragenter', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('dragover', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('dragleave', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('drop', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- } catch(e) {
- fails[fails.length] = 'Synthetic event threw an error: '+e;
- }
- if( !evtdone.dragstart ) {
- fails[fails.length] = 'dragstart did not fire';
- }
- if( !evtdone.drag ) {
- fails[fails.length] = 'drag did not fire';
- }
- if( !evtdone.dragend ) {
- fails[fails.length] = 'dragend did not fire';
- }
- if( evtdone.dragenter ) {
- fails[fails.length] = 'dragenter fired';
- }
- if( evtdone.dragover ) {
- fails[fails.length] = 'dragover fired';
- }
- if( evtdone.dragleave ) {
- fails[fails.length] = 'dragleave fired';
- }
- if( evtdone.drop ) {
- fails[fails.length] = 'drop fired';
- }
- document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
- };
- targ.ondragstart = function (e) {
- evtdone[e.type] = true;
- };
- targ.ondragenter = targ.ondragover = targ.ondrop = function (e) {
- e.preventDefault();
- evtdone[e.type] = true;
- };
- targ.ondrag = targ.ondragleave = function (e) {
- evtdone[e.type] = true;
- };
- targ.ondragend = function (e) {
- evtdone[e.type] = true;
- };
+ var orange = document.getElementsByTagName('div')[0], targ = document.getElementsByTagName('div')[1], evtdone = {}, fails = [];
+ orange.ondragstart = function (e) {
+ var evt;
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ try {
+ e.dataTransfer.allowTargetOrigin('http://example.com');
+ } catch(e) {
+ fails[fails.length] = 'allowTargetOrigin threw an error: '+e;
+ }
+ try {
+ evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('dragenter', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('dragover', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('dragleave', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('drop', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ } catch(e) {
+ fails[fails.length] = 'Synthetic event threw an error: '+e;
+ }
+ if( !evtdone.dragstart ) {
+ fails[fails.length] = 'dragstart did not fire';
+ }
+ if( !evtdone.drag ) {
+ fails[fails.length] = 'drag did not fire';
+ }
+ if( !evtdone.dragend ) {
+ fails[fails.length] = 'dragend did not fire';
+ }
+ if( evtdone.dragenter ) {
+ fails[fails.length] = 'dragenter fired';
+ }
+ if( evtdone.dragover ) {
+ fails[fails.length] = 'dragover fired';
+ }
+ if( evtdone.dragleave ) {
+ fails[fails.length] = 'dragleave fired';
+ }
+ if( evtdone.drop ) {
+ fails[fails.length] = 'drop fired';
+ }
+ document.getElementsByTagName('p')[0].innerHTML = fails.length ? ( 'FAIL:<br>' + fails.join('<br>') ) : 'PASS';
+ };
+ targ.ondragstart = function (e) {
+ evtdone[e.type] = true;
+ };
+ targ.ondragenter = targ.ondragover = targ.ondrop = function (e) {
+ e.preventDefault();
+ evtdone[e.type] = true;
+ };
+ targ.ondrag = targ.ondragleave = function (e) {
+ evtdone[e.type] = true;
+ };
+ targ.ondragend = function (e) {
+ evtdone[e.type] = true;
+ };
};
- </script>
- </head>
- <body>
- <p>Drag the orange square to the right until the drag placeholder appears, then release it. Fail if this text does not change.</p>
- <div draggable="true"></div>
- <div></div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </head>
+ <body>
+ <p>Drag the orange square to the right until the drag placeholder appears, then release it. Fail if this text does not change.</p>
+ <div draggable="true"></div>
+ <div></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/202.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/202.html
index 0e6b43c060e..84f3f2ee96d 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/202.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/202.html
@@ -1,64 +1,64 @@
<!doctype html>
<html>
- <head>
- <title>allowTargetOrigin with fake dataTransfer should block dragenter, dragover, dragleave and drop synthetic events</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <div draggable="true"></div>
- <div></div>
- <noscript><p>Enable JavaScript and reload</p></noscript>
- <div id="log"></div>
+ <head>
+ <title>allowTargetOrigin with fake dataTransfer should block dragenter, dragover, dragleave and drop synthetic events</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div draggable="true"></div>
+ <div></div>
+ <noscript><p>Enable JavaScript and reload</p></noscript>
+ <div id="log"></div>
- <script type="text/javascript">
+ <script type="text/javascript">
test(function () {
- var dragsource = document.getElementsByTagName('div')[0], targ = document.getElementsByTagName('div')[1], evtdone = {};
- dragsource.ondragstart = function (e) {
- var evt;
- evtdone.initial = true;
- e.dataTransfer.effectAllowed = 'copy';
- e.dataTransfer.setData('text','dummy text');
- e.dataTransfer.allowTargetOrigin('http://example.com');
- evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('dragenter', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('dragover', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('dragleave', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('drop', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
- targ.dispatchEvent(evt);
- };
- targ.ondragstart = function (e) {
- evtdone[e.type] = true;
- };
- targ.ondragenter = targ.ondragover = targ.ondrop = function (e) {
- e.preventDefault();
- evtdone[e.type] = true;
- };
- targ.ondrag = targ.ondragleave = function (e) {
- evtdone[e.type] = true;
- };
- targ.ondragend = function (e) {
- evtdone[e.type] = true;
- };
- var creatorevent = document.createEvent('DragEvent');
- creatorevent.initDragEvent('dragstart', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, document.body, {});
- dragsource.dispatchEvent(creatorevent);
- assert_true(evtdone.dragstart, 'dragstart must fire');
- assert_true(evtdone.drag, 'drag must fire');
- assert_true(evtdone.dragend, 'dragend must fire');
- assert_false(evtdone.dragenter, 'dragenter must not fire');
- assert_false(evtdone.dragover, 'dragover must not fire');
- assert_false(evtdone.dragleave, 'dragleave must not fire');
- assert_false(evtdone.drop, 'drop must not fire');
+ var dragsource = document.getElementsByTagName('div')[0], targ = document.getElementsByTagName('div')[1], evtdone = {};
+ dragsource.ondragstart = function (e) {
+ var evt;
+ evtdone.initial = true;
+ e.dataTransfer.effectAllowed = 'copy';
+ e.dataTransfer.setData('text','dummy text');
+ e.dataTransfer.allowTargetOrigin('http://example.com');
+ evt = new DragEvent('dragstart', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('drag', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('dragenter', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('dragover', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('dragleave', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('drop', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ evt = new DragEvent('dragend', {dataTransfer:e.dataTransfer});
+ targ.dispatchEvent(evt);
+ };
+ targ.ondragstart = function (e) {
+ evtdone[e.type] = true;
+ };
+ targ.ondragenter = targ.ondragover = targ.ondrop = function (e) {
+ e.preventDefault();
+ evtdone[e.type] = true;
+ };
+ targ.ondrag = targ.ondragleave = function (e) {
+ evtdone[e.type] = true;
+ };
+ targ.ondragend = function (e) {
+ evtdone[e.type] = true;
+ };
+ var creatorevent = document.createEvent('DragEvent');
+ creatorevent.initDragEvent('dragstart', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 1, document.body, {});
+ dragsource.dispatchEvent(creatorevent);
+ assert_true(evtdone.dragstart, 'dragstart must fire');
+ assert_true(evtdone.drag, 'drag must fire');
+ assert_true(evtdone.dragend, 'dragend must fire');
+ assert_false(evtdone.dragenter, 'dragenter must not fire');
+ assert_false(evtdone.dragover, 'dragover must not fire');
+ assert_false(evtdone.dragleave, 'dragleave must not fire');
+ assert_false(evtdone.drop, 'drop must not fire');
}, "allowTargetOrigin with fake dataTransfer should block events");
- </script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-mustallow.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-mustallow.html
index 0a68b74483f..c0d3aa022ce 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-mustallow.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-mustallow.html
@@ -1,26 +1,26 @@
<!doctype html>
<html>
- <head>
- <title>Must be allowed</title>
- <style type="text/css">
+ <head>
+ <title>Must be allowed</title>
+ <style type="text/css">
html { background: blue; }
html, body { margin: 0; padding: 0; height: 100%; width: 100%; }
- </style>
- </head>
- <body>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <script type="text/javascript">
if( location.search && location.search.indexOf('domain') != -1 ) {
- document.domain = location.hostname.replace(/^[^.]+\./,'');
+ document.domain = location.hostname.replace(/^[^.]+\./,'');
}
var seentypes = {};
document.body.ondragenter = document.body.ondragover = document.body.ondrop = function (e) {
- e.preventDefault();
- if( e.type == 'drop' ) {
- document.body.innerHTML = ( seentypes.dragenter && seentypes.dragover && e.dataTransfer.getData('text') == 'dummy text' ) ? 'PASS' : 'FAIL';
- } else {
- seentypes[e.type] = true;
- }
+ e.preventDefault();
+ if( e.type == 'drop' ) {
+ document.body.innerHTML = ( seentypes.dragenter && seentypes.dragover && e.dataTransfer.getData('text') == 'dummy text' ) ? 'PASS' : 'FAIL';
+ } else {
+ seentypes[e.type] = true;
+ }
}
- </script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-mustblock.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-mustblock.html
index dd467f55f08..c7c69ee6b07 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-mustblock.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-mustblock.html
@@ -1,21 +1,21 @@
<!doctype html>
<html>
- <head>
- <title>Must be blocked</title>
- <style type="text/css">
+ <head>
+ <title>Must be blocked</title>
+ <style type="text/css">
html { background: fuchsia; }
html, body { margin: 0; padding: 0; height: 100%; width: 100%; }
- </style>
- </head>
- <body>
- <script type="text/javascript">
+ </style>
+ </head>
+ <body>
+ <script type="text/javascript">
if( location.search && location.search.indexOf('domain') != -1 ) {
- document.domain = location.hostname.replace(/^[^.]+\./,'');
+ document.domain = location.hostname.replace(/^[^.]+\./,'');
}
document.body.ondragenter = document.body.ondragleave = document.body.ondragover = document.body.ondrop = function (e) {
- e.preventDefault();
- document.body.innerHTML = 'FAIL';
+ e.preventDefault();
+ document.body.innerHTML = 'FAIL';
}
- </script>
- </body>
-</html> \ No newline at end of file
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-showorigin.html b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-showorigin.html
index ea071e81124..057f969dd22 100644
--- a/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-showorigin.html
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/target-origin/HELPER-showorigin.html
@@ -1,31 +1,31 @@
<!doctype html>
<html>
- <head>
- <title>Readout of .origin</title>
- <style type="text/css">
+ <head>
+ <title>Readout of .origin</title>
+ <style type="text/css">
html, body { margin: 0; padding: 0; }
div { height: 100px; width: 100px; background: blue; }
- </style>
- <script type="text/javascript">
+ </style>
+ <script type="text/javascript">
window.onload = function () {
- var blue = document.getElementsByTagName('div')[0];
- blue.ondragenter = blue.ondragover = function (e) {
- e.preventDefault();
- };
- blue.ondrop = function (e) {
- e.preventDefault();
- if( e.dataTransfer.origin === 'null' ) {
- document.body.innerHTML = 'null (string)';
- } else {
- document.body.innerHTML = e.dataTransfer.origin;
- }
- };
+ var blue = document.getElementsByTagName('div')[0];
+ blue.ondragenter = blue.ondragover = function (e) {
+ e.preventDefault();
+ };
+ blue.ondrop = function (e) {
+ e.preventDefault();
+ if( e.dataTransfer.origin === 'null' ) {
+ document.body.innerHTML = 'null (string)';
+ } else {
+ document.body.innerHTML = e.dataTransfer.origin;
+ }
+ };
};
- </script>
- </head>
- <body>
+ </script>
+ </head>
+ <body>
- <div></div>
+ <div></div>
- </body>
-</html> \ No newline at end of file
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html
new file mode 100644
index 00000000000..81d4c4214b2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedDragDataTransfer-manual.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'>
+ <title>HTML Test: drag DataTransfer protected status</title>
+ <link rel='author' title='Michael Layzell' href='mailto:michael@thelayzells.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>
+ #drag {
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ color: #fff;
+ background-color: #f00;
+ }
+ #drop {
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ color: #fff;
+ background-color: #00f;
+ }
+ </style>
+ </head>
+
+ <body>
+ <h3>Instructions</h3>
+ <p>
+ Drag the box labeled "drag" to the box labeled "drop" and release.
+ </p>
+
+ <div id="drag" draggable="true">drag</div>
+ <div id="drop">drop</div>
+
+ <div id="log"> </div>
+
+ <script>
+ var MIME = "text/plain";
+
+ var drop;
+ setup(function() {
+ drop = document.querySelector("#drop");
+ }, {explicit_done: true, explicit_timeout: true});
+
+ var STATUS_PROTECTED = "protected";
+ var STATUS_READONLY = "readonly";
+ var STATUS_READWRITE = "readwrite";
+ var STATUS_DISCONNECTED = "disconnected";
+ function status(dt) {
+ // Check if we can write to it.
+ try {
+ dt.setData("text/html", "_test");
+
+ if (dt.getData("text/html") == "_test") {
+ dt.clearData("text/html");
+ assert_true(!dt.getData("text/html"), "ClearData should work...");
+ return STATUS_READWRITE;
+ }
+ } catch(e) {}
+
+ // If we can read the data then we're readonly
+ if (dt.getData(MIME)) {
+ return STATUS_READONLY;
+ }
+
+ // If we can see that items exist (and read types) then we're protected
+ if (dt.items.length > 0) {
+ return STATUS_PROTECTED;
+ }
+
+ // Otherwise we've been disconnected.
+ return STATUS_DISCONNECTED;
+ };
+
+ var drag_dt = null;
+ var over_dt = null;
+ var drop_dt = null;
+ on_event(document.body, "dragstart", function(e) {
+ drag_dt = e.dataTransfer;
+ over_dt = null;
+ drop_dt = null;
+ drag_dt.setData(MIME, "b");
+ test(function() {
+ assert_equals(status(drag_dt), STATUS_READWRITE,
+ "drag_dt must be readwrite during dragstart");
+ }, "dragstart event status");
+ });
+ on_event(drop, "dragover", function(e) {
+ if (!over_dt) {
+ over_dt = e.dataTransfer;
+ test(function() {
+ assert_equals(status(drag_dt), STATUS_DISCONNECTED,
+ "drag_dt mustbe disconnected during dragover");
+ assert_equals(status(over_dt), STATUS_PROTECTED,
+ "over_dt mustbe protected during dragover");
+ }, "dragover event status");
+ test(function() {
+ assert_true(drag_dt != over_dt,
+ "drag_dt must be a different DataTransfer object than over_dt");
+ }, "dragover event identity");
+ }
+ e.preventDefault();
+ });
+ on_event(drop, "drop", function(e) {
+ drop_dt = e.dataTransfer;
+ test(function() {
+ assert_equals(status(drag_dt), STATUS_DISCONNECTED,
+ "drag_dt mustbe disconnected during drop");
+ assert_equals(status(over_dt), STATUS_DISCONNECTED,
+ "over_dt mustbe disconnected during drop");
+ assert_equals(status(drop_dt), STATUS_READONLY,
+ "drop_dt mustbe readonly during drop");
+ }, "drop event status");
+ test(function() {
+ assert_not_equals(drop_dt, over_dt,
+ "drop_dt must be a different DataTransfer object than over_dt");
+ assert_not_equals(drop_dt, drag_dt,
+ "drop_dt must be a different DataTransfer object than drag_dt");
+ }, "drop event identity");
+ test(function() {
+ assert_equals(drop_dt.getData(MIME), "b",
+ "the data should have been persisted");
+ }, "drop event data");
+ e.preventDefault();
+
+ setTimeout(function() {
+ test(function() {
+ assert_equals(status(drag_dt), STATUS_DISCONNECTED,
+ "drag_dt mustbe disconnected after drop");
+ assert_equals(status(over_dt), STATUS_DISCONNECTED,
+ "over_dt mustbe disconnected after drop");
+ assert_equals(status(drop_dt), STATUS_DISCONNECTED,
+ "drop_dt mustbe disconnected after drop");
+ }, "after drop event status");
+ done();
+ }, 0);
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html b/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html
new file mode 100644
index 00000000000..bedfb462271
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/editing/dnd/the-datatransfer-interface/protectedPasteDataTransfer-manual.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'>
+ <title>HTML Test: paste DataTransfer protected status</title>
+ <link rel='author' title='Michael Layzell' href='mailto:michael@thelayzells.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>
+ </head>
+
+ <body>
+ <h3>Instructions</h3>
+ <p>
+ Select the text in the text box and press Ctrl-C followed by Ctrl-V.
+ </p>
+
+ <input type="text" id="input" value="text">
+
+ <div id="log"> </div>
+
+ <script>
+ var MIME = "text/plain";
+
+ var input;
+ setup(function() {
+ input = document.querySelector("#input");
+ }, {explicit_done: true, explicit_timeout: true});
+
+ var STATUS_PROTECTED = "protected";
+ var STATUS_READONLY = "readonly";
+ var STATUS_READWRITE = "readwrite";
+ var STATUS_DISCONNECTED = "disconnected";
+ function status(dt) {
+ // Check if we can write to it.
+ try {
+ dt.setData("text/html", "_test");
+
+ if (dt.getData("text/html") == "_test") {
+ dt.clearData("text/html");
+ assert_true(!dt.getData("text/html"), "ClearData should work...");
+ return STATUS_READWRITE;
+ }
+ } catch(e) {}
+
+ // If we can read the data then we're readonly
+ if (dt.getData(MIME)) {
+ return STATUS_READONLY;
+ }
+
+ // If we can see that items exist (and read types) then we're protected
+ if (dt.items.length > 0) {
+ return STATUS_PROTECTED;
+ }
+
+ // Otherwise we've been disconnected.
+ return STATUS_DISCONNECTED;
+ };
+
+ let copy_dt = null;
+ let paste_dt = null;
+ on_event(input, "copy", function(e) {
+ copy_dt = e.clipboardData;
+ paste_dt = null;
+ copy_dt.setData(MIME, "b");
+
+ test(function() {
+ assert_equals(status(copy_dt), STATUS_READWRITE,
+ "copy_dt must be readwrite during copy");
+ }, "copy event status");
+
+ e.preventDefault();
+ });
+ on_event(input, "paste", function(e) {
+ paste_dt = e.clipboardData;
+
+ test(function() {
+ assert_equals(status(copy_dt), STATUS_DISCONNECTED,
+ "copy_dt mustbe disconnected during paste");
+ assert_equals(status(paste_dt), STATUS_READONLY,
+ "paste_dt mustbe readonly during paste");
+ }, "paste event status");
+ test(function() {
+ assert_not_equals(copy_dt != paste_dt,
+ "copy_dt must be a different DataTransfer object than paste_dt");
+ }, "paste event identity");
+ test(function() {
+ assert_equals(paste_dt.getData(MIME), "b",
+ "the data should have been persisted");
+ }, "paste event data");
+
+ e.preventDefault();
+
+ setTimeout(function() {
+ test(function() {
+ assert_equals(status(copy_dt), STATUS_DISCONNECTED,
+ "copy_dt mustbe disconnected after paste");
+ assert_equals(status(paste_dt), STATUS_DISCONNECTED,
+ "paste_dt mustbe disconnected after paste");
+ }, "after paste event status");
+ done();
+ }, 0);
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-001.html b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-001.html
index 4a5fd410410..7dd891374bc 100644
--- a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-001.html
+++ b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-001.html
@@ -10,6 +10,8 @@
<script>
var test = document.getElementById("test");
- test.focus(); test.blur(); //alternative to forceSpellCheck(), due to general lack of support
+ // Force spellcheck by focus and then blur
+ test.focus();
+ test.blur();
test.removeAttribute("contenteditable");
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-002.html b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-002.html
index 44f1ea842e2..b361b930402 100644
--- a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-002.html
+++ b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-002.html
@@ -10,7 +10,9 @@
<script>
var test = document.getElementById("test");
- test.focus(); test.blur(); // Alternative to forceSpellCheck(), due to general lack of support
+ // Force spellcheck by focus and then blur
+ test.focus();
+ test.blur();
var child = document.getElementById("child");
child.setAttribute("contenteditable", false);
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-003.html b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-003.html
index 9c88660e281..d1a6aa3a9ba 100644
--- a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-003.html
+++ b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-003.html
@@ -10,6 +10,8 @@
<script>
var test = document.getElementById("test");
- test.focus(); test.blur(); // Alternative to forceSpellCheck(), due to general lack of support
+ // Force spellcheck by focus and then blur
+ test.focus();
+ test.blur();
test.setAttribute("spellcheck", false);
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-004.html b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-004.html
index fdeb90648c0..c718e77bb87 100644
--- a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-004.html
+++ b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-004.html
@@ -10,7 +10,9 @@
<script>
var test = document.getElementById("test");
- test.focus(); test.blur(); // Alternative to forceSpellCheck(), due to general lack of support
+ // Force spellcheck by focus then blur
+ test.focus();
+ test.blur();
var child = document.getElementById("child");
child.setAttribute("spellcheck", false);
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-005.html b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-005.html
index 9ab7a3ed6dc..705ee7b67f8 100644
--- a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-005.html
+++ b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-005.html
@@ -10,7 +10,9 @@
<script>
var test = document.getElementById("test");
- test.focus(); test.blur(); // Alternative to forceSpellCheck(), due to general lack of support
+ // Force spellcheck by focus then blur
+ test.focus();
+ test.blur();
var child = document.getElementById("child");
child.setAttribute("spellcheck", false);
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-006.html b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-006.html
index f0b54da15b5..512d473f13e 100644
--- a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-006.html
+++ b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-006.html
@@ -12,7 +12,9 @@
<script>
var test = document.getElementById("test");
- test.focus(); test.blur(); // Alternative to forceSpellCheck(), due to general lack of support
+ // Force spellcheck by focus then blur
+ test.focus();
+ test.blur();
var p = document.getElementById("parent");
p.setAttribute("spellcheck", false);
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-007.html b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-007.html
index 4bbeca9a32c..31b3755f3a7 100644
--- a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-007.html
+++ b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-007.html
@@ -20,6 +20,8 @@
<script>
var test = document.getElementById("test");
- test.focus(); test.blur(); // Alternative to forceSpellCheck(), due to general lack of support
+ // Force spellcheck by focus then blur
+ test.focus();
+ test.blur();
test.setAttribute("readonly", true);
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-008.html b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-008.html
index 5ed72abb84d..f891acff428 100644
--- a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-008.html
+++ b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-008.html
@@ -20,6 +20,8 @@
<script>
var test = document.getElementById("test");
- test.focus(); test.blur(); // Alternative to forceSpellCheck(), due to general lack of support
+ // Force spellcheck by focus then blur
+ test.focus();
+ test.blur();
test.setAttribute("disabled", true);
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-009.html b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-009.html
index 577ffd895bc..96eb87d2f41 100644
--- a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-009.html
+++ b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-009.html
@@ -20,6 +20,8 @@
<script>
var test = document.getElementById("test");
- test.focus(); test.blur(); // Alternative to forceSpellCheck(), due to general lack of support
+ // Force spellcheck by focus then blur
+ test.focus();
+ test.blur();
test.setAttribute("readonly", true);
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-010.html b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-010.html
index 6a2e1046b89..16275f10e9e 100644
--- a/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-010.html
+++ b/tests/wpt/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-010.html
@@ -20,6 +20,8 @@
<script>
var test = document.getElementById("test");
- test.focus(); test.blur(); // Alternative to forceSpellCheck(), due to general lack of support
+ // Force spellcheck by focus then blur
+ test.focus();
+ test.blur();
test.setAttribute("disabled", true);
</script>
diff --git a/tests/wpt/web-platform-tests/html/editing/focus/tabindex-focus-flag.html b/tests/wpt/web-platform-tests/html/editing/focus/tabindex-focus-flag.html
new file mode 100644
index 00000000000..e40bc077594
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/editing/focus/tabindex-focus-flag.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#specially-focusable">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<div id="default-samples">
+<a></a>
+<a href=""></a>
+<button></button>
+<input type="hidden">
+<input type="button">
+<select><option>abc</option></select>
+<textarea></textarea>
+<summary id="summary-out"></summary>
+<details open><summary id="summary-first"></summary><summary id="summary-second"></summary></details>
+<div contenteditable="true"></div>
+<iframe></iframe>
+</div>
+<script>
+const defaultList = [
+ ['a', false],
+ ['a[href]', true],
+ ['button', true],
+ ['input[type="hidden"]', false],
+ ['input[type="button"]', true],
+ ['select', true],
+ ['textarea', true],
+ ['#summary-out', false],
+ ['#summary-first', true],
+ ['#summary-second', false],
+ ['[contenteditable]', true],
+ ['iframe', true],
+];
+for (entry of defaultList) {
+ test(() => {
+ var element = document.querySelector('#default-samples ' + entry[0]);
+ element.focus();
+ if (entry[1])
+ assert_equals(document.activeElement, element);
+ else
+ assert_not_equals(document.activeElement, element);
+ }, entry[0] + ' should ' + (entry[1] ? '' : 'not ') + 'be focusable by default.');
+}
+</script>
+
+<div id="tabindex-0">
+<a tabindex="0"></a>
+<summary tabindex="0" id="summary-out-tabindex0"></summary>
+<details open><summary id="summary-first"></summary><summary tabindex="0" id="summary-second-tabindex0"></summary></details>
+</div>
+<script>
+for (element of document.querySelectorAll('#tabindex-0 [tabindex]')) {
+ var elementDesc = element.tagName;
+ if (element.id)
+ elementDesc += '#' + element.id;
+ test(() => {
+ element.focus();
+ assert_equals(document.activeElement, element);
+ }, elementDesc + ' with tabindex=0 should be focusable.');
+}
+</script>
+</body>
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 fd250426464..e17c0eb82fd 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
@@ -19,6 +19,9 @@
<div id="4294967294"></div>
<div id="4294967295"></div>
<div id="4294967296"></div>
+<div id="undefined"></div>
+<div id="null"></div>
+<div name="divwithname"></div>
<script>
var anchors = document.querySelectorAll("a");
var divs = document.querySelectorAll("div");
@@ -30,19 +33,19 @@ test(function() {
}, "document.all is an HTMLAllCollection");
test(function() {
- assert_equals(document.all.length, 20);
+ assert_equals(document.all.length, 23);
}, "length attribute");
// indexed property getter
test(function() {
assert_equals(document.all[0], document.documentElement);
- assert_equals(document.all[19], scripts[2]);
+ assert_equals(document.all[22], scripts[2]);
}, "indexed property getter");
test(function() {
assert_equals(document.all[-1], undefined);
- assert_equals(document.all[20], undefined);
+ assert_equals(document.all[23], undefined);
assert_equals(document.all[42], undefined);
assert_equals(document.all[43], undefined);
assert_equals(document.all[4294967294], undefined);
@@ -65,8 +68,11 @@ test(function() {
}, "named property getter with dot syntax");
test(function() {
+ assert_equals(document.all[""], undefined);
assert_equals(document.all["noname"], undefined);
assert_equals(document.all.noname, undefined);
+ assert_equals(document.all["divwithname"], undefined);
+ assert_equals(document.all.divwithname, undefined);
}, "named property getter with invalid name");
test(function() {
@@ -78,8 +84,8 @@ test(function() {
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["22"], document.scripts[2]);
+ assert_equals(document.all["23"], undefined);
assert_equals(document.all["42"], undefined);
assert_equals(document.all["43"], undefined);
}, "named property getter with \"array index property name\"");
@@ -93,6 +99,14 @@ test(function() {
assert_equals(document.all["4294967296"], divs[2]);
}, "named property getter with invalid \"array index property name\"");
+test(function() {
+ assert_equals(document.all[undefined], divs[3]);
+}, "named property getter with undefined");
+
+test(function() {
+ assert_equals(document.all[null], divs[4]);
+}, "named property getter with null");
+
// namedItem method
test(function() {
@@ -102,7 +116,9 @@ test(function() {
}, "namedItem method");
test(function() {
+ assert_equals(document.all.namedItem(""), null);
assert_equals(document.all.namedItem("noname"), null);
+ assert_equals(document.all.namedItem("divwithname"), null);
}, "namedItem method with invalid name");
test(function() {
@@ -114,8 +130,8 @@ test(function() {
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("22"), null);
+ assert_equals(document.all.namedItem("23"), null);
assert_equals(document.all.namedItem("42"), spans[0]);
assert_equals(document.all.namedItem("43"), null);
}, "namedItem method with \"array index property name\"");
@@ -130,6 +146,14 @@ test(function() {
}, "namedItem method with invalid \"array index property name\"");
test(function() {
+ assert_equals(document.all.namedItem(undefined), divs[3]);
+}, "namedItem method with undefined");
+
+test(function() {
+ assert_equals(document.all.namedItem(null), divs[4]);
+}, "namedItem method with null");
+
+test(function() {
assert_equals(document.all.namedItem.length, 1);
assert_throws(new TypeError, function() {
document.all.namedItem();
@@ -145,7 +169,9 @@ test(function() {
}, "legacy caller");
test(function() {
+ assert_equals(document.all(""), null);
assert_equals(document.all("noname"), null);
+ assert_equals(document.all("divwithname"), null);
}, "legacy caller with invalid name");
test(function() {
@@ -157,16 +183,16 @@ test(function() {
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("22"), document.scripts[2]);
+ assert_equals(document.all("23"), 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(22), document.scripts[2]);
+ assert_equals(document.all(23), null);
assert_equals(document.all(42), null);
assert_equals(document.all(43), null);
}, "legacy caller with \"array index property name\" as number");
@@ -181,9 +207,38 @@ test(function() {
}, "legacy caller with invalid \"array index property name\"");
test(function() {
+ assert_equals(document.all(undefined), null);
+}, "legacy caller with undefined");
+
+test(function() {
+ assert_equals(document.all(null), divs[4]);
+}, "legacy caller with null");
+
+test(function() {
assert_equals(document.all(), null);
}, "legacy caller with no argument");
+test(function() {
+ assert_throws(new TypeError(), function() {
+ new document.all("picture");
+ }, "New should not work on document.all()");
+
+ // https://esdiscuss.org/topic/isconstructor#content-11
+ assert_throws(new TypeError(), function() {
+ new (new Proxy(document.all, {
+ construct: function() {
+ return {};
+ }
+ }));
+ }, "Proxies should treat document.all() as not-a-constructor");
+}, "legacy caller is not a constructor");
+
+test(function() {
+ [undefined, null, {}, document.body].forEach(function(thisValue) {
+ assert_equals(Function.prototype.call.call(document.all, thisValue, "043"), spans[1]);
+ });
+}, "legacy caller with arbitrary this value");
+
// item method
test(function() {
@@ -193,7 +248,9 @@ test(function() {
}, "item method");
test(function() {
+ assert_equals(document.all.item(""), null);
assert_equals(document.all.item("noname"), null);
+ assert_equals(document.all.item("divwithname"), null);
}, "item method with invalid name");
test(function() {
@@ -205,16 +262,16 @@ test(function() {
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("22"), document.scripts[2]);
+ assert_equals(document.all.item("23"), 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(22), document.scripts[2]);
+ assert_equals(document.all.item(23), null);
assert_equals(document.all.item(42), null);
assert_equals(document.all.item(43), null);
}, "item method with \"array index property name\" as number");
@@ -229,6 +286,14 @@ test(function() {
}, "item method with invalid \"array index property name\"");
test(function() {
+ assert_equals(document.all.item(undefined), null);
+}, "item method with undefined");
+
+test(function() {
+ assert_equals(document.all.item(null), divs[4]);
+}, "item method with null");
+
+test(function() {
assert_equals(document.all.item.length, 0);
assert_equals(document.all.item(), null);
}, "item method with no argument");
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/structuredclone/echo.js b/tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/echo.js
index 02184921cf3..02184921cf3 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/structuredclone/echo.js
+++ b/tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/echo.js
diff --git a/tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/no-transferring.html b/tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/no-transferring.html
index ece74e27194..fa95d8abe5d 100644
--- a/tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/no-transferring.html
+++ b/tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/no-transferring.html
@@ -17,7 +17,7 @@ test(() => {
test(() => {
const sab = new SharedArrayBuffer();
- const worker = new Worker("resources/incrementer.js");
+ const worker = new Worker("resources/echo-worker.js");
assert_throws("DataCloneError", () => worker.postMessage(sab, [sab]));
assert_throws("DataCloneError", () => worker.postMessage("test", [sab]));
}, "Trying to transfer a SharedArrayBuffer to a worker throws");
diff --git a/tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html b/tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html
new file mode 100644
index 00000000000..c9631a1fb75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html
@@ -0,0 +1,400 @@
+<!doctype html>
+<html>
+ <head>
+ <meta content="text/html; charset=utf-8" http-equiv="content-type" />
+ <title>2.8 Common DOM interfaces - Structured Clone Algorithm </title>
+ <link rel="help" href="http://www.w3.org/TR/html5/common-dom-interfaces.html#safe-passing-of-structured-data" />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <div id="log"></div>
+
+<script type="text/javascript">
+ var worker;
+ var testCollection;
+ setup(function()
+ {
+ //the worker is used for each test in sequence
+ //worker's callback will be set for each test
+ //worker's internal onmessage echoes the data back to this thread through postMessage
+ worker = new Worker("./echo.js");
+ testCollection = [
+ function() {
+ var t = async_test("Primitive string is cloned");
+ t.id = 0;
+ worker.onmessage = t.step_func(function(e) {assert_equals("primitive string", e.data, "\"primitive string\" === event.data"); t.done(); });
+ t.step(function() { worker.postMessage("primitive string");});
+ },
+ function() {
+ var t = async_test("Primitive integer is cloned");
+ t.id = 1;
+ worker.onmessage = t.step_func(function(e) {assert_equals(2000, e.data, "2000 === event.data"); t.done(); });
+ t.step(function() { worker.postMessage(2000);});
+ },
+ function() {
+ var t = async_test("Primitive floating point is cloned");
+ t.id = 2;
+ worker.onmessage = t.step_func(function(e) {assert_equals(111.456, e.data, "111.456 === event.data"); t.done(); });
+ t.step(function() { worker.postMessage(111.456);});
+ },
+ function() {
+ var t = async_test("Primitive floating point (negative) is cloned");
+ t.id = 3;
+ worker.onmessage = t.step_func(function(e) {assert_equals(-111.456, e.data, "-111.456 === event.data"); t.done(); });
+ t.step(function() { worker.postMessage(-111.456);});
+ },
+ function() {
+ var t = async_test("Primitive number (hex) is cloned");
+ t.id = 4;
+ worker.onmessage = t.step_func(function(e) {assert_equals(0xAB25, e.data, "0xAB25 === event.data"); t.done(); });
+ t.step(function() { worker.postMessage(0xAB25);});
+ },
+ function() {
+ var t = async_test("Primitive number (scientific) is cloned");
+ t.id = 5;
+ worker.onmessage = t.step_func(function(e) {assert_equals(15e2, e.data, "15e2 === event.data"); t.done(); });
+ t.step(function() { worker.postMessage(15e2);});
+ },
+ function() {
+ var t = async_test("Primitive boolean is cloned");
+ t.id = 6;
+ worker.onmessage = t.step_func(function(e) {assert_equals(false, e.data, "false === event.data"); t.done(); });
+ t.step(function() { worker.postMessage(false);});
+ },
+ function() {
+ var t = async_test("Instance of Boolean is cloned");
+ t.id = 7;
+ var obj;
+ t.step(function() {obj = new Boolean(false);});
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "Boolean === event.data.constructor");
+ assert_equals(obj.valueOf(), e.data.valueOf(), "(new Boolean(false)).valueof() === event.data.valueOf()");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },function() {
+ var t = async_test("Instance of Number is cloned");
+ t.id = 8;
+ var obj;
+ t.step(function() {obj = new Number(2000);});
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "Number === event.data.constructor");
+ assert_equals(obj.valueOf(), e.data.valueOf(), "(new Number(2000)).valueof() === event.data.valueOf()");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Instance of String is cloned");
+ t.id = 9;
+ var obj;
+ t.step(function() { obj = new String("String Object");});
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "String === event.data.constructor");
+ assert_equals(obj.valueOf(), e.data.valueOf(), "(new String(\"String Object\")).valueof() === event.data.valueOf()");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Instance of Date is cloned");
+ t.id = 10;
+ var obj;
+ t.step(function() { obj= new Date(2011,1,1);});
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "Date === event.data.constructor");
+ assert_equals(obj.valueOf(), e.data.valueOf(), "(new Date(2011,1,1)).valueof() === event.data.valueOf()");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Instance of RegExp is cloned");
+ t.id = 11;
+ var obj;
+ t.step(function() {obj = new RegExp("w3+c","g","i");});
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "RegExp === event.data.constructor");
+ assert_equals(obj.source, e.data.source, "canon.source === event.data.source");
+ assert_equals(obj.multiline, e.data.multiline, "canon.multiline === event.data.multiline");
+ assert_equals(obj.global, e.data.global, "canon.global === event.data.global");
+ assert_equals(obj.ignoreCase, e.data.ignoreCase, "canon.ignoreCase === event.data.ignoreCase");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Value 'null' is cloned");
+ t.id = 12;
+ worker.onmessage = t.step_func(function(e) {assert_equals(null, e.data, "null === event.data"); t.done(); });
+ t.step(function() { worker.postMessage(null);});
+ },
+ function() {
+ var t = async_test("Value 'undefined' is cloned");
+ t.id = 13;
+ worker.onmessage = t.step_func(function(e) {assert_equals(undefined, e.data, "undefined === event.data"); t.done(); });
+ t.step(function() { worker.postMessage(undefined);});
+ },
+ function() {
+ var t = async_test("Object properties are cloned");
+ t.id = 14;
+ var obj;
+ t.step(function() {
+ obj= {};
+ obj.a = "test";
+ obj.b = 2;
+ obj["child"] = 3;
+ });
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
+ assert_equals(obj.a, e.data.a, "canon.a === event.data.a");
+ assert_equals(obj.b, e.data.b, "canon.b === event.data.b");
+ assert_equals(obj.child, e.data.child, "canon.child === e.data.child");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Prototype chains are not walked.");
+ t.id = 15;
+ function Custom() {
+ this.a = "hello";
+ }
+
+ var obj;
+ t.step(function() {
+ Object.defineProperty(Custom.prototype, "b", { enumerable: true, value: 100 });
+ obj = new Custom();
+ });
+ worker.onmessage = t.step_func(function(e) {
+ assert_not_equals(obj.constructor, e.data.constructor, "canon.constructor !== event.data.constructor");
+ assert_equals(Object, e.data.constructor, "Object === e.data.constructor");
+ assert_equals(obj.a, e.data.a, "canon.a === e.data.a");
+ assert_equals(undefined, e.data.b, "undefined === e.data.b");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Property descriptors of Objects are not cloned");
+ t.id = 16;
+ var obj;
+ t.step(function() {
+ obj = {};
+ Object.defineProperty(obj, "a", { enumerable: true, writable: false, value: 100 });
+ });
+ worker.onmessage = t.step_func(function(e) {
+ var des = Object.getOwnPropertyDescriptor(e.data, "a");
+ assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
+ assert_true(des.writable, "Descriptor is writable");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Cycles are preserved in Objects");
+ t.id = 17;
+ var obj;
+ t.step(function() {
+ obj = {};
+ obj.a = obj;
+ });
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
+ assert_equals(e.data, e.data.a, "cycle is preserved");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Identity of duplicates is preserved");
+ t.id = 18;
+ var ref;
+ var obj;
+ t.step(function() {
+ ref = {};
+ ref.called = 0;
+ Object.defineProperty(ref, "child", {get: function(){this.called++;}, enumerable: true});
+
+ obj = {a:ref, b:ref};
+ });
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
+ assert_equals(e.data.b.called, 0, "e.data.b.called === 0");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Property order is preserved");
+ t.id = 19;
+ var obj;
+ t.step(function() {
+ obj = { "a": "hello", "b": "w3c", "c": "and world" };
+ obj["a"] = "named1";
+ });
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
+ var canonNames = Object.getOwnPropertyNames(obj);
+ var testNames = Object.getOwnPropertyNames(e.data);
+ for (var i in canonNames) {
+ assert_equals(canonNames[i], testNames[i], "canonProperty["+i+"] === dataProperty["+i+"]");
+ }
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Enumerable properties of Arrays are cloned");
+ t.id = 20;
+ var obj;
+ t.step(function() {
+ obj = [0,1];
+ obj["a"] = "named1";
+ });
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
+ assert_equals(e.data["a"], "named1", "e.data[\"a\"] === \"named1\"");
+ assert_equals(e.data[0], 0, "e.data[0] === 0");
+ assert_equals(e.data[1], 1, "e.data[1] === 1");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Property descriptors of Arrays are not cloned");
+ t.id = 21;
+ var obj;
+ t.step(function() {
+ obj = [0, 1];
+ Object.defineProperty(obj, "2", { enumerable: true, writable: false, value: 100 });
+ });
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
+ assert_equals(e.data[0], 0, "e.data[0] === 0");
+ assert_equals(e.data[1], 1, "e.data[1] === 1");
+ var des = Object.getOwnPropertyDescriptor(e.data, "2");
+ assert_true(des.writable, "Descriptor is writable");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Cycles are preserved in Arrays");
+ t.id = 22;
+ var obj;
+ t.step(function() {
+ obj = [0,1];
+ obj[2] = obj;
+ });
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
+ assert_equals(e.data[0], 0, "e.data[0] === 0");
+ assert_equals(e.data[1], 1, "e.data[1] === 1");
+ assert_equals(e.data[2], e.data, "e.data[2] === e.data");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+
+ function() {
+ var t = async_test("ImageData object can be cloned");
+ t.id = 23;
+ var obj;
+ t.step(function() {
+ var canvas = document.createElement("canvas");
+ canvas.width = 40;
+ canvas.height = 40;
+ var context = canvas.getContext('2d');
+ obj = context.createImageData(40, 40);
+ assert_true(window.hasOwnProperty("ImageData"), "ImageData constructor must be present");
+ assert_true(obj instanceof ImageData, "ImageData must be returned by .createImageData");
+ });
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
+ assert_not_equals(obj, e.data, "cloned object should be a new instance of ImageData");
+ assert_equals(obj.width, e.data.width, "canon.width === e.data.width");
+ assert_equals(obj.height, e.data.height, "canon.height === e.data.height");
+ assert_array_equals(obj.data, e.data.data, "data arrays are the same");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("ImageData expandos are not cloned");
+ t.id = 24;
+ var obj;
+ t.step(function() {
+ var canvas = document.createElement("canvas");
+ canvas.width = 40;
+ canvas.height = 40;
+ var context = canvas.getContext('2d');
+ obj = context.createImageData(40, 40);
+ assert_true(window.hasOwnProperty("ImageData"), "ImageData constructor must be present");
+ assert_true(obj instanceof ImageData, "ImageData must be returned by .createImageData");
+ obj.foo = "bar";
+ });
+ worker.onmessage = t.step_func(function(e) {
+ assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
+ assert_not_equals(obj, e.data, "cloned object should be a new instance of ImageData");
+ assert_equals(obj.width, e.data.width, "canon.width === e.data.width");
+ assert_equals(obj.height, e.data.height, "canon.height === e.data.height");
+ assert_array_equals(obj.data, e.data.data, "data arrays are the same");
+ assert_equals(undefined, e.data.foo, "Expando is lost (undefined === e.data.foo)");
+ t.done();
+ });
+ t.step(function() { worker.postMessage(obj);});
+ },
+ function() {
+ var t = async_test("Window objects cannot be cloned");
+ t.id = 25;
+ worker.onmessage = function() {}; //no op because exception should be thrown.
+ t.step(function() {
+ assert_true(DOMException.hasOwnProperty('DATA_CLONE_ERR'), "DOMException.DATA_CLONE_ERR is present");
+ assert_equals(DOMException.DATA_CLONE_ERR, 25, "DOMException.DATA_CLONE_ERR === 25");
+ assert_throws('DATA_CLONE_ERR', function() {worker.postMessage(window)});
+ });
+ t.done();
+ },
+ function() {
+ var t = async_test("Document objects cannot be cloned");
+ t.id = 26;
+ worker.onmessage = function() {}; //no op because exception should be thrown.
+ t.step(function() {
+ assert_true(DOMException.hasOwnProperty('DATA_CLONE_ERR'), "DOMException.DATA_CLONE_ERR is present");
+ assert_equals(DOMException.DATA_CLONE_ERR, 25, "DOMException.DATA_CLONE_ERR === 25");
+ assert_throws('DATA_CLONE_ERR', function() {worker.postMessage(document)});
+ });
+ t.done();
+ }
+ ];
+ }, {explicit_done:true});
+
+ //Callback for result_callback
+ //queues the next test in the array testCollection
+ //serves to make test execution sequential from the async worker callbacks
+ //alternatively, we would have to create a worker for each test
+ function testFinished(test) {
+ if(test.id < testCollection.length - 1) {
+ //queue the function so that stack remains shallow
+ queue(testCollection[test.id+1]);
+ } else {
+ //when the last test has run, explicitly end test suite
+ done();
+ }
+ }
+ function queue(func) {
+ step_timeout(func, 10);
+ }
+
+ add_result_callback(testFinished);
+ //start the first test manually
+ queue(testCollection[0]);
+
+
+
+
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html b/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html
index 9bc769fec36..394158669b1 100644
--- a/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html
+++ b/tests/wpt/web-platform-tests/html/obsolete/requirements-for-implementations/the-marquee-element-0/marquee-scrolldelay.html
@@ -23,7 +23,9 @@
test(function() {
var mq = document.getElementById("test3");
- assert_equals(mq.scrollDelay, 60, "The delay time should be 60ms.");
+ assert_equals(mq.scrollDelay, 1,
+ "The delay time should be 1ms (although this doesn't " +
+ "match rendering).");
}, "The scrolldelay attribute is less than 60");
test(function() {
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign-ref.xhtml b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign-ref.xhtml
new file mode 100644
index 00000000000..7d21ce11807
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign-ref.xhtml
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign_bottom.xhtml b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign_bottom.xhtml
new file mode 100644
index 00000000000..8610f379388
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign_bottom.xhtml
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign_top.xhtml b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign_top.xhtml
new file mode 100644
index 00000000000..3f022199731
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/colgroup_valign_top.xhtml
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-direction-ref.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-direction-ref.html
new file mode 100644
index 00000000000..2bbd6c04772
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-direction-ref.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>Table direction</title>
+
+<style>
+ table {
+ border-collapse: collapse;
+ }
+
+ td {
+ border: 2px solid black;
+ width: 20px;
+ height: 20px;
+ }
+
+ td.special {
+ border-left: 5px solid green;
+ border-right: 5px solid blue;
+ }
+</style>
+
+Normal table:
+<table>
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+</table>
+
+<hr>
+
+RTL table:
+<table>
+ <tr>
+ <td class="special"></td>
+ <td></td>
+ </tr>
+</table>
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-direction.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-direction.html
new file mode 100644
index 00000000000..a3de4136f12
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-direction.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<link rel="match" href="table-direction-ref.html">
+<title>Table direction</title>
+
+<style>
+ table {
+ border-collapse: collapse;
+ }
+
+ td {
+ border: 2px solid black;
+ width: 20px;
+ height: 20px;
+ }
+
+ td.special {
+ border-left: 5px solid green;
+ border-right: 5px solid blue;
+ }
+</style>
+
+Normal table:
+<table>
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+</table>
+
+<hr>
+
+RTL table:
+<table style="direction: rtl">
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+</table>
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-direction-ref.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-direction-ref.html
new file mode 100644
index 00000000000..dab31636d99
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-direction-ref.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<title>Table row direction</title>
+
+<style>
+ table {
+ border-collapse: collapse;
+ }
+
+ td {
+ border: 2px solid black;
+ width: 20px;
+ height: 20px;
+ }
+
+ td.special {
+ border-left: 5px solid green;
+ border-right: 5px solid blue;
+ }
+</style>
+
+Normal table with LTR and RTL rows:
+<table>
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+</table>
+
+<hr>
+
+RTL table with LTR and RTL rows:
+<table>
+ <tr>
+ <td class="special"></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td class="special"></td>
+ <td></td>
+ </tr>
+</table>
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-direction.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-direction.html
new file mode 100644
index 00000000000..64ed5a667ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-direction.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<link rel="match" href="table-row-direction-ref.html">
+<title>Table row direction</title>
+
+<style>
+ table {
+ border-collapse: collapse;
+ }
+
+ td {
+ border: 2px solid black;
+ width: 20px;
+ height: 20px;
+ }
+
+ td.special {
+ border-left: 5px solid green;
+ border-right: 5px solid blue;
+ }
+</style>
+
+Normal table with LTR and RTL rows:
+<table>
+ <tr style="direction: ltr">
+ <td></td>
+ <td class="special"></td>
+ </tr>
+ <tr style="direction: rtl">
+ <td></td>
+ <td class="special"></td>
+ </tr>
+</table>
+
+<hr>
+
+RTL table with LTR and RTL rows:
+<table style="direction: rtl">
+ <tr style="direction: ltr">
+ <td></td>
+ <td class="special"></td>
+ </tr>
+ <tr style="direction: rtl">
+ <td></td>
+ <td class="special"></td>
+ </tr>
+</table>
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-group-direction-ref.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-group-direction-ref.html
new file mode 100644
index 00000000000..0f3e03f9ba1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-group-direction-ref.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<title>Table row-group direction</title>
+
+<style>
+ table {
+ border-collapse: collapse;
+ }
+
+ td {
+ border: 2px solid black;
+ width: 20px;
+ height: 20px;
+ }
+
+ td.special {
+ border-left: 5px solid green;
+ border-right: 5px solid blue;
+ }
+</style>
+
+Normal table with LTR and RTL row groups:
+<table>
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+</table>
+
+<hr>
+
+RTL table with LTR and RTL row groups:
+<table>
+ <tr>
+ <td class="special"></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td class="special"></td>
+ <td></td>
+ </tr>
+</table>
diff --git a/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-group-direction.html b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-group-direction.html
new file mode 100644
index 00000000000..385672f1279
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/rendering/non-replaced-elements/tables/table-row-group-direction.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<link rel="match" href="table-row-group-direction-ref.html">
+<title>Table row-group direction</title>
+
+<style>
+ table {
+ border-collapse: collapse;
+ }
+
+ td {
+ border: 2px solid black;
+ width: 20px;
+ height: 20px;
+ }
+
+ td.special {
+ border-left: 5px solid green;
+ border-right: 5px solid blue;
+ }
+</style>
+
+Normal table with LTR and RTL row groups:
+<table>
+ <tbody style="direction: ltr">
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+ </tbody>
+ <tbody style="direction: rtl">
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+ </tbody>
+</table>
+
+<hr>
+
+RTL table with LTR and RTL row groups:
+<table style="direction: rtl">
+ <tbody style="direction: ltr">
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+ </tbody>
+ <tbody style="direction: rtl">
+ <tr>
+ <td></td>
+ <td class="special"></td>
+ </tr>
+ </tbody>
+</table>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html
deleted file mode 100644
index 241a8e0fe6e..00000000000
--- a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/moving-documents.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>When moving between documents, must refresh the original document</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-http-equiv-refresh">
-
-<div id="log"></div>
-
-<script>
-"use strict";
-
-const sourceIFrame = document.createElement("iframe");
-const destIFrame = document.createElement("iframe");
-let sourceLoadCount = 0;
-let destLoadCount = 0;
-
-sourceIFrame.onload = () => {
- ++sourceLoadCount;
-
- if (sourceLoadCount === 2) {
- assert_equals(sourceIFrame.contentDocument.body.textContent.trim(), "foo");
- done();
- }
-
- maybeStartTest();
-};
-
-destIFrame.onload = () => {
- ++destLoadCount;
-
- if (destLoadCount === 2) {
- assert_unreached("The iframe into which the meta was moved must not refresh");
- }
-
- maybeStartTest();
-};
-
-function maybeStartTest() {
- if (sourceLoadCount === 1 && destLoadCount === 1) {
- const meta = sourceIFrame.contentDocument.querySelector("meta");
- destIFrame.contentDocument.body.appendChild(meta);
- }
-}
-
-sourceIFrame.src = "support/refresh.sub.html?input=" + encodeURIComponent("1; url=foo");
-destIFrame.src = "support/ufoo";
-
-document.body.appendChild(sourceIFrame);
-document.body.appendChild(destIFrame);
-</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html
index cbfc1803559..f0dade87bd3 100644
--- a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html
@@ -1,5 +1,6 @@
<!doctype html>
<meta charset=utf-8>
+<meta name=timeout content=long>
<title>Parsing of meta refresh</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
@@ -14,14 +15,14 @@ iframe { display:none }
var tests_arr = [
{input: '', expected: []},
- {input: '1', expected: [1, 'refresh.sub.html']},
- {input: '1 ', expected: [1, 'refresh.sub.html']},
- {input: '1\t', expected: [1, 'refresh.sub.html']},
- {input: '1\r', expected: [1, 'refresh.sub.html']},
- {input: '1\n', expected: [1, 'refresh.sub.html']},
- {input: '1\f', expected: [1, 'refresh.sub.html']},
- {input: '1;', expected: [1, 'refresh.sub.html']},
- {input: '1,', expected: [1, 'refresh.sub.html']},
+ {input: '1', expected: [1, '__filename__']},
+ {input: '1 ', expected: [1, '__filename__']},
+ {input: '1\t', expected: [1, '__filename__']},
+ {input: '1\r', expected: [1, '__filename__']},
+ {input: '1\n', expected: [1, '__filename__']},
+ {input: '1\f', expected: [1, '__filename__']},
+ {input: '1;', expected: [1, '__filename__']},
+ {input: '1,', expected: [1, '__filename__']},
{input: '1; url=foo', expected: [1, 'foo']},
{input: '1, url=foo', expected: [1, 'foo']},
{input: '1 url=foo', expected: [1, 'foo']},
@@ -57,7 +58,9 @@ var tests_arr = [
{input: '1; ufoo', expected: [1, 'ufoo']},
{input: '1; "foo"bar', expected: [1, 'foo']},
{input: '; foo', expected: []},
+ {input: ';foo', expected: []},
{input: ', foo', expected: []},
+ {input: ',foo', expected: []},
{input: 'foo', expected: []},
{input: '+1; url=foo', expected: []},
{input: '-1; url=foo', expected: []},
@@ -73,40 +76,57 @@ var tests_arr = [
{input: '-1', expected: []},
{input: '+0', expected: []},
{input: '-0', expected: []},
- {input: '0', expected: [0, 'refresh.sub.html']},
+ {input: '0', expected: [0, '__filename__']},
{input: '1.9; url=foo', expected: [1, 'foo']},
{input: '1.9..5.; url=foo', expected: [1, 'foo']},
- {input: '.9; url=foo', expected: []},
+ {input: '.9; url=foo', expected: [0, 'foo']},
+ {input: '0.9; url=foo', expected: [0, 'foo']},
+ {input: '0...9; url=foo', expected: [0, 'foo']},
+ {input: '0...; url=foo', expected: [0, 'foo']},
+ {input: '1e0; url=foo', expected: []},
+ {input: '1e1; url=foo', expected: []},
+ {input: '10e-1; url=foo', expected: []},
+ {input: '-0.1; url=foo', expected: []},
];
tests_arr.forEach(function(test_obj) {
- async_test(function(t) {
- var iframe = document.createElement('iframe');
- t.add_cleanup(function() {
- document.body.removeChild(iframe);
- });
- iframe.src = 'support/refresh.sub.html?input=' + encodeURIComponent(test_obj.input);
- document.body.appendChild(iframe);
- var loadCount = 0;
- iframe.onload = t.step_func(function() {
- loadCount++;
- var got = iframe.contentDocument.body.textContent.trim();
- if (test_obj.expected.length === 0) {
- assert_equals(got, 'refresh.sub.html');
- if (loadCount === 1) {
- setTimeout(function() {
- t.done();
- }, 3000); // want to make sure it doesn't redirect when it shouldn't
+ ["<meta>", "Refresh header"].forEach(type => {
+ if(type === "Refresh header" && test_obj.input.match("[\n\r\f]")) { // See https://github.com/w3c/wptserve/issues/111 for why \f as well
+ return;
+ }
+ const filename = type === "<meta>" ? "refresh.sub.html" : "refresh.py";
+ async_test(function(t) {
+ var iframe = document.createElement('iframe');
+ t.add_cleanup(function() {
+ document.body.removeChild(iframe);
+ });
+ iframe.src = "support/" + filename + "?input=" + encodeURIComponent(test_obj.input);
+ document.body.appendChild(iframe);
+ var loadCount = 0;
+ iframe.onload = t.step_func(function() {
+ loadCount++;
+ var got = iframe.contentDocument.body.textContent.trim();
+ if (test_obj.expected.length === 0) {
+ assert_equals(got, filename);
+ if (loadCount === 1) {
+ t.step_timeout(function() {
+ t.done();
+ }, 3000); // want to make sure it doesn't redirect when it shouldn't
+ } else {
+ assert_unreached('Got > 1 load events');
+ }
} else {
- assert_unreached('Got > 1 load events');
- }
- } else {
- if (loadCount === 2) {
- assert_equals(got, test_obj.expected[1]);
- t.done();
+ if (loadCount === 2) {
+ if(test_obj.expected[1] === "__filename__") {
+ assert_equals(got, filename);
+ } else {
+ assert_equals(got, test_obj.expected[1]);
+ }
+ t.done();
+ }
}
- }
- });
- }, format_value(test_obj.input));
+ });
+ }, type + ": " + format_value(test_obj.input));
+ });
});
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html
new file mode 100644
index 00000000000..66a067fcd84
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/remove-from-document.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>A meta must refresh the original document even if it was removed.</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#attr-meta-http-equiv-refresh">
+
+<div id="log"></div>
+
+<script>
+"use strict";
+
+const sourceIFrame = document.createElement("iframe");
+let sourceLoadCount = 0;
+
+sourceIFrame.onload = () => {
+ ++sourceLoadCount;
+
+ if (sourceLoadCount === 2) {
+ assert_equals(sourceIFrame.contentDocument.body.textContent.trim(), "foo");
+ done();
+ }
+
+ maybeStartTest();
+};
+
+function maybeStartTest() {
+ if (sourceLoadCount === 1) {
+ sourceIFrame.contentDocument.querySelector("meta").remove();
+ }
+}
+
+sourceIFrame.src = "support/refresh.sub.html?input=" + encodeURIComponent("1; url=foo");
+
+document.body.appendChild(sourceIFrame);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/support/refresh.py b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/support/refresh.py
new file mode 100644
index 00000000000..f68e274c901
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/support/refresh.py
@@ -0,0 +1,4 @@
+def main(request, response):
+ response.headers.set("Content-Type", "text/html")
+ response.headers.set("Refresh", request.GET.first("input"))
+ response.content = "<!doctype html>refresh.py\n"
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_media_change.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_media_change.html
new file mode 100644
index 00000000000..8b7e8440d54
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_media_change.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Dynamically changing HTMLStyleElement.media should change the rendering accordingly</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <link rel="help" href="https://html.spec.whatwg.org/multipage/#the-style-element">
+ <style>
+ span {
+ color: red;
+ }
+ </style>
+ <style id="text-style" media="none">
+ span {
+ color: green;
+ }
+ </style>
+ <style id="body-style" media="aural">
+ body {
+ color: green;
+ }
+ </style>
+ </head>
+ <body>
+ <span>text</span>
+ <script>
+ test(function() {
+ var element = document.querySelector("span");
+ assert_equals(getComputedStyle(element).color, "rgb(255, 0, 0)");
+ document.getElementById("text-style").media = 'all';
+ assert_equals(getComputedStyle(element).color, "rgb(0, 128, 0)");
+ }, "change media value dynamically");
+
+ test(function() {
+ var style = document.getElementById("body-style");
+ assert_not_equals(getComputedStyle(document.querySelector("body")).color, "rgb(0, 128, 0)");
+ style.removeAttribute("media");
+ assert_equals(getComputedStyle(document.querySelector("body")).color, "rgb(0, 128, 0)");
+ }, "removing media attribute");
+ </script>
+ </body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_non_matching_media.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_non_matching_media.html
new file mode 100644
index 00000000000..74d3554b138
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_non_matching_media.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>HTML Test: Non-matching media type should have stylesheet</title>
+ <link rel="help" href="https://html.spec.whatwg.org/multipage/#the-style-element">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <style media="unknown">
+ body { color: green }
+ </style>
+ </head>
+ <body>
+ <script>
+ test(function() {
+ assert_equals(document.styleSheets.length, 1);
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_type.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_type.html
new file mode 100644
index 00000000000..cc48868bd73
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_type.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>&lt;style> type="" edge cases</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/semantics.html#update-a-style-block">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style>
+#test1 { color: rgb(0, 128, 0); }
+</style>
+
+<style type="">
+#test2 { color: rgb(0, 128, 0); }
+</style>
+
+<style type="TEXT/CsS">
+#test3 { color: rgb(0, 128, 0); }
+</style>
+
+<style type=" text/css ">
+#test4 { color: rgb(0, 128, 0); }
+</style>
+
+<style type="text/css; charset=utf-8">
+#test5 { color: rgb(0, 128, 0); }
+</style>
+
+<body>
+
+<div id="test1"></div>
+<div id="test2"></div>
+<div id="test3"></div>
+<div id="test4"></div>
+<div id="test5"></div>
+
+<script>
+"use strict";
+
+test(() => {
+ assertApplied("test1");
+}, "With no type attribute, the style should apply");
+
+test(() => {
+ assertApplied("test2");
+}, "With an empty type attribute, the style should apply");
+
+test(() => {
+ assertApplied("test3");
+}, "With a mixed-case type attribute, the style should apply");
+
+test(() => {
+ assertNotApplied("test4");
+}, "With a whitespace-surrounded type attribute, the style should not apply");
+
+test(() => {
+ assertNotApplied("test5");
+}, "With a charset parameter in the type attribute, the style should not apply");
+
+function getColor(id) {
+ return window.getComputedStyle(document.getElementById(id)).color;
+}
+
+function assertApplied(id) {
+ assert_equals(getColor(id), "rgb(0, 128, 0)");
+}
+
+function assertNotApplied(id) {
+ assert_not_equals(getColor(id), "rgb(0, 128, 0)");
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_type_change.html b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_type_change.html
new file mode 100644
index 00000000000..a19b3c86d75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/document-metadata/the-style-element/style_type_change.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Dynamically changing HTMLStyleElement.type should change the rendering accordingly</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <link rel="help" href="https://html.spec.whatwg.org/multipage/#the-style-element">
+ <style type="no/mime">
+ body { color: green }
+ </style>
+ </head>
+ <body>
+ Text content.
+ <script>
+ var style = document.querySelector("style");
+ test(function() {
+ assert_equals(document.styleSheets.length, 0);
+ }, "Check initial styleSheets length type");
+
+ test(function() {
+ assert_not_equals(getComputedStyle(document.querySelector("body")).color, "rgb(0, 128, 0)");
+ assert_equals(document.styleSheets.length, 0);
+ style.type = "text/css";
+ assert_equals(getComputedStyle(document.querySelector("body")).color, "rgb(0, 128, 0)");
+ assert_equals(document.styleSheets.length, 1);
+ }, "Change type from invalid type to valid type");
+
+ test(function() {
+ assert_equals(getComputedStyle(document.querySelector("body")).color, "rgb(0, 128, 0)");
+ assert_equals(document.styleSheets.length, 1);
+ style.type = "no/mime";
+ assert_not_equals(getComputedStyle(document.querySelector("body")).color, "rgb(0, 128, 0)");
+ assert_equals(document.styleSheets.length, 0);
+ }, "Change type from valid type to invalid type");
+
+ </script>
+ </body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/historical.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/historical.html
index 45192340858..efdd90f7b15 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/historical.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/historical.html
@@ -35,6 +35,7 @@ t('startOffsetTime'); // added in r5310, replaced with startDate in r7045.
t('initialTime'); // added in r5310, removed in r7046.
t('audio', 'video'); // added in r5636, replaced with muted in r5991.
t('startDate'); // added in r7045, replaced with getStartDate() in r8113.
+t('mozSrcObject'); // never in the spec
// TextTrackCue constructor: added in r5723, removed in r7742.
test(function() {
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/mime-types/canPlayType.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/mime-types/canPlayType.html
index c5d37e75206..4f94cddc708 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/mime-types/canPlayType.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/mime-types/canPlayType.html
@@ -52,6 +52,9 @@ function type_codecs_test(type, audioCodecs, videoCodecs) {
// Spec: Generally, a user agent should never return "probably" for a type
// that allows the codecs parameter if that parameter is not present.
t(type, 'maybe');
+ t(type + ';', 'maybe');
+ t(type + ';codecs', 'maybe');
+ t(type + ';codecs=', 'maybe');
typeSupported = true;
}, type + ' (optional)');
@@ -87,7 +90,7 @@ function type_codecs_test(type, audioCodecs, videoCodecs) {
});
});
}, type + ' codecs order');
- }
+ }
test(function() {
t(mime(type, ['bogus']), '');
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html
index fa11d9944a6..d8e14b5fc17 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/playing-the-media-resource/playbackRate.html
@@ -9,11 +9,45 @@ test(function() {
assert_equals(v.playbackRate, 1);
}, 'playbackRate initial value');
-async_test(function(t) {
+function testPlaybackRateHelper(t, newPlaybackRate) {
var v = document.createElement('video');
- v.playbackRate = 2;
- v.addEventListener('ratechange', t.step_func(function() {
- t.done();
+ var initialRate = v.playbackRate;
+
+ v.addEventListener('ratechange', t.step_func_done(function() {
+ assert_equals(v.playbackRate, newPlaybackRate);
}));
-}, 'setting playbackRate');
+
+ try {
+ v.playbackRate = newPlaybackRate;
+ } catch(e) {
+ assert_equals(e.name, 'NotSupportedError');
+ assert_equals(v.playbackRate, initialRate);
+ t.done();
+ }
+}
+
+async_test(function(t) {
+ testPlaybackRateHelper(this, 3);
+}, "playbackRate set to small positive value");
+
+async_test(function(t) {
+ testPlaybackRateHelper(this, 100);
+}, "playbackRate set to large positive value");
+
+async_test(function(t) {
+ testPlaybackRateHelper(this, -3);
+}, "playbackRate set to small negative value");
+
+async_test(function(t) {
+ testPlaybackRateHelper(this, -100);
+}, "playbackRate set to large negative value");
+
+async_test(function(t) {
+ testPlaybackRateHelper(this, 0);
+}, "playbackRate set to 0");
+
+async_test(function(t) {
+ testPlaybackRateHelper(this, -1);
+}, "playbackRate set to -1");
+
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-order.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-order.html
new file mode 100644
index 00000000000..58e11ebe701
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-cue-order.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<title>Text track cue order</title>
+<link rel="help" href="https://html.spec.whatwg.org/#text-track-cue-order">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+function concat_cuetext(cues) {
+ return Array.prototype.reduce.call(cues, function(acc, value) {
+ return acc + value.text;
+ }, "");
+}
+
+setup(function() {
+ window.video = document.createElement('video');
+});
+
+test(function() {
+ let track = video.addTextTrack('subtitles');
+ track.addCue(new VTTCue(8, 9, '1'));
+ track.addCue(new VTTCue(4, 5, '2'));
+ track.addCue(new VTTCue(2, 3, '3'));
+ assert_equals(concat_cuetext(track.cues), '321');
+}, document.title + ', decreasing start times.');
+
+test(function() {
+ let track = video.addTextTrack('subtitles');
+ track.addCue(new VTTCue(2, 9, '1'));
+ track.addCue(new VTTCue(2, 3, '2'));
+ track.addCue(new VTTCue(2, 5, '3'));
+ assert_equals(concat_cuetext(track.cues), '132');
+}, document.title + ', equal start times varying end times.');
+
+test(function() {
+ let track = video.addTextTrack('subtitles');
+ track.addCue(new VTTCue(2, 3, '1'));
+ track.addCue(new VTTCue(2, 3, '2'));
+ track.addCue(new VTTCue(2, 3, '3'));
+ assert_equals(concat_cuetext(track.cues), '123');
+}, document.title + ', equal start and end times.');
+
+test(function() {
+ let track = video.addTextTrack('subtitles');
+ track.addCue(new VTTCue(2, 5, '1'));
+ track.addCue(new VTTCue(2, 5, '2'));
+ track.addCue(new VTTCue(2, 5, '3'));
+ assert_equals(concat_cuetext(track.cues), '123', 'initial order');
+
+ let cue = track.cues[0];
+ track.removeCue(cue);
+ assert_equals(concat_cuetext(track.cues), '23', '"1" removed');
+
+ track.addCue(cue);
+ assert_equals(concat_cuetext(track.cues), '231', '"1" reinserted');
+}, document.title + ', after re-insertion.');
+
+test(function() {
+ let track = video.addTextTrack('subtitles');
+ track.addCue(new VTTCue(2, 5, '1'));
+ track.addCue(new VTTCue(2, 5, '2'));
+ track.addCue(new VTTCue(2, 5, '3'));
+ assert_equals(concat_cuetext(track.cues), '123', 'initial order');
+
+ track.cues[0].startTime = 4;
+ assert_equals(concat_cuetext(track.cues), '231', '"1" moved last');
+
+ track.cues[2].startTime = 2;
+ assert_equals(concat_cuetext(track.cues), '123', '"1" moved first');
+}, document.title + ', equal start and end times with startTime mutations.');
+
+test(function() {
+ let track = video.addTextTrack('subtitles');
+ track.addCue(new VTTCue(2, 5, '1'));
+ track.addCue(new VTTCue(2, 5, '2'));
+ track.addCue(new VTTCue(2, 5, '3'));
+ assert_equals(concat_cuetext(track.cues), '123', 'initial order');
+
+ track.cues[2].endTime = 9;
+ assert_equals(concat_cuetext(track.cues), '312', '"3" moved first');
+
+ track.cues[1].endTime = 3;
+ assert_equals(concat_cuetext(track.cues), '321', '"1" moved last');
+}, document.title + ', equal start and end times with endTime mutations.');
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-data-url.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-data-url.html
new file mode 100644
index 00000000000..26ff90d56da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/media-elements/track/track-element/track-data-url.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<title>track element data: URL</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+<script>
+[null, "anonymous", "use-credentials"].forEach(function(crossOriginValue) {
+ async_test(function() {
+ var video = document.createElement('video');
+ if (crossOriginValue !== null) {
+ video.setAttribute('crossorigin', crossOriginValue);
+ }
+ document.body.appendChild(video);
+ var t = document.createElement('track');
+ t.onload = this.step_func_done(function() {
+ assert_equals(t.track.cues.length, 1);
+ assert_equals(t.track.cues[0].startTime, 1);
+ assert_equals(t.track.cues[0].endTime, 2);
+ assert_equals(t.track.cues[0].id, 'x');
+ assert_equals(t.track.cues[0].text, 'test');
+ });
+ t.onerror = this.step_func(function() {
+ assert_unreached('got error event');
+ });
+ t.src = 'data:text/vtt,'+encodeURIComponent('WEBVTT\n\nx\n00:00:01.000 --> 00:00:02.000\ntest\n\n');
+ t.track.mode = 'showing';
+ video.appendChild(t);
+ }, document.title + ' ' + (crossOriginValue ? crossOriginValue : 'No CORS'));
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/security.reset.cross.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/security.reset.cross.html
index 617c3404b6b..6d351925a77 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/security.reset.cross.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/security.reset.cross.html
@@ -8,7 +8,7 @@
<body class="show_output">
<h1>security.reset.cross</h1>
-<p class="desc">Resetting the canvas state does not reset the origin-clean flag</p>
+<p class="desc">Resetting the canvas state resets the origin-clean flag</p>
<p class="output">Actual output:</p>
@@ -16,14 +16,16 @@
<ul id="d"></ul>
<script>
-var t = async_test("Resetting the canvas state does not reset the origin-clean flag");
+var t = async_test("Resetting the canvas state resets the origin-clean flag");
_addTest(function(canvas, ctx) {
canvas.width = 50;
ctx.drawImage(document.getElementById('yellow.png'), 0, 0);
assert_throws("SECURITY_ERR", function() { canvas.toDataURL(); });
canvas.width = 100;
-assert_throws("SECURITY_ERR", function() { canvas.toDataURL(); });
+canvas.toDataURL();
+ctx.getImageData(0, 0, 1, 1);
+_assert(true, "true"); // okay if there was no exception
});
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/security.reset.redirect.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/security.reset.redirect.html
index 75b42d90954..bca6b86c43e 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/security.reset.redirect.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-canvas-element/security.reset.redirect.html
@@ -8,7 +8,7 @@
<body class="show_output">
<h1>security.reset.redirect</h1>
-<p class="desc">Resetting the canvas state does not reset the origin-clean flag</p>
+<p class="desc">Resetting the canvas state resets the origin-clean flag</p>
<p class="output">Actual output:</p>
@@ -16,14 +16,16 @@
<ul id="d"></ul>
<script>
-var t = async_test("Resetting the canvas state does not reset the origin-clean flag");
+var t = async_test("Resetting the canvas state resets the origin-clean flag");
_addTest(function(canvas, ctx) {
canvas.width = 50;
ctx.drawImage(document.getElementById('yellow.png'), 0, 0);
assert_throws("SECURITY_ERR", function() { canvas.toDataURL(); });
canvas.width = 100;
-assert_throws("SECURITY_ERR", function() { canvas.toDataURL(); });
+canvas.toDataURL();
+ctx.getImageData(0, 0, 1, 1);
+_assert(true, "true"); // okay if there was no exception
});
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html
new file mode 100644
index 00000000000..b0875ec6b91
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Check that sandboxed iframe can perform navigation on the top frame
+ when allow-top-navigation is set</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <iframe sandbox="allow-top-navigation allow-scripts"></iframe>
+ <script>
+ if (opener) {
+ // We're the popup (i.e. a top frame). Load into the iframe the page
+ // trying to modifying the top frame and transmit the result to our
+ // opener.
+ onmessage = function(e) {
+ opener.postMessage(e.data, "*")
+ }
+ document.querySelector("iframe").src = "support/iframe-that-performs-top-navigation-on-popup.html";
+ } else {
+ // We are the main test page. Open ourselves as a popup, so that we can
+ // can experiment navigation of the top frame.
+ async_test(t => {
+ window.addEventListener("message", t.step_func_done(e => {
+ assert_equals(e.data, "can navigate");
+ e.source.close();
+ }));
+ window.open(location.href);
+ }, "Frames with `allow-top-navigation` should be able to navigate the top frame.");
+ }
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html
new file mode 100644
index 00000000000..6113c6c3478
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-2.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Check that sandboxed iframe cannot perform navigation on the top
+ frame when allow-top-navigation is not set</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <iframe sandbox="allow-scripts"></iframe>
+ <script>
+ if (opener) {
+ // We're the popup (i.e. a top frame). Load into the iframe the page
+ // trying to modifying the top frame and transmit the result to our
+ // opener.
+ onmessage = function(e) {
+ opener.postMessage(e.data, "*")
+ }
+ document.querySelector("iframe").src = "support/iframe-that-performs-top-navigation-on-popup.html";
+ } else {
+ // We are the main test page. Open ourselves as a popup, so that we can
+ // can experiment navigation of the top frame.
+ async_test(t => {
+ window.addEventListener("message", t.step_func_done(e => {
+ assert_equals(e.data, "cannot navigate");
+ e.source.close();
+ }));
+ window.open(location.href);
+ }, "Frames without `allow-top-navigation` should not be able to navigate the top frame.");
+ }
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html
new file mode 100644
index 00000000000..9de5d53466e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Check that sandboxed iframe can perform navigation on the top frame
+ when allow-top-navigation is set (even when
+ allow-top-navigation-by-user-activation is set)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <!-- Specifying both allow-top-navigation and
+ allow-top-navigation-by-user-activation is a document conformance
+ error: allow-top-navigation-by-user-activation will have no effect. -->
+ <iframe sandbox="allow-top-navigation allow-top-navigation-by-user-activation allow-scripts"></iframe>
+ <script>
+ if (opener) {
+ // We're the popup (i.e. a top frame). Load into the iframe the page
+ // trying to modifying the top frame and transmit the result to our
+ // opener.
+ onmessage = function(e) {
+ opener.postMessage(e.data, "*")
+ }
+ document.querySelector("iframe").src = "support/iframe-that-performs-top-navigation-on-popup.html";
+ } else {
+ // We are the main test page. Open ourselves as a popup, so that we can
+ // can experiment navigation of the top frame.
+ async_test(t => {
+ window.addEventListener("message", t.step_func_done(e => {
+ assert_equals(e.data, "can navigate");
+ e.source.close();
+ }));
+ window.open(location.href);
+ }, "Frames with `allow-top-navigation` should be able to navigate the top frame even when `allow-top-navigation-by-user-activation` is set.");
+ }
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html
new file mode 100644
index 00000000000..4cf48184c9b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-1.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Check that sandboxed iframe can not navigate their ancestors</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.data, "can not navigate", "Should have the right message");
+ });
+</script>
+<iframe sandbox="allow-scripts" src="support/iframe-tried-to-be-navigated-by-its-child.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html
new file mode 100644
index 00000000000..159491c73ca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_ancestor-2.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Check that unsandboxed iframe can navigate their ancestors</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.data, "can navigate", "Should have the right message");
+ });
+</script>
+<iframe src="support/iframe-tried-to-be-navigated-by-its-child.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html
new file mode 100644
index 00000000000..0934adfa82a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_descendants.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Check that sandboxed iframe can navigate their descendants</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.data, "can navigate", "Should have the right message");
+ });
+</script>
+<iframe sandbox="allow-scripts" src="support/iframe-trying-to-navigate-its-child.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html
new file mode 100644
index 00000000000..12c4e0ca502
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigate_itself.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Check that sandboxed iframe can navigate itself</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.data, "can navigate", "Should have the right message");
+ });
+</script>
+<iframe sandbox="allow-scripts" src="support/iframe-trying-to-navigate-itself.html"></iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_001.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_001.htm
new file mode 100644
index 00000000000..97af61163a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_001.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Allow script execution inside iframe with sandbox attribute when sandbox="allow-scripts".</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-scripts-browsing-context-flag" />
+ <meta name="assert" content="Allow script execution inside iframe with sandbox attribute when sandbox='allow-scripts'." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Allow script execution inside iframe with sandbox attribute when sandbox='allow-scripts'.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "script ran");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 8000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <iframe src="support/iframe_sandbox_001.htm" sandbox="allow-scripts" style="display: none"></iframe>
+ <div id=log></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_002.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_002.htm
new file mode 100644
index 00000000000..42916742751
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_002.htm
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Allow autoplay for HTML5 Video inside iframe with sandbox attribute if sandbox='allow-scripts'.</title>
+ <meta name=timeout content=long>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script>
+ async_test(function (t) {
+ var callback = t.step_func_done(function(event) {
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "play event fired");
+ });
+
+ window.addEventListener("message", callback, false);
+ }, "Allow autoplay for HTML5 Video inside iframe with sandbox attribute if sandbox='allow-scripts'.");
+ </script>
+ <iframe src="support/iframe_sandbox_002.htm" sandbox="allow-scripts" style="display: none"></iframe>
+ <div id=log></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_003-manual.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_003-manual.htm
new file mode 100644
index 00000000000..6363900bed1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_003-manual.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Block autofocus on form control inside iframe with sandbox attribute.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-automatic-features-browsing-context-flag" />
+ <meta name="assert" content="Block autofocus on form control inside iframe with sandbox attribute." />
+ <script src="support/sandbox_helper.js" type="text/javascript"></script>
+</head>
+<body>
+ <pre>Description: Block autofocus on form controls inside iframe with sandbox attribute.</pre>
+ <table id='testtable' border='1'>
+ <tr>
+ <td>Test Result</td>
+ <td>Test Assertion</td>
+ </tr>
+ <tr>
+ <td id='test_0_result'>Manual</td>
+ <td id='test_0_assertion'>Test passes if caret (text cursor) is not on the textbox in the below iframe.</td>
+ </tr>
+ </table>
+ <br />
+ <div id="testframe">
+ <pre>iframe with sandbox</pre>
+ <iframe src="support/iframe_sandbox_003.htm" sandbox style="height: 100px; width: 400px;"></iframe>
+ </div>
+ <script type="text/javascript">
+ DisableTestForNonSupportingBrowsers();
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_004-manual.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_004-manual.htm
new file mode 100644
index 00000000000..4d0759531f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_004-manual.htm
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Block plugins inside iframe with sandbox attribute.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-plugins-browsing-context-flag" />
+ <meta name="assert" content="Block plugins inside iframe with sandbox attribute." />
+ <script src="support/sandbox_helper.js" type="text/javascript"></script>
+</head>
+<body>
+ <pre>Description: Block plugins inside iframe with sandbox attribute.</pre>
+ <table id='testtable' border='1'>
+ <tr>
+ <td>Test Result</td>
+ <td>Test Assertion</td>
+ </tr>
+ <tr>
+ <td id='test_0_result'>Manual</td>
+ <td id='test_0_assertion'>Test passes if you DO NOT see the 'Sample PDF For Testing' pdf below or 'FAIL'.<br>
+ Test requires that a pdf plugin has been installed!</td>
+ </tr>
+ </table>
+ <br />
+ <div id="testframe">
+ <pre>iframe with sandbox</pre>
+ <iframe sandbox src="support/iframe_sandbox_004.htm" height="400" width ="600"></iframe>
+ </div>
+ <script type="text/javascript">
+ DisableTestForNonSupportingBrowsers();
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_005.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_005.htm
new file mode 100644
index 00000000000..32b965c0b23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_005.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Block script execution inside iframe with sandbox attribute.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-scripts-browsing-context-flag" />
+ <meta name="assert" content="Block script execution inside iframe with sandbox attribute." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Block script execution inside iframe with sandbox attribute.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_true(!event);
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <iframe src="support/iframe_sandbox_001.htm" sandbox style="display: none"></iframe>
+ <div id=log></div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_006-manual.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_006-manual.htm
new file mode 100644
index 00000000000..1935f439f83
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_006-manual.htm
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>HTML5 Sandbox: Allow form submission inside sandbox iframe when sandbox='allow-forms'</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-forms-browsing-context-flag" />
+ <meta name="assert" content="Allow form submission inside sandbox iframe when sandbox='allow-forms'." />
+ <script src="support/sandbox_helper.js" type="text/javascript"></script>
+</head>
+<body>
+ <pre>Description: Allow form submission inside iframe with sandbox attribute if sandbox='allow-forms'.</pre>
+ <table id='testtable' border='1'>
+ <tr>
+ <td>Test Result</td>
+ <td>Test Assertion</td>
+ </tr>
+ <tr>
+ <td id='test_0_result'>Manual</td>
+ <td id='test_0_assertion'>
+ <div>Steps:</div>
+ <div>1. Click button "Submit Form".</div>
+ <br />
+ <div>Test passes if there is no red on the page and if the word "PASS" appears in the below iframe after following the above steps.</div>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <div id="testframe">
+ <pre>iframe with sandbox="allow-forms"</pre>
+ <iframe src="support/iframe_sandbox_006.htm" sandbox="allow-forms" style="height: 100px; width: 300px;"></iframe>
+ </div>
+ <script type="text/javascript">
+ DisableTestForNonSupportingBrowsers();
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_007-manual.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_007-manual.htm
new file mode 100644
index 00000000000..dfed9a6f0f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_007-manual.htm
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>HTML5 Sandbox: Block form submission inside sandbox iframe</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-forms-browsing-context-flag" />
+ <meta name="assert" content="Block form submission inside sandbox iframe." />
+ <script src="support/sandbox_helper.js" type="text/javascript"></script>
+</head>
+<body>
+ <pre>Description: Block form submission inside iframe with sandbox attribute.</pre>
+ <table id='testtable' border='1'>
+ <tr>
+ <td>Test Result</td>
+ <td>Test Assertion</td>
+ </tr>
+ <tr>
+ <td id='test_0_result'>Manual</td>
+ <td id='test_0_assertion'>
+ <div>Steps:</div>
+ <div>1. Click button "Submit Form".</div>
+ <br />
+ <div>Test passes if there is no red on the page and there is no navigation in the below iframe after following the above steps.</div>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <div id="testframe">
+ <pre>iframe with sandbox="allow-scripts allow-same-origin allow-top-navigation"</pre>
+ <iframe src="support/iframe_sandbox_007.htm" sandbox="allow-scripts allow-same-origin allow-top-navigation" style="height: 100px; width: 300px;"></iframe>
+ </div>
+ <script type="text/javascript">
+ DisableTestForNonSupportingBrowsers();
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_008-manual.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_008-manual.htm
new file mode 100644
index 00000000000..9e479a78996
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_008-manual.htm
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Allow sandboxed iframe content to navigate the sandboxed browsing context itself.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-navigation-browsing-context-flag" />
+ <meta name="assert" content="Allow sandboxed iframe content to navigate the sandboxed browsing context itself." />
+ <script src="support/sandbox_helper.js" type="text/javascript"></script>
+</head>
+<body>
+ <pre>Description: Allow sandboxed iframe content to navigate the sandboxed browsing context itself.</pre>
+ <table id='testtable' border='1'>
+ <tr>
+ <td>Test Result</td>
+ <td>Test Assertion</td>
+ </tr>
+ <tr>
+ <td id='test_0_result'>Manual</td>
+ <td id='test_0_assertion'>
+ <div>Steps:</div>
+ <div>1. Click link "Click here to perform self navigation".</div>
+ <br />
+ <div>Test passes if there is no red on the page and the word "PASS" appears in the below iframe after following the above steps.</div>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <div id="testframe">
+ <pre>iframe with sandbox=""</pre>
+ <iframe id="iframe1" name="iframe1" src="support/iframe_sandbox_008.htm" sandbox="" style="height: 100px; width: 350px;"></iframe>
+ </div>
+ <script type="text/javascript">
+ DisableTestForNonSupportingBrowsers();
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_010-manual.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_010-manual.htm
new file mode 100644
index 00000000000..41802be7756
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_010-manual.htm
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Block window.open() API inside iframe with sandbox attribute.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-navigation-browsing-context-flag" />
+ <meta name="assert" content="Block window.open() API inside iframe with sandbox attribute." />
+ <script src="support/sandbox_helper.js" type="text/javascript"></script>
+</head>
+<body>
+ <pre>Description: Block window.open() API inside iframe with sandbox attribute.</pre>
+ <table id='testtable' border='1'>
+ <tr>
+ <td>Test Result</td>
+ <td>Test Assertion</td>
+ </tr>
+ <tr>
+ <td id='test_0_result'>Manual</td>
+ <td id='test_0_assertion'>
+ <div>Steps:</div>
+ <div>1. Click button "Click here to call window.open() API".</div>
+ <br />
+ <div>Test passes if there is no red on the page and no new window opens. The user agent may offer the user the option of allowing a new window to open.</div>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <div id="testframe">
+ <pre>iframe with sandbox="allow-scripts allow-same-origin allow-forms allow-top-navigation"</pre>
+ <iframe src="support/iframe_sandbox_010.htm" sandbox="allow-scripts allow-same-origin allow-forms allow-top-navigation" style="height: 100px; width: 450px;"></iframe>
+ </div>
+ <script type="text/javascript">
+ DisableTestForNonSupportingBrowsers();
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_011.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_011.htm
index ce3ee1a7d01..ce3ee1a7d01 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_011.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_011.htm
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_012.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_012.htm
new file mode 100644
index 00000000000..7642162d5a1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_012.htm
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
+ <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "cookies are R/W");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+
+ <iframe style="display:none" src="support/iframe_sandbox_012.htm" sandbox=" Allow-Scripts Allow-Same-Origin "></iframe>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_013.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_013.htm
new file mode 100644
index 00000000000..c4349897065
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_013.htm
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
+ <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "cookies are R/W");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+
+ <iframe style="display:none" src="support/iframe_sandbox_012.htm" sandbox="
+ allow-scripts
+ allow-same-origin
+ "></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_014.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_014.htm
new file mode 100644
index 00000000000..d979c919773
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_014.htm
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
+ <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "cookies are R/W");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+
+ <iframe style="display:none" src="support/iframe_sandbox_012.htm" sandbox=" allow-scripts allow-same-origin "></iframe>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_015.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_015.htm
new file mode 100644
index 00000000000..6fd5405c73b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_015.htm
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
+ <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "cookies are R/W");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+
+ <iframe style="display:none" src="support/iframe_sandbox_012.htm" sandbox="&#32ALLOW-SCRIPTS&#32allow-same-origin&#32"></iframe>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_016.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_016.htm
new file mode 100644
index 00000000000..4c5f043d2b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_016.htm
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
+ <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
+
+ function callback(event)
+ {
+ t.step(function() {
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "cookies are R/W");
+ });
+ t.done();
+ }
+
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+
+ <iframe style="display:none" src="support/iframe_sandbox_012.htm" sandbox="&#13ALLOW-SCRIPTS&#13allow-same-origin&#13"></iframe>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_017.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_017.htm
new file mode 100644
index 00000000000..f46f22e15b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_017.htm
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
+ <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "cookies are R/W");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+
+ <iframe style="display:none" src="support/iframe_sandbox_012.htm" sandbox="&#12ALLOW-SCRIPTS&#12allow-same-origin&#12"></iframe>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_018.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_018.htm
new file mode 100644
index 00000000000..b5e5927ce42
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_018.htm
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
+ <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "cookies are R/W");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+
+ <iframe style="display:none" src="support/iframe_sandbox_012.htm" sandbox="&#10ALLOW-SCRIPTS&#10allow-same-origin&#10"></iframe>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_019.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_019.htm
new file mode 100644
index 00000000000..a503531f814
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_019.htm
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
+ <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "cookies are R/W");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+
+ <iframe style="display:none" src="support/iframe_sandbox_012.htm" sandbox="&#9ALLOW-SCRIPTS&#9allow-same-origin&#9"></iframe>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_020-manual.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_020-manual.htm
new file mode 100644
index 00000000000..ed46b3b298c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_020-manual.htm
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
+ <meta name="assert" content="Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe." />
+ <script src="support/sandbox_helper.js" type="text/javascript"></script>
+</head>
+<body>
+ <pre>Description: Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe.</pre>
+ <div>This test is to verify script is blocked inside nested iframes if the top-most sandbox iframe has no 'allow-scripts' token.</div>
+ <br />
+ <table id='testtable' border='1'>
+ <tr>
+ <td>Test Result</td>
+ <td>Test Assertion</td>
+ </tr>
+ <tr>
+ <td id='test_0_result'>Manual</td>
+ <td id='test_0_assertion'>Test passes if there is no red on the page.</td>
+ </tr>
+ </table>
+ <br />
+ <div id="testframe">
+ <div style="font-weight:bold">Top-most iframe with sandbox=""</div>
+ <iframe id="iframe1" name="iframe1" src="support/iframe_sandbox_020.htm" sandbox="" style="height: 330px; width: 400px;"></iframe>
+ </div>
+ <script type="text/javascript">
+ DisableTestForNonSupportingBrowsers();
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_021-manual.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_021-manual.htm
new file mode 100644
index 00000000000..0d149d39740
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_021-manual.htm
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
+ <meta name="assert" content="Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe." />
+ <script src="support/sandbox_helper.js" type="text/javascript"></script>
+</head>
+<body>
+ <pre>Description: Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe.</pre>
+ <div>This test is to verify script is allowed inside nested iframes if any of the conditions below are true</div>
+ <div>1. both parent sandbox and child sandbox have 'allow-scripts' token.</div>
+ <div>2. parent sandbox has 'allow-scripts' token and nested child iframe has no sandbox attribute.</div>
+ <div>3. parent iframe has no sandbox attribute and child iframe has sandbox='allow-scripts' token.</div>
+ <div>4. both parent and child iframes have no sandbox attribute.</div>
+ <br />
+ <table id='testtable' border='1'>
+ <tr>
+ <td>Test Result</td>
+ <td>Test Assertion</td>
+ </tr>
+ <tr>
+ <td id='test_0_result'>Manual</td>
+ <td id='test_0_assertion'>Test passes if there is no red on the page.</td>
+ </tr>
+ </table>
+ <br />
+ <div id="testframe">
+ <div style="float: left; border: 1px solid; padding: 5px;">
+ <div style="font-weight: bold">Top-most iframe with sandbox="allow-scripts"</div>
+ <iframe id="iframe1" src="support/iframe_sandbox_021.htm" sandbox="allow-scripts" style="height: 330px; width: 400px;"></iframe>
+ </div>
+ <div style="float: left; border: 1px solid; padding: 5px; margin-left: 20px;">
+ <div style="font-weight: bold">Top-most iframe without sandbox attribute</div>
+ <iframe id="iframe2" src="support/iframe_sandbox_021.htm" style="height: 330px; width: 400px;"></iframe>
+ </div>
+ </div>
+ <script type="text/javascript">
+ DisableTestForNonSupportingBrowsers();
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_022-manual.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_022-manual.htm
new file mode 100644
index 00000000000..ebfca06a613
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_022-manual.htm
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: allow sandbox iframe to navigate their top-level browsing context if sandbox="allow-top-navigation".</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-scripts-browsing-context-flag" />
+ <meta name="assert" content="Allow sandbox iframe to navigate their top-level browsing context if sandbox='allow-top-navigation'." />
+ <script src="support/sandbox_helper.js" type="text/javascript"></script>
+</head>
+<body>
+ <pre>Description: Allow sandbox iframe to navigate its top-level browsing context if sandbox='allow-top-navigation'.</pre>
+ <table id='testtable' border='1'>
+ <tr>
+ <td>Test Result</td>
+ <td>Test Assertion</td>
+ </tr>
+ <tr>
+ <td id='test_0_result'>Manual</td>
+ <td id='test_0_assertion'>
+ <div>Steps:</div>
+ <div>1. Click link "Open the link in top window".</div>
+ <br />
+ <div>Test passes if there is no red on the page and no top-level navigation after following the above steps.</div>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <div id="testframe">
+ <pre>iframe with sandbox="allow-top-navigation"</pre>
+ <iframe src="support/iframe_sandbox_022.htm" sandbox="allow-top-navigation" style="height: 100px; width: 450px;"></iframe>
+ </div>
+ <script type="text/javascript">
+ DisableTestForNonSupportingBrowsers();
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_023.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_023.htm
new file mode 100644
index 00000000000..78cf35d2bb8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_023.htm
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>HTML5 Sandbox: Allow sandbox iframe to access other content from the same origin if sandbox="allow-same-origin".</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
+ <meta name="assert" content=" Allow sandbox iframe to access other content from the same origin if sandbox='allow-same-origin'." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Allow sandbox iframe to access other content from the same origin if sandbox='allow-same-origin'");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "window.parent.document");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <iframe src="support/iframe_sandbox_023.htm" sandbox="allow-scripts allow-same-origin" style="display:none"></iframe>
+ <div id=log></div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_024.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_024.htm
new file mode 100644
index 00000000000..530162e5b34
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_024.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>HTML5 Sandbox: document.cookie access is allowed inside iframe with sandbox="allow-same-origin".</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
+ <meta name="assert" content="document.cookie access is allowed inside iframe with sandbox='allow-same-origin'." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("document.cookie access is allowed inside iframe with sandbox='allow-same-origin'.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "cookies are R/W");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+ <iframe src="support/iframe_sandbox_024.htm" sandbox="allow-scripts allow-same-origin" style="display:none"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_025.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_025.htm
new file mode 100644
index 00000000000..96783062bf1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_025.htm
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Allow parent content to access sandbox child iframe content when sandbox='allow-same-origin</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
+ <meta name="assert" content="Allow parent content to access sandbox child iframe content when sandbox='allow-same-origin'" />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Allow parent content to access sandbox child iframe content when sandbox='allow-same-origin'");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(document.getElementById('sandboxIframe').contentDocument.title, "Page with a message");
+ });
+ t.done();
+ }
+ </script>
+ <div id=log></div>
+
+ <iframe id='sandboxIframe' src="support/standalone-iframe-content.htm" sandbox="allow-same-origin" onload="callback()" style="display : none"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_026.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_026.htm
new file mode 100644
index 00000000000..694a43dad30
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_026.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>HTML5 Sandbox: Allow localStorage and sessionStorage access inside iframe with sandbox='allow-same-origin allow-scripts'.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
+ <meta name="assert" content="Allow localStorage and sessionStorage access inside iframe with sandbox='allow-same-origin allow-scripts'." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Allow localStorage and sessionStorage access inside iframe with sandbox='allow-same-origin allow-scripts'");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "access to window.localStorage and window.sessionStorage");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+ <iframe src="support/iframe_sandbox_026.htm" sandbox="allow-scripts allow-same-origin" style="display : none"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_027.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_027.htm
new file mode 100644
index 00000000000..aa28505c5f6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_027.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>HTML5 Sandbox: Allow XMLHttpRequest inside iframe with the sandbox attribute if sandbox='allow-same-origin'.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
+ <meta name="assert" content="Allow XMLHttpRequest in an iframe with the sandbox attribute if sandbox='allow-same-origin'." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Allow XMLHttpRequest in an iframe with the sandbox attribute if sandbox='allow-same-origin'.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "access to window.XMLHttpRequest");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+ <iframe src="support/iframe_sandbox_027.htm" sandbox="allow-scripts allow-same-origin" style="display : none"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_028.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_028.htm
new file mode 100644
index 00000000000..76afcdbe3cd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_028.htm
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>HTML5 Sandbox: Block sandbox iframe from accessing other content from the same origin.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
+ <meta name="assert" content="Block sandbox iframe from accessing other content from the same origin." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Block sandbox iframe from accessing other content from the same origin.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "!window.parent.document");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <iframe src="support/iframe_sandbox_028.htm" sandbox="allow-scripts" style="display:none"></iframe>
+ <div id=log></div>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_029.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_029.htm
new file mode 100644
index 00000000000..d458e04cd35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_029.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>HTML5 Sandbox: Block document.cookie inside iframe with the sandbox attribute.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
+ <meta name="assert" content="Block document.cookie inside iframe with the sandbox attribute." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Block document.cookie inside iframe with the sandbox attribute.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "cookies are not R/W");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+ <iframe src="support/iframe_sandbox_029.htm" sandbox="allow-scripts" style="display:none"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_030.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_030.htm
new file mode 100644
index 00000000000..d6bb6cc7baf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_030.htm
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>HTML5 Sandbox: Block parent content to access sandbox child iframe content when sandbox attribute exists</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
+ <meta name="assert" content="Block parent content to access sandbox child iframe content when sandbox attribute exists" />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Block parent content to access sandbox child iframe content when sandbox attribute exists");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ try { document.getElementById('sandboxIframe').contentDocument.title; assert_true(false);}
+ catch(e) {assert_true(true);}
+ });
+ t.done();
+ }
+ </script>
+ <div id=log></div>
+
+ <iframe id='sandboxIframe' src="support/standalone-iframe-content.htm" sandbox onload="callback()" style="display : none"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_031.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_031.htm
new file mode 100644
index 00000000000..3c65d416c59
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_031.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>HTML5 Sandbox: Block localStorage and sessionStorage inside iframe with the sandbox attribute.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
+ <meta name="assert" content="Block localStorage and sessionStorage inside iframe with the sandbox attribute." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Block localStorage and sessionStorage inside iframe with the sandbox attribute.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "no access to window.localStorage and window.sessionStorage");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+ <iframe src="support/iframe_sandbox_031.htm" sandbox="allow-scripts" style="display : none"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_032.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_032.htm
new file mode 100644
index 00000000000..4e6293949a0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/sandbox_032.htm
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <title>HTML5 Sandbox: Block XMLHttpRequest in an iframe with the sandbox attribute.</title>
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
+ <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
+ <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
+ <meta name="assert" content="Block XMLHttpRequest inside sandbox iframe." />
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+ <script type="text/javascript">
+
+ var t = async_test("Block XMLHttpRequest in an iframe with the sandbox attribute.");
+
+ function callback(event)
+ {
+ t.step(function(){
+ assert_true('sandbox' in document.createElement('iframe'));
+ assert_equals(event.data, "no access to window.XMLHttpRequest");
+ });
+ t.done();
+ }
+
+ var timer = setTimeout(callback, 4000);
+ window.addEventListener("message", callback, false);
+ </script>
+ <div id=log></div>
+ <iframe src="support/iframe_sandbox_032.htm" sandbox="allow-scripts" style="display : none"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/blank.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/blank.htm
index 6c70bcfe4d4..18ecdcb795c 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/blank.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/blank.htm
@@ -1 +1 @@
-<html></html> \ No newline at end of file
+<html></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-on-popup.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-on-popup.html
new file mode 100644
index 00000000000..0468278424f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-on-popup.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script>
+window.onload = function() {
+ try {
+ top.location = "data:text/html,\u003c!DOCTYPE html\u003e\u003cscript\u003eopener.postMessage('can navigate', '*');\u003c/script\u003e";
+ } catch(e) {
+ top.postMessage("cannot navigate", "*");
+ }
+}
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-that-tries-to-navigate-parent-and-sends-result-to-grandparent.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-that-tries-to-navigate-parent-and-sends-result-to-grandparent.html
new file mode 100644
index 00000000000..4b8930de42f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-that-tries-to-navigate-parent-and-sends-result-to-grandparent.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<p>This is a frame that tries to navigate its parent.</p>
+<script>
+window.onload = function() {
+ try {
+ parent.location.href = "data:text/html,\u003c!DOCTYPE html\u003e\u003cp\u003eIf this message appears, then this frame has been navigated by its child.\u003c/p\u003e\u003cscript\u003eparent.postMessage('can navigate', '*');\u003c/script\u003e";
+ } catch(e) {
+ parent.parent.postMessage("can not navigate", "*");
+ }
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-its-child.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-its-child.html
new file mode 100644
index 00000000000..50edc878adb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-tried-to-be-navigated-by-its-child.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<p>If this message appears, then this frame has not been navigated by its child.</p>
+<iframe src="iframe-that-tries-to-navigate-parent-and-sends-result-to-grandparent.html">
+</iframe>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-its-child.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-its-child.html
new file mode 100644
index 00000000000..9ac754c418e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-its-child.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<iframe src="data:text/html,If this message appears, then this frame has not been navigated by its parent."></iframe>
+<script>
+window.onload = function() {
+ try {
+ document.querySelector("iframe").contentWindow.location.href = "data:text/html,\u003c!DOCTYPE html\u003e\u003cp\u003eIf this message appears, then this frame has been navigated by its parent.\u003c/p\u003e\u003cscript\u003eparent.parent.postMessage('can navigate', '*');\u003c/script\u003e";
+ } catch(e) {
+ parent.postMessage("can not navigate", "*");
+ }
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-itself.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-itself.html
new file mode 100644
index 00000000000..6755d295aa1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe-trying-to-navigate-itself.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<p>If this message appears, then this frame has not been navigated.</p>
+<script>
+window.onload = function() {
+ try {
+ location.href = "data:text/html,\u003c!DOCTYPE html\u003e\u003cp\u003eIf this message appears, then this frame has been navigated.\u003c/p\u003e\u003cscript\u003eparent.postMessage('can navigate', '*');\u003c/script\u003e";
+ } catch(e) {
+ parent.postMessage("can not navigate", "*");
+ }
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_001.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_001.htm
new file mode 100644
index 00000000000..051ca5ecd78
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_001.htm
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Page with script</title>
+</head>
+<body>
+ <script type="text/javascript">
+ parent.window.postMessage("script ran", "*");
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_002.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_002.htm
index e637847714b..e637847714b 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_002.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_002.htm
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_003.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_003.htm
index 621ece79af6..621ece79af6 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_003.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_003.htm
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_004.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_004.htm
new file mode 100644
index 00000000000..542c3058077
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_004.htm
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>object tag</title>
+</head>
+<body>
+ <object width="400" height="600" data="sandbox.pdf">
+ </object>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_006.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_006.htm
index 42542ae1472..42542ae1472 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_006.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_006.htm
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_007.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_007.htm
index fc01557c75c..fc01557c75c 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_007.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_007.htm
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_008.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_008.htm
new file mode 100644
index 00000000000..ebd8279675d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_008.htm
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Page with hyperlink and target set to self</title>
+</head>
+<body>
+ <a id="hyperlink" href="standalone-pass.htm" target="_self">Click here to perform self navigation</a>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_010.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_010.htm
new file mode 100644
index 00000000000..27fc4209f71
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_010.htm
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Page with window.open()</title>
+</head>
+<body>
+ <button type="button" onclick="javascript:window.open('standalone-fail.htm')">Click here to call window.open() API</button>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_012.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_012.htm
index b1e8f92fb4e..b1e8f92fb4e 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_012.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_012.htm
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020.htm
new file mode 100644
index 00000000000..fd0d6bb6fbe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020.htm
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Page with iframes</title>
+</head>
+<body>
+ <table cellpadding="5" cellspacing="10">
+ <tr>
+ <td>
+ <span>child iframe with sandbox="allow-scripts" attribute</span><br />
+ <iframe id="Iframe1" src="iframe_sandbox_020a.htm" sandbox="allow-scripts" style="height: 50px; width: 250px;"></iframe>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span>child iframe with sandbox="" attribute</span><br />
+ <iframe id="Iframe2" src="iframe_sandbox_020a.htm" sandbox="" style="height: 50px; width: 250px;"></iframe>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span>child iframe without sandbox attribute</span><br />
+ <iframe id="Iframe3" src="iframe_sandbox_020a.htm" style="height: 50px; width: 250px;"></iframe>
+ </td>
+ </tr>
+ </table>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020a.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020a.htm
new file mode 100644
index 00000000000..ccfa4eae2e2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_020a.htm
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Page with script</title>
+</head>
+<body>
+ <div>Script Execution: <span id="scriptExecute" style="Color: Green">Blocked</span></div>
+ <script type="text/javascript">
+ document.getElementById("scriptExecute").innerHTML = "Not Blocked";
+ document.getElementById("scriptExecute").style.color = "Red";
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021.htm
new file mode 100644
index 00000000000..63f58924561
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021.htm
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Page with iframes</title>
+</head>
+<body>
+ <table cellpadding="5" cellspacing="10">
+ <tr>
+ <td>
+ <span>child iframe with sandbox="allow-scripts" attribute</span><br />
+ <iframe id="Iframe1" src="iframe_sandbox_021a.htm" sandbox="allow-scripts" style="height: 50px; width: 250px;"></iframe>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span>child iframe with sandbox="" attribute</span><br />
+ <iframe id="Iframe2" src="iframe_sandbox_020a.htm" sandbox="" style="height: 50px; width: 250px;"></iframe>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <span>child iframe without sandbox attribute</span><br />
+ <iframe id="Iframe3" src="iframe_sandbox_021a.htm" style="height: 50px; width: 250px;"></iframe>
+ </td>
+ </tr>
+ </table>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021a.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021a.htm
new file mode 100644
index 00000000000..a42520d7e1d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_021a.htm
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Page with script</title>
+</head>
+<body>
+ <div>Script Execution: <span id="scriptExecute" style="Color: Red">Blocked</span></div>
+ <script type="text/javascript">
+ document.getElementById("scriptExecute").innerHTML = "Allowed";
+ document.getElementById("scriptExecute").style.color = "Green";
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_022.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_022.htm
new file mode 100644
index 00000000000..87082e51dcf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_022.htm
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>target=_top</title>
+</head>
+<body>
+ <div>hyperlink with target=_top</div>
+ <br />
+ <a href="standalone-pass.htm" target="_top">Open the link in top window</a>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_023.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_023.htm
index a65db539bb4..a65db539bb4 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_023.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_023.htm
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_024.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_024.htm
index 1b0996e5899..1b0996e5899 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_024.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_024.htm
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_026.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_026.htm
new file mode 100644
index 00000000000..7171cf7721d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_026.htm
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<head><title>Page with access to localStorage and sessionStorage</title>
+</head>
+<body>
+ <script type="text/javascript">
+ if (window.localStorage && window.sessionStorage) {
+ parent.window.postMessage("access to window.localStorage and window.sessionStorage", "*");
+ }
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_027.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_027.htm
new file mode 100644
index 00000000000..c1a48cdef9b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_027.htm
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head><title>XMLHttpRequest</title>
+</head>
+<body>
+ <script type="text/javascript">
+ xhrRequest = new XMLHttpRequest();
+
+ xhrRequest.onreadystatechange = function () {
+ if (xhrRequest.readyState == 4 && xhrRequest.status == 200) {
+ //xhr successful
+ parent.window.postMessage("access to window.XMLHttpRequest", "*");
+ }
+ }
+
+ xhrRequest.open("GET", "standalone-pass.htm", true);
+ xhrRequest.send();
+
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_028.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_028.htm
index d7ca7614415..d7ca7614415 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_028.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_028.htm
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_029.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_029.htm
index 5d5c720bd86..5d5c720bd86 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_029.htm
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_029.htm
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_031.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_031.htm
new file mode 100644
index 00000000000..fb987dac384
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_031.htm
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+<head><title>Page with access to localStorage and sessionStorage</title>
+</head>
+<body>
+ <script type="text/javascript">
+ try
+ {
+ if (window.localStorage && window.sessionStorage) {
+ parent.window.postMessage("access to window.localStorage and window.sessionStorage", "*");
+ }
+ }
+ catch(e)
+ {
+ parent.window.postMessage("no access to window.localStorage and window.sessionStorage", "*");
+ }
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_032.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_032.htm
new file mode 100644
index 00000000000..6059b7df43f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/iframe_sandbox_032.htm
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head><title>XMLHttpRequest</title>
+</head>
+<body>
+ <script type="text/javascript">
+
+ try
+ {
+ xhrRequest = new XMLHttpRequest();
+
+ xhrRequest.onreadystatechange = function () {
+ if (xhrRequest.readyState == 4 && xhrRequest.status == 200) {
+ //xhr successful
+ parent.window.postMessage("access to window.XMLHttpRequest", "*");
+ }
+ }
+
+ xhrRequest.open("GET", "standalone-pass.htm", true);
+ xhrRequest.send();
+
+ }catch(e){}
+
+ parent.window.postMessage("no access to window.XMLHttpRequest", "*");
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox.pdf b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/sandbox.pdf
index 0e16bc8d93d..0e16bc8d93d 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox.pdf
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/sandbox.pdf
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/sandbox_helper.js b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/sandbox_helper.js
new file mode 100644
index 00000000000..26aa67faf46
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/sandbox_helper.js
@@ -0,0 +1,14 @@
+function IsSandboxSupported() {
+ if ('sandbox' in document.createElement('iframe')) {
+ return true;
+ }
+ return false;
+}
+
+function DisableTestForNonSupportingBrowsers() {
+ //check if sandbox is supported by the browser
+ if (!IsSandboxSupported()) {
+ document.getElementById('testframe').innerHTML = "FAIL: Your browser does not support the sandbox attribute on the iframe element.";
+ document.getElementById('testframe').style.color = "Red";
+ }
+}
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-fail.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-fail.htm
new file mode 100644
index 00000000000..29ef4d5abbe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-fail.htm
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Page with FAIL message</title>
+</head>
+<body>
+ <div style="color: Red">FAIL!!!</div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-iframe-content.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-iframe-content.htm
new file mode 100644
index 00000000000..b26f7fda755
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-iframe-content.htm
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Page with a message</title>
+</head>
+<body>
+ <div>Hello World.</div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-pass.htm b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-pass.htm
new file mode 100644
index 00000000000..9d1b2530fe6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-iframe-element/support/standalone-pass.htm
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Page with PASS message</title>
+</head>
+<body>
+ <div style="color: Green">PASS!!!</div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/adoption.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/adoption.html
new file mode 100644
index 00000000000..15e02bcf515
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/adoption.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Adopting an image updates the image data</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+
+<!-- tests -->
+
+<div id="adoptTest1"></div>
+<picture id="adoptTest2">
+<source srcset="/images/green-2x2.png">
+</picture>
+
+<script>
+function resolve(url) {
+ if (url === "") {
+ return url;
+ }
+ var a = document.createElement('a');
+ a.href = url;
+ return a.href;
+}
+
+function t(desc, data, expect) {
+ async_test(function(t) {
+ var d = (new DOMParser()).parseFromString(data, 'text/html');
+ var i = d.querySelector('img');
+ i.onerror = this.unreached_func('got unexpected error event');
+ i.onload = this.step_func_done(function() {
+ assert_equals(i.currentSrc, resolve(expect));
+ });
+ var n = d.querySelector('[adopt-node]');
+ document.adoptNode(n);
+ }, desc);
+}
+
+onload = function() {
+
+ t('img (src only)',
+ '<img src="/images/green-1x1.png" adopt-node>',
+ '/images/green-1x1.png');
+
+ t('img (src only), parent is picture',
+ '<picture adopt-node><img src="/images/green-1x1.png"></picture>',
+ '/images/green-1x1.png');
+
+ t('img (src only), previous sibling is source',
+ '<picture adopt-node><source srcset="/images/green-1x1.png"><img src="/images/green-2x2.png"></picture>',
+ '/images/green-1x1.png');
+
+ t('img (srcset 1 cand)',
+ '<img srcset="/images/green-1x1.png" adopt-node>',
+ '/images/green-1x1.png');
+
+ t('img (srcset 1 cand), parent is picture',
+ '<picture adopt-node><img srcset="/images/green-1x1.png"></picture>',
+ '/images/green-1x1.png');
+
+ t('img (srcset 1 cand), previous sibling is source',
+ '<picture adopt-node><source srcset="/images/green-1x1.png"><img srcset="/images/green-2x2.png"></picture>',
+ '/images/green-1x1.png');
+
+ async_test(function(t) {
+ var d = (new DOMParser()).parseFromString('<template><img src="/images/green-1x1.png"></template>', 'text/html');
+ var i = d.querySelector('template').content.querySelector('img').cloneNode(1);
+ i.onerror = this.unreached_func('got unexpected error event');
+ i.onload = this.step_func_done(function() {
+ assert_equals(i.currentSrc, resolve('/images/green-1x1.png'));
+ });
+
+ document.getElementById('adoptTest1').appendChild(i);
+ }, 'adopt a cloned img in template');
+
+ async_test(function(t) {
+ var preload = new Image();
+ preload.src = '/images/green-1x1.png?' + Math.random();
+ preload.onload = t.step_func(function() {
+ var d = (new DOMParser()).parseFromString('<img src="' + preload.src + '">', 'text/html');
+ var i = d.querySelector('img');
+ i.onerror = this.unreached_func('got unexpected error event');
+ i.onload = this.step_func_done(function() {
+ assert_equals(i.currentSrc, resolve("/images/green-2x2.png"));
+ });
+
+ var p = document.getElementById('adoptTest2');
+ p.appendChild(i);
+ });
+ }, 'adoption is from appendChild');
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html
new file mode 100644
index 00000000000..56060cb5d64
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>HTMLImageElement.prototype.decode(), iframe tests.</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<link rel=help href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<iframe id="frame_loaded" srcdoc="iframe"></iframe>
+<iframe id="frame_notloaded" srcdoc="iframe"></iframe>
+<iframe id="frame_notloaded2" srcdoc="iframe"></iframe>
+
+<script>
+"use strict";
+
+promise_test(function() {
+ return new Promise(function(resolve, reject) {
+ var frame = document.getElementById("frame_loaded");
+ var img = frame.contentDocument.createElement("img");
+ img.src = "/images/green.png";
+ img.onload = function() {
+ // At this point the frame which created the img is removed, so decode() should fail.
+ frame.parentNode.removeChild(frame);
+ img.decode().then(function() {
+ assert_false(true, "Unexpected success");
+ }, function() {
+ resolve();
+ });
+ };
+ });
+}, document.title + " Decode from removed iframe fails (loaded img)");
+
+promise_test(function(t) {
+ var frame = document.getElementById("frame_notloaded");
+ var img = frame.contentDocument.createElement("img");
+ img.src = "/images/green.png";
+ frame.parentNode.removeChild(frame);
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Decode from removed iframe fails (img not loaded)");
+
+promise_test(function(t) {
+ var frame = document.getElementById("frame_notloaded2");
+ var img = frame.contentDocument.createElement("img");
+ img.src = "/images/green.png";
+ // First request a promise, then remove the iframe.
+ var promise = img.decode();
+ frame.parentNode.removeChild(frame);
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Decode from iframe, later removed, fails (img not loaded)");
+
+</script>
+
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html
new file mode 100644
index 00000000000..d8d55a81478
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes-svg.tentative.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>SVGImageElement.prototype.decode(), href mutation tests.</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+"use strict";
+
+// src tests
+// -------------------
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/images/green.png");
+ var promise = img.decode();
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/images/green.svg");
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " xlink:href changes fail decode.");
+
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttribute('href', "/images/green.png");
+ var promise = img.decode();
+ img.setAttribute('href', "/images/green.svg");
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " href changes fail decode.");
+
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/images/green.png");
+ var first_promise = img.decode();
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/images/green.svg");
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ promise_rejects(t, "EncodingError", first_promise),
+ second_promise
+ ]);
+}, document.title + " xlink:href changes fail decode; following good decode succeeds.");
+
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttribute('href', "/images/green.png");
+ var first_promise = img.decode();
+ img.setAttribute('href', "/images/green.svg");
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ promise_rejects(t, "EncodingError", first_promise),
+ second_promise
+ ]);
+}, document.title + " href changes fail decode; following good decode succeeds.");
+
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/images/green.png");
+ var first_promise = img.decode();
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/non/existent/path.png");
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ promise_rejects(t, "EncodingError", first_promise),
+ promise_rejects(t, "EncodingError", second_promise)
+ ]);
+}, document.title + " xlink:href changes fail decode; following bad decode fails.");
+
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttribute('href', "/images/green.png");
+ var first_promise = img.decode();
+ img.setAttribute('href', "/non/existent/path.png");
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ promise_rejects(t, "EncodingError", first_promise),
+ promise_rejects(t, "EncodingError", second_promise)
+ ]);
+}, document.title + " href changes fail decode; following bad decode fails.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html
new file mode 100644
index 00000000000..82f98549c63
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-path-changes.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>HTMLImageElement.prototype.decode(), src/srcset mutation tests.</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<link rel=help href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+"use strict";
+
+// src tests
+// -------------------
+promise_test(function(t) {
+ var img = new Image();
+ img.src = "/images/green.png";
+ var promise = img.decode();
+ img.src = "/images/green.svg";
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " src changes fail decode.");
+
+promise_test(function(t) {
+ var img = new Image();
+ img.src = "/images/green.png";
+ var first_promise = img.decode();
+ img.src = "/images/blue.png";
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ promise_rejects(t, "EncodingError", first_promise),
+ second_promise
+ ]);
+}, document.title + " src changes fail decode; following good png decode succeeds.");
+
+promise_test(function(t) {
+ var img = new Image();
+ img.src = "/images/green.png";
+ var first_promise = img.decode();
+ img.src = "/images/green.svg";
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ promise_rejects(t, "EncodingError", first_promise),
+ second_promise
+ ]);
+}, document.title + " src changes fail decode; following good svg decode succeeds.");
+
+promise_test(function(t) {
+ var img = new Image();
+ img.src = "/images/green.png";
+ var first_promise = img.decode();
+ img.src = "/non/existent/path.png";
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ promise_rejects(t, "EncodingError", first_promise),
+ promise_rejects(t, "EncodingError", second_promise)
+ ]);
+}, document.title + " src changes fail decode; following bad decode fails.");
+
+promise_test(function(t) {
+ return new Promise(function(resolve, reject) {
+ var img = new Image();
+ // We wait for an onload, since the "Updating the image data" spec states
+ // that if a new microtask is scheduled, the old one is canceled so
+ // without the onload, the first decode request would be requested when the
+ // img.src is empty. With an onload, we ensure that the img.src is set and
+ // the image exists before issuing the first decode, then we verify that the
+ // src change to the same value does not prevent that request from
+ // succeeding.
+ img.onload = t.step_func(function() {
+ img.onload = null;
+
+ var first_promise = img.decode();
+ img.src = "/images/green.png";
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ resolve(Promise.all([first_promise, second_promise]));
+ });
+ img.src = "/images/green.png";
+ });
+}, document.title + " src changes to the same path succeed.");
+
+// srcset tests
+// -------------------
+promise_test(function(t) {
+ var img = new Image();
+ img.srcset = "/images/green.png 100w";
+ var promise = img.decode();
+ img.srcset = "/images/green.svg 100w";
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " srcset changes fail decode.");
+
+promise_test(function(t) {
+ var img = new Image();
+ img.srcset = "/images/green.png 100w";
+ var first_promise = img.decode();
+ img.srcset = "/images/green.svg 100w";
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ promise_rejects(t, "EncodingError", first_promise),
+ second_promise
+ ]);
+}, document.title + " srcset changes fail decode; following good decode succeeds.");
+
+promise_test(function(t) {
+ var img = new Image();
+ img.srcset = "/images/green.png 100w";
+ var first_promise = img.decode();
+ img.srcset = "/non/existent/path.png 100w";
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ promise_rejects(t, "EncodingError", first_promise),
+ promise_rejects(t, "EncodingError", second_promise)
+ ]);
+}, document.title + " srcset changes fail decode; following bad decode fails.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html
new file mode 100644
index 00000000000..e3195d9d04d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-picture.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>HTMLImageElement.prototype.decode(), picture tests.</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<link rel=help href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<picture>
+<source srcset="/images/green.png">
+<source srcset="/images/blue.png">
+<img id="testimg">
+</picture>
+
+<script>
+"use strict";
+
+promise_test(function() {
+ var picture = document.createElement("picture");
+ var source = document.createElement("source");
+ var img = document.createElement("img");
+
+ picture.appendChild(source);
+ picture.appendChild(img);
+
+ source.srcset = "/images/green.png";
+
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with PNG source decodes with undefined.");
+
+promise_test(function() {
+ var img = document.getElementById("testimg");
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with multiple sources decodes with undefined.");
+
+promise_test(function() {
+ var picture = document.createElement("picture");
+ var source = document.createElement("source");
+ var img = document.createElement("img");
+
+ picture.appendChild(source);
+ picture.appendChild(img);
+
+ source.srcset = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIA" +
+ "AAD91JpzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QUSEioKsy" +
+ "AgywAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAW" +
+ "SURBVAjXY9y3bx8DAwPL58+fGRgYACktBRltLfebAAAAAElFTkSuQmCC";
+
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with PNG data URL source decodes with undefined.");
+
+promise_test(function() {
+ var picture = document.createElement("picture");
+ var source = document.createElement("source");
+ var img = document.createElement("img");
+
+ picture.appendChild(source);
+ picture.appendChild(img);
+
+ source.srcset = "/images/green.svg";
+
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with SVG source decodes with undefined.");
+
+promise_test(function(t) {
+ var picture = document.createElement("picture");
+ var source = document.createElement("source");
+ var img = document.createElement("img");
+
+ picture.appendChild(source);
+ picture.appendChild(img);
+
+ source.srcset = "/non/existent/path.png";
+
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Non-existent source fails decode.");
+
+promise_test(function(t) {
+ var picture = document.createElement("picture");
+ var source = document.createElement("source");
+ var img = document.createElement("img");
+
+ picture.appendChild(source);
+ picture.appendChild(img);
+
+ source.srcset = "data:image/png;base64,iVBO00PDR0BADBEEF00KGg";
+
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Corrupt image in src fails decode.");
+
+promise_test(function(t) {
+ var picture = document.createElement("picture");
+ var source = document.createElement("source");
+ var img = document.createElement("img");
+
+ picture.appendChild(source);
+ picture.appendChild(img);
+
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Image without srcset fails decode.");
+
+promise_test(function() {
+ var picture = document.createElement("picture");
+ var source = document.createElement("source");
+ var img = document.createElement("img");
+
+ picture.appendChild(source);
+ picture.appendChild(img);
+
+ source.srcset = "/images/green.png";
+
+ var first_promise = img.decode();
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ first_promise,
+ second_promise
+ ]);
+}, document.title + " Multiple decodes for images with src succeed.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html
new file mode 100644
index 00000000000..633b6a87d9d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode-svg.tentative.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>SVGImageElement.prototype.decode(), basic tests.</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+"use strict";
+
+// src tests
+// -------------------
+promise_test(function() {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/images/green.png");
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with PNG xlink:href decodes with undefined.");
+
+promise_test(function() {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttribute('href', "/images/green.png");
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with PNG href decodes with undefined.");
+
+promise_test(function() {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href',
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAA" +
+ "D91JpzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QUSEioKsyAgyw" +
+ "AAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAWSURBVA" +
+ "jXY9y3bx8DAwPL58+fGRgYACktBRltLfebAAAAAElFTkSuQmCC");
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with PNG data URL xlink:href decodes with undefined.");
+
+promise_test(function() {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttribute('href',
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAA" +
+ "D91JpzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QUSEioKsyAgyw" +
+ "AAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAWSURBVA" +
+ "jXY9y3bx8DAwPL58+fGRgYACktBRltLfebAAAAAElFTkSuQmCC");
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with PNG data URL href decodes with undefined.");
+
+promise_test(function() {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/images/green.svg");
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with SVG xlink:href decodes with undefined.");
+
+promise_test(function() {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttribute('href', "/images/green.svg");
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with SVG href decodes with undefined.");
+
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/non/existent/path.png");
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Non-existent xlink:href fails decode.");
+
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttribute('href', "/non/existent/path.png");
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Non-existent href fails decode.");
+
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "data:image/png;base64,iVBO00PDR0BADBEEF00KGg");
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Corrupt image in xlink:href fails decode.");
+
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttribute('href', "data:image/png;base64,iVBO00PDR0BADBEEF00KGg");
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Corrupt image in href fails decode.");
+
+promise_test(function(t) {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Image without xlink:href or href fails decode.");
+
+promise_test(function() {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', "/images/green.png");
+ var first_promise = img.decode();
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ first_promise,
+ second_promise
+ ]);
+}, document.title + " Multiple decodes with a xlink:href succeed.");
+
+promise_test(function() {
+ var img = document.createElementNS('http://www.w3.org/2000/svg', 'image');
+ img.setAttribute('href', "/images/green.png");
+ var first_promise = img.decode();
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ first_promise,
+ second_promise
+ ]);
+}, document.title + " Multiple decodes with a href succeed.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode.html
new file mode 100644
index 00000000000..a296775c10d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/decode/image-decode.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>HTMLImageElement.prototype.decode(), basic tests.</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<link rel=help href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+"use strict";
+
+// src tests
+// -------------------
+promise_test(function() {
+ var img = new Image();
+ img.src = "/images/green.png";
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with PNG src decodes with undefined.");
+
+promise_test(function() {
+ var img = new Image();
+ img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAA" +
+ "D91JpzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QUSEioKsyAgyw" +
+ "AAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAWSURBVA" +
+ "jXY9y3bx8DAwPL58+fGRgYACktBRltLfebAAAAAElFTkSuQmCC";
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with PNG data URL src decodes with undefined.");
+
+promise_test(function() {
+ var img = new Image();
+ img.src = "/images/green.svg";
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with SVG src decodes with undefined.");
+
+promise_test(function(t) {
+ var img = new Image();
+ img.src = "/non/existent/path.png";
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Non-existent src fails decode.");
+
+promise_test(function(t) {
+ var inactive_doc = document.implementation.createHTMLDocument();
+ var img = inactive_doc.createElement("img");
+ img.src = "/images/green.png";
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Inactive document fails decode.");
+
+promise_test(function(t) {
+ var inactive_doc = document.implementation.createHTMLDocument();
+ var img = document.createElement("img");
+ img.src = "/images/green.png";
+ var promise = img.decode();
+ inactive_doc.body.appendChild(img);
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Adopted active image into inactive document fails decode.");
+
+promise_test(function() {
+ var inactive_doc = document.implementation.createHTMLDocument();
+ var img = inactive_doc.createElement("img");
+ img.src = "/images/green.png";
+ document.body.appendChild(img);
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Adopted inactive image into active document succeeds.");
+
+promise_test(function(t) {
+ var img = new Image();
+ img.src = "data:image/png;base64,iVBO00PDR0BADBEEF00KGg";
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Corrupt image in src fails decode.");
+
+promise_test(function(t) {
+ var img = new Image();
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Image without src/srcset fails decode.");
+
+promise_test(function() {
+ var img = new Image();
+ img.src = "/images/green.png";
+ var first_promise = img.decode();
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ first_promise,
+ second_promise
+ ]);
+}, document.title + " Multiple decodes for images with src succeed.");
+
+// srcset tests
+// -------------------
+promise_test(function() {
+ var img = new Image();
+ img.srcset = "/images/green.png 100w";
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with PNG srcset decodes with undefined.");
+
+promise_test(function() {
+ var img = new Image();
+ img.srcset = "/images/green.svg 100w";
+ return img.decode().then(function(arg) {
+ assert_equals(arg, undefined);
+ });
+}, document.title + " Image with SVG srcset decodes with undefined.");
+
+promise_test(function(t) {
+ var img = new Image();
+ img.srcset = "/non/existent/path.png 100w";
+ var promise = img.decode();
+ return promise_rejects(t, "EncodingError", promise);
+}, document.title + " Non-existent srcset fails decode.");
+
+promise_test(function() {
+ var img = new Image();
+ img.srcset = "/images/green.png 100w";
+ var first_promise = img.decode();
+ var second_promise = img.decode();
+ assert_not_equals(first_promise, second_promise);
+ return Promise.all([
+ first_promise,
+ second_promise
+ ]);
+}, document.title + " Multiple decodes for images with srcset succeed.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/delay-load-event-detached.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/delay-load-event-detached.html
new file mode 100644
index 00000000000..5c68de29e90
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/delay-load-event-detached.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Detached image blocks load</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+var img_loaded = false;
+
+var img = new Image();
+img.onload = function() {
+ img_loaded = true;
+};
+img.src = "/images/blue.png?pipe=trickle(d2)";
+
+test(function() {
+ assert_false(img_loaded);
+}, "setting img.src is async");
+
+async_test(function(t) {
+ document.addEventListener("DOMContentLoaded", t.step_func_done(function() {
+ assert_false(img_loaded);
+ }));
+}, "DOMContentLoaded doesn't wait for images");
+
+async_test(function(t) {
+ window.addEventListener("load", t.step_func_done(function() {
+ assert_true(img_loaded);
+ }));
+}, "load waits for images");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/delay-load-event.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/delay-load-event.html
index c67074a40d8..ac0cf29d3fd 100644
--- a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/delay-load-event.html
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/delay-load-event.html
@@ -1,17 +1,26 @@
-<html>
-<head>
-<title>Image element delays window's load event</title>
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Inline image element blocks load</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-<img src="resources/cat.jpg?pipe=trickle(d2)">
<script>
- async_test(function(t) {
- var saw_img_load = false;
- document.querySelector('img').onload = t.step_func(function() {
- saw_img_load = true;
- });
- addEventListener('load', t.step_func_done(function() {
- assert_true(saw_img_load);
- }));
- });
+var img_loaded = false;
+</script>
+<img src="/images/blue.png?pipe=trickle(d2)" onload="img_loaded = true;">
+<script>
+test(function() {
+ assert_false(img_loaded);
+}, "script execution doesn't wait for the image to load");
+
+async_test(function(t) {
+ document.addEventListener("DOMContentLoaded", t.step_func_done(function() {
+ assert_false(img_loaded);
+ }));
+}, "DOMContentLoaded doesn't wait for images");
+
+async_test(function(t) {
+ window.addEventListener("load", t.step_func_done(function() {
+ assert_true(img_loaded);
+ }));
+}, "Image element delays window's load event");
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/non-active-document.html b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/non-active-document.html
new file mode 100644
index 00000000000..6072138cb38
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/embedded-content/the-img-element/non-active-document.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>img in non-active document should not perform loads</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+
+<!-- Per load the image so that any loads in this test would be cached. -->
+<img src=/images/green-1x1.png>
+
+<!-- tests -->
+<template>
+<img>
+</template>
+
+<script>
+
+onload = function() {
+ async_test(function(t) {
+ var p = new DOMParser();
+ var d = p.parseFromString('<img>', 'text/html');
+ var i = d.querySelector('img');
+ i.onerror = t.unreached_func('got unexpected error event');
+ i.onload = t.unreached_func('got unexpected load event');
+ i.src = '/images/green-1x1.png';
+ // delay to ensure there is no load/error event fired.
+ t.step_timeout(t.step_func_done(), 0);
+ }, "DOMParser");
+
+ async_test(function(t) {
+ var d = document.implementation.createHTMLDocument('');
+ d.body.innerHTML = '<img>';
+ var i = d.querySelector('img');
+ i.onerror = this.unreached_func('got unexpected error event');
+ i.onload = this.unreached_func('got unexpected load event');
+ i.src = '/images/green-1x1.png';
+ // delay to ensure there is no load/error event fired.
+ t.step_timeout(t.step_func_done(), 0);
+ }, "createHTMLDocument");
+
+ async_test(function(t) {
+ var template = document.querySelector('template');
+ var i = template.content.querySelector('img');
+ i.onerror = this.unreached_func('got unexpected error event');
+ i.onload = this.unreached_func('got unexpected load event');
+ i.src = '/images/green-1x1.png';
+ // delay to ensure there is no load/error event fired.
+ t.step_timeout(t.step_func_done(), 0);
+ }, "<template>");
+};
+
+</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
index c15741ab067..c28f667ff3a 100644
--- 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
@@ -8,53 +8,53 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
+<img src="/images/threecolors.png" usemap="#sanityCheck" width="100" height="100">
+<map name="sanityCheck"><area shape="rect" coords="0,0,100,100"></map>
+
+<img src="/images/threecolors.png" usemap="#sImPlE" width="100" height="100">
+<map name="simple"><area shape="rect" coords="0,0,100,100"></map>
+<map name="SIMPLE"><area shape="rect" coords="0,0,100,100"></map>
+
+<img src="/images/threecolors.png" usemap="#paSSfield-killroyß" width="100" height="100">
+<map name="passfield-killroyß"><area shape="rect" coords="0,0,100,100"></map>
+<map name="PASSFIELD-KILLROYß"><area shape="rect" coords="0,0,100,100"></map>
+<map name="paſſfield-killroyß"><area shape="rect" coords="0,0,100,100"></map>
+<map name="passfield-&#x212a;illroyß"><area shape="rect" coords="0,0,100,100"></map>
+<map name="paßfield-killroyß"><area shape="rect" coords="0,0,100,100"></map>
+<map name="paẞfield-killroyß"><area shape="rect" coords="0,0,100,100"></map>
+<map name="passfield-killroyẞ"><area shape="rect" coords="0,0,100,100"></map>
+<map name="passfield-killroyß"><area shape="rect" coords="0,0,100,100"></map>
+<map name="passfıeld-killroyß"><area shape="rect" coords="0,0,100,100"></map>
+<map name="passfİeld-killroyß"><area shape="rect" coords="0,0,100,100"></map>
+
+<img src="/images/threecolors.png" usemap="#глупый" width="100" height="100">
+<map name="глупы&#x438;&#x306;"><area shape="rect" coords="0,0,100,100"></map>
+<map name="ГЛУПЫЙ"><area shape="rect" coords="0,0,100,100"></map>
+<map name="ГЛУПЫ&#x418;&#x306;"><area shape="rect" coords="0,0,100,100"></map>
+
+<img src="/images/threecolors.png" usemap="#åωk" width="100" height="100">
+<map name="ÅΩK"><area shape="rect" coords="0,0,100,100"></map>
+<map name="&#x212b;ωk"><area shape="rect" coords="0,0,100,100"></map>
+<map name="å&#x2126;k"><area shape="rect" coords="0,0,100,100"></map>
+<map name="åω&#x212a;"><area shape="rect" coords="0,0,100,100"></map>
+
+<img src="/images/threecolors.png" usemap="#blah1" width="100" height="100">
+<map name="blah&#x2460;"><area shape="rect" coords="0,0,100,100"></map>
+<map name="bl&#x24b6;h1"><area shape="rect" coords="0,0,100,100"></map>
+<map name="bl&#x24d0;h1"><area shape="rect" coords="0,0,100,100"></map>
+
+<img src="/images/threecolors.png" usemap="#t&Eacute;dz5アパートFi" width="100" height="100">
+<map name="T&Eacute;DZ5アパートFi"><area shape="rect" coords="0,0,100,100"></map>
+<map name="T&eacute;&#x01F1;&#x2075;アパートFi"><area shape="rect" coords="0,0,100,100"></map>
+<map name="t&Eacute;dz5&#x3100;Fi"><area shape="rect" coords="0,0,100,100"></map>
+<map name="t&Eacute;dz5&#x30A2;&#x30CF;&#x309A;&#x30FC;&#x30C8;Fi"><area shape="rect" coords="0,0,100,100"></map>
+<map name="T&Eacute;DZ⁵アパートFi"><area shape="rect" coords="0,0,100,100"></map>
+<map name="T&Eacute;DZ5アパートfi"><area shape="rect" coords="0,0,100,100"></map>
+
+<img src="/images/threecolors.png" usemap="#ΣΣ" width="100" height="100">
+<map name="σς"><area shape="rect" coords="0,0,100,100"></map>
-<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>
+<div id="log"></div>
<script>
"use strict";
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address.html b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address.html
index d14cad53298..4510807c2c6 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address.html
@@ -69,6 +69,25 @@
var address = document.location.href;
assert_equals(formAction, address);
}, "Check if input.formAction is the document's address when formaction content attribute value is not assigned");
+
+ var newUrl = location.href.replace(/\/[^\/]*$/,'\/dummy.html');
+ history.pushState('','','dummy.html');
+
+ test(function() {
+ assert_equals(document.location.href, newUrl);
+
+ var formAction = document.querySelector('#missing button').formAction;
+ var address = document.location.href;
+ assert_equals(formAction, address);
+ }, "Check if button.formAction is the document's new address when formaction content attribute is missing and pushState has been used");
+
+ test(function() {
+ assert_equals(document.location.href, newUrl);
+
+ var formAction = document.querySelector('#missing input').formAction;
+ var address = document.location.href;
+ assert_equals(formAction, address);
+ }, "Check if input.formAction is the document's new address when formaction content attribute is missing and pushState has been used");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/form-control-infrastructure/association.window.js b/tests/wpt/web-platform-tests/html/semantics/forms/form-control-infrastructure/association.window.js
new file mode 100644
index 00000000000..4d84e7d3f0b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/form-control-infrastructure/association.window.js
@@ -0,0 +1,7 @@
+test(() => {
+ const form = document.createElement("form"),
+ input = document.createElement("input");
+
+ form.appendChild(input);
+ assert_equals(input.form, form);
+}, "Ensure input and form get associated when not in a document");
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html b/tests/wpt/web-platform-tests/html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html
new file mode 100644
index 00000000000..db70b34b1ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/form-control-infrastructure/form_owner_and_table_3.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<table><form><tr><td><input></table>
+<div id=2></div>
+<script>
+test(() => {
+ const input = document.querySelector("input"),
+ form = document.querySelector("form");
+ assert_equals(input.form, form);
+ document.getElementById("2").appendChild(form.parentNode);
+ assert_equals(input.form, form);
+ document.getElementById("2").appendChild(input);
+ assert_equals(input.form, null);
+}, "parser inserted flag is not reset by insertions with the owner form, but reset by by removal from the owner form");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/submission-checks.window.js b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/submission-checks.window.js
new file mode 100644
index 00000000000..e242ce830a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/form-submission-0/submission-checks.window.js
@@ -0,0 +1,62 @@
+async_test(t => {
+ const frame = document.createElement("frame"),
+ form = document.createElement("form");
+ t.add_cleanup(() => frame.remove());
+ form.action = "/common/blank.html";
+ form.target = "doesnotmattertwobits";
+ frame.name = "doesnotmattertwobits";
+ document.body.appendChild(frame);
+ frame.onload = t.step_func(() => {
+ if(frame.contentWindow.location.href === "about:blank")
+ return;
+ assert_unreached();
+ });
+ form.submit();
+ t.step_timeout(() => {
+ assert_equals(frame.contentWindow.location.href, "about:blank");
+ t.done();
+ }, 500);
+}, "<form> not connected to a document cannot navigate");
+
+async_test(t => {
+ const frame = document.createElement("frame"),
+ form = document.createElement("form");
+ t.add_cleanup(() => frame.remove());
+ form.action = "/common/blank.html";
+ form.target = "doesnotmattertwoqbits";
+ form.onsubmit = t.step_func(() => form.remove());
+ frame.name = "doesnotmattertwoqbits";
+ document.body.appendChild(frame);
+ document.body.appendChild(form);
+ frame.onload = t.step_func(() => {
+ if(frame.contentWindow.location.href === "about:blank")
+ return;
+ assert_unreached();
+ });
+ const submit = form.appendChild(document.createElement("input"));
+ submit.type = "submit"
+ submit.click();
+ t.step_timeout(() => {
+ assert_equals(frame.contentWindow.location.href, "about:blank");
+ t.done();
+ }, 500);
+}, "<form> not connected to a document after submit event cannot navigate");
+
+async_test(t => {
+ const frame = document.createElement("frame"),
+ form = document.createElement("form");
+ t.add_cleanup(() => frame.remove());
+ form.action = "/";
+ document.body.appendChild(frame);
+ frame.contentDocument.body.appendChild(form);
+ frame.onload = t.step_func(() => {
+ if(frame.contentWindow.location.href === "about:blank")
+ return;
+ form.submit();
+ t.step_timeout(() => {
+ assert_equals(frame.contentWindow.location.pathname, "/common/blank.html");
+ t.done();
+ }, 500)
+ });
+ frame.src = "/common/blank.html";
+}, "<form> in a navigated document cannot navigate");
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/selection-value-interactions.html b/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/selection-value-interactions.html
index 5aba3d22505..c453efd8e0a 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/selection-value-interactions.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/textfieldselection/selection-value-interactions.html
@@ -92,4 +92,27 @@ for (var data of elemData) {
}, `value dirty flag behavior after setRangeText on ${data.desc}`);
}
+for (var tag of ['input', 'textarea']) {
+ test(function() {
+ var el = document.createElement(tag);
+ document.body.appendChild(el);
+ this.add_cleanup(() => el.remove());
+ el.value = "";
+ assert_equals(el.selectionStart, el.value.length,
+ "element.selectionStart should be value.length");
+ assert_equals(el.selectionEnd, el.value.length,
+ "element.selectionEnd should be value.length");
+ el.value = "foo";
+ assert_equals(el.selectionStart, el.value.length,
+ "element.selectionStart should be value.length");
+ assert_equals(el.selectionEnd, el.value.length,
+ "element.selectionEnd should be value.length");
+ el.value = "foobar";
+ assert_equals(el.selectionStart, el.value.length,
+ "element.selectionStart should be value.length");
+ assert_equals(el.selectionEnd, el.value.length,
+ "element.selectionEnd should be value.length");
+ }, `selection is always collapsed to the end after setting values on ${tag}`);
+}
+
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-checkvalidity.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-checkvalidity.html
new file mode 100644
index 00000000000..55d3091a0ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-checkvalidity.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>button_checkValidity</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><button id='button_id'>button</button></p>
+ </form>
+ <script>
+
+ var button = document.getElementById("button_id");
+
+ try
+ {
+ var ret = button.checkValidity();
+
+ test(function() {
+ assert_equals(ret, true, "calling of checkValidity method is failed.");
+ });
+ }
+ catch (e) {
+ test(function() {
+ assert_unreached("autofocus attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-labels.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-labels.html
new file mode 100644
index 00000000000..92a6efdbd20
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-labels.html
@@ -0,0 +1,48 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>button_labels</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><label>Full name:<label>(name)<button id='button_id1'>button1</button><small>Format: First Last</small></label></label></p>
+ <p><label>Age: <button id='button_id2'>button2</button></label></p>
+ </form>
+ <script>
+
+ var button1 = document.getElementById("button_id1");
+ var button2 = document.getElementById("button_id2");
+
+ if (typeof(button1.labels) == "object") {
+ if (button1.labels.length == 2 && button2.labels.length == 1) {
+ test(function() {
+ assert_true(true, "labels attribute is correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("labels attribute is not correct.");
+ });
+ }
+ } else {
+ test(function() {
+ assert_unreached("labels attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-setcustomvalidity.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-setcustomvalidity.html
new file mode 100644
index 00000000000..64406ab3193
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-setcustomvalidity.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>button_setCustomValidity</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><button id='button_id'>button</button></p>
+ </form>
+ <script>
+
+ var button = document.getElementById("button_id");
+
+ try
+ {
+ button.setCustomValidity("custom error");
+ test(function() {
+ assert_true(true, "calling of setCustomValidity method is successed.");
+ });
+ }
+ catch (e) {
+ test(function() {
+ assert_unreached("Error is raised.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-validationmessage.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-validationmessage.html
new file mode 100644
index 00000000000..a2572ed7be6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-validationmessage.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>button_validationMessage</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><button id='button_id'>button</button></p>
+ </form>
+ <script>
+
+ var button = document.getElementById("button_id");
+
+ if (typeof(button.validationMessage) == "string") {
+ test(function() {
+ assert_equals(button.validationMessage, "", "validationMessage attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("validationMessage attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-validity.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-validity.html
new file mode 100644
index 00000000000..acc02d92bf5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-validity.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>button_validity</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><button id='button_id'>button</button></p>
+ </form>
+ <script>
+
+ var button = document.getElementById("button_id");
+
+ if (typeof(button.validity) == "object") {
+ test(function() {
+ assert_equals(button.validity.valueMissing, false, "validity attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("validity attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-willvalidate.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-willvalidate.html
new file mode 100644
index 00000000000..e91c5e38437
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-button-element/button-willvalidate.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>button_willValidate</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><button id='button_id'>button</button></p>
+ </form>
+ <script>
+
+ var button = document.getElementById("button_id");
+
+ if (typeof(button.willValidate) == "boolean") {
+ test(function() {
+ assert_equals(button.willValidate, true, "willValidate attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("willValidate attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html
new file mode 100644
index 00000000000..eeeca1853b8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-checkvalidity.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>FieldSet_checkValidity</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <fieldset id="input_field">
+ </fieldset>
+ </form>
+ <script>
+
+ var field = document.getElementById("input_field");
+
+ try
+ {
+ var ret = field.checkValidity();
+
+ test(function() {
+ assert_equals(ret, true, "calling of checkValidity method is failed.");
+ });
+ }
+ catch (e) {
+ test(function() {
+ assert_unreached("Error is raised.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html
new file mode 100644
index 00000000000..6a6d445ac97
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-setcustomvalidity.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>FieldSet_setCustomValidity</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <fieldset id="input_field">
+ </fieldset>
+ </form>
+ <script>
+
+ var field = document.getElementById("input_field");
+
+ try
+ {
+ field.setCustomValidity("custom error");
+ test(function() {
+ assert_true(true, "calling of setCustomValidity method is successed.");
+ });
+ }
+ catch (e) {
+ test(function() {
+ assert_unreached("Error is raised.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html
new file mode 100644
index 00000000000..14dda76a139
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-validationmessage.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>FieldSet_validationMessage</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <fieldset id="input_field">
+ </fieldset>
+ </form>
+ <script>
+
+ var field = document.getElementById("input_field");
+
+ if (typeof(field.validationMessage) == "string") {
+ test(function() {
+ assert_equals(field.validationMessage, "", "validationMessage attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("validationMessage attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-validity.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-validity.html
new file mode 100644
index 00000000000..7fd2d85656c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-validity.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>FieldSet_validity</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <fieldset id="input_field">
+ </fieldset>
+ </form>
+ <script>
+
+ var field = document.getElementById("input_field");
+
+ if (typeof(field.validity) == "object") {
+ test(function() {
+ assert_equals(field.validity.valueMissing, false, "validity attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("validity attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html
new file mode 100644
index 00000000000..357c9c16fb5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-fieldset-element/fieldset-willvalidate.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>FieldSet_willValidate</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <fieldset id="input_field">
+ </fieldset>
+ </form>
+ <script>
+
+ var field = document.getElementById("input_field");
+
+ if (typeof(field.willValidate) == "boolean") {
+ test(function() {
+ assert_equals(field.willValidate, false, "willValidate attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("willValidate attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-action.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-action.html
new file mode 100644
index 00000000000..14717c5e6aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-action.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>Form_action</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action="http://www.google.com/"
+ id="input_form">
+ <p><input type=hidden name="custname"></p>
+ <p><input type=hidden name="custtel"></p>
+ <p><input type=hidden name="custemail"></p>
+
+ </form>
+ <script>
+
+ var form = document.getElementById("input_form");
+
+ if (typeof(form.action) == "string") {
+ test(function() {
+ assert_equals(form.action, "http://www.google.com/", "action attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("action attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-checkvalidity.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-checkvalidity.html
new file mode 100644
index 00000000000..941ab94d45d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-checkvalidity.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>Form_checkValidity</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><input type=hidden name="custname"></p>
+ <p><input type=hidden name="custtel"></p>
+ <p><input type=hidden name="custemail"></p>
+
+ </form>
+ <script>
+
+ var form = document.getElementById("input_form");
+
+ try
+ {
+ var ret = form.checkValidity();
+
+ test(function() {
+ assert_equals(ret, true, "calling of checkValidity method is failed.");
+ });
+ }
+ catch (e) {
+ test(function() {
+ assert_unreached("Error is raised.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-elements-filter.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-elements-filter.html
index 7d6a6e28e37..693560188a1 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-elements-filter.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-elements-filter.html
@@ -159,6 +159,11 @@
<meter id="after-unassociated-meter1"></meter>
<progress id="after-unassociated-progress1"></progress>
+<form id="form2">
+ <span id="shadow-1"></span>
+</form>
+<span id="shadow-2"></span>
+
<script>
"use strict";
test(() => {
@@ -169,4 +174,19 @@ test(() => {
assert_array_equals(ids, allCorrectIDs);
});
+
+test(() => {
+ const shadowRoot1 = document.querySelector("#shadow-1").attachShadow({mode: "open"});
+ const input1 = document.createElement("input");
+ shadowRoot1.appendChild(input1);
+
+ const shadowRoot2 = document.querySelector("#shadow-2").attachShadow({mode: "open"});
+ const input2 = document.createElement("input");
+ input2.setAttribute("form", "form2");
+ shadowRoot2.appendChild(input2);
+
+ assert_equals(document.querySelector("#form2").elements.length, 0);
+ assert_equals(input1.form, null);
+ assert_equals(input2.form, null);
+}, "form.elements only includes elements from the same shadow tree");
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-length.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-length.html
new file mode 100644
index 00000000000..3326809fc6e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-form-element/form-length.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>Form_length</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><input type=hidden name="custname"></p>
+ <p><input type=hidden name="custtel"></p>
+ <p><input type=hidden name="custemail"></p>
+
+ </form>
+ <script>
+
+ var form = document.getElementById("input_form");
+ var len = form.length;
+
+ test(function() {
+ assert_equals(len, 3, "length attribute is not correct.");
+ });
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/files.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/files.html
index 107b86c08aa..93088330d37 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/files.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/files.html
@@ -31,9 +31,14 @@ var types = [
types.forEach(function(type) {
test(function() {
- var input = document.createElement("input");
+ const input = document.createElement("input"),
+ input2 = document.createElement("input");
input.type = type;
+ input2.type = "file";
assert_equals(input.files, null, "files should be null");
+
+ input.files = input2.files;
+ assert_equals(input.files, null, "files should remain null as it cannot be set when it does not apply");
}, "files for input type=" + type);
});
@@ -45,4 +50,22 @@ test(function() {
var files = input.files;
assert_equals(input.files, files, "files should return the same object");
}, "files for input type=file");
+
+test(() => {
+ const i1 = document.createElement("input"),
+ i2 = document.createElement("input");
+ i1.type = "file";
+ i2.type = "file";
+
+ const files = i2.files;
+ i1.files = i2.files;
+ assert_equals(i1.files, files, "FileList should not be copied");
+ assert_equals(i2.files, files, "FileList can be shared across input elements");
+
+ i1.files = null;
+ assert_equals(i1.files, files, "files cannot be set to null");
+
+ assert_throws(new TypeError(), () => i1.files = [], "files cannot be set to an array");
+ assert_throws(new TypeError(), () => i1.files = [new File([], "x")], "files cannot be set to an array (even when it contains File objects)");
+}, "setting <input type=file>.files");
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-checkvalidity.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-checkvalidity.html
new file mode 100644
index 00000000000..b336204fccd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-checkvalidity.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_checkValidity</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><input type='hidden' id='input_text'></p>
+ </form>
+ <script>
+
+ var input = document.getElementById("input_text");
+
+ try
+ {
+ var ret = input.checkValidity();
+
+ test(function() {
+ assert_equals(ret, true, "calling of checkValidity method is failed.");
+ });
+ }
+ catch (e) {
+ test(function() {
+ assert_unreached("Error is raised.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-height.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-height.html
new file mode 100644
index 00000000000..dea4f417652
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-height.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_height</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ name="input_form">
+ <p><input type='image' id='input_text'></p>
+ </form>
+
+ <script>
+
+ var input_text = document.getElementById("input_text");
+ input_text.height = 30;
+
+ if (typeof(input_text.height) == "number") {
+ test(function() {
+ assert_equals(input_text.height, 30, "formTarget attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("height attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-labels.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-labels.html
new file mode 100644
index 00000000000..77f4d8b31a5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-labels.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_labels</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><label>Full name:<label>(name)<input name=fn id='input_text1'> <small>Format: First Last</small></label></label></p>
+ <p><label>Age: <input name=age type=number min=0 id='input_text2'></label></p>
+ <p><label>Post code: <input name=pc> <small>Format: AB12 3CD</small></label></p>
+ </form>
+ <script>
+
+ var input1 = document.getElementById("input_text1");
+ var input2 = document.getElementById("input_text2");
+
+ if (typeof(input1.labels) == "object") {
+ if (input1.labels.length == 2 && input2.labels.length == 1) {
+ test(function() {
+ assert_true(true, "labels attribute is correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("labels attribute is not correct.");
+ });
+ }
+ } else {
+ test(function() {
+ assert_unreached("labels attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-setcustomvalidity.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-setcustomvalidity.html
new file mode 100644
index 00000000000..7d210972589
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-setcustomvalidity.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_setCustomValidity</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><input type='hidden' id='input_text'></p>
+ </form>
+ <script>
+
+ var input = document.getElementById("input_text");
+
+ try
+ {
+ input.setCustomValidity("custom error");
+ test(function() {
+ assert_true(true, "calling of setCustomValidity method is successed.");
+ });
+ }
+ catch (e) {
+ test(function() {
+ assert_unreached("Error is raised.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-stepdown.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-stepdown.html
new file mode 100644
index 00000000000..9ce5e5e1f45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-stepdown.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_stepDown</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ name="input_form">
+ <p><input type='number' id='input_number'></p>
+ </form>
+
+ <script>
+ var input_number = document.getElementById("input_number");
+ input_number.max = "30";
+ input_number.step = "3";
+ input_number.value = "30";
+ input_number.stepDown(5);
+
+ if (typeof(input_number.stepDown) == "function") {
+ test(function() {
+ assert_equals(input_number.value, "15", "call of stepDown method is failed.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("stepDown attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-stepup.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-stepup.html
new file mode 100644
index 00000000000..47457066e3c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-stepup.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_stepUp</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ name="input_form">
+ <p><input type='number' id='input_number'></p>
+ </form>
+
+ <script>
+
+ var input_number = document.getElementById("input_number");
+ input_number.max = "30";
+ input_number.step = "3";
+ input_number.value = "0";
+ input_number.stepUp(5);
+
+ if (typeof(input_number.stepUp) == "function") {
+ test(function() {
+ assert_equals(input_number.value, "15", "call of stepUp method is failed.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("stepUp attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-validationmessage.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-validationmessage.html
new file mode 100644
index 00000000000..775c06f06e5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-validationmessage.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_validationMessage</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><input type='hidden' id='input_text'></p>
+ </form>
+ <script>
+
+ var input = document.getElementById("input_text");
+
+ if (typeof(input.validationMessage) == "string") {
+ test(function() {
+ assert_equals(input.validationMessage, "", "validationMessage attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("validationMessage attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-validity.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-validity.html
new file mode 100644
index 00000000000..719144d511f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-validity.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_validity</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><input type='hidden' id='input_text'></p>
+ </form>
+ <script>
+
+ var input = document.getElementById("input_text");
+
+ if (typeof(input.validity) == "object") {
+ test(function() {
+ assert_equals(input.validity.valueMissing, false, "validity attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("validity attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-value-invalidstateerr.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-value-invalidstateerr.html
new file mode 100644
index 00000000000..78e6624e7c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-value-invalidstateerr.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_value_INVALID_STATE_ERR</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ name="input_form">
+ <p><input type='file' id='input_file'></p>
+ </form>
+
+ <script>
+
+ var input_file = document.getElementById("input_file");
+ try {
+ input_file.value = "val";
+ test(function() {
+ assert_unreached("INVALID_STATE_ERR error is not raised.");
+ });
+ } catch (e) {
+ test(function() {
+ assert_equals(e.code, e["INVALID_STATE_ERR"], "INVALID_STATE_ERR error is not raised.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html
new file mode 100644
index 00000000000..bd49a15fc82
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasdate-invalidstateerr.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_valueAsDate_INVALID_STATE_ERR</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ name="input_form">
+ <p><input type='checkbox' id='input_checkbox'></p>
+ </form>
+
+ <script>
+ var input_checkbox = document.getElementById("input_checkbox");
+ try {
+ input_checkbox.valueAsDate = new Date('2011-11-01');
+ test(function() {
+ assert_reached("INVALID_STATE_ERR error is not raised.");
+ });
+ }
+ catch (e) {
+ test(function() {
+ assert_equals(e.code, e["INVALID_STATE_ERR"], "INVALID_STATE_ERR error is not raised.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html
new file mode 100644
index 00000000000..a3187ff3fbc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-valueasnumber-invalidstateerr.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_valueAsNumber_INVALID_STATE_ERR</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ name="input_form">
+ <p><input type='checkbox' id='input_checkbox'></p>
+ </form>
+
+ <script>
+
+ var input_checkbox = document.getElementById("input_checkbox");
+ try {
+ input_checkbox.valueAsNumber = 5;
+ }
+ catch (e) {
+ test(function() {
+ assert_equals(e.code, e["INVALID_STATE_ERR"], "INVALID_STATE_ERR error is not raised.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-width.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-width.html
new file mode 100644
index 00000000000..5278ff77e1e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-width.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_width</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ name="input_form">
+ <p><input type='image' id='input_text'></p>
+ </form>
+
+ <script>
+
+ var input_text = document.getElementById("input_text");
+ input_text.width = 30;
+
+ if (typeof(input_text.width) == "number") {
+ test(function() {
+ assert_equals(input_text.width, 30, "width attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("width attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-willvalidate.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-willvalidate.html
new file mode 100644
index 00000000000..e4bcf2e11ea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-willvalidate.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Forms</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>
+ <h3>input_willValidate</h3>
+ </p>
+
+ <hr>
+
+ <div id="log"></div>
+
+ <form method="post"
+ enctype="application/x-www-form-urlencoded"
+ action=""
+ id="input_form">
+ <p><input type='hidden' id='input_text'></p>
+ </form>
+ <script>
+
+ var input = document.getElementById("input_text");
+
+ if (typeof(input.willValidate) == "boolean") {
+ test(function() {
+ assert_equals(input.willValidate, false, "willValidate attribute is not correct.");
+ });
+ } else {
+ test(function() {
+ assert_unreached("willValidate attribute is not exist.");
+ });
+ }
+
+ </script>
+
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/iframe-label-attributes.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/iframe-label-attributes.html
new file mode 100644
index 00000000000..3f08a290946
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/iframe-label-attributes.html
@@ -0,0 +1,8 @@
+<html>
+ <body>
+ <label>
+ <div id="div1"></div>
+ </label>
+ <label for="test13"></label>
+ </body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/label-attributes.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/label-attributes.html
index 826533e0c1f..2910f2c01fa 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/label-attributes.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/label-attributes.html
@@ -32,10 +32,53 @@
<label id="lbl5" for="test7"></label>
<input id="test7">
+
+ <label id="lbl7">
+ <label id="lbl8">
+ <div id="div1">
+ <input id="test8">
+ </div>
+ </label>
+ </label>
+ <div id="div2"></div>
+
+ <label id="lbl9">
+ <label id="lbl10" for="test10">
+ <div id="div3">
+ <input id="test9">
+ </div>
+ </label>
+ </label>
+ <div id="div4"><input id="test10"></div>
+
+ <label id="lbl11">
+ <object id="obj">
+ <input id="test11">
+ <input id="test12">
+ </object>
+ </label>
+ <label id="lbl12" for="test12"><div id="div5"></div></label>
+
+ <label id="lbl13">
+ <p id="p1">
+ <input id="test13">
+ </p>
+ </label>
+
+ <div id="div6">
+ <div id="div7">
+ <label id="lbl14">
+ <label id="lbl15" for="test15">
+ <input id="test14">
+ </label>
+ </label>
+ </div>
+ </div>
+ <input id="test15">
</form>
<label id="lbl6" for="test7"></label>
-
+<div id="content" style="display: none">
<script>
//control attribute
@@ -57,6 +100,7 @@
}, "A label element not in a document can not label any element in the document.");
test(function () {
+ var labels = document.getElementById("test3").labels;
assert_equals(document.getElementById("lbl1").control, document.getElementById("test3"),
"The first labelable descendant of a label element should be its labeled control.");
@@ -64,6 +108,10 @@
document.getElementById("lbl1").insertBefore(input, document.getElementById("test2"));
assert_equals(document.getElementById("lbl1").control, input,
"The first labelable descendant of a label element in tree order should be its labeled control.");
+ assert_equals(input.labels.length, 1,
+ "The form control has an ancestor with no explicit associated label, and is the first labelable descendant.");
+ assert_equals(labels.length, 0,
+ "The number of labels should be 0 if it's not the first labelable descendant of a label element.");
input.remove();
}, "The labeled control for a label element that has no 'for' attribute is the first labelable element which is a descendant of that label element.");
@@ -101,6 +149,168 @@
}, "A form control has multiple labels.");
test(function () {
+ var labels = document.getElementById("test8").labels;
+ assert_true(labels instanceof NodeList,
+ "A form control's 'labels' property should be an instance of a NodeList.");
+ assert_equals(labels.length, 2,
+ "The form control has two ancestors with no explicit associated label, and is the first labelable descendant.");
+ assert_array_equals(labels, [document.getElementById("lbl7"), document.getElementById("lbl8")],
+ "The labels for a form control should be returned in tree order.");
+
+ document.getElementById('div2').insertBefore(document.getElementById('div1'), document.getElementById('div2').firstChild);
+ assert_equals(labels.length, 0,
+ "The number of labels should be 0 after the labelable element is moved to outside of nested associated labels.");
+ }, "A labelable element is moved to outside of nested associated labels.");
+
+ test(function () {
+ var labels1 = document.getElementById("test9").labels;
+ var labels2 = document.getElementById("test10").labels;
+ assert_true(labels1 instanceof NodeList,
+ "A form control's 'labels' property should be an instance of a NodeList.");
+ assert_true(labels2 instanceof NodeList,
+ "A form control's 'labels' property should be an instance of a NodeList.");
+ assert_equals(labels1.length, 1,
+ "The form control has an ancestor with no explicit associated label, and is the first labelable descendant.");
+ assert_equals(labels2.length, 1,
+ "The number of labels associated with a form control should be the number of label elements for which it is a labeled control.");
+ assert_array_equals(labels1, [document.getElementById("lbl9")],
+ "The labels for a form control should be returned in tree order.");
+ assert_array_equals(labels2, [document.getElementById("lbl10")],
+ "The labels for a form control should be returned in tree order.");
+ document.getElementById('div3').insertBefore(document.getElementById('div4'), document.getElementById('div3').firstChild);
+ assert_equals(labels1.length, 0,
+ "The number of labels should be 0 if it's not the first labelable descendant of a label element.");
+ assert_equals(labels2.length, 2,
+ "The form control has an ancestor with an explicit associated label, and is the first labelable descendant.");
+ }, "A labelable element is moved to inside of nested associated labels.");
+
+ test(function () {
+ var labels1 = document.getElementById("test11").labels;
+ var labels2 = document.getElementById("test12").labels;
+ assert_true(labels1 instanceof NodeList,
+ "A form control's 'labels' property should be an instance of a NodeList.");
+ assert_true(labels2 instanceof NodeList,
+ "A form control's 'labels' property should be an instance of a NodeList.");
+ assert_equals(labels1.length, 1,
+ "The form control has an ancestor with no explicit associated label, and it is the first labelable descendant.");
+ assert_equals(labels2.length, 1,
+ "The number of labels should be 1 since there is a label with a 'for' attribute associated with this labelable element.");
+ assert_array_equals(labels1, [document.getElementById("lbl11")],
+ "The labels for a form control should be returned in tree order.");
+ assert_array_equals(labels2, [document.getElementById("lbl12")],
+ "The labels for a form control should be returned in tree order.");
+ document.getElementById('div5').appendChild(document.getElementById('obj'));
+ assert_equals(labels1.length, 0,
+ "The number of labels should be 0 after the labelable element is moved to outside of associated label.");
+ assert_equals(labels2.length, 1,
+ "The number of labels should be 1 after the labelable element is moved to outside of associated label.");
+ }, "A labelable element which is a descendant of non-labelable element is moved to outside of associated label.");
+
+ async_test(function () {
+ var labels = document.getElementById("test13").labels;
+ assert_true(labels instanceof NodeList,
+ "A form control's 'labels' property should be an instance of a NodeList.");
+ assert_equals(labels.length, 1,
+ "The form control has an ancestor with no explicit associated label, and is the first labelable descendant.");
+ assert_array_equals(labels, [document.getElementById("lbl13")],
+ "The labels for a form control should be returned in tree order.");
+ let iframe = document.createElement('iframe');
+
+ iframe.onload = this.step_func_done(() => {
+ iframe.contentWindow.document.getElementById("div1").appendChild(document.getElementById("p1"));
+ assert_equals(labels.length, 2,
+ "The number of labels should be 2 after the labelable element is moved to iframe.");
+ });
+
+ iframe.setAttribute('src', 'http://web-platform.test:8000/html/semantics/forms/the-label-element/iframe-label-attributes.html');
+ document.body.appendChild(iframe);
+ }, "A labelable element is moved to iframe.");
+
+ test(function () {
+ var labels1 = document.getElementById("test14").labels;
+ var labels2 = document.getElementById("test15").labels;
+ assert_true(labels1 instanceof NodeList,
+ "A form control's 'labels' property should be an instance of a NodeList.");
+ assert_equals(labels1.length, 1,
+ "The form control has an ancestor with no explicit associated label, and is the first labelable descendant.");
+ assert_equals(labels2.length, 1,
+ "The number of labels associated with a form control should be the number of label elements for which it is a labeled control.");
+ assert_array_equals(labels1, [document.getElementById("lbl14")],
+ "The labels for a form control should be returned in tree order.");
+
+ document.getElementById('div6').removeChild(document.getElementById('div7'));
+ assert_equals(labels1.length, 0,
+ "The number of labels should be 0 after the labelable element is removed.");
+ assert_equals(labels2.length, 0,
+ "The number of labels should be 0 since there is no label with a 'for' attribute associated with this labelable element.");
+ }, "A div element which contains labelable element is removed.");
+
+ test(function () {
+ // <label><input id="test16"><label for="test16"></label></label>
+ var label1 = document.createElement('label');
+ label1.innerHTML = "<input id='test16'>";
+ var label2 = document.createElement('label');
+ label2.htmlFor = "test16";
+ label1.appendChild(label2);
+
+ var input = label1.firstChild;
+ var labels = input.labels;
+
+ assert_equals(labels.length, 2,
+ "The number of labels associated with a form control should be the number of label elements for which it is a labeled control.");
+ assert_true(labels instanceof NodeList,
+ "A form control's 'labels' property should be an instance of a NodeList.");
+ assert_equals(label1.control, input, "The first labelable descendant of a label element should be its labeled control.");
+ assert_equals(label2.control, input, "The labeled cotrol should be associated with the control whose ID is equal to the value of the 'for' attribute.");
+ }, "A labelable element not in a document can label element in the same tree.");
+
+ test(function () {
+ var isShadowDOMV0;
+ if ("createShadowRoot" in document.getElementById('content')) {
+ isShadowDOMV0 = true;
+ }
+ var root1;
+ if (isShadowDOMV0) {
+ root1 = document.getElementById('content').createShadowRoot();
+ } else {
+ root1 = document.getElementById('content').attachShadow({mode: 'open'});
+ }
+ assert_true(root1 instanceof DocumentFragment,
+ "ShadowRoot should be an instance of DocumentFragment.");
+ // <label><input id="shadow1"/></label><div id="div1"></div>
+ var label1 = document.createElement('label');
+ var input1 = document.createElement('input');
+ input1.setAttribute("id", "shadow1");
+ label1.appendChild(input1);
+ root1.appendChild(label1);
+
+ var div1 = document.createElement('div');
+ label1.appendChild(div1);
+ // <label for="shadow2"></label><input id="shadow2"/>
+ var root2;
+ if (isShadowDOMV0) {
+ root2 = div1.createShadowRoot();
+ } else {
+ root2 = div1.attachShadow({mode: 'open'});
+ }
+
+ assert_true(root2 instanceof DocumentFragment,
+ "ShadowRoot should be an instance of DocumentFragment.");
+ var label2 = document.createElement('label');
+ label2.setAttribute("for", "shadow2");
+
+ var input2 = document.createElement('input');
+ input2.setAttribute("id", "shadow2");
+ root2.appendChild(label2);
+ root2.appendChild(input2);
+
+ assert_equals(root1.getElementById("shadow1").labels.length, 1,
+ "The form control has an ancestor with no explicit associated label, and it is the first labelable descendant.");
+ assert_equals(root2.getElementById("shadow2").labels.length, 1,
+ "The number of labels should be 1 since there is a label with a 'for' attribute associated with this labelable element.");
+ }, "A labelable element inside the shadow DOM.");
+
+ test(function () {
var labels = document.getElementById("test3").labels;
assert_true(labels instanceof NodeList, "A form control's 'labels' property should be an instance of a NodeList.");
assert_equals(labels.length, 1, "The form control has an ancestor with no explicit associated label, and is the first labelable descendant.");
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/labelable-elements.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/labelable-elements.html
index 9dfe214da33..725871f9113 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/labelable-elements.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-label-element/labelable-elements.html
@@ -104,6 +104,7 @@ test(function() {
hiddenInput.type = "hidden";
assert_equals(labels.length, 0, "Retained .labels NodeList should be empty after input type changed to hidden");
+ assert_equals(hiddenInput.labels, null, ".labels NodeList should be null after input type changed to hidden");
hiddenInput.type = "checkbox";
assert_true(labels === hiddenInput.labels, ".labels property must return the [SameObject] after input type is toggled back from 'hidden'");
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-progress-element/progress.window.js b/tests/wpt/web-platform-tests/html/semantics/forms/the-progress-element/progress.window.js
new file mode 100644
index 00000000000..37526053de7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-progress-element/progress.window.js
@@ -0,0 +1,18 @@
+test(() => {
+ const pr = document.createElement("progress");
+ assert_equals(pr.value, 0);
+ assert_equals(pr.position, -1);
+ pr.value = 2;
+ assert_equals(pr.value, 1);
+ assert_equals(pr.position, 1);
+}, "If value > max, then current value = max");
+
+test(() => {
+ const pr = document.createElement("progress");
+ pr.value = 2;
+ assert_equals(pr.value, 1);
+ assert_equals(pr.position, 1);
+ pr.max = 4;
+ assert_equals(pr.value, 2);
+ assert_equals(pr.position, 0.5);
+}, "If value < max, then current value = value");
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml b/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml
new file mode 100644
index 00000000000..9462e949352
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent-xhtml.xhtml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>textarea element value/defaultValue/textContent functionality</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"/>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-textarea-value"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+"use strict";
+
+test(() => {
+
+ const textarea = document.createElement("textarea");
+
+ textarea.appendChild(document.createCDATASection("foo bar baz"));
+ assert_equals(textarea.defaultValue, "foo bar baz", "the defaultValue should reflect the textContent");
+ assert_equals(textarea.value, "foo bar baz",
+ "changing the child text content should change the raw value, and subsequently the api value");
+
+}, "defaultValue and value include CDATASection Text nodes");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html
index 84b17cc400b..a1a405fdbe7 100644
--- a/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html
+++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-textarea-element/value-defaultValue-textContent.html
@@ -1,5 +1,5 @@
<!DOCTYPE HTML>
-<title>textarea element select() functionality</title>
+<title>textarea element value/defaultValue/textContent functionality</title>
<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
<link rel="help" href="https://html.spec.whatwg.org/multipage/#dom-textarea-value">
<script src="/resources/testharness.js"></script>
@@ -32,6 +32,30 @@ test(() => {
const textarea = document.createElement("textarea");
+ textarea.textContent = "some text";
+ textarea.firstChild.nodeValue = "foo bar";
+ assert_equals(textarea.defaultValue, "foo bar", "the defaultValue should reflect the textContent");
+ assert_equals(textarea.value, "foo bar",
+ "changing the textContent should change the raw value, and subsequently the api value");
+
+}, "defaultValue and value are affected by setting nodeValue on a child text node");
+
+test(() => {
+
+ const textarea = document.createElement("textarea");
+
+ textarea.textContent = "some text";
+ textarea.firstChild.data = "foo bar";
+ assert_equals(textarea.defaultValue, "foo bar", "the defaultValue should reflect the textContent");
+ assert_equals(textarea.value, "foo bar",
+ "changing the textContent should change the raw value, and subsequently the api value");
+
+}, "defaultValue and value are affected by setting data on a child text node");
+
+test(() => {
+
+ const textarea = document.createElement("textarea");
+
textarea.textContent = "foo bar";
textarea.appendChild(document.createTextNode(" baz"));
assert_equals(textarea.defaultValue, "foo bar baz", "the defaultValue should reflect the textContent");
@@ -43,6 +67,60 @@ test(() => {
test(() => {
const textarea = document.createElement("textarea");
+ textarea.textContent = "foo bar";
+
+ const frag = document.createDocumentFragment();
+ frag.appendChild(document.createTextNode(" baz"));
+ const el = document.createElement("span");
+ el.appendChild(document.createTextNode("qux?"));
+ frag.appendChild(el);
+ frag.appendChild(document.createTextNode(" fizz"));
+ textarea.appendChild(frag);
+
+ textarea.appendChild(document.createTextNode(" whee"));
+ assert_equals(textarea.defaultValue, "foo bar baz fizz whee", "the defaultValue should reflect the textContent");
+ assert_equals(textarea.value, "foo bar baz fizz whee",
+ "changing the textContent should change the raw value, and subsequently the api value");
+
+}, "defaultValue and value are affected by textContent in combination with appending a DocumentFragment");
+
+test(() => {
+
+ const textarea = document.createElement("textarea");
+ textarea.appendChild(document.createTextNode("foo bar"));
+
+ const child = document.createElement("span");
+ child.textContent = "baz";
+ textarea.appendChild(child);
+
+ assert_equals(textarea.textContent, "foo barbaz", "the textContent should have *all* the text content");
+ assert_equals(textarea.defaultValue, "foo bar", "the defaultValue should reflect the child text content");
+ assert_equals(textarea.value, "foo bar",
+ "changing the child text content should change the raw value, and subsequently the api value");
+
+}, "defaultValue and value reflect child text content, not textContent");
+
+test(() => {
+
+ const textarea = document.createElement("textarea");
+ textarea.appendChild(document.createTextNode("foo bar"));
+
+ const child = document.createElement("span");
+ child.textContent = "baz";
+ textarea.appendChild(child);
+
+ textarea.defaultValue = "foo";
+
+ assert_equals(textarea.childNodes.length, 1, "Only one child node should exist");
+ assert_equals(textarea.defaultValue, "foo", "the defaultValue should be the new text");
+ assert_equals(textarea.value, "foo", "the api value should be the new text");
+ assert_equals(textarea.textContent, "foo", "the textContent should be the new text");
+
+}, "Setting defaultValue wipes out any children, including elements (just like setting textContent)");
+
+test(() => {
+
+ const textarea = document.createElement("textarea");
textarea.textContent = "foo\r\nbar\rbaz\nqux";
assert_equals(textarea.defaultValue, "foo\r\nbar\rbaz\nqux", "the defaultValue should reflect the textContent");
@@ -54,6 +132,17 @@ test(() => {
const textarea = document.createElement("textarea");
+ textarea.appendChild(document.createTextNode("foo\r"));
+ textarea.appendChild(document.createTextNode("\nbar\rbaz\nqux"));
+ assert_equals(textarea.defaultValue, "foo\r\nbar\rbaz\nqux", "the defaultValue should reflect the textContent");
+ assert_equals(textarea.value, "foo\nbar\nbaz\nqux", "The value property should normalize CRLF and CR to LF");
+
+}, "value normalizes CRLF even spread over multiple text nodes");
+
+test(() => {
+
+ const textarea = document.createElement("textarea");
+
textarea.textContent = "foo";
textarea.value = "baz";
assert_equals(textarea.defaultValue, "foo", "setting the value property should not affect the defaultValue");
diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html
new file mode 100644
index 00000000000..ff9ebd7d286
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus-multiple-times.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/common.js"></script>
+<script>
+promise_test(() => {
+ return waitUntilLoadedAndAutofocused().then(() => {
+ assert_equals(document.activeElement, document.getElementById("outer-button"));
+
+ var focusCount = 0;
+ var dlg = document.getElementById("dlg");
+ var input1 = document.getElementById("input1");
+ var input2 = document.getElementById("input2");
+ input2.onfocus = function() { focusCount += 1 };
+
+ var expectedFocusCount = 3;
+ for (i = 0; i < expectedFocusCount; i++) {
+ dlg.show();
+ assert_equals(document.activeElement, input2);
+ input1.focus();
+ assert_equals(document.activeElement,input1);
+ dlg.close();
+ }
+
+ assert_equals(focusCount.toString(), expectedFocusCount.toString());
+ });
+}, "autofocus is run every time a dialog is opened");
+</script>
+</head>
+<body>
+<button id="outer-button" autofocus></button>
+<dialog id="dlg">
+ <!-- Unfocusable elements with [autofocus] should be ignored. -->
+ <input autofocus disabled>
+ <textarea autofocus hidden></textarea>
+ <input id="input1"></input>
+ <input id="input2" autofocus></input>
+</dialog>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html
new file mode 100644
index 00000000000..149a53eacff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-autofocus.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/common.js"></script>
+<script>
+promise_test(() => {
+ return waitUntilLoadedAndAutofocused().then(() => {
+ assert_equals(document.activeElement, document.getElementById("outer-button"));
+
+ var dialog = document.getElementById('dialog');
+ dialog.showModal();
+
+ autofocusButton = document.getElementById('autofocus-button');
+ assert_equals(document.activeElement, autofocusButton);
+
+ anotherButton = document.getElementById('another-button');
+ anotherButton.focus();
+ assert_equals(document.activeElement, anotherButton);
+
+ // Test that recreating layout does not give focus back to a previously autofocused element.
+ autofocusButton.style.display = 'none';
+ document.body.offsetHeight;
+ autofocusButton.style.display = 'block';
+ document.body.offsetHeight;
+ assert_equals(document.activeElement, anotherButton);
+
+ // Test that reinserting does not give focus back to a previously autofocused element.
+ var parentNode = autofocusButton.parentNode;
+ parentNode.removeChild(autofocusButton);
+ document.body.offsetHeight;
+ parentNode.appendChild(autofocusButton);
+ document.body.offsetHeight;
+ assert_equals(document.activeElement, anotherButton);
+
+ dialog.close();
+ // Test that dialog focusing steps run when a dialog is reopened.
+ dialog.showModal();
+ assert_equals(document.activeElement, autofocusButton);
+ dialog.close();
+ });
+}, "autofocus when a modal dialog is opened");
+</script>
+</head>
+<body>
+<button id="outer-button" autofocus></button>
+<dialog id="dialog">
+ <button></button>
+ <!-- Unfocusable elements with [autofocus] should be ignored. -->
+ <input autofocus disabled>
+ <textarea autofocus hidden></textarea>
+ <dialog>
+ <button autofocus></button>
+ </dialog>
+ <div>
+ <span>
+ <button id="autofocus-button" autofocus></button>
+ </span>
+ </div>
+ <button id="another-button" autofocus></button>
+</dialog>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html
index 30b30e1271b..b40d5fb94cf 100644
--- a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html
+++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-showModal.html
@@ -38,6 +38,9 @@
<input id="i82" value="foobar" autofocus>
<button id="b8">OK</button>
</dialog>
+<dialog id="d9"></dialog>
+<dialog id="d10"></dialog>
+<dialog id="d11"></dialog>
<script>
var d1 = document.getElementById('d1'),
d2 = document.getElementById('d2'),
@@ -47,6 +50,9 @@
d6 = document.getElementById('d6'),
d7 = document.getElementById('d7'),
d8 = document.getElementById('d8'),
+ d9 = document.getElementById('d9'),
+ d10 = document.getElementById('d10'),
+ d11 = document.getElementById('d11'),
b0 = document.getElementById('b0'),
b1 = document.getElementById('b1'),
b3 = document.getElementById('b3'),
@@ -55,9 +61,11 @@
test(function(){
assert_false(d1.open);
+ assert_false(d1.hasAttribute("open"));
d1.showModal();
this.add_cleanup(function() { d1.close(); });
assert_true(d1.open);
+ assert_equals(d1.getAttribute("open"), "");
assert_equals(document.activeElement, b1);
});
@@ -69,6 +77,16 @@
}, "showModal() on a <dialog> that already has an open attribute throws an InvalidStateError exception");
test(function(){
+ d9.showModal();
+ this.add_cleanup(function() { d9.close(); });
+ assert_true(d9.open);
+ d9.removeAttribute("open");
+ assert_false(d9.open);
+ d9.showModal();
+ assert_true(d9.open);
+ }, "showModal() on a <dialog> after initial showModal() and removing the open attribute");
+
+ test(function(){
var d = document.createElement("dialog");
assert_throws("INVALID_STATE_ERR", function() {
d.showModal();
@@ -114,4 +132,41 @@
assert_true(d8.open);
assert_equals(document.activeElement, document.getElementById("i82"));
}, "opening dialog with multiple focusable children, one having the autofocus attribute");
+
+ test(function(){
+ assert_false(d10.open);
+ assert_false(d11.open);
+ d10.showModal();
+ this.add_cleanup(function() { d10.close(); });
+ d11.showModal();
+ this.add_cleanup(function() { d11.close(); });
+ var rect10 = d10.getBoundingClientRect();
+ var rect11 = d11.getBoundingClientRect();
+
+ // The two <dialog>s are both in top layer, with the same position/size.
+ assert_equals(rect10.left, rect11.left);
+ assert_equals(rect10.top, rect11.top);
+ assert_equals(rect10.width, rect11.width);
+ assert_equals(rect10.height, rect11.height);
+
+ var pointX = rect10.left + rect10.width / 2,
+ pointY = rect10.top + rect10.height / 2;
+ function topElement() {
+ return document.elementFromPoint(pointX, pointY);
+ }
+
+ // d11 was most recently openened, and thus on top.
+ assert_equals(topElement(), d11);
+
+ // Removing the open attribute and running through the showModal() algorithm
+ // again should not promote d10 to the top.
+ d10.removeAttribute("open");
+ assert_equals(topElement(), d11);
+ d10.showModal();
+ assert_equals(topElement(), d11);
+
+ // Closing d11 with close() should cause d10 to be the topmost element.
+ d11.close();
+ assert_equals(topElement(), d10);
+ }, "when opening multiple dialogs, the most recently opened is rendered on top");
</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/resources/common.js b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/resources/common.js
new file mode 100644
index 00000000000..c72ed7f19c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/resources/common.js
@@ -0,0 +1,18 @@
+function waitUntilLoadedAndAutofocused() {
+ return new Promise(function(resolve) {
+ var loaded = false;
+ var autofocused = false;
+ window.addEventListener('load', function() {
+ loaded = true;
+ if (autofocused)
+ resolve();
+ }, false);
+ document.addEventListener('focusin', function() {
+ if (autofocused)
+ return;
+ autofocused = true;
+ if (loaded)
+ resolve();
+ }, false);
+ });
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/interfaces.js b/tests/wpt/web-platform-tests/html/semantics/interfaces.js
index 5ccc891c358..96abf61e2ce 100644
--- a/tests/wpt/web-platform-tests/html/semantics/interfaces.js
+++ b/tests/wpt/web-platform-tests/html/semantics/interfaces.js
@@ -3,7 +3,7 @@ var elements = [
["abbr", ""],
["acronym", ""],
["address", ""],
- ["applet", "Applet"],
+ ["applet", "Unknown"],
["area", "Area"],
["article", ""],
["aside", ""],
diff --git a/tests/wpt/web-platform-tests/html/semantics/links/following-hyperlinks/activation-behavior.window.js b/tests/wpt/web-platform-tests/html/semantics/links/following-hyperlinks/activation-behavior.window.js
new file mode 100644
index 00000000000..d530642b9e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/links/following-hyperlinks/activation-behavior.window.js
@@ -0,0 +1,50 @@
+["a",
+ "area"].forEach(type => {
+
+ const followed = type === "a" ? true : false;
+ async_test(t => {
+ const target = document.createElement("iframe"),
+ link = document.createElement(type);
+ t.add_cleanup(() => target.remove());
+ target.name = "certifiedrandom" + type;
+ link.target = "certifiedrandom" + type;
+ link.href = "/";
+ document.body.appendChild(target);
+ target.onload = t.step_func(() => {
+ if(target.contentWindow.location.href === "about:blank")
+ return;
+ if(followed) {
+ assert_equals(target.contentWindow.location.pathname, "/");
+ t.done();
+ } else {
+ assert_unreached();
+ }
+ });
+ link.click();
+ t.step_timeout(() => {
+ if(followed) {
+ assert_unreached();
+ } else {
+ t.done();
+ }
+ }, 500);
+ }, "<" + type + "> that is not connected should " + (followed ? "" : "not ") + "be followed");
+
+ async_test(t => {
+ const target = document.createElement("iframe"),
+ doc = document.implementation.createDocument("", ""),
+ link = doc.createElementNS("http://www.w3.org/1999/xhtml", type);
+ t.add_cleanup(() => target.remove());
+ target.name = "certifiedrandom2" + type;
+ link.target = "certifiedrandom2" + type;
+ link.href = "/";
+ document.body.appendChild(target);
+ target.onload = t.step_func(() => {
+ if(target.contentWindow.location.href === "about:blank")
+ return;
+ assert_unreached();
+ });
+ link.click();
+ t.step_timeout(() => t.done(), 500);
+ }, "<" + type + "> that is from an inactive document should not be followed");
+});
diff --git a/tests/wpt/web-platform-tests/html/semantics/links/following-hyperlinks/active-document.window.js b/tests/wpt/web-platform-tests/html/semantics/links/following-hyperlinks/active-document.window.js
new file mode 100644
index 00000000000..efa16e7d179
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/links/following-hyperlinks/active-document.window.js
@@ -0,0 +1,23 @@
+["a",
+ "area",
+ "link"].forEach(type => {
+ async_test(t => {
+ const frame = document.createElement("iframe"),
+ link = document.createElement(type);
+ t.add_cleanup(() => frame.remove());
+ frame.onload = t.step_func(() => {
+ // See https://github.com/whatwg/html/issues/490
+ if(frame.contentWindow.location.href === "about:blank")
+ return;
+ link.click(); // must be ignored because document is not active
+ t.step_timeout(() => {
+ assert_equals(frame.contentWindow.location.pathname, "/common/blank.html");
+ t.done();
+ }, 500);
+ });
+ document.body.appendChild(frame);
+ frame.contentDocument.body.appendChild(link);
+ link.href = "/";
+ frame.src = "/common/blank.html";
+ }, "<" + type + "> in navigated away <iframe>'s document cannot follow hyperlinks");
+});
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/001.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/001.html
new file mode 100644
index 00000000000..3f54f764f98
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/001.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: inline in markup </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');</script>
+ <script>log('inline script #2');</script>
+
+ <script type="text/javascript">
+
+ var t = async_test()
+
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'inline script #2' ]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/002.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/002.html
new file mode 100644
index 00000000000..df7ca957993
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/002.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: external in markup </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script src="scripts/include-1.js"></script>
+ <script src="scripts/include-2.js"></script>
+
+ <script type="text/javascript">
+
+ var t = async_test()
+
+
+ function test() {
+ assert_array_equals(eventOrder, ['external script #1', 'external script #2' ]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/003.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/003.html
new file mode 100644
index 00000000000..9c23b7e715e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/003.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: inline+external in markup </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1')</script>
+ <script src="scripts/include-2.js"></script>
+
+ <script type="text/javascript">
+
+ var t = async_test()
+
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'external script #2' ]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/004.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/004.html
new file mode 100644
index 00000000000..a21dd388ebc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/004.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: external+inline in markup </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script src="scripts/include-1.js"></script>
+ <script>log('inline script #2')</script>
+
+ <script type="text/javascript">
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['external script #1', 'inline script #2' ]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/005.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/005.html
new file mode 100644
index 00000000000..ff4a66d25e7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/005.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write inline in markup </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.write( '<script>log(\'doc write script\')<\/script>' );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'doc write script', 'end script #1' ]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/006.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/006.html
new file mode 100644
index 00000000000..b8785a60c6d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/006.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write inline - multiple</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.write( '<script>log(\'doc write script 1\')<\/script>' );
+ document.write( '<script>log(\'doc write script 2\')<\/script>' );
+ eval('log(\'eval 1\')');
+ document.write( '<script>log(\'doc write script 3\')<\/script>' );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'doc write script 1','doc write script 2', 'eval 1','doc write script 3', 'end script #1' ]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/007.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/007.html
new file mode 100644
index 00000000000..edd99207575
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/007.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write external</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1' ]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/008.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/008.html
new file mode 100644
index 00000000000..dce763987f0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/008.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write external - multiple</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
+ document.write( '<script src="scripts/include-2.js">log(\'ignore this\')<\/script>' );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1', 'external script #2' ]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/009.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/009.html
new file mode 100644
index 00000000000..9d5b2de081a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/009.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write external - multiple with doc.write</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
+ document.write( '<script src="scripts/include-3.js">log(\'ignore this\')<\/script>' );
+ document.write( '<script src="scripts/include-2.js">log(\'ignore this\')<\/script>' );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1', 'external script before doc write', 'document.write external script', 'external script after doc write', 'external script #2' ]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/010.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/010.html
new file mode 100644
index 00000000000..69a462c301f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/010.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write external + inline - multiple with doc.write</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
+ document.write( '<script>log(\'inline with doc.write #1\')<\/script>' );
+ document.write( '<script src="scripts/include-2.js">log(\'ignore this\')<\/script>' );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1', 'inline with doc.write #1', 'external script #2']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/011.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/011.html
new file mode 100644
index 00000000000..33024ba59e5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/011.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write external + inline - multiple with doc.write + subsequent markup</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
+ document.write( '<script>log(\'inline with doc.write #1\')<\/script>' );
+ document.write( '<script src="scripts/include-2.js">log(\'ignore this\')<\/script>' );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1', 'inline with doc.write #1', 'external script #2', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/012.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/012.html
new file mode 100644
index 00000000000..01c9293b203
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/012.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write external and onload events </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.write( '<script src="scripts/include-1.js" onload = "log(\'include-1 load\')">log(\'ignore this\')<\/script>' )
+ document.write( '<script src="scripts/include-3.js" onload = "log(\'include-3 load\')"><\/script>' )
+ document.write( '<script src="scripts/include-2.js" onload = "log(\'include-2 load\')">log(\'ignore this\')<\/script>' )
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1', 'include-1 load', 'external script before doc write', 'document.write external script', 'external script after doc write', 'include-3 load', 'external script #2', 'include-2 load', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/013.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/013.html
new file mode 100644
index 00000000000..09616a67d4c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/013.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added inline script earlier in document</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], false);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'head script #1','end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(function(){setTimeout(t.step_func(test), 100); })
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/014.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/014.html
new file mode 100644
index 00000000000..41c90a34216
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/014.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: SCRIPT elements that move themselves in DOM </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.getElementsByTagName('head')[0].appendChild(document.getElementsByTagName('script')[2]);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log('script #2');
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'script #2']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/015.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/015.html
new file mode 100644
index 00000000000..1fa67e22ed0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/015.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added inline+external+inline script earlier in document</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], false);
+ var s = testlib.addScript('', { 'src':'scripts/include-1.js' }, document.getElementsByTagName('head')[0], false);
+ testlib.addScript('log(\'head script #2\')', {}, document.getElementsByTagName('head')[0], false);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ ///XXX I think the spec allows this case to race
+ onload = function(){
+ setTimeout(t.step_func(
+ function() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'head script #1', 'head script #2', 'end script #1', 'external script #1', 'inline script #2'],
+ ['inline script #1', 'head script #1', 'head script #2', 'end script #1', 'inline script #2', 'external script #1']]);
+ t.done();
+ }),
+ 100);}
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/015a.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/015a.html
new file mode 100644
index 00000000000..d892c70bf95
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/015a.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added inline+external+inline script earlier in document</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], false);
+ var s = testlib.addScript('', { 'src':'scripts/include-1.js?pipe=trickle(d1)' }, document.getElementsByTagName('head')[0], false);
+ testlib.addScript('log(\'head script #2\')', {}, document.getElementsByTagName('head')[0], false);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'head script #1', 'head script #2', 'end script #1', 'inline script #2', 'external script #1']);
+ t.done();
+ }
+ onload = function(){setTimeout(t.step_func(function() {test.apply(t)}), 2000); }
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/016.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/016.html
new file mode 100644
index 00000000000..1149dcc752f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/016.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added inline script later in document</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ testlib.addScript('log(\'body script #1\')', {}, document.body, false);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'body script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(function(){setTimeout(t.step_func(test), 100); })
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/017.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/017.html
new file mode 100644
index 00000000000..66675bcf114
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/017.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: multiple DOM added scripts later in document</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ testlib.addScript('log(\'body script #1\')', {}, document.getElementsByTagName('body')[0], false);
+ testlib.addScript('', { 'src':'scripts/include-1.js' }, document.getElementsByTagName('body')[0], false);
+ testlib.addScript('log(\'body script #2\')', {}, document.getElementsByTagName('body')[0], false);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ //The order of the external script vs the second inline script is undefined because the added script is async by default
+ //But we expect most UAs to have the second order
+ onload = function() {setTimeout(t.step_func(function() {
+ assert_any(assert_array_equals, eventOrder, [
+ ['inline script #1', 'body script #1', 'body script #2', 'end script #1', 'external script #1', 'inline script #2'],
+ ['inline script #1', 'body script #1', 'body script #2', 'end script #1', 'inline script #2', 'external script #1']]);
+ t.done();
+ }), 100);}
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/018.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/018.html
new file mode 100644
index 00000000000..5a349bf556f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/018.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added scripts and doc.write</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ testlib.addScript('', { 'src':'scripts/include-3.js' }, document.getElementsByTagName('head')[0], false);
+ testlib.addScript('log(\'body script #2\')', {}, document.getElementsByTagName('body')[0], true);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ //XXX Need to test this delaying the document after we insert the external script and delaying the external script itself; afaict the spec allows us to race here on whether the document.write
+ //ever actually happens or not according to whether the insertion point is defined at the point at which the script is executed.
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [
+ ['inline script #1', 'body script #2', 'end script #1', 'external script before doc write', 'document.write external script', 'external script after doc write', 'inline script #2'],
+ ['inline script #1', 'body script #2', 'end script #1', 'inline script #2', 'external script before doc write', 'document.write external script', 'external script after doc write'],
+ ['inline script #1', 'body script #2', 'end script #1', 'inline script #2', 'external script before doc write', 'external script after doc write']
+ ]);
+ t.done();
+}
+ onload = t.step_func(function(){setTimeout(test.apply(t), 100); })
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/019.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/019.html
new file mode 100644
index 00000000000..64ee4f1c521
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/019.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added scripts and event handling </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script onload="log('inline #1 load')">
+ log('inline script #1');
+ testlib.addScript('', {'src':'scripts/include-1.js', 'onload':function(){log("external #1 load")}}, document.getElementsByTagName('head')[0], false);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'external #1 load', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'inline script #2', 'external script #1', 'external #1 load']
+ ]);
+ t.done();
+ }
+ onload = function(){setTimeout(t.step_func(test), 100); }
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/020.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/020.html
new file mode 100644
index 00000000000..7d8f953e407
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/020.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added script with data: URL </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <script>log('inline script #1');
+ testlib.addScript('', { 'src':'data:text/javascript,log("data URL script")' }, document.getElementsByTagName('body')[0], true);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'data URL script', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'inline script #2', 'data URL script']]);
+ t.done();
+ }
+ onload = function() {setTimeout( t.step_func(test), 100); }
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/021.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/021.html
new file mode 100644
index 00000000000..34fdc95cb1a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/021.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added script with javascript: URL </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <script>log('inline script #1');
+ testlib.addScript('', { 'src':'javascript:log("JS URL script")' }, document.getElementsByTagName('body')[0], true);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', /*'JS URL script',*/ 'inline script #2']);
+ t.done();
+ /* pass condition changed 2010-12-01 due to CT-198 */
+ }
+ onload = t.step_func(function(){setTimeout( test, 100); })
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/022.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/022.html
new file mode 100644
index 00000000000..ccbcb347dc5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/022.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added script, late .src </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <script>log('inline script #1');
+ var script = testlib.addScript('', { }, document.getElementsByTagName('body')[0], false);
+ script.src='scripts/include-1.js';
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ onload = function() {setTimeout(t.step_func(
+ function() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'inline script #2', 'external script #1']]);
+ t.done()
+ }),
+ 100)}
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/023.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/023.html
index dc687ffe4d5..dc687ffe4d5 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/023.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/023.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/024.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/024.html
new file mode 100644
index 00000000000..ee807b56f98
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/024.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added script, .src set twice</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <script>log('inline script #1');
+ var script = testlib.addScript('', { }, document.getElementsByTagName('body')[0], false);
+ script.src='scripts/include-1.js';
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'inline script #2', 'external script #1']]);
+ t.done();
+ }
+ onload = t.step_func(function(){
+ script.src='scripts/include-2.js'; // needs to be ignored, script already "is executed"
+ setTimeout(t.step_func(test), 100);
+ })
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/025.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/025.html
new file mode 100644
index 00000000000..05c6a972843
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/025.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM added script, .src set on script with content</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <script>log('inline script #1');
+ var script = testlib.addScript('log("inline DOM script #1")', { }, document.getElementsByTagName('body')[0], false);
+ script.src='scripts/include-1.js';
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'inline DOM script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(function(){
+ setTimeout(t.step_func(test), 100);
+ })
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/026.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/026.html
new file mode 100644
index 00000000000..34110ff5baf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/026.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: doc write added script, .src set later</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <script>log('inline script #1');
+ var t = async_test();
+ document.write('<script><\/script>');
+ var scripts = document.getElementsByTagName('script');
+ scripts[scripts.length - 1].src = 'scripts/include-1.js';
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+
+ onload = function() {
+ setTimeout(
+ t.step_func(function() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'inline script #2', 'external script #1']]);
+ t.done();
+ }),
+ 100);
+ }
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/027.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/027.html
new file mode 100644
index 00000000000..e9fbe7f15c0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/027.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: doc write added script with content, .src set later</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <script>log('inline script #1');
+ document.write('<script>log(\'doc.write script\')<\/script>');
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ document.getElementsByTagName('script')[4].src='scripts/include-1.js';
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'doc.write script', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(function(){
+ setTimeout(t.step_func(test), 100);
+ })
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/028.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/028.html
new file mode 100644
index 00000000000..e383d4f1a64
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/028.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: javascript: URL</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <script>log('inline script #1');
+ window.location.replace('javascript:log(\'JS URL\')');
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [
+ ['inline script #1', 'end script #1', 'JS URL', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'inline script #2', 'JS URL']]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/029.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/029.html
new file mode 100644
index 00000000000..c74665ec1e5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/029.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: javascript: URL in HREF</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <p><a href="javascript:log('JS URL')"></a></p>
+ <script>log('inline script #1');
+ if(document.links[0].click){
+ document.links[0].click();
+ }else{
+ var evt = document.createEvent("MouseEvents");
+ evt.initMouseEvent("click", true, true, window,
+ 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+ document.links[0].dispatchEvent(evt);
+ }
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [
+ ['inline script #1', 'end script #1', 'JS URL', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'inline script #2', 'JS URL']]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/030.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/030.html
new file mode 100644
index 00000000000..f01c257e0d1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/030.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: javascript: URL in HREF, onclick handler</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <p><a href="javascript:log('JS URL')" onclick="log('click event');return true;"></a></p>
+ <script>log('inline script #1');
+ if(document.links[0].click){
+ document.links[0].click();
+ }else{
+ var evt = document.createEvent("MouseEvents");
+ evt.initMouseEvent("click", true, true, window,
+ 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+ document.links[0].dispatchEvent(evt);
+ }
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ var w = window;
+ onload = function() {setTimeout(
+ t.step_func(function() {
+ w.assert_any(w.assert_array_equals, w.eventOrder,
+ [['inline script #1', 'click event', 'end script #1', 'JS URL', 'inline script #2'],
+ ['inline script #1', 'click event', 'end script #1', 'inline script #2', 'JS URL']]);
+ t.done();
+ }), 200);
+ }
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/031.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/031.html
new file mode 100644
index 00000000000..3ddb36ab8de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/031.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: focus and blur events</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <form><input type="button" onclick="log('click event')" onfocus="log('focus event')" onblur="log('blur event')"><input type="button" onfocus="log('focus el 2 event')" onblur="log('blur event')"></form>
+ <script>log('inline script #1');
+ document.forms[0][0].focus();
+ document.forms[0][1].click();
+ document.forms[0][1].focus();
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log('inline script #2');
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'focus event', 'blur event', 'focus el 2 event', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(function(){setTimeout(t.step_func(test), 200);})
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/032.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/032.html
new file mode 100644
index 00000000000..da3969740c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/032.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: innerHTML and scripts</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>log('inline script #1');
+ // script added with innerHTML should not run..
+ document.getElementsByTagName('div')[1].innerHTML = '<script>log("innerHTML script runs")<\/script><script src="scripts/include-1.js"><\/script>';
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(function(){setTimeout(t.step_func(test), 200);})
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/033.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/033.html
new file mode 100644
index 00000000000..5c41effcde6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/033.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: innerHTML and scripts moved in DOM</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>log('inline script #1');
+ // script added with innerHTML should not run..
+ document.getElementsByTagName('div')[0].innerHTML = '<script>log("innerHTML script runs")<\/script><script src="scripts/include-1.js"><\/script>';
+ try{
+ document.body.appendChild( document.getElementsByTagName('div')[0].firstChild );
+ document.body.appendChild( document.getElementsByTagName('div')[0].firstChild );
+ }catch(e){
+ log('ERROR while testing');
+ }
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(function(){setTimeout(t.step_func(test), 200);})
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/034.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/034.html
new file mode 100644
index 00000000000..13664253a24
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/034.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: innerHTML adding frames with JS in</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>log('inline script #1');
+ document.getElementsByTagName('div')[1].innerHTML = '<iframe src="pages/helloworld.html"></iframe>';
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2', 'frame/popup script']);
+ t.done();
+ }
+ onload = t.step_func(function(){setTimeout(t.step_func(test), 200);})
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/035.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/035.html
new file mode 100644
index 00000000000..406c3c548f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/035.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: innerHTML adding frames with JS in and moving scripts</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>log('inline script #1');
+ document.getElementsByTagName('div')[1].innerHTML = '<iframe src="pages/helloworld.html"></iframe>';
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2', 'frame/popup script']);
+ t.done();
+ /*, ['inline script #1', 'end script #1', 'frame/popup script', 'inline script #2'] */
+ }
+ onload = t.step_func(function(){
+ try{
+ document.body.appendChild(document.importNode( top.frames[0].document.getElementsByTagName('script')[0], true ));
+ }catch(e){ log('ERROR - tested functionality not supported'); }
+ setTimeout(t.step_func(test), 200);
+ });
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/036.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/036.html
new file mode 100644
index 00000000000..113541dab9d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/036.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM cloning</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>log('inline script #1');
+ testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], true);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ try{
+ var script = document.getElementsByTagName('script')[0].cloneNode(true);
+ document.body.appendChild(script);
+ }catch(e){ log('ERROR - tested functionality not supported'); }
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'head script #1', 'end script #1', 'inline script #2' ]);
+ t.done();
+ }
+ onload = t.step_func(function(){
+ setTimeout(t.step_func(test), 200);
+ });
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/037.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/037.html
new file mode 100644
index 00000000000..15bd8a96e0b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/037.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM movement with appendChild, inline</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>log('inline script #1');
+ var script = testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], true);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ try{
+ document.body.appendChild(script);
+ }catch(e){ log('ERROR - tested functionality not supported'); }
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'head script #1', 'end script #1', 'inline script #2' ]);
+ t.done();
+ }
+ onload = t.step_func(function(){
+ setTimeout(t.step_func(test), 200);
+ });
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/038.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/038.html
new file mode 100644
index 00000000000..db6cec35207
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/038.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM movement with appendChild, external</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>log('inline script #1');
+ var script = testlib.addScript('', { 'src':'scripts/include-1.js' }, document.getElementsByTagName('head')[0], true);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ try{
+ document.body.appendChild(script);
+ }catch(e){ log('ERROR - tested functionality not supported'); }
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'inline script #2', 'external script #1']]);
+ t.done();
+ }
+ onload = function() {
+ setTimeout(t.step_func(test), 200);
+ };
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/039.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/039.html
index a0abdf1610f..a0abdf1610f 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/039.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/039.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/040.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/040.html
new file mode 100644
index 00000000000..3cdf87f07bb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/040.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: IFRAMEs added with DOM (innerHTML), javascript: URL</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>log('inline script #1');
+ document.getElementsByTagName('div')[1].innerHTML = '<iframe src="javascript:parent.log(\'JS URL\');\'<html><script>parent.log(\\\'frame script\\\')<\/script></html>\'"></iframe>';
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [
+ ['inline script #1', 'end script #1', 'JS URL', 'inline script #2', 'frame script'],
+ /* the following combination seems quite unlikely? */
+ ['inline script #1', 'end script #1', 'JS URL', 'frame script', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'inline script #2', 'JS URL', 'frame script']]);
+ t.done();
+ }
+ onload = t.step_func(function(){
+ setTimeout(t.step_func(test), 200);
+ });
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/041.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/041.html
new file mode 100644
index 00000000000..bce70411857
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/041.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write scripts that write scripts</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.write( '<script>log(\'inline with doc.write #1\'); document.write(\'<script src="scripts/include-4.js"><\\\/script>\');log(\'end inline with doc.write\');<\/script>' );
+ document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'inline with doc.write #1', 'end inline with doc.write', 'end script #1', 'include-4 before doc write', 'include-4 after doc write', 'external script before doc write', 'document.write external script', 'external script after doc write', 'external script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/042.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/042.html
new file mode 100644
index 00000000000..df3a2f88f29
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/042.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM mutation events when adding scripts: DOMNodeInserted </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.addEventListener( 'DOMNodeInserted', function(){ log('DOMNodeInserted'); }, false );
+ testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], false);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'head script #1', 'DOMNodeInserted', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/043.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/043.html
new file mode 100644
index 00000000000..bcfd90cba47
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/043.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM mutation events when adding external scripts: DOMNodeInserted </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.addEventListener( 'DOMNodeInserted', function(){ log('DOMNodeInserted'); }, false );
+ testlib.addScript('', { src: 'scripts/include-1.js' }, document.getElementsByTagName('head')[0], false);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'DOMNodeInserted', 'end script #1', 'external script #1', 'inline script #2'],
+ ['inline script #1', 'DOMNodeInserted', 'end script #1', 'inline script #2', 'external script #1']]
+ );
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/044.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/044.html
new file mode 100644
index 00000000000..8d412079e45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/044.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM mutation events when adding scripts: DOMNodeInsertedIntoDocument </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], false, function(s){s.addEventListener( 'DOMNodeInsertedIntoDocument', function(){ log('DOMNodeInsertedIntoDocument'); }, false ); } );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'head script #1', 'DOMNodeInsertedIntoDocument', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/045.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/045.html
new file mode 100644
index 00000000000..254e0d13662
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/045.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: DOM mutation events when adding external scripts: DOMNodeInsertedIntoDocument </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ testlib.addScript('', {src:'scripts/include-1.js'}, document.getElementsByTagName('head')[0], false, function(s){s.addEventListener( 'DOMNodeInsertedIntoDocument', function(){ log('DOMNodeInsertedIntoDocument'); }, false);});
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ onload = t.step_func(function() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'DOMNodeInsertedIntoDocument', 'end script #1', 'external script #1', 'inline script #2'],
+ ['inline script #1', 'DOMNodeInsertedIntoDocument', 'end script #1', 'inline script #2', 'external script #1']]);
+ t.done();
+ });
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/046.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/046.html
new file mode 100644
index 00000000000..4f145d63e1d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/046.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: no readystatechange events when adding external scripts </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ testlib.addScript('', {src:'scripts/include-1.js', onreadystatechange:function() {log( 'readystatechange '+ this.readyState );}}, document.getElementsByTagName('head')[0], false );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/047.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/047.html
new file mode 100644
index 00000000000..88509e9d435
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/047.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: adding and removing external script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=testlib.addScript('', {src:'scripts/include-1.js'}, document.getElementsByTagName('head')[0], false );
+ script.parentNode.removeChild(script);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/048.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/048.html
new file mode 100644
index 00000000000..8879f035d37
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/048.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: adding inline script which sets its own .src </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=testlib.addScript('log(\'HEAD script start\');document.getElementsByTagName(\'script\')[0].src=\'scripts/include-1.js\';log(\'HEAD script end\')', {}, document.getElementsByTagName('head')[0], true );
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'HEAD script start', 'HEAD script end', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/049.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/049.html
new file mode 100644
index 00000000000..455a20c549c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/049.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: adding external script but removeAttribute( src ) before it runs</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=testlib.addScript('log(\'HEAD script\');', { src:'scripts/include-1.js' }, document.getElementsByTagName('head')[0], false );
+ script.removeAttribute('src');
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/050.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/050.html
index c9e990206fe..c9e990206fe 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/050.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/050.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/051.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/051.html
new file mode 100644
index 00000000000..a0b674304f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/051.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: interaction of parsing and script execution - script added through DOM</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ testlib.addScript('', { src: 'scripts/count-script-tags.js' }, document.body, true);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'script tags in DOM: 5', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'inline script #2', 'script tags in DOM: 6']]);
+ t.done();
+ }
+ onload = function(){setTimeout(t.step_func(test), 100); }
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/052.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/052.html
new file mode 100644
index 00000000000..21a151cb79c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/052.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: interaction of parsing and script execution - external script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script src="scripts/count-script-tags.js"></script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['script tags in DOM: 4', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(function(){setTimeout(t.step_func(test), 100); })
+ </script>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/053.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/053.html
new file mode 100644
index 00000000000..810197437da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/053.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: adding external script that removes itself from document when loading</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=testlib.addScript('', { src:'scripts/include-1.js', onload:function() {this.parentNode.removeChild(this);log('removed ' + this.localName);} }, document.getElementsByTagName('body')[0], true );
+ log('end script #1');
+ </script>
+ <script src="scripts/include-2.js"></script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'removed script', 'external script #2', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'external script #2', 'external script #1', 'removed script', 'inline script #2'],
+ ['inline script #1', 'end script #1', 'external script #2', 'inline script #2', 'external script #1', 'removed script']]
+ );
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/054.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/054.html
new file mode 100644
index 00000000000..29ede23414e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/054.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: removing newly inserted script from DOMNodeInserted handler - external script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.addEventListener( 'DOMNodeInserted', function listener(e){
+ log('DOMNodeInserted event');
+ e.target.parentNode.removeChild(e.target);
+ document.removeEventListener('DOMNodeInserted', listener);
+ }, false );
+ var script=testlib.addScript('', { src:'scripts/include-1.js?'+Math.random() }, document.getElementsByTagName('body')[0], true );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'DOMNodeInserted event', 'end script #1', 'inline script #2', 'external script #1'],
+ ['inline script #1', 'DOMNodeInserted event', 'end script #1', 'external script #1', 'inline script #2']]);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/055.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/055.html
new file mode 100644
index 00000000000..c837d78174b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/055.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: removing newly inserted script from DOMNodeInserted handler - inline script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ document.addEventListener( 'DOMNodeInserted', function listener(e){
+ log('DOMNodeInserted event');
+ e.target.parentNode.removeChild(e.target);
+ document.removeEventListener('DOMNodeInserted', listener);
+ }, false );
+ var script=testlib.addScript('log(\'added script\')', { }, document.getElementsByTagName('body')[0], true );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'added script', 'DOMNodeInserted event', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/056.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/056.html
new file mode 100644
index 00000000000..e2d0868034e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/056.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: appending code to initially empty SCRIPT tag in DOM </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=document.getElementsByTagName('script')[3];
+ script.appendChild( document.createTextNode('log("injected script code");') );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ // Test asserts the injected script should run
+ assert_array_equals(eventOrder, ['inline script #1', 'injected script code', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/057.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/057.html
new file mode 100644
index 00000000000..4dc8e1384e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/057.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: appending code to initially non-empty SCRIPT tag in DOM (whitespace only) </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script>
+ </script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=document.getElementsByTagName('script')[3];
+ script.appendChild( document.createTextNode('log("injected script code");') );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/058.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/058.html
new file mode 100644
index 00000000000..15deb785c2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/058.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: appending code to initially non-empty SCRIPT tag in DOM (comment only) </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script>/**/</script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=document.getElementsByTagName('script')[3];
+ script.appendChild( document.createTextNode('log("injected script code");') );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/059.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/059.html
new file mode 100644
index 00000000000..b3a34367b22
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/059.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: appending code to initially non-empty SCRIPT tag in DOM after removing its initial child </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script>/**/</script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=document.getElementsByTagName('script')[3];
+ script.removeChild(script.firstChild);
+ script.appendChild( document.createTextNode('log("injected script code");') );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/060.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/060.html
new file mode 100644
index 00000000000..905dfe233fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/060.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: appending code to initially non-empty SCRIPT tag in DOM after setting textContent/innerHTML</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script>log('HEAD script');</script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=document.getElementsByTagName('script')[3];
+ script.innerHTML='';
+ script.appendChild( document.createTextNode('log("injected script code 1");') );
+ script.textContent='';
+ script.appendChild( document.createTextNode('log("injected script code 2");') );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['HEAD script', 'inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/061.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/061.html
new file mode 100644
index 00000000000..9950b1c7ac7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/061.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: cloneNode and script execution</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script>log('HEAD script');</script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=document.getElementsByTagName('script')[3];
+ document.body.appendChild( script.cloneNode(true) );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['HEAD script', 'inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/062.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/062.html
new file mode 100644
index 00000000000..c5e0ee2d466
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/062.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: cloneNode (shallow) and script execution</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script>log('HEAD script');</script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=document.getElementsByTagName('script')[3];
+ document.body.appendChild( script.cloneNode(false) ).appendChild(document.createTextNode('log("clone");'));
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['HEAD script', 'inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/063.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/063.html
new file mode 100644
index 00000000000..6824074a8c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/063.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: cloneNode (deep) of the currently executing script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script>log('HEAD script');
+ if( !window.already_cloned ){
+ window.already_cloned=true;
+ var script=document.getElementsByTagName('script')[3];
+ document.getElementsByTagName('head')[0].appendChild( script.cloneNode(true) );
+ }
+ </script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['HEAD script', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/064.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/064.html
new file mode 100644
index 00000000000..ceedc3da2d7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/064.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: cloneNode with external script</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script src="scripts/include-1.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=document.getElementsByTagName('script')[3];
+ document.body.appendChild( script.cloneNode(true) );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['external script #1', 'inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/065.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/065.html
new file mode 100644
index 00000000000..5859dc9e0ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/065.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: cloneNode with external script, changed .src</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script src="scripts/include-1.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=document.getElementsByTagName('script')[3].cloneNode(true);
+ script.src='scripts/include-2.js'
+ document.body.appendChild( script );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['external script #1', 'inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/066.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/066.html
new file mode 100644
index 00000000000..a8e346dfd82
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/066.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: cloneNode with external script, removing .src and adding content</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script src="scripts/include-1.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=document.getElementsByTagName('script')[3].cloneNode(true);
+ script.removeAttribute('src');
+ script.appendChild(document.createTextNode( 'log("cloned script");' ));
+ document.body.appendChild( script );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['external script #1', 'inline script #1', 'end script #1', 'inline script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/067.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/067.html
index 7be0fd0ab0d..7be0fd0ab0d 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/067.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/067.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/068.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/068.html
new file mode 100644
index 00000000000..a58158b6c0a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/068.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: external script and parsing of markup added with document.write </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>
+ log('inline script #1');
+ document.write('<script src="scripts/find-foo.js">log(\'inline code in external script (not expected to run!!)\')<\/script>' + '<div id="foo"></div>');
+ log('end script #1');
+
+ var t = async_test()
+
+
+ function test() {
+ if(!window.findFooLoaded) {
+ return setTimeout(t.step_func(test),200);
+ }
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'found #foo element: NO']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/069.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/069.html
index 4d4aed26587..4d4aed26587 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/069.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/069.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/070.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/070.html
new file mode 100644
index 00000000000..4b82a9e83f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/070.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write into IFRAME a script that adds a SCRIPT through DOM</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <iframe></iframe>
+
+ <script type="text/javascript">
+ var doc = document.getElementsByTagName('iframe')[0].contentDocument;
+ doc.open();
+
+ log("calling document.write");
+ doc.write('<script>top.log("inline script #1");'+
+ 'var s=document.createElement("script");'+
+ 's.src="scripts/include-6.js?'+new Date().getTime()+'";'+
+ 'document.getElementsByTagName("head")[0].appendChild(s);'+
+ '<\/script>'+
+ '<div id="foo"></div>'+
+ '<script>top.log("inline script #2");<\/script>'
+ );
+
+ log("calling document.close");
+ doc.close();
+
+ var t = async_test()
+
+
+ function test() {
+ if(!window.include6Loaded) {
+ return setTimeout(t.step_func(test),200);
+ }
+ assert_array_equals(eventOrder, ['calling document.write', 'inline script #1', 'inline script #2', 'calling document.close', 'external script (#foo found? YES)']);
+ t.done();
+ }
+
+ onload = t.step_func(test)
+ </script>
+</head>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/071.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/071.html
new file mode 100644
index 00000000000..802c4a8ce36
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/071.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write several scripts into IFRAME </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <iframe style="width:1px;height:1px"></iframe>
+
+ <script type="text/javascript">
+ var doc = document.getElementsByTagName('iframe')[0].contentDocument;
+ doc.open();
+
+ var html = '<html><head><title>test</title></head>'+
+ '<script>top.log("inline script #1");'+
+ '<\/script>'+
+ /* made url unique because Chrome will change
+ order depending on file cached status */
+ '<script src="scripts/include-6.js?'+new Date().getTime()+'"><\/script>'+
+ '</head>'+
+ '<body>'+
+ '<div id="foo"></div>'+
+ '</body></html>'+
+ '<script>top.log("inline script #2");<\/script>';
+ log("calling document.write");
+ doc.write(html);
+
+ log("calling document.close");
+ doc.close();
+
+ var t = async_test()
+
+
+ function test() {
+ if( !window.include6Loaded )return setTimeout(t.step_func(test),200); // try checking again if external script didn't run yet
+ assert_array_equals(eventOrder, ['calling document.write',
+ 'inline script #1',
+ 'calling document.close',
+ 'external script (#foo found? NO)',
+ 'inline script #2'
+ ]);
+ t.done();
+ }
+
+ onload = t.step_func(test)
+ </script>
+</head>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/072.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/072.html
new file mode 100644
index 00000000000..e502a357366
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/072.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write into IFRAME a script that creates new inline script in parent </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <iframe style="width:1px;height:1px"></iframe>
+
+ <script type="text/javascript">
+ var doc = document.getElementsByTagName('iframe')[0].contentDocument;
+ doc.open();
+
+ var html = '<html><head><title>test</title></head>'+
+ '<script>top.log("inline script #1");'+
+ '<\/script>'+
+ '</head>'+
+ '<body>'+
+ '<div id="foo"></div>'+
+ '</body></html>'+
+ '<script>top.testlib.addScript( \'log("inline script added to parent")\', null, top.document.body, true )<\/script>';
+ log("calling document.write");
+ doc.write(html);
+
+ log("calling document.close");
+ doc.close();
+
+ var t = async_test()
+
+
+ function test() {
+ assert_array_equals(eventOrder, ['calling document.write',
+ 'inline script #1',
+ 'inline script added to parent',
+ 'calling document.close',
+ ]);
+ t.done();
+ }
+
+ onload = t.step_func(test)
+ </script>
+</head>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/073.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/073.html
new file mode 100644
index 00000000000..6f65c4ae195
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/073.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write into IFRAME a script that creates new external script in parent </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <iframe style="width:1px;height:1px"></iframe>
+
+ <script type="text/javascript">
+ var doc = document.getElementsByTagName('iframe')[0].contentDocument;
+ doc.open();
+
+ var html = '<html><head><title>test</title></head>'+
+ '<script>top.log("inline script #1");'+
+ '<\/script>'+
+ '</head>'+
+ '<body>'+
+ '<div id="foo"></div>'+
+ '</body></html>'+
+ '<script>top.testlib.addScript( \'\', { src:\'scripts/include-1.js\' }, top.document.body, true )<\/script>';
+ log("calling document.write");
+ doc.write(html);
+
+ log("calling document.close");
+ doc.close();
+
+ var t = async_test()
+
+
+ function test() {
+
+ assert_array_equals(eventOrder, ['calling document.write',
+ 'inline script #1',
+ 'calling document.close',
+ 'external script #1'
+ ]);
+
+ t.done();
+ }
+
+ onload = t.step_func(test)
+ </script>
+</head>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/074.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/074.html
new file mode 100644
index 00000000000..70d7b88b748
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/074.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: document.write into IFRAME a script that creates new inline script in parent that again adds script to IFRAME </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <iframe style="width:1px;height:1px"></iframe>
+
+ <script type="text/javascript">
+ var doc = document.getElementsByTagName('iframe')[0].contentDocument;
+ doc.open();
+ var str1='';
+ var html = '<html><head><title>test</title></head>'+
+ '<script>top.log("inline script #1");'+
+ '<\/script>'+
+ '</head>'+
+ '<body>'+
+ '<script>top.testlib.addScript( \'top.log("inline script added to parent");top.doc.write( "<script>top.log(\\\\"inline script added to iframe\\\\")<\\\/script>");\', null, top.document.body, true ) <\/script>'+
+ '</body></html>';
+ log("calling document.write");
+ doc.write(html);
+
+ log("calling document.close");
+ doc.close();
+
+ var t = async_test()
+
+
+ function test() {
+ assert_array_equals(eventOrder, ['calling document.write',
+ 'inline script #1',
+ 'inline script added to parent',
+ 'inline script added to iframe',
+ 'calling document.close',
+ ]);
+ t.done();
+ }
+
+ onload = t.step_func(test)
+ </script>
+</head>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/075.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/075.html
index 40ec9bbb6a5..40ec9bbb6a5 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/075.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/075.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/076.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/076.html
new file mode 100644
index 00000000000..2b8b692d926
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/076.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: adding and removing external and inline scripts </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>log('inline script #1');
+ var script=testlib.addScript('', {src:'scripts/include-1.js', onload:function(e){ e.target.parentNode.removeChild(e.target); }}, document.getElementsByTagName('head')[0], false );
+ var script=testlib.addScript( 'log( "dynamically added inline script" )', null, document.getElementsByTagName('head')[0], false );
+ script.parentNode.removeChild(script);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ }
+ onload = t.step_func(function() {
+ assert_any(assert_array_equals, eventOrder, [['inline script #1', 'dynamically added inline script', 'end script #1', 'external script #1', 'inline script #2'],
+ ['inline script #1', 'dynamically added inline script', 'end script #1', 'inline script #2', 'external script #1']]);
+ t.done();
+ })
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/077.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/077.html
index a7a59421250..a7a59421250 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/077.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/077.html
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/078.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/078.html
index 4d42b7242fd..4d42b7242fd 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/078.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/078.html
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/079.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/079.html
index 8d684cebf2b..8d684cebf2b 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/079.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/079.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/080.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/080.html
new file mode 100644
index 00000000000..bd983355a1f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/080.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: IFRAMEs added with DOM (appendChild), javascript: URL</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>log('inline script #1');
+ var iframe=document.createElement('iframe');
+ iframe.src='javascript:parent.log(\'JS URL\');\'<html><script>parent.log(\\\'frame script\\\')<\/script></html>\'';
+ document.getElementsByTagName('div')[1].appendChild(iframe);
+ log('end script #1');
+ </script>
+
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2', 'JS URL', 'frame script']);
+ t.done();
+ }
+ onload = t.step_func(function(){setTimeout(t.step_func(test), 400);})
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/081.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/081.html
new file mode 100644
index 00000000000..ad0ab926659
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/081.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: slow loading external script added with DOM (appendChild)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>
+ var t = async_test(undefined, {timeout:5000})
+ log('inline script #1');
+ testlib.addScript('', { src:'scripts/include-1.js?pipe=trickle(d1)&'+Math.random() }, document.getElementsByTagName('head')[0], false );
+ log('end script #1');
+ </script>
+ <script src="scripts/include-2.js"></script>
+ <script>
+ log( 'inline script #2' );
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #2', 'inline script #2', 'external script #1']);
+ t.done();
+ }
+ onload = t.step_func(function() {
+ setTimeout(t.step_func(test), 12);
+ });
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/082.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/082.html
new file mode 100644
index 00000000000..c6f112e6e86
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/082.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: multiple slow loading external scripts added with DOM (appendChild)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <div></div>
+ <script>
+
+ log('inline script #1');
+ function scriptLoadListener(){
+ log( 'load on '+this.src.match( /include-\d\.js/ ) );
+ }
+ var script=testlib.addScript('', { src:'scripts/include-1.js?pipe=trickle(d1)&' + Math.random(), onload:scriptLoadListener }, document.getElementsByTagName('head')[0], false );
+ var script=testlib.addScript('', { src:'scripts/include-2.js?pipe=trickle(d3)&' + Math.random(), onload:scriptLoadListener }, document.getElementsByTagName('head')[0], false );
+ var script=testlib.addScript('', { src:'scripts/include-7.js?pipe=trickle(d2)&' + Math.random() , onload:scriptLoadListener }, document.getElementsByTagName('head')[0], false );
+ log('end script #1');
+ </script>
+ <script type="text/javascript">
+ log('inline script #2');
+ var t = async_test(undefined, {timeout:10000})
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2', 'external script #1', 'load on include-1.js', 'external script #7', 'load on include-7.js', 'external script #2', 'load on include-2.js']);
+ t.done();
+ }
+ onload = function() {setTimeout(t.step_func(test), 12)};
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/083.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/083.html
new file mode 100644
index 00000000000..2ac0015c8b7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/083.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: event listener defined by script in a document in history</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <iframe src="about:blank"></iframe>
+ <script>
+ log('inline script #1');
+ function fireFooEvent(){
+ var evt=document.createEvent('Event');
+ evt.initEvent('foo', true, true);
+ document.dispatchEvent(evt);
+ }
+ var doc = frames[0].document;
+ doc.open('text/html');
+ doc.write('<script>top.log("IFRAME script");top.document.addEventListener("foo", function(e){ top.log("event: "+e.type); }, false)<\/script>');
+ log('end script #1');
+ </script>
+ <script>
+ fireFooEvent();
+ frames[0].location='about:blank'; // returning to about:blank should de-activate document that defined event listener..?
+ </script>
+ <script>
+ fireFooEvent();
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_equals(frames[0].location.toString(), "about:blank");
+ assert_array_equals(eventOrder, ['inline script #1',
+ 'IFRAME script',
+ 'end script #1',
+ 'event: foo',
+ 'inline script #2'
+ ]);
+ t.done();
+ }
+ onload = function() {setTimeout(t.step_func(function() {fireFooEvent(); test()}), 80)};
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/084.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/084.html
new file mode 100644
index 00000000000..3027fa19944
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/084.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: event listener defined by script in a removed IFRAME</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <iframe src="about:blank"></iframe>
+ <script>
+ log('inline script #1');
+ function fireFooEvent(){
+ var evt=document.createEvent('Event');
+ evt.initEvent('foo', true, true);
+ document.dispatchEvent(evt);
+ }
+ var doc=frames[0].document;
+ doc.open( 'text/html' );
+ doc.write( '<script>top.log("IFRAME script");top.document.addEventListener("foo", function(e){ top.log("event: "+e.type); }, false)<\/script>' );
+ log('end script #1');
+ </script>
+ <script>
+ fireFooEvent();
+ frames[0].frameElement.parentNode.removeChild( frames[0].frameElement ); // removing the IFRAME should de-activate document that defined event listener..?
+ </script>
+ <script>
+ fireFooEvent();
+ </script>
+ <script type="text/javascript">
+ log( 'inline script #2' );
+ var t = async_test()
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1',
+ 'IFRAME script',
+ 'end script #1',
+ 'event: foo',
+ 'inline script #2'
+ ]);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/085.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/085.html
new file mode 100644
index 00000000000..6577527a8e5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/085.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: async script and slow-loading defer script</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script src="scripts/include-1.js?pipe=trickle(d1)" defer></script>
+ <script src="scripts/include-2.js" async></script>
+
+ <script type="text/javascript">
+ var t = async_test();
+ function test() {
+ assert_array_equals(eventOrder, ['external script #2', 'external script #1']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/086.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/086.html
new file mode 100644
index 00000000000..4ccd16de894
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/086.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: async script and slow-loading async script</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script src="scripts/include-1.js?pipe=trickle(d2)" async></script>
+ <script src="scripts/include-2.js" async></script>
+
+ <script type="text/javascript">
+ var t = async_test();
+ function test() {
+ assert_array_equals(eventOrder, ['external script #2', 'external script #1']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/087.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/087.html
new file mode 100644
index 00000000000..8e225f48ae1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/087.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: multiple defer scripts, one slow loading</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script src="scripts/include-1.js?pipe=trickle(d2)" defer></script>
+ <script src="scripts/include-2.js" defer></script>
+
+ <script type="text/javascript">
+ var t = async_test();
+ function test() {
+ assert_array_equals(eventOrder, ['external script #1', 'external script #2']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/088.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/088.html
new file mode 100644
index 00000000000..f41f3d5be2b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/088.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: multiple scripts with defer and async attributes</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script src="scripts/include-1.js?pipe=trickle(d2)" defer async></script>
+ <script src="scripts/include-2.js" defer async></script>
+
+ <script type="text/javascript">
+ var t = async_test();
+ function test() {
+ assert_array_equals(eventOrder, ['external script #2', 'external script #1']);
+ t.done();
+ }
+ onload = t.step_func(test);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/089.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/089.html
new file mode 100644
index 00000000000..9ed5e0e1da1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/089.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: async attribute on inline script</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script async>
+ var t = async_test();
+ log('inline script #1');
+ t.step(function() {
+ assert_array_equals(eventOrder, ['inline script #1']);
+ });
+ </script>
+ <script async>
+ log('inline script #2');
+ t.step(function() {
+ assert_array_equals(eventOrder, ['inline script #1', 'inline script #2']);
+ });
+ </script>
+
+ <script>
+ log('inline script #3');
+ t.step(function() {
+ assert_array_equals(eventOrder, ['inline script #1', 'inline script #2', 'inline script #3']);
+ });
+ onload = function() {t.done()};
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/090.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/090.html
new file mode 100644
index 00000000000..17d1d1effe3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/090.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: defer attribute on inline script</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script defer>
+ var t = async_test();
+ log('inline script #1');
+ t.step(function() {
+ assert_array_equals(eventOrder, ['inline script #1']);
+ });
+ </script>
+ <script defer>
+ log('inline script #2');
+ t.step(function() {
+ assert_array_equals(eventOrder, ['inline script #1', 'inline script #2']);
+ });
+ </script>
+
+ <script>
+ log('inline script #3');
+ t.step(function() {
+ assert_array_equals(eventOrder, ['inline script #1', 'inline script #2', 'inline script #3']);
+ });
+ onload = function() {t.done()};
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/091.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/091.html
new file mode 100644
index 00000000000..c9c7f81dcda
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/091.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: force-async off on non-parser-inserted script</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>
+ var t = async_test(undefined, {timeout:4000});
+
+ sources = ["scripts/include-1.js?pipe=trickle(d2)", "scripts/include-2.js?pipe=trickle(d1)"];
+ sources.forEach(function(x) {
+ var script = document.createElement("script");
+ script.src = x;
+ t.step(function() {assert_equals(script.async, true, "async IDL attribute on script creation")});
+ script.async = false;
+ t.step(function() {assert_equals(script.async, false, "async IDL attribute after setting")});
+ t.step(function() {assert_equals(script.getAttribute("async"), null, "async content attribute after setting")});
+ document.head.appendChild(script);
+ });
+
+ onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ['external script #1', 'external script #2']);
+ t.done();
+ });
+ </script>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/092.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/092.html
new file mode 100644
index 00000000000..1fd78239ab9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/092.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: defer script and slow-loading non-async external script</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>
+ var t = async_test(undefined, {timeout:3500});
+
+ var script = document.createElement("script");
+ script.src = "scripts/include-2.js?pipe=trickle(d2)";
+ script.async = false;
+ document.head.appendChild(script);
+
+ onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ['external script #1', 'external script #2']);
+ t.done();
+ });
+ </script>
+ <script defer src="scripts/include-1.js"></script>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/094.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/094.html
new file mode 100644
index 00000000000..42f84cc2a65
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/094.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: parser-created defer script after document load</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+ <iframe id="myFrame"></iframe>
+
+ <script>
+ var t = async_test(undefined, {timeout:3500});
+ onload = t.step_func(function() {
+ var doc = document.getElementById("myFrame").contentDocument;
+ var win = document.getElementById("myFrame").contentWindow;
+ doc.open();
+ doc.write("<title> scheduler: parser-created defer script after document load</title><script src='/resources/testharness.js'><\/script><script src='/resources/testharnessreport.js'><\/script><script src='testlib/testlib.js'><\/script><script>var t=async_test()<\/script><div id=log></div><script defer src='data:text/javascript,parent.t.done();'><\/script>");
+ doc.close();
+ })
+ </script>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/095.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/095.html
new file mode 100644
index 00000000000..b2d7d8fa4ce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/095.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: slow-loading script added from defer blocking load event</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>
+ var t = async_test(undefined, {timeout:3500});
+ function test() {
+ t.step(function() {
+ assert_array_equals(eventOrder, ['external script #8', 'external script #9']);
+ t.done();
+ });
+ }
+ //assert that the test is completed before onload fires
+ onload = t.step_func(function() {assert_unreached()});
+ </script>
+ <script defer src="scripts/include-8.js"></script>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/096.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/096.html
new file mode 100644
index 00000000000..a2e15b782a5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/096.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: defer script added from document.write relative to DOMContentLoaded</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>
+ log("inline script #1");
+ document.write("<script defer src='scripts/include-1.js'><\/script>")
+ </script>
+ <script>
+ log("inline script #2");
+ var t = async_test();
+
+ addEventListener("DOMContentLoaded", t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "external script #1"]);
+ log("inline script #3");
+ }), false);
+
+ onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "external script #1", "inline script #3"]);
+ t.done();
+ });
+ </script>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/097.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/097.html
new file mode 100644
index 00000000000..4b4e4c61f9e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/097.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: slow-loading async script added from document.write</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>
+ log("inline script #1");
+ document.write("<script async src='scripts/include-1.js?pipe=trickle(d2)'><\/script>")
+ </script>
+ <script>
+ log("inline script #2");
+ var t = async_test(undefined, {timeout:3500});
+
+ addEventListener("DOMContentLoaded", t.step_func(function() {assert_array_equals(eventOrder, ["inline script #1", "inline script #2"])}), false);
+
+ onload = t.step_func(
+ function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "external script #1"]);
+ t.done();
+ });
+
+ </script>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/099.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/099.html
new file mode 100644
index 00000000000..987fcc7c711
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/099.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: defer adding iframe containing script</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script defer src="scripts/include-11.js"></script>
+ <script>
+ var t = async_test();
+
+ onload = t.step_func(function() {assert_array_equals(eventOrder, ["external script before adding iframe", "script in iframe"]); t.done();});
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/101.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/101.html
index b868f9a4470..b868f9a4470 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/101.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/101.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/102.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/102.html
new file mode 100644
index 00000000000..439023833f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/102.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: defer script after initial onload event</title>
+</head>
+<body>
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>
+ onload = function() {
+ document.open();
+ document.write("<title> scheduler: defer script after initial onload event</title><script src='/resources/testharness.js'><\/script><script src='/resources/testharnessreport.js'><\/script><script src='testlib/testlib.js'><\/script><div id='log'>document.written content</div><script>var t = async_test(); log('inline script #1')<\/script><script src='scripts/include-1.js'><\/script><script async src='scripts/include-2.js'><\/script>");
+ document.close();
+ window.setTimeout(function() {
+ window.t.step(function() {
+ window.assert_any(window.assert_array_equals, window.eventOrder,
+ [['inline script #1', 'external script #1', 'external script #2'],
+ ['inline script #1', 'external script #2', 'external script #1']]);
+ window.t.done();
+ })},
+ 1000);
+ };
+ </script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/103.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/103.html
new file mode 100644
index 00000000000..f619472a4f1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/103.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: removing defer attribute at runtime</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="test"></div>
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script id="defer-script" defer src="scripts/include-2.js"></script>
+ <script src="scripts/include-1.js"></script>
+
+ <script>
+ var t = async_test();
+
+ t.step(function() {
+ document.getElementById("defer-script").removeAttribute("defer");
+ });
+
+ var ran_defer_check = false;
+
+ document.addEventListener("readystatechange", t.step_func(function () {
+ if (document.readyState == "interactive") {
+ ran_defer_check = true;
+ assert_array_equals(eventOrder, ["external script #1"]);
+ }
+ }), false);
+
+ addEventListener("load", t.step_func(function () {
+ assert_true(ran_defer_check);
+ assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
+ t.done();
+ }), false);
+
+ </script>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/104.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/104.html
new file mode 100644
index 00000000000..95a5a222378
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/104.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: adding defer attribute at runtime</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="test"></div>
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script id="defer-script" src="scripts/include-1.js"></script>
+ <script src="scripts/include-2.js"></script>
+
+ <script>
+ var t = async_test();
+
+ t.step(function() {
+ document.getElementById("defer-script").setAttribute("defer", "defer");
+ });
+
+ var ran_defer_check = false;
+
+ document.addEventListener("readystatechange", t.step_func(function () {
+ if (document.readyState == "interactive") {
+ ran_defer_check = true;
+ assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
+ }
+ }), false);
+
+ addEventListener("load", t.step_func(function () {
+ assert_true(ran_defer_check);
+ assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
+ t.done();
+ }), false);
+
+ </script>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/105.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/105.html
new file mode 100644
index 00000000000..19be9e1d03c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/105.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: adding async attribute at runtime</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>
+ var t = async_test();
+
+ var sources = ["scripts/include-1.js?pipe=trickle(d2)",
+ "scripts/include-2.js"]
+ var scripts = sources.map(function(x) {
+ var script = document.createElement("script");
+ script.src = x;
+ script.async = false;
+ document.body.appendChild(script);
+ return script;
+ });
+ scripts[0].async = true;
+
+ addEventListener("load", t.step_func(function () {
+ assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
+ t.done();
+ }), false);
+
+ </script>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/106-import.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/106-import.html
index db7abcc88de..db7abcc88de 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/106-import.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/106-import.html
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/106-noimport.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/106-noimport.html
index 8e099c58023..8e099c58023 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/106-noimport.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/106-noimport.html
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/107-import.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/107-import.html
index 0b572b07243..0b572b07243 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/107-import.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/107-import.html
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/107-noimport.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/107-noimport.html
index ce57d1f1c52..ce57d1f1c52 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/107-noimport.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/107-noimport.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/108.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/108.html
new file mode 100644
index 00000000000..79be9721d22
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/108.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: javascript URL in iframe</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+ <div id="log">Not tested</div>
+ <script>
+ var t = async_test();
+ var iframe_onload = false;
+
+ t.step(function() {
+ log('inline script #1');
+ document.write("<iframe src='javascript:void(top.log(&quot;iframe script #1&quot;));'></iframe>");
+ log('inline script #2')
+ })
+
+ onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "iframe script #1"]);
+ t.done();
+ });
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/109.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/109.html
new file mode 100644
index 00000000000..d103ffcbd75
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/109.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: javascript URL in iframe, src set via DOM</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+ <div id="log">Not tested</div>
+ <script>
+ var t = async_test();
+
+ t.step(function() {
+ var iframe_onload = false;
+ log("inline script #1");
+ var iframe = document.createElement("iframe");
+ iframe.src = "javascript:void(top.log('JS URL'));";
+ log("inline script #2");
+ iframe.onload = function () { log("iframe onload") };
+ document.body.appendChild(iframe);
+ log("inline script #3");
+ })
+
+ onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3", "JS URL", "iframe onload"]);
+ t.done();
+ });
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/110.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/110.html
new file mode 100644
index 00000000000..5affb9ed231
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/110.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: removing defer script at runtime</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="test"></div>
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script id="defer-script" defer src="scripts/include-2.js"></script>
+ <script src="scripts/include-1.js"></script>
+
+ <script>
+ var t = async_test();
+
+ t.step(function() {
+ var s = document.getElementById("defer-script");
+ s.parentNode.removeChild(s);
+ });
+
+ addEventListener("load", t.step_func(function () {
+ assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
+ t.done();
+ }), false);
+
+ </script>
+</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/111.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/111.html
index 144633c57ca..144633c57ca 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/111.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/111.html
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/112.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/112.html
index 76c0a155005..76c0a155005 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/112.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/112.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/113.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/113.html
new file mode 100644
index 00000000000..32740be37e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/113.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: Altering DOM using innerHTML during parse </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="test"></div>
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script>
+ var t = async_test();
+
+ addEventListener("load", t.step_func(function () {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2"]);
+ t.done();
+ }), false);
+
+ </script>
+ <div id="container">
+ <script>t.step(function() {
+ log("inline script #1");
+ document.getElementById("container").innerHTML = "";
+ });
+ </script>
+ <script>t.step(function() {log("inline script #2")});</script>
+ </div>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/114.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/114.html
new file mode 100644
index 00000000000..ce3733208b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/114.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: Changing src of defer script before it runs </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="test"></div>
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script id="defer-script" defer src="scripts/include-1.js"></script>
+
+ <script>
+ var t = async_test();
+
+ document.getElementById("defer-script").src = "scripts/include-2.js"
+
+ addEventListener("load", t.step_func(function () {
+ assert_array_equals(eventOrder, ["external script #1"]);
+ t.done();
+ }), false);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/115.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/115.html
new file mode 100644
index 00000000000..6234e02020c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/115.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html><head>
+ <title> scheduler: Removing src of defer script before it runs </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+
+ <div id="test"></div>
+ <div id="log">FAILED (This TC requires JavaScript enabled)</div>
+
+ <script id="defer-script" defer src="scripts/include-1.js">t.step(function() {assert_unreached()})</script>
+
+ <script>
+ var t = async_test();
+
+ document.getElementById("defer-script").removeAttribute("src");
+
+ addEventListener("load", t.step_func(function () {
+ assert_array_equals(eventOrder, ["external script #1"]);
+ t.done();
+ }), false);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/116.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/116.html
new file mode 100644
index 00000000000..62da3988685
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/116.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: adding script to head of frameset document</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+ <script>
+ // add a script that looks for document.body as first child of HEAD
+ testlib.addScript('',{src:'scripts/find-body.js'},document.getElementsByTagName('head')[0], true );
+ var div = document.createElement("div");
+ div.id = "log";
+ var t = async_test();
+ function test() {
+ if(!(window.findBodyLoaded)) {
+ return setTimeout(t.step_func(test),200);
+ }
+ document.body.appendChild(div);
+ assert_array_equals(eventOrder, ['document.body: <FRAMESET>']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ </script>
+</head>
+<frameset>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/117.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/117.html
new file mode 100644
index 00000000000..46a9900c94d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/117.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: inline script created with createContextualFragment</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+ <div id="log"></div>
+ <script>
+ log('inline script #1');
+ var t = async_test();
+
+ t.step(function() {
+ var range = document.createRange();
+ var fragment = range.createContextualFragment("<script>log('fragment script #1')<\/script>");
+ document.body.appendChild(fragment.firstChild);
+ });
+
+ function test() {
+ assert_array_equals(eventOrder, ['inline script #1', 'fragment script #1', 'end inline script #1']);
+ t.done();
+ }
+ onload = t.step_func(test)
+ log('end inline script #1');
+ </script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/118.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/118.html
new file mode 100644
index 00000000000..e002ea96011
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/118.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: external script created with createContextualFragment</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+ <div id="log"></div>
+ <script>
+ log('inline script #1');
+ var t = async_test();
+
+ t.step(function() {
+ var range = document.createRange();
+ var fragment = range.createContextualFragment("<script src='scripts/include-1.js'><\/script>");
+ document.body.appendChild(fragment.firstChild);
+ });
+
+ addEventListener("load", t.step_func(function() {
+ assert_array_equals(eventOrder, ['inline script #1', 'end inline script #1', 'external script #1']);
+ t.done();
+ }), false);
+
+ log('end inline script #1');
+ </script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/119.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/119.html
index d1ed8230934..d1ed8230934 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/119.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/119.html
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/120.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/120.html
new file mode 100644
index 00000000000..2cfe5221ddb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/120.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: script created without a window </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+
+ var doc = document.implementation.createHTMLDocument("");
+ doc.write("<script>t.step(function() {assert_unreached()})<\/script>");
+
+ document.body.appendChild(doc.head.firstChild);
+
+ onload = function() {t.done()}
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/121.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/121.html
new file mode 100644
index 00000000000..d6de27025fc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/121.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: altering the type attribute </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+</script>
+<script id="test" type="text/plain">t.step(function() {assert_unreached()}</script>
+<script>
+t.step(function() {
+ document.getElementById("test").removeAttribute("type");
+ setTimeout(t.step_func(function() {t.done()}), 100);
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/122.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/122.html
new file mode 100644
index 00000000000..35e1c2eb738
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/122.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: altering the type attribute and adding/removing external script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:4000});
+</script>
+<script id="test" type="text/plain" src="scripts/include-1.js?pipe=trickle(d1)"></script>
+<script>
+t.step(function() {
+ var script = document.getElementById("test");
+ script.removeAttribute("type");
+ var marker = document.createElement("script");
+ marker.src = "scripts/include-2.js?pipe=trickle(d2)";
+ marker.async = false;
+ script.parentNode.appendChild(marker);
+ script.parentNode.appendChild(script);
+ test(function() {assert_true(script.async)}, "Reinserted script async IDL attribute");
+});
+onload = t.step_func(function () {
+ assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/123.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/123.html
new file mode 100644
index 00000000000..9fe29989a57
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/123.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: altering the type attribute and adding/removing external script with async=false </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:4000});
+</script>
+<script id="test" type="text/plain" src="scripts/include-2.js?pipe=trickle(d1)"></script>
+<script>
+t.step(function() {
+ var script = document.getElementById("test");
+ script.removeAttribute("type");
+ script.async = false;
+ var marker = document.createElement("script");
+ marker.src = "scripts/include-1.js?pipe=trickle(d2)";
+ marker.async = false;
+ script.parentNode.appendChild(marker);
+ script.parentNode.appendChild(script);
+});
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/124.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/124.html
new file mode 100644
index 00000000000..5c7208dfde5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/124.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: altering the type attribute and changing script data inline script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+</script>
+<script id="test" type="text/plain">t.step(function() {log("inline script #1")});</script>
+<script>
+t.step(function() {
+ log("inline script #2");
+ var script = document.getElementById("test");
+ script.removeAttribute("type");
+ script.appendChild(document.createTextNode(""));
+ log("end inline script #2");
+});
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #2", "inline script #1", "end inline script #2"]);
+ t.done();
+})
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/125.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/125.html
new file mode 100644
index 00000000000..985ccf1eab6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/125.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: altering the type attribute and changing script data external script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:4000});
+</script>
+<script id="test" type="text/plain" src="scripts/include-1.js?pipe=trickle(d1)"></script>
+<script>
+t.step(function() {
+ var script = document.getElementById("test");
+ script.removeAttribute("type");
+ var marker = document.createElement("script");
+ marker.src = "scripts/include-2.js?pipe=trickle(d2)";
+ marker.async = false;
+ script.parentNode.appendChild(marker);
+ script.appendChild(document.createTextNode(""));
+});
+
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/126.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/126.html
new file mode 100644
index 00000000000..65d88c5293c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/126.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: altering the type attribute and changing script data external script async=false </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:4000});
+</script>
+<script id="test" type="text/plain" src="scripts/include-2.js"></script>
+<script>
+t.step(function() {
+ var script = document.getElementById("test");
+ script.removeAttribute("type");
+ script.async = false;
+ var marker = document.createElement("script");
+ marker.src = "scripts/include-1.js?pipe=trickle(d2)";
+ marker.async = false;
+ script.parentNode.appendChild(marker);
+ script.appendChild(document.createTextNode(""));
+});
+
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/127.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/127.html
new file mode 100644
index 00000000000..149078a327e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/127.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: appending non-text children to script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+</script>
+<script id="test"></script>
+<script>
+t.step(function() {
+ log("inline script #1");
+ var script = document.getElementById("test");
+
+ var frag = document.createDocumentFragment();
+ var div = document.createElement("div");
+
+ div.textContent = "assert_unreached();"
+ frag.appendChild(document.createTextNode("t.step(function() {log('inline script #2');\n"));
+ frag.appendChild(div);
+ frag.appendChild(document.createTextNode("log('end inline script #2');})"));
+
+ script.appendChild(frag);
+ log("end inline script #1");
+});
+
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "end inline script #2", "end inline script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/128.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/128.html
new file mode 100644
index 00000000000..39ec24f6816
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/128.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: appending script element to script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+</script>
+<script id="test"></script>
+<script>
+t.step(function() {
+ log("inline script #1");
+ var script = document.getElementById("test");
+
+ var frag = document.createDocumentFragment();
+ var inner_script = document.createElement("script");
+
+ inner_script.textContent = "t.step(function() {log('inline script #3');});"
+ frag.appendChild(document.createTextNode("t.step(function() {log('inline script #2');\n"));
+ frag.appendChild(inner_script);
+ frag.appendChild(document.createTextNode("log('end inline script #2');})"));
+
+ script.appendChild(frag);
+ log("end inline script #1");
+});
+
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #3", "inline script #2", "end inline script #2", "end inline script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/129.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/129.html
new file mode 100644
index 00000000000..8c12735677b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/129.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: appending multiple script elements</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+</script>
+<div id="container"></div>
+<script>
+t.step(function() {
+ log("inline script #1");
+
+ var frag = document.createDocumentFragment();
+
+ scripts = ["2", "3", "4"].map(function(x) {
+ var s = document.createElement("script");
+ s.textContent = "t.step(function() {log('inline script #" + x + "')});";
+ return s
+ });
+
+
+ frag.appendChild(scripts[0]);
+ var div = document.createElement(div);
+ div.appendChild(scripts[1]);
+ frag.appendChild(div);
+ frag.appendChild(scripts[2]);
+
+ document.getElementById("container").appendChild(frag);
+ log("end inline script #1");
+});
+
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3", "inline script #4", "end inline script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/130.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/130.html
new file mode 100644
index 00000000000..c6643d9fdf0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/130.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: appending external script element to script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+</script>
+<script id="test"></script>
+<script>
+t.step(function() {
+ log("inline script #1");
+ var script = document.getElementById("test");
+
+ var frag = document.createDocumentFragment();
+ var inner_script = document.createElement("script");
+
+ inner_script.src = "scripts/include-1.js?pipe=trickle(d1)";
+ frag.appendChild(document.createTextNode("t.step(function() {log('inline script #2');\n"));
+ frag.appendChild(inner_script);
+ frag.appendChild(document.createTextNode("log('end inline script #2');})"));
+
+ script.appendChild(frag);
+ log("end inline script #1");
+});
+
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "end inline script #2", "end inline script #1", "external script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/131.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/131.html
new file mode 100644
index 00000000000..541483ed6bd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/131.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: inline svg script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+ log("inline script #1")
+</script>
+<svg>
+<script>log("inline script #2")</script>
+</svg>
+<script>
+log("inline script #3");
+t.step(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/132.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/132.html
new file mode 100644
index 00000000000..3edb9595941
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/132.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: external svg script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+ log("inline script #1")
+</script>
+<svg>
+<script xlink:href="scripts/include-1.js"></script>
+</svg>
+<script>
+log("inline script #2");
+t.step(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "external script #1", "inline script #2"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/133.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/133.html
new file mode 100644
index 00000000000..e6b327f7094
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/133.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: inline HTML script added by SVG script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+ log("inline script #1")
+</script>
+<svg>
+<script>
+log("inline script #2")
+var s = document.createElement("script");
+s.textContent = "log('inline script #3');";
+document.getElementsByTagName("svg")[0].appendChild(s);
+log("end inline script #2");
+</script>
+</svg>
+<script>
+log("inline script #4");
+t.step(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3",
+ "end inline script #2", "inline script #4"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/134.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/134.html
new file mode 100644
index 00000000000..bb2ad4f66b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/134.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: external HTML script added by SVG script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+ log("inline script #1")
+</script>
+<svg>
+<script>
+log("inline script #2")
+var s = document.createElement("script");
+s.src = "scripts/include-1.js"
+document.getElementsByTagName("svg")[0].appendChild(s);
+log("end inline script #2");
+</script>
+</svg>
+<script>
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2",
+ "end inline script #2", "external script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/135.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/135.html
new file mode 100644
index 00000000000..dd8b8952184
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/135.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: external SVG script added by SVG script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test();
+ log("inline script #1")
+</script>
+<svg>
+<script>
+log("inline script #2")
+var s = document.createElementNS("http://www.w3.org/2000/svg", "script");
+s.setAttributeNS("http://www.w3.org/1999/xlink", "href", "scripts/include-1.js");
+document.getElementsByTagName("svg")[0].appendChild(s);
+log("end inline script #2");
+</script>
+</svg>
+<script>
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2",
+ "end inline script #2", "external script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/136.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/136.html
new file mode 100644
index 00000000000..4ed1ed80c3c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/136.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: DOM added external SVG script, force-async? </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:3000});
+</script>
+<svg>
+<script>
+
+var s1 = document.createElement("script");
+s1.src = "scripts/include-1.js";
+s1.async = false;
+
+var s = document.createElementNS("http://www.w3.org/2000/svg", "script");
+s.setAttributeNS("http://www.w3.org/1999/xlink", "href", "scripts/include-2.js?pipe=trickle(d2)");
+
+document.getElementsByTagName("svg")[0].appendChild(s);
+document.getElementsByTagName("svg")[0].appendChild(s1);
+
+</script>
+</svg>
+<script>
+onload = t.step_func(function() {
+ <!-- assumes that the SVg script should be async -->
+ assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/137.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/137.html
new file mode 100644
index 00000000000..0f71dcd1004
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/137.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: SVG script empty xlink:href</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:3000});
+</script>
+<svg>
+<script xlink:href="">
+t.step(function() {assert_unreached()});
+</script>
+</svg>
+<script>
+onload = t.step_func(function() {
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/138.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/138.html
new file mode 100644
index 00000000000..b2f4e81d0dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/138.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: SVG script nested inlines</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:3000});
+</script>
+<svg>
+<script>
+t.step(function() {
+log("inline script #2");
+var a = {
+ <script>
+ t.step(function() {log("inline script #1")})
+ </script>
+a:1}
+log("end inline script #2");
+});
+</script>
+</svg>
+<script>
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "end inline script #2"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/139.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/139.html
new file mode 100644
index 00000000000..98ca7439e5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/139.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: SVG script nested external in inline</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:3000});
+</script>
+<svg>
+<script>
+t.step(function() {
+log("inline script #1");
+var a = {
+ <script xlink:href="scripts/include-1.js">
+ t.step(function() {assert_unreached()})
+ </script>
+a:1}
+log("end inline script #1");
+});
+</script>
+</svg>
+<script>
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["external script #1", "inline script #1", "end inline script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/140.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/140.html
new file mode 100644
index 00000000000..3f7db18ae43
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/140.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: SVG script nested inline in external</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:3000});
+</script>
+<svg>
+<script xlink:href="scripts/include-1.js">
+ <script>
+ t.step(function() {log("inline script #1")});
+ </script>
+</script>
+</svg>
+<script>
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "external script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/141.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/141.html
new file mode 100644
index 00000000000..da4dbeb48f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/141.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: SVG inline script that document.writes inline script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:3000});
+</script>
+<svg>
+<script>
+ t.step(function() {
+ log('inline script #1');
+ document.write("<" + "script>t.step(function() {log('inline script #2')})<" + "/script>");
+ log('end inline script #1');
+ });
+</script>
+</svg>
+<script>
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "end inline script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/142.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/142.html
new file mode 100644
index 00000000000..b2b83dc8782
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/142.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: SVG inline script that document.writes external script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:3000});
+</script>
+<svg>
+<script>
+ t.step(function() {
+ log('inline script #1');
+ document.write("<" + "script xlink:href='scripts/include-1.js'><" + "/script>");
+ log('end inline script #1');
+ });
+</script>
+<script>t.step(function() {log("inline script #2")});</script>
+</svg>
+<script>
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "end inline script #1", "external script #1", "inline script #2"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/143.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/143.html
new file mode 100644
index 00000000000..4c015153002
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/143.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: SVG nested inline script that document.writes inline script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:3000});
+</script>
+<svg>
+<script>
+ t.step(function() {
+ log('inline script #3');
+ });
+ <script>
+ log("inline script #1")
+ document.write("<" + "script>t.step(function() {log('inline script #2')})<" + "/script><" + "/script>");
+ </script>
+ t.step(function() {
+ assert_unreached():
+ });
+</script>
+</svg>
+<script>
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/144.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/144.html
new file mode 100644
index 00000000000..a3c764d527e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/144.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: SVG inline script changing the type attribute </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:3000});
+</script>
+<svg>
+<script type="text/plain">
+t.step(function() {assert_unreached()});
+</script>
+</svg>
+<script>
+t.step(function() {
+ var s = document.querySelector("svg > script");
+ s.textContent = "t.step(function() {log('inline script #1')})";
+ s.type = "";
+ s.parentNode.appendChild(s);
+});
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/145.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/145.html
new file mode 100644
index 00000000000..d7897ee82a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/145.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: SVG inline script adding text to empty script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>
+ var t = async_test(undefined, {timeout:3000});
+</script>
+<svg>
+<script></script>
+</svg>
+<script>
+t.step(function() {
+ var s = document.querySelector("svg > script");
+ s.textContent = "t.step(function() {log('inline script #1')})";
+});
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/146.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/146.html
new file mode 100644
index 00000000000..9cf6bb7b7ba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/146.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: SVG script adding src attribute </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<div id="log"></div>
+<script>var t = async_test();</script>
+<svg>
+<script></script>
+</svg>
+<script>
+t.step(function() {
+ var s = document.querySelector("svg > script");
+ s.src = "scripts/include-1.js";
+});
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["external script #1"]);
+ t.done();
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/147.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/147.html
new file mode 100644
index 00000000000..07dc4d97c96
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/147.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: insert multiple inline scripts; first script moves subsequent scripts </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+var t = async_test();
+</script>
+<div id="container"></div>
+<script>
+t.step(function() {
+ log("inline script #1");
+ var container = document.getElementById("container");
+
+ var frag = document.createDocumentFragment();
+ var frag_script_1 = document.createElement("script");
+ var frag_script_2 = document.createElement("script");
+ frag_script_2.id = "movee";
+ var frag_script_3 = document.createElement("script");
+
+ frag_script_1.textContent = "t.step(function() {log('inline script #2'); var s = document.getElementById('movee'); s.parentNode.appendChild(s)});";
+ frag_script_2.textContent = "t.step(function() {log('inline script #3');})";
+ frag_script_3.textContent = "t.step(function() {log('inline script #4');})";
+
+ [frag_script_1, frag_script_2, frag_script_3].forEach(function(x) {frag.appendChild(x)});
+
+ container.appendChild(frag);
+});
+
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3", "inline script #4"]);
+ t.done();
+});
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/148.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/148.html
new file mode 100644
index 00000000000..e2da8e8f0b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/148.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: insert multiple inline scripts; first script deletes subsequent script </title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+var t = async_test();
+</script>
+<div id="container"></div>
+<script>
+t.step(function() {
+ log("inline script #1");
+ var container = document.getElementById("container");
+
+ var frag = document.createDocumentFragment();
+ var frag_script_1 = document.createElement("script");
+ var frag_script_2 = document.createElement("script");
+ frag_script_2.id = "delete";
+ var frag_script_3 = document.createElement("script");
+
+ frag_script_1.textContent = "t.step(function() {log('inline script #2'); var s = document.getElementById('delete'); s.parentNode.removeChild(s)});";
+ frag_script_2.textContent = "t.step(function() {log('inline script #3');})";
+ frag_script_3.textContent = "t.step(function() {log('inline script #4');})";
+
+ [frag_script_1, frag_script_2, frag_script_3].forEach(function(x) {frag.appendChild(x)});
+
+ container.appendChild(frag);
+});
+
+onload = t.step_func(function() {
+ assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3", "inline script #4"]);
+ t.done();
+});
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/149.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/149.html
new file mode 100644
index 00000000000..40594d80488
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/149.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html><head>
+ <title>scheduler: event/for attribute on script</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="testlib/testlib.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+attributes = [
+ {for:"window", event:"onload()", expect:true},
+ {for:"window", event:"onload", expect:true},
+ {for:" WINdow\t\n", event:"ONload\t\n", expect:true},
+ {for:"window", event:"load", expect:false},
+ {for:"window", event:"onpageshow", expect:false},
+ {for:"document", event:"onload", expect:false},
+]
+
+function test_maker(array_name) {
+ return function(x, i) {
+ var title = "for='" + x.for + "' event='" + x.event + "' " + array_name.replace("_", " ") + " " + (x.expect ? "executes immediately" : "does not execute");
+ script_content = "var d =" + array_name + "[" + i + "];"
+ script_content += x.expect?"d[1].step(function() {d[3] = true});":"d[1].step(function() {assert_unreached()});"
+ return [x, async_test(title), script_content, false];
+ }
+}
+
+parser_inserted = attributes.map(test_maker("parser_inserted"));
+dom_inserted = attributes.map(test_maker("dom_inserted"));
+
+parser_inserted.forEach(function(x) {
+ var d = x[0];
+ document.write("<script for='" + d.for + "' event='" + d.event + "'>" + x[2] + "<\/script>");
+});
+
+dom_inserted.forEach(function(x) {
+ var d = x[0];
+ var s = document.createElement("script");
+ s.setAttribute("event", d.event);
+ s.setAttribute("for", d.for);
+ s.textContent = x[2];
+ document.body.appendChild(s);
+});
+</script>
+
+<script>
+var all_tests = parser_inserted.concat(dom_inserted);
+
+all_tests.filter(function(x) {return x[0]["expect"]}).forEach(function(x) {var t = x[1]; t.step(function() {assert_true(x[3])});})
+
+onload = function() {
+ all_tests.forEach(function(x) {var t = x[1]; t.step(function() {t.done()})});
+}
+</script>
+
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/css/background.css b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/css/background.css
index 86a155b811a..86a155b811a 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/css/background.css
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/css/background.css
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/css/import.css b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/css/import.css
index d1664c29a14..d1664c29a14 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/css/import.css
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/css/import.css
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld-postMessage.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld-postMessage.html
new file mode 100644
index 00000000000..2ed8731ceb5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld-postMessage.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html><head>
+ <title> TC component </title>
+</head>
+<body>
+
+ <p>This page should appear in popup or frame</p>
+
+ <script type="text/javascript">
+ var target = opener || top;
+ var id = location.search?' '+location.search.substring(1) : '';
+ target.log('frame/popup script'+id);
+ window.onload=function(){
+ target.log('load event inside frame/popup script'+id);
+ target.postMessage('msg evt frame/popup script'+id, '*');
+ }
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld.html
new file mode 100644
index 00000000000..271bc8f569e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/pages/helloworld.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html><head>
+ <title> TC component </title>
+</head>
+<body>
+
+ <p>This page should appear in popup or frame</p>
+
+ <script type="text/javascript">
+ var target = top || opener;
+ var id = location.search?' '+parseInt(location.search.substring(1)) : '';
+ target.log('frame/popup script'+id);
+ </script>
+
+</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/count-script-tags.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/count-script-tags.js
index 8fba4ecb3c0..8fba4ecb3c0 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/count-script-tags.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/count-script-tags.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/find-body.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-body.js
index 22e1050ffc3..22e1050ffc3 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/find-body.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-body.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/find-foo.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-foo.js
index 52d0ec91cb4..52d0ec91cb4 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/find-foo.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/find-foo.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-1.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-1.js
index 8ff291ad57e..8ff291ad57e 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-1.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-1.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-10.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-10.js
index 8dc770ddc05..8dc770ddc05 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-10.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-10.js
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-11.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-11.js
new file mode 100644
index 00000000000..016913c4b80
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-11.js
@@ -0,0 +1,4 @@
+log("external script before adding iframe");
+var iframe = document.createElement("iframe");
+iframe.srcdoc = "<script>parent.log('script in iframe')</script>"
+document.body.appendChild(iframe);
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-2.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-2.js
index 31319423afd..31319423afd 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-2.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-2.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-3.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-3.js
index 53352e0f83c..53352e0f83c 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-3.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-3.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-4.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-4.js
index 0597a226242..0597a226242 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-4.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-4.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-5.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-5.js
index 52952d73791..52952d73791 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-5.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-5.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-6.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-6.js
index 77da2af2329..77da2af2329 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-6.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-6.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-7.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-7.js
index 57c55080158..57c55080158 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-7.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-7.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-8.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-8.js
index 960f2129feb..960f2129feb 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-8.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-8.js
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-9.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-9.js
index 9042882024b..9042882024b 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-9.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/scripts/include-9.js
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/testlib/testlib.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/testlib/testlib.js
new file mode 100644
index 00000000000..a6fd39426b9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/execution-timing/testlib/testlib.js
@@ -0,0 +1,43 @@
+/*
+* Utility functions for script scheduler test
+*/
+(function(){ /* namespace hiding local variables like arOrderOfAllEvents from global scope */
+ window.testlib = {};
+ window.eventOrder = [];
+ var arNumberOfScriptsParsedPerEvent=[];
+ window.log = function (str){
+ eventOrder.push(str);
+ arNumberOfScriptsParsedPerEvent.push(document.getElementsByTagName('script').length);
+ }
+
+ window.testlib.addScript = function(source, attributes, parent, firstInParent,funcPrepare) {
+ try{
+ parent = parent||document.body;
+ var script = document.createElement('script');
+ if(funcPrepare) {
+ funcPrepare(script);
+ }
+ if(source)script.appendChild( document.createTextNode(source) );
+ for( var name in attributes){
+ if(/^on/i.test(name)) {
+ script[name] = attributes[name];
+ } else {
+ script.setAttribute(name, attributes[name]);
+ }
+ }
+ if (firstInParent && parent.firstChild) {
+ parent.insertBefore(script, parent.firstChild);
+ } else {
+ parent.appendChild(script);
+ }
+ } catch(e) {
+ log('ERROR when adding script to DOM!');
+ alert(e);
+ }
+ return script;
+ }
+
+ window.testlib.urlParam = function(relativeURL) {
+ return location.href.replace( /\d*\.html$/, relativeURL);
+ }
+})();
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-1.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-1.html
new file mode 100644
index 00000000000..45571550e1c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-1.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<head>
+<title>load/error events for classic scripts</title>
+<!-- For module scripts see module/load-error-events*.html -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/load-error-events-helpers.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#execute-the-script-block">
+</head>
+<script>
+"use strict";
+var test1_load = event_test('src, 200, parser-inserted, defer, no async', true, false);
+var test2_load = event_test('src, 200, parser-inserted, no defer, no async', true, false);
+var test4_load = event_test('src, 200, parser-inserted, no defer, async', true, false);
+
+var test3_dynamic_load = event_test('src, 200, not parser-inserted, no defer, no async, no non-blocking', true, false);
+var test4_dynamic_load = event_test('src, 200, not parser-inserted, no defer, async', true, false);
+
+var test1_error = event_test('src, 404, parser-inserted, defer, no async', false, true);
+var test2_error = event_test('src, 404, parser-inserted, no defer, no async', false, true);
+var test4_error = event_test('src, 404, parser-inserted, no defer, async', false, true);
+
+var test3_dynamic_error = event_test('src, 404, not parser-inserted, no defer, no async, no non-blocking', false, true);
+var test4_dynamic_error = event_test('src, 404, not parser-inserted, no defer, async', false, true);
+
+var test6_load = event_test('no src, parser-inserted, no style sheets blocking scripts', false, false);
+
+var script3_dynamic_load = document.createElement('script');
+script3_dynamic_load.onload = () => onLoad(test3_dynamic_load);
+script3_dynamic_load.onerror = () => onError(test3_dynamic_load);
+script3_dynamic_load.async = false;
+script3_dynamic_load.src = "resources/load-error-events.py?test=test3_dynamic_load";
+document.head.appendChild(script3_dynamic_load);
+
+var script3_dynamic_error = document.createElement('script');
+script3_dynamic_error.onload = () => onLoad(test3_dynamic_error);
+script3_dynamic_error.onerror = () => onError(test3_dynamic_error);
+script3_dynamic_error.async = false;
+script3_dynamic_error.src = "resources/load-error-events.py?test=test3_dynamic_error";
+document.head.appendChild(script3_dynamic_error);
+
+var script4_dynamic_load = document.createElement('script');
+script4_dynamic_load.onload = () => onLoad(test4_dynamic_load);
+script4_dynamic_load.onerror = () => onError(test4_dynamic_load);
+script4_dynamic_load.async = true;
+script4_dynamic_load.src = "resources/load-error-events.py?test=test4_dynamic_load";
+document.head.appendChild(script4_dynamic_load);
+
+var script4_dynamic_error = document.createElement('script');
+script4_dynamic_error.onload = () => onLoad(test4_dynamic_error);
+script4_dynamic_error.onerror = () => onError(test4_dynamic_error);
+script4_dynamic_error.async = true;
+script4_dynamic_error.src = "resources/load-error-events.py?test=test4_dynamic_error";
+document.head.appendChild(script4_dynamic_error);
+</script>
+
+<script src="resources/load-error-events.py?test=test1_load" onload="onLoad(test1_load);" onerror="onError(test1_load);" defer></script>
+<script src="resources/load-error-events.py?test=test2_load" onload="onLoad(test2_load);" onerror="onError(test2_load);"></script>
+<script src="resources/load-error-events.py?test=test4_load" onload="onLoad(test4_load);" onerror="onError(test4_load);" async></script>
+<script src="resources/load-error-events.py?test=test1_error" onload="onLoad(test1_error);" onerror="onError(test1_error);" defer></script>
+<script src="resources/load-error-events.py?test=test2_error" onload="onLoad(test2_error);" onerror="onError(test2_error);"></script>
+<script src="resources/load-error-events.py?test=test4_error" onload="onLoad(test4_error);" onerror="onError(test4_error);" async></script>
+
+<script onload="onLoad(test6_load);" onerror="onError(test6_load);">
+"use strict";
+onExecute(test6_load);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-2.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-2.html
new file mode 100644
index 00000000000..cefa053e754
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-2.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<head>
+<title>load/error events for classic scripts with a style sheet that is blocking scripts</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/load-error-events-helpers.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#execute-the-script-block">
+<script>
+"use strict";
+var test5_load = event_test('no src, parser-inserted, has style sheets blocking scripts, script nesting level == 1', false, false);
+</script>
+
+<link rel="stylesheet" href="resources/slow.py"></link>
+<!-- This is testing the case where an inline classic script is inserted
+by parser while there is an loading stylesheet. Therefore, it is critical to
+place a <link rel="stylesheet"> just above the <script> to be tested. -->
+<script onload="onLoad(test5_load);" onerror="onError(test5_load);">
+"use strict";
+onExecute(test5_load);
+</script>
+</head>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-3.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-3.html
new file mode 100644
index 00000000000..c2cf0dbdd98
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-error-events-3.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<head>
+<title>load/error events for classic scripts with a style sheet that is blocking scripts and script nesting level &gt; 1</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/load-error-events-helpers.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#execute-the-script-block">
+</head>
+<script>
+"use strict";
+var test6_load = event_test('no src, parser-inserted, has style sheets blocking scripts, script nesting level == 2',
+ false, false);
+
+document.write(
+ `<link rel="stylesheet" href="resources/slow.py"></link>
+ <script onload="onLoad(test6_load);"
+ onerror="onError(test6_load);">
+ "use strict";
+ onExecute(test6_load);
+ </scr` + `ipt>`);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-event.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-event.html
deleted file mode 100644
index 25c2ddf3e22..00000000000
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/load-event.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<link rel="help" href="https://html.spec.whatwg.org/multipage/#execute-the-script-block">
-<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
-
-<script>
-"use strict";
-
-async_test(function(t) {
- window.scriptExecuting = function () {
- setTimeout(t.step_func_done(() => {
- assert_equals(window.onloadHappened, undefined);
- }), 0);
- };
-}, "load events should not be fired for inline scripts");
-</script>
-
-
-<script onload="window.onloadHappened = true;">
-"use strict";
-window.scriptExecuting();
-</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-01.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-01.html
new file mode 100644
index 00000000000..7cd49163097
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-01.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Root module scripts should always use UTF-8</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script type="module" src="../serve-with-content-type.py?fn=external-script-utf8.js&ct=text/javascript&dummy=1"></script>
+<script type="module">
+test(function() {
+ assert_equals(window.getSomeString(), "śćążź",
+ 'Should be decoded as UTF-8');
+}, 'UTF-8 module script');
+</script>
+
+<script type="module" src="../serve-with-content-type.py?fn=external-script-utf8.js&ct=text/javascript&dummy=2" charset="windows-1250"></script>
+<script type="module">
+test(function() {
+ assert_equals(window.getSomeString(), "śćążź",
+ 'Should be decoded as UTF-8');
+}, 'UTF-8 module script with wrong charset in attribute');
+</script>
+
+<script type="module" src="../serve-with-content-type.py?fn=external-script-utf8.js&ct=text/javascript%3Bcharset=windows-1250&dummy=3"></script>
+<script type="module">
+test(function() {
+ assert_equals(window.getSomeString(), "śćążź",
+ 'Should be decoded as UTF-8');
+}, 'UTF-8 module script with wrong charset in Content-Type');
+</script>
+
+<script type="module" src="../serve-with-content-type.py?fn=external-script-windows1250.js&ct=text/javascript&dummy=1"></script>
+<script type="module">
+test(function() {
+ assert_not_equals(window.getSomeString(), "śćążź",
+ 'Should be decoded as UTF-8');
+}, 'Non-UTF-8 module script');
+</script>
+
+<script type="module" src="../serve-with-content-type.py?fn=external-script-windows1250.js&ct=text/javascript&dummy=2" charset="windows-1250"></script>
+<script type="module">
+test(function() {
+ assert_not_equals(window.getSomeString(), "śćążź",
+ 'Should be decoded as UTF-8');
+}, 'Non-UTF-8 module script with charset in attribute');
+</script>
+
+<script type="module" src="../serve-with-content-type.py?fn=external-script-windows1250.js&ct=text/javascript%3Bcharset=windows-1250"></script>
+<script type="module">
+test(function() {
+ assert_not_equals(window.getSomeString(), "śćążź",
+ 'Should be decoded as UTF-8');
+}, 'Non-UTF-8 module script with charset in Content-Type');
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-02.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-02.html
new file mode 100644
index 00000000000..c7c4517ad3a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-02.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>Module scripts should ignore BOMs and always use UTF-8</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({allow_uncaught_exception: true});
+</script>
+<script type="module" src="../serve-with-content-type.py?fn=resources/bom-utf-8.js&ct=text/javascript"></script>
+<script type="module" src="../serve-with-content-type.py?fn=resources/bom-utf-16be.js&ct=text/javascript"></script>
+<script type="module" src="../serve-with-content-type.py?fn=resources/bom-utf-16le.js&ct=text/javascript"></script>
+<script type="module">
+test(function() {
+ assert_equals(window.executed_utf8_bom, '\u4e09\u6751\u304b\u306a\u5b50',
+ 'Should be decoded as UTF-8');
+}, 'UTF-8 module script with UTF-8 BOM');
+
+test(function() {
+ assert_equals(window.executed_utf16be_bom, undefined,
+ 'Should result in compile error because of UTF-16BE BOM');
+}, 'UTF-16 module script with UTF-16BE BOM');
+
+test(function() {
+ assert_equals(window.executed_utf16le_bom, undefined,
+ 'Should result in compile error because of UTF-16LE BOM');
+}, 'UTF-16 module script with UTF-16LE BOM');
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-03.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-03.html
new file mode 100644
index 00000000000..666cb2e68be
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/charset-03.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Imported module scripts should always use UTF-8</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script type="module" src="resources/import-utf8.js"></script>
+<script type="module">
+test(function() {
+ assert_equals(window.getSomeString(), "śćążź",
+ 'Should be decoded as UTF-8');
+}, 'UTF-8 imported module script');
+</script>
+
+<script type="module" src="resources/import-utf8-with-charset-header.js"></script>
+<script type="module">
+test(function() {
+ assert_equals(window.getSomeString(), "śćążź",
+ 'Should be decoded as UTF-8');
+}, 'UTF-8 imported module script with wrong charset in Content-Type');
+</script>
+
+<script type="module" src="resources/import-non-utf8.js"></script>
+<script type="module">
+test(function() {
+ assert_not_equals(window.getSomeString(), "śćążź",
+ 'Should be decoded as UTF-8');
+}, 'Non-UTF-8 imported module script');
+</script>
+
+<script type="module" src="resources/import-non-utf8-with-charset-header.js"></script>
+<script type="module">
+test(function() {
+ assert_not_equals(window.getSomeString(), "śćążź",
+ 'Should be decoded as UTF-8');
+}, 'Non-UTF-8 imported module script with charset in Content-Type');
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/credentials.sub.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/credentials.sub.html
new file mode 100644
index 00000000000..1293d7f6913
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/credentials.sub.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+
+<script type="text/javascript">
+host_info = get_host_info();
+
+document.cookie = 'same=1';
+
+const setCookiePromise = fetch(
+ 'http://{{domains[www2]}}:{{ports[http][0]}}/cookies/resources/set-cookie.py?name=cross&path=/html/semantics/scripting-1/the-script-element/module/',
+ {
+ mode: 'no-cors',
+ credentials: 'include',
+ });
+
+const windowLoadPromise = new Promise(resolve => {
+ window.addEventListener('load', () => {
+ resolve();
+ });
+});
+
+promise_test(t => {
+ const iframe = document.createElement('iframe');
+
+ return Promise.all([setCookiePromise, windowLoadPromise]).then(() => {
+ const messagePromise = new Promise(resolve => {
+ window.addEventListener('message', event => {
+ resolve();
+ });
+ });
+
+ iframe.src = 'resources/credentials-iframe.sub.html';
+ document.body.appendChild(iframe);
+
+ return messagePromise;
+ }).then(() => {
+ const w = iframe.contentWindow;
+
+ assert_equals(w.sameOriginNone, 'not found',
+ 'Modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is same-origin');
+ assert_equals(w.sameOriginAnonymous, 'found',
+ 'Modules should be loaded with the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is same-origin');
+ assert_equals(w.sameOriginUseCredentials, 'found',
+ 'Modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is same-origin');
+ assert_equals(w.crossOriginNone, 'not found',
+ 'Modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is cross-origin');
+ assert_equals(w.crossOriginAnonymous, 'not found',
+ 'Modules should be loaded without the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is cross-origin');
+ assert_equals(w.crossOriginUseCredentials, 'found',
+ 'Modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is cross-origin');
+
+ assert_equals(w.sameOriginNoneDecendent, 'not found',
+ 'Decendent modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is same-origin');
+ assert_equals(w.sameOriginAnonymousDecendent, 'found',
+ 'Decendent modules should be loaded with the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is same-origin');
+ assert_equals(w.sameOriginUseCredentialsDecendent, 'found',
+ 'Decendent modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is same-origin');
+ assert_equals(w.crossOriginNoneDecendent, 'not found',
+ 'Decendent modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is cross-origin');
+ assert_equals(w.crossOriginAnonymousDecendent, 'not found',
+ 'Decendent modules should be loaded without the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is cross-origin');
+ assert_equals(w.crossOriginUseCredentialsDecendent, 'found',
+ 'Decendent modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is cross-origin');
+});
+}, 'Modules should be loaded with or without the credentials based on the same-origin-ness and the crossOrigin attribute');
+</script>
+<body>
+</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html
new file mode 100644
index 00000000000..bd77a8f1bba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/custom-element-exception.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<title>Handling of exceptions in custom element constructors</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ setup({allow_uncaught_exception: true});
+
+ window.log = [];
+ window.addEventListener("error", ev => log.push(ev.error));
+
+ const test_load = async_test(
+ "Test that exceptions from the constructor of a custom element " +
+ "inside a module are propagated as expected.\n");
+ window.addEventListener("load", test_load.step_func_done(ev => {
+ assert_equals(1, log.length);
+ const exception = log[0];
+ assert_true(exception instanceof Error);
+ assert_equals(exception.message, "custom element error");
+ }));
+</script>
+<script type="module">
+ class XThrower extends HTMLElement {
+ constructor() {
+ super();
+ throw new Error("custom element error");
+ }
+ }
+ customElements.define("x-thrower", XThrower);
+ document.createElement("x-thrower");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html
new file mode 100644
index 00000000000..3a04395678f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports-error.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>Basic dynamic imports</title>
+<link rel="author" title="Kouhei Ueno" href="mailto:kouhei@chromium.org">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script type="module">
+promise_test(t => {
+ return promise_rejects(t, new SyntaxError, import("../syntaxerror.js"));
+}, "Dynamic imports should reject if the imported tree has a syntax error.");
+promise_test(t => {
+ return promise_rejects(t, new SyntaxError, import("../instantiation-error-1.js"));
+}, "Dynamic imports should reject if the imported tree has an instantiation error.");
+promise_test(t => {
+ return promise_rejects(t, new Error, import("../throw-error.js")).then(() => {
+ assert_true(window.before_throwing_error,
+ "the module script should run to a point where it throws exception");
+ assert_equals(undefined, window.after_throwing_error,
+ "the module script should not run after it throws exception");
+ });
+}, "Dynamic imports should reject if the imported tree has an evaluation error.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html
new file mode 100644
index 00000000000..9807e21b0d1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/dynamic-imports.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<title>Basic dynamic imports</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script type="module">
+promise_test(t => {
+ return import("./../imports-a.js").then(module => {
+ assert_true(window.evaluated_imports_a);
+ assert_equals(module.A["from"], "imports-a.js");
+ });
+}, "Dynamic imports should resolve module.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html
new file mode 100644
index 00000000000..13cc8b66246
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/inline-event-handler.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id='div' onmousedown='import("./../imports-a.js").then(window.continueTest);'></div>
+<script>
+const div = document.getElementById('div');
+
+promise_test(t => {
+ const promise = new Promise(resolve => window.continueTest = resolve);
+
+ const event = new MouseEvent('mousedown', {'button': 1});
+ div.dispatchEvent(event);
+
+ return promise.then(() => {
+ assert_true(window.evaluated_imports_a);
+ div.parentNode.removeChild(div);
+ });
+}, "dynamic import should work when triggered from inline event handlers");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html
new file mode 100644
index 00000000000..0958cfbeba2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-classic.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<meta http-equiv="content-security-policy" content="script-src 'nonce-correct'">
+<script nonce="correct" src="/resources/testharness.js"></script>
+<script nonce="correct" src="/resources/testharnessreport.js"></script>
+<script nonce="correct" src="./propagate-nonce-external.js"></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html
new file mode 100644
index 00000000000..47c422e59c9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external-module.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<meta http-equiv="content-security-policy" content="script-src 'nonce-correct'">
+<script nonce="correct" src="/resources/testharness.js"></script>
+<script nonce="correct" src="/resources/testharnessreport.js"></script>
+<script type="module" nonce="correct" src="./propagate-nonce-external.js"></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external.js
new file mode 100644
index 00000000000..3b97d2f40e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-external.js
@@ -0,0 +1,7 @@
+// This file is loaded both as a module and as a classic script.
+promise_test(t => {
+ return import("../imports-a.js").then(module => {
+ assert_true(window.evaluated_imports_a);
+ assert_equals(module.A["from"], "imports-a.js");
+ });
+}, "Dynamically imported module should eval when imported from script w/ a valid nonce.");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html
new file mode 100644
index 00000000000..754110cb5ea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-classic.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta http-equiv="content-security-policy" content="script-src 'nonce-correct'">
+<script nonce="correct" src="/resources/testharness.js"></script>
+<script nonce="correct" src="/resources/testharnessreport.js"></script>
+<script nonce="correct">
+promise_test(t => {
+ return import("./../imports-a.js").then(module => {
+ assert_true(window.evaluated_imports_a);
+ assert_equals(module.A["from"], "imports-a.js");
+ });
+}, "Dynamically imported module should eval when imported from script w/ a valid nonce.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html
new file mode 100644
index 00000000000..f3322773a42
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/propagate-nonce-inline-module.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta http-equiv="content-security-policy" content="script-src 'nonce-correct'">
+<script nonce="correct" src="/resources/testharness.js"></script>
+<script nonce="correct" src="/resources/testharnessreport.js"></script>
+<script type="module" nonce="correct">
+promise_test(t => {
+ return import("./../imports-a.js").then(module => {
+ assert_true(window.evaluated_imports_a);
+ assert_equals(module.A["from"], "imports-a.js");
+ });
+}, "Dynamically imported module should eval when imported from script w/ a valid nonce.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html
new file mode 100644
index 00000000000..062bb620b9e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>import() inside compiled strings uses the document base URL inside a classic script</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+
+<base href="..">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="dummy"></div>
+
+<script>
+function createTestPromise() {
+ return new Promise((resolve, reject) => {
+ window.continueTest = resolve;
+ window.errorTest = reject;
+ });
+}
+
+const dummyDiv = document.querySelector("#dummy");
+
+const evaluators = {
+ eval,
+ setTimeout,
+ "the Function constructor"(x) {
+ Function(x)();
+ },
+ "reflected inline event handlers"(x) {
+ dummyDiv.setAttribute("onclick", x);
+ dummyDiv.onclick();
+ },
+ "inline event handlers triggered via UA code"(x) {
+ dummyDiv.setAttribute("onclick", x);
+ dummyDiv.click(); // different from .**on**click()
+ }
+};
+
+for (const [label, evaluator] of Object.entries(evaluators)) {
+ promise_test(t => {
+ t.add_cleanup(() => {
+ dummyDiv.removeAttribute("onclick");
+ delete window.evaluated_imports_a;
+ });
+
+ const promise = createTestPromise();
+
+ evaluator(`import('./imports-a.js?label=${label}').then(window.continueTest, window.errorTest);`);
+
+ return promise.then(module => {
+ assert_true(window.evaluated_imports_a, "The module must have been evaluated");
+ assert_equals(module.A.from, "imports-a.js", "The module namespace object must be correct");
+ });
+ }, label + " should successfully import");
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html
new file mode 100644
index 00000000000..de51c9a4cd6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>import() inside compiled strings uses the document base URL inside a module script</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+
+<base href="..">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="dummy"></div>
+
+<script type="module">
+function createTestPromise() {
+ return new Promise((resolve, reject) => {
+ window.continueTest = resolve;
+ window.errorTest = reject;
+ });
+}
+
+const dummyDiv = document.querySelector("#dummy");
+
+const evaluators = {
+ eval,
+ setTimeout,
+ "the Function constructor"(x) {
+ Function(x)();
+ },
+ "reflected inline event handlers"(x) {
+ dummyDiv.setAttribute("onclick", x);
+ dummyDiv.onclick();
+ },
+ "inline event handlers triggered via UA code"(x) {
+ dummyDiv.setAttribute("onclick", x);
+ dummyDiv.click(); // different from .**on**click()
+ }
+};
+
+for (const [label, evaluator] of Object.entries(evaluators)) {
+ promise_test(t => {
+ t.add_cleanup(() => {
+ dummyDiv.removeAttribute("onclick");
+ delete window.evaluated_imports_a;
+ });
+
+ const promise = createTestPromise();
+
+ evaluator(`import('./imports-a.js?label=${label}').then(window.continueTest, window.errorTest);`);
+
+ return promise.then(module => {
+ assert_true(window.evaluated_imports_a, "The module must have been evaluated");
+ assert_equals(module.A.from, "imports-a.js", "The module namespace object must be correct");
+ });
+ }, label + " should successfully import");
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html
new file mode 100644
index 00000000000..34ea00abc83
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-classic.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>import() inside compiled strings inside a classic script</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="dummy"></div>
+
+<script>
+function createTestPromise() {
+ return new Promise((resolve, reject) => {
+ window.continueTest = resolve;
+ window.errorTest = reject;
+ });
+}
+
+const dummyDiv = document.querySelector("#dummy");
+
+const evaluators = {
+ eval,
+ setTimeout,
+ "the Function constructor"(x) {
+ Function(x)();
+ },
+ "reflected inline event handlers"(x) {
+ dummyDiv.setAttribute("onclick", x);
+ dummyDiv.onclick();
+ },
+ "inline event handlers triggered via UA code"(x) {
+ dummyDiv.setAttribute("onclick", x);
+ dummyDiv.click(); // different from .**on**click()
+ }
+};
+
+for (const [label, evaluator] of Object.entries(evaluators)) {
+ promise_test(t => {
+ t.add_cleanup(() => {
+ dummyDiv.removeAttribute("onclick");
+ delete window.evaluated_imports_a;
+ });
+
+ const promise = createTestPromise();
+
+ evaluator(`import('../imports-a.js?label=${label}').then(window.continueTest, window.errorTest);`);
+
+ return promise.then(module => {
+ assert_true(window.evaluated_imports_a, "The module must have been evaluated");
+ assert_equals(module.A.from, "imports-a.js", "The module namespace object must be correct");
+ });
+ }, label + " should successfully import");
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html
new file mode 100644
index 00000000000..b85d446d8da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-module.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>import() inside compiled strings inside a module script</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="dummy"></div>
+
+<script type="module">
+function createTestPromise() {
+ return new Promise((resolve, reject) => {
+ window.continueTest = resolve;
+ window.errorTest = reject;
+ });
+}
+
+const dummyDiv = document.querySelector("#dummy");
+
+const evaluators = {
+ eval,
+ setTimeout,
+ "the Function constructor"(x) {
+ Function(x)();
+ },
+ "reflected inline event handlers"(x) {
+ dummyDiv.setAttribute("onclick", x);
+ dummyDiv.onclick();
+ },
+ "inline event handlers triggered via UA code"(x) {
+ dummyDiv.setAttribute("onclick", x);
+ dummyDiv.click(); // different from .**on**click()
+ }
+};
+
+for (const [label, evaluator] of Object.entries(evaluators)) {
+ promise_test(t => {
+ t.add_cleanup(() => {
+ dummyDiv.removeAttribute("onclick");
+ delete window.evaluated_imports_a;
+ });
+
+ const promise = createTestPromise();
+
+ evaluator(`import('../imports-a.js?label=${label}').then(window.continueTest, window.errorTest);`);
+
+ return promise.then(module => {
+ assert_true(window.evaluated_imports_a, "The module must have been evaluated");
+ assert_equals(module.A.from, "imports-a.js", "The module namespace object must be correct");
+ });
+ }, label + " should successfully import");
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html
index 88d6a297c21..f336276f3fc 100644
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html
@@ -5,6 +5,7 @@
<script type="module">
setup({allow_uncaught_exception: true});
window.log = [];
+window.loaded = false;
</script>
<script type="module">
import "./syntaxerror.js";
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling-parseerror-dependentmultiple.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling-parseerror-dependentmultiple.html
index 37487aa5352..7775aeabb49 100644
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling-parseerror-dependentmultiple.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling-parseerror-dependentmultiple.html
@@ -5,26 +5,19 @@
<script src="errorhandling-parseerror-common.js"></script>
</head>
<body>
- <script type="module" onerror="errorHandler(event);createSecondDependentRoot();">
+ <script type="module" onerror="errorHandler(event)">
// No parse errors in the root module, just in the dependent module
import test from "./errorhandling-parseerror-dependentmultiple.js";
document._errorReported = "shouldn't have run dependent module";
</script>
- <script>
+ <script type="module" onerror="errorHandler(event)">
- function createSecondDependentRoot()
- {
- // With the broken dependent module already acquired, try to import it
- // again from another root. This root should be unwound appropriately.
- var script = document.createElement("script");
- script.type = "module";
- script.textContent = "import test from './errorhandling-parseerror-dependentmultiple.js';" +
- "document._errorReported = 'really shouldn\\'t have run dependent module';";
- script.addEventListener("error", errorHandler);
- document.body.appendChild(script);
- }
+ // With the broken dependent module already acquired, try to import it
+ // again from another root. This root should be unwound appropriately.
+ import test from "./errorhandling-parseerror-dependentmultiple.js";
+ document._errorReported = "really shouldn't have run dependent module";
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling.html
index 6f36d2ce896..5315df0f5b2 100644
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/errorhandling.html
@@ -55,7 +55,6 @@
assert_unreached("This script should not have loaded!");
}));
document.body.appendChild(script_wrongMimetype_import);
-
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/imports-a.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/imports-a.js
index 2d16783d45d..44d1ac96c2c 100644
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/imports-a.js
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/imports-a.js
@@ -1,2 +1,3 @@
var A = { "from": "imports-a.js" };
+window.evaluated_imports_a = true;
export { A };
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html
new file mode 100644
index 00000000000..4eb2f9f277b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>Handling of instantiation errors, 4</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ setup({allow_uncaught_exception: true});
+
+ window.log = [];
+
+ window.addEventListener("error", ev => log.push(ev.error));
+
+ const test_load = async_test(
+ "Test that loading a graph in which a module is already " +
+ "errored results in that module's error.");
+ window.addEventListener("load", test_load.step_func_done(ev => {
+ const exn = log[0];
+ assert_array_equals(log, [exn, 1, exn, 2]);
+ assert_equals(exn.constructor, SyntaxError);
+ }));
+
+ function unreachable() { log.push("unexpected"); }
+</script>
+<script type="module" src="./instantiation-error-4a.js"
+ onerror="unreachable()" onload="log.push(1)"></script>
+<script type="module" src="./instantiation-error-4d.js"
+ onerror="unreachable()" onload="log.push(2)"></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4a.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4a.js
new file mode 100644
index 00000000000..6fed27f1c7b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4a.js
@@ -0,0 +1,2 @@
+import "./instantiation-error-4b.js";
+log.push("instantiation-error-4a");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4b.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4b.js
new file mode 100644
index 00000000000..4b702cae676
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4b.js
@@ -0,0 +1,3 @@
+import "./instantiation-error-4c.js";
+import "./instantiation-error-4d.js";
+log.push("instantiation-error-4b");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4c.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4c.js
new file mode 100644
index 00000000000..ef699f6ca35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4c.js
@@ -0,0 +1,2 @@
+import {something} from "./instantiation-error-4c.js";
+log.push("instantiation-error-4c");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4d.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4d.js
new file mode 100644
index 00000000000..ac04ccb9b34
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-4d.js
@@ -0,0 +1,2 @@
+import {something} from "./instantiation-error-4d.js";
+log.push("instantiation-error-4d");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html
new file mode 100644
index 00000000000..86d0fb3e956
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>Handling of instantiation errors, 5</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ setup({allow_uncaught_exception: true});
+
+ window.log = [];
+
+ window.addEventListener("error", ev => log.push(ev.error));
+
+ const test_load = async_test(
+ "Test that loading a graph in which a module is already " +
+ "errored results in that module's error.");
+ window.addEventListener("load", test_load.step_func_done(ev => {
+ const exn = log[0];
+ assert_array_equals(log, [exn, 1, exn, 2]);
+ assert_equals(exn.constructor, SyntaxError);
+ }));
+
+ function unreachable() { log.push("unexpected"); }
+</script>
+<script type="module" src="./instantiation-error-5a.js"
+ onerror="unreachable()" onload="log.push(1)"></script>
+<script type="module" src="./instantiation-error-5d.js"
+ onerror="unreachable()" onload="log.push(2)"></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5a.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5a.js
new file mode 100644
index 00000000000..b2e6b106b21
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5a.js
@@ -0,0 +1,2 @@
+import "./instantiation-error-5b.js";
+log.push("instantiation-error-5a");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5b.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5b.js
new file mode 100644
index 00000000000..2d37ae8fff5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5b.js
@@ -0,0 +1,3 @@
+import "./instantiation-error-5c.js";
+import "./instantiation-error-5d.js";
+log.push("instantiation-error-5b");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5c.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5c.js
new file mode 100644
index 00000000000..ba221b6fc03
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5c.js
@@ -0,0 +1,2 @@
+import {something} from "./instantiation-error-5c.js";
+log.push("instantiation-error-5c");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5d.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5d.js
new file mode 100644
index 00000000000..9775e04f822
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5d.js
@@ -0,0 +1,3 @@
+import "./instantiation-error-5e.js";
+import "./instantiation-error-5a.js";
+log.push("instantiation-error-5d");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5e.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5e.js
new file mode 100644
index 00000000000..8bd3b3c3bf2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-5e.js
@@ -0,0 +1,2 @@
+import {something} from "./instantiation-error-5e.js";
+log.push("instantiation-error-5e");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html
new file mode 100644
index 00000000000..8d3ce121eea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>Handling of instantiation errors, 6</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ setup({allow_uncaught_exception: true});
+
+ window.log = [];
+
+ window.addEventListener("error", ev => log.push(ev.error));
+
+ const test_load = async_test(
+ "Test that ambiguous star exports lead to an instantiation error " +
+ "and that the correct module is blamed.");
+ // Concretely, instantiation-error-6a.js fails to instantiate because it
+ // requests a name from instantion-error-6b.js that is ambiguous there.
+ // instantiation-error-6b.js itself, however, is fine, and it instantiates
+ // and evaluates successfully.
+ window.addEventListener("load", test_load.step_func_done(ev => {
+ const exn = log[0];
+ assert_array_equals(log, [
+ exn, 1,
+ "instantiation-error-6c",
+ "instantiation-error-6d",
+ "instantiation-error-6b", 2
+ ]);
+ assert_equals(exn.constructor, SyntaxError);
+ }));
+
+ function unreachable() { log.push("unexpected"); }
+</script>
+<script type="module" src="./instantiation-error-6a.js"
+ onerror="unreachable()" onload="log.push(1)"></script>
+<script type="module" src="./instantiation-error-6b.js"
+ onerror="unreachable()" onload="log.push(2)"></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6a.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6a.js
new file mode 100644
index 00000000000..4db49c6c46b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6a.js
@@ -0,0 +1,2 @@
+import {foo} from "./instantiation-error-6b.js";
+log.push("instantiation-error-6a");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6b.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6b.js
new file mode 100644
index 00000000000..35272fe550f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6b.js
@@ -0,0 +1,3 @@
+export * from "./instantiation-error-6c.js";
+export * from "./instantiation-error-6d.js";
+log.push("instantiation-error-6b");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6c.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6c.js
new file mode 100644
index 00000000000..69d616b4bab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6c.js
@@ -0,0 +1,2 @@
+export let foo = "c";
+log.push("instantiation-error-6c");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6d.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6d.js
new file mode 100644
index 00000000000..d1336a57a24
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-6d.js
@@ -0,0 +1,2 @@
+export let foo = "d";
+log.push("instantiation-error-6d");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html
new file mode 100644
index 00000000000..57f1f872161
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>Handling of instantiation errors, 7</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ setup({allow_uncaught_exception: true});
+
+ window.log = [];
+
+ window.addEventListener("error", ev => log.push(ev.error));
+
+ const test_load = async_test(
+ "Test that ambiguous star exports lead to an instantiation error, " +
+ "even when discovered through a star export, and that the correct " +
+ "module is blamed.");
+ // This is a variation of instantiation-error-6.html (see the explanation
+ // there).
+ window.addEventListener("load", test_load.step_func_done(ev => {
+ const exn = log[0];
+ assert_array_equals(log, [
+ exn, 1,
+ "instantiation-error-7d",
+ "instantiation-error-7e",
+ "instantiation-error-7c",
+ "instantiation-error-7f",
+ "instantiation-error-7b", 2
+ ]);
+ assert_equals(exn.constructor, SyntaxError);
+ }));
+
+ function unreachable() { log.push("unexpected"); }
+</script>
+<script type="module" src="./instantiation-error-7a.js"
+ onerror="unreachable()" onload="log.push(1)"></script>
+<script type="module" src="./instantiation-error-7b.js"
+ onerror="unreachable()" onload="log.push(2)"></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7a.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7a.js
new file mode 100644
index 00000000000..d27a44865cf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7a.js
@@ -0,0 +1,2 @@
+import {foo} from "./instantiation-error-7b.js";
+log.push("instantiation-error-7a");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7b.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7b.js
new file mode 100644
index 00000000000..8c05d3b7274
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7b.js
@@ -0,0 +1,3 @@
+export * from "./instantiation-error-7c.js";
+export * from "./instantiation-error-7f.js";
+log.push("instantiation-error-7b");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7c.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7c.js
new file mode 100644
index 00000000000..fff1368034b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7c.js
@@ -0,0 +1,3 @@
+export * from "./instantiation-error-7d.js";
+export * from "./instantiation-error-7e.js";
+log.push("instantiation-error-7c");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7d.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7d.js
new file mode 100644
index 00000000000..fa5e7651f4f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7d.js
@@ -0,0 +1,2 @@
+export let foo = "d";
+log.push("instantiation-error-7d");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7e.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7e.js
new file mode 100644
index 00000000000..6547c3fe6a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7e.js
@@ -0,0 +1,2 @@
+export let foo = "e";
+log.push("instantiation-error-7e");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7f.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7f.js
new file mode 100644
index 00000000000..7f9ec5d12ec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-7f.js
@@ -0,0 +1,2 @@
+export let foo = "f";
+log.push("instantiation-error-7f");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html
new file mode 100644
index 00000000000..080b1702337
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/instantiation-error-8.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<title>Handling of instantiation errors, 8</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<!-- The below module tree should fail to instantiate, since it references undefined identifier. -->
+<script type="module" src="instantiation-error-1.js"></script>
+<script>
+setup({allow_uncaught_exception: true});
+
+promise_test(t => {
+ return new Promise(resolve => {
+ window.addEventListener("error", e => {
+ assert_equals(e.error.constructor, SyntaxError);
+ resolve();
+ }, { once: true });
+ }).then(() => new Promise(resolve => {
+ window.addEventListener("error", e => {
+ assert_equals(e.error.constructor, SyntaxError);
+ resolve();
+ }, { once: true });
+ // Load another module tree w/ previously instantiate-failed tree as its sub-tree.
+ document.head.appendChild(Object.assign(
+ document.createElement('script'),
+ { type: 'module', innerText: 'import "./instantiation-error-1.js"'}));
+ }));
+}, "Instantiate attempt on a tree w/ previously instantiate-failed tree as a sub-tree shouldn't crash.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-matches-inner.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-matches-inner.js
new file mode 100644
index 00000000000..369b3e7827d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-matches-inner.js
@@ -0,0 +1 @@
+window.matchesLog.push("integrity-matches-inner");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-matches.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-matches.js
new file mode 100644
index 00000000000..d8c4219e90b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-matches.js
@@ -0,0 +1,2 @@
+import "./integrity-matches-inner.js";
+window.matchesLog.push("integrity-matches");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-mismatches-inner.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-mismatches-inner.js
new file mode 100644
index 00000000000..8182d4de162
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-mismatches-inner.js
@@ -0,0 +1 @@
+window.mismatchesLog.push("integrity-mismatches-inner");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-mismatches.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-mismatches.js
new file mode 100644
index 00000000000..2d47344a5ac
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity-mismatches.js
@@ -0,0 +1,2 @@
+import "./integrity-mismatches-inner.js";
+window.mismatchesLog.push("integrity-mismatches");
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity.html
new file mode 100644
index 00000000000..c79843624fa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/integrity.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>&lt;script> integrity=""</title>
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#prepare-a-script">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+window.inlineRan = false;
+
+window.matchesLog = [];
+window.matchesEvents = [];
+
+window.mismatchesLog = [];
+window.mismatchesEvents = [];
+</script>
+
+<script type="module" integrity="sha384-garbage">
+window.inlineRan = true;
+</script>
+
+<script type="module" src="integrity-matches.js" integrity="sha384-1/XwTy38IAlmvk1O674Efus1/REqfuX6x0V/B2/GX5R3lNbRjhrIwlWyEDPyOwpN" onload="window.matchesEvents.push('load');" onerror="window.matchesEvents.push('error')"></script>
+<script type="module" src="integrity-mismatches.js" integrity="sha384-doesnotmatch" onload="window.mismatchesEvents.push('load');" onerror="window.mismatchesEvents.push('error')"></script>
+
+<script type="module">
+test(() => {
+ assert_true(window.inlineRan);
+}, "The integrity attribute must have no affect on inline module scripts");
+
+test(() => {
+ assert_array_equals(window.matchesLog, ["integrity-matches-inner", "integrity-matches"], "The module and its dependency must have executed");
+ assert_array_equals(window.matchesEvents, ["load"], "The load event must have fired");
+}, "The integrity attribute must be verified on the top-level of a module and allow it to execute when it matches");
+
+test(() => {
+ assert_array_equals(window.mismatchesLog, [], "The module and its dependency must not have executed");
+ assert_array_equals(window.mismatchesEvents, ["error"], "The error event must have fired");
+}, "The integrity attribute must be verified on the top-level of a module and not allow it to execute when there's a mismatch");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html
new file mode 100644
index 00000000000..c4dd0807f62
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/load-error-events-inline.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<head>
+<title>load/error events for inline module scripts</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/load-error-events-helpers.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#execute-the-script-block">
+</head>
+<script>
+"use strict";
+
+var test1_load = event_test('src, 200, parser-inserted, defer, no async', false, false);
+var test4_load = event_test('src, 200, parser-inserted, no defer, async', false, false);
+
+var test3_dynamic_load = event_test('src, 200, not parser-inserted, no defer, no async, no non-blocking', false, false);
+var test4_dynamic_load = event_test('src, 200, not parser-inserted, no defer, async', false, false);
+
+var test1_error = event_test('src, 404, parser-inserted, defer, no async', false, true);
+var test4_error = event_test('src, 404, parser-inserted, no defer, async', false, true);
+
+var test3_dynamic_error = event_test('src, 404, not parser-inserted, no defer, no async, no non-blocking', false, true);
+var test4_dynamic_error = event_test('src, 404, not parser-inserted, no defer, async', false, true);
+
+var script3_dynamic_load = document.createElement('script');
+script3_dynamic_load.setAttribute('type', 'module');
+script3_dynamic_load.onload = () => onLoad(test3_dynamic_load);
+script3_dynamic_load.onerror = () => onError(test3_dynamic_load);
+script3_dynamic_load.async = false;
+script3_dynamic_load.appendChild(document.createTextNode('onExecute(test3_dynamic_load);'));
+document.head.appendChild(script3_dynamic_load);
+
+var script3_dynamic_error = document.createElement('script');
+script3_dynamic_error.setAttribute('type', 'module');
+script3_dynamic_error.onload = () => onLoad(test3_dynamic_error);
+script3_dynamic_error.onerror = () => onError(test3_dynamic_error);
+script3_dynamic_error.async = false;
+script3_dynamic_error.appendChild(document.createTextNode('import "./not_found.js";'));
+document.head.appendChild(script3_dynamic_error);
+
+var script4_dynamic_load = document.createElement('script');
+script4_dynamic_load.setAttribute('type', 'module');
+script4_dynamic_load.onload = () => onLoad(test4_dynamic_load);
+script4_dynamic_load.onerror = () => onError(test4_dynamic_load);
+script4_dynamic_load.async = true;
+script4_dynamic_load.appendChild(document.createTextNode('onExecute(test4_dynamic_load);'));
+document.head.appendChild(script4_dynamic_load);
+
+var script4_dynamic_error = document.createElement('script');
+script4_dynamic_error.setAttribute('type', 'module');
+script4_dynamic_error.onload = () => onLoad(test4_dynamic_error);
+script4_dynamic_error.onerror = () => onError(test4_dynamic_error);
+script4_dynamic_error.async = true;
+script4_dynamic_error.appendChild(document.createTextNode('import "./not_found.js";'));
+document.head.appendChild(script4_dynamic_error);
+</script>
+
+<script onload="onLoad(test1_load);" onerror="onError(test1_load);" type="module">"use strict";onExecute(test1_load);</script>
+<script onload="onLoad(test4_load);" onerror="onError(test4_load);" type="module" async>"use strict";onExecute(test4_load);</script>
+<script onload="onLoad(test1_error);" onerror="onError(test1_error);" type="module">"use strict";import "./not_found.js";</script>
+<script onload="onLoad(test4_error);" onerror="onError(test4_error);" type="module" async>"use strict";import "./not_found.js";</script>
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/load-error-events.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/load-error-events.html
new file mode 100644
index 00000000000..d9bf05226c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/load-error-events.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<head>
+<title>load/error events for external module scripts</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/load-error-events-helpers.js"></script>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#execute-the-script-block">
+</head>
+<script>
+"use strict";
+
+var test1_load = event_test('src, 200, parser-inserted, defer, no async', true, false);
+var test4_load = event_test('src, 200, parser-inserted, no defer, async', true, false);
+
+var test3_dynamic_load = event_test('src, 200, not parser-inserted, no defer, no async, no non-blocking', true, false);
+var test4_dynamic_load = event_test('src, 200, not parser-inserted, no defer, async', true, false);
+
+var test1_error = event_test('src, 404, parser-inserted, defer, no async', false, true);
+var test4_error = event_test('src, 404, parser-inserted, no defer, async', false, true);
+
+var test3_dynamic_error = event_test('src, 404, not parser-inserted, no defer, no async, no non-blocking', false, true);
+var test4_dynamic_error = event_test('src, 404, not parser-inserted, no defer, async', false, true);
+
+var script3_dynamic_load = document.createElement('script');
+script3_dynamic_load.setAttribute('type', 'module');
+script3_dynamic_load.onload = () => onLoad(test3_dynamic_load);
+script3_dynamic_load.onerror = () => onError(test3_dynamic_load);
+script3_dynamic_load.async = false;
+script3_dynamic_load.src = "../resources/load-error-events.py?test=test3_dynamic_load";
+document.head.appendChild(script3_dynamic_load);
+
+var script3_dynamic_error = document.createElement('script');
+script3_dynamic_error.setAttribute('type', 'module');
+script3_dynamic_error.onload = () => onLoad(test3_dynamic_error);
+script3_dynamic_error.onerror = () => onError(test3_dynamic_error);
+script3_dynamic_error.async = false;
+script3_dynamic_error.src = "../resources/load-error-events.py?test=test3_dynamic_error";
+document.head.appendChild(script3_dynamic_error);
+
+var script4_dynamic_load = document.createElement('script');
+script4_dynamic_load.setAttribute('type', 'module');
+script4_dynamic_load.onload = () => onLoad(test4_dynamic_load);
+script4_dynamic_load.onerror = () => onError(test4_dynamic_load);
+script4_dynamic_load.async = true;
+script4_dynamic_load.src = "../resources/load-error-events.py?test=test4_dynamic_load";
+document.head.appendChild(script4_dynamic_load);
+
+var script4_dynamic_error = document.createElement('script');
+script4_dynamic_error.setAttribute('type', 'module');
+script4_dynamic_error.onload = () => onLoad(test4_dynamic_error);
+script4_dynamic_error.onerror = () => onError(test4_dynamic_error);
+script4_dynamic_error.async = true;
+script4_dynamic_error.src = "../resources/load-error-events.py?test=test4_dynamic_error";
+document.head.appendChild(script4_dynamic_error);
+</script>
+
+<script src="../resources/load-error-events.py?test=test1_load" onload="onLoad(test1_load);" onerror="onError(test1_load);" type="module"></script>
+<script src="../resources/load-error-events.py?test=test4_load" onload="onLoad(test4_load);" onerror="onError(test4_load);" type="module" async></script>
+<script src="../resources/load-error-events.py?test=test1_error" onload="onLoad(test1_error);" onerror="onError(test1_error);" type="module"></script>
+<script src="../resources/load-error-events.py?test=test4_error" onload="onLoad(test4_error);" onerror="onError(test4_error);" type="module" async></script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml
new file mode 100644
index 00000000000..724c9e75074
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/module-in-xhtml.xhtml
@@ -0,0 +1,16 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script type="module">
+window.evaluated_module_script = true;
+</script>
+<script>
+test(() => assert_true(window.evaluated_module_script), "module script in XHTML documents should be evaluated.");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py
new file mode 100644
index 00000000000..cf6f72fa1b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py
@@ -0,0 +1,20 @@
+def main(request, response):
+ headers = [
+ ("Content-Type", "text/javascript"),
+ ("Access-Control-Allow-Origin", request.headers.get("Origin")),
+ ("Access-Control-Allow-Credentials", "true")
+ ]
+ identifier = request.GET.first("id")
+ cookie_name = request.GET.first("cookieName")
+ cookie = request.cookies.first(cookie_name, None)
+ if identifier is None or cookie_name is None:
+ return headers, ""
+
+ if cookie is None:
+ result = "not found"
+ elif cookie.value == "1":
+ result = "found"
+ else:
+ result = "different value: " + cookie.value
+
+ return headers, "window." + identifier + " = '" + result + "';"
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/credentials-iframe.sub.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/credentials-iframe.sub.html
new file mode 100644
index 00000000000..f086e702822
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/credentials-iframe.sub.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+
+<script type="module"
+ src="check-cookie.py?id=sameOriginNone&cookieName=same">
+</script>
+<script type="module"
+ src="check-cookie.py?id=sameOriginAnonymous&cookieName=same"
+ crossOrigin="anonymous">
+</script>
+<script type="module"
+ src="check-cookie.py?id=sameOriginUseCredentials&cookieName=same"
+ crossOrigin="use-credentials">
+</script>
+<script type="module"
+ src="http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginNone&cookieName=cross">
+</script>
+<script type="module"
+ src="http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginAnonymous&cookieName=cross"
+ crossOrigin="anonymous">
+</script>
+<script type="module"
+ src="http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginUseCredentials&cookieName=cross"
+ crossOrigin="use-credentials">
+</script>
+
+<script type="module">
+import "./check-cookie.py?id=sameOriginNoneDecendent&cookieName=same";
+</script>
+<script type="module" crossOrigin="anonymous">
+import "./check-cookie.py?id=sameOriginAnonymousDecendent&cookieName=same";
+</script>
+<script type="module" crossOrigin="use-credentials">
+import "./check-cookie.py?id=sameOriginUseCredentialsDecendent&cookieName=same";
+</script>
+<script type="module">
+import "http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginNoneDecendent&cookieName=cross";
+</script>
+<script type="module" crossOrigin="anonymous">
+import "http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginAnonymousDecendent&cookieName=cross";
+</script>
+<script type="module" crossOrigin="use-credentials">
+import "http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginUseCredentialsDecendent&cookieName=cross";
+</script>
+
+<script type="text/javascript">
+window.addEventListener('load', event => {
+ window.parent.postMessage({}, '*');
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8-with-charset-header.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8-with-charset-header.js
new file mode 100644
index 00000000000..6fc4ad395ca
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8-with-charset-header.js
@@ -0,0 +1 @@
+import "../../serve-with-content-type.py?fn=external-script-windows1250.js&ct=text/javascript%3Bcharset=windows-1250&dummy=6";
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8.js
new file mode 100644
index 00000000000..3ae805d78d9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-non-utf8.js
@@ -0,0 +1 @@
+import "../../serve-with-content-type.py?fn=external-script-windows1250.js&ct=text/javascript&dummy=5";
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-utf8-with-charset-header.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-utf8-with-charset-header.js
new file mode 100644
index 00000000000..c2ccab7c621
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-utf8-with-charset-header.js
@@ -0,0 +1 @@
+import "../../serve-with-content-type.py?fn=external-script-utf8.js&ct=text/javascript%3Bcharset=windows-1250&dummy=6";
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-utf8.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-utf8.js
new file mode 100644
index 00000000000..5708a26e079
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/resources/import-utf8.js
@@ -0,0 +1 @@
+import "../../serve-with-content-type.py?fn=external-script-utf8.js&ct=text/javascript&dummy=5";
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/throw-error.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/throw-error.js
new file mode 100644
index 00000000000..9769c84b233
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/module/throw-error.js
@@ -0,0 +1,3 @@
+window.before_throwing_error = true;
+throw new Error;
+window.after_throwing_error = true;
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-16be.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-16be.js
new file mode 100644
index 00000000000..0e70da4d3de
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-16be.js
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-16le.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-16le.js
new file mode 100644
index 00000000000..3f03f889398
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-16le.js
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-8.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-8.js
new file mode 100644
index 00000000000..6e16cbd28c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/bom-utf-8.js
@@ -0,0 +1,2 @@
+// JavaScript file with UTF-8 BOM.
+executed_utf8_bom = '三村かな子';
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/load-error-events-helpers.js b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/load-error-events-helpers.js
new file mode 100644
index 00000000000..bbd6b09c6cf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/load-error-events-helpers.js
@@ -0,0 +1,47 @@
+"use strict";
+// Helper functions to be used from load-error-events*.html tests.
+
+function event_test(name, load_to_be_fired, error_to_be_fired) {
+ return {
+ test: async_test(name),
+ executed: false,
+ load_event_to_be_fired: load_to_be_fired,
+ error_event_to_be_fired: error_to_be_fired
+ };
+}
+
+// Should be used as load/error event handlers of script tags,
+// with |t| = the object returned by event_test().
+function onLoad(t) {
+ t.test.step(function() {
+ if (t.load_event_to_be_fired) {
+ assert_true(t.executed,
+ 'Load event should be fired after script execution');
+ // Delay done() a little so that if an error event happens
+ // the assert_unreached is reached and fails the test.
+ t.test.step_timeout(() => t.test.done(), 100);
+ } else {
+ assert_unreached('Load event should not be fired.');
+ }
+ });
+};
+function onError(t) {
+ t.test.step(function() {
+ if (t.error_event_to_be_fired) {
+ assert_false(t.executed);
+ // Delay done() a little so that if a load event happens
+ // the assert_unreached is reached and fails the test.
+ t.test.step_timeout(() => t.test.done(), 100);
+ } else {
+ assert_unreached('Error event should not be fired.');
+ }
+ });
+};
+
+// To be called from inline scripts, which expect no load/error events.
+function onExecute(t) {
+ t.executed = true;
+ // Delay done() a little so that if a load/error event happens
+ // the assert_unreached is reached and fails the test.
+ t.test.step_timeout(() => t.test.done(), 100);
+}
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/load-error-events.py b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/load-error-events.py
new file mode 100644
index 00000000000..8599087be5e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/load-error-events.py
@@ -0,0 +1,15 @@
+import re
+
+def main(request, response):
+ headers = [("Content-Type", "text/javascript")]
+ test = request.GET.first('test')
+ assert(re.match('^[a-zA-Z0-9_]+$', test));
+
+ if test.find('_load') >= 0:
+ status = 200
+ content = '"use strict"; %s.executed = true;' % test
+ else:
+ status = 404
+ content = '"use strict"; %s.test.step(function() { assert_unreached("404 script should not be executed"); });' % test
+
+ return status, headers, content
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/slow.py b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/slow.py
new file mode 100644
index 00000000000..f3b1c7e2ea6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/resources/slow.py
@@ -0,0 +1,5 @@
+import time
+
+def main(request, response):
+ time.sleep(2)
+ return 200, [], ''
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-language-type.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-language-type.html
deleted file mode 100644
index b94834c83dd..00000000000
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-language-type.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<title>Script: combinations of @type and @language</title>
-<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
-<link rel="help" href="https://html.spec.whatwg.org/multipage/#prepare-a-script">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-var run = false;
-</script>
-<script type="" language="foo">
-run = true;
-</script>
-<script>
-test(function() {
- assert_equals(run, true);
-}, "A script with empty type should run");
-</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-languages-01.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-languages-01.html
deleted file mode 100644
index f2f2724df5a..00000000000
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-languages-01.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<title>Script @type: unknown parameters</title>
-<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
-<link rel="help" href="https://html.spec.whatwg.org/multipage/#scriptingLanguages">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<div id="test">
-<script type="text/javascript;charset=UTF-8">
-test(function() {
- assert_unreached("'charset' should have prevented this script from executing.");
-})
-</script>
-<script type="text/javascript;x-test=abc">
-test(function() {
- assert_unreached("'x-test' should have prevented this script from executing.");
-})
-</script>
-</div>
-<script>
-test(function() {
- assert_true(true)
-})
-</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-languages-02.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-languages-02.html
deleted file mode 100644
index 69613e5104f..00000000000
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-languages-02.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE html>
-<title>Script @type: JavaScript types</title>
-<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
-<link rel="help" href="https://html.spec.whatwg.org/multipage/#scriptingLanguages">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-function testAttribute(attr, val, shouldRun) {
- test(function() {
- assert_false(ran, "ran variable not reset");
- var script = document.createElement("script");
- script.setAttribute(attr, val);
- script.textContent = "ran = true;"
- document.body.appendChild(script);
- assert_equals(ran, shouldRun);
- }, "Script should" + (shouldRun ? "" : "n't") + " run with " + attr + "=" + format_value(val));
- ran = false
-}
-function testType(type) {
- testAttribute("type", type, true);
-}
-function testLanguage(lang) {
- testAttribute("language", lang, true);
-}
-function testTypeIgnored(type) {
- testAttribute("type", type, false);
-}
-function testLanguageIgnored(lang) {
- testAttribute("language", lang, false);
-}
-var application = [
- "ecmascript",
- "javascript",
- "x-ecmascript",
- "x-javascript"
-];
-var text = [
- "ecmascript",
- "javascript",
- "javascript1.0",
- "javascript1.1",
- "javascript1.2",
- "javascript1.3",
- "javascript1.4",
- "javascript1.5",
- "jscript",
- "livescript",
- "x-ecmascript",
- "x-javascript"
-];
-var spaces = [" ", "\t", "\n", "\r", "\f"];
-
-var ran = false;
-
-// Type attribute
-
-testType("");
-testTypeIgnored(" ");
-
-application.map(function(t) { return "application/" + t; }).forEach(testType);
-application.map(function(t) { return ("application/" + t).toUpperCase(); }).forEach(testType);
-
-spaces.forEach(function(s) {
- application.map(function(t) { return "application/" + t + s; }).forEach(testType);
- application.map(function(t) { return s + "application/" + t; }).forEach(testType);
-})
-
-application.map(function(t) { return "application/" + t + "\0"; }).forEach(testTypeIgnored);
-application.map(function(t) { return "application/" + t + "\0foo"; }).forEach(testTypeIgnored);
-
-text.map(function(t) { return "text/" + t; }).forEach(testType);
-text.map(function(t) { return ("text/" + t).toUpperCase(); }).forEach(testType);
-
-spaces.forEach(function(s) {
- text.map(function(t) { return "text/" + t + s; }).forEach(testType);
- text.map(function(t) { return s + "text/" + t; }).forEach(testType);
-})
-
-text.map(function(t) { return "text/" + t + "\0"; }).forEach(testTypeIgnored);
-text.map(function(t) { return "text/" + t + "\0foo"; }).forEach(testTypeIgnored);
-
-// Language attribute
-
-testLanguage("");
-testLanguageIgnored(" ");
-
-text.forEach(testLanguage);
-text.map(function(t) { return t.toUpperCase(); }).forEach(testLanguage);
-
-text.map(function(t) { return t + " "; }).forEach(testLanguageIgnored);
-text.map(function(t) { return " " + t; }).forEach(testLanguageIgnored);
-text.map(function(t) { return t + "xyz"; }).forEach(testLanguageIgnored);
-text.map(function(t) { return "xyz" + t; }).forEach(testLanguageIgnored);
-
-text.map(function(t) { return t + "\0"; }).forEach(testLanguageIgnored);
-text.map(function(t) { return t + "\0foo"; }).forEach(testLanguageIgnored);
-</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-empty.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-empty.html
new file mode 100644
index 00000000000..6ce1b279f74
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-empty.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<title>Script @type and @language: empty strings</title>
+<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#prepare-a-script">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!-- Setup -->
+<script>
+window.run1 = window.run2 = window.run3 = window.run4 = false;
+</script>
+
+<!-- Systems under test -->
+<script type="">
+window.run1 = true;
+</script>
+
+<script type="" language="foo">
+window.run2 = true;
+</script>
+
+<script type="" language="">
+window.run3 = true;
+</script>
+
+<script language="">
+window.run4 = true;
+</script>
+
+<!-- Asserts -->
+<script>
+test(() => {
+ assert_true(window.run1);
+}, "A script with empty type and no language should run");
+
+test(() => {
+ assert_true(window.run2);
+}, "A script with empty type and a random language should run");
+
+test(() => {
+ assert_true(window.run3);
+}, "A script with empty type and empty language should run");
+
+test(() => {
+ assert_true(window.run4);
+}, "A script with no type and empty language should run");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-js.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-js.html
new file mode 100644
index 00000000000..2f56ade9bee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-js.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<title>Script @type and @language: JavaScript types</title>
+<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#scriptingLanguages">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#prepare-a-script">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+function testAttribute(attr, val, shouldRun) {
+ test(function() {
+ assert_false(ran, "ran variable not reset");
+ var script = document.createElement("script");
+ script.setAttribute(attr, val);
+ script.textContent = "ran = true;"
+ document.body.appendChild(script);
+ assert_equals(ran, shouldRun);
+ }, "Script should" + (shouldRun ? "" : "n't") + " run with " + attr + "=" + format_value(val));
+ ran = false
+}
+function testType(type) {
+ testAttribute("type", type, true);
+}
+function testLanguage(lang) {
+ testAttribute("language", lang, true);
+}
+function testTypeIgnored(type) {
+ testAttribute("type", type, false);
+}
+function testLanguageIgnored(lang) {
+ testAttribute("language", lang, false);
+}
+var application = [
+ "ecmascript",
+ "javascript",
+ "x-ecmascript",
+ "x-javascript"
+];
+var text = [
+ "ecmascript",
+ "javascript",
+ "javascript1.0",
+ "javascript1.1",
+ "javascript1.2",
+ "javascript1.3",
+ "javascript1.4",
+ "javascript1.5",
+ "jscript",
+ "livescript",
+ "x-ecmascript",
+ "x-javascript"
+];
+var spaces = [" ", "\t", "\n", "\r", "\f"];
+
+var ran = false;
+
+// Type attribute
+
+testType("");
+testTypeIgnored(" ");
+
+application.map(function(t) { return "application/" + t; }).forEach(testType);
+application.map(function(t) { return ("application/" + t).toUpperCase(); }).forEach(testType);
+
+spaces.forEach(function(s) {
+ application.map(function(t) { return "application/" + t + s; }).forEach(testType);
+ application.map(function(t) { return s + "application/" + t; }).forEach(testType);
+})
+
+application.map(function(t) { return "application/" + t + "\0"; }).forEach(testTypeIgnored);
+application.map(function(t) { return "application/" + t + "\0foo"; }).forEach(testTypeIgnored);
+
+text.map(function(t) { return "text/" + t; }).forEach(testType);
+text.map(function(t) { return ("text/" + t).toUpperCase(); }).forEach(testType);
+
+spaces.forEach(function(s) {
+ text.map(function(t) { return "text/" + t + s; }).forEach(testType);
+ text.map(function(t) { return s + "text/" + t; }).forEach(testType);
+})
+
+text.map(function(t) { return "text/" + t + "\0"; }).forEach(testTypeIgnored);
+text.map(function(t) { return "text/" + t + "\0foo"; }).forEach(testTypeIgnored);
+
+// Language attribute
+
+testLanguage("");
+testLanguageIgnored(" ");
+
+text.forEach(testLanguage);
+text.map(function(t) { return t.toUpperCase(); }).forEach(testLanguage);
+
+text.map(function(t) { return t + " "; }).forEach(testLanguageIgnored);
+text.map(function(t) { return " " + t; }).forEach(testLanguageIgnored);
+text.map(function(t) { return t + "xyz"; }).forEach(testLanguageIgnored);
+text.map(function(t) { return "xyz" + t; }).forEach(testLanguageIgnored);
+
+text.map(function(t) { return t + "\0"; }).forEach(testLanguageIgnored);
+text.map(function(t) { return t + "\0foo"; }).forEach(testLanguageIgnored);
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-with-params.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-with-params.html
new file mode 100644
index 00000000000..977ee7d0a48
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-script-element/script-type-and-language-with-params.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<title>Script @type and @language: unknown type parameters</title>
+<link rel="author" title="Ms2ger" href="mailto:ms2ger@gmail.com">
+<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#scriptingLanguages">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#prepare-a-script">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<!-- Setup -->
+<script>
+window.run1 = window.run2 = window.run3 = false;
+</script>
+
+<!-- Systems under test -->
+<script type="text/javascript;charset=UTF-8">
+window.run1 = true;
+</script>
+
+<script type="text/javascript;x-test=abc">
+window.run2 = true;
+</script>
+
+<script language="javascript" type="text/javascript;charset=UTF-8">
+window.run3 = true;
+</script>
+
+<!-- Asserts -->
+<script>
+test(() => {
+ assert_false(window.run1);
+}, "A script with a charset param in its type should not run");
+
+test(() => {
+ assert_false(window.run2);
+}, "A script with an x-test param in its type should not run");
+
+test(() => {
+ assert_false(window.run3);
+}, "A script with a charset param in its type should not run, even with language=javascript");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html
new file mode 100644
index 00000000000..1f33b96b342
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/template-content-hierarcy.html
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title></title>
+</head>
+<meta name="author" title="Takayoshi Kochi" href="mailto:kochi@chromium.org">
+<meta name="assert" title="host-including inclusive ancestor should be checked for template content">
+<link rel="help" href="https://dom.spec.whatwg.org/#concept-tree-host-including-inclusive-ancestor">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="parent">
+ <template id="tmpl"><span>Happy Templating!</span></template>
+</div>
+</body>
+<script>
+test(() => {
+ var parent = document.getElementById('parent');
+ var tmpl = document.getElementById('tmpl');
+
+ assert_equals(tmpl.innerHTML, '<span>Happy Templating!</span>');
+ var span = tmpl.content.querySelector('span');
+
+ // Hierarchy checks at various combinations.
+ assert_throws('HierarchyRequestError', () => {
+ tmpl.content.appendChild(parent);
+ }, 'Template content should throw if any of ancestor is being appended.');
+ assert_throws('HierarchyRequestError', () => {
+ tmpl.content.appendChild(tmpl);
+ }, 'Template content should throw if its host is being appended.');
+ assert_throws('HierarchyRequestError', () => {
+ span.appendChild(parent);
+ }, 'Template content child should throw if any of ancestor is being appended.');
+ assert_throws('HierarchyRequestError', () => {
+ span.appendChild(tmpl);
+ }, 'Template content child should throw template\'s host is being appended.');
+}, "Template content should throw when its ancestor is being appended.");
+
+test(() => {
+ var parent = document.getElementById('parent');
+ var tmpl = document.getElementById('tmpl');
+
+ assert_equals(tmpl.innerHTML, '<span>Happy Templating!</span>');
+ var span = tmpl.content.querySelector('span');
+
+ var tmpl_doc = tmpl.content.ownerDocument;
+ assert_equals(tmpl.ownerDocument, document);
+ assert_not_equals(tmpl_doc, document);
+
+ var new_doc = document.implementation.createHTMLDocument();
+ assert_not_equals(new_doc, document);
+ assert_not_equals(new_doc, tmpl_doc);
+
+ // Try moving tmpl.content to new_doc and check the results.
+ var new_node = new_doc.adoptNode(tmpl.content);
+ assert_equals(new_node.ownerDocument, new_doc);
+ assert_equals(tmpl.ownerDocument, document);
+ assert_equals(tmpl.content.ownerDocument, new_doc);
+ assert_not_equals(tmpl.content.ownerDocument, tmpl_doc);
+ assert_not_equals(tmpl.content.ownerDocument, document);
+
+ // Hierarchy checks at various combinations.
+ assert_throws('HierarchyRequestError', () => {
+ tmpl.content.appendChild(parent);
+ }, 'Template content should throw if any of ancestor is being appended.');
+ assert_throws('HierarchyRequestError', () => {
+ tmpl.content.appendChild(tmpl);
+ }, 'Template content should throw if its host is being appended.');
+ assert_throws('HierarchyRequestError', () => {
+ span.appendChild(parent);
+ }, 'Template content child should throw if any of ancestor is being appended.');
+ assert_throws('HierarchyRequestError', () => {
+ span.appendChild(tmpl);
+ }, 'Template content child should throw template\'s host is being appended.');
+
+ // Sanity check: template.content before and after move.
+ var tmpl_content_reference = tmpl.content;
+ assert_equals(tmpl.content.firstChild, span,
+ '<span> should be kept until it is removed, even after ' +
+ 'adopted to another document.');
+ new_doc.body.appendChild(new_node);
+ assert_equals(tmpl.content.firstChild, null,
+ '<span> should be removed from template content.');
+ assert_equals(tmpl_content_reference, tmpl.content,
+ 'template.content should be identical before and after ' +
+ 'moving its children.');
+}, 'Template content should throw exception when its ancestor in ' +
+ 'a different document but connected via host is being append.');
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/template-content.html b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/template-content.html
index 8ed55d0d2db..b9e790daf81 100644
--- a/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/template-content.html
+++ b/tests/wpt/web-platform-tests/html/semantics/scripting-1/the-template-element/template-element/template-content.html
@@ -14,63 +14,49 @@
<div id="log"></div>
<script type="text/javascript">
-var parameters = [];
-
HTML5_ELEMENTS.forEach(function(value) {
if (value !== 'body' && value !== 'html' && value !== 'head' && value !== 'frameset') {
- var doc = newHTMLDocument();
- var template = doc.createElement('template');
- var element = doc.createElement(value);
- template.content.appendChild(element);
- var valueToTest = template.content.querySelector(value);
+ test(function() {
+ var doc = newHTMLDocument();
+ var template = doc.createElement('template');
+ var element = doc.createElement(value);
+ template.content.appendChild(element);
+ var valueToTest = template.content.querySelector(value);
+
+ doc.body.appendChild(template);
- doc.body.appendChild(template);
+ assert_not_equals(valueToTest, null);
+ }, 'Template may contain ' + value + ' element');
- parameters.push([
- 'Template may contain ' + value + ' element',
- valueToTest,
- null
- ]);
}
});
-generate_tests(assert_not_equals, parameters,
- 'Template may contain any element, except the html element, '
- + 'the head element, the body element, or the frameset element');
-
-
var parameters = [];
HTML5_ELEMENTS.forEach(function(value) {
- if (value !== 'body' && value !== 'html' && value !== 'head' && value !== 'frameset') {
+ if (value !== 'body' && value !== 'html' && value !== 'head' && value !== 'frameset') {
- var doc = newHTMLDocument();
+ test(function() {
+ var doc = newHTMLDocument();
- if (isVoidElement(value)) {
- doc.body.innerHTML = '<template><' + value + '/></template>';
- } else {
- doc.body.innerHTML = '<template><' + value + '></' + value + '></template>';
- }
+ if (isVoidElement(value)) {
+ doc.body.innerHTML = '<template><' + value + '/></template>';
+ } else {
+ doc.body.innerHTML = '<template><' + value + '></' + value + '></template>';
+ }
- var template = doc.querySelector('template');
- var element = template.content.querySelector(value);
+ var template = doc.querySelector('template');
+ var element = template.content.querySelector(value);
- parameters.push([
- 'Template may contain ' + value + ' element. '
- +'The template element and contents are added via body.innerHTML',
- element,
- null
- ]);
- }
-});
+ assert_not_equals(element, null);
+ }, 'Template may contain ' + value + ' element. '
+ + 'The template element and contents are added via body.innerHTML');
-generate_tests(assert_not_equals, parameters,
- 'Template may contain any element, except the html element, '
- + 'the head element, the body element, or the frameset element. '
- +'The template element and contents are added via body.innerHTML');
+ }
+});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/checked-type-change.html b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/checked-type-change.html
new file mode 100644
index 00000000000..661d9e4355e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/checked-type-change.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Selector: pseudo-class :checked input type change</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#pseudo-classes">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ span { color: red }
+ :checked + span { color: green }
+</style>
+<input id="checked" type="text" checked>
+<span id="sibling">This text should be green.</span>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(sibling).color, "rgb(255, 0, 0)",
+ "Not matching :checked for type=text");
+
+ checked.type = "radio";
+
+ assert_equals(getComputedStyle(sibling).color, "rgb(0, 128, 0)",
+ "Matching :checked for type=radio");
+ }, "Evaluation of :checked changes on input type change.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/indeterminate-type-change.html b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/indeterminate-type-change.html
new file mode 100644
index 00000000000..b3e4cce3023
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/indeterminate-type-change.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Selector: pseudo-class :indeterminate input type change</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#pseudo-classes">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ span { color: red }
+ :indeterminate + span { color: green }
+</style>
+<input id="indeterminate" type="text">
+<span id="sibling">This text should be green.</span>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(sibling).color, "rgb(255, 0, 0)",
+ "Not matching :indeterminate for type=text");
+
+ indeterminate.type = "radio";
+
+ assert_equals(getComputedStyle(sibling).color, "rgb(0, 128, 0)",
+ "Matching :indeterminate for type=radio");
+ }, "Evaluation of :indeterminate changes on input type change.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html
new file mode 100644
index 00000000000..9c1be9ca275
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/inrange-outofrange-type-change.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Selector: pseudo-classes (:in-range, :out-of-range) input type change</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#pseudo-classes">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ span {
+ color: red;
+ }
+ #t1:in-range + span {
+ color: green;
+ }
+ #t2:out-of-range + span {
+ color: green;
+ }
+</style>
+<input id="t1" type="text" min="0" max="10" value="5">
+<span id="sibling1">This text should be green.</span>
+<input id="t2" type="text" min="0" max="10" value="50">
+<span id="sibling2">This text should be green.</span>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(sibling1).color, "rgb(255, 0, 0)",
+ "Not matching :in-range for type=text");
+
+ t1.type = "number";
+
+ assert_equals(getComputedStyle(sibling1).color, "rgb(0, 128, 0)",
+ "Matching :in-range for type=number");
+ }, "Evaluation of :in-range changes for input type change.");
+
+ test(() => {
+ assert_equals(getComputedStyle(sibling2).color, "rgb(255, 0, 0)",
+ "Not matching :out-of-range for type=text");
+
+ t2.type = "number";
+
+ assert_equals(getComputedStyle(sibling2).color, "rgb(0, 128, 0)",
+ "Matching :in-range for type=number");
+ }, "Evaluation of :out-of-range changes for input type change.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html
new file mode 100644
index 00000000000..206ae80c757
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/placeholder-shown-type-change.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Selector: pseudo-class :placeholder-shown input type change</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#pseudo-classes">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ span {
+ color: red;
+ }
+ :placeholder-shown + span {
+ color: green;
+ }
+</style>
+<input id="input" type="submit" placeholder="placeholder"></input>
+<span id="sibling">This text should be green.</span>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(sibling).color, "rgb(255, 0, 0)",
+ "Not matching :placeholder-shown for type=submit");
+
+ input.type = "text";
+ assert_equals(getComputedStyle(sibling).color, "rgb(0, 128, 0)",
+ "Matching :placeholder-shown for type=text");
+ }, "Evaluation of :placeholder-shown changes for input type change.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html
new file mode 100644
index 00000000000..90ef1d25d46
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/readwrite-readonly-type-change.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Selector: pseudo-classes (:read-write, :read-only) input type change</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#pseudo-classes">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ span {
+ color: red;
+ background-color: pink;
+ }
+ :required + span {
+ color: green;
+ }
+ :not(:optional) + span {
+ background-color: lime;
+ }
+</style>
+<input id="hiddenInput" type="hidden" required>
+<span id="sibling">This text should be green on lime background.</span>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(sibling).color, "rgb(255, 0, 0)",
+ "Not matching :required for type=hidden");
+ assert_equals(getComputedStyle(sibling).backgroundColor, "rgb(255, 192, 203)",
+ "Matching :optional for type=hidden");
+
+ hiddenInput.type = "text";
+
+ assert_equals(getComputedStyle(sibling).color, "rgb(0, 128, 0)",
+ "Matching :required for type=text");
+ assert_equals(getComputedStyle(sibling).backgroundColor, "rgb(0, 255, 0)",
+ "Matching :not(:optional) for type=text");
+ }, "Evaluation of :required and :optional changes for input type change.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/required-optional-hidden.html b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/required-optional-hidden.html
new file mode 100644
index 00000000000..fe3d6e2f42a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/selectors/pseudo-classes/required-optional-hidden.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Selector: pseudo-classes (:required, :optional) for hidden input</title>
+<link rel="author" title="Rune Lillesveen" href="mailto:rune@opera.com">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#pseudo-classes">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+ span {
+ color: red;
+ background-color: pink;
+ }
+ :required + span {
+ color: green;
+ }
+ :not(:optional) + span {
+ background-color: lime;
+ }
+</style>
+<input id="hiddenInput" type="hidden" required>
+<span id="sibling">This text should be green on lime background.</span>
+<script>
+ test(() => {
+ assert_equals(getComputedStyle(sibling).color, "rgb(255, 0, 0)",
+ "Not matching :required for type=hidden");
+ assert_equals(getComputedStyle(sibling).backgroundColor, "rgb(255, 192, 203)",
+ "Matching :optional for type=hidden");
+
+ hiddenInput.type = "text";
+
+ assert_equals(getComputedStyle(sibling).color, "rgb(0, 128, 0)",
+ "Matching :required for type=text");
+ assert_equals(getComputedStyle(sibling).backgroundColor, "rgb(0, 255, 0)",
+ "Matching :not(:optional) for type=text");
+ }, "Evaluation of :required and :optional changes for input type change.");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/semantics/tabular-data/processing-model-1/span-limits.html b/tests/wpt/web-platform-tests/html/semantics/tabular-data/processing-model-1/span-limits.html
index 176ce09925c..cdfa61bbcdc 100644
--- a/tests/wpt/web-platform-tests/html/semantics/tabular-data/processing-model-1/span-limits.html
+++ b/tests/wpt/web-platform-tests/html/semantics/tabular-data/processing-model-1/span-limits.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<title>Limits on colSpan/rowSpan</title>
+<meta name="timeout" content="long">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
diff --git a/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/a-download-404.py b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/a-download-404.py
new file mode 100644
index 00000000000..a9b394d7ed6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/a-download-404.py
@@ -0,0 +1,2 @@
+def main(request, response):
+ return 404, [("Content-Type", "text/html")], 'Some content for the masses.' * 100
diff --git a/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html
new file mode 100644
index 00000000000..db9e1cbfb92
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/a-download-click-404.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Clicking on an &lt;a> element with a download attribute and href that leads to 404 should not navigate</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/#the-a-element:activation-behaviour">
+<link rel="help" href="https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-download">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+"use strict";
+async_test(t => {
+ const errorFrame = document.createElement("iframe");
+
+ errorFrame.addEventListener("load", function () {
+ errorFrame.contentWindow.addEventListener(
+ "beforeunload", t.unreached_func("Navigated instead of downloading"));
+
+ errorFrame.contentDocument.querySelector("#error-url").click();
+ t.step_timeout(() => t.done(), 1000);
+ });
+ errorFrame.src = "resources/a-download-404.html";
+ document.body.appendChild(errorFrame);
+}, "Do not navigate to 404 for anchor with download");
+</script>
+</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/resources/a-download-404.html b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/resources/a-download-404.html
new file mode 100644
index 00000000000..8c5d8f4565a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/semantics/text-level-semantics/the-a-element/resources/a-download-404.html
@@ -0,0 +1,2 @@
+<!doctype html>
+<a id="error-url" href="../a-download-404.py" download="html.html">Click me</a>
diff --git a/tests/wpt/web-platform-tests/html/syntax/parsing-html-fragments/the-input-byte-stream-003.html b/tests/wpt/web-platform-tests/html/syntax/parsing-html-fragments/the-input-byte-stream-003.html
index 5b3863b4c31..5b46a7f0f0c 100644
--- a/tests/wpt/web-platform-tests/html/syntax/parsing-html-fragments/the-input-byte-stream-003.html
+++ b/tests/wpt/web-platform-tests/html/syntax/parsing-html-fragments/the-input-byte-stream-003.html
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/syntax/parsing-html-fragments/the-input-byte-stream-004.html b/tests/wpt/web-platform-tests/html/syntax/parsing-html-fragments/the-input-byte-stream-004.html
index 2041daff071..571d5bf8e8b 100644
--- a/tests/wpt/web-platform-tests/html/syntax/parsing-html-fragments/the-input-byte-stream-004.html
+++ b/tests/wpt/web-platform-tests/html/syntax/parsing-html-fragments/the-input-byte-stream-004.html
Binary files differ
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/basic.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/basic.html
deleted file mode 100644
index 68976a6963f..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/basic.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<title>window.requestIdleCallback exists</title>
-<link rel="author" title="Ross McIlroy" href="mailto:rmcilroy@chromium.org" />
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-test(function() {
- assert_equals(typeof window.requestIdleCallback, "function");
-}, "window.requestIdleCallback is defined", {assert: "The window.requestIdleCallback function is used to request callbacks during browser-defined idle time."});
-
-test(function() {
- assert_equals(typeof window.cancelIdleCallback, "function");
-}, "window.cancelIdleCallback is defined", {assert: "The window.cancelIdleCallback function is used to cancel callbacks scheduled via requestIdleCallback."});
-
-test(function() {
- assert_equals(typeof window.requestIdleCallback(function() {}), "number");
-}, "window.requestIdleCallback() returns a number", {assert: "The requestIdleCallback method MUST return a long"});
-
-test(function() {
- assert_equals(typeof window.cancelIdleCallback(1), "undefined");
-}, "window.cancelIdleCallback() returns undefined", {assert: "The cancelIdleCallback method MUST return void"});
-
-async_test(function() {
- // Check whether requestIdleCallback schedules a callback which gets executed
- // and the deadline argument is passed correctly.
- requestIdleCallback(this.step_func_done(function(deadline) {
- assert_equals(arguments.length, 1, "Only one argument should be passed to callback.");
- assert_class_string(deadline, "IdleDeadline");
- assert_equals(typeof deadline.timeRemaining, "function", "IdleDeadline.timeRemaining MUST be a function which returns the time remaining in milliseconds");
- assert_equals(typeof deadline.timeRemaining(), "number", "IdleDeadline.timeRemaining MUST return a double of the time remaining in milliseconds");
- assert_true(deadline.timeRemaining() <= 50, "IdleDeadline.timeRemaining() MUST be less than or equal to 50ms in the future.");
- assert_equals(typeof deadline.didTimeout, "boolean", "IdleDeadline.didTimeout MUST be a boolean");
- assert_false(deadline.didTimeout, "IdleDeadline.didTimeout MUST be false if requestIdleCallback wasn't scheduled due to a timeout");
- }));
-}, 'requestIdleCallback schedules callbacks');
-
-async_test(function() {
- // Check whether requestIdleCallback schedules a callback which gets executed
- // and the deadline argument is passed correctly.
- var handle = requestIdleCallback(this.step_func(function(deadline) {
- assert_unreached("callback should not be called if canceled with cancelIdleCallback");
- }));
- cancelIdleCallback(handle);
- setTimeout(this.step_func(function() {
- this.done();
- }), 200);
-}, 'cancelIdleCallback cancels callbacks');
-
-</script>
-<h1>Basic requestIdleCallback Tests</h1>
-<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-suspended.html b/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-suspended.html
deleted file mode 100644
index 6040de922fb..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-suspended.html
+++ /dev/null
@@ -1,93 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>Dispatching idle callbacks should be able to be suspended and then resumed</title>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<div id="log"></div>
-<script>
- function withEventListener(target, event, handler) {
- handler = handler || (e => e);
- return new Promise(resolve => {
- let wrapper = function(e) {
- let result = handler(e);
- if (!result) {
- return;
- }
-
- resolve(result);
- }
- target.addEventListener(event, wrapper, { once: true });
- });
- }
-
- function makePostBackUrl(name) {
- return new URL('resources/post_name_on_load.html?name=' + name,
- window.location).href;
- }
-
- function waitForMessage(message, handler) {
- return withEventListener(window, 'message', e => (e.data === message) && handler(e));;
- }
-
- function withWindow(name) {
- let win = window.open(makePostBackUrl(name))
- return waitForMessage(name, _ => win);
- }
-
- function navigateWindow(win, name) {
- win.location = makePostBackUrl(name);
- return waitForMessage(name, _ => win);
- }
-
- function waitDuration(delay) {
- return new Promise(resolve => {
- setTimeout(resolve, delay);
- })
- }
-
- function goBack(win) {
- var p = withEventListener(win, 'pagehide');
- win.history.back();
- return p;
- }
-
- promise_test(t => {
- let idleCalled = false;
- let running = true;
- return withWindow('foo')
- .then(win => {
- let callback = function(d) {
- idleCalled = true;
- if (running) {
- win.requestIdleCallback(callback);
- }
- };
-
- win.requestIdleCallback(callback);
-
- return navigateWindow(win, 'bar')
- .then(_ => idleCalled = false)
- .then(_ => waitDuration(2000))
- .then(_ => {
- assert_false(idleCalled, "idle callback shouldn't have been called yet");
- return goBack(win);
- })
- .then(_ => Promise.race([
- // At this point it's a matter of having bfcache ...
- waitDuration(2000)
- .then(_ => {
- assert_true(idleCalled, "idle callback should've been called by now");
- running = false;
- }),
- // ... or not. If not, we expect a load event.
- waitForMessage("foo")
- ]))
- .then(_ => win.close())
- .catch(e => {
- win.close();
- throw e;
- })
- });
- });
-
-</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
index 479127df4cf..70b5ff6e568 100644
--- 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
@@ -45,6 +45,10 @@ test(function() {
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")
+
+ const oldPorts = ev.ports;
+ ev.initMessageEvent("test", false, false, null, "", "", null, ev.ports);
+ assert_not_equals(oldPorts, ev.ports, "initMessageEvent() changes ev.ports");
}, "ports attribute should be a FrozenArray")
test(function() {
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content.html b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content.html
deleted file mode 100644
index b6b41c21f14..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content.html
+++ /dev/null
@@ -1,136 +0,0 @@
-<!DOCTYPE html>
-<meta charset='utf-8'>
-<title>registerContentHandler()</title>
-
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-
-<noscript><p>Enable JavaScript and reload.</p></noscript>
-
-<p><strong>Note:</strong> If your browser limits the number of handler
-registration requests on a page, you might need to disable or significantly
-increase that limit for the tests below to run.</p>
-
-
-<div id='log'></div>
-
-<script>
-test(function () {
- assert_idl_attribute(navigator, 'registerContentHandler');
-}, 'the registerContentHandler method should exist on the navigator object');
-
-/* Happy path */
-test(function () {
- navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s', 'foo');
-}, 'a handler with valid arguments should work');
-
-
-/* URL argument */
-test(function () {
- navigator.registerContentHandler('text/x-unknown-type', '%s', 'foo');
-}, 'a relative URL should work');
-
-test(function () {
- navigator.registerContentHandler('text/x-unknown-type', location.href + '#%s', 'foo');
-}, 'a URL with a fragment identifier should work');
-
-test(function () {
- navigator.registerContentHandler('text/x-unknown-type', location.href + '?foo=%s', 'foo');
-}, 'a URL with a query string should work');
-
-test(function () {
- navigator.registerContentHandler('text/x-unknown-type', location.href + '?foo=%s&bar', 'foo');
-}, 'a URL with a multi-argument query string should work');
-
-test(function () {
- navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s/bar/baz/', 'foo');
-}, 'a URL with the passed string as a directory name should work');
-
-test(function () {
- navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s/bar/baz/?foo=1337&bar#baz', 'foo');
-}, 'a URL with the passed string as a directory name followed by a query string and fragment identifier should work');
-
-test(function () {
- navigator.registerContentHandler('text/x-unknown-type', location.href + '/%s/foo/%s/', 'foo');
-}, 'a URL with the passed string included twice should work');
-
-test(function () {
- assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', '', 'foo') } );
-}, 'an empty url argument should throw SYNTAX_ERR');
-
-test(function () {
- assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'http://%s.com', 'foo') } );
-}, '%s instead of domain name should throw SYNTAX_ERR');
-
-test(function () {
- assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'http://%s.example.com', 'foo') } );
-}, '%s instead of subdomain name should throw syntax_err');
-
-test(function () {
- assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', location.href + '', 'foo') } );
-}, 'a url argument without %s should throw SYNTAX_ERR');
-
-test(function () {
- assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'http://example.com', 'foo') } );
-}, 'a url argument pointing to a different domain name, without %s should throw SYNTAX_ERR');
-
-test(function () {
- assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', location.href + '/%', 'foo') } );
-}, 'a url argument without %s (but with %) should throw SYNTAX_ERR');
-
-test(function () {
- assert_throws('SYNTAX_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', location.href + '/%a', 'foo') } );
-}, 'a url argument without %s (but with %a) should throw SYNTAX_ERR');
-
-test(function () {
- assert_throws('SECURITY_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'http://example.com/%s', 'foo') } );
-}, 'a url argument pointing to a different domain name should throw SECURITY_ERR');
-
-test(function () {
- assert_throws('SECURITY_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'https://example.com/%s', 'foo') } );
-}, 'a url argument pointing to a different domain name should throw SECURITY_ERR (2)');
-
-test(function () {
- assert_throws('SECURITY_ERR', function () { navigator.registerContentHandler('text/x-unknown-type', 'http://foobar.example.com/%s', 'foo') } );
-}, 'a url argument pointing to a different domain name should throw SECURITY_ERR (3)');
-
-/* Content type argument */
-
-/* The following MIME types are handled natively by the browser, and must not
- * be possible to override. Note that this list only covers a few basic content
- * types. Full lists of content types handled by each browser is found under
- * /vendor/. */
-
-var blacklist = new Array(
- 'image/jpeg',
- 'text/html',
- 'text/javascript',
- 'text/plain');
-
-for (var bi=0, bl=blacklist.length; bi<bl; ++bi){
-
- test(function () {
- assert_throws('SECURITY_ERR', function () { navigator.registerContentHandler(blacklist[bi], location.href + '/%s', 'foo') } );
- }, 'attempting to override the ' + blacklist[bi] + ' MIME type should throw SECURITY_ERR');
-
-}
-
-/* Overriding the following MIME types should be possible. */
-var whitelist = new Array('application/atom+xml', /* For feeds. */
- 'application/rss+xml', /* For feeds. */
- 'application/x-unrecognized', /* Arbitrary MIME types should be overridable. */
- 'text/unrecognized',
- 'foo/bar');
-
-for (var wi=0, wl=whitelist.length; wi<wl; ++wi){
-
- test(function () {
- navigator.registerContentHandler(whitelist[wi], location.href + '/%s', 'foo');
- }, 'overriding the ' + whitelist[wi] + ' MIME type should work');
-
-}
-
-</script>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/001.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/001.xhtml
deleted file mode 100644
index a0d2fa15b8c..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/001.xhtml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>isContentHandlerRegistered for new content type</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- assert_equals(navigator.isContentHandlerRegistered('application/x-notRegisteredInOtherTCs-001', location.href.replace(/\/[^\/]*$/, "") + '/%s'), 'new');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/002.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/002.xhtml
deleted file mode 100644
index d5c2ff3e05a..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/002.xhtml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>isContentHandlerRegistered for content type that is not yet accepted</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var ctype = 'application/x-notRegisteredInOtherTCs-002';
- var url = location.href.replace(/\/[^\/]*$/, "") + "/%s";
- navigator.registerContentHandler(ctype, url, 'test');
- assert_equals(navigator.isContentHandlerRegistered(ctype, url), 'declined');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/003.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/003.xhtml
deleted file mode 100644
index 92e7ca8f55e..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/003.xhtml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Content type case insensitivity in isContentHandlerRegistered</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var ctype = 'application/x-notRegisteredInOtherTCs-003', url = location.href.replace(/\/[^\/]*$/, "") + '/%s';
- navigator.registerContentHandler(ctype, url, 'test');
- assert_equals(navigator.isContentHandlerRegistered(ctype.toUpperCase(), url), 'declined');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/004.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/004.xhtml
deleted file mode 100644
index a82f3506bce..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/004.xhtml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Non-matching url in isContentHandlerRegistered</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var ctype = 'application/x-notRegisteredInOtherTCs-004', url = location.href.replace(/\/[^\/]*$/, "") + '/%s';
- navigator.registerContentHandler(ctype, url, 'test');
- assert_equals(navigator.isContentHandlerRegistered(ctype, 'http://t/core/standards/registerhandler/%s'), 'new');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/005.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/005.xhtml
deleted file mode 100644
index b8c8b58d17f..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/005.xhtml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Invalid characters in content type in isContentHandlerRegistered</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var ctype = 'application/x-nótRegísteredInOthérTCs-004', url = location.href.replace(/\/[^\/]*$/, "") + '/%s';
- navigator.registerContentHandler(ctype, url, 'test');
- assert_equals(navigator.isContentHandlerRegistered(ctype, 'http://t/core/standards/registerhandler/%s'), 'new');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/006.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/006.xhtml
deleted file mode 100644
index 86d0cff6190..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/content/006.xhtml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Blacklisted content type and isContentHandlerRegistered</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var ctype = 'application/xhtml+xml', url = location.href.replace(/\/[^\/]*$/, "") + '/%s';
- navigator.registerContentHandler(ctype, url, 'test');
- assert_equals(navigator.isContentHandlerRegistered(ctype, 'http://t/core/standards/registerhandler/%s'), 'new');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/historical.window.js b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/historical.window.js
new file mode 100644
index 00000000000..c27845e6a7d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/historical.window.js
@@ -0,0 +1,10 @@
+[
+ "registerContentHandler",
+ "isProtocolHandlerRegistered",
+ "isContentHandlerRegistered",
+ "unregisterContentHandler"
+].forEach(method => {
+ test(() => {
+ assert_false(method in self.navigator);
+ }, method + "() is removed");
+});
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html
index 8798b263064..ab4f61ee9f9 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html
+++ b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/navigator-pluginarray.html
@@ -6,6 +6,25 @@
<script type="text/javascript">
test(function () {
for (var i = 0; i < navigator.plugins.length; i++) {
+ const name = navigator.plugins[i].name;
+ const descriptor = Object.getOwnPropertyDescriptor(navigator.plugins, name);
+ assert_false(descriptor.enumerable);
+ assert_false(name in Object.keys(navigator.plugins));
+ assert_in_array(name, Object.getOwnPropertyNames(navigator.plugins));
+ assert_true(name in navigator.plugins);
+ }
+ for (var i = 0; i < navigator.mimeTypes.length; i++) {
+ const type = navigator.mimeTypes[i].type;
+ const descriptor = Object.getOwnPropertyDescriptor(navigator.mimeTypes, type);
+ assert_false(descriptor.enumerable);
+ assert_false(type in Object.keys(navigator.mimeTypes));
+ assert_in_array(type, Object.getOwnPropertyNames(navigator.mimeTypes));
+ assert_true(type in navigator.mimeTypes);
+ }
+}, "Tests that named properties are not enumerable in navigator.plugins and navigator.mimeTypes");
+
+test(function () {
+ for (var i = 0; i < navigator.plugins.length; i++) {
var plugin = navigator.plugins[i];
var name = plugin.name;
assert_equals(plugin, navigator.plugins[i]);
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/001.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/001.xhtml
deleted file mode 100644
index ce9ee1eb038..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/001.xhtml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>isProtocolHandlerRegistered for new protocol</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var dir_uri = location.href.replace(/\/[^\/]*$/, "");
- assert_equals(navigator.isProtocolHandlerRegistered('web+CustomProtocolOne', dir_uri + '/%s'), 'new');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/002.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/002.xhtml
deleted file mode 100644
index ce2c8dc0d60..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/002.xhtml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>isProtocolHandlerRegistered for protocol that is not yet accepted</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var scheme = 'web+CustomProtocolTwo';
- var url = location.href.replace(/\/[^\/]*$/, "") + '/%s';
- navigator.registerProtocolHandler(scheme, url, 'Ignore dialog or decline it');
- assert_equals(navigator.isProtocolHandlerRegistered(scheme, url), 'declined')
-})
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/003.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/003.xhtml
deleted file mode 100644
index 035d5b9a64b..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/003.xhtml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Protocol case insensitivity in isProtocolHandlerRegistered</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var scheme = 'web+CustomProtocolTree', url = location.href.replace(/\/[^\/]*$/, "") + '/%s';
- navigator.registerProtocolHandler(scheme, url, 'Ignore dialog or decline it');
- assert_equals(navigator.isProtocolHandlerRegistered(scheme.toUpperCase(), url), 'declined');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/004.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/004.xhtml
deleted file mode 100644
index 3fd14dd1294..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/004.xhtml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Non-matching url in isProtocolHandlerRegistered</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var scheme = 'web+CustomProtocolFour', url = location.href.replace(/\/[^\/]*$/, "") + '/%s';
- navigator.registerProtocolHandler(scheme, url, 'Ignore dialog');
- assert_equals(navigator.isProtocolHandlerRegistered(scheme, 'http://t/core/standards/registerhandler/%s'), 'new');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/005.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/005.xhtml
deleted file mode 100644
index 894ff4a6a23..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/005.xhtml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Invalid characters in protocol scheme and isProtocolHandlerRegistered</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var scheme = 'web+CústomPrótocolFíve', url = location.href.replace(/\/[^\/]*$/, "") + '/%s';
- navigator.registerProtocolHandler(scheme, url, 'Ignore dialog or decline it');
- assert_equals(navigator.isProtocolHandlerRegistered(scheme, url), 'new');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/006.xhtml b/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/006.xhtml
deleted file mode 100644
index 7529a7eb2cb..00000000000
--- a/tests/wpt/web-platform-tests/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/006.xhtml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Scheme outside white list and isProtocolHandlerRegistered</title>
-<script src='/resources/testharness.js'></script>
-<script src='/resources/testharnessreport.js'></script>
-<script type="application/ecmascript">
-test(function() {
- var dir_uri = location.href.replace(/\/[^\/]*$/, "");
- var scheme = 'http', url = dir_uri + '/%s';
- navigator.registerProtocolHandler(scheme, url, 'Ignore dialog or decline it');
- assert_equals(navigator.isProtocolHandlerRegistered(scheme, url), 'new');
-});
-</script>
-</head>
-<body>
-<div id="log"></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/http/OWNERS b/tests/wpt/web-platform-tests/http/OWNERS
new file mode 100644
index 00000000000..cb2fb6623ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/http/OWNERS
@@ -0,0 +1,2 @@
+@annevk
+@mnot
diff --git a/tests/wpt/web-platform-tests/http/refresh/README.md b/tests/wpt/web-platform-tests/http/refresh/README.md
new file mode 100644
index 00000000000..bad9833250a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/http/refresh/README.md
@@ -0,0 +1 @@
+See `../../html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/parsing.html` for more detailed parsing tests (shared with `<meta http-equiv=refresh>`).
diff --git a/tests/wpt/web-platform-tests/http/refresh/navigate.window.js b/tests/wpt/web-platform-tests/http/refresh/navigate.window.js
new file mode 100644
index 00000000000..7d5a0fe21d4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/http/refresh/navigate.window.js
@@ -0,0 +1,23 @@
+async_test(t => {
+ const frame = document.createElement("iframe");
+ frame.src = "resources/refresh.py"
+ frame.onload = t.step_func(() => {
+ // Could be better by verifying that resources/refresh.py loads too
+ if(frame.contentWindow.location.href === (new URL("resources/refreshed.txt?\u0080\u00FF", self.location)).href) { // Make sure bytes got mapped to code points of the same value
+ t.done();
+ }
+ });
+ document.body.appendChild(frame)
+}, "When navigating the Refresh header needs to be followed");
+
+async_test(t => {
+ const frame = document.createElement("iframe");
+ frame.src = "resources/multiple.asis"
+ frame.onload = t.step_func(() => {
+ // Could be better by verifying that resources/refresh.py loads too
+ if(frame.contentWindow.location.href === (new URL("resources/refreshed.txt", self.location)).href) {
+ t.done();
+ }
+ });
+ document.body.appendChild(frame)
+}, "When there's both a Refresh header and <meta> the Refresh header wins")
diff --git a/tests/wpt/web-platform-tests/http/refresh/resources/multiple.asis b/tests/wpt/web-platform-tests/http/refresh/resources/multiple.asis
new file mode 100644
index 00000000000..3026d8297bd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/http/refresh/resources/multiple.asis
@@ -0,0 +1,6 @@
+HTTP/1.1 200 OK
+Refresh: 0,./refreshed.txt
+Content-Type:text/html
+
+I don't understand.
+<meta http-equiv=refresh content=1;./>
diff --git a/tests/wpt/web-platform-tests/http/refresh/resources/refresh.py b/tests/wpt/web-platform-tests/http/refresh/resources/refresh.py
new file mode 100644
index 00000000000..58e3827b831
--- /dev/null
+++ b/tests/wpt/web-platform-tests/http/refresh/resources/refresh.py
@@ -0,0 +1,4 @@
+def main(request, response):
+ response.headers.set("Content-Type", "text/plain")
+ response.headers.set("Refresh", "0;./refreshed.txt?\x80\xFF") # Test byte to Unicode conversion
+ response.content = "Not refreshed.\n"
diff --git a/tests/wpt/web-platform-tests/http/refresh/resources/refreshed.txt b/tests/wpt/web-platform-tests/http/refresh/resources/refreshed.txt
new file mode 100644
index 00000000000..5df065b4566
--- /dev/null
+++ b/tests/wpt/web-platform-tests/http/refresh/resources/refreshed.txt
@@ -0,0 +1 @@
+Have another.
diff --git a/tests/wpt/web-platform-tests/http/refresh/subresource.any.js b/tests/wpt/web-platform-tests/http/refresh/subresource.any.js
new file mode 100644
index 00000000000..930dd34ad5b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/http/refresh/subresource.any.js
@@ -0,0 +1,6 @@
+promise_test(() => {
+ return fetch("resources/refresh.py").then(response => {
+ assert_equals(response.headers.get("refresh"), "0;./refreshed.txt?\u0080\u00FF"); // Make sure bytes got mapped to code points of the same value
+ assert_equals(response.url, (new URL("resources/refresh.py", self.location)).href);
+ });
+}, "Refresh does not affect subresources.");
diff --git a/tests/wpt/web-platform-tests/image-decodes/image-decode-iframe.html b/tests/wpt/web-platform-tests/image-decodes/image-decode-iframe.html
deleted file mode 100644
index e64ea98afeb..00000000000
--- a/tests/wpt/web-platform-tests/image-decodes/image-decode-iframe.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<meta name="timeout" content="long">
-<title>img.decode()</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel=help href="">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-
-<iframe id="frame_loaded" srcdoc="iframe"></iframe>
-<iframe id="frame_notloaded" srcdoc="iframe"></iframe>
-<iframe id="frame_notloaded2" srcdoc="iframe"></iframe>
-
-<script>
-"use strict";
-
-promise_test(function() {
- return new Promise(function(resolve, reject) {
- var frame = document.getElementById("frame_loaded");
- var img = frame.contentDocument.createElement("img");
- img.src = "/images/green.png";
- img.onload = function() {
- // At this point the frame which created the img is removed, so decode() should fail.
- frame.parentNode.removeChild(frame);
- img.decode().then(function() {
- assert_false(true, "Unexpected success");
- }, function() {
- resolve();
- });
- };
- });
-}, "(misc) Decode from removed iframe fails (loaded img)");
-
-promise_test(function(t) {
- var frame = document.getElementById("frame_notloaded");
- var img = frame.contentDocument.createElement("img");
- img.src = "/images/green.png";
- frame.parentNode.removeChild(frame);
- var promise = img.decode();
- return promise_rejects(t, "EncodingError", promise);
-}, "(misc) Decode from removed iframe fails (img not loaded)");
-
-promise_test(function(t) {
- var frame = document.getElementById("frame_notloaded2");
- var img = frame.contentDocument.createElement("img");
- img.src = "/images/green.png";
- // First request a promise, then remove the iframe.
- var promise = img.decode();
- frame.parentNode.removeChild(frame);
- return promise_rejects(t, "EncodingError", promise);
-}, "(misc) Decode from iframe, later removed, fails (img not loaded)");
-
-</script>
-
diff --git a/tests/wpt/web-platform-tests/image-decodes/image-decode-path-changes.html b/tests/wpt/web-platform-tests/image-decodes/image-decode-path-changes.html
deleted file mode 100644
index 6082c4b148e..00000000000
--- a/tests/wpt/web-platform-tests/image-decodes/image-decode-path-changes.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<meta name="timeout" content="long">
-<title>img.decode()</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel=help href="">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-
-<script>
-"use strict";
-
-// src tests
-// -------------------
-promise_test(function(t) {
- var img = new Image();
- img.src = "/images/green.png";
- var promise = img.decode();
- img.src = "/images/green.svg";
- return promise_rejects(t, "EncodingError", promise);
-}, "(src) Path changes fail decode.");
-
-promise_test(function(t) {
- var img = new Image();
- img.src = "/images/green.png";
- var first_promise = img.decode();
- img.src = "/images/green.svg";
- var second_promise = img.decode();
- assert_true(first_promise !== second_promise);
- return Promise.all([
- promise_rejects(t, "EncodingError", first_promise),
- second_promise
- ]);
-}, "(src) Path changes fail decode; following good decode succeeds.");
-
-promise_test(function(t) {
- var img = new Image();
- img.src = "/images/green.png";
- var first_promise = img.decode();
- img.src = "/non/existent/path.png";
- var second_promise = img.decode();
- assert_true(first_promise !== second_promise);
- return Promise.all([
- promise_rejects(t, "EncodingError", first_promise),
- promise_rejects(t, "EncodingError", second_promise)
- ]);
-}, "(src) Path changes fail decode; following bad decode fails.");
-
-promise_test(function() {
- var img = new Image();
- img.src = "/images/green.png";
- var first_promise = img.decode();
- img.src = "/images/green.png";
- var second_promise = img.decode();
- assert_true(first_promise !== second_promise);
- return Promise.all([
- first_promise,
- second_promise
- ]);
-}, "(src) Path changes to the same path succeed.");
-
-// srcset tests
-// -------------------
-promise_test(function(t) {
- var img = new Image();
- img.srcset = "/images/green.png 100w";
- var promise = img.decode();
- img.srcset = "/images/green.svg 100w";
- return promise_rejects(t, "EncodingError", promise);
-}, "(srcset) Path changes fail decode.");
-
-promise_test(function(t) {
- var img = new Image();
- img.srcset = "/images/green.png 100w";
- var first_promise = img.decode();
- img.srcset = "/images/green.svg 100w";
- var second_promise = img.decode();
- assert_true(first_promise !== second_promise);
- return Promise.all([
- promise_rejects(t, "EncodingError", first_promise),
- second_promise
- ]);
-}, "(srcset) Path changes fail decode; following good decode succeeds.");
-
-promise_test(function(t) {
- var img = new Image();
- img.srcset = "/images/green.png 100w";
- var first_promise = img.decode();
- img.srcset = "/non/existent/path.png 100w";
- var second_promise = img.decode();
- assert_true(first_promise !== second_promise);
- return Promise.all([
- promise_rejects(t, "EncodingError", first_promise),
- promise_rejects(t, "EncodingError", second_promise)
- ]);
-}, "(srcset) Path changes fail decode; following bad decode fails.");
-
-promise_test(function() {
- var img = new Image();
- img.srcset = "/images/green.png 100w";
- var first_promise = img.decode();
- img.srcset = "/images/green.png 100w";
- var second_promise = img.decode();
- assert_true(first_promise !== second_promise);
- return Promise.all([
- first_promise,
- second_promise
- ]);
-}, "(srcset) Path changes to the same path succeed.");
-
-</script>
diff --git a/tests/wpt/web-platform-tests/image-decodes/image-decode.html b/tests/wpt/web-platform-tests/image-decodes/image-decode.html
deleted file mode 100644
index 5b8c1b6e9cd..00000000000
--- a/tests/wpt/web-platform-tests/image-decodes/image-decode.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<meta name="timeout" content="long">
-<title>img.decode()</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel=help href="">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-
-<script>
-"use strict";
-
-// src tests
-// -------------------
-promise_test(function() {
- var img = new Image();
- img.src = "/images/green.png";
- return img.decode().then(function(arg) {
- assert_equals(arg, undefined);
- });
-}, "(src) PNG image decodes with undefined.");
-
-promise_test(function() {
- var img = new Image();
- img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAA" +
- "D91JpzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QUSEioKsyAgyw" +
- "AAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAAWSURBVA" +
- "jXY9y3bx8DAwPL58+fGRgYACktBRltLfebAAAAAElFTkSuQmCC";
- return img.decode().then(function(arg) {
- assert_equals(arg, undefined);
- });
-}, "(src) PNG url image decodes with undefined.");
-
-promise_test(function() {
- var img = new Image();
- img.src = "/images/green.svg";
- return img.decode().then(function(arg) {
- assert_equals(arg, undefined);
- });
-}, "(src) SVG image decodes with undefined.");
-
-promise_test(function(t) {
- var img = new Image();
- img.src = "/non/existent/path.png";
- var promise = img.decode();
- return promise_rejects(t, "EncodingError", promise);
-}, "(src) Non-existent path fails decode.");
-
-promise_test(function(t) {
- var img = new Image();
- img.src = "data:image/png;base64,iVBO00PDR0BADBEEF00KGg";
- var promise = img.decode();
- return promise_rejects(t, "EncodingError", promise);
-}, "(src) Corrupt image fails decode.");
-
-promise_test(function(t) {
- var img = new Image();
- var promise = img.decode();
- return promise_rejects(t, "EncodingError", promise);
-}, "(src) Path-less image fails decode.");
-
-promise_test(function() {
- var img = new Image();
- img.src = "/images/green.png";
- var first_promise = img.decode();
- var second_promise = img.decode();
- assert_true(first_promise !== second_promise);
- return Promise.all([
- first_promise,
- second_promise
- ]);
-}, "(src) Multiple decodes succeed.");
-
-// srcset tests
-// -------------------
-promise_test(function() {
- var img = new Image();
- img.srcset = "/images/green.png 100w";
- return img.decode().then(function(arg) {
- assert_equals(arg, undefined);
- });
-}, "(srcset) PNG image decodes with undefined.");
-
-promise_test(function() {
- var img = new Image();
- img.srcset = "/images/green.svg 100w";
- return img.decode().then(function(arg) {
- assert_equals(arg, undefined);
- });
-}, "(srcset) SVG image decodes with undefined.");
-
-promise_test(function(t) {
- var img = new Image();
- img.srcset = "/non/existent/path.png 100w";
- var promise = img.decode();
- return promise_rejects(t, "EncodingError", promise);
-}, "(srcset) Non-existent path fails decode.");
-
-promise_test(function() {
- var img = new Image();
- img.srcset = "/images/green.png 100w";
- var first_promise = img.decode();
- var second_promise = img.decode();
- assert_true(first_promise !== second_promise);
- return Promise.all([
- first_promise,
- second_promise
- ]);
-}, "(srcset) Multiple decodes succeed.");
-
-</script>
diff --git a/tests/wpt/web-platform-tests/images/smiley.png.headers b/tests/wpt/web-platform-tests/images/smiley.png.headers
new file mode 100644
index 00000000000..7296361df3d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/images/smiley.png.headers
@@ -0,0 +1 @@
+Timing-Allow-Origin: *
diff --git a/tests/wpt/web-platform-tests/infrastructure/README.md b/tests/wpt/web-platform-tests/infrastructure/README.md
new file mode 100644
index 00000000000..28a764dddf3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/infrastructure/README.md
@@ -0,0 +1,7 @@
+This directory contains a number of tests to ensure test running
+infrastructure is operating correctly:
+
+ * The tests in assumptions/ are designed to test UA assumptions
+ documented in [assumptions.md](/docs/_writing-tests/assumptions.md).
+
+ * The tests in expected-fail/ should all fail.
diff --git a/tests/wpt/web-platform-tests/assumptions/OWNERS b/tests/wpt/web-platform-tests/infrastructure/assumptions/OWNERS
index 26ea3154662..26ea3154662 100644
--- a/tests/wpt/web-platform-tests/assumptions/OWNERS
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/OWNERS
diff --git a/tests/wpt/web-platform-tests/infrastructure/assumptions/ahem-ref.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/ahem-ref.html
new file mode 100644
index 00000000000..971b51c54e4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/ahem-ref.html
@@ -0,0 +1,322 @@
+
+<!doctype html>
+<title>Ahem checker</title>
+<style>
+@font-face {
+ font-family: Ahem;
+ src: url("../../fonts/Ahem.ttf");
+}
+* {
+ padding: 0;
+ margin: 0;
+ border: none;
+}
+
+table {
+ font: 15px/1 Ahem;
+ border-collapse: separate;
+ border-spacing: 1px;
+ table-layout: fixed;
+}
+
+td {
+ width: 34px;
+}
+</style>
+<table>
+ <tr>
+ <td>&#x0020;x <!-- U+0020: SPACE -->
+ <td>&#x0021;x <!-- U+0021: EXCLAMATION MARK -->
+ <td>&#x0022;x <!-- U+0022: QUOTATION MARK -->
+ <td>&#x0023;x <!-- U+0023: NUMBER SIGN -->
+ <td>&#x0024;x <!-- U+0024: DOLLAR SIGN -->
+ <td>&#x0025;x <!-- U+0025: PERCENT SIGN -->
+ <td>&#x0026;x <!-- U+0026: AMPERSAND -->
+ <td>&#x0028;x <!-- U+0028: LEFT PARENTHESIS -->
+ <td>&#x0029;x <!-- U+0029: RIGHT PARENTHESIS -->
+ <td>&#x002A;x <!-- U+002A: ASTERISK -->
+ <td>&#x002B;x <!-- U+002B: PLUS SIGN -->
+ <td>&#x002C;x <!-- U+002C: COMMA -->
+ <td>&#x002D;x <!-- U+002D: HYPHEN-MINUS -->
+ <td>&#x002E;x <!-- U+002E: FULL STOP -->
+ <td>&#x002F;x <!-- U+002F: SOLIDUS -->
+ <td>&#x0030;x <!-- U+0030: DIGIT ZERO -->
+ <td>&#x0031;x <!-- U+0031: DIGIT ONE -->
+ <tr>
+ <td>&#x0032;x <!-- U+0032: DIGIT TWO -->
+ <td>&#x0033;x <!-- U+0033: DIGIT THREE -->
+ <td>&#x0034;x <!-- U+0034: DIGIT FOUR -->
+ <td>&#x0035;x <!-- U+0035: DIGIT FIVE -->
+ <td>&#x0036;x <!-- U+0036: DIGIT SIX -->
+ <td>&#x0037;x <!-- U+0037: DIGIT SEVEN -->
+ <td>&#x0038;x <!-- U+0038: DIGIT EIGHT -->
+ <td>&#x0039;x <!-- U+0039: DIGIT NINE -->
+ <td>&#x003A;x <!-- U+003A: COLON -->
+ <td>&#x003B;x <!-- U+003B: SEMICOLON -->
+ <td>&#x003C;x <!-- U+003C: LESS-THAN SIGN -->
+ <td>&#x003D;x <!-- U+003D: EQUALS SIGN -->
+ <td>&#x003E;x <!-- U+003E: GREATER-THAN SIGN -->
+ <td>&#x003F;x <!-- U+003F: QUESTION MARK -->
+ <td>&#x0040;x <!-- U+0040: COMMERCIAL AT -->
+ <td>&#x0041;x <!-- U+0041: LATIN CAPITAL LETTER A -->
+ <td>&#x0042;x <!-- U+0042: LATIN CAPITAL LETTER B -->
+ <tr>
+ <td>&#x0043;x <!-- U+0043: LATIN CAPITAL LETTER C -->
+ <td>&#x0044;x <!-- U+0044: LATIN CAPITAL LETTER D -->
+ <td>&#x0045;x <!-- U+0045: LATIN CAPITAL LETTER E -->
+ <td>&#x0046;x <!-- U+0046: LATIN CAPITAL LETTER F -->
+ <td>&#x0047;x <!-- U+0047: LATIN CAPITAL LETTER G -->
+ <td>&#x0048;x <!-- U+0048: LATIN CAPITAL LETTER H -->
+ <td>&#x0049;x <!-- U+0049: LATIN CAPITAL LETTER I -->
+ <td>&#x004A;x <!-- U+004A: LATIN CAPITAL LETTER J -->
+ <td>&#x004B;x <!-- U+004B: LATIN CAPITAL LETTER K -->
+ <td>&#x004C;x <!-- U+004C: LATIN CAPITAL LETTER L -->
+ <td>&#x004D;x <!-- U+004D: LATIN CAPITAL LETTER M -->
+ <td>&#x004E;x <!-- U+004E: LATIN CAPITAL LETTER N -->
+ <td>&#x004F;x <!-- U+004F: LATIN CAPITAL LETTER O -->
+ <td>&#x0050;x <!-- U+0050: LATIN CAPITAL LETTER P -->
+ <td>&#x0051;x <!-- U+0051: LATIN CAPITAL LETTER Q -->
+ <td>&#x0052;x <!-- U+0052: LATIN CAPITAL LETTER R -->
+ <td>&#x0053;x <!-- U+0053: LATIN CAPITAL LETTER S -->
+ <tr>
+ <td>&#x0054;x <!-- U+0054: LATIN CAPITAL LETTER T -->
+ <td>&#x0055;x <!-- U+0055: LATIN CAPITAL LETTER U -->
+ <td>&#x0056;x <!-- U+0056: LATIN CAPITAL LETTER V -->
+ <td>&#x0057;x <!-- U+0057: LATIN CAPITAL LETTER W -->
+ <td>&#x0058;x <!-- U+0058: LATIN CAPITAL LETTER X -->
+ <td>&#x0059;x <!-- U+0059: LATIN CAPITAL LETTER Y -->
+ <td>&#x005A;x <!-- U+005A: LATIN CAPITAL LETTER Z -->
+ <td>&#x005B;x <!-- U+005B: LEFT SQUARE BRACKET -->
+ <td>&#x005C;x <!-- U+005C: REVERSE SOLIDUS -->
+ <td>&#x005D;x <!-- U+005D: RIGHT SQUARE BRACKET -->
+ <td>&#x005E;x <!-- U+005E: CIRCUMFLEX ACCENT -->
+ <td>&#x005F;x <!-- U+005F: LOW LINE -->
+ <td>&#x0060;x <!-- U+0060: GRAVE ACCENT -->
+ <td>&#x0061;x <!-- U+0061: LATIN SMALL LETTER A -->
+ <td>&#x0062;x <!-- U+0062: LATIN SMALL LETTER B -->
+ <td>&#x0063;x <!-- U+0063: LATIN SMALL LETTER C -->
+ <td>&#x0064;x <!-- U+0064: LATIN SMALL LETTER D -->
+ <tr>
+ <td>&#x0065;x <!-- U+0065: LATIN SMALL LETTER E -->
+ <td>&#x0066;x <!-- U+0066: LATIN SMALL LETTER F -->
+ <td>&#x0067;x <!-- U+0067: LATIN SMALL LETTER G -->
+ <td>&#x0068;x <!-- U+0068: LATIN SMALL LETTER H -->
+ <td>&#x0069;x <!-- U+0069: LATIN SMALL LETTER I -->
+ <td>&#x006A;x <!-- U+006A: LATIN SMALL LETTER J -->
+ <td>&#x006B;x <!-- U+006B: LATIN SMALL LETTER K -->
+ <td>&#x006C;x <!-- U+006C: LATIN SMALL LETTER L -->
+ <td>&#x006D;x <!-- U+006D: LATIN SMALL LETTER M -->
+ <td>&#x006E;x <!-- U+006E: LATIN SMALL LETTER N -->
+ <td>&#x006F;x <!-- U+006F: LATIN SMALL LETTER O -->
+ <td>&#x0070;x <!-- U+0070: LATIN SMALL LETTER P -->
+ <td>&#x0071;x <!-- U+0071: LATIN SMALL LETTER Q -->
+ <td>&#x0072;x <!-- U+0072: LATIN SMALL LETTER R -->
+ <td>&#x0073;x <!-- U+0073: LATIN SMALL LETTER S -->
+ <td>&#x0074;x <!-- U+0074: LATIN SMALL LETTER T -->
+ <td>&#x0075;x <!-- U+0075: LATIN SMALL LETTER U -->
+ <tr>
+ <td>&#x0076;x <!-- U+0076: LATIN SMALL LETTER V -->
+ <td>&#x0077;x <!-- U+0077: LATIN SMALL LETTER W -->
+ <td>&#x0078;x <!-- U+0078: LATIN SMALL LETTER X -->
+ <td>&#x0079;x <!-- U+0079: LATIN SMALL LETTER Y -->
+ <td>&#x007A;x <!-- U+007A: LATIN SMALL LETTER Z -->
+ <td>&#x007B;x <!-- U+007B: LEFT CURLY BRACKET -->
+ <td>&#x007C;x <!-- U+007C: VERTICAL LINE -->
+ <td>&#x007D;x <!-- U+007D: RIGHT CURLY BRACKET -->
+ <td>&#x007E;x <!-- U+007E: TILDE -->
+ <td>&#x00A0;x <!-- U+00A0: NO-BREAK SPACE -->
+ <td>&#x00A1;x <!-- U+00A1: INVERTED EXCLAMATION MARK -->
+ <td>&#x00A2;x <!-- U+00A2: CENT SIGN -->
+ <td>&#x00A3;x <!-- U+00A3: POUND SIGN -->
+ <td>&#x00A4;x <!-- U+00A4: CURRENCY SIGN -->
+ <td>&#x00A5;x <!-- U+00A5: YEN SIGN -->
+ <td>&#x00A6;x <!-- U+00A6: BROKEN BAR -->
+ <td>&#x00A7;x <!-- U+00A7: SECTION SIGN -->
+ <tr>
+ <td>&#x00A8;x <!-- U+00A8: DIAERESIS -->
+ <td>&#x00A9;x <!-- U+00A9: COPYRIGHT SIGN -->
+ <td>&#x00AA;x <!-- U+00AA: FEMININE ORDINAL INDICATOR -->
+ <td>&#x00AB;x <!-- U+00AB: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -->
+ <td>&#x00AC;x <!-- U+00AC: NOT SIGN -->
+ <td>&#x00AD;x <!-- U+00AD: SOFT HYPHEN -->
+ <td>&#x00AE;x <!-- U+00AE: REGISTERED SIGN -->
+ <td>&#x00AF;x <!-- U+00AF: MACRON -->
+ <td>&#x00B0;x <!-- U+00B0: DEGREE SIGN -->
+ <td>&#x00B1;x <!-- U+00B1: PLUS-MINUS SIGN -->
+ <td>&#x00B2;x <!-- U+00B2: SUPERSCRIPT TWO -->
+ <td>&#x00B3;x <!-- U+00B3: SUPERSCRIPT THREE -->
+ <td>&#x00B4;x <!-- U+00B4: ACUTE ACCENT -->
+ <td>&#x00B5;x <!-- U+00B5: MICRO SIGN -->
+ <td>&#x00B6;x <!-- U+00B6: PILCROW SIGN -->
+ <td>&#x00B7;x <!-- U+00B7: MIDDLE DOT -->
+ <td>&#x00B8;x <!-- U+00B8: CEDILLA -->
+ <tr>
+ <td>&#x00B9;x <!-- U+00B9: SUPERSCRIPT ONE -->
+ <td>&#x00BA;x <!-- U+00BA: MASCULINE ORDINAL INDICATOR -->
+ <td>&#x00BB;x <!-- U+00BB: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
+ <td>&#x00BC;x <!-- U+00BC: VULGAR FRACTION ONE QUARTER -->
+ <td>&#x00BD;x <!-- U+00BD: VULGAR FRACTION ONE HALF -->
+ <td>&#x00BE;x <!-- U+00BE: VULGAR FRACTION THREE QUARTERS -->
+ <td>&#x00BF;x <!-- U+00BF: INVERTED QUESTION MARK -->
+ <td>&#x00C0;x <!-- U+00C0: LATIN CAPITAL LETTER A WITH GRAVE -->
+ <td>&#x00C1;x <!-- U+00C1: LATIN CAPITAL LETTER A WITH ACUTE -->
+ <td>&#x00C2;x <!-- U+00C2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX -->
+ <td>&#x00C3;x <!-- U+00C3: LATIN CAPITAL LETTER A WITH TILDE -->
+ <td>&#x00C4;x <!-- U+00C4: LATIN CAPITAL LETTER A WITH DIAERESIS -->
+ <td>&#x00C5;x <!-- U+00C5: LATIN CAPITAL LETTER A WITH RING ABOVE -->
+ <td>&#x00C6;x <!-- U+00C6: LATIN CAPITAL LETTER AE -->
+ <td>&#x00C7;x <!-- U+00C7: LATIN CAPITAL LETTER C WITH CEDILLA -->
+ <td>&#x00C8;x <!-- U+00C8: LATIN CAPITAL LETTER E WITH GRAVE -->
+ <td>&#x00C9;x <!-- U+00C9: LATIN CAPITAL LETTER E WITH ACUTE -->
+ <tr>
+ <td>&#x00CA;x <!-- U+00CA: LATIN CAPITAL LETTER E WITH CIRCUMFLEX -->
+ <td>&#x00CB;x <!-- U+00CB: LATIN CAPITAL LETTER E WITH DIAERESIS -->
+ <td>&#x00CC;x <!-- U+00CC: LATIN CAPITAL LETTER I WITH GRAVE -->
+ <td>&#x00CD;x <!-- U+00CD: LATIN CAPITAL LETTER I WITH ACUTE -->
+ <td>&#x00CE;x <!-- U+00CE: LATIN CAPITAL LETTER I WITH CIRCUMFLEX -->
+ <td>&#x00CF;x <!-- U+00CF: LATIN CAPITAL LETTER I WITH DIAERESIS -->
+ <td>&#x00D0;x <!-- U+00D0: LATIN CAPITAL LETTER ETH -->
+ <td>&#x00D1;x <!-- U+00D1: LATIN CAPITAL LETTER N WITH TILDE -->
+ <td>&#x00D2;x <!-- U+00D2: LATIN CAPITAL LETTER O WITH GRAVE -->
+ <td>&#x00D3;x <!-- U+00D3: LATIN CAPITAL LETTER O WITH ACUTE -->
+ <td>&#x00D4;x <!-- U+00D4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX -->
+ <td>&#x00D5;x <!-- U+00D5: LATIN CAPITAL LETTER O WITH TILDE -->
+ <td>&#x00D6;x <!-- U+00D6: LATIN CAPITAL LETTER O WITH DIAERESIS -->
+ <td>&#x00D7;x <!-- U+00D7: MULTIPLICATION SIGN -->
+ <td>&#x00D8;x <!-- U+00D8: LATIN CAPITAL LETTER O WITH STROKE -->
+ <td>&#x00D9;x <!-- U+00D9: LATIN CAPITAL LETTER U WITH GRAVE -->
+ <td>&#x00DA;x <!-- U+00DA: LATIN CAPITAL LETTER U WITH ACUTE -->
+ <tr>
+ <td>&#x00DB;x <!-- U+00DB: LATIN CAPITAL LETTER U WITH CIRCUMFLEX -->
+ <td>&#x00DC;x <!-- U+00DC: LATIN CAPITAL LETTER U WITH DIAERESIS -->
+ <td>&#x00DD;x <!-- U+00DD: LATIN CAPITAL LETTER Y WITH ACUTE -->
+ <td>&#x00DE;x <!-- U+00DE: LATIN CAPITAL LETTER THORN -->
+ <td>&#x00DF;x <!-- U+00DF: LATIN SMALL LETTER SHARP S -->
+ <td>&#x00E0;x <!-- U+00E0: LATIN SMALL LETTER A WITH GRAVE -->
+ <td>&#x00E1;x <!-- U+00E1: LATIN SMALL LETTER A WITH ACUTE -->
+ <td>&#x00E2;x <!-- U+00E2: LATIN SMALL LETTER A WITH CIRCUMFLEX -->
+ <td>&#x00E3;x <!-- U+00E3: LATIN SMALL LETTER A WITH TILDE -->
+ <td>&#x00E4;x <!-- U+00E4: LATIN SMALL LETTER A WITH DIAERESIS -->
+ <td>&#x00E5;x <!-- U+00E5: LATIN SMALL LETTER A WITH RING ABOVE -->
+ <td>&#x00E6;x <!-- U+00E6: LATIN SMALL LETTER AE -->
+ <td>&#x00E7;x <!-- U+00E7: LATIN SMALL LETTER C WITH CEDILLA -->
+ <td>&#x00E8;x <!-- U+00E8: LATIN SMALL LETTER E WITH GRAVE -->
+ <td>&#x00E9;x <!-- U+00E9: LATIN SMALL LETTER E WITH ACUTE -->
+ <td>&#x00EA;x <!-- U+00EA: LATIN SMALL LETTER E WITH CIRCUMFLEX -->
+ <td>&#x00EB;x <!-- U+00EB: LATIN SMALL LETTER E WITH DIAERESIS -->
+ <tr>
+ <td>&#x00EC;x <!-- U+00EC: LATIN SMALL LETTER I WITH GRAVE -->
+ <td>&#x00ED;x <!-- U+00ED: LATIN SMALL LETTER I WITH ACUTE -->
+ <td>&#x00EE;x <!-- U+00EE: LATIN SMALL LETTER I WITH CIRCUMFLEX -->
+ <td>&#x00EF;x <!-- U+00EF: LATIN SMALL LETTER I WITH DIAERESIS -->
+ <td>&#x00F0;x <!-- U+00F0: LATIN SMALL LETTER ETH -->
+ <td>&#x00F1;x <!-- U+00F1: LATIN SMALL LETTER N WITH TILDE -->
+ <td>&#x00F2;x <!-- U+00F2: LATIN SMALL LETTER O WITH GRAVE -->
+ <td>&#x00F3;x <!-- U+00F3: LATIN SMALL LETTER O WITH ACUTE -->
+ <td>&#x00F4;x <!-- U+00F4: LATIN SMALL LETTER O WITH CIRCUMFLEX -->
+ <td>&#x00F5;x <!-- U+00F5: LATIN SMALL LETTER O WITH TILDE -->
+ <td>&#x00F6;x <!-- U+00F6: LATIN SMALL LETTER O WITH DIAERESIS -->
+ <td>&#x00F7;x <!-- U+00F7: DIVISION SIGN -->
+ <td>&#x00F8;x <!-- U+00F8: LATIN SMALL LETTER O WITH STROKE -->
+ <td>&#x00F9;x <!-- U+00F9: LATIN SMALL LETTER U WITH GRAVE -->
+ <td>&#x00FA;x <!-- U+00FA: LATIN SMALL LETTER U WITH ACUTE -->
+ <td>&#x00FB;x <!-- U+00FB: LATIN SMALL LETTER U WITH CIRCUMFLEX -->
+ <td>&#x00FC;x <!-- U+00FC: LATIN SMALL LETTER U WITH DIAERESIS -->
+ <tr>
+ <td>&#x00FD;x <!-- U+00FD: LATIN SMALL LETTER Y WITH ACUTE -->
+ <td>&#x00FE;x <!-- U+00FE: LATIN SMALL LETTER THORN -->
+ <td>&#x00FF;x <!-- U+00FF: LATIN SMALL LETTER Y WITH DIAERESIS -->
+ <td>&#x0131;x <!-- U+0131: LATIN SMALL LETTER DOTLESS I -->
+ <td>&#x0152;x <!-- U+0152: LATIN CAPITAL LIGATURE OE -->
+ <td>&#x0153;x <!-- U+0153: LATIN SMALL LIGATURE OE -->
+ <td>&#x0178;x <!-- U+0178: LATIN CAPITAL LETTER Y WITH DIAERESIS -->
+ <td>&#x0192;x <!-- U+0192: LATIN SMALL LETTER F WITH HOOK -->
+ <td>&#x02C6;x <!-- U+02C6: MODIFIER LETTER CIRCUMFLEX ACCENT -->
+ <td>&#x02C7;x <!-- U+02C7: CARON -->
+ <td>&#x02C9;x <!-- U+02C9: MODIFIER LETTER MACRON -->
+ <td>&#x02D8;x <!-- U+02D8: BREVE -->
+ <td>&#x02D9;x <!-- U+02D9: DOT ABOVE -->
+ <td>&#x02DA;x <!-- U+02DA: RING ABOVE -->
+ <td>&#x02DB;x <!-- U+02DB: OGONEK -->
+ <td>&#x02DC;x <!-- U+02DC: SMALL TILDE -->
+ <td>&#x02DD;x <!-- U+02DD: DOUBLE ACUTE ACCENT -->
+ <tr>
+ <td>&#x0394;x <!-- U+0394: GREEK CAPITAL LETTER DELTA -->
+ <td>&#x03A5;x <!-- U+03A5: GREEK CAPITAL LETTER UPSILON -->
+ <td>&#x03A7;x <!-- U+03A7: GREEK CAPITAL LETTER CHI -->
+ <td>&#x03A9;x <!-- U+03A9: GREEK CAPITAL LETTER OMEGA -->
+ <td>&#x03BC;x <!-- U+03BC: GREEK SMALL LETTER MU -->
+ <td>&#x03C0;x <!-- U+03C0: GREEK SMALL LETTER PI -->
+ <td>&#x2002;x <!-- U+2002: EN SPACE -->
+ <td>&#x2003;x <!-- U+2003: EM SPACE -->
+ <td>&#x2004;x <!-- U+2004: THREE-PER-EM SPACE -->
+ <td>&#x2005;x <!-- U+2005: FOUR-PER-EM SPACE -->
+ <td>&#x2006;x <!-- U+2006: SIX-PER-EM SPACE -->
+ <td>&#x2009;x <!-- U+2009: THIN SPACE -->
+ <td>&#x200A;x <!-- U+200A: HAIR SPACE -->
+ <td>&#x200B;x <!-- U+200B: ZERO WIDTH SPACE -->
+ <td>&#x200C;x <!-- U+200C: ZERO WIDTH NON-JOINER -->
+ <td>&#x200D;x <!-- U+200D: ZERO WIDTH JOINER -->
+ <td>&#x2010;x <!-- U+2010: HYPHEN -->
+ <tr>
+ <td>&#x2013;x <!-- U+2013: EN DASH -->
+ <td>&#x2014;x <!-- U+2014: EM DASH -->
+ <td>&#x2018;x <!-- U+2018: LEFT SINGLE QUOTATION MARK -->
+ <td>&#x2019;x <!-- U+2019: RIGHT SINGLE QUOTATION MARK -->
+ <td>&#x201A;x <!-- U+201A: SINGLE LOW-9 QUOTATION MARK -->
+ <td>&#x201C;x <!-- U+201C: LEFT DOUBLE QUOTATION MARK -->
+ <td>&#x201D;x <!-- U+201D: RIGHT DOUBLE QUOTATION MARK -->
+ <td>&#x201E;x <!-- U+201E: DOUBLE LOW-9 QUOTATION MARK -->
+ <td>&#x2020;x <!-- U+2020: DAGGER -->
+ <td>&#x2021;x <!-- U+2021: DOUBLE DAGGER -->
+ <td>&#x2022;x <!-- U+2022: BULLET -->
+ <td>&#x2026;x <!-- U+2026: HORIZONTAL ELLIPSIS -->
+ <td>&#x2030;x <!-- U+2030: PER MILLE SIGN -->
+ <td>&#x2039;x <!-- U+2039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK -->
+ <td>&#x203A;x <!-- U+203A: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -->
+ <td>&#x2044;x <!-- U+2044: FRACTION SLASH -->
+ <td>&#x2122;x <!-- U+2122: TRADE MARK SIGN -->
+ <tr>
+ <td>&#x2126;x <!-- U+2126: OHM SIGN -->
+ <td>&#x2202;x <!-- U+2202: PARTIAL DIFFERENTIAL -->
+ <td>&#x2206;x <!-- U+2206: INCREMENT -->
+ <td>&#x220F;x <!-- U+220F: N-ARY PRODUCT -->
+ <td>&#x2211;x <!-- U+2211: N-ARY SUMMATION -->
+ <td>&#x2212;x <!-- U+2212: MINUS SIGN -->
+ <td>&#x2219;x <!-- U+2219: BULLET OPERATOR -->
+ <td>&#x221A;x <!-- U+221A: SQUARE ROOT -->
+ <td>&#x221E;x <!-- U+221E: INFINITY -->
+ <td>&#x222B;x <!-- U+222B: INTEGRAL -->
+ <td>&#x2248;x <!-- U+2248: ALMOST EQUAL TO -->
+ <td>&#x2260;x <!-- U+2260: NOT EQUAL TO -->
+ <td>&#x2264;x <!-- U+2264: LESS-THAN OR EQUAL TO -->
+ <td>&#x2265;x <!-- U+2265: GREATER-THAN OR EQUAL TO -->
+ <td>&#x22F2;x <!-- U+22F2: ELEMENT OF WITH LONG HORIZONTAL STROKE -->
+ <td>&#x25CA;x <!-- U+25CA: LOZENGE -->
+ <td>&#x3000;x <!-- U+3000: IDEOGRAPHIC SPACE -->
+ <tr>
+ <td>&#x3007;x <!-- U+3007: IDEOGRAPHIC NUMBER ZERO -->
+ <td>&#x4E00;x <!-- U+4E00: CJK UNIFIED IDEOGRAPH-4E00 -->
+ <td>&#x4E03;x <!-- U+4E03: CJK UNIFIED IDEOGRAPH-4E03 -->
+ <td>&#x4E09;x <!-- U+4E09: CJK UNIFIED IDEOGRAPH-4E09 -->
+ <td>&#x4E5D;x <!-- U+4E5D: CJK UNIFIED IDEOGRAPH-4E5D -->
+ <td>&#x4E8C;x <!-- U+4E8C: CJK UNIFIED IDEOGRAPH-4E8C -->
+ <td>&#x4E94;x <!-- U+4E94: CJK UNIFIED IDEOGRAPH-4E94 -->
+ <td>&#x516B;x <!-- U+516B: CJK UNIFIED IDEOGRAPH-516B -->
+ <td>&#x516D;x <!-- U+516D: CJK UNIFIED IDEOGRAPH-516D -->
+ <td>&#x5341;x <!-- U+5341: CJK UNIFIED IDEOGRAPH-5341 -->
+ <td>&#x56D7;x <!-- U+56D7: CJK UNIFIED IDEOGRAPH-56D7 -->
+ <td>&#x56DB;x <!-- U+56DB: CJK UNIFIED IDEOGRAPH-56DB -->
+ <td>&#x571F;x <!-- U+571F: CJK UNIFIED IDEOGRAPH-571F -->
+ <td>&#x6728;x <!-- U+6728: CJK UNIFIED IDEOGRAPH-6728 -->
+ <td>&#x6A2A;x <!-- U+6A2A: CJK UNIFIED IDEOGRAPH-6A2A -->
+ <td>&#x6C34;x <!-- U+6C34: CJK UNIFIED IDEOGRAPH-6C34 -->
+ <td>&#x706B;x <!-- U+706B: CJK UNIFIED IDEOGRAPH-706B -->
+ <tr>
+ <td>&#x7EB5;x <!-- U+7EB5: CJK UNIFIED IDEOGRAPH-7EB5 -->
+ <td>&#x91D1;x <!-- U+91D1: CJK UNIFIED IDEOGRAPH-91D1 -->
+ <td>&#xF000;x <!-- U+F000 -->
+ <td>&#xF001;x <!-- U+F001 -->
+ <td>&#xF002;x <!-- U+F002 -->
+ <td>&#xFEFF;x <!-- U+FEFF: ZERO WIDTH NO-BREAK SPACE -->
+</table>
diff --git a/tests/wpt/web-platform-tests/infrastructure/assumptions/ahem.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/ahem.html
new file mode 100644
index 00000000000..b18cd8e9861
--- /dev/null
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/ahem.html
@@ -0,0 +1,319 @@
+
+<!doctype html>
+<title>Ahem checker</title>
+<link rel="match" href="ahem-ref.html">
+<style>
+* {
+ padding: 0;
+ margin: 0;
+ border: none;
+}
+
+table {
+ font: 15px/1 Ahem;
+ border-collapse: separate;
+ border-spacing: 1px;
+ table-layout: fixed;
+}
+
+td {
+ width: 34px;
+}
+</style>
+<table>
+ <tr>
+ <td>&#x0020;x <!-- U+0020: SPACE -->
+ <td>&#x0021;x <!-- U+0021: EXCLAMATION MARK -->
+ <td>&#x0022;x <!-- U+0022: QUOTATION MARK -->
+ <td>&#x0023;x <!-- U+0023: NUMBER SIGN -->
+ <td>&#x0024;x <!-- U+0024: DOLLAR SIGN -->
+ <td>&#x0025;x <!-- U+0025: PERCENT SIGN -->
+ <td>&#x0026;x <!-- U+0026: AMPERSAND -->
+ <td>&#x0028;x <!-- U+0028: LEFT PARENTHESIS -->
+ <td>&#x0029;x <!-- U+0029: RIGHT PARENTHESIS -->
+ <td>&#x002A;x <!-- U+002A: ASTERISK -->
+ <td>&#x002B;x <!-- U+002B: PLUS SIGN -->
+ <td>&#x002C;x <!-- U+002C: COMMA -->
+ <td>&#x002D;x <!-- U+002D: HYPHEN-MINUS -->
+ <td>&#x002E;x <!-- U+002E: FULL STOP -->
+ <td>&#x002F;x <!-- U+002F: SOLIDUS -->
+ <td>&#x0030;x <!-- U+0030: DIGIT ZERO -->
+ <td>&#x0031;x <!-- U+0031: DIGIT ONE -->
+ <tr>
+ <td>&#x0032;x <!-- U+0032: DIGIT TWO -->
+ <td>&#x0033;x <!-- U+0033: DIGIT THREE -->
+ <td>&#x0034;x <!-- U+0034: DIGIT FOUR -->
+ <td>&#x0035;x <!-- U+0035: DIGIT FIVE -->
+ <td>&#x0036;x <!-- U+0036: DIGIT SIX -->
+ <td>&#x0037;x <!-- U+0037: DIGIT SEVEN -->
+ <td>&#x0038;x <!-- U+0038: DIGIT EIGHT -->
+ <td>&#x0039;x <!-- U+0039: DIGIT NINE -->
+ <td>&#x003A;x <!-- U+003A: COLON -->
+ <td>&#x003B;x <!-- U+003B: SEMICOLON -->
+ <td>&#x003C;x <!-- U+003C: LESS-THAN SIGN -->
+ <td>&#x003D;x <!-- U+003D: EQUALS SIGN -->
+ <td>&#x003E;x <!-- U+003E: GREATER-THAN SIGN -->
+ <td>&#x003F;x <!-- U+003F: QUESTION MARK -->
+ <td>&#x0040;x <!-- U+0040: COMMERCIAL AT -->
+ <td>&#x0041;x <!-- U+0041: LATIN CAPITAL LETTER A -->
+ <td>&#x0042;x <!-- U+0042: LATIN CAPITAL LETTER B -->
+ <tr>
+ <td>&#x0043;x <!-- U+0043: LATIN CAPITAL LETTER C -->
+ <td>&#x0044;x <!-- U+0044: LATIN CAPITAL LETTER D -->
+ <td>&#x0045;x <!-- U+0045: LATIN CAPITAL LETTER E -->
+ <td>&#x0046;x <!-- U+0046: LATIN CAPITAL LETTER F -->
+ <td>&#x0047;x <!-- U+0047: LATIN CAPITAL LETTER G -->
+ <td>&#x0048;x <!-- U+0048: LATIN CAPITAL LETTER H -->
+ <td>&#x0049;x <!-- U+0049: LATIN CAPITAL LETTER I -->
+ <td>&#x004A;x <!-- U+004A: LATIN CAPITAL LETTER J -->
+ <td>&#x004B;x <!-- U+004B: LATIN CAPITAL LETTER K -->
+ <td>&#x004C;x <!-- U+004C: LATIN CAPITAL LETTER L -->
+ <td>&#x004D;x <!-- U+004D: LATIN CAPITAL LETTER M -->
+ <td>&#x004E;x <!-- U+004E: LATIN CAPITAL LETTER N -->
+ <td>&#x004F;x <!-- U+004F: LATIN CAPITAL LETTER O -->
+ <td>&#x0050;x <!-- U+0050: LATIN CAPITAL LETTER P -->
+ <td>&#x0051;x <!-- U+0051: LATIN CAPITAL LETTER Q -->
+ <td>&#x0052;x <!-- U+0052: LATIN CAPITAL LETTER R -->
+ <td>&#x0053;x <!-- U+0053: LATIN CAPITAL LETTER S -->
+ <tr>
+ <td>&#x0054;x <!-- U+0054: LATIN CAPITAL LETTER T -->
+ <td>&#x0055;x <!-- U+0055: LATIN CAPITAL LETTER U -->
+ <td>&#x0056;x <!-- U+0056: LATIN CAPITAL LETTER V -->
+ <td>&#x0057;x <!-- U+0057: LATIN CAPITAL LETTER W -->
+ <td>&#x0058;x <!-- U+0058: LATIN CAPITAL LETTER X -->
+ <td>&#x0059;x <!-- U+0059: LATIN CAPITAL LETTER Y -->
+ <td>&#x005A;x <!-- U+005A: LATIN CAPITAL LETTER Z -->
+ <td>&#x005B;x <!-- U+005B: LEFT SQUARE BRACKET -->
+ <td>&#x005C;x <!-- U+005C: REVERSE SOLIDUS -->
+ <td>&#x005D;x <!-- U+005D: RIGHT SQUARE BRACKET -->
+ <td>&#x005E;x <!-- U+005E: CIRCUMFLEX ACCENT -->
+ <td>&#x005F;x <!-- U+005F: LOW LINE -->
+ <td>&#x0060;x <!-- U+0060: GRAVE ACCENT -->
+ <td>&#x0061;x <!-- U+0061: LATIN SMALL LETTER A -->
+ <td>&#x0062;x <!-- U+0062: LATIN SMALL LETTER B -->
+ <td>&#x0063;x <!-- U+0063: LATIN SMALL LETTER C -->
+ <td>&#x0064;x <!-- U+0064: LATIN SMALL LETTER D -->
+ <tr>
+ <td>&#x0065;x <!-- U+0065: LATIN SMALL LETTER E -->
+ <td>&#x0066;x <!-- U+0066: LATIN SMALL LETTER F -->
+ <td>&#x0067;x <!-- U+0067: LATIN SMALL LETTER G -->
+ <td>&#x0068;x <!-- U+0068: LATIN SMALL LETTER H -->
+ <td>&#x0069;x <!-- U+0069: LATIN SMALL LETTER I -->
+ <td>&#x006A;x <!-- U+006A: LATIN SMALL LETTER J -->
+ <td>&#x006B;x <!-- U+006B: LATIN SMALL LETTER K -->
+ <td>&#x006C;x <!-- U+006C: LATIN SMALL LETTER L -->
+ <td>&#x006D;x <!-- U+006D: LATIN SMALL LETTER M -->
+ <td>&#x006E;x <!-- U+006E: LATIN SMALL LETTER N -->
+ <td>&#x006F;x <!-- U+006F: LATIN SMALL LETTER O -->
+ <td>&#x0070;x <!-- U+0070: LATIN SMALL LETTER P -->
+ <td>&#x0071;x <!-- U+0071: LATIN SMALL LETTER Q -->
+ <td>&#x0072;x <!-- U+0072: LATIN SMALL LETTER R -->
+ <td>&#x0073;x <!-- U+0073: LATIN SMALL LETTER S -->
+ <td>&#x0074;x <!-- U+0074: LATIN SMALL LETTER T -->
+ <td>&#x0075;x <!-- U+0075: LATIN SMALL LETTER U -->
+ <tr>
+ <td>&#x0076;x <!-- U+0076: LATIN SMALL LETTER V -->
+ <td>&#x0077;x <!-- U+0077: LATIN SMALL LETTER W -->
+ <td>&#x0078;x <!-- U+0078: LATIN SMALL LETTER X -->
+ <td>&#x0079;x <!-- U+0079: LATIN SMALL LETTER Y -->
+ <td>&#x007A;x <!-- U+007A: LATIN SMALL LETTER Z -->
+ <td>&#x007B;x <!-- U+007B: LEFT CURLY BRACKET -->
+ <td>&#x007C;x <!-- U+007C: VERTICAL LINE -->
+ <td>&#x007D;x <!-- U+007D: RIGHT CURLY BRACKET -->
+ <td>&#x007E;x <!-- U+007E: TILDE -->
+ <td>&#x00A0;x <!-- U+00A0: NO-BREAK SPACE -->
+ <td>&#x00A1;x <!-- U+00A1: INVERTED EXCLAMATION MARK -->
+ <td>&#x00A2;x <!-- U+00A2: CENT SIGN -->
+ <td>&#x00A3;x <!-- U+00A3: POUND SIGN -->
+ <td>&#x00A4;x <!-- U+00A4: CURRENCY SIGN -->
+ <td>&#x00A5;x <!-- U+00A5: YEN SIGN -->
+ <td>&#x00A6;x <!-- U+00A6: BROKEN BAR -->
+ <td>&#x00A7;x <!-- U+00A7: SECTION SIGN -->
+ <tr>
+ <td>&#x00A8;x <!-- U+00A8: DIAERESIS -->
+ <td>&#x00A9;x <!-- U+00A9: COPYRIGHT SIGN -->
+ <td>&#x00AA;x <!-- U+00AA: FEMININE ORDINAL INDICATOR -->
+ <td>&#x00AB;x <!-- U+00AB: LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -->
+ <td>&#x00AC;x <!-- U+00AC: NOT SIGN -->
+ <td>&#x00AD;x <!-- U+00AD: SOFT HYPHEN -->
+ <td>&#x00AE;x <!-- U+00AE: REGISTERED SIGN -->
+ <td>&#x00AF;x <!-- U+00AF: MACRON -->
+ <td>&#x00B0;x <!-- U+00B0: DEGREE SIGN -->
+ <td>&#x00B1;x <!-- U+00B1: PLUS-MINUS SIGN -->
+ <td>&#x00B2;x <!-- U+00B2: SUPERSCRIPT TWO -->
+ <td>&#x00B3;x <!-- U+00B3: SUPERSCRIPT THREE -->
+ <td>&#x00B4;x <!-- U+00B4: ACUTE ACCENT -->
+ <td>&#x00B5;x <!-- U+00B5: MICRO SIGN -->
+ <td>&#x00B6;x <!-- U+00B6: PILCROW SIGN -->
+ <td>&#x00B7;x <!-- U+00B7: MIDDLE DOT -->
+ <td>&#x00B8;x <!-- U+00B8: CEDILLA -->
+ <tr>
+ <td>&#x00B9;x <!-- U+00B9: SUPERSCRIPT ONE -->
+ <td>&#x00BA;x <!-- U+00BA: MASCULINE ORDINAL INDICATOR -->
+ <td>&#x00BB;x <!-- U+00BB: RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -->
+ <td>&#x00BC;x <!-- U+00BC: VULGAR FRACTION ONE QUARTER -->
+ <td>&#x00BD;x <!-- U+00BD: VULGAR FRACTION ONE HALF -->
+ <td>&#x00BE;x <!-- U+00BE: VULGAR FRACTION THREE QUARTERS -->
+ <td>&#x00BF;x <!-- U+00BF: INVERTED QUESTION MARK -->
+ <td>&#x00C0;x <!-- U+00C0: LATIN CAPITAL LETTER A WITH GRAVE -->
+ <td>&#x00C1;x <!-- U+00C1: LATIN CAPITAL LETTER A WITH ACUTE -->
+ <td>&#x00C2;x <!-- U+00C2: LATIN CAPITAL LETTER A WITH CIRCUMFLEX -->
+ <td>&#x00C3;x <!-- U+00C3: LATIN CAPITAL LETTER A WITH TILDE -->
+ <td>&#x00C4;x <!-- U+00C4: LATIN CAPITAL LETTER A WITH DIAERESIS -->
+ <td>&#x00C5;x <!-- U+00C5: LATIN CAPITAL LETTER A WITH RING ABOVE -->
+ <td>&#x00C6;x <!-- U+00C6: LATIN CAPITAL LETTER AE -->
+ <td>&#x00C7;x <!-- U+00C7: LATIN CAPITAL LETTER C WITH CEDILLA -->
+ <td>&#x00C8;x <!-- U+00C8: LATIN CAPITAL LETTER E WITH GRAVE -->
+ <td>&#x00C9;x <!-- U+00C9: LATIN CAPITAL LETTER E WITH ACUTE -->
+ <tr>
+ <td>&#x00CA;x <!-- U+00CA: LATIN CAPITAL LETTER E WITH CIRCUMFLEX -->
+ <td>&#x00CB;x <!-- U+00CB: LATIN CAPITAL LETTER E WITH DIAERESIS -->
+ <td>&#x00CC;x <!-- U+00CC: LATIN CAPITAL LETTER I WITH GRAVE -->
+ <td>&#x00CD;x <!-- U+00CD: LATIN CAPITAL LETTER I WITH ACUTE -->
+ <td>&#x00CE;x <!-- U+00CE: LATIN CAPITAL LETTER I WITH CIRCUMFLEX -->
+ <td>&#x00CF;x <!-- U+00CF: LATIN CAPITAL LETTER I WITH DIAERESIS -->
+ <td>&#x00D0;x <!-- U+00D0: LATIN CAPITAL LETTER ETH -->
+ <td>&#x00D1;x <!-- U+00D1: LATIN CAPITAL LETTER N WITH TILDE -->
+ <td>&#x00D2;x <!-- U+00D2: LATIN CAPITAL LETTER O WITH GRAVE -->
+ <td>&#x00D3;x <!-- U+00D3: LATIN CAPITAL LETTER O WITH ACUTE -->
+ <td>&#x00D4;x <!-- U+00D4: LATIN CAPITAL LETTER O WITH CIRCUMFLEX -->
+ <td>&#x00D5;x <!-- U+00D5: LATIN CAPITAL LETTER O WITH TILDE -->
+ <td>&#x00D6;x <!-- U+00D6: LATIN CAPITAL LETTER O WITH DIAERESIS -->
+ <td>&#x00D7;x <!-- U+00D7: MULTIPLICATION SIGN -->
+ <td>&#x00D8;x <!-- U+00D8: LATIN CAPITAL LETTER O WITH STROKE -->
+ <td>&#x00D9;x <!-- U+00D9: LATIN CAPITAL LETTER U WITH GRAVE -->
+ <td>&#x00DA;x <!-- U+00DA: LATIN CAPITAL LETTER U WITH ACUTE -->
+ <tr>
+ <td>&#x00DB;x <!-- U+00DB: LATIN CAPITAL LETTER U WITH CIRCUMFLEX -->
+ <td>&#x00DC;x <!-- U+00DC: LATIN CAPITAL LETTER U WITH DIAERESIS -->
+ <td>&#x00DD;x <!-- U+00DD: LATIN CAPITAL LETTER Y WITH ACUTE -->
+ <td>&#x00DE;x <!-- U+00DE: LATIN CAPITAL LETTER THORN -->
+ <td>&#x00DF;x <!-- U+00DF: LATIN SMALL LETTER SHARP S -->
+ <td>&#x00E0;x <!-- U+00E0: LATIN SMALL LETTER A WITH GRAVE -->
+ <td>&#x00E1;x <!-- U+00E1: LATIN SMALL LETTER A WITH ACUTE -->
+ <td>&#x00E2;x <!-- U+00E2: LATIN SMALL LETTER A WITH CIRCUMFLEX -->
+ <td>&#x00E3;x <!-- U+00E3: LATIN SMALL LETTER A WITH TILDE -->
+ <td>&#x00E4;x <!-- U+00E4: LATIN SMALL LETTER A WITH DIAERESIS -->
+ <td>&#x00E5;x <!-- U+00E5: LATIN SMALL LETTER A WITH RING ABOVE -->
+ <td>&#x00E6;x <!-- U+00E6: LATIN SMALL LETTER AE -->
+ <td>&#x00E7;x <!-- U+00E7: LATIN SMALL LETTER C WITH CEDILLA -->
+ <td>&#x00E8;x <!-- U+00E8: LATIN SMALL LETTER E WITH GRAVE -->
+ <td>&#x00E9;x <!-- U+00E9: LATIN SMALL LETTER E WITH ACUTE -->
+ <td>&#x00EA;x <!-- U+00EA: LATIN SMALL LETTER E WITH CIRCUMFLEX -->
+ <td>&#x00EB;x <!-- U+00EB: LATIN SMALL LETTER E WITH DIAERESIS -->
+ <tr>
+ <td>&#x00EC;x <!-- U+00EC: LATIN SMALL LETTER I WITH GRAVE -->
+ <td>&#x00ED;x <!-- U+00ED: LATIN SMALL LETTER I WITH ACUTE -->
+ <td>&#x00EE;x <!-- U+00EE: LATIN SMALL LETTER I WITH CIRCUMFLEX -->
+ <td>&#x00EF;x <!-- U+00EF: LATIN SMALL LETTER I WITH DIAERESIS -->
+ <td>&#x00F0;x <!-- U+00F0: LATIN SMALL LETTER ETH -->
+ <td>&#x00F1;x <!-- U+00F1: LATIN SMALL LETTER N WITH TILDE -->
+ <td>&#x00F2;x <!-- U+00F2: LATIN SMALL LETTER O WITH GRAVE -->
+ <td>&#x00F3;x <!-- U+00F3: LATIN SMALL LETTER O WITH ACUTE -->
+ <td>&#x00F4;x <!-- U+00F4: LATIN SMALL LETTER O WITH CIRCUMFLEX -->
+ <td>&#x00F5;x <!-- U+00F5: LATIN SMALL LETTER O WITH TILDE -->
+ <td>&#x00F6;x <!-- U+00F6: LATIN SMALL LETTER O WITH DIAERESIS -->
+ <td>&#x00F7;x <!-- U+00F7: DIVISION SIGN -->
+ <td>&#x00F8;x <!-- U+00F8: LATIN SMALL LETTER O WITH STROKE -->
+ <td>&#x00F9;x <!-- U+00F9: LATIN SMALL LETTER U WITH GRAVE -->
+ <td>&#x00FA;x <!-- U+00FA: LATIN SMALL LETTER U WITH ACUTE -->
+ <td>&#x00FB;x <!-- U+00FB: LATIN SMALL LETTER U WITH CIRCUMFLEX -->
+ <td>&#x00FC;x <!-- U+00FC: LATIN SMALL LETTER U WITH DIAERESIS -->
+ <tr>
+ <td>&#x00FD;x <!-- U+00FD: LATIN SMALL LETTER Y WITH ACUTE -->
+ <td>&#x00FE;x <!-- U+00FE: LATIN SMALL LETTER THORN -->
+ <td>&#x00FF;x <!-- U+00FF: LATIN SMALL LETTER Y WITH DIAERESIS -->
+ <td>&#x0131;x <!-- U+0131: LATIN SMALL LETTER DOTLESS I -->
+ <td>&#x0152;x <!-- U+0152: LATIN CAPITAL LIGATURE OE -->
+ <td>&#x0153;x <!-- U+0153: LATIN SMALL LIGATURE OE -->
+ <td>&#x0178;x <!-- U+0178: LATIN CAPITAL LETTER Y WITH DIAERESIS -->
+ <td>&#x0192;x <!-- U+0192: LATIN SMALL LETTER F WITH HOOK -->
+ <td>&#x02C6;x <!-- U+02C6: MODIFIER LETTER CIRCUMFLEX ACCENT -->
+ <td>&#x02C7;x <!-- U+02C7: CARON -->
+ <td>&#x02C9;x <!-- U+02C9: MODIFIER LETTER MACRON -->
+ <td>&#x02D8;x <!-- U+02D8: BREVE -->
+ <td>&#x02D9;x <!-- U+02D9: DOT ABOVE -->
+ <td>&#x02DA;x <!-- U+02DA: RING ABOVE -->
+ <td>&#x02DB;x <!-- U+02DB: OGONEK -->
+ <td>&#x02DC;x <!-- U+02DC: SMALL TILDE -->
+ <td>&#x02DD;x <!-- U+02DD: DOUBLE ACUTE ACCENT -->
+ <tr>
+ <td>&#x0394;x <!-- U+0394: GREEK CAPITAL LETTER DELTA -->
+ <td>&#x03A5;x <!-- U+03A5: GREEK CAPITAL LETTER UPSILON -->
+ <td>&#x03A7;x <!-- U+03A7: GREEK CAPITAL LETTER CHI -->
+ <td>&#x03A9;x <!-- U+03A9: GREEK CAPITAL LETTER OMEGA -->
+ <td>&#x03BC;x <!-- U+03BC: GREEK SMALL LETTER MU -->
+ <td>&#x03C0;x <!-- U+03C0: GREEK SMALL LETTER PI -->
+ <td>&#x2002;x <!-- U+2002: EN SPACE -->
+ <td>&#x2003;x <!-- U+2003: EM SPACE -->
+ <td>&#x2004;x <!-- U+2004: THREE-PER-EM SPACE -->
+ <td>&#x2005;x <!-- U+2005: FOUR-PER-EM SPACE -->
+ <td>&#x2006;x <!-- U+2006: SIX-PER-EM SPACE -->
+ <td>&#x2009;x <!-- U+2009: THIN SPACE -->
+ <td>&#x200A;x <!-- U+200A: HAIR SPACE -->
+ <td>&#x200B;x <!-- U+200B: ZERO WIDTH SPACE -->
+ <td>&#x200C;x <!-- U+200C: ZERO WIDTH NON-JOINER -->
+ <td>&#x200D;x <!-- U+200D: ZERO WIDTH JOINER -->
+ <td>&#x2010;x <!-- U+2010: HYPHEN -->
+ <tr>
+ <td>&#x2013;x <!-- U+2013: EN DASH -->
+ <td>&#x2014;x <!-- U+2014: EM DASH -->
+ <td>&#x2018;x <!-- U+2018: LEFT SINGLE QUOTATION MARK -->
+ <td>&#x2019;x <!-- U+2019: RIGHT SINGLE QUOTATION MARK -->
+ <td>&#x201A;x <!-- U+201A: SINGLE LOW-9 QUOTATION MARK -->
+ <td>&#x201C;x <!-- U+201C: LEFT DOUBLE QUOTATION MARK -->
+ <td>&#x201D;x <!-- U+201D: RIGHT DOUBLE QUOTATION MARK -->
+ <td>&#x201E;x <!-- U+201E: DOUBLE LOW-9 QUOTATION MARK -->
+ <td>&#x2020;x <!-- U+2020: DAGGER -->
+ <td>&#x2021;x <!-- U+2021: DOUBLE DAGGER -->
+ <td>&#x2022;x <!-- U+2022: BULLET -->
+ <td>&#x2026;x <!-- U+2026: HORIZONTAL ELLIPSIS -->
+ <td>&#x2030;x <!-- U+2030: PER MILLE SIGN -->
+ <td>&#x2039;x <!-- U+2039: SINGLE LEFT-POINTING ANGLE QUOTATION MARK -->
+ <td>&#x203A;x <!-- U+203A: SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -->
+ <td>&#x2044;x <!-- U+2044: FRACTION SLASH -->
+ <td>&#x2122;x <!-- U+2122: TRADE MARK SIGN -->
+ <tr>
+ <td>&#x2126;x <!-- U+2126: OHM SIGN -->
+ <td>&#x2202;x <!-- U+2202: PARTIAL DIFFERENTIAL -->
+ <td>&#x2206;x <!-- U+2206: INCREMENT -->
+ <td>&#x220F;x <!-- U+220F: N-ARY PRODUCT -->
+ <td>&#x2211;x <!-- U+2211: N-ARY SUMMATION -->
+ <td>&#x2212;x <!-- U+2212: MINUS SIGN -->
+ <td>&#x2219;x <!-- U+2219: BULLET OPERATOR -->
+ <td>&#x221A;x <!-- U+221A: SQUARE ROOT -->
+ <td>&#x221E;x <!-- U+221E: INFINITY -->
+ <td>&#x222B;x <!-- U+222B: INTEGRAL -->
+ <td>&#x2248;x <!-- U+2248: ALMOST EQUAL TO -->
+ <td>&#x2260;x <!-- U+2260: NOT EQUAL TO -->
+ <td>&#x2264;x <!-- U+2264: LESS-THAN OR EQUAL TO -->
+ <td>&#x2265;x <!-- U+2265: GREATER-THAN OR EQUAL TO -->
+ <td>&#x22F2;x <!-- U+22F2: ELEMENT OF WITH LONG HORIZONTAL STROKE -->
+ <td>&#x25CA;x <!-- U+25CA: LOZENGE -->
+ <td>&#x3000;x <!-- U+3000: IDEOGRAPHIC SPACE -->
+ <tr>
+ <td>&#x3007;x <!-- U+3007: IDEOGRAPHIC NUMBER ZERO -->
+ <td>&#x4E00;x <!-- U+4E00: CJK UNIFIED IDEOGRAPH-4E00 -->
+ <td>&#x4E03;x <!-- U+4E03: CJK UNIFIED IDEOGRAPH-4E03 -->
+ <td>&#x4E09;x <!-- U+4E09: CJK UNIFIED IDEOGRAPH-4E09 -->
+ <td>&#x4E5D;x <!-- U+4E5D: CJK UNIFIED IDEOGRAPH-4E5D -->
+ <td>&#x4E8C;x <!-- U+4E8C: CJK UNIFIED IDEOGRAPH-4E8C -->
+ <td>&#x4E94;x <!-- U+4E94: CJK UNIFIED IDEOGRAPH-4E94 -->
+ <td>&#x516B;x <!-- U+516B: CJK UNIFIED IDEOGRAPH-516B -->
+ <td>&#x516D;x <!-- U+516D: CJK UNIFIED IDEOGRAPH-516D -->
+ <td>&#x5341;x <!-- U+5341: CJK UNIFIED IDEOGRAPH-5341 -->
+ <td>&#x56D7;x <!-- U+56D7: CJK UNIFIED IDEOGRAPH-56D7 -->
+ <td>&#x56DB;x <!-- U+56DB: CJK UNIFIED IDEOGRAPH-56DB -->
+ <td>&#x571F;x <!-- U+571F: CJK UNIFIED IDEOGRAPH-571F -->
+ <td>&#x6728;x <!-- U+6728: CJK UNIFIED IDEOGRAPH-6728 -->
+ <td>&#x6A2A;x <!-- U+6A2A: CJK UNIFIED IDEOGRAPH-6A2A -->
+ <td>&#x6C34;x <!-- U+6C34: CJK UNIFIED IDEOGRAPH-6C34 -->
+ <td>&#x706B;x <!-- U+706B: CJK UNIFIED IDEOGRAPH-706B -->
+ <tr>
+ <td>&#x7EB5;x <!-- U+7EB5: CJK UNIFIED IDEOGRAPH-7EB5 -->
+ <td>&#x91D1;x <!-- U+91D1: CJK UNIFIED IDEOGRAPH-91D1 -->
+ <td>&#xF000;x <!-- U+F000 -->
+ <td>&#xF001;x <!-- U+F001 -->
+ <td>&#xF002;x <!-- U+F002 -->
+ <td>&#xFEFF;x <!-- U+FEFF: ZERO WIDTH NO-BREAK SPACE -->
+</table>
diff --git a/tests/wpt/web-platform-tests/assumptions/canvas-background-ref.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/canvas-background-ref.html
index b117f6b3003..b117f6b3003 100644
--- a/tests/wpt/web-platform-tests/assumptions/canvas-background-ref.html
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/canvas-background-ref.html
diff --git a/tests/wpt/web-platform-tests/assumptions/canvas-background.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/canvas-background.html
index 962edf5e8b4..962edf5e8b4 100644
--- a/tests/wpt/web-platform-tests/assumptions/canvas-background.html
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/canvas-background.html
diff --git a/tests/wpt/web-platform-tests/assumptions/html-elements.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/html-elements.html
index 6be17b1aba2..6be17b1aba2 100644
--- a/tests/wpt/web-platform-tests/assumptions/html-elements.html
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/html-elements.html
diff --git a/tests/wpt/web-platform-tests/assumptions/initial-color-ref.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/initial-color-ref.html
index 46dd110bd3e..46dd110bd3e 100644
--- a/tests/wpt/web-platform-tests/assumptions/initial-color-ref.html
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/initial-color-ref.html
diff --git a/tests/wpt/web-platform-tests/assumptions/initial-color.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/initial-color.html
index f1033c7d7e7..f1033c7d7e7 100644
--- a/tests/wpt/web-platform-tests/assumptions/initial-color.html
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/initial-color.html
diff --git a/tests/wpt/web-platform-tests/assumptions/medium-font-size-ref.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/medium-font-size-ref.html
index c1600ec419a..c1600ec419a 100644
--- a/tests/wpt/web-platform-tests/assumptions/medium-font-size-ref.html
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/medium-font-size-ref.html
diff --git a/tests/wpt/web-platform-tests/assumptions/medium-font-size.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/medium-font-size.html
index f4c303d0ba8..f4c303d0ba8 100644
--- a/tests/wpt/web-platform-tests/assumptions/medium-font-size.html
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/medium-font-size.html
diff --git a/tests/wpt/web-platform-tests/assumptions/min-font-size-ref.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/min-font-size-ref.html
index 013970bedf3..013970bedf3 100644
--- a/tests/wpt/web-platform-tests/assumptions/min-font-size-ref.html
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/min-font-size-ref.html
diff --git a/tests/wpt/web-platform-tests/assumptions/min-font-size.html b/tests/wpt/web-platform-tests/infrastructure/assumptions/min-font-size.html
index a4b9a1cd36f..a4b9a1cd36f 100644
--- a/tests/wpt/web-platform-tests/assumptions/min-font-size.html
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/min-font-size.html
diff --git a/tests/wpt/web-platform-tests/infrastructure/assumptions/tools/ahem-generate-table.py b/tests/wpt/web-platform-tests/infrastructure/assumptions/tools/ahem-generate-table.py
new file mode 100644
index 00000000000..d9fb1fbc32d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/tools/ahem-generate-table.py
@@ -0,0 +1,102 @@
+from __future__ import print_function, unicode_literals
+
+import itertools
+import unicodedata
+
+from fontTools.ttLib import TTFont
+
+try:
+ chr(0x100)
+except ValueError:
+ chr = unichr
+
+def grouper(n, iterable):
+ """
+ >>> list(grouper(3, 'ABCDEFG'))
+ [['A', 'B', 'C'], ['D', 'E', 'F'], ['G']]
+ """
+ iterable = iter(iterable)
+ return iter(lambda: list(itertools.islice(iterable, n)), [])
+
+ttf = TTFont("../../../fonts/Ahem.ttf")
+
+chars = {char for table in ttf['cmap'].tables for char in table.cmap.keys()}
+
+# exclude chars that can't be represented as HTML numeric character refs
+chars = chars - (set(range(0x80, 0x9F+1)) | {0x00})
+
+chars_sorted = sorted(chars)
+
+per_row = 17
+
+
+def build_header(is_test):
+ rv = []
+
+ rv.append("""
+<!doctype html>
+<title>Ahem checker</title>""")
+
+ if is_test:
+ rv.append("""
+<link rel="match" href="ahem-ref.html">""")
+
+ rv.append("""
+<style>""")
+
+ if not is_test:
+ rv.append("""
+@font-face {
+ font-family: Ahem;
+ src: url("../../fonts/Ahem.ttf");
+}""")
+
+ rv.append("""
+* {
+ padding: 0;
+ margin: 0;
+ border: none;
+}
+
+table {
+ font: 15px/1 Ahem;
+ border-collapse: separate;
+ border-spacing: 1px;
+ table-layout: fixed;
+}
+
+td {
+ width: 34px;
+}
+</style>
+""")
+
+ return "".join(rv)
+
+
+def build_table():
+ rv = []
+
+ rv.append("<table>\n")
+ for row in grouper(per_row, chars_sorted):
+ rv.append(" " * 4 + "<tr>\n")
+ for codepoint in row:
+ assert codepoint <= 0xFFFF
+ try:
+ name = unicodedata.name(chr(codepoint))
+ except ValueError:
+ rv.append(" " * 8 + "<td>&#x%04X;x <!-- U+%04X -->\n" % (codepoint, codepoint))
+ else:
+ rv.append(" " * 8 + "<td>&#x%04X;x <!-- U+%04X: %s -->\n" % (codepoint, codepoint, name))
+ rv.append("</table>\n")
+
+ return "".join(rv)
+
+
+with open("../ahem.html", "w") as f1:
+ f1.write(build_header(True))
+ f1.write(build_table())
+
+with open("../ahem-ref.html", "w") as f1:
+ f1.write(build_header(False))
+ f1.write(build_table())
diff --git a/tests/wpt/web-platform-tests/assumptions/tools/build.sh b/tests/wpt/web-platform-tests/infrastructure/assumptions/tools/build.sh
index d40f63a7374..d40f63a7374 100755
--- a/tests/wpt/web-platform-tests/assumptions/tools/build.sh
+++ b/tests/wpt/web-platform-tests/infrastructure/assumptions/tools/build.sh
diff --git a/tests/wpt/web-platform-tests/infrastructure/failing-test.html b/tests/wpt/web-platform-tests/infrastructure/expected-fail/failing-test.html
index 249099c06f6..249099c06f6 100644
--- a/tests/wpt/web-platform-tests/infrastructure/failing-test.html
+++ b/tests/wpt/web-platform-tests/infrastructure/expected-fail/failing-test.html
diff --git a/tests/wpt/web-platform-tests/innerText/getter-tests.js b/tests/wpt/web-platform-tests/innerText/getter-tests.js
index 7882be4dcf1..6df8912dc93 100644
--- a/tests/wpt/web-platform-tests/innerText/getter-tests.js
+++ b/tests/wpt/web-platform-tests/innerText/getter-tests.js
@@ -197,6 +197,13 @@ testText("<div style='visibility:hidden'><p><span style='visibility:visible'>abc
testText("<div>abc<div style='margin:2em'>def", "abc\ndef", "No blank lines around <div> with margin");
testText("<div>123<span style='display:inline-block'>abc</span>def", "123abcdef", "No newlines at display:inline-block boundary");
testText("<div>123<span style='display:inline-block'> abc </span>def", "123abcdef", "Leading/trailing space removal at display:inline-block boundary");
+testText("<div>123<p style='margin:0px'>abc</p>def", "123\n\nabc\n\ndef", "Blank lines around <p> even without margin");
+testText("<div>123<h1>abc</h1>def", "123\nabc\ndef", "No blank lines around <h1>");
+testText("<div>123<h2>abc</h2>def", "123\nabc\ndef", "No blank lines around <h2>");
+testText("<div>123<h3>abc</h3>def", "123\nabc\ndef", "No blank lines around <h3>");
+testText("<div>123<h4>abc</h4>def", "123\nabc\ndef", "No blank lines around <h4>");
+testText("<div>123<h5>abc</h5>def", "123\nabc\ndef", "No blank lines around <h5>");
+testText("<div>123<h6>abc</h6>def", "123\nabc\ndef", "No blank lines around <h6>");
/**** Spans ****/
diff --git a/tests/wpt/web-platform-tests/input-events/input-events-cut-paste-manual.html b/tests/wpt/web-platform-tests/input-events/input-events-cut-paste-manual.html
new file mode 100644
index 00000000000..4091c87cdd3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/input-events/input-events-cut-paste-manual.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Cut and Paste should trigger corresponding InputEvent</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<p>To manually run this test, please follow the steps below:<br/>
+1. Select 'plain' => Cut (e.g. Ctrl/Cmd-X) => Paste (e.g. Ctrl/Cmd-V).<br/>
+2. Select 'rich' => Cut => Paste.<br/>
+3. Select 'prevent' => Paste.<br/>
+4. Select 'prevent' => Cut => Select 'normal' => Paste.<br/>
+<br/>
+If a "PASS" result appears the test passes, otherwise it fails</p>
+<textarea id="test1_plain">plain</textarea>
+<p id="test2_editable" contenteditable><b>rich</b></p>
+<p id="test3_editable_prevent" contenteditable>prevent</p>
+<p id="test3_editable_normal" contenteditable>normal</p>
+<script>
+async_test(t => {
+ const expectedEventLog = [
+ 'cut-[null]', 'beforeinput-deleteByCut', 'input-deleteByCut',
+ 'paste-[null]', 'beforeinput-insertFromPaste', 'input-insertFromPaste'];
+ const actualEventLog = [];
+
+ for (let eventType of ['beforeinput', 'input', 'cut', 'paste']) {
+ document.getElementById('test1_plain').addEventListener(eventType, t.step_func(event => {
+ if (event.type === 'beforeinput' && event.inputType === 'insertFromPaste') {
+ assert_equals(event.data, 'plain');
+ assert_equals(event.dataTransfer, null);
+ }
+
+ actualEventLog.push(`${event.type}-${event.inputType || '[null]'}`);
+ if (actualEventLog.length === expectedEventLog.length) {
+ assert_array_equals(actualEventLog, expectedEventLog,
+ `Expected: ${expectedEventLog}; Actual: ${actualEventLog}.`);
+ t.done();
+ }
+ }));
+ }
+}, 'Event order and data on textarea.');
+
+async_test(t => {
+ const expectedEventLog = [
+ 'cut-[null]', 'beforeinput-deleteByCut', 'input-deleteByCut',
+ 'paste-[null]', 'beforeinput-insertFromPaste', 'input-insertFromPaste'];
+ const actualEventLog = [];
+
+ for (let eventType of ['beforeinput', 'input', 'cut', 'paste']) {
+ document.getElementById('test2_editable').addEventListener(eventType, t.step_func(event => {
+ if (event.type === 'beforeinput' && event.inputType === 'insertFromPaste') {
+ assert_equals(event.data, null);
+ assert_equals(event.dataTransfer.getData('text/plain'), 'rich');
+ assert_regexp_match(event.dataTransfer.getData('text/html'), /<b.*>rich<\/b>$/);
+ }
+
+ actualEventLog.push(`${event.type}-${event.inputType || '[null]'}`);
+ if (actualEventLog.length === expectedEventLog.length) {
+ assert_array_equals(actualEventLog, expectedEventLog,
+ `Expected: ${expectedEventLog}; Actual: ${actualEventLog}.`);
+ t.done();
+ }
+ }));
+ }
+}, 'Event order and dataTransfer on contenteditable.');
+
+async_test(t => {
+ const prevent = document.getElementById('test3_editable_prevent');
+ const normal = document.getElementById('test3_editable_normal');
+ prevent.addEventListener('beforeinput', t.step_func(event => {
+ if (event.inputType === 'deleteByCut' ||
+ event.inputType === 'insertFromPaste') {
+ event.preventDefault();
+ }
+ }));
+
+ normal.addEventListener('input', t.step_func(event => {
+ if (event.inputType === 'insertFromPaste') {
+ assert_equals(prevent.textContent, 'prevent');
+ assert_equals(normal.textContent, 'prevent');
+ t.done();
+ }
+ }));
+}, 'preventDefault() should prevent DOM modification but allow clipboard updates.');
+</script>
diff --git a/tests/wpt/web-platform-tests/input-events/input-events-exec-command.html b/tests/wpt/web-platform-tests/input-events/input-events-exec-command.html
new file mode 100644
index 00000000000..6c512023296
--- /dev/null
+++ b/tests/wpt/web-platform-tests/input-events/input-events-exec-command.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>execCommand() should only trigger 'input'</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<p id="txt" contenteditable></p>
+<script>
+test(function() {
+ let lastBeforeInputType = '';
+ let lastInputType = '';
+ const txt = document.getElementById('txt');
+ txt.addEventListener('beforeinput', function(event) {
+ assert_true(event instanceof InputEvent);
+ assert_false(event.isComposing);
+ lastBeforeInputType = event.inputType;
+ });
+ txt.addEventListener('input', function(event) {
+ assert_true(event instanceof InputEvent);
+ assert_false(event.isComposing);
+ lastInputType = event.inputType;
+ });
+
+ const NO_INPUT_EVENT_FIRED = 'NO_INPUT_EVENT_FIRED';
+ function testExecCommandInputType(command, args, inputType) {
+ lastBeforeInputType = NO_INPUT_EVENT_FIRED;
+ lastInputType = NO_INPUT_EVENT_FIRED;
+ document.execCommand(command, false, args);
+ assert_equals(lastBeforeInputType, NO_INPUT_EVENT_FIRED, `execCommand(${command}, false, ${args}) shouldn't fire beforeinput`);
+ assert_equals(lastInputType, inputType, `execCommand(${command}, false, ${args}) should produce inputType: ${inputType}`);
+ }
+
+ txt.focus();
+ // InsertText
+ testExecCommandInputType('insertText', 'a', 'insertText');
+ testExecCommandInputType('insertText', 'bc', 'insertText');
+ assert_equals(txt.innerHTML, 'abc');
+ testExecCommandInputType('insertOrderedList', null, 'insertOrderedList');
+ assert_equals(txt.innerHTML, '<ol><li>abc<br></li></ol>');
+ testExecCommandInputType('insertUnorderedList', null, 'insertUnorderedList');
+ assert_equals(txt.innerHTML, '<ul><li>abc<br></li></ul>');
+ testExecCommandInputType('insertLineBreak', null, 'insertLineBreak');
+ testExecCommandInputType('insertParagraph', null, 'insertParagraph');
+
+ // Styling
+ txt.innerHTML = 'abc';
+ var selection = window.getSelection();
+ selection.collapse(txt, 0);
+ selection.extend(txt, 1);
+ testExecCommandInputType('bold', null, 'formatBold');
+ assert_equals(txt.innerHTML, '<b>abc</b>');
+ testExecCommandInputType('italic', null, 'formatItalic');
+ assert_equals(txt.innerHTML, '<b><i>abc</i></b>');
+ testExecCommandInputType('underline', null, 'formatUnderline');
+ assert_equals(txt.innerHTML, '<b><i><u>abc</u></i></b>');
+ testExecCommandInputType('strikeThrough', null, 'formatStrikeThrough');
+ assert_equals(txt.innerHTML, '<b><i><u><strike>abc</strike></u></i></b>');
+ testExecCommandInputType('superscript', null, 'formatSuperscript');
+ assert_equals(txt.innerHTML, '<b><i><u><strike><sup>abc</sup></strike></u></i></b>');
+ testExecCommandInputType('subscript', null, 'formatSubscript');
+ assert_equals(txt.innerHTML, '<b><i><u><strike><sub>abc</sub></strike></u></i></b>');
+
+ // Formating
+ txt.innerHTML = 'abc';
+ testExecCommandInputType('justifyCenter', null, 'formatJustifyCenter');
+ assert_equals(txt.innerHTML, '<div style="text-align: center;">abc</div>');
+ testExecCommandInputType('justifyFull', null, 'formatJustifyFull');
+ assert_equals(txt.innerHTML, '<div style="text-align: justify;">abc</div>');
+ testExecCommandInputType('justifyRight', null, 'formatJustifyRight');
+ assert_equals(txt.innerHTML, '<div style="text-align: right;">abc</div>');
+ testExecCommandInputType('justifyLeft', null, 'formatJustifyLeft');
+ assert_equals(txt.innerHTML, '<div style="text-align: left;">abc</div>');
+ selection.collapse(txt, 0);
+ selection.extend(txt, 1);
+ testExecCommandInputType('removeFormat', null, 'formatRemove');
+ assert_equals(txt.innerHTML, '<div style="">abc</div>');
+ testExecCommandInputType('indent', null, 'formatIndent');
+ testExecCommandInputType('outdent', null, 'formatOutdent');
+ assert_equals(txt.innerHTML, '<div style="">abc</div>');
+
+ // Copy shouldn't fire 'input'.
+ testExecCommandInputType('copy', null, NO_INPUT_EVENT_FIRED);
+ // Cut/Paste should fire 'input'.
+ testExecCommandInputType('cut', null, 'deleteByCut');
+ testExecCommandInputType('paste', null, 'insertFromPaste');
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/input-events/input-events-get-target-ranges-manual.html b/tests/wpt/web-platform-tests/input-events/input-events-get-target-ranges-manual.html
new file mode 100644
index 00000000000..7e6a59769d0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/input-events/input-events-get-target-ranges-manual.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>InputEvent.getTargetRanges() behavior</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<p>To manually run this test, please follow the steps below:<br/>
+1. Place caret at the end of 'hel<i>lo wo</i><b>rld</b>'.<br/>
+2. Press Ctrl-Backspace (Alt-Backspace on macOS) to delete word backwards.<br/>
+3. Place caret at the end of 'test2' => Press 'a' key.<br/>
+4. Select 'test2a' => Press 'b' key.<br/>
+5. Select 'b' => Bold text through context menu or Command-b on macOS.<br/>
+6. Place caret at the end of 'test3' => Press 'a' key => Press Backspace key.<br/>
+<br/>
+If a "PASS" result appears the test passes, otherwise it fails</p>
+<p id="test1_editable" contenteditable>hel<i>lo wo</i><b>rld</b></p>
+<p id="test2_editable" contenteditable>test2</p>
+<textarea id="test3_plain">test3</textarea>
+<script>
+async_test(t => {
+ const test1_editable = document.getElementById('test1_editable');
+ let lastBeforeInput;
+ test1_editable.addEventListener('beforeinput', t.step_func(event => {
+ assert_equals(event.inputType, 'deleteWordBackward');
+ const ranges = event.getTargetRanges();
+ assert_equals(ranges.length, 1);
+ const range = ranges[0];
+ assert_true(range instanceof StaticRange);
+ assert_equals(range.startOffset, 3);
+ assert_equals(range.startContainer.textContent, 'lo wo');
+ assert_equals(range.endOffset, 3);
+ assert_equals(range.endContainer.textContent, 'rld');
+ assert_equals(test1_editable.innerHTML, 'hel<i>lo wo</i><b>rld</b>');
+ lastBeforeInput = event;
+ }));
+
+ test1_editable.addEventListener('input', t.step_func(event => {
+ assert_equals(event.inputType, 'deleteWordBackward');
+ assert_equals(test1_editable.innerHTML, 'hel<i>lo&nbsp;</i>');
+ assert_equals(lastBeforeInput.inputType, 'deleteWordBackward');
+ assert_equals(lastBeforeInput.getTargetRanges().length, 0,
+ 'getTargetRanges() should be empty after the event has finished dispatching.');
+ t.done();
+ }));
+}, 'getTargetRanges() returns correct range and cleared after dispatch.');
+
+async_test(t => {
+ const expectedEventLog = ['test2-5-test2-5', 'test2a-0-test2a-6', 'b-0-b-1'];
+ const actualEventLog = [];
+
+ const test2_editable = document.getElementById('test2_editable');
+ test2_editable.addEventListener('beforeinput', t.step_func(event => {
+ const ranges = event.getTargetRanges();
+ assert_equals(ranges.length, 1);
+ const range = ranges[0];
+ actualEventLog.push(
+ `${range.startContainer.textContent}-${range.startOffset}-${range.endContainer.textContent}-${range.endOffset}`);
+
+ if (actualEventLog.length == expectedEventLog.length) {
+ assert_array_equals(actualEventLog, expectedEventLog,
+ `Expected: ${expectedEventLog}; Actual: ${actualEventLog}.`);
+ t.done();
+ }
+ }));
+}, 'Actions other than deletion should have current selection as target ranges.');
+
+async_test(t => {
+ const test3_plain = document.getElementById('test3_plain');
+ test3_plain.addEventListener('beforeinput', t.step_func(event => {
+ assert_equals(event.getTargetRanges().length, 0,
+ 'getTargetRanges() should return empty array on textarea.');
+
+ if (event.inputType === 'deleteContentBackward')
+ t.done();
+ }));
+}, 'Textarea should have empty target range.');
+</script>
diff --git a/tests/wpt/web-platform-tests/input-events/input-events-typing-data-manual.html b/tests/wpt/web-platform-tests/input-events/input-events-typing-data-manual.html
deleted file mode 100644
index 2b4a80984d8..00000000000
--- a/tests/wpt/web-platform-tests/input-events/input-events-typing-data-manual.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>InputEvent have data when typing on textarea and contenteditable</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<p>To manually run this test, please follow the steps below:<br/>
-1. Focus the first box and press key 'a' and then 'b'.<br/>
-2. Focus the second box and press key 'c' and then 'd'.<br/>
-<br/>
-If a "PASS" result appears the test passes, otherwise it fails</p>
-<textarea id='plain'></textarea>
-<div id='rich' style='border-style: solid;' contenteditable></div>
-<script>
-async_test(t => {
- const expectedResult = [
- 'plain-beforeinput-a',
- 'plain-input-a',
- 'plain-beforeinput-b',
- 'plain-input-b',
- 'rich-beforeinput-c',
- 'rich-input-c',
- 'rich-beforeinput-d',
- 'rich-input-d',
- ];
- let eventCounter = 0;
-
- for (const targetId of ['plain', 'rich']) {
- for (const eventType of ['beforeinput', 'input']) {
- document.getElementById(targetId).addEventListener(eventType, t.step_func(e => {
- assert_equals(`${targetId}-${eventType}-${e.data}`, expectedResult[eventCounter]);
- ++eventCounter;
- if (eventCounter === expectedResult.length)
- t.done();
- }));
- }
- }
-})
-</script>
diff --git a/tests/wpt/web-platform-tests/input-events/input-events-typing-manual.html b/tests/wpt/web-platform-tests/input-events/input-events-typing-manual.html
new file mode 100644
index 00000000000..5f81c33c751
--- /dev/null
+++ b/tests/wpt/web-platform-tests/input-events/input-events-typing-manual.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>InputEvent have correct data/order when typing on textarea and contenteditable</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<p>To manually run this test, please follow the steps below:<br/>
+1. Focus the first box and press key 'a' and then Shift-'b'.<br/>
+2. Focus the second box and press key 'c' and then Shift-'d'.<br/>
+<br/>
+If a "PASS" result appears the test passes, otherwise it fails</p>
+<textarea id='plain'></textarea>
+<div id='rich' style='border-style: solid;' contenteditable><br></div>
+<script>
+async_test(t => {
+ const expectedResult = [
+ // Pressing 'a'.
+ 'plain-keydown-a',
+ 'plain-keypress-a',
+ 'plain-beforeinput-a',
+ 'plain-input-a',
+ 'plain-keyup-a',
+ // Pressing Shift-'b'.
+ 'plain-keydown-B',
+ 'plain-keypress-B',
+ 'plain-beforeinput-B',
+ 'plain-input-B',
+ 'plain-keyup-B',
+ // Pressing 'c'.
+ 'rich-keydown-c',
+ 'rich-keypress-c',
+ 'rich-beforeinput-c',
+ 'rich-input-c',
+ 'rich-keyup-c',
+ // Pressing Shift-'d'.
+ 'rich-keydown-D',
+ 'rich-keypress-D',
+ 'rich-beforeinput-D',
+ 'rich-input-D',
+ 'rich-keyup-D',
+ ];
+ let eventCounter = 0;
+
+ for (const targetId of ['plain', 'rich']) {
+ for (const eventType of ['beforeinput', 'input', 'keydown', 'keypress', 'keyup']) {
+ document.getElementById(targetId).addEventListener(eventType, t.step_func(event => {
+ if (event.key === 'Shift')
+ return;
+ assert_equals(`${targetId}-${event.type}-${event.data || event.key}`, expectedResult[eventCounter]);
+ if (event instanceof InputEvent) {
+ assert_equals(event.dataTransfer, null,
+ 'Plain text editing should have null |dataTransfer| field')
+ }
+ ++eventCounter;
+ if (eventCounter === expectedResult.length)
+ t.done();
+ }));
+ }
+ }
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/interfaces/clipboard.idl b/tests/wpt/web-platform-tests/interfaces/clipboard.idl
new file mode 100644
index 00000000000..ea969ca9d57
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/clipboard.idl
@@ -0,0 +1,13 @@
+[SecureContext]
+interface Clipboard : EventTarget {
+ Promise<DataTransfer> read();
+ Promise<DOMString> readText();
+
+ Promise<void> write(DataTransfer data);
+ Promise<void> writeText(DOMString data);
+};
+
+[SecureContext]
+partial interface Navigator {
+ [SameObject] readonly attribute Clipboard clipboard;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/console.idl b/tests/wpt/web-platform-tests/interfaces/console.idl
new file mode 100644
index 00000000000..7f5da773156
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/console.idl
@@ -0,0 +1,22 @@
+[Exposed=(Window,Worker,Worklet)]
+namespace console {
+ void assert(optional boolean condition = false, any... data);
+ void clear();
+ void count(optional DOMString label = "default");
+ void debug(any... data);
+ void error(any... data);
+ void info(any... data);
+ void log(any... data);
+ void table(any tabularData, optional sequence<DOMString> properties);
+ void trace(any... data);
+ void warn(any... data);
+ void dir(any item, optional object? options);
+ void dirxml(any... data);
+
+ void group(any... data);
+ void groupCollapsed(any... data);
+ void groupEnd();
+
+ void time(optional DOMString label = "default");
+ void timeEnd(optional DOMString label = "default");
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/cssom-view.idl b/tests/wpt/web-platform-tests/interfaces/cssom-view.idl
new file mode 100644
index 00000000000..af779a1cc4a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/cssom-view.idl
@@ -0,0 +1,184 @@
+enum ScrollBehavior { "auto", "instant", "smooth" };
+
+dictionary ScrollOptions {
+ ScrollBehavior behavior = "auto";
+};
+dictionary ScrollToOptions : ScrollOptions {
+ unrestricted double left;
+ unrestricted double top;
+};
+
+partial interface Window {
+ [NewObject] MediaQueryList matchMedia(CSSOMString query);
+ [SameObject, Replaceable] readonly attribute Screen screen;
+
+ // browsing context
+ void moveTo(long x, long y);
+ void moveBy(long x, long y);
+ void resizeTo(long x, long y);
+ void resizeBy(long x, long y);
+
+ // viewport
+ [Replaceable] readonly attribute long innerWidth;
+ [Replaceable] readonly attribute long innerHeight;
+
+ // viewport scrolling
+ [Replaceable] readonly attribute double scrollX;
+ [Replaceable] readonly attribute double pageXOffset;
+ [Replaceable] readonly attribute double scrollY;
+ [Replaceable] readonly attribute double pageYOffset;
+ void scroll(optional ScrollToOptions options);
+ void scroll(unrestricted double x, unrestricted double y);
+ void scrollTo(optional ScrollToOptions options);
+ void scrollTo(unrestricted double x, unrestricted double y);
+ void scrollBy(optional ScrollToOptions options);
+ void scrollBy(unrestricted double x, unrestricted double y);
+
+ // client
+ [Replaceable] readonly attribute long screenX;
+ [Replaceable] readonly attribute long screenY;
+ [Replaceable] readonly attribute long outerWidth;
+ [Replaceable] readonly attribute long outerHeight;
+ [Replaceable] readonly attribute double devicePixelRatio;
+};
+
+[Exposed=Window]
+interface MediaQueryList : EventTarget {
+ readonly attribute CSSOMString media;
+ readonly attribute boolean matches;
+ void addListener(EventListener? listener);
+ void removeListener(EventListener? listener);
+ attribute EventHandler onchange;
+};
+
+[Exposed=Window,
+ Constructor(CSSOMString type, optional MediaQueryListEventInit eventInitDict)]
+interface MediaQueryListEvent : Event {
+ readonly attribute CSSOMString media;
+ readonly attribute boolean matches;
+};
+
+dictionary MediaQueryListEventInit : EventInit {
+ CSSOMString media = "";
+ boolean matches = false;
+};
+
+[Exposed=Window]
+interface Screen {
+ readonly attribute long availWidth;
+ readonly attribute long availHeight;
+ readonly attribute long width;
+ readonly attribute long height;
+ readonly attribute unsigned long colorDepth;
+ readonly attribute unsigned long pixelDepth;
+};
+
+partial interface Document {
+ Element? elementFromPoint(double x, double y);
+ sequence<Element> elementsFromPoint(double x, double y);
+ CaretPosition? caretPositionFromPoint(double x, double y);
+ readonly attribute Element? scrollingElement;
+};
+
+[Exposed=Window]
+interface CaretPosition {
+ readonly attribute Node offsetNode;
+ readonly attribute unsigned long offset;
+ [NewObject] DOMRect? getClientRect();
+};
+
+enum ScrollLogicalPosition { "start", "center", "end", "nearest" };
+dictionary ScrollIntoViewOptions : ScrollOptions {
+ ScrollLogicalPosition block = "center";
+ ScrollLogicalPosition inline = "center";
+};
+
+partial interface Element {
+ DOMRectList getClientRects();
+ [NewObject] DOMRect getBoundingClientRect();
+ void scrollIntoView();
+ void scrollIntoView((boolean or object) arg);
+ void scroll(optional ScrollToOptions options);
+ void scroll(unrestricted double x, unrestricted double y);
+ void scrollTo(optional ScrollToOptions options);
+ void scrollTo(unrestricted double x, unrestricted double y);
+ void scrollBy(optional ScrollToOptions options);
+ void scrollBy(unrestricted double x, unrestricted double y);
+ attribute unrestricted double scrollTop;
+ attribute unrestricted double scrollLeft;
+ readonly attribute long scrollWidth;
+ readonly attribute long scrollHeight;
+ readonly attribute long clientTop;
+ readonly attribute long clientLeft;
+ readonly attribute long clientWidth;
+ readonly attribute long clientHeight;
+};
+
+partial interface HTMLElement {
+ readonly attribute Element? offsetParent;
+ readonly attribute long offsetTop;
+ readonly attribute long offsetLeft;
+ readonly attribute long offsetWidth;
+ readonly attribute long offsetHeight;
+};
+
+partial interface HTMLImageElement {
+ readonly attribute long x;
+ readonly attribute long y;
+};
+
+partial interface Range {
+ DOMRectList getClientRects();
+ [NewObject] DOMRect getBoundingClientRect();
+};
+
+/* TODO This is commented out because: "Partial interface MouseEvent with no original interface"
+partial interface MouseEvent {
+ readonly attribute double screenX;
+ readonly attribute double screenY;
+ readonly attribute double pageX;
+ readonly attribute double pageY;
+ readonly attribute double clientX;
+ readonly attribute double clientY;
+ readonly attribute double x;
+ readonly attribute double y;
+ readonly attribute double offsetX;
+ readonly attribute double offsetY;
+};
+
+partial dictionary MouseEventInit {
+ double screenX = 0.0;
+ double screenY = 0.0;
+ double clientX = 0.0;
+ double clientY = 0.0;
+};
+*/
+
+enum CSSBoxType { "margin", "border", "padding", "content" };
+dictionary BoxQuadOptions {
+ CSSBoxType box = "border";
+ GeometryNode relativeTo; // XXX default document (i.e. viewport)
+};
+
+dictionary ConvertCoordinateOptions {
+ CSSBoxType fromBox = "border";
+ CSSBoxType toBox = "border";
+};
+
+[Exposed=Window,
+ NoInterfaceObject]
+interface GeometryUtils {
+ sequence<DOMQuad> getBoxQuads(optional BoxQuadOptions options);
+ DOMQuad convertQuadFromNode(DOMQuadInit quad, GeometryNode from, optional ConvertCoordinateOptions options);
+ DOMQuad convertRectFromNode(DOMRectReadOnly rect, GeometryNode from, optional ConvertCoordinateOptions options);
+ DOMPoint convertPointFromNode(DOMPointInit point, GeometryNode from, optional ConvertCoordinateOptions options); // XXX z,w turns into 0
+};
+
+Text implements GeometryUtils; // like Range
+Element implements GeometryUtils;
+/* TODO Commented out because: "CSSPseudoElement implements GeometryUtils, but CSSPseudoElement is undefined."
+CSSPseudoElement implements GeometryUtils;
+*/
+Document implements GeometryUtils;
+
+typedef (Text or Element or CSSPseudoElement or Document) GeometryNode;
diff --git a/tests/wpt/web-platform-tests/interfaces/cssom.idl b/tests/wpt/web-platform-tests/interfaces/cssom.idl
index e5a998ebf5d..b372ed6b2b5 100644
--- a/tests/wpt/web-platform-tests/interfaces/cssom.idl
+++ b/tests/wpt/web-platform-tests/interfaces/cssom.idl
@@ -1,294 +1,143 @@
+typedef USVString CSSOMString;
+
+[Exposed=Window,
+ LegacyArrayClass]
interface MediaList {
- stringifier attribute DOMString mediaText;
+ stringifier attribute [TreatNullAs=EmptyString] CSSOMString mediaText;
readonly attribute unsigned long length;
- getter DOMString item(unsigned long index);
- void appendMedium(DOMString medium);
- void deleteMedium(DOMString medium);
+ getter CSSOMString? item(unsigned long index);
+ void appendMedium(CSSOMString medium);
+ void deleteMedium(CSSOMString medium);
};
+[Exposed=Window]
interface StyleSheet {
- readonly attribute DOMString type;
- readonly attribute DOMString href;
- readonly attribute Node ownerNode;
- readonly attribute StyleSheet parentStyleSheet;
- readonly attribute DOMString title;
- [PutForwards=mediaText] readonly attribute MediaList media;
- attribute boolean disabled;
+ readonly attribute CSSOMString type;
+ readonly attribute USVString? href;
+ readonly attribute (Element or ProcessingInstruction)? ownerNode;
+ readonly attribute StyleSheet? parentStyleSheet;
+ readonly attribute DOMString? title;
+ [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
+ attribute boolean disabled;
};
+[Exposed=Window]
interface CSSStyleSheet : StyleSheet {
- readonly attribute CSSRule ownerRule;
- readonly attribute CSSRuleList cssRules;
- unsigned long insertRule(DOMString rule, unsigned long index);
+ readonly attribute CSSRule? ownerRule;
+ [SameObject] readonly attribute CSSRuleList cssRules;
+ unsigned long insertRule(CSSOMString rule, optional unsigned long index = 0);
void deleteRule(unsigned long index);
};
-typedef sequence<StyleSheet> StyleSheetList;
+[Exposed=Window,
+ LegacyArrayClass]
+interface StyleSheetList {
+ getter StyleSheet? item(unsigned long index);
+ readonly attribute unsigned long length;
+};
partial interface Document {
[SameObject] readonly attribute StyleSheetList styleSheets;
};
-[NoInterfaceObject] interface LinkStyle {
- readonly attribute StyleSheet sheet;
+[Exposed=Window,
+ NoInterfaceObject]
+interface LinkStyle {
+ readonly attribute StyleSheet? sheet;
};
ProcessingInstruction implements LinkStyle;
+[Exposed=Window,
+ LegacyArrayClass]
+interface CSSRuleList {
+ getter CSSRule? item(unsigned long index);
+ readonly attribute unsigned long length;
+};
-typedef sequence<CSSRule> CSSRuleList;
-
+[Exposed=Window]
interface CSSRule {
- // Types
const unsigned short STYLE_RULE = 1;
+ const unsigned short CHARSET_RULE = 2; // historical
const unsigned short IMPORT_RULE = 3;
const unsigned short MEDIA_RULE = 4;
const unsigned short FONT_FACE_RULE = 5;
const unsigned short PAGE_RULE = 6;
+ const unsigned short MARGIN_RULE = 9;
const unsigned short NAMESPACE_RULE = 10;
readonly attribute unsigned short type;
-
- // Parsing and serialization
- attribute DOMString cssText;
-
- // Context
- readonly attribute CSSRule parentRule;
- readonly attribute CSSStyleSheet parentStyleSheet;
+ attribute CSSOMString cssText;
+ readonly attribute CSSRule? parentRule;
+ readonly attribute CSSStyleSheet? parentStyleSheet;
};
+[Exposed=Window]
interface CSSStyleRule : CSSRule {
- attribute DOMString selectorText;
- readonly attribute CSSStyleDeclaration style;
+ attribute CSSOMString selectorText;
+ [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
};
+[Exposed=Window]
interface CSSImportRule : CSSRule {
- readonly attribute DOMString href;
- [PutForwards=mediaText] readonly attribute MediaList media;
- readonly attribute CSSStyleSheet styleSheet;
+ readonly attribute USVString href;
+ [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
+ [SameObject] readonly attribute CSSStyleSheet styleSheet;
};
-interface CSSMediaRule : CSSRule {
- [PutForwards=mediaText] readonly attribute MediaList media;
- readonly attribute CSSRuleList cssRules;
- unsigned long insertRule(DOMString rule, unsigned long index);
+[Exposed=Window]
+interface CSSGroupingRule : CSSRule {
+ [SameObject] readonly attribute CSSRuleList cssRules;
+ unsigned long insertRule(CSSOMString rule, optional unsigned long index = 0);
void deleteRule(unsigned long index);
};
-interface CSSFontFaceRule : CSSRule {
- readonly attribute CSSStyleDeclaration style;
+[Exposed=Window]
+interface CSSPageRule : CSSGroupingRule {
+ attribute CSSOMString selectorText;
+ [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
};
-interface CSSPageRule : CSSRule {
- attribute DOMString selectorText;
- readonly attribute CSSStyleDeclaration style;
+[Exposed=Window]
+interface CSSMarginRule : CSSRule {
+ readonly attribute CSSOMString name;
+ [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
};
+[Exposed=Window]
interface CSSNamespaceRule : CSSRule {
- readonly attribute DOMString namespaceURI;
- readonly attribute DOMString? prefix;
+ readonly attribute CSSOMString namespaceURI;
+ readonly attribute CSSOMString prefix;
};
+[Exposed=Window]
interface CSSStyleDeclaration {
- attribute DOMString cssText;
-
+ [CEReactions] attribute CSSOMString cssText;
readonly attribute unsigned long length;
- DOMString item(unsigned long index);
-
- DOMString getPropertyValue(DOMString property);
- DOMString getPropertyPriority(DOMString property);
- void setProperty(DOMString property, DOMString value, optional DOMString priority);
- DOMString removeProperty(DOMString property);
-
- readonly attribute CSSStyleDeclarationValue values;
-
- readonly attribute CSSRule parentRule;
-
- // CSS Properties
- attribute DOMString azimuth;
- attribute DOMString background;
- attribute DOMString backgroundAttachment;
- attribute DOMString backgroundColor;
- attribute DOMString backgroundImage;
- attribute DOMString backgroundPosition;
- attribute DOMString backgroundRepeat;
- attribute DOMString border;
- attribute DOMString borderCollapse;
- attribute DOMString borderColor;
- attribute DOMString borderSpacing;
- attribute DOMString borderStyle;
- attribute DOMString borderTop;
- attribute DOMString borderRight;
- attribute DOMString borderBottom;
- attribute DOMString borderLeft;
- attribute DOMString borderTopColor;
- attribute DOMString borderRightColor;
- attribute DOMString borderBottomColor;
- attribute DOMString borderLeftColor;
- attribute DOMString borderTopStyle;
- attribute DOMString borderRightStyle;
- attribute DOMString borderBottomStyle;
- attribute DOMString borderLeftStyle;
- attribute DOMString borderTopWidth;
- attribute DOMString borderRightWidth;
- attribute DOMString borderBottomWidth;
- attribute DOMString borderLeftWidth;
- attribute DOMString borderWidth;
- attribute DOMString bottom;
- attribute DOMString captionSide;
- attribute DOMString clear;
- attribute DOMString clip;
- attribute DOMString color;
- attribute DOMString content;
- attribute DOMString counterIncrement;
- attribute DOMString counterReset;
- attribute DOMString cue;
- attribute DOMString cueAfter;
- attribute DOMString cueBefore;
- attribute DOMString cursor;
- attribute DOMString direction;
- attribute DOMString display;
- attribute DOMString elevation;
- attribute DOMString emptyCells;
- attribute DOMString cssFloat;
- attribute DOMString font;
- attribute DOMString fontFamily;
- attribute DOMString fontSize;
- attribute DOMString fontSizeAdjust;
- attribute DOMString fontStretch;
- attribute DOMString fontStyle;
- attribute DOMString fontVariant;
- attribute DOMString fontWeight;
- attribute DOMString height;
- attribute DOMString left;
- attribute DOMString letterSpacing;
- attribute DOMString lineHeight;
- attribute DOMString listStyle;
- attribute DOMString listStyleImage;
- attribute DOMString listStylePosition;
- attribute DOMString listStyleType;
- attribute DOMString margin;
- attribute DOMString marginTop;
- attribute DOMString marginRight;
- attribute DOMString marginBottom;
- attribute DOMString marginLeft;
- attribute DOMString marks;
- attribute DOMString maxHeight;
- attribute DOMString maxWidth;
- attribute DOMString minHeight;
- attribute DOMString minWidth;
- attribute DOMString orphans;
- attribute DOMString outline;
- attribute DOMString outlineColor;
- attribute DOMString outlineStyle;
- attribute DOMString outlineWidth;
- attribute DOMString overflow;
- attribute DOMString padding;
- attribute DOMString paddingTop;
- attribute DOMString paddingRight;
- attribute DOMString paddingBottom;
- attribute DOMString paddingLeft;
- attribute DOMString page;
- attribute DOMString pageBreakAfter;
- attribute DOMString pageBreakBefore;
- attribute DOMString pageBreakInside;
- attribute DOMString pause;
- attribute DOMString pauseAfter;
- attribute DOMString pauseBefore;
- attribute DOMString pitch;
- attribute DOMString pitchRange;
- attribute DOMString playDuring;
- attribute DOMString position;
- attribute DOMString quotes;
- attribute DOMString richness;
- attribute DOMString right;
- attribute DOMString size;
- attribute DOMString speak;
- attribute DOMString speakHeader;
- attribute DOMString speakNumeral;
- attribute DOMString speakPunctuation;
- attribute DOMString speechRate;
- attribute DOMString stress;
- attribute DOMString tableLayout;
- attribute DOMString textAlign;
- attribute DOMString textDecoration;
- attribute DOMString textIndent;
- attribute DOMString textShadow;
- attribute DOMString textTransform;
- attribute DOMString top;
- attribute DOMString unicodeBidi;
- attribute DOMString verticalAlign;
- attribute DOMString visibility;
- attribute DOMString voiceFamily;
- attribute DOMString volume;
- attribute DOMString whiteSpace;
- attribute DOMString widows;
- attribute DOMString width;
- attribute DOMString wordSpacing;
- attribute DOMString zIndex;
-};
-
-interface CSSStyleDeclarationValue {
- // ...
-
- // CSS Properties
-
+ getter CSSOMString item(unsigned long index);
+ CSSOMString getPropertyValue(CSSOMString property);
+ CSSOMString getPropertyPriority(CSSOMString property);
+ [CEReactions] void setProperty(CSSOMString property, [TreatNullAs=EmptyString] CSSOMString value, [TreatNullAs=EmptyString] optional CSSOMString priority = "");
+ [CEReactions] void setPropertyValue(CSSOMString property, [TreatNullAs=EmptyString] CSSOMString value);
+ [CEReactions] void setPropertyPriority(CSSOMString property, [TreatNullAs=EmptyString] CSSOMString priority);
+ [CEReactions] CSSOMString removeProperty(CSSOMString property);
+ readonly attribute CSSRule? parentRule;
+ [CEReactions] attribute [TreatNullAs=EmptyString] CSSOMString cssFloat;
};
-interface CSSPropertyValue {
- attribute DOMString cssText;
+[Exposed=Window,
+ NoInterfaceObject]
+interface ElementCSSInlineStyle {
+ [SameObject, PutForwards=cssText] readonly attribute CSSStyleDeclaration style;
};
-[NoInterfaceObject] interface CSSMapValue {
- getter CSSValue (DOMString name);
-};
+HTMLElement implements ElementCSSInlineStyle;
-[NoInterfaceObject] interface CSSPropertyValueList {
- readonly attribute CSSValue[] list;
-};
+SVGElement implements ElementCSSInlineStyle;
-[NoInterfaceObject] interface CSSComponentValue {
- readonly attribute DOMString type;
- attribute any value;
+partial interface Window {
+ [NewObject] CSSStyleDeclaration getComputedStyle(Element elt, optional CSSOMString? pseudoElt);
};
-[NoInterfaceObject] interface CSSStringComponentValue {
- attribute DOMString string;
+[Exposed=Window]
+interface CSS {
+ static CSSOMString escape(CSSOMString ident);
};
-
-[NoInterfaceObject] interface CSSKeywordComponentValue {
- attribute DOMString keyword;
-};
-
-[NoInterfaceObject] interface CSSIdentifierComponentValue {
- attribute DOMString identifier;
-};
-
-[NoInterfaceObject] interface CSSColorComponentValue {
- attribute short red;
- attribute short green;
- attribute short blue;
- attribute float alpha;
-};
-
-[NoInterfaceObject] interface CSSLengthComponentValue {
- attribute float em;
- attribute float ex;
- attribute float px;
- // figure out what to do with absolute lengths
-};
-
-[NoInterfaceObject] interface CSSPercentageComponentValue {
- attribute float percent;
-};
-
-[NoInterfaceObject] interface CSSURLComponentValue {
- attribute DOMString? url;
-};
-
-[NoInterfaceObject] interface ElementCSSInlineStyle {
- readonly attribute CSSStyleDeclaration style;
-};
-
-//partial interface Window {
-// CSSStyleDeclaration getComputedStyle(Element elt);
-// CSSStyleDeclaration getComputedStyle(Element elt, DOMString pseudoElt);
-//};
diff --git a/tests/wpt/web-platform-tests/interfaces/dedicated-workers.idl b/tests/wpt/web-platform-tests/interfaces/dedicated-workers.idl
new file mode 100644
index 00000000000..14259dc0ff6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/dedicated-workers.idl
@@ -0,0 +1,133 @@
+// -----------------------------------------------------------------------------
+// DOM
+// -----------------------------------------------------------------------------
+[Exposed=(Window,Worker)]
+interface EventTarget {
+ void addEventListener(DOMString type, EventListener? callback, optional (AddEventListenerOptions or boolean) options);
+ void removeEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options);
+ boolean dispatchEvent(Event event);
+};
+
+callback interface EventListener {
+ void handleEvent(Event event);
+};
+
+dictionary EventListenerOptions {
+ boolean capture = false;
+};
+
+dictionary AddEventListenerOptions : EventListenerOptions {
+ boolean passive = false;
+ boolean once = false;
+};
+
+// -----------------------------------------------------------------------------
+// HTML
+// -----------------------------------------------------------------------------
+[TreatNonCallableAsNull]
+callback EventHandlerNonNull = any (Event event);
+typedef EventHandlerNonNull? EventHandler;
+
+[TreatNonCallableAsNull]
+callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional DOMString source, optional unsigned long lineno, optional unsigned long column, optional any error);
+typedef OnErrorEventHandlerNonNull? OnErrorEventHandler;
+
+[Exposed=Worker]
+interface WorkerGlobalScope : EventTarget {
+ readonly attribute WorkerGlobalScope self;
+ readonly attribute WorkerLocation location;
+ readonly attribute WorkerNavigator navigator;
+ void importScripts(USVString... urls);
+
+ attribute OnErrorEventHandler onerror;
+ attribute EventHandler onlanguagechange;
+ attribute EventHandler onoffline;
+ attribute EventHandler ononline;
+ attribute EventHandler onrejectionhandled;
+ attribute EventHandler onunhandledrejection;
+};
+
+[Global=(Worker,DedicatedWorker),Exposed=DedicatedWorker]
+interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
+ [Replaceable] readonly attribute DOMString name;
+
+ void postMessage(any message, optional sequence<object> transfer = []);
+
+ void close();
+
+ attribute EventHandler onmessage;
+ attribute EventHandler onmessageerror;
+};
+
+typedef (DOMString or Function) TimerHandler;
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface WindowOrWorkerGlobalScope {
+ [Replaceable] readonly attribute USVString origin;
+
+ // base64 utility methods
+ DOMString btoa(DOMString data);
+ DOMString atob(DOMString data);
+
+ // timers
+ long setTimeout(TimerHandler handler, optional long timeout = 0, any... arguments);
+ void clearTimeout(optional long handle = 0);
+ long setInterval(TimerHandler handler, optional long timeout = 0, any... arguments);
+ void clearInterval(optional long handle = 0);
+
+ // ImageBitmap
+ Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options);
+ Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, long sx, long sy, long sw, long sh, optional ImageBitmapOptions options);
+};
+WorkerGlobalScope implements WindowOrWorkerGlobalScope;
+
+[Exposed=Worker]
+interface WorkerNavigator {};
+WorkerNavigator implements NavigatorID;
+WorkerNavigator implements NavigatorLanguage;
+WorkerNavigator implements NavigatorOnLine;
+WorkerNavigator implements NavigatorConcurrentHardware;
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface NavigatorID {
+ readonly attribute DOMString appCodeName; // constant "Mozilla"
+ readonly attribute DOMString appName; // constant "Netscape"
+ readonly attribute DOMString appVersion;
+ readonly attribute DOMString platform;
+ readonly attribute DOMString product; // constant "Gecko"
+ [Exposed=Window] readonly attribute DOMString productSub;
+ readonly attribute DOMString userAgent;
+ [Exposed=Window] readonly attribute DOMString vendor;
+ [Exposed=Window] readonly attribute DOMString vendorSub; // constant ""
+
+ // also has additional members in a partial interface
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface NavigatorLanguage {
+ readonly attribute DOMString language;
+ readonly attribute FrozenArray<DOMString> languages;
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface NavigatorOnLine {
+ readonly attribute boolean onLine;
+};
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface NavigatorConcurrentHardware {
+ readonly attribute unsigned long long hardwareConcurrency;
+};
+
+[Exposed=Worker]
+interface WorkerLocation {
+ stringifier readonly attribute USVString href;
+ readonly attribute USVString origin;
+ readonly attribute USVString protocol;
+ readonly attribute USVString host;
+ readonly attribute USVString hostname;
+ readonly attribute USVString port;
+ readonly attribute USVString pathname;
+ readonly attribute USVString search;
+ readonly attribute USVString hash;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/dom.idl b/tests/wpt/web-platform-tests/interfaces/dom.idl
index 7e2667ff7d3..fce74328043 100644
--- a/tests/wpt/web-platform-tests/interfaces/dom.idl
+++ b/tests/wpt/web-platform-tests/interfaces/dom.idl
@@ -1,5 +1,5 @@
-[Constructor(DOMString type, optional EventInit eventInitDict)/*,
- Exposed=(Window,Worker)*/]
+[Constructor(DOMString type, optional EventInit eventInitDict),
+ Exposed=(Window,Worker)]
interface Event {
readonly attribute DOMString type;
readonly attribute EventTarget? target;
@@ -31,8 +31,8 @@ dictionary EventInit {
};
-[Constructor(DOMString type, optional CustomEventInit eventInitDict)/*,
- Exposed=(Window,Worker)*/]
+[Constructor(DOMString type, optional CustomEventInit eventInitDict),
+ Exposed=(Window,Worker)]
interface CustomEvent : Event {
readonly attribute any detail;
@@ -44,7 +44,8 @@ dictionary CustomEventInit : EventInit {
};
-//[Exposed=(Window,Worker)]
+[Constructor,
+ Exposed=(Window,Worker)]
interface EventTarget {
void addEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options);
void removeEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options);
@@ -61,6 +62,23 @@ dictionary EventListenerOptions {
};
+[Constructor,
+ Exposed=(Window,Worker)]
+interface AbortController {
+ [SameObject] readonly attribute AbortSignal signal;
+
+ void abort();
+};
+
+
+[Exposed=(Window,Worker)]
+interface AbortSignal : EventTarget {
+ readonly attribute boolean aborted;
+
+ attribute EventHandler onabort;
+};
+
+
[NoInterfaceObject,
Exposed=Window]
interface NonElementParentNode {
@@ -402,7 +420,7 @@ interface Attr : Node {
[Exposed=Window]
interface CharacterData : Node {
- [TreatNullAs=EmptyString] attribute DOMString data;
+ attribute [TreatNullAs=EmptyString] DOMString data;
readonly attribute unsigned long length;
DOMString substringData(unsigned long offset, unsigned long count);
void appendData(DOMString data);
diff --git a/tests/wpt/web-platform-tests/interfaces/geometry.idl b/tests/wpt/web-platform-tests/interfaces/geometry.idl
index 87502f9eaf1..556e8a5cdef 100644
--- a/tests/wpt/web-platform-tests/interfaces/geometry.idl
+++ b/tests/wpt/web-platform-tests/interfaces/geometry.idl
@@ -12,7 +12,7 @@ interface DOMPointReadOnly {
DOMPoint matrixTransform(optional DOMMatrixInit matrix);
- serializer = { attribute };
+ [Default] toJSON();
};
[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
@@ -52,7 +52,7 @@ interface DOMRectReadOnly {
readonly attribute unrestricted double bottom;
readonly attribute unrestricted double left;
- serializer = { attribute };
+ [Default] toJSON();
};
[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
@@ -76,6 +76,13 @@ dictionary DOMRectInit {
unrestricted double height = 0;
};
+[NoInterfaceObject,
+ LegacyArrayClass]
+interface DOMRectList {
+ readonly attribute unsigned long length;
+ getter DOMRect? item(unsigned long index);
+};
+
[Constructor(optional DOMPointInit p1, optional DOMPointInit p2,
optional DOMPointInit p3, optional DOMPointInit p4),
Exposed=(Window,Worker),
@@ -90,7 +97,7 @@ interface DOMQuad {
[SameObject] readonly attribute DOMPoint p4;
[NewObject] DOMRect getBounds();
- serializer = { attribute };
+ [Default] toJSON();
};
dictionary DOMQuadInit {
@@ -171,7 +178,7 @@ interface DOMMatrixReadOnly {
[NewObject] Float64Array toFloat64Array();
[Exposed=Window] stringifier;
- serializer = { attribute };
+ [Default] toJSON();
};
[Constructor(optional (DOMString or sequence<unrestricted double>) init),
@@ -240,7 +247,7 @@ interface DOMMatrix : DOMMatrixReadOnly {
[Exposed=Window] DOMMatrix setMatrixValue(DOMString transformList);
};
-dictionary DOMMatrixInit {
+dictionary DOMMatrix2DInit {
unrestricted double a;
unrestricted double b;
unrestricted double c;
@@ -249,18 +256,21 @@ dictionary DOMMatrixInit {
unrestricted double f;
unrestricted double m11;
unrestricted double m12;
- unrestricted double m13 = 0;
- unrestricted double m14 = 0;
unrestricted double m21;
unrestricted double m22;
+ unrestricted double m41;
+ unrestricted double m42;
+};
+
+dictionary DOMMatrixInit : DOMMatrix2DInit {
+ unrestricted double m13 = 0;
+ unrestricted double m14 = 0;
unrestricted double m23 = 0;
unrestricted double m24 = 0;
unrestricted double m31 = 0;
unrestricted double m32 = 0;
unrestricted double m33 = 1;
unrestricted double m34 = 0;
- unrestricted double m41;
- unrestricted double m42;
unrestricted double m43 = 0;
unrestricted double m44 = 1;
boolean is2D;
diff --git a/tests/wpt/web-platform-tests/interfaces/html.idl b/tests/wpt/web-platform-tests/interfaces/html.idl
index 93653d0db0a..a372298d7c0 100644
--- a/tests/wpt/web-platform-tests/interfaces/html.idl
+++ b/tests/wpt/web-platform-tests/interfaces/html.idl
@@ -1,30 +1,9 @@
-// HTML IDLs
-typedef (Int8Array or Uint8Array or Uint8ClampedArray or
- Int16Array or Uint16Array or
- Int32Array or Uint32Array or
- Float32Array or Float64Array or
- DataView) ArrayBufferView;
-
-[NoInterfaceObject, Exposed=Window]
-interface HTMLHyperlinkElementUtils {
- stringifier attribute USVString href;
- readonly attribute USVString origin;
- attribute USVString protocol;
- attribute USVString username;
- attribute USVString password;
- attribute USVString host;
- attribute USVString hostname;
- attribute USVString port;
- attribute USVString pathname;
- attribute USVString search;
- attribute USVString hash;
-};
-
+[LegacyUnenumerableNamedProperties]
interface HTMLAllCollection {
readonly attribute unsigned long length;
- getter Element? item(unsigned long index);
- (HTMLCollection or Element)? item(DOMString name);
- legacycaller getter (HTMLCollection or Element)? namedItem(DOMString name);
+ getter Element? (unsigned long index);
+ getter (HTMLCollection or Element)? namedItem(DOMString name);
+ legacycaller (HTMLCollection or Element)? item(optional DOMString nameOrIndex);
};
interface HTMLFormControlsCollection : HTMLCollection {
@@ -33,41 +12,35 @@ interface HTMLFormControlsCollection : HTMLCollection {
};
interface RadioNodeList : NodeList {
- attribute DOMString value;
+ attribute DOMString value;
};
interface HTMLOptionsCollection : HTMLCollection {
// inherits item(), namedItem()
- attribute unsigned long length; // shadows inherited length
+ [CEReactions] 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;
-
-[OverrideBuiltins]
-interface DOMStringMap {
- getter DOMString (DOMString name);
- setter creator void (DOMString name, DOMString value);
- deleter void (DOMString name);
+[Exposed=(Window,Worker)]
+interface DOMStringList {
+ readonly attribute unsigned long length;
+ getter DOMString? item(unsigned long index);
+ boolean contains(DOMString string);
};
-typedef (ArrayBuffer or MessagePort) Transferable;
-
-callback FileCallback = void (File file);
-
enum DocumentReadyState { "loading", "interactive", "complete" };
typedef (HTMLScriptElement or SVGScriptElement) HTMLOrSVGScriptElement;
[OverrideBuiltins]
-partial /*sealed*/ interface Document {
+partial interface Document {
// resource metadata management
[PutForwards=href, Unforgeable] readonly attribute Location? location;
- attribute USVString domain;
+ attribute USVString domain;
readonly attribute USVString referrer;
- attribute USVString cookie;
+ attribute USVString cookie;
readonly attribute DOMString lastModified;
readonly attribute DocumentReadyState readyState;
@@ -107,18 +80,11 @@ partial /*sealed*/ interface Document {
// special event handler IDL attributes that only apply to Document objects
[LenientThis] attribute EventHandler onreadystatechange;
-
- // also has obsolete members
};
Document implements GlobalEventHandlers;
Document implements DocumentAndElementEventHandlers;
-[NoInterfaceObject]
-interface ElementContentEditable {
- [CEReactions] attribute DOMString contentEditable;
- readonly attribute boolean isContentEditable;
-};
-
+[HTMLConstructor]
interface HTMLElement : Element {
// metadata attributes
[CEReactions] attribute DOMString title;
@@ -137,29 +103,40 @@ interface HTMLElement : Element {
readonly attribute DOMString accessKeyLabel;
[CEReactions] attribute boolean draggable;
[CEReactions] attribute boolean spellcheck;
- void forceSpellCheck();
- [CEReactions, TreatNullAs=EmptyString] attribute DOMString innerText;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString innerText;
};
HTMLElement implements GlobalEventHandlers;
HTMLElement implements DocumentAndElementEventHandlers;
HTMLElement implements ElementContentEditable;
+// Note: intentionally not [HTMLConstructor]
interface HTMLUnknownElement : HTMLElement { };
+[OverrideBuiltins]
+interface DOMStringMap {
+ getter DOMString (DOMString name);
+ [CEReactions] setter void (DOMString name, DOMString value);
+ [CEReactions] deleter void (DOMString name);
+};
+
+[HTMLConstructor]
interface HTMLHtmlElement : HTMLElement {
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLHeadElement : HTMLElement {};
+[HTMLConstructor]
interface HTMLTitleElement : HTMLElement {
- attribute DOMString text;
+ [CEReactions] attribute DOMString text;
};
+[HTMLConstructor]
interface HTMLBaseElement : HTMLElement {
- attribute DOMString href;
- attribute DOMString target;
+ [CEReactions] attribute USVString href;
+ [CEReactions] attribute DOMString target;
};
[HTMLConstructor]
@@ -168,27 +145,32 @@ interface HTMLLinkElement : HTMLElement {
[CEReactions] attribute DOMString? crossOrigin;
[CEReactions] attribute DOMString rel;
[CEReactions] attribute DOMString as; // (default "")
- [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
+ [SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
[CEReactions] attribute DOMString media;
[CEReactions] attribute DOMString nonce;
[CEReactions] attribute DOMString integrity;
[CEReactions] attribute DOMString hreflang;
[CEReactions] attribute DOMString type;
- [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList sizes;
+ [SameObject, PutForwards=value] readonly attribute DOMTokenList sizes;
[CEReactions] attribute DOMString referrerPolicy;
+ [CEReactions] attribute USVString scope;
+ [CEReactions] attribute DOMString workerType;
+ [CEReactions] attribute DOMString updateViaCache;
// also has obsolete members
};
HTMLLinkElement implements LinkStyle;
+[HTMLConstructor]
interface HTMLMetaElement : HTMLElement {
- attribute DOMString name;
- attribute DOMString httpEquiv;
- attribute DOMString content;
+ [CEReactions] attribute DOMString name;
+ [CEReactions] attribute DOMString httpEquiv;
+ [CEReactions] attribute DOMString content;
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLStyleElement : HTMLElement {
[CEReactions] attribute DOMString media;
[CEReactions] attribute DOMString nonce;
@@ -196,54 +178,71 @@ interface HTMLStyleElement : HTMLElement {
};
HTMLStyleElement implements LinkStyle;
+[HTMLConstructor]
interface HTMLBodyElement : HTMLElement {
-
// also has obsolete members
};
+
HTMLBodyElement implements WindowEventHandlers;
+[HTMLConstructor]
interface HTMLHeadingElement : HTMLElement {
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLParagraphElement : HTMLElement {
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLHRElement : HTMLElement {
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLPreElement : HTMLElement {
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLQuoteElement : HTMLElement {
- attribute DOMString cite;
+ [CEReactions] attribute USVString cite;
};
+[HTMLConstructor]
interface HTMLOListElement : HTMLElement {
- attribute boolean reversed;
- attribute long start;
- attribute DOMString type;
+ [CEReactions] attribute boolean reversed;
+ [CEReactions] attribute long start;
+ [CEReactions] attribute DOMString type;
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLUListElement : HTMLElement {
// also has obsolete members
};
+[HTMLConstructor]
+interface HTMLMenuElement : HTMLElement {
+
+ // also has obsolete members
+};
+
+[HTMLConstructor]
interface HTMLLIElement : HTMLElement {
- attribute long value;
+ [CEReactions] attribute long value;
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLDListElement : HTMLElement {
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLDivElement : HTMLElement {
// also has obsolete members
};
@@ -254,7 +253,7 @@ interface HTMLAnchorElement : HTMLElement {
[CEReactions] attribute DOMString download;
[CEReactions] attribute USVString ping;
[CEReactions] attribute DOMString rel;
- [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
+ [SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
[CEReactions] attribute DOMString hreflang;
[CEReactions] attribute DOMString type;
@@ -266,31 +265,55 @@ interface HTMLAnchorElement : HTMLElement {
};
HTMLAnchorElement implements HTMLHyperlinkElementUtils;
+[HTMLConstructor]
interface HTMLDataElement : HTMLElement {
- attribute DOMString value;
+ [CEReactions] attribute DOMString value;
};
+[HTMLConstructor]
interface HTMLTimeElement : HTMLElement {
- attribute DOMString dateTime;
+ [CEReactions] attribute DOMString dateTime;
};
+[HTMLConstructor]
interface HTMLSpanElement : HTMLElement {};
+[HTMLConstructor]
interface HTMLBRElement : HTMLElement {
// also has obsolete members
};
+[NoInterfaceObject]
+interface HTMLHyperlinkElementUtils {
+ [CEReactions] stringifier attribute USVString href;
+ readonly attribute USVString origin;
+ [CEReactions] attribute USVString protocol;
+ [CEReactions] attribute USVString username;
+ [CEReactions] attribute USVString password;
+ [CEReactions] attribute USVString host;
+ [CEReactions] attribute USVString hostname;
+ [CEReactions] attribute USVString port;
+ [CEReactions] attribute USVString pathname;
+ [CEReactions] attribute USVString search;
+ [CEReactions] attribute USVString hash;
+};
+
+[HTMLConstructor]
interface HTMLModElement : HTMLElement {
- attribute DOMString cite;
- attribute DOMString dateTime;
+ [CEReactions] attribute USVString cite;
+ [CEReactions] attribute DOMString dateTime;
};
+[HTMLConstructor]
interface HTMLPictureElement : HTMLElement {};
-partial interface HTMLSourceElement {
- attribute DOMString srcset;
- attribute DOMString sizes;
- attribute DOMString media;
+[HTMLConstructor]
+interface HTMLSourceElement : HTMLElement {
+ [CEReactions] attribute USVString src;
+ [CEReactions] attribute DOMString type;
+ [CEReactions] attribute USVString srcset;
+ [CEReactions] attribute DOMString sizes;
+ [CEReactions] attribute DOMString media;
};
[HTMLConstructor, NamedConstructor=Image(optional unsigned long width, optional unsigned long height)]
@@ -310,6 +333,8 @@ interface HTMLImageElement : HTMLElement {
readonly attribute USVString currentSrc;
[CEReactions] attribute DOMString referrerPolicy;
+ Promise<void> decode();
+
// also has obsolete members
};
@@ -318,39 +343,44 @@ interface HTMLIFrameElement : HTMLElement {
[CEReactions] attribute USVString src;
[CEReactions] attribute DOMString srcdoc;
[CEReactions] attribute DOMString name;
- [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList sandbox;
+ [SameObject, PutForwards=value] readonly attribute DOMTokenList sandbox;
[CEReactions] attribute boolean allowFullscreen;
- [CEReactions] attribute boolean allowUserMedia;
[CEReactions] attribute boolean allowPaymentRequest;
+ [CEReactions] attribute boolean allowUserMedia;
[CEReactions] attribute DOMString width;
[CEReactions] attribute DOMString height;
[CEReactions] attribute DOMString referrerPolicy;
readonly attribute Document? contentDocument;
readonly attribute WindowProxy? contentWindow;
Document? getSVGDocument();
+
+ // also has obsolete members
};
+[HTMLConstructor]
interface HTMLEmbedElement : HTMLElement {
- attribute DOMString src;
- attribute DOMString type;
- attribute DOMString width;
- attribute DOMString height;
- Document getSVGDocument();
+ [CEReactions] attribute USVString src;
+ [CEReactions] attribute DOMString type;
+ [CEReactions] attribute DOMString width;
+ [CEReactions] attribute DOMString height;
+ Document? getSVGDocument();
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLObjectElement : HTMLElement {
- attribute DOMString data;
- attribute DOMString type;
- attribute boolean typeMustMatch;
- attribute DOMString name;
- attribute DOMString useMap;
+ [CEReactions] attribute USVString data;
+ [CEReactions] attribute DOMString type;
+ [CEReactions] attribute boolean typeMustMatch;
+ [CEReactions] attribute DOMString name;
+ [CEReactions] attribute DOMString useMap;
readonly attribute HTMLFormElement? form;
- attribute DOMString width;
- attribute DOMString height;
+ [CEReactions] attribute DOMString width;
+ [CEReactions] attribute DOMString height;
readonly attribute Document? contentDocument;
readonly attribute WindowProxy? contentWindow;
+ Document? getSVGDocument();
readonly attribute boolean willValidate;
readonly attribute ValidityState validity;
@@ -362,37 +392,34 @@ interface HTMLObjectElement : HTMLElement {
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLParamElement : HTMLElement {
- attribute DOMString name;
- attribute DOMString value;
+ [CEReactions] attribute DOMString name;
+ [CEReactions] attribute DOMString value;
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLVideoElement : HTMLMediaElement {
- attribute unsigned long width;
- attribute unsigned long height;
+ [CEReactions] attribute unsigned long width;
+ [CEReactions] attribute unsigned long height;
readonly attribute unsigned long videoWidth;
readonly attribute unsigned long videoHeight;
- attribute DOMString poster;
+ [CEReactions] attribute USVString poster;
+ [CEReactions] attribute boolean playsInline;
};
-[NamedConstructor=Audio(optional DOMString src)]
+[HTMLConstructor, NamedConstructor=Audio(optional DOMString src)]
interface HTMLAudioElement : HTMLMediaElement {};
-interface HTMLSourceElement : HTMLElement {
- attribute DOMString src;
- attribute DOMString type;
-
- // also has obsolete members
-};
-
+[HTMLConstructor]
interface HTMLTrackElement : HTMLElement {
- attribute DOMString kind;
- attribute DOMString src;
- attribute DOMString srclang;
- attribute DOMString label;
- attribute boolean default;
+ [CEReactions] attribute DOMString kind;
+ [CEReactions] attribute USVString src;
+ [CEReactions] attribute DOMString srclang;
+ [CEReactions] attribute DOMString label;
+ [CEReactions] attribute boolean default;
const unsigned short NONE = 0;
const unsigned short LOADING = 1;
@@ -404,21 +431,23 @@ interface HTMLTrackElement : HTMLElement {
};
enum CanPlayTypeResult { "" /* empty string */, "maybe", "probably" };
+typedef (MediaStream or MediaSource or Blob) MediaProvider;
interface HTMLMediaElement : HTMLElement {
// error state
readonly attribute MediaError? error;
// network state
- attribute DOMString src;
- readonly attribute DOMString currentSrc;
- attribute DOMString? crossOrigin;
+ [CEReactions] attribute USVString src;
+ attribute MediaProvider? srcObject;
+ readonly attribute USVString currentSrc;
+ [CEReactions] attribute DOMString? crossOrigin;
const unsigned short NETWORK_EMPTY = 0;
const unsigned short NETWORK_IDLE = 1;
const unsigned short NETWORK_LOADING = 2;
const unsigned short NETWORK_NO_SOURCE = 3;
readonly attribute unsigned short networkState;
- attribute DOMString preload;
+ [CEReactions] attribute DOMString preload;
readonly attribute TimeRanges buffered;
void load();
CanPlayTypeResult canPlayType(DOMString type);
@@ -433,31 +462,31 @@ interface HTMLMediaElement : HTMLElement {
readonly attribute boolean seeking;
// playback state
- attribute double currentTime;
+ attribute double currentTime;
void fastSeek(double time);
readonly attribute unrestricted double duration;
- Date getStartDate();
+ object getStartDate();
readonly attribute boolean paused;
- attribute double defaultPlaybackRate;
- attribute double playbackRate;
+ attribute double defaultPlaybackRate;
+ attribute double playbackRate;
readonly attribute TimeRanges played;
readonly attribute TimeRanges seekable;
readonly attribute boolean ended;
- attribute boolean autoplay;
- attribute boolean loop;
+ [CEReactions] attribute boolean autoplay;
+ [CEReactions] attribute boolean loop;
Promise<void> play();
void pause();
// controls
- attribute boolean controls;
- attribute double volume;
- attribute boolean muted;
- attribute boolean defaultMuted;
+ [CEReactions] attribute boolean controls;
+ attribute double volume;
+ attribute boolean muted;
+ [CEReactions] attribute boolean defaultMuted;
// tracks
- readonly attribute AudioTrackList audioTracks;
- readonly attribute VideoTrackList videoTracks;
- readonly attribute TextTrackList textTracks;
+ [SameObject] readonly attribute AudioTrackList audioTracks;
+ [SameObject] readonly attribute VideoTrackList videoTracks;
+ [SameObject] readonly attribute TextTrackList textTracks;
TextTrack addTextTrack(TextTrackKind kind, optional DOMString label = "", optional DOMString language = "");
};
@@ -466,6 +495,7 @@ interface MediaError {
const unsigned short MEDIA_ERR_NETWORK = 2;
const unsigned short MEDIA_ERR_DECODE = 3;
const unsigned short MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
+
readonly attribute unsigned short code;
readonly attribute DOMString message;
};
@@ -475,9 +505,9 @@ interface AudioTrackList : EventTarget {
getter AudioTrack (unsigned long index);
AudioTrack? getTrackById(DOMString id);
- attribute EventHandler onchange;
- attribute EventHandler onaddtrack;
- attribute EventHandler onremovetrack;
+ attribute EventHandler onchange;
+ attribute EventHandler onaddtrack;
+ attribute EventHandler onremovetrack;
};
interface AudioTrack {
@@ -485,7 +515,7 @@ interface AudioTrack {
readonly attribute DOMString kind;
readonly attribute DOMString label;
readonly attribute DOMString language;
- attribute boolean enabled;
+ attribute boolean enabled;
};
interface VideoTrackList : EventTarget {
@@ -494,9 +524,9 @@ interface VideoTrackList : EventTarget {
VideoTrack? getTrackById(DOMString id);
readonly attribute long selectedIndex;
- attribute EventHandler onchange;
- attribute EventHandler onaddtrack;
- attribute EventHandler onremovetrack;
+ attribute EventHandler onchange;
+ attribute EventHandler onaddtrack;
+ attribute EventHandler onremovetrack;
};
interface VideoTrack {
@@ -504,7 +534,7 @@ interface VideoTrack {
readonly attribute DOMString kind;
readonly attribute DOMString label;
readonly attribute DOMString language;
- attribute boolean selected;
+ attribute boolean selected;
};
interface TextTrackList : EventTarget {
@@ -512,9 +542,9 @@ interface TextTrackList : EventTarget {
getter TextTrack (unsigned long index);
TextTrack? getTrackById(DOMString id);
- attribute EventHandler onchange;
- attribute EventHandler onaddtrack;
- attribute EventHandler onremovetrack;
+ attribute EventHandler onchange;
+ attribute EventHandler onaddtrack;
+ attribute EventHandler onremovetrack;
};
enum TextTrackMode { "disabled", "hidden", "showing" };
@@ -527,7 +557,7 @@ interface TextTrack : EventTarget {
readonly attribute DOMString id;
readonly attribute DOMString inBandMetadataTrackDispatchType;
- attribute TextTrackMode mode;
+ attribute TextTrackMode mode;
readonly attribute TextTrackCueList? cues;
readonly attribute TextTrackCueList? activeCues;
@@ -535,7 +565,7 @@ interface TextTrack : EventTarget {
void addCue(TextTrackCue cue);
void removeCue(TextTrackCue cue);
- attribute EventHandler oncuechange;
+ attribute EventHandler oncuechange;
};
interface TextTrackCueList {
@@ -547,13 +577,13 @@ interface TextTrackCueList {
interface TextTrackCue : EventTarget {
readonly attribute TextTrack? track;
- attribute DOMString id;
- attribute double startTime;
- attribute double endTime;
- attribute boolean pauseOnExit;
+ attribute DOMString id;
+ attribute double startTime;
+ attribute double endTime;
+ attribute boolean pauseOnExit;
- attribute EventHandler onenter;
- attribute EventHandler onexit;
+ attribute EventHandler onenter;
+ attribute EventHandler onexit;
};
interface TimeRanges {
@@ -564,16 +594,17 @@ interface TimeRanges {
[Constructor(DOMString type, optional TrackEventInit eventInitDict)]
interface TrackEvent : Event {
- readonly attribute (VideoTrack or AudioTrack or TextTrack) track;
+ readonly attribute (VideoTrack or AudioTrack or TextTrack)? track;
};
dictionary TrackEventInit : EventInit {
- (VideoTrack or AudioTrack or TextTrack) track;
+ (VideoTrack or AudioTrack or TextTrack)? track = null;
};
+[HTMLConstructor]
interface HTMLMapElement : HTMLElement {
- attribute DOMString name;
- readonly attribute HTMLCollection areas;
+ [CEReactions] attribute DOMString name;
+ [SameObject] readonly attribute HTMLCollection areas;
};
[HTMLConstructor]
@@ -585,60 +616,70 @@ interface HTMLAreaElement : HTMLElement {
[CEReactions] attribute DOMString download;
[CEReactions] attribute USVString ping;
[CEReactions] attribute DOMString rel;
- [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
+ [SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
[CEReactions] attribute DOMString referrerPolicy;
// also has obsolete members
};
HTMLAreaElement implements HTMLHyperlinkElementUtils;
+[HTMLConstructor]
interface HTMLTableElement : HTMLElement {
- attribute HTMLTableCaptionElement? caption;
- HTMLElement createCaption();
- void deleteCaption();
- attribute HTMLTableSectionElement? tHead;
- HTMLElement createTHead();
- void deleteTHead();
- attribute HTMLTableSectionElement? tFoot;
- HTMLElement createTFoot();
- void deleteTFoot();
- readonly attribute HTMLCollection tBodies;
- HTMLElement createTBody();
- readonly attribute HTMLCollection rows;
- HTMLElement insertRow(optional long index = -1);
- void deleteRow(long index);
+ [CEReactions] attribute HTMLTableCaptionElement? caption;
+ HTMLTableCaptionElement createCaption();
+ [CEReactions] void deleteCaption();
+
+ [CEReactions] attribute HTMLTableSectionElement? tHead;
+ HTMLTableSectionElement createTHead();
+ [CEReactions] void deleteTHead();
+
+ [CEReactions] attribute HTMLTableSectionElement? tFoot;
+ HTMLTableSectionElement createTFoot();
+ [CEReactions] void deleteTFoot();
+
+ [SameObject] readonly attribute HTMLCollection tBodies;
+ HTMLTableSectionElement createTBody();
+
+ [SameObject] readonly attribute HTMLCollection rows;
+ HTMLTableRowElement insertRow(optional long index = -1);
+ [CEReactions] void deleteRow(long index);
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLTableCaptionElement : HTMLElement {
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLTableColElement : HTMLElement {
- attribute unsigned long span;
+ [CEReactions] attribute unsigned long span;
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLTableSectionElement : HTMLElement {
- readonly attribute HTMLCollection rows;
+ [SameObject] readonly attribute HTMLCollection rows;
HTMLElement insertRow(optional long index = -1);
- void deleteRow(long index);
+ [CEReactions] void deleteRow(long index);
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLTableRowElement : HTMLElement {
readonly attribute long rowIndex;
readonly attribute long sectionRowIndex;
- readonly attribute HTMLCollection cells;
- HTMLElement insertCell(optional long index = -1);
- void deleteCell(long index);
+ [SameObject] readonly attribute HTMLCollection cells;
+ HTMLTableCellElement insertCell(optional long index = -1);
+ [CEReactions] void deleteCell(long index);
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLTableCellElement : HTMLElement {
[CEReactions] attribute unsigned long colSpan;
[CEReactions] attribute unsigned long rowSpan;
@@ -651,32 +692,33 @@ interface HTMLTableCellElement : HTMLElement {
// also has obsolete members
};
-[OverrideBuiltins]
+[OverrideBuiltins, LegacyUnenumerableNamedProperties, HTMLConstructor]
interface HTMLFormElement : HTMLElement {
- attribute DOMString acceptCharset;
- attribute DOMString action;
- attribute DOMString autocomplete;
- attribute DOMString enctype;
- attribute DOMString encoding;
- attribute DOMString method;
- attribute DOMString name;
- attribute boolean noValidate;
- attribute DOMString target;
-
- readonly attribute HTMLFormControlsCollection elements;
+ [CEReactions] attribute DOMString acceptCharset;
+ [CEReactions] attribute USVString action;
+ [CEReactions] attribute DOMString autocomplete;
+ [CEReactions] attribute DOMString enctype;
+ [CEReactions] attribute DOMString encoding;
+ [CEReactions] attribute DOMString method;
+ [CEReactions] attribute DOMString name;
+ [CEReactions] attribute boolean noValidate;
+ [CEReactions] attribute DOMString target;
+
+ [SameObject] readonly attribute HTMLFormControlsCollection elements;
readonly attribute unsigned long length;
getter Element (unsigned long index);
getter (RadioNodeList or Element) (DOMString name);
void submit();
- void reset();
+ [CEReactions] void reset();
boolean checkValidity();
boolean reportValidity();
};
+[HTMLConstructor]
interface HTMLLabelElement : HTMLElement {
readonly attribute HTMLFormElement? form;
- attribute DOMString htmlFor;
+ [CEReactions] attribute DOMString htmlFor;
readonly attribute HTMLElement? control;
};
@@ -691,7 +733,7 @@ interface HTMLInputElement : HTMLElement {
[CEReactions] attribute DOMString dirName;
[CEReactions] attribute boolean disabled;
readonly attribute HTMLFormElement? form;
- readonly attribute FileList? files;
+ attribute FileList? files;
[CEReactions] attribute USVString formAction;
[CEReactions] attribute DOMString formEnctype;
[CEReactions] attribute DOMString formMethod;
@@ -716,7 +758,7 @@ interface HTMLInputElement : HTMLElement {
[CEReactions] attribute DOMString step;
[CEReactions] attribute DOMString type;
[CEReactions] attribute DOMString defaultValue;
- [CEReactions, TreatNullAs=EmptyString] attribute DOMString value;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString value;
attribute object? valueAsDate;
attribute unrestricted double valueAsNumber;
[CEReactions] attribute unsigned long width;
@@ -804,25 +846,27 @@ interface HTMLSelectElement : HTMLElement {
readonly attribute NodeList labels;
};
+[HTMLConstructor]
interface HTMLDataListElement : HTMLElement {
- readonly attribute HTMLCollection options;
+ [SameObject] readonly attribute HTMLCollection options;
};
+[HTMLConstructor]
interface HTMLOptGroupElement : HTMLElement {
- attribute boolean disabled;
- attribute DOMString label;
+ [CEReactions] attribute boolean disabled;
+ [CEReactions] attribute DOMString label;
};
-[NamedConstructor=Option(optional DOMString text = "", optional DOMString value, optional boolean defaultSelected = false, optional boolean selected = false)]
+[HTMLConstructor, NamedConstructor=Option(optional DOMString text = "", optional DOMString value, optional boolean defaultSelected = false, optional boolean selected = false)]
interface HTMLOptionElement : HTMLElement {
- attribute boolean disabled;
+ [CEReactions] attribute boolean disabled;
readonly attribute HTMLFormElement? form;
- attribute DOMString label;
- attribute boolean defaultSelected;
- attribute boolean selected;
- attribute DOMString value;
+ [CEReactions] attribute DOMString label;
+ [CEReactions] attribute boolean defaultSelected;
+ attribute boolean selected;
+ [CEReactions] attribute DOMString value;
- attribute DOMString text;
+ [CEReactions] attribute DOMString text;
readonly attribute long index;
};
@@ -846,7 +890,7 @@ interface HTMLTextAreaElement : HTMLElement {
readonly attribute DOMString type;
[CEReactions] attribute DOMString defaultValue;
- [CEReactions, TreatNullAs=EmptyString] attribute DOMString value;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString value;
readonly attribute unsigned long textLength;
readonly attribute boolean willValidate;
@@ -869,7 +913,7 @@ interface HTMLTextAreaElement : HTMLElement {
[HTMLConstructor]
interface HTMLOutputElement : HTMLElement {
- [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList htmlFor;
+ [SameObject, PutForwards=value] readonly attribute DOMTokenList htmlFor;
readonly attribute HTMLFormElement? form;
[CEReactions] attribute DOMString name;
@@ -906,23 +950,25 @@ interface HTMLMeterElement : HTMLElement {
readonly attribute NodeList labels;
};
+[HTMLConstructor]
interface HTMLFieldSetElement : HTMLElement {
- attribute boolean disabled;
+ [CEReactions] attribute boolean disabled;
readonly attribute HTMLFormElement? form;
- attribute DOMString name;
+ [CEReactions] attribute DOMString name;
readonly attribute DOMString type;
- readonly attribute HTMLFormControlsCollection elements;
+ [SameObject] readonly attribute HTMLCollection elements;
readonly attribute boolean willValidate;
- readonly attribute ValidityState validity;
+ [SameObject] readonly attribute ValidityState validity;
readonly attribute DOMString validationMessage;
boolean checkValidity();
boolean reportValidity();
void setCustomValidity(DOMString error);
};
+[HTMLConstructor]
interface HTMLLegendElement : HTMLElement {
readonly attribute HTMLFormElement? form;
@@ -933,7 +979,7 @@ enum SelectionMode {
"select",
"start",
"end",
- "preserve"/*,*/ // default
+ "preserve" // default
};
interface ValidityState {
@@ -950,20 +996,18 @@ interface ValidityState {
readonly attribute boolean valid;
};
+[HTMLConstructor]
interface HTMLDetailsElement : HTMLElement {
- attribute boolean open;
-};
-
-interface HTMLMenuElement : HTMLElement {
- // also has obsolete members
+ [CEReactions] attribute boolean open;
};
+[HTMLConstructor]
interface HTMLDialogElement : HTMLElement {
- attribute boolean open;
- attribute DOMString returnValue;
- void show();
- void showModal();
- void close(optional DOMString returnValue);
+ [CEReactions] attribute boolean open;
+ attribute DOMString returnValue;
+ [CEReactions] void show();
+ [CEReactions] void showModal();
+ [CEReactions] void close(optional DOMString returnValue);
};
[HTMLConstructor]
@@ -983,12 +1027,14 @@ interface HTMLScriptElement : HTMLElement {
// also has obsolete members
};
+[HTMLConstructor]
interface HTMLTemplateElement : HTMLElement {
readonly attribute DocumentFragment content;
};
+[HTMLConstructor]
interface HTMLSlotElement : HTMLElement {
- /*[CEReactions]*/ attribute DOMString name;
+ [CEReactions] attribute DOMString name;
sequence<Node> assignedNodes(optional AssignedNodesOptions options);
};
@@ -997,25 +1043,29 @@ dictionary AssignedNodesOptions {
};
typedef (CanvasRenderingContext2D or WebGLRenderingContext) RenderingContext;
-callback BlobCallback = void (Blob? blob);
+[HTMLConstructor]
interface HTMLCanvasElement : HTMLElement {
- attribute unsigned long width;
- attribute unsigned long height;
+ [CEReactions] attribute unsigned long width;
+ [CEReactions] attribute unsigned long height;
RenderingContext? getContext(DOMString contextId, any... arguments);
- DOMString toDataURL(optional DOMString type, any... arguments);
- void toBlob(BlobCallback _callback, optional DOMString type, any... arguments);
+ USVString toDataURL(optional DOMString type, optional any quality);
+ void toBlob(BlobCallback _callback, optional DOMString type, optional any quality);
+ OffscreenCanvas transferControlToOffscreen();
};
+callback BlobCallback = void (Blob? blob);
+
typedef (HTMLImageElement or
SVGImageElement) HTMLOrSVGImageElement;
typedef (HTMLOrSVGImageElement or
HTMLVideoElement or
HTMLCanvasElement or
- ImageBitmap) CanvasImageSource;
+ ImageBitmap or
+ OffscreenCanvas) CanvasImageSource;
enum CanvasFillRule { "nonzero", "evenodd" };
@@ -1041,20 +1091,19 @@ CanvasRenderingContext2D implements CanvasDrawPath;
CanvasRenderingContext2D implements CanvasUserInterface;
CanvasRenderingContext2D implements CanvasText;
CanvasRenderingContext2D implements CanvasDrawImage;
-CanvasRenderingContext2D implements CanvasHitRegion;
CanvasRenderingContext2D implements CanvasImageData;
CanvasRenderingContext2D implements CanvasPathDrawingStyles;
CanvasRenderingContext2D implements CanvasTextDrawingStyles;
CanvasRenderingContext2D implements CanvasPath;
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasState {
// state
void save(); // push state on state stack
void restore(); // pop state stack and restore state
};
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasTransform {
// transformations (default transform is the identity matrix)
void scale(unrestricted double x, unrestricted double y);
@@ -1064,19 +1113,19 @@ interface CanvasTransform {
[NewObject] DOMMatrix getTransform();
void setTransform(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
- void setTransform(optional DOMMatrixInit transform);
+ void setTransform(optional DOMMatrix2DInit transform);
void resetTransform();
};
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasCompositing {
// compositing
attribute unrestricted double globalAlpha; // (default 1.0)
attribute DOMString globalCompositeOperation; // (default source-over)
};
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasImageSmoothing {
// image smoothing
attribute boolean imageSmoothingEnabled; // (default true)
@@ -1084,9 +1133,9 @@ interface CanvasImageSmoothing {
};
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasFillStrokeStyles {
- // colours and styles (see also the CanvasPathDrawingStyles and CanvasTextDrawingStyles interfaces)
+ // colors and styles (see also the CanvasPathDrawingStyles and CanvasTextDrawingStyles interfaces)
attribute (DOMString or CanvasGradient or CanvasPattern) strokeStyle; // (default black)
attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black)
CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1);
@@ -1095,7 +1144,7 @@ interface CanvasFillStrokeStyles {
};
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasShadowStyles {
// shadows
attribute unrestricted double shadowOffsetX; // (default 0)
@@ -1104,13 +1153,13 @@ interface CanvasShadowStyles {
attribute DOMString shadowColor; // (default transparent black)
};
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasFilters {
// filters
attribute DOMString filter; // (default "none")
};
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasRect {
// rects
void clearRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
@@ -1118,7 +1167,7 @@ interface CanvasRect {
void strokeRect(unrestricted double x, unrestricted double y, unrestricted double w, unrestricted double h);
};
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasDrawPath {
// path API (see also CanvasPath)
void beginPath();
@@ -1151,7 +1200,7 @@ interface CanvasText {
TextMetrics measureText(DOMString text);
};
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasDrawImage {
// drawing images
void drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy);
@@ -1159,31 +1208,23 @@ interface CanvasDrawImage {
void drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
};
-[NoInterfaceObject]
-interface CanvasHitRegion {
- // hit regions
- void addHitRegion(optional HitRegionOptions options);
- void removeHitRegion(DOMString id);
- void clearHitRegions();
-};
-
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasImageData {
// pixel manipulation
- ImageData createImageData(double sw, double sh);
+ ImageData createImageData(long sw, long sh);
ImageData createImageData(ImageData imagedata);
- ImageData getImageData(double sx, double sy, double sw, double sh);
- void putImageData(ImageData imagedata, double dx, double dy);
- void putImageData(ImageData imagedata, double dx, double dy, double dirtyX, double dirtyY, double dirtyWidth, double dirtyHeight);
+ ImageData getImageData(long sx, long sy, long sw, long sh);
+ void putImageData(ImageData imagedata, long dx, long dy);
+ void putImageData(ImageData imagedata, long dx, long dy, long dirtyX, long dirtyY, long dirtyWidth, long dirtyHeight);
};
enum CanvasLineCap { "butt", "round", "square" };
-enum CanvasLineJoin { "round", "bevel", "miter"};
+enum CanvasLineJoin { "round", "bevel", "miter" };
enum CanvasTextAlign { "start", "end", "left", "right", "center" };
enum CanvasTextBaseline { "top", "hanging", "middle", "alphabetic", "ideographic", "bottom" };
enum CanvasDirection { "ltr", "rtl", "inherit" };
-[NoInterfaceObject]
+[NoInterfaceObject, Exposed=(Window,Worker)]
interface CanvasPathDrawingStyles {
// line caps/joins
attribute unrestricted double lineWidth; // (default 1)
@@ -1221,14 +1262,16 @@ interface CanvasPath {
void ellipse(unrestricted double x, unrestricted double y, unrestricted double radiusX, unrestricted double radiusY, unrestricted double rotation, unrestricted double startAngle, unrestricted double endAngle, optional boolean anticlockwise = false);
};
+[Exposed=(Window,Worker)]
interface CanvasGradient {
// opaque object
void addColorStop(double offset, DOMString color);
};
+[Exposed=(Window,Worker)]
interface CanvasPattern {
// opaque object
- void setTransform(optional DOMMatrixInit transform);
+ void setTransform(optional DOMMatrix2DInit transform);
};
interface TextMetrics {
@@ -1249,22 +1292,10 @@ interface TextMetrics {
readonly attribute double ideographicBaseline;
};
-dictionary HitRegionOptions {
- Path2D? path = null;
- CanvasFillRule fillRule = "nonzero";
- DOMString id = "";
- DOMString? parentID = null;
- DOMString cursor = "inherit";
- // for control-backed regions:
- Element? control = null;
- // for unbacked regions:
- DOMString? label = null;
- DOMString? role = null;
-};
-
[Constructor(unsigned long sw, unsigned long sh),
Constructor(Uint8ClampedArray data, unsigned long sw, optional unsigned long sh),
- Exposed=(Window,Worker)]
+ Exposed=(Window,Worker),
+ Serializable]
interface ImageData {
readonly attribute unsigned long width;
readonly attribute unsigned long height;
@@ -1274,30 +1305,86 @@ interface ImageData {
[Constructor,
Constructor(Path2D path),
Constructor(sequence<Path2D> paths, optional CanvasFillRule fillRule = "nonzero"),
- Constructor(DOMString d), Exposed=(Window,Worker)]
+ Constructor(DOMString d),
+ Exposed=(Window,Worker)]
interface Path2D {
- void addPath(Path2D path, optional DOMMatrixInit transform);
+ void addPath(Path2D path, optional DOMMatrix2DInit transform);
};
Path2D implements CanvasPath;
-partial interface MouseEvent {
- readonly attribute DOMString? region;
+interface ImageBitmapRenderingContext {
+ readonly attribute HTMLCanvasElement canvas;
+ void transferFromImageBitmap(ImageBitmap? bitmap);
+};
+
+dictionary ImageBitmapRenderingContextSettings {
+ boolean alpha = true;
+};
+
+typedef (OffscreenCanvasRenderingContext2D or
+ WebGLRenderingContext) OffscreenRenderingContext;
+
+dictionary ImageEncodeOptions {
+ DOMString type = "image/png";
+ unrestricted double quality = 1.0;
+};
+
+enum OffscreenRenderingContextType { "2d", "webgl" };
+
+[Constructor([EnforceRange] unsigned long long width, [EnforceRange] unsigned long long height), Exposed=(Window,Worker), Transferable]
+interface OffscreenCanvas : EventTarget {
+ attribute unsigned long long width;
+ attribute unsigned long long height;
+
+ OffscreenRenderingContext? getContext(OffscreenRenderingContextType contextType, any... arguments);
+ ImageBitmap transferToImageBitmap();
+ Promise<Blob> convertToBlob(optional ImageEncodeOptions options);
+};
+
+
+[Exposed=(Window,Worker)]
+interface OffscreenCanvasRenderingContext2D {
+ void commit();
+ readonly attribute OffscreenCanvas canvas;
};
-// https://github.com/w3c/testharness.js/issues/84
-//partial dictionary MouseEventInit {
-// DOMString? region;
-//};
+OffscreenCanvasRenderingContext2D implements CanvasState;
+OffscreenCanvasRenderingContext2D implements CanvasTransform;
+OffscreenCanvasRenderingContext2D implements CanvasCompositing;
+OffscreenCanvasRenderingContext2D implements CanvasImageSmoothing;
+OffscreenCanvasRenderingContext2D implements CanvasFillStrokeStyles;
+OffscreenCanvasRenderingContext2D implements CanvasShadowStyles;
+OffscreenCanvasRenderingContext2D implements CanvasFilters;
+OffscreenCanvasRenderingContext2D implements CanvasRect;
+OffscreenCanvasRenderingContext2D implements CanvasDrawPath;
+OffscreenCanvasRenderingContext2D implements CanvasDrawImage;
+OffscreenCanvasRenderingContext2D implements CanvasImageData;
+OffscreenCanvasRenderingContext2D implements CanvasPathDrawingStyles;
+OffscreenCanvasRenderingContext2D implements CanvasPath;
+
+
+interface CustomElementRegistry {
+ [CEReactions] void define(DOMString name, Function constructor, optional ElementDefinitionOptions options);
+ any get(DOMString name);
+ Promise<void> whenDefined(DOMString name);
+};
-partial interface Touch {
- readonly attribute DOMString? region;
+dictionary ElementDefinitionOptions {
+ DOMString extends;
};
-interface DataTransfer {
- attribute DOMString dropEffect;
- attribute DOMString effectAllowed;
+[NoInterfaceObject]
+interface ElementContentEditable {
+ [CEReactions] attribute DOMString contentEditable;
+ readonly attribute boolean isContentEditable;
+};
- readonly attribute DataTransferItemList items;
+[Constructor, Exposed=(Window)]
+ interface DataTransfer {
+ attribute DOMString dropEffect;
+ attribute DOMString effectAllowed;
+
+ [SameObject] readonly attribute DataTransferItemList items;
void setDragImage(Element image, long x, long y);
@@ -1306,7 +1393,7 @@ interface DataTransfer {
DOMString getData(DOMString format);
void setData(DOMString format, DOMString data);
void clearData(optional DOMString format);
- readonly attribute FileList files;
+ [SameObject] readonly attribute FileList files;
};
interface DataTransferItemList {
@@ -1333,29 +1420,26 @@ interface DragEvent : MouseEvent {
};
dictionary DragEventInit : MouseEventInit {
- DataTransfer? dataTransfer;
+ DataTransfer? dataTransfer = null;
};
-// For purposes of this test, just treat WindowProxy as the same thing as
-// Window.
-typedef Window WindowProxy;
-
-[PrimaryGlobal]
-/*sealed*/ interface Window : EventTarget {
+[PrimaryGlobal, LegacyUnenumerableNamedProperties]
+interface Window : EventTarget {
// the current browsing context
[Unforgeable] readonly attribute WindowProxy window;
[Replaceable] readonly attribute WindowProxy self;
[Unforgeable] readonly attribute Document document;
- attribute DOMString name;
+ attribute DOMString name;
[PutForwards=href, Unforgeable] readonly attribute Location location;
readonly attribute History history;
+ readonly attribute CustomElementRegistry customElements;
[Replaceable] readonly attribute BarProp locationbar;
[Replaceable] readonly attribute BarProp menubar;
[Replaceable] readonly attribute BarProp personalbar;
[Replaceable] readonly attribute BarProp scrollbars;
[Replaceable] readonly attribute BarProp statusbar;
[Replaceable] readonly attribute BarProp toolbar;
- attribute DOMString status;
+ attribute DOMString status;
void close();
readonly attribute boolean closed;
void stop();
@@ -1365,66 +1449,72 @@ typedef Window WindowProxy;
// other browsing contexts
[Replaceable] readonly attribute WindowProxy frames;
[Replaceable] readonly attribute unsigned long length;
- [Unforgeable] readonly attribute WindowProxy top;
- attribute any opener;
- [Replaceable] readonly attribute WindowProxy parent;
+ [Unforgeable] readonly attribute WindowProxy? top;
+ attribute any opener;
+ [Replaceable] readonly attribute WindowProxy? parent;
readonly attribute Element? frameElement;
- WindowProxy open(optional DOMString url = "about:blank", optional DOMString target = "_blank", [TreatNullAs=EmptyString] optional DOMString features = "", optional boolean replace = false);
- getter WindowProxy (unsigned long index);
+ WindowProxy? open(optional USVString url = "about:blank", optional DOMString target = "_blank", optional [TreatNullAs=EmptyString] DOMString features = "");
getter object (DOMString name);
+ // Since this is the global object, the IDL named getter adds a NamedPropertiesObject exotic
+ // object on the prototype chain. Indeed, this does not make the global object an exotic object.
+ // Indexed access is taken care of by the WindowProxy exotic object.
// the user agent
readonly attribute Navigator navigator;
- [Replaceable] readonly attribute External external;
readonly attribute ApplicationCache applicationCache;
// user prompts
void alert();
- //void alert(DOMString message);
+ void alert(DOMString message);
boolean confirm(optional DOMString message = "");
DOMString? prompt(optional DOMString message = "", optional DOMString default = "");
void print();
- void postMessage(any message, DOMString targetOrigin, optional sequence<Transferable> transfer);
+ unsigned long requestAnimationFrame(FrameRequestCallback callback);
+ void cancelAnimationFrame(unsigned long handle);
+
+ void postMessage(any message, USVString targetOrigin, optional sequence<object> transfer = []);
// also has obsolete members
};
Window implements GlobalEventHandlers;
Window implements WindowEventHandlers;
+callback FrameRequestCallback = void (DOMHighResTimeStamp time);
+
interface BarProp {
readonly attribute boolean visible;
};
enum ScrollRestoration { "auto", "manual" };
-interface History {
- readonly attribute long length;
+interface History {
+ readonly attribute unsigned long length;
attribute ScrollRestoration scrollRestoration;
readonly attribute any state;
- void go(optional long delta);
+ void go(optional long delta = 0);
void back();
void forward();
- void pushState(any data, DOMString title, optional DOMString? url = null);
- void replaceState(any data, DOMString title, optional DOMString? url = null);
+ void pushState(any data, DOMString title, optional USVString? url = null);
+ void replaceState(any data, DOMString title, optional USVString? url = null);
};
-[Unforgeable] interface Location {
- stringifier attribute USVString href;
- readonly attribute USVString origin;
- attribute USVString protocol;
- attribute USVString host;
- attribute USVString hostname;
- attribute USVString port;
- attribute USVString pathname;
- attribute USVString search;
- attribute USVString hash;
+interface Location { // but see also additional creation steps and overridden internal methods
+ [Unforgeable] stringifier attribute USVString href;
+ [Unforgeable] readonly attribute USVString origin;
+ [Unforgeable] attribute USVString protocol;
+ [Unforgeable] attribute USVString host;
+ [Unforgeable] attribute USVString hostname;
+ [Unforgeable] attribute USVString port;
+ [Unforgeable] attribute USVString pathname;
+ [Unforgeable] attribute USVString search;
+ [Unforgeable] attribute USVString hash;
- void assign(USVString url);
- void replace(USVString url);
- void reload();
+ [Unforgeable] void assign(USVString url);
+ [Unforgeable] void replace(USVString url);
+ [Unforgeable] void reload();
- [SameObject] readonly attribute USVString[] ancestorOrigins;
+ [Unforgeable, SameObject] readonly attribute DOMStringList ancestorOrigins;
};
[Constructor(DOMString type, optional PopStateEventInit eventInitDict)]
@@ -1433,18 +1523,18 @@ interface PopStateEvent : Event {
};
dictionary PopStateEventInit : EventInit {
- any state;
+ any state = null;
};
[Constructor(DOMString type, optional HashChangeEventInit eventInitDict)]
interface HashChangeEvent : Event {
- readonly attribute DOMString oldURL;
- readonly attribute DOMString newURL;
+ readonly attribute USVString oldURL;
+ readonly attribute USVString newURL;
};
dictionary HashChangeEventInit : EventInit {
- DOMString oldURL;
- DOMString newURL;
+ USVString oldURL = "";
+ USVString newURL = "";
};
[Constructor(DOMString type, optional PageTransitionEventInit eventInitDict)]
@@ -1453,14 +1543,13 @@ interface PageTransitionEvent : Event {
};
dictionary PageTransitionEventInit : EventInit {
- boolean persisted;
+ boolean persisted = false;
};
interface BeforeUnloadEvent : Event {
- attribute DOMString returnValue;
+ attribute DOMString returnValue;
};
-[Exposed=(Window,SharedWorker)]
interface ApplicationCache : EventTarget {
// update status
@@ -1478,14 +1567,14 @@ interface ApplicationCache : EventTarget {
void swapCache();
// events
- attribute EventHandler onchecking;
- attribute EventHandler onerror;
- attribute EventHandler onnoupdate;
- attribute EventHandler ondownloading;
- attribute EventHandler onprogress;
- attribute EventHandler onupdateready;
- attribute EventHandler oncached;
- attribute EventHandler onobsolete;
+ attribute EventHandler onchecking;
+ attribute EventHandler onerror;
+ attribute EventHandler onnoupdate;
+ attribute EventHandler ondownloading;
+ attribute EventHandler onprogress;
+ attribute EventHandler onupdateready;
+ attribute EventHandler oncached;
+ attribute EventHandler onobsolete;
};
[NoInterfaceObject, Exposed=(Window,Worker)]
@@ -1496,29 +1585,40 @@ interface NavigatorOnLine {
[Constructor(DOMString type, optional ErrorEventInit eventInitDict), Exposed=(Window,Worker)]
interface ErrorEvent : Event {
readonly attribute DOMString message;
- readonly attribute DOMString filename;
+ readonly attribute USVString filename;
readonly attribute unsigned long lineno;
readonly attribute unsigned long colno;
readonly attribute any error;
};
dictionary ErrorEventInit : EventInit {
- DOMString message;
- DOMString filename;
- unsigned long lineno;
- unsigned long colno;
- any error;
+ DOMString message = "";
+ USVString filename = "";
+ unsigned long lineno = 0;
+ unsigned long colno = 0;
+ any error = null;
};
-[TreatNonCallableAsNull]
+[Constructor(DOMString type, PromiseRejectionEventInit eventInitDict), Exposed=(Window,Worker)]
+interface PromiseRejectionEvent : Event {
+ readonly attribute Promise<any> promise;
+ readonly attribute any reason;
+};
+
+dictionary PromiseRejectionEventInit : EventInit {
+ required Promise<any> promise;
+ any reason;
+};
+
+[TreatNonObjectAsNull]
callback EventHandlerNonNull = any (Event event);
typedef EventHandlerNonNull? EventHandler;
-[TreatNonCallableAsNull]
-callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional DOMString source, optional unsigned long lineno, optional unsigned long column, optional any error);
+[TreatNonObjectAsNull]
+callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional DOMString source, optional unsigned long lineno, optional unsigned long colno, optional any error);
typedef OnErrorEventHandlerNonNull? OnErrorEventHandler;
-[TreatNonCallableAsNull]
+[TreatNonObjectAsNull]
callback OnBeforeUnloadEventHandlerNonNull = DOMString? (Event event);
typedef OnBeforeUnloadEventHandlerNonNull? OnBeforeUnloadEventHandler;
@@ -1575,6 +1675,7 @@ interface GlobalEventHandlers {
attribute EventHandler onreset;
attribute EventHandler onresize;
attribute EventHandler onscroll;
+ attribute EventHandler onsecuritypolicyviolation;
attribute EventHandler onseeked;
attribute EventHandler onseeking;
attribute EventHandler onselect;
@@ -1588,13 +1689,6 @@ interface GlobalEventHandlers {
};
[NoInterfaceObject]
-interface DocumentAndElementEventHandlers {
- attribute EventHandler oncopy;
- attribute EventHandler oncut;
- attribute EventHandler onpaste;
-};
-
-[NoInterfaceObject]
interface WindowEventHandlers {
attribute EventHandler onafterprint;
attribute EventHandler onbeforeprint;
@@ -1614,6 +1708,13 @@ interface WindowEventHandlers {
attribute EventHandler onunload;
};
+[NoInterfaceObject]
+interface DocumentAndElementEventHandlers {
+ attribute EventHandler oncopy;
+ attribute EventHandler oncut;
+ attribute EventHandler onpaste;
+};
+
typedef (DOMString or Function) TimerHandler;
[NoInterfaceObject, Exposed=(Window,Worker)]
@@ -1621,8 +1722,8 @@ interface WindowOrWorkerGlobalScope {
[Replaceable] readonly attribute USVString origin;
// base64 utility methods
- DOMString btoa(DOMString btoa);
- DOMString atob(DOMString atob);
+ DOMString btoa(DOMString data);
+ DOMString atob(DOMString data);
// timers
long setTimeout(TimerHandler handler, optional long timeout = 0, any... arguments);
@@ -1634,16 +1735,9 @@ interface WindowOrWorkerGlobalScope {
Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options);
Promise<ImageBitmap> createImageBitmap(ImageBitmapSource image, long sx, long sy, long sw, long sh, optional ImageBitmapOptions options);
};
-
Window implements WindowOrWorkerGlobalScope;
WorkerGlobalScope implements WindowOrWorkerGlobalScope;
-[NoInterfaceObject]
-interface WindowModal {
- readonly attribute any dialogArguments;
- attribute any returnValue;
-};
-
interface Navigator {
// objects implementing this interface also implement the interfaces given below
};
@@ -1666,6 +1760,13 @@ interface NavigatorID {
readonly attribute DOMString userAgent;
[Exposed=Window] readonly attribute DOMString vendor;
[Exposed=Window] readonly attribute DOMString vendorSub; // constant ""
+
+ // also has additional members in a partial interface
+};
+
+partial interface NavigatorID {
+ [Exposed=Window] boolean taintEnabled(); // constant false
+ [Exposed=Window] readonly attribute DOMString oscpu;
};
[NoInterfaceObject, Exposed=(Window,Worker)]
@@ -1676,13 +1777,8 @@ interface NavigatorLanguage {
[NoInterfaceObject]
interface NavigatorContentUtils {
- // content handler registration
void registerProtocolHandler(DOMString scheme, USVString url, DOMString title);
- void registerContentHandler(DOMString mimeType, USVString url, DOMString title);
- DOMString isProtocolHandlerRegistered(DOMString scheme, USVString url);
- DOMString isContentHandlerRegistered(DOMString mimeType, USVString url);
void unregisterProtocolHandler(DOMString scheme, USVString url);
- void unregisterContentHandler(DOMString mimeType, USVString url);
};
[NoInterfaceObject]
@@ -1697,6 +1793,7 @@ interface NavigatorPlugins {
boolean javaEnabled();
};
+[LegacyUnenumerableNamedProperties]
interface PluginArray {
void refresh(optional boolean reload = false);
readonly attribute unsigned long length;
@@ -1704,17 +1801,14 @@ interface PluginArray {
getter Plugin? namedItem(DOMString name);
};
-[NoInterfaceObject, Exposed=(Window,Worker)]
-interface NavigatorConcurrentHardware {
- readonly attribute unsigned long long hardwareConcurrency;
-};
-
+[LegacyUnenumerableNamedProperties]
interface MimeTypeArray {
readonly attribute unsigned long length;
getter MimeType? item(unsigned long index);
getter MimeType? namedItem(DOMString name);
};
+[LegacyUnenumerableNamedProperties]
interface Plugin {
readonly attribute DOMString name;
readonly attribute DOMString description;
@@ -1731,24 +1825,21 @@ interface MimeType {
readonly attribute Plugin enabledPlugin;
};
-interface External {
- void AddSearchProvider(DOMString engineURL);
- unsigned long IsSearchProviderInstalled(DOMString engineURL);
-};
-
-[Exposed=(Window,Worker)]
+[Exposed=(Window,Worker), Serializable, Transferable]
interface ImageBitmap {
readonly attribute unsigned long width;
readonly attribute unsigned long height;
+ void close();
};
-typedef (HTMLImageElement or
- HTMLVideoElement or
- HTMLCanvasElement or
+typedef (CanvasImageSource or
Blob or
- ImageData or
- CanvasRenderingContext2D or
- ImageBitmap) ImageBitmapSource;
+ ImageData) ImageBitmapSource;
+
+enum ImageOrientation { "none", "flipY" };
+enum PremultiplyAlpha { "none", "premultiply", "default" };
+enum ColorSpaceConversion { "none", "default" };
+enum ResizeQuality { "pixelated", "low", "medium", "high" };
dictionary ImageBitmapOptions {
ImageOrientation imageOrientation = "none";
@@ -1762,25 +1853,27 @@ dictionary ImageBitmapOptions {
[Constructor(DOMString type, optional MessageEventInit eventInitDict), Exposed=(Window,Worker)]
interface MessageEvent : Event {
readonly attribute any data;
- readonly attribute DOMString origin;
+ readonly attribute USVString origin;
readonly attribute DOMString lastEventId;
- readonly attribute (WindowProxy or MessagePort)? source;
+ readonly attribute MessageEventSource? source;
readonly attribute FrozenArray<MessagePort> ports;
- void initMessageEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false, optional any data = null, optional DOMString origin = "", optional DOMString lastEventId = "", optional (WindowProxy or MessagePort)? source = null, optional sequence<MessagePort> ports = []);
+ void initMessageEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false, optional any data = null, optional USVString origin = "", optional DOMString lastEventId = "", optional MessageEventSource? source = null, optional sequence<MessagePort> ports = []);
};
dictionary MessageEventInit : EventInit {
- any data;
- DOMString origin;
- DOMString lastEventId;
- (WindowProxy or MessagePort)? source;
- sequence<MessagePort> ports;
+ any data = null;
+ USVString origin = "";
+ DOMString lastEventId = "";
+ MessageEventSource? source = null;
+ sequence<MessagePort> ports = [];
};
-[Constructor(DOMString url, optional EventSourceInit eventSourceInitDict), Exposed=(Window,Worker)]
+typedef (WindowProxy or MessagePort or ServiceWorker) MessageEventSource;
+
+[Constructor(USVString url, optional EventSourceInit eventSourceInitDict), Exposed=(Window,Worker)]
interface EventSource : EventTarget {
- readonly attribute DOMString url;
+ readonly attribute USVString url;
readonly attribute boolean withCredentials;
// ready state
@@ -1790,9 +1883,9 @@ interface EventSource : EventTarget {
readonly attribute unsigned short readyState;
// networking
- attribute EventHandler onopen;
- attribute EventHandler onmessage;
- attribute EventHandler onerror;
+ attribute EventHandler onopen;
+ attribute EventHandler onmessage;
+ attribute EventHandler onerror;
void close();
};
@@ -1801,9 +1894,9 @@ dictionary EventSourceInit {
};
enum BinaryType { "blob", "arraybuffer" };
-[Constructor(DOMString url, optional (DOMString or DOMString[]) protocols), Exposed=(Window,Worker)]
+[Constructor(USVString url, optional (DOMString or sequence<DOMString>) protocols = []), Exposed=(Window,Worker)]
interface WebSocket : EventTarget {
- readonly attribute DOMString url;
+ readonly attribute USVString url;
// ready state
const unsigned short CONNECTING = 0;
@@ -1811,7 +1904,7 @@ interface WebSocket : EventTarget {
const unsigned short CLOSING = 2;
const unsigned short CLOSED = 3;
readonly attribute unsigned short readyState;
- readonly attribute unsigned long bufferedAmount;
+ readonly attribute unsigned long long bufferedAmount;
// networking
attribute EventHandler onopen;
@@ -1819,7 +1912,7 @@ interface WebSocket : EventTarget {
attribute EventHandler onclose;
readonly attribute DOMString extensions;
readonly attribute DOMString protocol;
- void close([Clamp] optional unsigned short code, optional USVString reason);
+ void close(optional [Clamp] unsigned short code, optional USVString reason);
// messaging
attribute EventHandler onmessage;
@@ -1834,13 +1927,13 @@ interface WebSocket : EventTarget {
interface CloseEvent : Event {
readonly attribute boolean wasClean;
readonly attribute unsigned short code;
- readonly attribute DOMString reason;
+ readonly attribute USVString reason;
};
dictionary CloseEventInit : EventInit {
- boolean wasClean;
- unsigned short code;
- DOMString reason;
+ boolean wasClean = false;
+ unsigned short code = 0;
+ USVString reason = "";
};
[Constructor, Exposed=(Window,Worker)]
@@ -1876,16 +1969,18 @@ interface WorkerGlobalScope : EventTarget {
readonly attribute WorkerNavigator navigator;
void importScripts(USVString... urls);
- attribute OnErrorEventHandler onerror;
- attribute EventHandler onlanguagechange;
- attribute EventHandler onoffline;
- attribute EventHandler ononline;
-
- // also has additional members in a partial interface
+ attribute OnErrorEventHandler onerror;
+ attribute EventHandler onlanguagechange;
+ attribute EventHandler onoffline;
+ attribute EventHandler ononline;
+ attribute EventHandler onrejectionhandled;
+ attribute EventHandler onunhandledrejection;
};
[Global=(Worker,DedicatedWorker),Exposed=DedicatedWorker]
interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
+ [Replaceable] readonly attribute DOMString name;
+
void postMessage(any message, optional sequence<object> transfer = []);
void close();
@@ -1895,37 +1990,56 @@ interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
};
[Global=(Worker,SharedWorker),Exposed=SharedWorker]
-/*sealed*/ interface SharedWorkerGlobalScope : WorkerGlobalScope {
- readonly attribute DOMString name;
- readonly attribute ApplicationCache applicationCache;
- attribute EventHandler onconnect;
+interface SharedWorkerGlobalScope : WorkerGlobalScope {
+ [Replaceable] readonly attribute DOMString name;
+
+ void close();
+
+ attribute EventHandler onconnect;
};
[NoInterfaceObject, Exposed=(Window,Worker)]
interface AbstractWorker {
- attribute EventHandler onerror;
+ attribute EventHandler onerror;
};
-[Constructor(DOMString scriptURL), Exposed=(Window,Worker)]
+[Constructor(USVString scriptURL, optional WorkerOptions options), Exposed=(Window,Worker)]
interface Worker : EventTarget {
void terminate();
- void postMessage(any message, optional sequence<Transferable> transfer);
- attribute EventHandler onmessage;
+ void postMessage(any message, optional sequence<object> transfer = []);
+ attribute EventHandler onmessage;
+ attribute EventHandler onmessageerror;
};
+
+dictionary WorkerOptions {
+ WorkerType type = "classic";
+ RequestCredentials credentials = "omit"; // credentials is only used if type is "module"
+ DOMString name = "";
+};
+
+enum WorkerType { "classic", "module" };
+
Worker implements AbstractWorker;
-[Constructor(DOMString scriptURL, optional DOMString name), Exposed=(Window,Worker)]
+[Constructor(USVString scriptURL, optional (DOMString or WorkerOptions) options),
+ Exposed=(Window,Worker)]
interface SharedWorker : EventTarget {
readonly attribute MessagePort port;
};
SharedWorker implements AbstractWorker;
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface NavigatorConcurrentHardware {
+ readonly attribute unsigned long long hardwareConcurrency;
+};
+
[Exposed=Worker]
interface WorkerNavigator {};
WorkerNavigator implements NavigatorID;
WorkerNavigator implements NavigatorLanguage;
WorkerNavigator implements NavigatorOnLine;
+WorkerNavigator implements NavigatorConcurrentHardware;
[Exposed=Worker]
interface WorkerLocation {
@@ -1944,7 +2058,7 @@ interface Storage {
readonly attribute unsigned long length;
DOMString? key(unsigned long index);
getter DOMString? getItem(DOMString key);
- setter creator void setItem(DOMString key, DOMString value);
+ setter void setItem(DOMString key, DOMString value);
deleter void removeItem(DOMString key);
void clear();
};
@@ -1966,147 +2080,153 @@ interface StorageEvent : Event {
readonly attribute DOMString? key;
readonly attribute DOMString? oldValue;
readonly attribute DOMString? newValue;
- readonly attribute DOMString url;
+ readonly attribute USVString url;
readonly attribute Storage? storageArea;
};
dictionary StorageEventInit : EventInit {
- DOMString? key;
- DOMString? oldValue;
- DOMString? newValue;
- DOMString url;
- Storage? storageArea;
+ DOMString? key = null;
+ DOMString? oldValue = null;
+ DOMString? newValue = null;
+ USVString url = "";
+ Storage? storageArea = null;
};
+// Note: intentionally not [HTMLConstructor]
interface HTMLAppletElement : HTMLElement {
- attribute DOMString align;
- attribute DOMString alt;
- attribute DOMString archive;
- attribute DOMString code;
- attribute DOMString codeBase;
- attribute DOMString height;
- attribute unsigned long hspace;
- attribute DOMString name;
- attribute DOMString _object; // the underscore is not part of the identifier
- attribute unsigned long vspace;
- attribute DOMString width;
+ attribute DOMString align;
+ attribute DOMString alt;
+ attribute DOMString archive;
+ attribute DOMString code;
+ attribute USVString codeBase;
+ attribute DOMString height;
+ attribute unsigned long hspace;
+ attribute DOMString name;
+ attribute USVString _object; // the underscore is not part of the identifier
+ attribute unsigned long vspace;
+ attribute DOMString width;
};
+[HTMLConstructor]
interface HTMLMarqueeElement : HTMLElement {
- attribute DOMString behavior;
- attribute DOMString bgColor;
- attribute DOMString direction;
- attribute DOMString height;
- attribute unsigned long hspace;
- attribute long loop;
- attribute unsigned long scrollAmount;
- attribute unsigned long scrollDelay;
- attribute boolean trueSpeed;
- attribute unsigned long vspace;
- attribute DOMString width;
-
- attribute EventHandler onbounce;
- attribute EventHandler onfinish;
- attribute EventHandler onstart;
+ [CEReactions] attribute DOMString behavior;
+ [CEReactions] attribute DOMString bgColor;
+ [CEReactions] attribute DOMString direction;
+ [CEReactions] attribute DOMString height;
+ [CEReactions] attribute unsigned long hspace;
+ [CEReactions] attribute long loop;
+ [CEReactions] attribute unsigned long scrollAmount;
+ [CEReactions] attribute unsigned long scrollDelay;
+ [CEReactions] attribute boolean trueSpeed;
+ [CEReactions] attribute unsigned long vspace;
+ [CEReactions] attribute DOMString width;
+
+ attribute EventHandler onbounce;
+ attribute EventHandler onfinish;
+ attribute EventHandler onstart;
void start();
void stop();
};
+[HTMLConstructor]
interface HTMLFrameSetElement : HTMLElement {
- attribute DOMString cols;
- attribute DOMString rows;
+ [CEReactions] attribute DOMString cols;
+ [CEReactions] attribute DOMString rows;
};
HTMLFrameSetElement implements WindowEventHandlers;
+[HTMLConstructor]
interface HTMLFrameElement : HTMLElement {
- attribute DOMString name;
- attribute DOMString scrolling;
- attribute DOMString src;
- attribute DOMString frameBorder;
- attribute DOMString longDesc;
- attribute boolean noResize;
+ [CEReactions] attribute DOMString name;
+ [CEReactions] attribute DOMString scrolling;
+ [CEReactions] attribute USVString src;
+ [CEReactions] attribute DOMString frameBorder;
+ [CEReactions] attribute USVString longDesc;
+ [CEReactions] attribute boolean noResize;
readonly attribute Document? contentDocument;
readonly attribute WindowProxy? contentWindow;
- [TreatNullAs=EmptyString] attribute DOMString marginHeight;
- [TreatNullAs=EmptyString] attribute DOMString marginWidth;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginHeight;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginWidth;
};
partial interface HTMLAnchorElement {
- attribute DOMString coords;
- attribute DOMString charset;
- attribute DOMString name;
- attribute DOMString rev;
- attribute DOMString shape;
+ [CEReactions] attribute DOMString coords;
+ [CEReactions] attribute DOMString charset;
+ [CEReactions] attribute DOMString name;
+ [CEReactions] attribute DOMString rev;
+ [CEReactions] attribute DOMString shape;
};
partial interface HTMLAreaElement {
- attribute boolean noHref;
+ [CEReactions] attribute boolean noHref;
};
partial interface HTMLBodyElement {
- [TreatNullAs=EmptyString] attribute DOMString text;
- [TreatNullAs=EmptyString] attribute DOMString link;
- [TreatNullAs=EmptyString] attribute DOMString vLink;
- [TreatNullAs=EmptyString] attribute DOMString aLink;
- [TreatNullAs=EmptyString] attribute DOMString bgColor;
- attribute DOMString background;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString text;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString link;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString vLink;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString aLink;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor;
+ [CEReactions] attribute DOMString background;
};
partial interface HTMLBRElement {
- attribute DOMString clear;
+ [CEReactions] attribute DOMString clear;
};
partial interface HTMLTableCaptionElement {
- attribute DOMString align;
+ [CEReactions] attribute DOMString align;
};
partial interface HTMLTableColElement {
- attribute DOMString align;
- attribute DOMString ch;
- attribute DOMString chOff;
- attribute DOMString vAlign;
- attribute DOMString width;
+ [CEReactions] attribute DOMString align;
+ [CEReactions] attribute DOMString ch;
+ [CEReactions] attribute DOMString chOff;
+ [CEReactions] attribute DOMString vAlign;
+ [CEReactions] attribute DOMString width;
};
+[HTMLConstructor]
interface HTMLDirectoryElement : HTMLElement {
- attribute boolean compact;
+ [CEReactions] attribute boolean compact;
};
partial interface HTMLDivElement {
- attribute DOMString align;
+ [CEReactions] attribute DOMString align;
};
partial interface HTMLDListElement {
- attribute boolean compact;
+ [CEReactions] attribute boolean compact;
};
partial interface HTMLEmbedElement {
- attribute DOMString align;
- attribute DOMString name;
+ [CEReactions] attribute DOMString align;
+ [CEReactions] attribute DOMString name;
};
+[HTMLConstructor]
interface HTMLFontElement : HTMLElement {
- [TreatNullAs=EmptyString] attribute DOMString color;
- attribute DOMString face;
- attribute DOMString size;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString color;
+ [CEReactions] attribute DOMString face;
+ [CEReactions] attribute DOMString size;
};
partial interface HTMLHeadingElement {
- attribute DOMString align;
+ [CEReactions] attribute DOMString align;
};
partial interface HTMLHRElement {
- attribute DOMString align;
- attribute DOMString color;
- attribute boolean noShade;
- attribute DOMString size;
- attribute DOMString width;
+ [CEReactions] attribute DOMString align;
+ [CEReactions] attribute DOMString color;
+ [CEReactions] attribute boolean noShade;
+ [CEReactions] attribute DOMString size;
+ [CEReactions] attribute DOMString width;
};
partial interface HTMLHtmlElement {
- attribute DOMString version;
+ [CEReactions] attribute DOMString version;
};
partial interface HTMLIFrameElement {
@@ -2115,8 +2235,8 @@ partial interface HTMLIFrameElement {
[CEReactions] attribute DOMString frameBorder;
[CEReactions] attribute USVString longDesc;
- [CEReactions, TreatNullAs=EmptyString] attribute DOMString marginHeight;
- [CEReactions, TreatNullAs=EmptyString] attribute DOMString marginWidth;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginHeight;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString marginWidth;
};
partial interface HTMLImageElement {
@@ -2127,20 +2247,20 @@ partial interface HTMLImageElement {
[CEReactions] attribute unsigned long vspace;
[CEReactions] attribute USVString longDesc;
- [CEReactions, TreatNullAs=EmptyString] attribute DOMString border;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString border;
};
partial interface HTMLInputElement {
- attribute DOMString align;
- attribute DOMString useMap;
+ [CEReactions] attribute DOMString align;
+ [CEReactions] attribute DOMString useMap;
};
partial interface HTMLLegendElement {
- attribute DOMString align;
+ [CEReactions] attribute DOMString align;
};
partial interface HTMLLIElement {
- attribute DOMString type;
+ [CEReactions] attribute DOMString type;
};
partial interface HTMLLinkElement {
@@ -2150,115 +2270,123 @@ partial interface HTMLLinkElement {
};
partial interface HTMLMenuElement {
- attribute boolean compact;
+ [CEReactions] attribute boolean compact;
};
partial interface HTMLMetaElement {
- attribute DOMString scheme;
+ [CEReactions] attribute DOMString scheme;
};
partial interface HTMLObjectElement {
- attribute DOMString align;
- attribute DOMString archive;
- attribute DOMString code;
- attribute boolean declare;
- attribute unsigned long hspace;
- attribute DOMString standby;
- attribute unsigned long vspace;
- attribute DOMString codeBase;
- attribute DOMString codeType;
+ [CEReactions] attribute DOMString align;
+ [CEReactions] attribute DOMString archive;
+ [CEReactions] attribute DOMString code;
+ [CEReactions] attribute boolean declare;
+ [CEReactions] attribute unsigned long hspace;
+ [CEReactions] attribute DOMString standby;
+ [CEReactions] attribute unsigned long vspace;
+ [CEReactions] attribute DOMString codeBase;
+ [CEReactions] attribute DOMString codeType;
- [TreatNullAs=EmptyString] attribute DOMString border;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString border;
};
partial interface HTMLOListElement {
- attribute boolean compact;
+ [CEReactions] attribute boolean compact;
};
partial interface HTMLParagraphElement {
- attribute DOMString align;
+ [CEReactions] attribute DOMString align;
};
partial interface HTMLParamElement {
- attribute DOMString type;
- attribute DOMString valueType;
+ [CEReactions] attribute DOMString type;
+ [CEReactions] attribute DOMString valueType;
};
partial interface HTMLPreElement {
- attribute long width;
+ [CEReactions] attribute long width;
};
partial interface HTMLScriptElement {
- attribute DOMString event;
- attribute DOMString htmlFor;
+ [CEReactions] attribute DOMString event;
+ [CEReactions] attribute DOMString htmlFor;
};
partial interface HTMLTableElement {
- attribute DOMString align;
- attribute DOMString border;
- attribute DOMString frame;
- attribute DOMString rules;
- attribute DOMString summary;
- attribute DOMString width;
+ [CEReactions] attribute DOMString align;
+ [CEReactions] attribute DOMString border;
+ [CEReactions] attribute DOMString frame;
+ [CEReactions] attribute DOMString rules;
+ [CEReactions] attribute DOMString summary;
+ [CEReactions] attribute DOMString width;
- [TreatNullAs=EmptyString] attribute DOMString bgColor;
- [TreatNullAs=EmptyString] attribute DOMString cellPadding;
- [TreatNullAs=EmptyString] attribute DOMString cellSpacing;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString cellPadding;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString cellSpacing;
};
partial interface HTMLTableSectionElement {
- attribute DOMString align;
- attribute DOMString ch;
- attribute DOMString chOff;
- attribute DOMString vAlign;
+ [CEReactions] attribute DOMString align;
+ [CEReactions] attribute DOMString ch;
+ [CEReactions] attribute DOMString chOff;
+ [CEReactions] attribute DOMString vAlign;
};
partial interface HTMLTableCellElement {
- attribute DOMString align;
- attribute DOMString axis;
- attribute DOMString height;
- attribute DOMString width;
+ [CEReactions] attribute DOMString align;
+ [CEReactions] attribute DOMString axis;
+ [CEReactions] attribute DOMString height;
+ [CEReactions] attribute DOMString width;
- attribute DOMString ch;
- attribute DOMString chOff;
- attribute boolean noWrap;
- attribute DOMString vAlign;
+ [CEReactions] attribute DOMString ch;
+ [CEReactions] attribute DOMString chOff;
+ [CEReactions] attribute boolean noWrap;
+ [CEReactions] attribute DOMString vAlign;
- [TreatNullAs=EmptyString] attribute DOMString bgColor;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor;
};
partial interface HTMLTableRowElement {
- attribute DOMString align;
- attribute DOMString ch;
- attribute DOMString chOff;
- attribute DOMString vAlign;
+ [CEReactions] attribute DOMString align;
+ [CEReactions] attribute DOMString ch;
+ [CEReactions] attribute DOMString chOff;
+ [CEReactions] attribute DOMString vAlign;
- [TreatNullAs=EmptyString] attribute DOMString bgColor;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor;
};
partial interface HTMLUListElement {
- attribute boolean compact;
- attribute DOMString type;
+ [CEReactions] attribute boolean compact;
+ [CEReactions] attribute DOMString type;
};
partial interface Document {
- [TreatNullAs=EmptyString] attribute DOMString fgColor;
- [TreatNullAs=EmptyString] attribute DOMString linkColor;
- [TreatNullAs=EmptyString] attribute DOMString vlinkColor;
- [TreatNullAs=EmptyString] attribute DOMString alinkColor;
- [TreatNullAs=EmptyString] attribute DOMString bgColor;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString fgColor;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString linkColor;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString vlinkColor;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString alinkColor;
+ [CEReactions] attribute [TreatNullAs=EmptyString] DOMString bgColor;
- readonly attribute HTMLCollection anchors;
- readonly attribute HTMLCollection applets;
+ [SameObject] readonly attribute HTMLCollection anchors;
+ [SameObject] readonly attribute HTMLCollection applets;
void clear();
void captureEvents();
void releaseEvents();
- readonly attribute HTMLAllCollection all;
+ [SameObject] readonly attribute HTMLAllCollection all;
};
partial interface Window {
void captureEvents();
void releaseEvents();
+
+ [Replaceable, SameObject] readonly attribute External external;
+};
+
+[NoInterfaceObject]
+interface External {
+ void AddSearchProvider();
+ void IsSearchProviderInstalled();
};
diff --git a/tests/wpt/web-platform-tests/interfaces/payment-handler.idl b/tests/wpt/web-platform-tests/interfaces/payment-handler.idl
new file mode 100644
index 00000000000..88d3b1ce696
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/payment-handler.idl
@@ -0,0 +1,55 @@
+[SecureContext,
+ Exposed=(Window,Worker)]
+interface PaymentManager {
+ [SameObject]
+ readonly attribute PaymentInstruments instruments;
+ [Exposed=Window] static Promise<PermissionState> requestPermission();
+};
+[SecureContext,
+ Exposed=(Window,Worker)]
+interface PaymentInstruments {
+ Promise<boolean> delete(DOMString instrumentKey);
+ Promise<PaymentInstrument> get(DOMString instrumentKey);
+ Promise<sequence<DOMString>> keys();
+ Promise<boolean> has(DOMString instrumentKey);
+ Promise<void> set(DOMString instrumentKey,
+ PaymentInstrument details);
+ Promise<void> clear();
+};
+dictionary PaymentInstrument {
+ required DOMString name;
+ sequence<ImageObject> icons;
+ sequence<DOMString> enabledMethods;
+ object capabilities;
+};
+dictionary ImageObject {
+ required USVString src;
+ DOMString sizes;
+ DOMString type;
+};
+[Constructor(DOMString type, PaymentRequestEventInit eventInitDict),
+ Exposed=ServiceWorker]
+interface PaymentRequestEvent : ExtendableEvent {
+ readonly attribute USVString topLevelOrigin;
+ readonly attribute USVString paymentRequestOrigin;
+ readonly attribute DOMString paymentRequestId;
+ readonly attribute FrozenArray<PaymentMethodData> methodData;
+ readonly attribute object total;
+ readonly attribute FrozenArray<PaymentDetailsModifier> modifiers;
+ readonly attribute DOMString instrumentKey;
+ Promise<WindowClient?> openWindow(USVString url);
+ void respondWith(Promise<PaymentHandlerResponse> handlerResponse);
+};
+dictionary PaymentRequestEventInit : ExtendableEventInit {
+ USVString topLevelOrigin;
+ USVString paymentRequestOrigin;
+ DOMString paymentRequestId;
+ sequence<PaymentMethodData> methodData;
+ PaymentCurrencyAmount total;
+ sequence<PaymentDetailsModifier> modifiers;
+ DOMString instrumentKey;
+};
+dictionary PaymentHandlerResponse {
+ DOMString methodName;
+ object details;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/payment-request.idl b/tests/wpt/web-platform-tests/interfaces/payment-request.idl
new file mode 100644
index 00000000000..beb6d5ff740
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/payment-request.idl
@@ -0,0 +1,114 @@
+[Constructor(sequence<PaymentMethodData> methodData, PaymentDetailsInit details, optional PaymentOptions options),
+ SecureContext,
+ Exposed=Window]
+interface PaymentRequest : EventTarget {
+ Promise<PaymentResponse> show();
+ Promise<void> abort();
+ Promise<boolean> canMakePayment();
+
+ readonly attribute DOMString id;
+ readonly attribute PaymentAddress? shippingAddress;
+ readonly attribute DOMString? shippingOption;
+ readonly attribute PaymentShippingType? shippingType;
+
+ attribute EventHandler onshippingaddresschange;
+
+ attribute EventHandler onshippingoptionchange;
+};
+dictionary PaymentMethodData {
+ required DOMString supportedMethods;
+ object data;
+};
+dictionary PaymentCurrencyAmount {
+ required DOMString currency;
+ required DOMString value;
+ // Note: currencySystem is "at risk" of being removed!
+ DOMString currencySystem = "urn:iso:std:iso:4217";
+};
+dictionary PaymentDetailsBase {
+ sequence<PaymentItem> displayItems;
+ sequence<PaymentShippingOption> shippingOptions;
+ sequence<PaymentDetailsModifier> modifiers;
+};
+dictionary PaymentDetailsInit : PaymentDetailsBase {
+ DOMString id;
+ required PaymentItem total;
+};
+dictionary PaymentDetailsUpdate : PaymentDetailsBase {
+ DOMString error;
+ PaymentItem total;
+};
+dictionary PaymentDetailsModifier {
+ required DOMString supportedMethods;
+ PaymentItem total;
+ sequence<PaymentItem> additionalDisplayItems;
+ object data;
+};
+enum PaymentShippingType {
+ "shipping",
+ "delivery",
+ "pickup"
+};
+dictionary PaymentOptions {
+ boolean requestPayerName = false;
+ boolean requestPayerEmail = false;
+ boolean requestPayerPhone = false;
+ boolean requestShipping = false;
+ PaymentShippingType shippingType = "shipping";
+};
+dictionary PaymentItem {
+ required DOMString label;
+ required PaymentCurrencyAmount amount;
+ boolean pending = false;
+};
+[SecureContext,
+ Exposed=Window]
+interface PaymentAddress {
+ [Default] object toJSON();
+ readonly attribute DOMString country;
+ readonly attribute FrozenArray<DOMString> addressLine;
+ readonly attribute DOMString region;
+ readonly attribute DOMString city;
+ readonly attribute DOMString dependentLocality;
+ readonly attribute DOMString postalCode;
+ readonly attribute DOMString sortingCode;
+ readonly attribute DOMString languageCode;
+ readonly attribute DOMString organization;
+ readonly attribute DOMString recipient;
+ readonly attribute DOMString phone;
+};
+dictionary PaymentShippingOption {
+ required DOMString id;
+ required DOMString label;
+ required PaymentCurrencyAmount amount;
+ boolean selected = false;
+};
+enum PaymentComplete {
+ "fail",
+ "success",
+ "unknown"
+};
+[SecureContext,
+ Exposed=Window]
+interface PaymentResponse {
+ [Default] object toJSON();
+
+ readonly attribute DOMString requestId;
+ readonly attribute DOMString methodName;
+ readonly attribute object details;
+ readonly attribute PaymentAddress? shippingAddress;
+ readonly attribute DOMString? shippingOption;
+ readonly attribute DOMString? payerName;
+ readonly attribute DOMString? payerEmail;
+ readonly attribute DOMString? payerPhone;
+
+ Promise<void> complete(optional PaymentComplete result = "unknown");
+};
+[Constructor(DOMString type, optional PaymentRequestUpdateEventInit eventInitDict),
+ SecureContext,
+ Exposed=Window]
+interface PaymentRequestUpdateEvent : Event {
+ void updateWith(Promise<PaymentDetailsUpdate> detailsPromise);
+};
+dictionary PaymentRequestUpdateEventInit : EventInit {
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/remoteplayback.idl b/tests/wpt/web-platform-tests/interfaces/remoteplayback.idl
index 598bf30b165..5cd9ba1a8a8 100644
--- a/tests/wpt/web-platform-tests/interfaces/remoteplayback.idl
+++ b/tests/wpt/web-platform-tests/interfaces/remoteplayback.idl
@@ -1,23 +1,29 @@
+[Exposed=Window]
+interface RemotePlayback : EventTarget {
+ Promise<long> watchAvailability(RemotePlaybackAvailabilityCallback callback);
+ Promise<void> cancelWatchAvailability(optional long id);
+
+ readonly attribute RemotePlaybackState state;
+
+ attribute EventHandler onconnecting;
+ attribute EventHandler onconnect;
+ attribute EventHandler ondisconnect;
+
+ Promise<void> prompt();
+};
+
enum RemotePlaybackState {
"connecting",
"connected",
"disconnected"
};
-callback RemotePlaybackAvailabilityCallback = void(boolean available);
-
-interface RemotePlayback : EventTarget {
- readonly attribute RemotePlaybackState state;
- attribute EventHandler onconnecting;
- attribute EventHandler onconnect;
- attribute EventHandler ondisconnect;
-
- Promise<long> watchAvailability(RemotePlaybackAvailabilityCallback callback);
- Promise<void> cancelWatchAvailability(optional long id);
- Promise<void> prompt();
-};
+callback RemotePlaybackAvailabilityCallback = void (boolean available);
partial interface HTMLMediaElement {
+ [SameObject]
readonly attribute RemotePlayback remote;
- attribute boolean disableRemotePlayback;
+
+ [CEReactions]
+ attribute boolean disableRemotePlayback;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/uievents.idl b/tests/wpt/web-platform-tests/interfaces/uievents.idl
index bac832ba436..5964ee8969a 100644
--- a/tests/wpt/web-platform-tests/interfaces/uievents.idl
+++ b/tests/wpt/web-platform-tests/interfaces/uievents.idl
@@ -1,60 +1,151 @@
[Constructor(DOMString type, optional UIEventInit eventInitDict)]
interface UIEvent : Event {
- readonly attribute WindowProxy? view;
- readonly attribute long detail;
+ readonly attribute Window? view;
+ readonly attribute long detail;
};
dictionary UIEventInit : EventInit {
- WindowProxy? view = null;
- long detail = 0;
+ Window? view = null;
+ long detail = 0;
};
-[Constructor(DOMString typeArg, optional MouseEventInit mouseEventInitDict)]
+[Constructor(DOMString type, optional FocusEventInit eventInitDict)]
+interface FocusEvent : UIEvent {
+ readonly attribute EventTarget? relatedTarget;
+};
+
+dictionary FocusEventInit : UIEventInit {
+ EventTarget? relatedTarget = null;
+};
+
+[Constructor(DOMString type, optional MouseEventInit eventInitDict)]
interface MouseEvent : UIEvent {
- readonly attribute long screenX;
- readonly attribute long screenY;
- readonly attribute long clientX;
- readonly attribute long clientY;
- readonly attribute boolean ctrlKey;
- readonly attribute boolean shiftKey;
- readonly attribute boolean altKey;
- readonly attribute boolean metaKey;
- readonly attribute short button;
- readonly attribute EventTarget? relatedTarget;
- // Introduced in DOM Level 3
- readonly attribute unsigned short buttons;
- boolean getModifierState (DOMString keyArg);
+ readonly attribute long screenX;
+ readonly attribute long screenY;
+ readonly attribute long clientX;
+ readonly attribute long clientY;
+
+ readonly attribute boolean ctrlKey;
+ readonly attribute boolean shiftKey;
+ readonly attribute boolean altKey;
+ readonly attribute boolean metaKey;
+
+ readonly attribute short button;
+ readonly attribute unsigned short buttons;
+
+ readonly attribute EventTarget? relatedTarget;
+
+ boolean getModifierState(DOMString keyArg);
};
dictionary MouseEventInit : EventModifierInit {
- long screenX = 0;
- long screenY = 0;
- long clientX = 0;
- long clientY = 0;
- short button = 0;
- unsigned short buttons = 0;
- EventTarget? relatedTarget = null;
+ long screenX = 0;
+ long screenY = 0;
+ long clientX = 0;
+ long clientY = 0;
+
+ short button = 0;
+ unsigned short buttons = 0;
+ EventTarget? relatedTarget = null;
};
dictionary EventModifierInit : UIEventInit {
- boolean ctrlKey = false;
- boolean shiftKey = false;
- boolean altKey = false;
- boolean metaKey = false;
- boolean keyModifierStateAltGraph = false;
- boolean keyModifierStateCapsLock = false;
- boolean keyModifierStateFn = false;
- boolean keyModifierStateFnLock = false;
- boolean keyModifierStateHyper = false;
- boolean keyModifierStateNumLock = false;
- boolean keyModifierStateOS = false;
- boolean keyModifierStateScrollLock = false;
- boolean keyModifierStateSuper = false;
- boolean keyModifierStateSymbol = false;
- boolean keyModifierStateSymbolLock = false;
-};
-
-partial interface MouseEvent {
- // Deprecated in DOM Level 3
- void initMouseEvent (DOMString typeArg, boolean bubblesArg, boolean cancelableArg, Window? viewArg, long detailArg, long screenXArg, long screenYArg, long clientXArg, long clientYArg, boolean ctrlKeyArg, boolean altKeyArg, boolean shiftKeyArg, boolean metaKeyArg, short buttonArg, EventTarget? relatedTargetArg);
+ boolean ctrlKey = false;
+ boolean shiftKey = false;
+ boolean altKey = false;
+ boolean metaKey = false;
+
+ boolean modifierAltGraph = false;
+ boolean modifierCapsLock = false;
+ boolean modifierFn = false;
+ boolean modifierFnLock = false;
+ boolean modifierHyper = false;
+ boolean modifierNumLock = false;
+ boolean modifierScrollLock = false;
+ boolean modifierSuper = false;
+ boolean modifierSymbol = false;
+ boolean modifierSymbolLock = false;
+};
+
+[Constructor(DOMString type, optional WheelEventInit eventInitDict)]
+interface WheelEvent : MouseEvent {
+ // DeltaModeCode
+ const unsigned long DOM_DELTA_PIXEL = 0x00;
+ const unsigned long DOM_DELTA_LINE = 0x01;
+ const unsigned long DOM_DELTA_PAGE = 0x02;
+
+ readonly attribute double deltaX;
+ readonly attribute double deltaY;
+ readonly attribute double deltaZ;
+ readonly attribute unsigned long deltaMode;
+};
+
+dictionary WheelEventInit : MouseEventInit {
+ double deltaX = 0.0;
+ double deltaY = 0.0;
+ double deltaZ = 0.0;
+ unsigned long deltaMode = 0;
+};
+
+[Constructor(DOMString type, optional InputEventInit eventInitDict)]
+interface InputEvent : UIEvent {
+ readonly attribute DOMString? data;
+ readonly attribute boolean isComposing;
+};
+
+
+dictionary InputEventInit : UIEventInit {
+ DOMString? data = "";
+ boolean isComposing = false;
+};
+
+[Constructor(DOMString type, optional KeyboardEventInit eventInitDict)]
+interface KeyboardEvent : UIEvent {
+ // KeyLocationCode
+ const unsigned long DOM_KEY_LOCATION_STANDARD = 0x00;
+ const unsigned long DOM_KEY_LOCATION_LEFT = 0x01;
+ const unsigned long DOM_KEY_LOCATION_RIGHT = 0x02;
+ const unsigned long DOM_KEY_LOCATION_NUMPAD = 0x03;
+
+ readonly attribute DOMString key;
+ readonly attribute DOMString code;
+ readonly attribute unsigned long location;
+
+ readonly attribute boolean ctrlKey;
+ readonly attribute boolean shiftKey;
+ readonly attribute boolean altKey;
+ readonly attribute boolean metaKey;
+
+ readonly attribute boolean repeat;
+ readonly attribute boolean isComposing;
+
+ boolean getModifierState(DOMString keyArg);
+};
+
+dictionary KeyboardEventInit : EventModifierInit {
+ DOMString key = "";
+ DOMString code = "";
+ unsigned long location = 0;
+ boolean repeat = false;
+ boolean isComposing = false;
+};
+
+[Constructor(DOMString type, optional CompositionEventInit eventInitDict)]
+interface CompositionEvent : UIEvent {
+ readonly attribute DOMString data;
+};
+
+dictionary CompositionEventInit : UIEventInit {
+ DOMString data = "";
+};
+
+partial interface UIEvent {
+ // The following support legacy user agents
+ readonly attribute unsigned long which;
+};
+
+partial interface KeyboardEvent {
+ // The following support legacy user agents
+ readonly attribute unsigned long charCode;
+ readonly attribute unsigned long keyCode;
};
diff --git a/tests/wpt/web-platform-tests/interfaces/web-share.idl b/tests/wpt/web-platform-tests/interfaces/web-share.idl
new file mode 100644
index 00000000000..cf19b7e9e76
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/web-share.idl
@@ -0,0 +1,12 @@
+// https://wicg.github.io/web-share/
+
+partial interface Navigator {
+ [SecureContext]
+ Promise<void> share(optional ShareData data);
+};
+
+dictionary ShareData {
+ USVString title;
+ USVString text;
+ USVString url;
+};
diff --git a/tests/wpt/web-platform-tests/interfaces/webidl.idl b/tests/wpt/web-platform-tests/interfaces/webidl.idl
new file mode 100644
index 00000000000..8eb1d06263b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/webidl.idl
@@ -0,0 +1,44 @@
+typedef (Int8Array or Int16Array or Int32Array or
+ Uint8Array or Uint16Array or Uint32Array or Uint8ClampedArray or
+ Float32Array or Float64Array or DataView) ArrayBufferView;
+
+typedef (ArrayBufferView or ArrayBuffer) BufferSource;
+
+[
+ Exposed=(Window,Worker),
+ Constructor(optional DOMString message = "", optional DOMString name = "Error")]
+interface DOMException { // but see below note about ECMAScript binding
+ readonly attribute DOMString name;
+ readonly attribute DOMString message;
+ readonly attribute unsigned short code;
+
+ const unsigned short INDEX_SIZE_ERR = 1;
+ const unsigned short DOMSTRING_SIZE_ERR = 2;
+ const unsigned short HIERARCHY_REQUEST_ERR = 3;
+ const unsigned short WRONG_DOCUMENT_ERR = 4;
+ const unsigned short INVALID_CHARACTER_ERR = 5;
+ const unsigned short NO_DATA_ALLOWED_ERR = 6;
+ const unsigned short NO_MODIFICATION_ALLOWED_ERR = 7;
+ const unsigned short NOT_FOUND_ERR = 8;
+ const unsigned short NOT_SUPPORTED_ERR = 9;
+ const unsigned short INUSE_ATTRIBUTE_ERR = 10;
+ const unsigned short INVALID_STATE_ERR = 11;
+ const unsigned short SYNTAX_ERR = 12;
+ const unsigned short INVALID_MODIFICATION_ERR = 13;
+ const unsigned short NAMESPACE_ERR = 14;
+ const unsigned short INVALID_ACCESS_ERR = 15;
+ const unsigned short VALIDATION_ERR = 16;
+ const unsigned short TYPE_MISMATCH_ERR = 17;
+ const unsigned short SECURITY_ERR = 18;
+ const unsigned short NETWORK_ERR = 19;
+ const unsigned short ABORT_ERR = 20;
+ const unsigned short URL_MISMATCH_ERR = 21;
+ const unsigned short QUOTA_EXCEEDED_ERR = 22;
+ const unsigned short TIMEOUT_ERR = 23;
+ const unsigned short INVALID_NODE_TYPE_ERR = 24;
+ const unsigned short DATA_CLONE_ERR = 25;
+};
+
+typedef unsigned long long DOMTimeStamp;
+callback Function = any (any... arguments);
+callback VoidFunction = void ();
diff --git a/tests/wpt/web-platform-tests/interfaces/webrtc-pc.idl b/tests/wpt/web-platform-tests/interfaces/webrtc-pc.idl
index 133524a6cdf..944e6300fea 100644
--- a/tests/wpt/web-platform-tests/interfaces/webrtc-pc.idl
+++ b/tests/wpt/web-platform-tests/interfaces/webrtc-pc.idl
@@ -1,3 +1,6 @@
+// IDL definition extracted from
+// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
dictionary RTCConfiguration {
sequence<RTCIceServer> iceServers;
RTCIceTransportPolicy iceTransportPolicy = "all";
@@ -11,13 +14,18 @@ dictionary RTCConfiguration {
enum RTCIceCredentialType {
"password",
- "token"
+ "oauth"
+};
+
+dictionary RTCOAuthCredential {
+ required DOMString macKey;
+ required DOMString accessToken;
};
dictionary RTCIceServer {
required (DOMString or sequence<DOMString>) urls;
DOMString username;
- DOMString credential;
+ (DOMString or RTCOAuthCredential) credential;
RTCIceCredentialType credentialType = "password";
};
@@ -56,31 +64,31 @@ interface RTCPeerConnection : EventTarget {
Promise<RTCSessionDescriptionInit> createOffer(optional RTCOfferOptions options);
Promise<RTCSessionDescriptionInit> createAnswer(optional RTCAnswerOptions options);
Promise<void> setLocalDescription(RTCSessionDescriptionInit description);
- readonly attribute RTCSessionDescription? localDescription;
- readonly attribute RTCSessionDescription? currentLocalDescription;
- readonly attribute RTCSessionDescription? pendingLocalDescription;
+ readonly attribute RTCSessionDescription? localDescription;
+ readonly attribute RTCSessionDescription? currentLocalDescription;
+ readonly attribute RTCSessionDescription? pendingLocalDescription;
Promise<void> setRemoteDescription(RTCSessionDescriptionInit description);
- readonly attribute RTCSessionDescription? remoteDescription;
- readonly attribute RTCSessionDescription? currentRemoteDescription;
- readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
Promise<void> addIceCandidate((RTCIceCandidateInit or RTCIceCandidate) candidate);
- readonly attribute RTCSignalingState signalingState;
- readonly attribute RTCIceGatheringState iceGatheringState;
- readonly attribute RTCIceConnectionState iceConnectionState;
- readonly attribute RTCPeerConnectionState connectionState;
- readonly attribute boolean? canTrickleIceCandidates;
- static readonly attribute FrozenArray<RTCIceServer> defaultIceServers;
+ readonly attribute RTCSignalingState signalingState;
+ readonly attribute RTCIceGatheringState iceGatheringState;
+ readonly attribute RTCIceConnectionState iceConnectionState;
+ readonly attribute RTCPeerConnectionState connectionState;
+ readonly attribute boolean? canTrickleIceCandidates;
+ static sequence<RTCIceServer> getDefaultIceServers();
RTCConfiguration getConfiguration();
void setConfiguration(RTCConfiguration configuration);
void close();
- attribute EventHandler onnegotiationneeded;
- attribute EventHandler onicecandidate;
- attribute EventHandler onicecandidateerror;
- attribute EventHandler onsignalingstatechange;
- attribute EventHandler oniceconnectionstatechange;
- attribute EventHandler onicegatheringstatechange;
- attribute EventHandler onconnectionstatechange;
- attribute EventHandler onfingerprintfailure;
+ attribute EventHandler onnegotiationneeded;
+ attribute EventHandler onicecandidate;
+ attribute EventHandler onicecandidateerror;
+ attribute EventHandler onsignalingstatechange;
+ attribute EventHandler oniceconnectionstatechange;
+ attribute EventHandler onicegatheringstatechange;
+ attribute EventHandler onconnectionstatechange;
+ attribute EventHandler onfingerprintfailure;
};
partial interface RTCPeerConnection {
@@ -100,12 +108,17 @@ partial interface RTCPeerConnection {
RTCPeerConnectionErrorCallback failureCallback);
};
+callback RTCPeerConnectionErrorCallback = void (DOMException error);
+
+callback RTCSessionDescriptionCallback = void (RTCSessionDescriptionInit description);
+
enum RTCSignalingState {
"stable",
"have-local-offer",
"have-remote-offer",
"have-local-pranswer",
- "have-remote-pranswer"
+ "have-remote-pranswer",
+ "closed"
};
enum RTCIceGatheringState {
@@ -133,12 +146,6 @@ enum RTCIceConnectionState {
"closed"
};
-callback RTCPeerConnectionErrorCallback = void (DOMException error);
-
-callback RTCSessionDescriptionCallback = void (RTCSessionDescriptionInit description);
-
-callback RTCStatsCallback = void (RTCStatsReport report);
-
enum RTCSdpType {
"offer",
"pranswer",
@@ -158,12 +165,13 @@ dictionary RTCSessionDescriptionInit {
DOMString sdp = "";
};
-[Constructor(RTCIceCandidateInit candidateInitDict)]
+[Constructor(optional RTCIceCandidateInit candidateInitDict)]
interface RTCIceCandidate {
readonly attribute DOMString candidate;
readonly attribute DOMString? sdpMid;
readonly attribute unsigned short? sdpMLineIndex;
readonly attribute DOMString? foundation;
+ readonly attribute RTCIceComponent? component;
readonly attribute unsigned long? priority;
readonly attribute DOMString? ip;
readonly attribute RTCIceProtocol? protocol;
@@ -244,9 +252,10 @@ dictionary RTCCertificateExpiration {
};
interface RTCCertificate {
- readonly attribute DOMTimeStamp expires;
- readonly attribute FrozenArray<RTCDtlsFingerprint> fingerprints;
- AlgorithmIdentifier getAlgorithm();
+ readonly attribute DOMTimeStamp expires;
+ sequence<RTCDtlsFingerprint> getFingerprints();
+ // At risk due to lack of implementers' interest.
+ AlgorithmIdentifier getAlgorithm();
};
partial interface RTCPeerConnection {
@@ -278,10 +287,12 @@ interface RTCRtpSender {
readonly attribute MediaStreamTrack? track;
readonly attribute RTCDtlsTransport? transport;
readonly attribute RTCDtlsTransport? rtcpTransport;
+ // Feature at risk
static RTCRtpCapabilities getCapabilities(DOMString kind);
- Promise<void> setParameters(optional RTCRtpParameters parameters);
- RTCRtpParameters getParameters();
- Promise<void> replaceTrack(MediaStreamTrack withTrack);
+ Promise<void> setParameters(optional RTCRtpParameters parameters);
+ RTCRtpParameters getParameters();
+ Promise<void> replaceTrack(MediaStreamTrack withTrack);
+ Promise<RTCStatsReport> getStats();
};
dictionary RTCRtpParameters {
@@ -290,7 +301,7 @@ dictionary RTCRtpParameters {
sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
RTCRtcpParameters rtcp;
sequence<RTCRtpCodecParameters> codecs;
- RTCDegradationPreference degradationPreference = "balanced";
+ RTCDegradationPreference degradationPreference;
};
dictionary RTCRtpEncodingParameters {
@@ -300,10 +311,11 @@ dictionary RTCRtpEncodingParameters {
RTCDtxStatus dtx;
boolean active;
RTCPriorityType priority;
+ unsigned long ptime;
unsigned long maxBitrate;
- unsigned long maxFramerate;
+ double maxFramerate;
DOMString rid;
- double scaleResolutionDownBy = 1;
+ double scaleResolutionDownBy;
};
enum RTCDtxStatus {
@@ -340,7 +352,7 @@ dictionary RTCRtpCodecParameters {
unsigned short payloadType;
DOMString mimeType;
unsigned long clockRate;
- unsigned short channels = 1;
+ unsigned short channels;
DOMString sdpFmtpLine;
};
@@ -352,7 +364,7 @@ dictionary RTCRtpCapabilities {
dictionary RTCRtpCodecCapability {
DOMString mimeType;
unsigned long clockRate;
- unsigned short channels = 1;
+ unsigned short channels;
DOMString sdpFmtpLine;
};
@@ -364,15 +376,24 @@ interface RTCRtpReceiver {
readonly attribute MediaStreamTrack track;
readonly attribute RTCDtlsTransport? transport;
readonly attribute RTCDtlsTransport? rtcpTransport;
- static RTCRtpCapabilities getCapabilities(DOMString kind);
- RTCRtpParameters getParameters();
- sequence<RTCRtpContributingSource> getContributingSources();
+ // Feature at risk
+ static RTCRtpCapabilities getCapabilities(DOMString kind);
+ RTCRtpParameters getParameters();
+ sequence<RTCRtpContributingSource> getContributingSources();
+ sequence<RTCRtpSynchronizationSource> getSynchronizationSources();
+ Promise<RTCStatsReport> getStats();
};
interface RTCRtpContributingSource {
readonly attribute DOMHighResTimeStamp timestamp;
readonly attribute unsigned long source;
readonly attribute byte? audioLevel;
+};
+
+interface RTCRtpSynchronizationSource {
+ readonly attribute DOMHighResTimeStamp timestamp;
+ readonly attribute unsigned long source;
+ readonly attribute byte audioLevel;
readonly attribute boolean? voiceActivityFlag;
};
@@ -465,6 +486,7 @@ enum RTCIceComponent {
interface RTCTrackEvent : Event {
readonly attribute RTCRtpReceiver receiver;
readonly attribute MediaStreamTrack track;
+ [SameObject]
readonly attribute FrozenArray<MediaStream> streams;
readonly attribute RTCRtpTransceiver transceiver;
};
@@ -478,7 +500,7 @@ dictionary RTCTrackEventInit : EventInit {
partial interface RTCPeerConnection {
readonly attribute RTCSctpTransport? sctp;
- RTCDataChannel createDataChannel([TreatNullAs=EmptyString] USVString label,
+ RTCDataChannel createDataChannel(USVString label,
optional RTCDataChannelInit dataChannelDict);
attribute EventHandler ondatachannel;
};
@@ -575,9 +597,6 @@ dictionary RTCStats {
DOMString id;
};
-enum RTCStatsType {
-};
-
[Global,
Exposed=RTCIdentityProviderGlobalScope]
interface RTCIdentityProviderGlobalScope : WorkerGlobalScope {
@@ -646,6 +665,20 @@ partial interface MediaStreamTrack {
attribute EventHandler onisolationchange;
};
+enum RTCErrorDetailType {
+ "data-channel-failure",
+ "idp-bad-script-failure",
+ "idp-execution-failure",
+ "idp-load-failure",
+ "idp-need-login",
+ "idp-timeout",
+ "idp-tls-failure",
+ "idp-token-expired",
+ "idp-token-invalid",
+ "sctp-failure",
+ "sdp-syntax-error"
+};
+
[Exposed=Window,
Constructor(DOMString type, RTCErrorEventInit eventInitDict)]
interface RTCErrorEvent : Event {
diff --git a/tests/wpt/web-platform-tests/interfaces/webusb.idl b/tests/wpt/web-platform-tests/interfaces/webusb.idl
new file mode 100644
index 00000000000..bad8383c5ec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/interfaces/webusb.idl
@@ -0,0 +1,176 @@
+// Copied from https://wicg.github.io/webusb/#idl-index minus the
+// definitions related to Permissions API integration which is unstable.
+
+dictionary USBDeviceFilter {
+ unsigned short vendorId;
+ unsigned short productId;
+ octet classCode;
+ octet subclassCode;
+ octet protocolCode;
+ DOMString serialNumber;
+};
+
+dictionary USBDeviceRequestOptions {
+ required sequence<USBDeviceFilter> filters;
+};
+
+interface USB : EventTarget {
+ attribute EventHandler onconnect;
+ attribute EventHandler ondisconnect;
+ Promise<sequence<USBDevice>> getDevices();
+ Promise<USBDevice> requestDevice(USBDeviceRequestOptions options);
+};
+
+[SecureContext]
+partial interface Navigator {
+ [SameObject] readonly attribute USB usb;
+};
+
+dictionary USBConnectionEventInit : EventInit {
+ required USBDevice device;
+};
+
+[Constructor(DOMString type, USBConnectionEventInit eventInitDict)]
+interface USBConnectionEvent : Event {
+ [SameObject] readonly attribute USBDevice device;
+};
+
+interface USBDevice {
+ readonly attribute octet usbVersionMajor;
+ readonly attribute octet usbVersionMinor;
+ readonly attribute octet usbVersionSubminor;
+ readonly attribute octet deviceClass;
+ readonly attribute octet deviceSubclass;
+ readonly attribute octet deviceProtocol;
+ readonly attribute unsigned short vendorId;
+ readonly attribute unsigned short productId;
+ readonly attribute octet deviceVersionMajor;
+ readonly attribute octet deviceVersionMinor;
+ readonly attribute octet deviceVersionSubminor;
+ readonly attribute DOMString? manufacturerName;
+ readonly attribute DOMString? productName;
+ readonly attribute DOMString? serialNumber;
+ readonly attribute USBConfiguration? configuration;
+ readonly attribute FrozenArray<USBConfiguration> configurations;
+ readonly attribute boolean opened;
+ Promise<void> open();
+ Promise<void> close();
+ Promise<void> selectConfiguration(octet configurationValue);
+ Promise<void> claimInterface(octet interfaceNumber);
+ Promise<void> releaseInterface(octet interfaceNumber);
+ Promise<void> selectAlternateInterface(octet interfaceNumber, octet alternateSetting);
+ Promise<USBInTransferResult> controlTransferIn(USBControlTransferParameters setup, unsigned short length);
+ Promise<USBOutTransferResult> controlTransferOut(USBControlTransferParameters setup, optional BufferSource data);
+ Promise<void> clearHalt(USBDirection direction, octet endpointNumber);
+ Promise<USBInTransferResult> transferIn(octet endpointNumber, unsigned long length);
+ Promise<USBOutTransferResult> transferOut(octet endpointNumber, BufferSource data);
+ Promise<USBIsochronousInTransferResult> isochronousTransferIn(octet endpointNumber, sequence<unsigned long> packetLengths);
+ Promise<USBIsochronousOutTransferResult> isochronousTransferOut(octet endpointNumber, BufferSource data, sequence<unsigned long> packetLengths);
+ Promise<void> reset();
+};
+
+enum USBRequestType {
+ "standard",
+ "class",
+ "vendor"
+};
+
+enum USBRecipient {
+ "device",
+ "interface",
+ "endpoint",
+ "other"
+};
+
+enum USBTransferStatus {
+ "ok",
+ "stall",
+ "babble"
+};
+
+dictionary USBControlTransferParameters {
+ required USBRequestType requestType;
+ required USBRecipient recipient;
+ required octet request;
+ required unsigned short value;
+ required unsigned short index;
+};
+
+[Constructor(USBTransferStatus status, optional DataView? data)]
+interface USBInTransferResult {
+ readonly attribute DataView? data;
+ readonly attribute USBTransferStatus status;
+};
+
+[Constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0)]
+interface USBOutTransferResult {
+ readonly attribute unsigned long bytesWritten;
+ readonly attribute USBTransferStatus status;
+};
+
+[Constructor(USBTransferStatus status, optional DataView? data)]
+interface USBIsochronousInTransferPacket {
+ readonly attribute DataView? data;
+ readonly attribute USBTransferStatus status;
+};
+
+[Constructor(sequence<USBIsochronousInTransferPacket> packets, optional DataView? data)]
+interface USBIsochronousInTransferResult {
+ readonly attribute DataView? data;
+ readonly attribute FrozenArray<USBIsochronousInTransferPacket> packets;
+};
+
+[Constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0)]
+interface USBIsochronousOutTransferPacket {
+ readonly attribute unsigned long bytesWritten;
+ readonly attribute USBTransferStatus status;
+};
+
+[Constructor(sequence<USBIsochronousOutTransferPacket> packets)]
+interface USBIsochronousOutTransferResult {
+ readonly attribute FrozenArray<USBIsochronousOutTransferPacket> packets;
+};
+
+[Constructor(USBDevice device, octet configurationValue)]
+interface USBConfiguration {
+ readonly attribute octet configurationValue;
+ readonly attribute DOMString? configurationName;
+ readonly attribute FrozenArray<USBInterface> interfaces;
+};
+
+[Constructor(USBConfiguration configuration, octet interfaceNumber)]
+interface USBInterface {
+ readonly attribute octet interfaceNumber;
+ readonly attribute USBAlternateInterface alternate;
+ readonly attribute FrozenArray<USBAlternateInterface> alternates;
+ readonly attribute boolean claimed;
+};
+
+[Constructor(USBInterface deviceInterface, octet alternateSetting)]
+interface USBAlternateInterface {
+ readonly attribute octet alternateSetting;
+ readonly attribute octet interfaceClass;
+ readonly attribute octet interfaceSubclass;
+ readonly attribute octet interfaceProtocol;
+ readonly attribute DOMString? interfaceName;
+ readonly attribute FrozenArray<USBEndpoint> endpoints;
+};
+
+enum USBDirection {
+ "in",
+ "out"
+};
+
+enum USBEndpointType {
+ "bulk",
+ "interrupt",
+ "isochronous"
+};
+
+[Constructor(USBAlternateInterface alternate, octet endpointNumber, USBDirection direction)]
+interface USBEndpoint {
+ readonly attribute octet endpointNumber;
+ readonly attribute USBDirection direction;
+ readonly attribute USBEndpointType type;
+ readonly attribute unsigned long packetSize;
+};
diff --git a/tests/wpt/web-platform-tests/intersection-observer/bounding-box.html b/tests/wpt/web-platform-tests/intersection-observer/bounding-box.html
new file mode 100644
index 00000000000..69052b11ce6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/bounding-box.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+#root {
+ overflow: visible;
+ height: 200px;
+ width: 160px;
+ border: 7px solid black;
+}
+#target {
+ margin: 10px;
+ width: 100px;
+ height: 100px;
+ padding: 10px;
+ background-color: green;
+}
+</style>
+
+<div id="root">
+ <div id="target" style="transform: translateY(300px)"></div>
+</div>
+
+<script>
+var entries = [];
+var target;
+
+runTestCycle(function() {
+ target = document.getElementById("target");
+ assert_true(!!target, "target exists");
+ var root = document.getElementById("root");
+ assert_true(!!root, "root exists");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ }, {root: root});
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF.");
+}, "Test that the target's border bounding box is used to calculate intersection.");
+
+function step0() {
+ var targetBounds = clientBounds(target);
+ target.style.transform = "translateY(195px)";
+ runTestCycle(step1, "target.style.transform = 'translateY(195px)'");
+ checkLastEntry(entries, 0, targetBounds.concat(0, 0, 0, 0, 8, 182, 8, 222, false));
+}
+
+function step1() {
+ var targetBounds = clientBounds(target);
+ target.style.transform = "";
+ checkLastEntry(entries, 1, targetBounds.concat(25, 145, 220, 222, 8, 182, 8, 222, true));
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/client-rect.html b/tests/wpt/web-platform-tests/intersection-observer/client-rect.html
new file mode 100644
index 00000000000..913e0d9f12c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/client-rect.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+iframe {
+ width: 180px;
+ height: 100px;
+}
+</style>
+
+<iframe id="iframe" srcdoc="<div id='target' style='width:1000px;height:1000px;'></div>"></iframe>
+
+<script>
+var target;
+var entries = [];
+var observer;
+var iframe = document.getElementById("iframe");
+
+iframe.onload = function() {
+ runTestCycle(function() {
+ target = iframe.contentDocument.getElementById("target");
+ assert_true(!!target, "Target element exists.");
+ observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes);
+ });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(test0, "First rAF should generate notification.");
+ }, "IntersectionObserverEntry.boundingClientRect should match target.boundingClientRect()");
+};
+
+function test0() {
+ assert_equals(entries.length, 1, "One notification.");
+ var bcr = target.getBoundingClientRect();
+ checkLastEntry(entries, 0, [bcr.left, bcr.right, bcr.top, bcr.bottom]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/containing-block.html b/tests/wpt/web-platform-tests/intersection-observer/containing-block.html
new file mode 100644
index 00000000000..d4f46b0fa77
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/containing-block.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+#root {
+ width: 170px;
+ height: 200px;
+ overflow-y: scroll;
+}
+#target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+ position: absolute;
+}
+</style>
+
+<div id="root" style="position: absolute">
+ <div id="target" style="left: 50px; top: 250px"></div>
+</div>
+
+<script>
+var entries = [];
+var root, target;
+
+runTestCycle(function() {
+ root = document.getElementById("root");
+ assert_true(!!root, "root element exists.");
+ target = document.getElementById("target");
+ assert_true(!!target, "target element exists.");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes);
+ }, { root: root });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ target.style.top = "10px";
+ runTestCycle(test1, "In containing block and intersecting.");
+}, "IntersectionObserver should only report intersections if root is a containing block ancestor of target.");
+
+function test1() {
+ runTestCycle(test2, "In containing block and not intersecting.");
+ var rootBounds = contentBounds(root);
+ checkLastEntry(entries, 0, [58, 158, 18, 118, 58, 158, 18, 118].concat(rootBounds));
+ target.style.top = "250px";
+}
+
+function test2() {
+ runTestCycle(test3, "Not in containing block and intersecting.");
+ var rootBounds = contentBounds(root);
+ checkLastEntry(entries, 1, [58, 158, 258, 358, 0, 0, 0, 0].concat(rootBounds));
+ root.style.position = "static";
+ target.style.top = "10px";
+}
+
+function test3() {
+ runTestCycle(test4, "Not in containing block and not intersecting.");
+ checkLastEntry(entries, 1);
+ target.style.top = "250px";
+}
+
+function test4() {
+ checkLastEntry(entries, 1);
+ target.style.top = "0";
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/cross-origin-iframe.html b/tests/wpt/web-platform-tests/intersection-observer/cross-origin-iframe.html
new file mode 100644
index 00000000000..2c9c4bcec69
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/cross-origin-iframe.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+iframe {
+ width: 160px;
+ height: 100px;
+ overflow-y: scroll;
+}
+.spacer {
+ height: calc(100vh + 100px);
+}
+</style>
+
+<div class="spacer"></div>
+<iframe src="resources/cross-origin-subframe.html" sandbox="allow-scripts"></iframe>
+<div class="spacer"></div>
+
+<script>
+async_test(function(t) {
+ var iframe = document.querySelector("iframe");
+
+ function handleMessage(event) {
+ if (event.data.hasOwnProperty('scrollTo')) {
+ document.scrollingElement.scrollTop = event.data.scrollTo;
+ waitForNotification(t, function() { iframe.contentWindow.postMessage("", "*"); },
+ "document.scrollingElement.scrollTop = " + event.data.scrollTo);
+ } else if (event.data.hasOwnProperty('actual')) {
+ checkJsonEntries(event.data.actual, event.data.expected, event.data.description);
+ } else if (event.data.hasOwnProperty('DONE')) {
+ document.scrollingElement.scrollTop = 0;
+ t.done();
+ } else {
+ var description = event.data.description;
+ waitForNotification(t, function() { iframe.contentWindow.postMessage("", "*"); }, description);
+ }
+ }
+
+ window.addEventListener("message", t.step_func(handleMessage));
+
+ iframe.onload = t.step_func(function() {
+ waitForNotification(t, function() { iframe.contentWindow.postMessage("", "*") }, "setup");
+ });
+}, "Intersection observer test with no explicit root and target in a cross-origin iframe.");
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/disconnect.html b/tests/wpt/web-platform-tests/intersection-observer/disconnect.html
new file mode 100644
index 00000000000..0abfbc4e8aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/disconnect.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+.spacer {
+ height: calc(100vh + 100px);
+}
+#target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+</style>
+
+<div class="spacer"></div>
+<div id="target"></div>
+<div class="spacer"></div>
+
+<script>
+var entries = [];
+var observer;
+var target;
+
+runTestCycle(function() {
+ target = document.getElementById("target");
+ assert_true(!!target, "target exists");
+ observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF.");
+}, "IntersectionObserver should not deliver pending notifications after disconnect().");
+
+function step0() {
+ runTestCycle(step1, "observer.disconnect()");
+ document.scrollingElement.scrollTop = 300;
+ observer.disconnect();
+ assert_equals(entries.length, 1, "Initial notification.");
+}
+
+function step1() {
+ assert_equals(entries.length, 1, "No new notifications.");
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/display-none.html b/tests/wpt/web-platform-tests/intersection-observer/display-none.html
new file mode 100644
index 00000000000..7cebc5633ef
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/display-none.html
@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+#target {
+ background-color: green;
+ width: 100px;
+ height: 100px;
+}
+</style>
+
+<div id="target"></div>
+
+<script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+
+var entries = [];
+
+runTestCycle(function() {
+ var target = document.getElementById("target");
+ var root = document.getElementById("root");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "Intersecting notification after first rAF.");
+}, "IntersectionObserver should send a not-intersecting notification for a target that gets display:none.");
+
+function step0() {
+ runTestCycle(step1, "Not-intersecting notification after setting display:none on target.");
+ checkLastEntry(entries, 0, [8, 108, 8, 108, 8, 108, 8, 108, 0, vw, 0, vh, true]);
+ target.style.display = "none";
+}
+
+function step1() {
+ runTestCycle(step2, "Intersecting notification after removing display:none on target.");
+ checkLastEntry(entries, 1, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false]);
+ target.style.display = "";
+}
+
+function step2() {
+ checkLastEntry(entries, 2, [8, 108, 8, 108, 8, 108, 8, 108, 0, vw, 0, vh, true]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/edge-inclusive-intersection.html b/tests/wpt/web-platform-tests/intersection-observer/edge-inclusive-intersection.html
new file mode 100644
index 00000000000..b9fa24b8780
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/edge-inclusive-intersection.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+#root {
+ width: 200px;
+ height: 200px;
+ overflow: visible;
+}
+#target {
+ background-color: green;
+}
+</style>
+
+<div id="root">
+ <div id="target" style="width: 100px; height: 100px; transform: translateY(250px)"></div>
+</div>
+
+<script>
+var entries = [];
+
+runTestCycle(function() {
+ var root = document.getElementById('root');
+ assert_true(!!root, "root element exists.");
+ var target = document.getElementById('target');
+ assert_true(!!target, "target element exists.");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes);
+ }, { root: root });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF.");
+}, "IntersectionObserver should detect and report edge-adjacent and zero-area intersections.");
+
+function step0() {
+ runTestCycle(step1, "Set transform=translateY(200px) on target.");
+ checkLastEntry(entries, 0, [8, 108, 258, 358, 0, 0, 0, 0, 8, 208, 8, 208, false]);
+ target.style.transform = "translateY(200px)";
+}
+
+function step1() {
+ runTestCycle(step2, "Set transform=translateY(201px) on target.");
+ checkLastEntry(entries, 1, [8, 108, 208, 308, 8, 108, 208, 208, 8, 208, 8, 208, true]);
+ target.style.transform = "translateY(201px)";
+}
+
+function step2() {
+ runTestCycle(step3, "Set transform=translateY(185px) on target.");
+ checkLastEntry(entries, 2);
+ target.style.height = "0px";
+ target.style.width = "300px";
+ target.style.transform = "translateY(185px)";
+}
+
+function step3() {
+ checkLastEntry(entries, 3, [8, 308, 193, 193, 8, 208, 193, 193, 8, 208, 8, 208, true]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/iframe-no-root.html b/tests/wpt/web-platform-tests/intersection-observer/iframe-no-root.html
new file mode 100644
index 00000000000..e37aeac5530
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/iframe-no-root.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+.spacer {
+ height: calc(100vh + 100px);
+}
+iframe {
+ height: 100px;
+ width: 150px;
+}
+</style>
+
+<div class="spacer"></div>
+<iframe id="target-iframe" src="resources/iframe-no-root-subframe.html"></iframe>
+<div class="spacer"></div>
+
+<script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+
+var iframe = document.getElementById("target-iframe");
+var target;
+var entries = [];
+
+iframe.onload = function() {
+ runTestCycle(function() {
+ assert_true(!!iframe, "iframe exists");
+
+ target = iframe.contentDocument.getElementById("target");
+ assert_true(!!target, "Target element exists.");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF.");
+ }, "Observer with the implicit root; target in a same-origin iframe.");
+};
+
+function step0() {
+ document.scrollingElement.scrollTop = 200;
+ runTestCycle(step1, "document.scrollingElement.scrollTop = 200");
+ checkLastEntry(entries, 0, [8, 108, 208, 308, 0, 0, 0, 0, 0, vw, 0, vh, false]);
+}
+
+function step1() {
+ iframe.contentDocument.scrollingElement.scrollTop = 250;
+ runTestCycle(step2, "iframe.contentDocument.scrollingElement.scrollTop = 250");
+ assert_equals(entries.length, 1, "entries.length == 1");
+}
+
+function step2() {
+ document.scrollingElement.scrollTop = 100;
+ runTestCycle(step3, "document.scrollingElement.scrollTop = 100");
+ checkLastEntry(entries, 1, [8, 108, -42, 58, 8, 108, 0, 58, 0, vw, 0, vh, true]);
+}
+
+function step3() {
+ checkLastEntry(entries, 2, [8, 108, -42, 58, 0, 0, 0, 0, 0, vw, 0, vh, false]);
+ document.scrollingElement.scrollTop = 0;
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/multiple-targets.html b/tests/wpt/web-platform-tests/intersection-observer/multiple-targets.html
new file mode 100644
index 00000000000..525c5a699d1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/multiple-targets.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+.spacer {
+ height: calc(100vh + 100px);
+}
+.target {
+ width: 100px;
+ height: 100px;
+ margin: 10px;
+ background-color: green;
+}
+</style>
+
+<div class="spacer"></div>
+<div id="target1" class="target"></div>
+<div id="target2" class="target"></div>
+<div id="target3" class="target"></div>
+
+<script>
+var entries = [];
+var target1, target2, target3;
+
+runTestCycle(function() {
+ target1 = document.getElementById("target1");
+ assert_true(!!target1, "target1 exists.");
+ target2 = document.getElementById("target2");
+ assert_true(!!target2, "target2 exists.");
+ target3 = document.getElementById("target3");
+ assert_true(!!target3, "target3 exists.");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ });
+ observer.observe(target1);
+ observer.observe(target2);
+ observer.observe(target3);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF.");
+}, "One observer with multiple targets.");
+
+function step0() {
+ document.scrollingElement.scrollTop = 150;
+ runTestCycle(step1, "document.scrollingElement.scrollTop = 150");
+ assert_equals(entries.length, 3, "Three initial notifications.");
+ assert_equals(entries[0].target, target1, "entries[0].target === target1");
+ assert_equals(entries[1].target, target2, "entries[1].target === target2");
+ assert_equals(entries[2].target, target3, "entries[2].target === target3");
+}
+
+function step1() {
+ document.scrollingElement.scrollTop = 10000;
+ runTestCycle(step2, "document.scrollingElement.scrollTop = 10000");
+ assert_equals(entries.length, 4, "Four notifications.");
+ assert_equals(entries[3].target, target1, "entries[3].target === target1");
+}
+
+function step2() {
+ document.scrollingElement.scrollTop = 0;
+ runTestCycle(step3, "document.scrollingElement.scrollTop = 0");
+ assert_equals(entries.length, 6, "Six notifications.");
+ assert_equals(entries[4].target, target2, "entries[4].target === target2");
+ assert_equals(entries[5].target, target3, "entries[5].target === target3");
+}
+
+function step3() {
+ assert_equals(entries.length, 9, "Nine notifications.");
+ assert_equals(entries[6].target, target1, "entries[6].target === target1");
+ assert_equals(entries[7].target, target2, "entries[7].target === target2");
+ assert_equals(entries[8].target, target3, "entries[8].target === target3");
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/multiple-thresholds.html b/tests/wpt/web-platform-tests/intersection-observer/multiple-thresholds.html
new file mode 100644
index 00000000000..6450068941c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/multiple-thresholds.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+.spacer {
+ height: calc(100vh + 100px);
+}
+#target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+</style>
+
+<div class="spacer"></div>
+<div id="target"></div>
+<div class="spacer"></div>
+
+<script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+
+var entries = [];
+var target;
+
+runTestCycle(function() {
+ target = document.getElementById("target");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ }, { threshold: [0, 0.25, 0.5, 0.75, 1] });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF.");
+}, "Observer with multiple thresholds.");
+
+function step0() {
+ document.scrollingElement.scrollTop = 120;
+ runTestCycle(step1, "document.scrollingElement.scrollTop = 120");
+ checkLastEntry(entries, 0, [8, 108, vh + 108, vh + 208, 0, 0, 0, 0, 0, vw, 0, vh, false]);
+}
+
+function step1() {
+ document.scrollingElement.scrollTop = 160;
+ runTestCycle(step2, "document.scrollingElement.scrollTop = 160");
+ checkLastEntry(entries, 1, [8, 108, vh - 12, vh + 88, 8, 108, vh - 12, vh, 0, vw, 0, vh, true]);
+}
+
+function step2() {
+ document.scrollingElement.scrollTop = 200;
+ runTestCycle(step3, "document.scrollingElement.scrollTop = 200");
+ checkLastEntry(entries, 2, [8, 108, vh - 52, vh + 48, 8, 108, vh - 52, vh, 0, vw, 0, vh, true]);
+}
+
+function step3() {
+ document.scrollingElement.scrollTop = 240;
+ runTestCycle(step4, "document.scrollingElement.scrollTop = 240");
+ checkLastEntry(entries, 3, [8, 108, vh - 92, vh + 8, 8, 108, vh - 92, vh, 0, vw, 0, vh, true]);
+}
+
+function step4() {
+ document.scrollingElement.scrollTop = vh + 140;
+ runTestCycle(step5, "document.scrollingElement.scrollTop = window.innerHeight + 140");
+ checkLastEntry(entries, 4, [8, 108, vh - 132, vh - 32, 8, 108, vh - 132, vh - 32, 0, vw, 0, vh, true]);
+}
+
+function step5() {
+ document.scrollingElement.scrollTop = vh + 160;
+ runTestCycle(step6, "document.scrollingElement.scrollTop = window.innerHeight + 160");
+ checkLastEntry(entries, 5, [8, 108, -32, 68, 8, 108, 0, 68, 0, vw, 0, vh, true]);
+}
+
+function step6() {
+ document.scrollingElement.scrollTop = vh + 200;
+ runTestCycle(step7, "document.scrollingElement.scrollTop = window.innerHeight + 200");
+ checkLastEntry(entries, 6, [8, 108, -52, 48, 8, 108, 0, 48, 0, vw, 0, vh, true]);
+}
+
+function step7() {
+ checkLastEntry(entries, 7, [8, 108, -92, 8, 8, 108, 0, 8, 0, vw, 0, vh, true]);
+ document.scrollingElement.scrollTop = vh + 220;
+ runTestCycle(step8, "document.scrollingElement.scrollTop = window.innerHeight + 220");
+}
+
+function step8() {
+ checkLastEntry(entries, 8, [8, 108, -112, -12, 0, 0, 0, 0, 0, vw, 0, vh, false]);
+ document.scrollingElement.scrollTop = 0;
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/observer-attributes.html b/tests/wpt/web-platform-tests/intersection-observer/observer-attributes.html
new file mode 100644
index 00000000000..ffca95ded31
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/observer-attributes.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="root"></div>
+
+<script>
+test(function() {
+ var observer = new IntersectionObserver(function(e) {}, {});
+ test(function() { assert_equals(observer.root, null) },
+ "observer.root");
+ test(function() { assert_array_equals(observer.thresholds, [0]) },
+ "observer.thresholds");
+ test(function() { assert_equals(observer.rootMargin, "0px 0px 0px 0px") },
+ "observer.rootMargin");
+
+ var rootDiv = document.getElementById("root");
+ observer = new IntersectionObserver(function(e) {}, {
+ root: rootDiv,
+ threshold: [0, 0.25, 0.5, 1.0],
+ rootMargin: "10% 20px"
+ });
+ test(function() { assert_equals(observer.root, rootDiv) },
+ "set observer.root");
+ test(function() { assert_array_equals(observer.thresholds, [0, 0.25, 0.5, 1.0]) },
+ "set observer.thresholds");
+ test(function() { assert_equals(observer.rootMargin, "10% 20px 10% 20px") },
+ "set observer.rootMargin");
+}, "Observer attribute getters.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/observer-exceptions.html b/tests/wpt/web-platform-tests/intersection-observer/observer-exceptions.html
new file mode 100644
index 00000000000..b44b7bd0cc1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/observer-exceptions.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+test(function () {
+ assert_throws(RangeError(), function() {
+ new IntersectionObserver(e => {}, {threshold: [1.1]})
+ })
+}, "IntersectionObserver constructor with { threshold: [1.1] }");
+
+test(function () {
+ assert_throws(TypeError(), function() {
+ new IntersectionObserver(e => {}, {threshold: ["foo"]})
+ })
+}, 'IntersectionObserver constructor with { threshold: ["foo"] }');
+
+test(function () {
+ assert_throws("SYNTAX_ERR", function() {
+ new IntersectionObserver(e => {}, {rootMargin: "1"})
+ })
+}, 'IntersectionObserver constructor witth { rootMargin: "1" }');
+
+test(function () {
+ assert_throws("SYNTAX_ERR", function() {
+ new IntersectionObserver(e => {}, {rootMargin: "2em"})
+ })
+}, 'IntersectionObserver constructor with { rootMargin: "2em" }');
+
+test(function () {
+ assert_throws("SYNTAX_ERR", function() {
+ new IntersectionObserver(e => {}, {rootMargin: "auto"})
+ })
+}, 'IntersectionObserver constructor width { rootMargin: "auto" }');
+
+test(function () {
+ assert_throws("SYNTAX_ERR", function() {
+ new IntersectionObserver(e => {}, {rootMargin: "1px 1px 1px 1px 1px"})
+ })
+}, 'IntersectionObserver constructor with { rootMargin: "1px 1px 1px 1px 1px" }');
+
+test(function () {
+ assert_throws(TypeError(), function() {
+ let observer = new IntersectionObserver(c => {}, {});
+ observer.observe("foo");
+ })
+}, 'IntersectionObserver.observe("foo")');
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/observer-in-iframe.html b/tests/wpt/web-platform-tests/intersection-observer/observer-in-iframe.html
new file mode 100644
index 00000000000..f4aa387de2a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/observer-in-iframe.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+</style>
+<iframe id="target-iframe" src="resources/observer-in-iframe-subframe.html" width="150px" height="150px"></iframe>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/observer-without-js-reference.html b/tests/wpt/web-platform-tests/intersection-observer/observer-without-js-reference.html
new file mode 100644
index 00000000000..3214345b610
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/observer-without-js-reference.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+.spacer {
+ height: calc(100vh + 100px);
+}
+#target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+</style>
+<div class="spacer"></div>
+<div id="target"></div>
+<div class="spacer"></div>
+
+<script>
+var entries = [];
+
+runTestCycle(function() {
+ var target = document.getElementById("target");
+ assert_true(!!target, "Target exists");
+ function createObserver() {
+ new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ }).observe(target);
+ }
+ createObserver();
+ runTestCycle(step0, "First rAF");
+}, "IntersectionObserver that is unreachable in js should still generate notifications.");
+
+function step0() {
+ document.scrollingElement.scrollTop = 300;
+ runTestCycle(step1, "document.scrollingElement.scrollTop = 300");
+ assert_equals(entries.length, 1, "One notification.");
+}
+
+function step1() {
+ document.scrollingElement.scrollTop = 0;
+ assert_equals(entries.length, 2, "Two notifications.");
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/remove-element.html b/tests/wpt/web-platform-tests/intersection-observer/remove-element.html
new file mode 100644
index 00000000000..3b6a65e2d0e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/remove-element.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+#root {
+ display: inline-block;
+ overflow-y: scroll;
+ height: 200px;
+ border: 3px solid black;
+}
+#target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+.spacer {
+ height: 300px;
+}
+</style>
+
+<div id="root">
+ <div id="leading-space" class="spacer"></div>
+ <div id="target"></div>
+ <div id="trailing-space" class="spacer"</div>
+</div>
+
+<script>
+var entries = [];
+var root, target, trailingSpace;
+
+runTestCycle(function() {
+ target = document.getElementById("target");
+ assert_true(!!target, "Target exists");
+ trailingSpace = document.getElementById("trailing-space");
+ assert_true(!!trailingSpace, "TrailingSpace exists");
+ root = document.getElementById("root");
+ assert_true(!!root, "Root exists");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ }, {root: root});
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF");
+}, "Verify that not-intersecting notifications are sent when a target is removed from the DOM tree.");
+
+function step0() {
+ root.scrollTop = 150;
+ runTestCycle(step1, "root.scrollTop = 150");
+ checkLastEntry(entries, 0, [11, 111, 311, 411, 0, 0, 0, 0, 11, 111, 11, 211, false]);
+}
+
+function step1() {
+ root.removeChild(target);
+ runTestCycle(step2, "root.removeChild(target).");
+ checkLastEntry(entries, 1, [11, 111, 161, 261, 11, 111, 161, 211, 11, 111, 11, 211, true]);
+}
+
+function step2() {
+ root.scrollTop = 0;
+ root.insertBefore(target, trailingSpace);
+ runTestCycle(step3, "root.insertBefore(target, trailingSpace).");
+ checkLastEntry(entries, 2, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, false]);
+}
+
+function step3() {
+ root.scrollTop = 150;
+ runTestCycle(step4, "root.scrollTop = 150 after reinserting target.");
+ checkLastEntry(entries, 2);
+}
+
+function step4() {
+ checkLastEntry(entries, 3, [11, 111, 161, 261, 11, 111, 161, 211, 11, 111, 11, 211, true]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/resources/cross-origin-subframe.html b/tests/wpt/web-platform-tests/intersection-observer/resources/cross-origin-subframe.html
new file mode 100644
index 00000000000..0cc117cb3a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/resources/cross-origin-subframe.html
@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<div style="height: 200px; width: 100px;"></div>
+<div id="target" style="background-color: green; width:100px; height:100px"></div>
+<div style="height: 200px; width: 100px;"></div>
+
+<script>
+var port;
+var entries = [];
+var target = document.getElementById('target');
+var scroller = document.scrollingElement;
+var nextStep;
+
+function clientRectToJson(rect) {
+ if (!rect)
+ return "null";
+ return {
+ top: rect.top,
+ right: rect.right,
+ bottom: rect.bottom,
+ left: rect.left
+ };
+}
+
+function entryToJson(entry) {
+ return {
+ boundingClientRect: clientRectToJson(entry.boundingClientRect),
+ intersectionRect: clientRectToJson(entry.intersectionRect),
+ rootBounds: clientRectToJson(entry.rootBounds),
+ target: entry.target.id
+ };
+}
+
+function coordinatesToClientRectJson(top, right, bottom, left) {
+ return {
+ top: top,
+ right: right,
+ bottom: bottom,
+ left: left
+ };
+}
+
+// Note that we never use RAF in this code, because this frame might get render-throttled.
+// Instead of RAF-ing, we just post an empty message to the parent window, which will
+// RAF when it is received, and then send us a message to cause the next step to run.
+
+// Use a rootMargin here, and verify it does NOT get applied for the cross-origin case.
+var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+}, { rootMargin: "7px" });
+observer.observe(target);
+
+function step0() {
+ entries = entries.concat(observer.takeRecords());
+ nextStep = step1;
+ var expected = [{
+ boundingClientRect: coordinatesToClientRectJson(8, 208, 108, 308),
+ intersectionRect: coordinatesToClientRectJson(0, 0, 0, 0),
+ rootBounds: "null",
+ target: target.id
+ }];
+ port.postMessage({
+ actual: entries.map(entryToJson),
+ expected: expected,
+ description: "First rAF"
+ }, "*");
+ entries = [];
+ port.postMessage({scrollTo: 200}, "*");
+}
+
+function step1() {
+ entries = entries.concat(observer.takeRecords());
+ port.postMessage({
+ actual: entries.map(entryToJson),
+ expected: [],
+ description: "topDocument.scrollingElement.scrollTop = 200"
+ }, "*");
+ entries = [];
+ scroller.scrollTop = 250;
+ nextStep = step2;
+ port.postMessage({}, "*");
+}
+
+function step2() {
+ entries = entries.concat(observer.takeRecords());
+ var expected = [{
+ boundingClientRect: coordinatesToClientRectJson(-42, 108, 58, 8),
+ intersectionRect: coordinatesToClientRectJson(0, 108, 58, 8),
+ rootBounds: "null",
+ target: target.id
+ }];
+ port.postMessage({
+ actual: entries.map(entryToJson),
+ expected: expected,
+ description: "iframeDocument.scrollingElement.scrollTop = 250"
+ }, "*");
+ entries = [];
+ nextStep = step3;
+ port.postMessage({scrollTo: 100}, "*");
+}
+
+function step3() {
+ entries = entries.concat(observer.takeRecords());
+ var expected = [{
+ boundingClientRect: coordinatesToClientRectJson(-42, 108, 58, 8),
+ intersectionRect: coordinatesToClientRectJson(0, 0, 0, 0),
+ rootBounds: "null",
+ target: target.id
+ }];
+ port.postMessage({
+ actual: entries.map(entryToJson),
+ expected: expected,
+ description: "topDocument.scrollingElement.scrollTop = 100"
+ }, "*");
+ port.postMessage({DONE: 1}, "*");
+}
+
+function handleMessage(event)
+{
+ port = event.source;
+ nextStep();
+}
+
+nextStep = step0;
+window.addEventListener("message", handleMessage);
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/resources/iframe-no-root-subframe.html b/tests/wpt/web-platform-tests/intersection-observer/resources/iframe-no-root-subframe.html
new file mode 100644
index 00000000000..ee63a06ca0f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/resources/iframe-no-root-subframe.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<div style="height: 200px; width: 100px;"></div>
+<div id="target" style="background-color: green; width:100px; height:100px"></div>
+<div style="height: 200px; width: 100px;"></div>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/resources/intersection-observer-test-utils.js b/tests/wpt/web-platform-tests/intersection-observer/resources/intersection-observer-test-utils.js
new file mode 100644
index 00000000000..48ccbb1991b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/resources/intersection-observer-test-utils.js
@@ -0,0 +1,122 @@
+// Here's how waitForNotification works:
+//
+// - myTestFunction0()
+// - waitForNotification(myTestFunction1)
+// - requestAnimationFrame()
+// - Modify DOM in a way that should trigger an IntersectionObserver callback.
+// - BeginFrame
+// - requestAnimationFrame handler runs
+// - First step_timeout()
+// - Style, layout, paint
+// - IntersectionObserver generates new notifications
+// - Posts a task to deliver notifications
+// - First step_timeout handler runs
+// - Second step_timeout()
+// - Task to deliver IntersectionObserver notifications runs
+// - IntersectionObserver callbacks run
+// - Second step_timeout handler runs
+// - myTestFunction1()
+// - [optional] waitForNotification(myTestFunction2)
+// - requestAnimationFrame()
+// - Verify newly-arrived IntersectionObserver notifications
+// - [optional] Modify DOM to trigger new notifications
+function waitForNotification(t, f) {
+ requestAnimationFrame(function() {
+ t.step_timeout(function() { t.step_timeout(f); });
+ });
+}
+
+// The timing of when runTestCycle is called is important. It should be
+// called:
+//
+// - Before or during the window load event, or
+// - Inside of a prior runTestCycle callback, *before* any assert_* methods
+// are called.
+//
+// Following these rules will ensure that the test suite will not abort before
+// all test steps have run.
+function runTestCycle(f, description) {
+ async_test(function(t) {
+ waitForNotification(t, t.step_func_done(f));
+ }, description);
+}
+
+// Root bounds for a root with an overflow clip as defined by:
+// http://wicg.github.io/IntersectionObserver/#intersectionobserver-root-intersection-rectangle
+function contentBounds(root) {
+ var left = root.offsetLeft + root.clientLeft;
+ var right = left + root.clientWidth;
+ var top = root.offsetTop + root.clientTop;
+ var bottom = top + root.clientHeight;
+ return [left, right, top, bottom];
+}
+
+// Root bounds for a root without an overflow clip as defined by:
+// http://wicg.github.io/IntersectionObserver/#intersectionobserver-root-intersection-rectangle
+function borderBoxBounds(root) {
+ var left = root.offsetLeft;
+ var right = left + root.offsetWidth;
+ var top = root.offsetTop;
+ var bottom = top + root.offsetHeight;
+ return [left, right, top, bottom];
+}
+
+function clientBounds(element) {
+ var rect = element.getBoundingClientRect();
+ return [rect.left, rect.right, rect.top, rect.bottom];
+}
+
+function rectArea(rect) {
+ return (rect.left - rect.right) * (rect.bottom - rect.top);
+}
+
+function checkRect(actual, expected, description, all) {
+ if (!expected.length)
+ return;
+ assert_equals(actual.left | 0, expected[0] | 0, description + '.left');
+ assert_equals(actual.right | 0, expected[1] | 0, description + '.right');
+ assert_equals(actual.top | 0, expected[2] | 0, description + '.top');
+ assert_equals(actual.bottom | 0, expected[3] | 0, description + '.bottom');
+}
+
+function checkLastEntry(entries, i, expected) {
+ assert_equals(entries.length, i + 1, 'entries.length');
+ if (expected) {
+ checkRect(
+ entries[i].boundingClientRect, expected.slice(0, 4),
+ 'entries[' + i + '].boundingClientRect', entries[i]);
+ checkRect(
+ entries[i].intersectionRect, expected.slice(4, 8),
+ 'entries[' + i + '].intersectionRect', entries[i]);
+ checkRect(
+ entries[i].rootBounds, expected.slice(8, 12),
+ 'entries[' + i + '].rootBounds', entries[i]);
+ if (expected.length > 12) {
+ assert_equals(
+ entries[i].isIntersecting, expected[12],
+ 'entries[' + i + '].isIntersecting');
+ }
+ }
+}
+
+function checkJsonEntry(actual, expected) {
+ checkRect(
+ actual.boundingClientRect, expected.boundingClientRect,
+ 'entry.boundingClientRect');
+ checkRect(
+ actual.intersectionRect, expected.intersectionRect,
+ 'entry.intersectionRect');
+ if (actual.rootBounds == 'null')
+ assert_equals(expected.rootBounds, 'null', 'rootBounds is null');
+ else
+ checkRect(actual.rootBounds, expected.rootBounds, 'entry.rootBounds');
+ assert_equals(actual.target, expected.target);
+}
+
+function checkJsonEntries(actual, expected, description) {
+ test(function() {
+ assert_equals(actual.length, expected.length);
+ for (var i = 0; i < actual.length; i++)
+ checkJsonEntry(actual[i], expected[i]);
+ }, description);
+}
diff --git a/tests/wpt/web-platform-tests/intersection-observer/resources/observer-in-iframe-subframe.html b/tests/wpt/web-platform-tests/intersection-observer/resources/observer-in-iframe-subframe.html
new file mode 100644
index 00000000000..9d0769ae44a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/resources/observer-in-iframe-subframe.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./intersection-observer-test-utils.js"></script>
+
+<style>
+#root {
+ width: 200px;
+ height: 200px;
+}
+#scroller {
+ width: 160px;
+ height: 200px;
+ overflow-y: scroll;
+}
+#target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+.spacer {
+ height: 300px;
+}
+</style>
+
+<div id="root">
+ <div id="scroller">
+ <div class="spacer"></div>
+ <div id="target"></div>
+ <div class="spacer"></div>
+ </div>
+</div>
+
+<script>
+setup({message_events: [], output_document: window.parent.document});
+
+var entries = [];
+var root, scroller, target;
+
+runTestCycle(function() {
+ root = document.getElementById("root");
+ assert_true(!!root, "Root element exists.");
+ scroller = document.getElementById("scroller");
+ assert_true(!!scroller, "Scroller element exists.");
+ target = document.getElementById("target");
+ assert_true(!!target, "Target element exists.");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ }, {root: root});
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.")
+ runTestCycle(step1, "First rAF.");
+}, "IntersectionObserver in iframe with explicit root.");
+
+function step1() {
+ scroller.scrollTop = 250;
+ runTestCycle(step2, "scroller.scrollTop = 250");
+ checkLastEntry(entries, 0, [8, 108, 308, 408, 0, 0, 0, 0, 8, 208, 8, 208, false]);
+}
+
+function step2() {
+ checkLastEntry(entries, 1, [8, 108, 58, 158, 8, 108, 58, 158, 8, 208, 8, 208, true]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/resources/timestamp-subframe.html b/tests/wpt/web-platform-tests/intersection-observer/resources/timestamp-subframe.html
new file mode 100644
index 00000000000..143e4f6e23a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/resources/timestamp-subframe.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<style>
+#target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+.spacer {
+ width: height: 100px
+}
+</style>
+
+<div class="spacer"></div>
+<div id="target"></div>
+<div class="spacer"></div>
+
+<script>
+document.createObserverCallback = function(entries) {
+ return function(newEntries) {
+ for (var i in newEntries) {
+ entries.push(newEntries[i]);
+ }
+ };
+}
+document.createObserver = function(callback) {
+ return new IntersectionObserver(callback, {});
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/root-margin.html b/tests/wpt/web-platform-tests/intersection-observer/root-margin.html
new file mode 100644
index 00000000000..c1fffec02be
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/root-margin.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+#target {
+ display: inline-block;
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+.vertical-spacer {
+ height: calc(100vh + 100px);
+}
+.horizontal-spacer {
+ display: inline-block;
+ width: 120vw;
+}
+</style>
+
+<div class="vertical-spacer"></div>
+<div style="white-space:nowrap;">
+ <div class="horizontal-spacer"></div>
+ <div id="target"></div>
+ <div class="horizontal-spacer"></div>
+</div>
+<div class="vertical-spacer"></div>
+
+<script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+
+var entries = [];
+var target;
+
+runTestCycle(function() {
+ target = document.getElementById("target");
+ assert_true(!!target, "Target exists");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ }, { rootMargin: "10px 20% 40% 30px" });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF.");
+}, "Root margin tests");
+
+function step0() {
+ var targetBounds = clientBounds(target);
+ document.scrollingElement.scrollLeft = 100;
+ runTestCycle(step1, "document.scrollingElement.scrollLeft = 100");
+ checkLastEntry(entries, 0, targetBounds.concat(0, 0, 0, 0, -30, vw * 1.2, -10, vh * 1.4, false));
+}
+
+function step1() {
+ var targetBounds = clientBounds(target);
+ var sw = window.innerWidth - document.documentElement.clientWidth;
+ var sh = window.innerHeight - document.documentElement.clientHeight;
+ document.scrollingElement.scrollTop = vh + 200;
+ runTestCycle(step2, "document.scrollingElement.scrollTop = document.documentElement.clientHeight + 200");
+ checkLastEntry(entries, 1, targetBounds.concat(
+ targetBounds[0], Math.min(targetBounds[1], vw * 1.2), vh + 108 + sh, Math.min(vh + 208 + sw, vh * 1.4),
+ -30, vw * 1.2, -10, vh * 1.4,
+ true
+ ));
+}
+
+function step2() {
+ document.scrollingElement.scrollTop = vh + 300;
+ runTestCycle(step3, "document.scrollingElement.scrollTop = document.documentElement.clientHeight + 300");
+ checkLastEntry(entries, 1);
+}
+
+function step3() {
+ var targetBounds = clientBounds(target);
+ document.scrollingElement.scrollLeft = 0;
+ document.scrollingElement.scrollTop = 0;
+ checkLastEntry(entries, 2, targetBounds.concat(0, 0, 0, 0, -30, vw * 1.2, -10, vh * 1.4, false));
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/same-document-no-root.html b/tests/wpt/web-platform-tests/intersection-observer/same-document-no-root.html
new file mode 100644
index 00000000000..783880888ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/same-document-no-root.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+.spacer {
+ height: calc(100vh + 100px);
+}
+#target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+</style>
+
+<div class="spacer"></div>
+<div id="target"></div>
+<div class="spacer"></div>
+
+<script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+
+var entries = [];
+var target;
+
+runTestCycle(function() {
+ target = document.getElementById("target");
+ assert_true(!!target, "target exists");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF.");
+}, "IntersectionObserver in a single document using the implicit root.");
+
+function step0() {
+ document.scrollingElement.scrollTop = 300;
+ runTestCycle(step1, "document.scrollingElement.scrollTop = 300");
+ checkLastEntry(entries, 0, [8, 108, vh + 108, vh + 208, 0, 0, 0, 0, 0, vw, 0, vh, false]);
+}
+
+function step1() {
+ document.scrollingElement.scrollTop = 100;
+ runTestCycle(step2, "document.scrollingElement.scrollTop = 100");
+ checkLastEntry(entries, 1, [8, 108, vh - 192, vh - 92, 8, 108, vh - 192, vh - 92, 0, vw, 0, vh, true]);
+}
+
+function step2() {
+ document.scrollingElement.scrollTop = 0;
+ checkLastEntry(entries, 2, [8, 108, vh + 8, vh + 108, 0, 0, 0, 0, 0, vw, 0, vh, false]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/same-document-root.html b/tests/wpt/web-platform-tests/intersection-observer/same-document-root.html
new file mode 100644
index 00000000000..40467be72b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/same-document-root.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+.spacer {
+ height: calc(100vh + 100px);
+}
+#root {
+ display: inline-block;
+ overflow-y: scroll;
+ height: 200px;
+ border: 3px solid black;
+}
+#target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+</style>
+
+<div class="spacer"></div>
+<div id="root">
+ <div style="height: 300px;"></div>
+ <div id="target"></div>
+</div>
+<div class="spacer"></div>
+
+<script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+
+var entries = [];
+var root, target;
+
+runTestCycle(function() {
+ target = document.getElementById("target");
+ assert_true(!!target, "target exists");
+ root = document.getElementById("root");
+ assert_true(!!root, "root exists");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ }, { root: root });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF");
+}, "IntersectionObserver in a single document with explicit root.");
+
+function step0() {
+ document.scrollingElement.scrollTop = vh;
+ runTestCycle(step1, "document.scrollingElement.scrollTop = window.innerHeight.");
+ checkLastEntry(entries, 0, [ 11, 111, vh + 411, vh + 511, 0, 0, 0, 0, 11, 111, vh + 111, vh + 311, false]);
+}
+
+function step1() {
+ root.scrollTop = 150;
+ runTestCycle(step2, "root.scrollTop = 150 with root scrolled into view.");
+ assert_equals(entries.length, 1, "No notifications after scrolling frame.");
+}
+
+function step2() {
+ document.scrollingElement.scrollTop = 0;
+ runTestCycle(step3, "document.scrollingElement.scrollTop = 0.");
+ checkLastEntry(entries, 1, [11, 111, 261, 361, 11, 111, 261, 311, 11, 111, 111, 311, true]);
+}
+
+function step3() {
+ root.scrollTop = 0;
+ runTestCycle(step4, "root.scrollTop = 0");
+ checkLastEntry(entries, 1);
+}
+
+function step4() {
+ root.scrollTop = 150;
+ runTestCycle(step5, "root.scrollTop = 150 with root scrolled out of view.");
+ checkLastEntry(entries, 2, [11, 111, vh + 411, vh + 511, 0, 0, 0, 0, 11, 111, vh + 111, vh + 311, false]);
+}
+
+// This tests that notifications are generated even when the root element is off screen.
+function step5() {
+ checkLastEntry(entries, 3, [11, 111, vh + 261, vh + 361, 11, 111, vh + 261, vh + 311, 11, 111, vh + 111, vh + 311, true]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/same-document-zero-size-target.html b/tests/wpt/web-platform-tests/intersection-observer/same-document-zero-size-target.html
new file mode 100644
index 00000000000..d835b40634d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/same-document-zero-size-target.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+.spacer {
+ height: calc(100vh + 100px);
+}
+#target {
+ width: 0px;
+ height: 0px;
+ background-color: green;
+}
+</style>
+
+<div class="spacer"></div>
+<div id="target"></div>
+<div class="spacer"></div>
+
+<script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+
+var entries = [];
+var target;
+
+runTestCycle(function() {
+ target = document.getElementById("target");
+ assert_true(!!target, "Target exists");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF");
+}, "Observing a zero-area target.");
+
+function step0() {
+ document.scrollingElement.scrollTop = 300;
+ runTestCycle(step1, "document.scrollingElement.scrollTop = 300");
+ checkLastEntry(entries, 0, [8, 8, vh + 108, vh + 108, 0, 0, 0, 0, 0, vw, 0, vh, false]);
+}
+
+function step1() {
+ document.scrollingElement.scrollTop = 100;
+ runTestCycle(step2, "document.scrollingElement.scrollTop = 100");
+ checkLastEntry(entries, 1, [8, 8, vh - 192, vh - 192, 8, 8, vh - 192, vh - 192, 0, vw, 0, vh, true]);
+}
+
+function step2() {
+ document.scrollingElement.scrollTop = 0;
+ checkLastEntry(entries, 2, [8, 8, vh + 8, vh + 8, 0, 0, 0, 0, 0, vw, 0, vh, false]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/shadow-content.html b/tests/wpt/web-platform-tests/intersection-observer/shadow-content.html
new file mode 100644
index 00000000000..a0a6242050e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/shadow-content.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+</style>
+
+<div id="host"></div>
+
+<script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+
+var entries = [];
+var target;
+
+runTestCycle(function() {
+ var shadowHost = document.getElementById("host");
+ assert_true(!!shadowHost, "Host exists");
+ var shadowRoot = shadowHost.createShadowRoot();
+ assert_true(!!shadowRoot, "Shadow root exists");
+ shadowRoot.innerHTML = "<div id='target' style='width: 100px; height: 100px; background-color: green;'></div>";
+ target = shadowRoot.getElementById("target");
+ assert_true(!!target, "target exists");
+
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF after creating shadow DOM.");
+}, "Observing a target inside shadow DOM.");
+
+function step0() {
+ checkLastEntry(entries, 0, [8, 108, 8, 108, 8, 108, 8, 108, 0, vw, 0, vh, true]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/timestamp.html b/tests/wpt/web-platform-tests/intersection-observer/timestamp.html
new file mode 100644
index 00000000000..be1980040d2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/timestamp.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+.spacer {
+ height: calc(100vh + 100px);
+}
+
+</style>
+<div id="leading-space" class="spacer"></div>
+<div id="trailing-space" class="spacer"></div>
+
+<script>
+// Pick this number to be comfortably greater than the length of two frames at 60Hz.
+var timeSkew = 40;
+
+var topWindowEntries = [];
+var iframeWindowEntries = [];
+var targetIframe;
+var topWindowTimeBeforeNotification;
+var iframeWindowTimeBeforeNotification;
+
+async_test(function(t) {
+ t.step_timeout(function() {
+ targetIframe = document.createElement("iframe");
+ assert_true(!!targetIframe, "iframe exists");
+ targetIframe.src = "resources/timestamp-subframe.html";
+ var trailingSpace = document.getElementById("trailing-space");
+ assert_true(!!trailingSpace, "trailing-space exists");
+ trailingSpace.parentNode.insertBefore(targetIframe, trailingSpace);
+ targetIframe.onload = function() {
+ var target = targetIframe.contentDocument.getElementById("target");
+ var iframeScroller = targetIframe.contentDocument.scrollingElement;
+
+ // Observer created here, callback created in iframe context. Timestamps should be
+ // from this window.
+ var observer = new IntersectionObserver(
+ targetIframe.contentDocument.createObserverCallback(topWindowEntries), {});
+ assert_true(!!observer, "Observer exists");
+ observer.observe(target);
+
+ // Callback created here, observer created in iframe. Timestamps should be
+ // from iframe window.
+ observer = targetIframe.contentDocument.createObserver(function(newEntries) {
+ iframeWindowEntries = iframeWindowEntries.concat(newEntries);
+ });
+ observer.observe(target);
+ runTestCycle(step1, "First rAF after iframe is loaded.");
+ t.done();
+ };
+ }, timeSkew);
+}, "Check that timestamps correspond to the to execution context that created the observer.");
+
+function step1() {
+ document.scrollingElement.scrollTop = 200;
+ targetIframe.contentDocument.scrollingElement.scrollTop = 250;
+ topWindowTimeBeforeNotification = performance.now();
+ iframeWindowTimeBeforeNotification = targetIframe.contentWindow.performance.now();
+ runTestCycle(step2, "Generate notifications.");
+ assert_equals(topWindowEntries.length, 1, "One notification to top window observer.");
+ assert_equals(iframeWindowEntries.length, 1, "One notification to iframe observer.");
+}
+
+function step2() {
+ document.scrollingElement.scrollTop = 0;
+ var topWindowTimeAfterNotification = performance.now();
+ var iframeWindowTimeAfterNotification = targetIframe.contentWindow.performance.now();
+
+ assert_approx_equals(
+ topWindowEntries[1].time - topWindowTimeBeforeNotification,
+ iframeWindowEntries[1].time - iframeWindowTimeBeforeNotification,
+ // Since all intersections are computed in a tight loop between 2 frames,
+ // an epsilon of 16ms (the length of one frame at 60Hz) turned out to be
+ // reliable, even at slow frame rates.
+ 16,
+ "Notification times are relative to the expected time origins");
+
+ assert_equals(topWindowEntries.length, 2, "Top window observer has two notifications.");
+ assert_between_inclusive(
+ topWindowEntries[1].time,
+ topWindowTimeBeforeNotification,
+ topWindowTimeAfterNotification,
+ "Notification to top window observer is within the expected range.");
+
+ assert_equals(iframeWindowEntries.length, 2, "Iframe observer has two notifications.");
+ assert_between_inclusive(
+ iframeWindowEntries[1].time,
+ iframeWindowTimeBeforeNotification,
+ iframeWindowTimeAfterNotification,
+ "Notification to iframe observer is within the expected range.");
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/unclipped-root.html b/tests/wpt/web-platform-tests/intersection-observer/unclipped-root.html
new file mode 100644
index 00000000000..24ae01cedc2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/unclipped-root.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+#root {
+ overflow: visible;
+ height: 200px;
+ width: 160px;
+ border: 7px solid black;
+}
+#target {
+ width: 100px;
+ height: 100px;
+ background-color: green;
+}
+</style>
+
+<div id="root">
+ <div id="target" style="transform: translateY(300px)"></div>
+</div>
+
+<script>
+var entries = [];
+var target;
+
+runTestCycle(function() {
+ target = document.getElementById("target");
+ assert_true(!!target, "target exists");
+ var root = document.getElementById("root");
+ assert_true(!!root, "root exists");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ }, {root: root});
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF.");
+}, "Test that border bounding box is used to calculate intersection with a non-scrolling root.");
+
+function step0() {
+ target.style.transform = "translateY(195px)";
+ runTestCycle(step1, "target.style.transform = 'translateY(195px)'");
+ checkLastEntry(entries, 0, [15, 115, 315, 415, 0, 0, 0, 0, 8, 182, 8, 222, false]);
+}
+
+function step1() {
+ target.style.transform = "";
+ checkLastEntry(entries, 1, [15, 115, 210, 310, 15, 115, 210, 222, 8, 182, 8, 222, true]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/zero-area-element-hidden.html b/tests/wpt/web-platform-tests/intersection-observer/zero-area-element-hidden.html
new file mode 100644
index 00000000000..e007040c8fe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/zero-area-element-hidden.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+#target {
+ width: 0px;
+ height: 0px;
+ position: fixed;
+ top: -1000px;
+}
+</style>
+
+<div id='target'></div>
+
+<script>
+var vw = document.documentElement.clientWidth;
+var vh = document.documentElement.clientHeight;
+
+var entries = [];
+
+runTestCycle(function() {
+ var target = document.getElementById('target');
+ assert_true(!!target, "target exists");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF.");
+}, "A zero-area hidden target should not be intersecting.");
+
+function step0() {
+ checkLastEntry(entries, 0, [8, 8, -1000, -1000, 0, 0, 0, 0, 0, vw, 0, vh, false]);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/intersection-observer/zero-area-element-visible.html b/tests/wpt/web-platform-tests/intersection-observer/zero-area-element-visible.html
new file mode 100644
index 00000000000..6bf1297fe45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/intersection-observer/zero-area-element-visible.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/intersection-observer-test-utils.js"></script>
+
+<style>
+pre, #log {
+ position: absolute;
+ top: 0;
+ left: 200px;
+}
+#target {
+ width: 0px;
+ height: 0px;
+}
+</style>
+
+<div id='target'></div>
+
+<script>
+var entries = [];
+
+runTestCycle(function() {
+ var target = document.getElementById('target');
+ assert_true(!!target, "target exists");
+ var observer = new IntersectionObserver(function(changes) {
+ entries = entries.concat(changes)
+ });
+ observer.observe(target);
+ entries = entries.concat(observer.takeRecords());
+ assert_equals(entries.length, 0, "No initial notifications.");
+ runTestCycle(step0, "First rAF should generate a notification.");
+}, "Ensure that a zero-area target intersecting root generates a notification with intersectionRatio == 1");
+
+function step0() {
+ assert_equals(entries.length, 1, "One notification.");
+ assert_equals(entries[0].intersectionRatio, 1, "intersectionRatio == 1");
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/lint b/tests/wpt/web-platform-tests/lint
deleted file mode 100755
index 388db4f7fd5..00000000000
--- a/tests/wpt/web-platform-tests/lint
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env python
-import sys
-
-try:
- from tools.lint import lint
-except ImportError:
- print("tools.lint not found.")
- sys.exit(2)
-
-args = lint.parse_args()
-sys.exit(0 if lint.main(**vars(args)) == 0 else 1)
diff --git a/tests/wpt/web-platform-tests/lint.whitelist b/tests/wpt/web-platform-tests/lint.whitelist
index a5b620a39bd..e456520a5b7 100644
--- a/tests/wpt/web-platform-tests/lint.whitelist
+++ b/tests/wpt/web-platform-tests/lint.whitelist
@@ -14,7 +14,6 @@ INDENT TABS: app-uri/*
INDENT TABS: conformance-checkers/*
INDENT TABS: content-security-policy/*
INDENT TABS: custom-elements/*
-INDENT TABS: html/editing/dnd/*
INDENT TABS: old-tests/*
INDENT TABS: pointerlock/*
INDENT TABS: shadow-dom/*
@@ -28,6 +27,7 @@ INDENT TABS: XMLHttpRequest/*
INDENT TABS: encoding/legacy*/*
INDENT TABS: encrypted-media/polyfill/Makefile
+TRAILING WHITESPACE: 2dcontext/tools/current-work-canvas.xhtml
TRAILING WHITESPACE: app-uri/*
TRAILING WHITESPACE: battery-status/*
TRAILING WHITESPACE: conformance-checkers/*
@@ -88,7 +88,16 @@ W3C-TEST.ORG:tools/*
PRINT STATEMENT:tools/*
W3C-TEST.ORG:*/tools/*
PRINT STATEMENT:*/tools/*
-PRINT STATEMENT:wptrun.py
+
+## Deliberate copies of Ahem ##
+# The allowed copy
+AHEM COPY: fonts/Ahem.ttf
+
+# None of these are actually Ahem
+AHEM COPY: css/fonts/ahem-extra/AHEM_*.TTF
+
+# https://github.com/w3c/web-platform-tests/issues/7437
+AHEM COPY: css/vendor-imports/mozilla/mozilla-central-reftests/*/Ahem.ttf
### Test exclusions ##
@@ -152,16 +161,40 @@ SET TIMEOUT: cookies/resources/testharness-helpers.js
SET TIMEOUT: common/reftest-wait.js
SET TIMEOUT: conformance-checkers/*
SET TIMEOUT: content-security-policy/*
-SET TIMEOUT: css-font-display/font-display.html
+SET TIMEOUT: css-fonts/font-display/font-display.html
SET TIMEOUT: encrypted-media/Google/migrated_to_root_disabled/encrypted-media-utils.js
SET TIMEOUT: encrypted-media/polyfill/chrome-polyfill.js
SET TIMEOUT: encrypted-media/polyfill/clearkey-polyfill.js
SET TIMEOUT: encrypted-media/scripts/playback-temporary-events.js
SET TIMEOUT: eventsource/eventsource-close.htm
SET TIMEOUT: eventsource/eventsource-request-cancellation.htm
-SET TIMEOUT: html/*
+SET TIMEOUT: html/browsers/browsing-the-web/history-traversal/*
+SET TIMEOUT: html/browsers/browsing-the-web/navigating-across-documents/*
+SET TIMEOUT: html/browsers/browsing-the-web/scroll-to-fragid/*
+SET TIMEOUT: html/browsers/browsing-the-web/unloading-documents/*
+SET TIMEOUT: html/browsers/history/the-history-interface/*
+SET TIMEOUT: html/browsers/history/the-location-interface/*
+SET TIMEOUT: html/browsers/offline/*
+SET TIMEOUT: html/browsers/the-window-object/*
+SET TIMEOUT: html/browsers/windows/auxiliary-browsing-contexts/resources/close-opener.html
+SET TIMEOUT: html/dom/documents/dom-tree-accessors/Document.currentScript.html
+SET TIMEOUT: html/dom/documents/resource-metadata-management/document-lastModified-01.html
+SET TIMEOUT: html/dom/dynamic-markup-insertion/opening-the-input-stream/*
+SET TIMEOUT: html/editing/dnd/*
+SET TIMEOUT: html/infrastructure/urls/resolving-urls/query-encoding/resources/resolve-url.js
+SET TIMEOUT: html/semantics/embedded-content/media-elements/*
+SET TIMEOUT: html/semantics/embedded-content/the-iframe-element/*
+SET TIMEOUT: html/semantics/embedded-content/the-img-element/*
+SET TIMEOUT: html/semantics/forms/textfieldselection/textfieldselection-setRangeText.html
+SET TIMEOUT: html/semantics/forms/the-input-element/checkbox.html
+SET TIMEOUT: html/semantics/interactive-elements/the-details-element/toggleEvent.html
+SET TIMEOUT: html/semantics/scripting-1/the-script-element/*
+SET TIMEOUT: html/syntax/parsing/DOMContentLoaded-defer-support.js
+SET TIMEOUT: html/webappapis/animation-frames/same-dispatch-time.html
+SET TIMEOUT: html/webappapis/scripting/event-loops/*
+SET TIMEOUT: html/webappapis/scripting/events/event-handler-processing-algorithm-error/*
+SET TIMEOUT: html/webappapis/scripting/processing-model-2/*
SET TIMEOUT: IndexedDB/*
-SET TIMEOUT: longtask-timing/longtask-in-parentiframe.html
SET TIMEOUT: infrastructure/*
SET TIMEOUT: media-source/mediasource-util.js
SET TIMEOUT: media-source/URL-createObjectURL-revoke.html
@@ -171,14 +204,15 @@ SET TIMEOUT: offscreen-canvas/the-offscreen-canvas/*
SET TIMEOUT: old-tests/submission/Microsoft/history/history_000.htm
SET TIMEOUT: old-tests/submission/Microsoft/sandbox/*
SET TIMEOUT: old-tests/submission/Microsoft/structuredclone/structuredclone_0.html
-SET TIMEOUT: old-tests/submission/Opera/script_scheduling/*
SET TIMEOUT: old-tests/webdriver/timeouts/res/implicit_waits_tests.html
SET TIMEOUT: page-visibility/resources/pagevistestharness.js
SET TIMEOUT: payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html
SET TIMEOUT: payment-request/payment-request-response-id.html
SET TIMEOUT: pointerevents/pointerevent_support.js
SET TIMEOUT: preload/single-download-preload.html
+SET TIMEOUT: resize-observer/resources/iframe.html
SET TIMEOUT: resource-timing/resource-timing.js
+SET TIMEOUT: resource-timing/single-entry-per-resource.html
SET TIMEOUT: screen-orientation/lock-bad-argument.html
SET TIMEOUT: screen-orientation/onchange-event.html
SET TIMEOUT: screen-orientation/resources/sandboxed-iframe-locking.html
@@ -191,7 +225,8 @@ SET TIMEOUT: service-workers/service-worker/update-recovery.https.html
SET TIMEOUT: service-workers/service-worker/resources/extendable-event-async-waituntil.js
SET TIMEOUT: service-workers/service-worker/resources/fetch-event-async-respond-with-worker.js
SET TIMEOUT: service-workers/service-worker/resources/fetch-event-test-worker.js
-SET TIMEOUT: service-workers/service-worker/resources/opaque-response-preloaded-iframe.html
+SET TIMEOUT: service-workers/service-worker/resources/opaque-response-being-preloaded-xhr.html
+SET TIMEOUT: service-workers/service-worker/resources/opaque-response-preloaded-xhr.html
SET TIMEOUT: service-workers/service-worker/resources/performance-timeline-worker.js
SET TIMEOUT: service-workers/service-worker/resources/register-foreign-fetch-errors-worker.js
SET TIMEOUT: shadow-dom/Document-prototype-currentScript.html
@@ -220,6 +255,76 @@ SET TIMEOUT: XMLHttpRequest/xmlhttprequest-timeout-reused.html
SET TIMEOUT: XMLHttpRequest/resources/init.htm
SET TIMEOUT: XMLHttpRequest/resources/xmlhttprequest-timeout.js
+# generate_tests usage (should be got rid of)
+GENERATE_TESTS: 2dcontext/drawing-images-to-the-canvas/*
+GENERATE_TESTS: css/css-shapes-1/shape-outside/values/*
+GENERATE_TESTS: css/css-tables-3/bounding-box-computation-1.html
+GENERATE_TESTS: css/css-tables-3/bounding-box-computation-2.html
+GENERATE_TESTS: css/css-tables-3/bounding-box-computation-3.html
+GENERATE_TESTS: css/css-tables-3/caption-side-1.html
+GENERATE_TESTS: css/css-tables-3/fixed-layout-1.html
+GENERATE_TESTS: css/css-tables-3/fixed-layout-2.html
+GENERATE_TESTS: css/css-tables-3/height-distribution/computing-row-measure-0.html
+GENERATE_TESTS: css/css-tables-3/height-distribution/computing-row-measure-1.html
+GENERATE_TESTS: css/css-tables-3/height-distribution/percentage-sizing-of-table-cell-children.html
+GENERATE_TESTS: css/css-tables-3/height-distribution/percentage-sizing-of-table-cell-children.html
+GENERATE_TESTS: css/css-tables-3/html-to-css-mapping-1.html
+GENERATE_TESTS: css/css-tables-3/html-to-css-mapping-2.html
+GENERATE_TESTS: css/css-tables-3/html5-table-formatting-1.html
+GENERATE_TESTS: css/css-tables-3/html5-table-formatting-1.html
+GENERATE_TESTS: css/css-tables-3/html5-table-formatting-2.html
+GENERATE_TESTS: css/css-tables-3/html5-table-formatting-3.html
+GENERATE_TESTS: css/css-tables-3/html5-table-formatting-fixed-layout-1.html
+GENERATE_TESTS: css/css-tables-3/table-model-fixup-2.html
+GENERATE_TESTS: css/css-tables-3/table-model-fixup-2.html
+GENERATE_TESTS: css/css-tables-3/table-model-fixup-2.html
+GENERATE_TESTS: css/css-tables-3/table-model-fixup.html
+GENERATE_TESTS: css/css-tables-3/visibility-collapse-col-001.html
+GENERATE_TESTS: css/css-tables-3/visibility-collapse-row-001.html
+GENERATE_TESTS: css/css-tables-3/width-distribution/computing-column-measure-0.html
+GENERATE_TESTS: css/css-tables-3/width-distribution/computing-column-measure-1.html
+GENERATE_TESTS: css/css-tables-3/width-distribution/computing-table-width-0.html
+GENERATE_TESTS: css/css-tables-3/width-distribution/computing-table-width-1.html
+GENERATE_TESTS: css/css-tables-3/width-distribution/distribution-algo-1.html
+GENERATE_TESTS: css/css-tables-3/width-distribution/distribution-algo-2.html
+GENERATE_TESTS: css/css-tables-3/width-distribution/distribution-algo-min-content-guess.html
+GENERATE_TESTS: css/css-tables-3/width-distribution/distribution-algo-min-content-percent-guess.html
+GENERATE_TESTS: css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.1.html
+GENERATE_TESTS: css/css-tables-3/width-distribution/distribution-algo-min-content-specified-guess.html
+GENERATE_TESTS: css/work-in-progress/ttwf_sf/divya/index-002.html
+GENERATE_TESTS: cssom/index-002.html
+GENERATE_TESTS: dom/nodes/case.js
+GENERATE_TESTS: dom/ranges/Range-cloneRange.html
+GENERATE_TESTS: dom/ranges/Range-collapse.html
+GENERATE_TESTS: dom/ranges/Range-mutations.js
+GENERATE_TESTS: dom/ranges/Range-selectNode.html
+GENERATE_TESTS: dom/ranges/Range-set.html
+GENERATE_TESTS: dom/traversal/NodeIterator.html
+GENERATE_TESTS: dom/traversal/TreeWalker.html
+GENERATE_TESTS: domparsing/createContextualFragment.html
+GENERATE_TESTS: domxpath/001.html
+GENERATE_TESTS: domxpath/002.html
+GENERATE_TESTS: html/semantics/scripting-1/the-template-element/template-element/template-as-a-descendant.html
+GENERATE_TESTS: html/syntax/parsing/Document.getElementsByTagName-foreign-01.html
+GENERATE_TESTS: html/syntax/parsing/template/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context.html
+GENERATE_TESTS: html/syntax/parsing/template/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context.html
+GENERATE_TESTS: html/syntax/parsing/template/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context.html
+GENERATE_TESTS: html/syntax/parsing/template/creating-an-element-for-the-token/template-owner-document.html
+GENERATE_TESTS: html/syntax/serializing-html-fragments/serializing.html
+GENERATE_TESTS: html/webappapis/atob/base64.html
+GENERATE_TESTS: mediacapture-fromelement/capture.html
+GENERATE_TESTS: mediacapture-fromelement/creation.html
+GENERATE_TESTS: mediacapture-fromelement/ended.html
+GENERATE_TESTS: offscreen-canvas/filter/offscreencanvas.filter.html
+GENERATE_TESTS: pointerevents/pointerevent_constructor.html
+GENERATE_TESTS: pointerevents/extension/pointerevent_constructor.html
+GENERATE_TESTS: selection/collapse.js
+GENERATE_TESTS: shadow-dom/leaktests/html-collection.html
+GENERATE_TESTS: shadow-dom/untriaged/shadow-trees/upper-boundary-encapsulation/dom-tree-accessors-001.html
+GENERATE_TESTS: shadow-dom/untriaged/shadow-trees/upper-boundary-encapsulation/ownerdocument-002.html
+GENERATE_TESTS: shadow-dom/untriaged/shadow-trees/upper-boundary-encapsulation/window-named-properties-002.html
+GENERATE_TESTS: shadow-dom/untriaged/shadow-trees/upper-boundary-encapsulation/window-named-properties-003.html
+
# Intentional use of setTimeout
SET TIMEOUT: html/webappapis/timers/*
@@ -324,27 +429,6 @@ SUPPORT-WRONG-DIR: css/vendor-imports/mozilla/mozilla-central-reftests/transform
SUPPORT-WRONG-DIR: css/WOFF2/manifest.txt
SUPPORT-WRONG-DIR: css/WOFF2/testcaseindex.xht
NON-EXISTENT-REF: css/css-masking-1/clip-path-svg-content/clip-path-clip-rule-008.svg
-NON-EXISTENT-REF: css/css-masking-1/clip-path-svg-content/clip-path-precision-001.svg
-NON-EXISTENT-REF: css/css-shapes-1/spec-examples/shape-outside-012.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-001.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-002.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-003.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-004.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-005.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-006.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-007.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-008.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-009.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-010.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-011.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-ic-001.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-ic-002.html
-NON-EXISTENT-REF: css/css-text-3/line-breaking/line-breaking-ic-003.html
-NON-EXISTENT-REF: css/CSS2/tables/border-collapse-005.html
-NON-EXISTENT-REF: css/mediaqueries-3/relative-units-002.html
-NON-EXISTENT-REF: css/mediaqueries-3/relative-units-003.html
-NON-EXISTENT-REF: css/mediaqueries-3/relative-units-004.html
-SAME-FILE-REF: css/css-multicol-1/multicol-rule-shorthand-2.xht
## Whitespace rules that we can't enforce yet
@@ -467,7 +551,7 @@ SET TIMEOUT: css/css-transitions-2/transitioncancel-001.html
SET TIMEOUT: css/css-values-3/reference/vh_not_refreshing_on_chrome-ref.html
SET TIMEOUT: css/css-values-3/reference/vh_not_refreshing_on_chrome_iframe-ref.html
SET TIMEOUT: css/css-values-3/vh_not_refreshing_on_chrome.html
-SET TIMEOUT: css/css-values-3/vh_not_refreshing_on_chrome_iframe.html
+SET TIMEOUT: css/css-values-3/support/vh_not_refreshing_on_chrome_iframe.html
SET TIMEOUT: css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001.html
SET TIMEOUT: css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001a.html
SET TIMEOUT: css/css-writing-modes-3/orthogonal-parent-shrink-to-fit-001b.html
@@ -780,3 +864,8 @@ WEBIDL2.JS:.gitmodules
# Manual test that uses console.logs for feedback
CONSOLE:payment-request/payment-request-response-id.html
+
+# Tests that use WebKit/Blink testing APIs
+LAYOUTTESTS APIS: css/css-regions-1/interactivity/*
+LAYOUTTESTS APIS: css/work-in-progress/opera/css-device-adapt/template.blink.html
+LAYOUTTESTS APIS: webgl/conformance-1.0.3/*
diff --git a/tests/wpt/web-platform-tests/longtask-timing/OWNERS b/tests/wpt/web-platform-tests/longtask-timing/OWNERS
new file mode 100644
index 00000000000..08ce2f9a493
--- /dev/null
+++ b/tests/wpt/web-platform-tests/longtask-timing/OWNERS
@@ -0,0 +1,2 @@
+@spanicker
+@npm1
diff --git a/tests/wpt/web-platform-tests/longtask-timing/longtask-attributes.html b/tests/wpt/web-platform-tests/longtask-timing/longtask-attributes.html
index 5f4d89d5fb1..6e86fc6f673 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/longtask-attributes.html
+++ b/tests/wpt/web-platform-tests/longtask-timing/longtask-attributes.html
@@ -10,40 +10,41 @@
<div id="log"></div>
<script>
async_test(function (t) {
- var observer = new PerformanceObserver(
+ const observer = new PerformanceObserver(
t.step_func(function (entryList) {
- var entries = entryList.getEntries();
+ const entries = entryList.getEntries();
assert_equals(entries.length, 1,
- "Exactly one entry is expected.");
- var longtask = entries[0];
- assert_equals(longtask.entryType, "longtask");
- assert_equals(longtask.name, "same-origin-self");
+ 'Exactly one entry is expected.');
+ const longtask = entries[0];
+ assert_equals(longtask.entryType, 'longtask');
+ assert_equals(longtask.name, 'self');
assert_greater_than(longtask.duration, 50);
- assert_equals(longtask.startTime, Math.floor(longtask.startTime),
- "startTime expected to have 1 millisecond granularity");
+ assert_greater_than_equal(longtask.startTime, 0);
+ const currentTime = performance.now();
+ assert_less_than_equal(longtask.startTime, currentTime);
// Assert the TaskAttributionTiming entry in attribution.
assert_equals(longtask.attribution.length, 1,
- "Exactly one attribution entry is expected");
- var attribution = longtask.attribution[0];
- assert_equals(attribution.entryType, "taskattribution");
- assert_equals(attribution.name, "frame");
+ 'Exactly one attribution entry is expected');
+ const attribution = longtask.attribution[0];
+ assert_equals(attribution.entryType, 'taskattribution');
+ assert_equals(attribution.name, 'script');
assert_equals(attribution.duration, 0);
assert_equals(attribution.startTime, 0);
- assert_equals(attribution.frameId, "");
- assert_equals(attribution.frameName, "");
- assert_equals(attribution.frameSrc, "");
+ assert_equals(attribution.containerId, '');
+ assert_equals(attribution.containerName, '');
+ assert_equals(attribution.containerSrc, '');
observer.disconnect();
t.done();
})
);
- observer.observe({entryTypes: ["longtask"]});
+ observer.observe({entryTypes: ['longtask']});
/* Generate a slow task */
- var begin = window.performance.now();
+ const begin = window.performance.now();
while (window.performance.now() < begin + 51);
-}, "Performance longtask entries are observable");
+}, 'Performance longtask entries are observable.');
</script>
</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-childiframe-crossorigin.html b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-childiframe-crossorigin.html
index 7a627c6583a..4ad9a740efc 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-childiframe-crossorigin.html
+++ b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-childiframe-crossorigin.html
@@ -10,39 +10,44 @@
<div id="log"></div>
<script>
async_test(function (t) {
- var observer = new PerformanceObserver(
+ const observer = new PerformanceObserver(
t.step_func(function (entryList) {
- var entries = entryList.getEntries();
+ const entries = entryList.getEntries();
assert_equals(entries.length, 1,
- "Exactly one entry is expected.");
- var longtask = entries[0];
- assert_equals(longtask.entryType, "longtask");
- assert_equals(longtask.name, "cross-origin-descendant");
+ 'Exactly one entry is expected.');
+ const longtask = entries[0];
+ assert_equals(longtask.entryType, 'longtask');
+ if (longtask.name == 'self' ||
+ longtask.name == 'multiple-contexts' ||
+ longtask.name == 'unknown')
+ return;
+ assert_equals(longtask.name, 'cross-origin-descendant');
assert_greater_than(longtask.duration, 50);
- assert_equals(longtask.startTime, Math.floor(longtask.startTime),
- "startTime expected to have 1 millisecond granularity");
// Assert the TaskAttributionTiming entry in attribution.
assert_equals(longtask.attribution.length, 1,
- "Exactly one attribution entry is expected");
- var attribution = longtask.attribution[0];
- assert_equals(attribution.entryType, "taskattribution");
- assert_equals(attribution.name, "frame");
+ 'Exactly one attribution entry is expected');
+ const attribution = longtask.attribution[0];
+ assert_equals(attribution.entryType, 'taskattribution');
+ assert_equals(attribution.name, 'script');
assert_equals(attribution.duration, 0);
assert_equals(attribution.startTime, 0);
- assert_equals(attribution.frameId, "child-iframe-id");
- assert_equals(attribution.frameName, "child-iframe-name");
- assert_equals(attribution.frameSrc, "http://www1.web-platform.test:8000/longtask-timing/resources/subframe-with-longtask.html");
+ assert_equals(attribution.containerId, 'child-iframe-id');
+ assert_equals(attribution.containerName, 'child-iframe-name');
+ assert_equals(attribution.containerSrc,
+ 'http://www1.web-platform.test:8000/longtask-timing/resources/subframe-with-longtask.html');
observer.disconnect();
t.done();
})
);
- observer.observe({entryTypes: ["longtask"]});
-
-}, "Performance longtask entries in child iframe are observable in parent");
+ observer.observe({entryTypes: ['longtask']});
+ const iframe = document.createElement('iframe');
+ iframe.id = 'child-iframe-id';
+ iframe.name = 'child-iframe-name';
+ document.body.appendChild(iframe);
+ // TODO(panicker): simulate cross-origin instead
+ iframe.src = 'http://www1.web-platform.test:8000/longtask-timing/resources/subframe-with-longtask.html';
+}, 'Performance longtask entries in child iframe are observable in parent.');
</script>
-<!--TODO(panicker): simulate cross-origin instead -->
-<iframe src="http://www1.web-platform.test:8000/longtask-timing/resources/subframe-with-longtask.html" id="child-iframe-id" name="child-iframe-name"></iframe>
-
-</body> \ No newline at end of file
+</body>
diff --git a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-childiframe.html b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-childiframe.html
index 53c27c3b526..46aca3051e2 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-childiframe.html
+++ b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-childiframe.html
@@ -9,40 +9,48 @@
<h1>Long Task in Nested Child Iframe</h1>
<div id="log"></div>
<script>
+ const initialTime = performance.now();
async_test(function (t) {
- var observer = new PerformanceObserver(
+ const observer = new PerformanceObserver(
t.step_func(function (entryList) {
- var entries = entryList.getEntries();
+ const entries = entryList.getEntries();
assert_equals(entries.length, 1,
- "Exactly one entry is expected.");
- var longtask = entries[0];
- assert_equals(longtask.entryType, "longtask");
- assert_equals(longtask.name, "same-origin-descendant");
+ 'Exactly one entry is expected.');
+ const longtask = entries[0];
+ assert_equals(longtask.entryType, 'longtask');
+ if (longtask.name == 'self' ||
+ longtask.name == 'multiple-contexts' ||
+ longtask.name == 'unknown')
+ return;
+
+ assert_equals(longtask.name, 'same-origin-descendant');
assert_greater_than(longtask.duration, 50);
- assert_equals(longtask.startTime, Math.floor(longtask.startTime),
- "startTime expected to have 1 millisecond granularity");
+ assert_greater_than_equal(longtask.startTime, initialTime);
+ const currentTime = performance.now();
+ assert_less_than_equal(longtask.startTime, currentTime);
// Assert the TaskAttributionTiming entry in attribution.
assert_equals(longtask.attribution.length, 1,
- "Exactly one attribution entry is expected");
- var attribution = longtask.attribution[0];
- assert_equals(attribution.entryType, "taskattribution");
- assert_equals(attribution.name, "frame");
+ 'Exactly one attribution entry is expected');
+ const attribution = longtask.attribution[0];
+ assert_equals(attribution.entryType, 'taskattribution');
+ assert_equals(attribution.name, 'script');
assert_equals(attribution.duration, 0);
assert_equals(attribution.startTime, 0);
- assert_equals(attribution.frameId, "child-iframe-id");
- assert_equals(attribution.frameName, "child-iframe-name");
- assert_equals(attribution.frameSrc, "resources/subframe-with-longtask.html");
+ assert_equals(attribution.containerId, 'child-iframe-id');
+ assert_equals(attribution.containerName, 'child-iframe-name');
+ assert_equals(attribution.containerSrc, 'resources/subframe-with-longtask.html');
observer.disconnect();
t.done();
})
);
- observer.observe({entryTypes: ["longtask"]});
-
-}, "Performance longtask entries in child iframe are observable in parent");
-
+ observer.observe({entryTypes: ['longtask']});
+ const iframe = document.createElement('iframe');
+ iframe.id = 'child-iframe-id';
+ iframe.name = 'child-iframe-name';
+ document.body.appendChild(iframe);
+ iframe.src = 'resources/subframe-with-longtask.html';
+}, 'Performance longtask entries in child iframe are observable in parent.');
</script>
-<iframe src="resources/subframe-with-longtask.html" id="child-iframe-id" name="child-iframe-name"></iframe>
-
-</body> \ No newline at end of file
+</body>
diff --git a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-externalscript.html b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-externalscript.html
index 91d74b97ed3..54d40737e52 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-externalscript.html
+++ b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-externalscript.html
@@ -11,36 +11,33 @@
<div id="log"></div>
<script>
async_test(function (t) {
- var observer = new PerformanceObserver(
+ const observer = new PerformanceObserver(
t.step_func(function (entryList) {
- var entries = entryList.getEntries();
+ const entries = entryList.getEntries();
assert_equals(entries.length, 1,
- "Exactly one entry is expected.");
- var longtask = entries[0];
- assert_equals(longtask.entryType, "longtask");
- assert_equals(longtask.name, "same-origin-self");
+ 'Exactly one entry is expected.');
+ const longtask = entries[0];
+ assert_equals(longtask.entryType, 'longtask');
+ assert_equals(longtask.name, 'self');
assert_greater_than(longtask.duration, 50);
- assert_equals(longtask.startTime, Math.floor(longtask.startTime),
- "startTime expected to have 1 millisecond granularity");
// Assert the TaskAttributionTiming entry in attribution.
assert_equals(longtask.attribution.length, 1,
- "Exactly one attribution entry is expected");
- var attribution = longtask.attribution[0];
- assert_equals(attribution.entryType, "taskattribution");
- assert_equals(attribution.name, "frame");
+ 'Exactly one attribution entry is expected');
+ const attribution = longtask.attribution[0];
+ assert_equals(attribution.entryType, 'taskattribution');
+ assert_equals(attribution.name, 'script');
assert_equals(attribution.duration, 0);
assert_equals(attribution.startTime, 0);
- assert_equals(attribution.frameId, "");
- assert_equals(attribution.frameName, "");
- assert_equals(attribution.frameSrc, "");
+ assert_equals(attribution.containerId, '');
+ assert_equals(attribution.containerName, '');
+ assert_equals(attribution.containerSrc, '');
observer.disconnect();
t.done();
})
);
- observer.observe({entryTypes: ["longtask"]});
-
-}, "Performance longtask entries are observable");
+ observer.observe({entryTypes: ['longtask']});
+}, 'Performance longtask entries are observable.');
</script>
</body> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-parentiframe.html b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-parentiframe.html
index 356e785c21e..71f309a30e0 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-parentiframe.html
+++ b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-parentiframe.html
@@ -7,21 +7,24 @@
<script src="/resources/testharnessreport.js"></script>
<script>
- async_test(t => {
- window.addEventListener("message", t.step_func(e => {
- assert_equals(e.data, "longtask+same-origin-ancestor+frame");
+ const t = async_test(t => {
+ window.addEventListener('message', t.step_func(e => {
+ assert_equals(e.data, 'longtask+same-origin-ancestor+script+++');
t.done();
}));
-}, "Performance longtask entries in parent are observable in child iframe");
-</script>
-
-<iframe src="resources/subframe-observing-longtask.html" id="child-iframe-id" name="child-iframe-name"></iframe>
+ }, 'Performance longtask entries in parent are observable in child iframe.');
-<script>
- setTimeout(function(){
- var begin = window.performance.now();
- while (window.performance.now() < begin + 51);
- }, 50);
+ const iframe = document.createElement('iframe');
+ iframe.onload = function() {
+ t.step_timeout(function(){
+ const begin = window.performance.now();
+ while (window.performance.now() < begin + 51);
+ }, 50);
+ }
+ iframe.id = 'child-iframe-id';
+ iframe.name = 'child-iframe-name';
+ document.body.appendChild(iframe);
+ iframe.src = 'resources/subframe-observing-longtask.html';
</script>
-</body> \ No newline at end of file
+</body>
diff --git a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-raf.html b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-raf.html
index 850dff9895a..5407f53b438 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-raf.html
+++ b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-raf.html
@@ -11,36 +11,33 @@
<div id="log"></div>
<script>
async_test(function (t) {
- var observer = new PerformanceObserver(
+ const observer = new PerformanceObserver(
t.step_func(function (entryList) {
- var entries = entryList.getEntries();
+ const entries = entryList.getEntries();
assert_equals(entries.length, 1,
- "Exactly one entry is expected.");
- var longtask = entries[0];
- assert_equals(longtask.entryType, "longtask");
- assert_equals(longtask.name, "same-origin-self");
+ 'Exactly one entry is expected.');
+ const longtask = entries[0];
+ assert_equals(longtask.entryType, 'longtask');
+ assert_equals(longtask.name, 'self');
assert_greater_than(longtask.duration, 50);
- assert_equals(longtask.startTime, Math.floor(longtask.startTime),
- "startTime expected to have 1 millisecond granularity");
// Assert the TaskAttributionTiming entry in attribution.
assert_equals(longtask.attribution.length, 1,
- "Exactly one attribution entry is expected");
- var attribution = longtask.attribution[0];
- assert_equals(attribution.entryType, "taskattribution");
- assert_equals(attribution.name, "frame");
+ 'Exactly one attribution entry is expected');
+ const attribution = longtask.attribution[0];
+ assert_equals(attribution.entryType, 'taskattribution');
+ assert_equals(attribution.name, 'script');
assert_equals(attribution.duration, 0);
assert_equals(attribution.startTime, 0);
- assert_equals(attribution.frameId, "");
- assert_equals(attribution.frameName, "");
- assert_equals(attribution.frameSrc, "");
+ assert_equals(attribution.containerId, '');
+ assert_equals(attribution.containerName, '');
+ assert_equals(attribution.containerSrc, '');
observer.disconnect();
t.done();
})
);
- observer.observe({entryTypes: ["longtask"]});
-
-}, "Performance longtask entries are observable");
+ observer.observe({entryTypes: ['longtask']});
+}, 'Performance longtask entries are observable.');
</script>
-</body> \ No newline at end of file
+</body>
diff --git a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-sibling-iframe-crossorigin.html b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-sibling-iframe-crossorigin.html
index f4633f55a89..503d8784420 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-sibling-iframe-crossorigin.html
+++ b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-sibling-iframe-crossorigin.html
@@ -8,22 +8,22 @@
<script>
async_test(t => {
- window.addEventListener("message", t.step_func(e => {
- assert_equals(e.data, "longtask+cross-origin-unreachable+frame");
+ window.addEventListener('message', t.step_func(e => {
+ assert_equals(e.data, 'longtask+cross-origin-unreachable+script+++');
t.done();
}));
-}, "Performance longtask entries in parent are observable in child iframe");
+}, 'Performance longtask entries in parent are observable in child iframe.');
</script>
<iframe src="resources/subframe-observing-longtask.html"></iframe>
<script>
/* Create a cross-origin iframe that generates a long task. */
- var iframe = document.createElement('iframe');
+ const iframe = document.createElement('iframe');
iframe.id = 'child-iframe-id';
iframe.name = 'child-iframe-name';
document.body.appendChild(iframe);
- iframe.src = 'http://www1.web-platform.test:8000/longtask-timing/resources/subframe-with-longtask.html'
+ iframe.src = 'http://www1.web-platform.test:8000/longtask-timing/resources/subframe-with-longtask.html';
</script>
-</body> \ No newline at end of file
+</body>
diff --git a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-sibling-iframe.html b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-sibling-iframe.html
index 40a91139365..9f536218884 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/longtask-in-sibling-iframe.html
+++ b/tests/wpt/web-platform-tests/longtask-timing/longtask-in-sibling-iframe.html
@@ -8,21 +8,22 @@
<script>
async_test(t => {
- window.addEventListener("message", t.step_func(e => {
- assert_equals(e.data, "longtask+same-origin+frame");
+ window.addEventListener('message', t.step_func(e => {
+ assert_equals(e.data, 'longtask+same-origin+script+child-iframe-id+' +
+ 'child-iframe-name+resources/subframe-with-longtask.html');
t.done();
}));
-}, "Performance longtask entries in parent are observable in child iframe");
+}, 'Performance longtask entries in parent are observable in child iframe.');
</script>
<iframe src="resources/subframe-observing-longtask.html"></iframe>
<script>
/* Create an iframe that generates a long task. */
- var iframe = document.createElement('iframe');
+ const iframe = document.createElement('iframe');
iframe.id = 'child-iframe-id';
iframe.name = 'child-iframe-name';
document.body.appendChild(iframe);
iframe.src = 'resources/subframe-with-longtask.html'
</script>
-</body> \ No newline at end of file
+</body>
diff --git a/tests/wpt/web-platform-tests/longtask-timing/resources/makelongtask.js b/tests/wpt/web-platform-tests/longtask-timing/resources/makelongtask.js
index 2401f0a741b..d58b4f975d4 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/resources/makelongtask.js
+++ b/tests/wpt/web-platform-tests/longtask-timing/resources/makelongtask.js
@@ -1,3 +1,3 @@
/* Generate a slow task. */
-var begin = window.performance.now();
+const begin = window.performance.now();
while (window.performance.now() < begin + 51);
diff --git a/tests/wpt/web-platform-tests/longtask-timing/resources/raflongtask.js b/tests/wpt/web-platform-tests/longtask-timing/resources/raflongtask.js
index a874e795509..95bfce17917 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/resources/raflongtask.js
+++ b/tests/wpt/web-platform-tests/longtask-timing/resources/raflongtask.js
@@ -1,5 +1,5 @@
window.requestAnimationFrame(function() {
/* Generate a slow task. */
- var begin = window.performance.now();
+ const begin = window.performance.now();
while (window.performance.now() < begin + 51);
});
diff --git a/tests/wpt/web-platform-tests/longtask-timing/resources/subframe-observing-longtask.html b/tests/wpt/web-platform-tests/longtask-timing/resources/subframe-observing-longtask.html
index 3f4fc71ad36..e1e1a934527 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/resources/subframe-observing-longtask.html
+++ b/tests/wpt/web-platform-tests/longtask-timing/resources/subframe-observing-longtask.html
@@ -5,16 +5,21 @@
<h1>Child Iframe observing long tasks</h1>
<script>
- var observer = new PerformanceObserver(function(entryList) {
+ const observer = new PerformanceObserver(function(entryList) {
for (i = 0; i < entryList.getEntries().length; i++) {
- var longtask = entryList.getEntries()[i];
- // Ignore long task generated within here, as part of making this iframe.
- if (longtask.name == "same-origin-self")
- return;
- // TODO(panicker): include frameId etc.
- var entryContents = longtask.entryType + '+' + longtask.name + '+' + longtask.attribution[0].name;
+ const longtask = entryList.getEntries()[i];
+ // Ignore long task generated within here, as part of making this iframe.
+ // Ignore multiple-contexts and unknown because they cause longtask-in-parentiframe test to be flaky.
+ if (longtask.name == 'self' ||
+ longtask.name == 'multiple-contexts' || longtask.name == 'unknown')
+ return;
+ // TODO(panicker): include containerType.
+ const attribution = longtask.attribution[0];
+ const entryContents = longtask.entryType + '+' + longtask.name + '+' +
+ attribution.name + '+' + attribution.containerId + '+' +
+ attribution.containerName + '+' + attribution.containerSrc;
top.postMessage(entryContents, '*');
}
});
- observer.observe({entryTypes: ["longtask"]});
+ observer.observe({entryTypes: ['longtask']});
</script>
diff --git a/tests/wpt/web-platform-tests/longtask-timing/resources/subframe-with-longtask.html b/tests/wpt/web-platform-tests/longtask-timing/resources/subframe-with-longtask.html
index eaa12e485e1..957d11452f5 100644
--- a/tests/wpt/web-platform-tests/longtask-timing/resources/subframe-with-longtask.html
+++ b/tests/wpt/web-platform-tests/longtask-timing/resources/subframe-with-longtask.html
@@ -6,6 +6,6 @@
<h1>Long Task in Inline Script</h1>
<script>
- var begin = window.performance.now();
+ const begin = window.performance.now();
while (window.performance.now() < begin + 51);
</script>
diff --git a/tests/wpt/web-platform-tests/magnetometer/Magnetometer.https.html b/tests/wpt/web-platform-tests/magnetometer/Magnetometer.https.html
index bad18f1dea8..f327ed3c43d 100644
--- a/tests/wpt/web-platform-tests/magnetometer/Magnetometer.https.html
+++ b/tests/wpt/web-platform-tests/magnetometer/Magnetometer.https.html
@@ -7,8 +7,6 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/generic-sensor/generic-sensor-tests.js"></script>
<div id="log"></div>
-<iframe src="support-iframe.html" id="frame" style="display:none" sandbox="allow-scripts">
-</iframe>
<script>
runGenericSensorTests(Magnetometer);
diff --git a/tests/wpt/web-platform-tests/magnetometer/OWNERS b/tests/wpt/web-platform-tests/magnetometer/OWNERS
index cc7c3879319..eb920ae0f1e 100644
--- a/tests/wpt/web-platform-tests/magnetometer/OWNERS
+++ b/tests/wpt/web-platform-tests/magnetometer/OWNERS
@@ -1,5 +1,6 @@
@zqzhang
@dontcallmedom
-@tobie
@riju
@Honry
+@alexshalamov
+@pozdnyakov
diff --git a/tests/wpt/web-platform-tests/magnetometer/idlharness.https.html b/tests/wpt/web-platform-tests/magnetometer/idlharness.https.html
index 55a0851e1ec..2f98dda24d0 100644
--- a/tests/wpt/web-platform-tests/magnetometer/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/magnetometer/idlharness.https.html
@@ -8,79 +8,60 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
-<style>
- pre {
- display: none;
- }
-</style>
<div id="log"></div>
-<pre id="idl">
-interface Event {
-};
-
-interface Error {
-};
-
-dictionary EventInit {
-};
-
+<script id="idl" type="text/plain">
interface EventTarget {
};
interface EventHandler {
};
-</pre>
+</script>
-<pre id="generic-idl">
-[SecureContext]
+<script id="magnetometer-idl" type="text/plain">
+// The interface of Sensor is defined in
+// https://www.w3.org/TR/generic-sensor/#idl-index
+[SecureContext, Exposed=Window]
interface Sensor : EventTarget {
readonly attribute boolean activated;
readonly attribute DOMHighResTimeStamp? timestamp;
void start();
void stop();
- attribute EventHandler onchange;
+ attribute EventHandler onreading;
attribute EventHandler onactivate;
attribute EventHandler onerror;
};
-dictionary SensorOptions {
- double? frequency;
-};
-
-[SecureContext, Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)]
-interface SensorErrorEvent : Event {
- readonly attribute Error error;
-};
-
-dictionary SensorErrorEventInit : EventInit {
- required Error error;
+[Constructor(optional SensorOptions sensorOptions), Exposed=Window]
+interface Magnetometer : Sensor {
+ readonly attribute unrestricted double? x;
+ readonly attribute unrestricted double? y;
+ readonly attribute unrestricted double? z;
};
-</pre>
-<pre id="magnetometer-idl">
-[Constructor(optional SensorOptions sensorOptions)]
-interface Magnetometer : Sensor {
+[Constructor(optional SensorOptions sensorOptions), Exposed=Window]
+interface UncalibratedMagnetometer : Sensor {
readonly attribute unrestricted double? x;
readonly attribute unrestricted double? y;
readonly attribute unrestricted double? z;
+ readonly attribute unrestricted double? xBias;
+ readonly attribute unrestricted double? yBias;
+ readonly attribute unrestricted double? zBias;
};
-</pre>
+</script>
<script>
-
(() => {
"use strict";
let idl_array = new IdlArray();
idl_array.add_untested_idls(document.getElementById('idl').textContent);
- idl_array.add_untested_idls(document.getElementById('generic-idl').textContent);
idl_array.add_idls(document.getElementById('magnetometer-idl').textContent);
idl_array.add_objects({
- Magnetometer: ['new Magnetometer();']
+ Magnetometer: ['new Magnetometer();'],
+ UncalibratedMagnetometer: ['new UncalibratedMagnetometer();']
});
idl_array.test();
})();
-
</script>
diff --git a/tests/wpt/web-platform-tests/magnetometer/support-iframe.html b/tests/wpt/web-platform-tests/magnetometer/support-iframe.html
deleted file mode 100644
index 5328f6273f0..00000000000
--- a/tests/wpt/web-platform-tests/magnetometer/support-iframe.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE HTML>
-<meta charset="utf-8">
-<script>
-try {
- let sensor = new Magnetometer();
- parent.postMessage("sensor.start() can be fired within iframes", '*');
-} catch (e) {
- parent.postMessage(e.name, '*');
-}
-</script>
diff --git a/tests/wpt/web-platform-tests/manifest b/tests/wpt/web-platform-tests/manifest
deleted file mode 100755
index edebae62695..00000000000
--- a/tests/wpt/web-platform-tests/manifest
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env python
-import os
-import sys
-
-from tools.manifest import update
-
-update.main(default_tests_root=
- os.path.abspath(os.path.dirname(__file__)))
diff --git a/tests/wpt/web-platform-tests/mathml/OWNERS b/tests/wpt/web-platform-tests/mathml/OWNERS
new file mode 100644
index 00000000000..d3895d17a07
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mathml/OWNERS
@@ -0,0 +1 @@
+@fred-wang
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
index e44df189d78..80e4c754d80 100644
--- 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
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html>
+<html class="reftest-wait">
<head>
<meta charset="utf-8"/>
<title>href click</title>
@@ -11,6 +11,7 @@
{
var event = new MouseEvent('click', {bubbles: true, cancelable: true});
document.getElementById('link').dispatchEvent(event);
+ document.documentElement.className = "";
}
</script>
</head>
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
index 5c8dcfca9ae..1e41f77cc43 100644
--- 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
@@ -1,5 +1,5 @@
<!DOCTYPE html>
-<html>
+<html class="reftest-wait">
<head>
<meta charset="utf-8"/>
<title>href click</title>
@@ -11,6 +11,7 @@
{
var event = new MouseEvent('click', {bubbles: true, cancelable: true});
document.getElementById('space').dispatchEvent(event);
+ document.documentElement.className = "";
}
</script>
</head>
diff --git a/tests/wpt/web-platform-tests/media-source/interfaces.html b/tests/wpt/web-platform-tests/media-source/interfaces.html
index f7f6d7c8364..a01a1612d2f 100644
--- a/tests/wpt/web-platform-tests/media-source/interfaces.html
+++ b/tests/wpt/web-platform-tests/media-source/interfaces.html
@@ -129,7 +129,7 @@ mediaSource = new MediaSource();
video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener("sourceopen", function () {
var defaultType ='video/webm;codecs="vp8,vorbis"';
- if (video.canPlayType(defaultType)) {
+ if (MediaSource.isTypeSupported(defaultType)) {
sourceBuffer = mediaSource.addSourceBuffer(defaultType);
} else {
sourceBuffer = mediaSource.addSourceBuffer('video/mp4');
diff --git a/tests/wpt/web-platform-tests/media-source/mediasource-append-buffer.html b/tests/wpt/web-platform-tests/media-source/mediasource-append-buffer.html
index bca3f8951e3..f1866c005e5 100644
--- a/tests/wpt/web-platform-tests/media-source/mediasource-append-buffer.html
+++ b/tests/wpt/web-platform-tests/media-source/mediasource-append-buffer.html
@@ -414,6 +414,58 @@
mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
{
var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
+ var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]);
+
+ assert_equals(mediaElement.readyState, mediaElement.HAVE_NOTHING);
+ assert_equals(mediaSource.duration, Number.NaN);
+
+ // readyState is changing as per the Initialization Segment Received algorithm.
+ var loadedmetadataCalled = false;
+ mediaElement.addEventListener("loadedmetadata", function metadata(e) {
+ loadedmetadataCalled = true;
+ e.target.removeEventListener(e.type, metadata);
+ });
+ sourceBuffer.addEventListener("updateend", function updateend(e) {
+ assert_true(loadedmetadataCalled);
+ assert_equals(mediaElement.readyState, mediaElement.HAVE_METADATA);
+ e.target.removeEventListener(e.type, updateend);
+ });
+ test.expectEvent(sourceBuffer, "updateend", "remainingInitSegment append ended.");
+ test.expectEvent(mediaElement, "loadedmetadata", "loadedmetadata event received.");
+ sourceBuffer.appendBuffer(initSegment);
+
+ test.waitForExpectedEvents(function()
+ {
+ assert_equals(mediaElement.readyState, mediaElement.HAVE_METADATA);
+ assert_equals(mediaSource.duration, segmentInfo.duration);
+ // readyState is changing as per the Coded Frame Processing algorithm.
+ var loadeddataCalled = false;
+ mediaElement.addEventListener("loadeddata", function loadeddata(e) {
+ loadeddataCalled = true;
+ e.target.removeEventListener(e.type, loadeddata);
+ });
+ sourceBuffer.addEventListener("updateend", function updateend(e) {
+ assert_true(loadeddataCalled);
+ assert_greater_than_equal(mediaElement.readyState, mediaElement.HAVE_CURRENT_DATA);
+ e.target.removeEventListener(e.type, updateend);
+ });
+ test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended.");
+ test.expectEvent(mediaElement, "loadeddata", "loadeddata fired.");
+ sourceBuffer.appendBuffer(mediaSegment);
+ });
+
+ test.waitForExpectedEvents(function()
+ {
+ assert_greater_than_equal(mediaElement.readyState, mediaElement.HAVE_CURRENT_DATA);
+ assert_equals(sourceBuffer.updating, false);
+ assert_equals(mediaSource.readyState, "open");
+ test.done();
+ });
+ }, "Test appendBuffer events order.");
+
+ mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
+ {
+ var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
var partialInitSegment = initSegment.subarray(0, initSegment.length / 2);
var mediaSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.media[0]);
diff --git a/tests/wpt/web-platform-tests/media-source/mediasource-seekable.html b/tests/wpt/web-platform-tests/media-source/mediasource-seekable.html
index c379a63ba16..8e228d34661 100644
--- a/tests/wpt/web-platform-tests/media-source/mediasource-seekable.html
+++ b/tests/wpt/web-platform-tests/media-source/mediasource-seekable.html
@@ -33,9 +33,12 @@
{
var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
test.expectEvent(mediaElement, 'durationchange', 'mediaElement got duration after initsegment');
+ test.expectEvent(sourceBuffer, 'update');
+ test.expectEvent(sourceBuffer, 'updateend');
sourceBuffer.appendBuffer(initSegment);
test.waitForExpectedEvents(function()
{
+ assert_false(sourceBuffer.updating, "updating attribute is false");
test.expectEvent(mediaElement, 'durationchange', 'mediaElement got infinity duration');
mediaSource.duration = Infinity;
test.waitForExpectedEvents(function()
diff --git a/tests/wpt/web-platform-tests/media/test-a-128k-44100Hz-1ch.webm b/tests/wpt/web-platform-tests/media/test-a-128k-44100Hz-1ch.webm
new file mode 100644
index 00000000000..c5b064deb9f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/media/test-a-128k-44100Hz-1ch.webm
Binary files differ
diff --git a/tests/wpt/web-platform-tests/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm b/tests/wpt/web-platform-tests/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm
new file mode 100644
index 00000000000..8b705dbc898
--- /dev/null
+++ b/tests/wpt/web-platform-tests/media/test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm
Binary files differ
diff --git a/tests/wpt/web-platform-tests/media/test-v-128k-320x240-24fps-8kfr.webm b/tests/wpt/web-platform-tests/media/test-v-128k-320x240-24fps-8kfr.webm
new file mode 100644
index 00000000000..189c472f996
--- /dev/null
+++ b/tests/wpt/web-platform-tests/media/test-v-128k-320x240-24fps-8kfr.webm
Binary files differ
diff --git a/tests/wpt/web-platform-tests/mediacapture-fromelement/capture.html b/tests/wpt/web-platform-tests/mediacapture-fromelement/capture.html
new file mode 100644
index 00000000000..64012687d31
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mediacapture-fromelement/capture.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/vendor-prefix.js"
+ data-prefixed-prototypes=
+ '[{"ancestors":["HTMLMediaElement"],"name":"captureStream"}]'>
+</script>
+</head>
+<body>
+<script>
+
+// Run captureStream() on different videos, and assert data is flowing.
+
+var makeAsyncTest = function(filename) {
+ async_test(function(test) {
+ var video = document.createElement('video');
+ video.src = "/media/" + filename;
+ video.onerror = this.unreached_func("<video> error");
+ video.play();
+
+ var stream = video.captureStream();
+
+ // onactive event is marked for deprecation (https://crbug.com/649328)
+ stream.onactive = this.step_func_done(function() {
+ var recorder = new MediaRecorder(stream);
+ recorder.ondataavailable = test.step_func_done(function(event) {
+ assert_true(event.data.size > 0, 'Recorded data size should be > 0');
+ });
+ recorder.start(0);
+ });
+ }), "<video>.captureStream() and assert data flows.";
+};
+
+generate_tests(makeAsyncTest, [
+ [ "video-only", "test-v-128k-320x240-24fps-8kfr.webm" ],
+ [ "audio-only", "test-a-128k-44100Hz-1ch.webm" ],
+ [ "video+audio", "test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm" ]
+]);
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mediacapture-fromelement/creation.html b/tests/wpt/web-platform-tests/mediacapture-fromelement/creation.html
new file mode 100644
index 00000000000..94a22f14729
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mediacapture-fromelement/creation.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/vendor-prefix.js"
+ data-prefixed-prototypes=
+ '[{"ancestors":["HTMLMediaElement"],"name":"captureStream"}]'>
+</script>
+</head>
+<body>
+<script>
+
+// Run captureStream() on <video>/<audio>s and inspect the generated Stream.
+
+var makeAsyncTest = function(filename, numTracks) {
+ async_test(function() {
+ var video = document.createElement('video');
+ video.src = "/media/" + filename;
+ video.onerror = this.unreached_func("<video> error");
+ video.play();
+
+ var stream = video.captureStream();
+ assert_not_equals(stream, null, "error generating stream");
+
+ // onactive event is marked for deprecation (https://crbug.com/649328)
+ stream.onactive = this.step_func_done(function() {
+ // The stream got a (number of) MediaStreamTracks added.
+ assert_equals(stream.getVideoTracks().length, numTracks['vid'], 'video');
+ assert_equals(stream.getAudioTracks().length, numTracks['aud'], 'audio');
+ });
+ }), "<video>.captureStream()";
+};
+
+generate_tests(makeAsyncTest, [
+ [ "video-only", "test-v-128k-320x240-24fps-8kfr.webm", {vid : 1, aud : 0} ],
+ [ "audio-only", "test-a-128k-44100Hz-1ch.webm", {vid : 0, aud : 1} ],
+ [ "video+audio", "test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm", {vid : 1, aud : 1} ]
+]);
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mediacapture-fromelement/ended.html b/tests/wpt/web-platform-tests/mediacapture-fromelement/ended.html
new file mode 100644
index 00000000000..da1451b7d80
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mediacapture-fromelement/ended.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/vendor-prefix.js"
+ data-prefixed-prototypes=
+ '[{"ancestors":["HTMLMediaElement"],"name":"captureStream"}]'>
+</script>
+</head>
+<body>
+<script>
+
+// Run captureStream() on different videos, and assert the mediastream is
+// ended when the source HTMLMediaElement finishes
+
+var makeAsyncTest = function(filename) {
+ async_test(function(test) {
+ var video = document.createElement('video');
+ video.src = "/media/" + filename;
+ video.onerror = this.unreached_func("<video> error");
+ video.play();
+
+ var stream = video.captureStream();
+
+ stream.onremovetrack = this.step_func_done(function() {
+ assert_true(video.ended, 'video must be ended');
+ assert_equals(stream.getTracks().length, 0, 'stream must have no tracks');
+ assert_false(stream.active, 'stream must be inactive');
+ });
+
+ }), "<video>.captureStream() and assert ended event.";
+};
+
+generate_tests(makeAsyncTest, [
+ [ "video-only", "test-v-128k-320x240-24fps-8kfr.webm" ],
+ [ "audio-only", "test-a-128k-44100Hz-1ch.webm" ],
+ [ "video+audio", "test-av-384k-44100Hz-1ch-320x240-30fps-10kfr.webm" ]
+]);
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-api.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-api.https.html
index 176f458c2c2..14831701769 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-api.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-api.https.html
@@ -1,7 +1,7 @@
<!doctype html>
<html>
<head>
-<title>getUserMedia: test that getUserMedia is present (with or without vendor prefix)</title>
+<title>getUserMedia: test that getUserMedia is present</title>
<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermedia">
<meta name='assert' content='Check that the getUserMedia() method is present.'/>
@@ -9,15 +9,14 @@
<body>
<h1 class="instructions">Description</h1>
<p class="instructions">This test checks for the presence of the
-<code>navigator.getUserMedia</code> method, taking vendor prefixes into account.</p>
+<code>navigator.mediaDevices.getUserMedia</code> method.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
test(function () {
- assert_true(undefined !== navigator.getUserMedia, "navigator.getUserMedia exists");
-}, "getUserMedia() is present on navigator");
+ assert_true(undefined !== navigator.mediaDevices && undefined !== navigator.mediaDevices.getUserMedia, "navigator.mediaDevices.getUserMedia exists");
+}, "mediaDevices.getUserMedia() is present on navigator");
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-deny.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-deny.https.html
index f61d6233383..17440996c9f 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-deny.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-deny.https.html
@@ -15,22 +15,18 @@
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
- <script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that the error callback is triggered when permission is denied", {timeout:10000});
t.step(function() {
- navigator.getUserMedia(
- {video: true},
- t.step_func(function (stream) {
- assert_unreached("The success callback should not be triggered since access is to be denied");
- t.done();
- }),
- t.step_func(function (error) {
- assert_equals(error.name, "securityError", "securityError returned as expected");
+ navigator.mediaDevices.getUserMedia({video: true})
+ .then(t.step_func(function (stream) {
+ assert_unreached("The success callback should not be triggered since access is to be denied");
+ t.done();
+ }), t.step_func(function (error) {
+ assert_equals(error.name, "NotAllowedError", "NotAllowedError returned as expected");
assert_equals(error.constraintName, undefined, "constraintName attribute not set as expected");
t.done();
- })
- );
+ }))
});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-empty-option-param.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-empty-option-param.https.html
index a543129bbcf..c7904cb4c7d 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-empty-option-param.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-empty-option-param.https.html
@@ -1,7 +1,7 @@
<!doctype html>
<html>
<head>
-<title>getUserMedia({}) aborts with NOT_SUPPORTED_ERR</title>
+<title>getUserMedia({}) rejects with TypeError</title>
<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-NavigatorUserMedia-getUserMedia-void-MediaStreamConstraints-constraints-NavigatorUserMediaSuccessCallback-successCallback-NavigatorUserMediaErrorCallback-errorCallback">
</head>
@@ -13,20 +13,17 @@ options parameter raises a NOT_SUPPORTED_ERR exception.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
-var t = async_test("Tests that getUserMedia raises a NOT_SUPPORTED_ERR exception when used with an empty options parameter");
+var t = async_test("Tests that getUserMedia is rejected with a TypeError when used with an empty options parameter");
t.step( function () {
- // TODO This is no longer what's in the spec, see https://www.w3.org/Bugs/Public/show_bug.cgi?id=22211
- assert_throws("NOT_SUPPORTED_ERR",
- function () {
- navigator.getUserMedia({}, t.step_func(function (stream) {
- assert_unreached("This should never be triggered since the constraints parameter is empty");
- t.done();
- }), t.step_func(function (error) {
- assert_unreached("This should never be triggered since the constraints parameter is empty");
- }));
- });
+ navigator.mediaDevices.getUserMedia({})
+ .then(t.step_func(function () {
+ assert_unreached("This should never be triggered since the constraints parameter is empty");
+ }), t.step_func(function (error) {
+ assert_equals(error.name, "TypeError", "TypeError returned as expected");
+ assert_equals(error.constraintName, undefined, "constraintName attribute not set as expected");
+ t.done();
+ }));
t.done();
});
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-impossible-constraint.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-impossible-constraint.https.html
index b63856275c3..13f3856f7e3 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-impossible-constraint.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-impossible-constraint.https.html
@@ -15,20 +15,20 @@ constraint (width &gt;=1G) in getUserMedia works</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that setting an impossible constraint in getUserMedia fails", {timeout:10000});
t.step(function() {
// Note - integer conversion is weird for +inf and numbers > 2^32, so we
// use a number less than 2^32 for testing.
- navigator.getUserMedia({video: {width: {min:100000000}}}, t.step_func(function (stream) {
- assert_unreached("a Video stream of width 100M cannot be created");
- t.done();
- }), t.step_func(function(error) {
- assert_equals(error.name, "ConstraintNotSatisfiedError", "An impossible constraint triggers a ConstraintNotSatisfiedError");
- assert_equals(error.constraintName, "width", "The name of the not satisfied error is given in error.constraintName");
- t.done();
- }));
+ navigator.mediaDevices.getUserMedia({video: {width: {min:100000000}}})
+ .then(t.step_func(function (stream) {
+ assert_unreached("a Video stream of width 100M cannot be created");
+ t.done();
+ }), t.step_func(function(error) {
+ assert_equals(error.name, "OverconstrainedError", "An impossible constraint triggers a OverconstrainedError");
+ assert_equals(error.constraint, "width", "The name of the not satisfied error is given in error.constraint");
+ t.done();
+ }));
});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-optional-constraint.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-optional-constraint.https.html
index 7e69ca03fe9..becd871ab2a 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-optional-constraint.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-optional-constraint.https.html
@@ -14,18 +14,16 @@ getUserMedia is handled as optional</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that setting an optional constraint in getUserMedia is handled as optional", {timeout:10000});
t.step(function() {
- navigator.getUserMedia({video: {advanced: [{width: {min:1024, max: 800}}]}},
- t.step_func(function (stream) {
- assert_equals(stream.getVideoTracks().length, 1, "the media stream has exactly one video track");
- t.done();
- }),
- t.step_func(function(error) {
- assert_unreached("an optional constraint can't stop us from obtaining a video stream");
- }));
+ navigator.mediaDevices.getUserMedia({video: {advanced: [{width: {min:1024, max: 800}}]}})
+ .then(t.step_func(function (stream) {
+ assert_equals(stream.getVideoTracks().length, 1, "the media stream has exactly one video track");
+ t.done();
+ }), t.step_func(function(error) {
+ assert_unreached("an optional constraint can't stop us from obtaining a video stream");
+ }));
});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-trivial-constraint.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-trivial-constraint.https.html
index c24d02b8461..283bcb2c32a 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-trivial-constraint.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-trivial-constraint.https.html
@@ -14,17 +14,17 @@ constraint (width &gt;=0) in getUserMedia works</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that setting a trivial mandatory constraint in getUserMedia works", {timeout:10000});
t.step(function() {
- navigator.getUserMedia({video: {width: {min:0}}}, t.step_func(function (stream) {
- assert_equals(stream.getVideoTracks().length, 1, "the media stream has exactly one video track");
- t.done();
- }), t.step_func(function(error) {
- assert_unreached("a Video stream of minimally zero width can always be created");
- t.done();
- }));
+ navigator.mediaDevices.getUserMedia({video: {width: {min:0}}})
+ .then(t.step_func(function (stream) {
+ assert_equals(stream.getVideoTracks().length, 1, "the media stream has exactly one video track");
+ t.done();
+ }), t.step_func(function(error) {
+ assert_unreached("a Video stream of minimally zero width can always be created");
+ t.done();
+ }));
});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-unknownkey-option-param.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-unknownkey-option-param.https.html
index c288c743932..b2792722201 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/GUM-unknownkey-option-param.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/GUM-unknownkey-option-param.https.html
@@ -1,37 +1,31 @@
<!doctype html>
<html>
<head>
-<title>getUserMedia({doesnotexist:true}) aborts with NOT_SUPPORTED_ERR</title>
+<title>getUserMedia({doesnotexist:true}) rejects with TypeError</title>
<link rel="author" title="Dominique Hazael-Massieux" href="mailto:dom@w3.org"/>
<link rel="help" href="http://dev.w3.org/2011/webrtc/editor/getusermedia.html#widl-NavigatorUserMedia-getUserMedia-void-MediaStreamConstraints-constraints-NavigatorUserMediaSuccessCallback-successCallback-NavigatorUserMediaErrorCallback-errorCallback">
</head>
<body>
<h1 class="instructions">Description</h1>
<p class="instructions">This test checks that getUserMedia with an unknown value
-in the options parameter raises a NOT_SUPPORTED_ERR exception.</p>
+in the constraints parameter rejects with a TypeError.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
-test(function () {
- // TODO This is no longer what's in the spec, see https://www.w3.org/Bugs/Public/show_bug.cgi?id=22211
- assert_throws(
- "NOT_SUPPORTED_ERR",
- function () {
- navigator.getUserMedia(
- {doesnotexist:true},
- t.step_func(function (stream) {
- assert_unreached("This should never be triggered since the constraints parameter is unrecognized");
- }), t.step_func(function (error) {
- assert_unreached("This should never be triggered since the constraints parameter is unrecognized");
- }));
- }
- )
- }
-);
-
+var t = async_test("Tests that getUserMedia is rejected with a TypeError when used with an unknown constraint");
+t.step(function () {
+ navigator.mediaDevices.getUserMedia({})
+ .then(t.step_func(function () {
+ assert_unreached("This should never be triggered since the constraints parameter only contains an unrecognized constraint");
+ }), t.step_func(function (error) {
+ assert_equals(error.name, "TypeError", "TypeError returned as expected");
+ assert_equals(error.constraintName, undefined, "constraintName attribute not set as expected");
+ t.done();
+ }));
+ t.done();
+});
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-IDL-all.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-IDL-all.html
index 8c8fe2214f9..f6dfb361bb4 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-IDL-all.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaDevices-IDL-all.html
@@ -27,7 +27,7 @@
idl_array.add_untested_idls("interface EventTarget {};");
idl_array.add_untested_idls("interface EventHandler {};");
- idl_array.add_untested_idls(idlText);
+ idl_array.add_idls(idlText);
idl_array.add_objects({"Navigator": ["navigator"]});
idl_array.add_objects({"MediaDevices":["navigator.mediaDevices"]});
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html
index 6b9da9ce0a2..6015bb7bb2d 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-preload-none.https.html
@@ -6,7 +6,6 @@
<link rel="author" title="Matthew Wolenetz" href="mailto:wolenetz@chromium.org"/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
- <script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}, {"ancestors":["window"], "name":"MediaStream"}]'></script>
</head>
<body>
<p class="instructions">When prompted, accept to share your audio and video streams.</p>
@@ -38,23 +37,26 @@
async_test(function(t)
{
var aud = document.querySelector("audio");
- navigator.getUserMedia({audio:true}, t.step_func(function(stream)
- {
- testPreloadNone(t, aud, t.step_func(function()
- {
- aud.src = URL.createObjectURL(stream);
- t.add_cleanup(function() { URL.revokeObjectURL(aud.src); });
- }));
- }), t.unreached_func("getUserMedia error callback was invoked."));
+ navigator.mediaDevices.getUserMedia({audio:true})
+ .then(t.step_func(function(stream)
+ {
+ testPreloadNone(t, aud, t.step_func(function()
+ {
+ aud.src = URL.createObjectURL(stream);
+ t.add_cleanup(function() { URL.revokeObjectURL(aud.src); });
+ }));
+ }),
+ t.unreached_func("getUserMedia error callback was invoked."));
}, "Test that preload 'none' is ignored for MediaStream object URL used as src");
async_test(function(t)
{
var vid = document.querySelector("video");
- navigator.getUserMedia({video:true}, t.step_func(function(stream)
- {
- testPreloadNone(t, vid, t.step_func(function() { vid.srcObject = stream; }));
- }), t.unreached_func("getUserMedia error callback was invoked."));
+ navigator.mediaDevices.getUserMedia({video:true})
+ .then(t.step_func(function(stream)
+ {
+ testPreloadNone(t, vid, t.step_func(function() { vid.srcObject = stream; }));
+ }), t.unreached_func("getUserMedia error callback was invoked."));
}, "Test that preload 'none' is ignored for MediaStream used as srcObject");
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html
index 1bdbe3eeeaf..63442bea25b 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html
@@ -17,38 +17,38 @@ via the <code>srcObject</code> attribute.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]' data-prefixed-prototypes='[{"ancestors":["HTMLMediaElement"],"name":"srcObject"}]'></script>
<script>
var vid = document.getElementById("vid");
var t = async_test("Tests that a MediaStream can be assigned to a video element with srcObject", {timeout: 10000});
t.step(function() {
- navigator.getUserMedia({video: true}, t.step_func(function (stream) {
- var testOncePlaying = function() {
- assert_equals(vid.played.length, 1, "A MediaStream's timeline always consists of a single range");
- assert_equals(vid.played.start(0), 0, "A MediaStream's timeline always consists of a single range");
- assert_equals(vid.played.end(0), vid.currentTime, "A MediaStream's timeline always consists of a single range");
- assert_equals(vid.readyState, vid.HAVE_ENOUGH_DATA, "Upon selecting a media stream, the UA sets readyState to HAVE_ENOUGH_DATA");
- var time = vid.currentTime;
- assert_throws("INVALID_STATE_ERR", function() {
- vid.currentTime = 0;
- });
- assert_equals(vid.currentTime, time, "The UA MUST ignore attempts to set the currentTime attribute");
- // TODO add test that duration must be set to currentTime
- // when mediastream is destroyed
- vid.removeEventListener("timeupdate", testOncePlaying, false);
- t.done();
- }
- vid.addEventListener("timeupdate", t.step_func(testOncePlaying), false);
- vid.srcObject = stream;
- vid.play();
- assert_true(!vid.seeking, "A MediaStream is not seekable");
- assert_equals(vid.seekable.length, 0, "A MediaStream is not seekable");
- assert_equals(vid.defaultPlaybackRate, 1, "playback rate is always 1");
- assert_equals(vid.playbackRate, 1, "playback rate is always 1");
- assert_equals(vid.buffered.length, 0, "A MediaStream cannot be preloaded. Therefore, there is no buffered timeranges");
- assert_equals(vid.duration, Infinity, " A MediaStream does not have a pre-defined duration. ");
- assert_equals(vid.startDate, NaN, " A MediaStream does not specify a timeline offset");
- }), function(error) {});
+ navigator.mediaDevices.getUserMedia({video: true})
+ .then(t.step_func(function (stream) {
+ var testOncePlaying = function() {
+ assert_equals(vid.played.length, 1, "A MediaStream's timeline always consists of a single range");
+ assert_equals(vid.played.start(0), 0, "A MediaStream's timeline always consists of a single range");
+ assert_equals(vid.played.end(0), vid.currentTime, "A MediaStream's timeline always consists of a single range");
+ assert_equals(vid.readyState, vid.HAVE_ENOUGH_DATA, "Upon selecting a media stream, the UA sets readyState to HAVE_ENOUGH_DATA");
+ var time = vid.currentTime;
+ assert_throws("INVALID_STATE_ERR", function() {
+ vid.currentTime = 0;
+ });
+ assert_equals(vid.currentTime, time, "The UA MUST ignore attempts to set the currentTime attribute");
+ // TODO add test that duration must be set to currentTime
+ // when mediastream is destroyed
+ vid.removeEventListener("timeupdate", testOncePlaying, false);
+ t.done();
+ }
+ vid.addEventListener("timeupdate", t.step_func(testOncePlaying), false);
+ vid.srcObject = stream;
+ vid.play();
+ assert_true(!vid.seeking, "A MediaStream is not seekable");
+ assert_equals(vid.seekable.length, 0, "A MediaStream is not seekable");
+ assert_equals(vid.defaultPlaybackRate, 1, "playback rate is always 1");
+ assert_equals(vid.playbackRate, 1, "playback rate is always 1");
+ assert_equals(vid.buffered.length, 0, "A MediaStream cannot be preloaded. Therefore, there is no buffered timeranges");
+ assert_equals(vid.duration, Infinity, " A MediaStream does not have a pre-defined duration. ");
+ assert_equals(vid.startDate, NaN, " A MediaStream does not specify a timeline offset");
+ }), function(error) {});
});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-add-audio-track.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-add-audio-track.https.html
index e3650aae020..e976b162ea9 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-add-audio-track.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-add-audio-track.https.html
@@ -14,16 +14,15 @@
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that adding a track to a MediaStream works as expected", {timeout: 20000}); // longer timeout since requires double user interaction
t.step(function () {
var audio, video;
- navigator.getUserMedia({audio: true}, gotAudio, function(error) {});
+ navigator.mediaDevices.getUserMedia({audio: true}).then(gotAudio);
function gotAudio(stream) {
audio = stream;
- navigator.getUserMedia({video: true}, gotVideo, function(error) {});
+ navigator.mediaDevices.getUserMedia({video: true}).then(gotVideo);
}
function gotVideo(stream) {
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-audio-only.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-audio-only.https.html
index 77d6d0c190b..faa2c39b30f 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-audio-only.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-audio-only.https.html
@@ -15,12 +15,11 @@ the success callback in getUserMedia has exactly one audio track.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}, {"ancestors":["window"], "name":"MediaStream"}]'></script>
<script>
var astream;
var t = async_test("Tests that a MediaStream with exactly one audio track is returned", {timeout: 10000});
t.step(function() {
- navigator.getUserMedia({audio:true}, t.step_func(function (stream) {
+ navigator.mediaDevices.getUserMedia({audio:true}).then(t.step_func(function (stream) {
astream = stream;
assert_true(stream instanceof MediaStream, "getUserMedia success callback comes with a MediaStream object");
assert_equals(stream.getAudioTracks().length, 1, "the media stream has exactly one audio track");
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-default-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-default-feature-policy.https.sub.html
new file mode 100644
index 00000000000..1f48e854f7e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-default-feature-policy.https.sub.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+ <script src=util/utils.js></script>
+ <script>
+ 'use strict';
+
+ // The promise_factory must return a promise that runs the feature and
+ // resolves if feature usage is successful, otherwise rejects. Using
+ // getUserMedia is successful if at least one mic/camera is returned when
+ // mic/camera has been explicitly allowed by feature policy.
+ function promise_factory(allowed_features) {
+ return new Promise((resolve, reject) => {
+ navigator.getUserMedia({video: true, audio: true},
+ function(stream) {
+ // If microphone is allowed, there should be at least one microphone
+ // in the result. If camera is allowed, there should be at least one
+ // camera in the result.
+ if ((allowed_features.includes('microphone') &&
+ stream.getAudioTracks().length == 0) ||
+ (allowed_features.includes('camera') &&
+ stream.getVideoTracks().length == 0)) {
+ reject('Feature policy allowed feature but devices not ' +
+ 'present.');
+ } else {
+ // Otherwise the result is expected.
+ resolve();
+ }
+ },
+ function(error) { reject(error); });
+ });
+ };
+
+ run_all_fp_tests_allow_self(
+ 'https://{{domains[www]}}:{{ports[https][0]}}',
+ 'microphone',
+ '[object NavigatorUserMediaError]',
+ function() {
+ return promise_factory('microphone');
+ });
+
+ run_all_fp_tests_allow_self(
+ 'https://{{domains[www]}}:{{ports[https][0]}}',
+ 'camera',
+ '[object NavigatorUserMediaError]',
+ function() {
+ return promise_factory('camera');
+ });
+
+ run_all_fp_tests_allow_self(
+ 'https://{{domains[www]}}:{{ports[https][0]}}',
+ 'camera; microphone',
+ '[object NavigatorUserMediaError]',
+ function() {
+ return promise_factory('camera; microphone');
+ });
+ </script>
+</body>
+
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https.html
index a0c4b28b1e7..bfe561af1ad 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https.html
@@ -16,16 +16,15 @@ MediaStream is allowed.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that adding a track to an inactive MediaStream is allowed", {timeout:20000});
t.step(function () {
var audio, video;
- navigator.getUserMedia({audio:true}, gotAudio, function() {});
+ navigator.mediaDevices.getUserMedia({audio:true}).then(gotAudio);
function gotAudio(stream) {
audio = stream;
- navigator.getUserMedia({video:true}, gotVideo, function() {});
+ navigator.mediaDevices.getUserMedia({video:true}).then(gotVideo);
}
function gotVideo(stream) {
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-gettrackid.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-gettrackid.https.html
index a7fabdaac5d..8e282b68c13 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-gettrackid.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-gettrackid.https.html
@@ -13,14 +13,11 @@
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that MediaStream.getTrackById works as expected", {timeout: 10000});
t.step(function () {
- navigator.getUserMedia(
- {video: true},
- t.step_func(gotVideo),
- t.step_func(function (error) {
+ navigator.mediaDevices.getUserMedia({video: true})
+ .then(t.step_func(gotVideo), t.step_func(function (error) {
assert_unreached('Unexpected getUserMedia error: ' + error);
}));
function gotVideo(stream) {
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-id-manual.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-id-manual.https.html
index 88f09545844..29b6d60b610 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-id-manual.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-id-manual.https.html
@@ -14,18 +14,17 @@ the success callback in getUserMedia has a correct id.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that a MediaStream with a correct id is returned");
var allowedCharacters = /^[\u0021\u0023-\u0027\u002A-\u002B\u002D-\u002E\u0030-\u0039\u0041-\u005A\u005E-\u007E]*$/;
-if (window.navigator.getUserMedia) {
- navigator.getUserMedia({video:true}, function (stream) {
- t.step(function () {
- assert_true(stream.id.length === 36, "the media stream id has 36 characters");
- assert_regexp_match(stream.id, allowedCharacters, "the media stream id uses the set of allowed characters");
+if (window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia) {
+ navigator.mediaDevices.getUserMedia({video:true}).then(function (stream) {
+ t.step(function () {
+ assert_true(stream.id.length === 36, "the media stream id has 36 characters");
+ assert_regexp_match(stream.id, allowedCharacters, "the media stream id uses the set of allowed characters");
+ });
+ t.done();
});
- t.done();
-}, function(error) {});
}
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-idl.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-idl.https.html
index 81cce51c1ed..8e60709cf1b 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-idl.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-idl.https.html
@@ -19,33 +19,39 @@ follows the algorithm set in the spec.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"},{"ancestors":["window"], "name":"MediaStream"}]'></script>
<script>
var t = async_test("Tests that a MediaStream constructor follows the algorithm set in the spec", {timeout: 10000});
t.step(function() {
- navigator.getUserMedia({video: true, audio:true}, t.step_func(function (stream) {
- var stream1 = new MediaStream();
- assert_not_equals(stream.id, stream1.id, "Two different MediaStreams have different ids");
- var stream2 = new MediaStream(stream);
- assert_not_equals(stream.id, stream2.id, "A MediaStream constructed from another have different ids");
- var audioTrack1 = stream.getAudioTracks()[0];
- var videoTrack = stream.getVideoTracks()[0];
- assert_equals(audioTrack1, stream2.getAudioTracks()[0], "A MediaStream constructed from another share the same audio track");
- assert_equals(videoTrack, stream2.getVideoTracks()[0], "A MediaStream constructed from another share the same video track");
- var stream4 = new MediaStream([audioTrack1]);
- assert_equals(stream4.getTrackById(audioTrack1.id), audioTrack1, "a non-ended track gets added via the MediaStream constructor");
+ navigator.mediaDevices.getUserMedia({video: true, audio:true})
+ .then(t.step_func(function (stream) {
+ var stream1 = new MediaStream();
+ assert_not_equals(stream.id, stream1.id, "Two different MediaStreams have different ids");
+ var stream2 = new MediaStream(stream);
+ assert_not_equals(stream.id, stream2.id, "A MediaStream constructed from another have different ids");
+ var audioTrack1 = stream.getAudioTracks()[0];
+ var videoTrack = stream.getVideoTracks()[0];
+ assert_equals(audioTrack1, stream2.getAudioTracks()[0], "A MediaStream constructed from another share the same audio track");
+ assert_equals(videoTrack, stream2.getVideoTracks()[0], "A MediaStream constructed from another share the same video track");
+ var stream4 = new MediaStream([audioTrack1]);
+ assert_equals(stream4.getTrackById(audioTrack1.id), audioTrack1, "a non-ended track gets added via the MediaStream constructor");
+
+ var audioTrack2 = audioTrack1.clone();
+ audioTrack2.addEventListener("ended", t.unreached_func("ended event should not be fired by MediaStreamTrack.stop()."));
+ audioTrack2.stop();
+ assert_equals(audioTrack2.readyState, "ended", "a stopped track is marked ended synchronously");
- var audioTrack2 = audioTrack1.clone();
- audioTrack2.addEventListener("ended", t.step_func(function () {
var stream3 = new MediaStream([audioTrack2, videoTrack]);
- assert_equals(stream3.getTrackById(audioTrack2.id), null, "an ended track doesn't get added via the MediaStream constructor");
+ assert_equals(stream3.getTrackById(audioTrack2.id), audioTrack2, "an ended track gets added via the MediaStream constructor");
assert_equals(stream3.getTrackById(videoTrack.id), videoTrack, "a non-ended track gets added via the MediaStream constructor even if the previous track was ended");
+
var stream5 = new MediaStream([audioTrack2]);
- assert_false(stream5.active, "a MediaStream created using the MediaStream() constructor whose arguments are lists of MediaStreamTrack objects that are all ended, the MediaStream object MUST be created with its active attribute set to false");
- t.done();
- }), false);
- audioTrack2.stop();
- }), function(error) {});
+ assert_equals(stream5.getTrackById(audioTrack2.id), audioTrack2, "an ended track gets added via the MediaStream constructor");
+ assert_false(stream5.active, "a MediaStream created using the MediaStream() constructor whose arguments are lists of MediaStreamTrack objects that are all ended, the MediaStream object MUST be created with its active attribute set to false");
+
+ // Use a timeout to detect a misfire of the ended event.
+ t.step_timeout(t.step_func_done());
+ })
+ );
});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-removetrack.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-removetrack.https.html
index 1a62bedd761..787af0bbe52 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-removetrack.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-removetrack.https.html
@@ -14,15 +14,14 @@
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that a removal from a MediaStream works as expected", {timeout:10000});
t.step(function () {
var audio;
- navigator.getUserMedia({audio:true}, gotAudio, function(error) {});
+ navigator.mediaDevices.getUserMedia({audio:true}).then(gotAudio);
function gotAudio(stream) {
audio = stream;
- navigator.getUserMedia({video:true}, gotVideo, function(error) {});
+ navigator.mediaDevices.getUserMedia({video:true}).then(gotVideo);
}
function gotVideo(stream) {
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-video-only.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-video-only.https.html
index aaf880ff592..88200b23306 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-video-only.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStream-video-only.https.html
@@ -15,11 +15,10 @@ the success callback in getUserMedia has exactly one video track and no audio.</
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}, {"ancestors":["window"], "name":"MediaStream"}]'></script>
<script>
var t = async_test("Tests that a MediaStream with at least one video track is returned");
t.step(function() {
- navigator.getUserMedia({video: true}, t.step_func(function (stream) {
+ navigator.mediaDevices.getUserMedia({video: true}).then(t.step_func(function (stream) {
assert_true(stream instanceof MediaStream, "getUserMedia success callback comes with a MediaStream object");
assert_equals(stream.getAudioTracks().length, 0, "the media stream has zero audio track");
assert_equals(stream.getVideoTracks().length, 1, "the media stream has exactly one video track");
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-audio-is-silence.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-audio-is-silence.https.html
index 189bb849ee3..0d6123d45d2 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-audio-is-silence.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-audio-is-silence.https.html
@@ -17,12 +17,11 @@ Web Audio API</a>.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}, {"ancestors":["window"], "name":"AudioContext"}]'></script>
<script>
var t = async_test("Tests that a disabled audio track in a MediaStream is rendered as silence", {timeout: 200000});
var aud = document.getElementById("aud");
t.step(function() {
- navigator.getUserMedia({audio: true}, t.step_func(function (stream) {
+ navigator.mediaDevices.getUserMedia({audio: true}).then(t.step_func(function (stream) {
var ctx = new AudioContext();
var streamSource = ctx.createMediaStreamSource(stream);
var silenceDetector = ctx.createScriptProcessor(1024);
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html
index fef3f4f3b09..8aee8e2bf12 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-MediaElement-disabled-video-is-black.https.html
@@ -16,40 +16,37 @@ MediaStream is rendered as blackness.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]' data-prefixed-prototypes='[{"ancestors":["HTMLMediaElement"],"name":"srcObject"}]'></script>
<script>
var vid = document.getElementById("vid");
var cv = document.createElement("canvas");
var t = async_test("Tests that a disabled video track in a MediaStream is rendered as blackness", {timeout: 10000});
t.step(function() {
- navigator.getUserMedia(
- {video: true},
- t.step_func(function (stream) {
- var testOncePlaying = function() {
- if (stream.getVideoTracks()[0].enabled) {
- stream.getVideoTracks()[0].enabled = false;
- return;
- }
+ navigator.mediaDevices.getUserMedia({video: true})
+ .then(t.step_func(function (stream) {
+ if (stream.getVideoTracks()[0].enabled) {
+ stream.getVideoTracks()[0].enabled = false;
+ }
- vid.removeEventListener("timeupdate", testOncePlaying, false);
- cv.width = vid.offsetWidth;
- cv.height = vid.offsetHeight;
- var ctx = cv.getContext("2d");
- ctx.drawImage(vid,0,0);
- var imageData = ctx.getImageData(0, 0, cv.width, cv.height);
- for (var i = 0; i < imageData.data.length; i+=4) {
- assert_equals(imageData.data[i], 0, "No red component in pixel #" + i);
- assert_equals(imageData.data[i + 1], 0, "No green component in pixel #" + i);
- assert_equals(imageData.data[i + 2], 0, "No blue component in pixel #" + i);
- assert_equals(imageData.data[i + 3], 255, "No transparency in pixel #" + i);
- }
- t.done();
+ var testOnceLoadeddata = t.step_func(function() {
+ vid.removeEventListener("loadeddata", testOnceLoadeddata, false);
+ cv.width = vid.offsetWidth;
+ cv.height = vid.offsetHeight;
+ var ctx = cv.getContext("2d");
+ ctx.drawImage(vid,0,0);
+ var imageData = ctx.getImageData(0, 0, cv.width, cv.height);
+ for (var i = 0; i < imageData.data.length; i+=4) {
+ assert_equals(imageData.data[i], 0, "No red component in pixel #" + i);
+ assert_equals(imageData.data[i + 1], 0, "No green component in pixel #" + i);
+ assert_equals(imageData.data[i + 2], 0, "No blue component in pixel #" + i);
+ assert_equals(imageData.data[i + 3], 255, "No transparency in pixel #" + i);
}
- vid.srcObject = stream;
- vid.play();
- vid.addEventListener("timeupdate", t.step_func(testOncePlaying), false);
- }),
- function(error) {});
+ t.done();
+ });
+
+ vid.srcObject = stream;
+ vid.play();
+ vid.addEventListener("loadeddata", testOnceLoadeddata, false);
+ })));
});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-end-manual.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-end-manual.https.html
index 6b6b72fc0c1..3500b03bc8c 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-end-manual.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-end-manual.https.html
@@ -16,11 +16,10 @@ correctly set into inactive state when permission is revoked.</p>
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that the video MediaStreamTrack objects are properly ended on permission revocation", {timeout: 20000}); // longer timeout since requires user interaction
t.step(function () {
- navigator.getUserMedia({audio: true,video: true}, t.step_func(function (stream) {
+ navigator.mediaDevices.getUserMedia({audio: true,video: true}).then(t.step_func(function (stream) {
var vidTrack = stream.getVideoTracks()[0];
assert_equals(vidTrack.readyState, "live", "The video track object is in live state");
var audTrack = stream.getAudioTracks()[0];
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html
new file mode 100644
index 00000000000..42674bab2ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-getSettings.https.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<title>MediaStreamTrack GetSettings</title>
+<p class="instructions">When prompted, accept to share your video stream.</p>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+ 'use strict'
+
+ // https://w3c.github.io/mediacapture-main/archives/20170605/getusermedia.html
+
+ promise_test(t => {
+ const constraints = {
+ video: true,
+ audio: false
+ };
+
+ return navigator.mediaDevices.getUserMedia(constraints)
+ .then(mediaStream => {
+ const settings1 = mediaStream.getVideoTracks()[0].getSettings();
+ const videoConstraints = {
+ deviceId: settings1.deviceId
+ };
+
+ return navigator.mediaDevices.getUserMedia({
+ video: videoConstraints,
+ audio: false
+ }).then(mediaStream => {
+ const settings2 = mediaStream.getVideoTracks()[0].getSettings();
+ assert_equals(settings1.deviceId, settings2.deviceId);
+ });
+ });
+ }, 'A device can be opened twice and have the same device ID');
+
+ promise_test(t => {
+ const constraints = {
+ video: true,
+ audio: false
+ };
+
+ return navigator.mediaDevices.getUserMedia(constraints)
+ .then(mediaStream => {
+ const settings1 = mediaStream.getVideoTracks()[0].getSettings();
+ const videoConstraints = {
+ deviceId: settings1.deviceId,
+ width: {
+ exact: settings1.width / 2
+ }
+ };
+
+ return navigator.mediaDevices.getUserMedia({
+ video: videoConstraints,
+ audio: false
+ }).then(mediaStream => {
+ const settings2 = mediaStream.getVideoTracks()[0].getSettings();
+ assert_equals(settings1.deviceId, settings2.deviceId);
+ assert_equals(settings1.width / 2, settings2.width);
+ });
+ });
+ }, 'A device can be opened twice with different resolutions');
+</script>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-id.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-id.https.html
index 866b48f94e8..85c72fe494e 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-id.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-id.https.html
@@ -13,11 +13,11 @@
<div id='log'></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that distinct mediastream tracks have distinct ids ", {timeout: 10000});
t.step(function () {
- navigator.getUserMedia({video: true, audio: true}, t.step_func(gotStream), t.step_func(function(error) {t.assert_unreached("Access to audio and video stream is granted");}));
+ navigator.mediaDevices.getUserMedia({video: true, audio: true})
+ .then(t.step_func(gotStream), t.step_func(function(error) {t.assert_unreached("Access to audio and video stream is granted");}));
function gotStream(stream) {
assert_not_equals(stream.getVideoTracks()[0], stream.getAudioTracks()[0].id, "audio and video tracks have distinct ids");
t.done();
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-init.https.html b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-init.https.html
index 2be2d81179e..a51cb67913c 100644
--- a/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-init.https.html
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/MediaStreamTrack-init.https.html
@@ -20,7 +20,6 @@ object returned by the success callback in getUserMedia is correctly initialized
<script src=/resources/testharnessreport.js></script>
<script src=/resources/WebIDLParser.js></script>
<script src=/resources/idlharness.js></script>
-<script src="/common/vendor-prefix.js" data-prefixed-objects='[{"ancestors":["navigator"], "name":"getUserMedia"}]'></script>
<script>
var t = async_test("Tests that the video MediaStreamTrack objects are properly initialized", {timeout:10000});
var track = null
@@ -52,19 +51,20 @@ idl_array.add_idls("interface MediaStreamTrack : EventTarget {\
};");
t.step(function () {
- navigator.getUserMedia({video: true}, t.step_func(function (stream) {
- var videoTracks = stream.getVideoTracks();
- assert_equals(videoTracks.length, 1, "There is exactly one video track in the media stream");
- track = videoTracks[0];
- idl_array.add_objects({MediaStreamTrack: ["track"]});
- idl_array.test();
- assert_equals(track.readyState, "live", "The track object is in live state");
- assert_equals(track.kind, "video", "The track object is of video kind");
- // Not clear that this is required by the spec,
- // see https://www.w3.org/Bugs/Public/show_bug.cgi?id=22212
- assert_true(track.enabled, "The track object is enabed");
- t.done();
- }), function (error) {});
+ navigator.mediaDevices.getUserMedia({video: true})
+ .then(t.step_func(function (stream) {
+ var videoTracks = stream.getVideoTracks();
+ assert_equals(videoTracks.length, 1, "There is exactly one video track in the media stream");
+ track = videoTracks[0];
+ idl_array.add_objects({MediaStreamTrack: ["track"]});
+ idl_array.test();
+ assert_equals(track.readyState, "live", "The track object is in live state");
+ assert_equals(track.kind, "video", "The track object is of video kind");
+ // Not clear that this is required by the spec,
+ // see https://www.w3.org/Bugs/Public/show_bug.cgi?id=22212
+ assert_true(track.enabled, "The track object is enabed");
+ t.done();
+ }));
});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/mediacapture-streams/historical.html b/tests/wpt/web-platform-tests/mediacapture-streams/historical.html
new file mode 100644
index 00000000000..d9616f1282c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/mediacapture-streams/historical.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<title>Historical Media Capture and Streams features</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+test(function() {
+ assert_false("webkitMediaStream" in window);
+}, "webkitMediaStream interface should not exist");
+
+test(function() {
+ assert_false("webkitGetUserMedia" in navigator);
+}, "navigator.webkitGetUserMedia should not exist");
+
+test(function() {
+ assert_false("mozGetUserMedia" in navigator);
+}, "navigator.mozGetUserMedia should not exist");
+</script>
diff --git a/tests/wpt/web-platform-tests/microdata/encoding-microdata/names-the-itemprop-attribute/original-id.json b/tests/wpt/web-platform-tests/microdata/encoding-microdata/names-the-itemprop-attribute/original-id.json
deleted file mode 100644
index 144cacfda8b..00000000000
--- a/tests/wpt/web-platform-tests/microdata/encoding-microdata/names-the-itemprop-attribute/original-id.json
+++ /dev/null
@@ -1 +0,0 @@
-{"original_id":"names:-the-itemprop-attribute"} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/microdata/introduction/global-identifiers-for-items/.gitkeep b/tests/wpt/web-platform-tests/microdata/introduction/global-identifiers-for-items/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/tests/wpt/web-platform-tests/microdata/introduction/global-identifiers-for-items/.gitkeep
+++ /dev/null
diff --git a/tests/wpt/web-platform-tests/microdata/introduction/overview/.gitkeep b/tests/wpt/web-platform-tests/microdata/introduction/overview/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/tests/wpt/web-platform-tests/microdata/introduction/overview/.gitkeep
+++ /dev/null
diff --git a/tests/wpt/web-platform-tests/microdata/introduction/selecting-names-when-defining-vocabularies/.gitkeep b/tests/wpt/web-platform-tests/microdata/introduction/selecting-names-when-defining-vocabularies/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/tests/wpt/web-platform-tests/microdata/introduction/selecting-names-when-defining-vocabularies/.gitkeep
+++ /dev/null
diff --git a/tests/wpt/web-platform-tests/microdata/introduction/the-basic-syntax/.gitkeep b/tests/wpt/web-platform-tests/microdata/introduction/the-basic-syntax/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/tests/wpt/web-platform-tests/microdata/introduction/the-basic-syntax/.gitkeep
+++ /dev/null
diff --git a/tests/wpt/web-platform-tests/microdata/introduction/typed-items/.gitkeep b/tests/wpt/web-platform-tests/microdata/introduction/typed-items/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/tests/wpt/web-platform-tests/microdata/introduction/typed-items/.gitkeep
+++ /dev/null
diff --git a/tests/wpt/web-platform-tests/microdata/introduction/using-the-microdata-dom-api/.gitkeep b/tests/wpt/web-platform-tests/microdata/introduction/using-the-microdata-dom-api/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/tests/wpt/web-platform-tests/microdata/introduction/using-the-microdata-dom-api/.gitkeep
+++ /dev/null
diff --git a/tests/wpt/web-platform-tests/microdata/terminology/.gitkeep b/tests/wpt/web-platform-tests/microdata/terminology/.gitkeep
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/tests/wpt/web-platform-tests/microdata/terminology/.gitkeep
+++ /dev/null
diff --git a/tests/wpt/web-platform-tests/navigation-timing/idlharness.html b/tests/wpt/web-platform-tests/navigation-timing/idlharness.html
index 65a8778f75a..ab8fd74e1f4 100644
--- a/tests/wpt/web-platform-tests/navigation-timing/idlharness.html
+++ b/tests/wpt/web-platform-tests/navigation-timing/idlharness.html
@@ -17,47 +17,75 @@
<div id="log"></div>
<pre id='untested_idl' style='display:none'>
+typedef double DOMHighResTimeStamp;
-[PrimaryGlobal]
interface Window {
+ [Replaceable]
+ readonly attribute Performance performance;
};
-callback interface EventListener {
- void handleEvent(Event event);
+[Exposed=(Window,Worker)]
+interface Performance {
};
-interface Event {
- // PhaseType
- const unsigned short NONE = 0;
- const unsigned short CAPTURING_PHASE = 1;
- const unsigned short AT_TARGET = 2;
- const unsigned short BUBBLING_PHASE = 3;
- readonly attribute DOMString type;
- readonly attribute EventTarget? target;
- readonly attribute EventTarget? currentTarget;
- readonly attribute unsigned short eventPhase;
- readonly attribute boolean bubbles;
- readonly attribute boolean cancelable;
- readonly attribute DOMTimeStamp timeStamp;
- void stopPropagation ();
- void preventDefault ();
- void initEvent (DOMString eventTypeArg, boolean bubblesArg, boolean cancelableArg);
- // Introduced in DOM Level 3
- void stopImmediatePropagation ();
- readonly attribute boolean defaultPrevented;
- readonly attribute boolean isTrusted;
+[Exposed=(Window,Worker)]
+interface PerformanceEntry {
+ readonly attribute DOMString name;
+ readonly attribute DOMString entryType;
+ readonly attribute DOMHighResTimeStamp startTime;
+ readonly attribute DOMHighResTimeStamp duration;
+ [Default] object toJSON();
+ };
+
+[Exposed=(Window,Worker)]
+interface PerformanceResourceTiming : PerformanceEntry {
+ readonly attribute DOMString initiatorType;
+ readonly attribute DOMString nextHopProtocol;
+ readonly attribute DOMHighResTimeStamp workerStart;
+ readonly attribute DOMHighResTimeStamp redirectStart;
+ readonly attribute DOMHighResTimeStamp redirectEnd;
+ readonly attribute DOMHighResTimeStamp fetchStart;
+ readonly attribute DOMHighResTimeStamp domainLookupStart;
+ readonly attribute DOMHighResTimeStamp domainLookupEnd;
+ readonly attribute DOMHighResTimeStamp connectStart;
+ readonly attribute DOMHighResTimeStamp connectEnd;
+ readonly attribute DOMHighResTimeStamp secureConnectionStart;
+ readonly attribute DOMHighResTimeStamp requestStart;
+ readonly attribute DOMHighResTimeStamp responseStart;
+ readonly attribute DOMHighResTimeStamp responseEnd;
+ readonly attribute unsigned long long transferSize;
+ readonly attribute unsigned long long encodedBodySize;
+ readonly attribute unsigned long long decodedBodySize;
+ [Default] object toJSON();
+ };
+</pre>
+
+<pre id='idl'>
+
+[Exposed=Window]
+interface PerformanceNavigationTiming : PerformanceResourceTiming {
+ readonly attribute DOMHighResTimeStamp unloadEventStart;
+ readonly attribute DOMHighResTimeStamp unloadEventEnd;
+ readonly attribute DOMHighResTimeStamp domInteractive;
+ readonly attribute DOMHighResTimeStamp domContentLoadedEventStart;
+ readonly attribute DOMHighResTimeStamp domContentLoadedEventEnd;
+ readonly attribute DOMHighResTimeStamp domComplete;
+ readonly attribute DOMHighResTimeStamp loadEventStart;
+ readonly attribute DOMHighResTimeStamp loadEventEnd;
+ readonly attribute NavigationType type;
+ readonly attribute unsigned short redirectCount;
+ [Default] object toJSON();
};
-interface EventTarget {
- // Modified in DOM Level 3
- void addEventListener (DOMString type, EventListener? listener, optional boolean useCapture = false);
- void removeEventListener (DOMString type, EventListener? listener, optional boolean useCapture = false);
- boolean dispatchEvent (Event event);
+enum NavigationType {
+ "navigate",
+ "reload",
+ "back_forward",
+ "prerender"
};
-</pre>
-<pre id='idl'>
+[Exposed=Window]
interface PerformanceTiming {
readonly attribute unsigned long long navigationStart;
readonly attribute unsigned long long unloadEventStart;
@@ -80,8 +108,11 @@ interface PerformanceTiming {
readonly attribute unsigned long long domComplete;
readonly attribute unsigned long long loadEventStart;
readonly attribute unsigned long long loadEventEnd;
+ [Default] object toJSON();
};
+
+[Exposed=Window]
interface PerformanceNavigation {
const unsigned short TYPE_NAVIGATE = 0;
const unsigned short TYPE_RELOAD = 1;
@@ -89,16 +120,17 @@ interface PerformanceNavigation {
const unsigned short TYPE_RESERVED = 255;
readonly attribute unsigned short type;
readonly attribute unsigned short redirectCount;
+ [Default] object toJSON();
};
-interface Performance : EventTarget {
+
+// [Exposed=Window]
+partial interface Performance {
+ [SameObject]
readonly attribute PerformanceTiming timing;
+ [SameObject]
readonly attribute PerformanceNavigation navigation;
};
-
-partial interface Window {
- [Replaceable] readonly attribute Performance performance;
-};
</pre>
<script>
@@ -108,10 +140,9 @@ partial interface Window {
idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
idl_array.add_idls(document.getElementById("idl").textContent);
- idl_array.add_objects({Window: ["window"],
- Performance: ["window.performance"],
- PerformanceNavigation: ["window.performance.navigation"],
- PerformanceTiming: ["window.performance.timing"]});
+ idl_array.add_objects({PerformanceNavigation: ["window.performance.navigation"],
+ PerformanceTiming: ["window.performance.timing"],
+ PerformanceNavigationTiming: ["window.performance.getEntriesByType('navigation')[0]"] });
idl_array.test();
})();
diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_idlharness.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_idlharness.html
index 7bdd5d50f21..eb7d94b15a7 100644
--- a/tests/wpt/web-platform-tests/navigation-timing/nav2_idlharness.html
+++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_idlharness.html
@@ -53,6 +53,7 @@ interface PerformanceNavigationTiming : PerformanceResourceTiming {
readonly attribute DOMHighResTimeStamp loadEventEnd;
readonly attribute NavigationType type;
readonly attribute unsigned short redirectCount;
+ [Default] object toJSON();
};
</pre>
diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_exist.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_exist.html
index 3d0a83b9ab0..b6048e061ba 100644
--- a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_exist.html
+++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_exist.html
@@ -31,6 +31,7 @@
'loadEventEnd',
'loadEventStart',
'name',
+ 'nextHopProtocol',
'redirectCount',
'redirectEnd',
'redirectStart',
diff --git a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_values.html b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_values.html
index 1ca4a1be2a6..6f46a4a02cc 100644
--- a/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_values.html
+++ b/tests/wpt/web-platform-tests/navigation-timing/nav2_test_attributes_values.html
@@ -50,6 +50,24 @@
'connectEnd'
];
+ // Navigation Timing attributes for comparison.
+ var navTiming1EventOrder = [
+ 'fetchStart',
+ 'domainLookupStart',
+ 'domainLookupEnd',
+ 'connectStart',
+ 'connectEnd',
+ 'requestStart',
+ 'responseStart',
+ 'responseEnd',
+ 'domInteractive',
+ 'domContentLoadedEventStart',
+ 'domContentLoadedEventEnd',
+ 'domComplete',
+ 'loadEventStart',
+ 'loadEventEnd'
+ ];
+
function verifyTimingEventOrder(eventOrder, timingEntry) {
for (var i = 0; i < eventOrder.length - 1; i++) {
assert_true(timingEntry[eventOrder[i]] <= timingEntry[eventOrder[i + 1]],
@@ -70,13 +88,24 @@
"Expected duration to be equal to loadEventEnd.");
assert_equals(entries[0].initiatorType, "navigation",
"Expected initiatorType to be: navigation.");
+ assert_equals(entries[0].nextHopProtocol, "http/1.1");
// This test may fail when response is from cach. Disable or clean cach before
// running this test.
assert_true(entries[0].transferSize > entries[0].encodedBodySize,
"Expected transferSize to be greater than encodedBodySize in uncached navigation.");
- assert_equals(entries[0].encodedBodySize, 4154);
- assert_equals(entries[0].decodedBodySize, 4154);
+ assert_equals(entries[0].encodedBodySize, 5328);
+ assert_equals(entries[0].decodedBodySize, 5328);
verifyTimingEventOrder(entries[0], navTiming2EventOrder1);
+ // Verify if the reported timing is not that different
+ // from what is reported by Navigation Timing 1.
+ navTiming1EventOrder.forEach(
+ function(event) {
+ if (window.performance.timing[event] -
+ window.performance.timing.navigationStart > 0) {
+ assert_greater_than(entries[0][event], 0,
+ "Expected " + event + " to be greater than 0");
+ }
+ });
// When unloadEvent happens
if (entries[0]["unloadEventStart"] != 0) {
verifyTimingEventOrder(entries[0], navTiming2EventOrder2);
diff --git a/tests/wpt/web-platform-tests/navigation-timing/resources/webperftestharness.js b/tests/wpt/web-platform-tests/navigation-timing/resources/webperftestharness.js
index f9b56d98689..afdfa2a768b 100644
--- a/tests/wpt/web-platform-tests/navigation-timing/resources/webperftestharness.js
+++ b/tests/wpt/web-platform-tests/navigation-timing/resources/webperftestharness.js
@@ -72,6 +72,11 @@ function test_timing_order(attribute_name, greater_than_attribute, properties)
// ensure it's in the right order
msg = "window.performance.timing." + attribute_name + " >= window.performance.timing." + greater_than_attribute;
wp_test(function() { assert_true(performanceNamespace.timing[attribute_name] >= performanceNamespace.timing[greater_than_attribute], msg); }, msg, properties);
+
+ // ensure we have at least 5 microseconds difference or it's 0
+ msg = "window.performance.timing." + attribute_name + " difference with window.performance.timing." + greater_than_attribute + " is 0 or at least 5 microseconds";
+ var diff = performanceNamespace.timing[attribute_name] - performanceNamespace.timing[greater_than_attribute];
+ wp_test(function() { assert_true((diff === 0) || ((diff * 1000) >= 5), msg); }, msg, properties);
}
function test_timing_greater_than(attribute_name, greater_than, properties)
diff --git a/tests/wpt/web-platform-tests/netinfo/netinfo-basics.html b/tests/wpt/web-platform-tests/netinfo/netinfo-basics.html
index 31ad9fce8b9..4cee9e410d5 100644
--- a/tests/wpt/web-platform-tests/netinfo/netinfo-basics.html
+++ b/tests/wpt/web-platform-tests/netinfo/netinfo-basics.html
@@ -9,27 +9,40 @@
test(function() {
assert_in_array(navigator.connection.type, ["bluetooth", "cellular",
"ethernet", "mixed", "none", "other", "unknown", "wifi", "wimax"], 'type is unexpected');
- });
+}, "type attribute");
test(function() {
assert_greater_than_equal(navigator.connection.downlinkMax, 0);
- });
+}, "downlinkMax attribute");
test(function() {
assert_in_array(navigator.connection.effectiveType, ["slow-2g", "2g",
"3g", "4g"], 'effectiveType is unexpected');
- });
+}, "effectiveType attribute");
test(function() {
- assert_greater_than_equal(navigator.connection.rtt, 0);
- assert_equals(navigator.connection.rtt % 25, 0,
- 'rtt must be a multiple of 25 msec');
- });
+ var rtt = navigator.connection.rtt;
+ assert_greater_than_equal(rtt, 0);
+ assert_less_than_equal(rtt, 3000);
+ assert_equals(rtt % 50, 0, 'rtt must be a multiple of 50 msec');
+}, "rtt attribute");
test(function() {
- assert_greater_than_equal(navigator.connection.downlink, 0);
- var downlink = navigator.connection.downlink ;
- assert_equals(((downlink - Math.floor(downlink)) *1000) % 25, 0,
- 'downlink must be a multiple of 25 kbps');
- });
+ var downlinkKbps = navigator.connection.downlink * 1000;
+ assert_greater_than_equal(downlinkKbps, 0);
+ assert_less_than_equal(downlinkKbps, 10000);
+
+ // Verify that downlinkKbps is a multiple of 50.
+ var quotient = parseInt(downlinkKbps / 50, 10);
+ // mod is the remainder left after dividing downlinkKbps by 50 while
+ // restricting the quotient to an integer. For example, if downlinkKbps is
+ // 1050, then mod will be 0. If downlinkKpbps is 1030, mod will be 30.
+ var mod = downlinkKbps - 50 * quotient;
+ assert_less_than_equal(0.0, mod, 'mod outside the range');
+ assert_greater_than(50.0, mod, 'mod outside the range');
+ // It is possible that mod is not exactly 0 because of floating point
+ // computations. e.g., downlinkKbps may be 99.999999, in which case mod
+ // will be 49.999999.
+ assert_true(mod < 1e-5 || (50-mod) < 1e-5, 'downlink must be a multiple of 50 kbps');
+}, "downlink attribute");
</script>
diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.resize.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.resize.html
index 2906f8069b3..3d40129669d 100644
--- a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.resize.html
+++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.resize.html
@@ -3,7 +3,7 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/canvas-tests.js"></script>
-
+<body></body>
<script>
test(function() {
var canvas = new OffscreenCanvas(10, 20);
@@ -38,6 +38,24 @@ test(function() {
}, "Verify that writing to the width and height attributes of an OffscreenCanvas works when there is a webgl context attached.");
test(function() {
+ var placeholder = document.createElement('canvas');
+ placeholder.width = 2;
+ placeholder.height = 2;
+ var offscreen = placeholder.transferControlToOffscreen();
+ assert_throws("InvalidStateError", () => { placeholder.width = 1; });
+ assert_throws("InvalidStateError", () => { placeholder.height = 1; });
+}, "Verify that writing to the width or height attribute of a placeholder canvas throws an exception");
+
+test(function() {
+ var placeholder = document.createElement('canvas');
+ placeholder.width = 1;
+ placeholder.height = 1;
+ var offscreen = placeholder.transferControlToOffscreen();
+ assert_throws("InvalidStateError", () => { placeholder.width = 1; });
+ assert_throws("InvalidStateError", () => { placeholder.height = 1; });
+}, "Verify that writing to the width or height attribute of a placeholder canvas throws an exception even when not changing the value of the attribute.");
+
+test(function() {
var canvas = new OffscreenCanvas(10, 20);
var ctx = canvas.getContext('2d');
ctx.lineWidth = 5;
@@ -46,7 +64,6 @@ test(function() {
ctx.lineWidth = 5;
canvas.height = 40;
assert_equals(ctx.lineWidth, 1);
-
}, "Verify that resizing a 2d context resets its state.");
test(function() {
@@ -62,6 +79,7 @@ test(function() {
async_test(function(t) {
var placeholder = document.createElement('canvas');
+ document.body.appendChild(placeholder); // So that we can check computed style/
placeholder.width = 10;
placeholder.height = 20;
var offscreen = placeholder.transferControlToOffscreen();
@@ -98,15 +116,11 @@ async_test(function(t) {
setTimeout(function(){
t.step(function() {
// Verify that commit() asynchronously updates the size of its placeholder canvas.
- assert_equals(placeholder.width, 10);
- assert_equals(placeholder.height, 20);
- });
- t.step(function() {
- // Verify that width/height attributes are still settable even though they have no effect.
- placeholder.width = 50;
- placeholder.height = 60;
- assert_equals(placeholder.width, 50);
- assert_equals(placeholder.height, 60);
+ assert_equals(placeholder.width, 30);
+ assert_equals(placeholder.height, 40);
+ var computedStyle = window.getComputedStyle(placeholder);
+ assert_equals(computedStyle.getPropertyValue('width'), "30px");
+ assert_equals(computedStyle.getPropertyValue('height'), "40px");
});
createImageBitmap(placeholder).then(image => {
t.step(function() {
@@ -124,6 +138,7 @@ async_test(function(t) {
async_test(function(t) {
var placeholder = document.createElement('canvas');
+ document.body.appendChild(placeholder); // So that we can check computed style/
placeholder.width = 10;
placeholder.height = 20;
var offscreen = placeholder.transferControlToOffscreen();
@@ -160,15 +175,11 @@ async_test(function(t) {
setTimeout(function(){
t.step(function() {
// Verify that commit() asynchronously updates the size of its placeholder canvas.
- assert_equals(placeholder.width, 10);
- assert_equals(placeholder.height, 20);
- });
- t.step(function() {
- // Verify that width/height attributes are still settable even though they have no effect.
- placeholder.width = 50;
- placeholder.height = 60;
- assert_equals(placeholder.width, 50);
- assert_equals(placeholder.height, 60);
+ assert_equals(placeholder.width, 30);
+ assert_equals(placeholder.height, 40);
+ var computedStyle = window.getComputedStyle(placeholder);
+ assert_equals(computedStyle.getPropertyValue('width'), "30px");
+ assert_equals(computedStyle.getPropertyValue('height'), "40px");
});
createImageBitmap(placeholder).then(image => {
t.step(function() {
@@ -204,14 +215,13 @@ async_test(function(t){
var pixel2 = testCtx.getImageData(9, 10, 1, 1).data;
var pixel3 = testCtx.getImageData(10, 9, 1, 1).data;
t.step(function() {
- assert_equals(placeholder.width, 1);
- assert_equals(placeholder.height, 1);
+ assert_equals(placeholder.width, 10);
+ assert_equals(placeholder.height, 10);
assert_array_equals(pixel1, [0, 255, 0, 255]);
assert_array_equals(pixel2, [0, 0, 0, 0]);
assert_array_equals(pixel3, [0, 0, 0, 0]);
});
t.done();
});
-
}, "Verify that drawImage uses the size of the committed frame as the intinsic size of a placeholder canvas.");
</script>
diff --git a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html
index 433dd45f837..2eacf3f2203 100644
--- a/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html
+++ b/tests/wpt/web-platform-tests/offscreen-canvas/the-offscreen-canvas/offscreencanvas.transfercontrol.to.offscreen.html
@@ -30,55 +30,5 @@ test(function() {
assert_throws("InvalidStateError", function() { placeholder.transferControlToOffscreen(); });
}, "Test that calling transferControlToOffscreen twice throws an exception");
-async_test(function(t) {
- var placeholder = document.createElement('canvas');
- placeholder.width = 10;
- placeholder.height = 20;
- var offscreenCanvas = placeholder.transferControlToOffscreen();
- var ctx = offscreenCanvas.getContext('2d');
- t.step(function() {
- offscreenCanvas.width = 30;
- offscreenCanvas.height = 40;
- ctx.fillStyle = '#0f0';
- ctx.fillRect(0, 0, 30, 40);
- assert_equals(offscreenCanvas.width, 30);
- assert_equals(offscreenCanvas.height, 40);
- var image = offscreenCanvas.transferToImageBitmap();
- assert_equals(image.width, 30);
- assert_equals(image.height, 40);
- });
- t.step(function() {
- // Setting the size of an OffscreenCanvas does not directly update the size of its placeholder canvas.
- assert_equals(placeholder.width, 10);
- assert_equals(placeholder.height, 20);
- });
- ctx.commit();
- t.step(function() {
- // commit() doesnt't synchronously update the size of its placeholder canvas
- assert_equals(placeholder.width, 10);
- assert_equals(placeholder.height, 20);
- });
- // Set timeout acts as a sync barrier to allow commit to propagate
- setTimeout(function() {
- t.step(function() {
- // commit() asynchronously updates the size of its placeholder canvas
- assert_equals(placeholder.width, 30);
- assert_equals(placeholder.height, 40);
- });
- createImageBitmap(placeholder).then(image => {
- t.step(function() {
- assert_equals(image.width, 30);
- assert_equals(image.height, 40);
- var canvas = document.createElement('canvas');
- canvas.width = canvas.height = 50;
- var context = canvas.getContext('2d');
- context.drawImage(image, 0, 0);
- _assertPixel(canvas, 15,20, 0,255,0,255, "15,20", "0,255,0,255");
- t.done();
- });
- });
- }, 0);
-}, "Verify that resizing an OffscreenCanvas with a 2d context propagates the new size to its placeholder canvas asynchronously, upon commit.");
-
</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_autocomplete-manual.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_autocomplete-manual.html
deleted file mode 100644
index 531cb374f3f..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_autocomplete-manual.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_autocomplete</h3>
- </p>
-
- <li>input text in textbox and press enter key.</li>
- <li>When you input same text, you can see hint text.</li>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><input type='text' id='input_text'></p>
- </form>
-
- <script>
-
- var input_text = document.getElementById("input_text");
- input_text.autocomplete = 'on';
-
- if (typeof(input_text.autocomplete) == "string") {
- if (input_text.autocomplete != "on") {
- test(function() {
- assert_true(false, "autocomplete attribute is not correct.");
- });
- }
- } else {
- test(function() {
- assert_unreached("autocomplete attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_list-manual.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_list-manual.html
deleted file mode 100644
index 0056839db9c..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_list-manual.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_list</h3>
- </p>
- <li>List is showed list when click the input control.</li>
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- name="input_form">
- <p><input type='text' id='input_url' list="urls"></p>
- <datalist id="urls">
- <option value="http://www.google.com/" label="Google">
- <option value="http://www.reddit.com/" label="Reddit">
- </datalist>
- </form>
-
- <script>
-
- var input_url = document.getElementById("input_url");
- var ele = input_url.list;
-
- if (typeof(ele) != "object") {
- if (typeof(ele) == "null") {
- test(function() {
- assert_unreached("list attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("list attribute is not exist.");
- });
- }
- }
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasdate-manual.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasdate-manual.html
deleted file mode 100644
index c9002f042b9..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasdate-manual.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_valueAsDate</h3>
- </p>
- <li>Date is showed in input when window is loaded.</li>
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- name="input_form">
- <p><input type='date' id='input_date'></p>
- </form>
-
- <script>
-
- var input_date = document.getElementById("input_date");
- // Setting
- try {
- input_date.valueAsDate = new Date();
- } catch(e) {
- test(function() {
- assert_unreached("Failed to set valueAsDate attribute.");
- });
- }
-
- // Getting
- if (input_date.valueAsDate != null) {
- if (typeof(input_date.valueAsDate) != "object") {
- test(function() {
- assert_true(false, "valueAsDate attribute is not correct.");
- });
- }
- } else {
- test(function() {
- assert_unreached("Failed to get valueAsDate attribute.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasnumber-manual.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasnumber-manual.html
deleted file mode 100644
index 6c24f1e4a97..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/input_valueasnumber-manual.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_valueAsNumber</h3>
- </p>
- <li>Number 5 is showed in input when window is loaded.</li>
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- name="input_form">
- <p><input type='number' id='input_number'></p>
- </form>
-
- <script>
-
- var input_number = document.getElementById("input_number");
- input_number.valueAsNumber = 5;
-
- if (typeof(input_number.valueAsNumber) == "number") {
- if (input_number.value != 5) {
- test(function() {
- assert_true(false, "valueAsNumber attribute is not correct.");
- });
- }
- } else {
- test(function() {
- assert_unreached("valueAsNumber attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_length-manual.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_length-manual.html
deleted file mode 100644
index 6c0864a0868..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_length-manual.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>select_length</h3>
- </p>
-
- <li>In select control there is only 3 items.</li>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p>
- <label for="unittype">Select unit type:</label>
- <select id="unittype" name="unittype">
- <option value="1"> Miner </option>
- <option value="2"> Puffer </option>
- <option value="3" selected> Snipey </option>
- <option value="4"> Max </option>
- <option value="5"> Firebot </option>
- </select>
- </p>
- </form>
-
- <script>
-
- var select = document.getElementById("unittype");
- var length = select.length;
- select.length = 3;
-
- if (typeof(length) == "number") {
- if (length != 5) {
- test(function() {
- assert_true(false, "length attribute is not correct.");
- });
- }
- } else {
- test(function() {
- assert_unreached("length attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_selectedindex-manual.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_selectedindex-manual.html
deleted file mode 100644
index 99fb65a3c2c..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/Not_Use/select_selectedindex-manual.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>select_selectedIndex</h3>
- </p>
-
- <li>In select control second item is selected.</li>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p>
- <label for="unittype">Select unit type:</label>
- <select id="unittype" name="unittype">
- <option value="1"> Miner </option>
- <option value="2"> Puffer </option>
- <option value="3" selected> Snipey </option>
- <option value="4"> Max </option>
- <option value="5"> Firebot </option>
- </select>
- </p>
- </form>
-
- <script>
-
- var select = document.getElementById("unittype");
- var selectedindex = select.selectedIndex;
-
- if (selectedindex != 2) {
- test(function() {
- assert_true(false, "selectedindex attribute is not correct.");
- });
- }
-
- select.selectedIndex = 1;
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_checkvalidity.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_checkvalidity.html
deleted file mode 100644
index 0d15e1083be..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_checkvalidity.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>button_checkValidity</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><button id='button_id'>button</button></p>
- </form>
- <script>
-
- var button = document.getElementById("button_id");
-
- try
- {
- var ret = button.checkValidity();
-
- test(function() {
- assert_equals(ret, true, "calling of checkValidity method is failed.");
- });
- }
- catch (e) {
- test(function() {
- assert_unreached("autofocus attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_labels.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_labels.html
deleted file mode 100644
index 312fb7e8189..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_labels.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>button_labels</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><label>Full name:<label>(name)<button id='button_id1'>button1</button><small>Format: First Last</small></label></label></p>
- <p><label>Age: <button id='button_id2'>button2</button></label></p>
- </form>
- <script>
-
- var button1 = document.getElementById("button_id1");
- var button2 = document.getElementById("button_id2");
-
- if (typeof(button1.labels) == "object") {
- if (button1.labels.length == 2 && button2.labels.length == 1) {
- test(function() {
- assert_true(true, "labels attribute is correct.");
- });
- } else {
- test(function() {
- assert_unreached("labels attribute is not correct.");
- });
- }
- } else {
- test(function() {
- assert_unreached("labels attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_setcustomvalidity.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_setcustomvalidity.html
deleted file mode 100644
index 6f012335f73..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_setcustomvalidity.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>button_setCustomValidity</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><button id='button_id'>button</button></p>
- </form>
- <script>
-
- var button = document.getElementById("button_id");
-
- try
- {
- button.setCustomValidity("custom error");
- test(function() {
- assert_true(true, "calling of setCustomValidity method is successed.");
- });
- }
- catch (e) {
- test(function() {
- assert_unreached("Error is raised.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_validationmessage.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_validationmessage.html
deleted file mode 100644
index 44364aec5ef..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_validationmessage.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>button_validationMessage</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><button id='button_id'>button</button></p>
- </form>
- <script>
-
- var button = document.getElementById("button_id");
-
- if (typeof(button.validationMessage) == "string") {
- test(function() {
- assert_equals(button.validationMessage, "", "validationMessage attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("validationMessage attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_validity.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_validity.html
deleted file mode 100644
index 00d022119a3..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_validity.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>button_validity</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><button id='button_id'>button</button></p>
- </form>
- <script>
-
- var button = document.getElementById("button_id");
-
- if (typeof(button.validity) == "object") {
- test(function() {
- assert_equals(button.validity.valueMissing, false, "validity attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("validity attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_willvalidate.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_willvalidate.html
deleted file mode 100644
index 067b38f8981..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/button_willvalidate.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>button_willValidate</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><button id='button_id'>button</button></p>
- </form>
- <script>
-
- var button = document.getElementById("button_id");
-
- if (typeof(button.willValidate) == "boolean") {
- test(function() {
- assert_equals(button.willValidate, true, "willValidate attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("willValidate attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_checkvalidity.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_checkvalidity.html
deleted file mode 100644
index ab4d9601fbd..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_checkvalidity.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>FieldSet_checkValidity</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <fieldset id="input_field">
- </fieldset>
- </form>
- <script>
-
- var field = document.getElementById("input_field");
-
- try
- {
- var ret = field.checkValidity();
-
- test(function() {
- assert_equals(ret, true, "calling of checkValidity method is failed.");
- });
- }
- catch (e) {
- test(function() {
- assert_unreached("Error is raised.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_setcustomvalidity.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_setcustomvalidity.html
deleted file mode 100644
index bca7d6f9700..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_setcustomvalidity.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>FieldSet_setCustomValidity</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <fieldset id="input_field">
- </fieldset>
- </form>
- <script>
-
- var field = document.getElementById("input_field");
-
- try
- {
- field.setCustomValidity("custom error");
- test(function() {
- assert_true(true, "calling of setCustomValidity method is successed.");
- });
- }
- catch (e) {
- test(function() {
- assert_unreached("Error is raised.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validationmessage.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validationmessage.html
deleted file mode 100644
index 8c3457d426c..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validationmessage.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>FieldSet_validationMessage</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <fieldset id="input_field">
- </fieldset>
- </form>
- <script>
-
- var field = document.getElementById("input_field");
-
- if (typeof(field.validationMessage) == "string") {
- test(function() {
- assert_equals(field.validationMessage, "", "validationMessage attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("validationMessage attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validity.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validity.html
deleted file mode 100644
index e0622bf38a7..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_validity.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>FieldSet_validity</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <fieldset id="input_field">
- </fieldset>
- </form>
- <script>
-
- var field = document.getElementById("input_field");
-
- if (typeof(field.validity) == "object") {
- test(function() {
- assert_equals(field.validity.valueMissing, false, "validity attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("validity attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_willvalidate.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_willvalidate.html
deleted file mode 100644
index 802968cd79f..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/fieldset_willvalidate.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>FieldSet_willValidate</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <fieldset id="input_field">
- </fieldset>
- </form>
- <script>
-
- var field = document.getElementById("input_field");
-
- if (typeof(field.willValidate) == "boolean") {
- test(function() {
- assert_equals(field.willValidate, false, "willValidate attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("willValidate attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_action.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_action.html
deleted file mode 100644
index f925a62ff11..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_action.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>Form_action</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action="http://www.google.com/"
- id="input_form">
- <p><input type=hidden name="custname"></p>
- <p><input type=hidden name="custtel"></p>
- <p><input type=hidden name="custemail"></p>
-
- </form>
- <script>
-
- var form = document.getElementById("input_form");
-
- if (typeof(form.action) == "string") {
- test(function() {
- assert_equals(form.action, "http://www.google.com/", "action attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("action attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_checkvalidity.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_checkvalidity.html
deleted file mode 100644
index 83d53da0dca..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_checkvalidity.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>Form_checkValidity</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><input type=hidden name="custname"></p>
- <p><input type=hidden name="custtel"></p>
- <p><input type=hidden name="custemail"></p>
-
- </form>
- <script>
-
- var form = document.getElementById("input_form");
-
- try
- {
- var ret = form.checkValidity();
-
- test(function() {
- assert_equals(ret, true, "calling of checkValidity method is failed.");
- });
- }
- catch (e) {
- test(function() {
- assert_unreached("Error is raised.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_length.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_length.html
deleted file mode 100644
index 2fae73be1ae..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_length.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>Form_length</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><input type=hidden name="custname"></p>
- <p><input type=hidden name="custtel"></p>
- <p><input type=hidden name="custemail"></p>
-
- </form>
- <script>
-
- var form = document.getElementById("input_form");
- var len = form.length;
-
- test(function() {
- assert_equals(len, 3, "length attribute is not correct.");
- });
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_submit.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_submit.html
deleted file mode 100644
index 788769049bb..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/form_submit.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>Form_submit</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action="?x=1"
- id="input_form">
- <p><input type=hidden name="custname"></p>
- <p><input type=hidden name="custtel"></p>
- <p><input type=hidden name="custemail"></p>
-
- </form>
- <script>
-
- var form = document.getElementById("input_form");
-
- try
- {
- var url = location.href;
- pos = url.lastIndexOf("?x=1");
- if (pos == -1) {
- form.submit();
- } else {
- test(function() {
- assert_true(true, "calling of submit method is successed.");
- });
- }
- }
- catch (e) {
- test(function() {
- assert_unreached("Error is raised.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_checkvalidity.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_checkvalidity.html
deleted file mode 100644
index c4649963874..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_checkvalidity.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_checkValidity</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><input type='hidden' id='input_text'></p>
- </form>
- <script>
-
- var input = document.getElementById("input_text");
-
- try
- {
- var ret = input.checkValidity();
-
- test(function() {
- assert_equals(ret, true, "calling of checkValidity method is failed.");
- });
- }
- catch (e) {
- test(function() {
- assert_unreached("Error is raised.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_height.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_height.html
deleted file mode 100644
index edf3624907e..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_height.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_height</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- name="input_form">
- <p><input type='image' id='input_text'></p>
- </form>
-
- <script>
-
- var input_text = document.getElementById("input_text");
- input_text.height = 30;
-
- if (typeof(input_text.height) == "number") {
- test(function() {
- assert_equals(input_text.height, 30, "formTarget attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("height attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_labels.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_labels.html
deleted file mode 100644
index b37b719e1df..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_labels.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_labels</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><label>Full name:<label>(name)<input name=fn id='input_text1'> <small>Format: First Last</small></label></label></p>
- <p><label>Age: <input name=age type=number min=0 id='input_text2'></label></p>
- <p><label>Post code: <input name=pc> <small>Format: AB12 3CD</small></label></p>
- </form>
- <script>
-
- var input1 = document.getElementById("input_text1");
- var input2 = document.getElementById("input_text2");
-
- if (typeof(input1.labels) == "object") {
- if (input1.labels.length == 2 && input2.labels.length == 1) {
- test(function() {
- assert_true(true, "labels attribute is correct.");
- });
- } else {
- test(function() {
- assert_unreached("labels attribute is not correct.");
- });
- }
- } else {
- test(function() {
- assert_unreached("labels attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_setcustomvalidity.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_setcustomvalidity.html
deleted file mode 100644
index 455dce2f024..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_setcustomvalidity.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_setCustomValidity</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><input type='hidden' id='input_text'></p>
- </form>
- <script>
-
- var input = document.getElementById("input_text");
-
- try
- {
- input.setCustomValidity("custom error");
- test(function() {
- assert_true(true, "calling of setCustomValidity method is successed.");
- });
- }
- catch (e) {
- test(function() {
- assert_unreached("Error is raised.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_stepdown.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_stepdown.html
deleted file mode 100644
index abe31f595e0..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_stepdown.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_stepDown</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- name="input_form">
- <p><input type='number' id='input_number'></p>
- </form>
-
- <script>
- var input_number = document.getElementById("input_number");
- input_number.max = "30";
- input_number.step = "3";
- input_number.value = "30";
- input_number.stepDown(5);
-
- if (typeof(input_number.stepDown) == "function") {
- test(function() {
- assert_equals(input_number.value, "15", "call of stepDown method is failed.");
- });
- } else {
- test(function() {
- assert_unreached("stepDown attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_stepup.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_stepup.html
deleted file mode 100644
index 39474b93d29..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_stepup.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_stepUp</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- name="input_form">
- <p><input type='number' id='input_number'></p>
- </form>
-
- <script>
-
- var input_number = document.getElementById("input_number");
- input_number.max = "30";
- input_number.step = "3";
- input_number.value = "0";
- input_number.stepUp(5);
-
- if (typeof(input_number.stepUp) == "function") {
- test(function() {
- assert_equals(input_number.value, "15", "call of stepUp method is failed.");
- });
- } else {
- test(function() {
- assert_unreached("stepUp attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_validationmessage.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_validationmessage.html
deleted file mode 100644
index 785b4e79ba4..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_validationmessage.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_validationMessage</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><input type='hidden' id='input_text'></p>
- </form>
- <script>
-
- var input = document.getElementById("input_text");
-
- if (typeof(input.validationMessage) == "string") {
- test(function() {
- assert_equals(input.validationMessage, "", "validationMessage attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("validationMessage attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_validity.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_validity.html
deleted file mode 100644
index f46bd0b4c93..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_validity.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_validity</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><input type='hidden' id='input_text'></p>
- </form>
- <script>
-
- var input = document.getElementById("input_text");
-
- if (typeof(input.validity) == "object") {
- test(function() {
- assert_equals(input.validity.valueMissing, false, "validity attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("validity attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_value_invalidstateerr.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_value_invalidstateerr.html
deleted file mode 100644
index 9ddf62acfc7..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_value_invalidstateerr.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_value_INVALID_STATE_ERR</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- name="input_form">
- <p><input type='file' id='input_file'></p>
- </form>
-
- <script>
-
- var input_file = document.getElementById("input_file");
- try {
- input_file.value = "val";
- test(function() {
- assert_unreached("INVALID_STATE_ERR error is not raised.");
- });
- } catch (e) {
- test(function() {
- assert_equals(e.code, e["INVALID_STATE_ERR"], "INVALID_STATE_ERR error is not raised.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_valueasdate_invalidstateerr.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_valueasdate_invalidstateerr.html
deleted file mode 100644
index 6df4f74c5ac..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_valueasdate_invalidstateerr.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_valueAsDate_INVALID_STATE_ERR</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- name="input_form">
- <p><input type='checkbox' id='input_checkbox'></p>
- </form>
-
- <script>
- var input_checkbox = document.getElementById("input_checkbox");
- try {
- input_checkbox.valueAsDate = new Date('2011-11-01');
- test(function() {
- assert_reached("INVALID_STATE_ERR error is not raised.");
- });
- }
- catch (e) {
- test(function() {
- assert_equals(e.code, e["INVALID_STATE_ERR"], "INVALID_STATE_ERR error is not raised.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_valueasnumber_invalidstateerr.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_valueasnumber_invalidstateerr.html
deleted file mode 100644
index 8444d3fdceb..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_valueasnumber_invalidstateerr.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_valueAsNumber_INVALID_STATE_ERR</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- name="input_form">
- <p><input type='checkbox' id='input_checkbox'></p>
- </form>
-
- <script>
-
- var input_checkbox = document.getElementById("input_checkbox");
- try {
- input_checkbox.valueAsNumber = 5;
- }
- catch (e) {
- test(function() {
- assert_equals(e.code, e["INVALID_STATE_ERR"], "INVALID_STATE_ERR error is not raised.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_width.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_width.html
deleted file mode 100644
index 7cbda113a63..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_width.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_width</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- name="input_form">
- <p><input type='image' id='input_text'></p>
- </form>
-
- <script>
-
- var input_text = document.getElementById("input_text");
- input_text.width = 30;
-
- if (typeof(input_text.width) == "number") {
- test(function() {
- assert_equals(input_text.width, 30, "width attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("width attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_willvalidate.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_willvalidate.html
deleted file mode 100644
index 612fd004ac3..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Forms/contents/Forms/input_willvalidate.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title>Forms</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- </head>
- <body>
- <p>
- <h3>input_willValidate</h3>
- </p>
-
- <hr>
-
- <div id="log"></div>
-
- <form method="post"
- enctype="application/x-www-form-urlencoded"
- action=""
- id="input_form">
- <p><input type='hidden' id='input_text'></p>
- </form>
- <script>
-
- var input = document.getElementById("input_text");
-
- if (typeof(input.willValidate) == "boolean") {
- test(function() {
- assert_equals(input.willValidate, false, "willValidate attribute is not correct.");
- });
- } else {
- test(function() {
- assert_unreached("willValidate attribute is not exist.");
- });
- }
-
- </script>
-
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Session_History/contents/Session_History/css/result.css b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Session_History/contents/Session_History/css/result.css
deleted file mode 100644
index 7bbc5173053..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Session_History/contents/Session_History/css/result.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.pass {
- color: green;
-}
-.fail {
- color: red;
-}
-.manualpass {
- color: green;
-}
-.manualfail {
- color: red;
-} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Session_History/contents/Session_History/index.html b/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Session_History/contents/Session_History/index.html
deleted file mode 100644
index 7c556410220..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Infraware/Session_History/contents/Session_History/index.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=3.0, user-scalable=yes" />
- <title>Session History</title>
-
- <script type="text/javascript">
- </script>
- </head>
-
- <body>
- <p>
- <b>Session History&nbsp;</b><br/>
- <hr/>
- <ol type="1">
- <font size="2">
- <!-- <li><a href="history_length.html">history_length</a></li> -->
- <li><a href="history_state.html">history_state</a></li>
-
- <li><a href="history_pushstate.html">history_pushState</a></li>
- <li><a href="history_pushstate_nooptionalparam.html">history_pushState_NoOptionalParam</a></li>
- <li><a href="history_pushstate_err.html">history_pushState SECURITY_ERR</a></li>
- <li><a href="history_replacestate.html">history_replaceState</a></li>
- <li><a href="history_replacestate_nooptionalparam.html">history_replaceStateNoOptionalParam</a></li>
- <li><a href="history_replacestate_err.html">history_replaceState SECURITY_ERR</a></li>
-
- <li><a href="history_back.html">history_back</a></li>
- <li><a href="history_forward.html">history_forward</a></li>
-
- <li><a href="history_go_minus.html">history_go_minus</a></li>
- <li><a href="history_go_plus.html">history_go_plus</a></li>
- <!-- <li><a href="history_go_zero.html">history_go_zero</a></li> -->
-
- <!-- <li><a href="history_go_under.html">history_go_under</a></li> -->
- <!-- <li><a href="history_go_over.html">history_go_over</a></li> -->
-
- <li><a href="location_href.html">location_href</a></li>
- <li><a href="location_assign.html">location_assign</a></li>
- <li><a href="location_replace.html">location_replace</a></li>
- <!-- <li><a href="location_reload.html">location_reload</a></li> -->
- <li><a href="location_protocol.html">location_protocol</a></li>
- <li><a href="location_host.html">location_host</a></li>
- <li><a href="location_hostname.html">location_hostname</a></li>
- <li><a href="location_port.html">location_port</a></li>
- <li><a href="location_pathname.html">location_pathname</a></li>
- <li><a href="location_search.html">location_search</a></li>
- <li><a href="location_hash.html">location_hash</a></li>
-
- <li><a href="combination_history_001.html">combination_history_001</a></li>
- <li><a href="combination_history_002.html">combination_history_002</a></li>
- <li><a href="combination_history_003.html">combination_history_003</a></li>
- <li><a href="combination_history_004.html">combination_history_004</a></li>
- <li><a href="combination_history_005.html">combination_history_005</a></li>
- <li><a href="combination_history_006.html">combination_history_006</a></li>
- <li><a href="combination_history_007.html">combination_history_007</a></li>
-
- </font>
- </ol>
- <hr/>
- <p>
- </body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_000-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_000-manual.htm
index 278157644b1..bdff2354dd3 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_000-manual.htm
+++ b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_000-manual.htm
@@ -57,6 +57,6 @@
If the user agent is still performing the previous iteration of the sequence (if any) when the next iteration becomes due, abort these steps for this iteration (effectively "skipping missed frames" of the drag-and-drop operation).
Fire a DND event named drag event at the source node. If this event is canceled, the user agent must set the current drag operation to "none" (no drag operation).
</p>
- <img src="../images/blue.png" style="width:200px; height:100px" draggable="true" id="target"/>
+ <img src="/images/blue.png" style="width:200px; height:100px" draggable="true" id="target"/>
</body>
</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_002-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_002-manual.htm
index fdd40b57769..48f57208df9 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_002-manual.htm
+++ b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_002-manual.htm
@@ -57,7 +57,7 @@
<p>
If the drag operation failed or succeeded, fire a DND event named dragend at the source node.
</p>
- <img src="../images/blue.png" style="width:200px; height:100px" draggable="true" id="target"/>
+ <img src="/images/blue.png" style="width:200px; height:100px" draggable="true" id="target"/>
<br /><br />
<input type="text" style="border:2px green solid; width:200px; height:50px"></input>
</body>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_013-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_013-manual.htm
index 6c2c88afcee..402aa841122 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_013-manual.htm
+++ b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_013-manual.htm
@@ -69,7 +69,7 @@
<p>
On setting, if the new value is one of "none", "copy", "copyLink", "copyMove", "link", "linkMove", "move", "all", or "uninitialized", then the attribute's current value must be set to the new value.
</p>
- <img src="../images/blue.png" style="width:200px; height:100px" draggable="true" id="target1"/>
+ <img src="/images/blue.png" style="width:200px; height:100px" draggable="true" id="target1"/>
<br /><br />
<input type="text" id="target2" style="border:2px green solid; width:200px; height:50px"></input>
</body>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_015-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_015-manual.htm
index 1cd64d9453e..597d8115750 100644
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_015-manual.htm
+++ b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/dragdrop/dragdrop_015-manual.htm
@@ -71,7 +71,7 @@
Remove the item in the drag data store item list whose kind is Plain Unicode string and whose type string is equal to format, if there is one.
Add an item to the drag data store item list whose kind is Plain Unicode string, whose type string is equal to format, and whose data is the string given by the method's second argument.
</p>
- <img src="../images/blue.png" style="width:200px; height:100px" draggable="customValue2" id="target1"/>
+ <img src="/images/blue.png" style="width:200px; height:100px" draggable="customValue2" id="target1"/>
<br /><br />
<input type="text" id="target2" style="border:2px green solid; width:200px; height:50px"></input>
</body>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue-area.png b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue-area.png
deleted file mode 100644
index 570ae0f2bf7..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue-area.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue-border.png b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue-border.png
deleted file mode 100644
index 8f8e41c3d00..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue-border.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue.png b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue.png
deleted file mode 100644
index 4498dd258a2..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/blue.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/fail.gif b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/fail.gif
deleted file mode 100644
index c4addcf0090..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/fail.gif
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/movie_300_frame_0.png b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/movie_300_frame_0.png
deleted file mode 100644
index b7128250938..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/movie_300_frame_0.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster.png b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster.png
deleted file mode 100644
index 8873ed67873..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_blue.png b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_blue.png
deleted file mode 100644
index 69d5a39dc48..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_blue.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_green.png b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_green.png
deleted file mode 100644
index cac16ede7c0..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_green.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_red.png b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_red.png
deleted file mode 100644
index 0fb1f252c22..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/poster_red.png
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/rect.svg b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/rect.svg
deleted file mode 100644
index bb0cf97d90e..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/images/rect.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="svg-root" width="100" height="50">
- <rect width="100" height="50" fill="black" />
-</svg>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_001.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_001.htm
deleted file mode 100644
index 24d16cfccea..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_001.htm
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Page with script</title>
-</head>
-<body>
- <script type="text/javascript">
- parent.window.postMessage("script ran", "*");
- </script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_004.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_004.htm
deleted file mode 100644
index 02960d0786e..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_004.htm
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>object tag</title>
-</head>
-<body>
- <object width="400" height="600" data="sandbox.pdf">
- </object>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_008.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_008.htm
deleted file mode 100644
index 115b9729383..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_008.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Page with hyperlink and target set to self</title>
-</head>
-<body>
- <a id="hyperlink" href="standalone-pass.htm" target="_self">Click here to perform self navigation</a>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_010.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_010.htm
deleted file mode 100644
index d4e81bb966d..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_010.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Page with window.open()</title>
-</head>
-<body>
- <button type="button" onclick="javascript:window.open('standalone-fail.htm')">Click here to call window.open() API</button>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_020.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_020.htm
deleted file mode 100644
index 3304ea84bb5..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_020.htm
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Page with iframes</title>
-</head>
-<body>
- <table cellpadding="5" cellspacing="10">
- <tr>
- <td>
- <span>child iframe with sandbox="allow-scripts" attribute</span><br />
- <iframe id="Iframe1" src="iframe_sandbox_020a.htm" sandbox="allow-scripts" style="height: 50px; width: 250px;"></iframe>
- </td>
- </tr>
- <tr>
- <td>
- <span>child iframe with sandbox="" attribute</span><br />
- <iframe id="Iframe2" src="iframe_sandbox_020a.htm" sandbox="" style="height: 50px; width: 250px;"></iframe>
- </td>
- </tr>
- <tr>
- <td>
- <span>child iframe without sandbox attribute</span><br />
- <iframe id="Iframe3" src="iframe_sandbox_020a.htm" style="height: 50px; width: 250px;"></iframe>
- </td>
- </tr>
- </table>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_020a.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_020a.htm
deleted file mode 100644
index a419c9413f8..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_020a.htm
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Page with script</title>
-</head>
-<body>
- <div>Script Execution: <span id="scriptExecute" style="Color: Green">Blocked</span></div>
- <script type="text/javascript">
- document.getElementById("scriptExecute").innerHTML = "Not Blocked";
- document.getElementById("scriptExecute").style.color = "Red";
- </script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_021.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_021.htm
deleted file mode 100644
index e3041ccef0a..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_021.htm
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Page with iframes</title>
-</head>
-<body>
- <table cellpadding="5" cellspacing="10">
- <tr>
- <td>
- <span>child iframe with sandbox="allow-scripts" attribute</span><br />
- <iframe id="Iframe1" src="iframe_sandbox_021a.htm" sandbox="allow-scripts" style="height: 50px; width: 250px;"></iframe>
- </td>
- </tr>
- <tr>
- <td>
- <span>child iframe with sandbox="" attribute</span><br />
- <iframe id="Iframe2" src="iframe_sandbox_020a.htm" sandbox="" style="height: 50px; width: 250px;"></iframe>
- </td>
- </tr>
- <tr>
- <td>
- <span>child iframe without sandbox attribute</span><br />
- <iframe id="Iframe3" src="iframe_sandbox_021a.htm" style="height: 50px; width: 250px;"></iframe>
- </td>
- </tr>
- </table>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_021a.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_021a.htm
deleted file mode 100644
index 4e22a363cab..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_021a.htm
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Page with script</title>
-</head>
-<body>
- <div>Script Execution: <span id="scriptExecute" style="Color: Red">Blocked</span></div>
- <script type="text/javascript">
- document.getElementById("scriptExecute").innerHTML = "Allowed";
- document.getElementById("scriptExecute").style.color = "Green";
- </script>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_022.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_022.htm
deleted file mode 100644
index 11382d1d7c6..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_022.htm
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>target=_top</title>
-</head>
-<body>
- <div>hyperlink with target=_top</div>
- <br />
- <a href="standalone-pass.htm" target="_top">Open the link in top window</a>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_026.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_026.htm
deleted file mode 100644
index 5f1a973e1f7..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_026.htm
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head><title>Page with access to localStorage and sessionStorage</title>
-</head>
-<body>
- <script type="text/javascript">
- if (window.localStorage && window.sessionStorage) {
- parent.window.postMessage("access to window.localStorage and window.sessionStorage", "*");
- }
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_027.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_027.htm
deleted file mode 100644
index 366bff6f940..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_027.htm
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head><title>XMLHttpRequest</title>
-</head>
-<body>
- <script type="text/javascript">
- xhrRequest = new XMLHttpRequest();
-
- xhrRequest.onreadystatechange = function () {
- if (xhrRequest.readyState == 4 && xhrRequest.status == 200) {
- //xhr successful
- parent.window.postMessage("access to window.XMLHttpRequest", "*");
- }
- }
-
- xhrRequest.open("GET", "standalone-pass.htm", true);
- xhrRequest.send();
-
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_031.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_031.htm
deleted file mode 100644
index 7ec7d7a4e81..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_031.htm
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head><title>Page with access to localStorage and sessionStorage</title>
-</head>
-<body>
- <script type="text/javascript">
- try
- {
- if (window.localStorage && window.sessionStorage) {
- parent.window.postMessage("access to window.localStorage and window.sessionStorage", "*");
- }
- }
- catch(e)
- {
- parent.window.postMessage("no access to window.localStorage and window.sessionStorage", "*");
- }
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_032.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_032.htm
deleted file mode 100644
index abc0370c2eb..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/iframe_sandbox_032.htm
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head><title>XMLHttpRequest</title>
-</head>
-<body>
- <script type="text/javascript">
-
- try
- {
- xhrRequest = new XMLHttpRequest();
-
- xhrRequest.onreadystatechange = function () {
- if (xhrRequest.readyState == 4 && xhrRequest.status == 200) {
- //xhr successful
- parent.window.postMessage("access to window.XMLHttpRequest", "*");
- }
- }
-
- xhrRequest.open("GET", "standalone-pass.htm", true);
- xhrRequest.send();
-
- }catch(e){}
-
- parent.window.postMessage("no access to window.XMLHttpRequest", "*");
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_001.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_001.htm
deleted file mode 100644
index 53e2172bc37..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_001.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Allow script execution inside iframe with sandbox attribute when sandbox="allow-scripts".</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-scripts-browsing-context-flag" />
- <meta name="assert" content="Allow script execution inside iframe with sandbox attribute when sandbox='allow-scripts'." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("Allow script execution inside iframe with sandbox attribute when sandbox='allow-scripts'.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "script ran");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 8000);
- window.addEventListener("message", callback, false);
- </script>
- <iframe src="iframe_sandbox_001.htm" sandbox="allow-scripts" style="display: none"></iframe>
- <div id=log></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_002.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_002.htm
deleted file mode 100644
index 767518456f0..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_002.htm
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Allow autoplay for HTML5 Video inside iframe with sandbox attribute if sandbox='allow-scripts'.</title>
- <meta name=timeout content=long>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script>
- async_test(function (t) {
- var callback = t.step_func_done(function(event) {
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "play event fired");
- });
-
- window.addEventListener("message", callback, false);
- }, "Allow autoplay for HTML5 Video inside iframe with sandbox attribute if sandbox='allow-scripts'.");
- </script>
- <iframe src="iframe_sandbox_002.htm" sandbox="allow-scripts" style="display: none"></iframe>
- <div id=log></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_003-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_003-manual.htm
deleted file mode 100644
index 21078322b96..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_003-manual.htm
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Block autofocus on form control inside iframe with sandbox attribute.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-automatic-features-browsing-context-flag" />
- <meta name="assert" content="Block autofocus on form control inside iframe with sandbox attribute." />
- <script src="sandbox_helper.js" type="text/javascript"></script>
-</head>
-<body>
- <pre>Description: Block autofocus on form controls inside iframe with sandbox attribute.</pre>
- <table id='testtable' border='1'>
- <tr>
- <td>Test Result</td>
- <td>Test Assertion</td>
- </tr>
- <tr>
- <td id='test_0_result'>Manual</td>
- <td id='test_0_assertion'>Test passes if caret (text cursor) is not on the textbox in the below iframe.</td>
- </tr>
- </table>
- <br />
- <div id="testframe">
- <pre>iframe with sandbox</pre>
- <iframe src="iframe_sandbox_003.htm" sandbox style="height: 100px; width: 400px;"></iframe>
- </div>
- <script type="text/javascript">
- DisableTestForNonSupportingBrowsers();
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_004-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_004-manual.htm
deleted file mode 100644
index 21b063aedff..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_004-manual.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Block plugins inside iframe with sandbox attribute.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-plugins-browsing-context-flag" />
- <meta name="assert" content="Block plugins inside iframe with sandbox attribute." />
- <script src="sandbox_helper.js" type="text/javascript"></script>
-</head>
-<body>
- <pre>Description: Block plugins inside iframe with sandbox attribute.</pre>
- <table id='testtable' border='1'>
- <tr>
- <td>Test Result</td>
- <td>Test Assertion</td>
- </tr>
- <tr>
- <td id='test_0_result'>Manual</td>
- <td id='test_0_assertion'>Test passes if you DO NOT see the 'Sample PDF For Testing' pdf below or 'FAIL'.<br>
- Test requires that a pdf plugin has been installed!</td>
- </tr>
- </table>
- <br />
- <div id="testframe">
- <pre>iframe with sandbox</pre>
- <iframe sandbox src="iframe_sandbox_004.htm" height="400" width ="600"></iframe>
- </div>
- <script type="text/javascript">
- DisableTestForNonSupportingBrowsers();
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_005.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_005.htm
deleted file mode 100644
index cc5f815c9d3..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_005.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Block script execution inside iframe with sandbox attribute.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-scripts-browsing-context-flag" />
- <meta name="assert" content="Block script execution inside iframe with sandbox attribute." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("Block script execution inside iframe with sandbox attribute.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_true(!event);
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <iframe src="iframe_sandbox_001.htm" sandbox style="display: none"></iframe>
- <div id=log></div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_006-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_006-manual.htm
deleted file mode 100644
index 487e8d4cfb8..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_006-manual.htm
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>HTML5 Sandbox: Allow form submission inside sandbox iframe when sandbox='allow-forms'</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-forms-browsing-context-flag" />
- <meta name="assert" content="Allow form submission inside sandbox iframe when sandbox='allow-forms'." />
- <script src="sandbox_helper.js" type="text/javascript"></script>
-</head>
-<body>
- <pre>Description: Allow form submission inside iframe with sandbox attribute if sandbox='allow-forms'.</pre>
- <table id='testtable' border='1'>
- <tr>
- <td>Test Result</td>
- <td>Test Assertion</td>
- </tr>
- <tr>
- <td id='test_0_result'>Manual</td>
- <td id='test_0_assertion'>
- <div>Steps:</div>
- <div>1. Click button "Submit Form".</div>
- <br />
- <div>Test passes if there is no red on the page and if the word "PASS" appears in the below iframe after following the above steps.</div>
- </td>
- </tr>
- </table>
- <br />
- <div id="testframe">
- <pre>iframe with sandbox="allow-forms"</pre>
- <iframe src="iframe_sandbox_006.htm" sandbox="allow-forms" style="height: 100px; width: 300px;"></iframe>
- </div>
- <script type="text/javascript">
- DisableTestForNonSupportingBrowsers();
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_007-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_007-manual.htm
deleted file mode 100644
index 5caa12a07a1..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_007-manual.htm
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>HTML5 Sandbox: Block form submission inside sandbox iframe</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-forms-browsing-context-flag" />
- <meta name="assert" content="Block form submission inside sandbox iframe." />
- <script src="sandbox_helper.js" type="text/javascript"></script>
-</head>
-<body>
- <pre>Description: Block form submission inside iframe with sandbox attribute.</pre>
- <table id='testtable' border='1'>
- <tr>
- <td>Test Result</td>
- <td>Test Assertion</td>
- </tr>
- <tr>
- <td id='test_0_result'>Manual</td>
- <td id='test_0_assertion'>
- <div>Steps:</div>
- <div>1. Click button "Submit Form".</div>
- <br />
- <div>Test passes if there is no red on the page and there is no navigation in the below iframe after following the above steps.</div>
- </td>
- </tr>
- </table>
- <br />
- <div id="testframe">
- <pre>iframe with sandbox="allow-scripts allow-same-origin allow-top-navigation"</pre>
- <iframe src="iframe_sandbox_007.htm" sandbox="allow-scripts allow-same-origin allow-top-navigation" style="height: 100px; width: 300px;"></iframe>
- </div>
- <script type="text/javascript">
- DisableTestForNonSupportingBrowsers();
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_008-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_008-manual.htm
deleted file mode 100644
index dde12ef1d33..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_008-manual.htm
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Allow sandboxed iframe content to navigate the sandboxed browsing context itself.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-navigation-browsing-context-flag" />
- <meta name="assert" content="Allow sandboxed iframe content to navigate the sandboxed browsing context itself." />
- <script src="sandbox_helper.js" type="text/javascript"></script>
-</head>
-<body>
- <pre>Description: Allow sandboxed iframe content to navigate the sandboxed browsing context itself.</pre>
- <table id='testtable' border='1'>
- <tr>
- <td>Test Result</td>
- <td>Test Assertion</td>
- </tr>
- <tr>
- <td id='test_0_result'>Manual</td>
- <td id='test_0_assertion'>
- <div>Steps:</div>
- <div>1. Click link "Click here to perform self navigation".</div>
- <br />
- <div>Test passes if there is no red on the page and the word "PASS" appears in the below iframe after following the above steps.</div>
- </td>
- </tr>
- </table>
- <br />
- <div id="testframe">
- <pre>iframe with sandbox=""</pre>
- <iframe id="iframe1" name="iframe1" src="iframe_sandbox_008.htm" sandbox="" style="height: 100px; width: 350px;"></iframe>
- </div>
- <script type="text/javascript">
- DisableTestForNonSupportingBrowsers();
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_010-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_010-manual.htm
deleted file mode 100644
index 4341066e1c1..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_010-manual.htm
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Block window.open() API inside iframe with sandbox attribute.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-navigation-browsing-context-flag" />
- <meta name="assert" content="Block window.open() API inside iframe with sandbox attribute." />
- <script src="sandbox_helper.js" type="text/javascript"></script>
-</head>
-<body>
- <pre>Description: Block window.open() API inside iframe with sandbox attribute.</pre>
- <table id='testtable' border='1'>
- <tr>
- <td>Test Result</td>
- <td>Test Assertion</td>
- </tr>
- <tr>
- <td id='test_0_result'>Manual</td>
- <td id='test_0_assertion'>
- <div>Steps:</div>
- <div>1. Click button "Click here to call window.open() API".</div>
- <br />
- <div>Test passes if there is no red on the page and no new window opens. The user agent may offer the user the option of allowing a new window to open.</div>
- </td>
- </tr>
- </table>
- <br />
- <div id="testframe">
- <pre>iframe with sandbox="allow-scripts allow-same-origin allow-forms allow-top-navigation"</pre>
- <iframe src="iframe_sandbox_010.htm" sandbox="allow-scripts allow-same-origin allow-forms allow-top-navigation" style="height: 100px; width: 450px;"></iframe>
- </div>
- <script type="text/javascript">
- DisableTestForNonSupportingBrowsers();
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_012.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_012.htm
deleted file mode 100644
index cf99378cd56..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_012.htm
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
- <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "cookies are R/W");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
-
- <iframe style="display:none" src="iframe_sandbox_012.htm" sandbox=" Allow-Scripts Allow-Same-Origin "></iframe>
-
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_013.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_013.htm
deleted file mode 100644
index ab0aea079f3..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_013.htm
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
- <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "cookies are R/W");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
-
- <iframe style="display:none" src="iframe_sandbox_012.htm" sandbox="
- allow-scripts
- allow-same-origin
- "></iframe>
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_014.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_014.htm
deleted file mode 100644
index 774720929cd..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_014.htm
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
- <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "cookies are R/W");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
-
- <iframe style="display:none" src="iframe_sandbox_012.htm" sandbox=" allow-scripts allow-same-origin "></iframe>
-
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_015.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_015.htm
deleted file mode 100644
index a34ede4b396..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_015.htm
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
- <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "cookies are R/W");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
-
- <iframe style="display:none" src="iframe_sandbox_012.htm" sandbox="&#32ALLOW-SCRIPTS&#32allow-same-origin&#32"></iframe>
-
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_016.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_016.htm
deleted file mode 100644
index c84e223e1d9..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_016.htm
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
- <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
-
- function callback(event)
- {
- t.step(function() {
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "cookies are R/W");
- });
- t.done();
- }
-
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
-
- <iframe style="display:none" src="iframe_sandbox_012.htm" sandbox="&#13ALLOW-SCRIPTS&#13allow-same-origin&#13"></iframe>
-
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_017.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_017.htm
deleted file mode 100644
index ade4c8092da..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_017.htm
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
- <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "cookies are R/W");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
-
- <iframe style="display:none" src="iframe_sandbox_012.htm" sandbox="&#12ALLOW-SCRIPTS&#12allow-same-origin&#12"></iframe>
-
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_018.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_018.htm
deleted file mode 100644
index 77f10d27426..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_018.htm
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
- <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "cookies are R/W");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
-
- <iframe style="display:none" src="iframe_sandbox_012.htm" sandbox="&#10ALLOW-SCRIPTS&#10allow-same-origin&#10"></iframe>
-
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_019.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_019.htm
deleted file mode 100644
index d91280a60a5..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_019.htm
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: value of sandbox attribute must be an unordered set of unique space-separated tokens.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
- <meta name="assert" content="value of sandbox attribute must be an unordered set of unique space-separated tokens." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("value of sandbox attribute must be an unordered set of unique space-separated tokens.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "cookies are R/W");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
-
- <iframe style="display:none" src="iframe_sandbox_012.htm" sandbox="&#9ALLOW-SCRIPTS&#9allow-same-origin&#9"></iframe>
-
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_020-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_020-manual.htm
deleted file mode 100644
index 751f8586353..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_020-manual.htm
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
- <meta name="assert" content="Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe." />
- <script src="sandbox_helper.js" type="text/javascript"></script>
-</head>
-<body>
- <pre>Description: Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe.</pre>
- <div>This test is to verify script is blocked inside nested iframes if the top-most sandbox iframe has no 'allow-scripts' token.</div>
- <br />
- <table id='testtable' border='1'>
- <tr>
- <td>Test Result</td>
- <td>Test Assertion</td>
- </tr>
- <tr>
- <td id='test_0_result'>Manual</td>
- <td id='test_0_assertion'>Test passes if there is no red on the page.</td>
- </tr>
- </table>
- <br />
- <div id="testframe">
- <div style="font-weight:bold">Top-most iframe with sandbox=""</div>
- <iframe id="iframe1" name="iframe1" src="iframe_sandbox_020.htm" sandbox="" style="height: 330px; width: 400px;"></iframe>
- </div>
- <script type="text/javascript">
- DisableTestForNonSupportingBrowsers();
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_021-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_021-manual.htm
deleted file mode 100644
index bbdc21f9355..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_021-manual.htm
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#attr-iframe-sandbox" />
- <meta name="assert" content="Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe." />
- <script src="sandbox_helper.js" type="text/javascript"></script>
-</head>
-<body>
- <pre>Description: Nested iframes cannot have less sandbox restrictions than their most restrictive ancestor iframe.</pre>
- <div>This test is to verify script is allowed inside nested iframes if any of the conditions below are true</div>
- <div>1. both parent sandbox and child sandbox have 'allow-scripts' token.</div>
- <div>2. parent sandbox has 'allow-scripts' token and nested child iframe has no sandbox attribute.</div>
- <div>3. parent iframe has no sandbox attribute and child iframe has sandbox='allow-scripts' token.</div>
- <div>4. both parent and child iframes have no sandbox attribute.</div>
- <br />
- <table id='testtable' border='1'>
- <tr>
- <td>Test Result</td>
- <td>Test Assertion</td>
- </tr>
- <tr>
- <td id='test_0_result'>Manual</td>
- <td id='test_0_assertion'>Test passes if there is no red on the page.</td>
- </tr>
- </table>
- <br />
- <div id="testframe">
- <div style="float: left; border: 1px solid; padding: 5px;">
- <div style="font-weight: bold">Top-most iframe with sandbox="allow-scripts"</div>
- <iframe id="iframe1" src="iframe_sandbox_021.htm" sandbox="allow-scripts" style="height: 330px; width: 400px;"></iframe>
- </div>
- <div style="float: left; border: 1px solid; padding: 5px; margin-left: 20px;">
- <div style="font-weight: bold">Top-most iframe without sandbox attribute</div>
- <iframe id="iframe2" src="iframe_sandbox_021.htm" style="height: 330px; width: 400px;"></iframe>
- </div>
- </div>
- <script type="text/javascript">
- DisableTestForNonSupportingBrowsers();
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_022-manual.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_022-manual.htm
deleted file mode 100644
index aa08de512b5..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_022-manual.htm
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: allow sandbox iframe to navigate their top-level browsing context if sandbox="allow-top-navigation".</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-scripts-browsing-context-flag" />
- <meta name="assert" content="Allow sandbox iframe to navigate their top-level browsing context if sandbox='allow-top-navigation'." />
- <script src="sandbox_helper.js" type="text/javascript"></script>
-</head>
-<body>
- <pre>Description: Allow sandbox iframe to navigate its top-level browsing context if sandbox='allow-top-navigation'.</pre>
- <table id='testtable' border='1'>
- <tr>
- <td>Test Result</td>
- <td>Test Assertion</td>
- </tr>
- <tr>
- <td id='test_0_result'>Manual</td>
- <td id='test_0_assertion'>
- <div>Steps:</div>
- <div>1. Click link "Open the link in top window".</div>
- <br />
- <div>Test passes if there is no red on the page and no top-level navigation after following the above steps.</div>
- </td>
- </tr>
- </table>
- <br />
- <div id="testframe">
- <pre>iframe with sandbox="allow-top-navigation"</pre>
- <iframe src="iframe_sandbox_022.htm" sandbox="allow-top-navigation" style="height: 100px; width: 450px;"></iframe>
- </div>
- <script type="text/javascript">
- DisableTestForNonSupportingBrowsers();
- </script>
-</body>
-</html>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_023.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_023.htm
deleted file mode 100644
index 7f8a436b4c9..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_023.htm
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>HTML5 Sandbox: Allow sandbox iframe to access other content from the same origin if sandbox="allow-same-origin".</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
- <meta name="assert" content=" Allow sandbox iframe to access other content from the same origin if sandbox='allow-same-origin'." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("Allow sandbox iframe to access other content from the same origin if sandbox='allow-same-origin'");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "window.parent.document");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <iframe src="iframe_sandbox_023.htm" sandbox="allow-scripts allow-same-origin" style="display:none"></iframe>
- <div id=log></div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_024.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_024.htm
deleted file mode 100644
index 935543707d8..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_024.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>HTML5 Sandbox: document.cookie access is allowed inside iframe with sandbox="allow-same-origin".</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
- <meta name="assert" content="document.cookie access is allowed inside iframe with sandbox='allow-same-origin'." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("document.cookie access is allowed inside iframe with sandbox='allow-same-origin'.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "cookies are R/W");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
- <iframe src="iframe_sandbox_024.htm" sandbox="allow-scripts allow-same-origin" style="display:none"></iframe>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_025.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_025.htm
deleted file mode 100644
index ab291e5cee0..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_025.htm
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Allow parent content to access sandbox child iframe content when sandbox='allow-same-origin</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
- <meta name="assert" content="Allow parent content to access sandbox child iframe content when sandbox='allow-same-origin'" />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
-
- var t = async_test("Allow parent content to access sandbox child iframe content when sandbox='allow-same-origin'");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(document.getElementById('sandboxIframe').contentDocument.title, "Page with a message");
- });
- t.done();
- }
- </script>
- <div id=log></div>
-
- <iframe id='sandboxIframe' src="standalone-iframe-content.htm" sandbox="allow-same-origin" onload="callback()" style="display : none"></iframe>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_026.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_026.htm
deleted file mode 100644
index 49243899e22..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_026.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>HTML5 Sandbox: Allow localStorage and sessionStorage access inside iframe with sandbox='allow-same-origin allow-scripts'.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
- <meta name="assert" content="Allow localStorage and sessionStorage access inside iframe with sandbox='allow-same-origin allow-scripts'." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("Allow localStorage and sessionStorage access inside iframe with sandbox='allow-same-origin allow-scripts'");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "access to window.localStorage and window.sessionStorage");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
- <iframe src="iframe_sandbox_026.htm" sandbox="allow-scripts allow-same-origin" style="display : none"></iframe>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_027.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_027.htm
deleted file mode 100644
index 2b9cba5d25a..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_027.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>HTML5 Sandbox: Allow XMLHttpRequest inside iframe with the sandbox attribute if sandbox='allow-same-origin'.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
- <meta name="assert" content="Allow XMLHttpRequest in an iframe with the sandbox attribute if sandbox='allow-same-origin'." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("Allow XMLHttpRequest in an iframe with the sandbox attribute if sandbox='allow-same-origin'.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "access to window.XMLHttpRequest");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
- <iframe src="iframe_sandbox_027.htm" sandbox="allow-scripts allow-same-origin" style="display : none"></iframe>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_028.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_028.htm
deleted file mode 100644
index 56dfb681006..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_028.htm
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>HTML5 Sandbox: Block sandbox iframe from accessing other content from the same origin.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
- <meta name="assert" content="Block sandbox iframe from accessing other content from the same origin." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("Block sandbox iframe from accessing other content from the same origin.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "!window.parent.document");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <iframe src="iframe_sandbox_028.htm" sandbox="allow-scripts" style="display:none"></iframe>
- <div id=log></div>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_029.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_029.htm
deleted file mode 100644
index b88b74a229c..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_029.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>HTML5 Sandbox: Block document.cookie inside iframe with the sandbox attribute.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
- <meta name="assert" content="Block document.cookie inside iframe with the sandbox attribute." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("Block document.cookie inside iframe with the sandbox attribute.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "cookies are not R/W");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
- <iframe src="iframe_sandbox_029.htm" sandbox="allow-scripts" style="display:none"></iframe>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_030.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_030.htm
deleted file mode 100644
index 1c3b54cb0dd..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_030.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>HTML5 Sandbox: Block parent content to access sandbox child iframe content when sandbox attribute exists</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
- <meta name="assert" content="Block parent content to access sandbox child iframe content when sandbox attribute exists" />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
-
- var t = async_test("Block parent content to access sandbox child iframe content when sandbox attribute exists");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- try { document.getElementById('sandboxIframe').contentDocument.title; assert_true(false);}
- catch(e) {assert_true(true);}
- });
- t.done();
- }
- </script>
- <div id=log></div>
-
- <iframe id='sandboxIframe' src="standalone-iframe-content.htm" sandbox onload="callback()" style="display : none"></iframe>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_031.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_031.htm
deleted file mode 100644
index 2582fac3582..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_031.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>HTML5 Sandbox: Block localStorage and sessionStorage inside iframe with the sandbox attribute.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
- <meta name="assert" content="Block localStorage and sessionStorage inside iframe with the sandbox attribute." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("Block localStorage and sessionStorage inside iframe with the sandbox attribute.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "no access to window.localStorage and window.sessionStorage");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
- <iframe src="iframe_sandbox_031.htm" sandbox="allow-scripts" style="display : none"></iframe>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_032.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_032.htm
deleted file mode 100644
index 1c234fcc960..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_032.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>HTML5 Sandbox: Block XMLHttpRequest in an iframe with the sandbox attribute.</title>
- <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
- <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
- <link rel="help" href="http://dev.w3.org/html5/spec/Overview.html#sandboxed-origin-browsing-context-flag" />
- <meta name="assert" content="Block XMLHttpRequest inside sandbox iframe." />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <script type="text/javascript">
-
-
- var t = async_test("Block XMLHttpRequest in an iframe with the sandbox attribute.");
-
- function callback(event)
- {
- t.step(function(){
- assert_true('sandbox' in document.createElement('iframe'));
- assert_equals(event.data, "no access to window.XMLHttpRequest");
- });
- t.done();
- }
-
- var timer = setTimeout(callback, 4000);
- window.addEventListener("message", callback, false);
- </script>
- <div id=log></div>
- <iframe src="iframe_sandbox_032.htm" sandbox="allow-scripts" style="display : none"></iframe>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_helper.js b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_helper.js
deleted file mode 100644
index 1472cbf223b..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/sandbox_helper.js
+++ /dev/null
@@ -1,14 +0,0 @@
-function IsSandboxSupported() {
- if ('sandbox' in document.createElement('iframe')) {
- return true;
- }
- return false;
-}
-
-function DisableTestForNonSupportingBrowsers() {
- //check if sandbox is supported by the browser
- if (!IsSandboxSupported()) {
- document.getElementById('testframe').innerHTML = "FAIL: Your browser does not support the sandbox attribute on the iframe element.";
- document.getElementById('testframe').style.color = "Red";
- }
-} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-fail.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-fail.htm
deleted file mode 100644
index 1725ef060ca..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-fail.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Page with FAIL message</title>
-</head>
-<body>
- <div style="color: Red">FAIL!!!</div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-iframe-content.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-iframe-content.htm
deleted file mode 100644
index e543c21d650..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-iframe-content.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Page with a message</title>
-</head>
-<body>
- <div>Hello World.</div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-pass.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-pass.htm
deleted file mode 100644
index 0ca822f8de2..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/sandbox/standalone-pass.htm
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Page with PASS message</title>
-</head>
-<body>
- <div style="color: Green">PASS!!!</div>
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/selection/addRange.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/selection/addRange.htm
deleted file mode 100644
index c4b5e99444d..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/selection/addRange.htm
+++ /dev/null
@@ -1,72 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title id="desc">HTML5 Selection: Add a range to the selection</title>
- <script type="text/javascript">
- var testPassed = true;
-
- function checkSelectionAttributes(anchorNode, anchorOffset, focusNode, focusOffset, collapsed, rangeCount)
- {
- var selection = window.getSelection();
- if (anchorNode != selection.anchorNode)
- {
- testPassed = false;
- }
- if (anchorOffset != selection.anchorOffset)
- {
- testPassed = false;
- }
- if (focusNode != selection.focusNode)
- {
- testPassed = false;
- }
- if (focusOffset != selection.focusOffset)
- {
- testPassed = false;
- }
- if (collapsed != selection.isCollapsed)
- {
- testPassed = false;
- }
- if (rangeCount != selection.rangeCount)
- {
- testPassed = false;
- }
- }
-
- function RunTest()
- {
- try
- {
- var selection = window.getSelection();
- var p1 = document.getElementById("p1");
-
- var range = document.createRange();
- range.selectNode(p1);
- selection.addRange(range);
-
- checkSelectionAttributes(range.startContainer, range.startOffset, range.endContainer, range.endOffset, range.collapsed, 1);
- if (p1.firstChild.nodeValue != selection.toString())
- {
- testPassed = false;
- }
-
- if (testPassed)
- {
- document.getElementById("testresult").firstChild.data = "PASS";
- }
- }
- catch (ex)
- {
- document.getElementById("testresult").firstChild.data = "FAIL";
- }
- }
- </script>
- </head>
- <body onload="RunTest();">
- <p id="p1">Add a range to the selection</p>
- <p>Test passes if the word "PASS" appears below.</p>
- <div>Test result: </div>
- <div id="testresult">FAIL</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/selection/collapse.htm b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/selection/collapse.htm
deleted file mode 100644
index 7c2423021c2..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/selection/collapse.htm
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE HTML>
-<html>
- <head>
- <title id="desc">HTML5 Selection: Collapse the selection using collapse()</title>
- <script type="text/javascript">
- var testPassed = true;
-
- function checkSelectionAttributes(anchorNode, anchorOffset, focusNode, focusOffset, collapsed, rangeCount)
- {
- var selection = window.getSelection();
- if (anchorNode != selection.anchorNode)
- {
- testPassed = false;
- }
- if (anchorOffset != selection.anchorOffset)
- {
- testPassed = false;
- }
- if (focusNode != selection.focusNode)
- {
- testPassed = false;
- }
- if (focusOffset != selection.focusOffset)
- {
- testPassed = false;
- }
- if (collapsed != selection.isCollapsed)
- {
- testPassed = false;
- }
- if (rangeCount != selection.rangeCount)
- {
- testPassed = false;
- }
- }
-
- function RunTest()
- {
- try
- {
- var selection = window.getSelection();
- var p1 = document.getElementById("p1");
-
- var range = document.createRange();
- range.selectNode(p1);
- selection.addRange(range);
- selection.collapse(p1, 0);
-
- checkSelectionAttributes(p1, 0, p1, 0, true, 1);
- if ("" != selection.toString())
- {
- testPassed = false;
- }
-
- if (testPassed)
- {
- document.getElementById("testresult").firstChild.data = "PASS";
- }
- }
- catch (ex)
- {
- document.getElementById("testresult").firstChild.data = "FAIL";
- }
- }
- </script>
- </head>
- <body onload="RunTest();">
- <p id="p1">Collapse the selection using collapse()</p>
- <p>Test passes if the word "PASS" appears below.</p>
- <div>Test result: </div>
- <div id="testresult">FAIL</div>
- </body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/structuredclone/structuredclone_0.html b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/structuredclone/structuredclone_0.html
deleted file mode 100644
index ed0e35d9acf..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/structuredclone/structuredclone_0.html
+++ /dev/null
@@ -1,400 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta content="text/html; charset=utf-8" http-equiv="content-type" />
- <title>2.8 Common DOM interfaces - Structured Clone Algorithm </title>
- <link rel="help" href="http://www.w3.org/TR/html5/common-dom-interfaces.html#safe-passing-of-structured-data" />
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<body>
- <div id="log"></div>
-
-<script type="text/javascript">
- var worker;
- var testCollection;
- setup(function()
- {
- //the worker is used for each test in sequence
- //worker's callback will be set for each test
- //worker's internal onmessage echoes the data back to this thread through postMessage
- worker = new Worker("./echo.js");
- testCollection = [
- function() {
- var t = async_test("Primitive string is cloned");
- t.id = 0;
- worker.onmessage = t.step_func(function(e) {assert_equals("primitive string", e.data, "\"primitive string\" === event.data"); t.done(); });
- t.step(function() { worker.postMessage("primitive string");});
- },
- function() {
- var t = async_test("Primitive integer is cloned");
- t.id = 1;
- worker.onmessage = t.step_func(function(e) {assert_equals(2000, e.data, "2000 === event.data"); t.done(); });
- t.step(function() { worker.postMessage(2000);});
- },
- function() {
- var t = async_test("Primitive floating point is cloned");
- t.id = 2;
- worker.onmessage = t.step_func(function(e) {assert_equals(111.456, e.data, "111.456 === event.data"); t.done(); });
- t.step(function() { worker.postMessage(111.456);});
- },
- function() {
- var t = async_test("Primitive floating point (negative) is cloned");
- t.id = 3;
- worker.onmessage = t.step_func(function(e) {assert_equals(-111.456, e.data, "-111.456 === event.data"); t.done(); });
- t.step(function() { worker.postMessage(-111.456);});
- },
- function() {
- var t = async_test("Primitive number (hex) is cloned");
- t.id = 4;
- worker.onmessage = t.step_func(function(e) {assert_equals(0xAB25, e.data, "0xAB25 === event.data"); t.done(); });
- t.step(function() { worker.postMessage(0xAB25);});
- },
- function() {
- var t = async_test("Primitive number (scientific) is cloned");
- t.id = 5;
- worker.onmessage = t.step_func(function(e) {assert_equals(15e2, e.data, "15e2 === event.data"); t.done(); });
- t.step(function() { worker.postMessage(15e2);});
- },
- function() {
- var t = async_test("Primitive boolean is cloned");
- t.id = 6;
- worker.onmessage = t.step_func(function(e) {assert_equals(false, e.data, "false === event.data"); t.done(); });
- t.step(function() { worker.postMessage(false);});
- },
- function() {
- var t = async_test("Instance of Boolean is cloned");
- t.id = 7;
- var obj;
- t.step(function() {obj = new Boolean(false);});
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "Boolean === event.data.constructor");
- assert_equals(obj.valueOf(), e.data.valueOf(), "(new Boolean(false)).valueof() === event.data.valueOf()");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },function() {
- var t = async_test("Instance of Number is cloned");
- t.id = 8;
- var obj;
- t.step(function() {obj = new Number(2000);});
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "Number === event.data.constructor");
- assert_equals(obj.valueOf(), e.data.valueOf(), "(new Number(2000)).valueof() === event.data.valueOf()");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Instance of String is cloned");
- t.id = 9;
- var obj;
- t.step(function() { obj = new String("String Object");});
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "String === event.data.constructor");
- assert_equals(obj.valueOf(), e.data.valueOf(), "(new String(\"String Object\")).valueof() === event.data.valueOf()");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Instance of Date is cloned");
- t.id = 10;
- var obj;
- t.step(function() { obj= new Date(2011,1,1);});
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "Date === event.data.constructor");
- assert_equals(obj.valueOf(), e.data.valueOf(), "(new Date(2011,1,1)).valueof() === event.data.valueOf()");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Instance of RegExp is cloned");
- t.id = 11;
- var obj;
- t.step(function() {obj = new RegExp("w3+c","g","i");});
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "RegExp === event.data.constructor");
- assert_equals(obj.source, e.data.source, "canon.source === event.data.source");
- assert_equals(obj.multiline, e.data.multiline, "canon.multiline === event.data.multiline");
- assert_equals(obj.global, e.data.global, "canon.global === event.data.global");
- assert_equals(obj.ignoreCase, e.data.ignoreCase, "canon.ignoreCase === event.data.ignoreCase");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Value 'null' is cloned");
- t.id = 12;
- worker.onmessage = t.step_func(function(e) {assert_equals(null, e.data, "null === event.data"); t.done(); });
- t.step(function() { worker.postMessage(null);});
- },
- function() {
- var t = async_test("Value 'undefined' is cloned");
- t.id = 13;
- worker.onmessage = t.step_func(function(e) {assert_equals(undefined, e.data, "undefined === event.data"); t.done(); });
- t.step(function() { worker.postMessage(undefined);});
- },
- function() {
- var t = async_test("Object properties are cloned");
- t.id = 14;
- var obj;
- t.step(function() {
- obj= {};
- obj.a = "test";
- obj.b = 2;
- obj["child"] = 3;
- });
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
- assert_equals(obj.a, e.data.a, "canon.a === event.data.a");
- assert_equals(obj.b, e.data.b, "canon.b === event.data.b");
- assert_equals(obj.child, e.data.child, "canon.child === e.data.child");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Prototype chains are not walked.");
- t.id = 15;
- function Custom() {
- this.a = "hello";
- }
-
- var obj;
- t.step(function() {
- Object.defineProperty(Custom.prototype, "b", { enumerable: true, value: 100 });
- obj = new Custom();
- });
- worker.onmessage = t.step_func(function(e) {
- assert_not_equals(obj.constructor, e.data.constructor, "canon.constructor !== event.data.constructor");
- assert_equals(Object, e.data.constructor, "Object === e.data.constructor");
- assert_equals(obj.a, e.data.a, "canon.a === e.data.a");
- assert_equals(undefined, e.data.b, "undefined === e.data.b");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Property descriptors of Objects are not cloned");
- t.id = 16;
- var obj;
- t.step(function() {
- obj = {};
- Object.defineProperty(obj, "a", { enumerable: true, writable: false, value: 100 });
- });
- worker.onmessage = t.step_func(function(e) {
- var des = Object.getOwnPropertyDescriptor(e.data, "a");
- assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
- assert_true(des.writable, "Descriptor is writable");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Cycles are preserved in Objects");
- t.id = 17;
- var obj;
- t.step(function() {
- obj = {};
- obj.a = obj;
- });
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
- assert_equals(e.data, e.data.a, "cycle is preserved");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Identity of duplicates is preserved");
- t.id = 18;
- var ref;
- var obj;
- t.step(function() {
- ref = {};
- ref.called = 0;
- Object.defineProperty(ref, "child", {get: function(){this.called++;}, enumerable: true});
-
- obj = {a:ref, b:ref};
- });
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
- assert_equals(e.data.b.called, 0, "e.data.b.called === 0");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Property order is preserved");
- t.id = 19;
- var obj;
- t.step(function() {
- obj = { "a": "hello", "b": "w3c", "c": "and world" };
- obj["a"] = "named1";
- });
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
- var canonNames = Object.getOwnPropertyNames(obj);
- var testNames = Object.getOwnPropertyNames(e.data);
- for (var i in canonNames) {
- assert_equals(canonNames[i], testNames[i], "canonProperty["+i+"] === dataProperty["+i+"]");
- }
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Enumerable properties of Arrays are cloned");
- t.id = 20;
- var obj;
- t.step(function() {
- obj = [0,1];
- obj["a"] = "named1";
- });
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
- assert_equals(e.data["a"], "named1", "e.data[\"a\"] === \"named1\"");
- assert_equals(e.data[0], 0, "e.data[0] === 0");
- assert_equals(e.data[1], 1, "e.data[1] === 1");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Property descriptors of Arrays are not cloned");
- t.id = 21;
- var obj;
- t.step(function() {
- obj = [0, 1];
- Object.defineProperty(obj, "2", { enumerable: true, writable: false, value: 100 });
- });
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
- assert_equals(e.data[0], 0, "e.data[0] === 0");
- assert_equals(e.data[1], 1, "e.data[1] === 1");
- var des = Object.getOwnPropertyDescriptor(e.data, "2");
- assert_true(des.writable, "Descriptor is writable");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Cycles are preserved in Arrays");
- t.id = 22;
- var obj;
- t.step(function() {
- obj = [0,1];
- obj[2] = obj;
- });
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
- assert_equals(e.data[0], 0, "e.data[0] === 0");
- assert_equals(e.data[1], 1, "e.data[1] === 1");
- assert_equals(e.data[2], e.data, "e.data[2] === e.data");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
-
- function() {
- var t = async_test("ImageData object can be cloned");
- t.id = 23;
- var obj;
- t.step(function() {
- var canvas = document.createElement("canvas");
- canvas.width = 40;
- canvas.height = 40;
- var context = canvas.getContext('2d');
- obj = context.createImageData(40, 40);
- assert_true(window.hasOwnProperty("ImageData"), "ImageData constructor must be present");
- assert_true(obj instanceof ImageData, "ImageData must be returned by .createImageData");
- });
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
- assert_not_equals(obj, e.data, "cloned object should be a new instance of ImageData");
- assert_equals(obj.width, e.data.width, "canon.width === e.data.width");
- assert_equals(obj.height, e.data.height, "canon.height === e.data.height");
- assert_array_equals(obj.data, e.data.data, "data arrays are the same");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("ImageData expandos are not cloned");
- t.id = 24;
- var obj;
- t.step(function() {
- var canvas = document.createElement("canvas");
- canvas.width = 40;
- canvas.height = 40;
- var context = canvas.getContext('2d');
- obj = context.createImageData(40, 40);
- assert_true(window.hasOwnProperty("ImageData"), "ImageData constructor must be present");
- assert_true(obj instanceof ImageData, "ImageData must be returned by .createImageData");
- obj.foo = "bar";
- });
- worker.onmessage = t.step_func(function(e) {
- assert_equals(obj.constructor, e.data.constructor, "canon.constructor === event.data.constructor");
- assert_not_equals(obj, e.data, "cloned object should be a new instance of ImageData");
- assert_equals(obj.width, e.data.width, "canon.width === e.data.width");
- assert_equals(obj.height, e.data.height, "canon.height === e.data.height");
- assert_array_equals(obj.data, e.data.data, "data arrays are the same");
- assert_equals(undefined, e.data.foo, "Expando is lost (undefined === e.data.foo)");
- t.done();
- });
- t.step(function() { worker.postMessage(obj);});
- },
- function() {
- var t = async_test("Window objects cannot be cloned");
- t.id = 25;
- worker.onmessage = function() {}; //no op because exception should be thrown.
- t.step(function() {
- assert_true(DOMException.hasOwnProperty('DATA_CLONE_ERR'), "DOMException.DATA_CLONE_ERR is present");
- assert_equals(DOMException.DATA_CLONE_ERR, 25, "DOMException.DATA_CLONE_ERR === 25");
- assert_throws('DATA_CLONE_ERR', function() {worker.postMessage(window)});
- });
- t.done();
- },
- function() {
- var t = async_test("Document objects cannot be cloned");
- t.id = 26;
- worker.onmessage = function() {}; //no op because exception should be thrown.
- t.step(function() {
- assert_true(DOMException.hasOwnProperty('DATA_CLONE_ERR'), "DOMException.DATA_CLONE_ERR is present");
- assert_equals(DOMException.DATA_CLONE_ERR, 25, "DOMException.DATA_CLONE_ERR === 25");
- assert_throws('DATA_CLONE_ERR', function() {worker.postMessage(document)});
- });
- t.done();
- }
- ];
- }, {explicit_done:true});
-
- //Callback for result_callback
- //queues the next test in the array testCollection
- //serves to make test execution sequential from the async worker callbacks
- //alternatively, we would have to create a worker for each test
- function testFinished(test) {
- if(test.id < testCollection.length - 1) {
- //queue the function so that stack remains shallow
- queue(testCollection[test.id+1]);
- } else {
- //when the last test has run, explicitly end test suite
- done();
- }
- }
- function queue(func) {
- setTimeout(func, 10);
- }
-
- add_result_callback(testFinished);
- //start the first test manually
- queue(testCollection[0]);
-
-
-
-
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/xhtml5/colgroup_valign_bottom.xhtml b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/xhtml5/colgroup_valign_bottom.xhtml
deleted file mode 100644
index 84da6dbf6ad..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/xhtml5/colgroup_valign_bottom.xhtml
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/xhtml5/colgroup_valign_top.xhtml b/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/xhtml5/colgroup_valign_top.xhtml
deleted file mode 100644
index 83b8c62e555..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Microsoft/xhtml5/colgroup_valign_top.xhtml
+++ /dev/null
Binary files differ
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/001.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/001.html
deleted file mode 100644
index 665019ed015..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/001.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: inline in markup </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');</script>
- <script>log('inline script #2');</script>
-
- <script type="text/javascript">
-
- var t = async_test()
-
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'inline script #2' ]);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/002.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/002.html
deleted file mode 100644
index dcaa163ea70..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/002.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: external in markup </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script src="scripts/include-1.js"></script>
- <script src="scripts/include-2.js"></script>
-
- <script type="text/javascript">
-
- var t = async_test()
-
-
- function test() {
- assert_array_equals(eventOrder, ['external script #1', 'external script #2' ]);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/003.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/003.html
deleted file mode 100644
index 053dd6aca4d..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/003.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: inline+external in markup </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1')</script>
- <script src="scripts/include-2.js"></script>
-
- <script type="text/javascript">
-
- var t = async_test()
-
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'external script #2' ]);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/004.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/004.html
deleted file mode 100644
index 838c2feb78b..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/004.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: external+inline in markup </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script src="scripts/include-1.js"></script>
- <script>log('inline script #2')</script>
-
- <script type="text/javascript">
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['external script #1', 'inline script #2' ]);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/005.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/005.html
deleted file mode 100644
index b0411284aa9..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/005.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write inline in markup </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.write( '<script>log(\'doc write script\')<\/script>' );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'doc write script', 'end script #1' ]);
- t.done();
- }
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/006.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/006.html
deleted file mode 100644
index 3f40ef1c174..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/006.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write inline - multiple</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.write( '<script>log(\'doc write script 1\')<\/script>' );
- document.write( '<script>log(\'doc write script 2\')<\/script>' );
- eval('log(\'eval 1\')');
- document.write( '<script>log(\'doc write script 3\')<\/script>' );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'doc write script 1','doc write script 2', 'eval 1','doc write script 3', 'end script #1' ]);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/007.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/007.html
deleted file mode 100644
index ee99bc36ea1..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/007.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write external</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1' ]);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/008.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/008.html
deleted file mode 100644
index 9f6b3876e69..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/008.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write external - multiple</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
- document.write( '<script src="scripts/include-2.js">log(\'ignore this\')<\/script>' );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1', 'external script #2' ]);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/009.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/009.html
deleted file mode 100644
index fc62b9d2b7a..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/009.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write external - multiple with doc.write</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
- document.write( '<script src="scripts/include-3.js">log(\'ignore this\')<\/script>' );
- document.write( '<script src="scripts/include-2.js">log(\'ignore this\')<\/script>' );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1', 'external script before doc write', 'document.write external script', 'external script after doc write', 'external script #2' ]);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/010.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/010.html
deleted file mode 100644
index 9c5fd849b99..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/010.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write external + inline - multiple with doc.write</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
- document.write( '<script>log(\'inline with doc.write #1\')<\/script>' );
- document.write( '<script src="scripts/include-2.js">log(\'ignore this\')<\/script>' );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1', 'inline with doc.write #1', 'external script #2']);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/011.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/011.html
deleted file mode 100644
index 7bc10995da5..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/011.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write external + inline - multiple with doc.write + subsequent markup</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
- document.write( '<script>log(\'inline with doc.write #1\')<\/script>' );
- document.write( '<script src="scripts/include-2.js">log(\'ignore this\')<\/script>' );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1', 'inline with doc.write #1', 'external script #2', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/012.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/012.html
deleted file mode 100644
index 41c3d066dd6..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/012.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write external and onload events </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.write( '<script src="scripts/include-1.js" onload = "log(\'include-1 load\')">log(\'ignore this\')<\/script>' )
- document.write( '<script src="scripts/include-3.js" onload = "log(\'include-3 load\')"><\/script>' )
- document.write( '<script src="scripts/include-2.js" onload = "log(\'include-2 load\')">log(\'ignore this\')<\/script>' )
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1', 'include-1 load', 'external script before doc write', 'document.write external script', 'external script after doc write', 'include-3 load', 'external script #2', 'include-2 load', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/013.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/013.html
deleted file mode 100644
index a3a9b825505..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/013.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added inline script earlier in document</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], false);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'head script #1','end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(function(){setTimeout(t.step_func(test), 100); })
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/014.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/014.html
deleted file mode 100644
index eae7076acd0..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/014.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: SCRIPT elements that move themselves in DOM </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.getElementsByTagName('head')[0].appendChild(document.getElementsByTagName('script')[2]);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log('script #2');
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'script #2']);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/015.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/015.html
deleted file mode 100644
index 88c28a8bce5..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/015.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added inline+external+inline script earlier in document</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], false);
- var s = testlib.addScript('', { 'src':'scripts/include-1.js' }, document.getElementsByTagName('head')[0], false);
- testlib.addScript('log(\'head script #2\')', {}, document.getElementsByTagName('head')[0], false);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- ///XXX I think the spec allows this case to race
- onload = function(){
- setTimeout(t.step_func(
- function() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'head script #1', 'head script #2', 'end script #1', 'external script #1', 'inline script #2'],
- ['inline script #1', 'head script #1', 'head script #2', 'end script #1', 'inline script #2', 'external script #1']]);
- t.done();
- }),
- 100);}
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/015a.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/015a.html
deleted file mode 100644
index 05113feb7ea..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/015a.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added inline+external+inline script earlier in document</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], false);
- var s = testlib.addScript('', { 'src':'scripts/include-1.js?pipe=trickle(d1)' }, document.getElementsByTagName('head')[0], false);
- testlib.addScript('log(\'head script #2\')', {}, document.getElementsByTagName('head')[0], false);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'head script #1', 'head script #2', 'end script #1', 'inline script #2', 'external script #1']);
- t.done();
- }
- onload = function(){setTimeout(t.step_func(function() {test.apply(t)}), 2000); }
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/016.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/016.html
deleted file mode 100644
index 7395600215f..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/016.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added inline script later in document</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- testlib.addScript('log(\'body script #1\')', {}, document.body, false);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'body script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(function(){setTimeout(t.step_func(test), 100); })
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/017.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/017.html
deleted file mode 100644
index 78a0f7b1a6f..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/017.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: multiple DOM added scripts later in document</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- testlib.addScript('log(\'body script #1\')', {}, document.getElementsByTagName('body')[0], false);
- testlib.addScript('', { 'src':'scripts/include-1.js' }, document.getElementsByTagName('body')[0], false);
- testlib.addScript('log(\'body script #2\')', {}, document.getElementsByTagName('body')[0], false);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- //The order of the external script vs the second inline script is undefined because the added script is async by default
- //But we expect most UAs to have the second order
- onload = function() {setTimeout(t.step_func(function() {
- assert_any(assert_array_equals, eventOrder, [
- ['inline script #1', 'body script #1', 'body script #2', 'end script #1', 'external script #1', 'inline script #2'],
- ['inline script #1', 'body script #1', 'body script #2', 'end script #1', 'inline script #2', 'external script #1']]);
- t.done();
- }), 100);}
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/018.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/018.html
deleted file mode 100644
index 793343c43cf..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/018.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added scripts and doc.write</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- testlib.addScript('', { 'src':'scripts/include-3.js' }, document.getElementsByTagName('head')[0], false);
- testlib.addScript('log(\'body script #2\')', {}, document.getElementsByTagName('body')[0], true);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- //XXX Need to test this delaying the document after we insert the external script and delaying the external script itself; afaict the spec allows us to race here on whether the document.write
- //ever actually happens or not according to whether the insertion point is defined at the point at which the script is executed.
- function test() {
- assert_any(assert_array_equals, eventOrder, [
- ['inline script #1', 'body script #2', 'end script #1', 'external script before doc write', 'document.write external script', 'external script after doc write', 'inline script #2'],
- ['inline script #1', 'body script #2', 'end script #1', 'inline script #2', 'external script before doc write', 'document.write external script', 'external script after doc write'],
- ['inline script #1', 'body script #2', 'end script #1', 'inline script #2', 'external script before doc write', 'external script after doc write']
- ]);
- t.done();
-}
- onload = t.step_func(function(){setTimeout(test.apply(t), 100); })
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/019.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/019.html
deleted file mode 100644
index 30fa63432c9..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/019.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added scripts and event handling </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script onload="log('inline #1 load')">
- log('inline script #1');
- testlib.addScript('', {'src':'scripts/include-1.js', 'onload':function(){log("external #1 load")}}, document.getElementsByTagName('head')[0], false);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'external #1 load', 'inline script #2'],
- ['inline script #1', 'end script #1', 'inline script #2', 'external script #1', 'external #1 load']
- ]);
- t.done();
-}
- onload = function(){setTimeout(t.step_func(test), 100); }
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/020.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/020.html
deleted file mode 100644
index abbfbf7db5d..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/020.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added script with data: URL </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <script>log('inline script #1');
- testlib.addScript('', { 'src':'data:text/javascript,log("data URL script")' }, document.getElementsByTagName('body')[0], true);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'data URL script', 'inline script #2'],
- ['inline script #1', 'end script #1', 'inline script #2', 'data URL script']]);
- t.done();
- }
- onload = function() {setTimeout( t.step_func(test), 100); }
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/021.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/021.html
deleted file mode 100644
index 92b5f064178..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/021.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added script with javascript: URL </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <script>log('inline script #1');
- testlib.addScript('', { 'src':'javascript:log("JS URL script")' }, document.getElementsByTagName('body')[0], true);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', /*'JS URL script',*/ 'inline script #2']);
- t.done();
-/* pass condition changed 2010-12-01 due to CT-198 */
-
- }
- onload = t.step_func(function(){setTimeout( test, 100); })
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/022.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/022.html
deleted file mode 100644
index f56b43171b0..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/022.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added script, late .src </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <script>log('inline script #1');
- var script = testlib.addScript('', { }, document.getElementsByTagName('body')[0], false);
- script.src='scripts/include-1.js';
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- onload = function() {setTimeout(t.step_func(
- function() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'inline script #2'],
- ['inline script #1', 'end script #1', 'inline script #2', 'external script #1']]);
- t.done()
- }),
- 100)}
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/024.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/024.html
deleted file mode 100644
index 37146f8463d..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/024.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added script, .src set twice</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <script>log('inline script #1');
- var script = testlib.addScript('', { }, document.getElementsByTagName('body')[0], false);
- script.src='scripts/include-1.js';
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'inline script #2'],
- ['inline script #1', 'end script #1', 'inline script #2', 'external script #1']]);
- t.done();
- }
- onload = t.step_func(function(){
- script.src='scripts/include-2.js'; // needs to be ignored, script already "is executed"
- setTimeout(t.step_func(test), 100);
- })
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/025.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/025.html
deleted file mode 100644
index 182be3aef15..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/025.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM added script, .src set on script with content</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <script>log('inline script #1');
- var script = testlib.addScript('log("inline DOM script #1")', { }, document.getElementsByTagName('body')[0], false);
- script.src='scripts/include-1.js';
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'inline DOM script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(function(){
- setTimeout(t.step_func(test), 100);
- })
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/026.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/026.html
deleted file mode 100644
index 70fac7c7f4b..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/026.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: doc write added script, .src set later</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <script>log('inline script #1');
- var t = async_test();
- document.write('<script><\/script>');
- var scripts = document.getElementsByTagName('script');
- scripts[scripts.length - 1].src = 'scripts/include-1.js';
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
-
- onload = function() {
- setTimeout(
- t.step_func(function() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'inline script #2'],
- ['inline script #1', 'end script #1', 'inline script #2', 'external script #1']]);
- t.done();
- }),
- 100);
- }
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/027.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/027.html
deleted file mode 100644
index d3181d587f5..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/027.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: doc write added script with content, .src set later</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <script>log('inline script #1');
- document.write('<script>log(\'doc.write script\')<\/script>');
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- document.getElementsByTagName('script')[4].src='scripts/include-1.js';
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'doc.write script', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(function(){
- setTimeout(t.step_func(test), 100);
- })
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/028.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/028.html
deleted file mode 100644
index 5d0207d85b3..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/028.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: javascript: URL</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <script>log('inline script #1');
- window.location.replace('javascript:log(\'JS URL\')');
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [
- ['inline script #1', 'end script #1', 'JS URL', 'inline script #2'],
- ['inline script #1', 'end script #1', 'inline script #2', 'JS URL']]);
- t.done();
- }
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/029.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/029.html
deleted file mode 100644
index b3beeaef360..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/029.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: javascript: URL in HREF</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <p><a href="javascript:log('JS URL')"></a></p>
- <script>log('inline script #1');
- if(document.links[0].click){
- document.links[0].click();
- }else{
- var evt = document.createEvent("MouseEvents");
- evt.initMouseEvent("click", true, true, window,
- 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- document.links[0].dispatchEvent(evt);
- }
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [
- ['inline script #1', 'end script #1', 'JS URL', 'inline script #2'],
- ['inline script #1', 'end script #1', 'inline script #2', 'JS URL']]);
- t.done();
- }
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/030.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/030.html
deleted file mode 100644
index 9c83b9a2619..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/030.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: javascript: URL in HREF, onclick handler</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <p><a href="javascript:log('JS URL')" onclick="log('click event');return true;"></a></p>
- <script>log('inline script #1');
- if(document.links[0].click){
- document.links[0].click();
- }else{
- var evt = document.createEvent("MouseEvents");
- evt.initMouseEvent("click", true, true, window,
- 0, 0, 0, 0, 0, false, false, false, false, 0, null);
- document.links[0].dispatchEvent(evt);
- }
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- var w = window;
- onload = function() {setTimeout(
- t.step_func(function() {
- w.assert_any(w.assert_array_equals, w.eventOrder,
- [['inline script #1', 'click event', 'end script #1', 'JS URL', 'inline script #2'],
- ['inline script #1', 'click event', 'end script #1', 'inline script #2', 'JS URL']]);
- t.done();
- }), 200);
- }
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/031.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/031.html
deleted file mode 100644
index 166dda47541..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/031.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: focus and blur events</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <form><input type="button" onclick="log('click event')" onfocus="log('focus event')" onblur="log('blur event')"><input type="button" onfocus="log('focus el 2 event')" onblur="log('blur event')"></form>
- <script>log('inline script #1');
- document.forms[0][0].focus();
- document.forms[0][1].click();
- document.forms[0][1].focus();
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log('inline script #2');
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'focus event', 'blur event', 'focus el 2 event', 'end script #1', 'inline script #2']);
- t.done();
- }
- onload = t.step_func(function(){setTimeout(t.step_func(test), 200);})
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/032.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/032.html
deleted file mode 100644
index a012ab29e57..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/032.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: innerHTML and scripts</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>log('inline script #1');
- // script added with innerHTML should not run..
- document.getElementsByTagName('div')[1].innerHTML = '<script>log("innerHTML script runs")<\/script><script src="scripts/include-1.js"><\/script>';
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(function(){setTimeout(t.step_func(test), 200);})
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/033.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/033.html
deleted file mode 100644
index 035bf0a2311..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/033.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: innerHTML and scripts moved in DOM</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>log('inline script #1');
- // script added with innerHTML should not run..
- document.getElementsByTagName('div')[0].innerHTML = '<script>log("innerHTML script runs")<\/script><script src="scripts/include-1.js"><\/script>';
- try{
- document.body.appendChild( document.getElementsByTagName('div')[0].firstChild );
- document.body.appendChild( document.getElementsByTagName('div')[0].firstChild );
- }catch(e){
- log('ERROR while testing');
- }
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(function(){setTimeout(t.step_func(test), 200);})
- </script>
-
-</body></html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/034.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/034.html
deleted file mode 100644
index 8dcb4294d56..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/034.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: innerHTML adding frames with JS in</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>log('inline script #1');
- document.getElementsByTagName('div')[1].innerHTML = '<iframe src="pages/helloworld.html"></iframe>';
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2', 'frame/popup script']);
- t.done();
-}
- onload = t.step_func(function(){setTimeout(t.step_func(test), 200);})
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/035.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/035.html
deleted file mode 100644
index 540439e7e23..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/035.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: innerHTML adding frames with JS in and moving scripts</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>log('inline script #1');
- document.getElementsByTagName('div')[1].innerHTML = '<iframe src="pages/helloworld.html"></iframe>';
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2', 'frame/popup script']);
- t.done();
-/*, ['inline script #1', 'end script #1', 'frame/popup script', 'inline script #2'] */
-
- }
- onload = t.step_func(function(){
- try{
- document.body.appendChild(document.importNode( top.frames[0].document.getElementsByTagName('script')[0], true ));
- }catch(e){ log('ERROR - tested functionality not supported'); }
- setTimeout(t.step_func(test), 200);
- });
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/036.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/036.html
deleted file mode 100644
index 0eb4a6eb36e..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/036.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM cloning</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>log('inline script #1');
- testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], true);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- try{
- var script = document.getElementsByTagName('script')[0].cloneNode(true);
- document.body.appendChild(script);
- }catch(e){ log('ERROR - tested functionality not supported'); }
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'head script #1', 'end script #1', 'inline script #2' ]);
- t.done();
-}
- onload = t.step_func(function(){
- setTimeout(t.step_func(test), 200);
- });
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/037.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/037.html
deleted file mode 100644
index aff995b4773..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/037.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM movement with appendChild, inline</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>log('inline script #1');
- var script = testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], true);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- try{
- document.body.appendChild(script);
- }catch(e){ log('ERROR - tested functionality not supported'); }
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'head script #1', 'end script #1', 'inline script #2' ]);
- t.done();
-}
- onload = t.step_func(function(){
- setTimeout(t.step_func(test), 200);
- });
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/038.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/038.html
deleted file mode 100644
index 3bbfe4604a7..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/038.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM movement with appendChild, external</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>log('inline script #1');
- var script = testlib.addScript('', { 'src':'scripts/include-1.js' }, document.getElementsByTagName('head')[0], true);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- try{
- document.body.appendChild(script);
- }catch(e){ log('ERROR - tested functionality not supported'); }
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'inline script #2'],
- ['inline script #1', 'end script #1', 'inline script #2', 'external script #1']]);
- t.done();
-}
- onload = function() {
- setTimeout(t.step_func(test), 200);
- };
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/040.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/040.html
deleted file mode 100644
index 984bc6689dc..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/040.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: IFRAMEs added with DOM (innerHTML), javascript: URL</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>log('inline script #1');
- document.getElementsByTagName('div')[1].innerHTML = '<iframe src="javascript:parent.log(\'JS URL\');\'<html><script>parent.log(\\\'frame script\\\')<\/script></html>\'"></iframe>';
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [
- ['inline script #1', 'end script #1', 'JS URL', 'inline script #2', 'frame script'],
- /* the following combination seems quite unlikely? */
- ['inline script #1', 'end script #1', 'JS URL', 'frame script', 'inline script #2'],
- ['inline script #1', 'end script #1', 'inline script #2', 'JS URL', 'frame script']]);
- t.done();
-}
- onload = t.step_func(function(){
- setTimeout(t.step_func(test), 200);
- });
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/041.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/041.html
deleted file mode 100644
index c2a0b9bc4ec..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/041.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write scripts that write scripts</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.write( '<script>log(\'inline with doc.write #1\'); document.write(\'<script src="scripts/include-4.js"><\\\/script>\');log(\'end inline with doc.write\');<\/script>' );
- document.write( '<script src="scripts/include-1.js">log(\'ignore this\')<\/script>' );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'inline with doc.write #1', 'end inline with doc.write', 'end script #1', 'include-4 before doc write', 'include-4 after doc write', 'external script before doc write', 'document.write external script', 'external script after doc write', 'external script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/042.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/042.html
deleted file mode 100644
index e91ea116c4e..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/042.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM mutation events when adding scripts: DOMNodeInserted </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.addEventListener( 'DOMNodeInserted', function(){ log('DOMNodeInserted'); }, false );
- testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], false);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'head script #1', 'DOMNodeInserted', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/043.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/043.html
deleted file mode 100644
index 082ca618bab..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/043.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM mutation events when adding external scripts: DOMNodeInserted </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.addEventListener( 'DOMNodeInserted', function(){ log('DOMNodeInserted'); }, false );
- testlib.addScript('', { src: 'scripts/include-1.js' }, document.getElementsByTagName('head')[0], false);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'DOMNodeInserted', 'end script #1', 'external script #1', 'inline script #2'],
- ['inline script #1', 'DOMNodeInserted', 'end script #1', 'inline script #2', 'external script #1']]
- );
- t.done();
- }
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/044.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/044.html
deleted file mode 100644
index a0e1c03b08f..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/044.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM mutation events when adding scripts: DOMNodeInsertedIntoDocument </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- testlib.addScript('log(\'head script #1\')', {}, document.getElementsByTagName('head')[0], false, function(s){s.addEventListener( 'DOMNodeInsertedIntoDocument', function(){ log('DOMNodeInsertedIntoDocument'); }, false ); } );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'head script #1', 'DOMNodeInsertedIntoDocument', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/045.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/045.html
deleted file mode 100644
index 70520d06cb2..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/045.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: DOM mutation events when adding external scripts: DOMNodeInsertedIntoDocument </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- testlib.addScript('', {src:'scripts/include-1.js'}, document.getElementsByTagName('head')[0], false, function(s){s.addEventListener( 'DOMNodeInsertedIntoDocument', function(){ log('DOMNodeInsertedIntoDocument'); }, false);});
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- onload = t.step_func(function() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'DOMNodeInsertedIntoDocument', 'end script #1', 'external script #1', 'inline script #2'],
- ['inline script #1', 'DOMNodeInsertedIntoDocument', 'end script #1', 'inline script #2', 'external script #1']]);
- t.done();
- });
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/046.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/046.html
deleted file mode 100644
index 1598234e1ad..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/046.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: no readystatechange events when adding external scripts </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- testlib.addScript('', {src:'scripts/include-1.js', onreadystatechange:function() {log( 'readystatechange '+ this.readyState );}}, document.getElementsByTagName('head')[0], false );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1']);
- t.done();
- }
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/047.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/047.html
deleted file mode 100644
index ab758d2f5f6..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/047.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: adding and removing external script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=testlib.addScript('', {src:'scripts/include-1.js'}, document.getElementsByTagName('head')[0], false );
- script.parentNode.removeChild(script);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1']);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/048.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/048.html
deleted file mode 100644
index ceb18cae570..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/048.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: adding inline script which sets its own .src </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=testlib.addScript('log(\'HEAD script start\');document.getElementsByTagName(\'script\')[0].src=\'scripts/include-1.js\';log(\'HEAD script end\')', {}, document.getElementsByTagName('head')[0], true );
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'HEAD script start', 'HEAD script end', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/049.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/049.html
deleted file mode 100644
index 65705bc1fb8..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/049.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: adding external script but removeAttribute( src ) before it runs</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=testlib.addScript('log(\'HEAD script\');', { src:'scripts/include-1.js' }, document.getElementsByTagName('head')[0], false );
- script.removeAttribute('src');
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #1']);
- t.done();
- }
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/051.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/051.html
deleted file mode 100644
index e97c153b1d0..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/051.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: interaction of parsing and script execution - script added through DOM</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- testlib.addScript('', { src: 'scripts/count-script-tags.js' }, document.body, true);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'script tags in DOM: 5', 'inline script #2'],
- ['inline script #1', 'end script #1', 'inline script #2', 'script tags in DOM: 6']]);
- t.done();
- }
- onload = function(){setTimeout(t.step_func(test), 100); }
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/052.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/052.html
deleted file mode 100644
index 1147be2476f..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/052.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: interaction of parsing and script execution - external script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script src="scripts/count-script-tags.js"></script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['script tags in DOM: 4', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(function(){setTimeout(t.step_func(test), 100); })
- </script>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/053.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/053.html
deleted file mode 100644
index 12ac6101a13..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/053.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: adding external script that removes itself from document when loading</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=testlib.addScript('', { src:'scripts/include-1.js', onload:function() {this.parentNode.removeChild(this);log('removed ' + this.localName);} }, document.getElementsByTagName('body')[0], true );
- log('end script #1');
- </script>
- <script src="scripts/include-2.js"></script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'end script #1', 'external script #1', 'removed script', 'external script #2', 'inline script #2'],
- ['inline script #1', 'end script #1', 'external script #2', 'external script #1', 'removed script', 'inline script #2'],
- ['inline script #1', 'end script #1', 'external script #2', 'inline script #2', 'external script #1', 'removed script']]
- );
- t.done();
- }
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/054.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/054.html
deleted file mode 100644
index 3dc46643568..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/054.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: removing newly inserted script from DOMNodeInserted handler - external script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.addEventListener( 'DOMNodeInserted', function listener(e){
- log('DOMNodeInserted event');
- e.target.parentNode.removeChild(e.target);
- document.removeEventListener('DOMNodeInserted', listener);
- }, false );
- var script=testlib.addScript('', { src:'scripts/include-1.js?'+Math.random() }, document.getElementsByTagName('body')[0], true );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'DOMNodeInserted event', 'end script #1', 'inline script #2', 'external script #1'],
- ['inline script #1', 'DOMNodeInserted event', 'end script #1', 'external script #1', 'inline script #2']]);
- t.done();
- }
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/055.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/055.html
deleted file mode 100644
index 8916d1a8b9a..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/055.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: removing newly inserted script from DOMNodeInserted handler - inline script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- document.addEventListener( 'DOMNodeInserted', function listener(e){
- log('DOMNodeInserted event');
- e.target.parentNode.removeChild(e.target);
- document.removeEventListener('DOMNodeInserted', listener);
- }, false );
- var script=testlib.addScript('log(\'added script\')', { }, document.getElementsByTagName('body')[0], true );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'added script', 'DOMNodeInserted event', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/056.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/056.html
deleted file mode 100644
index 873fb34d3d5..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/056.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: appending code to initially empty SCRIPT tag in DOM </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=document.getElementsByTagName('script')[3];
- script.appendChild( document.createTextNode('log("injected script code");') );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- // Test asserts the injected script should run
- assert_array_equals(eventOrder, ['inline script #1', 'injected script code', 'end script #1', 'inline script #2']);
- t.done();
- }
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/057.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/057.html
deleted file mode 100644
index dbec8895f17..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/057.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: appending code to initially non-empty SCRIPT tag in DOM (whitespace only) </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script>
- </script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=document.getElementsByTagName('script')[3];
- script.appendChild( document.createTextNode('log("injected script code");') );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test);
- </script>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/058.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/058.html
deleted file mode 100644
index 730ba456fea..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/058.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: appending code to initially non-empty SCRIPT tag in DOM (comment only) </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script>/**/</script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=document.getElementsByTagName('script')[3];
- script.appendChild( document.createTextNode('log("injected script code");') );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/059.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/059.html
deleted file mode 100644
index a3ea560c4f2..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/059.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: appending code to initially non-empty SCRIPT tag in DOM after removing its initial child </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script>/**/</script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=document.getElementsByTagName('script')[3];
- script.removeChild(script.firstChild);
- script.appendChild( document.createTextNode('log("injected script code");') );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2']);
- t.done();
- }
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/060.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/060.html
deleted file mode 100644
index 669dd2a747f..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/060.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: appending code to initially non-empty SCRIPT tag in DOM after setting textContent/innerHTML</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script>log('HEAD script');</script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=document.getElementsByTagName('script')[3];
- script.innerHTML='';
- script.appendChild( document.createTextNode('log("injected script code 1");') );
- script.textContent='';
- script.appendChild( document.createTextNode('log("injected script code 2");') );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['HEAD script', 'inline script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/061.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/061.html
deleted file mode 100644
index df708b7bfe7..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/061.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: cloneNode and script execution</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script>log('HEAD script');</script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=document.getElementsByTagName('script')[3];
- document.body.appendChild( script.cloneNode(true) );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['HEAD script', 'inline script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/062.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/062.html
deleted file mode 100644
index 8eda26b71f5..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/062.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: cloneNode (shallow) and script execution</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script>log('HEAD script');</script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=document.getElementsByTagName('script')[3];
- document.body.appendChild( script.cloneNode(false) ).appendChild(document.createTextNode('log("clone");'));
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['HEAD script', 'inline script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/063.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/063.html
deleted file mode 100644
index 9b939c4d4ab..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/063.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: cloneNode (deep) of the currently executing script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script>log('HEAD script');
- if( !window.already_cloned ){
- window.already_cloned=true;
- var script=document.getElementsByTagName('script')[3];
- document.getElementsByTagName('head')[0].appendChild( script.cloneNode(true) );
- }
- </script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['HEAD script', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/064.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/064.html
deleted file mode 100644
index 814e62545e1..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/064.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: cloneNode with external script</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script src="scripts/include-1.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=document.getElementsByTagName('script')[3];
- document.body.appendChild( script.cloneNode(true) );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['external script #1', 'inline script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/065.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/065.html
deleted file mode 100644
index 92078df045d..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/065.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: cloneNode with external script, changed .src</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script src="scripts/include-1.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=document.getElementsByTagName('script')[3].cloneNode(true);
- script.src='scripts/include-2.js'
- document.body.appendChild( script );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['external script #1', 'inline script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/066.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/066.html
deleted file mode 100644
index 58560aee075..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/066.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: cloneNode with external script, removing .src and adding content</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script src="scripts/include-1.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=document.getElementsByTagName('script')[3].cloneNode(true);
- script.removeAttribute('src');
- script.appendChild(document.createTextNode( 'log("cloned script");' ));
- document.body.appendChild( script );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['external script #1', 'inline script #1', 'end script #1', 'inline script #2']);
- t.done();
-}
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/068.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/068.html
deleted file mode 100644
index c584653c899..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/068.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: external script and parsing of markup added with document.write </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>
- log('inline script #1');
- document.write('<script src="scripts/find-foo.js">log(\'inline code in external script (not expected to run!!)\')<\/script>' + '<div id="foo"></div>');
- log('end script #1');
-
- var t = async_test()
-
-
- function test() {
- if(!window.findFooLoaded) {
- return setTimeout(t.step_func(test),200);
- }
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'found #foo element: NO']);
- t.done();
- }
- onload = t.step_func(test)
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/070.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/070.html
deleted file mode 100644
index 45928b87338..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/070.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write into IFRAME a script that adds a SCRIPT through DOM</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <iframe></iframe>
-
- <script type="text/javascript">
- var doc = document.getElementsByTagName('iframe')[0].contentDocument;
- doc.open();
-
- log("calling document.write");
- doc.write('<script>top.log("inline script #1");'+
- 'var s=document.createElement("script");'+
- 's.src="scripts/include-6.js?'+new Date().getTime()+'";'+
- 'document.getElementsByTagName("head")[0].appendChild(s);'+
- '<\/script>'+
- '<div id="foo"></div>'+
- '<script>top.log("inline script #2");<\/script>'
- );
-
- log("calling document.close");
- doc.close();
-
- var t = async_test()
-
-
- function test() {
- if(!window.include6Loaded) {
- return setTimeout(t.step_func(test),200);
- }
- assert_array_equals(eventOrder, ['calling document.write', 'inline script #1', 'inline script #2', 'calling document.close', 'external script (#foo found? YES)']);
- t.done();
-}
-
- onload = t.step_func(test)
- </script>
-</head>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/071.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/071.html
deleted file mode 100644
index 30429749460..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/071.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write several scripts into IFRAME </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <iframe style="width:1px;height:1px"></iframe>
-
- <script type="text/javascript">
- var doc = document.getElementsByTagName('iframe')[0].contentDocument;
- doc.open();
-
- var html = '<html><head><title>test</title></head>'+
- '<script>top.log("inline script #1");'+
- '<\/script>'+
- /* made url unique because Chrome will change
- order depending on file cached status */
- '<script src="scripts/include-6.js?'+new Date().getTime()+'"><\/script>'+
- '</head>'+
- '<body>'+
- '<div id="foo"></div>'+
- '</body></html>'+
- '<script>top.log("inline script #2");<\/script>';
- log("calling document.write");
- doc.write(html);
-
- log("calling document.close");
- doc.close();
-
- var t = async_test()
-
-
- function test() {
- if( !window.include6Loaded )return setTimeout(t.step_func(test),200); // try checking again if external script didn't run yet
- assert_array_equals(eventOrder, ['calling document.write',
- 'inline script #1',
- 'calling document.close',
- 'external script (#foo found? NO)',
- 'inline script #2'
- ]);
- t.done();
-}
-
- onload = t.step_func(test)
- </script>
-</head>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/072.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/072.html
deleted file mode 100644
index 348381df258..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/072.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write into IFRAME a script that creates new inline script in parent </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <iframe style="width:1px;height:1px"></iframe>
-
- <script type="text/javascript">
- var doc = document.getElementsByTagName('iframe')[0].contentDocument;
- doc.open();
-
- var html = '<html><head><title>test</title></head>'+
- '<script>top.log("inline script #1");'+
- '<\/script>'+
- '</head>'+
- '<body>'+
- '<div id="foo"></div>'+
- '</body></html>'+
- '<script>top.testlib.addScript( \'log("inline script added to parent")\', null, top.document.body, true )<\/script>';
- log("calling document.write");
- doc.write(html);
-
- log("calling document.close");
- doc.close();
-
- var t = async_test()
-
-
- function test() {
- assert_array_equals(eventOrder, ['calling document.write',
- 'inline script #1',
- 'inline script added to parent',
- 'calling document.close',
- ]);
- t.done();
-}
-
- onload = t.step_func(test)
- </script>
-</head>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/073.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/073.html
deleted file mode 100644
index 56dc9180b04..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/073.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write into IFRAME a script that creates new external script in parent </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <iframe style="width:1px;height:1px"></iframe>
-
- <script type="text/javascript">
- var doc = document.getElementsByTagName('iframe')[0].contentDocument;
- doc.open();
-
- var html = '<html><head><title>test</title></head>'+
- '<script>top.log("inline script #1");'+
- '<\/script>'+
- '</head>'+
- '<body>'+
- '<div id="foo"></div>'+
- '</body></html>'+
- '<script>top.testlib.addScript( \'\', { src:\'scripts/include-1.js\' }, top.document.body, true )<\/script>';
- log("calling document.write");
- doc.write(html);
-
- log("calling document.close");
- doc.close();
-
- var t = async_test()
-
-
- function test() {
-
- assert_array_equals(eventOrder, ['calling document.write',
- 'inline script #1',
- 'calling document.close',
- 'external script #1'
- ]);
-
- t.done();
-}
-
- onload = t.step_func(test)
- </script>
-</head>
-
-</body>
-</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/074.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/074.html
deleted file mode 100644
index 6f1baef6bd4..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/074.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: document.write into IFRAME a script that creates new inline script in parent that again adds script to IFRAME </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <iframe style="width:1px;height:1px"></iframe>
-
- <script type="text/javascript">
- var doc = document.getElementsByTagName('iframe')[0].contentDocument;
- doc.open();
- var str1='';
- var html = '<html><head><title>test</title></head>'+
- '<script>top.log("inline script #1");'+
- '<\/script>'+
- '</head>'+
- '<body>'+
- '<script>top.testlib.addScript( \'top.log("inline script added to parent");top.doc.write( "<script>top.log(\\\\"inline script added to iframe\\\\")<\\\/script>");\', null, top.document.body, true ) <\/script>'+
- '</body></html>';
- log("calling document.write");
- doc.write(html);
-
- log("calling document.close");
- doc.close();
-
- var t = async_test()
-
-
- function test() {
- assert_array_equals(eventOrder, ['calling document.write',
- 'inline script #1',
- 'inline script added to parent',
- 'inline script added to iframe',
- 'calling document.close',
- ]);
- t.done();
-}
-
- onload = t.step_func(test)
- </script>
-</head>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/076.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/076.html
deleted file mode 100644
index ad2359019bc..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/076.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: adding and removing external and inline scripts </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>log('inline script #1');
- var script=testlib.addScript('', {src:'scripts/include-1.js', onload:function(e){ e.target.parentNode.removeChild(e.target); }}, document.getElementsByTagName('head')[0], false );
- var script=testlib.addScript( 'log( "dynamically added inline script" )', null, document.getElementsByTagName('head')[0], false );
- script.parentNode.removeChild(script);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- }
- onload = t.step_func(function() {
- assert_any(assert_array_equals, eventOrder, [['inline script #1', 'dynamically added inline script', 'end script #1', 'external script #1', 'inline script #2'],
- ['inline script #1', 'dynamically added inline script', 'end script #1', 'inline script #2', 'external script #1']]);
- t.done();
- })
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/080.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/080.html
deleted file mode 100644
index a55bc24d06b..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/080.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: IFRAMEs added with DOM (appendChild), javascript: URL</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>log('inline script #1');
- var iframe=document.createElement('iframe');
- iframe.src='javascript:parent.log(\'JS URL\');\'<html><script>parent.log(\\\'frame script\\\')<\/script></html>\'';
- document.getElementsByTagName('div')[1].appendChild(iframe);
- log('end script #1');
- </script>
-
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2', 'JS URL', 'frame script']);
- t.done();
- }
- onload = t.step_func(function(){setTimeout(t.step_func(test), 400);})
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/081.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/081.html
deleted file mode 100644
index 94f2be6ddc5..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/081.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: slow loading external script added with DOM (appendChild)</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>
- var t = async_test(undefined, {timeout:5000})
- log('inline script #1');
- testlib.addScript('', { src:'scripts/include-1.js?pipe=trickle(d1)&'+Math.random() }, document.getElementsByTagName('head')[0], false );
- log('end script #1');
- </script>
- <script src="scripts/include-2.js"></script>
- <script>
- log( 'inline script #2' );
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'external script #2', 'inline script #2', 'external script #1']);
- t.done();
- }
- onload = t.step_func(function() {
- setTimeout(t.step_func(test), 12);
- });
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/082.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/082.html
deleted file mode 100644
index 89f86d4d4f0..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/082.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: multiple slow loading external scripts added with DOM (appendChild)</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <div></div>
- <script>
-
- log('inline script #1');
- function scriptLoadListener(){
- log( 'load on '+this.src.match( /include-\d\.js/ ) );
- }
- var script=testlib.addScript('', { src:'scripts/include-1.js?pipe=trickle(d1)&' + Math.random(), onload:scriptLoadListener }, document.getElementsByTagName('head')[0], false );
- var script=testlib.addScript('', { src:'scripts/include-2.js?pipe=trickle(d3)&' + Math.random(), onload:scriptLoadListener }, document.getElementsByTagName('head')[0], false );
- var script=testlib.addScript('', { src:'scripts/include-7.js?pipe=trickle(d2)&' + Math.random() , onload:scriptLoadListener }, document.getElementsByTagName('head')[0], false );
- log('end script #1');
- </script>
- <script type="text/javascript">
- log('inline script #2');
- var t = async_test(undefined, {timeout:10000})
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'end script #1', 'inline script #2', 'external script #1', 'load on include-1.js', 'external script #7', 'load on include-7.js', 'external script #2', 'load on include-2.js']);
- t.done();
- }
- onload = function() {setTimeout(t.step_func(test), 12)};
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/083.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/083.html
deleted file mode 100644
index b307041f832..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/083.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: event listener defined by script in a document in history</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <iframe src="about:blank"></iframe>
- <script>
- log('inline script #1');
- function fireFooEvent(){
- var evt=document.createEvent('Event');
- evt.initEvent('foo', true, true);
- document.dispatchEvent(evt);
- }
- var doc = frames[0].document;
- doc.open('text/html');
- doc.write('<script>top.log("IFRAME script");top.document.addEventListener("foo", function(e){ top.log("event: "+e.type); }, false)<\/script>');
- log('end script #1');
- </script>
- <script>
- fireFooEvent();
- frames[0].location='about:blank'; // returning to about:blank should de-activate document that defined event listener..?
- </script>
- <script>
- fireFooEvent();
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_equals(frames[0].location.toString(), "about:blank");
- assert_array_equals(eventOrder, ['inline script #1',
- 'IFRAME script',
- 'end script #1',
- 'event: foo',
- 'inline script #2'
- ]);
- t.done();
-}
- onload = function() {setTimeout(t.step_func(function() {fireFooEvent(); test()}), 80)};
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/084.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/084.html
deleted file mode 100644
index 5e9adb07d93..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/084.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: event listener defined by script in a removed IFRAME</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <iframe src="about:blank"></iframe>
- <script>
- log('inline script #1');
- function fireFooEvent(){
- var evt=document.createEvent('Event');
- evt.initEvent('foo', true, true);
- document.dispatchEvent(evt);
- }
- var doc=frames[0].document;
- doc.open( 'text/html' );
- doc.write( '<script>top.log("IFRAME script");top.document.addEventListener("foo", function(e){ top.log("event: "+e.type); }, false)<\/script>' );
- log('end script #1');
- </script>
- <script>
- fireFooEvent();
- frames[0].frameElement.parentNode.removeChild( frames[0].frameElement ); // removing the IFRAME should de-activate document that defined event listener..?
- </script>
- <script>
- fireFooEvent();
- </script>
- <script type="text/javascript">
- log( 'inline script #2' );
- var t = async_test()
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1',
- 'IFRAME script',
- 'end script #1',
- 'event: foo',
- 'inline script #2'
- ]);
- t.done();
-}
- onload = t.step_func(test)
- </script>
-
-</body></html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/085.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/085.html
deleted file mode 100644
index e0d165ffc18..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/085.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: async script and slow-loading defer script</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script src="scripts/include-1.js?pipe=trickle(d1)" defer></script>
- <script src="scripts/include-2.js" async></script>
-
- <script type="text/javascript">
- var t = async_test();
- function test() {
- assert_array_equals(eventOrder, ['external script #2', 'external script #1']);
- t.done();
- }
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/086.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/086.html
deleted file mode 100644
index 86db3aea5bd..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/086.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: async script and slow-loading async script</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script src="scripts/include-1.js?pipe=trickle(d2)" async></script>
- <script src="scripts/include-2.js" async></script>
-
- <script type="text/javascript">
- var t = async_test();
- function test() {
- assert_array_equals(eventOrder, ['external script #2', 'external script #1']);
- t.done();
- }
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/087.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/087.html
deleted file mode 100644
index 759335474a5..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/087.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: multiple defer scripts, one slow loading</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script src="scripts/include-1.js?pipe=trickle(d2)" defer></script>
- <script src="scripts/include-2.js" defer></script>
-
- <script type="text/javascript">
- var t = async_test();
- function test() {
- assert_array_equals(eventOrder, ['external script #1', 'external script #2']);
- t.done();
- }
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/088.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/088.html
deleted file mode 100644
index f7e7366e1c3..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/088.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: multiple scripts with defer and async attributes</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script src="scripts/include-1.js?pipe=trickle(d2)" defer async></script>
- <script src="scripts/include-2.js" defer async></script>
-
- <script type="text/javascript">
- var t = async_test();
- function test() {
- assert_array_equals(eventOrder, ['external script #2', 'external script #1']);
- t.done();
- }
- onload = t.step_func(test);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/089.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/089.html
deleted file mode 100644
index 1b888ea3d4b..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/089.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: async attribute on inline script</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script async>
- var t = async_test();
- log('inline script #1');
- t.step(function() {
- assert_array_equals(eventOrder, ['inline script #1']);
- });
- </script>
- <script async>
- log('inline script #2');
- t.step(function() {
- assert_array_equals(eventOrder, ['inline script #1', 'inline script #2']);
- });
- </script>
-
- <script>
- log('inline script #3');
- t.step(function() {
- assert_array_equals(eventOrder, ['inline script #1', 'inline script #2', 'inline script #3']);
- });
- onload = function() {t.done()};
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/090.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/090.html
deleted file mode 100644
index 224e7976331..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/090.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: defer attribute on inline script</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script defer>
- var t = async_test();
- log('inline script #1');
- t.step(function() {
- assert_array_equals(eventOrder, ['inline script #1']);
- });
- </script>
- <script defer>
- log('inline script #2');
- t.step(function() {
- assert_array_equals(eventOrder, ['inline script #1', 'inline script #2']);
- });
- </script>
-
- <script>
- log('inline script #3');
- t.step(function() {
- assert_array_equals(eventOrder, ['inline script #1', 'inline script #2', 'inline script #3']);
- });
- onload = function() {t.done()};
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/091.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/091.html
deleted file mode 100644
index 946cf833328..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/091.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: force-async off on non-parser-inserted script</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>
- var t = async_test(undefined, {timeout:4000});
-
- sources = ["scripts/include-1.js?pipe=trickle(d2)", "scripts/include-2.js?pipe=trickle(d1)"];
- sources.forEach(function(x) {
- var script = document.createElement("script");
- script.src = x;
- t.step(function() {assert_equals(script.async, true, "async IDL attribute on script creation")});
- script.async = false;
- t.step(function() {assert_equals(script.async, false, "async IDL attribute after setting")});
- t.step(function() {assert_equals(script.getAttribute("async"), null, "async content attribute after setting")});
- document.head.appendChild(script);
- });
-
- onload = t.step_func(function() {
- assert_array_equals(eventOrder, ['external script #1', 'external script #2']);
- t.done();
- });
- </script>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/092.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/092.html
deleted file mode 100644
index d42caa7c0c0..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/092.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: defer script and slow-loading non-async external script</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>
- var t = async_test(undefined, {timeout:3500});
-
- var script = document.createElement("script");
- script.src = "scripts/include-2.js?pipe=trickle(d2)";
- script.async = false;
- document.head.appendChild(script);
-
- onload = t.step_func(function() {
- assert_array_equals(eventOrder, ['external script #1', 'external script #2']);
- t.done();
- });
- </script>
- <script defer src="scripts/include-1.js"></script>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/094.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/094.html
deleted file mode 100644
index 44fd7b55909..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/094.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: parser-created defer script after document load</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
- <iframe id="myFrame"></iframe>
-
- <script>
- var t = async_test(undefined, {timeout:3500});
- onload = t.step_func(function() {
- var doc = document.getElementById("myFrame").contentDocument;
- var win = document.getElementById("myFrame").contentWindow;
- doc.open();
- doc.write("<title> scheduler: parser-created defer script after document load</title><script src='/resources/testharness.js'><\/script><script src='/resources/testharnessreport.js'><\/script><script src='testlib/testlib.js'><\/script><script>var t=async_test()<\/script><div id=log></div><script defer src='data:text/javascript,parent.t.done();'><\/script>");
- doc.close();
- })
- </script>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/095.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/095.html
deleted file mode 100644
index 13142ef6c42..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/095.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: slow-loading script added from defer blocking load event</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>
- var t = async_test(undefined, {timeout:3500});
- function test() {
- t.step(function() {
- assert_array_equals(eventOrder, ['external script #8', 'external script #9']);
- t.done();
- });
- }
- //assert that the test is completed before onload fires
- onload = t.step_func(function() {assert_unreached()});
- </script>
- <script defer src="scripts/include-8.js"></script>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/096.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/096.html
deleted file mode 100644
index 32d9baf0c96..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/096.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: defer script added from document.write relative to DOMContentLoaded</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>
- log("inline script #1");
- document.write("<script defer src='scripts/include-1.js'><\/script>")
- </script>
- <script>
- log("inline script #2");
- var t = async_test();
-
- addEventListener("DOMContentLoaded", t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "external script #1"]);
- log("inline script #3");
- }), false);
-
- onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "external script #1", "inline script #3"]);
- t.done();
- });
- </script>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/097.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/097.html
deleted file mode 100644
index 083fd390a0b..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/097.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: slow-loading async script added from document.write</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>
- log("inline script #1");
- document.write("<script async src='scripts/include-1.js?pipe=trickle(d2)'><\/script>")
- </script>
- <script>
- log("inline script #2");
- var t = async_test(undefined, {timeout:3500});
-
- addEventListener("DOMContentLoaded", t.step_func(function() {assert_array_equals(eventOrder, ["inline script #1", "inline script #2"])}), false);
-
- onload = t.step_func(
- function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "external script #1"]);
- t.done();
- });
-
- </script>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/099.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/099.html
deleted file mode 100644
index 5c6df576e87..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/099.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: defer adding iframe containing script</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script defer src="scripts/include-11.js"></script>
- <script>
- var t = async_test();
-
- onload = t.step_func(function() {assert_array_equals(eventOrder, ["external script before adding iframe", "script in iframe"]); t.done();});
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/100.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/100.html
deleted file mode 100644
index d24828c999f..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/100.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: defer adding iframe containing script</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script defer src="scripts/include-12.js"></script>
- <script>
- var t = async_test();
-
- onload = t.step_func(function() {assert_array_equals(eventOrder, ["external script before adding object", "script in object"]); t.done();});
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/102.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/102.html
deleted file mode 100644
index 67edbc659ce..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/102.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: defer script after initial onload event</title>
-</head>
-<body>
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>
- onload = function() {
- document.open();
- document.write("<title> scheduler: defer script after initial onload event</title><script src='/resources/testharness.js'><\/script><script src='/resources/testharnessreport.js'><\/script><script src='testlib/testlib.js'><\/script><div id='log'>document.written content</div><script>var t = async_test(); log('inline script #1')<\/script><script src='scripts/include-1.js'><\/script><script async src='scripts/include-2.js'><\/script>");
- document.close();
- window.setTimeout(function() {
- window.t.step(function() {
- window.assert_any(window.assert_array_equals, window.eventOrder,
- [['inline script #1', 'external script #1', 'external script #2'],
- ['inline script #1', 'external script #2', 'external script #1']]);
- window.t.done();
- })},
- 1000);
- };
- </script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/103.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/103.html
deleted file mode 100644
index 198c394dee9..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/103.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: removing defer attribute at runtime</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="test"></div>
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script id="defer-script" defer src="scripts/include-2.js"></script>
- <script src="scripts/include-1.js"></script>
-
- <script>
- var t = async_test();
-
- t.step(function() {
- document.getElementById("defer-script").removeAttribute("defer");
- });
-
- var ran_defer_check = false;
-
- document.addEventListener("readystatechange", t.step_func(function () {
- if (document.readyState == "interactive") {
- ran_defer_check = true;
- assert_array_equals(eventOrder, ["external script #1"]);
- }
- }), false);
-
- addEventListener("load", t.step_func(function () {
- assert_true(ran_defer_check);
- assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
- t.done();
- }), false);
-
- </script>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/104.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/104.html
deleted file mode 100644
index b5cdb75e385..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/104.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: adding defer attribute at runtime</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="test"></div>
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script id="defer-script" src="scripts/include-1.js"></script>
- <script src="scripts/include-2.js"></script>
-
- <script>
- var t = async_test();
-
- t.step(function() {
- document.getElementById("defer-script").setAttribute("defer", "defer");
- });
-
- var ran_defer_check = false;
-
- document.addEventListener("readystatechange", t.step_func(function () {
- if (document.readyState == "interactive") {
- ran_defer_check = true;
- assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
- }
- }), false);
-
- addEventListener("load", t.step_func(function () {
- assert_true(ran_defer_check);
- assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
- t.done();
- }), false);
-
- </script>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/105.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/105.html
deleted file mode 100644
index abf2c8c211d..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/105.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: adding async attribute at runtime</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>
- var t = async_test();
-
- var sources = ["scripts/include-1.js?pipe=trickle(d2)",
- "scripts/include-2.js"]
- var scripts = sources.map(function(x) {
- var script = document.createElement("script");
- script.src = x;
- script.async = false;
- document.body.appendChild(script);
- return script;
- });
- scripts[0].async = true;
-
- addEventListener("load", t.step_func(function () {
- assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
- t.done();
- }), false);
-
- </script>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/108.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/108.html
deleted file mode 100644
index 732fcfa9c1f..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/108.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: javascript URL in iframe</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
- <div id="log">Not tested</div>
- <script>
- var t = async_test();
- var iframe_onload = false;
-
- t.step(function() {
- log('inline script #1');
- document.write("<iframe src='javascript:void(top.log(&quot;iframe script #1&quot;));'></iframe>");
- log('inline script #2')
- })
-
- onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "iframe script #1"]);
- t.done();
- });
- </script>
-</body>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/109.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/109.html
deleted file mode 100644
index c6815b4dc10..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/109.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: javascript URL in iframe, src set via DOM</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
- <div id="log">Not tested</div>
- <script>
- var t = async_test();
-
- t.step(function() {
- var iframe_onload = false;
- log("inline script #1");
- var iframe = document.createElement("iframe");
- iframe.src = "javascript:void(top.log('JS URL'));";
- log("inline script #2");
- iframe.onload = function () { log("iframe onload") };
- document.body.appendChild(iframe);
- log("inline script #3");
- })
-
- onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3", "JS URL", "iframe onload"]);
- t.done();
- });
- </script>
-</body>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/110.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/110.html
deleted file mode 100644
index de0c5050c37..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/110.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: removing defer script at runtime</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="test"></div>
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script id="defer-script" defer src="scripts/include-2.js"></script>
- <script src="scripts/include-1.js"></script>
-
- <script>
- var t = async_test();
-
- t.step(function() {
- var s = document.getElementById("defer-script");
- s.parentNode.removeChild(s);
- });
-
- addEventListener("load", t.step_func(function () {
- assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
- t.done();
- }), false);
-
- </script>
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/113.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/113.html
deleted file mode 100644
index c857c6a97e4..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/113.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: Altering DOM using innerHTML during parse </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="test"></div>
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script>
- var t = async_test();
-
- addEventListener("load", t.step_func(function () {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2"]);
- t.done();
- }), false);
-
- </script>
- <div id="container">
- <script>t.step(function() {
- log("inline script #1");
- document.getElementById("container").innerHTML = "";
- });
- </script>
- <script>t.step(function() {log("inline script #2")});</script>
- </div>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/114.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/114.html
deleted file mode 100644
index 784a69f51de..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/114.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: Changing src of defer script before it runs </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="test"></div>
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script id="defer-script" defer src="scripts/include-1.js"></script>
-
- <script>
- var t = async_test();
-
- document.getElementById("defer-script").src = "scripts/include-2.js"
-
- addEventListener("load", t.step_func(function () {
- assert_array_equals(eventOrder, ["external script #1"]);
- t.done();
- }), false);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/115.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/115.html
deleted file mode 100644
index 78790c2ef34..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/115.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> scheduler: Removing src of defer script before it runs </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-
- <div id="test"></div>
- <div id="log">FAILED (This TC requires JavaScript enabled)</div>
-
- <script id="defer-script" defer src="scripts/include-1.js">t.step(function() {assert_unreached()})</script>
-
- <script>
- var t = async_test();
-
- document.getElementById("defer-script").removeAttribute("src");
-
- addEventListener("load", t.step_func(function () {
- assert_array_equals(eventOrder, ["external script #1"]);
- t.done();
- }), false);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/116.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/116.html
deleted file mode 100644
index fef7b893871..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/116.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: adding script to head of frameset document</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
- <script>
- // add a script that looks for document.body as first child of HEAD
- testlib.addScript('',{src:'scripts/find-body.js'},document.getElementsByTagName('head')[0], true );
- var div = document.createElement("div");
- div.id = "log";
- var t = async_test();
- function test() {
- if(!(window.findBodyLoaded)) {
- return setTimeout(t.step_func(test),200);
- }
- document.body.appendChild(div);
- assert_array_equals(eventOrder, ['document.body: <FRAMESET>']);
- t.done();
- }
- onload = t.step_func(test)
- </script>
-</head>
-<frameset>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/117.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/117.html
deleted file mode 100644
index 3868a292a36..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/117.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: inline script created with createContextualFragment</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
- <div id="log"></div>
- <script>
- log('inline script #1');
- var t = async_test();
-
- t.step(function() {
- var range = document.createRange();
- var fragment = range.createContextualFragment("<script>log('fragment script #1')<\/script>");
- document.body.appendChild(fragment.firstChild);
- });
-
- function test() {
- assert_array_equals(eventOrder, ['inline script #1', 'fragment script #1', 'end inline script #1']);
- t.done();
- }
- onload = t.step_func(test)
- log('end inline script #1');
- </script>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/118.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/118.html
deleted file mode 100644
index f018001db59..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/118.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: external script created with createContextualFragment</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
- <div id="log"></div>
- <script>
- log('inline script #1');
- var t = async_test();
-
- t.step(function() {
- var range = document.createRange();
- var fragment = range.createContextualFragment("<script src='scripts/include-1.js'><\/script>");
- document.body.appendChild(fragment.firstChild);
- });
-
- addEventListener("load", t.step_func(function() {
- assert_array_equals(eventOrder, ['inline script #1', 'end inline script #1', 'external script #1']);
- t.done();
- }), false);
-
- log('end inline script #1');
- </script>
-
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/120.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/120.html
deleted file mode 100644
index d6af5d02e1b..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/120.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: script created without a window </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
-
- var doc = document.implementation.createHTMLDocument("");
- doc.write("<script>t.step(function() {assert_unreached()})<\/script>");
-
- document.body.appendChild(doc.head.firstChild);
-
- onload = function() {t.done()}
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/121.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/121.html
deleted file mode 100644
index 534532ad12a..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/121.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: altering the type attribute </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
-</script>
-<script id="test" type="text/plain">t.step(function() {assert_unreached()}</script>
-<script>
-t.step(function() {
- document.getElementById("test").removeAttribute("type");
- setTimeout(t.step_func(function() {t.done()}), 100);
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/122.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/122.html
deleted file mode 100644
index 888681d2aae..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/122.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: altering the type attribute and adding/removing external script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:4000});
-</script>
-<script id="test" type="text/plain" src="scripts/include-1.js?pipe=trickle(d1)"></script>
-<script>
-t.step(function() {
- var script = document.getElementById("test");
- script.removeAttribute("type");
- var marker = document.createElement("script");
- marker.src = "scripts/include-2.js?pipe=trickle(d2)";
- marker.async = false;
- script.parentNode.appendChild(marker);
- script.parentNode.appendChild(script);
- test(function() {assert_true(script.async)}, "Reinserted script async IDL attribute");
-});
-onload = t.step_func(function () {
- assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/123.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/123.html
deleted file mode 100644
index 375ae13165b..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/123.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: altering the type attribute and adding/removing external script with async=false </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:4000});
-</script>
-<script id="test" type="text/plain" src="scripts/include-2.js?pipe=trickle(d1)"></script>
-<script>
-t.step(function() {
- var script = document.getElementById("test");
- script.removeAttribute("type");
- script.async = false;
- var marker = document.createElement("script");
- marker.src = "scripts/include-1.js?pipe=trickle(d2)";
- marker.async = false;
- script.parentNode.appendChild(marker);
- script.parentNode.appendChild(script);
-});
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/124.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/124.html
deleted file mode 100644
index 86eef3f782d..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/124.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: altering the type attribute and changing script data inline script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
-</script>
-<script id="test" type="text/plain">t.step(function() {log("inline script #1")});</script>
-<script>
-t.step(function() {
- log("inline script #2");
- var script = document.getElementById("test");
- script.removeAttribute("type");
- script.appendChild(document.createTextNode(""));
- log("end inline script #2");
-});
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #2", "inline script #1", "end inline script #2"]);
- t.done();
-})
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/125.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/125.html
deleted file mode 100644
index 6b50ca097be..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/125.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: altering the type attribute and changing script data external script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:4000});
-</script>
-<script id="test" type="text/plain" src="scripts/include-1.js?pipe=trickle(d1)"></script>
-<script>
-t.step(function() {
- var script = document.getElementById("test");
- script.removeAttribute("type");
- var marker = document.createElement("script");
- marker.src = "scripts/include-2.js?pipe=trickle(d2)";
- marker.async = false;
- script.parentNode.appendChild(marker);
- script.appendChild(document.createTextNode(""));
-});
-
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/126.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/126.html
deleted file mode 100644
index 5d258b59d4a..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/126.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: altering the type attribute and changing script data external script async=false </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:4000});
-</script>
-<script id="test" type="text/plain" src="scripts/include-2.js"></script>
-<script>
-t.step(function() {
- var script = document.getElementById("test");
- script.removeAttribute("type");
- script.async = false;
- var marker = document.createElement("script");
- marker.src = "scripts/include-1.js?pipe=trickle(d2)";
- marker.async = false;
- script.parentNode.appendChild(marker);
- script.appendChild(document.createTextNode(""));
-});
-
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/127.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/127.html
deleted file mode 100644
index efb0fe37747..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/127.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: appending non-text children to script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
-</script>
-<script id="test"></script>
-<script>
-t.step(function() {
- log("inline script #1");
- var script = document.getElementById("test");
-
- var frag = document.createDocumentFragment();
- var div = document.createElement("div");
-
- div.textContent = "assert_unreached();"
- frag.appendChild(document.createTextNode("t.step(function() {log('inline script #2');\n"));
- frag.appendChild(div);
- frag.appendChild(document.createTextNode("log('end inline script #2');})"));
-
- script.appendChild(frag);
- log("end inline script #1");
-});
-
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "end inline script #2", "end inline script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/128.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/128.html
deleted file mode 100644
index ae61a8ebf73..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/128.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: appending script element to script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
-</script>
-<script id="test"></script>
-<script>
-t.step(function() {
- log("inline script #1");
- var script = document.getElementById("test");
-
- var frag = document.createDocumentFragment();
- var inner_script = document.createElement("script");
-
- inner_script.textContent = "t.step(function() {log('inline script #3');});"
- frag.appendChild(document.createTextNode("t.step(function() {log('inline script #2');\n"));
- frag.appendChild(inner_script);
- frag.appendChild(document.createTextNode("log('end inline script #2');})"));
-
- script.appendChild(frag);
- log("end inline script #1");
-});
-
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #3", "inline script #2", "end inline script #2", "end inline script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/129.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/129.html
deleted file mode 100644
index 1148d9faecf..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/129.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: appending multiple script elements</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
-</script>
-<div id="container"></div>
-<script>
-t.step(function() {
- log("inline script #1");
-
- var frag = document.createDocumentFragment();
-
- scripts = ["2", "3", "4"].map(function(x) {
- var s = document.createElement("script");
- s.textContent = "t.step(function() {log('inline script #" + x + "')});";
- return s
- });
-
-
- frag.appendChild(scripts[0]);
- var div = document.createElement(div);
- div.appendChild(scripts[1]);
- frag.appendChild(div);
- frag.appendChild(scripts[2]);
-
- document.getElementById("container").appendChild(frag);
- log("end inline script #1");
-});
-
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3", "inline script #4", "end inline script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/130.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/130.html
deleted file mode 100644
index af60e3cf408..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/130.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: appending external script element to script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
-</script>
-<script id="test"></script>
-<script>
-t.step(function() {
- log("inline script #1");
- var script = document.getElementById("test");
-
- var frag = document.createDocumentFragment();
- var inner_script = document.createElement("script");
-
- inner_script.src = "scripts/include-1.js?pipe=trickle(d1)";
- frag.appendChild(document.createTextNode("t.step(function() {log('inline script #2');\n"));
- frag.appendChild(inner_script);
- frag.appendChild(document.createTextNode("log('end inline script #2');})"));
-
- script.appendChild(frag);
- log("end inline script #1");
-});
-
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "end inline script #2", "end inline script #1", "external script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/131.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/131.html
deleted file mode 100644
index f7f14178b83..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/131.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: inline svg script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
- log("inline script #1")
-</script>
-<svg>
-<script>log("inline script #2")</script>
-</svg>
-<script>
-log("inline script #3");
-t.step(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/132.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/132.html
deleted file mode 100644
index 9a675be55d1..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/132.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: external svg script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
- log("inline script #1")
-</script>
-<svg>
-<script xlink:href="scripts/include-1.js"></script>
-</svg>
-<script>
-log("inline script #2");
-t.step(function() {
- assert_array_equals(eventOrder, ["inline script #1", "external script #1", "inline script #2"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/133.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/133.html
deleted file mode 100644
index daecb36283b..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/133.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: inline HTML script added by SVG script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
- log("inline script #1")
-</script>
-<svg>
-<script>
-log("inline script #2")
-var s = document.createElement("script");
-s.textContent = "log('inline script #3');";
-document.getElementsByTagName("svg")[0].appendChild(s);
-log("end inline script #2");
-</script>
-</svg>
-<script>
-log("inline script #4");
-t.step(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3",
- "end inline script #2", "inline script #4"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/134.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/134.html
deleted file mode 100644
index 14cd5d0d36a..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/134.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: external HTML script added by SVG script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
- log("inline script #1")
-</script>
-<svg>
-<script>
-log("inline script #2")
-var s = document.createElement("script");
-s.src = "scripts/include-1.js"
-document.getElementsByTagName("svg")[0].appendChild(s);
-log("end inline script #2");
-</script>
-</svg>
-<script>
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2",
- "end inline script #2", "external script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/135.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/135.html
deleted file mode 100644
index 15ee859828e..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/135.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: external SVG script added by SVG script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test();
- log("inline script #1")
-</script>
-<svg>
-<script>
-log("inline script #2")
-var s = document.createElementNS("http://www.w3.org/2000/svg", "script");
-s.setAttributeNS("http://www.w3.org/1999/xlink", "href", "scripts/include-1.js");
-document.getElementsByTagName("svg")[0].appendChild(s);
-log("end inline script #2");
-</script>
-</svg>
-<script>
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2",
- "end inline script #2", "external script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/136.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/136.html
deleted file mode 100644
index 4a47e8527b1..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/136.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: DOM added external SVG script, force-async? </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:3000});
-</script>
-<svg>
-<script>
-
-var s1 = document.createElement("script");
-s1.src = "scripts/include-1.js";
-s1.async = false;
-
-var s = document.createElementNS("http://www.w3.org/2000/svg", "script");
-s.setAttributeNS("http://www.w3.org/1999/xlink", "href", "scripts/include-2.js?pipe=trickle(d2)");
-
-document.getElementsByTagName("svg")[0].appendChild(s);
-document.getElementsByTagName("svg")[0].appendChild(s1);
-
-</script>
-</svg>
-<script>
-onload = t.step_func(function() {
- <!-- assumes that the SVg script should be async -->
- assert_array_equals(eventOrder, ["external script #1", "external script #2"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/137.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/137.html
deleted file mode 100644
index c0e695462d6..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/137.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: SVG script empty xlink:href</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:3000});
-</script>
-<svg>
-<script xlink:href="">
-t.step(function() {assert_unreached()});
-</script>
-</svg>
-<script>
-onload = t.step_func(function() {
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/138.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/138.html
deleted file mode 100644
index 0eaad0765bc..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/138.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: SVG script nested inlines</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:3000});
-</script>
-<svg>
-<script>
-t.step(function() {
-log("inline script #2");
-var a = {
- <script>
- t.step(function() {log("inline script #1")})
- </script>
-a:1}
-log("end inline script #2");
-});
-</script>
-</svg>
-<script>
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "end inline script #2"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/139.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/139.html
deleted file mode 100644
index f1cbc158c95..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/139.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: SVG script nested external in inline</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:3000});
-</script>
-<svg>
-<script>
-t.step(function() {
-log("inline script #1");
-var a = {
- <script xlink:href="scripts/include-1.js">
- t.step(function() {assert_unreached()})
- </script>
-a:1}
-log("end inline script #1");
-});
-</script>
-</svg>
-<script>
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["external script #1", "inline script #1", "end inline script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/140.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/140.html
deleted file mode 100644
index fbdd1c76e86..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/140.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: SVG script nested inline in external</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:3000});
-</script>
-<svg>
-<script xlink:href="scripts/include-1.js">
- <script>
- t.step(function() {log("inline script #1")});
- </script>
-</script>
-</svg>
-<script>
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "external script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/141.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/141.html
deleted file mode 100644
index a237373bbde..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/141.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: SVG inline script that document.writes inline script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:3000});
-</script>
-<svg>
-<script>
- t.step(function() {
- log('inline script #1');
- document.write("<" + "script>t.step(function() {log('inline script #2')})<" + "/script>");
- log('end inline script #1');
- });
-</script>
-</svg>
-<script>
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "end inline script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/142.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/142.html
deleted file mode 100644
index 91f19f7577c..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/142.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: SVG inline script that document.writes external script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:3000});
-</script>
-<svg>
-<script>
- t.step(function() {
- log('inline script #1');
- document.write("<" + "script xlink:href='scripts/include-1.js'><" + "/script>");
- log('end inline script #1');
- });
-</script>
-<script>t.step(function() {log("inline script #2")});</script>
-</svg>
-<script>
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "end inline script #1", "external script #1", "inline script #2"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/143.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/143.html
deleted file mode 100644
index 9c0230d89dc..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/143.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: SVG nested inline script that document.writes inline script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:3000});
-</script>
-<svg>
-<script>
- t.step(function() {
- log('inline script #3');
- });
- <script>
- log("inline script #1")
- document.write("<" + "script>t.step(function() {log('inline script #2')})<" + "/script><" + "/script>");
- </script>
- t.step(function() {
- assert_unreached():
- });
-</script>
-</svg>
-<script>
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/144.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/144.html
deleted file mode 100644
index 96a1f4777fb..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/144.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: SVG inline script changing the type attribute </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:3000});
-</script>
-<svg>
-<script type="text/plain">
-t.step(function() {assert_unreached()});
-</script>
-</svg>
-<script>
-t.step(function() {
- var s = document.querySelector("svg > script");
- s.textContent = "t.step(function() {log('inline script #1')})";
- s.type = "";
- s.parentNode.appendChild(s);
-});
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/145.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/145.html
deleted file mode 100644
index 655a2132b85..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/145.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: SVG inline script adding text to empty script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>
- var t = async_test(undefined, {timeout:3000});
-</script>
-<svg>
-<script></script>
-</svg>
-<script>
-t.step(function() {
- var s = document.querySelector("svg > script");
- s.textContent = "t.step(function() {log('inline script #1')})";
-});
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/146.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/146.html
deleted file mode 100644
index c666a51a310..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/146.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: SVG script adding src attribute </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<div id="log"></div>
-<script>var t = async_test();</script>
-<svg>
-<script></script>
-</svg>
-<script>
-t.step(function() {
- var s = document.querySelector("svg > script");
- s.src = "scripts/include-1.js";
-});
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["external script #1"]);
- t.done();
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/147.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/147.html
deleted file mode 100644
index 0542380ff7f..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/147.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: insert multiple inline scripts; first script moves subsequent scripts </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-<div id="log"></div>
-<script>
-var t = async_test();
-</script>
-<div id="container"></div>
-<script>
-t.step(function() {
- log("inline script #1");
- var container = document.getElementById("container");
-
- var frag = document.createDocumentFragment();
- var frag_script_1 = document.createElement("script");
- var frag_script_2 = document.createElement("script");
- frag_script_2.id = "movee";
- var frag_script_3 = document.createElement("script");
-
- frag_script_1.textContent = "t.step(function() {log('inline script #2'); var s = document.getElementById('movee'); s.parentNode.appendChild(s)});";
- frag_script_2.textContent = "t.step(function() {log('inline script #3');})";
- frag_script_3.textContent = "t.step(function() {log('inline script #4');})";
-
- [frag_script_1, frag_script_2, frag_script_3].forEach(function(x) {frag.appendChild(x)});
-
- container.appendChild(frag);
-});
-
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3", "inline script #4"]);
- t.done();
-});
-</script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/148.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/148.html
deleted file mode 100644
index 72a91438042..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/148.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: insert multiple inline scripts; first script deletes subsequent script </title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-<div id="log"></div>
-<script>
-var t = async_test();
-</script>
-<div id="container"></div>
-<script>
-t.step(function() {
- log("inline script #1");
- var container = document.getElementById("container");
-
- var frag = document.createDocumentFragment();
- var frag_script_1 = document.createElement("script");
- var frag_script_2 = document.createElement("script");
- frag_script_2.id = "delete";
- var frag_script_3 = document.createElement("script");
-
- frag_script_1.textContent = "t.step(function() {log('inline script #2'); var s = document.getElementById('delete'); s.parentNode.removeChild(s)});";
- frag_script_2.textContent = "t.step(function() {log('inline script #3');})";
- frag_script_3.textContent = "t.step(function() {log('inline script #4');})";
-
- [frag_script_1, frag_script_2, frag_script_3].forEach(function(x) {frag.appendChild(x)});
-
- container.appendChild(frag);
-});
-
-onload = t.step_func(function() {
- assert_array_equals(eventOrder, ["inline script #1", "inline script #2", "inline script #3", "inline script #4"]);
- t.done();
-});
-</script>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/149.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/149.html
deleted file mode 100644
index 6fe9b68ba21..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/149.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title>scheduler: event/for attribute on script</title>
- <script src="/resources/testharness.js"></script>
- <script src="/resources/testharnessreport.js"></script>
- <script src="testlib/testlib.js"></script>
-</head>
-<body>
-<div id="log"></div>
-<script>
-
-attributes = [
- {for:"window", event:"onload()", expect:true},
- {for:"window", event:"onload", expect:true},
- {for:" WINdow\t\n", event:"ONload\t\n", expect:true},
- {for:"window", event:"load", expect:false},
- {for:"window", event:"onpageshow", expect:false},
- {for:"document", event:"onload", expect:false},
-]
-
-function test_maker(array_name) {
- return function(x, i) {
- var title = "for='" + x.for + "' event='" + x.event + "' " + array_name.replace("_", " ") + " " + (x.expect ? "executes immediately" : "does not execute");
- script_content = "var d =" + array_name + "[" + i + "];"
- script_content += x.expect?"d[1].step(function() {d[3] = true});":"d[1].step(function() {assert_unreached()});"
- return [x, async_test(title), script_content, false];
- }
-}
-
-parser_inserted = attributes.map(test_maker("parser_inserted"));
-dom_inserted = attributes.map(test_maker("dom_inserted"));
-
-parser_inserted.forEach(function(x) {
- var d = x[0];
- document.write("<script for='" + d.for + "' event='" + d.event + "'>" + x[2] + "<\/script>");
-});
-
-dom_inserted.forEach(function(x) {
- var d = x[0];
- var s = document.createElement("script");
- s.setAttribute("event", d.event);
- s.setAttribute("for", d.for);
- s.textContent = x[2];
- document.body.appendChild(s);
-});
-</script>
-
-<script>
-var all_tests = parser_inserted.concat(dom_inserted);
-
-all_tests.filter(function(x) {return x[0]["expect"]}).forEach(function(x) {var t = x[1]; t.step(function() {assert_true(x[3])});})
-
-onload = function() {
- all_tests.forEach(function(x) {var t = x[1]; t.step(function() {t.done()})});
-}
-</script>
-
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/pages/helloworld-postMessage.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/pages/helloworld-postMessage.html
deleted file mode 100644
index cae2797a483..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/pages/helloworld-postMessage.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> TC component </title>
-</head>
-<body>
-
- <p>This page should appear in popup or frame</p>
-
- <script type="text/javascript">
- var target = opener || top;
- var id = location.search?' '+location.search.substring(1) : '';
- target.log('frame/popup script'+id);
- window.onload=function(){
- target.log('load event inside frame/popup script'+id);
- target.postMessage('msg evt frame/popup script'+id, '*');
- }
- </script>
-
-</body></html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/pages/helloworld.html b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/pages/helloworld.html
deleted file mode 100644
index 30d5c5fda16..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/pages/helloworld.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<html><head>
- <title> TC component </title>
-</head>
-<body>
-
- <p>This page should appear in popup or frame</p>
-
- <script type="text/javascript">
- var target = top || opener;
- var id = location.search?' '+parseInt(location.search.substring(1)) : '';
- target.log('frame/popup script'+id);
- </script>
-
-</body></html>
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-11.js b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-11.js
deleted file mode 100644
index a822dd8baf2..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-11.js
+++ /dev/null
@@ -1,4 +0,0 @@
-log("external script before adding iframe");
-var iframe = document.createElement("iframe");
-iframe.src = "data:text/html,<script>parent.log('script in iframe')</script>"
-document.body.appendChild(iframe); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-12.js b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-12.js
deleted file mode 100644
index 7ced0fb424e..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/scripts/include-12.js
+++ /dev/null
@@ -1,4 +0,0 @@
-log("external script before adding object");
-var object = document.createElement("object");
-object.data = "data:text/html,<script>parent.log('script in object')</script>"
-document.body.appendChild(object); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/testlib/testlib.js b/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/testlib/testlib.js
deleted file mode 100644
index 7b556b150df..00000000000
--- a/tests/wpt/web-platform-tests/old-tests/submission/Opera/script_scheduling/testlib/testlib.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-* Utility functions for script scheduler test
-*/
-(function(){ /* namespace hiding local variables like arOrderOfAllEvents from global scope */
- window.testlib = {};
- window.eventOrder = [];
- var arNumberOfScriptsParsedPerEvent=[];
- window.log = function (str){
- eventOrder.push(str);
- arNumberOfScriptsParsedPerEvent.push(document.getElementsByTagName('script').length);
- }
-
- window.testlib.addScript = function(source, attributes, parent, firstInParent,funcPrepare) {
- try{
- parent = parent||document.body;
- var script = document.createElement('script');
- if(funcPrepare) {
- funcPrepare(script);
- }
- if(source)script.appendChild( document.createTextNode(source) );
- for( var name in attributes){
- if(/^on/i.test(name)) {
- script[name] = attributes[name];
- } else {
- script.setAttribute(name, attributes[name]);
- }
- }
- if (firstInParent && parent.firstChild) {
- parent.insertBefore(script, parent.firstChild);
- } else {
- parent.appendChild(script);
- }
- } catch(e) {
- log('ERROR when adding script to DOM!');
- alert(e);
- }
- return script;
- }
-
- window.testlib.urlParam = function(relativeURL) {
- return location.href.replace( /\d*\.html$/, relativeURL);
- }
-})(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/OWNERS b/tests/wpt/web-platform-tests/orientation-sensor/OWNERS
index cc7c3879319..eb920ae0f1e 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/OWNERS
+++ b/tests/wpt/web-platform-tests/orientation-sensor/OWNERS
@@ -1,5 +1,6 @@
@zqzhang
@dontcallmedom
-@tobie
@riju
@Honry
+@alexshalamov
+@pozdnyakov
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor.https.html b/tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor.https.html
new file mode 100644
index 00000000000..dbf0a66038f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor.https.html
@@ -0,0 +1,103 @@
+ <!DOCTYPE html>
+<meta charset="utf-8">
+<title>OrientationSensor Test</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<link rel="help" href="https://w3c.github.io/orientation-sensor/">
+<link rel="help" href="https://w3c.github.io/sensors/">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/generic-sensor/generic-sensor-tests.js"></script>
+<div id="log"></div>
+
+<script>
+
+//IEEE 754: single precision retricts to 7 decimal digits
+const float_precision = 1e-7;
+
+function create_matrix(quat) {
+ let X = quat[0];
+ let Y = quat[1];
+ let Z = quat[2];
+ let W = quat[3];
+ let mat = new Array(
+ 1-2*Y*Y-2*Z*Z, 2*X*Y-2*Z*W, 2*X*Z+2*Y*W, 0,
+ 2*X*Y+2*Z*W, 1-2*X*X-2*Z*Z, 2*Y*Z-2*X*W, 0,
+ 2*X*Z-2*Y*W, 2*Y*Z+2*W*X, 1-2*X*X-2*Y*Y, 0,
+ 0, 0, 0, 1
+ );
+ return mat;
+}
+
+function checkQuaternion(t, sensorType) {
+ let sensor = new sensorType();
+ sensor.onreading = t.step_func_done(() => {
+ assert_equals(sensor.quaternion.length, 4);
+ assert_true(sensor.quaternion instanceof Array);
+ sensor.stop();
+ });
+ sensor.onerror = t.step_func_done(unreached);
+ sensor.start();
+};
+
+function checkPopulateMatrix(t, sensorType) {
+ let sensor = new sensorType();
+ sensor.onerror = t.step_func_done(unreached);
+
+ //Throws with insufficient buffer space.
+ assert_throws({ name: 'TypeError' }, () => sensor.populateMatrix(new Float32Array(15)));
+
+ //Throws if no orientation data available.
+ assert_throws({ name: 'NotReadableError' }, () => sensor.populateMatrix(new Float32Array(16)));
+
+ if (window.SharedArrayBuffer) {
+ // Throws if passed SharedArrayBuffer view.
+ assert_throws({ name: 'TypeError' }, () => sensor.populateMatrix(new Float32Array(new SharedArrayBuffer(16))));
+ }
+
+ sensor.onreading = t.step_func_done(() => {
+ let quat = sensor.quaternion;
+ let mat_expect = create_matrix(quat);
+
+ // Works for all supported types.
+ let mat_32 = new Float32Array(16);
+ sensor.populateMatrix(mat_32);
+ assert_array_approx_equals(mat_32, mat_expect, float_precision);
+
+ let mat_64 = new Float64Array(16);
+ sensor.populateMatrix(mat_64);
+ assert_array_equals(mat_64, mat_expect);
+
+ let mat_dom = new DOMMatrix();
+ sensor.populateMatrix(mat_dom);
+ assert_array_equals(mat_dom.toFloat64Array(), mat_expect);
+
+ // Sets every matrix element.
+ mat_64.fill(123);
+ sensor.populateMatrix(mat_64);
+ assert_array_equals(mat_64, mat_expect);
+
+ sensor.stop();
+ });
+ sensor.start();
+}
+
+async_test(t => {
+ checkQuaternion(t, AbsoluteOrientationSensor);
+}, "Test AbsoluteOrientationSensor.quaternion return a four-element FrozenArray.");
+
+async_test(t => {
+ checkQuaternion(t, RelativeOrientationSensor);
+}, "Test RelativeOrientationSensor.quaternion return a four-element FrozenArray.");
+
+async_test(t => {
+ checkPopulateMatrix(t, AbsoluteOrientationSensor);
+}, "Test AbsoluteOrientationSensor.populateMatrix() method works correctly.");
+
+async_test(t => {
+ checkPopulateMatrix(t, RelativeOrientationSensor);
+}, "Test RelativeOrientationSensor.populateMatrix() method works correctly.");
+
+runGenericSensorTests(AbsoluteOrientationSensor);
+runGenericSensorTests(RelativeOrientationSensor);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor_insecure_context.html b/tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor_insecure_context.html
new file mode 100644
index 00000000000..41efb8f023a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor_insecure_context.html
@@ -0,0 +1,21 @@
+<meta charset="utf-8">
+<title>AbsoluteOrientationSensor Test: insecure context</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<link rel="help" href="https://w3c.github.io/orientation-sensor/">
+<link rel="help" href="https://w3c.github.io/sensors/">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/generic-sensor/generic-sensor-tests.js"></script>
+<div id="log"></div>
+<h2>Note:</h2>
+<ol>
+ <li>
+ Run test in an insecure context, e.g. http://example.com/.
+ </li>
+</ol>
+<script>
+
+runGenericSensorInsecureContext(AbsoluteOrientationSensor);
+runGenericSensorInsecureContext(RelativeOrientationSensor);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor_onerror-manual.https.html b/tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor_onerror-manual.https.html
new file mode 100644
index 00000000000..d70ea3048ea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/orientation-sensor/OrientationSensor_onerror-manual.https.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>AbsoluteOrientationSensor Test: onerror</title>
+<link rel="author" title="Intel" href="http://www.intel.com">
+<link rel="help" href="https://w3c.github.io/orientation-sensor/">
+<link rel="help" href="https://w3c.github.io/sensors/">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/generic-sensor/generic-sensor-tests.js"></script>
+<div id="log"></div>
+<h2>Precondition</h2>
+<ol>
+ <li>
+ Disable the motion sensors which the underlying physical sensors include Accelerometer, Magnetometer, and (when present) Gyroscope or run test on a device without the motion sensors.
+ </li>
+</ol>
+<script>
+
+runGenericSensorOnerror(AbsoluteOrientationSensor);
+runGenericSensorOnerror(RelativeOrientationSensor);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/orientation-sensor/idlharness.https.html b/tests/wpt/web-platform-tests/orientation-sensor/idlharness.https.html
index 8f556ca3164..82ab9b3851b 100644
--- a/tests/wpt/web-platform-tests/orientation-sensor/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/orientation-sensor/idlharness.https.html
@@ -8,82 +8,59 @@
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
<script src="/resources/idlharness.js"></script>
-<style>
- pre {
- display: none;
- }
-</style>
<div id="log"></div>
-<pre id="idl">
-interface Event {
-};
-
-interface Error {
-};
-
-dictionary EventInit {
-};
-
+<script id="idl" type="text/plain">
interface EventTarget {
};
interface EventHandler {
};
-</pre>
+</script>
-<pre id="generic-idl">
-[SecureContext]
+<script id="orientation-idl" type="text/plain">
+// The interface of Sensor is defined in
+// https://www.w3.org/TR/generic-sensor/#idl-index
+[SecureContext, Exposed=Window]
interface Sensor : EventTarget {
readonly attribute boolean activated;
readonly attribute DOMHighResTimeStamp? timestamp;
void start();
void stop();
- attribute EventHandler onchange;
+ attribute EventHandler onreading;
attribute EventHandler onactivate;
attribute EventHandler onerror;
};
-dictionary SensorOptions {
- double? frequency;
-};
-
-[SecureContext, Constructor(DOMString type, SensorErrorEventInit errorEventInitDict)]
-interface SensorErrorEvent : Event {
- readonly attribute Error error;
-};
-
-dictionary SensorErrorEventInit : EventInit {
- required Error error;
-};
-</pre>
-
-<pre id="orientation-idl">
typedef (Float32Array or Float64Array or DOMMatrix) RotationMatrixType;
+
+[Exposed=Window]
interface OrientationSensor : Sensor {
readonly attribute FrozenArray<double>? quaternion;
void populateMatrix(RotationMatrixType targetMatrix);
};
-[Constructor(optional SensorOptions sensorOptions)]
+[Constructor(optional SensorOptions sensorOptions), Exposed=Window]
interface AbsoluteOrientationSensor : OrientationSensor {
};
-</pre>
-<script>
+[Constructor(optional SensorOptions sensorOptions), Exposed=Window]
+interface RelativeOrientationSensor : OrientationSensor {
+};
+</script>
+<script>
(() => {
"use strict";
let idl_array = new IdlArray();
idl_array.add_untested_idls(document.getElementById('idl').textContent);
- idl_array.add_untested_idls(document.getElementById('generic-idl').textContent);
idl_array.add_idls(document.getElementById('orientation-idl').textContent);
idl_array.add_objects({
- AbsoluteOrientationSensor: ['new AbsoluteOrientationSensor();']
+ AbsoluteOrientationSensor: ['new AbsoluteOrientationSensor();'],
+ RelativeOrientationSensor: ['new RelativeOrientationSensor();']
});
idl_array.test();
})();
-
</script>
diff --git a/tests/wpt/web-platform-tests/page-visibility/idlharness.html b/tests/wpt/web-platform-tests/page-visibility/idlharness.html
index f5999eaa7eb..50d580934cd 100644
--- a/tests/wpt/web-platform-tests/page-visibility/idlharness.html
+++ b/tests/wpt/web-platform-tests/page-visibility/idlharness.html
@@ -4,7 +4,7 @@
<meta charset="utf-8">
<title>Page Visibility IDL tests</title>
<link rel="author" title="W3C" href="http://www.w3.org/" />
-<link rel="help" href="http://www.w3.org/TR/page-visibility/#sec-document-interface"/>
+<link rel="help" href="https://w3c.github.io/page-visibility/"/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/WebIDLParser.js"></script>
@@ -16,6 +16,9 @@
<pre id='untested_idl' style='display:none'>
interface Document {
};
+[TreatNonObjectAsNull]
+callback EventHandlerNonNull = any (Event event);
+typedef EventHandlerNonNull? EventHandler;
</pre>
<pre id='idl'>
diff --git a/tests/wpt/web-platform-tests/page-visibility/iframe-unload.html b/tests/wpt/web-platform-tests/page-visibility/iframe-unload.html
new file mode 100644
index 00000000000..6d049a846da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/page-visibility/iframe-unload.html
@@ -0,0 +1,49 @@
+<html>
+<title>visibilitychange fires on unload with iframes</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+
+var frameDocs = [];
+var docsLoaded = 0;
+var numFrames = 3;
+
+var ast = new async_test("visibilitychange fires on unload with iframes");
+
+function startTest() {
+ if (++docsLoaded < numFrames)
+ return;
+
+ ast.step(function () {
+ frameDocs.push(window[0].document);
+ frameDocs.push(window[0][0].document);
+ frameDocs.push(window[0][1].document);
+
+ for (var i = 0; i < frameDocs.length; ++i) {
+ frameDocs[i].addEventListener(
+ "visibilitychange",
+ onVisibilityChange.bind(null, i), false);
+ }
+
+ document.body.removeChild(document.getElementById("frame1"));
+ });
+}
+
+var checkedFrames = 0;
+
+function onVisibilityChange(i) {
+ ast.step(function () {
+ assert_equals(frameDocs[i].visibilityState, "hidden");
+ });
+ if (++checkedFrames >= numFrames) {
+ ast.done();
+ }
+}
+
+
+
+</script>
+<iframe id="frame1" src="resources/iframe-with-subframes.html"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/page-visibility/onvisibilitychange.html b/tests/wpt/web-platform-tests/page-visibility/onvisibilitychange.html
new file mode 100644
index 00000000000..054e8c76c86
--- /dev/null
+++ b/tests/wpt/web-platform-tests/page-visibility/onvisibilitychange.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<title>onvisibilitychange attribute is a proper event handler</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+var ast = new async_test("onvisibilitychange attribute is a proper event handler");
+document.getElementById("frame1");
+function startTest() {
+ var iframe1 = document.getElementById("frame1");
+ iframe1.contentWindow.document.onvisibilitychange = ast.step_func(function() {
+ ast.done();
+ });
+ frame1.parentNode.removeChild(frame1);
+}
+</script>
+<iframe id="frame1" src='resources/iframe.html'></iframe>
diff --git a/tests/wpt/web-platform-tests/page-visibility/resources/iframe-with-subframes.html b/tests/wpt/web-platform-tests/page-visibility/resources/iframe-with-subframes.html
new file mode 100644
index 00000000000..febb9543699
--- /dev/null
+++ b/tests/wpt/web-platform-tests/page-visibility/resources/iframe-with-subframes.html
@@ -0,0 +1,6 @@
+<html>
+<body onload="parent.startTest()">
+<iframe id="subIframe1" onload="parent.parent.startTest()"></iframe>
+<iframe id="subIframe2" onload="parent.parent.startTest()"></iframe>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/page-visibility/resources/iframe.html b/tests/wpt/web-platform-tests/page-visibility/resources/iframe.html
new file mode 100644
index 00000000000..e08acb827ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/page-visibility/resources/iframe.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<html>
+<head><title>Document</title></head>
+<body>
+<h1>Document</h1>
+<script>
+onload = function() {
+ parent.startTest();
+}
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/page-visibility/resources/pagevistestharness.js b/tests/wpt/web-platform-tests/page-visibility/resources/pagevistestharness.js
index d53d73b4235..bfc4deb9f62 100644
--- a/tests/wpt/web-platform-tests/page-visibility/resources/pagevistestharness.js
+++ b/tests/wpt/web-platform-tests/page-visibility/resources/pagevistestharness.js
@@ -117,5 +117,5 @@ function TabSwitch()
{
//var open_link = window.open("http://www.bing.com");
open_link = window.open('', '_blank');
- setTimeout(function() { open_link.close(); }, 2000);
+ step_timeout(function() { open_link.close(); }, 2000);
}
diff --git a/tests/wpt/web-platform-tests/paint-timing/OWNERS b/tests/wpt/web-platform-tests/paint-timing/OWNERS
new file mode 100644
index 00000000000..b544ce11405
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/OWNERS
@@ -0,0 +1,2 @@
+@spanicker
+@tdresser
diff --git a/tests/wpt/web-platform-tests/paint-timing/basetest.html b/tests/wpt/web-platform-tests/paint-timing/basetest.html
new file mode 100644
index 00000000000..7f84566d9a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/basetest.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<head>
+<title>Performance Paint Timing Test</title>
+</head>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="main"></div>
+
+<script>
+async_test(function(t) {
+ t.step(function() {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ assert_equals(bufferedEntries.length, 0, "No paint entries yet");
+ });
+ const div = document.createElement("div");
+ div.style.width = "100px";
+ div.style.height = "100px";
+ div.style.backgroundColor = "red";
+ div.style.color = "blue";
+ div.innerHTML = "test"
+ document.getElementById("main").appendChild(div);
+ function testPaintEntries() {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ if (bufferedEntries.length < 2) {
+ t.step_timeout(function() {
+ testPaintEntries();
+ }, 20);
+ return;
+ }
+ t.step(function() {
+ assert_equals(bufferedEntries.length, 2, "FP and FCP.");
+ assert_equals(bufferedEntries[0].entryType, "paint");
+ assert_equals(bufferedEntries[0].name, "first-paint");
+ assert_equals(bufferedEntries[1].entryType, "paint");
+ assert_equals(bufferedEntries[1].name, "first-contentful-paint");
+ t.done();
+ });
+ }
+ t.step(function() {
+ testPaintEntries();
+ });
+}, "Basic test to check existence of FP and FCP.");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-contentful-bg-image.html b/tests/wpt/web-platform-tests/paint-timing/first-contentful-bg-image.html
new file mode 100644
index 00000000000..ddcc78fbe55
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/first-contentful-bg-image.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<head>
+<title>Performance Paint Timing Test: FCP due to background image</title>
+</head>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="main"></div>
+</body>
+
+<footer>
+<script>
+async_test(function (t) {
+ const body = document.getElementsByTagName('body')[0];
+ body.style.backgroundImage = 'url(resources/circles.png)';
+ window.onload = function() {
+ function testPaintEntries() {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ if (bufferedEntries.length < 2) {
+ t.step_timeout(function() {
+ testPaintEntries();
+ }, 20);
+ return;
+ }
+ t.step(function() {
+ assert_equals(bufferedEntries.length, 2, "There should be two paint timing instances.");
+ assert_equals(bufferedEntries[0].entryType, "paint");
+ assert_equals(bufferedEntries[0].name, "first-paint");
+ assert_equals(bufferedEntries[1].entryType, "paint");
+ assert_equals(bufferedEntries[1].name, "first-contentful-paint");
+ t.done();
+ });
+ }
+ t.step(function() {
+ testPaintEntries();
+ });
+ };
+}, "First contentful paint fires due to background image render.");
+</script>
+<footer>
+</html>
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-contentful-canvas.html b/tests/wpt/web-platform-tests/paint-timing/first-contentful-canvas.html
new file mode 100644
index 00000000000..3610a57ec71
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/first-contentful-canvas.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<head>
+<title>Performance Paint Timing Test: FCP due to canvas</title>
+</head>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<canvas id="canvas" width="200" height="200" ></canvas>
+
+<script>
+async_test(function (t) {
+ const canvas = document.getElementById("canvas");
+ const context = canvas.getContext("2d");
+ context.beginPath();
+ context.moveTo(0,0);
+ context.lineTo(300,150);
+ context.stroke();
+ function testPaintEntries() {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ if (bufferedEntries.length < 2) {
+ t.step_timeout(function() {
+ testPaintEntries();
+ }, 20);
+ return;
+ }
+ t.step(function() {
+ assert_equals(bufferedEntries.length, 2, "There should be two paint timing instances.");
+ assert_equals(bufferedEntries[0].entryType, "paint");
+ assert_equals(bufferedEntries[0].name, "first-paint");
+ assert_equals(bufferedEntries[1].entryType, "paint");
+ assert_equals(bufferedEntries[1].name, "first-contentful-paint");
+ t.done();
+ });
+ };
+ t.step(function() {
+ testPaintEntries();
+ });
+}, "First contentful paint fires due to canvas render.");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-contentful-image.html b/tests/wpt/web-platform-tests/paint-timing/first-contentful-image.html
new file mode 100644
index 00000000000..a4e89b37657
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/first-contentful-image.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<head>
+<title>Performance Paint Timing Test: FCP due to image</title>
+</head>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="image"></div>
+
+<script>
+async_test(function (t) {
+ const img = document.createElement("IMG");
+ img.src = "resources/circles.png";
+ img.onload = function() {
+ function testPaintEntries() {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ if (bufferedEntries.length < 2) {
+ t.step_timeout(function() {
+ testPaintEntries();
+ }, 20);
+ return;
+ }
+ t.step(function() {
+ assert_equals(bufferedEntries.length, 2, "There should be two paint timing instances.");
+ assert_equals(bufferedEntries[0].entryType, "paint");
+ assert_equals(bufferedEntries[0].name, "first-paint");
+ assert_equals(bufferedEntries[1].entryType, "paint");
+ assert_equals(bufferedEntries[1].name, "first-contentful-paint");
+ t.done();
+ })
+ }
+ t.step(function() {
+ testPaintEntries();
+ });
+ };
+ document.getElementById('image').appendChild(img);
+}, "First contentful paint fires due to image render.");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-contentful-paint.html b/tests/wpt/web-platform-tests/paint-timing/first-contentful-paint.html
new file mode 100644
index 00000000000..570ce4be21c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/first-contentful-paint.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<head>
+<title>Performance Paint Timing Test: FP followed by FCP</title>
+</head>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="main"></div>
+<div id="image"></div>
+
+<script>
+async_test(function (t) {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ assert_equals(bufferedEntries.length, 0, "No paint entries yet");
+ const div = document.createElement("div");
+ div.style.width = "100px";
+ div.style.height = "100px";
+ div.style.backgroundColor = "red";
+ div.style.color = "blue";
+ document.getElementById("main").appendChild(div);
+ function testPaintEntries() {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ if (bufferedEntries.length < 1) {
+ t.step_timeout(function() {
+ testPaintEntries();
+ }, 20);
+ return;
+ }
+ t.step(function() {
+ assert_equals(bufferedEntries.length, 1, "FP only.");
+ assert_equals(bufferedEntries[0].entryType, "paint");
+ assert_equals(bufferedEntries[0].name, "first-paint");
+ });
+ const img = document.createElement("IMG");
+ img.src = "resources/circles.png";
+ img.onload = function() {
+ function secondTestPaintEntries() {
+ const moreBufferedEntries = performance.getEntriesByType('paint');
+ if (moreBufferedEntries.length < 2) {
+ t.step_timeout(function() {
+ secondTestPaintEntries();
+ }, 20);
+ return;
+ }
+ t.step(function() {
+ assert_equals(moreBufferedEntries.length, 2, "FP and FCP.");
+ assert_equals(moreBufferedEntries[0].entryType, "paint");
+ assert_equals(moreBufferedEntries[0].name, "first-paint");
+ assert_equals(moreBufferedEntries[1].entryType, "paint");
+ assert_equals(moreBufferedEntries[1].name, "first-contentful-paint");
+ t.done();
+ });
+ }
+ t.step(function() {
+ secondTestPaintEntries();
+ });
+ };
+ document.getElementById('image').appendChild(img);
+ }
+ t.step(function() {
+ testPaintEntries();
+ });
+}, "First Paint triggered by non-contentful paint. Image load triggers First Contentful Paint.");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-contentful-svg.html b/tests/wpt/web-platform-tests/paint-timing/first-contentful-svg.html
new file mode 100644
index 00000000000..cf3e9542758
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/first-contentful-svg.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<head>
+<title>Performance Paint Timing Test: FCP due to SVG</title>
+</head>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="svg"></div>
+
+<script>
+async_test(function (t) {
+ const img = document.createElement("IMG");
+ img.src = "resources/circle.svg";
+ img.onload = function() {
+ function testPaintEntries() {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ if (bufferedEntries.length < 2) {
+ t.step_timeout(function() {
+ testPaintEntries();
+ }, 20);
+ return;
+ }
+ t.step(function() {
+ assert_equals(bufferedEntries.length, 2, "There should be two paint timing instances.");
+ assert_equals(bufferedEntries[0].entryType, "paint");
+ assert_equals(bufferedEntries[0].name, "first-paint");
+ assert_equals(bufferedEntries[1].entryType, "paint");
+ assert_equals(bufferedEntries[1].name, "first-contentful-paint");
+ t.done();
+ });
+ }
+ t.step(function() {
+ testPaintEntries();
+ });
+ };
+ document.getElementById('svg').appendChild(img);
+}, "First contentful paint fires due to svg.");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-paint-bg-color.html b/tests/wpt/web-platform-tests/paint-timing/first-paint-bg-color.html
new file mode 100644
index 00000000000..46efb9e2674
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/first-paint-bg-color.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<head>
+<title>Performance Paint Timing Test: FP due to background color</title>
+</head>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="main"></div>
+</body>
+
+<footer>
+<script>
+async_test(function (t) {
+ document.body.style.backgroundColor = "#AA0000";
+
+ function testPaintEntries() {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ if (bufferedEntries.length < 1) {
+ t.step_timeout(function() {
+ testPaintEntries();
+ }, 20);
+ return;
+ }
+ t.step(function() {
+ assert_equals(bufferedEntries.length, 1, "FP should fire for background color, not FCP");
+ assert_equals(bufferedEntries[0].entryType, "paint");
+ assert_equals(bufferedEntries[0].name, "first-paint");
+ t.done();
+ });
+ }
+ t.step(function() {
+ testPaintEntries();
+ })
+}, "First paint fires due to background color. No FCP");
+</script>
+<footer>
+</html>
diff --git a/tests/wpt/web-platform-tests/paint-timing/first-paint-only.html b/tests/wpt/web-platform-tests/paint-timing/first-paint-only.html
new file mode 100644
index 00000000000..fb0e7528753
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/first-paint-only.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<head>
+<title>Performance Paint Timing Test: FP only</title>
+</head>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="main"></div>
+
+<script>
+async_test(function (t) {
+ const div = document.createElement("div");
+ div.style.width = "100px";
+ div.style.height = "100px";
+ div.style.backgroundColor = "red";
+ div.style.color = "blue";
+ document.getElementById("main").appendChild(div);
+
+ function testPaintEntries() {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ if (bufferedEntries.length < 1) {
+ t.step_timeout(function() {
+ testPaintEntries();
+ }, 20);
+ return;
+ }
+ t.step(function() {
+ assert_equals(bufferedEntries.length, 1, "FP only.");
+ assert_equals(bufferedEntries[0].entryType, "paint");
+ assert_equals(bufferedEntries[0].name, "first-paint");
+ t.done();
+ });
+ }
+ t.step(function() {
+ testPaintEntries();
+ })
+}, "Performance first paint timing entry exists. No first contentful paint.");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/paint-timing/paint-visited.html b/tests/wpt/web-platform-tests/paint-timing/paint-visited.html
new file mode 100644
index 00000000000..a0734f97acc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/paint-visited.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<style>
+ a:visited {
+ color:white;
+ }
+</style>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<a id="link" href="./">link</a>
+<script>
+/* This test ensures that an empty page is painted when there is an invisible visited link (that would be visible if the link was not visited). It's necessary that whether the page is painted or not does not depend on visitedness of the link. Otherwise the paint-timing API could be used to sniff whether a link has been visited or not. */
+window.onload = function() {
+ /* Convenience helper to get the link into the browsing history.
+ Using a relative path because some browsers only allow replaceState within the same domain. */
+ current_url = window.location.href;
+ history.replaceState({}, "", "./");
+ history.replaceState({}, "", current_url);
+}
+async_test(function(t) {
+ function testPaintEntries() {
+ const bufferedEntries = performance.getEntriesByType('paint');
+ if (bufferedEntries.length < 2) {
+ t.step_timeout(function() {
+ testPaintEntries();
+ }, 20);
+ return;
+ }
+ t.step(function() {
+ assert_equals(bufferedEntries.length, 2, "FP and FCP.");
+ assert_equals(bufferedEntries[0].entryType, "paint");
+ assert_equals(bufferedEntries[0].name, "first-paint");
+ assert_equals(bufferedEntries[1].entryType, "paint");
+ assert_equals(bufferedEntries[1].name, "first-contentful-paint");
+ t.done();
+ });
+ }
+ t.step(function() {
+ testPaintEntries();
+ });
+}, "Visited-attack test to check existence of FP and FCP.");
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/paint-timing/resources/circle.svg b/tests/wpt/web-platform-tests/paint-timing/resources/circle.svg
new file mode 100644
index 00000000000..6b5fdbe8e06
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/resources/circle.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="none" />
+</svg>
diff --git a/tests/wpt/web-platform-tests/paint-timing/resources/circles.png b/tests/wpt/web-platform-tests/paint-timing/resources/circles.png
new file mode 100644
index 00000000000..708682a207b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/paint-timing/resources/circles.png
Binary files differ
diff --git a/tests/wpt/web-platform-tests/payment-handler/OWNERS b/tests/wpt/web-platform-tests/payment-handler/OWNERS
new file mode 100644
index 00000000000..9a93bf1ba50
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-handler/OWNERS
@@ -0,0 +1,2 @@
+@marcoscaceres
+@rsolomakhin
diff --git a/tests/wpt/web-platform-tests/payment-handler/interfaces.https.any.js b/tests/wpt/web-platform-tests/payment-handler/interfaces.https.any.js
new file mode 100644
index 00000000000..21f8d354094
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-handler/interfaces.https.any.js
@@ -0,0 +1,20 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+"use strict";
+
+if (self.importScripts) {
+ importScripts("/resources/testharness.js");
+ importScripts("/resources/WebIDLParser.js", "/resources/idlharness.js");
+}
+
+// https://w3c.github.io/payment-handler/
+
+promise_test(async() => {
+ const text = await fetch("/interfaces/payment-handler.idl")
+ .then(response => response.text());
+ const idlArray = new IdlArray();
+ idlArray.add_idls(text);
+ idlArray.test();
+ done();
+}, "Payment handler interfaces.");
diff --git a/tests/wpt/web-platform-tests/payment-method-basic-card/OWNERS b/tests/wpt/web-platform-tests/payment-method-basic-card/OWNERS
new file mode 100644
index 00000000000..a6ce947074c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-method-basic-card/OWNERS
@@ -0,0 +1,4 @@
+@edenchuang
+@mnoorenberghe
+@marcoscaceres
+@rsolomakhin
diff --git a/tests/wpt/web-platform-tests/payment-method-basic-card/empty-data-manual.https.html b/tests/wpt/web-platform-tests/payment-method-basic-card/empty-data-manual.https.html
new file mode 100644
index 00000000000..692f31ed807
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-method-basic-card/empty-data-manual.https.html
@@ -0,0 +1,139 @@
+<!doctype html>
+<meta charset="utf8">
+<title>Payment Method Basic Card - test passing empty BasicCardRequest members</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({ explicit_done: true, explicit_timeout: true });
+
+const amount = { value: "1.0", currency: "USD" };
+const details = {
+ total: {
+ label: "Total",
+ amount,
+ },
+};
+const method = {
+ supportedMethods: "basic-card",
+};
+
+const defaultBillingAddress = {
+ country: 'AF',
+ addressLine: '1 wpt street',
+ region: '',
+ city: 'Kabul',
+ dependentLocality: '',
+ postalCode: '1001',
+ sortingCode: '',
+ languageCode: 'fa',
+ organization: 'w3c',
+ recipient: 'web platform test',
+ phone: '+93555555555',
+};
+
+const visaCredit = {
+ cardNumber: "4111111111111111",
+ cardSecurityCode: "123",
+ cardholderName: "web platform test",
+ expiryMonth: "01",
+ expiryYear: "2026",
+};
+
+async function getCardResponse(data) {
+ const method = Object.assign({ data }, methodCard);
+ const response = await new PaymentRequest([method], defaultDetails).show();
+ await response.complete("success");
+ return response.details;
+}
+
+/**
+ * All tests expect the same return data, so we can just check the
+ * same result over and over again.
+ */
+function runPromiseTest(button, data, expectedCard = visaCredit, expectedAddress = defaultBillingAddress ) {
+ button.disabled = true;
+ promise_test(async () => {
+ const card = await getCardResponse(data);
+ for (const [member, expectedValue] of Object.entries(expectedCard)) {
+ const msg = `Expected card.${member} to equal ${expectedValue}.`;
+ assert_equals(card[member], expectedValue, msg);
+ }
+ const { billingAddress } = card;
+ for (const [member, expectedValue] of Object.entries(expectedAddress)) {
+ const msg = `billingAddress.${member} to equal ${expectedValue}.`;
+ assert_equals(billingAddress[member], expectedValue);
+ }
+ }, button.textContent.trim());
+}
+</script>
+<h2>
+ Payment Method Basic Card - test passing empty BasicCardRequest values
+</h2>
+<p>
+ This test checks that the Basic Card payment handler can accept any card.
+</p>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+ The test expects the following credit card.
+</p>
+<ol>
+ <li>Add credit card:
+ <dl>
+ <dt>Cardholder name:</dt>
+ <dd>web platform test</dd>
+ <dt>Card number:</dt>
+ <dd>4111111111111111</dd>
+ <dt>Security code (CVV):</dt>
+ <dd>123</dd>
+ <dt>Expiry month:</dt>
+ <dd>01</dd>
+ <dt>Expiry year:</dt>
+ <dd>2026</dd>
+ </dl>
+ </li>
+ <li>Add billing address:
+ <dl>
+ <dt>Recipient:</dt>
+ <dd>web platform test</dd>
+ <dt>Address:</dt>
+ <dd>1 web st</dd>
+ <dt>Post code:</dt>
+ <dd>1234</dd>
+ <dt>Country:</dt>
+ <dd>Afghanistan</dd>
+ <dt>City:</dt>
+ <dd>w3c</dd>
+ <dt>Phone</dt>
+ <dd>+12345678910</dd>
+ </dl>
+ </li>
+</ol>
+<hr>
+<ol>
+ <li>
+ <button onclick="runPromiseTest(this, {});">
+ When passed BasicCardRequest without members, allow the user to input of any credit card type.
+ </button>
+ </li>
+ <li>
+ <button onclick="runPromiseTest(this, { supportedNetworks: [], supportedTypes: [] });">
+ Returns any card type on any network, because zero length supportedNetworks and supportedTypes.
+ </button>
+ </li>
+ <li>
+ <button onclick="runPromiseTest(this, { supportedNetworks: [] });">
+ Returns any card type on any network, because supportedNetworks is missing and supportedTypes is empty.
+ </button>
+ </li>
+ <li>
+ <button onclick="runPromiseTest(this, { supportedTypes: [] });">
+ Returns any card type on any network missing supportedTypes, and empty supportedNetwork.
+ </button>
+ </li>
+</ol>
+
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-method-basic-card/payment-request-canmakepayment-method.https.html b/tests/wpt/web-platform-tests/payment-method-basic-card/payment-request-canmakepayment-method.https.html
new file mode 100644
index 00000000000..a89c63b1bbc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-method-basic-card/payment-request-canmakepayment-method.https.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Payment Method Basic Card: Tests that basic card is a supported method</title>
+<link rel="help" href="https://w3c.github.io/browser-payment-api/#show-method">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const basicCard = Object.freeze({ supportedMethods: "basic-card", data: {} });
+const defaultMethods = Object.freeze([basicCard]);
+const defaultDetails = Object.freeze({
+ total: {
+ label: "Total",
+ amount: {
+ currency: "USD",
+ value: "1.00",
+ },
+ },
+});
+
+const notSupportedMethod = Object.freeze({
+ supportedMethods: "this-is-not-supported",
+});
+
+promise_test(async t => {
+ const request = new PaymentRequest([notSupportedMethod], defaultDetails);
+ assert_false(
+ await request.canMakePayment(),
+ `canMakePaymentPromise should be false`
+ );
+}, `Must return false when the PMI is not supported at by the user agent.`);
+
+function* pmiGenerator(howMany = 256) {
+ for (i = 0; i < howMany; i++) {
+ yield {
+ supportedMethods: `this-is-not-supported-${i}`,
+ data: { key: "value" },
+ };
+ }
+}
+
+promise_test(async t => {
+ //Smoke test
+ const canMakePaymentPromise = new PaymentRequest(
+ [notSupportedMethod],
+ defaultDetails
+ ).canMakePayment();
+ assert_false(
+ await canMakePaymentPromise,
+ "Expected canMakePaymentPromise smoke test to resolve with false"
+ );
+ // Actual test - Make a big array with random PMIs,
+ // put basic-card in the middle of it!
+ const pmis = []
+ .concat(Array.from(pmiGenerator(250)))
+ .concat(basicCard)
+ .concat(Array.from(pmiGenerator(250)));
+ const request = new PaymentRequest(pmis, defaultDetails);
+ assert_true(
+ await request.canMakePayment(),
+ `canMakePaymentPromise should be true, because basic-card is present`
+ );
+}, `Must return true when basic-card is amongst unsupported PMIs.`);
+
+promise_test(async t => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ try {
+ assert_true(
+ await request.canMakePayment(),
+ `canMakePaymentPromise must resolve to true`
+ );
+ assert_true(
+ await request.canMakePayment(),
+ `canMakePaymentPromise must resolve to true`
+ );
+ // try to trigger optional behavior
+ for (let i = 0; i < 1024; i++) {
+ const temp = new PaymentRequest(defaultMethods, defaultDetails);
+ await Promise.all([temp.canMakePayment(), request.canMakePayment()]);
+ }
+ } catch (err) {
+ assert_equals(
+ err.name,
+ "NotAllowedError",
+ "if it throws, then it must be a NotAllowedError."
+ );
+ }
+}, `If basic-card is supported, then return a promise that resolves to true.`);
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-method-id/OWNERS b/tests/wpt/web-platform-tests/payment-method-id/OWNERS
new file mode 100644
index 00000000000..ce59356364a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-method-id/OWNERS
@@ -0,0 +1,3 @@
+@edenchuang
+@alphan102
+@marcoscaceres
diff --git a/tests/wpt/web-platform-tests/payment-method-id/README.md b/tests/wpt/web-platform-tests/payment-method-id/README.md
new file mode 100644
index 00000000000..3d1bb8ddda2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-method-id/README.md
@@ -0,0 +1,4 @@
+## Payment Method Identifiers
+This is the test suite for the <cite>[Payment Method Identifiers](https://www.w3.org/TR/payment-method-id/)<cite>.
+
+Tests coming soon.
diff --git a/tests/wpt/web-platform-tests/payment-request/OWNERS b/tests/wpt/web-platform-tests/payment-request/OWNERS
index ce59356364a..6aa9e2b2b50 100644
--- a/tests/wpt/web-platform-tests/payment-request/OWNERS
+++ b/tests/wpt/web-platform-tests/payment-request/OWNERS
@@ -1,3 +1,6 @@
@edenchuang
-@alphan102
@marcoscaceres
+@rsolomakhin
+@domenic
+@AmazingJaze
+@MSFTkihans
diff --git a/tests/wpt/web-platform-tests/payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html b/tests/wpt/web-platform-tests/payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html
new file mode 100644
index 00000000000..6f14e8a500e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/PaymentAddress/attributes-and-toJSON-method-manual.https.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://www.w3.org/TR/payment-request/#paymentaddress-interface">
+<title>
+ PaymentResponse.prototype.shippingAddress
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../payment-response/helpers.js"></script>
+<script>
+const options = { requestShipping: true };
+function runManualTest(button, expected = {}) {
+ button.disabled = true;
+ promise_test(async () => {
+ const { response } = await getPaymentRequestResponse(options);
+ await response.complete();
+ assert_idl_attribute(response, "shippingAddress");
+ const { shippingAddress: addr } = response;
+ assert_true(
+ addr instanceof PaymentAddress,
+ "Expect instance of PaymentAddress"
+ );
+ // An [ISO3166] alpha-2 code. The canonical form is upper case.
+ const { country } = addr;
+ assert_equals(country.length, 2, "Expected length is 2");
+ assert_true(/^[A-Z]{2}$/.test(country), "Canonical form is upper case");
+ assert_true(
+ addr.addressLine instanceof Array,
+ "Expected addressLine to be an array"
+ );
+ assert_throws(
+ new TypeError(),
+ () => {
+ addr.addressLine.push("this must throw");
+ },
+ "Array must be frozen"
+ );
+ for (let [attr, expectedValue] of Object.entries(expected)) {
+ assert_idl_attribute(addr, attr);
+ const msg = `Expected paymentAddress.${attr} to equal ${expectedValue}.`;
+ //.toString() flattens array addressLine,
+ //.toLowerCase() because case can't be enforced for some attributes
+ const actualValue = addr[attr].toString().toLowerCase();
+ expectedValue = expectedValue.toString().toLowerCase();
+ assert_equals(actualValue, expectedValue, msg);
+ }
+ // Check toJSON result
+ for (let [prop, jsonValue] of Object.entries(addr.toJSON())) {
+ const actualValue = jsonValue.toString().toLowerCase();
+ const expectedValue = expected[prop].toString().toLowerCase();
+ const msg = `Expected JSON ${prop} to be ${expectedValue}`;
+ assert_equals(actualValue, expectedValue, msg);
+ }
+ }, button.textContent.trim());
+ done();
+}
+</script>
+<h2>PaymentAddress interface</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When prompted, please enter addresses as follows...
+</p>
+<ol>
+ <li>
+ <button onclick="
+ const expectedAddress = {
+ country: 'AF',
+ addressLine: '1 wpt street',
+ region: '',
+ city: 'Kabul',
+ dependentLocality: '',
+ postalCode: '1001',
+ sortingCode: '',
+ languageCode: 'fa',
+ organization: 'w3c',
+ recipient: 'web platform test',
+ phone: '+93555555555',
+ };
+ runManualTest(this, expectedAddress);">
+ If the requestShipping member is true, then shippingAddress's PaymentAddress must match the expected values.
+ </button>
+ "web platform test" as recipient, at address "1 wpt street" in "Kabul, Afghanistan", zip/postal code 1001.
+ Set the organization to "w3c". Set the phone number to "+93 55 555 5555"
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.http.html b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.http.html
new file mode 100644
index 00000000000..db7765f7bf9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.http.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for PaymentRequestUpdateEvent Constructor (insecure)</title>
+<link rel="help" href="https://w3c.github.io/browser-payment-api/#paymentrequestupdateevent-interface">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(() => {
+ assert_false("PaymentRequestUpdateEvent" in Window);
+}, "PaymentRequestUpdateEvent constructor must not be exposed in insecure context");
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.https.html b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.https.html
new file mode 100644
index 00000000000..eb58b6a7ece
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/constructor.https.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for PaymentRequestUpdateEvent Constructor</title>
+<link rel="help" href="https://w3c.github.io/browser-payment-api/#constructor">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const basicCard = Object.freeze({ supportedMethods: "basic-card" });
+const defaultMethods = Object.freeze([basicCard]);
+const defaultDetails = Object.freeze({
+ total: {
+ label: "Total",
+ amount: {
+ currency: "USD",
+ value: "1.00",
+ },
+ },
+});
+
+test(() => {
+ try {
+ new PaymentRequestUpdateEvent("test");
+ } catch (err) {
+ assert_true(false, `Unexpected exception: ${err.message}`);
+ }
+}, "PaymentRequestUpdateEvent can be constructed in secure-context");
+
+test(() => {
+ const ev = new PaymentRequestUpdateEvent("test", {
+ bubbles: true,
+ cancelable: true,
+ composed: true,
+ });
+ assert_false(ev.isTrusted, "constructed in script, so not be trusted");
+ assert_true(ev.bubbles, "set by EventInitDict");
+ assert_true(ev.cancelable, "set by EventInitDict");
+ assert_true(ev.composed, "set by EventInitDict");
+ assert_equals(ev.target, null, "initially null");
+ assert_equals(ev.type, "test");
+}, "PaymentRequestUpdateEvent can be constructed with an EventInitDict, even if not trusted");
+
+test(() => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ const ev = new PaymentRequestUpdateEvent("test");
+ request.addEventListener("test", evt => {
+ assert_equals(ev, evt);
+ });
+ request.dispatchEvent(ev);
+}, "PaymentRequestUpdateEvent can be dispatched, even if not trusted");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-call-immediate-manual.https.html b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-call-immediate-manual.https.html
new file mode 100644
index 00000000000..563f953fc0f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-call-immediate-manual.https.html
@@ -0,0 +1,193 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://www.w3.org/TR/payment-request/#updatewith()-method">
+<link rel="help" href="https://github.com/w3c/payment-request/pull/591">
+<title>
+ PaymentRequestUpdateEvent.updateWith() needs to be called immediately
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({ explicit_done: true, explicit_timeout: true });
+const validMethod = Object.freeze({ supportedMethods: "basic-card" });
+const validMethods = Object.freeze([validMethod]);
+const validAmount = Object.freeze({ currency: "USD", value: "5.00" });
+const validTotal = Object.freeze({
+ label: "label",
+ amount: validAmount,
+});
+const validShippingOptionA = Object.freeze({
+ id: "a-shipping-option",
+ label: "A shipping option",
+ amount: validAmount,
+ selected: true,
+});
+const validShippingOptionB = Object.freeze({
+ id: "b-shipping-option",
+ label: "B shipping option",
+ amount: validAmount,
+});
+const validDetails = Object.freeze({
+ total: validTotal,
+ shippingOptions: [validShippingOptionA, validShippingOptionB],
+});
+const validOptions = Object.freeze({
+ requestShipping: true,
+});
+
+function testImmediateUpdate({ textContent: testName }) {
+ promise_test(async t => {
+ const request = new PaymentRequest(
+ validMethods,
+ validDetails,
+ validOptions
+ );
+ const eventPromise = new Promise((resolve, reject) => {
+ request.addEventListener(
+ "shippingaddresschange",
+ async ev => {
+ // spin the event loop, sets [[waitForUpdate]] to true.
+ await Promise.resolve();
+ try {
+ ev.updateWith(validDetails);
+ resolve(); // This is bad.
+ } catch (err) {
+ reject(err); // this is good.
+ }
+ },
+ { once: true }
+ );
+ });
+ const response = await request.show();
+ await promise_rejects(
+ t,
+ "InvalidStateError",
+ eventPromise,
+ "The event loop already spun, so [[waitForUpdate]] is now true"
+ );
+ await response.complete();
+ }, testName.trim());
+}
+
+function testSubsequentUpdateWithCalls({ textContent: testName }) {
+ promise_test(async t => {
+ const request = new PaymentRequest(
+ validMethods,
+ validDetails,
+ validOptions
+ );
+ const eventPromise = new Promise((resolve, reject) => {
+ request.addEventListener("shippingaddresschange", async ev => {
+ const p = Promise.resolve(validDetails);
+ ev.updateWith(p);
+ await p;
+ try {
+ ev.updateWith(validDetails);
+ resolve(); // this is bad, we should never get to here.
+ } catch (err) {
+ reject(err); // this is good!
+ }
+ });
+ });
+ const responsePromise = request.show();
+ await promise_rejects(
+ t,
+ "InvalidStateError",
+ eventPromise,
+ "Expected eventPromise to have rejected, because updateWith() was a called twice"
+ );
+ const response = await responsePromise;
+ await response.complete();
+ }, testName.trim());
+}
+
+function testRecycleEvents({ textContent: testName }) {
+ promise_test(async t => {
+ const request = new PaymentRequest(
+ validMethods,
+ validDetails,
+ validOptions
+ );
+
+ // Register both listeners.
+ const addressChangedPromise = new Promise(resolve => {
+ request.addEventListener("shippingaddresschange", resolve, {
+ once: true,
+ });
+ });
+
+ const optionChangedPromise = new Promise(resolve => {
+ request.addEventListener("shippingoptionchange", resolve, {
+ once: true,
+ });
+ });
+
+ const responsePromise = request.show();
+
+ // Let's wait for the address to change.
+ const addressChangeEvent = await addressChangedPromise;
+
+ // Sets [[waitingForUpdate]] to true.
+ addressChangeEvent.updateWith(validDetails);
+
+ // Let's wait for the shippingOption.
+ const optionChangeEvent = await optionChangedPromise;
+
+ // Here, we try to be sneaky, and reuse the addressChangeEvent to perform the update.
+ // However, addressChangeEvent [[waitingForUpdate]] is true, so it throws.
+ assert_throws(
+ "InvalidStateError",
+ () => {
+ addressChangeEvent.updateWith(validDetails);
+ },
+ "addressChangeEvent [[waitingForUpdate]] is true, so it must throw"
+ );
+
+ // But optionChangeEvent is still usable tho, so...
+ optionChangeEvent.updateWith(validDetails);
+
+ assert_throws(
+ "InvalidStateError",
+ () => {
+ optionChangeEvent.updateWith(validDetails);
+ },
+ "optionChangeEvent [[waitingForUpdate]] is true, so it must throw"
+ );
+
+ const response = await responsePromise;
+ await response.complete();
+ }, testName.trim());
+}
+</script>
+<h2>updateWith() method</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When the payment sheet is shown, select a different shipping address once. Then pay.
+</p>
+<ol>
+ <li id="test-0">
+ <button onclick="testImmediateUpdate(this);">
+ updateWith() must be called immediately, otherwise must throw an InvalidStateError.
+ </button>
+ </li>
+ <li id="test-1">
+ <button onclick="testSubsequentUpdateWithCalls(this);">
+ Once the event has performed an update, subsequent calls to updateWith() must throw InvalidStateError.
+ </button>
+ </li>
+ <li id="test-2">
+ <button onclick="testRecycleEvents(this);">
+ Recycling events must not be possible.
+ </button> When the payment sheet is shown, select a different shipping address once, then change shipping option once. Then pay.
+ </li>
+ <li>
+ <button onclick="done();">Done!</button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-duplicate-shipping-options-manual.https.html b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-duplicate-shipping-options-manual.https.html
new file mode 100644
index 00000000000..2f870a9838f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-duplicate-shipping-options-manual.https.html
@@ -0,0 +1,97 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#updatewith()-method">
+<title>
+ updateWith() method - duplicate shippingOption ids
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({ explicit_done: true, explicit_timeout: true });
+
+const validMethod = Object.freeze({ supportedMethods: "basic-card" });
+const validMethods = [validMethod];
+const validAmount = Object.freeze({
+ currency: "USD",
+ value: "5.00",
+});
+const validShippingOption = Object.freeze({
+ id: "option1",
+ label: "Option 1",
+ amount: validAmount,
+ selected: true,
+});
+const validShippingOptions = Object.freeze([validShippingOption]);
+const validDetails = Object.freeze({
+ total: {
+ label: "Total due",
+ amount: validAmount,
+ },
+ shippingOptions: validShippingOptions,
+});
+const validOptions = Object.freeze({
+ requestShipping: true,
+});
+
+test(() => {
+ try {
+ const request = new PaymentRequest(validMethods, validDetails);
+ } catch (err) {
+ done();
+ throw err;
+ }
+}, "Must construct a PaymentRequest (smoke test)");
+
+function testFireEvents(button) {
+ button.disabled = true;
+ promise_test(async t => {
+ const request = new PaymentRequest(
+ validMethods,
+ validDetails,
+ validOptions
+ );
+ request.addEventListener("shippingaddresschange", event => {
+ // Same option, so duplicate ids
+ const otherShippingOption = Object.assign({}, validShippingOption, {
+ id: "other",
+ });
+ const shippingOptions = [
+ validShippingOption,
+ otherShippingOption,
+ validShippingOption,
+ ];
+ const newDetails = Object.assign({}, validDetails, { shippingOptions });
+ event.updateWith(newDetails);
+ });
+ const acceptPromise = request.show();
+ await promise_rejects(
+ t,
+ new TypeError(),
+ acceptPromise,
+ "Duplicate shippingOption ids must abort with TypeError"
+ );
+ }, button.textContent.trim());
+ done();
+}
+</script>
+<h2>updateWith() method - duplicate shippingOptions ids</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When the payment sheet is shown, select a different shipping address.
+ If you have to manually abort the test from the payment sheet, then the
+ test has failed.
+</p>
+<ol>
+ <li>
+ <button onclick="testFireEvents(this)">
+ If there are duplicate shippingOption ids, then abort payment request.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-method-abort-update-manual.https.html b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-method-abort-update-manual.https.html
new file mode 100644
index 00000000000..dd3d8f1175d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-method-abort-update-manual.https.html
@@ -0,0 +1,269 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#dfn-abort-the-update">
+<title>
+ updateWith() method - "abort the update"
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({ explicit_done: true, explicit_timeout: true });
+
+// PaymentMethod
+const validMethod = Object.freeze({
+ supportedMethods: "valid-but-wont-ever-match",
+});
+
+const validMethodBasicCard = Object.freeze({
+ supportedMethods: "basic-card",
+});
+
+// Methods
+const validMethods = Object.freeze([validMethodBasicCard, validMethod]);
+
+// Amounts
+const validAmount = Object.freeze({
+ currency: "USD",
+ value: "1.00",
+});
+
+const invalidAmount = Object.freeze({
+ currency: "¡INVALID!",
+ value: "A1.0",
+});
+
+const negativeAmount = Object.freeze({
+ currency: "USD",
+ value: "-1.00",
+});
+
+// Totals
+const validTotal = Object.freeze({
+ label: "Valid Total",
+ amount: validAmount,
+});
+
+const invalidTotal = Object.freeze({
+ label: "Invalid Total",
+ amount: invalidAmount,
+});
+
+const invalidNegativeTotal = Object.freeze({
+ label: "Invalid negative total",
+ amount: negativeAmount,
+});
+
+// PaymentDetailsInit
+const validDetails = Object.freeze({
+ total: validTotal,
+});
+
+const invalidDetailsNegativeTotal = Object.freeze({
+ total: invalidNegativeTotal,
+});
+
+// PaymentOptions
+const validOptions = Object.freeze({
+ requestShipping: true,
+});
+
+// PaymentItem
+const validPaymentItem = Object.freeze({
+ amount: validAmount,
+ label: "Valid payment item",
+});
+
+const invalidPaymentItem = Object.freeze({
+ amount: invalidAmount,
+ label: "Invalid payment item",
+});
+
+// PaymentItem
+const validPaymentItems = Object.freeze([validPaymentItem]);
+const invalidPaymentItems = Object.freeze([invalidPaymentItem]);
+
+// PaymentShippingOption
+const invalidShippingOption = Object.freeze({
+ id: "abc",
+ label: "Invalid shipping option",
+ amount: invalidAmount,
+ selected: true,
+});
+
+// PaymentShippingOptions
+const validShippingOption = Object.freeze({
+ id: "abc",
+ label: "valid shipping option",
+ amount: validAmount,
+});
+
+const validShippingOptions = Object.freeze([validShippingOption]);
+const invalidShippingOptions = Object.freeze([invalidShippingOption]);
+
+// PaymentDetailsModifier
+const validModifier = Object.freeze({
+ additionalDisplayItems: validPaymentItems,
+ supportedMethods: "valid-but-wont-ever-match",
+ total: validTotal,
+});
+
+const modifierWithInvalidDisplayItems = Object.freeze({
+ additionalDisplayItems: invalidPaymentItems,
+ supportedMethods: "basic-card",
+ total: validTotal,
+});
+
+const modifierWithValidDisplayItems = Object.freeze({
+ additionalDisplayItems: validPaymentItems,
+ supportedMethods: "basic-card",
+ total: validTotal,
+});
+
+const modifierWithInvalidTotal = Object.freeze({
+ additionalDisplayItems: validPaymentItems,
+ supportedMethods: "basic-card",
+ total: invalidTotal,
+});
+
+const recursiveData = {};
+recursiveData.foo = recursiveData;
+Object.freeze(recursiveData);
+
+const modifierWithRecursiveData = Object.freeze({
+ supportedMethods: validMethodBasicCard,
+ total: validTotal,
+ data: recursiveData,
+});
+
+function testBadUpdate(button, badDetails, expectedError, errorCode) {
+ button.disabled = true;
+ promise_test(async t => {
+ const request = new PaymentRequest(
+ validMethods,
+ validDetails,
+ validOptions
+ );
+ request.onshippingaddresschange = event => {
+ event.updateWith(badDetails);
+ };
+ // First we check the bad update.
+ const acceptPromise = request.show();
+ await promise_rejects(
+ t,
+ expectedError,
+ acceptPromise,
+ "badDetails must cause acceptPromise to reject with expectedError"
+ );
+ // The request [[state]] is now "closed", so let's check for InvalidStateError
+ await promise_rejects(
+ t,
+ "InvalidStateError",
+ request.show(),
+ "show() must reject with InvalidStateError"
+ );
+ }, button.innerText.trim());
+}
+</script>
+<h2>updateWith() method - "abort the update"</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When the payment sheet is shown, change the shipping address.
+</p>
+<ol>
+ <li>
+ <button onclick="
+ const rejectedPromise = Promise.reject(new SyntaxError('test')).catch(err => err);
+ testBadUpdate(this, rejectedPromise, 'AbortError');
+ ">
+ Rejection of detailsPromise must abort the update with an "AbortError" DOMException.
+ </button>
+ </li>
+ <li>
+ <button onclick="
+ const invalidDetails = { total: `this will cause a TypeError!` };
+ testBadUpdate(this, invalidDetails, new TypeError());
+ ">
+ Total in the update is a string, so converting to IDL must abort the update with a TypeError.
+ </button>
+ </li>
+ <li>
+ <button onclick="
+ const invalidDetails = { total: recursiveData };
+ testBadUpdate(this, invalidDetails, new TypeError());
+ ">
+ Total is recursive, so converting to IDL must abort the update with a TypeError.
+ </button>
+ </li>
+ <li>
+ <button onclick="
+ testBadUpdate(this, invalidDetailsNegativeTotal, new TypeError());
+ ">
+ Updating with a negative total results in a TypeError.
+ </button>
+ </li>
+ <li>
+ <button onclick="
+ const badDetails = Object.assign({}, validDetails, { displayItems: invalidPaymentItems });
+ testBadUpdate(this, badDetails, new RangeError());
+ ">
+ Updating with a displayItem with an invalid currency results in TypeError.
+ </button>
+ </li>
+ <li>
+ <button onclick="
+ const duplicateShippingOptions = [validShippingOption, validShippingOption];
+ const badDetails = Object.assign({}, validDetails, { shippingOptions: duplicateShippingOptions });
+ testBadUpdate(this, badDetails, new TypeError());
+ ">
+ Updating with duplicate shippingOptions (same IDs) results in a TypeError.
+ </button>
+ </li>
+ <li>
+ <button onclick="
+ const badDetails = Object.assign({}, validDetails, { shippingOptions: invalidShippingOptions });
+ testBadUpdate(this, badDetails, new RangeError());
+ ">
+ Updating with a shippingOption with an invalid currency value results in a RangError.
+ </button>
+ </li>
+ <li>
+ <button onclick="
+ // validModifier is there as to avoid false positives - it should just get ignored
+ const badModifiers = { modifiers: [ modifierWithInvalidTotal, validModifier ] };
+ const badDetails = Object.assign({}, validDetails, badModifiers);
+ testBadUpdate(this, badDetails, new RangeError());
+ ">
+ Must throw a RangeError when a modifier's total item has an invalid currency.
+ </button>
+ </li>
+ <li>
+ <button onclick="
+ // validModifier is there as to avoid false positives - it should just get ignored
+ const badModifiers = { modifiers: [ modifierWithInvalidDisplayItems, validModifier ] };
+ const badDetails = Object.assign({}, validDetails, badModifiers);
+ testBadUpdate(this, badDetails, new RangeError());
+ ">
+ Must throw a RangeError when a modifier display item has an invalid currency.
+ </button>
+ </li>
+ <li>
+ <button onclick="
+ // validModifier is there as to avoid false positives - it should just get ignored
+ const badModifiers = { modifiers: [ modifierWithRecursiveData, validModifier ] };
+ const badDetails = Object.assign({}, validDetails, badModifiers);
+ testBadUpdate(this, badDetails, new TypeError());
+ ">
+ Must throw as Modifier has a recursive dictionary.
+ </button>
+ </li>
+ <li>
+ <button onclick="done();">Done!</button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-state-checks-manual.https.html b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-state-checks-manual.https.html
new file mode 100644
index 00000000000..fe887599c59
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updateWith-state-checks-manual.https.html
@@ -0,0 +1,115 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://www.w3.org/TR/payment-request/#updatewith()-method">
+<title>updateWith() method - state machine checks</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({ explicit_done: true, explicit_timeout: true });
+const validMethod = Object.freeze({ supportedMethods: "basic-card" });
+const validMethods = Object.freeze([validMethod]);
+const validAmount = Object.freeze({ currency: "USD", value: "5.00" });
+const validTotal = Object.freeze({
+ label: "label",
+ amount: validAmount,
+});
+const validShippingOption = Object.freeze({
+ id: "a-shipping-option",
+ label: "A shipping option",
+ amount: validAmount,
+ selected: true,
+});
+const validDetails = Object.freeze({
+ total: validTotal,
+ shippingOptions: [validShippingOption],
+});
+const validOptions = Object.freeze({
+ requestShipping: true,
+});
+
+function getPaymentPromises() {
+ const request = new PaymentRequest(validMethods, validDetails, validOptions);
+ const eventPromise = new Promise(resolve => {
+ request.addEventListener("shippingaddresschange", resolve);
+ });
+ const responsePromise = request.show();
+ return { eventPromise, responsePromise };
+}
+
+function testRequestIsClosed(button) {
+ button.disabled = "true";
+ promise_test(async t => {
+ const { eventPromise, responsePromise } = getPaymentPromises();
+ const event = await eventPromise;
+ // We are going to abort the responsePromise, so we can ignore error.
+ responsePromise.catch(err => err);
+ // Set request.[[state]] to closed
+ await event.target.abort();
+ assert_throws(
+ "InvalidStateError",
+ () => {
+ event.updateWith(validDetails);
+ },
+ "request.[[state]] is not interactive, must throw an InvalidStateError."
+ );
+ responsePromise.catch(err => err);
+ }, button.textContent.trim());
+}
+
+function testRequestIsUpdating(button) {
+ button.disabled = "true";
+ promise_test(async t => {
+ const { eventPromise, responsePromise } = getPaymentPromises();
+ const event = await eventPromise;
+ // We are going to put a promise into a pending state
+ // check that a second call to updateWith() throws,
+ // then resolve the pending promise below.
+ let resolver;
+ const pendingPromise = new Promise(resolve => {
+ resolver = resolve;
+ });
+ // Set request.[[updating]] to true
+ event.updateWith(pendingPromise);
+ assert_throws(
+ "InvalidStateError",
+ () => {
+ event.updateWith(validDetails);
+ },
+ "request.[[updating]] to true, must throw an InvalidStateError."
+ );
+ // We got the error we wanted, so let's resolve with valid details.
+ resolver(validDetails);
+ await pendingPromise;
+ await event.target.abort();
+ responsePromise.catch(err => err);
+ }, button.textContent.trim());
+}
+
+</script>
+<h2>updateWith() method - state machine checks</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When the payment sheet is shown, select a different shipping address once. Then pay.
+</p>
+<ol>
+ <li id="test-0">
+ <button onclick="testRequestIsClosed(this);">
+ When updateWith() is called, if request.[[state]] is not "interactive", then throw an " InvalidStateError" DOMException.
+ </button>
+ </li>
+ <li id="test-1">
+ <button onclick="testRequestIsUpdating(this);">
+ When updateWith() is called, If request.[[updating]] is true, then throw an "InvalidStateError" DOMException.
+ </button>
+ </li>
+ <li>
+ <button onclick="done();">Done!</button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updatewith-method.https.html b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updatewith-method.https.html
new file mode 100644
index 00000000000..adacdf3f06d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/PaymentRequestUpdateEvent/updatewith-method.https.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for PaymentRequestUpdateEvent's updateWith() method</title>
+<link rel="help" href="https://w3c.github.io/browser-payment-api/#updatewith-method">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const basicCard = Object.freeze({ supportedMethods: "basic-card" });
+const defaultMethods = Object.freeze([basicCard]);
+const defaultDetails = Object.freeze({
+ total: {
+ label: "Total",
+ amount: {
+ currency: "USD",
+ value: "1.00",
+ },
+ },
+});
+
+test(() => {
+ // Smoke test - checks target is set as expected
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ const ev = new PaymentRequestUpdateEvent("test");
+ request.dispatchEvent(ev);
+ assert_equals(ev.target, request, "The request and the target at the same");
+}, "Let target be the request which is dispatching the event.");
+
+// Github issue: https://github.com/w3c/browser-payment-api/issues/546
+test(() => {
+ const untrustedEvents = [
+ new PaymentRequestUpdateEvent("just a test"),
+ new PaymentRequestUpdateEvent("shippingaddresschange"),
+ new PaymentRequestUpdateEvent("shippingoptionchange"),
+ ].forEach(ev => {
+ assert_throws(
+ "InvalidStateError",
+ () => {
+ ev.updateWith(Promise.resolve());
+ },
+ `untrusted event of type "${ev.type}" must throw "InvalidStateError"`
+ );
+ });
+}, `Calling .updateWith() with an undispatched untrusted event throws "InvalidStateError"`);
+
+// Github issue: https://github.com/w3c/browser-payment-api/issues/546
+test(() => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ const untrustedEvents = [
+ new PaymentRequestUpdateEvent("just a test"),
+ new PaymentRequestUpdateEvent("shippingaddresschange"),
+ new PaymentRequestUpdateEvent("shippingoptionchange"),
+ ].map(ev => {
+ request.dispatchEvent(ev); // set .target and dispatch flag
+ // unstrusted event.
+ assert_throws(
+ "InvalidStateError",
+ () => {
+ ev.updateWith(Promise.resolve())
+ },
+ `untrusted event of type "${ev.type}" must throw "InvalidStateError"`
+ );
+ });
+}, `Calling .updateWith() with a dispatched, untrusted event, throws "InvalidStateError"`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/algorithms-manual.https.html b/tests/wpt/web-platform-tests/payment-request/algorithms-manual.https.html
new file mode 100644
index 00000000000..2e4140ae0d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/algorithms-manual.https.html
@@ -0,0 +1,166 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#algorithms">
+<title>
+ Payment Request algorithms
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({
+ explicit_done: true,
+ explicit_timeout: true,
+});
+const methods = [
+ {
+ supportedMethods: "basic-card",
+ },
+];
+const shippingOptions = {
+ shippingOptions: [
+ {
+ id: "fail",
+ label: "Option 1",
+ amount: {
+ currency: "USD",
+ value: "5.00",
+ },
+ selected: true,
+ },
+ {
+ id: "pass",
+ label: "Option 2",
+ amount: {
+ currency: "USD",
+ value: "5.00",
+ },
+ },
+ ],
+};
+
+const detailsNoShippingOptions = {
+ total: {
+ label: "Total due",
+ amount: {
+ currency: "USD",
+ value: "1.0",
+ },
+ },
+};
+
+const detailsWithShippingOptions = Object.assign(
+ {
+ total: {
+ label: "Total due",
+ amount: {
+ currency: "USD",
+ value: "1.0",
+ },
+ },
+ },
+ shippingOptions
+);
+
+const options = {
+ requestShipping: true,
+};
+
+function testFireEvent(button, details, eventName, expectRequestProps) {
+ button.disabled = true;
+ promise_test(async t => {
+ new PaymentRequest(methods, detailsNoShippingOptions, options);
+ const request = new PaymentRequest(methods, details, options);
+ const handlerPromise = new Promise(resolve => {
+ request[`on${eventName}`] = event => {
+ // "prevent immediate propagation" flag is set.
+ // This listener below won't fire!
+ event.updateWith(details);
+ resolve(event);
+ };
+ });
+ // This listener should never fire because the
+ // the event handler caused "prevent immediate propagation" to be set.
+ request.addEventListener(
+ eventName,
+ t.unreached_func("Second event listener should never fire")
+ );
+ const response = await request.show();
+ const event = await handlerPromise;
+ assert_true(
+ event instanceof window.PaymentRequestUpdateEvent,
+ "Expected instances of PaymentRequestUpdateEvent"
+ );
+ await response.complete("success");
+ }, button.textContent.trim());
+}
+
+async function runAbortTest(button) {
+ button.disabled = true;
+ const { textContent: testName } = button;
+ promise_test(async t => {
+ const request = new PaymentRequest(methods, detailsNoShippingOptions);
+ // Await the user to abort
+ await promise_rejects(t, "AbortError", request.show());
+ // [[state]] is now closed
+ await promise_rejects(t, "InvalidStateError", request.show());
+ }, testName.trim());
+}
+</script>
+<h2>
+ Tests for "algorithms" section
+</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<section>
+ <h3 id="abort-algo">
+ User aborts the payment request algorithm
+ </h3>
+ <link rel="help" href="https://w3c.github.io/payment-request/#user-aborts-the-payment-request-algorithm">
+ <p>
+ When presented with the payment sheet, abort the payment request (e.g., by hitting the esc key or pressing a UA provided button).
+ </p>
+ <ol>
+ <li>
+ <button onclick="runAbortTest(this);">
+ If the user aborts, the UA must run the user aborts the payment request algorithm.
+ </button>
+ </li>
+ </ol>
+</section>
+
+<section>
+ <h3 id="shipping-address-changed-algo">Shipping address changed algorithm</h3>
+ <link rel="help" href="https://www.w3.org/TR/payment-request/#shipping-address-changed-algorithm">
+ <p>
+ When prompted, please change or enter a new shipping address and then select Pay.
+ </p>
+ <ol>
+ <li>
+ <button onclick="testFireEvent(this, detailsWithShippingOptions, 'shippingaddresschange', {});">
+ The shipping address changed algorithm runs when the user provides a new shipping address.
+ </button>
+ </li>
+ </ol>
+</section>
+
+<section>
+ <h3 id="shipping-option-changed-algo">Shipping option changed algorithm</h3>
+ <link rel="help" href="https://w3c.github.io/payment-request/#shipping-option-changed-algorithm">
+ <p>
+ Finally, when prompted, please select "shipping option 2" and then select Pay.
+ </p>
+ <ol>
+ <li>
+ <button onclick="testFireEvent(this, detailsWithShippingOptions, 'shippingoptionchange', {}, 'pass'); done();">
+ The shipping option changed algorithm runs when the user chooses a new shipping option.
+ </button>
+ </li>
+ </ol>
+</section>
+
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html
index fbb80e3fe76..48f6d906632 100644
--- a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html
+++ b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-cross-origin.https.sub.html
@@ -7,7 +7,7 @@
<script>
async_test((t) => {
const iframe = document.getElementById('iframe');
- const paymentArgs = [[{supportedMethods: ['foo']}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}];
+ const paymentArgs = [[{supportedMethods: 'foo'}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}];
onload = () => {
const win = window[0];
diff --git a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-same-origin.https.html b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-same-origin.https.html
index 69a738ad4c1..bbcc026d527 100644
--- a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-same-origin.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/active-document-same-origin.https.html
@@ -6,7 +6,7 @@
<script>
async_test((t) => {
const iframe = document.getElementById('iframe');
- const paymentArgs = [[{supportedMethods: ['foo']}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}];
+ const paymentArgs = [[{supportedMethods: 'foo'}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}];
onload = () => {
const win = window[0];
diff --git a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/basic.https.html b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/basic.https.html
index 841880ef94f..80a6a2279d7 100644
--- a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/basic.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/basic.https.html
@@ -5,7 +5,7 @@
<iframe id="iframe" allowpaymentrequest></iframe>
<script>
async_test((t) => {
- const paymentArgs = [[{supportedMethods: ['foo']}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}];
+ const paymentArgs = [[{supportedMethods: 'foo'}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}];
onload = t.step_func_done(() => {
new window[0].PaymentRequest(...paymentArgs);
diff --git a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/echo-PaymentRequest.html b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/echo-PaymentRequest.html
index 15fa1a1ec67..f18b16ee31b 100644
--- a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/echo-PaymentRequest.html
+++ b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/echo-PaymentRequest.html
@@ -1,7 +1,7 @@
<!doctype html>
<script>
window.onmessage = (e) => {
- const paymentArgs = [[{supportedMethods: ['foo']}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}];
+ const paymentArgs = [[{supportedMethods: 'foo'}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}}];
if (e.data === 'What is the result of new PaymentRequest(...)?') {
const result = {urlQuery: location.search.substring(1)}; // Used to distinguish subtests
diff --git a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html
index 048b93a964b..090af39ed76 100644
--- a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html
+++ b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/removing-allowpaymentrequest.https.sub.html
@@ -14,25 +14,49 @@ async_test((t) => {
iframe.src = "https://{{domains[www1]}}:{{ports[https][0]}}" + path + "echo-PaymentRequest.html";
iframe.onload = t.step_func(() => {
if (i === 0) {
+ // 2. The iframe has now loaded (the first load).
+ // The allowpaymentrequest flag is set.
iframe.allowPaymentRequest = false;
+ // 3. The allowpaymentrequest attribute has now been removed.
+ // The allowpaymentrequest flag is *still set* for the document.
}
+ // 4. (first load) Ask the subdocument to invoke PaymentRequest and post back the result.
+ // (See below for steps 5 and 6.)
+ // 7. (second load) Ask the subdocument to invoke PaymentRequest and post back the result.
iframe.contentWindow.postMessage('What is the result of new PaymentRequest(...)?', '*');
});
window.onmessage = t.step_func((e) => {
i++;
if (i === 1) {
+ // 5. This is the first message we receive, from the first load.
+ // Since the allowpaymentrequest flag was set, we expect success.
assert_equals(e.data.message, 'Success', 'before navigation');
- // Navigate the iframe. This will fire a second 'load' event on the iframe.
+ // 6. Navigate the iframe. This will fire a second 'load' event on the iframe.
+ // At this time, the iframe does not have an allowpaymentrequest attribute.
+ // https://html.spec.whatwg.org/#the-location-interface:dom-location-href-3
+ // https://html.spec.whatwg.org/#location-object-setter-navigate
+ // https://html.spec.whatwg.org/#location-object-navigate
+ // https://html.spec.whatwg.org/#navigate step 12
+ // https://html.spec.whatwg.org/#process-a-navigate-response step 5
+ // https://html.spec.whatwg.org/#read-html
+ // https://html.spec.whatwg.org/#initialise-the-document-object step 8
+ // https://html.spec.whatwg.org/#set-the-allow*-flags step 3 does *not* set the allowpaymentrequest flag.
iframe.contentWindow.location.href = iframe.src + '?2';
} else {
+ // 8. This is the second message we receive, from the second load.
+ // Since the allowpaymentrequest flag was not set, we expect an exception.
assert_equals(e.data.message, 'Exception', 'after navigation');
assert_array_equals(e.data.details, [true /* ex instanceof DOMException*/, 18 /* ex.code */, 'SecurityError' /* ex.name */], 'after navigation');
t.done();
}
});
+ // 1. The browsing context for the iframe is created when the iframe is inserted to the document.
+ // https://html.spec.whatwg.org/#the-iframe-element:creating-a-new-browsing-context
+ // https://html.spec.whatwg.org/#creating-a-new-browsing-context step 11
+ // https://html.spec.whatwg.org/#set-the-allow*-flags step 3 sets the allowpaymentrequest flag.
document.body.appendChild(iframe);
});
</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html
index c7ed3aeab44..072b94f286e 100644
--- a/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html
+++ b/tests/wpt/web-platform-tests/payment-request/allowpaymentrequest/setting-allowpaymentrequest-timing.https.sub.html
@@ -6,6 +6,10 @@
<script>
// Set allowpaymentrequest attribute in a timeout after <iframe> has been inserted to the document.
// The iframe's response is delayed so it happens after the attribute is set.
+// The allowpaymentrequest flag is *not* set when the browsing context is created
+// (when the <iframe> is inserted), because there's no attribute at that time,
+// and the flag stays as not set when the attribute is added because per spec
+// the flag is only set when a browsing context is created and when it's navigated.
async_test((t) => {
const iframe = document.createElement('iframe');
@@ -19,7 +23,7 @@ async_test((t) => {
window.onmessage = t.step_func_done((e) => {
assert_equals(e.data.message, 'Exception');
- assert_array_equals(e.data.details, [true /* ex instanceof DOMException*/, 18 /* ex.code */, 'SecurityError' /* ex.name */]);
+ assert_array_equals(e.data.details, [true /* ex instanceof DOMException */, DOMException.SECURITY_ERR, 'SecurityError']);
});
document.body.appendChild(iframe);
diff --git a/tests/wpt/web-platform-tests/payment-request/change-shipping-option-manual.https.html b/tests/wpt/web-platform-tests/payment-request/change-shipping-option-manual.https.html
new file mode 100644
index 00000000000..eefc45f2921
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/change-shipping-option-manual.https.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for PaymentRequest shippingOption attribute</title>
+<link rel="help" href="https://w3c.github.io/payment-request/#shippingoption-attribute">
+<link rel="help" href="https://w3c.github.io/payment-request/#onshippingoptionchange-attribute">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({ explicit_done: true, explicit_timeout: true });
+const validMethod = Object.freeze({ supportedMethods: "basic-card" });
+const validMethods = Object.freeze([validMethod]);
+const validAmount = Object.freeze({ currency: "USD", value: "5.00" });
+const validTotal = Object.freeze({
+ label: "label",
+ amount: validAmount,
+});
+const validDetails = Object.freeze({ total: validTotal });
+
+const validShippingOption1 = Object.freeze({
+ id: "valid-1",
+ label: "PICK ME!",
+ amount: validAmount,
+ selected: false,
+});
+
+const validShippingOption2 = Object.freeze({
+ id: "initially-selected",
+ label: "Valid shipping option 2",
+ amount: validAmount,
+ selected: true,
+});
+
+const requestShipping = Object.freeze({
+ requestShipping: true,
+});
+
+function testShippingOptionChanged() {
+ promise_test(async t => {
+ const detailsWithShippingOptions = Object.assign({}, validDetails, {
+ shippingOptions: [validShippingOption1, validShippingOption2],
+ });
+ const request = new PaymentRequest(
+ validMethods,
+ detailsWithShippingOptions,
+ requestShipping
+ );
+ assert_equals(
+ request.shippingOption,
+ "initially-selected",
+ "Must be 'initially-selected', as the selected member is true"
+ );
+ const listenerPromise = new Promise(resolve => {
+ request.addEventListener("shippingoptionchange", () => {
+ resolve(request.shippingOption);
+ });
+ });
+ const handlerPromise = new Promise(resolve => {
+ request.onshippingoptionchange = () => {
+ resolve(request.shippingOption);
+ };
+ });
+ request.show().catch(err => err);
+
+ const results = await Promise.all([listenerPromise, handlerPromise]);
+ assert_true(
+ results.every(result => result === "valid-1"),
+ "Expected valid-1 as the shippingOption"
+ );
+ await request.abort();
+ });
+ done();
+}
+</script>
+
+<h2>PaymentRequest shippingOption attribute</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When the payment sheet is presented, select "PICK ME!" as the shipping option.
+</p>
+<ol>
+ <li>
+ <button onclick="testShippingOptionChanged()">
+ When the shipping option is manually changed, request.shippingOption represents the user's choice.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/historical.https.html b/tests/wpt/web-platform-tests/payment-request/historical.https.html
index ba518f45e17..b7880a2dee8 100644
--- a/tests/wpt/web-platform-tests/payment-request/historical.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/historical.https.html
@@ -24,4 +24,16 @@
assert_false(member in window[interf].prototype);
}, member + ' in ' + interf);
});
+
+// https://github.com/w3c/payment-request/pull/551
+test(() => {
+ const methods = [];
+ const expectedError = {name: 'toString should be called'};
+ const unexpectedError = {name: 'sequence<DOMString> conversion is not allowed'};
+ methods.toString = () => { throw expectedError; };
+ Object.defineProperty(methods, '0', { get: () => { throw unexpectedError; } });
+ assert_throws(expectedError, () => {
+ new PaymentRequest([{supportedMethods: methods}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}});
+ });
+}, 'supportedMethods must not support sequence<DOMString>');
</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/interfaces.https.html b/tests/wpt/web-platform-tests/payment-request/interfaces.https.html
index bca60a64830..bfbcad48afe 100644
--- a/tests/wpt/web-platform-tests/payment-request/interfaces.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/interfaces.https.html
@@ -5,136 +5,27 @@
<script src=/resources/testharnessreport.js></script>
<script src=/resources/WebIDLParser.js></script>
<script src=/resources/idlharness.js></script>
-<script type=text/plain class=untested>
-interface EventHandler {};
-interface Event {};
-interface EventInit {};
-interface EventTarget {};
-</script>
-<script type=text/plain>
-[Constructor(sequence<PaymentMethodData> methodData, PaymentDetailsInit details, optional PaymentOptions options),
- SecureContext]
-interface PaymentRequest : EventTarget {
- Promise<PaymentResponse> show();
- Promise<void> abort();
- Promise<boolean> canMakePayment();
-
- readonly attribute DOMString id;
- readonly attribute PaymentAddress? shippingAddress;
- readonly attribute DOMString? shippingOption;
- readonly attribute PaymentShippingType? shippingType;
-
- attribute EventHandler onshippingaddresschange;
-
- attribute EventHandler onshippingoptionchange;
-};
-dictionary PaymentMethodData {
- required sequence<DOMString> supportedMethods;
- object data;
-};
-dictionary PaymentCurrencyAmount {
- required DOMString currency;
- required DOMString value;
- DOMString currencySystem = "urn:iso:std:iso:4217";
-};
-dictionary PaymentDetailsBase {
- sequence<PaymentItem> displayItems;
- sequence<PaymentShippingOption> shippingOptions;
- sequence<PaymentDetailsModifier> modifiers;
-};
-dictionary PaymentDetailsInit : PaymentDetailsBase {
- DOMString id;
- required PaymentItem total;
-};
-dictionary PaymentDetailsUpdate : PaymentDetailsBase {
- DOMString error;
- PaymentItem total;
-};
-dictionary PaymentDetailsModifier {
- required sequence<DOMString> supportedMethods;
- PaymentItem total;
- sequence<PaymentItem> additionalDisplayItems;
- object data;
-};
-enum PaymentShippingType {
- "shipping",
- "delivery",
- "pickup"
-};
-dictionary PaymentOptions {
- boolean requestPayerName = false;
- boolean requestPayerEmail = false;
- boolean requestPayerPhone = false;
- boolean requestShipping = false;
- PaymentShippingType shippingType = "shipping";
-};
-dictionary PaymentItem {
- required DOMString label;
- required PaymentCurrencyAmount amount;
- boolean pending = false;
-};
-[SecureContext]
-interface PaymentAddress {
- serializer = {attribute};
- readonly attribute DOMString country;
- readonly attribute FrozenArray<DOMString> addressLine;
- readonly attribute DOMString region;
- readonly attribute DOMString city;
- readonly attribute DOMString dependentLocality;
- readonly attribute DOMString postalCode;
- readonly attribute DOMString sortingCode;
- readonly attribute DOMString languageCode;
- readonly attribute DOMString organization;
- readonly attribute DOMString recipient;
- readonly attribute DOMString phone;
-};
-dictionary PaymentShippingOption {
- required DOMString id;
- required DOMString label;
- required PaymentCurrencyAmount amount;
- boolean selected = false;
-};
-enum PaymentComplete {
- "fail",
- "success",
- "unknown"
-};
-[SecureContext]
-interface PaymentResponse {
- serializer = {attribute};
-
- readonly attribute DOMString requestId;
- readonly attribute DOMString methodName;
- readonly attribute object details;
- readonly attribute PaymentAddress? shippingAddress;
- readonly attribute DOMString? shippingOption;
- readonly attribute DOMString? payerName;
- readonly attribute DOMString? payerEmail;
- readonly attribute DOMString? payerPhone;
-
- Promise<void> complete(optional PaymentComplete result = "unknown");
-};
-[Constructor(DOMString type, optional PaymentRequestUpdateEventInit eventInitDict),
- SecureContext]
-interface PaymentRequestUpdateEvent : Event {
- void updateWith(Promise<PaymentDetailsUpdate> detailsPromise);
-};
-dictionary PaymentRequestUpdateEventInit : EventInit {
-};
-</script>
-
<script>
-"use strict";
-var idlArray = new IdlArray();
-[].forEach.call(document.querySelectorAll("script[type=text\\/plain]"), function(node) {
- if (node.className == "untested") {
- idlArray.add_untested_idls(node.textContent);
- } else {
- idlArray.add_idls(node.textContent);
+promise_test(async () => {
+ const idlURLs = ["/interfaces/dom.idl", "/interfaces/payment-request.idl"];
+ const idlArray = new IdlArray();
+ for(const url of idlURLs){
+ const idlText = await fetch(url).then(r => r.text());
+ idlArray.add_idls(idlText);
}
-});
-idlArray.add_objects({
- PaymentRequest: ["new PaymentRequest([{supportedMethods: ['foo']}], {total: {label: 'bar', amount: {currency: 'BAZ', value: '0'}}})"]
-});
-idlArray.test();
+ // typedef EventHandler from HTML
+ // https://html.spec.whatwg.org/#eventhandler
+ idlArray.add_idls(`
+ [TreatNonObjectAsNull]
+ callback EventHandlerNonNull = any (Event event);
+ typedef EventHandlerNonNull? EventHandler;
+ `);
+ const methods = "[{supportedMethods: 'foo'}]";
+ const amount = "{currency: 'USD', value: '0'}";
+ const details = `{total: {label: 'bar', amount: ${amount}} }`;
+ idlArray.add_objects({
+ PaymentRequest: [`new PaymentRequest(${methods}, ${details})`],
+ });
+ idlArray.test();
+}, "Setup for Payment Request API IDL tests.");
</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-abort-method.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-abort-method.https.html
index f59680013f5..8fc4bafcf04 100644
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-abort-method.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-abort-method.https.html
@@ -12,7 +12,7 @@ setup(() => {}, {
// not being explicitly handled.
allow_uncaught_exception: true,
});
-const basicCard = Object.freeze({ supportedMethods: ["basic-card"] });
+const basicCard = Object.freeze({ supportedMethods: "basic-card" });
const defaultMethods = Object.freeze([basicCard]);
const defaultDetails = Object.freeze({
total: {
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-canmakepayment-method.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-canmakepayment-method.https.html
new file mode 100644
index 00000000000..c85c7f778ea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-canmakepayment-method.https.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Tests for PaymentRequest.canMakePayment() method</title>
+<link rel="help" href="https://w3c.github.io/browser-payment-api/#show-method">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const basicCard = Object.freeze({ supportedMethods: "basic-card" });
+const defaultMethods = Object.freeze([basicCard]);
+const defaultDetails = Object.freeze({
+ total: {
+ label: "Total",
+ amount: {
+ currency: "USD",
+ value: "1.00",
+ },
+ },
+});
+
+promise_test(async t => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ try {
+ assert_true(
+ await request.canMakePayment(),
+ `canMakePaymentPromise should be true`
+ );
+ assert_true(
+ await request.canMakePayment(),
+ `canMakePaymentPromise should be true`
+ );
+ } catch (err) {
+ assert_equals(
+ err.name,
+ "NotAllowedError",
+ "if it throws, then it must be a NotAllowedError."
+ );
+ }
+}, `If request.[[state]] is "created", then return a promise that resolves to true for known method.`);
+
+promise_test(async t => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ const acceptPromise = request.show(); // Sets state to "interactive"
+ const canMakePaymentPromise = request.canMakePayment();
+ try {
+ const result = await canMakePaymentPromise;
+ assert_true(
+ false,
+ `canMakePaymentPromise should have thrown InvalidStateError`
+ );
+ } catch (err) {
+ await promise_rejects(t, "InvalidStateError", canMakePaymentPromise);
+ } finally {
+ await request.abort();
+ await promise_rejects(t, "AbortError", acceptPromise);
+ }
+ // The state should be "closed"
+ await promise_rejects(t, "InvalidStateError", request.canMakePayment());
+}, `If request.[[state]] is "interactive", then return a promise rejected with an "InvalidStateError" DOMException.`);
+
+promise_test(async t => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ const acceptPromise = request.show(); // The state is now "interactive"
+ acceptPromise.catch(() => {}); // no-op, just to silence unhandled rejection in devtools.
+ await request.abort(); // The state is now "closed"
+ await promise_rejects(t, "InvalidStateError", request.canMakePayment());
+ try {
+ const result = await request.canMakePayment();
+ assert_true(
+ false,
+ `should have thrown InvalidStateError, but instead returned "${result}"`
+ );
+ } catch (err) {
+ assert_equals(
+ err.name,
+ "InvalidStateError",
+ "must be an InvalidStateError."
+ );
+ }
+}, `If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException.`);
+
+promise_test(async t => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ assert_true(await request.canMakePayment(), "basic-card should be supported");
+}, `If payment method identifier and serialized parts are supported, resolve promise with true.`);
+
+promise_test(async t => {
+ const unsupportedMethods = [
+ "this-is-not-supported",
+ "https://not.supported",
+ "e",
+ "n6jzof05mk2g4lhxr-u-q-w1-c-i-pa-ty-bdvs9-ho-ae7-p-md8-s-wq3-h-qd-e-q-sa",
+ "a-b-q-n-s-pw0",
+ "m-u",
+ "s-l5",
+ "k9-f",
+ "m-l",
+ "u4-n-t",
+ "i488jh6-g18-fck-yb-v7-i",
+ "x-x-t-t-c34-o",
+ "https://wpt",
+ "https://wpt.fyi/",
+ "https://wpt.fyi/payment",
+ "https://wpt.fyi/payment-request",
+ "https://wpt.fyi/payment-request?",
+ "https://wpt.fyi/payment-request?this=is",
+ "https://wpt.fyi/payment-request?this=is&totally",
+ "https://wpt.fyi:443/payment-request?this=is&totally",
+ "https://wpt.fyi:443/payment-request?this=is&totally#fine",
+ "https://:@wpt.fyi:443/payment-request?this=is&totally#👍",
+ " \thttps://wpt\n ",
+ "https://xn--c1yn36f",
+ "https://點看",
+ ];
+ for (const method of unsupportedMethods) {
+ try {
+ const request = new PaymentRequest(
+ [{ supportedMethods: method }],
+ defaultDetails
+ );
+ assert_false(
+ await request.canMakePayment(),
+ `method "${method}" must not be supported`
+ );
+ } catch (err) {
+ assert_true(
+ false,
+ `Unexpected exception testing method ${method}, expected false. See error console.`
+ );
+ }
+ }
+}, `If payment method identifier is unknown, resolve promise with false.`);
+
+promise_test(async t => {
+ // This test might never actually hit its assertion, but that's allowed.
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ for (let i = 0; i < 1000; i++) {
+ try {
+ await request.canMakePayment();
+ } catch (err) {
+ assert_equals(
+ err.name,
+ "NotAllowedError",
+ "if it throws, then it must be a NotAllowedError."
+ );
+ break;
+ }
+ }
+ for (let i = 0; i < 1000; i++) {
+ try {
+ await new PaymentRequest(defaultMethods, defaultDetails).canMakePayment();
+ } catch (err) {
+ assert_equals(
+ err.name,
+ "NotAllowedError",
+ "if it throws, then it must be a NotAllowedError."
+ );
+ break;
+ }
+ }
+}, `Optionally, at the user agent's discretion, return a promise rejected with a "NotAllowedError" DOMException.`);
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-canmakepayment-method.https.http b/tests/wpt/web-platform-tests/payment-request/payment-request-canmakepayment-method.https.http
deleted file mode 100644
index 86fae2effb1..00000000000
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-canmakepayment-method.https.http
+++ /dev/null
@@ -1,148 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<meta charset="utf-8">
-<title>Tests for PaymentRequest.canMakePayment() method</title>
-<link rel="help" href="https://w3c.github.io/browser-payment-api/#show-method">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-const basicCard = Object.freeze({ supportedMethods: ["basic-card"] });
-const defaultMethods = Object.freeze([basicCard]);
-const defaultDetails = Object.freeze({
- total: {
- label: "Total",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
-});
-
-promise_test(async t => {
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- try {
- assert_true(
- await request.canMakePayment(),
- `canMakePaymentPromise should be true`
- );
- assert_true(
- await request.canMakePayment(),
- `canMakePaymentPromise should be true`
- );
- } catch (err) {
- assert_equal(
- err.name,
- "NotAllowedError",
- "if it throws, then it must be a NotAllowedError."
- );
- }
-}, `If request.[[state]] is "created", then return a promise that resolves to true for known method.`);
-
-promise_test(async t => {
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- const acceptPromise = request.show(); // Sets state to "interactive"
- const canMakePaymentPromise = request.canMakePayment();
- try {
- const result = await canMakePaymentPromise;
- assert_true(
- false,
- `canMakePaymentPromise should have thrown InvalidStateError`
- );
- } catch (err) {
- await promise_rejects(t, "InvalidStateError", canMakePaymentPromise);
- } finally {
- await request.abort();
- await promise_rejects(t, "AbortError", acceptPromise);
- }
- // The state should be "closed"
- await promise_rejects(t, "InvalidStateError", request.canMakePayment());
-}, `If request.[[state]] is "interactive", then return a promise rejected with an "InvalidStateError" DOMException.`);
-
-promise_test(async t => {
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- const acceptPromise = request.show(); // The state is now "interactive"
- acceptPromise.catch(() => {}); // no-op, just to silence unhandled rejection in devtools.
- await request.abort(); // The state is now "closed"
- await promise_rejects(t, "InvalidStateError", request.canMakePayment());
- try {
- const result = await request.canMakePayment();
- assert_true(
- false,
- `should have thrown InvalidStateError, but instead returned "${result}"`
- );
- } catch (err) {
- assert_equal(
- err.name,
- "InvalidStateError",
- "must be an InvalidStateError."
- );
- }
-}, `If request.[[state]] is "closed", then return a promise rejected with an "InvalidStateError" DOMException.`);
-
-promise_test(async t => {
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- assert_true(await request.canMakePayment(), "basic-card should be supported");
-}, `If payment method identifier and serialized parts are supported, resolve promise with true.`);
-
-promise_test(async t => {
- const unsupportedMethods = [
- "this-is-not-supported",
- "https://not.supported",
- "basic-card?not-really",
- "basic-card://not-ok",
- "basic card",
- "/basic card/",
- "BaSicCarD",
- "BASIC-CARD",
- " basic-card ",
- "this is not supported",
- " ",
- ];
- for (const method of unsupportedMethods) {
- try {
- const request = new PaymentRequest(
- [{ supportedMethods: [method] }],
- defaultDetails
- );
- assert_false(
- await request.canMakePayment(),
- `method "${method}" must not be supported`
- );
- } catch (err) {
- assert_true(
- false,
- `Unexpected exception testing method ${method}, expected false. See error console.`
- );
- }
- }
-}, `If payment method identifier is unknown, resolve promise with false.`);
-
-promise_test(async t => {
- // This test might never actually hit its assertion, but that's allowed.
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- for (let i = 0; i < 1000; i++) {
- try {
- await request.canMakePayment();
- } catch (err) {
- assert_equal(
- err.name,
- "NotAllowedError",
- "if it throws, then it must be a NotAllowedError."
- );
- break;
- }
- }
- for (let i = 0; i < 1000; i++) {
- try {
- await new PaymentRequest(defaultMethods, defaultDetails).canMakePayment();
- } catch (err) {
- assert_equal(
- err.name,
- "NotAllowedError",
- "if it throws, then it must be a NotAllowedError."
- );
- break;
- }
- }
-}, `Optionally, at the user agent's discretion, return a promise rejected with a "NotAllowedError" DOMException.`);
-</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-constructor-crash.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-constructor-crash.https.html
index 8ca0a4794dd..1d0b88d2a1c 100644
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-constructor-crash.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-constructor-crash.https.html
@@ -1,5 +1,6 @@
<!DOCTYPE html>
<meta charset="utf-8">
+<meta name="timeout" content="long">
<title>Crash tests PaymentRequest Constructor</title>
<link rel="help" href="https://w3c.github.io/browser-payment-api/#constructor">
<script src="/resources/testharness.js"></script>
@@ -9,7 +10,7 @@
dictionary PaymentItem {
required DOMString label;
required PaymentCurrencyAmount amount;
- boolean pending = false;
+ boolean pending = false;
};
dictionary PaymentDetailsBase {
@@ -28,7 +29,7 @@
const ABUSIVE_AMOUNT = 100000;
const basicCard = Object.freeze({
- supportedMethods: ["basic-card"],
+ supportedMethods: "basic-card",
});
const defaultAmount = Object.freeze({
@@ -92,28 +93,28 @@ test(() => {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
assert_true(true, "Didn't crash");
-}, "Don't crash if there is a abusive number of payment methods in the methodData sequence");
+}, "Don't crash if there is an abusive number of payment methods in the methodData sequence");
+// PaymentMethodData.supportedMethods
test(() => {
- let supportedMethods = ["basic-card"];
+ const supportedMethods = "basic-card";
// Smoke test
try {
new PaymentRequest([{ supportedMethods }], defaultDetails);
} catch (err) {
assert_true(false, "failed smoke test: " + err.stack);
}
- // Now, let's add an abusive number of supportedMethods to a single PaymentMethodData
- for (let i = 0; i < ABUSIVE_AMOUNT; i++) {
- supportedMethods.push(`https://example.com/${i}/evil_${Math.random()}`);
- }
- const evilMethodData = [{ supportedMethods }];
+ // Now, we make supportedMethods super large
+ const evilMethodData = [{
+ supportedMethods: supportedMethods.repeat(ABUSIVE_AMOUNT),
+ }];
try {
new PaymentRequest(evilMethodData, defaultDetails);
} catch (err) {
assert_equals(err.name, "TypeError", "must be a TypeError");
}
assert_true(true, "Didn't crash");
-}, "Don't crash if there is a abusive number of supported methods in one sequence");
+}, "Don't crash if PaymentMethodData.supportedMethods is an abusive length");
// PaymentDetailsInit.id
test(() => {
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-constructor.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-constructor.https.html
index 971622e8a32..e4e1292f2b9 100644
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-constructor.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-constructor.https.html
@@ -7,30 +7,51 @@
<script src="/resources/testharnessreport.js"></script>
<script>
"use strict";
-const basicCard = Object.freeze({ supportedMethods: ["basic-card"] });
-const defaultMethods = Object.freeze([basicCard]);
+const testMethod = Object.freeze({
+ supportedMethods: "https://wpt.fyi/payment-request",
+});
+const defaultMethods = Object.freeze([testMethod]);
+const defaultAmount = Object.freeze({
+ currency: "USD",
+ value: "1.0",
+});
+const defaultTotal = Object.freeze({
+ label: "Default Total",
+ amount: defaultAmount,
+});
const defaultDetails = Object.freeze({
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
+ total: defaultTotal,
});
+// Avoid false positives, this should always pass
+function smokeTest() {
+ new PaymentRequest(defaultMethods, defaultDetails);
+}
test(() => {
+ smokeTest();
const request = new PaymentRequest(defaultMethods, defaultDetails);
- assert_true(!!request.id, "must be some truthy value");
-}, "If details.id is missing, assign a identifier");
+ assert_true(Boolean(request.id), "must be some truthy value");
+}, "If details.id is missing, assign an identifier");
test(() => {
+ smokeTest();
const request1 = new PaymentRequest(defaultMethods, defaultDetails);
const request2 = new PaymentRequest(defaultMethods, defaultDetails);
assert_not_equals(request1.id, request2.id, "UA generated ID must be unique");
+ const seen = new Set();
+ // Let's try creating lots of requests, and make sure they are all unique
+ for (let i = 0; i < 1024; i++) {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ assert_false(
+ seen.has(request.id),
+ `UA generated ID must be unique, but got duplicate! (${request.id})`
+ );
+ seen.add(request.id);
+ }
}, "If details.id is missing, assign a unique identifier");
test(() => {
+ smokeTest();
const newDetails = Object.assign({}, defaultDetails, { id: "test123" });
const request1 = new PaymentRequest(defaultMethods, newDetails);
const request2 = new PaymentRequest(defaultMethods, newDetails);
@@ -40,6 +61,7 @@ test(() => {
}, "If the same id is provided, then use it");
test(() => {
+ smokeTest();
const newDetails = Object.assign({}, defaultDetails, {
id: "".padStart(1024, "a"),
});
@@ -52,194 +74,73 @@ test(() => {
}, "Use ids even if they are strange");
test(() => {
- assert_equals(
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
- {
- id: "foo",
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- }
- ).id,
- "foo"
+ smokeTest();
+ const request = new PaymentRequest(
+ defaultMethods,
+ Object.assign({}, defaultDetails, { id: "foo" })
);
+ assert_equals(request.id, "foo");
}, "Use provided request ID");
test(() => {
- assert_throws(
- {
- name: "TypeError",
- },
- () => {
- new PaymentRequest([], {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- });
- }
- );
+ smokeTest();
+ assert_throws(new TypeError(), () => new PaymentRequest([], defaultDetails));
}, "If the length of the methodData sequence is zero, then throw a TypeError");
test(() => {
- assert_throws(
- {
- name: "TypeError",
- },
- () => {
- new PaymentRequest(
- [
- {
- supportedMethods: [],
- },
- ],
+ smokeTest();
+ const JSONSerializables = [[], { object: {} }];
+ for (const data of JSONSerializables) {
+ try {
+ const methods = [
{
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- }
+ supportedMethods: "https://wpt.fyi/payment-request",
+ data,
+ },
+ ];
+ new PaymentRequest(methods, defaultDetails);
+ } catch (err) {
+ assert_unreached(
+ `Unexpected error parsing stringifiable JSON: ${JSON.stringify(
+ data
+ )}: ${err.message}`
);
}
- );
-}, "If the length of the paymentMethod.supportedMethods sequence is zero, " + "then throw a TypeError");
-
-test(() => {
- let itThrows = false;
- try {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- data: ["some-data"],
- },
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- }
- );
- } catch (err) {
- itThrows = true;
}
- assert_false(itThrows, "shouldn't throw when using a list");
-}, "Method data must be JSON-serializable object (a list in this case)");
+}, "Modifier method data must be JSON-serializable object");
test(() => {
- new PaymentRequest(
- [
+ smokeTest();
+ const recursiveDictionary = {};
+ recursiveDictionary.foo = recursiveDictionary;
+ assert_throws(new TypeError(), () => {
+ const methods = [
{
- supportedMethods: ["basic-card"],
- data: {
- some: "data",
- },
+ supportedMethods: "https://wpt.fyi/payment-request",
+ data: recursiveDictionary,
},
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
+ ];
+ new PaymentRequest(methods, defaultDetails);
+ });
+ assert_throws(new TypeError(), () => {
+ const methods = [
+ {
+ supportedMethods: "https://wpt.fyi/payment-request",
+ data: "a string",
},
- }
- );
-}, "Method data must be JSON-serializable object (an object in this case)");
-
-test(() => {
- const recursiveDictionary = {};
- recursiveDictionary.foo = recursiveDictionary;
- assert_throws(
- {
- name: "TypeError",
- },
- () => {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- data: recursiveDictionary,
- },
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- }
- );
- }
- );
- assert_throws(
- {
- name: "TypeError",
- },
- () => {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- data: "a string",
- },
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- }
- );
- }
- );
+ ];
+ new PaymentRequest(methods, defaultDetails);
+ });
assert_throws(
- {
- name: "TypeError",
- },
+ new TypeError(),
() => {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- data: null,
- },
- ],
+ const methods = [
{
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- }
- );
+ supportedMethods: "https://wpt.fyi/payment-request",
+ data: null,
+ },
+ ];
+ new PaymentRequest(methods, defaultDetails);
},
"Even though null is JSON-serializable, it's not type 'Object' per ES spec"
);
@@ -277,128 +178,93 @@ const invalidTotalAmounts = invalidAmounts.concat([
"-1.00",
"-1000.000",
]);
-for (const amount of invalidTotalAmounts) {
- test(() => {
- assert_throws(
- {
- name: "TypeError",
+test(() => {
+ smokeTest();
+ for (const invalidAmount of invalidTotalAmounts) {
+ const invalidDetails = {
+ total: {
+ label: "",
+ amount: {
+ currency: "USD",
+ value: invalidAmount,
+ },
},
+ };
+ assert_throws(
+ new TypeError(),
() => {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: amount,
- },
- },
- }
- );
- }
+ new PaymentRequest(defaultMethods, invalidDetails);
+ },
+ `Expect TypeError when details.total.amount.value is ${invalidAmount}`
);
- }, `If details.total.amount.value is not a valid decimal monetary value (in this case "${amount}"), then throw a TypeError`);
-}
+ }
+}, `If details.total.amount.value is not a valid decimal monetary value, then throw a TypeError`);
-for (const prop in ["displayItems", "shippingOptions", "modifiers"]) {
- test(() => {
+test(() => {
+ smokeTest();
+ for (const prop in ["displayItems", "shippingOptions", "modifiers"]) {
try {
const details = Object.assign({}, defaultDetails, { [prop]: [] });
new PaymentRequest(defaultMethods, details);
- } catch (err) {
- assert_true(false, `${prop} can be zero length`);
- }
- }, `PaymentDetailsBase.${prop} can be 0 length`);
-}
+ assert_unreached(`PaymentDetailsBase.${prop} can be zero length`);
+ } catch (err) {}
+ }
+}, `PaymentDetailsBase members can be 0 length`);
test(() => {
- assert_throws(
- {
- name: "TypeError",
- },
- () => {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "-1.00",
- },
- },
- }
- );
- }
- );
+ smokeTest();
+ assert_throws(new TypeError(), () => {
+ new PaymentRequest(defaultMethods, {
+ total: {
+ label: "",
+ amount: {
+ currency: "USD",
+ value: "-1.00",
+ },
+ },
+ });
+ });
}, "If the first character of details.total.amount.value is U+002D HYPHEN-MINUS, then throw a TypeError");
-for (const amount of invalidAmounts) {
- test(() => {
+test(() => {
+ smokeTest();
+ for (const invalidAmount of invalidAmounts) {
+ const invalidDetails = {
+ total: defaultAmount,
+ displayItems: [
+ {
+ label: "",
+ amount: {
+ currency: "USD",
+ value: invalidAmount,
+ },
+ },
+ ],
+ };
assert_throws(
- {
- name: "TypeError",
- },
+ new TypeError(),
() => {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- displayItems: [
- {
- label: "",
- amount: {
- currency: "USD",
- value: amount,
- },
- },
- ],
- }
- );
- }
+ new PaymentRequest(defaultMethods, invalidDetails);
+ },
+ `Expected TypeError when item.amount.value is "${invalidAmount}"`
);
- }, "For each item in details.displayItems: if item.amount.value is not " + 'a valid decimal monetary value (in this case "' + amount + '"), then throw a TypeError');
-}
+ }
+}, `For each item in details.displayItems: if item.amount.value is not a valid decimal monetary value, then throw a TypeError`);
test(() => {
- let itThrows = false;
+ smokeTest();
try {
new PaymentRequest(
[
{
- supportedMethods: ["basic-card"],
+ supportedMethods: "https://wpt.fyi/payment-request",
data: {
supportedTypes: ["debit"],
},
},
],
{
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
+ total: defaultTotal,
displayItems: [
{
label: "",
@@ -418,59 +284,50 @@ test(() => {
}
);
} catch (err) {
- itThrows = true;
+ assert_unreached(
+ `shouldn't throw when given a negative value: ${err.message}`
+ );
}
- assert_false(itThrows, "shouldn't throw when given a negative value");
}, "Negative values are allowed for displayItems.amount.value, irrespective of total amount");
test(() => {
- let itThrows = false;
+ smokeTest();
const largeMoney = "1".repeat(510);
-
try {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
+ new PaymentRequest(defaultMethods, {
+ total: {
+ label: "",
+ amount: {
+ currency: "USD",
+ value: `${largeMoney}.${largeMoney}`,
},
- ],
- {
- total: {
+ },
+ displayItems: [
+ {
label: "",
amount: {
currency: "USD",
- value: `${largeMoney}.${largeMoney}`,
+ value: `-${largeMoney}`,
},
},
- displayItems: [
- {
- label: "",
- amount: {
- currency: "USD",
- value: `-${largeMoney}`,
- },
- },
- {
- label: "",
- amount: {
- currency: "AUD",
- value: `-${largeMoney}.${largeMoney}`,
- },
+ {
+ label: "",
+ amount: {
+ currency: "AUD",
+ value: `-${largeMoney}.${largeMoney}`,
},
- ],
- }
- );
+ },
+ ],
+ });
} catch (err) {
- itThrows = true;
+ assert_unreached(
+ `shouldn't throw when given absurd monetary values: ${err.message}`
+ );
}
- assert_false(itThrows, "shouldn't throw when given absurd monetary values");
}, "it handles high precision currency values without throwing");
// Process shipping options:
-const defaultAmount = Object.freeze({
- currency: "USD",
- value: "0.0",
-});
+
const defaultShippingOption = Object.freeze({
id: "default",
label: "",
@@ -481,51 +338,88 @@ const defaultShippingOptions = Object.freeze([
Object.assign({}, defaultShippingOption),
]);
-for (const amount of invalidAmounts) {
- test(() => {
+test(() => {
+ smokeTest();
+ for (const amount of invalidAmounts) {
+ const invalidAmount = Object.assign({}, defaultAmount, {
+ value: amount,
+ });
+ const invalidShippingOption = Object.assign({}, defaultShippingOption, {
+ amount: invalidAmount,
+ });
+ const details = Object.assign({}, defaultDetails, {
+ shippingOptions: [invalidShippingOption],
+ });
assert_throws(
- {
- name: "TypeError",
- },
+ new TypeError(),
() => {
- const invalidAmount = Object.assign({}, defaultAmount, {
- value: amount,
- });
- const invalidShippingOption = Object.assign({}, defaultShippingOption, {
- amount: invalidAmount,
- });
- const details = Object.assign({}, defaultDetails, {
- shippingOptions: [invalidShippingOption],
- });
- new PaymentRequest(defaultMethods, details);
- }
+ new PaymentRequest(defaultMethods, details, { requestShipping: true });
+ },
+ `Expected TypeError for option.amount.value: "${amount}"`
);
- }, "For each option in details.shippingOptions: if option.amount.value is not " + 'a valid decimal monetary value (in this case "' + amount + '"), then throw a TypeError');
-}
+ }
+}, `For each option in details.shippingOptions: if option.amount.value is not a valid decimal monetary value, then throw a TypeError`);
test(() => {
+ smokeTest();
const shippingOptions = [defaultShippingOption];
const details = Object.assign({}, defaultDetails, { shippingOptions });
const request = new PaymentRequest(defaultMethods, details);
assert_equals(
request.shippingOption,
null,
- "request.shippingOption must be null"
+ "shippingOption must be null, as requestShipping is missing"
+ );
+ // defaultDetails lacks shipping options
+ const request2 = new PaymentRequest(defaultMethods, defaultDetails, {
+ requestShipping: true,
+ });
+ assert_equals(
+ request2.shippingOption,
+ null,
+ `request2.shippingOption must be null`
);
}, "If there is no selected shipping option, then PaymentRequest.shippingOption remains null");
test(() => {
+ smokeTest();
const selectedOption = Object.assign({}, defaultShippingOption, {
selected: true,
- id: "PASS",
+ id: "the-id",
});
const shippingOptions = [selectedOption];
const details = Object.assign({}, defaultDetails, { shippingOptions });
- const request = new PaymentRequest(defaultMethods, details);
- assert_equals(request.shippingOption, "PASS", "selected option must be PASS");
-}, "If there is a selected shipping option, then it becomes synchronously selected");
+ const requestNoShippingRequested1 = new PaymentRequest(
+ defaultMethods,
+ details
+ );
+ assert_equals(
+ requestNoShippingRequested1.shippingOption,
+ null,
+ "Must be null when no shipping is requested (defaults to false)"
+ );
+ const requestNoShippingRequested2 = new PaymentRequest(
+ defaultMethods,
+ details,
+ { requestShipping: false }
+ );
+ assert_equals(
+ requestNoShippingRequested2.shippingOption,
+ null,
+ "Must be null when requestShipping is false"
+ );
+ const requestWithShipping = new PaymentRequest(defaultMethods, details, {
+ requestShipping: "truthy value",
+ });
+ assert_equals(
+ requestWithShipping.shippingOption,
+ "the-id",
+ "Selected option must be 'the-id'"
+ );
+}, "If there is a selected shipping option, and requestShipping is set, then that option becomes synchronously selected");
test(() => {
+ smokeTest();
const failOption1 = Object.assign({}, defaultShippingOption, {
selected: true,
id: "FAIL1",
@@ -536,15 +430,30 @@ test(() => {
});
const passOption = Object.assign({}, defaultShippingOption, {
selected: true,
- id: "PASS",
+ id: "the-id",
});
const shippingOptions = [failOption1, failOption2, passOption];
const details = Object.assign({}, defaultDetails, { shippingOptions });
- const request = new PaymentRequest(defaultMethods, details);
- assert_equals(request.shippingOption, "PASS", "selected option must PASS");
-}, "If there is a multiple selected shipping options, only the last is selected");
+ const requestNoShipping = new PaymentRequest(defaultMethods, details, {
+ requestShipping: false,
+ });
+ assert_equals(
+ requestNoShipping.shippingOption,
+ null,
+ "shippingOption must be null, as requestShipping is false"
+ );
+ const requestWithShipping = new PaymentRequest(defaultMethods, details, {
+ requestShipping: true,
+ });
+ assert_equals(
+ requestWithShipping.shippingOption,
+ "the-id",
+ "selected option must 'the-id"
+ );
+}, "If requestShipping is set, and if there is a multiple selected shipping options, only the last is selected.");
test(() => {
+ smokeTest();
const selectedOption = Object.assign({}, defaultShippingOption, {
selected: true,
});
@@ -553,290 +462,181 @@ test(() => {
});
const shippingOptions = [selectedOption, unselectedOption];
const details = Object.assign({}, defaultDetails, { shippingOptions });
- const request = new PaymentRequest(defaultMethods, details);
- assert_equals(request.shippingOption, null, "selected option must be null");
-}, "If there are any duplicate shipping option ids, then there are no shipping options");
+ const requestNoShipping = new PaymentRequest(defaultMethods, details);
+ assert_equals(
+ requestNoShipping.shippingOption,
+ null,
+ "shippingOption must be null, because requestShipping is false"
+ );
+ assert_throws(
+ new TypeError(),
+ () => {
+ new PaymentRequest(defaultMethods, details, { requestShipping: true });
+ },
+ "Expected to throw a TypeError because duplicate IDs"
+ );
+}, "If there are any duplicate shipping option ids, and shipping is requested, then throw a TypeError");
+
+test(() => {
+ smokeTest();
+ const dupShipping1 = Object.assign({}, defaultShippingOption, {
+ selected: true,
+ id: "DUPLICATE",
+ label: "Fail 1",
+ });
+ const dupShipping2 = Object.assign({}, defaultShippingOption, {
+ selected: false,
+ id: "DUPLICATE",
+ label: "Fail 2",
+ });
+ const shippingOptions = [dupShipping1, defaultShippingOption, dupShipping2];
+ const details = Object.assign({}, defaultDetails, { shippingOptions });
+ const requestNoShipping = new PaymentRequest(defaultMethods, details);
+ assert_equals(
+ requestNoShipping.shippingOption,
+ null,
+ "shippingOption must be null, because requestShipping is false"
+ );
+ assert_throws(
+ new TypeError(),
+ () => {
+ new PaymentRequest(defaultMethods, details, { requestShipping: true });
+ },
+ "Expected to throw a TypeError because duplicate IDs"
+ );
+}, "Throw when there are duplicate shippingOption ids, even if other values are different");
// Process payment details modifiers:
-for (const amount of invalidTotalAmounts) {
- test(() => {
- assert_throws(
- {
- name: "TypeError",
+test(() => {
+ smokeTest();
+ for (const invalidTotal of invalidTotalAmounts) {
+ const invalidModifier = {
+ supportedMethods: "https://wpt.fyi/payment-request",
+ total: {
+ label: "",
+ amount: {
+ currency: "USD",
+ value: invalidTotal,
+ },
},
- () => {
- const invalidModifier = {
- supportedMethods: ["basic-card"],
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: amount,
- },
- },
- };
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
- {
- modifiers: [invalidModifier],
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.0",
- },
- },
- }
- );
- }
- );
- }, `If modifier.total.amount.value is not a valid decimal monetary value (in this case "${amount}"), then throw a TypeError`);
-}
-
-for (const amount of invalidAmounts) {
- test(() => {
+ };
assert_throws(
- {
- name: "TypeError",
- },
+ new TypeError(),
() => {
- const invalidModifier = {
- supportedMethods: ["basic-card"],
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.0",
- },
- },
- additionalDisplayItems: [
- {
- label: "",
- amount: {
- currency: "USD",
- value: amount,
- },
- },
- ],
- };
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
- {
- modifiers: [invalidModifier],
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.0",
- },
- },
- }
- );
- }
+ new PaymentRequest(defaultMethods, {
+ modifiers: [invalidModifier],
+ total: defaultTotal,
+ });
+ },
+ `Expected TypeError for modifier.total.amount.value: "${invalidTotal}"`
);
- }, `If amount.value of additionalDisplayItems is is not a valid decimal monetary value (in this case "${amount}"), then throw a TypeError`);
-}
+ }
+}, `Throw TypeError if modifier.total.amount.value is not a valid decimal monetary value`);
test(() => {
- let itThrows = false;
- try {
- new PaymentRequest(
- [
+ smokeTest();
+ for (const invalidAmount of invalidAmounts) {
+ const invalidModifier = {
+ supportedMethods: "https://wpt.fyi/payment-request",
+ total: defaultTotal,
+ additionalDisplayItems: [
{
- supportedMethods: ["basic-card"],
- },
- ],
- {
- total: {
label: "",
amount: {
currency: "USD",
- value: "1.00",
+ value: invalidAmount,
},
},
- modifiers: [
- {
- supportedMethods: ["basic-card"],
- data: ["some-data"],
- },
- ],
- }
+ ],
+ };
+ assert_throws(
+ new TypeError(),
+ () => {
+ new PaymentRequest(defaultMethods, {
+ modifiers: [invalidModifier],
+ total: defaultTotal,
+ });
+ },
+ `Expected TypeError when given bogus modifier.additionalDisplayItems.amount of "${invalidModifier}"`
);
- } catch (err) {
- itThrows = true;
}
- assert_false(itThrows, "shouldn't throw when given a list");
-}, "Modifier data must be JSON-serializable object (a list in this case)");
+}, `If amount.value of additionalDisplayItems is not a valid decimal monetary value, then throw a TypeError`);
test(() => {
- let itThrows = false;
+ smokeTest();
+ const modifiedDetails = Object.assign({}, defaultDetails, {
+ modifiers: [
+ {
+ supportedMethods: "https://wpt.fyi/payment-request",
+ data: ["some-data"],
+ },
+ ],
+ });
try {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
+ new PaymentRequest(defaultMethods, modifiedDetails);
+ } catch (err) {
+ assert_unreached(
+ `Unexpected exception thrown when given a list: ${err.message}`
+ );
+ }
+}, "Modifier data must be JSON-serializable object (an Array in this case)");
+
+test(() => {
+ smokeTest();
+ const modifiedDetails = Object.assign({}, defaultDetails, {
+ modifiers: [
{
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
+ supportedMethods: "https://wpt.fyi/payment-request",
+ data: {
+ some: "data",
},
- modifiers: [
- {
- supportedMethods: ["basic-card"],
- data: {
- some: "data",
- },
- },
- ],
- }
- );
+ },
+ ],
+ });
+ try {
+ new PaymentRequest(defaultMethods, modifiedDetails);
} catch (err) {
- itThrows = true;
+ assert_unreached(
+ `shouldn't throw when given an object value: ${err.message}`
+ );
}
- assert_false(itThrows, "shouldn't throw when given an object value");
-}, "Modifier data must be JSON-serializable object (a object in this case)");
+}, "Modifier data must be JSON-serializable object (an Object in this case)");
test(() => {
+ smokeTest();
const recursiveDictionary = {};
recursiveDictionary.foo = recursiveDictionary;
- assert_throws(
- {
- name: "TypeError",
- },
- () => {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- modifiers: [
- {
- supportedMethods: ["basic-card"],
- data: recursiveDictionary,
- },
- ],
- }
- );
- }
- );
- assert_throws(
- {
- name: "TypeError",
- },
- () => {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- modifiers: [
- {
- supportedMethods: ["basic-card"],
- data: "a string",
- },
- ],
- }
- );
- }
- );
- assert_throws(
- {
- name: "TypeError",
- },
- () => {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- modifiers: [
- {
- supportedMethods: ["basic-card"],
- data: null,
- },
- ],
- }
- );
- }
- );
-}, "Rethrow any exceptions of JSON-serializing modifier.data into a string");
+ const modifiedDetails = Object.assign({}, defaultDetails, {
+ modifiers: [
+ {
+ supportedMethods: "https://wpt.fyi/payment-request",
+ data: recursiveDictionary,
+ },
+ ],
+ });
+ assert_throws(new TypeError(), () => {
+ new PaymentRequest(defaultMethods, modifiedDetails);
+ });
+}, "Rethrow any exceptions of JSON-serializing modifier.data");
//Setting ShippingType attribute during construction
test(() => {
- assert_throws(
- {
- name: "TypeError",
- },
- () => {
- new PaymentRequest(
- [
- {
- supportedMethods: ["basic-card"],
- },
- ],
- {
- total: {
- label: "",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
- },
- {
- shippingType: "invalid",
- }
- );
- }
- );
+ smokeTest();
+ assert_throws(new TypeError(), () => {
+ new PaymentRequest(defaultMethods, defaultDetails, {
+ shippingType: "invalid",
+ });
+ });
}, "Shipping type should be valid");
test(() => {
+ smokeTest();
const request = new PaymentRequest(defaultMethods, defaultDetails, {});
assert_equals(request.shippingAddress, null, "must be null");
}, "PaymentRequest.shippingAddress must initially be null");
test(() => {
+ smokeTest();
const request1 = new PaymentRequest(defaultMethods, defaultDetails, {});
assert_equals(request1.shippingType, null, "must be null");
const request2 = new PaymentRequest(defaultMethods, defaultDetails, {
@@ -846,6 +646,7 @@ test(() => {
}, "If options.requestShipping is not set, then request.shippingType attribute is null.");
test(() => {
+ smokeTest();
// option.shippingType defaults to 'shipping'
const request1 = new PaymentRequest(defaultMethods, defaultDetails, {
requestShipping: true,
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-ctor-currency-code-checks.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-ctor-currency-code-checks.https.html
new file mode 100644
index 00000000000..1641683beb5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-ctor-currency-code-checks.https.html
@@ -0,0 +1,339 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test currency code usage in PaymentRequest Constructor</title>
+<link rel="help" href="https://w3c.github.io/browser-payment-api/#constructor">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const defaultMethods = [
+ Object.freeze({
+ supportedMethods: "https://wpt.fyi",
+ }),
+];
+const defaultAmount = Object.freeze({
+ currency: "USD",
+ value: "1.00",
+});
+const defaultTotal = Object.freeze({
+ label: "Total",
+ amount: defaultAmount,
+});
+
+const defaultDetails = Object.freeze({
+ total: Object.freeze({
+ label: "",
+ amount: defaultAmount,
+ }),
+});
+
+// The following are the same set of valid/invalid codes that are used in
+// the ECMAScript Internationalization API Specification (ECMA-402) test suite.
+const wellFormedCurrencyCodes = [
+ "BOB",
+ "EUR",
+ "usd", // currency codes are case-insensitive
+ "XdR",
+ "xTs",
+];
+
+const invalidCurrencyCodes = [
+ "",
+ "€",
+ "$",
+ "SFr.",
+ "DM",
+ "KR₩",
+ "702",
+ "ßP",
+ "ınr",
+];
+
+const RANGE_ERROR = new RangeError();
+
+const invalidAmount = Object.freeze({
+ currency: "¡INVALID!",
+ value: "1.00",
+});
+
+const invalidTotal = {
+ total: {
+ label: "Invalid total",
+ amount: invalidAmount,
+ },
+};
+
+// Ensure we don't get false positives
+function smokeTest() {
+ new PaymentRequest(defaultMethods, invalidTotal);
+}
+
+// Process the total:
+test(() => {
+ assert_throws(RANGE_ERROR, smokeTest, "Expected smoke test to throw.");
+ for (const validCurrency of wellFormedCurrencyCodes) {
+ const amount = {
+ currency: validCurrency,
+ value: "1.00",
+ };
+ const total = {
+ label: "Total",
+ amount,
+ };
+ const details = {
+ total,
+ };
+ try {
+ new PaymentRequest(defaultMethods, details);
+ } catch (err) {
+ assert_unreached(
+ `Unexpected exception for details.total.amount "${validCurrency}": ${err.message}`
+ );
+ }
+ }
+}, "Check and canonicalize valid details.total.amount");
+
+test(() => {
+ assert_throws(RANGE_ERROR, smokeTest, "Expected smoke test to throw.");
+ for (const invalidCurrency of invalidCurrencyCodes) {
+ const amount = {
+ currency: invalidCurrency,
+ value: "1.00",
+ };
+ const total = {
+ label: "Total",
+ amount,
+ };
+ const details = {
+ total,
+ };
+ assert_throws(
+ RANGE_ERROR,
+ () => {
+ new PaymentRequest(defaultMethods, details);
+ },
+ `Expected RangeError for details.total.amount given ("${invalidCurrency}").`
+ );
+ }
+}, "Check and canonicalize invalid details.total.amount and rethrow any exceptions.");
+
+// If the displayItems member of details is present, then for each item in details.displayItems:
+test(() => {
+ assert_throws(RANGE_ERROR, smokeTest, "Expected smoke test to throw.");
+ const displayItems = [];
+ for (const validCurrency of wellFormedCurrencyCodes) {
+ const amount = {
+ currency: validCurrency,
+ value: "123",
+ };
+ const displayItem = {
+ amount,
+ label: "valid currency",
+ };
+ const details = {
+ total: defaultTotal,
+ displayItems: [displayItem],
+ };
+ try {
+ new PaymentRequest(defaultMethods, details);
+ } catch (err) {
+ assert_unreached(
+ `Unexpected error with displayItem that had a valid currency "${validCurrency}": ${err.message}`
+ );
+ }
+ displayItems.push(displayItem);
+ }
+ // Let's make sure it doesn't throw given a list of valid displayItems
+ try {
+ const details = Object.assign({}, defaultDetails, { displayItems });
+ new PaymentRequest(defaultMethods, details);
+ } catch (err) {
+ assert_unreached(
+ `Unexpected error with multiple valid displayItems: ${err.message}`
+ );
+ }
+}, "Check and canonicalize valid details.displayItems amount");
+
+test(() => {
+ assert_throws(RANGE_ERROR, smokeTest, "Expected smoke test to throw.");
+ for (const invalidCurrency of invalidCurrencyCodes) {
+ const amount = {
+ currency: invalidCurrency,
+ value: "123",
+ };
+ const displayItem = {
+ amount,
+ label: "invalid currency",
+ };
+ const details = {
+ total: defaultTotal,
+ displayItems: [displayItem],
+ };
+ assert_throws(
+ RANGE_ERROR,
+ () => {
+ new PaymentRequest(defaultMethods, details);
+ },
+ `Expected RangeError with invalid displayItem currency "${invalidCurrency}".`
+ );
+ }
+}, "Check and canonicalize invalid details.displayItems amount and rethrow RangeError.");
+
+// Process shipping options:
+test(() => {
+ assert_throws(RANGE_ERROR, smokeTest, "Expected smoke test to throw.");
+ const shippingOptions = [];
+ for (const validCurrency of wellFormedCurrencyCodes) {
+ const shippingOption = {
+ id: `test` + Math.random(),
+ label: "shipping option",
+ amount: { currency: validCurrency, value: "5.00" },
+ selected: !shippingOptions.length,
+ };
+ const details = {
+ total: defaultTotal,
+ shippingOptions: [shippingOption],
+ };
+ try {
+ new PaymentRequest(defaultMethods, details, { requestShipping: true });
+ } catch (err) {
+ assert_unreached(
+ `Unexpected exception with valid shippingOption currency code "${validCurrency}": ${err.message}.`
+ );
+ }
+ shippingOptions.push(shippingOption);
+ }
+ try {
+ const details = Object.assign({}, defaultDetails, { shippingOptions });
+ new PaymentRequest(defaultMethods, details, { requestShipping: true });
+ } catch (err) {
+ assert_unreached(
+ `Unexpected error with multiple valid shppingOptions: ${err.message}.`
+ );
+ }
+}, "Check and canonicalize valid details.shippingOptions amount.");
+
+test(() => {
+ assert_throws(RANGE_ERROR, smokeTest, "Expected smoke test to throw.");
+ for (const invalidCurrency of invalidCurrencyCodes) {
+ const shippingOption = {
+ id: "test",
+ label: "shipping option",
+ amount: { currency: invalidCurrency, value: "5.00" },
+ selected: true,
+ };
+ const details = {
+ total: defaultTotal,
+ shippingOptions: [shippingOption],
+ };
+ assert_throws(
+ RANGE_ERROR,
+ () => {
+ new PaymentRequest(defaultMethods, details, { requestShipping: true });
+ },
+ `Expected RangeError with invalid shippingOption currency code "${invalidCurrency}".`
+ );
+ }
+}, "Check and canonicalize invalid details.shippingOptions amount and rethrow RangeError.");
+
+// Process payment details modifiers:
+test(() => {
+ assert_throws(RANGE_ERROR, smokeTest, "Expected smoke test to throw.");
+ for (const validCurrency of wellFormedCurrencyCodes) {
+ const modifier = {
+ supportedMethods: "https://wpt.fyi",
+ total: {
+ label: "Total due",
+ amount: { currency: validCurrency, value: "68.00" },
+ },
+ };
+ const details = {
+ total: defaultTotal,
+ modifiers: [modifier],
+ };
+ try {
+ new PaymentRequest(defaultMethods, details);
+ } catch (err) {
+ assert_unreached(
+ `Unexpected error with valid modifier currency code "${validCurrency}": ${err.message}`
+ );
+ }
+ }
+}, "Check and canonicalize valid modifiers[n].total amount.");
+
+test(() => {
+ assert_throws(RANGE_ERROR, smokeTest, "Expected smoke test to throw.");
+ for (const invalidCurrency of invalidCurrencyCodes) {
+ const modifier = {
+ supportedMethods: "https://wpt.fyi",
+ total: {
+ label: "Total due",
+ amount: { currency: invalidCurrency, value: "68.00" },
+ },
+ };
+ const details = {
+ total: defaultTotal,
+ modifiers: [modifier],
+ };
+ assert_throws(
+ RANGE_ERROR,
+ () => {
+ new PaymentRequest(defaultMethods, details);
+ },
+ `Expected RangeError with invalid modifier currency code "${invalidCurrency}".`
+ );
+ }
+}, "Check and canonicalize invalid modifiers[n].total amount and rethrow RangeError.");
+
+// Process payment details modifiers:
+test(() => {
+ assert_throws(RANGE_ERROR, smokeTest, "Expected smoke test to throw.");
+ for (const validCurrency of wellFormedCurrencyCodes) {
+ const additionalItem = {
+ label: "additionalItem",
+ amount: { currency: validCurrency, value: "3.00" },
+ };
+ const modifier = {
+ supportedMethods: "https://wpt.fyi",
+ total: defaultTotal,
+ additionalDisplayItems: [additionalItem],
+ };
+ const details = {
+ total: defaultTotal,
+ modifiers: [modifier],
+ };
+ try {
+ new PaymentRequest(defaultMethods, details);
+ } catch (err) {
+ assert_unreached(
+ `Unexpected error with valid additionalDisplayItems[n] currency code "${validCurrency}": ${err.message}`
+ );
+ }
+ }
+}, "Check and canonicalize valid modifiers[n].additionaDisplayItem amount.");
+
+test(() => {
+ assert_throws(RANGE_ERROR, smokeTest, "Expected smoke test to throw.");
+ for (const invalidCurrency of invalidCurrencyCodes) {
+ const additionalItem = {
+ label: "additionalItem",
+ amount: { currency: invalidCurrency, value: "3.00" },
+ };
+ const modifier = {
+ supportedMethods: "https://wpt.fyi",
+ total: defaultTotal,
+ additionalDisplayItems: [additionalItem],
+ };
+ const details = {
+ total: defaultTotal,
+ modifiers: [modifier],
+ };
+ assert_throws(
+ RANGE_ERROR,
+ () => {
+ new PaymentRequest(defaultMethods, details);
+ },
+ `Expected RangeError with invalid additionalDisplayItems[n] currency code "${invalidCurrency}".`
+ );
+ }
+}, "Check and canonicalize invalid modifiers[n].additionaDisplayItem amount and rethrow RangeError.");
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-ctor-pmi-handling.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-ctor-pmi-handling.https.html
new file mode 100644
index 00000000000..ee9e2c0ee4f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-ctor-pmi-handling.https.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Mozilla and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for validity of payment method identifiers during construction</title>
+<link rel="help" href="https://w3c.github.io/browser-payment-api/#constructor">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+"use strict";
+const validAmount = Object.freeze({
+ currency: "USD",
+ value: "1.0",
+});
+const validTotal = Object.freeze({
+ label: "Default Total",
+ amount: validAmount,
+});
+const defaultDetails = Object.freeze({
+ total: validTotal,
+});
+
+test(() => {
+ const validMethods = [
+ "https://wpt",
+ "https://wpt.fyi/",
+ "https://wpt.fyi/payment",
+ "https://wpt.fyi/payment-request",
+ "https://wpt.fyi/payment-request?",
+ "https://wpt.fyi/payment-request?this=is",
+ "https://wpt.fyi/payment-request?this=is&totally",
+ "https://wpt.fyi:443/payment-request?this=is&totally",
+ "https://wpt.fyi:443/payment-request?this=is&totally#fine",
+ "https://:@wpt.fyi:443/payment-request?this=is&totally#👍",
+ " \thttps://wpt\n ",
+ "https://xn--c1yn36f",
+ "https://點看",
+ ];
+ for (const validMethod of validMethods) {
+ try {
+ const methods = [{ supportedMethods: validMethod }];
+ new PaymentRequest(methods, defaultDetails);
+ } catch (err) {
+ assert_unreached(
+ `Unexpected exception with valid standardized PMI: ${validMethod}. ${err}`
+ );
+ }
+ }
+}, "Must support valid standard URL PMIs");
+
+test(() => {
+ const validMethods = [
+ "e",
+ "n6jzof05mk2g4lhxr-u-q-w1-c-i-pa-ty-bdvs9-ho-ae7-p-md8-s-wq3-h-qd-e-q-sa",
+ "a-b-q-n-s-pw0",
+ "m-u",
+ "s-l5",
+ "k9-f",
+ "m-l",
+ "u4-n-t",
+ "i488jh6-g18-fck-yb-v7-i",
+ "x-x-t-t-c34-o",
+ "basic-card",
+ ];
+ for (const validMethod of validMethods) {
+ try {
+ const methods = [{ supportedMethods: validMethod }];
+ new PaymentRequest(methods, defaultDetails);
+ } catch (err) {
+ assert_unreached(
+ `Unexpected exception with valid standardized PMI: ${validMethod}. ${err}`
+ );
+ }
+ }
+}, "Must not throw on syntactically valid standardized payment method identifiers, even if they are not supported");
+
+test(() => {
+ const invalidMethods = [
+ "basic-💳",
+ "¡basic-*-card!",
+ "Basic-Card",
+ "0",
+ "-",
+ "--",
+ "a--b",
+ "-a--b",
+ "a-b-",
+ "0-",
+ "0-a",
+ "a0--",
+ "A-",
+ "A-B",
+ "A-b",
+ "a-0",
+ "a-0b",
+ " a-b",
+ "\t\na-b",
+ "a-b ",
+ "a-b\n\t",
+ "basic-card?not-really",
+ "basic-card://not-ok",
+ "basic card",
+ "/basic card/",
+ "BaSicCarD",
+ "BASIC-CARD",
+ " basic-card ",
+ "this is not supported",
+ " ",
+ ];
+ for (const invalidMethod of invalidMethods) {
+ assert_throws(
+ new RangeError(),
+ () => {
+ const methods = [{ supportedMethods: invalidMethod }];
+ new PaymentRequest(methods, defaultDetails);
+ },
+ `expected RangeError processing invalid standardized PMI "${invalidMethod}"`
+ );
+ }
+});
+
+test(() => {
+ const invalidMethods = [
+ "https://username@example.com/pay",
+ "https://:password@example.com/pay",
+ "https://username:password@example.com/pay",
+ "http://username:password@example.com/pay",
+ "http://foo.com:100000000/pay",
+ "not-https://wpt.fyi/payment-request",
+ "../realitive/url",
+ "/absolute/../path?",
+ "https://",
+ ];
+ for (const invalidMethod of invalidMethods) {
+ assert_throws(
+ new RangeError(),
+ () => {
+ const methods = [{ supportedMethods: invalidMethod }];
+ new PaymentRequest(methods, defaultDetails);
+ },
+ `expected RangeError processing invalid URL PMI "${invalidMethod}"`
+ );
+ }
+}, "Constructor MUST throw if given an invalid URL-based payment method identifier");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-id-attribute.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-id-attribute.https.html
new file mode 100644
index 00000000000..9d77a88f4e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-id-attribute.https.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for PaymentRequest id attribute</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(() => {
+ const methods = [{ supportedMethods: "foo" }];
+ const total = { label: "label", amount: { currency: "USD", value: "5.00" } };
+ const request1 = new PaymentRequest(methods, {
+ id: "pass",
+ total,
+ });
+ assert_idl_attribute(request1, "id");
+ assert_equals(request1.id, "pass", "Expected PaymentRequest.id to be 'pass'");
+ const request2 = new PaymentRequest(methods, {
+ total,
+ });
+ assert_true(
+ request2.id && typeof request2.id === "string",
+ "Expected PaymentRequest.id to be some auto-generated truthy string"
+ );
+}, "PaymentRequest id attribute");
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-id.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-id.https.html
deleted file mode 100644
index 8e3c3446170..00000000000
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-id.https.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<meta charset="utf-8">
-<title>Test for PaymentRequest identifier usage</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<iframe id="iframe" allowpaymentrequest></iframe>
-<script>
-async_test((t) => {
- onload = t.step_func_done(() => {
- var request = new window[0].PaymentRequest([{supportedMethods: ['foo']}], {id: 'my_payment_id', total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}});
- assert_equals(request.id, 'my_payment_id', 'Payment identifier is not reflected correctly in PaymentRequest.id');
-
- request = new window[0].PaymentRequest([{supportedMethods: ['foo']}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}});
- assert_equals(request.id.length, 36, 'Generated payment identifier is not of correct length.');
- });
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-in-iframe.html b/tests/wpt/web-platform-tests/payment-request/payment-request-in-iframe.html
deleted file mode 100644
index 9ca9f4b84b6..00000000000
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-in-iframe.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2016 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<meta charset="utf-8">
-<title>Test for PaymentRequest in an iframe (see also
-https://github.com/w3c/browser-payment-api/issues/2)</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<iframe srcdoc="
-<!DOCTYPE html>
-<meta charset='utf-8'>
-<script>
-window.top.test(function() {
- window.top.assert_throws({name: 'SecurityError'}, function() {
- new PaymentRequest([{supportedMethods: ['foo']}], {total: {label: 'label', amount: {currency: 'USD', value: '5.00'}}});
- }, 'If the browsing context of the script calling the constructor is not a top-level browsing context, then throw a SecurityError.');
-});
-</script>
-"></iframe>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-onshippingaddresschange-attribute.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-onshippingaddresschange-attribute.https.html
index 7d5530a35e7..5c54d48568a 100644
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-onshippingaddresschange-attribute.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-onshippingaddresschange-attribute.https.html
@@ -7,7 +7,7 @@
<script src="/resources/testharnessreport.js"></script>
<script>
"use strict";
-const basicCard = Object.freeze({ supportedMethods: ["basic-card"] });
+const basicCard = Object.freeze({ supportedMethods: "basic-card" });
const defaultMethods = Object.freeze([basicCard]);
const defaultDetails = Object.freeze({
total: {
@@ -21,6 +21,11 @@ const defaultDetails = Object.freeze({
test(() => {
const request = new PaymentRequest(defaultMethods, defaultDetails);
+ assert_idl_attribute(request, "onshippingaddresschange");
+}, "Must have a onshippingaddresschange IDL attribute");
+
+test(() => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
const ev = new Event("shippingaddresschange");
let didHandle = false;
request.onshippingaddresschange = evt => {
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-onshippingoptionchange-attribute.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-onshippingoptionchange-attribute.https.html
index 05c3dbfaa30..a4d8fbc4825 100644
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-onshippingoptionchange-attribute.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-onshippingoptionchange-attribute.https.html
@@ -7,7 +7,7 @@
<script src="/resources/testharnessreport.js"></script>
<script>
"use strict";
-const basicCard = Object.freeze({ supportedMethods: ["basic-card"] });
+const basicCard = Object.freeze({ supportedMethods: "basic-card" });
const defaultMethods = Object.freeze([basicCard]);
const defaultDetails = Object.freeze({
total: {
@@ -21,6 +21,11 @@ const defaultDetails = Object.freeze({
test(() => {
const request = new PaymentRequest(defaultMethods, defaultDetails);
+ assert_idl_attribute(request, "onshippingoptionchange");
+}, "Must have a onshippingoptionchange IDL attribute");
+
+test(() => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
const ev = new Event("shippingoptionchange");
let didHandle = false;
request.onshippingoptionchange = evt => {
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-response-id.html b/tests/wpt/web-platform-tests/payment-request/payment-request-response-id.html
index a28f3b24c6f..90a2cfbb843 100644
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-response-id.html
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-response-id.html
@@ -32,7 +32,7 @@
}
const supportedInstruments = [{
- supportedMethods: ['https://android.com/pay'],
+ supportedMethods: 'https://android.com/pay',
data: {
merchantName: 'Rouslan Solomakhin',
merchantId: '00184145120947117657',
@@ -47,7 +47,7 @@
},
},
}, {
- supportedMethods: ['basic-card'],
+ supportedMethods: 'basic-card',
data: {
supportedNetworks: ['unionpay', 'visa', 'mastercard', 'amex', 'discover',
'diners', 'jcb', 'mir',
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-shippingAddress-attribute.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-shippingAddress-attribute.https.html
new file mode 100644
index 00000000000..08918356b6f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-shippingAddress-attribute.https.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for PaymentRequest shippingAddress attribute</title>
+<link rel="help" href="https://w3c.github.io/payment-request/#shippingaddress-attribute">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const validMethod = Object.freeze({ supportedMethods: "foo" });
+const validMethods = Object.freeze([validMethod]);
+const validAmount = Object.freeze({ currency: "USD", value: "5.00" });
+const validTotal = Object.freeze({
+ label: "label",
+ amount: validAmount,
+});
+const validDetails = Object.freeze({ total: validTotal });
+
+test(() => {
+ const request = new PaymentRequest(validMethods, validDetails);
+ assert_idl_attribute(request, "shippingAddress");
+}, "Must have a .shippingAddress IDL attribute.");
+
+test(() => {
+ const request = new PaymentRequest(validMethods, validDetails);
+ assert_equals(request.shippingAddress, null, "expected null");
+}, ".shippingAddress attribute must default to null.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-shippingOption-attribute.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-shippingOption-attribute.https.html
new file mode 100644
index 00000000000..b5f9ea65c6c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-shippingOption-attribute.https.html
@@ -0,0 +1,100 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for PaymentRequest shippingOption attribute</title>
+<link rel="help" href="https://w3c.github.io/payment-request/#shippingoption-attribute">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+const validMethod = Object.freeze({ supportedMethods: "foo" });
+const validMethods = Object.freeze([validMethod]);
+const validAmount = Object.freeze({ currency: "USD", value: "5.00" });
+const validTotal = Object.freeze({
+ label: "label",
+ amount: validAmount,
+});
+const validDetails = Object.freeze({ total: validTotal });
+const validShippingOption = Object.freeze({
+ id: "valid",
+ label: "Valid shipping option",
+ amount: validAmount,
+ selected: false,
+});
+
+const requestShipping = Object.freeze({
+ requestShipping: true,
+});
+
+test(() => {
+ const request = new PaymentRequest(validMethods, validDetails);
+ assert_idl_attribute(request, "shippingOption");
+}, "Must have a .shippingOption IDL attribute.");
+
+test(() => {
+ const request = new PaymentRequest(validMethods, validDetails);
+ assert_equals(request.shippingOption, null, "expected null");
+}, ".shippingOption attribute must default to null.");
+
+test(() => {
+ const detailsWithShippingOptions = Object.assign({}, validDetails, {
+ shippingOptions: [validShippingOption],
+ });
+ const request = new PaymentRequest(
+ validMethods,
+ detailsWithShippingOptions,
+ requestShipping
+ );
+ assert_equals(request.shippingOption, null, "expected null");
+}, "If there is a single shipping option, but selected is false, then .shippingOption must be null.");
+
+test(() => {
+ const shippingOption2 = Object.assign({}, validShippingOption, {
+ id: "valid2",
+ });
+ const detailsWithShippingOptions = Object.assign({}, validDetails, {
+ shippingOptions: [validShippingOption, shippingOption2],
+ });
+ const request = new PaymentRequest(
+ validMethods,
+ detailsWithShippingOptions,
+ requestShipping
+ );
+ assert_equals(request.shippingOption, null, "expected null");
+}, "If there are multiple shipping options all with `selected` set to false, then .shippingOption is null.");
+
+test(() => {
+ const shippingOption2 = Object.assign({}, validShippingOption, {
+ id: "pass",
+ selected: true,
+ });
+ const detailsWithShippingOptions = Object.assign({}, validDetails, {
+ shippingOptions: [shippingOption2, validShippingOption],
+ });
+ const request = new PaymentRequest(
+ validMethods,
+ detailsWithShippingOptions,
+ requestShipping
+ );
+ assert_equals(request.shippingOption, "pass", "expected 'pass'");
+}, "Given multiple shipping options, it must use the selected shipping option for .shippingOption value.");
+
+test(() => {
+ const shippingOption1 = Object.assign({}, validShippingOption, {
+ id: "fail",
+ selected: true,
+ });
+ const shippingOption2 = Object.assign({}, validShippingOption, {
+ id: "pass",
+ selected: true,
+ });
+ const detailsWithShippingOptions = Object.assign({}, validDetails, {
+ shippingOptions: [shippingOption1, shippingOption2, validShippingOption],
+ });
+ const request = new PaymentRequest(
+ validMethods,
+ detailsWithShippingOptions,
+ requestShipping
+ );
+ assert_equals(request.shippingOption, "pass", "expected 'pass'");
+}, "If there are multiple of the shipping options with selected true, then .shippingOption is the last selected shipping option in order.");
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-shippingType-attribute.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-shippingType-attribute.https.html
new file mode 100644
index 00000000000..b1ed0d02886
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-shippingType-attribute.https.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Mozilla and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for PaymentRequest's shippingType attribute</title>
+<link rel="help" href="https://w3c.github.io/payment-request/#shippingtype-attribute">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+"use strict";
+const paymentShipingTypes = Object.freeze(["delivery", "pickup", "shipping"]);
+const basicCard = Object.freeze({ supportedMethods: "basic-card" });
+const defaultMethods = Object.freeze([basicCard]);
+const defaultDetails = Object.freeze({
+ total: {
+ label: "",
+ amount: {
+ currency: "USD",
+ value: "1.00",
+ },
+ },
+});
+
+test(() => {
+ const request = new PaymentRequest(defaultMethods, defaultDetails);
+ assert_idl_attribute(request, "shippingType");
+}, "Must have a shippingType IDL attribute");
+
+test(() => {
+ const request1 = new PaymentRequest(defaultMethods, defaultDetails, {});
+ assert_equals(request1.shippingType, null, "must be null");
+ const request2 = new PaymentRequest(defaultMethods, defaultDetails, {
+ requestShipping: false,
+ });
+ assert_equals(request2.shippingType, null, "must be null");
+ for (const shippingType of paymentShipingTypes) {
+ const request = new PaymentRequest(defaultMethods, defaultDetails, {
+ requestShipping: false,
+ shippingType,
+ });
+ assert_equals(request.shippingType, null, "must be null");
+ }
+}, "If options.requestShipping is false, then request.shippingType attribute is null.");
+
+test(() => {
+ // option.shippingType defaults to 'shipping'
+ const defaultRequest = new PaymentRequest(defaultMethods, defaultDetails, {
+ requestShipping: true,
+ });
+ assert_equals(defaultRequest.shippingType, "shipping", "must be shipping");
+ for (const shippingType of paymentShipingTypes) {
+ const request = new PaymentRequest(defaultMethods, defaultDetails, {
+ requestShipping: true,
+ shippingType,
+ });
+ assert_equals(
+ request.shippingType,
+ shippingType,
+ `must be ${shippingType}`
+ );
+ }
+}, "If options.requestShipping is true, request.shippingType will be options.shippingType.");
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-show-method.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-show-method.https.html
index 1bdbba41fd7..555c4936537 100644
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-show-method.https.html
+++ b/tests/wpt/web-platform-tests/payment-request/payment-request-show-method.https.html
@@ -7,7 +7,7 @@
<script src="/resources/testharnessreport.js"></script>
<script>
'use strict';
-const basicCard = Object.freeze({ supportedMethods: ["basic-card"] });
+const basicCard = Object.freeze({ supportedMethods: "basic-card" });
const defaultMethods = Object.freeze([basicCard]);
const defaultDetails = Object.freeze({
total: {
@@ -19,6 +19,16 @@ const defaultDetails = Object.freeze({
},
});
+test(() => {
+ try {
+ new PaymentRequest(defaultMethods, defaultDetails);
+ } catch (err) {
+ done();
+ throw err;
+ }
+}, "Must be possible to construct a payment request");
+
+
promise_test(async t => {
const request = new PaymentRequest(defaultMethods, defaultDetails);
const acceptPromise = request.show(); // Sets state to "interactive"
@@ -37,4 +47,11 @@ promise_test(async t => {
await promise_rejects(t, "AbortError", acceptPromise1);
}, `If the user agent's "payment request is showing" boolean is true, then return a promise rejected with an "AbortError" DOMException.`);
+promise_test(async t => {
+ const request = new PaymentRequest(
+ [{ supportedMethods: "this-is-not-supported" }],
+ defaultDetails);
+ const acceptPromise = request.show();
+ await promise_rejects(t, "NotSupportedError", acceptPromise);
+}, `If payment method consultation produces no supported method of payment, then return a promise rejected with a "NotSupportedError" DOMException.`);
</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-update-event-constructor.http.html b/tests/wpt/web-platform-tests/payment-request/payment-request-update-event-constructor.http.html
deleted file mode 100644
index 685eed6469e..00000000000
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-update-event-constructor.http.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<meta charset="utf-8">
-<title>Test for PaymentRequestUpdateEvent Constructor</title>
-<link rel="help" href="https://w3c.github.io/browser-payment-api/#constructor">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-test(() => {
- assert_throws("SecurityError", () => {
- new PaymentRequestUpdateEvent("test");
- });
-}, "PaymentRequestUpdateEvent constructor throws in a non-secure context");
-</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-update-event-constructor.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-update-event-constructor.https.html
deleted file mode 100644
index bb83e5d6227..00000000000
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-update-event-constructor.https.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<meta charset="utf-8">
-<title>Test for PaymentRequestUpdateEvent Constructor</title>
-<link rel="help" href="https://w3c.github.io/browser-payment-api/#constructor">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-const basicCard = Object.freeze({ supportedMethods: ["basic-card"] });
-const defaultMethods = Object.freeze([basicCard]);
-const defaultDetails = Object.freeze({
- total: {
- label: "Total",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
-});
-
-test(() => {
- try {
- new PaymentRequestUpdateEvent("test");
- } catch (err) {
- assert_true(false, `Unexpected exception: ${err.message}`);
- }
-}, "PaymentRequestUpdateEvent can be constructed in secure-context");
-
-test(() => {
- const ev = new PaymentRequestUpdateEvent("test", {
- bubbles: true,
- cancelable: true,
- composed: true,
- });
- assert_false(ev.isTrusted, "constructed in script, so not be trusted");
- assert_true(ev.bubbles, "set by EventInitDict");
- assert_true(ev.cancelable, "set by EventInitDict");
- assert_true(ev.composed, "set by EventInitDict");
- assert_equals(ev.type, "test");
-}, "PaymentRequestUpdateEvent can be constructed with an EventInitDict, even if not trusted");
-
-test(() => {
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- const ev = new PaymentRequestUpdateEvent("test");
- request.addEventListener("test", evt => {
- assert_equals(ev, evt);
- });
- request.dispatchEvent(ev);
-}, "PaymentRequestUpdateEvent can be dispatched, even if not trusted");
-
-</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-request-update-event-updatewith-method.https.html b/tests/wpt/web-platform-tests/payment-request/payment-request-update-event-updatewith-method.https.html
deleted file mode 100644
index 98a418ce71c..00000000000
--- a/tests/wpt/web-platform-tests/payment-request/payment-request-update-event-updatewith-method.https.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE html>
-<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
-<meta charset="utf-8">
-<title>Test for PaymentRequestUpdateEvent's updateWith() method</title>
-<link rel="help" href="https://w3c.github.io/browser-payment-api/#updatewith-method">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-const basicCard = Object.freeze({ supportedMethods: ["basic-card"] });
-const defaultMethods = Object.freeze([basicCard]);
-const defaultDetails = Object.freeze({
- total: {
- label: "Total",
- amount: {
- currency: "USD",
- value: "1.00",
- },
- },
-});
-
-test(() => {
- // Smoke test - checks target is set as expected
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- const ev = new PaymentRequestUpdateEvent("test");
- request.dispatchEvent(ev);
- assert_equals(ev.target, request, "The request and the target at the same");
-}, "Let target be the request which is dispatching the event.");
-
-// Github issue: https://github.com/w3c/browser-payment-api/issues/546
-test(() => {
- const untrustedEvents = [
- new PaymentRequestUpdateEvent("just a test"),
- new PaymentRequestUpdateEvent("shippingaddresschange"),
- new PaymentRequestUpdateEvent("shippingoptionchange"),
- ].forEach(ev => {
- assert_throws(
- "InvalidStateError",
- () => {
- ev.updateWith(Promise.resolve());
- },
- `untrusted event of type "${ev.type}" must throw "InvalidStateError"`
- );
- });
-}, `Calling .updateWith() with an undispatched untrusted event throws "InvalidStateError"`);
-
-// Github issue: https://github.com/w3c/browser-payment-api/issues/546
-test(() => {
- const request = new PaymentRequest(defaultMethods, defaultDetails);
- const untrustedEvents = [
- new PaymentRequestUpdateEvent("just a test"),
- new PaymentRequestUpdateEvent("shippingaddresschange"),
- new PaymentRequestUpdateEvent("shippingoptionchange"),
- ].map(ev => {
- request.dispatchEvent(ev); // set .target and dispatch flag
- // unstrusted event.
- assert_throws(
- "InvalidStateError",
- () => {
- ev.updateWith(Promise.resolve())
- },
- `untrusted event of type "${ev.type}" must throw "InvalidStateError"`
- );
- });
-}, `Calling .updateWith() with a dispatched, untrusted event, throws "InvalidStateError"`);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-response/complete-method-manual.https.html b/tests/wpt/web-platform-tests/payment-request/payment-response/complete-method-manual.https.html
new file mode 100644
index 00000000000..509fa4d110b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-response/complete-method-manual.https.html
@@ -0,0 +1,84 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentresponse-complete()">
+<title>
+ PaymentResponse.prototype.complete() method
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<script>
+async function runManualTest({ completeWith: result }, button) {
+ button.disabled = true;
+ const { response, request } = await getPaymentRequestResponse();
+ promise_test(async () => {
+ try {
+ // We .complete() as normal, using the passed test value
+ const promise = response.complete(result);
+ assert_true(promise instanceof Promise, "returns a promise");
+ const returnedValue = await promise;
+ assert_equals(
+ returnedValue,
+ undefined,
+ "Returned value must always be undefined"
+ );
+ // We now call .complete() again, to force an exception
+ // because [[completeCalled]] is true.
+ try {
+ await response.complete(result);
+ assert_unreached("Expected InvalidStateError to be thrown");
+ } catch (err) {
+ assert_equals(
+ err.code,
+ DOMException.INVALID_STATE_ERR,
+ "Must throw an InvalidStateError"
+ );
+ }
+ button.innerHTML = `✅ ${button.textContent}`;
+ } catch (err) {
+ button.innerHTML = `❌ ${button.textContent}`;
+ assert_unreached("Unexpected exception: " + err.message);
+ }
+ }, button.textContent.trim());
+}
+</script>
+
+<h2>
+ Manual Tests for PaymentResponse.complete() - Please run in order!
+</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When presented with the payment sheet, use any credit card select to "Pay".
+ Also confirm any prompts that come up.
+</p>
+<ol>
+ <li>
+ <button onclick="runManualTest({completeWith: 'success'}, this)">
+ If the value of the internal slot [[completeCalled]] is true,
+ reject promise with an "InvalidStateError" DOMException.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest({completeWith: 'unknown'}, this)">
+ Passing no argument defaults to "unknown",
+ eventually closing the sheet and doesn't throw.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest({completeWith: 'success'}, this)">
+ Passing "success" eventually closes the sheet and doesn't throw.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest({completeWith: 'fail'}, this).then(done)">
+ Passing "fail" eventually closes the sheet and doesn't throw.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-response/helpers.js b/tests/wpt/web-platform-tests/payment-request/payment-response/helpers.js
new file mode 100644
index 00000000000..bf938c5edba
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-response/helpers.js
@@ -0,0 +1,139 @@
+setup({ explicit_done: true, explicit_timeout: true });
+
+const validMethod = Object.freeze({
+ supportedMethods: "basic-card",
+});
+
+const validMethods = Object.freeze([validMethod]);
+
+const validAmount = Object.freeze({
+ currency: "USD",
+ value: "1.00",
+});
+
+const validTotal = Object.freeze({
+ label: "Valid total",
+ amount: validAmount,
+});
+const validDetails = {
+ total: validTotal,
+};
+
+test(() => {
+ try {
+ new PaymentRequest(validMethods, validDetails);
+ } catch (err) {
+ done();
+ throw err;
+ }
+}, "Can construct a payment request (smoke test).");
+
+/**
+ * Pops up a payment sheet, allowing options to be
+ * passed in if particular values are needed.
+ *
+ * @param PaymentOptions options
+ */
+async function getPaymentResponse(options, id) {
+ const { response } = getPaymentRequestResponse(options, id);
+ return response;
+}
+
+/**
+ * Creates a payment request and response pair.
+ * It also shows the payment sheet.
+ *
+ * @param {PaymentOptions?} options
+ * @param {String?} id
+ */
+async function getPaymentRequestResponse(options, id) {
+ const methods = [{ supportedMethods: "basic-card" }];
+ const details = {
+ id,
+ total: {
+ label: "Total due",
+ amount: { currency: "USD", value: "1.0" },
+ },
+ shippingOptions: [
+ {
+ id: "fail1",
+ label: "Fail option 1",
+ amount: { currency: "USD", value: "5.00" },
+ selected: false,
+ },
+ {
+ id: "pass",
+ label: "Pass option",
+ amount: { currency: "USD", value: "5.00" },
+ selected: true,
+ },
+ {
+ id: "fail2",
+ label: "Fail option 2",
+ amount: { currency: "USD", value: "5.00" },
+ selected: false,
+ },
+ ],
+ };
+ const request = new PaymentRequest(methods, details, options);
+ request.onshippingaddresschange = ev => ev.updateWith(details);
+ request.onshippingoptionchange = ev => ev.updateWith(details);
+ const response = await request.show();
+ return { request, response };
+}
+
+/**
+ * Runs a manual test for payment
+ *
+ * @param {HTMLButtonElement} button The HTML button.
+ * @param {PaymentOptions?} options.
+ * @param {Object} expected What property values are expected to pass the test.
+ * @param {String?} id And id for the request/response pair.
+ */
+async function runManualTest(button, options, expected = {}, id = undefined) {
+ button.disabled = true;
+ const { request, response } = await getPaymentRequestResponse(options, id);
+ await response.complete();
+ test(() => {
+ assert_idl_attribute(
+ response,
+ "requestId",
+ "Expected requestId to be an IDL attribute."
+ );
+ assert_equals(response.requestId, request.id, `Expected ids to match`);
+ for (const [attribute, value] of Object.entries(expected)) {
+ assert_idl_attribute(
+ response,
+ attribute,
+ `Expected ${attribute} to be an IDL attribute.`
+ );
+ assert_equals(
+ response[attribute],
+ value,
+ `Expected response ${attribute} attribute to be ${value}`
+ );
+ }
+ assert_idl_attribute(response, "details");
+ assert_equals(typeof response.details, "object", "Expected an object");
+ // Testing that this does not throw:
+ response.toJSON();
+ if (options && options.requestShipping) {
+ assert_equals(
+ response.shippingOption,
+ "pass",
+ "request.shippingOption must be 'pass'"
+ );
+ } else {
+ assert_equals(
+ request.shippingOption,
+ null,
+ "If requestShipping is falsy, request.shippingOption must be null"
+ );
+ assert_equals(
+ response.shippingOption,
+ null,
+ "request.shippingOption must be null"
+ );
+ }
+ }, button.textContent.trim());
+}
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-response/methodName-attribute-manual.https.html b/tests/wpt/web-platform-tests/payment-request/payment-response/methodName-attribute-manual.https.html
new file mode 100644
index 00000000000..cd25e942c6f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-response/methodName-attribute-manual.https.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentresponse-methodname">
+<title>
+ PaymentResponse.prototype.methodName attribute
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<h2>methodName attribute</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ Use any credit card and any values.
+</p>
+<ol>
+ <li>
+ <button onclick="runManualTest(this, {}, { methodName: 'basic-card' }).then(done)">
+ Expect the payment method identifier to be 'basic-card'.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-response/payerEmail-attribute-manual.https.html b/tests/wpt/web-platform-tests/payment-request/payment-response/payerEmail-attribute-manual.https.html
new file mode 100644
index 00000000000..c7eaf65ffcc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-response/payerEmail-attribute-manual.https.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentresponse-payeremail">
+<title>
+ PaymentResponse.prototype.payerEmail attribute
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<h2>payerEmail attribute</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When requested, please use "wpt@w3.org" as the email.
+</p>
+<ol>
+ <li>
+ <button onclick="runManualTest(this, undefined, { payerEmail: null })">
+ payerEmail attribute is null when options undefined.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerEmail: undefined }, { payerEmail: null })">
+ payerEmail attribute is null when requestPayerEmail is undefined.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerEmail: false }, { payerEmail: null })">
+ payerEmail attribute is null when requestPayerEmail is false.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerEmail: true }, { payerEmail: 'wpt@w3.org' })">
+ payerEmail attribute is 'wpt@w3.org' when requestPayerEmail is true.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerEmail: 'yep' }, { payerEmail: 'wpt@w3.org' }).then(done)">
+ payerEmail attribute is 'wpt@w3.org' when requestPayerEmail is truthy.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-response/payerName-attribute-manual.https.html b/tests/wpt/web-platform-tests/payment-request/payment-response/payerName-attribute-manual.https.html
new file mode 100644
index 00000000000..b2636e37cb8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-response/payerName-attribute-manual.https.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentresponse-payername">
+<title>
+ PaymentResponse.prototype.payerName attribute
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<h2>payerName attribute</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When requested, please use "web platform test" as the payer name.
+</p>
+<ol>
+ <li>
+ <button onclick="runManualTest(this, undefined, { payerName: null })">
+ payerName attribute is null when option is undefined.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerName: undefined }, { payerName: null })">
+ payerName attribute is null when requestPayerName is undefined.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerName: false }, { payerName: null })">
+ payerName attribute is null when requestPayerName is false.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerName: true }, { payerName: 'web platform test' })">
+ payerName attribute is 'web platform test' when requestPayerName is true.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerName: 'yep' }, { payerName: 'web platform test' }).then(done)">
+ payerName attribute is 'web platform test' when requestPayerName is truthy.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-response/payerPhone-attribute-manual.https.html b/tests/wpt/web-platform-tests/payment-request/payment-response/payerPhone-attribute-manual.https.html
new file mode 100644
index 00000000000..c74f45e9c23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-response/payerPhone-attribute-manual.https.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentresponse-payerphone">
+<title>
+ PaymentResponse.prototype.payerPhone attribute
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<h2>payerPhone attribute</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When prompted, please use +12345678910 as the phone number.
+</p>
+<ol>
+ <li>
+ <button onclick="runManualTest(this, undefined, { payerPhone: null })">
+ payerPhone attribute is null when options is undefined.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerPhone: undefined }, { payerPhone: null })">
+ payerPhone attribute is null when requestPayerPhone is undefined.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerPhone: false }, { payerPhone: null })">
+ payerPhone attribute is null when requestPayerPhone is false.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerPhone: true }, { payerPhone: '+12345678910' })">
+ payerPhone attribute is '+12345678910' when requestPayerPhone is true.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestPayerPhone: 'yep' }, { payerPhone: '+12345678910' }).then(done)">
+ payerPhone attribute is '+12345678910' when requestPayerPhone is truthy.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-response/requestId-attribute-manual.https.html b/tests/wpt/web-platform-tests/payment-request/payment-response/requestId-attribute-manual.https.html
new file mode 100644
index 00000000000..653ed55bdf9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-response/requestId-attribute-manual.https.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentresponse-requestid">
+<title>
+ PaymentResponse.prototype.requestId attribute
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<h2>requestId attribute</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When presented with the payment sheet, use any credit card select to "Pay".
+ Also confirm any prompts that come up.
+</p>
+<ol>
+ <li>
+ <button onclick="runManualTest(this, {}, {})">
+ Must mirror the payment request's automatically set id
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, {}, {requestId: 'pass'}, 'pass').then(done)">
+ Must mirror the payment request's explicitly set id
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-response/shippingAddress-attribute-manual.https.html b/tests/wpt/web-platform-tests/payment-request/payment-response/shippingAddress-attribute-manual.https.html
new file mode 100644
index 00000000000..b5a4082d7f6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-response/shippingAddress-attribute-manual.https.html
@@ -0,0 +1,101 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentresponse-shippingaddress">
+<title>
+ PaymentResponse.prototype.shippingAddress
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<script>
+async function checkNullShippingAddress(button, options) {
+ button.disabled = true;
+ const { request, response } = await getPaymentRequestResponse(options);
+ await response.complete();
+ test(() => {
+ assert_idl_attribute(response, "shippingAddress");
+ assert_equals(
+ response.shippingAddress,
+ null,
+ "Expected response.shippingAddress to be null"
+ );
+ assert_equals(
+ request.shippingAddress,
+ null,
+ "Expected request.shippingAddress to be null"
+ );
+ }, button.textContent.trim());
+}
+
+async function runManualTest(button, options = {}, expected = {}, id) {
+ button.disabled = true;
+ const { request, response } = await getPaymentRequestResponse(options, id);
+ await response.complete();
+ test(() => {
+ assert_equals(response.requestId, request.id, `Expected ids to match`);
+ assert_idl_attribute(response, "shippingAddress");
+ const { shippingAddress: addr } = request;
+ assert_true(
+ addr instanceof PaymentAddress,
+ "Expect instance of PaymentAddress"
+ );
+ try {
+ addr.toJSON();
+ } catch (err) {
+ assert_unreached(
+ `Unexpected exception calling PaymentAddress.toJSON(): ${err}`
+ );
+ }
+ if (expected.shippingAddress === null) {
+ return;
+ }
+ assert_equals(addr.country, "AF", "Expected AF for country");
+ assert_true(
+ addr.addressLine instanceof Array,
+ "Expected addressLine to be an array"
+ );
+ assert_equals(
+ addr.addressLine.toString(),
+ "1 wpt street",
+ "Expected '1 wpt street' for addressLine"
+ );
+ assert_equals(addr.city, "Kabul", "Expected city to be Kabul");
+ assert_equals(addr.postalCode, "1001", "Expect postalCode to be 1001");
+ assert_equals(addr.recipient, "web platform test");
+ }, button.textContent.trim());
+}
+</script>
+<h2>shippingAddress attribute</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When prompted, please enter "web platform test" as recipient, at address "1 wpt street" in "Kabul, Afghanistan", zip/postal code 1001.
+</p>
+<ol>
+ <li>
+ <button onclick="checkNullShippingAddress(this, undefined)">
+ If options is undefined, then shippingAddress must be null.
+ </button>
+ </li>
+ <li>
+ <button onclick="checkNullShippingAddress(this, {})">
+ If the requestShipping member is missing, then shippingAddress must be null.
+ </button>
+ </li>
+ <li>
+ <button onclick="checkNullShippingAddress(this, {requestShipping: false})">
+ If the requestShipping member is false, then shippingAddress must be null.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, {requestShipping: true}).then(done)">
+ If the requestShipping member is true, then shippingAddress must be "1 wpt street" in "Kabul, Afghanistan", zip code 1001.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/payment-response/shippingOption-attribute-manual.https.html b/tests/wpt/web-platform-tests/payment-request/payment-response/shippingOption-attribute-manual.https.html
new file mode 100644
index 00000000000..eec7a4d9bde
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/payment-response/shippingOption-attribute-manual.https.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentresponse-shippingoption">
+<title>
+ PaymentResponse.prototype.complete() method
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="helpers.js"></script>
+<h2>shippingOption attribute</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ For the last test, please select the only available shipping option and select "Pay".
+</p>
+<ol>
+ <li>
+ <button onclick="runManualTest(this, undefined, { shippingOption: null })">
+ If the options is undefined, then shippingOption must be null.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestShipping: undefined }, { shippingOption: null })">
+ If the requestShipping member is missing, then shippingOption must be null.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestShipping: false }, { shippingOption: null })">
+ If the requestShipping member is false, then shippingOption must be null.
+ </button>
+ </li>
+ <li>
+ <button onclick="runManualTest(this, { requestShipping: true }, { shippingOption: 'pass' }).then(done)">
+ If the requestShipping member is true, then shippingOption must be the id of the selected shipping option ("pass").
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active.https.html b/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active.https.html
new file mode 100644
index 00000000000..063d31b1386
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/rejects_if_not_active.https.html
@@ -0,0 +1,156 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<link rel="help" href="https://w3c.github.io/payment-request/#show()-method">
+<title>PaymentRequest show() rejects if doc is not fully active</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentrequest-show()">
+<body>
+<script>
+const validMethod = Object.freeze({
+ supportedMethods: "basic-card",
+});
+const validMethods = Object.freeze([validMethod]);
+const validAmount = Object.freeze({
+ currency: "USD",
+ value: "5.00",
+});
+const validTotal = Object.freeze({
+ label: "Total due",
+ amount: validAmount,
+});
+const validDetails = Object.freeze({
+ total: validTotal,
+});
+
+function getLoadedPaymentRequest(iframe, url) {
+ return new Promise(resolve => {
+ iframe.addEventListener(
+ "load",
+ () => {
+ const { PaymentRequest } = iframe.contentWindow;
+ const request = new PaymentRequest(validMethods, validDetails);
+ resolve(request);
+ },
+ { once: true }
+ );
+ iframe.src = url;
+ });
+}
+
+promise_test(async t => {
+ // Check that PaymentRequests can be constructed.
+ new PaymentRequest(validMethods, validDetails);
+ const iframe = document.createElement("iframe");
+ iframe.allowPaymentRequest = true;
+ document.body.appendChild(iframe);
+
+ // We first got to page1.html, grab a PaymentRequest instance.
+ const request1 = await getLoadedPaymentRequest(
+ iframe,
+ "/payment-request/resources/page1.html"
+ );
+
+ // We navigate the iframe again, putting request1's document into an inactive state.
+ const request2 = await getLoadedPaymentRequest(
+ iframe,
+ "/payment-request/resources/page2.html"
+ );
+
+ // Now, request1's relevant global object's document is no longer active.
+ // So, call .show(), and make sure it rejects appropriately.
+ await promise_rejects(
+ t,
+ "AbortError",
+ request1.show(),
+ "Inactive document, so must throw AbortError"
+ );
+
+ // request2 has an active document tho, so confirm it's working as expected:
+ request2.show();
+ await request2.abort();
+ await promise_rejects(
+ t,
+ "InvalidStateError",
+ request2.show(),
+ "Abort already called, so InvalidStateError"
+ );
+ // We are done, so clean up.
+ iframe.remove();
+}, "PaymentRequest.show() aborts if the document is not active");
+
+promise_test(async t => {
+ // check that PaymentRequests can be constructed (smoke test).
+ new PaymentRequest(validMethods, validDetails);
+
+ // We nest two iframes and wait for them to load.
+ const outerIframe = document.createElement("iframe");
+ outerIframe.allowPaymentRequest = true;
+ document.body.appendChild(outerIframe);
+ // Load the outer iframe (we don't care about the awaited request)
+ await getLoadedPaymentRequest(
+ outerIframe,
+ "/payment-request/resources/page1.html"
+ );
+
+ // Now we create the inner iframe
+ const innerIframe = outerIframe.contentDocument.createElement("iframe");
+ innerIframe.allowPaymentRequest = true;
+
+ // nest them
+ outerIframe.contentDocument.body.appendChild(innerIframe);
+
+ // load innerIframe, and get the PaymentRequest instance
+ const request = await getLoadedPaymentRequest(
+ innerIframe,
+ "/payment-request/resources/page2.html"
+ );
+
+ // Navigate the outer iframe to a new location.
+ // Wait for the load event to fire.
+ await new Promise(resolve => {
+ outerIframe.addEventListener("load", resolve);
+ outerIframe.src = "/payment-request/resources/page2.html";
+ });
+ // Now, request's relevant global object's document is still active
+ // (it is the active document of the inner iframe), but is not fully active
+ // (since the parent of the inner iframe is itself no longer active).
+ // So, call request.show() and make sure it rejects appropriately.
+ await promise_rejects(
+ t,
+ "AbortError",
+ request.show(),
+ "Active, but not fully active, so must throw AbortError"
+ );
+ // We are done, so clean up.
+ iframe.remove();
+}, "PaymentRequest.show() aborts if the document is active, but not fully active");
+
+promise_test(async t => {
+ // Check that PaymentRequests can be constructed.
+ new PaymentRequest(validMethods, validDetails);
+ const iframe = document.createElement("iframe");
+ iframe.allowPaymentRequest = true;
+ document.body.appendChild(iframe);
+ // Make a request in the iframe.
+ const request = await getLoadedPaymentRequest(
+ iframe,
+ "/payment-request/resources/page1.html"
+ );
+ // Present the payment sheet.
+ const showPromise = request.show();
+ // Navigate the iframe to a new location. Wait for the load event to fire.
+ await new Promise(resolve => {
+ iframe.addEventListener("load", resolve);
+ iframe.src = "/payment-request/resources/page2.html";
+ });
+ await promise_rejects(
+ t,
+ "AbortError",
+ showPromise,
+ "The iframe was navigated away, so showPromise must reject with AbortError"
+ );
+ // We are done, so clean up.
+ iframe.remove();
+}, "If a payment request is showing, but its document is navigated away (so no longer fully active), the payment request aborts.");
+</script>
diff --git a/tests/wpt/web-platform-tests/payment-request/resources/page1.html b/tests/wpt/web-platform-tests/payment-request/resources/page1.html
new file mode 100644
index 00000000000..7fc080d380c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/resources/page1.html
@@ -0,0 +1 @@
+<meta charset="utf-8">
diff --git a/tests/wpt/web-platform-tests/payment-request/resources/page2.html b/tests/wpt/web-platform-tests/payment-request/resources/page2.html
new file mode 100644
index 00000000000..7fc080d380c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/resources/page2.html
@@ -0,0 +1 @@
+<meta charset="utf-8">
diff --git a/tests/wpt/web-platform-tests/payment-request/shipping-address-changed-manual.https.html b/tests/wpt/web-platform-tests/payment-request/shipping-address-changed-manual.https.html
new file mode 100644
index 00000000000..1ce6e527b12
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/shipping-address-changed-manual.https.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Chromium authors and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for PaymentRequest shippingAddress attribute</title>
+<link rel="help" href="https://w3c.github.io/payment-request/#shippingaddress-attribute">
+<link rel="help" href="https://w3c.github.io/payment-request/#onshippingaddresschange-attribute">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({ explicit_done: true, explicit_timeout: true });
+const validMethod = Object.freeze({ supportedMethods: "basic-card" });
+const validMethods = Object.freeze([validMethod]);
+const validAmount = Object.freeze({ currency: "USD", value: "5.00" });
+const validTotal = Object.freeze({
+ label: "label",
+ amount: validAmount,
+});
+const validShippingOption = Object.freeze({
+ id: "valid",
+ label: "Shipping Option",
+ amount: validAmount,
+ selected: false,
+});
+const validDetails = Object.freeze({
+ total: validTotal,
+ shippingOptions: [validShippingOption],
+});
+const requestShipping = Object.freeze({
+ requestShipping: true,
+});
+
+function testShippingAddressChange() {
+ promise_test(async t => {
+ const request = new PaymentRequest(
+ validMethods,
+ validDetails,
+ requestShipping
+ );
+ assert_equals(
+ request.shippingAddress,
+ null,
+ "request.shippingAddress must initially be null"
+ );
+ const listenerPromise = new Promise(resolve => {
+ request.addEventListener("shippingaddresschange", () => {
+ resolve(request.shippingAddress);
+ });
+ });
+ const handlerPromise = new Promise(resolve => {
+ request.onshippingaddresschange = () => {
+ resolve(request.shippingAddress);
+ };
+ });
+ request.show().catch(err => err);
+ const results = await Promise.all([listenerPromise, handlerPromise]);
+ assert_true(
+ results.every(obj => obj instanceof PaymentAddress),
+ "Expected instances of PaymentAddress"
+ );
+ await request.abort();
+ });
+ done();
+}
+
+</script>
+
+<h2>PaymentRequest shippingAddress attribute</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When the payment sheet is presented, enter or select a shipping address.
+</p>
+<ol>
+ <li>
+ <button onclick="testShippingAddressChange()">
+ When the shipping address is manually changed, request.shippingAddress is a PaymentAddress.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/updateWith-method-pmi-handling-manual.https.html b/tests/wpt/web-platform-tests/payment-request/updateWith-method-pmi-handling-manual.https.html
new file mode 100644
index 00000000000..adc3d6aaefd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/updateWith-method-pmi-handling-manual.https.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<!-- Copyright © 2017 Mozilla and World Wide Web Consortium, (Massachusetts Institute of Technology, ERCIM, Keio University, Beihang). -->
+<meta charset="utf-8">
+<title>Test for validity of payment method identifiers when calling updateWith() method</title>
+<link rel="help" href="https://www.w3.org/TR/payment-request/#updatewith()-method">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+"use strict";
+setup({ explicit_done: true, explicit_timeout: true });
+const validMethod = Object.freeze({
+ supportedMethods: "https://:@wpt.fyi:443/payment-request",
+});
+
+const validMethods = Object.freeze([validMethod]);
+
+const validAmount = Object.freeze({
+ currency: "USD",
+ value: "1.0",
+});
+
+const validTotal = Object.freeze({
+ label: "Default Total",
+ amount: validAmount,
+});
+
+const validShippingOption = Object.freeze({
+ id: "standard",
+ label: "Shipping option",
+ amount: validAmount,
+ selected: true,
+});
+
+const validDetails = Object.freeze({
+ total: validTotal,
+ shippingOptions: [validShippingOption],
+});
+
+const validModifier = Object.freeze({
+ supportedMethods: "basic-card",
+ total: validTotal,
+});
+
+test(() => {
+ try {
+ new PaymentRequest(validMethods, validDetails);
+ } catch (err) {
+ done();
+ throw err;
+ }
+}, "smoke test");
+
+function manualTest(button, { invalidMethod }) {
+ button.disabled = true;
+ promise_test(async t => {
+ const request = new PaymentRequest(
+ [{ supportedMethods: "basic-card" }],
+ validDetails,
+ { requestShipping: true }
+ );
+ const listener = ev => {
+ const invalidModifier = Object.assign({}, validModifier, {
+ supportedMethods: invalidMethod,
+ });
+ const invalidDetails = Object.assign({}, validDetails, {
+ modifiers: [validModifier, invalidModifier],
+ });
+ ev.updateWith(invalidDetails);
+ };
+ // We test against a valid and an invalid modifier
+ request.addEventListener("shippingaddresschange", listener, { once: true });
+ const showPromise = request.show();
+ await promise_rejects(t, new RangeError(), showPromise);
+ }, button.textContent.trim());
+}
+</script>
+<h2>updateWith() method: test validity of payment method identifiers.</h2>
+<p>
+ When shown a payment sheet, select a different address.
+</p>
+<ol>
+ <li>
+ <button onclick="manualTest(this, {invalidMethod: 'https://:password@example.com'});">
+ Must throw if the URL has a password.
+ </button>
+ </li>
+ <li>
+ <button onclick="manualTest(this, {invalidMethod: 'https://username@example.com'});">
+ Must throw if the URL has a username.
+ </button>
+ </li>
+ <li>
+ <button onclick="manualTest(this, {invalidMethod: 'https://username:password@example.com/pay'});">
+ Must throw if the URL has a username and a password.
+ </button>
+ </li>
+ <li>
+ <button onclick="manualTest(this, {invalidMethod: 'http://username:password@example.com/pay'});">
+ Must throw if it's http, and has a username and password.
+ </button>
+ </li>
+ <li>
+ <button onclick="manualTest(this, {invalidMethod: 'http://foo.com:100000000/pay'});">
+ Must throw if the URL is invalid (port range).
+ </button>
+ </li>
+ <li>
+ <button onclick="manualTest(this, {invalidMethod: 'basic-💳'});">
+ Must throw if the PMI contains characters that are out of range.
+ </button>
+ </li>
+ <li>
+ <button onclick="manualTest(this, {invalidMethod: 'not-https://wpt.fyi/payment-request'});">
+ Must throw if not https.
+ </button>
+ </li>
+ <li>
+ <button onclick="manualTest(this, {invalidMethod: '¡basic-*-card!'});">
+ Must throw if the standardized PMI contains characters outside the ascii range.
+ </button>
+ </li>
+ <li>
+ <button onclick="manualTest(this, {invalidMethod: 'Basic-Card'}); done();">
+ Must throw if standardized PMI has uppercase characters.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/user-abort-algorithm-manual.https.html b/tests/wpt/web-platform-tests/payment-request/user-abort-algorithm-manual.https.html
new file mode 100644
index 00000000000..bfc83ab942c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/user-abort-algorithm-manual.https.html
@@ -0,0 +1,70 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#user-aborts-the-payment-request-algorithm">
+<title>
+ User aborts the payment request algorithm.
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({ explicit_done: true, explicit_timeout: true });
+
+const validAmount = Object.freeze({
+ currency: "USD",
+ value: "1.0",
+});
+const validTotal = Object.freeze({
+ label: "Total due",
+ amount: validAmount,
+});
+const validMethod = Object.freeze({
+ supportedMethods: "basic-card",
+});
+const validMethods = Object.freeze([validMethod]);
+const validDetails = Object.freeze({
+ total: validTotal,
+});
+
+test(() => {
+ try {
+ new PaymentRequest(validMethods, validDetails);
+ } catch (err) {
+ done();
+ throw err;
+ }
+}, "Can construct a payment request (smoke test).");
+
+async function runAbortTest(button) {
+ button.disabled = true;
+ const { textContent: testName } = button;
+ promise_test(async t => {
+ const request = new PaymentRequest(validMethods, validDetails);
+ // Await the user to abort
+ await promise_rejects(t, "AbortError", request.show());
+ // [[state]] is now closed
+ await promise_rejects(t, "InvalidStateError", request.show());
+ }, testName.trim());
+}
+</script>
+<h2>
+ User aborts the payment request algorithm.
+</h2>
+<p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+</p>
+<p>
+ When presented with the payment sheet, abort the payment request
+ (e.g., by hitting the esc key or pressing a UA provided button).
+</p>
+<ol>
+ <li>
+ <button onclick="runAbortTest(this); done();">
+ If the user aborts, the UA must run the user aborts the payment request algorithm.
+ </button>
+ </li>
+</ol>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/payment-request/user-accepts-payment-request-algo-manual.https.html b/tests/wpt/web-platform-tests/payment-request/user-accepts-payment-request-algo-manual.https.html
new file mode 100644
index 00000000000..c4d390f273d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/payment-request/user-accepts-payment-request-algo-manual.https.html
@@ -0,0 +1,220 @@
+<!doctype html>
+<meta charset="utf8">
+<link rel="help" href="https://w3c.github.io/payment-request/#user-accepts-the-payment-request-algorithm">
+<title>
+ User accepts the payment request algorithm
+</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+setup({ explicit_done: true, explicit_timeout: true });
+const basicCardMethod = Object.freeze({
+ supportedMethods: "basic-card",
+});
+const validMethod = Object.freeze({
+ supportedMethods: "this-is-just-for-testings-will-never-match",
+});
+const methods = Object.freeze([basicCardMethod, validMethod]);
+const validAmount = Object.freeze({
+ currency: "USD",
+ value: "5.00",
+});
+const shippingOptions = [
+ Object.freeze({
+ id: "option1",
+ label: "Option 1",
+ amount: validAmount,
+ selected: false,
+ }),
+ Object.freeze({
+ id: "option 2",
+ label: "Option 2",
+ amount: validAmount,
+ selected: true,
+ }),
+];
+
+const detailsNoShippingOptions = Object.freeze({
+ total: {
+ label: "Total due",
+ amount: validAmount,
+ },
+});
+
+const detailsWithShippingOptions = Object.assign({}, detailsNoShippingOptions, {
+ shippingOptions,
+});
+
+const optionsRequestNothing = Object.freeze({
+ requestShipping: false,
+ requestPayerEmail: false,
+ requestPayerName: false,
+ requestPayerPhone: false,
+});
+
+const optionsRequestEverything = Object.freeze({
+ requestShipping: true,
+ requestPayerEmail: true,
+ requestPayerName: true,
+ requestPayerPhone: true,
+});
+
+test(() => {
+ // smoke test
+ try {
+ new PaymentRequest(methods, detailsNoShippingOptions);
+ } catch (err) {
+ done();
+ throw err;
+ }
+}, "Must be able to construct a payment request (smoke test)");
+
+function testAcceptRequestAlgorithm(
+ button,
+ details,
+ options = {},
+ expectedResponse = {}
+) {
+ button.disabled = true;
+ promise_test(async t => {
+ const request = new PaymentRequest(methods, details, options);
+ const response = await request.show();
+ assert_true(
+ response instanceof PaymentResponse,
+ "Expected an instance of PaymentResponse."
+ );
+ // Response [[calledComplete]] is false, so this shouldn't throw
+ await response.complete("success");
+ // For good measure, test that subsequent complete()
+ for (const state of [undefined, "success", "fail", "unknown"]) {
+ await promise_rejects(
+ t,
+ "InvalidStateError",
+ response.complete(state),
+ "Response [[calledComplete]] is true, so InvalidStateError"
+ );
+ }
+ assert_equals(
+ request.id,
+ response.requestId,
+ "Request and response ids must match."
+ );
+ assert_true(response.details instanceof Object, "Expected an object");
+ assert_equals(
+ response.shippingAddress,
+ request.shippingAddress,
+ "Request and response must reference same shippingAddress (or both null)."
+ );
+ assert_equals(
+ response.shippingOption,
+ request.shippingOption,
+ "Request and response must be the same value (or both null)."
+ );
+ if (options.requestShipping === true) {
+ assert_true(
+ response.shippingAddress instanceof PaymentAddress,
+ "Expected an instance of PaymentAddress."
+ );
+ }
+ const expected = {
+ methodName: "basic-card",
+ payerEmail: options.requestPayerEmail
+ ? expectedResponse.payerEmail
+ : null,
+ payerName: options.requestPayerName ? expectedResponse.payerName : null,
+ payerPhone: options.requestPayerPhone
+ ? expectedResponse.payerPhone
+ : null,
+ };
+ for (const [attr, expectedValue] of Object.entries(expected)) {
+ assert_equals(
+ response[attr],
+ expectedValue,
+ `response.${attr} must be ${expectedValue}`
+ );
+ }
+ await promise_rejects(
+ t,
+ "InvalidStateError",
+ request.show(),
+ "Request [[state]] is closed, so InvalidStateError"
+ );
+ }, button.textContent.trim());
+}
+
+</script>
+
+<section>
+ <h2 id="user-accepts-payment-request">User accepts payment request</h2>
+ <p>
+ Click on each button in sequence from top to bottom without refreshing the page.
+ Each button will bring up the Payment Request UI window.
+ </p>
+ <p>
+ When shown the payment sheet, please input a credit card and select Pay.
+ </p>
+ <ol>
+ <li>
+ <button onclick="
+ const detailsWithId = Object.assign({}, detailsNoShippingOptions, { id: 'pass' });
+ testAcceptRequestAlgorithm(this, detailsWithId, optionsRequestNothing);">
+ User accepts payment request, but not shipping is requested.
+ </button> Use any credit card to pay.
+ </li>
+ <li>
+ <button onclick="
+ const requestShipping = Object.assign({}, optionsRequestNothing, {requestShipping: true});
+ const expectedValues = { shippingOption: 'option 2' };
+ testAcceptRequestAlgorithm(this, detailsWithShippingOptions, requestShipping, expectedValues);">
+ User accepts payment request, merchant requests shipping.
+ </button> Select any shipping option, and use any credit card to pay.
+ </li>
+ <li>
+ <button onclick="
+ const requestPayerEmail = Object.assign({}, optionsRequestNothing, {requestPayerEmail: true});
+ const expectValues = { payerEmail: 'wpt@w3.org' };
+ testAcceptRequestAlgorithm(this, detailsNoShippingOptions, requestPayerEmail, expectValues);">
+ User accepts payment request, merchant requests email.
+ </button>
+ When prompted, please use "wpt@w3.org" as the email.
+ </li>
+ <li>
+ <button onclick="
+ const requestPayerPhone = Object.assign({}, optionsRequestNothing, {requestPayerPhone: true});
+ const expectValues = { payerPhone: '+12345678910' };
+ testAcceptRequestAlgorithm(this, detailsNoShippingOptions, requestPayerPhone, expectValues);">
+ User accepts payment request, merchant requests phone.
+ </button>
+ When prompted, please use "+12345678910" as the phone number.
+ </li>
+ <li>
+ <button onclick="
+ const requestPayerName = Object.assign({}, optionsRequestNothing, {requestPayerName: true});
+ const expectValues = { payerName: 'web platform test' };
+ testAcceptRequestAlgorithm(this, detailsNoShippingOptions, requestPayerName, expectValues);">
+ User accepts payment request, merchant requests payer's name.
+ </button>
+ When prompted, please use "web platform test" as the payer name.
+ </li>
+ <li>
+ <button onclick="
+ const expectValues = {
+ payerEmail: 'wpt@w3.org',
+ payerName: 'web platform test',
+ payerPhone: '+12345678910',
+ shippingOption: 'option 2',
+ };
+ testAcceptRequestAlgorithm(this, detailsWithShippingOptions, optionsRequestEverything, expectValues);">
+ User accepts payment request, merchant requests everything.
+ </button>
+ When prompted, please use: "+12345678910" as the phone number, "web platform test" as the payer name, and "wpt@w3.org" as the email. Then press Pay.
+ </li>
+ <li>
+ <button onclick="done()">Done</button>
+ </li>
+ </ol>
+</section>
+<small>
+ If you find a buggy test, please <a href="https://github.com/w3c/web-platform-tests/issues">file a bug</a>
+ and tag one of the <a href="https://github.com/w3c/web-platform-tests/blob/master/payment-request/OWNERS">owners</a>.
+</small>
diff --git a/tests/wpt/web-platform-tests/performance-timeline/idlharness.html b/tests/wpt/web-platform-tests/performance-timeline/idlharness.html
index 0500b3eee5f..8185386476e 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/idlharness.html
+++ b/tests/wpt/web-platform-tests/performance-timeline/idlharness.html
@@ -19,6 +19,12 @@
<pre id='untested_idl' style='display:none'>
interface Performance {
};
+
+typedef double DOMHighResTimeStamp;
+
+[Exposed=(Window,Worker)]
+interface PerformanceMark : PerformanceEntry {
+};
</pre>
<pre id='idl'>
@@ -28,17 +34,11 @@ interface PerformanceEntry {
readonly attribute DOMString entryType;
readonly attribute DOMHighResTimeStamp startTime;
readonly attribute DOMHighResTimeStamp duration;
- serializer = {attribute};
-};
-
-dictionary PerformanceEntryFilterOptions {
- DOMString name;
- DOMString entryType;
- DOMString initiatorType;
+ [Default] object toJSON();
};
partial interface Performance {
- PerformanceEntryList getEntries(optional PerformanceEntryFilterOptions filter);
+ PerformanceEntryList getEntries();
PerformanceEntryList getEntriesByType(DOMString type);
PerformanceEntryList getEntriesByName(DOMString name,
optional DOMString type);
@@ -48,11 +48,12 @@ typedef sequence &lt;PerformanceEntry> PerformanceEntryList;
dictionary PerformanceObserverInit {
required sequence&lt;DOMString> entryTypes;
+ boolean buffered = false;
};
[Exposed=(Window,Worker)]
interface PerformanceObserverEntryList {
- PerformanceEntryList getEntries(optional PerformanceEntryFilterOptions filter);
+ PerformanceEntryList getEntries();
PerformanceEntryList getEntriesByType(DOMString type);
PerformanceEntryList getEntriesByName(DOMString name,
optional DOMString type);
@@ -75,8 +76,11 @@ setup(function() {
idl_array = new IdlArray();
idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
idl_array.add_idls(document.getElementById("idl").textContent);
+ // create first mark
+ self.performance.mark("mark");
idl_array.add_objects({
- Performance: ["window.performance"]
+ Performance: ["window.performance"],
+ PerformanceMark: [self.performance.getEntriesByName("mark")[0]]
});
});
idl_array.test();
diff --git a/tests/wpt/web-platform-tests/performance-timeline/performanceobservers.js b/tests/wpt/web-platform-tests/performance-timeline/performanceobservers.js
index 08587694e5a..3f357374efd 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/performanceobservers.js
+++ b/tests/wpt/web-platform-tests/performance-timeline/performanceobservers.js
@@ -19,3 +19,26 @@ function checkEntries(perfEntriesToCheck, expectedEntries) {
assert_not_equals(findMatch(pe1), null, "Entry matches");
});
}
+
+// Waits for performance.now to advance. Since precision reduction might
+// cause it to return the same value across multiple calls.
+function wait() {
+ var now = performance.now();
+ while (now === performance.now())
+ continue;
+}
+
+// Ensure the entries list is sorted by startTime.
+function checkSorted(entries) {
+ assert_not_equals(entries.length, 0, "entries list must not be empty");
+ if (!entries.length)
+ return;
+
+ var sorted = false;
+ var lastStartTime = entries[0].startTime;
+ for (var i = 1; i < entries.length; ++i) {
+ var currStartTime = entries[i].startTime;
+ assert_less_than_equal(lastStartTime, currStartTime, "entry list must be sorted by startTime");
+ lastStartTime = currStartTime;
+ }
+}
diff --git a/tests/wpt/web-platform-tests/performance-timeline/po-callback-mutate.any.js b/tests/wpt/web-platform-tests/performance-timeline/po-callback-mutate.any.js
new file mode 100644
index 00000000000..8f1b09bc377
--- /dev/null
+++ b/tests/wpt/web-platform-tests/performance-timeline/po-callback-mutate.any.js
@@ -0,0 +1,66 @@
+// META: script=performanceobservers.js
+
+ async_test(function (t) {
+ var callbackCount = 0;
+ var observer = new PerformanceObserver(
+ t.step_func(function (entryList, obs) {
+ callbackCount++;
+
+ if (callbackCount === 1) {
+ checkEntries(entryList.getEntries(), [
+ {entryType: "measure", name: "measure1"},
+ ]);
+ observer.observe({entryTypes: ["mark"]});
+ self.performance.mark("mark2");
+ self.performance.measure("measure2");
+ return;
+ }
+
+ if (callbackCount === 2) {
+ checkEntries(entryList.getEntries(), [
+ {entryType: "mark", name: "mark2"},
+ ]);
+ self.performance.mark("mark-before-change-observe-state-to-measure");
+ self.performance.measure("measure-before-change-observe-state-to-measure");
+ observer.observe({entryTypes: ["measure"]});
+ self.performance.mark("mark3");
+ self.performance.measure("measure3");
+ return;
+ }
+
+ if (callbackCount === 3) {
+ checkEntries(entryList.getEntries(), [
+ {entryType: "measure", name: "measure3"},
+ {entryType: "mark", name: "mark-before-change-observe-state-to-measure"},
+ ]);
+ self.performance.mark("mark-before-change-observe-state-to-both");
+ self.performance.measure("measure-before-change-observe-state-to-both");
+ observer.observe({entryTypes: ["mark", "measure"]});
+ self.performance.mark("mark4");
+ self.performance.measure("measure4");
+ return;
+ }
+
+ if (callbackCount === 4) {
+ checkEntries(entryList.getEntries(), [
+ {entryType: "measure", name: "measure-before-change-observe-state-to-both"},
+ {entryType: "measure", name: "measure4"},
+ {entryType: "mark", name: "mark4"},
+ ]);
+ self.performance.mark("mark-before-disconnect");
+ self.performance.measure("measure-before-disconnect");
+ observer.disconnect();
+ self.performance.mark("mark-after-disconnect");
+ self.performance.measure("measure-after-disconnect");
+ t.done();
+ return;
+ }
+
+ assert_unreached("The callback must not be invoked after disconnecting");
+ })
+ );
+
+ observer.observe({entryTypes: ["measure"]});
+ self.performance.mark("mark1");
+ self.performance.measure("measure1");
+ }, "PerformanceObserver modifications inside callback should update filtering and not clear buffer");
diff --git a/tests/wpt/web-platform-tests/performance-timeline/po-disconnect.any.js b/tests/wpt/web-platform-tests/performance-timeline/po-disconnect.any.js
index 5e207ffc7ac..5f5fb5aa43b 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/po-disconnect.any.js
+++ b/tests/wpt/web-platform-tests/performance-timeline/po-disconnect.any.js
@@ -23,14 +23,15 @@
async_test(function (t) {
var observer = new PerformanceObserver(
- t.step_func(function(entryList, obs) {
- checkEntries(entryList.getEntries(),
- [{ entryType: "mark", name: "mark1"}]);
- t.done();
+ t.step_func(function (entryList, obs) {
+ assert_unreached("This callback must not be invoked");
})
);
observer.observe({entryTypes: ["mark"]});
self.performance.mark("mark1");
observer.disconnect();
self.performance.mark("mark2");
- }, "An observer disconnected after a mark must receive the mark");
+ t.step_timeout(function () {
+ t.done();
+ }, 2000);
+ }, "An observer disconnected after a mark must not have its callback invoked");
diff --git a/tests/wpt/web-platform-tests/performance-timeline/po-entries-sort.any.js b/tests/wpt/web-platform-tests/performance-timeline/po-entries-sort.any.js
new file mode 100644
index 00000000000..b0c781a3c0c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/performance-timeline/po-entries-sort.any.js
@@ -0,0 +1,64 @@
+// META: script=performanceobservers.js
+
+ async_test(function (t) {
+ var stored_entries = [];
+ var stored_entries_by_type = [];
+ var observer = new PerformanceObserver(
+ t.step_func(function (entryList, obs) {
+
+ stored_entries = entryList.getEntries();
+ stored_entries_by_type = entryList.getEntriesByType("mark");
+ stored_entries_by_name = entryList.getEntriesByName("name-repeat");
+ var startTimeOfMark2 = entryList.getEntriesByName("mark2")[0].startTime;
+
+ checkSorted(stored_entries);
+ checkEntries(stored_entries, [
+ {entryType: "measure", name: "measure1"},
+ {entryType: "measure", name: "measure2"},
+ {entryType: "measure", name: "measure3"},
+ {entryType: "measure", name: "name-repeat"},
+ {entryType: "mark", name: "mark1"},
+ {entryType: "mark", name: "mark2"},
+ {entryType: "measure", name: "measure-matching-mark2-1"},
+ {entryType: "measure", name: "measure-matching-mark2-2"},
+ {entryType: "mark", name: "name-repeat"},
+ {entryType: "mark", name: "name-repeat"},
+ ]);
+
+ checkSorted(stored_entries_by_type);
+ checkEntries(stored_entries_by_type, [
+ {entryType: "mark", name: "mark1"},
+ {entryType: "mark", name: "mark2"},
+ {entryType: "mark", name: "name-repeat"},
+ {entryType: "mark", name: "name-repeat"},
+ ]);
+
+ checkSorted(stored_entries_by_name);
+ checkEntries(stored_entries_by_name, [
+ {entryType: "measure", name: "name-repeat"},
+ {entryType: "mark", name: "name-repeat"},
+ {entryType: "mark", name: "name-repeat"},
+ ]);
+
+ observer.disconnect();
+ t.done();
+ })
+ );
+
+ observer.observe({entryTypes: ["mark", "measure"]});
+
+ self.performance.mark("mark1");
+ self.performance.measure("measure1");
+ wait(); // Ensure mark1 !== mark2 startTime by making sure performance.now advances.
+ self.performance.mark("mark2");
+ self.performance.measure("measure2");
+ self.performance.measure("measure-matching-mark2-1", "mark2");
+ wait(); // Ensure mark2 !== mark3 startTime by making sure performance.now advances.
+ self.performance.mark("name-repeat");
+ self.performance.measure("measure3");
+ self.performance.measure("measure-matching-mark2-2", "mark2");
+ wait(); // Ensure name-repeat startTime will differ.
+ self.performance.mark("name-repeat");
+ wait(); // Ensure name-repeat startTime will differ.
+ self.performance.measure("name-repeat");
+ }, "getEntries, getEntriesByType, getEntriesByName sort order");
diff --git a/tests/wpt/web-platform-tests/performance-timeline/po-observe.any.js b/tests/wpt/web-platform-tests/performance-timeline/po-observe.any.js
index 52035674c5d..8520c26e504 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/po-observe.any.js
+++ b/tests/wpt/web-platform-tests/performance-timeline/po-observe.any.js
@@ -14,16 +14,18 @@
assert_throws(new TypeError(), function () {
obs.observe({entryTypes: "mark"});
});
- assert_throws(new TypeError(), function () {
- obs.observe({entryTypes: []});
- });
- assert_throws(new TypeError(), function () {
- obs.observe({entryTypes: ["this-cannot-match-an-entryType"]});
- });
- assert_throws(new TypeError(), function () {
- obs.observe({entryTypes: ["marks","navigate", "resources"]});
- });
- }, "Empty sequence entryTypes throws a TypeError");
+ }, "entryTypes must be a sequence or throw a TypeError");
+
+ test(function () {
+ var obs = new PerformanceObserver(function () { return true; });
+ obs.observe({entryTypes: []});
+ }, "Empty sequence entryTypes is a no-op");
+
+ test(function () {
+ var obs = new PerformanceObserver(function () { return true; });
+ obs.observe({entryTypes: ["this-cannot-match-an-entryType"]});
+ obs.observe({entryTypes: ["marks","navigate", "resources"]});
+ }, "Unknown entryTypes are no-op");
test(function () {
var obs = new PerformanceObserver(function () { return true; });
@@ -33,6 +35,27 @@
}, "Filter unsupported entryType entryType names within the entryTypes sequence");
async_test(function (t) {
+ var finish = t.step_func(function () { t.done(); });
+ var observer = new PerformanceObserver(
+ function (entryList, obs) {
+ var self = this;
+ t.step(function () {
+ assert_true(entryList instanceof PerformanceObserverEntryList, "first callback parameter must be a PerformanceObserverEntryList instance");
+ assert_true(obs instanceof PerformanceObserver, "second callback parameter must be a PerformanceObserver instance");
+ assert_equals(observer, self, "observer is the this value");
+ assert_equals(observer, obs, "observer is second parameter");
+ assert_equals(self, obs, "this and second parameter are the same");
+ observer.disconnect();
+ finish();
+ });
+ }
+ );
+ self.performance.clearMarks();
+ observer.observe({entryTypes: ["mark"]});
+ self.performance.mark("mark1");
+ }, "Check observer callback parameter and this values");
+
+ async_test(function (t) {
var observer = new PerformanceObserver(
t.step_func(function (entryList, obs) {
checkEntries(entryList.getEntries(),
diff --git a/tests/wpt/web-platform-tests/performance-timeline/po-observe.html b/tests/wpt/web-platform-tests/performance-timeline/po-observe.html
index dcfd373f4f4..d65c8a40c98 100644
--- a/tests/wpt/web-platform-tests/performance-timeline/po-observe.html
+++ b/tests/wpt/web-platform-tests/performance-timeline/po-observe.html
@@ -36,7 +36,8 @@ PerformanceObserverInit.buffered should retrieve previously buffered entries
}
function shouldExclude(entry) {
// exclude all `resource` entries that aren't for "square.png"
- return entry.type === "resource" && entry.name.indexOf("square.png") === -1
+ return entry.entryType === "resource" &&
+ entry.name.indexOf("square.png") === -1;
}
function runTest() {
// this PerformanceObserver is a nop because we've already been notified about all of our `entryTypes`
diff --git a/tests/wpt/web-platform-tests/performance-timeline/resources/worker-with-performance-observer.js b/tests/wpt/web-platform-tests/performance-timeline/resources/worker-with-performance-observer.js
new file mode 100644
index 00000000000..a72fe81c47f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/performance-timeline/resources/worker-with-performance-observer.js
@@ -0,0 +1,6 @@
+try {
+ new PerformanceObserver(() => true);
+ postMessage("SUCCESS");
+} catch (ex) {
+ postMessage("FAILURE");
+}
diff --git a/tests/wpt/web-platform-tests/performance-timeline/worker-with-performance-observer.html b/tests/wpt/web-platform-tests/performance-timeline/worker-with-performance-observer.html
new file mode 100644
index 00000000000..fc92bc97100
--- /dev/null
+++ b/tests/wpt/web-platform-tests/performance-timeline/worker-with-performance-observer.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+<head>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+async_test(function(t) {
+ const worker = new Worker("resources/worker-with-performance-observer.js");
+ worker.onmessage = function(event) {
+ t.step(() => assert_equals(event.data, 'SUCCESS'));
+ t.done();
+ }
+}, 'Worker: Test Performance Observer inside a worker.');
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/pointerevents/html/pointerevent_drag_interaction-manual.html b/tests/wpt/web-platform-tests/pointerevents/html/pointerevent_drag_interaction-manual.html
new file mode 100644
index 00000000000..0ac911fd576
--- /dev/null
+++ b/tests/wpt/web-platform-tests/pointerevents/html/pointerevent_drag_interaction-manual.html
@@ -0,0 +1,87 @@
+<html>
+ <head>
+ <title>Pointer Events interaction with drag and drop</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>
+ <!-- Additional helper script for common checks across event types -->
+ <script type="text/javascript" src="../pointerevent_support.js"></script>
+ <script>
+ var eventList = ['pointerdown', 'pointerup', 'pointercancel', 'gotpointercapture', 'lostpointercapture', 'dragstart'];
+
+ PhaseEnum = {
+ DndWithoutCapture: 0,
+ DndWithCapture: 1,
+ DndPrevented: 2,
+ Done: 3,
+ };
+ var phase = PhaseEnum.DndWithoutCapture;
+ var received_events = [];
+
+ function resetTestState() {
+ phase = PhaseEnum.DndWithoutCapture;
+ }
+
+ function run() {
+ var test_pointerEvent = setup_pointerevent_test("pointer events vs drag and drop", ['mouse']);
+
+ var target0 = document.querySelector('#target0');
+ var target1 = document.querySelector('#target1');
+
+ function handleEvent(e) {
+ if (e.type == 'pointerdown') {
+ received_events = [];
+ if (phase == PhaseEnum.DndWithCapture)
+ target0.setPointerCapture(e.pointerId);
+ }
+ received_events.push(e.type + "@" + e.target.id);
+ if (e.type == 'dragstart') {
+ e.dataTransfer.setData('text/plain', 'dragstart test');
+ if (phase == PhaseEnum.DndPrevented)
+ e.preventDefault();
+ }
+ if (phase == PhaseEnum.DndWithoutCapture && e.type == 'pointercancel') {
+ phase++;
+ test(() => {
+ assert_equals(received_events.join(', '), "pointerdown@target0, dragstart@target0, pointercancel@target0", "Pointercancel should be fired with the expected order when drag operation starts.");
+ }, "Pointercancel when drag operation starts");
+ } else if (phase == PhaseEnum.DndWithCapture && e.type == 'lostpointercapture') {
+ test(() => {
+ assert_equals(received_events.join(', '), "pointerdown@target0, gotpointercapture@target0, dragstart@target0, pointercancel@target0, lostpointercapture@target0", "Pointercancel and lostpointercapture should be fired with the expected order when drag operation starts.");
+ }, "Pointercancel while capturing when drag operation starts");
+ phase++;
+ } else if (phase == PhaseEnum.DndPrevented && e.type == 'pointerup') {
+ test(() => {
+ assert_equals(received_events.join(', '), "pointerdown@target0, dragstart@target0, pointerup@target1", "Pointerevent stream shouldn't get interrupted when drag is prevented.");
+ }, "Pointerevent stream when drag is prevented.");
+ phase++;
+ test_pointerEvent.done();
+ }
+ }
+ eventList.forEach(function(eventName) {
+ on_event(target0, eventName, handleEvent);
+ on_event(target1, eventName, handleEvent);
+ });
+ }
+ </script>
+ </head>
+ <body onload="run()">
+ <h1>Pointer Events interaction with drag and drop</h1>
+ <h2 id="pointerTypeDescription"></h2>
+ <h4>
+ Test Description: This test checks that the pointercancel (and if needed lostpointercapture) is dispatched when drag starts.
+ <ol>
+ <li>Press down on the black square.</li>
+ <li>Move your pointer to purple square and release.</li>
+ <li>Repeat the first two steps.</li>
+ <li>Repeat the first two steps once again.</li>
+ </ol>
+ Test passes if the proper behavior of the events is observed.
+ </h4>
+ <div id="testContainer">
+ <div draggable="true" id="target0"></div>
+ <div id="target1"></div>
+ </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 b56670a4e68..33f26675462 100644
--- a/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js
+++ b/tests/wpt/web-platform-tests/pointerevents/pointerevent_support.js
@@ -90,15 +90,13 @@ 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");
+ if (event.buttons === 0) {
+ assert_equals(event.pressure, 0, "pressure is 0 for mouse with no buttons pressed");
}
// TA: 1.7, 1.8
if (event.pointerType === "mouse") {
- if (event.buttons === 0) {
- assert_equals(event.pressure, 0, "pressure is 0 for mouse with no buttons pressed");
- } else {
+ if (event.buttons !== 0) {
assert_equals(event.pressure, 0.5, "pressure is 0.5 for mouse with a button pressed");
}
}
diff --git a/tests/wpt/web-platform-tests/preload/download-resources.html b/tests/wpt/web-platform-tests/preload/download-resources.html
index 7b51e78d285..ee8fdd0ea12 100644
--- a/tests/wpt/web-platform-tests/preload/download-resources.html
+++ b/tests/wpt/web-platform-tests/preload/download-resources.html
@@ -8,24 +8,24 @@
<link rel=preload href="resources/dummy.js" as=script>
<link rel=preload href="resources/dummy.css" as=style>
<link rel=preload href="resources/square.png" as=image>
-<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin>
-<link rel=preload href="/media/white.mp4" as=video>
-<link rel=preload href="/media/sound_5.oga" as=audio>
-<link rel=preload href="/media/foo.vtt" as=track>
+<link rel=preload href="resources/CanvasTest.ttf" as=font crossorigin>
+<link rel=preload href="resources/white.mp4" as=video>
+<link rel=preload href="resources/sound_5.oga" as=audio>
+<link rel=preload href="resources/foo.vtt" as=track>
<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing>
<link rel=preload href="resources/dummy.xml?novalue">
<link rel=preload href="resources/dummy.xml" as="fetch">
<body>
-<script src="resources/dummy.js?pipe=trickle(d5)"></script>
+<script src="resources/dummy.js?pipe=trickle(d5)&download-resources"></script>
<script>
window.addEventListener("load", t.step_func(function() {
verifyPreloadAndRTSupport()
verifyNumberOfDownloads("resources/dummy.js", 1);
verifyNumberOfDownloads("resources/dummy.css", 1);
- verifyNumberOfDownloads("/fonts/CanvasTest.ttf", 1);
- verifyNumberOfDownloads("/media/white.mp4", 1);
- verifyNumberOfDownloads("/media/sound_5.oga", 1);
- verifyNumberOfDownloads("/media/foo.vtt", 1);
+ verifyNumberOfDownloads("resources/CanvasTest.ttf", 1);
+ verifyNumberOfDownloads("resources/white.mp4", 1);
+ verifyNumberOfDownloads("resources/sound_5.oga", 1);
+ verifyNumberOfDownloads("resources/foo.vtt", 1);
verifyNumberOfDownloads("resources/dummy.xml?foo=bar", 0);
verifyNumberOfDownloads("resources/dummy.xml?novalue", 0);
verifyNumberOfDownloads("resources/dummy.xml", 1);
diff --git a/tests/wpt/web-platform-tests/preload/dynamic-adding-preload-nonce.html b/tests/wpt/web-platform-tests/preload/dynamic-adding-preload-nonce.html
new file mode 100644
index 00000000000..10dae6b9958
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/dynamic-adding-preload-nonce.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<script nonce="abc" src="/resources/testharness.js"></script>
+<script nonce="abc" src="/resources/testharnessreport.js"></script>
+<script nonce="abc" src="/preload/resources/preload_helper.js"></script>
+<body>
+<script nonce="abc">
+
+async_test(function(t) {
+ verifyPreloadAndRTSupport();
+ var link = document.createElement("link");
+ link.as = "script";
+ link.rel = "preload";
+ link.href = "resources/dummy.js?with-nonce";
+ link.nonce = "abc";
+ link.onload = link.onerror = t.step_func(function() {
+ t.step_timeout(function() {
+ verifyNumberOfDownloads("resources/dummy.js?with-nonce", 1);
+ t.done();
+ }, 0);
+ });
+ document.body.appendChild(link);
+}, "link preload with nonce attribute");
+
+async_test(function(t) {
+ verifyPreloadAndRTSupport();
+ var link = document.createElement("link");
+ link.as = "script";
+ link.rel = "preload";
+ link.href = "resources/dummy.js?without-nonce";
+ link.onload = link.onerror = t.step_func(function() {
+ t.step_timeout(function() {
+ verifyNumberOfDownloads("resources/dummy.js?without-nonce", 0);
+ t.done();
+ }, 0);
+ });
+ document.body.appendChild(link);
+}, "link preload without nonce attribute");
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/preload/dynamic-adding-preload-nonce.html.headers b/tests/wpt/web-platform-tests/preload/dynamic-adding-preload-nonce.html.headers
new file mode 100644
index 00000000000..85de8bd415d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/dynamic-adding-preload-nonce.html.headers
@@ -0,0 +1 @@
+Content-Security-Policy: script-src 'nonce-abc'
diff --git a/tests/wpt/web-platform-tests/preload/dynamic-adding-preload.html b/tests/wpt/web-platform-tests/preload/dynamic-adding-preload.html
index 535009e0601..2a299bd8446 100644
--- a/tests/wpt/web-platform-tests/preload/dynamic-adding-preload.html
+++ b/tests/wpt/web-platform-tests/preload/dynamic-adding-preload.html
@@ -12,14 +12,15 @@
var link = document.createElement("link");
link.as = "script";
link.rel = "preload";
- link.href = "resources/dummy.js";
+ link.href = "resources/dummy.js?dynamic-adding-preload";
link.onload = t.step_func(function() {
t.step_timeout(function() {
- verifyNumberOfDownloads("resources/dummy.js", 1);
+ verifyNumberOfDownloads("resources/dummy.js?dynamic-adding-preload", 1);
t.done();
}, 0);
});
document.body.appendChild(link);
});
</script>
+<script src="resources/dummy.js?pipe=trickle(d5)&dynamic-adding-preload"></script>
</body>
diff --git a/tests/wpt/web-platform-tests/preload/link-header-on-subresource.html b/tests/wpt/web-platform-tests/preload/link-header-on-subresource.html
new file mode 100644
index 00000000000..22351e37c7b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/link-header-on-subresource.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/preload/resources/preload_helper.js"></script>
+<script>
+ var t = async_test('Makes sure that Link headers on subresources preload resources');
+</script>
+<link rel=stylesheet href="resources/dummy-preloads-subresource.css?link-header-on-subresource">
+<script src="resources/dummy.js?pipe=trickle(d5)&link-header-on-subresources"></script>
+<script>
+ window.addEventListener("load", t.step_func(function() {
+ verifyPreloadAndRTSupport();
+ verifyNumberOfDownloads("/preload/resources/CanvasTest.ttf?link-header-on-subresource", 1);
+ t.done();
+ }));
+</script>
+
diff --git a/tests/wpt/web-platform-tests/preload/link-header-preload-delay-onload.html b/tests/wpt/web-platform-tests/preload/link-header-preload-delay-onload.html
index 86d3b069842..7f38f8c9ee5 100644
--- a/tests/wpt/web-platform-tests/preload/link-header-preload-delay-onload.html
+++ b/tests/wpt/web-platform-tests/preload/link-header-preload-delay-onload.html
@@ -13,11 +13,11 @@
background-image: url(resources/square.png?background);
}
</style>
-<link rel="stylesheet" href="resources/dummy.css">
-<script src="resources/dummy.js"></script>
+<link rel="stylesheet" href="resources/dummy.css?link-header-preload-delay-onload">
+<script src="resources/dummy.js?link-header-preload-delay-onload"></script>
<div id="background"></div>
<script>
- document.write('<img src="resources/square.png">');
+ document.write('<img src="resources/square.png?link-header-preload-delay-onload">');
window.addEventListener("load", t.step_func(function() {
verifyPreloadAndRTSupport();
var entries = performance.getEntriesByType("resource");
@@ -31,10 +31,10 @@
}
}
assert_true(found_background_first);
- verifyNumberOfDownloads("resources/square.png", 1);
+ verifyNumberOfDownloads("resources/square.png?link-header-preload-delay-onload", 1);
verifyNumberOfDownloads("resources/square.png?background", 1);
- verifyNumberOfDownloads("resources/dummy.js", 1);
- verifyNumberOfDownloads("resources/dummy.css", 1);
+ verifyNumberOfDownloads("resources/dummy.js?link-header-preload-delay-onload", 1);
+ verifyNumberOfDownloads("resources/dummy.css?link-header-preload-delay-onload", 1);
t.done();
}));
</script>
diff --git a/tests/wpt/web-platform-tests/preload/link-header-preload-delay-onload.html.headers b/tests/wpt/web-platform-tests/preload/link-header-preload-delay-onload.html.headers
index 6dad172ff05..a9ca424d4be 100644
--- a/tests/wpt/web-platform-tests/preload/link-header-preload-delay-onload.html.headers
+++ b/tests/wpt/web-platform-tests/preload/link-header-preload-delay-onload.html.headers
@@ -1,5 +1,5 @@
Link: </preload/resources/square.png?background>;rel=preload;as=image
-Link: </preload/resources/dummy.js>;rel=preload;as=script
-Link: </preload/resources/dummy.css>;rel=preload;as=style
-Link: </preload/resources/square.png>;rel=preload;as=image
+Link: </preload/resources/dummy.js?link-header-preload-delay-onload>;rel=preload;as=script
+Link: </preload/resources/dummy.css?link-header-preload-delay-onload>;rel=preload;as=style
+Link: </preload/resources/square.png?link-header-preload-delay-onload>;rel=preload;as=image
diff --git a/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html b/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html
new file mode 100644
index 00000000000..2db6eef569f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<script nonce="abc" src="/resources/testharness.js"></script>
+<script nonce="abc" src="/resources/testharnessreport.js"></script>
+<script nonce="abc" src="/preload/resources/preload_helper.js"></script>
+<script nonce="abc">
+ var t = async_test('Makes sure that Link headers preload resources with CSP nonce');
+</script>
+<script nonce="abc" src="resources/dummy.js?pipe=trickle(d5)&link-header-preload-nonce"></script>
+<script nonce="abc">
+ window.addEventListener('load', t.step_func(function() {
+ verifyPreloadAndRTSupport();
+ verifyNumberOfDownloads("resources/dummy.js?without-nonce", 0);
+ verifyNumberOfDownloads("resources/dummy.js?with-nonce", 1);
+ t.done();
+ }));
+</script>
diff --git a/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html.headers b/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html.headers
new file mode 100644
index 00000000000..a3c41d2386a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/link-header-preload-nonce.html.headers
@@ -0,0 +1,3 @@
+Content-Security-Policy: script-src 'nonce-abc'
+Link: </preload/resources/dummy.js?without-nonce>;rel=preload;as=script
+Link: </preload/resources/dummy.js?with-nonce>;rel=preload;as=script;nonce=abc
diff --git a/tests/wpt/web-platform-tests/preload/link-header-preload.html b/tests/wpt/web-platform-tests/preload/link-header-preload.html
index 736a70dfe37..94a731bdceb 100644
--- a/tests/wpt/web-platform-tests/preload/link-header-preload.html
+++ b/tests/wpt/web-platform-tests/preload/link-header-preload.html
@@ -6,13 +6,13 @@
var t = async_test('Makes sure that Link headers preload resources');
</script>
<body>
-<script src="resources/dummy.js?pipe=trickle(d5)"></script>
+<script src="resources/dummy.js?pipe=trickle(d5)&link-header-preload"></script>
<script>
window.addEventListener("load", t.step_func(function() {
verifyPreloadAndRTSupport();
- verifyNumberOfDownloads("resources/square.png", 1);
- verifyNumberOfDownloads("resources/dummy.js", 1);
- verifyNumberOfDownloads("resources/dummy.css", 1);
+ verifyNumberOfDownloads("resources/square.png?link-header-preload", 1);
+ verifyNumberOfDownloads("resources/dummy.js?link-header-preload", 1);
+ verifyNumberOfDownloads("resources/dummy.css?link-header-preload", 1);
t.done();
}));
</script>
diff --git a/tests/wpt/web-platform-tests/preload/link-header-preload.html.headers b/tests/wpt/web-platform-tests/preload/link-header-preload.html.headers
index e61b22e0f7c..293598ee669 100644
--- a/tests/wpt/web-platform-tests/preload/link-header-preload.html.headers
+++ b/tests/wpt/web-platform-tests/preload/link-header-preload.html.headers
@@ -1,4 +1,4 @@
-Link: </preload/resources/dummy.js>;rel=preload;as=script
-Link: </preload/resources/dummy.css>;rel=preload;as=style
-Link: </preload/resources/square.png>;rel=preload;as=image
+Link: </preload/resources/dummy.js?link-header-preload>;rel=preload;as=script
+Link: </preload/resources/dummy.css?link-header-preload>;rel=preload;as=style
+Link: </preload/resources/square.png?link-header-preload>;rel=preload;as=image
diff --git a/tests/wpt/web-platform-tests/preload/onerror-event.html b/tests/wpt/web-platform-tests/preload/onerror-event.html
index e396628abd7..5fae70d3bca 100644
--- a/tests/wpt/web-platform-tests/preload/onerror-event.html
+++ b/tests/wpt/web-platform-tests/preload/onerror-event.html
@@ -28,7 +28,7 @@
<link rel=preload href="non-existent/dummy.xml?foo" as=foobarxmlthing onerror="gibberishFailed = true;">
<link rel=preload href="non-existent/dummy.xml?fetch" as=fetch onerror="fetchFailed = true;">
<link rel=preload href="non-existent/dummy.xml?empty" onerror="emptyFailed = true;">
-<script src="resources/dummy.js?pipe=trickle(d5)"></script>
+<script src="resources/dummy.js?pipe=trickle(d5)&onerror-event"></script>
<script>
window.onload = t.step_func(function() {
verifyPreloadAndRTSupport();
diff --git a/tests/wpt/web-platform-tests/preload/onload-event.html b/tests/wpt/web-platform-tests/preload/onload-event.html
index 86a985286d5..35ba2eb54b8 100644
--- a/tests/wpt/web-platform-tests/preload/onload-event.html
+++ b/tests/wpt/web-platform-tests/preload/onload-event.html
@@ -19,15 +19,15 @@
<link rel=preload href="resources/dummy.js" as=script onload="scriptLoaded = true;">
<link rel=preload href="resources/dummy.css" as=style onload="styleLoaded = true;">
<link rel=preload href="resources/square.png" as=image onload="imageLoaded = true;">
-<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin onload="fontLoaded = true;">
-<link rel=preload href="/media/white.mp4" as=video onload="videoLoaded = true;">
-<link rel=preload href="/media/sound_5.oga" as=audio onload="audioLoaded = true;">
-<link rel=preload href="/media/foo.vtt" as=track onload="trackLoaded = true;">
+<link rel=preload href="resources/CanvasTest.ttf" as=font crossorigin onload="fontLoaded = true;">
+<link rel=preload href="resources/white.mp4" as=video onload="videoLoaded = true;">
+<link rel=preload href="resources/sound_5.oga" as=audio onload="audioLoaded = true;">
+<link rel=preload href="resources/foo.vtt" as=track onload="trackLoaded = true;">
<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing onload="gibberishLoaded = true;" onerror="gibberishErrored = true;">
<link rel=preload href="resources/dummy.xml?fetch" as=fetch onload="fetchLoaded = true;">
<link rel=preload href="resources/dummy.xml" onload="noTypeLoaded = true;">
<body>
-<script src="resources/dummy.js?pipe=trickle(d5)"></script>
+<script src="resources/dummy.js?pipe=trickle(d5)&onload-event"></script>
<script>
window.onload = t.step_func(function() {
verifyPreloadAndRTSupport();
diff --git a/tests/wpt/web-platform-tests/preload/preload-csp.sub.html b/tests/wpt/web-platform-tests/preload/preload-csp.sub.html
index 1454af04328..70db5f474e3 100644
--- a/tests/wpt/web-platform-tests/preload/preload-csp.sub.html
+++ b/tests/wpt/web-platform-tests/preload/preload-csp.sub.html
@@ -9,24 +9,24 @@
<link rel=preload href="{{host}}:{{ports[http][1]}}/preload/resources/dummy.js" as=style>
<link rel=preload href="resources/dummy.css" as=style>
<link rel=preload href="resources/square.png" as=image>
-<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin>
-<link rel=preload href="/media/white.mp4" as=video>
-<link rel=preload href="/media/sound_5.oga" as=audio>
-<link rel=preload href="/media/foo.vtt" as=track>
+<link rel=preload href="resources/CanvasTest.ttf" as=font crossorigin>
+<link rel=preload href="resources/white.mp4" as=video>
+<link rel=preload href="resources/sound_5.oga" as=audio>
+<link rel=preload href="resources/foo.vtt" as=track>
<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing>
<link rel=preload href="resources/dummy.xml">
<body>
-<script src="resources/dummy.js?pipe=trickle(d5)"></script>
+<script src="resources/dummy.js?pipe=trickle(d5)&preload-csp"></script>
<script>
window.onload = t.step_func(function() {
verifyPreloadAndRTSupport();
verifyNumberOfDownloads("{{host}}:{{ports[http][1]}}/preload/resources/dummy.js", 0);
verifyNumberOfDownloads("resources/dummy.css", 0);
verifyNumberOfDownloads("resources/square.png", 0);
- verifyNumberOfDownloads("/fonts/CanvasTest.ttf", 0);
- verifyNumberOfDownloads("/media/white.mp4", 0);
- verifyNumberOfDownloads("/media/sound_5.oga", 0);
- verifyNumberOfDownloads("/media/foo.vtt", 0);
+ verifyNumberOfDownloads("resources/CanvasTest.ttf", 0);
+ verifyNumberOfDownloads("resources/white.mp4", 0);
+ verifyNumberOfDownloads("resources/sound_5.oga", 0);
+ verifyNumberOfDownloads("resources/foo.vtt", 0);
verifyNumberOfDownloads("resources/dummy.xml", 0);
t.done();
});
diff --git a/tests/wpt/web-platform-tests/preload/preload-default-csp.sub.html b/tests/wpt/web-platform-tests/preload/preload-default-csp.sub.html
index 1e99ec70da0..bde6b982bce 100644
--- a/tests/wpt/web-platform-tests/preload/preload-default-csp.sub.html
+++ b/tests/wpt/web-platform-tests/preload/preload-default-csp.sub.html
@@ -9,24 +9,24 @@
<link rel=preload href="{{host}}:{{ports[http][1]}}/preload/resources/dummy.js" as=style>
<link rel=preload href="resources/dummy.css" as=style>
<link rel=preload href="resources/square.png" as=image>
-<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin>
-<link rel=preload href="/media/white.mp4" as=video>
-<link rel=preload href="/media/sound_5.oga" as=audio>
-<link rel=preload href="/media/foo.vtt" as=track>
+<link rel=preload href="resources/CanvasTest.ttf" as=font crossorigin>
+<link rel=preload href="resources/white.mp4" as=video>
+<link rel=preload href="resources/sound_5.oga" as=audio>
+<link rel=preload href="resources/foo.vtt" as=track>
<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing>
<link rel=preload href="resources/dummy.xml">
<body>
-<script src="resources/dummy.js?pipe=trickle(d5)"></script>
+<script src="resources/dummy.js?pipe=trickle(d5)&preload-default-csp"></script>
<script>
window.onload = t.step_func(function() {
verifyPreloadAndRTSupport();
verifyNumberOfDownloads("{{host}}:{{ports[http][1]}}/preload/resources/dummy.js", 0);
verifyNumberOfDownloads("resources/dummy.css", 0);
verifyNumberOfDownloads("resources/square.png", 0);
- verifyNumberOfDownloads("/fonts/CanvasTest.ttf", 0);
- verifyNumberOfDownloads("/media/white.mp4", 0);
- verifyNumberOfDownloads("/media/sound_5.oga", 0);
- verifyNumberOfDownloads("/media/foo.vtt", 0);
+ verifyNumberOfDownloads("resources/CanvasTest.ttf", 0);
+ verifyNumberOfDownloads("resources/white.mp4", 0);
+ verifyNumberOfDownloads("resources/sound_5.oga", 0);
+ verifyNumberOfDownloads("resources/foo.vtt", 0);
verifyNumberOfDownloads("resources/dummy.xml", 0);
t.done();
});
diff --git a/tests/wpt/web-platform-tests/preload/preload-with-type.html b/tests/wpt/web-platform-tests/preload/preload-with-type.html
index 69c52c46ee3..cf79e778c29 100644
--- a/tests/wpt/web-platform-tests/preload/preload-with-type.html
+++ b/tests/wpt/web-platform-tests/preload/preload-with-type.html
@@ -23,31 +23,31 @@
}
return null;
};
- var videoURL = getVideoURI("/media/A4");
- var audioURL = getAudioURI("/media/sound_5");
+ var videoURL = getVideoURI("resources/A4");
+ var audioURL = getAudioURI("resources/sound_5");
var videoFormat = getFormat(videoURL);
var audioFormat = getFormat(audioURL);
</script>
<link rel=preload href="resources/dummy.js" as=script type="text/javascript" onload="scriptLoaded = true;">
<link rel=preload href="resources/dummy.css" as=style type="text/css" onload="styleLoaded = true;">
<link rel=preload href="resources/square.png" as=image type="image/png" onload="imageLoaded = true;">
-<link rel=preload href="/fonts/CanvasTest.ttf" as=font type="font/ttf" crossorigin onload="fontLoaded = true;">
+<link rel=preload href="resources/CanvasTest.ttf" as=font type="font/ttf" crossorigin onload="fontLoaded = true;">
<script>
document.write('<link rel=preload href="' + videoURL + '" as=video type="video/' + videoFormat + '" onload="videoLoaded = true;">');
document.write('<link rel=preload href="' + audioURL + '" as=audio type="audio/' + audioFormat + '" onload="audioLoaded = true;">');
</script>
-<link rel=preload href="/media/foo.vtt" as=track type="text/vtt" onload="trackLoaded = true;">
+<link rel=preload href="resources/foo.vtt" as=track type="text/vtt" onload="trackLoaded = true;">
<link rel=preload href="resources/dummy.js" as=script type="application/foobar" onload="gibberishLoaded++;">
<link rel=preload href="resources/dummy.css" as=style type="text/foobar" onload="gibberishLoaded++;">
<link rel=preload href="resources/square.png" as=image type="image/foobar" onload="gibberishLoaded++;">
-<link rel=preload href="/fonts/CanvasTest.ttf" as=font type="font/foobar" crossorigin onload="gibberishLoaded++;">
+<link rel=preload href="resources/CanvasTest.ttf" as=font type="font/foobar" crossorigin onload="gibberishLoaded++;">
<script>
document.write('<link rel=preload href="' + videoURL + '" as=video type="video/foobar" onload="gibberishLoaded++;">');
document.write('<link rel=preload href="' + audioURL + '" as=audio type="audio/foobar" onload="gibberishLoaded++;">');
</script>
-<link rel=preload href="/media/foo.vtt" as=track type="text/foobar" onload="gibberishLoaded++;">
+<link rel=preload href="resources/foo.vtt" as=track type="text/foobar" onload="gibberishLoaded++;">
<body>
-<script src="resources/dummy.js?pipe=trickle(d5)"></script>
+<script src="resources/dummy.js?pipe=trickle(d5)&preload-with-type"></script>
<script>
window.onload = t.step_func(function() {
verifyPreloadAndRTSupport();
diff --git a/tests/wpt/web-platform-tests/preload/reflected-as-value.html b/tests/wpt/web-platform-tests/preload/reflected-as-value.html
index 4ab815943b0..728f6ec4645 100644
--- a/tests/wpt/web-platform-tests/preload/reflected-as-value.html
+++ b/tests/wpt/web-platform-tests/preload/reflected-as-value.html
@@ -15,6 +15,7 @@ test(function() {
"video": "video",
"audio": "audio",
"track": "track",
+ "fetch": "fetch",
};
var keys = Object.keys(values);
for (var i = 0; i < keys.length; ++i) {
diff --git a/tests/wpt/web-platform-tests/preload/resources/A4.ogv b/tests/wpt/web-platform-tests/preload/resources/A4.ogv
new file mode 100644
index 00000000000..de99616eceb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/A4.ogv
Binary files differ
diff --git a/tests/wpt/web-platform-tests/preload/resources/A4.ogv.sub.headers b/tests/wpt/web-platform-tests/preload/resources/A4.ogv.sub.headers
new file mode 100644
index 00000000000..360e6686bfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/A4.ogv.sub.headers
@@ -0,0 +1 @@
+Cache-Control: max-age=1000
diff --git a/tests/wpt/web-platform-tests/preload/resources/CanvasTest.ttf b/tests/wpt/web-platform-tests/preload/resources/CanvasTest.ttf
new file mode 100644
index 00000000000..9023592ef5a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/CanvasTest.ttf
Binary files differ
diff --git a/tests/wpt/web-platform-tests/preload/resources/CanvasTest.ttf.sub.headers b/tests/wpt/web-platform-tests/preload/resources/CanvasTest.ttf.sub.headers
new file mode 100644
index 00000000000..360e6686bfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/CanvasTest.ttf.sub.headers
@@ -0,0 +1 @@
+Cache-Control: max-age=1000
diff --git a/tests/wpt/web-platform-tests/preload/resources/dummy-preloads-subresource.css b/tests/wpt/web-platform-tests/preload/resources/dummy-preloads-subresource.css
new file mode 100644
index 00000000000..5097166a058
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/dummy-preloads-subresource.css
@@ -0,0 +1 @@
+/* This is just a dummy, empty CSS file */
diff --git a/tests/wpt/web-platform-tests/preload/resources/dummy-preloads-subresource.css.sub.headers b/tests/wpt/web-platform-tests/preload/resources/dummy-preloads-subresource.css.sub.headers
new file mode 100644
index 00000000000..4ada08cdf1e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/dummy-preloads-subresource.css.sub.headers
@@ -0,0 +1,2 @@
+Cache-Control: max-age=1000
+Link: </preload/resources/CanvasTest.ttf?link-header-on-subresource>; rel=preload;as=font;crossorigin
diff --git a/tests/wpt/web-platform-tests/preload/resources/dummy.css.sub.headers b/tests/wpt/web-platform-tests/preload/resources/dummy.css.sub.headers
new file mode 100644
index 00000000000..360e6686bfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/dummy.css.sub.headers
@@ -0,0 +1 @@
+Cache-Control: max-age=1000
diff --git a/tests/wpt/web-platform-tests/preload/resources/dummy.js.sub.headers b/tests/wpt/web-platform-tests/preload/resources/dummy.js.sub.headers
new file mode 100644
index 00000000000..360e6686bfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/dummy.js.sub.headers
@@ -0,0 +1 @@
+Cache-Control: max-age=1000
diff --git a/tests/wpt/web-platform-tests/preload/resources/dummy.xml.sub.headers b/tests/wpt/web-platform-tests/preload/resources/dummy.xml.sub.headers
new file mode 100644
index 00000000000..360e6686bfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/dummy.xml.sub.headers
@@ -0,0 +1 @@
+Cache-Control: max-age=1000
diff --git a/tests/wpt/web-platform-tests/preload/resources/empty.html.sub.headers b/tests/wpt/web-platform-tests/preload/resources/empty.html.sub.headers
new file mode 100644
index 00000000000..360e6686bfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/empty.html.sub.headers
@@ -0,0 +1 @@
+Cache-Control: max-age=1000
diff --git a/tests/wpt/web-platform-tests/preload/resources/foo.vtt b/tests/wpt/web-platform-tests/preload/resources/foo.vtt
new file mode 100644
index 00000000000..b533895c604
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/foo.vtt
@@ -0,0 +1,4 @@
+WEBVTT
+
+00:00:00.000 --> 00:00:05.000
+Foo
diff --git a/tests/wpt/web-platform-tests/preload/resources/foo.vtt.sub.headers b/tests/wpt/web-platform-tests/preload/resources/foo.vtt.sub.headers
new file mode 100644
index 00000000000..360e6686bfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/foo.vtt.sub.headers
@@ -0,0 +1 @@
+Cache-Control: max-age=1000
diff --git a/tests/wpt/web-platform-tests/preload/resources/preload_helper.js b/tests/wpt/web-platform-tests/preload/resources/preload_helper.js
index 50c88126cd5..5a23be74b8d 100644
--- a/tests/wpt/web-platform-tests/preload/resources/preload_helper.js
+++ b/tests/wpt/web-platform-tests/preload/resources/preload_helper.js
@@ -12,5 +12,11 @@ function getAbsoluteURL(url)
function verifyNumberOfDownloads(url, number)
{
- assert_equals(performance.getEntriesByName(getAbsoluteURL(url)).length, number, url);
+ var numDownloads = 0;
+ performance.getEntriesByName(getAbsoluteURL(url)).forEach(entry => {
+ if (entry.transferSize > 0) {
+ numDownloads++;
+ }
+ });
+ assert_equals(numDownloads, number, url);
}
diff --git a/tests/wpt/web-platform-tests/preload/resources/sound_5.oga b/tests/wpt/web-platform-tests/preload/resources/sound_5.oga
new file mode 100644
index 00000000000..239ad2bd08c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/sound_5.oga
Binary files differ
diff --git a/tests/wpt/web-platform-tests/preload/resources/sound_5.oga.sub.headers b/tests/wpt/web-platform-tests/preload/resources/sound_5.oga.sub.headers
new file mode 100644
index 00000000000..360e6686bfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/sound_5.oga.sub.headers
@@ -0,0 +1 @@
+Cache-Control: max-age=1000
diff --git a/tests/wpt/web-platform-tests/preload/resources/square.png.sub.headers b/tests/wpt/web-platform-tests/preload/resources/square.png.sub.headers
new file mode 100644
index 00000000000..360e6686bfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/square.png.sub.headers
@@ -0,0 +1 @@
+Cache-Control: max-age=1000
diff --git a/tests/wpt/web-platform-tests/preload/resources/white.mp4 b/tests/wpt/web-platform-tests/preload/resources/white.mp4
new file mode 100644
index 00000000000..ef609e42813
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/white.mp4
Binary files differ
diff --git a/tests/wpt/web-platform-tests/preload/resources/white.mp4.sub.headers b/tests/wpt/web-platform-tests/preload/resources/white.mp4.sub.headers
new file mode 100644
index 00000000000..360e6686bfb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/preload/resources/white.mp4.sub.headers
@@ -0,0 +1 @@
+Cache-Control: max-age=1000
diff --git a/tests/wpt/web-platform-tests/preload/single-download-preload.html b/tests/wpt/web-platform-tests/preload/single-download-preload.html
index ef174129bb2..83151c2a8d9 100644
--- a/tests/wpt/web-platform-tests/preload/single-download-preload.html
+++ b/tests/wpt/web-platform-tests/preload/single-download-preload.html
@@ -5,54 +5,54 @@
<script>
var t = async_test('Makes sure that preloaded resources are not downloaded again when used');
</script>
-<link rel=preload href="resources/dummy.js" as=script>
-<link rel=preload href="resources/dummy.css" as=style>
-<link rel=preload href="resources/square.png" as=image>
-<link rel=preload href="resources/square.png?background" as=image>
-<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin>
-<link rel=preload href="/media/white.mp4" as=video>
-<link rel=preload href="/media/sound_5.oga" as=audio>
-<link rel=preload href="/media/foo.vtt" as=track>
+<link rel=preload href="resources/dummy.js?single-download-preload" as=script>
+<link rel=preload href="resources/dummy.css?single-download-preload" as=style>
+<link rel=preload href="resources/square.png?single-download-preload" as=image>
+<link rel=preload href="resources/square.png?background&single-download-preload" as=image>
+<link rel=preload href="resources/CanvasTest.ttf?single-download-preload" as=font crossorigin>
+<link rel=preload href="resources/white.mp4?single-download-preload" as=video>
+<link rel=preload href="resources/sound_5.oga?single-download-preload" as=audio>
+<link rel=preload href="resources/foo.vtt?single-download-preload" as=track>
<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing>
-<link rel=preload href="resources/dummy.xml">
+<link rel=preload href="resources/dummy.xml?single-download-preload">
<body>
-<script src="resources/dummy.js?pipe=trickle(d3)"></script>
+<script src="resources/dummy.js?pipe=trickle(d3)&single-download-preload"></script>
<style>
#background {
width: 200px;
height: 200px;
- background-image: url(resources/square.png?background);
+ background-image: url(resources/square.png?backgroundi&single-download-preload);
}
@font-face {
font-family:ahem;
- src: url(/fonts/CanvasTest.ttf);
+ src: url(resources/CanvasTest.ttf?single-download-preload);
}
span { font-family: ahem, Arial; }
</style>
-<link rel="stylesheet" href="resources/dummy.css">
-<script src="resources/dummy.js"></script>
+<link rel="stylesheet" href="resources/dummy.css?single-download-preload">
+<script src="resources/dummy.js?single-download-preload"></script>
<div id="background"></div>
-<img src="resources/square.png">
-<video src="/media/white.mp4">
- <track kind=subtitles src="/media/foo.vtt" srclang=en>
+<img src="resources/square.png?single-download-preload">
+<video src="resources/white.mp4?single-download-preload">
+ <track kind=subtitles src="resources/foo.vtt?single-download-preload" srclang=en>
</video>
-<audio src="/media/sound_5.oga"></audio>
+<audio src="resources/sound_5.oga?single-download-preload"></audio>
<script>
var xhr = new XMLHttpRequest();
- xhr.open("GET", "resources/dummy.xml");
+ xhr.open("GET", "resources/dummy.xml?single-download-preload");
xhr.send();
window.addEventListener("load", t.step_func(function() {
verifyPreloadAndRTSupport();
setTimeout(t.step_func(function() {
- verifyNumberOfDownloads("resources/dummy.js", 1);
- verifyNumberOfDownloads("resources/dummy.css", 1);
- verifyNumberOfDownloads("resources/square.png", 1);
- verifyNumberOfDownloads("resources/square.png?background", 1);
- verifyNumberOfDownloads("/fonts/CanvasTest.ttf", 1);
+ verifyNumberOfDownloads("resources/dummy.js?single-download-preload", 1);
+ verifyNumberOfDownloads("resources/dummy.css?single-download-preload", 1);
+ verifyNumberOfDownloads("resources/square.png?single-download-preload", 1);
+ verifyNumberOfDownloads("resources/square.png?background&single-download-preload", 1);
+ verifyNumberOfDownloads("resources/CanvasTest.ttf?single-download-preload", 1);
verifyNumberOfDownloads("resources/dummy.xml?foobar", 0);
- verifyNumberOfDownloads("/media/foo.vtt", 1);
- verifyNumberOfDownloads("resources/dummy.xml", 1);
+ verifyNumberOfDownloads("resources/foo.vtt?single-download-preload", 1);
+ verifyNumberOfDownloads("resources/dummy.xml?single-download-preload", 1);
// FIXME: We should verify for video and audio as well, but they seem to (flakily?) trigger multiple partial requests.
t.done();
}), 0);
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
index 3d8715bc613..4a73acd1def 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/common.js
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/common.js
@@ -7,7 +7,7 @@
// 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;
+ var castUrl = 'cast:' + castAppId;
window.presentationUrls = [
'support/presentation.html',
@@ -22,4 +22,4 @@
toController: '9bf08fea-a71a-42f9-b3c4-fa19499e4d12',
toReceiver: 'f1fdfd10-b606-4748-a644-0a8e9df3bdd6'
}
-})(window); \ No newline at end of file
+})(window);
diff --git a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/idlharness.https.html b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/idlharness.https.html
index 4c6564628e4..1077ddfd866 100644
--- a/tests/wpt/web-platform-tests/presentation-api/controlling-ua/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/presentation-api/controlling-ua/idlharness.https.html
@@ -28,7 +28,8 @@ partial interface Navigator {
readonly attribute Presentation presentation;
};
-[SecureContext]
+[SecureContext,
+ Exposed=Window]
interface Presentation {
};
@@ -36,9 +37,10 @@ partial interface Presentation {
attribute PresentationRequest? defaultRequest;
};
-[SecureContext,
- Constructor(USVString url),
- Constructor(sequence<USVString> urls)]
+[Constructor(USVString url),
+ Constructor(sequence<USVString> urls),
+ SecureContext,
+ Exposed=Window]
interface PresentationRequest : EventTarget {
Promise<PresentationConnection> start();
Promise<PresentationConnection> reconnect(USVString presentationId);
@@ -47,14 +49,16 @@ interface PresentationRequest : EventTarget {
attribute EventHandler onconnectionavailable;
};
-[SecureContext]
+[SecureContext,
+ Exposed=Window]
interface PresentationAvailability : EventTarget {
readonly attribute boolean value;
attribute EventHandler onchange;
};
-[SecureContext,
- Constructor(DOMString type, PresentationConnectionAvailableEventInit eventInitDict)]
+[Constructor(DOMString type, PresentationConnectionAvailableEventInit eventInitDict),
+ SecureContext,
+ Exposed=Window]
interface PresentationConnectionAvailableEvent : Event {
[SameObject]
readonly attribute PresentationConnection connection;
@@ -76,7 +80,8 @@ enum BinaryType {
"arraybuffer"
};
-[SecureContext]
+[SecureContext,
+ Exposed=Window]
interface PresentationConnection : EventTarget {
readonly attribute USVString id;
readonly attribute USVString url;
@@ -102,8 +107,9 @@ enum PresentationConnectionCloseReason {
"wentaway"
};
-[SecureContext,
- Constructor(DOMString type, PresentationConnectionCloseEventInit eventInitDict)]
+[Constructor(DOMString type, PresentationConnectionCloseEventInit eventInitDict),
+ SecureContext,
+ Exposed=Window]
interface PresentationConnectionCloseEvent : Event {
readonly attribute PresentationConnectionCloseReason reason;
readonly attribute DOMString message;
@@ -132,4 +138,4 @@ dictionary PresentationConnectionCloseEventInit : EventInit {
});
idl_array.test();
})();
-</script> \ No newline at end of file
+</script>
diff --git a/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/PresentationConnection_onmessage_receiving-ua.html b/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/PresentationConnection_onmessage_receiving-ua.html
index e48fffdd6dd..0734a5570c2 100644
--- a/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/PresentationConnection_onmessage_receiving-ua.html
+++ b/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/PresentationConnection_onmessage_receiving-ua.html
@@ -63,8 +63,8 @@ navigator.presentation.receiver.connectionList.then(list => {
assert_equals(connection.binaryType, 'arraybuffer', 'the default value of binaryType is "arraybuffer"');
const eventWatcher = new EventWatcher(t, connection, 'message');
- return eventWatcher.wait_for('message').then(evt => {
- checkEvent(evt);
+ return eventWatcher.wait_for('message').then(event => {
+ checkEvent(event);
assert_equals(event.data, message1, 'receive a string correctly');
return watchEvent(connection, eventWatcher, 'message');
}).then(event => {
diff --git a/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/idlharness_receiving-ua.html b/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/idlharness_receiving-ua.html
index 2566f8e9874..32deeb49a54 100644
--- a/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/idlharness_receiving-ua.html
+++ b/tests/wpt/web-platform-tests/presentation-api/receiving-ua/support/idlharness_receiving-ua.html
@@ -31,7 +31,8 @@ partial interface Navigator {
readonly attribute Presentation presentation;
};
-[SecureContext]
+[SecureContext,
+ Exposed=Window]
interface Presentation {
};
@@ -39,8 +40,9 @@ partial interface Presentation {
readonly attribute PresentationReceiver? receiver;
};
-[SecureContext,
- Constructor(DOMString type, PresentationConnectionAvailableEventInit eventInitDict)]
+[Constructor(DOMString type, PresentationConnectionAvailableEventInit eventInitDict),
+ SecureContext,
+ Exposed=Window]
interface PresentationConnectionAvailableEvent : Event {
[SameObject]
readonly attribute PresentationConnection connection;
@@ -62,7 +64,8 @@ enum BinaryType {
"arraybuffer"
};
-[SecureContext]
+[SecureContext,
+ Exposed=Window]
interface PresentationConnection : EventTarget {
readonly attribute USVString id;
readonly attribute USVString url;
@@ -88,8 +91,9 @@ enum PresentationConnectionCloseReason {
"wentaway"
};
-[SecureContext,
- Constructor(DOMString type, PresentationConnectionCloseEventInit eventInitDict)]
+[Constructor(DOMString type, PresentationConnectionCloseEventInit eventInitDict),
+ SecureContext,
+ Exposed=Window]
interface PresentationConnectionCloseEvent : Event {
readonly attribute PresentationConnectionCloseReason reason;
readonly attribute DOMString message;
@@ -100,12 +104,14 @@ dictionary PresentationConnectionCloseEventInit : EventInit {
DOMString message = "";
};
-[SecureContext]
+[SecureContext,
+ Exposed=Window]
interface PresentationReceiver {
readonly attribute Promise<PresentationConnectionList> connectionList;
};
-[SecureContext]
+[SecureContext,
+ Exposed=Window]
interface PresentationConnectionList : EventTarget {
readonly attribute FrozenArray<PresentationConnection> connections;
attribute EventHandler onconnectionavailable;
diff --git a/tests/wpt/web-platform-tests/quirks-mode/OWNERS b/tests/wpt/web-platform-tests/quirks-mode/OWNERS
index 63851614695..8b137891791 100644
--- a/tests/wpt/web-platform-tests/quirks-mode/OWNERS
+++ b/tests/wpt/web-platform-tests/quirks-mode/OWNERS
@@ -1 +1 @@
-@zcorpan
+
diff --git a/tests/wpt/web-platform-tests/quirks-mode/classname-query-after-sibling-adoption.html b/tests/wpt/web-platform-tests/quirks-mode/classname-query-after-sibling-adoption.html
new file mode 100644
index 00000000000..0fcad36776d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/quirks-mode/classname-query-after-sibling-adoption.html
@@ -0,0 +1,32 @@
+<!-- quirks mode -->
+<html>
+ <head>
+ <title>Quirks mode elements with class names should remain queriable regardless of sibling adoption into standards mode documents</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <div>
+ <button class="Foo"></button>
+ <button class="Foo"></button>
+ </div>
+ <template><div class="Bar"></div></template>
+ <script>
+ test(function () {
+ var templateDocument = document.querySelector("template").content.ownerDocument;
+ assert_equals(templateDocument.compatMode, "CSS1Compat");
+ assert_equals(document.compatMode, "BackCompat");
+ var container = document.querySelector("div");
+ var button1 = container.querySelector(".foo");
+ assert_true(button1 instanceof Element);
+ templateDocument.appendChild(button1);
+ assert_true(templateDocument.querySelector(".Foo") instanceof Element);
+ assert_false(templateDocument.querySelector(".foo") instanceof Element);
+ var button2byHierarchy = container.firstElementChild;
+ var button2bySelector = container.querySelector(".foo");
+ assert_true(button2bySelector instanceof Element);
+ assert_equals(button2bySelector, button2byHierarchy);
+ });
+ </script>
+ </body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/referrer-policy/README.md b/tests/wpt/web-platform-tests/referrer-policy/README.md
index 24897996fab..a4cc29b3851 100644
--- a/tests/wpt/web-platform-tests/referrer-policy/README.md
+++ b/tests/wpt/web-platform-tests/referrer-policy/README.md
@@ -52,7 +52,7 @@ cd ~/web-platform-tests/referrer-policy
git add * && git commit -m "Add generated tests"
# Regenerate the manifest.
-../manifest
+../wpt manifest
```
@@ -87,7 +87,7 @@ cd ~/web-platform-tests/referrer-policy
git add * && git commit -m "Remove generated tests"
# Regenerate the manifest.
-../manifest
+../wpt manifest
```
**Important:**
@@ -136,7 +136,7 @@ cd ~/web-platform-tests/referrer-policy
git add * && git commit -m "Update generated tests"
# Regenerate the manifest.
-../manifest
+../wpt manifest
```
diff --git a/tests/wpt/web-platform-tests/referrer-policy/generic/link-rel-prefetch.html b/tests/wpt/web-platform-tests/referrer-policy/generic/link-rel-prefetch.html
new file mode 100644
index 00000000000..54963141b19
--- /dev/null
+++ b/tests/wpt/web-platform-tests/referrer-policy/generic/link-rel-prefetch.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Referrer policies for resources loaded via link rel prefetch</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <!-- Common global functions for referrer-policy tests. -->
+ <script src="/referrer-policy/generic/common.js"></script>
+ <meta name="referrer" content="origin">
+ <link rel="prefetch" href="/referrer-policy/generic/subresource/image.py">
+ </head>
+ <body>
+ <p>Check that resources loaded via link rel prefetch use the referrer
+ and referrer policy from the document.</p>
+
+ <script>
+ var prefetch_test = async_test("Prefetched image.");
+
+ var img_url = "/referrer-policy/generic/subresource/image.py";
+ prefetch_test.step_timeout(
+ function() {
+ loadImageInWindow(img_url, function (img) {
+ var message = decodeImageData(extractImageData(img));
+ prefetch_test.step(function() { assert_equals(message.headers.referer, document.location.origin + "/")});
+ prefetch_test.done();
+ }, null, window);
+ },
+ 1000);
+ </script>
+
+ <div id="log"></div>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/requestidlecallback/OWNERS b/tests/wpt/web-platform-tests/requestidlecallback/OWNERS
new file mode 100644
index 00000000000..22f36efac12
--- /dev/null
+++ b/tests/wpt/web-platform-tests/requestidlecallback/OWNERS
@@ -0,0 +1,2 @@
+@farre
+@rmcilroy
diff --git a/tests/wpt/web-platform-tests/requestidlecallback/basic.html b/tests/wpt/web-platform-tests/requestidlecallback/basic.html
new file mode 100644
index 00000000000..e481a6bd3bd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/requestidlecallback/basic.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<title>window.requestIdleCallback exists</title>
+<link rel="author" title="Ross McIlroy" href="mailto:rmcilroy@chromium.org" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(function() {
+ assert_equals(typeof window.requestIdleCallback, "function");
+}, "window.requestIdleCallback is defined", {assert: "The window.requestIdleCallback function is used to request callbacks during browser-defined idle time."});
+
+test(function() {
+ assert_equals(typeof window.cancelIdleCallback, "function");
+}, "window.cancelIdleCallback is defined", {assert: "The window.cancelIdleCallback function is used to cancel callbacks scheduled via requestIdleCallback."});
+
+test(function() {
+ assert_equals(typeof window.requestIdleCallback(function() {}), "number");
+}, "window.requestIdleCallback() returns a number", {assert: "The requestIdleCallback method MUST return a long"});
+
+test(function() {
+ assert_equals(typeof window.cancelIdleCallback(1), "undefined");
+}, "window.cancelIdleCallback() returns undefined", {assert: "The cancelIdleCallback method MUST return void"});
+
+async_test(function() {
+ // Check whether requestIdleCallback schedules a callback which gets executed
+ // and the deadline argument is passed correctly.
+ requestIdleCallback(this.step_func_done(function(deadline) {
+ assert_equals(arguments.length, 1, "Only one argument should be passed to callback.");
+ assert_class_string(deadline, "IdleDeadline");
+ assert_equals(typeof deadline.timeRemaining, "function", "IdleDeadline.timeRemaining MUST be a function which returns the time remaining in milliseconds");
+ assert_equals(typeof deadline.timeRemaining(), "number", "IdleDeadline.timeRemaining MUST return a double of the time remaining in milliseconds");
+ assert_true(deadline.timeRemaining() <= 50, "IdleDeadline.timeRemaining() MUST be less than or equal to 50ms in the future.");
+ assert_equals(typeof deadline.didTimeout, "boolean", "IdleDeadline.didTimeout MUST be a boolean");
+ assert_false(deadline.didTimeout, "IdleDeadline.didTimeout MUST be false if requestIdleCallback wasn't scheduled due to a timeout");
+ }));
+}, 'requestIdleCallback schedules callbacks');
+
+async_test(function() {
+ // Check whether requestIdleCallback schedules a callback which gets executed
+ // and the deadline argument is passed correctly.
+ var handle = requestIdleCallback(this.step_func(function(deadline) {
+ assert_unreached("callback should not be called if canceled with cancelIdleCallback");
+ }));
+ cancelIdleCallback(handle);
+ step_timeout(this.step_func_done(), 200);
+}, 'cancelIdleCallback cancels callbacks');
+
+</script>
+<h1>Basic requestIdleCallback Tests</h1>
+<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-exception.html b/tests/wpt/web-platform-tests/requestidlecallback/callback-exception.html
index fecda221dec..fecda221dec 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-exception.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/callback-exception.html
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-idle-periods.html b/tests/wpt/web-platform-tests/requestidlecallback/callback-idle-periods.html
index c066c6055d8..c066c6055d8 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-idle-periods.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/callback-idle-periods.html
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-iframe.html b/tests/wpt/web-platform-tests/requestidlecallback/callback-iframe.html
index 965941be107..965941be107 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-iframe.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/callback-iframe.html
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-invoked.html b/tests/wpt/web-platform-tests/requestidlecallback/callback-invoked.html
index 5e799cf39f9..5e799cf39f9 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-invoked.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/callback-invoked.html
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-multiple-calls.html b/tests/wpt/web-platform-tests/requestidlecallback/callback-multiple-calls.html
index 7bb524beb41..7bb524beb41 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-multiple-calls.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/callback-multiple-calls.html
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-removed-frame.html b/tests/wpt/web-platform-tests/requestidlecallback/callback-removed-frame.html
index ca63f68f8a1..ca63f68f8a1 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-removed-frame.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/callback-removed-frame.html
diff --git a/tests/wpt/web-platform-tests/requestidlecallback/callback-suspended.html b/tests/wpt/web-platform-tests/requestidlecallback/callback-suspended.html
new file mode 100644
index 00000000000..f14eeef028e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/requestidlecallback/callback-suspended.html
@@ -0,0 +1,93 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Dispatching idle callbacks should be able to be suspended and then resumed</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+ function withEventListener(target, event, handler) {
+ handler = handler || (e => e);
+ return new Promise(resolve => {
+ let wrapper = function(e) {
+ let result = handler(e);
+ if (!result) {
+ return;
+ }
+
+ resolve(result);
+ }
+ target.addEventListener(event, wrapper, { once: true });
+ });
+ }
+
+ function makePostBackUrl(name) {
+ return new URL('resources/post_name_on_load.html?name=' + name,
+ window.location).href;
+ }
+
+ function waitForMessage(message, handler) {
+ return withEventListener(window, 'message', e => (e.data === message) && handler(e));;
+ }
+
+ function withWindow(name) {
+ let win = window.open(makePostBackUrl(name))
+ return waitForMessage(name, _ => win);
+ }
+
+ function navigateWindow(win, name) {
+ win.location = makePostBackUrl(name);
+ return waitForMessage(name, _ => win);
+ }
+
+ function waitDuration(delay) {
+ return new Promise(resolve => {
+ step_timeout(resolve, delay);
+ })
+ }
+
+ function goBack(win) {
+ var p = withEventListener(win, 'pagehide');
+ win.history.back();
+ return p;
+ }
+
+ promise_test(t => {
+ let idleCalled = false;
+ let running = true;
+ return withWindow('foo')
+ .then(win => {
+ let callback = function(d) {
+ idleCalled = true;
+ if (running) {
+ win.requestIdleCallback(callback);
+ }
+ };
+
+ win.requestIdleCallback(callback);
+
+ return navigateWindow(win, 'bar')
+ .then(_ => idleCalled = false)
+ .then(_ => waitDuration(2000))
+ .then(_ => {
+ assert_false(idleCalled, "idle callback shouldn't have been called yet");
+ return goBack(win);
+ })
+ .then(_ => Promise.race([
+ // At this point it's a matter of having bfcache ...
+ waitDuration(2000)
+ .then(_ => {
+ assert_true(idleCalled, "idle callback should've been called by now");
+ running = false;
+ }),
+ // ... or not. If not, we expect a load event.
+ waitForMessage("foo", _ => win)
+ ]))
+ .then(_ => win.close())
+ .catch(e => {
+ win.close();
+ throw e;
+ })
+ });
+ });
+
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout-with-raf.html b/tests/wpt/web-platform-tests/requestidlecallback/callback-timeout-with-raf.html
index 54339dcc01b..54339dcc01b 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout-with-raf.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/callback-timeout-with-raf.html
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout.html b/tests/wpt/web-platform-tests/requestidlecallback/callback-timeout.html
index cc2660a1906..cc2660a1906 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/callback-timeout.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/callback-timeout.html
diff --git a/tests/wpt/web-platform-tests/requestidlecallback/callback-xhr-sync.html b/tests/wpt/web-platform-tests/requestidlecallback/callback-xhr-sync.html
new file mode 100644
index 00000000000..0c759736e50
--- /dev/null
+++ b/tests/wpt/web-platform-tests/requestidlecallback/callback-xhr-sync.html
@@ -0,0 +1,16 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+ async_test(function (t) {
+ requestIdleCallback(function() {
+ requestIdleCallback(t.step_func_done(function () {}))
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", "www.emample.com", false);
+ xhr.onload = t.step_func(function () {});
+ xhr.send(null);
+ });
+ }, "re-schedule idle callbacks after sync xhr");
+</script>
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/cancel-invoked.html b/tests/wpt/web-platform-tests/requestidlecallback/cancel-invoked.html
index 9fb77d65dc5..9fb77d65dc5 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/cancel-invoked.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/cancel-invoked.html
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/idlharness.html b/tests/wpt/web-platform-tests/requestidlecallback/idlharness.html
index 6033535f397..6033535f397 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/idlharness.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/idlharness.html
diff --git a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/resources/post_name_on_load.html b/tests/wpt/web-platform-tests/requestidlecallback/resources/post_name_on_load.html
index 4679a6e6ec7..4679a6e6ec7 100644
--- a/tests/wpt/web-platform-tests/html/webappapis/idle-callbacks/resources/post_name_on_load.html
+++ b/tests/wpt/web-platform-tests/requestidlecallback/resources/post_name_on_load.html
diff --git a/tests/wpt/web-platform-tests/resize-observer/OWNERS b/tests/wpt/web-platform-tests/resize-observer/OWNERS
new file mode 100644
index 00000000000..e3958e59b2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resize-observer/OWNERS
@@ -0,0 +1,2 @@
+@atotic
+@dholbert
diff --git a/tests/wpt/web-platform-tests/resize-observer/eventloop.html b/tests/wpt/web-platform-tests/resize-observer/eventloop.html
new file mode 100644
index 00000000000..4ef1d3d23c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resize-observer/eventloop.html
@@ -0,0 +1,259 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/resizeTestHelper.js"></script>
+<style>
+ div {
+ border: 1px dotted gray
+ }
+</style>
+<p>ResizeObserver notification event loop tests</p>
+<div id="target1" style="width:100px;height:100px;">t1
+</div>
+<div id="container">
+ <div id="a1" style="width:100px;height:100px">
+ <div id="a2" style="width:100px;height:100px">
+ </div>
+ </div>
+ <div id="b1" style="width:100px;height:100px">
+ <div id="b2" style="width:100px;height:100px">
+ </div>
+ </div>
+</div>
+<script>
+'use strict';
+
+let t1 = document.querySelector('#target1');
+
+// allow uncaught exception because ResizeObserver posts exceptions
+// to window error handler when limit is exceeded.
+// This codepath is tested in this file.
+
+setup({allow_uncaught_exception: true});
+
+function template() {
+ let helper = new ResizeTestHelper(
+ "test0: title",
+ [
+ {
+ setup: observer => {
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+var onErrorCalled = false;
+
+window.onerror = err => {
+ onErrorCalled = true;
+}
+
+function test0() {
+
+ let divs = [t1];
+ let rAF = 0;
+ let helper = new ResizeTestHelper(
+ "test0: multiple notifications inside same event loop",
+ [
+ {
+ setup: observer => {
+ onErrorCalled = false;
+ let t2 = document.createElement('div');
+ let t3 = document.createElement('div');
+ t2.appendChild(t3);
+ t1.appendChild(t2);
+ divs.push(t2);
+ divs.push(t3);
+ observer.observe(t1);
+ observer.observe(t2);
+ observer.observe(t3);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 3, "3 notifications");
+ }
+ },
+ {
+ setup: observer => {
+ helper.startCountingRaf();
+ divs.forEach( el => { el.style.width = "101px";});
+ },
+ notify: (entries, observer) => {
+ // t1 is not delivered
+ assert_equals(entries.length, 2, "2 notifications");
+ assert_equals(helper.rafCount, 0, "still in same loop");
+ }
+ },
+ {
+ setup: observer => {
+ divs.forEach( el => { el.style.width = "102px";});
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1, "1 notifications");
+ assert_equals(helper.rafCount, 0, "same loop");
+ }
+ },
+ { // t1 and t2 get notified
+ setup: observer => {
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 2, "2 notifications");
+ assert_equals(helper.rafCount, 1, "new loop");
+ assert_equals(onErrorCalled, true, "error was fired");
+ observer.disconnect();
+ while (t1.childNodes.length > 0)
+ t1.removeChild(t1.childNodes[0]);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test1() {
+
+ var resizers = [t1];
+ // Testing depths of shadow roots
+ // DOM: t1 <- t2 <- t3 <-shadow- t4 <- t5
+ let helper = new ResizeTestHelper(
+ "test1: depths of shadow roots",
+ [
+ {
+ setup: observer => {
+ onErrorCalled = false;
+ let t2 = document.createElement('div');
+ t1.appendChild(t2);
+ resizers.push(t2);
+ let t3 = document.createElement('div');
+ resizers.push(t3);
+ t2.appendChild(t3);
+ let shadow = t3.createShadowRoot();
+ let t4 = document.createElement('div');
+ resizers.push(t4);
+ shadow.appendChild(t4);
+ let t5 = document.createElement('div');
+ resizers.push(t5);
+ t4.appendChild(t5);
+ resizers.forEach( el => observer.observe(el) );
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 5, "all entries resized");
+ }
+ },
+ {
+ setup: observer => {
+ resizers.forEach( el => el.style.width = "111px" );
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 4, "depth limited");
+ }
+ },
+ {
+ setup: observer => {
+ resizers.forEach( el => el.style.width = "112px" );
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 3, "depth limited");
+ }
+ },
+ {
+ setup: observer => {
+ resizers.forEach( el => el.style.width = "113px" );
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 2, "depth limited");
+ }
+ },
+ {
+ setup: observer => {
+ resizers.forEach( el => el.style.width = "114px" );
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1, "depth limited");
+ }
+ },
+ {
+ setup: observer => {
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 4, "limit notifications");
+ assert_equals(onErrorCalled, true, "breached limit");
+ observer.disconnect();
+ t1.removeChild(t1.firstChild);
+ }
+ },
+ ]);
+ return helper.start();
+}
+
+function test2() {
+ let container = document.querySelector('#container');
+ let a1 = document.querySelector('#a1');
+ let a2 = document.querySelector('#a2');
+ let b1 = document.querySelector('#b1');
+ let b2 = document.querySelector('#b2');
+ let targets = [a1, a2, b1, b2];
+
+ let helper = new ResizeTestHelper(
+ "test2: move target in dom while inside event loop",
+ [
+ {
+ setup: observer => {
+ for (let t of targets)
+ observer.observe(t);
+ },
+ notify: (entries, observer) => {
+ return true; // delay next observation
+ }
+ },
+ { // resize them all
+ setup: observer => {
+ for (let t of targets)
+ t.style.width = "110px";
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, targets.length, "all targets observed");
+ }
+ },
+ { // resize all, move dom upwards
+ setup: observer => {
+ for (let t of targets)
+ t.style.width = "130px";
+ container.appendChild(b2);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1, "b2 moved upwards");
+ assert_equals(entries[0].target, a2);
+ }
+ },
+ { // resize all, move dom downwards
+ setup: observer => {
+ for (let t of targets)
+ t.style.width = "130px";
+ a2.appendChild(b2);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1, "b2 moved downwards");
+ assert_equals(entries[0].target, b2);
+ a1.appendChild(a2);
+ }
+ },
+ ]);
+ return helper.start();
+}
+
+let guard;
+test(_ => {
+ assert_own_property(window, "ResizeObserver");
+ guard = async_test('guard');
+}, "ResizeObserver implemented")
+
+test0()
+ .then(() => { return test1(); })
+ .then(() => { return test2(); })
+ .then(() => { guard.done(); });
+
+</script>
+
diff --git a/tests/wpt/web-platform-tests/resize-observer/notify.html b/tests/wpt/web-platform-tests/resize-observer/notify.html
new file mode 100644
index 00000000000..d5888515d5a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resize-observer/notify.html
@@ -0,0 +1,351 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/resizeTestHelper.js"></script>
+<style>
+ div {
+ border: 1px dotted gray
+ }
+ .transform {
+ transform: scale(2,2) rotate(90deg)
+ }
+</style>
+<p>ResizeObserver tests</p>
+<div id="target1" style="width:100px;height:100px;">t1
+ <div id="target2" style="width:100px;height:100px;">t2
+ <div id="target3" style="width:100px;height:100px;">t3
+ <span id="inline">inline</span>
+ </div>
+ </div>
+</div>
+<div id="absolute" style="width:100.5px;height:100.5px;position:absolute;top:10.3px;left:10.3px"></div>
+<script>
+'use strict';
+
+let t1 = document.querySelector('#target1');
+let t2 = document.querySelector('#target2');
+let t3 = document.querySelector('#target3');
+let abs = document.querySelector('#absolute');
+let inline = document.querySelector('#inline');
+
+function test0() {
+ let helper = new ResizeTestHelper(
+ "test0: notification ordering",
+ [
+ {
+ setup: observer => {
+ observer.observe(t3);
+ observer.observe(t2);
+ observer.observe(t1);
+ t1.style.width = "5px";
+ t3.style.width = "5px";
+ t2.style.width = "5px";
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 3, "3 resizes");
+ assert_equals(entries[0].target, t3, "ordering");
+ assert_equals(entries[1].target, t2, "ordering");
+ assert_equals(entries[2].target, t1, "ordering");
+ observer.disconnect();
+ t1.style.width = "100px";
+ t2.style.width = "100px";
+ t3.style.width = "100px";
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test1() {
+ let helper = new ResizeTestHelper(
+ "test1: display:none triggers notification",
+ [
+ {
+ setup: observer => {
+ observer.observe(t1);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ t1.style.display = "none";
+ },
+ notify: (entries, observer) => {
+ t1.style.display = "";
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+
+function test2() {
+ let helper = new ResizeTestHelper(
+ "test2: remove/appendChild trigger notification",
+ [
+ {
+ setup: observer => {
+ observer.observe(t1);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ { // "removeChild triggers notification"
+ setup: observer => {
+ t1.parentNode.removeChild(t1);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries[0].target, t1);
+ return true; // Delay next step
+ }
+ },
+ { // "appendChild triggers notification",
+ setup: observer => {
+ document.body.appendChild(t1);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries[0].target, t1)
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+
+function test3() {
+ let helper = new ResizeTestHelper(
+ "test3: dimensions match",
+ [
+ {
+ setup: observer => {
+ observer.observe(t1);
+ t1.style.width = "200.5px";
+ t1.style.height = "100px";
+ t1.style.paddingLeft = "20px";
+ t1.style.paddingTop = "10px";
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries[0].contentRect.left,20);
+ assert_equals(entries[0].contentRect.top,10);
+ assert_between_inclusive(entries[0].contentRect.width, 200.4, 200.6, "width is not rounded");
+ assert_equals(entries[0].contentRect.height, 100);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test4() {
+ let helper = new ResizeTestHelper(
+ "test4: transform do not cause notifications",
+ [
+ {
+ setup: observer => {
+ observer.observe(t2);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ t2.classList.add("transform");
+ },
+ notify: (entries, observer) => {
+ assert_unreached("transform must not trigger notifications");
+ },
+ timeout: () => {
+ t2.classList.remove("transform");
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test5() {
+ let helper = new ResizeTestHelper(
+ "test5: moving an element does not trigger notifications",
+ [
+ {
+ setup: observer => {
+ observer.observe(abs);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ abs.style.top = "20.33px";
+ abs.style.left = "20.33px";
+ },
+ notify: (entries, observer) => {
+ assert_unreached("movement should not cause resize notifications");
+ },
+ timeout: () => {
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test6() {
+ let helper = new ResizeTestHelper(
+ "test6: inline element does not notify",
+ [
+ {
+ setup: observer => {
+ observer.observe(inline);
+ observer.observe(t1);
+ t1.style.width = "66px";
+ inline.style.width = "66px";
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1, "inline elements must not trigger notifications");
+ assert_equals(entries[0].target, t1, "inline elements must not trigger notifications");
+ return true; // Delay next step
+ }
+ },
+ { // "inline element that becomes block should notify",
+ setup: observer => {
+ inline.style.display = "block";
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries[0].target, inline);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test7() {
+ let helper = new ResizeTestHelper(
+ "test7: unobserve inside notify callback",
+ [
+ {
+ setup: observer => {
+ observer.observe(t1);
+ observer.observe(t2);
+ },
+ notify: (entries, observer) => {
+ t1.style.width = "777px";
+ t2.style.width = "777px";
+ observer.unobserve(t1);
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1, "only t2 is observed");
+ assert_equals(entries[0].target, t2, "only t2 is observed");
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test8() {
+ let helper = new ResizeTestHelper(
+ "test8: observe inside notify callback",
+ [
+ {
+ setup: observer => {
+ observer.observe(t1);
+ },
+ notify: (entries, observer) => {
+ observer.observe(t2);
+ t2.style.width = "888px";
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1, "only t2 is observed");
+ assert_equals(entries[0].target, t2, "only t2 is observed");
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test9() {
+ let helper = new ResizeTestHelper(
+ "test9: disconnect inside notify callback",
+ [
+ {
+ setup: observer => {
+ observer.observe(t1);
+ },
+ notify: (entries, observer) => {
+ t1.style.width = "999px";
+ observer.disconnect();
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ },
+ notify: (entries, observer) => {
+ assert_unreached("there should be no notifications after disconnect");
+ },
+ timeout: () => {
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test10() {
+ var parent = t1.parentNode;
+ let helper = new ResizeTestHelper(
+ "test10: element notifies when parent removed",
+ [
+ {
+ setup: observer => {
+ observer.observe(t3);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ t1.parentNode.removeChild(t1);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].target, t3);
+ parent.appendChild(t1);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+let guard;
+test(_ => {
+ assert_own_property(window, "ResizeObserver");
+ guard = async_test('guard');
+}, "ResizeObserver implemented")
+
+test0()
+ .then(() => { return test1(); })
+ .then(() => { return test2(); })
+ .then(() => { return test3(); })
+ .then(() => { return test4(); })
+ .then(() => { return test5(); })
+ .then(() => { return test6(); })
+ .then(() => { return test7(); })
+ .then(() => { return test8(); })
+ .then(() => { return test9(); })
+ .then(() => { return test10(); })
+ .then(() => { guard.done(); });
+
+</script>
diff --git a/tests/wpt/web-platform-tests/resize-observer/observe.html b/tests/wpt/web-platform-tests/resize-observer/observe.html
new file mode 100644
index 00000000000..dc1f1958b35
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resize-observer/observe.html
@@ -0,0 +1,207 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/resizeTestHelper.js"></script>
+<p>ResizeObserver tests</p>
+<div id="target1" style="width:100px;height:100px;">t1</div>
+<div id="target2" style="width:100px;height:100px;">t2</div>
+<img id="target3" style="width:100px;height:100px;">
+<iframe src="./resources/iframe.html" width="300px" height="100px" style="display:block"></iframe>
+<script>
+'use strict';
+
+let t1 = document.querySelector('#target1');
+let t2 = document.querySelector('#target2');
+
+// allow uncaught exception because ResizeObserver posts exceptions
+// to window error handler when limit is exceeded.
+setup({allow_uncaught_exception: true});
+
+function test0() {
+ let helper = new ResizeTestHelper(
+ "test0: simple observation",
+ [
+ {
+ setup: observer => {
+ observer.observe(t1);
+ t1.style.width = "5px";
+ },
+ notify: entries => {
+ assert_equals(entries.length, 1, "1 pending notification");
+ assert_equals(entries[0].target, t1, "target is t1");
+ assert_equals(entries[0].contentRect.width, 5, "target width");
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test1() {
+ let helper = new ResizeTestHelper(
+ "test1: multiple observation on same element trigger only one",
+ [
+ {
+ setup: observer => {
+ observer.observe(t1);
+ observer.observe(t1);
+ t1.style.width = "10px";
+ },
+ notify: entries => {
+ assert_equals(entries.length, 1, "1 pending notification");
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test2() {
+ test(() => {
+ assert_throws({name: "TypeError"}, _=> {
+ let ro = new ResizeObserver(() => {});
+ ro.observe({});
+ });
+ },
+ "test2: throw exception when observing non-element"
+ );
+ return Promise.resolve();
+}
+
+function test3() {
+ let helper = new ResizeTestHelper(
+ "test3: disconnect stops all notifications", [
+ {
+ setup: observer => {
+ observer.observe(t1);
+ observer.observe(t2);
+ observer.disconnect();
+ t1.style.width = "30px";
+ },
+ notify: entries => {
+ assert_unreached("no entries should be observed");
+ },
+ timeout: () => {
+ // expected
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test4() {
+ let helper = new ResizeTestHelper(
+ "test4: unobserve target stops notifications, unobserve non-observed does nothing", [
+ {
+ setup: observer => {
+ observer.observe(t1);
+ observer.observe(t2);
+ observer.unobserve(t1);
+ observer.unobserve(document.body);
+ t1.style.width = "40px";
+ t2.style.width = "40px";
+ },
+ notify: entries => {
+ assert_equals(entries.length, 1, "only t2");
+ assert_equals(entries[0].target, t2, "t2 was observed");
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test5() {
+ let t3 = document.querySelector('#target3');
+ var helper = new ResizeTestHelper("test5: observe img",[
+ {
+ setup: observer => {
+ observer.observe(t3);
+ },
+ notify: entries => {
+ }
+ },
+ {
+ setup: observer => {
+ t3.style.width = "100.5px";
+ },
+ notify: entries => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 100.5);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test6() {
+ let resolvePromise;
+ let promise = new Promise((resolve) => {
+ resolvePromise = resolve;
+ });
+ let test = async_test('test6: iframe notifications');
+ let testRequested = false;
+ let iframe = document.querySelector('iframe');
+ window.addEventListener('message', event => {
+ switch(event.data) {
+ case 'readyToTest':
+ if (!testRequested) {
+ iframe.contentWindow.postMessage('startTest', '*');
+ testRequested = true;
+ }
+ break;
+ case 'success':
+ case 'fail':
+ window.requestAnimationFrame(() => {
+ test.step( () => {
+ assert_equals(event.data, 'success');
+ test.done();
+ resolvePromise();
+ });
+ });
+ break;
+ }
+ }, false);
+ return promise;
+}
+
+function test7() {
+ let harnessTest = async_test("test7: callback.this");
+ let resolvePromise;
+ let ro = new ResizeObserver( function(entries, obs) {
+ let callbackThis = this;
+ resolvePromise();
+ harnessTest.step(() => {
+ assert_equals(callbackThis, ro, "callback.this is ResizeObserver");
+ assert_equals(obs, ro, "2nd argument is ResizeObserver");
+ ro.disconnect();
+ // every reference to RO must be null before test completes
+ // to avoid triggering test leak-detection
+ ro = null;
+ callbackThis = null;
+ obs = null;
+ harnessTest.done();
+ });
+ }
+ );
+ ro.observe(t1);
+
+ return new Promise( (resolve, reject) => {
+ resolvePromise = resolve;
+ });
+}
+
+let guard;
+test(_ => {
+ assert_own_property(window, "ResizeObserver");
+ guard = async_test('guard');
+}, "ResizeObserver implemented")
+
+test0()
+ .then(() => { return test1(); })
+ .then(() => { return test2(); })
+ .then(() => { return test3(); })
+ .then(() => { return test4(); })
+ .then(() => { return test5(); })
+ .then(() => { return test6(); })
+ .then(() => { return test7(); })
+ .then(() => { guard.done(); });
+
+</script>
diff --git a/tests/wpt/web-platform-tests/resize-observer/resources/iframe.html b/tests/wpt/web-platform-tests/resize-observer/resources/iframe.html
new file mode 100644
index 00000000000..518317b520b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resize-observer/resources/iframe.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<head>
+ <script src="./resizeTestHelper.js"></script>
+</head>
+<p>iframe test</p>
+<div id="itarget1" style="width:100px;height:100px;">t1</div>
+<script>
+'use strict';
+let t1 = document.querySelector('#itarget1');
+function test0() {
+ let timeoutId = window.setTimeout( () => {
+ window.parent.postMessage('fail', '*');
+ }, ResizeTestHelper.TIMEOUT);
+ let ro = new ResizeObserver(function(entries) {
+ window.clearTimeout(timeoutId);
+ window.parent.postMessage('success', '*');
+ });
+ ro.observe(t1);
+}
+let testStarted = false;
+window.addEventListener('message', function(ev) {
+ switch(ev.data) {
+ case 'startTest':
+ testStarted = true;
+ test0();
+ break;
+ }
+});
+// How does parent know we've loaded problem is solved by
+// broadcasting readyToTest message repeatedly until test starts.
+function broadcastReady() {
+ if (!testStarted) {
+ window.parent.postMessage('readyToTest', '*');
+ window.requestAnimationFrame(broadcastReady);
+ }
+}
+broadcastReady();
+</script>
diff --git a/tests/wpt/web-platform-tests/resize-observer/resources/resizeTestHelper.js b/tests/wpt/web-platform-tests/resize-observer/resources/resizeTestHelper.js
new file mode 100644
index 00000000000..60c681bd933
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resize-observer/resources/resizeTestHelper.js
@@ -0,0 +1,148 @@
+'use strict';
+
+/**
+ ResizeTestHelper is a framework to test ResizeObserver
+ notifications. Use it to make assertions about ResizeObserverEntries.
+ This framework is needed because ResizeObservations are
+ delivered asynchronously inside the event loop.
+
+ Features:
+ - can queue multiple notification steps in a test
+ - handles timeouts
+ - returns Promise that is fullfilled when test completes.
+ Use to chain tests (since parallel async ResizeObserver tests
+ would conflict if reusing same DOM elements).
+
+ Usage:
+
+ create ResizeTestHelper for every test.
+ Make assertions inside notify, timeout callbacks.
+ Start tests with helper.start()
+ Chain tests with Promises.
+ Counts animation frames, see startCountingRaf
+*/
+
+/*
+ @param name: test name
+ @param steps:
+ {
+ setup: function(ResizeObserver) {
+ // called at the beginning of the test step
+ // your observe/resize code goes here
+ },
+ notify: function(entries, observer) {
+ // ResizeObserver callback.
+ // Make assertions here.
+ // Return true if next step should start on the next event loop.
+ },
+ timeout: function() {
+ // Define this if your test expects to time out.
+ // If undefined, timeout is assert_unreached.
+ }
+ }
+*/
+function ResizeTestHelper(name, steps)
+{
+ this._name = name;
+ this._steps = steps || [];
+ this._stepIdx = -1;
+ this._harnessTest = null;
+ this._observer = new ResizeObserver(this._handleNotification.bind(this));
+ this._timeoutBind = this._handleTimeout.bind(this);
+ this._nextStepBind = this._nextStep.bind(this);
+}
+
+ResizeTestHelper.TIMEOUT = 100;
+
+ResizeTestHelper.prototype = {
+ get _currentStep() {
+ return this._steps[this._stepIdx];
+ },
+
+ _nextStep: function() {
+ if (++this._stepIdx == this._steps.length)
+ return this._done();
+ this._timeoutId = this._harnessTest.step_timeout(
+ this._timeoutBind, ResizeTestHelper.TIMEOUT);
+ try {
+ this._steps[this._stepIdx].setup(this._observer);
+ }
+ catch(err) {
+ this._harnessTest.step(() => {
+ assert_unreached("Caught a throw, possible syntax error");
+ });
+ }
+ },
+
+ _handleNotification: function(entries) {
+ if (this._timeoutId) {
+ window.clearTimeout(this._timeoutId);
+ delete this._timeoutId;
+ }
+ this._harnessTest.step(() => {
+ let rafDelay = this._currentStep.notify(entries, this._observer);
+ if (rafDelay)
+ window.requestAnimationFrame(this._nextStepBind);
+ else
+ this._nextStep();
+ });
+ },
+
+ _handleTimeout: function() {
+ delete this._timeoutId;
+ this._harnessTest.step(() => {
+ if (this._currentStep.timeout) {
+ this._currentStep.timeout();
+ }
+ else {
+ assert_unreached("Timed out waiting for notification. (" + ResizeTestHelper.TIMEOUT + "ms)");
+ }
+ this._nextStep();
+ });
+ },
+
+ _done: function() {
+ this._observer.disconnect();
+ delete this._observer;
+ this._harnessTest.done();
+ if (this._rafCountRequest) {
+ window.cancelAnimationFrame(this._rafCountRequest);
+ delete this._rafCountRequest;
+ }
+ window.requestAnimationFrame(() => { this._resolvePromise(); });
+ },
+
+ start: function() {
+ this._harnessTest = async_test(this._name);
+ this._harnessTest.step(() => {
+ assert_equals(this._stepIdx, -1, "start can only be called once");
+ this._nextStep();
+ });
+ return new Promise( (resolve, reject) => {
+ this._resolvePromise = resolve;
+ this._rejectPromise = reject;
+ });
+ },
+
+ get rafCount() {
+ if (!this._rafCountRequest)
+ throw "rAF count is not active";
+ return this._rafCount;
+ },
+
+ _incrementRaf: function() {
+ if (this._rafCountRequest) {
+ this._rafCount++;
+ this._rafCountRequest = window.requestAnimationFrame(this._incrementRafBind);
+ }
+ },
+
+ startCountingRaf: function() {
+ if (this._rafCountRequest)
+ window.cancelAnimationFrame(this._rafCountRequest);
+ if (!this._incrementRafBind)
+ this._incrementRafBind = this._incrementRaf.bind(this);
+ this._rafCount = 0;
+ this._rafCountRequest = window.requestAnimationFrame(this._incrementRafBind);
+ }
+}
diff --git a/tests/wpt/web-platform-tests/resize-observer/svg.html b/tests/wpt/web-platform-tests/resize-observer/svg.html
new file mode 100644
index 00000000000..e3a1ab66076
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resize-observer/svg.html
@@ -0,0 +1,333 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./resources/resizeTestHelper.js"></script>
+<p>ResizeObserver svg tests</p>
+<svg height="430" width="500" >
+ <circle cx="10" cy="10" r="5" style="fill:orange;stroke:black;stroke-width:1" />
+ <ellipse cx="10" cy="30" rx="5" ry="5" style="fill:orange;stroke:black;stroke-width:1"/>
+ <foreignObject cy="50" width="100" height="20">
+ <body>
+ <p>Here is a paragraph that requires word wrap</p>
+ </body>
+ </foreignObject>
+ <image xlink:href="" x="0" y="100" height="30" width="100" />
+ <line x1="0" y1="50" x2="20" y2="70" stroke="black" stroke-width="2"/>
+ <path d="M 0 100 L 100 100 L 50 150 z"
+ style="fill:orange;stroke:black;stroke-width:1" />
+ <polygon points="0,200 100,200 50,250" style="fill:orange;stroke:black;stroke-width:1" />
+ <polyline points="0,300 100,300 50,350" style="fill:orange;stroke:black;stroke-width:1"/>
+ <rect x="0" y="380" width="10" height="10" style="fill:orange; stroke:black; stroke-width:1" />
+ <text x="0" y="400" font-size="20">svg text tag</text>
+</svg>
+<script>
+'use strict';
+
+setup({allow_uncaught_exception: true});
+
+function test0() {
+ let target = document.querySelector('circle');
+ let helper = new ResizeTestHelper(
+ "test0: observe svg:circle",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ target.setAttribute('r', 10);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test1() {
+ let target = document.querySelector('ellipse');
+ let helper = new ResizeTestHelper(
+ "test1: observe svg:ellipse",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ target.setAttribute('rx', 10);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 20);
+ assert_equals(entries[0].contentRect.height, 10);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test2() {
+ let target = document.querySelector('foreignObject');
+ let helper = new ResizeTestHelper(
+ "test2: observe svg:foreignObject",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ target.setAttribute('width', 200);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 200);
+ assert_equals(entries[0].contentRect.height, 20);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test3() {
+ let target = document.querySelector('image');
+ let helper = new ResizeTestHelper(
+ "test3: observe svg:image",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ target.setAttribute('height', 40);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 100);
+ assert_equals(entries[0].contentRect.height, 40);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test4() {
+ let target = document.querySelector('line');
+ let helper = new ResizeTestHelper(
+ "test4: observe svg:line",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ target.setAttribute('y2', 80);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 20);
+ assert_equals(entries[0].contentRect.height, 30);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test5() {
+ let target = document.querySelector('path');
+ let helper = new ResizeTestHelper(
+ "test5: observe svg:path",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ target.setAttribute('d', "M 0 100 L 100 100 L 50 160 z");
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 100);
+ assert_equals(entries[0].contentRect.height, 60);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test6() {
+ let target = document.querySelector('polygon');
+ let helper = new ResizeTestHelper(
+ "test6: observe svg:path",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ target.setAttribute('points', "0,200 100,200 50,260");
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 100);
+ assert_equals(entries[0].contentRect.height, 60);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test7() {
+ let target = document.querySelector('polyline');
+ let helper = new ResizeTestHelper(
+ "test7: observe svg:polyline",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ target.setAttribute('points', "0,300 100,300 50,360");
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 100);
+ assert_equals(entries[0].contentRect.height, 60);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test8() {
+ let target = document.querySelector('rect');
+ let helper = new ResizeTestHelper(
+ "test8: observe svg:rect",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ target.setAttribute('width', "20");
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.width, 20);
+ assert_equals(entries[0].contentRect.height, 10);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+function test9() {
+ let target = document.querySelector('text');
+ let helper = new ResizeTestHelper(
+ "test9: observe svg:text",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ return true; // Delay next step
+ }
+ },
+ {
+ setup: observer => {
+ target.setAttribute('font-size', "25");
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+
+function test10() {
+ let target = document.querySelector('svg');
+ let helper = new ResizeTestHelper(
+ "test10: observe svg:svg, top/left is 0 even with padding",
+ [
+ {
+ setup: observer => {
+ observer.observe(target);
+ },
+ notify: (entries, observer) => {
+ assert_equals(entries.length, 1);
+ assert_equals(entries[0].contentRect.top, 0);
+ assert_equals(entries[0].contentRect.left, 0);
+ }
+ }
+ ]);
+ return helper.start();
+}
+
+let guard;
+test(_ => {
+ assert_own_property(window, "ResizeObserver");
+ guard = async_test('guard');
+}, "ResizeObserver implemented")
+
+test0()
+ .then(() => { return test1(); })
+ .then(() => { return test2(); })
+ .then(() => { return test3(); })
+ .then(() => { return test4(); })
+ .then(() => { return test5(); })
+ .then(() => { return test6(); })
+ .then(() => { return test7(); })
+ .then(() => { return test8(); })
+ .then(() => { return test9(); })
+ .then(() => { return test10(); })
+ .then(() => { guard.done(); });
+
+</script>
diff --git a/tests/wpt/web-platform-tests/resource-timing/idlharness.html b/tests/wpt/web-platform-tests/resource-timing/idlharness.html
index 15afd09441a..a4ea7f4a78f 100644
--- a/tests/wpt/web-platform-tests/resource-timing/idlharness.html
+++ b/tests/wpt/web-platform-tests/resource-timing/idlharness.html
@@ -23,11 +23,20 @@ interface Performance {
};
interface PerformanceEntry {
+ readonly attribute DOMString name;
+ readonly attribute DOMString entryType;
+ readonly attribute DOMHighResTimeStamp startTime;
+ readonly attribute DOMHighResTimeStamp duration;
+ [Default] object toJSON();
};
+[Exposed=(Window,Worker)]
interface EventHandler {
};
+typedef double DOMHighResTimeStamp;
+
+[Exposed=(Window,Worker)]
partial interface Performance {
PerformanceEntryList getEntries();
PerformanceEntryList getEntriesByType(DOMString entryType);
@@ -40,9 +49,11 @@ partial interface Window {
</pre>
<pre id='idl'>
-[Exposed=(Window)]
+[Exposed=(Window,Worker)]
interface PerformanceResourceTiming : PerformanceEntry {
readonly attribute DOMString initiatorType;
+ readonly attribute DOMString nextHopProtocol;
+ readonly attribute DOMHighResTimeStamp workerStart;
readonly attribute DOMHighResTimeStamp redirectStart;
readonly attribute DOMHighResTimeStamp redirectEnd;
readonly attribute DOMHighResTimeStamp fetchStart;
@@ -54,8 +65,12 @@ interface PerformanceResourceTiming : PerformanceEntry {
readonly attribute DOMHighResTimeStamp requestStart;
readonly attribute DOMHighResTimeStamp responseStart;
readonly attribute DOMHighResTimeStamp responseEnd;
- serializer = {inherit, attribute};
+ readonly attribute unsigned long long transferSize;
+ readonly attribute unsigned long long encodedBodySize;
+ readonly attribute unsigned long long decodedBodySize;
+ [Default] object toJSON();
};
+
partial interface Performance {
void clearResourceTimings();
void setResourceTimingBufferSize(unsigned long maxSize);
@@ -71,7 +86,8 @@ partial interface Performance {
idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
idl_array.add_idls(document.getElementById("idl").textContent);
- idl_array.add_objects({Performance: ['window.performance']});
+ idl_array.add_objects({Performance: ['window.performance'],
+ PerformanceResourceTiming: ["window.performance.getEntriesByType('resource')[0]"]});
idl_array.test();
})();
diff --git a/tests/wpt/web-platform-tests/resource-timing/resources/blue.png b/tests/wpt/web-platform-tests/resource-timing/resources/blue.png
new file mode 100644
index 00000000000..820f8cace21
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/resources/blue.png
Binary files differ
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
index 3346da6c969..31a769eb366 100644
--- a/tests/wpt/web-platform-tests/resource-timing/resources/gzip_xml.py
+++ b/tests/wpt/web-platform-tests/resource-timing/resources/gzip_xml.py
@@ -1,8 +1,11 @@
import gzip as gzip_module
from cStringIO import StringIO
+import os
def main(request, response):
- f = open('resource-timing/resources/resource_timing_test0.xml', 'r')
+ dir_path = os.path.dirname(os.path.realpath(__file__))
+ file_path = os.path.join(dir_path, 'resource_timing_test0.xml')
+ f = open(file_path, 'r')
output = f.read()
out = StringIO()
diff --git a/tests/wpt/web-platform-tests/resource-timing/single-entry-per-resource.html b/tests/wpt/web-platform-tests/resource-timing/single-entry-per-resource.html
new file mode 100644
index 00000000000..39d7d5b2566
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resource-timing/single-entry-per-resource.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>One resource when reusing data</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+ var img_entries = 0;
+ var observed = 0;
+ var img_url = "resources/blue.png";
+ var observer = new PerformanceObserver(
+ function (entryList, obs) {
+ var entries = entryList.getEntriesByType("resource");
+ for (var i = 0; i < entries.length; ++i) {
+ ++observed;
+ if (entries[i].name.indexOf(img_url) != -1)
+ ++img_entries;
+ }
+ });
+ observer.observe({entryTypes: ["resource"]});
+ window.onload = function() {
+ // A timeout is needed as PerformanceObserver is not guaranteed to run before onload triggered.
+ setTimeout(function() {
+ test(function(){
+ assert_equals(observed, 1);
+ assert_equals(img_entries, 1);
+ }, "Only one resource entry per resource");
+ },0)
+ };
+ // Images are added dynamically to make sure the observer is registered before their download finishes.
+ var img1 = document.createElement("img");
+ img1.src = img_url;
+ document.body.appendChild(img1);
+ var img2 = document.createElement("img");
+ img2.src = img_url;
+ document.body.appendChild(img2);
+</script>
+<h1>One resource when reusing data</h1>
+<p>
+If the user agent is to reuse the data from another existing or completed fetch initiated from the current document, abort the remaining steps.
+</p>
+<div id="log"></div>
+</body>
+
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 d632a0d5f57..51a3d2c1fc5 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
@@ -162,7 +162,11 @@ function resource_load(expected)
assert_equals(entries_by_name_type.length, 1, "should have a single entry for each resource (with type)");
assert_not_equals(entries_by_name, entries_by_name_type, "values should be copies");
for (p in entries_by_name[0]) {
- assert_equals(entries_by_name[0][p], entries_by_name_type[0][p], "Property " + p + " should match");
+ var assertMethod = assert_equals
+ if (Array.isArray(entries_by_name[0][p]) && Array.isArray(entries_by_name_type[0][p])) {
+ assertMethod = assert_array_equals
+ }
+ assertMethod(entries_by_name[0][p], entries_by_name_type[0][p], "Property " + p + " should match");
}
this.done();
});
diff --git a/tests/wpt/web-platform-tests/resources/OWNERS b/tests/wpt/web-platform-tests/resources/OWNERS
index fadaf79c82f..0b1509a9db9 100644
--- a/tests/wpt/web-platform-tests/resources/OWNERS
+++ b/tests/wpt/web-platform-tests/resources/OWNERS
@@ -1,2 +1,3 @@
@jgraham
-@gsnedders \ No newline at end of file
+@gsnedders
+@ayg
diff --git a/tests/wpt/web-platform-tests/resources/chromium/README.md b/tests/wpt/web-platform-tests/resources/chromium/README.md
new file mode 100644
index 00000000000..b53c6a8c423
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/README.md
@@ -0,0 +1,4 @@
+This directory contains Chromium-specific test resources.
+
+The files `mojo_bindings.js` and `*.mojom.js` are manually copied from the
+Chromium build process's generated files and should not be edited manually.
diff --git a/tests/wpt/web-platform-tests/resources/chromium/chooser_service.mojom.js b/tests/wpt/web-platform-tests/resources/chromium/chooser_service.mojom.js
new file mode 100644
index 00000000000..30bba4baad9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/chooser_service.mojom.js
@@ -0,0 +1,279 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+'use strict';
+
+(function() {
+ var mojomId = 'device/usb/public/interfaces/chooser_service.mojom';
+ if (mojo.internal.isMojomLoaded(mojomId)) {
+ console.warn('The following mojom is loaded multiple times: ' + mojomId);
+ return;
+ }
+ mojo.internal.markMojomLoaded(mojomId);
+
+ // TODO(yzshen): Define these aliases to minimize the differences between the
+ // old/new modes. Remove them when the old mode goes away.
+ var bindings = mojo;
+ var associatedBindings = mojo;
+ var codec = mojo.internal;
+ var validator = mojo.internal;
+
+ var exports = mojo.internal.exposeNamespace('device.mojom');
+ var device$ =
+ mojo.internal.exposeNamespace('device.mojom');
+ if (mojo.config.autoLoadMojomDeps) {
+ mojo.internal.loadMojomIfNecessary(
+ 'device/usb/public/interfaces/device.mojom', 'device.mojom.js');
+ }
+ var device_manager$ =
+ mojo.internal.exposeNamespace('device.mojom');
+ if (mojo.config.autoLoadMojomDeps) {
+ mojo.internal.loadMojomIfNecessary(
+ 'device/usb/public/interfaces/device_manager.mojom', 'device_manager.mojom.js');
+ }
+
+
+
+ function UsbChooserService_GetPermission_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbChooserService_GetPermission_Params.prototype.initDefaults_ = function() {
+ this.deviceFilters = null;
+ };
+ UsbChooserService_GetPermission_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbChooserService_GetPermission_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbChooserService_GetPermission_Params.deviceFilters
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 8, new codec.PointerTo(device_manager$.UsbDeviceFilter), false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbChooserService_GetPermission_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbChooserService_GetPermission_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbChooserService_GetPermission_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.deviceFilters = decoder.decodeArrayPointer(new codec.PointerTo(device_manager$.UsbDeviceFilter));
+ return val;
+ };
+
+ UsbChooserService_GetPermission_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbChooserService_GetPermission_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeArrayPointer(new codec.PointerTo(device_manager$.UsbDeviceFilter), val.deviceFilters);
+ };
+ function UsbChooserService_GetPermission_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbChooserService_GetPermission_ResponseParams.prototype.initDefaults_ = function() {
+ this.result = null;
+ };
+ UsbChooserService_GetPermission_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbChooserService_GetPermission_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbChooserService_GetPermission_ResponseParams.result
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, device$.UsbDeviceInfo, true);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbChooserService_GetPermission_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbChooserService_GetPermission_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbChooserService_GetPermission_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.result = decoder.decodeStructPointer(device$.UsbDeviceInfo);
+ return val;
+ };
+
+ UsbChooserService_GetPermission_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbChooserService_GetPermission_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStructPointer(device$.UsbDeviceInfo, val.result);
+ };
+ var kUsbChooserService_GetPermission_Name = 0;
+
+ function UsbChooserServicePtr(handleOrPtrInfo) {
+ this.ptr = new bindings.InterfacePtrController(UsbChooserService,
+ handleOrPtrInfo);
+ }
+
+ function UsbChooserServiceAssociatedPtr(associatedInterfacePtrInfo) {
+ this.ptr = new associatedBindings.AssociatedInterfacePtrController(
+ UsbChooserService, associatedInterfacePtrInfo);
+ }
+
+ UsbChooserServiceAssociatedPtr.prototype =
+ Object.create(UsbChooserServicePtr.prototype);
+ UsbChooserServiceAssociatedPtr.prototype.constructor =
+ UsbChooserServiceAssociatedPtr;
+
+ function UsbChooserServiceProxy(receiver) {
+ this.receiver_ = receiver;
+ }
+ UsbChooserServicePtr.prototype.getPermission = function() {
+ return UsbChooserServiceProxy.prototype.getPermission
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbChooserServiceProxy.prototype.getPermission = function(deviceFilters) {
+ var params = new UsbChooserService_GetPermission_Params();
+ params.deviceFilters = deviceFilters;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbChooserService_GetPermission_Name,
+ codec.align(UsbChooserService_GetPermission_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbChooserService_GetPermission_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbChooserService_GetPermission_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+
+ function UsbChooserServiceStub(delegate) {
+ this.delegate_ = delegate;
+ }
+ UsbChooserServiceStub.prototype.getPermission = function(deviceFilters) {
+ return this.delegate_ && this.delegate_.getPermission && this.delegate_.getPermission(deviceFilters);
+ }
+
+ UsbChooserServiceStub.prototype.accept = function(message) {
+ var reader = new codec.MessageReader(message);
+ switch (reader.messageName) {
+ default:
+ return false;
+ }
+ };
+
+ UsbChooserServiceStub.prototype.acceptWithResponder =
+ function(message, responder) {
+ var reader = new codec.MessageReader(message);
+ switch (reader.messageName) {
+ case kUsbChooserService_GetPermission_Name:
+ var params = reader.decodeStruct(UsbChooserService_GetPermission_Params);
+ this.getPermission(params.deviceFilters).then(function(response) {
+ var responseParams =
+ new UsbChooserService_GetPermission_ResponseParams();
+ responseParams.result = response.result;
+ var builder = new codec.MessageV1Builder(
+ kUsbChooserService_GetPermission_Name,
+ codec.align(UsbChooserService_GetPermission_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbChooserService_GetPermission_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ default:
+ return false;
+ }
+ };
+
+ function validateUsbChooserServiceRequest(messageValidator) {
+ var message = messageValidator.message;
+ var paramsClass = null;
+ switch (message.getName()) {
+ case kUsbChooserService_GetPermission_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbChooserService_GetPermission_Params;
+ break;
+ }
+ if (paramsClass === null)
+ return validator.validationError.NONE;
+ return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
+ }
+
+ function validateUsbChooserServiceResponse(messageValidator) {
+ var message = messageValidator.message;
+ var paramsClass = null;
+ switch (message.getName()) {
+ case kUsbChooserService_GetPermission_Name:
+ if (message.isResponse())
+ paramsClass = UsbChooserService_GetPermission_ResponseParams;
+ break;
+ }
+ if (paramsClass === null)
+ return validator.validationError.NONE;
+ return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
+ }
+
+ var UsbChooserService = {
+ name: 'device::mojom::UsbChooserService',
+ kVersion: 0,
+ ptrClass: UsbChooserServicePtr,
+ proxyClass: UsbChooserServiceProxy,
+ stubClass: UsbChooserServiceStub,
+ validateRequest: validateUsbChooserServiceRequest,
+ validateResponse: validateUsbChooserServiceResponse,
+ };
+ UsbChooserServiceStub.prototype.validator = validateUsbChooserServiceRequest;
+ UsbChooserServiceProxy.prototype.validator = validateUsbChooserServiceResponse;
+ exports.UsbChooserService = UsbChooserService;
+ exports.UsbChooserServicePtr = UsbChooserServicePtr;
+ exports.UsbChooserServiceAssociatedPtr = UsbChooserServiceAssociatedPtr;
+})(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/resources/chromium/chooser_service.mojom.js.headers b/tests/wpt/web-platform-tests/resources/chromium/chooser_service.mojom.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/chooser_service.mojom.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/resources/chromium/device.mojom.js b/tests/wpt/web-platform-tests/resources/chromium/device.mojom.js
new file mode 100644
index 00000000000..ce5660cd52e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/device.mojom.js
@@ -0,0 +1,3460 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+'use strict';
+
+(function() {
+ var mojomId = 'device/usb/public/interfaces/device.mojom';
+ if (mojo.internal.isMojomLoaded(mojomId)) {
+ console.warn('The following mojom is loaded multiple times: ' + mojomId);
+ return;
+ }
+ mojo.internal.markMojomLoaded(mojomId);
+
+ // TODO(yzshen): Define these aliases to minimize the differences between the
+ // old/new modes. Remove them when the old mode goes away.
+ var bindings = mojo;
+ var associatedBindings = mojo;
+ var codec = mojo.internal;
+ var validator = mojo.internal;
+
+ var exports = mojo.internal.exposeNamespace('device.mojom');
+ var string16$ =
+ mojo.internal.exposeNamespace('mojo.common.mojom');
+ if (mojo.config.autoLoadMojomDeps) {
+ mojo.internal.loadMojomIfNecessary(
+ 'mojo/common/string16.mojom', '../../../../mojo/common/string16.mojom.js');
+ }
+
+
+ var UsbOpenDeviceError = {};
+ UsbOpenDeviceError.OK = 0;
+ UsbOpenDeviceError.ACCESS_DENIED = UsbOpenDeviceError.OK + 1;
+ UsbOpenDeviceError.ALREADY_OPEN = UsbOpenDeviceError.ACCESS_DENIED + 1;
+
+ UsbOpenDeviceError.isKnownEnumValue = function(value) {
+ switch (value) {
+ case 0:
+ case 1:
+ case 2:
+ return true;
+ }
+ return false;
+ };
+
+ UsbOpenDeviceError.validate = function(enumValue) {
+ var isExtensible = false;
+ if (isExtensible || this.isKnownEnumValue(enumValue))
+ return validator.validationError.NONE;
+
+ return validator.validationError.UNKNOWN_ENUM_VALUE;
+ };
+ var UsbTransferDirection = {};
+ UsbTransferDirection.INBOUND = 0;
+ UsbTransferDirection.OUTBOUND = UsbTransferDirection.INBOUND + 1;
+
+ UsbTransferDirection.isKnownEnumValue = function(value) {
+ switch (value) {
+ case 0:
+ case 1:
+ return true;
+ }
+ return false;
+ };
+
+ UsbTransferDirection.validate = function(enumValue) {
+ var isExtensible = false;
+ if (isExtensible || this.isKnownEnumValue(enumValue))
+ return validator.validationError.NONE;
+
+ return validator.validationError.UNKNOWN_ENUM_VALUE;
+ };
+ var UsbControlTransferType = {};
+ UsbControlTransferType.STANDARD = 0;
+ UsbControlTransferType.CLASS = UsbControlTransferType.STANDARD + 1;
+ UsbControlTransferType.VENDOR = UsbControlTransferType.CLASS + 1;
+ UsbControlTransferType.RESERVED = UsbControlTransferType.VENDOR + 1;
+
+ UsbControlTransferType.isKnownEnumValue = function(value) {
+ switch (value) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ return true;
+ }
+ return false;
+ };
+
+ UsbControlTransferType.validate = function(enumValue) {
+ var isExtensible = false;
+ if (isExtensible || this.isKnownEnumValue(enumValue))
+ return validator.validationError.NONE;
+
+ return validator.validationError.UNKNOWN_ENUM_VALUE;
+ };
+ var UsbControlTransferRecipient = {};
+ UsbControlTransferRecipient.DEVICE = 0;
+ UsbControlTransferRecipient.INTERFACE = UsbControlTransferRecipient.DEVICE + 1;
+ UsbControlTransferRecipient.ENDPOINT = UsbControlTransferRecipient.INTERFACE + 1;
+ UsbControlTransferRecipient.OTHER = UsbControlTransferRecipient.ENDPOINT + 1;
+
+ UsbControlTransferRecipient.isKnownEnumValue = function(value) {
+ switch (value) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ return true;
+ }
+ return false;
+ };
+
+ UsbControlTransferRecipient.validate = function(enumValue) {
+ var isExtensible = false;
+ if (isExtensible || this.isKnownEnumValue(enumValue))
+ return validator.validationError.NONE;
+
+ return validator.validationError.UNKNOWN_ENUM_VALUE;
+ };
+ var UsbTransferType = {};
+ UsbTransferType.CONTROL = 0;
+ UsbTransferType.ISOCHRONOUS = UsbTransferType.CONTROL + 1;
+ UsbTransferType.BULK = UsbTransferType.ISOCHRONOUS + 1;
+ UsbTransferType.INTERRUPT = UsbTransferType.BULK + 1;
+
+ UsbTransferType.isKnownEnumValue = function(value) {
+ switch (value) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ return true;
+ }
+ return false;
+ };
+
+ UsbTransferType.validate = function(enumValue) {
+ var isExtensible = false;
+ if (isExtensible || this.isKnownEnumValue(enumValue))
+ return validator.validationError.NONE;
+
+ return validator.validationError.UNKNOWN_ENUM_VALUE;
+ };
+ var UsbTransferStatus = {};
+ UsbTransferStatus.COMPLETED = 0;
+ UsbTransferStatus.TRANSFER_ERROR = UsbTransferStatus.COMPLETED + 1;
+ UsbTransferStatus.TIMEOUT = UsbTransferStatus.TRANSFER_ERROR + 1;
+ UsbTransferStatus.CANCELLED = UsbTransferStatus.TIMEOUT + 1;
+ UsbTransferStatus.STALLED = UsbTransferStatus.CANCELLED + 1;
+ UsbTransferStatus.DISCONNECT = UsbTransferStatus.STALLED + 1;
+ UsbTransferStatus.BABBLE = UsbTransferStatus.DISCONNECT + 1;
+ UsbTransferStatus.SHORT_PACKET = UsbTransferStatus.BABBLE + 1;
+ UsbTransferStatus.PERMISSION_DENIED = UsbTransferStatus.SHORT_PACKET + 1;
+
+ UsbTransferStatus.isKnownEnumValue = function(value) {
+ switch (value) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ return true;
+ }
+ return false;
+ };
+
+ UsbTransferStatus.validate = function(enumValue) {
+ var isExtensible = false;
+ if (isExtensible || this.isKnownEnumValue(enumValue))
+ return validator.validationError.NONE;
+
+ return validator.validationError.UNKNOWN_ENUM_VALUE;
+ };
+
+ function UsbEndpointInfo(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbEndpointInfo.prototype.initDefaults_ = function() {
+ this.endpointNumber = 0;
+ this.direction = 0;
+ this.type = 0;
+ this.packetSize = 0;
+ };
+ UsbEndpointInfo.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbEndpointInfo.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ // validate UsbEndpointInfo.direction
+ err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 4, UsbTransferDirection);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbEndpointInfo.type
+ err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, UsbTransferType);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbEndpointInfo.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbEndpointInfo.decode = function(decoder) {
+ var packed;
+ var val = new UsbEndpointInfo();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.endpointNumber = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.direction = decoder.decodeStruct(codec.Int32);
+ val.type = decoder.decodeStruct(codec.Int32);
+ val.packetSize = decoder.decodeStruct(codec.Uint32);
+ return val;
+ };
+
+ UsbEndpointInfo.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbEndpointInfo.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.endpointNumber);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeStruct(codec.Int32, val.direction);
+ encoder.encodeStruct(codec.Int32, val.type);
+ encoder.encodeStruct(codec.Uint32, val.packetSize);
+ };
+ function UsbAlternateInterfaceInfo(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbAlternateInterfaceInfo.prototype.initDefaults_ = function() {
+ this.alternateSetting = 0;
+ this.classCode = 0;
+ this.subclassCode = 0;
+ this.protocolCode = 0;
+ this.interfaceName = null;
+ this.endpoints = null;
+ };
+ UsbAlternateInterfaceInfo.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbAlternateInterfaceInfo.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 32}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+
+
+
+ // validate UsbAlternateInterfaceInfo.interfaceName
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, string16$.String16, true);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbAlternateInterfaceInfo.endpoints
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 8, new codec.PointerTo(UsbEndpointInfo), false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbAlternateInterfaceInfo.encodedSize = codec.kStructHeaderSize + 24;
+
+ UsbAlternateInterfaceInfo.decode = function(decoder) {
+ var packed;
+ var val = new UsbAlternateInterfaceInfo();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.alternateSetting = decoder.decodeStruct(codec.Uint8);
+ val.classCode = decoder.decodeStruct(codec.Uint8);
+ val.subclassCode = decoder.decodeStruct(codec.Uint8);
+ val.protocolCode = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.interfaceName = decoder.decodeStructPointer(string16$.String16);
+ val.endpoints = decoder.decodeArrayPointer(new codec.PointerTo(UsbEndpointInfo));
+ return val;
+ };
+
+ UsbAlternateInterfaceInfo.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbAlternateInterfaceInfo.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.alternateSetting);
+ encoder.encodeStruct(codec.Uint8, val.classCode);
+ encoder.encodeStruct(codec.Uint8, val.subclassCode);
+ encoder.encodeStruct(codec.Uint8, val.protocolCode);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeStructPointer(string16$.String16, val.interfaceName);
+ encoder.encodeArrayPointer(new codec.PointerTo(UsbEndpointInfo), val.endpoints);
+ };
+ function UsbInterfaceInfo(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbInterfaceInfo.prototype.initDefaults_ = function() {
+ this.interfaceNumber = 0;
+ this.alternates = null;
+ };
+ UsbInterfaceInfo.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbInterfaceInfo.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ // validate UsbInterfaceInfo.alternates
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(UsbAlternateInterfaceInfo), false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbInterfaceInfo.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbInterfaceInfo.decode = function(decoder) {
+ var packed;
+ var val = new UsbInterfaceInfo();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.interfaceNumber = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.alternates = decoder.decodeArrayPointer(new codec.PointerTo(UsbAlternateInterfaceInfo));
+ return val;
+ };
+
+ UsbInterfaceInfo.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbInterfaceInfo.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.interfaceNumber);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeArrayPointer(new codec.PointerTo(UsbAlternateInterfaceInfo), val.alternates);
+ };
+ function UsbConfigurationInfo(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbConfigurationInfo.prototype.initDefaults_ = function() {
+ this.configurationValue = 0;
+ this.configurationName = null;
+ this.interfaces = null;
+ };
+ UsbConfigurationInfo.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbConfigurationInfo.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 32}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ // validate UsbConfigurationInfo.configurationName
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, string16$.String16, true);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbConfigurationInfo.interfaces
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 8, new codec.PointerTo(UsbInterfaceInfo), false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbConfigurationInfo.encodedSize = codec.kStructHeaderSize + 24;
+
+ UsbConfigurationInfo.decode = function(decoder) {
+ var packed;
+ var val = new UsbConfigurationInfo();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.configurationValue = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.configurationName = decoder.decodeStructPointer(string16$.String16);
+ val.interfaces = decoder.decodeArrayPointer(new codec.PointerTo(UsbInterfaceInfo));
+ return val;
+ };
+
+ UsbConfigurationInfo.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbConfigurationInfo.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.configurationValue);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeStructPointer(string16$.String16, val.configurationName);
+ encoder.encodeArrayPointer(new codec.PointerTo(UsbInterfaceInfo), val.interfaces);
+ };
+ function UsbDeviceInfo(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDeviceInfo.prototype.initDefaults_ = function() {
+ this.guid = null;
+ this.usbVersionMajor = 0;
+ this.usbVersionMinor = 0;
+ this.usbVersionSubminor = 0;
+ this.classCode = 0;
+ this.subclassCode = 0;
+ this.protocolCode = 0;
+ this.vendorId = 0;
+ this.productId = 0;
+ this.deviceVersionMajor = 0;
+ this.deviceVersionMinor = 0;
+ this.deviceVersionSubminor = 0;
+ this.activeConfiguration = 0;
+ this.manufacturerName = null;
+ this.productName = null;
+ this.serialNumber = null;
+ this.configurations = null;
+ };
+ UsbDeviceInfo.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDeviceInfo.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 64}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDeviceInfo.guid
+ err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ // validate UsbDeviceInfo.manufacturerName
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, string16$.String16, true);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDeviceInfo.productName
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 32, string16$.String16, true);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDeviceInfo.serialNumber
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, string16$.String16, true);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ // validate UsbDeviceInfo.configurations
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 48, 8, new codec.PointerTo(UsbConfigurationInfo), false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDeviceInfo.encodedSize = codec.kStructHeaderSize + 56;
+
+ UsbDeviceInfo.decode = function(decoder) {
+ var packed;
+ var val = new UsbDeviceInfo();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.guid = decoder.decodeStruct(codec.String);
+ val.usbVersionMajor = decoder.decodeStruct(codec.Uint8);
+ val.usbVersionMinor = decoder.decodeStruct(codec.Uint8);
+ val.usbVersionSubminor = decoder.decodeStruct(codec.Uint8);
+ val.classCode = decoder.decodeStruct(codec.Uint8);
+ val.subclassCode = decoder.decodeStruct(codec.Uint8);
+ val.protocolCode = decoder.decodeStruct(codec.Uint8);
+ val.vendorId = decoder.decodeStruct(codec.Uint16);
+ val.productId = decoder.decodeStruct(codec.Uint16);
+ val.deviceVersionMajor = decoder.decodeStruct(codec.Uint8);
+ val.deviceVersionMinor = decoder.decodeStruct(codec.Uint8);
+ val.deviceVersionSubminor = decoder.decodeStruct(codec.Uint8);
+ val.activeConfiguration = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.manufacturerName = decoder.decodeStructPointer(string16$.String16);
+ val.productName = decoder.decodeStructPointer(string16$.String16);
+ val.serialNumber = decoder.decodeStructPointer(string16$.String16);
+ val.configurations = decoder.decodeArrayPointer(new codec.PointerTo(UsbConfigurationInfo));
+ return val;
+ };
+
+ UsbDeviceInfo.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDeviceInfo.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.String, val.guid);
+ encoder.encodeStruct(codec.Uint8, val.usbVersionMajor);
+ encoder.encodeStruct(codec.Uint8, val.usbVersionMinor);
+ encoder.encodeStruct(codec.Uint8, val.usbVersionSubminor);
+ encoder.encodeStruct(codec.Uint8, val.classCode);
+ encoder.encodeStruct(codec.Uint8, val.subclassCode);
+ encoder.encodeStruct(codec.Uint8, val.protocolCode);
+ encoder.encodeStruct(codec.Uint16, val.vendorId);
+ encoder.encodeStruct(codec.Uint16, val.productId);
+ encoder.encodeStruct(codec.Uint8, val.deviceVersionMajor);
+ encoder.encodeStruct(codec.Uint8, val.deviceVersionMinor);
+ encoder.encodeStruct(codec.Uint8, val.deviceVersionSubminor);
+ encoder.encodeStruct(codec.Uint8, val.activeConfiguration);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeStructPointer(string16$.String16, val.manufacturerName);
+ encoder.encodeStructPointer(string16$.String16, val.productName);
+ encoder.encodeStructPointer(string16$.String16, val.serialNumber);
+ encoder.encodeArrayPointer(new codec.PointerTo(UsbConfigurationInfo), val.configurations);
+ };
+ function UsbControlTransferParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbControlTransferParams.prototype.initDefaults_ = function() {
+ this.type = 0;
+ this.recipient = 0;
+ this.request = 0;
+ this.value = 0;
+ this.index = 0;
+ };
+ UsbControlTransferParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbControlTransferParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbControlTransferParams.type
+ err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, UsbControlTransferType);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbControlTransferParams.recipient
+ err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 4, UsbControlTransferRecipient);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbControlTransferParams.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbControlTransferParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbControlTransferParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.type = decoder.decodeStruct(codec.Int32);
+ val.recipient = decoder.decodeStruct(codec.Int32);
+ val.request = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ val.value = decoder.decodeStruct(codec.Uint16);
+ val.index = decoder.decodeStruct(codec.Uint16);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbControlTransferParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbControlTransferParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Int32, val.type);
+ encoder.encodeStruct(codec.Int32, val.recipient);
+ encoder.encodeStruct(codec.Uint8, val.request);
+ encoder.skip(1);
+ encoder.encodeStruct(codec.Uint16, val.value);
+ encoder.encodeStruct(codec.Uint16, val.index);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbIsochronousPacket(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbIsochronousPacket.prototype.initDefaults_ = function() {
+ this.length = 0;
+ this.transferredLength = 0;
+ this.status = 0;
+ };
+ UsbIsochronousPacket.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbIsochronousPacket.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+
+ // validate UsbIsochronousPacket.status
+ err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, UsbTransferStatus);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbIsochronousPacket.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbIsochronousPacket.decode = function(decoder) {
+ var packed;
+ var val = new UsbIsochronousPacket();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.length = decoder.decodeStruct(codec.Uint32);
+ val.transferredLength = decoder.decodeStruct(codec.Uint32);
+ val.status = decoder.decodeStruct(codec.Int32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbIsochronousPacket.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbIsochronousPacket.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint32, val.length);
+ encoder.encodeStruct(codec.Uint32, val.transferredLength);
+ encoder.encodeStruct(codec.Int32, val.status);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_Open_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_Open_Params.prototype.initDefaults_ = function() {
+ };
+ UsbDevice_Open_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_Open_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 8}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_Open_Params.encodedSize = codec.kStructHeaderSize + 0;
+
+ UsbDevice_Open_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_Open_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ return val;
+ };
+
+ UsbDevice_Open_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_Open_Params.encodedSize);
+ encoder.writeUint32(0);
+ };
+ function UsbDevice_Open_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_Open_ResponseParams.prototype.initDefaults_ = function() {
+ this.error = 0;
+ };
+ UsbDevice_Open_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_Open_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_Open_ResponseParams.error
+ err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, UsbOpenDeviceError);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_Open_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_Open_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_Open_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.error = decoder.decodeStruct(codec.Int32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_Open_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_Open_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Int32, val.error);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_Close_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_Close_Params.prototype.initDefaults_ = function() {
+ };
+ UsbDevice_Close_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_Close_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 8}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_Close_Params.encodedSize = codec.kStructHeaderSize + 0;
+
+ UsbDevice_Close_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_Close_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ return val;
+ };
+
+ UsbDevice_Close_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_Close_Params.encodedSize);
+ encoder.writeUint32(0);
+ };
+ function UsbDevice_Close_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_Close_ResponseParams.prototype.initDefaults_ = function() {
+ };
+ UsbDevice_Close_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_Close_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 8}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_Close_ResponseParams.encodedSize = codec.kStructHeaderSize + 0;
+
+ UsbDevice_Close_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_Close_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ return val;
+ };
+
+ UsbDevice_Close_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_Close_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ };
+ function UsbDevice_SetConfiguration_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_SetConfiguration_Params.prototype.initDefaults_ = function() {
+ this.value = 0;
+ };
+ UsbDevice_SetConfiguration_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_SetConfiguration_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_SetConfiguration_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_SetConfiguration_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_SetConfiguration_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.value = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_SetConfiguration_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_SetConfiguration_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.value);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_SetConfiguration_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_SetConfiguration_ResponseParams.prototype.initDefaults_ = function() {
+ this.success = false;
+ };
+ UsbDevice_SetConfiguration_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_SetConfiguration_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_SetConfiguration_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_SetConfiguration_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_SetConfiguration_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ packed = decoder.readUint8();
+ val.success = (packed >> 0) & 1 ? true : false;
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_SetConfiguration_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_SetConfiguration_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ packed = 0;
+ packed |= (val.success & 1) << 0
+ encoder.writeUint8(packed);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_ClaimInterface_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_ClaimInterface_Params.prototype.initDefaults_ = function() {
+ this.interfaceNumber = 0;
+ };
+ UsbDevice_ClaimInterface_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_ClaimInterface_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_ClaimInterface_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_ClaimInterface_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_ClaimInterface_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.interfaceNumber = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_ClaimInterface_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_ClaimInterface_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.interfaceNumber);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_ClaimInterface_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_ClaimInterface_ResponseParams.prototype.initDefaults_ = function() {
+ this.success = false;
+ };
+ UsbDevice_ClaimInterface_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_ClaimInterface_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_ClaimInterface_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_ClaimInterface_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_ClaimInterface_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ packed = decoder.readUint8();
+ val.success = (packed >> 0) & 1 ? true : false;
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_ClaimInterface_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_ClaimInterface_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ packed = 0;
+ packed |= (val.success & 1) << 0
+ encoder.writeUint8(packed);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_ReleaseInterface_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_ReleaseInterface_Params.prototype.initDefaults_ = function() {
+ this.interfaceNumber = 0;
+ };
+ UsbDevice_ReleaseInterface_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_ReleaseInterface_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_ReleaseInterface_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_ReleaseInterface_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_ReleaseInterface_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.interfaceNumber = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_ReleaseInterface_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_ReleaseInterface_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.interfaceNumber);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_ReleaseInterface_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_ReleaseInterface_ResponseParams.prototype.initDefaults_ = function() {
+ this.success = false;
+ };
+ UsbDevice_ReleaseInterface_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_ReleaseInterface_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_ReleaseInterface_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_ReleaseInterface_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_ReleaseInterface_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ packed = decoder.readUint8();
+ val.success = (packed >> 0) & 1 ? true : false;
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_ReleaseInterface_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_ReleaseInterface_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ packed = 0;
+ packed |= (val.success & 1) << 0
+ encoder.writeUint8(packed);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_SetInterfaceAlternateSetting_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_SetInterfaceAlternateSetting_Params.prototype.initDefaults_ = function() {
+ this.interfaceNumber = 0;
+ this.alternateSetting = 0;
+ };
+ UsbDevice_SetInterfaceAlternateSetting_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_SetInterfaceAlternateSetting_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_SetInterfaceAlternateSetting_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_SetInterfaceAlternateSetting_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_SetInterfaceAlternateSetting_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.interfaceNumber = decoder.decodeStruct(codec.Uint8);
+ val.alternateSetting = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_SetInterfaceAlternateSetting_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_SetInterfaceAlternateSetting_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.interfaceNumber);
+ encoder.encodeStruct(codec.Uint8, val.alternateSetting);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_SetInterfaceAlternateSetting_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_SetInterfaceAlternateSetting_ResponseParams.prototype.initDefaults_ = function() {
+ this.success = false;
+ };
+ UsbDevice_SetInterfaceAlternateSetting_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_SetInterfaceAlternateSetting_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_SetInterfaceAlternateSetting_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_SetInterfaceAlternateSetting_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_SetInterfaceAlternateSetting_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ packed = decoder.readUint8();
+ val.success = (packed >> 0) & 1 ? true : false;
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_SetInterfaceAlternateSetting_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_SetInterfaceAlternateSetting_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ packed = 0;
+ packed |= (val.success & 1) << 0
+ encoder.writeUint8(packed);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_Reset_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_Reset_Params.prototype.initDefaults_ = function() {
+ };
+ UsbDevice_Reset_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_Reset_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 8}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_Reset_Params.encodedSize = codec.kStructHeaderSize + 0;
+
+ UsbDevice_Reset_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_Reset_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ return val;
+ };
+
+ UsbDevice_Reset_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_Reset_Params.encodedSize);
+ encoder.writeUint32(0);
+ };
+ function UsbDevice_Reset_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_Reset_ResponseParams.prototype.initDefaults_ = function() {
+ this.success = false;
+ };
+ UsbDevice_Reset_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_Reset_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_Reset_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_Reset_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_Reset_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ packed = decoder.readUint8();
+ val.success = (packed >> 0) & 1 ? true : false;
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_Reset_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_Reset_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ packed = 0;
+ packed |= (val.success & 1) << 0
+ encoder.writeUint8(packed);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_ClearHalt_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_ClearHalt_Params.prototype.initDefaults_ = function() {
+ this.endpoint = 0;
+ };
+ UsbDevice_ClearHalt_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_ClearHalt_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_ClearHalt_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_ClearHalt_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_ClearHalt_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.endpoint = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_ClearHalt_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_ClearHalt_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.endpoint);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_ClearHalt_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_ClearHalt_ResponseParams.prototype.initDefaults_ = function() {
+ this.success = false;
+ };
+ UsbDevice_ClearHalt_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_ClearHalt_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_ClearHalt_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_ClearHalt_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_ClearHalt_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ packed = decoder.readUint8();
+ val.success = (packed >> 0) & 1 ? true : false;
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_ClearHalt_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_ClearHalt_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ packed = 0;
+ packed |= (val.success & 1) << 0
+ encoder.writeUint8(packed);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_ControlTransferIn_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_ControlTransferIn_Params.prototype.initDefaults_ = function() {
+ this.params = null;
+ this.length = 0;
+ this.timeout = 0;
+ };
+ UsbDevice_ControlTransferIn_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_ControlTransferIn_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_ControlTransferIn_Params.params
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, UsbControlTransferParams, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_ControlTransferIn_Params.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbDevice_ControlTransferIn_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_ControlTransferIn_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.params = decoder.decodeStructPointer(UsbControlTransferParams);
+ val.length = decoder.decodeStruct(codec.Uint32);
+ val.timeout = decoder.decodeStruct(codec.Uint32);
+ return val;
+ };
+
+ UsbDevice_ControlTransferIn_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_ControlTransferIn_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStructPointer(UsbControlTransferParams, val.params);
+ encoder.encodeStruct(codec.Uint32, val.length);
+ encoder.encodeStruct(codec.Uint32, val.timeout);
+ };
+ function UsbDevice_ControlTransferIn_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_ControlTransferIn_ResponseParams.prototype.initDefaults_ = function() {
+ this.status = 0;
+ this.data = null;
+ };
+ UsbDevice_ControlTransferIn_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_ControlTransferIn_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_ControlTransferIn_ResponseParams.status
+ err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, UsbTransferStatus);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_ControlTransferIn_ResponseParams.data
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 1, codec.Uint8, true, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_ControlTransferIn_ResponseParams.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbDevice_ControlTransferIn_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_ControlTransferIn_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.status = decoder.decodeStruct(codec.Int32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.data = decoder.decodeArrayPointer(codec.Uint8);
+ return val;
+ };
+
+ UsbDevice_ControlTransferIn_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_ControlTransferIn_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Int32, val.status);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeArrayPointer(codec.Uint8, val.data);
+ };
+ function UsbDevice_ControlTransferOut_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_ControlTransferOut_Params.prototype.initDefaults_ = function() {
+ this.params = null;
+ this.data = null;
+ this.timeout = 0;
+ };
+ UsbDevice_ControlTransferOut_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_ControlTransferOut_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 32}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_ControlTransferOut_Params.params
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, UsbControlTransferParams, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_ControlTransferOut_Params.data
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 1, codec.Uint8, false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_ControlTransferOut_Params.encodedSize = codec.kStructHeaderSize + 24;
+
+ UsbDevice_ControlTransferOut_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_ControlTransferOut_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.params = decoder.decodeStructPointer(UsbControlTransferParams);
+ val.data = decoder.decodeArrayPointer(codec.Uint8);
+ val.timeout = decoder.decodeStruct(codec.Uint32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_ControlTransferOut_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_ControlTransferOut_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStructPointer(UsbControlTransferParams, val.params);
+ encoder.encodeArrayPointer(codec.Uint8, val.data);
+ encoder.encodeStruct(codec.Uint32, val.timeout);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_ControlTransferOut_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_ControlTransferOut_ResponseParams.prototype.initDefaults_ = function() {
+ this.status = 0;
+ };
+ UsbDevice_ControlTransferOut_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_ControlTransferOut_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_ControlTransferOut_ResponseParams.status
+ err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, UsbTransferStatus);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_ControlTransferOut_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_ControlTransferOut_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_ControlTransferOut_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.status = decoder.decodeStruct(codec.Int32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_ControlTransferOut_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_ControlTransferOut_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Int32, val.status);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_GenericTransferIn_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_GenericTransferIn_Params.prototype.initDefaults_ = function() {
+ this.endpointNumber = 0;
+ this.length = 0;
+ this.timeout = 0;
+ };
+ UsbDevice_GenericTransferIn_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_GenericTransferIn_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_GenericTransferIn_Params.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbDevice_GenericTransferIn_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_GenericTransferIn_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.endpointNumber = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.length = decoder.decodeStruct(codec.Uint32);
+ val.timeout = decoder.decodeStruct(codec.Uint32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_GenericTransferIn_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_GenericTransferIn_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.endpointNumber);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeStruct(codec.Uint32, val.length);
+ encoder.encodeStruct(codec.Uint32, val.timeout);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_GenericTransferIn_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_GenericTransferIn_ResponseParams.prototype.initDefaults_ = function() {
+ this.status = 0;
+ this.data = null;
+ };
+ UsbDevice_GenericTransferIn_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_GenericTransferIn_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_GenericTransferIn_ResponseParams.status
+ err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, UsbTransferStatus);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_GenericTransferIn_ResponseParams.data
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 1, codec.Uint8, true, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_GenericTransferIn_ResponseParams.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbDevice_GenericTransferIn_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_GenericTransferIn_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.status = decoder.decodeStruct(codec.Int32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.data = decoder.decodeArrayPointer(codec.Uint8);
+ return val;
+ };
+
+ UsbDevice_GenericTransferIn_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_GenericTransferIn_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Int32, val.status);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeArrayPointer(codec.Uint8, val.data);
+ };
+ function UsbDevice_GenericTransferOut_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_GenericTransferOut_Params.prototype.initDefaults_ = function() {
+ this.endpointNumber = 0;
+ this.timeout = 0;
+ this.data = null;
+ };
+ UsbDevice_GenericTransferOut_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_GenericTransferOut_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ // validate UsbDevice_GenericTransferOut_Params.data
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 1, codec.Uint8, false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_GenericTransferOut_Params.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbDevice_GenericTransferOut_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_GenericTransferOut_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.endpointNumber = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.timeout = decoder.decodeStruct(codec.Uint32);
+ val.data = decoder.decodeArrayPointer(codec.Uint8);
+ return val;
+ };
+
+ UsbDevice_GenericTransferOut_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_GenericTransferOut_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.endpointNumber);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeStruct(codec.Uint32, val.timeout);
+ encoder.encodeArrayPointer(codec.Uint8, val.data);
+ };
+ function UsbDevice_GenericTransferOut_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_GenericTransferOut_ResponseParams.prototype.initDefaults_ = function() {
+ this.status = 0;
+ };
+ UsbDevice_GenericTransferOut_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_GenericTransferOut_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_GenericTransferOut_ResponseParams.status
+ err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, UsbTransferStatus);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_GenericTransferOut_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_GenericTransferOut_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_GenericTransferOut_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.status = decoder.decodeStruct(codec.Int32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDevice_GenericTransferOut_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_GenericTransferOut_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Int32, val.status);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDevice_IsochronousTransferIn_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_IsochronousTransferIn_Params.prototype.initDefaults_ = function() {
+ this.endpointNumber = 0;
+ this.timeout = 0;
+ this.packetLengths = null;
+ };
+ UsbDevice_IsochronousTransferIn_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_IsochronousTransferIn_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ // validate UsbDevice_IsochronousTransferIn_Params.packetLengths
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 4, codec.Uint32, false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_IsochronousTransferIn_Params.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbDevice_IsochronousTransferIn_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_IsochronousTransferIn_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.endpointNumber = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.timeout = decoder.decodeStruct(codec.Uint32);
+ val.packetLengths = decoder.decodeArrayPointer(codec.Uint32);
+ return val;
+ };
+
+ UsbDevice_IsochronousTransferIn_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_IsochronousTransferIn_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.endpointNumber);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeStruct(codec.Uint32, val.timeout);
+ encoder.encodeArrayPointer(codec.Uint32, val.packetLengths);
+ };
+ function UsbDevice_IsochronousTransferIn_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_IsochronousTransferIn_ResponseParams.prototype.initDefaults_ = function() {
+ this.data = null;
+ this.packets = null;
+ };
+ UsbDevice_IsochronousTransferIn_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_IsochronousTransferIn_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_IsochronousTransferIn_ResponseParams.data
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, true, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_IsochronousTransferIn_ResponseParams.packets
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(UsbIsochronousPacket), false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_IsochronousTransferIn_ResponseParams.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbDevice_IsochronousTransferIn_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_IsochronousTransferIn_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.data = decoder.decodeArrayPointer(codec.Uint8);
+ val.packets = decoder.decodeArrayPointer(new codec.PointerTo(UsbIsochronousPacket));
+ return val;
+ };
+
+ UsbDevice_IsochronousTransferIn_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_IsochronousTransferIn_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeArrayPointer(codec.Uint8, val.data);
+ encoder.encodeArrayPointer(new codec.PointerTo(UsbIsochronousPacket), val.packets);
+ };
+ function UsbDevice_IsochronousTransferOut_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_IsochronousTransferOut_Params.prototype.initDefaults_ = function() {
+ this.endpointNumber = 0;
+ this.timeout = 0;
+ this.data = null;
+ this.packetLengths = null;
+ };
+ UsbDevice_IsochronousTransferOut_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_IsochronousTransferOut_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 32}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ // validate UsbDevice_IsochronousTransferOut_Params.data
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 1, codec.Uint8, false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_IsochronousTransferOut_Params.packetLengths
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 4, codec.Uint32, false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_IsochronousTransferOut_Params.encodedSize = codec.kStructHeaderSize + 24;
+
+ UsbDevice_IsochronousTransferOut_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_IsochronousTransferOut_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.endpointNumber = decoder.decodeStruct(codec.Uint8);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.timeout = decoder.decodeStruct(codec.Uint32);
+ val.data = decoder.decodeArrayPointer(codec.Uint8);
+ val.packetLengths = decoder.decodeArrayPointer(codec.Uint32);
+ return val;
+ };
+
+ UsbDevice_IsochronousTransferOut_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_IsochronousTransferOut_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint8, val.endpointNumber);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeStruct(codec.Uint32, val.timeout);
+ encoder.encodeArrayPointer(codec.Uint8, val.data);
+ encoder.encodeArrayPointer(codec.Uint32, val.packetLengths);
+ };
+ function UsbDevice_IsochronousTransferOut_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDevice_IsochronousTransferOut_ResponseParams.prototype.initDefaults_ = function() {
+ this.packets = null;
+ };
+ UsbDevice_IsochronousTransferOut_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDevice_IsochronousTransferOut_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDevice_IsochronousTransferOut_ResponseParams.packets
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 8, new codec.PointerTo(UsbIsochronousPacket), false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDevice_IsochronousTransferOut_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDevice_IsochronousTransferOut_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDevice_IsochronousTransferOut_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.packets = decoder.decodeArrayPointer(new codec.PointerTo(UsbIsochronousPacket));
+ return val;
+ };
+
+ UsbDevice_IsochronousTransferOut_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDevice_IsochronousTransferOut_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeArrayPointer(new codec.PointerTo(UsbIsochronousPacket), val.packets);
+ };
+ var kUsbDevice_Open_Name = 0;
+ var kUsbDevice_Close_Name = 1;
+ var kUsbDevice_SetConfiguration_Name = 2;
+ var kUsbDevice_ClaimInterface_Name = 3;
+ var kUsbDevice_ReleaseInterface_Name = 4;
+ var kUsbDevice_SetInterfaceAlternateSetting_Name = 5;
+ var kUsbDevice_Reset_Name = 6;
+ var kUsbDevice_ClearHalt_Name = 7;
+ var kUsbDevice_ControlTransferIn_Name = 8;
+ var kUsbDevice_ControlTransferOut_Name = 9;
+ var kUsbDevice_GenericTransferIn_Name = 10;
+ var kUsbDevice_GenericTransferOut_Name = 11;
+ var kUsbDevice_IsochronousTransferIn_Name = 12;
+ var kUsbDevice_IsochronousTransferOut_Name = 13;
+
+ function UsbDevicePtr(handleOrPtrInfo) {
+ this.ptr = new bindings.InterfacePtrController(UsbDevice,
+ handleOrPtrInfo);
+ }
+
+ function UsbDeviceAssociatedPtr(associatedInterfacePtrInfo) {
+ this.ptr = new associatedBindings.AssociatedInterfacePtrController(
+ UsbDevice, associatedInterfacePtrInfo);
+ }
+
+ UsbDeviceAssociatedPtr.prototype =
+ Object.create(UsbDevicePtr.prototype);
+ UsbDeviceAssociatedPtr.prototype.constructor =
+ UsbDeviceAssociatedPtr;
+
+ function UsbDeviceProxy(receiver) {
+ this.receiver_ = receiver;
+ }
+ UsbDevicePtr.prototype.open = function() {
+ return UsbDeviceProxy.prototype.open
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.open = function() {
+ var params = new UsbDevice_Open_Params();
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_Open_Name,
+ codec.align(UsbDevice_Open_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_Open_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_Open_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.close = function() {
+ return UsbDeviceProxy.prototype.close
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.close = function() {
+ var params = new UsbDevice_Close_Params();
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_Close_Name,
+ codec.align(UsbDevice_Close_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_Close_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_Close_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.setConfiguration = function() {
+ return UsbDeviceProxy.prototype.setConfiguration
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.setConfiguration = function(value) {
+ var params = new UsbDevice_SetConfiguration_Params();
+ params.value = value;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_SetConfiguration_Name,
+ codec.align(UsbDevice_SetConfiguration_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_SetConfiguration_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_SetConfiguration_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.claimInterface = function() {
+ return UsbDeviceProxy.prototype.claimInterface
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.claimInterface = function(interfaceNumber) {
+ var params = new UsbDevice_ClaimInterface_Params();
+ params.interfaceNumber = interfaceNumber;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_ClaimInterface_Name,
+ codec.align(UsbDevice_ClaimInterface_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_ClaimInterface_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_ClaimInterface_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.releaseInterface = function() {
+ return UsbDeviceProxy.prototype.releaseInterface
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.releaseInterface = function(interfaceNumber) {
+ var params = new UsbDevice_ReleaseInterface_Params();
+ params.interfaceNumber = interfaceNumber;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_ReleaseInterface_Name,
+ codec.align(UsbDevice_ReleaseInterface_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_ReleaseInterface_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_ReleaseInterface_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.setInterfaceAlternateSetting = function() {
+ return UsbDeviceProxy.prototype.setInterfaceAlternateSetting
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.setInterfaceAlternateSetting = function(interfaceNumber, alternateSetting) {
+ var params = new UsbDevice_SetInterfaceAlternateSetting_Params();
+ params.interfaceNumber = interfaceNumber;
+ params.alternateSetting = alternateSetting;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_SetInterfaceAlternateSetting_Name,
+ codec.align(UsbDevice_SetInterfaceAlternateSetting_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_SetInterfaceAlternateSetting_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_SetInterfaceAlternateSetting_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.reset = function() {
+ return UsbDeviceProxy.prototype.reset
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.reset = function() {
+ var params = new UsbDevice_Reset_Params();
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_Reset_Name,
+ codec.align(UsbDevice_Reset_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_Reset_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_Reset_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.clearHalt = function() {
+ return UsbDeviceProxy.prototype.clearHalt
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.clearHalt = function(endpoint) {
+ var params = new UsbDevice_ClearHalt_Params();
+ params.endpoint = endpoint;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_ClearHalt_Name,
+ codec.align(UsbDevice_ClearHalt_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_ClearHalt_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_ClearHalt_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.controlTransferIn = function() {
+ return UsbDeviceProxy.prototype.controlTransferIn
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.controlTransferIn = function(params, length, timeout) {
+ var params = new UsbDevice_ControlTransferIn_Params();
+ params.params = params;
+ params.length = length;
+ params.timeout = timeout;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_ControlTransferIn_Name,
+ codec.align(UsbDevice_ControlTransferIn_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_ControlTransferIn_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_ControlTransferIn_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.controlTransferOut = function() {
+ return UsbDeviceProxy.prototype.controlTransferOut
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.controlTransferOut = function(params, data, timeout) {
+ var params = new UsbDevice_ControlTransferOut_Params();
+ params.params = params;
+ params.data = data;
+ params.timeout = timeout;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_ControlTransferOut_Name,
+ codec.align(UsbDevice_ControlTransferOut_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_ControlTransferOut_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_ControlTransferOut_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.genericTransferIn = function() {
+ return UsbDeviceProxy.prototype.genericTransferIn
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.genericTransferIn = function(endpointNumber, length, timeout) {
+ var params = new UsbDevice_GenericTransferIn_Params();
+ params.endpointNumber = endpointNumber;
+ params.length = length;
+ params.timeout = timeout;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_GenericTransferIn_Name,
+ codec.align(UsbDevice_GenericTransferIn_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_GenericTransferIn_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_GenericTransferIn_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.genericTransferOut = function() {
+ return UsbDeviceProxy.prototype.genericTransferOut
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.genericTransferOut = function(endpointNumber, data, timeout) {
+ var params = new UsbDevice_GenericTransferOut_Params();
+ params.endpointNumber = endpointNumber;
+ params.data = data;
+ params.timeout = timeout;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_GenericTransferOut_Name,
+ codec.align(UsbDevice_GenericTransferOut_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_GenericTransferOut_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_GenericTransferOut_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.isochronousTransferIn = function() {
+ return UsbDeviceProxy.prototype.isochronousTransferIn
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.isochronousTransferIn = function(endpointNumber, packetLengths, timeout) {
+ var params = new UsbDevice_IsochronousTransferIn_Params();
+ params.endpointNumber = endpointNumber;
+ params.packetLengths = packetLengths;
+ params.timeout = timeout;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_IsochronousTransferIn_Name,
+ codec.align(UsbDevice_IsochronousTransferIn_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_IsochronousTransferIn_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_IsochronousTransferIn_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDevicePtr.prototype.isochronousTransferOut = function() {
+ return UsbDeviceProxy.prototype.isochronousTransferOut
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceProxy.prototype.isochronousTransferOut = function(endpointNumber, data, packetLengths, timeout) {
+ var params = new UsbDevice_IsochronousTransferOut_Params();
+ params.endpointNumber = endpointNumber;
+ params.data = data;
+ params.packetLengths = packetLengths;
+ params.timeout = timeout;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_IsochronousTransferOut_Name,
+ codec.align(UsbDevice_IsochronousTransferOut_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDevice_IsochronousTransferOut_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDevice_IsochronousTransferOut_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+
+ function UsbDeviceStub(delegate) {
+ this.delegate_ = delegate;
+ }
+ UsbDeviceStub.prototype.open = function() {
+ return this.delegate_ && this.delegate_.open && this.delegate_.open();
+ }
+ UsbDeviceStub.prototype.close = function() {
+ return this.delegate_ && this.delegate_.close && this.delegate_.close();
+ }
+ UsbDeviceStub.prototype.setConfiguration = function(value) {
+ return this.delegate_ && this.delegate_.setConfiguration && this.delegate_.setConfiguration(value);
+ }
+ UsbDeviceStub.prototype.claimInterface = function(interfaceNumber) {
+ return this.delegate_ && this.delegate_.claimInterface && this.delegate_.claimInterface(interfaceNumber);
+ }
+ UsbDeviceStub.prototype.releaseInterface = function(interfaceNumber) {
+ return this.delegate_ && this.delegate_.releaseInterface && this.delegate_.releaseInterface(interfaceNumber);
+ }
+ UsbDeviceStub.prototype.setInterfaceAlternateSetting = function(interfaceNumber, alternateSetting) {
+ return this.delegate_ && this.delegate_.setInterfaceAlternateSetting && this.delegate_.setInterfaceAlternateSetting(interfaceNumber, alternateSetting);
+ }
+ UsbDeviceStub.prototype.reset = function() {
+ return this.delegate_ && this.delegate_.reset && this.delegate_.reset();
+ }
+ UsbDeviceStub.prototype.clearHalt = function(endpoint) {
+ return this.delegate_ && this.delegate_.clearHalt && this.delegate_.clearHalt(endpoint);
+ }
+ UsbDeviceStub.prototype.controlTransferIn = function(params, length, timeout) {
+ return this.delegate_ && this.delegate_.controlTransferIn && this.delegate_.controlTransferIn(params, length, timeout);
+ }
+ UsbDeviceStub.prototype.controlTransferOut = function(params, data, timeout) {
+ return this.delegate_ && this.delegate_.controlTransferOut && this.delegate_.controlTransferOut(params, data, timeout);
+ }
+ UsbDeviceStub.prototype.genericTransferIn = function(endpointNumber, length, timeout) {
+ return this.delegate_ && this.delegate_.genericTransferIn && this.delegate_.genericTransferIn(endpointNumber, length, timeout);
+ }
+ UsbDeviceStub.prototype.genericTransferOut = function(endpointNumber, data, timeout) {
+ return this.delegate_ && this.delegate_.genericTransferOut && this.delegate_.genericTransferOut(endpointNumber, data, timeout);
+ }
+ UsbDeviceStub.prototype.isochronousTransferIn = function(endpointNumber, packetLengths, timeout) {
+ return this.delegate_ && this.delegate_.isochronousTransferIn && this.delegate_.isochronousTransferIn(endpointNumber, packetLengths, timeout);
+ }
+ UsbDeviceStub.prototype.isochronousTransferOut = function(endpointNumber, data, packetLengths, timeout) {
+ return this.delegate_ && this.delegate_.isochronousTransferOut && this.delegate_.isochronousTransferOut(endpointNumber, data, packetLengths, timeout);
+ }
+
+ UsbDeviceStub.prototype.accept = function(message) {
+ var reader = new codec.MessageReader(message);
+ switch (reader.messageName) {
+ default:
+ return false;
+ }
+ };
+
+ UsbDeviceStub.prototype.acceptWithResponder =
+ function(message, responder) {
+ var reader = new codec.MessageReader(message);
+ switch (reader.messageName) {
+ case kUsbDevice_Open_Name:
+ var params = reader.decodeStruct(UsbDevice_Open_Params);
+ this.open().then(function(response) {
+ var responseParams =
+ new UsbDevice_Open_ResponseParams();
+ responseParams.error = response.error;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_Open_Name,
+ codec.align(UsbDevice_Open_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_Open_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_Close_Name:
+ var params = reader.decodeStruct(UsbDevice_Close_Params);
+ this.close().then(function(response) {
+ var responseParams =
+ new UsbDevice_Close_ResponseParams();
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_Close_Name,
+ codec.align(UsbDevice_Close_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_Close_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_SetConfiguration_Name:
+ var params = reader.decodeStruct(UsbDevice_SetConfiguration_Params);
+ this.setConfiguration(params.value).then(function(response) {
+ var responseParams =
+ new UsbDevice_SetConfiguration_ResponseParams();
+ responseParams.success = response.success;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_SetConfiguration_Name,
+ codec.align(UsbDevice_SetConfiguration_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_SetConfiguration_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_ClaimInterface_Name:
+ var params = reader.decodeStruct(UsbDevice_ClaimInterface_Params);
+ this.claimInterface(params.interfaceNumber).then(function(response) {
+ var responseParams =
+ new UsbDevice_ClaimInterface_ResponseParams();
+ responseParams.success = response.success;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_ClaimInterface_Name,
+ codec.align(UsbDevice_ClaimInterface_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_ClaimInterface_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_ReleaseInterface_Name:
+ var params = reader.decodeStruct(UsbDevice_ReleaseInterface_Params);
+ this.releaseInterface(params.interfaceNumber).then(function(response) {
+ var responseParams =
+ new UsbDevice_ReleaseInterface_ResponseParams();
+ responseParams.success = response.success;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_ReleaseInterface_Name,
+ codec.align(UsbDevice_ReleaseInterface_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_ReleaseInterface_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_SetInterfaceAlternateSetting_Name:
+ var params = reader.decodeStruct(UsbDevice_SetInterfaceAlternateSetting_Params);
+ this.setInterfaceAlternateSetting(params.interfaceNumber, params.alternateSetting).then(function(response) {
+ var responseParams =
+ new UsbDevice_SetInterfaceAlternateSetting_ResponseParams();
+ responseParams.success = response.success;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_SetInterfaceAlternateSetting_Name,
+ codec.align(UsbDevice_SetInterfaceAlternateSetting_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_SetInterfaceAlternateSetting_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_Reset_Name:
+ var params = reader.decodeStruct(UsbDevice_Reset_Params);
+ this.reset().then(function(response) {
+ var responseParams =
+ new UsbDevice_Reset_ResponseParams();
+ responseParams.success = response.success;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_Reset_Name,
+ codec.align(UsbDevice_Reset_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_Reset_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_ClearHalt_Name:
+ var params = reader.decodeStruct(UsbDevice_ClearHalt_Params);
+ this.clearHalt(params.endpoint).then(function(response) {
+ var responseParams =
+ new UsbDevice_ClearHalt_ResponseParams();
+ responseParams.success = response.success;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_ClearHalt_Name,
+ codec.align(UsbDevice_ClearHalt_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_ClearHalt_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_ControlTransferIn_Name:
+ var params = reader.decodeStruct(UsbDevice_ControlTransferIn_Params);
+ this.controlTransferIn(params.params, params.length, params.timeout).then(function(response) {
+ var responseParams =
+ new UsbDevice_ControlTransferIn_ResponseParams();
+ responseParams.status = response.status;
+ responseParams.data = response.data;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_ControlTransferIn_Name,
+ codec.align(UsbDevice_ControlTransferIn_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_ControlTransferIn_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_ControlTransferOut_Name:
+ var params = reader.decodeStruct(UsbDevice_ControlTransferOut_Params);
+ this.controlTransferOut(params.params, params.data, params.timeout).then(function(response) {
+ var responseParams =
+ new UsbDevice_ControlTransferOut_ResponseParams();
+ responseParams.status = response.status;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_ControlTransferOut_Name,
+ codec.align(UsbDevice_ControlTransferOut_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_ControlTransferOut_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_GenericTransferIn_Name:
+ var params = reader.decodeStruct(UsbDevice_GenericTransferIn_Params);
+ this.genericTransferIn(params.endpointNumber, params.length, params.timeout).then(function(response) {
+ var responseParams =
+ new UsbDevice_GenericTransferIn_ResponseParams();
+ responseParams.status = response.status;
+ responseParams.data = response.data;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_GenericTransferIn_Name,
+ codec.align(UsbDevice_GenericTransferIn_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_GenericTransferIn_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_GenericTransferOut_Name:
+ var params = reader.decodeStruct(UsbDevice_GenericTransferOut_Params);
+ this.genericTransferOut(params.endpointNumber, params.data, params.timeout).then(function(response) {
+ var responseParams =
+ new UsbDevice_GenericTransferOut_ResponseParams();
+ responseParams.status = response.status;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_GenericTransferOut_Name,
+ codec.align(UsbDevice_GenericTransferOut_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_GenericTransferOut_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_IsochronousTransferIn_Name:
+ var params = reader.decodeStruct(UsbDevice_IsochronousTransferIn_Params);
+ this.isochronousTransferIn(params.endpointNumber, params.packetLengths, params.timeout).then(function(response) {
+ var responseParams =
+ new UsbDevice_IsochronousTransferIn_ResponseParams();
+ responseParams.data = response.data;
+ responseParams.packets = response.packets;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_IsochronousTransferIn_Name,
+ codec.align(UsbDevice_IsochronousTransferIn_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_IsochronousTransferIn_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ case kUsbDevice_IsochronousTransferOut_Name:
+ var params = reader.decodeStruct(UsbDevice_IsochronousTransferOut_Params);
+ this.isochronousTransferOut(params.endpointNumber, params.data, params.packetLengths, params.timeout).then(function(response) {
+ var responseParams =
+ new UsbDevice_IsochronousTransferOut_ResponseParams();
+ responseParams.packets = response.packets;
+ var builder = new codec.MessageV1Builder(
+ kUsbDevice_IsochronousTransferOut_Name,
+ codec.align(UsbDevice_IsochronousTransferOut_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDevice_IsochronousTransferOut_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ default:
+ return false;
+ }
+ };
+
+ function validateUsbDeviceRequest(messageValidator) {
+ var message = messageValidator.message;
+ var paramsClass = null;
+ switch (message.getName()) {
+ case kUsbDevice_Open_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_Open_Params;
+ break;
+ case kUsbDevice_Close_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_Close_Params;
+ break;
+ case kUsbDevice_SetConfiguration_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_SetConfiguration_Params;
+ break;
+ case kUsbDevice_ClaimInterface_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_ClaimInterface_Params;
+ break;
+ case kUsbDevice_ReleaseInterface_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_ReleaseInterface_Params;
+ break;
+ case kUsbDevice_SetInterfaceAlternateSetting_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_SetInterfaceAlternateSetting_Params;
+ break;
+ case kUsbDevice_Reset_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_Reset_Params;
+ break;
+ case kUsbDevice_ClearHalt_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_ClearHalt_Params;
+ break;
+ case kUsbDevice_ControlTransferIn_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_ControlTransferIn_Params;
+ break;
+ case kUsbDevice_ControlTransferOut_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_ControlTransferOut_Params;
+ break;
+ case kUsbDevice_GenericTransferIn_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_GenericTransferIn_Params;
+ break;
+ case kUsbDevice_GenericTransferOut_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_GenericTransferOut_Params;
+ break;
+ case kUsbDevice_IsochronousTransferIn_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_IsochronousTransferIn_Params;
+ break;
+ case kUsbDevice_IsochronousTransferOut_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDevice_IsochronousTransferOut_Params;
+ break;
+ }
+ if (paramsClass === null)
+ return validator.validationError.NONE;
+ return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
+ }
+
+ function validateUsbDeviceResponse(messageValidator) {
+ var message = messageValidator.message;
+ var paramsClass = null;
+ switch (message.getName()) {
+ case kUsbDevice_Open_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_Open_ResponseParams;
+ break;
+ case kUsbDevice_Close_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_Close_ResponseParams;
+ break;
+ case kUsbDevice_SetConfiguration_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_SetConfiguration_ResponseParams;
+ break;
+ case kUsbDevice_ClaimInterface_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_ClaimInterface_ResponseParams;
+ break;
+ case kUsbDevice_ReleaseInterface_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_ReleaseInterface_ResponseParams;
+ break;
+ case kUsbDevice_SetInterfaceAlternateSetting_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_SetInterfaceAlternateSetting_ResponseParams;
+ break;
+ case kUsbDevice_Reset_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_Reset_ResponseParams;
+ break;
+ case kUsbDevice_ClearHalt_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_ClearHalt_ResponseParams;
+ break;
+ case kUsbDevice_ControlTransferIn_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_ControlTransferIn_ResponseParams;
+ break;
+ case kUsbDevice_ControlTransferOut_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_ControlTransferOut_ResponseParams;
+ break;
+ case kUsbDevice_GenericTransferIn_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_GenericTransferIn_ResponseParams;
+ break;
+ case kUsbDevice_GenericTransferOut_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_GenericTransferOut_ResponseParams;
+ break;
+ case kUsbDevice_IsochronousTransferIn_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_IsochronousTransferIn_ResponseParams;
+ break;
+ case kUsbDevice_IsochronousTransferOut_Name:
+ if (message.isResponse())
+ paramsClass = UsbDevice_IsochronousTransferOut_ResponseParams;
+ break;
+ }
+ if (paramsClass === null)
+ return validator.validationError.NONE;
+ return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
+ }
+
+ var UsbDevice = {
+ name: 'device::mojom::UsbDevice',
+ kVersion: 0,
+ ptrClass: UsbDevicePtr,
+ proxyClass: UsbDeviceProxy,
+ stubClass: UsbDeviceStub,
+ validateRequest: validateUsbDeviceRequest,
+ validateResponse: validateUsbDeviceResponse,
+ };
+ UsbDeviceStub.prototype.validator = validateUsbDeviceRequest;
+ UsbDeviceProxy.prototype.validator = validateUsbDeviceResponse;
+ exports.UsbOpenDeviceError = UsbOpenDeviceError;
+ exports.UsbTransferDirection = UsbTransferDirection;
+ exports.UsbControlTransferType = UsbControlTransferType;
+ exports.UsbControlTransferRecipient = UsbControlTransferRecipient;
+ exports.UsbTransferType = UsbTransferType;
+ exports.UsbTransferStatus = UsbTransferStatus;
+ exports.UsbEndpointInfo = UsbEndpointInfo;
+ exports.UsbAlternateInterfaceInfo = UsbAlternateInterfaceInfo;
+ exports.UsbInterfaceInfo = UsbInterfaceInfo;
+ exports.UsbConfigurationInfo = UsbConfigurationInfo;
+ exports.UsbDeviceInfo = UsbDeviceInfo;
+ exports.UsbControlTransferParams = UsbControlTransferParams;
+ exports.UsbIsochronousPacket = UsbIsochronousPacket;
+ exports.UsbDevice = UsbDevice;
+ exports.UsbDevicePtr = UsbDevicePtr;
+ exports.UsbDeviceAssociatedPtr = UsbDeviceAssociatedPtr;
+})(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/resources/chromium/device.mojom.js.headers b/tests/wpt/web-platform-tests/resources/chromium/device.mojom.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/device.mojom.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/resources/chromium/device_manager.mojom.js b/tests/wpt/web-platform-tests/resources/chromium/device_manager.mojom.js
new file mode 100644
index 00000000000..99ebd854be0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/device_manager.mojom.js
@@ -0,0 +1,856 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+'use strict';
+
+(function() {
+ var mojomId = 'device/usb/public/interfaces/device_manager.mojom';
+ if (mojo.internal.isMojomLoaded(mojomId)) {
+ console.warn('The following mojom is loaded multiple times: ' + mojomId);
+ return;
+ }
+ mojo.internal.markMojomLoaded(mojomId);
+
+ // TODO(yzshen): Define these aliases to minimize the differences between the
+ // old/new modes. Remove them when the old mode goes away.
+ var bindings = mojo;
+ var associatedBindings = mojo;
+ var codec = mojo.internal;
+ var validator = mojo.internal;
+
+ var exports = mojo.internal.exposeNamespace('device.mojom');
+ var device$ =
+ mojo.internal.exposeNamespace('device.mojom');
+ if (mojo.config.autoLoadMojomDeps) {
+ mojo.internal.loadMojomIfNecessary(
+ 'device/usb/public/interfaces/device.mojom', 'device.mojom.js');
+ }
+ var string16$ =
+ mojo.internal.exposeNamespace('mojo.common.mojom');
+ if (mojo.config.autoLoadMojomDeps) {
+ mojo.internal.loadMojomIfNecessary(
+ 'mojo/common/string16.mojom', '../../../../mojo/common/string16.mojom.js');
+ }
+
+
+
+ function UsbDeviceFilter(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDeviceFilter.prototype.initDefaults_ = function() {
+ this.hasVendorId = false;
+ this.hasProductId = false;
+ this.hasClassCode = false;
+ this.hasSubclassCode = false;
+ this.hasProtocolCode = false;
+ this.classCode = 0;
+ this.vendorId = 0;
+ this.productId = 0;
+ this.subclassCode = 0;
+ this.protocolCode = 0;
+ this.serialNumber = null;
+ };
+ UsbDeviceFilter.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDeviceFilter.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+
+
+
+
+
+
+
+
+
+ // validate UsbDeviceFilter.serialNumber
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, string16$.String16, true);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDeviceFilter.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbDeviceFilter.decode = function(decoder) {
+ var packed;
+ var val = new UsbDeviceFilter();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ packed = decoder.readUint8();
+ val.hasVendorId = (packed >> 0) & 1 ? true : false;
+ val.hasProductId = (packed >> 1) & 1 ? true : false;
+ val.hasClassCode = (packed >> 2) & 1 ? true : false;
+ val.hasSubclassCode = (packed >> 3) & 1 ? true : false;
+ val.hasProtocolCode = (packed >> 4) & 1 ? true : false;
+ val.classCode = decoder.decodeStruct(codec.Uint8);
+ val.vendorId = decoder.decodeStruct(codec.Uint16);
+ val.productId = decoder.decodeStruct(codec.Uint16);
+ val.subclassCode = decoder.decodeStruct(codec.Uint8);
+ val.protocolCode = decoder.decodeStruct(codec.Uint8);
+ val.serialNumber = decoder.decodeStructPointer(string16$.String16);
+ return val;
+ };
+
+ UsbDeviceFilter.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDeviceFilter.encodedSize);
+ encoder.writeUint32(0);
+ packed = 0;
+ packed |= (val.hasVendorId & 1) << 0
+ packed |= (val.hasProductId & 1) << 1
+ packed |= (val.hasClassCode & 1) << 2
+ packed |= (val.hasSubclassCode & 1) << 3
+ packed |= (val.hasProtocolCode & 1) << 4
+ encoder.writeUint8(packed);
+ encoder.encodeStruct(codec.Uint8, val.classCode);
+ encoder.encodeStruct(codec.Uint16, val.vendorId);
+ encoder.encodeStruct(codec.Uint16, val.productId);
+ encoder.encodeStruct(codec.Uint8, val.subclassCode);
+ encoder.encodeStruct(codec.Uint8, val.protocolCode);
+ encoder.encodeStructPointer(string16$.String16, val.serialNumber);
+ };
+ function UsbEnumerationOptions(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbEnumerationOptions.prototype.initDefaults_ = function() {
+ this.filters = null;
+ };
+ UsbEnumerationOptions.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbEnumerationOptions.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbEnumerationOptions.filters
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 8, new codec.PointerTo(UsbDeviceFilter), false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbEnumerationOptions.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbEnumerationOptions.decode = function(decoder) {
+ var packed;
+ var val = new UsbEnumerationOptions();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.filters = decoder.decodeArrayPointer(new codec.PointerTo(UsbDeviceFilter));
+ return val;
+ };
+
+ UsbEnumerationOptions.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbEnumerationOptions.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeArrayPointer(new codec.PointerTo(UsbDeviceFilter), val.filters);
+ };
+ function UsbDeviceManager_GetDevices_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDeviceManager_GetDevices_Params.prototype.initDefaults_ = function() {
+ this.options = null;
+ };
+ UsbDeviceManager_GetDevices_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDeviceManager_GetDevices_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDeviceManager_GetDevices_Params.options
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, UsbEnumerationOptions, true);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDeviceManager_GetDevices_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDeviceManager_GetDevices_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDeviceManager_GetDevices_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.options = decoder.decodeStructPointer(UsbEnumerationOptions);
+ return val;
+ };
+
+ UsbDeviceManager_GetDevices_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDeviceManager_GetDevices_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStructPointer(UsbEnumerationOptions, val.options);
+ };
+ function UsbDeviceManager_GetDevices_ResponseParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDeviceManager_GetDevices_ResponseParams.prototype.initDefaults_ = function() {
+ this.results = null;
+ };
+ UsbDeviceManager_GetDevices_ResponseParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDeviceManager_GetDevices_ResponseParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDeviceManager_GetDevices_ResponseParams.results
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 8, new codec.PointerTo(device$.UsbDeviceInfo), false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDeviceManager_GetDevices_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDeviceManager_GetDevices_ResponseParams.decode = function(decoder) {
+ var packed;
+ var val = new UsbDeviceManager_GetDevices_ResponseParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.results = decoder.decodeArrayPointer(new codec.PointerTo(device$.UsbDeviceInfo));
+ return val;
+ };
+
+ UsbDeviceManager_GetDevices_ResponseParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDeviceManager_GetDevices_ResponseParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeArrayPointer(new codec.PointerTo(device$.UsbDeviceInfo), val.results);
+ };
+ function UsbDeviceManager_GetDevice_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDeviceManager_GetDevice_Params.prototype.initDefaults_ = function() {
+ this.guid = null;
+ this.deviceRequest = new bindings.InterfaceRequest();
+ };
+ UsbDeviceManager_GetDevice_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDeviceManager_GetDevice_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDeviceManager_GetDevice_Params.guid
+ err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDeviceManager_GetDevice_Params.deviceRequest
+ err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 8, false)
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDeviceManager_GetDevice_Params.encodedSize = codec.kStructHeaderSize + 16;
+
+ UsbDeviceManager_GetDevice_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDeviceManager_GetDevice_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.guid = decoder.decodeStruct(codec.String);
+ val.deviceRequest = decoder.decodeStruct(codec.InterfaceRequest);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ UsbDeviceManager_GetDevice_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDeviceManager_GetDevice_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.String, val.guid);
+ encoder.encodeStruct(codec.InterfaceRequest, val.deviceRequest);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function UsbDeviceManager_SetClient_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDeviceManager_SetClient_Params.prototype.initDefaults_ = function() {
+ this.client = new UsbDeviceManagerClientPtr();
+ };
+ UsbDeviceManager_SetClient_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDeviceManager_SetClient_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDeviceManager_SetClient_Params.client
+ err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 0, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDeviceManager_SetClient_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDeviceManager_SetClient_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDeviceManager_SetClient_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.client = decoder.decodeStruct(new codec.Interface(UsbDeviceManagerClientPtr));
+ return val;
+ };
+
+ UsbDeviceManager_SetClient_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDeviceManager_SetClient_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(new codec.Interface(UsbDeviceManagerClientPtr), val.client);
+ };
+ function UsbDeviceManagerClient_OnDeviceAdded_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDeviceManagerClient_OnDeviceAdded_Params.prototype.initDefaults_ = function() {
+ this.deviceInfo = null;
+ };
+ UsbDeviceManagerClient_OnDeviceAdded_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDeviceManagerClient_OnDeviceAdded_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDeviceManagerClient_OnDeviceAdded_Params.deviceInfo
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, device$.UsbDeviceInfo, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDeviceManagerClient_OnDeviceAdded_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDeviceManagerClient_OnDeviceAdded_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDeviceManagerClient_OnDeviceAdded_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.deviceInfo = decoder.decodeStructPointer(device$.UsbDeviceInfo);
+ return val;
+ };
+
+ UsbDeviceManagerClient_OnDeviceAdded_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDeviceManagerClient_OnDeviceAdded_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStructPointer(device$.UsbDeviceInfo, val.deviceInfo);
+ };
+ function UsbDeviceManagerClient_OnDeviceRemoved_Params(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ UsbDeviceManagerClient_OnDeviceRemoved_Params.prototype.initDefaults_ = function() {
+ this.deviceInfo = null;
+ };
+ UsbDeviceManagerClient_OnDeviceRemoved_Params.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ UsbDeviceManagerClient_OnDeviceRemoved_Params.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate UsbDeviceManagerClient_OnDeviceRemoved_Params.deviceInfo
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, device$.UsbDeviceInfo, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ UsbDeviceManagerClient_OnDeviceRemoved_Params.encodedSize = codec.kStructHeaderSize + 8;
+
+ UsbDeviceManagerClient_OnDeviceRemoved_Params.decode = function(decoder) {
+ var packed;
+ var val = new UsbDeviceManagerClient_OnDeviceRemoved_Params();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.deviceInfo = decoder.decodeStructPointer(device$.UsbDeviceInfo);
+ return val;
+ };
+
+ UsbDeviceManagerClient_OnDeviceRemoved_Params.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(UsbDeviceManagerClient_OnDeviceRemoved_Params.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStructPointer(device$.UsbDeviceInfo, val.deviceInfo);
+ };
+ var kUsbDeviceManager_GetDevices_Name = 0;
+ var kUsbDeviceManager_GetDevice_Name = 1;
+ var kUsbDeviceManager_SetClient_Name = 2;
+
+ function UsbDeviceManagerPtr(handleOrPtrInfo) {
+ this.ptr = new bindings.InterfacePtrController(UsbDeviceManager,
+ handleOrPtrInfo);
+ }
+
+ function UsbDeviceManagerAssociatedPtr(associatedInterfacePtrInfo) {
+ this.ptr = new associatedBindings.AssociatedInterfacePtrController(
+ UsbDeviceManager, associatedInterfacePtrInfo);
+ }
+
+ UsbDeviceManagerAssociatedPtr.prototype =
+ Object.create(UsbDeviceManagerPtr.prototype);
+ UsbDeviceManagerAssociatedPtr.prototype.constructor =
+ UsbDeviceManagerAssociatedPtr;
+
+ function UsbDeviceManagerProxy(receiver) {
+ this.receiver_ = receiver;
+ }
+ UsbDeviceManagerPtr.prototype.getDevices = function() {
+ return UsbDeviceManagerProxy.prototype.getDevices
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceManagerProxy.prototype.getDevices = function(options) {
+ var params = new UsbDeviceManager_GetDevices_Params();
+ params.options = options;
+ return new Promise(function(resolve, reject) {
+ var builder = new codec.MessageV1Builder(
+ kUsbDeviceManager_GetDevices_Name,
+ codec.align(UsbDeviceManager_GetDevices_Params.encodedSize),
+ codec.kMessageExpectsResponse, 0);
+ builder.encodeStruct(UsbDeviceManager_GetDevices_Params, params);
+ var message = builder.finish();
+ this.receiver_.acceptAndExpectResponse(message).then(function(message) {
+ var reader = new codec.MessageReader(message);
+ var responseParams =
+ reader.decodeStruct(UsbDeviceManager_GetDevices_ResponseParams);
+ resolve(responseParams);
+ }).catch(function(result) {
+ reject(Error("Connection error: " + result));
+ });
+ }.bind(this));
+ };
+ UsbDeviceManagerPtr.prototype.getDevice = function() {
+ return UsbDeviceManagerProxy.prototype.getDevice
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceManagerProxy.prototype.getDevice = function(guid, deviceRequest) {
+ var params = new UsbDeviceManager_GetDevice_Params();
+ params.guid = guid;
+ params.deviceRequest = deviceRequest;
+ var builder = new codec.MessageV0Builder(
+ kUsbDeviceManager_GetDevice_Name,
+ codec.align(UsbDeviceManager_GetDevice_Params.encodedSize));
+ builder.encodeStruct(UsbDeviceManager_GetDevice_Params, params);
+ var message = builder.finish();
+ this.receiver_.accept(message);
+ };
+ UsbDeviceManagerPtr.prototype.setClient = function() {
+ return UsbDeviceManagerProxy.prototype.setClient
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceManagerProxy.prototype.setClient = function(client) {
+ var params = new UsbDeviceManager_SetClient_Params();
+ params.client = client;
+ var builder = new codec.MessageV0Builder(
+ kUsbDeviceManager_SetClient_Name,
+ codec.align(UsbDeviceManager_SetClient_Params.encodedSize));
+ builder.encodeStruct(UsbDeviceManager_SetClient_Params, params);
+ var message = builder.finish();
+ this.receiver_.accept(message);
+ };
+
+ function UsbDeviceManagerStub(delegate) {
+ this.delegate_ = delegate;
+ }
+ UsbDeviceManagerStub.prototype.getDevices = function(options) {
+ return this.delegate_ && this.delegate_.getDevices && this.delegate_.getDevices(options);
+ }
+ UsbDeviceManagerStub.prototype.getDevice = function(guid, deviceRequest) {
+ return this.delegate_ && this.delegate_.getDevice && this.delegate_.getDevice(guid, deviceRequest);
+ }
+ UsbDeviceManagerStub.prototype.setClient = function(client) {
+ return this.delegate_ && this.delegate_.setClient && this.delegate_.setClient(client);
+ }
+
+ UsbDeviceManagerStub.prototype.accept = function(message) {
+ var reader = new codec.MessageReader(message);
+ switch (reader.messageName) {
+ case kUsbDeviceManager_GetDevice_Name:
+ var params = reader.decodeStruct(UsbDeviceManager_GetDevice_Params);
+ this.getDevice(params.guid, params.deviceRequest);
+ return true;
+ case kUsbDeviceManager_SetClient_Name:
+ var params = reader.decodeStruct(UsbDeviceManager_SetClient_Params);
+ this.setClient(params.client);
+ return true;
+ default:
+ return false;
+ }
+ };
+
+ UsbDeviceManagerStub.prototype.acceptWithResponder =
+ function(message, responder) {
+ var reader = new codec.MessageReader(message);
+ switch (reader.messageName) {
+ case kUsbDeviceManager_GetDevices_Name:
+ var params = reader.decodeStruct(UsbDeviceManager_GetDevices_Params);
+ this.getDevices(params.options).then(function(response) {
+ var responseParams =
+ new UsbDeviceManager_GetDevices_ResponseParams();
+ responseParams.results = response.results;
+ var builder = new codec.MessageV1Builder(
+ kUsbDeviceManager_GetDevices_Name,
+ codec.align(UsbDeviceManager_GetDevices_ResponseParams.encodedSize),
+ codec.kMessageIsResponse, reader.requestID);
+ builder.encodeStruct(UsbDeviceManager_GetDevices_ResponseParams,
+ responseParams);
+ var message = builder.finish();
+ responder.accept(message);
+ });
+ return true;
+ default:
+ return false;
+ }
+ };
+
+ function validateUsbDeviceManagerRequest(messageValidator) {
+ var message = messageValidator.message;
+ var paramsClass = null;
+ switch (message.getName()) {
+ case kUsbDeviceManager_GetDevices_Name:
+ if (message.expectsResponse())
+ paramsClass = UsbDeviceManager_GetDevices_Params;
+ break;
+ case kUsbDeviceManager_GetDevice_Name:
+ if (!message.expectsResponse() && !message.isResponse())
+ paramsClass = UsbDeviceManager_GetDevice_Params;
+ break;
+ case kUsbDeviceManager_SetClient_Name:
+ if (!message.expectsResponse() && !message.isResponse())
+ paramsClass = UsbDeviceManager_SetClient_Params;
+ break;
+ }
+ if (paramsClass === null)
+ return validator.validationError.NONE;
+ return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
+ }
+
+ function validateUsbDeviceManagerResponse(messageValidator) {
+ var message = messageValidator.message;
+ var paramsClass = null;
+ switch (message.getName()) {
+ case kUsbDeviceManager_GetDevices_Name:
+ if (message.isResponse())
+ paramsClass = UsbDeviceManager_GetDevices_ResponseParams;
+ break;
+ }
+ if (paramsClass === null)
+ return validator.validationError.NONE;
+ return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
+ }
+
+ var UsbDeviceManager = {
+ name: 'device::mojom::UsbDeviceManager',
+ kVersion: 0,
+ ptrClass: UsbDeviceManagerPtr,
+ proxyClass: UsbDeviceManagerProxy,
+ stubClass: UsbDeviceManagerStub,
+ validateRequest: validateUsbDeviceManagerRequest,
+ validateResponse: validateUsbDeviceManagerResponse,
+ };
+ UsbDeviceManagerStub.prototype.validator = validateUsbDeviceManagerRequest;
+ UsbDeviceManagerProxy.prototype.validator = validateUsbDeviceManagerResponse;
+ var kUsbDeviceManagerClient_OnDeviceAdded_Name = 0;
+ var kUsbDeviceManagerClient_OnDeviceRemoved_Name = 1;
+
+ function UsbDeviceManagerClientPtr(handleOrPtrInfo) {
+ this.ptr = new bindings.InterfacePtrController(UsbDeviceManagerClient,
+ handleOrPtrInfo);
+ }
+
+ function UsbDeviceManagerClientAssociatedPtr(associatedInterfacePtrInfo) {
+ this.ptr = new associatedBindings.AssociatedInterfacePtrController(
+ UsbDeviceManagerClient, associatedInterfacePtrInfo);
+ }
+
+ UsbDeviceManagerClientAssociatedPtr.prototype =
+ Object.create(UsbDeviceManagerClientPtr.prototype);
+ UsbDeviceManagerClientAssociatedPtr.prototype.constructor =
+ UsbDeviceManagerClientAssociatedPtr;
+
+ function UsbDeviceManagerClientProxy(receiver) {
+ this.receiver_ = receiver;
+ }
+ UsbDeviceManagerClientPtr.prototype.onDeviceAdded = function() {
+ return UsbDeviceManagerClientProxy.prototype.onDeviceAdded
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceManagerClientProxy.prototype.onDeviceAdded = function(deviceInfo) {
+ var params = new UsbDeviceManagerClient_OnDeviceAdded_Params();
+ params.deviceInfo = deviceInfo;
+ var builder = new codec.MessageV0Builder(
+ kUsbDeviceManagerClient_OnDeviceAdded_Name,
+ codec.align(UsbDeviceManagerClient_OnDeviceAdded_Params.encodedSize));
+ builder.encodeStruct(UsbDeviceManagerClient_OnDeviceAdded_Params, params);
+ var message = builder.finish();
+ this.receiver_.accept(message);
+ };
+ UsbDeviceManagerClientPtr.prototype.onDeviceRemoved = function() {
+ return UsbDeviceManagerClientProxy.prototype.onDeviceRemoved
+ .apply(this.ptr.getProxy(), arguments);
+ };
+
+ UsbDeviceManagerClientProxy.prototype.onDeviceRemoved = function(deviceInfo) {
+ var params = new UsbDeviceManagerClient_OnDeviceRemoved_Params();
+ params.deviceInfo = deviceInfo;
+ var builder = new codec.MessageV0Builder(
+ kUsbDeviceManagerClient_OnDeviceRemoved_Name,
+ codec.align(UsbDeviceManagerClient_OnDeviceRemoved_Params.encodedSize));
+ builder.encodeStruct(UsbDeviceManagerClient_OnDeviceRemoved_Params, params);
+ var message = builder.finish();
+ this.receiver_.accept(message);
+ };
+
+ function UsbDeviceManagerClientStub(delegate) {
+ this.delegate_ = delegate;
+ }
+ UsbDeviceManagerClientStub.prototype.onDeviceAdded = function(deviceInfo) {
+ return this.delegate_ && this.delegate_.onDeviceAdded && this.delegate_.onDeviceAdded(deviceInfo);
+ }
+ UsbDeviceManagerClientStub.prototype.onDeviceRemoved = function(deviceInfo) {
+ return this.delegate_ && this.delegate_.onDeviceRemoved && this.delegate_.onDeviceRemoved(deviceInfo);
+ }
+
+ UsbDeviceManagerClientStub.prototype.accept = function(message) {
+ var reader = new codec.MessageReader(message);
+ switch (reader.messageName) {
+ case kUsbDeviceManagerClient_OnDeviceAdded_Name:
+ var params = reader.decodeStruct(UsbDeviceManagerClient_OnDeviceAdded_Params);
+ this.onDeviceAdded(params.deviceInfo);
+ return true;
+ case kUsbDeviceManagerClient_OnDeviceRemoved_Name:
+ var params = reader.decodeStruct(UsbDeviceManagerClient_OnDeviceRemoved_Params);
+ this.onDeviceRemoved(params.deviceInfo);
+ return true;
+ default:
+ return false;
+ }
+ };
+
+ UsbDeviceManagerClientStub.prototype.acceptWithResponder =
+ function(message, responder) {
+ var reader = new codec.MessageReader(message);
+ switch (reader.messageName) {
+ default:
+ return false;
+ }
+ };
+
+ function validateUsbDeviceManagerClientRequest(messageValidator) {
+ var message = messageValidator.message;
+ var paramsClass = null;
+ switch (message.getName()) {
+ case kUsbDeviceManagerClient_OnDeviceAdded_Name:
+ if (!message.expectsResponse() && !message.isResponse())
+ paramsClass = UsbDeviceManagerClient_OnDeviceAdded_Params;
+ break;
+ case kUsbDeviceManagerClient_OnDeviceRemoved_Name:
+ if (!message.expectsResponse() && !message.isResponse())
+ paramsClass = UsbDeviceManagerClient_OnDeviceRemoved_Params;
+ break;
+ }
+ if (paramsClass === null)
+ return validator.validationError.NONE;
+ return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
+ }
+
+ function validateUsbDeviceManagerClientResponse(messageValidator) {
+ return validator.validationError.NONE;
+ }
+
+ var UsbDeviceManagerClient = {
+ name: 'device::mojom::UsbDeviceManagerClient',
+ kVersion: 0,
+ ptrClass: UsbDeviceManagerClientPtr,
+ proxyClass: UsbDeviceManagerClientProxy,
+ stubClass: UsbDeviceManagerClientStub,
+ validateRequest: validateUsbDeviceManagerClientRequest,
+ validateResponse: null,
+ };
+ UsbDeviceManagerClientStub.prototype.validator = validateUsbDeviceManagerClientRequest;
+ UsbDeviceManagerClientProxy.prototype.validator = null;
+ exports.UsbDeviceFilter = UsbDeviceFilter;
+ exports.UsbEnumerationOptions = UsbEnumerationOptions;
+ exports.UsbDeviceManager = UsbDeviceManager;
+ exports.UsbDeviceManagerPtr = UsbDeviceManagerPtr;
+ exports.UsbDeviceManagerAssociatedPtr = UsbDeviceManagerAssociatedPtr;
+ exports.UsbDeviceManagerClient = UsbDeviceManagerClient;
+ exports.UsbDeviceManagerClientPtr = UsbDeviceManagerClientPtr;
+ exports.UsbDeviceManagerClientAssociatedPtr = UsbDeviceManagerClientAssociatedPtr;
+})(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/resources/chromium/device_manager.mojom.js.headers b/tests/wpt/web-platform-tests/resources/chromium/device_manager.mojom.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/device_manager.mojom.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/resources/chromium/mojo_bindings.js b/tests/wpt/web-platform-tests/resources/chromium/mojo_bindings.js
new file mode 100644
index 00000000000..67d6a882855
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/mojo_bindings.js
@@ -0,0 +1,5129 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+if (mojo && mojo.internal) {
+ throw new Error('The Mojo bindings library has been initialized.');
+}
+
+var mojo = mojo || {};
+mojo.internal = {};
+mojo.internal.global = this;
+mojo.config = {
+ // Whether to automatically load mojom dependencies.
+ // For example, if foo.mojom imports bar.mojom, |autoLoadMojomDeps| set to
+ // true means that loading foo.mojom.js will insert a <script> tag to load
+ // bar.mojom.js, if it hasn't been loaded.
+ //
+ // The URL of bar.mojom.js is determined by the relative path of bar.mojom
+ // (relative to the position of foo.mojom at build time) and the URL of
+ // foo.mojom.js. For exmple, if at build time the two mojom files are
+ // located at:
+ // a/b/c/foo.mojom
+ // a/b/d/bar.mojom
+ // and the URL of foo.mojom.js is:
+ // http://example.org/scripts/b/c/foo.mojom.js
+ // then the URL of bar.mojom.js will be:
+ // http://example.org/scripts/b/d/bar.mojom.js
+ //
+ // If you would like bar.mojom.js to live at a different location, you need
+ // to turn off |autoLoadMojomDeps| before loading foo.mojom.js, and manually
+ // load bar.mojom.js yourself. Similarly, you need to turn off the option if
+ // you merge bar.mojom.js and foo.mojom.js into a single file.
+ //
+ // Performance tip: Avoid loading the same mojom.js file multiple times.
+ // Assume that |autoLoadMojomDeps| is set to true,
+ //
+ // <!--
+ // (This comment tag is necessary on IOS to avoid interpreting the closing
+ // script tags in the example.)
+ //
+ // No duplicate loading; recommended:
+ // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
+ //
+ // No duplicate loading, although unnecessary:
+ // <script src="http://example.org/scripts/b/d/bar.mojom.js"></script>
+ // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
+ //
+ // Load bar.mojom.js twice; should be avoided:
+ // <script src="http://example.org/scripts/b/c/foo.mojom.js"></script>
+ // <script src="http://example.org/scripts/b/d/bar.mojom.js"></script>
+ //
+ // -->
+ autoLoadMojomDeps: true
+};
+
+(function() {
+ var internal = mojo.internal;
+
+ var LoadState = {
+ PENDING_LOAD: 1,
+ LOADED: 2
+ };
+
+ var mojomRegistry = new Map();
+
+ function exposeNamespace(namespace) {
+ var current = internal.global;
+ var parts = namespace.split('.');
+
+ for (var part; parts.length && (part = parts.shift());) {
+ if (!current[part]) {
+ current[part] = {};
+ }
+ current = current[part];
+ }
+
+ return current;
+ }
+
+ function isMojomPendingLoad(id) {
+ return mojomRegistry.get(id) === LoadState.PENDING_LOAD;
+ }
+
+ function isMojomLoaded(id) {
+ return mojomRegistry.get(id) === LoadState.LOADED;
+ }
+
+ function markMojomPendingLoad(id) {
+ if (isMojomLoaded(id)) {
+ throw new Error('The following mojom file has been loaded: ' + id);
+ }
+
+ mojomRegistry.set(id, LoadState.PENDING_LOAD);
+ }
+
+ function markMojomLoaded(id) {
+ mojomRegistry.set(id, LoadState.LOADED);
+ }
+
+ function loadMojomIfNecessary(id, relativePath) {
+ if (mojomRegistry.has(id)) {
+ return;
+ }
+
+ if (internal.global.document === undefined) {
+ throw new Error(
+ 'Mojom dependency autoloading is not implemented in workers. ' +
+ 'Please see config variable mojo.config.autoLoadMojomDeps for more ' +
+ 'details.');
+ }
+
+ markMojomPendingLoad(id);
+ var url = new URL(relativePath, document.currentScript.src).href;
+ internal.global.document.write('<script type="text/javascript" src="' +
+ url + '"><' + '/script>');
+ }
+
+ internal.exposeNamespace = exposeNamespace;
+ internal.isMojomPendingLoad = isMojomPendingLoad;
+ internal.isMojomLoaded = isMojomLoaded;
+ internal.markMojomPendingLoad = markMojomPendingLoad;
+ internal.markMojomLoaded = markMojomLoaded;
+ internal.loadMojomIfNecessary = loadMojomIfNecessary;
+})();
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ // ---------------------------------------------------------------------------
+
+ // |output| could be an interface pointer, InterfacePtrInfo or
+ // AssociatedInterfacePtrInfo.
+ function makeRequest(output) {
+ if (output instanceof mojo.AssociatedInterfacePtrInfo) {
+ var {handle0, handle1} = internal.createPairPendingAssociation();
+ output.interfaceEndpointHandle = handle0;
+ output.version = 0;
+
+ return new mojo.AssociatedInterfaceRequest(handle1);
+ }
+
+ if (output instanceof mojo.InterfacePtrInfo) {
+ var pipe = Mojo.createMessagePipe();
+ output.handle = pipe.handle0;
+ output.version = 0;
+
+ return new mojo.InterfaceRequest(pipe.handle1);
+ }
+
+ var pipe = Mojo.createMessagePipe();
+ output.ptr.bind(new mojo.InterfacePtrInfo(pipe.handle0, 0));
+ return new mojo.InterfaceRequest(pipe.handle1);
+ }
+
+ // ---------------------------------------------------------------------------
+
+ // Operations used to setup/configure an interface pointer. Exposed as the
+ // |ptr| field of generated interface pointer classes.
+ // |ptrInfoOrHandle| could be omitted and passed into bind() later.
+ function InterfacePtrController(interfaceType, ptrInfoOrHandle) {
+ this.version = 0;
+
+ this.interfaceType_ = interfaceType;
+ this.router_ = null;
+ this.interfaceEndpointClient_ = null;
+ this.proxy_ = null;
+
+ // |router_| and |interfaceEndpointClient_| are lazily initialized.
+ // |handle_| is valid between bind() and
+ // the initialization of |router_| and |interfaceEndpointClient_|.
+ this.handle_ = null;
+
+ if (ptrInfoOrHandle)
+ this.bind(ptrInfoOrHandle);
+ }
+
+ InterfacePtrController.prototype.bind = function(ptrInfoOrHandle) {
+ this.reset();
+
+ if (ptrInfoOrHandle instanceof mojo.InterfacePtrInfo) {
+ this.version = ptrInfoOrHandle.version;
+ this.handle_ = ptrInfoOrHandle.handle;
+ } else {
+ this.handle_ = ptrInfoOrHandle;
+ }
+ };
+
+ InterfacePtrController.prototype.isBound = function() {
+ return this.interfaceEndpointClient_ !== null || this.handle_ !== null;
+ };
+
+ // Although users could just discard the object, reset() closes the pipe
+ // immediately.
+ InterfacePtrController.prototype.reset = function() {
+ this.version = 0;
+ if (this.interfaceEndpointClient_) {
+ this.interfaceEndpointClient_.close();
+ this.interfaceEndpointClient_ = null;
+ }
+ if (this.router_) {
+ this.router_.close();
+ this.router_ = null;
+
+ this.proxy_ = null;
+ }
+ if (this.handle_) {
+ this.handle_.close();
+ this.handle_ = null;
+ }
+ };
+
+ InterfacePtrController.prototype.resetWithReason = function(reason) {
+ if (this.isBound()) {
+ this.configureProxyIfNecessary_();
+ this.interfaceEndpointClient_.close(reason);
+ this.interfaceEndpointClient_ = null;
+ }
+ this.reset();
+ };
+
+ InterfacePtrController.prototype.setConnectionErrorHandler = function(
+ callback) {
+ if (!this.isBound())
+ throw new Error("Cannot set connection error handler if not bound.");
+
+ this.configureProxyIfNecessary_();
+ this.interfaceEndpointClient_.setConnectionErrorHandler(callback);
+ };
+
+ InterfacePtrController.prototype.passInterface = function() {
+ var result;
+ if (this.router_) {
+ // TODO(yzshen): Fix Router interface to support extracting handle.
+ result = new mojo.InterfacePtrInfo(
+ this.router_.connector_.handle_, this.version);
+ this.router_.connector_.handle_ = null;
+ } else {
+ // This also handles the case when this object is not bound.
+ result = new mojo.InterfacePtrInfo(this.handle_, this.version);
+ this.handle_ = null;
+ }
+
+ this.reset();
+ return result;
+ };
+
+ InterfacePtrController.prototype.getProxy = function() {
+ this.configureProxyIfNecessary_();
+ return this.proxy_;
+ };
+
+ InterfacePtrController.prototype.configureProxyIfNecessary_ = function() {
+ if (!this.handle_)
+ return;
+
+ this.router_ = new internal.Router(this.handle_, true);
+ this.handle_ = null;
+
+ this.interfaceEndpointClient_ = new internal.InterfaceEndpointClient(
+ this.router_.createLocalEndpointHandle(internal.kMasterInterfaceId));
+
+ this.interfaceEndpointClient_ .setPayloadValidators([
+ this.interfaceType_.validateResponse]);
+ this.proxy_ = new this.interfaceType_.proxyClass(
+ this.interfaceEndpointClient_);
+ };
+
+ InterfacePtrController.prototype.queryVersion = function() {
+ function onQueryVersion(version) {
+ this.version = version;
+ return version;
+ }
+
+ this.configureProxyIfNecessary_();
+ return this.interfaceEndpointClient_.queryVersion().then(
+ onQueryVersion.bind(this));
+ };
+
+ InterfacePtrController.prototype.requireVersion = function(version) {
+ this.configureProxyIfNecessary_();
+
+ if (this.version >= version) {
+ return;
+ }
+ this.version = version;
+ this.interfaceEndpointClient_.requireVersion(version);
+ };
+
+ // ---------------------------------------------------------------------------
+
+ // |request| could be omitted and passed into bind() later.
+ //
+ // Example:
+ //
+ // // FooImpl implements mojom.Foo.
+ // function FooImpl() { ... }
+ // FooImpl.prototype.fooMethod1 = function() { ... }
+ // FooImpl.prototype.fooMethod2 = function() { ... }
+ //
+ // var fooPtr = new mojom.FooPtr();
+ // var request = makeRequest(fooPtr);
+ // var binding = new Binding(mojom.Foo, new FooImpl(), request);
+ // fooPtr.fooMethod1();
+ function Binding(interfaceType, impl, requestOrHandle) {
+ this.interfaceType_ = interfaceType;
+ this.impl_ = impl;
+ this.router_ = null;
+ this.interfaceEndpointClient_ = null;
+ this.stub_ = null;
+
+ if (requestOrHandle)
+ this.bind(requestOrHandle);
+ }
+
+ Binding.prototype.isBound = function() {
+ return this.router_ !== null;
+ };
+
+ Binding.prototype.createInterfacePtrAndBind = function() {
+ var ptr = new this.interfaceType_.ptrClass();
+ // TODO(yzshen): Set the version of the interface pointer.
+ this.bind(makeRequest(ptr));
+ return ptr;
+ };
+
+ Binding.prototype.bind = function(requestOrHandle) {
+ this.close();
+
+ var handle = requestOrHandle instanceof mojo.InterfaceRequest ?
+ requestOrHandle.handle : requestOrHandle;
+ if (!(handle instanceof MojoHandle))
+ return;
+
+ this.router_ = new internal.Router(handle);
+
+ this.stub_ = new this.interfaceType_.stubClass(this.impl_);
+ this.interfaceEndpointClient_ = new internal.InterfaceEndpointClient(
+ this.router_.createLocalEndpointHandle(internal.kMasterInterfaceId),
+ this.stub_, this.interfaceType_.kVersion);
+
+ this.interfaceEndpointClient_ .setPayloadValidators([
+ this.interfaceType_.validateRequest]);
+ };
+
+ Binding.prototype.close = function() {
+ if (!this.isBound())
+ return;
+
+ if (this.interfaceEndpointClient_) {
+ this.interfaceEndpointClient_.close();
+ this.interfaceEndpointClient_ = null;
+ }
+
+ this.router_.close();
+ this.router_ = null;
+ this.stub_ = null;
+ };
+
+ Binding.prototype.closeWithReason = function(reason) {
+ if (this.interfaceEndpointClient_) {
+ this.interfaceEndpointClient_.close(reason);
+ this.interfaceEndpointClient_ = null;
+ }
+ this.close();
+ };
+
+ Binding.prototype.setConnectionErrorHandler = function(callback) {
+ if (!this.isBound()) {
+ throw new Error("Cannot set connection error handler if not bound.");
+ }
+ this.interfaceEndpointClient_.setConnectionErrorHandler(callback);
+ };
+
+ Binding.prototype.unbind = function() {
+ if (!this.isBound())
+ return new mojo.InterfaceRequest(null);
+
+ var result = new mojo.InterfaceRequest(this.router_.connector_.handle_);
+ this.router_.connector_.handle_ = null;
+ this.close();
+ return result;
+ };
+
+ // ---------------------------------------------------------------------------
+
+ function BindingSetEntry(bindingSet, interfaceType, bindingType, impl,
+ requestOrHandle, bindingId) {
+ this.bindingSet_ = bindingSet;
+ this.bindingId_ = bindingId;
+ this.binding_ = new bindingType(interfaceType, impl,
+ requestOrHandle);
+
+ this.binding_.setConnectionErrorHandler(function(reason) {
+ this.bindingSet_.onConnectionError(bindingId, reason);
+ }.bind(this));
+ }
+
+ BindingSetEntry.prototype.close = function() {
+ this.binding_.close();
+ };
+
+ function BindingSet(interfaceType) {
+ this.interfaceType_ = interfaceType;
+ this.nextBindingId_ = 0;
+ this.bindings_ = new Map();
+ this.errorHandler_ = null;
+ this.bindingType_ = Binding;
+ }
+
+ BindingSet.prototype.isEmpty = function() {
+ return this.bindings_.size == 0;
+ };
+
+ BindingSet.prototype.addBinding = function(impl, requestOrHandle) {
+ this.bindings_.set(
+ this.nextBindingId_,
+ new BindingSetEntry(this, this.interfaceType_, this.bindingType_, impl,
+ requestOrHandle, this.nextBindingId_));
+ ++this.nextBindingId_;
+ };
+
+ BindingSet.prototype.closeAllBindings = function() {
+ for (var entry of this.bindings_.values())
+ entry.close();
+ this.bindings_.clear();
+ };
+
+ BindingSet.prototype.setConnectionErrorHandler = function(callback) {
+ this.errorHandler_ = callback;
+ };
+
+ BindingSet.prototype.onConnectionError = function(bindingId, reason) {
+ this.bindings_.delete(bindingId);
+
+ if (this.errorHandler_)
+ this.errorHandler_(reason);
+ };
+
+ // ---------------------------------------------------------------------------
+
+ // Operations used to setup/configure an associated interface pointer.
+ // Exposed as |ptr| field of generated associated interface pointer classes.
+ // |associatedPtrInfo| could be omitted and passed into bind() later.
+ //
+ // Example:
+ // // IntegerSenderImpl implements mojom.IntegerSender
+ // function IntegerSenderImpl() { ... }
+ // IntegerSenderImpl.prototype.echo = function() { ... }
+ //
+ // // IntegerSenderConnectionImpl implements mojom.IntegerSenderConnection
+ // function IntegerSenderConnectionImpl() {
+ // this.senderBinding_ = null;
+ // }
+ // IntegerSenderConnectionImpl.prototype.getSender = function(
+ // associatedRequest) {
+ // this.senderBinding_ = new AssociatedBinding(mojom.IntegerSender,
+ // new IntegerSenderImpl(),
+ // associatedRequest);
+ // }
+ //
+ // var integerSenderConnection = new mojom.IntegerSenderConnectionPtr();
+ // var integerSenderConnectionBinding = new Binding(
+ // mojom.IntegerSenderConnection,
+ // new IntegerSenderConnectionImpl(),
+ // mojo.makeRequest(integerSenderConnection));
+ //
+ // // A locally-created associated interface pointer can only be used to
+ // // make calls when the corresponding associated request is sent over
+ // // another interface (either the master interface or another
+ // // associated interface).
+ // var associatedInterfacePtrInfo = new AssociatedInterfacePtrInfo();
+ // var associatedRequest = makeRequest(interfacePtrInfo);
+ //
+ // integerSenderConnection.getSender(associatedRequest);
+ //
+ // // Create an associated interface and bind the associated handle.
+ // var integerSender = new mojom.AssociatedIntegerSenderPtr();
+ // integerSender.ptr.bind(associatedInterfacePtrInfo);
+ // integerSender.echo();
+
+ function AssociatedInterfacePtrController(interfaceType, associatedPtrInfo) {
+ this.version = 0;
+
+ this.interfaceType_ = interfaceType;
+ this.interfaceEndpointClient_ = null;
+ this.proxy_ = null;
+
+ if (associatedPtrInfo) {
+ this.bind(associatedPtrInfo);
+ }
+ }
+
+ AssociatedInterfacePtrController.prototype.bind = function(
+ associatedPtrInfo) {
+ this.reset();
+ this.version = associatedPtrInfo.version;
+
+ this.interfaceEndpointClient_ = new internal.InterfaceEndpointClient(
+ associatedPtrInfo.interfaceEndpointHandle);
+
+ this.interfaceEndpointClient_ .setPayloadValidators([
+ this.interfaceType_.validateResponse]);
+ this.proxy_ = new this.interfaceType_.proxyClass(
+ this.interfaceEndpointClient_);
+ };
+
+ AssociatedInterfacePtrController.prototype.isBound = function() {
+ return this.interfaceEndpointClient_ !== null;
+ };
+
+ AssociatedInterfacePtrController.prototype.reset = function() {
+ this.version = 0;
+ if (this.interfaceEndpointClient_) {
+ this.interfaceEndpointClient_.close();
+ this.interfaceEndpointClient_ = null;
+ }
+ if (this.proxy_) {
+ this.proxy_ = null;
+ }
+ };
+
+ AssociatedInterfacePtrController.prototype.resetWithReason = function(
+ reason) {
+ if (this.isBound()) {
+ this.interfaceEndpointClient_.close(reason);
+ this.interfaceEndpointClient_ = null;
+ }
+ this.reset();
+ };
+
+ // Indicates whether an error has been encountered. If true, method calls
+ // on this interface will be dropped (and may already have been dropped).
+ AssociatedInterfacePtrController.prototype.getEncounteredError = function() {
+ return this.interfaceEndpointClient_ ?
+ this.interfaceEndpointClient_.getEncounteredError() : false;
+ };
+
+ AssociatedInterfacePtrController.prototype.setConnectionErrorHandler =
+ function(callback) {
+ if (!this.isBound()) {
+ throw new Error("Cannot set connection error handler if not bound.");
+ }
+
+ this.interfaceEndpointClient_.setConnectionErrorHandler(callback);
+ };
+
+ AssociatedInterfacePtrController.prototype.passInterface = function() {
+ if (!this.isBound()) {
+ return new mojo.AssociatedInterfacePtrInfo(null);
+ }
+
+ var result = new mojo.AssociatedInterfacePtrInfo(
+ this.interfaceEndpointClient_.passHandle(), this.version);
+ this.reset();
+ return result;
+ };
+
+ AssociatedInterfacePtrController.prototype.getProxy = function() {
+ return this.proxy_;
+ };
+
+ AssociatedInterfacePtrController.prototype.queryVersion = function() {
+ function onQueryVersion(version) {
+ this.version = version;
+ return version;
+ }
+
+ return this.interfaceEndpointClient_.queryVersion().then(
+ onQueryVersion.bind(this));
+ };
+
+ AssociatedInterfacePtrController.prototype.requireVersion = function(
+ version) {
+ if (this.version >= version) {
+ return;
+ }
+ this.version = version;
+ this.interfaceEndpointClient_.requireVersion(version);
+ };
+
+ // ---------------------------------------------------------------------------
+
+ // |associatedInterfaceRequest| could be omitted and passed into bind()
+ // later.
+ function AssociatedBinding(interfaceType, impl, associatedInterfaceRequest) {
+ this.interfaceType_ = interfaceType;
+ this.impl_ = impl;
+ this.interfaceEndpointClient_ = null;
+ this.stub_ = null;
+
+ if (associatedInterfaceRequest) {
+ this.bind(associatedInterfaceRequest);
+ }
+ }
+
+ AssociatedBinding.prototype.isBound = function() {
+ return this.interfaceEndpointClient_ !== null;
+ };
+
+ AssociatedBinding.prototype.bind = function(associatedInterfaceRequest) {
+ this.close();
+
+ this.stub_ = new this.interfaceType_.stubClass(this.impl_);
+ this.interfaceEndpointClient_ = new internal.InterfaceEndpointClient(
+ associatedInterfaceRequest.interfaceEndpointHandle, this.stub_,
+ this.interfaceType_.kVersion);
+
+ this.interfaceEndpointClient_ .setPayloadValidators([
+ this.interfaceType_.validateRequest]);
+ };
+
+
+ AssociatedBinding.prototype.close = function() {
+ if (!this.isBound()) {
+ return;
+ }
+
+ if (this.interfaceEndpointClient_) {
+ this.interfaceEndpointClient_.close();
+ this.interfaceEndpointClient_ = null;
+ }
+
+ this.stub_ = null;
+ };
+
+ AssociatedBinding.prototype.closeWithReason = function(reason) {
+ if (this.interfaceEndpointClient_) {
+ this.interfaceEndpointClient_.close(reason);
+ this.interfaceEndpointClient_ = null;
+ }
+ this.close();
+ };
+
+ AssociatedBinding.prototype.setConnectionErrorHandler = function(callback) {
+ if (!this.isBound()) {
+ throw new Error("Cannot set connection error handler if not bound.");
+ }
+ this.interfaceEndpointClient_.setConnectionErrorHandler(callback);
+ };
+
+ AssociatedBinding.prototype.unbind = function() {
+ if (!this.isBound()) {
+ return new mojo.AssociatedInterfaceRequest(null);
+ }
+
+ var result = new mojo.AssociatedInterfaceRequest(
+ this.interfaceEndpointClient_.passHandle());
+ this.close();
+ return result;
+ };
+
+ // ---------------------------------------------------------------------------
+
+ function AssociatedBindingSet(interfaceType) {
+ mojo.BindingSet.call(this, interfaceType);
+ this.bindingType_ = AssociatedBinding;
+ }
+
+ AssociatedBindingSet.prototype = Object.create(BindingSet.prototype);
+ AssociatedBindingSet.prototype.constructor = AssociatedBindingSet;
+
+ mojo.makeRequest = makeRequest;
+ mojo.AssociatedInterfacePtrController = AssociatedInterfacePtrController;
+ mojo.AssociatedBinding = AssociatedBinding;
+ mojo.AssociatedBindingSet = AssociatedBindingSet;
+ mojo.Binding = Binding;
+ mojo.BindingSet = BindingSet;
+ mojo.InterfacePtrController = InterfacePtrController;
+})();
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ var kHostIsLittleEndian = (function () {
+ var endianArrayBuffer = new ArrayBuffer(2);
+ var endianUint8Array = new Uint8Array(endianArrayBuffer);
+ var endianUint16Array = new Uint16Array(endianArrayBuffer);
+ endianUint16Array[0] = 1;
+ return endianUint8Array[0] == 1;
+ })();
+
+ var kHighWordMultiplier = 0x100000000;
+
+ function Buffer(sizeOrArrayBuffer) {
+ if (sizeOrArrayBuffer instanceof ArrayBuffer)
+ this.arrayBuffer = sizeOrArrayBuffer;
+ else
+ this.arrayBuffer = new ArrayBuffer(sizeOrArrayBuffer);
+
+ this.dataView = new DataView(this.arrayBuffer);
+ this.next = 0;
+ }
+
+ Object.defineProperty(Buffer.prototype, "byteLength", {
+ get: function() { return this.arrayBuffer.byteLength; }
+ });
+
+ Buffer.prototype.alloc = function(size) {
+ var pointer = this.next;
+ this.next += size;
+ if (this.next > this.byteLength) {
+ var newSize = (1.5 * (this.byteLength + size)) | 0;
+ this.grow(newSize);
+ }
+ return pointer;
+ };
+
+ function copyArrayBuffer(dstArrayBuffer, srcArrayBuffer) {
+ (new Uint8Array(dstArrayBuffer)).set(new Uint8Array(srcArrayBuffer));
+ }
+
+ Buffer.prototype.grow = function(size) {
+ var newArrayBuffer = new ArrayBuffer(size);
+ copyArrayBuffer(newArrayBuffer, this.arrayBuffer);
+ this.arrayBuffer = newArrayBuffer;
+ this.dataView = new DataView(this.arrayBuffer);
+ };
+
+ Buffer.prototype.trim = function() {
+ this.arrayBuffer = this.arrayBuffer.slice(0, this.next);
+ this.dataView = new DataView(this.arrayBuffer);
+ };
+
+ Buffer.prototype.getUint8 = function(offset) {
+ return this.dataView.getUint8(offset);
+ }
+ Buffer.prototype.getUint16 = function(offset) {
+ return this.dataView.getUint16(offset, kHostIsLittleEndian);
+ }
+ Buffer.prototype.getUint32 = function(offset) {
+ return this.dataView.getUint32(offset, kHostIsLittleEndian);
+ }
+ Buffer.prototype.getUint64 = function(offset) {
+ var lo, hi;
+ if (kHostIsLittleEndian) {
+ lo = this.dataView.getUint32(offset, kHostIsLittleEndian);
+ hi = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
+ } else {
+ hi = this.dataView.getUint32(offset, kHostIsLittleEndian);
+ lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
+ }
+ return lo + hi * kHighWordMultiplier;
+ }
+
+ Buffer.prototype.getInt8 = function(offset) {
+ return this.dataView.getInt8(offset);
+ }
+ Buffer.prototype.getInt16 = function(offset) {
+ return this.dataView.getInt16(offset, kHostIsLittleEndian);
+ }
+ Buffer.prototype.getInt32 = function(offset) {
+ return this.dataView.getInt32(offset, kHostIsLittleEndian);
+ }
+ Buffer.prototype.getInt64 = function(offset) {
+ var lo, hi;
+ if (kHostIsLittleEndian) {
+ lo = this.dataView.getUint32(offset, kHostIsLittleEndian);
+ hi = this.dataView.getInt32(offset + 4, kHostIsLittleEndian);
+ } else {
+ hi = this.dataView.getInt32(offset, kHostIsLittleEndian);
+ lo = this.dataView.getUint32(offset + 4, kHostIsLittleEndian);
+ }
+ return lo + hi * kHighWordMultiplier;
+ }
+
+ Buffer.prototype.getFloat32 = function(offset) {
+ return this.dataView.getFloat32(offset, kHostIsLittleEndian);
+ }
+ Buffer.prototype.getFloat64 = function(offset) {
+ return this.dataView.getFloat64(offset, kHostIsLittleEndian);
+ }
+
+ Buffer.prototype.setUint8 = function(offset, value) {
+ this.dataView.setUint8(offset, value);
+ }
+ Buffer.prototype.setUint16 = function(offset, value) {
+ this.dataView.setUint16(offset, value, kHostIsLittleEndian);
+ }
+ Buffer.prototype.setUint32 = function(offset, value) {
+ this.dataView.setUint32(offset, value, kHostIsLittleEndian);
+ }
+ Buffer.prototype.setUint64 = function(offset, value) {
+ var hi = (value / kHighWordMultiplier) | 0;
+ if (kHostIsLittleEndian) {
+ this.dataView.setInt32(offset, value, kHostIsLittleEndian);
+ this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian);
+ } else {
+ this.dataView.setInt32(offset, hi, kHostIsLittleEndian);
+ this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian);
+ }
+ }
+
+ Buffer.prototype.setInt8 = function(offset, value) {
+ this.dataView.setInt8(offset, value);
+ }
+ Buffer.prototype.setInt16 = function(offset, value) {
+ this.dataView.setInt16(offset, value, kHostIsLittleEndian);
+ }
+ Buffer.prototype.setInt32 = function(offset, value) {
+ this.dataView.setInt32(offset, value, kHostIsLittleEndian);
+ }
+ Buffer.prototype.setInt64 = function(offset, value) {
+ var hi = Math.floor(value / kHighWordMultiplier);
+ if (kHostIsLittleEndian) {
+ this.dataView.setInt32(offset, value, kHostIsLittleEndian);
+ this.dataView.setInt32(offset + 4, hi, kHostIsLittleEndian);
+ } else {
+ this.dataView.setInt32(offset, hi, kHostIsLittleEndian);
+ this.dataView.setInt32(offset + 4, value, kHostIsLittleEndian);
+ }
+ }
+
+ Buffer.prototype.setFloat32 = function(offset, value) {
+ this.dataView.setFloat32(offset, value, kHostIsLittleEndian);
+ }
+ Buffer.prototype.setFloat64 = function(offset, value) {
+ this.dataView.setFloat64(offset, value, kHostIsLittleEndian);
+ }
+
+ internal.Buffer = Buffer;
+})();
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ var kErrorUnsigned = "Passing negative value to unsigned";
+ var kErrorArray = "Passing non Array for array type";
+ var kErrorString = "Passing non String for string type";
+ var kErrorMap = "Passing non Map for map type";
+
+ // Memory -------------------------------------------------------------------
+
+ var kAlignment = 8;
+
+ function align(size) {
+ return size + (kAlignment - (size % kAlignment)) % kAlignment;
+ }
+
+ function isAligned(offset) {
+ return offset >= 0 && (offset % kAlignment) === 0;
+ }
+
+ // Constants ----------------------------------------------------------------
+
+ var kArrayHeaderSize = 8;
+ var kStructHeaderSize = 8;
+ var kMessageV0HeaderSize = 24;
+ var kMessageV1HeaderSize = 32;
+ var kMessageV2HeaderSize = 48;
+ var kMapStructPayloadSize = 16;
+
+ var kStructHeaderNumBytesOffset = 0;
+ var kStructHeaderVersionOffset = 4;
+
+ var kEncodedInvalidHandleValue = 0xFFFFFFFF;
+
+ // Decoder ------------------------------------------------------------------
+
+ function Decoder(buffer, handles, associatedEndpointHandles, base) {
+ this.buffer = buffer;
+ this.handles = handles;
+ this.associatedEndpointHandles = associatedEndpointHandles;
+ this.base = base;
+ this.next = base;
+ }
+
+ Decoder.prototype.align = function() {
+ this.next = align(this.next);
+ };
+
+ Decoder.prototype.skip = function(offset) {
+ this.next += offset;
+ };
+
+ Decoder.prototype.readInt8 = function() {
+ var result = this.buffer.getInt8(this.next);
+ this.next += 1;
+ return result;
+ };
+
+ Decoder.prototype.readUint8 = function() {
+ var result = this.buffer.getUint8(this.next);
+ this.next += 1;
+ return result;
+ };
+
+ Decoder.prototype.readInt16 = function() {
+ var result = this.buffer.getInt16(this.next);
+ this.next += 2;
+ return result;
+ };
+
+ Decoder.prototype.readUint16 = function() {
+ var result = this.buffer.getUint16(this.next);
+ this.next += 2;
+ return result;
+ };
+
+ Decoder.prototype.readInt32 = function() {
+ var result = this.buffer.getInt32(this.next);
+ this.next += 4;
+ return result;
+ };
+
+ Decoder.prototype.readUint32 = function() {
+ var result = this.buffer.getUint32(this.next);
+ this.next += 4;
+ return result;
+ };
+
+ Decoder.prototype.readInt64 = function() {
+ var result = this.buffer.getInt64(this.next);
+ this.next += 8;
+ return result;
+ };
+
+ Decoder.prototype.readUint64 = function() {
+ var result = this.buffer.getUint64(this.next);
+ this.next += 8;
+ return result;
+ };
+
+ Decoder.prototype.readFloat = function() {
+ var result = this.buffer.getFloat32(this.next);
+ this.next += 4;
+ return result;
+ };
+
+ Decoder.prototype.readDouble = function() {
+ var result = this.buffer.getFloat64(this.next);
+ this.next += 8;
+ return result;
+ };
+
+ Decoder.prototype.decodePointer = function() {
+ // TODO(abarth): To correctly decode a pointer, we need to know the real
+ // base address of the array buffer.
+ var offsetPointer = this.next;
+ var offset = this.readUint64();
+ if (!offset)
+ return 0;
+ return offsetPointer + offset;
+ };
+
+ Decoder.prototype.decodeAndCreateDecoder = function(pointer) {
+ return new Decoder(this.buffer, this.handles,
+ this.associatedEndpointHandles, pointer);
+ };
+
+ Decoder.prototype.decodeHandle = function() {
+ return this.handles[this.readUint32()] || null;
+ };
+
+ Decoder.prototype.decodeAssociatedEndpointHandle = function() {
+ return this.associatedEndpointHandles[this.readUint32()] || null;
+ };
+
+ Decoder.prototype.decodeString = function() {
+ var numberOfBytes = this.readUint32();
+ var numberOfElements = this.readUint32();
+ var base = this.next;
+ this.next += numberOfElements;
+ return internal.decodeUtf8String(
+ new Uint8Array(this.buffer.arrayBuffer, base, numberOfElements));
+ };
+
+ Decoder.prototype.decodeArray = function(cls) {
+ var numberOfBytes = this.readUint32();
+ var numberOfElements = this.readUint32();
+ var val = new Array(numberOfElements);
+ if (cls === PackedBool) {
+ var byte;
+ for (var i = 0; i < numberOfElements; ++i) {
+ if (i % 8 === 0)
+ byte = this.readUint8();
+ val[i] = (byte & (1 << i % 8)) ? true : false;
+ }
+ } else {
+ for (var i = 0; i < numberOfElements; ++i) {
+ val[i] = cls.decode(this);
+ }
+ }
+ return val;
+ };
+
+ Decoder.prototype.decodeStruct = function(cls) {
+ return cls.decode(this);
+ };
+
+ Decoder.prototype.decodeStructPointer = function(cls) {
+ var pointer = this.decodePointer();
+ if (!pointer) {
+ return null;
+ }
+ return cls.decode(this.decodeAndCreateDecoder(pointer));
+ };
+
+ Decoder.prototype.decodeArrayPointer = function(cls) {
+ var pointer = this.decodePointer();
+ if (!pointer) {
+ return null;
+ }
+ return this.decodeAndCreateDecoder(pointer).decodeArray(cls);
+ };
+
+ Decoder.prototype.decodeStringPointer = function() {
+ var pointer = this.decodePointer();
+ if (!pointer) {
+ return null;
+ }
+ return this.decodeAndCreateDecoder(pointer).decodeString();
+ };
+
+ Decoder.prototype.decodeMap = function(keyClass, valueClass) {
+ this.skip(4); // numberOfBytes
+ this.skip(4); // version
+ var keys = this.decodeArrayPointer(keyClass);
+ var values = this.decodeArrayPointer(valueClass);
+ var val = new Map();
+ for (var i = 0; i < keys.length; i++)
+ val.set(keys[i], values[i]);
+ return val;
+ };
+
+ Decoder.prototype.decodeMapPointer = function(keyClass, valueClass) {
+ var pointer = this.decodePointer();
+ if (!pointer) {
+ return null;
+ }
+ var decoder = this.decodeAndCreateDecoder(pointer);
+ return decoder.decodeMap(keyClass, valueClass);
+ };
+
+ // Encoder ------------------------------------------------------------------
+
+ function Encoder(buffer, handles, associatedEndpointHandles, base) {
+ this.buffer = buffer;
+ this.handles = handles;
+ this.associatedEndpointHandles = associatedEndpointHandles;
+ this.base = base;
+ this.next = base;
+ }
+
+ Encoder.prototype.align = function() {
+ this.next = align(this.next);
+ };
+
+ Encoder.prototype.skip = function(offset) {
+ this.next += offset;
+ };
+
+ Encoder.prototype.writeInt8 = function(val) {
+ this.buffer.setInt8(this.next, val);
+ this.next += 1;
+ };
+
+ Encoder.prototype.writeUint8 = function(val) {
+ if (val < 0) {
+ throw new Error(kErrorUnsigned);
+ }
+ this.buffer.setUint8(this.next, val);
+ this.next += 1;
+ };
+
+ Encoder.prototype.writeInt16 = function(val) {
+ this.buffer.setInt16(this.next, val);
+ this.next += 2;
+ };
+
+ Encoder.prototype.writeUint16 = function(val) {
+ if (val < 0) {
+ throw new Error(kErrorUnsigned);
+ }
+ this.buffer.setUint16(this.next, val);
+ this.next += 2;
+ };
+
+ Encoder.prototype.writeInt32 = function(val) {
+ this.buffer.setInt32(this.next, val);
+ this.next += 4;
+ };
+
+ Encoder.prototype.writeUint32 = function(val) {
+ if (val < 0) {
+ throw new Error(kErrorUnsigned);
+ }
+ this.buffer.setUint32(this.next, val);
+ this.next += 4;
+ };
+
+ Encoder.prototype.writeInt64 = function(val) {
+ this.buffer.setInt64(this.next, val);
+ this.next += 8;
+ };
+
+ Encoder.prototype.writeUint64 = function(val) {
+ if (val < 0) {
+ throw new Error(kErrorUnsigned);
+ }
+ this.buffer.setUint64(this.next, val);
+ this.next += 8;
+ };
+
+ Encoder.prototype.writeFloat = function(val) {
+ this.buffer.setFloat32(this.next, val);
+ this.next += 4;
+ };
+
+ Encoder.prototype.writeDouble = function(val) {
+ this.buffer.setFloat64(this.next, val);
+ this.next += 8;
+ };
+
+ Encoder.prototype.encodePointer = function(pointer) {
+ if (!pointer)
+ return this.writeUint64(0);
+ // TODO(abarth): To correctly encode a pointer, we need to know the real
+ // base address of the array buffer.
+ var offset = pointer - this.next;
+ this.writeUint64(offset);
+ };
+
+ Encoder.prototype.createAndEncodeEncoder = function(size) {
+ var pointer = this.buffer.alloc(align(size));
+ this.encodePointer(pointer);
+ return new Encoder(this.buffer, this.handles,
+ this.associatedEndpointHandles, pointer);
+ };
+
+ Encoder.prototype.encodeHandle = function(handle) {
+ if (handle) {
+ this.handles.push(handle);
+ this.writeUint32(this.handles.length - 1);
+ } else {
+ this.writeUint32(kEncodedInvalidHandleValue);
+ }
+ };
+
+ Encoder.prototype.encodeAssociatedEndpointHandle = function(endpointHandle) {
+ if (endpointHandle) {
+ this.associatedEndpointHandles.push(endpointHandle);
+ this.writeUint32(this.associatedEndpointHandles.length - 1);
+ } else {
+ this.writeUint32(kEncodedInvalidHandleValue);
+ }
+ };
+
+ Encoder.prototype.encodeString = function(val) {
+ var base = this.next + kArrayHeaderSize;
+ var numberOfElements = internal.encodeUtf8String(
+ val, new Uint8Array(this.buffer.arrayBuffer, base));
+ var numberOfBytes = kArrayHeaderSize + numberOfElements;
+ this.writeUint32(numberOfBytes);
+ this.writeUint32(numberOfElements);
+ this.next += numberOfElements;
+ };
+
+ Encoder.prototype.encodeArray =
+ function(cls, val, numberOfElements, encodedSize) {
+ if (numberOfElements === undefined)
+ numberOfElements = val.length;
+ if (encodedSize === undefined)
+ encodedSize = kArrayHeaderSize + cls.encodedSize * numberOfElements;
+
+ this.writeUint32(encodedSize);
+ this.writeUint32(numberOfElements);
+
+ if (cls === PackedBool) {
+ var byte = 0;
+ for (i = 0; i < numberOfElements; ++i) {
+ if (val[i])
+ byte |= (1 << i % 8);
+ if (i % 8 === 7 || i == numberOfElements - 1) {
+ Uint8.encode(this, byte);
+ byte = 0;
+ }
+ }
+ } else {
+ for (var i = 0; i < numberOfElements; ++i)
+ cls.encode(this, val[i]);
+ }
+ };
+
+ Encoder.prototype.encodeStruct = function(cls, val) {
+ return cls.encode(this, val);
+ };
+
+ Encoder.prototype.encodeStructPointer = function(cls, val) {
+ if (val == null) {
+ // Also handles undefined, since undefined == null.
+ this.encodePointer(val);
+ return;
+ }
+ var encoder = this.createAndEncodeEncoder(cls.encodedSize);
+ cls.encode(encoder, val);
+ };
+
+ Encoder.prototype.encodeArrayPointer = function(cls, val) {
+ if (val == null) {
+ // Also handles undefined, since undefined == null.
+ this.encodePointer(val);
+ return;
+ }
+
+ var numberOfElements = val.length;
+ if (!Number.isSafeInteger(numberOfElements) || numberOfElements < 0)
+ throw new Error(kErrorArray);
+
+ var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ?
+ Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements);
+ var encoder = this.createAndEncodeEncoder(encodedSize);
+ encoder.encodeArray(cls, val, numberOfElements, encodedSize);
+ };
+
+ Encoder.prototype.encodeStringPointer = function(val) {
+ if (val == null) {
+ // Also handles undefined, since undefined == null.
+ this.encodePointer(val);
+ return;
+ }
+ // Only accepts string primivites, not String Objects like new String("foo")
+ if (typeof(val) !== "string") {
+ throw new Error(kErrorString);
+ }
+ var encodedSize = kArrayHeaderSize + internal.utf8Length(val);
+ var encoder = this.createAndEncodeEncoder(encodedSize);
+ encoder.encodeString(val);
+ };
+
+ Encoder.prototype.encodeMap = function(keyClass, valueClass, val) {
+ var keys = new Array(val.size);
+ var values = new Array(val.size);
+ var i = 0;
+ val.forEach(function(value, key) {
+ values[i] = value;
+ keys[i++] = key;
+ });
+ this.writeUint32(kStructHeaderSize + kMapStructPayloadSize);
+ this.writeUint32(0); // version
+ this.encodeArrayPointer(keyClass, keys);
+ this.encodeArrayPointer(valueClass, values);
+ }
+
+ Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) {
+ if (val == null) {
+ // Also handles undefined, since undefined == null.
+ this.encodePointer(val);
+ return;
+ }
+ if (!(val instanceof Map)) {
+ throw new Error(kErrorMap);
+ }
+ var encodedSize = kStructHeaderSize + kMapStructPayloadSize;
+ var encoder = this.createAndEncodeEncoder(encodedSize);
+ encoder.encodeMap(keyClass, valueClass, val);
+ };
+
+ // Message ------------------------------------------------------------------
+
+ var kMessageInterfaceIdOffset = kStructHeaderSize;
+ var kMessageNameOffset = kMessageInterfaceIdOffset + 4;
+ var kMessageFlagsOffset = kMessageNameOffset + 4;
+ var kMessageRequestIDOffset = kMessageFlagsOffset + 8;
+ var kMessagePayloadInterfaceIdsPointerOffset = kMessageV2HeaderSize - 8;
+
+ var kMessageExpectsResponse = 1 << 0;
+ var kMessageIsResponse = 1 << 1;
+
+ function Message(buffer, handles, associatedEndpointHandles) {
+ if (associatedEndpointHandles === undefined) {
+ associatedEndpointHandles = [];
+ }
+
+ this.buffer = buffer;
+ this.handles = handles;
+ this.associatedEndpointHandles = associatedEndpointHandles;
+ }
+
+ Message.prototype.getHeaderNumBytes = function() {
+ return this.buffer.getUint32(kStructHeaderNumBytesOffset);
+ };
+
+ Message.prototype.getHeaderVersion = function() {
+ return this.buffer.getUint32(kStructHeaderVersionOffset);
+ };
+
+ Message.prototype.getName = function() {
+ return this.buffer.getUint32(kMessageNameOffset);
+ };
+
+ Message.prototype.getFlags = function() {
+ return this.buffer.getUint32(kMessageFlagsOffset);
+ };
+
+ Message.prototype.getInterfaceId = function() {
+ return this.buffer.getUint32(kMessageInterfaceIdOffset);
+ };
+
+ Message.prototype.getPayloadInterfaceIds = function() {
+ if (this.getHeaderVersion() < 2) {
+ return null;
+ }
+
+ var decoder = new Decoder(this.buffer, this.handles,
+ this.associatedEndpointHandles,
+ kMessagePayloadInterfaceIdsPointerOffset);
+ var payloadInterfaceIds = decoder.decodeArrayPointer(Uint32);
+ return payloadInterfaceIds;
+ };
+
+ Message.prototype.isResponse = function() {
+ return (this.getFlags() & kMessageIsResponse) != 0;
+ };
+
+ Message.prototype.expectsResponse = function() {
+ return (this.getFlags() & kMessageExpectsResponse) != 0;
+ };
+
+ Message.prototype.setRequestID = function(requestID) {
+ // TODO(darin): Verify that space was reserved for this field!
+ this.buffer.setUint64(kMessageRequestIDOffset, requestID);
+ };
+
+ Message.prototype.setInterfaceId = function(interfaceId) {
+ this.buffer.setUint32(kMessageInterfaceIdOffset, interfaceId);
+ };
+
+ Message.prototype.setPayloadInterfaceIds_ = function(payloadInterfaceIds) {
+ if (this.getHeaderVersion() < 2) {
+ throw new Error(
+ "Version of message does not support payload interface ids");
+ }
+
+ var decoder = new Decoder(this.buffer, this.handles,
+ this.associatedEndpointHandles,
+ kMessagePayloadInterfaceIdsPointerOffset);
+ var payloadInterfaceIdsOffset = decoder.decodePointer();
+ var encoder = new Encoder(this.buffer, this.handles,
+ this.associatedEndpointHandles,
+ payloadInterfaceIdsOffset);
+ encoder.encodeArray(Uint32, payloadInterfaceIds);
+ };
+
+ Message.prototype.serializeAssociatedEndpointHandles = function(
+ associatedGroupController) {
+ if (this.associatedEndpointHandles.length > 0) {
+ if (this.getHeaderVersion() < 2) {
+ throw new Error(
+ "Version of message does not support associated endpoint handles");
+ }
+
+ var data = [];
+ for (var i = 0; i < this.associatedEndpointHandles.length; i++) {
+ var handle = this.associatedEndpointHandles[i];
+ data.push(associatedGroupController.associateInterface(handle));
+ }
+ this.associatedEndpointHandles = [];
+ this.setPayloadInterfaceIds_(data);
+ }
+ };
+
+ Message.prototype.deserializeAssociatedEndpointHandles = function(
+ associatedGroupController) {
+ if (this.getHeaderVersion() < 2) {
+ return true;
+ }
+
+ this.associatedEndpointHandles = [];
+ var ids = this.getPayloadInterfaceIds();
+
+ var result = true;
+ for (var i = 0; i < ids.length; i++) {
+ var handle = associatedGroupController.createLocalEndpointHandle(ids[i]);
+ if (internal.isValidInterfaceId(ids[i]) && !handle.isValid()) {
+ // |ids[i]| itself is valid but handle creation failed. In that case,
+ // mark deserialization as failed but continue to deserialize the
+ // rest of handles.
+ result = false;
+ }
+ this.associatedEndpointHandles.push(handle);
+ ids[i] = internal.kInvalidInterfaceId;
+ }
+
+ this.setPayloadInterfaceIds_(ids);
+ return result;
+ };
+
+
+ // MessageV0Builder ---------------------------------------------------------
+
+ function MessageV0Builder(messageName, payloadSize) {
+ // Currently, we don't compute the payload size correctly ahead of time.
+ // Instead, we resize the buffer at the end.
+ var numberOfBytes = kMessageV0HeaderSize + payloadSize;
+ this.buffer = new internal.Buffer(numberOfBytes);
+ this.handles = [];
+ var encoder = this.createEncoder(kMessageV0HeaderSize);
+ encoder.writeUint32(kMessageV0HeaderSize);
+ encoder.writeUint32(0); // version.
+ encoder.writeUint32(0); // interface ID.
+ encoder.writeUint32(messageName);
+ encoder.writeUint32(0); // flags.
+ encoder.writeUint32(0); // padding.
+ }
+
+ MessageV0Builder.prototype.createEncoder = function(size) {
+ var pointer = this.buffer.alloc(size);
+ return new Encoder(this.buffer, this.handles, [], pointer);
+ };
+
+ MessageV0Builder.prototype.encodeStruct = function(cls, val) {
+ cls.encode(this.createEncoder(cls.encodedSize), val);
+ };
+
+ MessageV0Builder.prototype.finish = function() {
+ // TODO(abarth): Rather than resizing the buffer at the end, we could
+ // compute the size we need ahead of time, like we do in C++.
+ this.buffer.trim();
+ var message = new Message(this.buffer, this.handles);
+ this.buffer = null;
+ this.handles = null;
+ this.encoder = null;
+ return message;
+ };
+
+ // MessageV1Builder -----------------------------------------------
+
+ function MessageV1Builder(messageName, payloadSize, flags,
+ requestID) {
+ // Currently, we don't compute the payload size correctly ahead of time.
+ // Instead, we resize the buffer at the end.
+ var numberOfBytes = kMessageV1HeaderSize + payloadSize;
+ this.buffer = new internal.Buffer(numberOfBytes);
+ this.handles = [];
+ var encoder = this.createEncoder(kMessageV1HeaderSize);
+ encoder.writeUint32(kMessageV1HeaderSize);
+ encoder.writeUint32(1); // version.
+ encoder.writeUint32(0); // interface ID.
+ encoder.writeUint32(messageName);
+ encoder.writeUint32(flags);
+ encoder.writeUint32(0); // padding.
+ encoder.writeUint64(requestID);
+ }
+
+ MessageV1Builder.prototype =
+ Object.create(MessageV0Builder.prototype);
+
+ MessageV1Builder.prototype.constructor =
+ MessageV1Builder;
+
+ // MessageV2 -----------------------------------------------
+
+ function MessageV2Builder(messageName, payloadSize, flags, requestID) {
+ // Currently, we don't compute the payload size correctly ahead of time.
+ // Instead, we resize the buffer at the end.
+ var numberOfBytes = kMessageV2HeaderSize + payloadSize;
+ this.buffer = new internal.Buffer(numberOfBytes);
+ this.handles = [];
+
+ this.payload = null;
+ this.associatedEndpointHandles = [];
+
+ this.encoder = this.createEncoder(kMessageV2HeaderSize);
+ this.encoder.writeUint32(kMessageV2HeaderSize);
+ this.encoder.writeUint32(2); // version.
+ // Gets set to an appropriate interfaceId for the endpoint by the Router.
+ this.encoder.writeUint32(0); // interface ID.
+ this.encoder.writeUint32(messageName);
+ this.encoder.writeUint32(flags);
+ this.encoder.writeUint32(0); // padding.
+ this.encoder.writeUint64(requestID);
+ }
+
+ MessageV2Builder.prototype.createEncoder = function(size) {
+ var pointer = this.buffer.alloc(size);
+ return new Encoder(this.buffer, this.handles,
+ this.associatedEndpointHandles, pointer);
+ };
+
+ MessageV2Builder.prototype.setPayload = function(cls, val) {
+ this.payload = {cls: cls, val: val};
+ };
+
+ MessageV2Builder.prototype.finish = function() {
+ if (!this.payload) {
+ throw new Error("Payload needs to be set before calling finish");
+ }
+
+ this.encoder.encodeStructPointer(this.payload.cls, this.payload.val);
+ this.encoder.encodeArrayPointer(Uint32,
+ new Array(this.associatedEndpointHandles.length));
+
+ this.buffer.trim();
+ var message = new Message(this.buffer, this.handles,
+ this.associatedEndpointHandles);
+ this.buffer = null;
+ this.handles = null;
+ this.encoder = null;
+ this.payload = null;
+ this.associatedEndpointHandles = null;
+
+ return message;
+ };
+
+ // MessageReader ------------------------------------------------------------
+
+ function MessageReader(message) {
+ this.decoder = new Decoder(message.buffer, message.handles,
+ message.associatedEndpointHandles, 0);
+ var messageHeaderSize = this.decoder.readUint32();
+ this.payloadSize = message.buffer.byteLength - messageHeaderSize;
+ var version = this.decoder.readUint32();
+ var interface_id = this.decoder.readUint32();
+ this.messageName = this.decoder.readUint32();
+ this.flags = this.decoder.readUint32();
+ // Skip the padding.
+ this.decoder.skip(4);
+ if (version >= 1)
+ this.requestID = this.decoder.readUint64();
+ this.decoder.skip(messageHeaderSize - this.decoder.next);
+ }
+
+ MessageReader.prototype.decodeStruct = function(cls) {
+ return cls.decode(this.decoder);
+ };
+
+ // Built-in types -----------------------------------------------------------
+
+ // This type is only used with ArrayOf(PackedBool).
+ function PackedBool() {
+ }
+
+ function Int8() {
+ }
+
+ Int8.encodedSize = 1;
+
+ Int8.decode = function(decoder) {
+ return decoder.readInt8();
+ };
+
+ Int8.encode = function(encoder, val) {
+ encoder.writeInt8(val);
+ };
+
+ Uint8.encode = function(encoder, val) {
+ encoder.writeUint8(val);
+ };
+
+ function Uint8() {
+ }
+
+ Uint8.encodedSize = 1;
+
+ Uint8.decode = function(decoder) {
+ return decoder.readUint8();
+ };
+
+ Uint8.encode = function(encoder, val) {
+ encoder.writeUint8(val);
+ };
+
+ function Int16() {
+ }
+
+ Int16.encodedSize = 2;
+
+ Int16.decode = function(decoder) {
+ return decoder.readInt16();
+ };
+
+ Int16.encode = function(encoder, val) {
+ encoder.writeInt16(val);
+ };
+
+ function Uint16() {
+ }
+
+ Uint16.encodedSize = 2;
+
+ Uint16.decode = function(decoder) {
+ return decoder.readUint16();
+ };
+
+ Uint16.encode = function(encoder, val) {
+ encoder.writeUint16(val);
+ };
+
+ function Int32() {
+ }
+
+ Int32.encodedSize = 4;
+
+ Int32.decode = function(decoder) {
+ return decoder.readInt32();
+ };
+
+ Int32.encode = function(encoder, val) {
+ encoder.writeInt32(val);
+ };
+
+ function Uint32() {
+ }
+
+ Uint32.encodedSize = 4;
+
+ Uint32.decode = function(decoder) {
+ return decoder.readUint32();
+ };
+
+ Uint32.encode = function(encoder, val) {
+ encoder.writeUint32(val);
+ };
+
+ function Int64() {
+ }
+
+ Int64.encodedSize = 8;
+
+ Int64.decode = function(decoder) {
+ return decoder.readInt64();
+ };
+
+ Int64.encode = function(encoder, val) {
+ encoder.writeInt64(val);
+ };
+
+ function Uint64() {
+ }
+
+ Uint64.encodedSize = 8;
+
+ Uint64.decode = function(decoder) {
+ return decoder.readUint64();
+ };
+
+ Uint64.encode = function(encoder, val) {
+ encoder.writeUint64(val);
+ };
+
+ function String() {
+ };
+
+ String.encodedSize = 8;
+
+ String.decode = function(decoder) {
+ return decoder.decodeStringPointer();
+ };
+
+ String.encode = function(encoder, val) {
+ encoder.encodeStringPointer(val);
+ };
+
+ function NullableString() {
+ }
+
+ NullableString.encodedSize = String.encodedSize;
+
+ NullableString.decode = String.decode;
+
+ NullableString.encode = String.encode;
+
+ function Float() {
+ }
+
+ Float.encodedSize = 4;
+
+ Float.decode = function(decoder) {
+ return decoder.readFloat();
+ };
+
+ Float.encode = function(encoder, val) {
+ encoder.writeFloat(val);
+ };
+
+ function Double() {
+ }
+
+ Double.encodedSize = 8;
+
+ Double.decode = function(decoder) {
+ return decoder.readDouble();
+ };
+
+ Double.encode = function(encoder, val) {
+ encoder.writeDouble(val);
+ };
+
+ function Enum(cls) {
+ this.cls = cls;
+ }
+
+ Enum.prototype.encodedSize = 4;
+
+ Enum.prototype.decode = function(decoder) {
+ return decoder.readInt32();
+ };
+
+ Enum.prototype.encode = function(encoder, val) {
+ encoder.writeInt32(val);
+ };
+
+ function PointerTo(cls) {
+ this.cls = cls;
+ }
+
+ PointerTo.prototype.encodedSize = 8;
+
+ PointerTo.prototype.decode = function(decoder) {
+ var pointer = decoder.decodePointer();
+ if (!pointer) {
+ return null;
+ }
+ return this.cls.decode(decoder.decodeAndCreateDecoder(pointer));
+ };
+
+ PointerTo.prototype.encode = function(encoder, val) {
+ if (!val) {
+ encoder.encodePointer(val);
+ return;
+ }
+ var objectEncoder = encoder.createAndEncodeEncoder(this.cls.encodedSize);
+ this.cls.encode(objectEncoder, val);
+ };
+
+ function NullablePointerTo(cls) {
+ PointerTo.call(this, cls);
+ }
+
+ NullablePointerTo.prototype = Object.create(PointerTo.prototype);
+
+ function ArrayOf(cls, length) {
+ this.cls = cls;
+ this.length = length || 0;
+ }
+
+ ArrayOf.prototype.encodedSize = 8;
+
+ ArrayOf.prototype.dimensions = function() {
+ return [this.length].concat(
+ (this.cls instanceof ArrayOf) ? this.cls.dimensions() : []);
+ }
+
+ ArrayOf.prototype.decode = function(decoder) {
+ return decoder.decodeArrayPointer(this.cls);
+ };
+
+ ArrayOf.prototype.encode = function(encoder, val) {
+ encoder.encodeArrayPointer(this.cls, val);
+ };
+
+ function NullableArrayOf(cls) {
+ ArrayOf.call(this, cls);
+ }
+
+ NullableArrayOf.prototype = Object.create(ArrayOf.prototype);
+
+ function Handle() {
+ }
+
+ Handle.encodedSize = 4;
+
+ Handle.decode = function(decoder) {
+ return decoder.decodeHandle();
+ };
+
+ Handle.encode = function(encoder, val) {
+ encoder.encodeHandle(val);
+ };
+
+ function NullableHandle() {
+ }
+
+ NullableHandle.encodedSize = Handle.encodedSize;
+
+ NullableHandle.decode = Handle.decode;
+
+ NullableHandle.encode = Handle.encode;
+
+ function Interface(cls) {
+ this.cls = cls;
+ }
+
+ Interface.prototype.encodedSize = 8;
+
+ Interface.prototype.decode = function(decoder) {
+ var interfacePtrInfo = new mojo.InterfacePtrInfo(
+ decoder.decodeHandle(), decoder.readUint32());
+ var interfacePtr = new this.cls();
+ interfacePtr.ptr.bind(interfacePtrInfo);
+ return interfacePtr;
+ };
+
+ Interface.prototype.encode = function(encoder, val) {
+ var interfacePtrInfo =
+ val ? val.ptr.passInterface() : new mojo.InterfacePtrInfo(null, 0);
+ encoder.encodeHandle(interfacePtrInfo.handle);
+ encoder.writeUint32(interfacePtrInfo.version);
+ };
+
+ function NullableInterface(cls) {
+ Interface.call(this, cls);
+ }
+
+ NullableInterface.prototype = Object.create(Interface.prototype);
+
+ function AssociatedInterfacePtrInfo() {
+ }
+
+ AssociatedInterfacePtrInfo.prototype.encodedSize = 8;
+
+ AssociatedInterfacePtrInfo.decode = function(decoder) {
+ return new mojo.AssociatedInterfacePtrInfo(
+ decoder.decodeAssociatedEndpointHandle(), decoder.readUint32());
+ };
+
+ AssociatedInterfacePtrInfo.encode = function(encoder, val) {
+ var associatedinterfacePtrInfo =
+ val ? val : new mojo.AssociatedInterfacePtrInfo(null, 0);
+ encoder.encodeAssociatedEndpointHandle(
+ associatedinterfacePtrInfo.interfaceEndpointHandle);
+ encoder.writeUint32(associatedinterfacePtrInfo.version);
+ };
+
+ function NullableAssociatedInterfacePtrInfo() {
+ }
+
+ NullableAssociatedInterfacePtrInfo.encodedSize =
+ AssociatedInterfacePtrInfo.encodedSize;
+
+ NullableAssociatedInterfacePtrInfo.decode =
+ AssociatedInterfacePtrInfo.decode;
+
+ NullableAssociatedInterfacePtrInfo.encode =
+ AssociatedInterfacePtrInfo.encode;
+
+ function InterfaceRequest() {
+ }
+
+ InterfaceRequest.encodedSize = 4;
+
+ InterfaceRequest.decode = function(decoder) {
+ return new mojo.InterfaceRequest(decoder.decodeHandle());
+ };
+
+ InterfaceRequest.encode = function(encoder, val) {
+ encoder.encodeHandle(val ? val.handle : null);
+ };
+
+ function NullableInterfaceRequest() {
+ }
+
+ NullableInterfaceRequest.encodedSize = InterfaceRequest.encodedSize;
+
+ NullableInterfaceRequest.decode = InterfaceRequest.decode;
+
+ NullableInterfaceRequest.encode = InterfaceRequest.encode;
+
+ function AssociatedInterfaceRequest() {
+ }
+
+ AssociatedInterfaceRequest.decode = function(decoder) {
+ var handle = decoder.decodeAssociatedEndpointHandle();
+ return new mojo.AssociatedInterfaceRequest(handle);
+ };
+
+ AssociatedInterfaceRequest.encode = function(encoder, val) {
+ encoder.encodeAssociatedEndpointHandle(
+ val ? val.interfaceEndpointHandle : null);
+ };
+
+ AssociatedInterfaceRequest.encodedSize = 4;
+
+ function NullableAssociatedInterfaceRequest() {
+ }
+
+ NullableAssociatedInterfaceRequest.encodedSize =
+ AssociatedInterfaceRequest.encodedSize;
+
+ NullableAssociatedInterfaceRequest.decode =
+ AssociatedInterfaceRequest.decode;
+
+ NullableAssociatedInterfaceRequest.encode =
+ AssociatedInterfaceRequest.encode;
+
+ function MapOf(keyClass, valueClass) {
+ this.keyClass = keyClass;
+ this.valueClass = valueClass;
+ }
+
+ MapOf.prototype.encodedSize = 8;
+
+ MapOf.prototype.decode = function(decoder) {
+ return decoder.decodeMapPointer(this.keyClass, this.valueClass);
+ };
+
+ MapOf.prototype.encode = function(encoder, val) {
+ encoder.encodeMapPointer(this.keyClass, this.valueClass, val);
+ };
+
+ function NullableMapOf(keyClass, valueClass) {
+ MapOf.call(this, keyClass, valueClass);
+ }
+
+ NullableMapOf.prototype = Object.create(MapOf.prototype);
+
+ internal.align = align;
+ internal.isAligned = isAligned;
+ internal.Message = Message;
+ internal.MessageV0Builder = MessageV0Builder;
+ internal.MessageV1Builder = MessageV1Builder;
+ internal.MessageV2Builder = MessageV2Builder;
+ internal.MessageReader = MessageReader;
+ internal.kArrayHeaderSize = kArrayHeaderSize;
+ internal.kMapStructPayloadSize = kMapStructPayloadSize;
+ internal.kStructHeaderSize = kStructHeaderSize;
+ internal.kEncodedInvalidHandleValue = kEncodedInvalidHandleValue;
+ internal.kMessageV0HeaderSize = kMessageV0HeaderSize;
+ internal.kMessageV1HeaderSize = kMessageV1HeaderSize;
+ internal.kMessageV2HeaderSize = kMessageV2HeaderSize;
+ internal.kMessagePayloadInterfaceIdsPointerOffset =
+ kMessagePayloadInterfaceIdsPointerOffset;
+ internal.kMessageExpectsResponse = kMessageExpectsResponse;
+ internal.kMessageIsResponse = kMessageIsResponse;
+ internal.Int8 = Int8;
+ internal.Uint8 = Uint8;
+ internal.Int16 = Int16;
+ internal.Uint16 = Uint16;
+ internal.Int32 = Int32;
+ internal.Uint32 = Uint32;
+ internal.Int64 = Int64;
+ internal.Uint64 = Uint64;
+ internal.Float = Float;
+ internal.Double = Double;
+ internal.String = String;
+ internal.Enum = Enum;
+ internal.NullableString = NullableString;
+ internal.PointerTo = PointerTo;
+ internal.NullablePointerTo = NullablePointerTo;
+ internal.ArrayOf = ArrayOf;
+ internal.NullableArrayOf = NullableArrayOf;
+ internal.PackedBool = PackedBool;
+ internal.Handle = Handle;
+ internal.NullableHandle = NullableHandle;
+ internal.Interface = Interface;
+ internal.NullableInterface = NullableInterface;
+ internal.InterfaceRequest = InterfaceRequest;
+ internal.NullableInterfaceRequest = NullableInterfaceRequest;
+ internal.AssociatedInterfacePtrInfo = AssociatedInterfacePtrInfo;
+ internal.NullableAssociatedInterfacePtrInfo =
+ NullableAssociatedInterfacePtrInfo;
+ internal.AssociatedInterfaceRequest = AssociatedInterfaceRequest;
+ internal.NullableAssociatedInterfaceRequest =
+ NullableAssociatedInterfaceRequest;
+ internal.MapOf = MapOf;
+ internal.NullableMapOf = NullableMapOf;
+})();
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ function Connector(handle) {
+ if (!(handle instanceof MojoHandle))
+ throw new Error("Connector: not a handle " + handle);
+ this.handle_ = handle;
+ this.dropWrites_ = false;
+ this.error_ = false;
+ this.incomingReceiver_ = null;
+ this.readWatcher_ = null;
+ this.errorHandler_ = null;
+ this.paused_ = false;
+
+ this.waitToReadMore();
+ }
+
+ Connector.prototype.close = function() {
+ this.cancelWait();
+ if (this.handle_ != null) {
+ this.handle_.close();
+ this.handle_ = null;
+ }
+ };
+
+ Connector.prototype.pauseIncomingMethodCallProcessing = function() {
+ if (this.paused_) {
+ return;
+ }
+ this.paused_= true;
+ this.cancelWait();
+ };
+
+ Connector.prototype.resumeIncomingMethodCallProcessing = function() {
+ if (!this.paused_) {
+ return;
+ }
+ this.paused_= false;
+ this.waitToReadMore();
+ };
+
+ Connector.prototype.accept = function(message) {
+ if (this.error_)
+ return false;
+
+ if (this.dropWrites_)
+ return true;
+
+ var result = this.handle_.writeMessage(
+ new Uint8Array(message.buffer.arrayBuffer), message.handles);
+ switch (result) {
+ case Mojo.RESULT_OK:
+ // The handles were successfully transferred, so we don't own them
+ // anymore.
+ message.handles = [];
+ break;
+ case Mojo.RESULT_FAILED_PRECONDITION:
+ // There's no point in continuing to write to this pipe since the other
+ // end is gone. Avoid writing any future messages. Hide write failures
+ // from the caller since we'd like them to continue consuming any
+ // backlog of incoming messages before regarding the message pipe as
+ // closed.
+ this.dropWrites_ = true;
+ break;
+ default:
+ // This particular write was rejected, presumably because of bad input.
+ // The pipe is not necessarily in a bad state.
+ return false;
+ }
+ return true;
+ };
+
+ Connector.prototype.setIncomingReceiver = function(receiver) {
+ this.incomingReceiver_ = receiver;
+ };
+
+ Connector.prototype.setErrorHandler = function(handler) {
+ this.errorHandler_ = handler;
+ };
+
+ Connector.prototype.readMore_ = function(result) {
+ for (;;) {
+ if (this.paused_) {
+ return;
+ }
+
+ var read = this.handle_.readMessage();
+ if (this.handle_ == null) // The connector has been closed.
+ return;
+ if (read.result == Mojo.RESULT_SHOULD_WAIT)
+ return;
+ if (read.result != Mojo.RESULT_OK) {
+ this.handleError(read.result !== Mojo.RESULT_FAILED_PRECONDITION,
+ false);
+ return;
+ }
+ var messageBuffer = new internal.Buffer(read.buffer);
+ var message = new internal.Message(messageBuffer, read.handles);
+ var receiverResult = this.incomingReceiver_ &&
+ this.incomingReceiver_.accept(message);
+
+ // Handle invalid incoming message.
+ if (!internal.isTestingMode() && !receiverResult) {
+ // TODO(yzshen): Consider notifying the embedder.
+ this.handleError(true, false);
+ }
+ }
+ };
+
+ Connector.prototype.cancelWait = function() {
+ if (this.readWatcher_) {
+ this.readWatcher_.cancel();
+ this.readWatcher_ = null;
+ }
+ };
+
+ Connector.prototype.waitToReadMore = function() {
+ if (this.handle_) {
+ this.readWatcher_ = this.handle_.watch({readable: true},
+ this.readMore_.bind(this));
+ }
+ };
+
+ Connector.prototype.handleError = function(forcePipeReset,
+ forceAsyncHandler) {
+ if (this.error_ || this.handle_ === null) {
+ return;
+ }
+
+ if (this.paused_) {
+ // Enforce calling the error handler asynchronously if the user has
+ // paused receiving messages. We need to wait until the user starts
+ // receiving messages again.
+ forceAsyncHandler = true;
+ }
+
+ if (!forcePipeReset && forceAsyncHandler) {
+ forcePipeReset = true;
+ }
+
+ this.cancelWait();
+ if (forcePipeReset) {
+ this.handle_.close();
+ var dummyPipe = Mojo.createMessagePipe();
+ this.handle_ = dummyPipe.handle0;
+ }
+
+ if (forceAsyncHandler) {
+ if (!this.paused_) {
+ this.waitToReadMore();
+ }
+ } else {
+ this.error_ = true;
+ if (this.errorHandler_) {
+ this.errorHandler_.onError();
+ }
+ }
+ };
+
+ internal.Connector = Connector;
+})();
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ // Constants ----------------------------------------------------------------
+ var kInterfaceIdNamespaceMask = 0x80000000;
+ var kMasterInterfaceId = 0x00000000;
+ var kInvalidInterfaceId = 0xFFFFFFFF;
+
+ // ---------------------------------------------------------------------------
+
+ function InterfacePtrInfo(handle, version) {
+ this.handle = handle;
+ this.version = version;
+ }
+
+ InterfacePtrInfo.prototype.isValid = function() {
+ return this.handle instanceof MojoHandle;
+ };
+
+ InterfacePtrInfo.prototype.close = function() {
+ if (!this.isValid())
+ return;
+
+ this.handle.close();
+ this.handle = null;
+ this.version = 0;
+ };
+
+ function AssociatedInterfacePtrInfo(interfaceEndpointHandle, version) {
+ this.interfaceEndpointHandle = interfaceEndpointHandle;
+ this.version = version;
+ }
+
+ AssociatedInterfacePtrInfo.prototype.isValid = function() {
+ return this.interfaceEndpointHandle.isValid();
+ };
+
+ // ---------------------------------------------------------------------------
+
+ function InterfaceRequest(handle) {
+ this.handle = handle;
+ }
+
+ InterfaceRequest.prototype.isValid = function() {
+ return this.handle instanceof MojoHandle;
+ };
+
+ InterfaceRequest.prototype.close = function() {
+ if (!this.isValid())
+ return;
+
+ this.handle.close();
+ this.handle = null;
+ };
+
+ function AssociatedInterfaceRequest(interfaceEndpointHandle) {
+ this.interfaceEndpointHandle = interfaceEndpointHandle;
+ }
+
+ AssociatedInterfaceRequest.prototype.isValid = function() {
+ return this.interfaceEndpointHandle.isValid();
+ };
+
+ AssociatedInterfaceRequest.prototype.resetWithReason = function(reason) {
+ this.interfaceEndpointHandle.reset(reason);
+ };
+
+ function isMasterInterfaceId(interfaceId) {
+ return interfaceId === kMasterInterfaceId;
+ }
+
+ function isValidInterfaceId(interfaceId) {
+ return interfaceId !== kInvalidInterfaceId;
+ }
+
+ mojo.InterfacePtrInfo = InterfacePtrInfo;
+ mojo.InterfaceRequest = InterfaceRequest;
+ mojo.AssociatedInterfacePtrInfo = AssociatedInterfacePtrInfo;
+ mojo.AssociatedInterfaceRequest = AssociatedInterfaceRequest;
+ internal.isMasterInterfaceId = isMasterInterfaceId;
+ internal.isValidInterfaceId = isValidInterfaceId;
+ internal.kInvalidInterfaceId = kInvalidInterfaceId;
+ internal.kMasterInterfaceId = kMasterInterfaceId;
+ internal.kInterfaceIdNamespaceMask = kInterfaceIdNamespaceMask;
+})();
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ function validateControlRequestWithResponse(message) {
+ var messageValidator = new internal.Validator(message);
+ var error = messageValidator.validateMessageIsRequestExpectingResponse();
+ if (error !== internal.validationError.NONE) {
+ throw error;
+ }
+
+ if (message.getName() != mojo.interfaceControl2.kRunMessageId) {
+ throw new Error("Control message name is not kRunMessageId");
+ }
+
+ // Validate payload.
+ error = mojo.interfaceControl2.RunMessageParams.validate(messageValidator,
+ message.getHeaderNumBytes());
+ if (error != internal.validationError.NONE) {
+ throw error;
+ }
+ }
+
+ function validateControlRequestWithoutResponse(message) {
+ var messageValidator = new internal.Validator(message);
+ var error = messageValidator.validateMessageIsRequestWithoutResponse();
+ if (error != internal.validationError.NONE) {
+ throw error;
+ }
+
+ if (message.getName() != mojo.interfaceControl2.kRunOrClosePipeMessageId) {
+ throw new Error("Control message name is not kRunOrClosePipeMessageId");
+ }
+
+ // Validate payload.
+ error = mojo.interfaceControl2.RunOrClosePipeMessageParams.validate(
+ messageValidator, message.getHeaderNumBytes());
+ if (error != internal.validationError.NONE) {
+ throw error;
+ }
+ }
+
+ function runOrClosePipe(message, interfaceVersion) {
+ var reader = new internal.MessageReader(message);
+ var runOrClosePipeMessageParams = reader.decodeStruct(
+ mojo.interfaceControl2.RunOrClosePipeMessageParams);
+ return interfaceVersion >=
+ runOrClosePipeMessageParams.input.requireVersion.version;
+ }
+
+ function run(message, responder, interfaceVersion) {
+ var reader = new internal.MessageReader(message);
+ var runMessageParams =
+ reader.decodeStruct(mojo.interfaceControl2.RunMessageParams);
+ var runOutput = null;
+
+ if (runMessageParams.input.queryVersion) {
+ runOutput = new mojo.interfaceControl2.RunOutput();
+ runOutput.queryVersionResult = new
+ mojo.interfaceControl2.QueryVersionResult(
+ {'version': interfaceVersion});
+ }
+
+ var runResponseMessageParams = new
+ mojo.interfaceControl2.RunResponseMessageParams();
+ runResponseMessageParams.output = runOutput;
+
+ var messageName = mojo.interfaceControl2.kRunMessageId;
+ var payloadSize =
+ mojo.interfaceControl2.RunResponseMessageParams.encodedSize;
+ var requestID = reader.requestID;
+ var builder = new internal.MessageV1Builder(messageName,
+ payloadSize, internal.kMessageIsResponse, requestID);
+ builder.encodeStruct(mojo.interfaceControl2.RunResponseMessageParams,
+ runResponseMessageParams);
+ responder.accept(builder.finish());
+ return true;
+ }
+
+ function isInterfaceControlMessage(message) {
+ return message.getName() == mojo.interfaceControl2.kRunMessageId ||
+ message.getName() == mojo.interfaceControl2.kRunOrClosePipeMessageId;
+ }
+
+ function ControlMessageHandler(interfaceVersion) {
+ this.interfaceVersion_ = interfaceVersion;
+ }
+
+ ControlMessageHandler.prototype.accept = function(message) {
+ validateControlRequestWithoutResponse(message);
+ return runOrClosePipe(message, this.interfaceVersion_);
+ };
+
+ ControlMessageHandler.prototype.acceptWithResponder = function(message,
+ responder) {
+ validateControlRequestWithResponse(message);
+ return run(message, responder, this.interfaceVersion_);
+ };
+
+ internal.ControlMessageHandler = ControlMessageHandler;
+ internal.isInterfaceControlMessage = isInterfaceControlMessage;
+})();
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ function constructRunOrClosePipeMessage(runOrClosePipeInput) {
+ var runOrClosePipeMessageParams = new
+ mojo.interfaceControl2.RunOrClosePipeMessageParams();
+ runOrClosePipeMessageParams.input = runOrClosePipeInput;
+
+ var messageName = mojo.interfaceControl2.kRunOrClosePipeMessageId;
+ var payloadSize =
+ mojo.interfaceControl2.RunOrClosePipeMessageParams.encodedSize;
+ var builder = new internal.MessageV0Builder(messageName, payloadSize);
+ builder.encodeStruct(mojo.interfaceControl2.RunOrClosePipeMessageParams,
+ runOrClosePipeMessageParams);
+ var message = builder.finish();
+ return message;
+ }
+
+ function validateControlResponse(message) {
+ var messageValidator = new internal.Validator(message);
+ var error = messageValidator.validateMessageIsResponse();
+ if (error != internal.validationError.NONE) {
+ throw error;
+ }
+
+ if (message.getName() != mojo.interfaceControl2.kRunMessageId) {
+ throw new Error("Control message name is not kRunMessageId");
+ }
+
+ // Validate payload.
+ error = mojo.interfaceControl2.RunResponseMessageParams.validate(
+ messageValidator, message.getHeaderNumBytes());
+ if (error != internal.validationError.NONE) {
+ throw error;
+ }
+ }
+
+ function acceptRunResponse(message) {
+ validateControlResponse(message);
+
+ var reader = new internal.MessageReader(message);
+ var runResponseMessageParams = reader.decodeStruct(
+ mojo.interfaceControl2.RunResponseMessageParams);
+
+ return Promise.resolve(runResponseMessageParams);
+ }
+
+ /**
+ * Sends the given run message through the receiver.
+ * Accepts the response message from the receiver and decodes the message
+ * struct to RunResponseMessageParams.
+ *
+ * @param {Router} receiver.
+ * @param {RunMessageParams} runMessageParams to be sent via a message.
+ * @return {Promise} that resolves to a RunResponseMessageParams.
+ */
+ function sendRunMessage(receiver, runMessageParams) {
+ var messageName = mojo.interfaceControl2.kRunMessageId;
+ var payloadSize = mojo.interfaceControl2.RunMessageParams.encodedSize;
+ // |requestID| is set to 0, but is later properly set by Router.
+ var builder = new internal.MessageV1Builder(messageName,
+ payloadSize, internal.kMessageExpectsResponse, 0);
+ builder.encodeStruct(mojo.interfaceControl2.RunMessageParams,
+ runMessageParams);
+ var message = builder.finish();
+
+ return receiver.acceptAndExpectResponse(message).then(acceptRunResponse);
+ }
+
+ function ControlMessageProxy(receiver) {
+ this.receiver_ = receiver;
+ }
+
+ ControlMessageProxy.prototype.queryVersion = function() {
+ var runMessageParams = new mojo.interfaceControl2.RunMessageParams();
+ runMessageParams.input = new mojo.interfaceControl2.RunInput();
+ runMessageParams.input.queryVersion =
+ new mojo.interfaceControl2.QueryVersion();
+
+ return sendRunMessage(this.receiver_, runMessageParams).then(function(
+ runResponseMessageParams) {
+ return runResponseMessageParams.output.queryVersionResult.version;
+ });
+ };
+
+ ControlMessageProxy.prototype.requireVersion = function(version) {
+ var runOrClosePipeInput = new mojo.interfaceControl2.RunOrClosePipeInput();
+ runOrClosePipeInput.requireVersion =
+ new mojo.interfaceControl2.RequireVersion({'version': version});
+ var message = constructRunOrClosePipeMessage(runOrClosePipeInput);
+ this.receiver_.accept(message);
+ };
+
+ internal.ControlMessageProxy = ControlMessageProxy;
+})();
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ function InterfaceEndpointClient(interfaceEndpointHandle, receiver,
+ interfaceVersion) {
+ this.controller_ = null;
+ this.encounteredError_ = false;
+ this.handle_ = interfaceEndpointHandle;
+ this.incomingReceiver_ = receiver;
+
+ if (interfaceVersion !== undefined) {
+ this.controlMessageHandler_ = new internal.ControlMessageHandler(
+ interfaceVersion);
+ } else {
+ this.controlMessageProxy_ = new internal.ControlMessageProxy(this);
+ }
+
+ this.nextRequestID_ = 0;
+ this.completers_ = new Map();
+ this.payloadValidators_ = [];
+ this.connectionErrorHandler_ = null;
+
+ if (interfaceEndpointHandle.pendingAssociation()) {
+ interfaceEndpointHandle.setAssociationEventHandler(
+ this.onAssociationEvent.bind(this));
+ } else {
+ this.initControllerIfNecessary_();
+ }
+ }
+
+ InterfaceEndpointClient.prototype.initControllerIfNecessary_ = function() {
+ if (this.controller_ || this.handle_.pendingAssociation()) {
+ return;
+ }
+
+ this.controller_ = this.handle_.groupController().attachEndpointClient(
+ this.handle_, this);
+ };
+
+ InterfaceEndpointClient.prototype.onAssociationEvent = function(
+ associationEvent) {
+ if (associationEvent === internal.AssociationEvent.ASSOCIATED) {
+ this.initControllerIfNecessary_();
+ } else if (associationEvent ===
+ internal.AssociationEvent.PEER_CLOSED_BEFORE_ASSOCIATION) {
+ setTimeout(this.notifyError.bind(this, this.handle_.disconnectReason()),
+ 0);
+ }
+ };
+
+ InterfaceEndpointClient.prototype.passHandle = function() {
+ if (!this.handle_.isValid()) {
+ return new internal.InterfaceEndpointHandle();
+ }
+
+ // Used to clear the previously set callback.
+ this.handle_.setAssociationEventHandler(undefined);
+
+ if (this.controller_) {
+ this.controller_ = null;
+ this.handle_.groupController().detachEndpointClient(this.handle_);
+ }
+ var handle = this.handle_;
+ this.handle_ = null;
+ return handle;
+ };
+
+ InterfaceEndpointClient.prototype.close = function(reason) {
+ var handle = this.passHandle();
+ handle.reset(reason);
+ };
+
+ InterfaceEndpointClient.prototype.accept = function(message) {
+ if (message.associatedEndpointHandles.length > 0) {
+ message.serializeAssociatedEndpointHandles(
+ this.handle_.groupController());
+ }
+
+ if (this.encounteredError_) {
+ return false;
+ }
+
+ this.initControllerIfNecessary_();
+ return this.controller_.sendMessage(message);
+ };
+
+ InterfaceEndpointClient.prototype.acceptAndExpectResponse = function(
+ message) {
+ if (message.associatedEndpointHandles.length > 0) {
+ message.serializeAssociatedEndpointHandles(
+ this.handle_.groupController());
+ }
+
+ if (this.encounteredError_) {
+ return Promise.reject();
+ }
+
+ this.initControllerIfNecessary_();
+
+ // Reserve 0 in case we want it to convey special meaning in the future.
+ var requestID = this.nextRequestID_++;
+ if (requestID === 0)
+ requestID = this.nextRequestID_++;
+
+ message.setRequestID(requestID);
+ var result = this.controller_.sendMessage(message);
+ if (!result)
+ return Promise.reject(Error("Connection error"));
+
+ var completer = {};
+ this.completers_.set(requestID, completer);
+ return new Promise(function(resolve, reject) {
+ completer.resolve = resolve;
+ completer.reject = reject;
+ });
+ };
+
+ InterfaceEndpointClient.prototype.setPayloadValidators = function(
+ payloadValidators) {
+ this.payloadValidators_ = payloadValidators;
+ };
+
+ InterfaceEndpointClient.prototype.setIncomingReceiver = function(receiver) {
+ this.incomingReceiver_ = receiver;
+ };
+
+ InterfaceEndpointClient.prototype.setConnectionErrorHandler = function(
+ handler) {
+ this.connectionErrorHandler_ = handler;
+ };
+
+ InterfaceEndpointClient.prototype.handleIncomingMessage = function(message,
+ messageValidator) {
+ var noError = internal.validationError.NONE;
+ var err = noError;
+ for (var i = 0; err === noError && i < this.payloadValidators_.length; ++i)
+ err = this.payloadValidators_[i](messageValidator);
+
+ if (err == noError) {
+ return this.handleValidIncomingMessage_(message);
+ } else {
+ internal.reportValidationError(err);
+ return false;
+ }
+ };
+
+ InterfaceEndpointClient.prototype.handleValidIncomingMessage_ = function(
+ message) {
+ if (internal.isTestingMode()) {
+ return true;
+ }
+
+ if (this.encounteredError_) {
+ return false;
+ }
+
+ var ok = false;
+
+ if (message.expectsResponse()) {
+ if (internal.isInterfaceControlMessage(message) &&
+ this.controlMessageHandler_) {
+ ok = this.controlMessageHandler_.acceptWithResponder(message, this);
+ } else if (this.incomingReceiver_) {
+ ok = this.incomingReceiver_.acceptWithResponder(message, this);
+ }
+ } else if (message.isResponse()) {
+ var reader = new internal.MessageReader(message);
+ var requestID = reader.requestID;
+ var completer = this.completers_.get(requestID);
+ if (completer) {
+ this.completers_.delete(requestID);
+ completer.resolve(message);
+ ok = true;
+ } else {
+ console.log("Unexpected response with request ID: " + requestID);
+ }
+ } else {
+ if (internal.isInterfaceControlMessage(message) &&
+ this.controlMessageHandler_) {
+ ok = this.controlMessageHandler_.accept(message);
+ } else if (this.incomingReceiver_) {
+ ok = this.incomingReceiver_.accept(message);
+ }
+ }
+ return ok;
+ };
+
+ InterfaceEndpointClient.prototype.notifyError = function(reason) {
+ if (this.encounteredError_) {
+ return;
+ }
+ this.encounteredError_ = true;
+
+ this.completers_.forEach(function(value) {
+ value.reject();
+ });
+ this.completers_.clear(); // Drop any responders.
+
+ if (this.connectionErrorHandler_) {
+ this.connectionErrorHandler_(reason);
+ }
+ };
+
+ InterfaceEndpointClient.prototype.queryVersion = function() {
+ return this.controlMessageProxy_.queryVersion();
+ };
+
+ InterfaceEndpointClient.prototype.requireVersion = function(version) {
+ this.controlMessageProxy_.requireVersion(version);
+ };
+
+ InterfaceEndpointClient.prototype.getEncounteredError = function() {
+ return this.encounteredError_;
+ };
+
+ internal.InterfaceEndpointClient = InterfaceEndpointClient;
+})();
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ var AssociationEvent = {
+ // The interface has been associated with a message pipe.
+ ASSOCIATED: 'associated',
+ // The peer of this object has been closed before association.
+ PEER_CLOSED_BEFORE_ASSOCIATION: 'peer_closed_before_association'
+ };
+
+ function State(interfaceId, associatedGroupController) {
+ if (interfaceId === undefined) {
+ interfaceId = internal.kInvalidInterfaceId;
+ }
+
+ this.interfaceId = interfaceId;
+ this.associatedGroupController = associatedGroupController;
+ this.pendingAssociation = false;
+ this.disconnectReason = null;
+ this.peerState_ = null;
+ this.associationEventHandler_ = null;
+ }
+
+ State.prototype.initPendingState = function(peer) {
+ this.pendingAssociation = true;
+ this.peerState_ = peer;
+ };
+
+ State.prototype.isValid = function() {
+ return this.pendingAssociation ||
+ internal.isValidInterfaceId(this.interfaceId);
+ };
+
+ State.prototype.close = function(disconnectReason) {
+ var cachedGroupController;
+ var cachedPeerState;
+ var cachedId = internal.kInvalidInterfaceId;
+
+ if (!this.pendingAssociation) {
+ if (internal.isValidInterfaceId(this.interfaceId)) {
+ cachedGroupController = this.associatedGroupController;
+ this.associatedGroupController = null;
+ cachedId = this.interfaceId;
+ this.interfaceId = internal.kInvalidInterfaceId;
+ }
+ } else {
+ this.pendingAssociation = false;
+ cachedPeerState = this.peerState_;
+ this.peerState_ = null;
+ }
+
+ if (cachedGroupController) {
+ cachedGroupController.closeEndpointHandle(cachedId,
+ disconnectReason);
+ } else if (cachedPeerState) {
+ cachedPeerState.onPeerClosedBeforeAssociation(disconnectReason);
+ }
+ };
+
+ State.prototype.runAssociationEventHandler = function(associationEvent) {
+ if (this.associationEventHandler_) {
+ var handler = this.associationEventHandler_;
+ this.associationEventHandler_ = null;
+ handler(associationEvent);
+ }
+ };
+
+ State.prototype.setAssociationEventHandler = function(handler) {
+ if (!this.pendingAssociation &&
+ !internal.isValidInterfaceId(this.interfaceId)) {
+ return;
+ }
+
+ if (!handler) {
+ this.associationEventHandler_ = null;
+ return;
+ }
+
+ this.associationEventHandler_ = handler;
+ if (!this.pendingAssociation) {
+ setTimeout(this.runAssociationEventHandler.bind(this,
+ AssociationEvent.ASSOCIATED), 0);
+ } else if (!this.peerState_) {
+ setTimeout(this.runAssociationEventHandler.bind(this,
+ AssociationEvent.PEER_CLOSED_BEFORE_ASSOCIATION), 0);
+ }
+ };
+
+ State.prototype.notifyAssociation = function(interfaceId,
+ peerGroupController) {
+ var cachedPeerState = this.peerState_;
+ this.peerState_ = null;
+
+ this.pendingAssociation = false;
+
+ if (cachedPeerState) {
+ cachedPeerState.onAssociated(interfaceId, peerGroupController);
+ return true;
+ }
+ return false;
+ };
+
+ State.prototype.onAssociated = function(interfaceId,
+ associatedGroupController) {
+ if (!this.pendingAssociation) {
+ return;
+ }
+
+ this.pendingAssociation = false;
+ this.peerState_ = null;
+ this.interfaceId = interfaceId;
+ this.associatedGroupController = associatedGroupController;
+ this.runAssociationEventHandler(AssociationEvent.ASSOCIATED);
+ };
+
+ State.prototype.onPeerClosedBeforeAssociation = function(disconnectReason) {
+ if (!this.pendingAssociation) {
+ return;
+ }
+
+ this.peerState_ = null;
+ this.disconnectReason = disconnectReason;
+
+ this.runAssociationEventHandler(
+ AssociationEvent.PEER_CLOSED_BEFORE_ASSOCIATION);
+ };
+
+ function createPairPendingAssociation() {
+ var handle0 = new InterfaceEndpointHandle();
+ var handle1 = new InterfaceEndpointHandle();
+ handle0.state_.initPendingState(handle1.state_);
+ handle1.state_.initPendingState(handle0.state_);
+ return {handle0: handle0, handle1: handle1};
+ }
+
+ function InterfaceEndpointHandle(interfaceId, associatedGroupController) {
+ this.state_ = new State(interfaceId, associatedGroupController);
+ }
+
+ InterfaceEndpointHandle.prototype.isValid = function() {
+ return this.state_.isValid();
+ };
+
+ InterfaceEndpointHandle.prototype.pendingAssociation = function() {
+ return this.state_.pendingAssociation;
+ };
+
+ InterfaceEndpointHandle.prototype.id = function() {
+ return this.state_.interfaceId;
+ };
+
+ InterfaceEndpointHandle.prototype.groupController = function() {
+ return this.state_.associatedGroupController;
+ };
+
+ InterfaceEndpointHandle.prototype.disconnectReason = function() {
+ return this.state_.disconnectReason;
+ };
+
+ InterfaceEndpointHandle.prototype.setAssociationEventHandler = function(
+ handler) {
+ this.state_.setAssociationEventHandler(handler);
+ };
+
+ InterfaceEndpointHandle.prototype.notifyAssociation = function(interfaceId,
+ peerGroupController) {
+ return this.state_.notifyAssociation(interfaceId, peerGroupController);
+ };
+
+ InterfaceEndpointHandle.prototype.reset = function(reason) {
+ this.state_.close(reason);
+ this.state_ = new State();
+ };
+
+ internal.AssociationEvent = AssociationEvent;
+ internal.InterfaceEndpointHandle = InterfaceEndpointHandle;
+ internal.createPairPendingAssociation = createPairPendingAssociation;
+})();
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ function validateControlRequestWithoutResponse(message) {
+ var messageValidator = new internal.Validator(message);
+ var error = messageValidator.validateMessageIsRequestWithoutResponse();
+ if (error != internal.validationError.NONE) {
+ throw error;
+ }
+
+ if (message.getName() != mojo.pipeControl2.kRunOrClosePipeMessageId) {
+ throw new Error("Control message name is not kRunOrClosePipeMessageId");
+ }
+
+ // Validate payload.
+ error = mojo.pipeControl2.RunOrClosePipeMessageParams.validate(
+ messageValidator, message.getHeaderNumBytes());
+ if (error != internal.validationError.NONE) {
+ throw error;
+ }
+ }
+
+ function runOrClosePipe(message, delegate) {
+ var reader = new internal.MessageReader(message);
+ var runOrClosePipeMessageParams = reader.decodeStruct(
+ mojo.pipeControl2.RunOrClosePipeMessageParams);
+ var event = runOrClosePipeMessageParams.input
+ .peerAssociatedEndpointClosedEvent;
+ return delegate.onPeerAssociatedEndpointClosed(event.id,
+ event.disconnectReason);
+ }
+
+ function isPipeControlMessage(message) {
+ return !internal.isValidInterfaceId(message.getInterfaceId());
+ }
+
+ function PipeControlMessageHandler(delegate) {
+ this.delegate_ = delegate;
+ }
+
+ PipeControlMessageHandler.prototype.accept = function(message) {
+ validateControlRequestWithoutResponse(message);
+ return runOrClosePipe(message, this.delegate_);
+ };
+
+ internal.PipeControlMessageHandler = PipeControlMessageHandler;
+ internal.isPipeControlMessage = isPipeControlMessage;
+})();
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ function constructRunOrClosePipeMessage(runOrClosePipeInput) {
+ var runOrClosePipeMessageParams = new
+ mojo.pipeControl2.RunOrClosePipeMessageParams();
+ runOrClosePipeMessageParams.input = runOrClosePipeInput;
+
+ var messageName = mojo.pipeControl2.kRunOrClosePipeMessageId;
+ var payloadSize =
+ mojo.pipeControl2.RunOrClosePipeMessageParams.encodedSize;
+
+ var builder = new internal.MessageV0Builder(messageName, payloadSize);
+ builder.encodeStruct(mojo.pipeControl2.RunOrClosePipeMessageParams,
+ runOrClosePipeMessageParams);
+ var message = builder.finish();
+ message.setInterfaceId(internal.kInvalidInterfaceId);
+ return message;
+ }
+
+ function PipeControlMessageProxy(receiver) {
+ this.receiver_ = receiver;
+ }
+
+ PipeControlMessageProxy.prototype.notifyPeerEndpointClosed = function(
+ interfaceId, reason) {
+ var message = this.constructPeerEndpointClosedMessage(interfaceId, reason);
+ this.receiver_.accept(message);
+ };
+
+ PipeControlMessageProxy.prototype.constructPeerEndpointClosedMessage =
+ function(interfaceId, reason) {
+ var event = new mojo.pipeControl2.PeerAssociatedEndpointClosedEvent();
+ event.id = interfaceId;
+ if (reason) {
+ event.disconnectReason = new mojo.pipeControl2.DisconnectReason({
+ customReason: reason.customReason,
+ description: reason.description});
+ }
+ var runOrClosePipeInput = new mojo.pipeControl2.RunOrClosePipeInput();
+ runOrClosePipeInput.peerAssociatedEndpointClosedEvent = event;
+ return constructRunOrClosePipeMessage(runOrClosePipeInput);
+ };
+
+ internal.PipeControlMessageProxy = PipeControlMessageProxy;
+})();
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ /**
+ * The state of |endpoint|. If both the endpoint and its peer have been
+ * closed, removes it from |endpoints_|.
+ * @enum {string}
+ */
+ var EndpointStateUpdateType = {
+ ENDPOINT_CLOSED: 'endpoint_closed',
+ PEER_ENDPOINT_CLOSED: 'peer_endpoint_closed'
+ };
+
+ function check(condition, output) {
+ if (!condition) {
+ // testharness.js does not rethrow errors so the error stack needs to be
+ // included as a string in the error we throw for debugging layout tests.
+ throw new Error((new Error()).stack);
+ }
+ }
+
+ function InterfaceEndpoint(router, interfaceId) {
+ this.router_ = router;
+ this.id = interfaceId;
+ this.closed = false;
+ this.peerClosed = false;
+ this.handleCreated = false;
+ this.disconnectReason = null;
+ this.client = null;
+ }
+
+ InterfaceEndpoint.prototype.sendMessage = function(message) {
+ message.setInterfaceId(this.id);
+ return this.router_.connector_.accept(message);
+ };
+
+ function Router(handle, setInterfaceIdNamespaceBit) {
+ if (!(handle instanceof MojoHandle)) {
+ throw new Error("Router constructor: Not a handle");
+ }
+ if (setInterfaceIdNamespaceBit === undefined) {
+ setInterfaceIdNamespaceBit = false;
+ }
+
+ this.connector_ = new internal.Connector(handle);
+
+ this.connector_.setIncomingReceiver({
+ accept: this.accept.bind(this),
+ });
+ this.connector_.setErrorHandler({
+ onError: this.onPipeConnectionError.bind(this),
+ });
+
+ this.setInterfaceIdNamespaceBit_ = setInterfaceIdNamespaceBit;
+ // |cachedMessageData| caches infomation about a message, so it can be
+ // processed later if a client is not yet attached to the target endpoint.
+ this.cachedMessageData = null;
+ this.controlMessageHandler_ = new internal.PipeControlMessageHandler(this);
+ this.controlMessageProxy_ =
+ new internal.PipeControlMessageProxy(this.connector_);
+ this.nextInterfaceIdValue_ = 1;
+ this.encounteredError_ = false;
+ this.endpoints_ = new Map();
+ }
+
+ Router.prototype.associateInterface = function(handleToSend) {
+ if (!handleToSend.pendingAssociation()) {
+ return internal.kInvalidInterfaceId;
+ }
+
+ var id = 0;
+ do {
+ if (this.nextInterfaceIdValue_ >= internal.kInterfaceIdNamespaceMask) {
+ this.nextInterfaceIdValue_ = 1;
+ }
+ id = this.nextInterfaceIdValue_++;
+ if (this.setInterfaceIdNamespaceBit_) {
+ id += internal.kInterfaceIdNamespaceMask;
+ }
+ } while (this.endpoints_.has(id));
+
+ var endpoint = new InterfaceEndpoint(this, id);
+ this.endpoints_.set(id, endpoint);
+ if (this.encounteredError_) {
+ this.updateEndpointStateMayRemove(endpoint,
+ EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
+ }
+ endpoint.handleCreated = true;
+
+ if (!handleToSend.notifyAssociation(id, this)) {
+ // The peer handle of |handleToSend|, which is supposed to join this
+ // associated group, has been closed.
+ this.updateEndpointStateMayRemove(endpoint,
+ EndpointStateUpdateType.ENDPOINT_CLOSED);
+
+ pipeControlMessageproxy.notifyPeerEndpointClosed(id,
+ handleToSend.disconnectReason());
+ }
+
+ return id;
+ };
+
+ Router.prototype.attachEndpointClient = function(
+ interfaceEndpointHandle, interfaceEndpointClient) {
+ check(internal.isValidInterfaceId(interfaceEndpointHandle.id()));
+ check(interfaceEndpointClient);
+
+ var endpoint = this.endpoints_.get(interfaceEndpointHandle.id());
+ check(endpoint);
+ check(!endpoint.client);
+ check(!endpoint.closed);
+ endpoint.client = interfaceEndpointClient;
+
+ if (endpoint.peerClosed) {
+ setTimeout(endpoint.client.notifyError.bind(endpoint.client), 0);
+ }
+
+ if (this.cachedMessageData && interfaceEndpointHandle.id() ===
+ this.cachedMessageData.message.getInterfaceId()) {
+ setTimeout((function() {
+ if (!this.cachedMessageData) {
+ return;
+ }
+
+ var targetEndpoint = this.endpoints_.get(
+ this.cachedMessageData.message.getInterfaceId());
+ // Check that the target endpoint's client still exists.
+ if (targetEndpoint && targetEndpoint.client) {
+ var message = this.cachedMessageData.message;
+ var messageValidator = this.cachedMessageData.messageValidator;
+ this.cachedMessageData = null;
+ this.connector_.resumeIncomingMethodCallProcessing();
+ var ok = endpoint.client.handleIncomingMessage(message,
+ messageValidator);
+
+ // Handle invalid cached incoming message.
+ if (!internal.isTestingMode() && !ok) {
+ this.connector_.handleError(true, true);
+ }
+ }
+ }).bind(this), 0);
+ }
+
+ return endpoint;
+ };
+
+ Router.prototype.detachEndpointClient = function(
+ interfaceEndpointHandle) {
+ check(internal.isValidInterfaceId(interfaceEndpointHandle.id()));
+ var endpoint = this.endpoints_.get(interfaceEndpointHandle.id());
+ check(endpoint);
+ check(endpoint.client);
+ check(!endpoint.closed);
+
+ endpoint.client = null;
+ };
+
+ Router.prototype.createLocalEndpointHandle = function(
+ interfaceId) {
+ if (!internal.isValidInterfaceId(interfaceId)) {
+ return new internal.InterfaceEndpointHandle();
+ }
+
+ var endpoint = this.endpoints_.get(interfaceId);
+
+ if (!endpoint) {
+ endpoint = new InterfaceEndpoint(this, interfaceId);
+ this.endpoints_.set(interfaceId, endpoint);
+
+ check(!endpoint.handleCreated);
+
+ if (this.encounteredError_) {
+ this.updateEndpointStateMayRemove(endpoint,
+ EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
+ }
+ } else {
+ // If the endpoint already exist, it is because we have received a
+ // notification that the peer endpoint has closed.
+ check(!endpoint.closed);
+ check(endpoint.peerClosed);
+
+ if (endpoint.handleCreated) {
+ return new internal.InterfaceEndpointHandle();
+ }
+ }
+
+ endpoint.handleCreated = true;
+ return new internal.InterfaceEndpointHandle(interfaceId, this);
+ };
+
+ Router.prototype.accept = function(message) {
+ var messageValidator = new internal.Validator(message);
+ var err = messageValidator.validateMessageHeader();
+
+ var ok = false;
+ if (err !== internal.validationError.NONE) {
+ internal.reportValidationError(err);
+ } else if (message.deserializeAssociatedEndpointHandles(this)) {
+ if (internal.isPipeControlMessage(message)) {
+ ok = this.controlMessageHandler_.accept(message);
+ } else {
+ var interfaceId = message.getInterfaceId();
+ var endpoint = this.endpoints_.get(interfaceId);
+ if (!endpoint || endpoint.closed) {
+ return true;
+ }
+
+ if (!endpoint.client) {
+ // We need to wait until a client is attached in order to dispatch
+ // further messages.
+ this.cachedMessageData = {message: message,
+ messageValidator: messageValidator};
+ this.connector_.pauseIncomingMethodCallProcessing();
+ return true;
+ }
+ ok = endpoint.client.handleIncomingMessage(message, messageValidator);
+ }
+ }
+ return ok;
+ };
+
+ Router.prototype.close = function() {
+ this.connector_.close();
+ // Closing the message pipe won't trigger connection error handler.
+ // Explicitly call onPipeConnectionError() so that associated endpoints
+ // will get notified.
+ this.onPipeConnectionError();
+ };
+
+ Router.prototype.onPeerAssociatedEndpointClosed = function(interfaceId,
+ reason) {
+ check(!internal.isMasterInterfaceId(interfaceId) || reason);
+
+ var endpoint = this.endpoints_.get(interfaceId);
+ if (!endpoint) {
+ endpoint = new InterfaceEndpoint(this, interfaceId);
+ this.endpoints_.set(interfaceId, endpoint);
+ }
+
+ if (reason) {
+ endpoint.disconnectReason = reason;
+ }
+
+ if (!endpoint.peerClosed) {
+ if (endpoint.client) {
+ setTimeout(endpoint.client.notifyError.bind(endpoint.client, reason),
+ 0);
+ }
+ this.updateEndpointStateMayRemove(endpoint,
+ EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
+ }
+ return true;
+ };
+
+ Router.prototype.onPipeConnectionError = function() {
+ this.encounteredError_ = true;
+
+ for (var endpoint of this.endpoints_.values()) {
+ if (endpoint.client) {
+ setTimeout(
+ endpoint.client.notifyError.bind(
+ endpoint.client, endpoint.disconnectReason),
+ 0);
+ }
+ this.updateEndpointStateMayRemove(endpoint,
+ EndpointStateUpdateType.PEER_ENDPOINT_CLOSED);
+ }
+ };
+
+ Router.prototype.closeEndpointHandle = function(interfaceId, reason) {
+ if (!internal.isValidInterfaceId(interfaceId)) {
+ return;
+ }
+ var endpoint = this.endpoints_.get(interfaceId);
+ check(endpoint);
+ check(!endpoint.client);
+ check(!endpoint.closed);
+
+ this.updateEndpointStateMayRemove(endpoint,
+ EndpointStateUpdateType.ENDPOINT_CLOSED);
+
+ if (!internal.isMasterInterfaceId(interfaceId) || reason) {
+ this.controlMessageProxy_.notifyPeerEndpointClosed(interfaceId, reason);
+ }
+
+ if (this.cachedMessageData && interfaceId ===
+ this.cachedMessageData.message.getInterfaceId()) {
+ this.cachedMessageData = null;
+ this.connector_.resumeIncomingMethodCallProcessing();
+ }
+ };
+
+ Router.prototype.updateEndpointStateMayRemove = function(endpoint,
+ endpointStateUpdateType) {
+ if (endpointStateUpdateType === EndpointStateUpdateType.ENDPOINT_CLOSED) {
+ endpoint.closed = true;
+ } else {
+ endpoint.peerClosed = true;
+ }
+ if (endpoint.closed && endpoint.peerClosed) {
+ this.endpoints_.delete(endpoint.id);
+ }
+ };
+
+ internal.Router = Router;
+})();
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * Defines functions for translating between JavaScript strings and UTF8 strings
+ * stored in ArrayBuffers. There is much room for optimization in this code if
+ * it proves necessary.
+ */
+(function() {
+ var internal = mojo.internal;
+
+ /**
+ * Decodes the UTF8 string from the given buffer.
+ * @param {ArrayBufferView} buffer The buffer containing UTF8 string data.
+ * @return {string} The corresponding JavaScript string.
+ */
+ function decodeUtf8String(buffer) {
+ return decodeURIComponent(escape(String.fromCharCode.apply(null, buffer)));
+ }
+
+ /**
+ * Encodes the given JavaScript string into UTF8.
+ * @param {string} str The string to encode.
+ * @param {ArrayBufferView} outputBuffer The buffer to contain the result.
+ * Should be pre-allocated to hold enough space. Use |utf8Length| to determine
+ * how much space is required.
+ * @return {number} The number of bytes written to |outputBuffer|.
+ */
+ function encodeUtf8String(str, outputBuffer) {
+ var utf8String = unescape(encodeURIComponent(str));
+ if (outputBuffer.length < utf8String.length)
+ throw new Error("Buffer too small for encodeUtf8String");
+ for (var i = 0; i < outputBuffer.length && i < utf8String.length; i++)
+ outputBuffer[i] = utf8String.charCodeAt(i);
+ return i;
+ }
+
+ /**
+ * Returns the number of bytes that a UTF8 encoding of the JavaScript string
+ * |str| would occupy.
+ */
+ function utf8Length(str) {
+ var utf8String = unescape(encodeURIComponent(str));
+ return utf8String.length;
+ }
+
+ internal.decodeUtf8String = decodeUtf8String;
+ internal.encodeUtf8String = encodeUtf8String;
+ internal.utf8Length = utf8Length;
+})();
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(function() {
+ var internal = mojo.internal;
+
+ var validationError = {
+ NONE: 'VALIDATION_ERROR_NONE',
+ MISALIGNED_OBJECT: 'VALIDATION_ERROR_MISALIGNED_OBJECT',
+ ILLEGAL_MEMORY_RANGE: 'VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE',
+ UNEXPECTED_STRUCT_HEADER: 'VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER',
+ UNEXPECTED_ARRAY_HEADER: 'VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER',
+ ILLEGAL_HANDLE: 'VALIDATION_ERROR_ILLEGAL_HANDLE',
+ UNEXPECTED_INVALID_HANDLE: 'VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE',
+ ILLEGAL_POINTER: 'VALIDATION_ERROR_ILLEGAL_POINTER',
+ UNEXPECTED_NULL_POINTER: 'VALIDATION_ERROR_UNEXPECTED_NULL_POINTER',
+ ILLEGAL_INTERFACE_ID: 'VALIDATION_ERROR_ILLEGAL_INTERFACE_ID',
+ UNEXPECTED_INVALID_INTERFACE_ID:
+ 'VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID',
+ MESSAGE_HEADER_INVALID_FLAGS:
+ 'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS',
+ MESSAGE_HEADER_MISSING_REQUEST_ID:
+ 'VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID',
+ DIFFERENT_SIZED_ARRAYS_IN_MAP:
+ 'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP',
+ INVALID_UNION_SIZE: 'VALIDATION_ERROR_INVALID_UNION_SIZE',
+ UNEXPECTED_NULL_UNION: 'VALIDATION_ERROR_UNEXPECTED_NULL_UNION',
+ UNKNOWN_ENUM_VALUE: 'VALIDATION_ERROR_UNKNOWN_ENUM_VALUE',
+ };
+
+ var NULL_MOJO_POINTER = "NULL_MOJO_POINTER";
+ var gValidationErrorObserver = null;
+
+ function reportValidationError(error) {
+ if (gValidationErrorObserver) {
+ gValidationErrorObserver.lastError = error;
+ } else {
+ console.warn('Invalid message: ' + error);
+ }
+ }
+
+ var ValidationErrorObserverForTesting = (function() {
+ function Observer() {
+ this.lastError = validationError.NONE;
+ }
+
+ Observer.prototype.reset = function() {
+ this.lastError = validationError.NONE;
+ };
+
+ return {
+ getInstance: function() {
+ if (!gValidationErrorObserver) {
+ gValidationErrorObserver = new Observer();
+ }
+ return gValidationErrorObserver;
+ }
+ };
+ })();
+
+ function isTestingMode() {
+ return Boolean(gValidationErrorObserver);
+ }
+
+ function clearTestingMode() {
+ gValidationErrorObserver = null;
+ }
+
+ function isEnumClass(cls) {
+ return cls instanceof internal.Enum;
+ }
+
+ function isStringClass(cls) {
+ return cls === internal.String || cls === internal.NullableString;
+ }
+
+ function isHandleClass(cls) {
+ return cls === internal.Handle || cls === internal.NullableHandle;
+ }
+
+ function isInterfaceClass(cls) {
+ return cls instanceof internal.Interface;
+ }
+
+ function isInterfaceRequestClass(cls) {
+ return cls === internal.InterfaceRequest ||
+ cls === internal.NullableInterfaceRequest;
+ }
+
+ function isAssociatedInterfaceClass(cls) {
+ return cls === internal.AssociatedInterfacePtrInfo ||
+ cls === internal.NullableAssociatedInterfacePtrInfo;
+ }
+
+ function isAssociatedInterfaceRequestClass(cls) {
+ return cls === internal.AssociatedInterfaceRequest ||
+ cls === internal.NullableAssociatedInterfaceRequest;
+ }
+
+ function isNullable(type) {
+ return type === internal.NullableString ||
+ type === internal.NullableHandle ||
+ type === internal.NullableAssociatedInterfacePtrInfo ||
+ type === internal.NullableAssociatedInterfaceRequest ||
+ type === internal.NullableInterface ||
+ type === internal.NullableInterfaceRequest ||
+ type instanceof internal.NullableArrayOf ||
+ type instanceof internal.NullablePointerTo;
+ }
+
+ function Validator(message) {
+ this.message = message;
+ this.offset = 0;
+ this.handleIndex = 0;
+ this.associatedEndpointHandleIndex = 0;
+ this.payloadInterfaceIds = null;
+ this.offsetLimit = this.message.buffer.byteLength;
+ }
+
+ Object.defineProperty(Validator.prototype, "handleIndexLimit", {
+ get: function() { return this.message.handles.length; }
+ });
+
+ Object.defineProperty(Validator.prototype, "associatedHandleIndexLimit", {
+ get: function() {
+ return this.payloadInterfaceIds ? this.payloadInterfaceIds.length : 0;
+ }
+ });
+
+ // True if we can safely allocate a block of bytes from start to
+ // to start + numBytes.
+ Validator.prototype.isValidRange = function(start, numBytes) {
+ // Only positive JavaScript integers that are less than 2^53
+ // (Number.MAX_SAFE_INTEGER) can be represented exactly.
+ if (start < this.offset || numBytes <= 0 ||
+ !Number.isSafeInteger(start) ||
+ !Number.isSafeInteger(numBytes))
+ return false;
+
+ var newOffset = start + numBytes;
+ if (!Number.isSafeInteger(newOffset) || newOffset > this.offsetLimit)
+ return false;
+
+ return true;
+ };
+
+ Validator.prototype.claimRange = function(start, numBytes) {
+ if (this.isValidRange(start, numBytes)) {
+ this.offset = start + numBytes;
+ return true;
+ }
+ return false;
+ };
+
+ Validator.prototype.claimHandle = function(index) {
+ if (index === internal.kEncodedInvalidHandleValue)
+ return true;
+
+ if (index < this.handleIndex || index >= this.handleIndexLimit)
+ return false;
+
+ // This is safe because handle indices are uint32.
+ this.handleIndex = index + 1;
+ return true;
+ };
+
+ Validator.prototype.claimAssociatedEndpointHandle = function(index) {
+ if (index === internal.kEncodedInvalidHandleValue) {
+ return true;
+ }
+
+ if (index < this.associatedEndpointHandleIndex ||
+ index >= this.associatedHandleIndexLimit) {
+ return false;
+ }
+
+ // This is safe because handle indices are uint32.
+ this.associatedEndpointHandleIndex = index + 1;
+ return true;
+ };
+
+ Validator.prototype.validateEnum = function(offset, enumClass) {
+ // Note: Assumes that enums are always 32 bits! But this matches
+ // mojom::generate::pack::PackedField::GetSizeForKind, so it should be okay.
+ var value = this.message.buffer.getInt32(offset);
+ return enumClass.validate(value);
+ }
+
+ Validator.prototype.validateHandle = function(offset, nullable) {
+ var index = this.message.buffer.getUint32(offset);
+
+ if (index === internal.kEncodedInvalidHandleValue)
+ return nullable ?
+ validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE;
+
+ if (!this.claimHandle(index))
+ return validationError.ILLEGAL_HANDLE;
+
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateAssociatedEndpointHandle = function(offset,
+ nullable) {
+ var index = this.message.buffer.getUint32(offset);
+
+ if (index === internal.kEncodedInvalidHandleValue) {
+ return nullable ? validationError.NONE :
+ validationError.UNEXPECTED_INVALID_INTERFACE_ID;
+ }
+
+ if (!this.claimAssociatedEndpointHandle(index)) {
+ return validationError.ILLEGAL_INTERFACE_ID;
+ }
+
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateInterface = function(offset, nullable) {
+ return this.validateHandle(offset, nullable);
+ };
+
+ Validator.prototype.validateInterfaceRequest = function(offset, nullable) {
+ return this.validateHandle(offset, nullable);
+ };
+
+ Validator.prototype.validateAssociatedInterface = function(offset,
+ nullable) {
+ return this.validateAssociatedEndpointHandle(offset, nullable);
+ };
+
+ Validator.prototype.validateAssociatedInterfaceRequest = function(
+ offset, nullable) {
+ return this.validateAssociatedEndpointHandle(offset, nullable);
+ };
+
+ Validator.prototype.validateStructHeader = function(offset, minNumBytes) {
+ if (!internal.isAligned(offset))
+ return validationError.MISALIGNED_OBJECT;
+
+ if (!this.isValidRange(offset, internal.kStructHeaderSize))
+ return validationError.ILLEGAL_MEMORY_RANGE;
+
+ var numBytes = this.message.buffer.getUint32(offset);
+
+ if (numBytes < minNumBytes)
+ return validationError.UNEXPECTED_STRUCT_HEADER;
+
+ if (!this.claimRange(offset, numBytes))
+ return validationError.ILLEGAL_MEMORY_RANGE;
+
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateStructVersion = function(offset, versionSizes) {
+ var numBytes = this.message.buffer.getUint32(offset);
+ var version = this.message.buffer.getUint32(offset + 4);
+
+ if (version <= versionSizes[versionSizes.length - 1].version) {
+ // Scan in reverse order to optimize for more recent versionSizes.
+ for (var i = versionSizes.length - 1; i >= 0; --i) {
+ if (version >= versionSizes[i].version) {
+ if (numBytes == versionSizes[i].numBytes)
+ break;
+ return validationError.UNEXPECTED_STRUCT_HEADER;
+ }
+ }
+ } else if (numBytes < versionSizes[versionSizes.length-1].numBytes) {
+ return validationError.UNEXPECTED_STRUCT_HEADER;
+ }
+
+ return validationError.NONE;
+ };
+
+ Validator.prototype.isFieldInStructVersion = function(offset, fieldVersion) {
+ var structVersion = this.message.buffer.getUint32(offset + 4);
+ return fieldVersion <= structVersion;
+ };
+
+ Validator.prototype.validateMessageHeader = function() {
+ var err = this.validateStructHeader(0, internal.kMessageV0HeaderSize);
+ if (err != validationError.NONE) {
+ return err;
+ }
+
+ var numBytes = this.message.getHeaderNumBytes();
+ var version = this.message.getHeaderVersion();
+
+ var validVersionAndNumBytes =
+ (version == 0 && numBytes == internal.kMessageV0HeaderSize) ||
+ (version == 1 && numBytes == internal.kMessageV1HeaderSize) ||
+ (version == 2 && numBytes == internal.kMessageV2HeaderSize) ||
+ (version > 2 && numBytes >= internal.kMessageV2HeaderSize);
+
+ if (!validVersionAndNumBytes) {
+ return validationError.UNEXPECTED_STRUCT_HEADER;
+ }
+
+ var expectsResponse = this.message.expectsResponse();
+ var isResponse = this.message.isResponse();
+
+ if (version == 0 && (expectsResponse || isResponse)) {
+ return validationError.MESSAGE_HEADER_MISSING_REQUEST_ID;
+ }
+
+ if (isResponse && expectsResponse) {
+ return validationError.MESSAGE_HEADER_INVALID_FLAGS;
+ }
+
+ if (version < 2) {
+ return validationError.NONE;
+ }
+
+ var err = this.validateArrayPointer(
+ internal.kMessagePayloadInterfaceIdsPointerOffset,
+ internal.Uint32.encodedSize, internal.Uint32, true, [0], 0);
+
+ if (err != validationError.NONE) {
+ return err;
+ }
+
+ this.payloadInterfaceIds = this.message.getPayloadInterfaceIds();
+ if (this.payloadInterfaceIds) {
+ for (var interfaceId of this.payloadInterfaceIds) {
+ if (!internal.isValidInterfaceId(interfaceId) ||
+ internal.isMasterInterfaceId(interfaceId)) {
+ return validationError.ILLEGAL_INTERFACE_ID;
+ }
+ }
+ }
+
+ // Set offset to the start of the payload and offsetLimit to the start of
+ // the payload interface Ids so that payload can be validated using the
+ // same messageValidator.
+ this.offset = this.message.getHeaderNumBytes();
+ this.offsetLimit = this.decodePointer(
+ internal.kMessagePayloadInterfaceIdsPointerOffset);
+
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateMessageIsRequestWithoutResponse = function() {
+ if (this.message.isResponse() || this.message.expectsResponse()) {
+ return validationError.MESSAGE_HEADER_INVALID_FLAGS;
+ }
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateMessageIsRequestExpectingResponse = function() {
+ if (this.message.isResponse() || !this.message.expectsResponse()) {
+ return validationError.MESSAGE_HEADER_INVALID_FLAGS;
+ }
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateMessageIsResponse = function() {
+ if (this.message.expectsResponse() || !this.message.isResponse()) {
+ return validationError.MESSAGE_HEADER_INVALID_FLAGS;
+ }
+ return validationError.NONE;
+ };
+
+ // Returns the message.buffer relative offset this pointer "points to",
+ // NULL_MOJO_POINTER if the pointer represents a null, or JS null if the
+ // pointer's value is not valid.
+ Validator.prototype.decodePointer = function(offset) {
+ var pointerValue = this.message.buffer.getUint64(offset);
+ if (pointerValue === 0)
+ return NULL_MOJO_POINTER;
+ var bufferOffset = offset + pointerValue;
+ return Number.isSafeInteger(bufferOffset) ? bufferOffset : null;
+ };
+
+ Validator.prototype.decodeUnionSize = function(offset) {
+ return this.message.buffer.getUint32(offset);
+ };
+
+ Validator.prototype.decodeUnionTag = function(offset) {
+ return this.message.buffer.getUint32(offset + 4);
+ };
+
+ Validator.prototype.validateArrayPointer = function(
+ offset, elementSize, elementType, nullable, expectedDimensionSizes,
+ currentDimension) {
+ var arrayOffset = this.decodePointer(offset);
+ if (arrayOffset === null)
+ return validationError.ILLEGAL_POINTER;
+
+ if (arrayOffset === NULL_MOJO_POINTER)
+ return nullable ?
+ validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
+
+ return this.validateArray(arrayOffset, elementSize, elementType,
+ expectedDimensionSizes, currentDimension);
+ };
+
+ Validator.prototype.validateStructPointer = function(
+ offset, structClass, nullable) {
+ var structOffset = this.decodePointer(offset);
+ if (structOffset === null)
+ return validationError.ILLEGAL_POINTER;
+
+ if (structOffset === NULL_MOJO_POINTER)
+ return nullable ?
+ validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
+
+ return structClass.validate(this, structOffset);
+ };
+
+ Validator.prototype.validateUnion = function(
+ offset, unionClass, nullable) {
+ var size = this.message.buffer.getUint32(offset);
+ if (size == 0) {
+ return nullable ?
+ validationError.NONE : validationError.UNEXPECTED_NULL_UNION;
+ }
+
+ return unionClass.validate(this, offset);
+ };
+
+ Validator.prototype.validateNestedUnion = function(
+ offset, unionClass, nullable) {
+ var unionOffset = this.decodePointer(offset);
+ if (unionOffset === null)
+ return validationError.ILLEGAL_POINTER;
+
+ if (unionOffset === NULL_MOJO_POINTER)
+ return nullable ?
+ validationError.NONE : validationError.UNEXPECTED_NULL_UNION;
+
+ return this.validateUnion(unionOffset, unionClass, nullable);
+ };
+
+ // This method assumes that the array at arrayPointerOffset has
+ // been validated.
+
+ Validator.prototype.arrayLength = function(arrayPointerOffset) {
+ var arrayOffset = this.decodePointer(arrayPointerOffset);
+ return this.message.buffer.getUint32(arrayOffset + 4);
+ };
+
+ Validator.prototype.validateMapPointer = function(
+ offset, mapIsNullable, keyClass, valueClass, valueIsNullable) {
+ // Validate the implicit map struct:
+ // struct {array<keyClass> keys; array<valueClass> values};
+ var structOffset = this.decodePointer(offset);
+ if (structOffset === null)
+ return validationError.ILLEGAL_POINTER;
+
+ if (structOffset === NULL_MOJO_POINTER)
+ return mapIsNullable ?
+ validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
+
+ var mapEncodedSize = internal.kStructHeaderSize +
+ internal.kMapStructPayloadSize;
+ var err = this.validateStructHeader(structOffset, mapEncodedSize);
+ if (err !== validationError.NONE)
+ return err;
+
+ // Validate the keys array.
+ var keysArrayPointerOffset = structOffset + internal.kStructHeaderSize;
+ err = this.validateArrayPointer(
+ keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0);
+ if (err !== validationError.NONE)
+ return err;
+
+ // Validate the values array.
+ var valuesArrayPointerOffset = keysArrayPointerOffset + 8;
+ var valuesArrayDimensions = [0]; // Validate the actual length below.
+ if (valueClass instanceof internal.ArrayOf)
+ valuesArrayDimensions =
+ valuesArrayDimensions.concat(valueClass.dimensions());
+ var err = this.validateArrayPointer(valuesArrayPointerOffset,
+ valueClass.encodedSize,
+ valueClass,
+ valueIsNullable,
+ valuesArrayDimensions,
+ 0);
+ if (err !== validationError.NONE)
+ return err;
+
+ // Validate the lengths of the keys and values arrays.
+ var keysArrayLength = this.arrayLength(keysArrayPointerOffset);
+ var valuesArrayLength = this.arrayLength(valuesArrayPointerOffset);
+ if (keysArrayLength != valuesArrayLength)
+ return validationError.DIFFERENT_SIZED_ARRAYS_IN_MAP;
+
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateStringPointer = function(offset, nullable) {
+ return this.validateArrayPointer(
+ offset, internal.Uint8.encodedSize, internal.Uint8, nullable, [0], 0);
+ };
+
+ // Similar to Array_Data<T>::Validate()
+ // mojo/public/cpp/bindings/lib/array_internal.h
+
+ Validator.prototype.validateArray =
+ function (offset, elementSize, elementType, expectedDimensionSizes,
+ currentDimension) {
+ if (!internal.isAligned(offset))
+ return validationError.MISALIGNED_OBJECT;
+
+ if (!this.isValidRange(offset, internal.kArrayHeaderSize))
+ return validationError.ILLEGAL_MEMORY_RANGE;
+
+ var numBytes = this.message.buffer.getUint32(offset);
+ var numElements = this.message.buffer.getUint32(offset + 4);
+
+ // Note: this computation is "safe" because elementSize <= 8 and
+ // numElements is a uint32.
+ var elementsTotalSize = (elementType === internal.PackedBool) ?
+ Math.ceil(numElements / 8) : (elementSize * numElements);
+
+ if (numBytes < internal.kArrayHeaderSize + elementsTotalSize)
+ return validationError.UNEXPECTED_ARRAY_HEADER;
+
+ if (expectedDimensionSizes[currentDimension] != 0 &&
+ numElements != expectedDimensionSizes[currentDimension]) {
+ return validationError.UNEXPECTED_ARRAY_HEADER;
+ }
+
+ if (!this.claimRange(offset, numBytes))
+ return validationError.ILLEGAL_MEMORY_RANGE;
+
+ // Validate the array's elements if they are pointers or handles.
+
+ var elementsOffset = offset + internal.kArrayHeaderSize;
+ var nullable = isNullable(elementType);
+
+ if (isHandleClass(elementType))
+ return this.validateHandleElements(elementsOffset, numElements, nullable);
+ if (isInterfaceClass(elementType))
+ return this.validateInterfaceElements(
+ elementsOffset, numElements, nullable);
+ if (isInterfaceRequestClass(elementType))
+ return this.validateInterfaceRequestElements(
+ elementsOffset, numElements, nullable);
+ if (isAssociatedInterfaceClass(elementType))
+ return this.validateAssociatedInterfaceElements(
+ elementsOffset, numElements, nullable);
+ if (isAssociatedInterfaceRequestClass(elementType))
+ return this.validateAssociatedInterfaceRequestElements(
+ elementsOffset, numElements, nullable);
+ if (isStringClass(elementType))
+ return this.validateArrayElements(
+ elementsOffset, numElements, internal.Uint8, nullable, [0], 0);
+ if (elementType instanceof internal.PointerTo)
+ return this.validateStructElements(
+ elementsOffset, numElements, elementType.cls, nullable);
+ if (elementType instanceof internal.ArrayOf)
+ return this.validateArrayElements(
+ elementsOffset, numElements, elementType.cls, nullable,
+ expectedDimensionSizes, currentDimension + 1);
+ if (isEnumClass(elementType))
+ return this.validateEnumElements(elementsOffset, numElements,
+ elementType.cls);
+
+ return validationError.NONE;
+ };
+
+ // Note: the |offset + i * elementSize| computation in the validateFooElements
+ // methods below is "safe" because elementSize <= 8, offset and
+ // numElements are uint32, and 0 <= i < numElements.
+
+ Validator.prototype.validateHandleElements =
+ function(offset, numElements, nullable) {
+ var elementSize = internal.Handle.encodedSize;
+ for (var i = 0; i < numElements; i++) {
+ var elementOffset = offset + i * elementSize;
+ var err = this.validateHandle(elementOffset, nullable);
+ if (err != validationError.NONE)
+ return err;
+ }
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateInterfaceElements =
+ function(offset, numElements, nullable) {
+ var elementSize = internal.Interface.prototype.encodedSize;
+ for (var i = 0; i < numElements; i++) {
+ var elementOffset = offset + i * elementSize;
+ var err = this.validateInterface(elementOffset, nullable);
+ if (err != validationError.NONE)
+ return err;
+ }
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateInterfaceRequestElements =
+ function(offset, numElements, nullable) {
+ var elementSize = internal.InterfaceRequest.encodedSize;
+ for (var i = 0; i < numElements; i++) {
+ var elementOffset = offset + i * elementSize;
+ var err = this.validateInterfaceRequest(elementOffset, nullable);
+ if (err != validationError.NONE)
+ return err;
+ }
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateAssociatedInterfaceElements =
+ function(offset, numElements, nullable) {
+ var elementSize = internal.AssociatedInterfacePtrInfo.prototype.encodedSize;
+ for (var i = 0; i < numElements; i++) {
+ var elementOffset = offset + i * elementSize;
+ var err = this.validateAssociatedInterface(elementOffset, nullable);
+ if (err != validationError.NONE) {
+ return err;
+ }
+ }
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateAssociatedInterfaceRequestElements =
+ function(offset, numElements, nullable) {
+ var elementSize = internal.AssociatedInterfaceRequest.encodedSize;
+ for (var i = 0; i < numElements; i++) {
+ var elementOffset = offset + i * elementSize;
+ var err = this.validateAssociatedInterfaceRequest(elementOffset,
+ nullable);
+ if (err != validationError.NONE) {
+ return err;
+ }
+ }
+ return validationError.NONE;
+ };
+
+ // The elementClass parameter is the element type of the element arrays.
+ Validator.prototype.validateArrayElements =
+ function(offset, numElements, elementClass, nullable,
+ expectedDimensionSizes, currentDimension) {
+ var elementSize = internal.PointerTo.prototype.encodedSize;
+ for (var i = 0; i < numElements; i++) {
+ var elementOffset = offset + i * elementSize;
+ var err = this.validateArrayPointer(
+ elementOffset, elementClass.encodedSize, elementClass, nullable,
+ expectedDimensionSizes, currentDimension);
+ if (err != validationError.NONE)
+ return err;
+ }
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateStructElements =
+ function(offset, numElements, structClass, nullable) {
+ var elementSize = internal.PointerTo.prototype.encodedSize;
+ for (var i = 0; i < numElements; i++) {
+ var elementOffset = offset + i * elementSize;
+ var err =
+ this.validateStructPointer(elementOffset, structClass, nullable);
+ if (err != validationError.NONE)
+ return err;
+ }
+ return validationError.NONE;
+ };
+
+ Validator.prototype.validateEnumElements =
+ function(offset, numElements, enumClass) {
+ var elementSize = internal.Enum.prototype.encodedSize;
+ for (var i = 0; i < numElements; i++) {
+ var elementOffset = offset + i * elementSize;
+ var err = this.validateEnum(elementOffset, enumClass);
+ if (err != validationError.NONE)
+ return err;
+ }
+ return validationError.NONE;
+ };
+
+ internal.validationError = validationError;
+ internal.Validator = Validator;
+ internal.ValidationErrorObserverForTesting =
+ ValidationErrorObserverForTesting;
+ internal.reportValidationError = reportValidationError;
+ internal.isTestingMode = isTestingMode;
+ internal.clearTestingMode = clearTestingMode;
+})();
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+'use strict';
+
+(function() {
+ var mojomId = 'mojo/public/interfaces/bindings/new_bindings/interface_control_messages.mojom';
+ if (mojo.internal.isMojomLoaded(mojomId)) {
+ console.warn('The following mojom is loaded multiple times: ' + mojomId);
+ return;
+ }
+ mojo.internal.markMojomLoaded(mojomId);
+
+ // TODO(yzshen): Define these aliases to minimize the differences between the
+ // old/new modes. Remove them when the old mode goes away.
+ var bindings = mojo;
+ var associatedBindings = mojo;
+ var codec = mojo.internal;
+ var validator = mojo.internal;
+
+ var exports = mojo.internal.exposeNamespace('mojo.interfaceControl2');
+
+
+ var kRunMessageId = 0xFFFFFFFF;
+ var kRunOrClosePipeMessageId = 0xFFFFFFFE;
+
+ function RunMessageParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ RunMessageParams.prototype.initDefaults_ = function() {
+ this.input = null;
+ };
+ RunMessageParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ RunMessageParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ // validate RunMessageParams.input
+ err = messageValidator.validateUnion(offset + codec.kStructHeaderSize + 0, RunInput, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ RunMessageParams.encodedSize = codec.kStructHeaderSize + 16;
+
+ RunMessageParams.decode = function(decoder) {
+ var packed;
+ var val = new RunMessageParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.input = decoder.decodeStruct(RunInput);
+ return val;
+ };
+
+ RunMessageParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(RunMessageParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(RunInput, val.input);
+ };
+ function RunResponseMessageParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ RunResponseMessageParams.prototype.initDefaults_ = function() {
+ this.output = null;
+ };
+ RunResponseMessageParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ RunResponseMessageParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ // validate RunResponseMessageParams.output
+ err = messageValidator.validateUnion(offset + codec.kStructHeaderSize + 0, RunOutput, true);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ RunResponseMessageParams.encodedSize = codec.kStructHeaderSize + 16;
+
+ RunResponseMessageParams.decode = function(decoder) {
+ var packed;
+ var val = new RunResponseMessageParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.output = decoder.decodeStruct(RunOutput);
+ return val;
+ };
+
+ RunResponseMessageParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(RunResponseMessageParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(RunOutput, val.output);
+ };
+ function QueryVersion(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ QueryVersion.prototype.initDefaults_ = function() {
+ };
+ QueryVersion.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ QueryVersion.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 8}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ QueryVersion.encodedSize = codec.kStructHeaderSize + 0;
+
+ QueryVersion.decode = function(decoder) {
+ var packed;
+ var val = new QueryVersion();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ return val;
+ };
+
+ QueryVersion.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(QueryVersion.encodedSize);
+ encoder.writeUint32(0);
+ };
+ function QueryVersionResult(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ QueryVersionResult.prototype.initDefaults_ = function() {
+ this.version = 0;
+ };
+ QueryVersionResult.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ QueryVersionResult.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ QueryVersionResult.encodedSize = codec.kStructHeaderSize + 8;
+
+ QueryVersionResult.decode = function(decoder) {
+ var packed;
+ var val = new QueryVersionResult();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.version = decoder.decodeStruct(codec.Uint32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ QueryVersionResult.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(QueryVersionResult.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint32, val.version);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+ function FlushForTesting(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ FlushForTesting.prototype.initDefaults_ = function() {
+ };
+ FlushForTesting.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ FlushForTesting.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 8}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ FlushForTesting.encodedSize = codec.kStructHeaderSize + 0;
+
+ FlushForTesting.decode = function(decoder) {
+ var packed;
+ var val = new FlushForTesting();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ return val;
+ };
+
+ FlushForTesting.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(FlushForTesting.encodedSize);
+ encoder.writeUint32(0);
+ };
+ function RunOrClosePipeMessageParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ RunOrClosePipeMessageParams.prototype.initDefaults_ = function() {
+ this.input = null;
+ };
+ RunOrClosePipeMessageParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ RunOrClosePipeMessageParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ // validate RunOrClosePipeMessageParams.input
+ err = messageValidator.validateUnion(offset + codec.kStructHeaderSize + 0, RunOrClosePipeInput, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ RunOrClosePipeMessageParams.encodedSize = codec.kStructHeaderSize + 16;
+
+ RunOrClosePipeMessageParams.decode = function(decoder) {
+ var packed;
+ var val = new RunOrClosePipeMessageParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.input = decoder.decodeStruct(RunOrClosePipeInput);
+ return val;
+ };
+
+ RunOrClosePipeMessageParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(RunOrClosePipeMessageParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(RunOrClosePipeInput, val.input);
+ };
+ function RequireVersion(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ RequireVersion.prototype.initDefaults_ = function() {
+ this.version = 0;
+ };
+ RequireVersion.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ RequireVersion.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ return validator.validationError.NONE;
+ };
+
+ RequireVersion.encodedSize = codec.kStructHeaderSize + 8;
+
+ RequireVersion.decode = function(decoder) {
+ var packed;
+ var val = new RequireVersion();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.version = decoder.decodeStruct(codec.Uint32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ return val;
+ };
+
+ RequireVersion.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(RequireVersion.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint32, val.version);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ };
+
+ function RunInput(value) {
+ this.initDefault_();
+ this.initValue_(value);
+ }
+
+
+ RunInput.Tags = {
+ queryVersion: 0,
+ flushForTesting: 1,
+ };
+
+ RunInput.prototype.initDefault_ = function() {
+ this.$data = null;
+ this.$tag = undefined;
+ }
+
+ RunInput.prototype.initValue_ = function(value) {
+ if (value == undefined) {
+ return;
+ }
+
+ var keys = Object.keys(value);
+ if (keys.length == 0) {
+ return;
+ }
+
+ if (keys.length > 1) {
+ throw new TypeError("You may set only one member on a union.");
+ }
+
+ var fields = [
+ "queryVersion",
+ "flushForTesting",
+ ];
+
+ if (fields.indexOf(keys[0]) < 0) {
+ throw new ReferenceError(keys[0] + " is not a RunInput member.");
+
+ }
+
+ this[keys[0]] = value[keys[0]];
+ }
+ Object.defineProperty(RunInput.prototype, "queryVersion", {
+ get: function() {
+ if (this.$tag != RunInput.Tags.queryVersion) {
+ throw new ReferenceError(
+ "RunInput.queryVersion is not currently set.");
+ }
+ return this.$data;
+ },
+
+ set: function(value) {
+ this.$tag = RunInput.Tags.queryVersion;
+ this.$data = value;
+ }
+ });
+ Object.defineProperty(RunInput.prototype, "flushForTesting", {
+ get: function() {
+ if (this.$tag != RunInput.Tags.flushForTesting) {
+ throw new ReferenceError(
+ "RunInput.flushForTesting is not currently set.");
+ }
+ return this.$data;
+ },
+
+ set: function(value) {
+ this.$tag = RunInput.Tags.flushForTesting;
+ this.$data = value;
+ }
+ });
+
+
+ RunInput.encode = function(encoder, val) {
+ if (val == null) {
+ encoder.writeUint64(0);
+ encoder.writeUint64(0);
+ return;
+ }
+ if (val.$tag == undefined) {
+ throw new TypeError("Cannot encode unions with an unknown member set.");
+ }
+
+ encoder.writeUint32(16);
+ encoder.writeUint32(val.$tag);
+ switch (val.$tag) {
+ case RunInput.Tags.queryVersion:
+ encoder.encodeStructPointer(QueryVersion, val.queryVersion);
+ break;
+ case RunInput.Tags.flushForTesting:
+ encoder.encodeStructPointer(FlushForTesting, val.flushForTesting);
+ break;
+ }
+ encoder.align();
+ };
+
+
+ RunInput.decode = function(decoder) {
+ var size = decoder.readUint32();
+ if (size == 0) {
+ decoder.readUint32();
+ decoder.readUint64();
+ return null;
+ }
+
+ var result = new RunInput();
+ var tag = decoder.readUint32();
+ switch (tag) {
+ case RunInput.Tags.queryVersion:
+ result.queryVersion = decoder.decodeStructPointer(QueryVersion);
+ break;
+ case RunInput.Tags.flushForTesting:
+ result.flushForTesting = decoder.decodeStructPointer(FlushForTesting);
+ break;
+ }
+ decoder.align();
+
+ return result;
+ };
+
+
+ RunInput.validate = function(messageValidator, offset) {
+ var size = messageValidator.decodeUnionSize(offset);
+ if (size != 16) {
+ return validator.validationError.INVALID_UNION_SIZE;
+ }
+
+ var tag = messageValidator.decodeUnionTag(offset);
+ var data_offset = offset + 8;
+ var err;
+ switch (tag) {
+ case RunInput.Tags.queryVersion:
+
+
+ // validate RunInput.queryVersion
+ err = messageValidator.validateStructPointer(data_offset, QueryVersion, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+ break;
+ case RunInput.Tags.flushForTesting:
+
+
+ // validate RunInput.flushForTesting
+ err = messageValidator.validateStructPointer(data_offset, FlushForTesting, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+ break;
+ }
+
+ return validator.validationError.NONE;
+ };
+
+ RunInput.encodedSize = 16;
+
+ function RunOutput(value) {
+ this.initDefault_();
+ this.initValue_(value);
+ }
+
+
+ RunOutput.Tags = {
+ queryVersionResult: 0,
+ };
+
+ RunOutput.prototype.initDefault_ = function() {
+ this.$data = null;
+ this.$tag = undefined;
+ }
+
+ RunOutput.prototype.initValue_ = function(value) {
+ if (value == undefined) {
+ return;
+ }
+
+ var keys = Object.keys(value);
+ if (keys.length == 0) {
+ return;
+ }
+
+ if (keys.length > 1) {
+ throw new TypeError("You may set only one member on a union.");
+ }
+
+ var fields = [
+ "queryVersionResult",
+ ];
+
+ if (fields.indexOf(keys[0]) < 0) {
+ throw new ReferenceError(keys[0] + " is not a RunOutput member.");
+
+ }
+
+ this[keys[0]] = value[keys[0]];
+ }
+ Object.defineProperty(RunOutput.prototype, "queryVersionResult", {
+ get: function() {
+ if (this.$tag != RunOutput.Tags.queryVersionResult) {
+ throw new ReferenceError(
+ "RunOutput.queryVersionResult is not currently set.");
+ }
+ return this.$data;
+ },
+
+ set: function(value) {
+ this.$tag = RunOutput.Tags.queryVersionResult;
+ this.$data = value;
+ }
+ });
+
+
+ RunOutput.encode = function(encoder, val) {
+ if (val == null) {
+ encoder.writeUint64(0);
+ encoder.writeUint64(0);
+ return;
+ }
+ if (val.$tag == undefined) {
+ throw new TypeError("Cannot encode unions with an unknown member set.");
+ }
+
+ encoder.writeUint32(16);
+ encoder.writeUint32(val.$tag);
+ switch (val.$tag) {
+ case RunOutput.Tags.queryVersionResult:
+ encoder.encodeStructPointer(QueryVersionResult, val.queryVersionResult);
+ break;
+ }
+ encoder.align();
+ };
+
+
+ RunOutput.decode = function(decoder) {
+ var size = decoder.readUint32();
+ if (size == 0) {
+ decoder.readUint32();
+ decoder.readUint64();
+ return null;
+ }
+
+ var result = new RunOutput();
+ var tag = decoder.readUint32();
+ switch (tag) {
+ case RunOutput.Tags.queryVersionResult:
+ result.queryVersionResult = decoder.decodeStructPointer(QueryVersionResult);
+ break;
+ }
+ decoder.align();
+
+ return result;
+ };
+
+
+ RunOutput.validate = function(messageValidator, offset) {
+ var size = messageValidator.decodeUnionSize(offset);
+ if (size != 16) {
+ return validator.validationError.INVALID_UNION_SIZE;
+ }
+
+ var tag = messageValidator.decodeUnionTag(offset);
+ var data_offset = offset + 8;
+ var err;
+ switch (tag) {
+ case RunOutput.Tags.queryVersionResult:
+
+
+ // validate RunOutput.queryVersionResult
+ err = messageValidator.validateStructPointer(data_offset, QueryVersionResult, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+ break;
+ }
+
+ return validator.validationError.NONE;
+ };
+
+ RunOutput.encodedSize = 16;
+
+ function RunOrClosePipeInput(value) {
+ this.initDefault_();
+ this.initValue_(value);
+ }
+
+
+ RunOrClosePipeInput.Tags = {
+ requireVersion: 0,
+ };
+
+ RunOrClosePipeInput.prototype.initDefault_ = function() {
+ this.$data = null;
+ this.$tag = undefined;
+ }
+
+ RunOrClosePipeInput.prototype.initValue_ = function(value) {
+ if (value == undefined) {
+ return;
+ }
+
+ var keys = Object.keys(value);
+ if (keys.length == 0) {
+ return;
+ }
+
+ if (keys.length > 1) {
+ throw new TypeError("You may set only one member on a union.");
+ }
+
+ var fields = [
+ "requireVersion",
+ ];
+
+ if (fields.indexOf(keys[0]) < 0) {
+ throw new ReferenceError(keys[0] + " is not a RunOrClosePipeInput member.");
+
+ }
+
+ this[keys[0]] = value[keys[0]];
+ }
+ Object.defineProperty(RunOrClosePipeInput.prototype, "requireVersion", {
+ get: function() {
+ if (this.$tag != RunOrClosePipeInput.Tags.requireVersion) {
+ throw new ReferenceError(
+ "RunOrClosePipeInput.requireVersion is not currently set.");
+ }
+ return this.$data;
+ },
+
+ set: function(value) {
+ this.$tag = RunOrClosePipeInput.Tags.requireVersion;
+ this.$data = value;
+ }
+ });
+
+
+ RunOrClosePipeInput.encode = function(encoder, val) {
+ if (val == null) {
+ encoder.writeUint64(0);
+ encoder.writeUint64(0);
+ return;
+ }
+ if (val.$tag == undefined) {
+ throw new TypeError("Cannot encode unions with an unknown member set.");
+ }
+
+ encoder.writeUint32(16);
+ encoder.writeUint32(val.$tag);
+ switch (val.$tag) {
+ case RunOrClosePipeInput.Tags.requireVersion:
+ encoder.encodeStructPointer(RequireVersion, val.requireVersion);
+ break;
+ }
+ encoder.align();
+ };
+
+
+ RunOrClosePipeInput.decode = function(decoder) {
+ var size = decoder.readUint32();
+ if (size == 0) {
+ decoder.readUint32();
+ decoder.readUint64();
+ return null;
+ }
+
+ var result = new RunOrClosePipeInput();
+ var tag = decoder.readUint32();
+ switch (tag) {
+ case RunOrClosePipeInput.Tags.requireVersion:
+ result.requireVersion = decoder.decodeStructPointer(RequireVersion);
+ break;
+ }
+ decoder.align();
+
+ return result;
+ };
+
+
+ RunOrClosePipeInput.validate = function(messageValidator, offset) {
+ var size = messageValidator.decodeUnionSize(offset);
+ if (size != 16) {
+ return validator.validationError.INVALID_UNION_SIZE;
+ }
+
+ var tag = messageValidator.decodeUnionTag(offset);
+ var data_offset = offset + 8;
+ var err;
+ switch (tag) {
+ case RunOrClosePipeInput.Tags.requireVersion:
+
+
+ // validate RunOrClosePipeInput.requireVersion
+ err = messageValidator.validateStructPointer(data_offset, RequireVersion, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+ break;
+ }
+
+ return validator.validationError.NONE;
+ };
+
+ RunOrClosePipeInput.encodedSize = 16;
+ exports.kRunMessageId = kRunMessageId;
+ exports.kRunOrClosePipeMessageId = kRunOrClosePipeMessageId;
+ exports.RunMessageParams = RunMessageParams;
+ exports.RunResponseMessageParams = RunResponseMessageParams;
+ exports.QueryVersion = QueryVersion;
+ exports.QueryVersionResult = QueryVersionResult;
+ exports.FlushForTesting = FlushForTesting;
+ exports.RunOrClosePipeMessageParams = RunOrClosePipeMessageParams;
+ exports.RequireVersion = RequireVersion;
+ exports.RunInput = RunInput;
+ exports.RunOutput = RunOutput;
+ exports.RunOrClosePipeInput = RunOrClosePipeInput;
+})();// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+'use strict';
+
+(function() {
+ var mojomId = 'mojo/public/interfaces/bindings/new_bindings/pipe_control_messages.mojom';
+ if (mojo.internal.isMojomLoaded(mojomId)) {
+ console.warn('The following mojom is loaded multiple times: ' + mojomId);
+ return;
+ }
+ mojo.internal.markMojomLoaded(mojomId);
+
+ // TODO(yzshen): Define these aliases to minimize the differences between the
+ // old/new modes. Remove them when the old mode goes away.
+ var bindings = mojo;
+ var associatedBindings = mojo;
+ var codec = mojo.internal;
+ var validator = mojo.internal;
+
+ var exports = mojo.internal.exposeNamespace('mojo.pipeControl2');
+
+
+ var kRunOrClosePipeMessageId = 0xFFFFFFFE;
+
+ function RunOrClosePipeMessageParams(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ RunOrClosePipeMessageParams.prototype.initDefaults_ = function() {
+ this.input = null;
+ };
+ RunOrClosePipeMessageParams.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ RunOrClosePipeMessageParams.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+ // validate RunOrClosePipeMessageParams.input
+ err = messageValidator.validateUnion(offset + codec.kStructHeaderSize + 0, RunOrClosePipeInput, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ RunOrClosePipeMessageParams.encodedSize = codec.kStructHeaderSize + 16;
+
+ RunOrClosePipeMessageParams.decode = function(decoder) {
+ var packed;
+ var val = new RunOrClosePipeMessageParams();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.input = decoder.decodeStruct(RunOrClosePipeInput);
+ return val;
+ };
+
+ RunOrClosePipeMessageParams.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(RunOrClosePipeMessageParams.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(RunOrClosePipeInput, val.input);
+ };
+ function DisconnectReason(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ DisconnectReason.prototype.initDefaults_ = function() {
+ this.customReason = 0;
+ this.description = null;
+ };
+ DisconnectReason.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ DisconnectReason.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ // validate DisconnectReason.description
+ err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ DisconnectReason.encodedSize = codec.kStructHeaderSize + 16;
+
+ DisconnectReason.decode = function(decoder) {
+ var packed;
+ var val = new DisconnectReason();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.customReason = decoder.decodeStruct(codec.Uint32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.description = decoder.decodeStruct(codec.String);
+ return val;
+ };
+
+ DisconnectReason.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(DisconnectReason.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint32, val.customReason);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeStruct(codec.String, val.description);
+ };
+ function PeerAssociatedEndpointClosedEvent(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ PeerAssociatedEndpointClosedEvent.prototype.initDefaults_ = function() {
+ this.id = 0;
+ this.disconnectReason = null;
+ };
+ PeerAssociatedEndpointClosedEvent.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ PeerAssociatedEndpointClosedEvent.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 24}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+
+ // validate PeerAssociatedEndpointClosedEvent.disconnectReason
+ err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, DisconnectReason, true);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ PeerAssociatedEndpointClosedEvent.encodedSize = codec.kStructHeaderSize + 16;
+
+ PeerAssociatedEndpointClosedEvent.decode = function(decoder) {
+ var packed;
+ var val = new PeerAssociatedEndpointClosedEvent();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.id = decoder.decodeStruct(codec.Uint32);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ decoder.skip(1);
+ val.disconnectReason = decoder.decodeStructPointer(DisconnectReason);
+ return val;
+ };
+
+ PeerAssociatedEndpointClosedEvent.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(PeerAssociatedEndpointClosedEvent.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeStruct(codec.Uint32, val.id);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.skip(1);
+ encoder.encodeStructPointer(DisconnectReason, val.disconnectReason);
+ };
+
+ function RunOrClosePipeInput(value) {
+ this.initDefault_();
+ this.initValue_(value);
+ }
+
+
+ RunOrClosePipeInput.Tags = {
+ peerAssociatedEndpointClosedEvent: 0,
+ };
+
+ RunOrClosePipeInput.prototype.initDefault_ = function() {
+ this.$data = null;
+ this.$tag = undefined;
+ }
+
+ RunOrClosePipeInput.prototype.initValue_ = function(value) {
+ if (value == undefined) {
+ return;
+ }
+
+ var keys = Object.keys(value);
+ if (keys.length == 0) {
+ return;
+ }
+
+ if (keys.length > 1) {
+ throw new TypeError("You may set only one member on a union.");
+ }
+
+ var fields = [
+ "peerAssociatedEndpointClosedEvent",
+ ];
+
+ if (fields.indexOf(keys[0]) < 0) {
+ throw new ReferenceError(keys[0] + " is not a RunOrClosePipeInput member.");
+
+ }
+
+ this[keys[0]] = value[keys[0]];
+ }
+ Object.defineProperty(RunOrClosePipeInput.prototype, "peerAssociatedEndpointClosedEvent", {
+ get: function() {
+ if (this.$tag != RunOrClosePipeInput.Tags.peerAssociatedEndpointClosedEvent) {
+ throw new ReferenceError(
+ "RunOrClosePipeInput.peerAssociatedEndpointClosedEvent is not currently set.");
+ }
+ return this.$data;
+ },
+
+ set: function(value) {
+ this.$tag = RunOrClosePipeInput.Tags.peerAssociatedEndpointClosedEvent;
+ this.$data = value;
+ }
+ });
+
+
+ RunOrClosePipeInput.encode = function(encoder, val) {
+ if (val == null) {
+ encoder.writeUint64(0);
+ encoder.writeUint64(0);
+ return;
+ }
+ if (val.$tag == undefined) {
+ throw new TypeError("Cannot encode unions with an unknown member set.");
+ }
+
+ encoder.writeUint32(16);
+ encoder.writeUint32(val.$tag);
+ switch (val.$tag) {
+ case RunOrClosePipeInput.Tags.peerAssociatedEndpointClosedEvent:
+ encoder.encodeStructPointer(PeerAssociatedEndpointClosedEvent, val.peerAssociatedEndpointClosedEvent);
+ break;
+ }
+ encoder.align();
+ };
+
+
+ RunOrClosePipeInput.decode = function(decoder) {
+ var size = decoder.readUint32();
+ if (size == 0) {
+ decoder.readUint32();
+ decoder.readUint64();
+ return null;
+ }
+
+ var result = new RunOrClosePipeInput();
+ var tag = decoder.readUint32();
+ switch (tag) {
+ case RunOrClosePipeInput.Tags.peerAssociatedEndpointClosedEvent:
+ result.peerAssociatedEndpointClosedEvent = decoder.decodeStructPointer(PeerAssociatedEndpointClosedEvent);
+ break;
+ }
+ decoder.align();
+
+ return result;
+ };
+
+
+ RunOrClosePipeInput.validate = function(messageValidator, offset) {
+ var size = messageValidator.decodeUnionSize(offset);
+ if (size != 16) {
+ return validator.validationError.INVALID_UNION_SIZE;
+ }
+
+ var tag = messageValidator.decodeUnionTag(offset);
+ var data_offset = offset + 8;
+ var err;
+ switch (tag) {
+ case RunOrClosePipeInput.Tags.peerAssociatedEndpointClosedEvent:
+
+
+ // validate RunOrClosePipeInput.peerAssociatedEndpointClosedEvent
+ err = messageValidator.validateStructPointer(data_offset, PeerAssociatedEndpointClosedEvent, false);
+ if (err !== validator.validationError.NONE)
+ return err;
+ break;
+ }
+
+ return validator.validationError.NONE;
+ };
+
+ RunOrClosePipeInput.encodedSize = 16;
+ exports.kRunOrClosePipeMessageId = kRunOrClosePipeMessageId;
+ exports.RunOrClosePipeMessageParams = RunOrClosePipeMessageParams;
+ exports.DisconnectReason = DisconnectReason;
+ exports.PeerAssociatedEndpointClosedEvent = PeerAssociatedEndpointClosedEvent;
+ exports.RunOrClosePipeInput = RunOrClosePipeInput;
+})(); \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/resources/chromium/mojo_bindings.js.headers b/tests/wpt/web-platform-tests/resources/chromium/mojo_bindings.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/mojo_bindings.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/resources/chromium/string16.mojom.js b/tests/wpt/web-platform-tests/resources/chromium/string16.mojom.js
new file mode 100644
index 00000000000..058956bf169
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/string16.mojom.js
@@ -0,0 +1,159 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+'use strict';
+if ((typeof mojo !== 'undefined') && mojo.internal && mojo.config) {
+
+(function() {
+ var mojomId = 'mojo/common/string16.mojom';
+ if (mojo.internal.isMojomLoaded(mojomId)) {
+ console.warn('The following mojom is loaded multiple times: ' + mojomId);
+ return;
+ }
+ mojo.internal.markMojomLoaded(mojomId);
+
+ // TODO(yzshen): Define these aliases to minimize the differences between the
+ // old/new modes. Remove them when the old mode goes away.
+ var bindings = mojo;
+ var associatedBindings = mojo;
+ var codec = mojo.internal;
+ var validator = mojo.internal;
+
+ var exports = mojo.internal.exposeNamespace('mojo.common.mojom');
+
+
+
+ function String16(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ String16.prototype.initDefaults_ = function() {
+ this.data = null;
+ };
+ String16.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ String16.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate String16.data
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 2, codec.Uint16, false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ String16.encodedSize = codec.kStructHeaderSize + 8;
+
+ String16.decode = function(decoder) {
+ var packed;
+ var val = new String16();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.data = decoder.decodeArrayPointer(codec.Uint16);
+ return val;
+ };
+
+ String16.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(String16.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeArrayPointer(codec.Uint16, val.data);
+ };
+ exports.String16 = String16;
+})();
+}
+
+if ((typeof mojo === 'undefined') || !mojo.internal || !mojo.config) {
+
+define("mojo/common/string16.mojom", [
+ "mojo/public/js/associated_bindings",
+ "mojo/public/js/bindings",
+ "mojo/public/js/codec",
+ "mojo/public/js/core",
+ "mojo/public/js/validator",
+], function(associatedBindings, bindings, codec, core, validator) {
+ var exports = {};
+
+ function String16(values) {
+ this.initDefaults_();
+ this.initFields_(values);
+ }
+
+
+ String16.prototype.initDefaults_ = function() {
+ this.data = null;
+ };
+ String16.prototype.initFields_ = function(fields) {
+ for(var field in fields) {
+ if (this.hasOwnProperty(field))
+ this[field] = fields[field];
+ }
+ };
+
+ String16.validate = function(messageValidator, offset) {
+ var err;
+ err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ var kVersionSizes = [
+ {version: 0, numBytes: 16}
+ ];
+ err = messageValidator.validateStructVersion(offset, kVersionSizes);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+
+
+ // validate String16.data
+ err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 2, codec.Uint16, false, [0], 0);
+ if (err !== validator.validationError.NONE)
+ return err;
+
+ return validator.validationError.NONE;
+ };
+
+ String16.encodedSize = codec.kStructHeaderSize + 8;
+
+ String16.decode = function(decoder) {
+ var packed;
+ var val = new String16();
+ var numberOfBytes = decoder.readUint32();
+ var version = decoder.readUint32();
+ val.data = decoder.decodeArrayPointer(codec.Uint16);
+ return val;
+ };
+
+ String16.encode = function(encoder, val) {
+ var packed;
+ encoder.writeUint32(String16.encodedSize);
+ encoder.writeUint32(0);
+ encoder.encodeArrayPointer(codec.Uint16, val.data);
+ };
+ exports.String16 = String16;
+
+ return exports;
+});
+} \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/resources/chromium/string16.mojom.js.headers b/tests/wpt/web-platform-tests/resources/chromium/string16.mojom.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/string16.mojom.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/resources/chromium/webusb-test.js b/tests/wpt/web-platform-tests/resources/chromium/webusb-test.js
new file mode 100644
index 00000000000..08c82547ed8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/webusb-test.js
@@ -0,0 +1,541 @@
+'use strict';
+
+// This polyfill library implements the WebUSB Test API as specified here:
+// https://wicg.github.io/webusb/test/
+
+(() => {
+
+// These variables are logically members of the USBTest class but are defined
+// here to hide them from being visible as fields of navigator.usb.test.
+let internal = {
+ intialized: false,
+
+ deviceManager: null,
+ deviceManagerInterceptor: null,
+ deviceManagerCrossFrameProxy: null,
+
+ chooser: null,
+ chooserInterceptor: null,
+ chooserCrossFrameProxy: null,
+};
+
+// Converts an ECMAScript String object to an instance of
+// mojo.common.mojom.String16.
+function mojoString16ToString(string16) {
+ return String.fromCharCode.apply(null, string16.data);
+}
+
+// Converts an instance of mojo.common.mojom.String16 to an ECMAScript String.
+function stringToMojoString16(string) {
+ let array = new Array(string.length);
+ for (var i = 0; i < string.length; ++i) {
+ array[i] = string.charCodeAt(i);
+ }
+ return { data: array }
+}
+
+function fakeDeviceInitToDeviceInfo(guid, init) {
+ let deviceInfo = {
+ guid: guid + "",
+ usbVersionMajor: init.usbVersionMajor,
+ usbVersionMinor: init.usbVersionMinor,
+ usbVersionSubminor: init.usbVersionSubminor,
+ classCode: init.deviceClass,
+ subclassCode: init.deviceSubclass,
+ protocolCode: init.deviceProtocol,
+ vendorId: init.vendorId,
+ productId: init.productId,
+ deviceVersionMajor: init.deviceVersionMajor,
+ deviceVersionMinor: init.deviceVersionMinor,
+ deviceVersionSubminor: init.deviceVersionSubminor,
+ manufacturerName: stringToMojoString16(init.manufacturerName),
+ productName: stringToMojoString16(init.productName),
+ serialNumber: stringToMojoString16(init.serialNumber),
+ activeConfiguration: init.activeConfigurationValue,
+ configurations: []
+ };
+ init.configurations.forEach(config => {
+ var configInfo = {
+ configurationValue: config.configurationValue,
+ configurationName: stringToMojoString16(config.configurationName),
+ interfaces: []
+ };
+ config.interfaces.forEach(iface => {
+ var interfaceInfo = {
+ interfaceNumber: iface.interfaceNumber,
+ alternates: []
+ };
+ iface.alternates.forEach(alternate => {
+ var alternateInfo = {
+ alternateSetting: alternate.alternateSetting,
+ classCode: alternate.interfaceClass,
+ subclassCode: alternate.interfaceSubclass,
+ protocolCode: alternate.interfaceProtocol,
+ interfaceName: stringToMojoString16(alternate.interfaceName),
+ endpoints: []
+ };
+ alternate.endpoints.forEach(endpoint => {
+ var endpointInfo = {
+ endpointNumber: endpoint.endpointNumber,
+ packetSize: endpoint.packetSize,
+ };
+ switch (endpoint.direction) {
+ case "in":
+ endpointInfo.direction = device.mojom.UsbTransferDirection.INBOUND;
+ break;
+ case "out":
+ endpointInfo.direction = device.mojom.UsbTransferDirection.OUTBOUND;
+ break;
+ }
+ switch (endpoint.type) {
+ case "bulk":
+ endpointInfo.type = device.mojom.UsbTransferType.BULK;
+ break;
+ case "interrupt":
+ endpointInfo.type = device.mojom.UsbTransferType.INTERRUPT;
+ break;
+ case "isochronous":
+ endpointInfo.type = device.mojom.UsbTransferType.ISOCHRONOUS;
+ break;
+ }
+ alternateInfo.endpoints.push(endpointInfo);
+ });
+ interfaceInfo.alternates.push(alternateInfo);
+ });
+ configInfo.interfaces.push(interfaceInfo);
+ });
+ deviceInfo.configurations.push(configInfo);
+ });
+ return deviceInfo;
+}
+
+function convertMojoDeviceFilters(input) {
+ let output = [];
+ input.forEach(filter => {
+ output.push(convertMojoDeviceFilter(filter));
+ });
+ return output;
+}
+
+function convertMojoDeviceFilter(input) {
+ let output = {};
+ if (input.hasVendorId)
+ output.vendorId = input.vendorId;
+ if (input.hasProductId)
+ output.productId = input.productId;
+ if (input.hasClassCode)
+ output.classCode = input.classCode;
+ if (input.hasSubclassCode)
+ output.subclassCode = input.subclassCode;
+ if (input.hasProtocolCode)
+ output.protocolCode = input.protocolCode;
+ if (input.serialNumber)
+ output.serialNumber = mojoString16ToString(input.serialNumber);
+ return output;
+}
+
+class FakeDevice {
+ constructor(deviceInit) {
+ this.info_ = deviceInit;
+ this.opened_ = false;
+ this.currentConfiguration_ = null;
+ this.claimedInterfaces_ = new Map();
+ }
+
+ getConfiguration() {
+ if (this.currentConfiguration_) {
+ return Promise.resolve({
+ value: this.currentConfiguration_.configurationValue });
+ } else {
+ return Promise.resolve({ value: 0 });
+ }
+ }
+
+ open() {
+ assert_false(this.opened_);
+ this.opened_ = true;
+ return Promise.resolve({ error: device.mojom.UsbOpenDeviceError.OK });
+ }
+
+ close() {
+ assert_true(this.opened_);
+ this.opened_ = false;
+ return Promise.resolve();
+ }
+
+ setConfiguration(value) {
+ assert_true(this.opened_);
+
+ let selectedConfiguration = this.info_.configurations.find(
+ configuration => configuration.configurationValue == value);
+ // Blink should never request an invalid configuration.
+ assert_not_equals(selectedConfiguration, undefined);
+ this.currentConfiguration_ = selectedConfiguration;
+ return Promise.resolve({ success: true });
+ }
+
+ claimInterface(interfaceNumber) {
+ assert_true(this.opened_);
+ assert_false(this.currentConfiguration_ == null, 'device configured');
+ assert_false(this.claimedInterfaces_.has(interfaceNumber),
+ 'interface already claimed');
+
+ // Blink should never request an invalid interface.
+ assert_true(this.currentConfiguration_.interfaces.some(
+ iface => iface.interfaceNumber == interfaceNumber));
+ this.claimedInterfaces_.set(interfaceNumber, 0);
+ return Promise.resolve({ success: true });
+ }
+
+ releaseInterface(interfaceNumber) {
+ assert_true(this.opened_);
+ assert_false(this.currentConfiguration_ == null, 'device configured');
+ assert_true(this.claimedInterfaces_.has(interfaceNumber));
+ this.claimedInterfaces_.delete(interfaceNumber);
+ return Promise.resolve({ success: true });
+ }
+
+ setInterfaceAlternateSetting(interfaceNumber, alternateSetting) {
+ assert_true(this.opened_);
+ assert_false(this.currentConfiguration_ == null, 'device configured');
+ assert_true(this.claimedInterfaces_.has(interfaceNumber));
+
+ let iface = this.currentConfiguration_.interfaces.find(
+ iface => iface.interfaceNumber == interfaceNumber);
+ // Blink should never request an invalid interface or alternate.
+ assert_false(iface == undefined);
+ assert_true(iface.alternates.some(
+ x => x.alternateSetting == alternateSetting));
+ this.claimedInterfaces_.set(interfaceNumber, alternateSetting);
+ return Promise.resolve({ success: true });
+ }
+
+ reset() {
+ assert_true(this.opened_);
+ return Promise.resolve({ success: true });
+ }
+
+ clearHalt(endpoint) {
+ assert_true(this.opened_);
+ assert_false(this.currentConfiguration_ == null, 'device configured');
+ // TODO(reillyg): Assert that endpoint is valid.
+ return Promise.resolve({ success: true });
+ }
+
+ controlTransferIn(params, length, timeout) {
+ assert_true(this.opened_);
+ assert_false(this.currentConfiguration_ == null, 'device configured');
+ return Promise.resolve({
+ status: device.mojom.UsbTransferStatus.OK,
+ data: [length >> 8, length & 0xff, params.request, params.value >> 8,
+ params.value & 0xff, params.index >> 8, params.index & 0xff]
+ });
+ }
+
+ controlTransferOut(params, data, timeout) {
+ assert_true(this.opened_);
+ assert_false(this.currentConfiguration_ == null, 'device configured');
+ return Promise.resolve({
+ status: device.mojom.UsbTransferStatus.OK,
+ bytesWritten: data.byteLength
+ });
+ }
+
+ genericTransferIn(endpointNumber, length, timeout) {
+ assert_true(this.opened_);
+ assert_false(this.currentConfiguration_ == null, 'device configured');
+ // TODO(reillyg): Assert that endpoint is valid.
+ let data = new Array(length);
+ for (let i = 0; i < length; ++i)
+ data[i] = i & 0xff;
+ return Promise.resolve({
+ status: device.mojom.UsbTransferStatus.OK,
+ data: data
+ });
+ }
+
+ genericTransferOut(endpointNumber, data, timeout) {
+ assert_true(this.opened_);
+ assert_false(this.currentConfiguration_ == null, 'device configured');
+ // TODO(reillyg): Assert that endpoint is valid.
+ return Promise.resolve({
+ status: device.mojom.UsbTransferStatus.OK,
+ bytesWritten: data.byteLength
+ });
+ }
+
+ isochronousTransferIn(endpointNumber, packetLengths, timeout) {
+ assert_true(this.opened_);
+ assert_false(this.currentConfiguration_ == null, 'device configured');
+ // TODO(reillyg): Assert that endpoint is valid.
+ let data = new Array(packetLengths.reduce((a, b) => a + b, 0));
+ let dataOffset = 0;
+ let packets = new Array(packetLengths.length);
+ for (let i = 0; i < packetLengths.length; ++i) {
+ for (let j = 0; j < packetLengths[i]; ++j)
+ data[dataOffset++] = j & 0xff;
+ packets[i] = {
+ length: packetLengths[i],
+ transferredLength: packetLengths[i],
+ status: device.mojom.UsbTransferStatus.OK
+ };
+ }
+ return Promise.resolve({ data: data, packets: packets });
+ }
+
+ isochronousTransferOut(endpointNumber, data, packetLengths, timeout) {
+ assert_true(this.opened_);
+ assert_false(this.currentConfiguration_ == null, 'device configured');
+ // TODO(reillyg): Assert that endpoint is valid.
+ let packets = new Array(packetLengths.length);
+ for (let i = 0; i < packetLengths.length; ++i) {
+ packets[i] = {
+ length: packetLengths[i],
+ transferredLength: packetLengths[i],
+ status: device.mojom.UsbTransferStatus.OK
+ };
+ }
+ return Promise.resolve({ packets: packets });
+ }
+}
+
+class FakeDeviceManager {
+ constructor() {
+ this.bindingSet_ = new mojo.BindingSet(device.mojom.UsbDeviceManager);
+ this.devices_ = new Map();
+ this.devicesByGuid_ = new Map();
+ this.client_ = null;
+ this.nextGuid_ = 0;
+ }
+
+ addBinding(handle) {
+ this.bindingSet_.addBinding(this, handle);
+ }
+
+ addDevice(fakeDevice, info) {
+ let device = {
+ fakeDevice: fakeDevice,
+ guid: (this.nextGuid_++).toString(),
+ info: info,
+ bindingArray: []
+ };
+ this.devices_.set(fakeDevice, device);
+ this.devicesByGuid_.set(device.guid, device);
+ if (this.client_)
+ this.client_.onDeviceAdded(fakeDeviceInitToDeviceInfo(device.guid, info));
+ }
+
+ removeDevice(fakeDevice) {
+ let device = this.devices_.get(fakeDevice);
+ if (!device)
+ throw new Error('Cannot remove unknown device.');
+
+ for (var binding of device.bindingArray)
+ binding.close();
+ this.devices_.delete(device.fakeDevice);
+ this.devicesByGuid_.delete(device.guid);
+ if (this.client_) {
+ this.client_.onDeviceRemoved(
+ fakeDeviceInitToDeviceInfo(device.guid, device.info));
+ }
+ }
+
+ removeAllDevices() {
+ this.devices_.forEach(device => {
+ for (var binding of device.bindingArray)
+ binding.close();
+ this.client_.onDeviceRemoved(
+ fakeDeviceInitToDeviceInfo(device.guid, device.info));
+ });
+ this.devices_.clear();
+ this.devicesByGuid_.clear();
+ }
+
+ getDevices(options) {
+ let devices = [];
+ this.devices_.forEach(device => {
+ devices.push(fakeDeviceInitToDeviceInfo(device.guid, device.info));
+ });
+ return Promise.resolve({ results: devices });
+ }
+
+ getDevice(guid, request) {
+ let device = this.devicesByGuid_.get(guid);
+ if (device) {
+ let binding = new mojo.Binding(
+ window.device.mojom.UsbDevice, new FakeDevice(device.info), request);
+ binding.setConnectionErrorHandler(() => {
+ if (device.fakeDevice.onclose)
+ device.fakeDevice.onclose();
+ });
+ device.bindingArray.push(binding);
+ } else {
+ request.close();
+ }
+ }
+
+ setClient(client) {
+ this.client_ = client;
+ }
+}
+
+class USBDeviceRequestEvent {
+ constructor(deviceFilters, resolve) {
+ this.filters = convertMojoDeviceFilters(deviceFilters);
+ this.resolveFunc_ = resolve;
+ }
+
+ respondWith(value) {
+ // Wait until |value| resolves (if it is a Promise). This function returns
+ // no value.
+ Promise.resolve(value).then(fakeDevice => {
+ let device = internal.deviceManager.devices_.get(fakeDevice);
+ let result = null;
+ if (device) {
+ result = fakeDeviceInitToDeviceInfo(device.guid, device.info);
+ }
+ this.resolveFunc_({ result: result });
+ }, () => {
+ this.resolveFunc_({ result: null });
+ });
+ }
+}
+
+class FakeChooserService {
+ constructor() {
+ this.bindingSet_ = new mojo.BindingSet(device.mojom.UsbChooserService);
+ }
+
+ addBinding(handle) {
+ this.bindingSet_.addBinding(this, handle);
+ }
+
+ getPermission(deviceFilters) {
+ return new Promise(resolve => {
+ if (navigator.usb.test.onrequestdevice) {
+ navigator.usb.test.onrequestdevice(
+ new USBDeviceRequestEvent(deviceFilters, resolve));
+ } else {
+ resolve({ result: null });
+ }
+ });
+ }
+}
+
+// Unlike FakeDevice this class is exported to callers of USBTest.addFakeDevice.
+class FakeUSBDevice {
+ constructor() {
+ this.onclose = null;
+ }
+
+ disconnect() {
+ setTimeout(() => internal.deviceManager.removeDevice(this), 0);
+ }
+}
+
+// A helper for forwarding MojoHandle instances from one frame to another.
+class CrossFrameHandleProxy {
+ constructor(callback) {
+ let {handle0, handle1} = Mojo.createMessagePipe();
+ this.sender_ = handle0;
+ this.receiver_ = handle1;
+ this.receiver_.watch({readable: true}, () => {
+ let message = this.receiver_.readMessage();
+ assert_equals(message.buffer.byteLength, 0);
+ assert_equals(message.handles.length, 1);
+ callback(message.handles[0]);
+ });
+ }
+
+ forwardHandle(handle) {
+ this.sender_.writeMessage(new ArrayBuffer, [handle]);
+ }
+}
+
+class USBTest {
+ constructor() {
+ this.onrequestdevice = undefined;
+ }
+
+ async initialize() {
+ if (internal.initialized)
+ return;
+
+ internal.deviceManager = new FakeDeviceManager();
+ internal.deviceManagerInterceptor =
+ new MojoInterfaceInterceptor(device.mojom.UsbDeviceManager.name);
+ internal.deviceManagerInterceptor.oninterfacerequest =
+ e => internal.deviceManager.addBinding(e.handle);
+ internal.deviceManagerInterceptor.start();
+ internal.deviceManagerCrossFrameProxy = new CrossFrameHandleProxy(
+ handle => internal.deviceManager.addBinding(handle));
+
+ internal.chooser = new FakeChooserService();
+ internal.chooserInterceptor =
+ new MojoInterfaceInterceptor(device.mojom.UsbChooserService.name);
+ internal.chooserInterceptor.oninterfacerequest =
+ e => internal.chooser.addBinding(e.handle);
+ internal.chooserInterceptor.start();
+ internal.chooserCrossFrameProxy = new CrossFrameHandleProxy(
+ handle => internal.chooser.addBinding(handle));
+
+ // Wait for a call to GetDevices() to pass between the renderer and the
+ // mock in order to establish that everything is set up.
+ await navigator.usb.getDevices();
+ internal.initialized = true;
+ }
+
+ async attachToWindow(otherWindow) {
+ if (!internal.initialized)
+ throw new Error('Call initialize() before attachToWindow().');
+
+ otherWindow.deviceManagerInterceptor =
+ new otherWindow.MojoInterfaceInterceptor(
+ device.mojom.UsbDeviceManager.name);
+ otherWindow.deviceManagerInterceptor.oninterfacerequest =
+ e => internal.deviceManagerCrossFrameProxy.forwardHandle(e.handle);
+ otherWindow.deviceManagerInterceptor.start();
+
+ otherWindow.chooserInterceptor =
+ new otherWindow.MojoInterfaceInterceptor(
+ device.mojom.UsbChooserService.name);
+ otherWindow.chooserInterceptor.oninterfacerequest =
+ e => internal.chooserCrossFrameProxy.forwardHandle(e.handle);
+ otherWindow.chooserInterceptor.start();
+
+ // Wait for a call to GetDevices() to pass between the renderer and the
+ // mock in order to establish that everything is set up.
+ await otherWindow.navigator.usb.getDevices();
+ }
+
+ addFakeDevice(deviceInit) {
+ if (!internal.initialized)
+ throw new Error('Call initialize() before addFakeDevice().');
+
+ // |addDevice| and |removeDevice| are called in a setTimeout callback so
+ // that tests do not rely on the device being immediately available which
+ // may not be true for all implementations of this test API.
+ let fakeDevice = new FakeUSBDevice();
+ setTimeout(
+ () => internal.deviceManager.addDevice(fakeDevice, deviceInit), 0);
+ return fakeDevice;
+ }
+
+ reset() {
+ if (!internal.initialized)
+ throw new Error('Call initialize() before reset().');
+
+ // Reset the mocks in a setTimeout callback so that tests do not rely on
+ // the fact that this polyfill can do this synchronously.
+ return new Promise(resolve => {
+ setTimeout(() => {
+ internal.deviceManager.removeAllDevices();
+ resolve();
+ }, 0);
+ });
+ }
+}
+
+navigator.usb.test = new USBTest();
+
+})();
diff --git a/tests/wpt/web-platform-tests/resources/chromium/webusb-test.js.headers b/tests/wpt/web-platform-tests/resources/chromium/webusb-test.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/chromium/webusb-test.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/resources/idlharness.js b/tests/wpt/web-platform-tests/resources/idlharness.js
index e83b2152961..eda6a420dd6 100644
--- a/tests/wpt/web-platform-tests/resources/idlharness.js
+++ b/tests/wpt/web-platform-tests/resources/idlharness.js
@@ -75,7 +75,7 @@ function minOverloadLength(overloads)
}
//@}
-function throwOrReject(a_test, operation, fn, obj, args, message, cb)
+function throwOrReject(a_test, operation, fn, obj, args, message, cb)
//@{
{
if (operation.idlType.generic !== "Promise") {
@@ -85,7 +85,7 @@ function throwOrReject(a_test, operation, fn, obj, args, message, cb)
cb();
} else {
try {
- promise_rejects(a_test, new TypeError(), fn.apply(obj, args)).then(cb, cb);
+ promise_rejects(a_test, new TypeError(), fn.apply(obj, args), message).then(cb, cb);
} catch (e){
a_test.step(function() {
assert_unreached("Throws \"" + e + "\" instead of rejecting promise");
@@ -322,6 +322,126 @@ IdlArray.prototype.recursively_get_implements = function(interface_name)
return ret;
};
+//@}
+IdlArray.prototype.is_json_type = function(type)
+//@{
+{
+ /**
+ * Checks whether type is a JSON type as per
+ * https://heycam.github.io/webidl/#dfn-json-types
+ */
+
+ var idlType = type.idlType;
+
+ if (type.generic == "Promise") { return false; }
+
+ // nullable and annotated types don't need to be handled separately,
+ // as webidl2 doesn't represent them wrapped-up (as they're described
+ // in WebIDL).
+
+ // union and record types
+ if (type.union || type.generic == "record") {
+ return idlType.every(this.is_json_type, this);
+ }
+
+ // sequence types
+ if (type.generic == "sequence" || type.generic == "FrozenArray") {
+ return this.is_json_type(idlType);
+ }
+
+ if (typeof idlType != "string") { throw new Error("Unexpected type " + JSON.stringify(idlType)); }
+
+ switch (idlType)
+ {
+ // Numeric types
+ case "byte":
+ case "octet":
+ case "short":
+ case "unsigned short":
+ case "long":
+ case "unsigned long":
+ case "long long":
+ case "unsigned long long":
+ case "float":
+ case "double":
+ case "unrestricted float":
+ case "unrestricted double":
+ // boolean
+ case "boolean":
+ // string types
+ case "DOMString":
+ case "ByteString":
+ case "USVString":
+ // object type
+ case "object":
+ return true;
+ case "Error":
+ case "DOMException":
+ case "Int8Array":
+ case "Int16Array":
+ case "Int32Array":
+ case "Uint8Array":
+ case "Uint16Array":
+ case "Uint32Array":
+ case "Uint8ClampedArray":
+ case "Float32Array":
+ case "ArrayBuffer":
+ case "DataView":
+ case "any":
+ return false;
+ default:
+ var thing = this.members[idlType];
+ if (!thing) { throw new Error("Type " + idlType + " not found"); }
+ if (thing instanceof IdlEnum) { return true; }
+
+ if (thing instanceof IdlTypedef) {
+ return this.is_json_type(thing.idlType);
+ }
+
+ // dictionaries where all of their members are JSON types
+ if (thing instanceof IdlDictionary) {
+ var stack = thing.get_inheritance_stack();
+ var map = new Map();
+ while (stack.length)
+ {
+ stack.pop().members.forEach(function(m) {
+ map.set(m.name, m.idlType)
+ });
+ }
+ return Array.from(map.values()).every(this.is_json_type, this);
+ }
+
+ // interface types that have a toJSON operation declared on themselves or
+ // one of their inherited or consequential interfaces.
+ if (thing instanceof IdlInterface) {
+ var base;
+ while (thing)
+ {
+ if (thing.has_to_json_regular_operation()) { return true; }
+ var mixins = this.implements[thing.name];
+ if (mixins) {
+ mixins = mixins.map(function(id) {
+ var mixin = this.members[id];
+ if (!mixin) {
+ throw new Error("Interface " + id + " not found (implemented by " + thing.name + ")");
+ }
+ return mixin;
+ }, this);
+ if (mixins.some(function(m) { return m.has_to_json_regular_operation() } )) { return true; }
+ }
+ if (!thing.base) { return false; }
+ base = this.members[thing.base];
+ if (!base) {
+ throw new Error("Interface " + thing.base + " not found (inherited by " + thing.name + ")");
+ }
+ thing = base;
+ }
+ return false;
+ }
+ return false;
+ }
+};
+
function exposure_set(object, default_set) {
var exposed = object.extAttrs.filter(function(a) { return a.name == "Exposed" });
if (exposed.length > 1 || exposed.length < 0) {
@@ -696,6 +816,9 @@ function IdlDictionary(obj)
/** Self-explanatory. */
this.name = obj.name;
+ /** A back-reference to our IdlArray. */
+ this.array = obj.array;
+
/** An array of objects produced by the "dictionaryMember" production. */
this.members = obj.members;
@@ -709,6 +832,10 @@ function IdlDictionary(obj)
//@}
IdlDictionary.prototype = Object.create(IdlObject.prototype);
+IdlDictionary.prototype.get_inheritance_stack = function() {
+ return IdlInterface.prototype.get_inheritance_stack.call(this);
+};
+
/// IdlInterface ///
function IdlInterface(obj, is_callback)
//@{
@@ -777,6 +904,127 @@ IdlInterface.prototype.is_global = function()
};
//@}
+IdlInterface.prototype.has_to_json_regular_operation = function() {
+ return this.members.some(function(m) {
+ return m.is_to_json_regular_operation();
+ });
+};
+
+IdlInterface.prototype.has_default_to_json_regular_operation = function() {
+ return this.members.some(function(m) {
+ return m.is_to_json_regular_operation() && m.has_extended_attribute("Default");
+ });
+};
+
+IdlInterface.prototype.get_inheritance_stack = function() {
+ /**
+ * See https://heycam.github.io/webidl/#create-an-inheritance-stack
+ *
+ * Returns an array of IdlInterface objects which contains itself
+ * and all of its inherited interfaces.
+ *
+ * So given:
+ *
+ * A : B {};
+ * B : C {};
+ * C {};
+ *
+ * then A.get_inheritance_stack() should return [A, B, C],
+ * and B.get_inheritance_stack() should return [B, C].
+ *
+ * Note: as dictionary inheritance is expressed identically by the AST,
+ * this works just as well for getting a stack of inherited dictionaries.
+ */
+
+ var stack = [this];
+ var idl_interface = this;
+ while (idl_interface.base) {
+ var base = this.array.members[idl_interface.base];
+ if (!base) {
+ throw new Error(idl_interface.type + " " + idl_interface.base + " not found (inherited by " + idl_interface.name + ")");
+ }
+ idl_interface = base;
+ stack.push(idl_interface);
+ }
+ return stack;
+};
+
+/**
+ * Implementation of
+ * https://heycam.github.io/webidl/#default-tojson-operation
+ * for testing purposes.
+ *
+ * Collects the IDL types of the attributes that meet the criteria
+ * for inclusion in the default toJSON operation for easy
+ * comparison with actual value
+ */
+IdlInterface.prototype.default_to_json_operation = function(callback) {
+ var map = new Map(), isDefault = false;
+ this.traverse_inherited_and_consequential_interfaces(function(I) {
+ if (I.has_default_to_json_regular_operation()) {
+ isDefault = true;
+ I.members.forEach(function(m) {
+ if (!m.static && m.type == "attribute" && I.array.is_json_type(m.idlType)) {
+ map.set(m.name, m.idlType);
+ }
+ });
+ } else if (I.has_to_json_regular_operation()) {
+ isDefault = false;
+ }
+ });
+ return isDefault ? map : null;
+};
+
+/**
+ * Traverses inherited interfaces from the top down
+ * and imeplemented interfaces inside out.
+ * Invokes |callback| on each interface.
+ *
+ * This is an abstract implementation of the traversal
+ * algorithm specified in:
+ * https://heycam.github.io/webidl/#collect-attribute-values
+ * Given the following inheritance tree:
+ *
+ * F
+ * |
+ * C E - I
+ * | |
+ * B - D
+ * |
+ * G - A - H - J
+ *
+ * Invoking traverse_inherited_and_consequential_interfaces() on A
+ * would traverse the tree in the following order:
+ * C -> B -> F -> E -> I -> D -> A -> G -> H -> J
+ */
+
+IdlInterface.prototype.traverse_inherited_and_consequential_interfaces = function(callback) {
+ if (typeof callback != "function") {
+ throw new TypeError();
+ }
+ var stack = this.get_inheritance_stack();
+ _traverse_inherited_and_consequential_interfaces(stack, callback);
+};
+
+function _traverse_inherited_and_consequential_interfaces(stack, callback) {
+ var I = stack.pop();
+ callback(I);
+ var mixins = I.array["implements"][I.name];
+ if (mixins) {
+ mixins.forEach(function(id) {
+ var mixin = I.array.members[id];
+ if (!mixin) {
+ throw new Error("Interface " + id + " not found (implemented by " + I.name + ")");
+ }
+ var interfaces = mixin.get_inheritance_stack();
+ _traverse_inherited_and_consequential_interfaces(interfaces, callback);
+ });
+ }
+ if (stack.length > 0) {
+ _traverse_inherited_and_consequential_interfaces(stack, callback);
+ }
+}
+
IdlInterface.prototype.test = function()
//@{
{
@@ -1079,6 +1327,14 @@ IdlInterface.prototype.test_self = function()
// "Otherwise, if A is declared with the [LegacyArrayClass] extended
// attribute, then return %ArrayPrototype%.
// "Otherwise, return %ObjectPrototype%.
+ //
+ // "In the ECMAScript binding, the DOMException type has some additional
+ // requirements:
+ //
+ // "Unlike normal interface types, the interface prototype object
+ // for DOMException must have as its [[Prototype]] the intrinsic
+ // object %ErrorPrototype%."
+ //
if (this.name === "Window") {
assert_class_string(Object.getPrototypeOf(self[this.name].prototype),
'WindowProperties',
@@ -1095,6 +1351,9 @@ IdlInterface.prototype.test_self = function()
} else if (this.has_extended_attribute('LegacyArrayClass')) {
inherit_interface = 'Array';
inherit_interface_has_interface_object = true;
+ } else if (this.name === "DOMException") {
+ inherit_interface = 'Error';
+ inherit_interface_has_interface_object = true;
} else {
inherit_interface = 'Object';
inherit_interface_has_interface_object = true;
@@ -1137,81 +1396,14 @@ IdlInterface.prototype.test_self = function()
}
}.bind(this), this.name + " interface: existence and properties of interface prototype object");
- if (this.is_global() && typeof Object.setPrototypeOf === "function") {
- // These functions test WebIDL as of 2017-06-06.
- // https://heycam.github.io/webidl/#platform-object-setprototypeof
- test(function() {
- var originalValue = Object.getPrototypeOf(self[this.name].prototype);
- var newValue = Object.create(null);
-
- assert_throws(new TypeError(), function() {
- Object.setPrototypeOf(self[this.name].prototype, newValue);
- });
-
- assert_equals(
- Object.getPrototypeOf(self[this.name].prototype),
- originalValue,
- "original value not modified"
- );
- }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
- "of global platform object - setting to a new value via Object.setPrototypeOf " +
- "should throw a TypeError");
-
- test(function() {
- var originalValue = Object.getPrototypeOf(self[this.name].prototype);
- var newValue = Object.create(null);
-
- assert_throws(new TypeError(), function() {
- self[this.name].prototype.__proto__ = newValue;
- });
-
- assert_equals(
- Object.getPrototypeOf(self[this.name].prototype),
- originalValue,
- "original value not modified"
- );
- }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
- "of global platform object - setting to a new value via __proto__ " +
- "should throw a TypeError");
-
- test(function() {
- var originalValue = Object.getPrototypeOf(self[this.name].prototype);
- var newValue = Object.create(null);
-
- assert_false(Reflect.setPrototypeOf(self[this.name].prototype.__proto__, newValue));
-
- assert_equals(
- Object.getPrototypeOf(self[this.name].prototype),
- originalValue,
- "original value not modified"
- );
- }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
- "of global platform object - setting to a new value via Reflect.setPrototypeOf " +
- "should return false");
-
- test(function() {
- var originalValue = Object.getPrototypeOf(self[this.name].prototype);
-
- Object.setPrototypeOf(self[this.name].prototype, originalValue);
- }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
- "of global platform object - setting to its original value via Object.setPrototypeOf " +
- "should not throw");
-
- test(function() {
- var originalValue = Object.getPrototypeOf(self[this.name].prototype);
-
- self[this.name].prototype.__proto__ = originalValue;
- }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
- "of global platform object - setting to its original value via __proto__ " +
- "should not throw");
-
- test(function() {
- var originalValue = Object.getPrototypeOf(self[this.name].prototype);
-
- assert_true(Reflect.setPrototypeOf(self[this.name].prototype, originalValue));
- }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
- "of global platform object - setting to its original value via Reflect.setPrototypeOf " +
- "should return true");
+ // "If the interface is declared with the [Global] or [PrimaryGlobal]
+ // extended attribute, or the interface is in the set of inherited
+ // interfaces for any other interface that is declared with one of these
+ // attributes, then the interface prototype object must be an immutable
+ // prototype exotic object."
+ // https://heycam.github.io/webidl/#interface-prototype-object
+ if (this.is_global()) {
+ this.test_immutable_prototype("interface prototype object", self[this.name].prototype);
}
test(function()
@@ -1251,6 +1443,110 @@ IdlInterface.prototype.test_self = function()
};
//@}
+IdlInterface.prototype.test_immutable_prototype = function(type, obj)
+//@{
+{
+ if (typeof Object.setPrototypeOf !== "function") {
+ return;
+ }
+
+ test(function(t) {
+ var originalValue = Object.getPrototypeOf(obj);
+ var newValue = Object.create(null);
+
+ t.add_cleanup(function() {
+ try {
+ Object.setPrototypeOf(obj, originalValue);
+ } catch (err) {}
+ });
+
+ assert_throws(new TypeError(), function() {
+ Object.setPrototypeOf(obj, newValue);
+ });
+
+ assert_equals(
+ Object.getPrototypeOf(obj),
+ originalValue,
+ "original value not modified"
+ );
+ }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
+ "of " + type + " - setting to a new value via Object.setPrototypeOf " +
+ "should throw a TypeError");
+
+ test(function(t) {
+ var originalValue = Object.getPrototypeOf(obj);
+ var newValue = Object.create(null);
+
+ t.add_cleanup(function() {
+ var setter = Object.getOwnPropertyDescriptor(
+ Object.prototype, '__proto__'
+ ).set;
+
+ try {
+ setter.call(obj, originalValue);
+ } catch (err) {}
+ });
+
+ assert_throws(new TypeError(), function() {
+ obj.__proto__ = newValue;
+ });
+
+ assert_equals(
+ Object.getPrototypeOf(obj),
+ originalValue,
+ "original value not modified"
+ );
+ }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
+ "of " + type + " - setting to a new value via __proto__ " +
+ "should throw a TypeError");
+
+ test(function(t) {
+ var originalValue = Object.getPrototypeOf(obj);
+ var newValue = Object.create(null);
+
+ t.add_cleanup(function() {
+ try {
+ Reflect.setPrototypeOf(obj, originalValue);
+ } catch (err) {}
+ });
+
+ assert_false(Reflect.setPrototypeOf(obj, newValue));
+
+ assert_equals(
+ Object.getPrototypeOf(obj),
+ originalValue,
+ "original value not modified"
+ );
+ }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
+ "of " + type + " - setting to a new value via Reflect.setPrototypeOf " +
+ "should return false");
+
+ test(function() {
+ var originalValue = Object.getPrototypeOf(obj);
+
+ Object.setPrototypeOf(obj, originalValue);
+ }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
+ "of " + type + " - setting to its original value via Object.setPrototypeOf " +
+ "should not throw");
+
+ test(function() {
+ var originalValue = Object.getPrototypeOf(obj);
+
+ obj.__proto__ = originalValue;
+ }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
+ "of " + type + " - setting to its original value via __proto__ " +
+ "should not throw");
+
+ test(function() {
+ var originalValue = Object.getPrototypeOf(obj);
+
+ assert_true(Reflect.setPrototypeOf(obj, originalValue));
+ }.bind(this), this.name + " interface: internal [[SetPrototypeOf]] method " +
+ "of " + type + " - setting to its original value via Reflect.setPrototypeOf " +
+ "should return true");
+};
+
+//@}
IdlInterface.prototype.test_member_const = function(member)
//@{
{
@@ -1405,7 +1701,7 @@ IdlInterface.prototype.test_member_operation = function(member)
{
var a_test = async_test(this.name + " interface: operation " + member.name +
"(" + member.arguments.map(
- function(m) {return m.idlType.idlType; } )
+ function(m) {return m.idlType.idlType; } ).join(", ")
+")");
a_test.step(function()
{
@@ -1551,6 +1847,29 @@ IdlInterface.prototype.add_iterable_members = function(member)
{ name: "thisValue", idlType: {idlType: "any"}, optional: true}]}));
};
+IdlInterface.prototype.test_to_json_operation = function(memberHolderObject, member) {
+ if (member.has_extended_attribute("Default")) {
+ var map = this.default_to_json_operation();
+ test(function() {
+ var json = memberHolderObject.toJSON();
+ map.forEach(function(type, k) {
+ assert_true(k in json, "property " + JSON.stringify(k) + " should be present in the output of " + this.name + ".prototype.toJSON()");
+ var descriptor = Object.getOwnPropertyDescriptor(json, k);
+ assert_true(descriptor.writable, "property " + k + " should be writable");
+ assert_true(descriptor.configurable, "property " + k + " should be configurable");
+ assert_true(descriptor.enumerable, "property " + k + " should be enumerable");
+ this.array.assert_type_is(json[k], type);
+ delete json[k];
+ }, this);
+ }.bind(this), "Test default toJSON operation of " + this.name);
+ } else {
+ test(function() {
+ assert_true(this.array.is_json_type(member.idlType), JSON.stringify(member.idlType) + " is not an appropriate return value for the toJSON operation of " + this.name);
+ this.array.assert_type_is(memberHolderObject.toJSON(), member.idlType);
+ }.bind(this), "Test toJSON operation of " + this.name);
+ }
+};
+
//@}
IdlInterface.prototype.test_member_iterable = function(member)
//@{
@@ -1742,6 +2061,7 @@ IdlInterface.prototype.test_object = function(desc)
: "object";
this.test_primary_interface_of(desc, obj, exception, expected_typeof);
+
var current_interface = this;
while (current_interface)
{
@@ -1769,6 +2089,18 @@ IdlInterface.prototype.test_primary_interface_of = function(desc, obj, exception
return;
}
+ // "The internal [[SetPrototypeOf]] method of every platform object that
+ // implements an interface with the [Global] or [PrimaryGlobal] extended
+ // attribute must execute the same algorithm as is defined for the
+ // [[SetPrototypeOf]] internal method of an immutable prototype exotic
+ // object."
+ // https://heycam.github.io/webidl/#platform-object-setprototypeof
+ if (this.is_global())
+ {
+ this.test_immutable_prototype("global platform object", obj);
+ }
+
+
// We can't easily test that its prototype is correct if there's no
// interface object, or the object is from a different global environment
// (not instanceof Object). TODO: test in this case that its prototype at
@@ -1858,6 +2190,11 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
|| member.type == "operation")
&& member.name)
{
+ var described_name = member.name;
+ if (member.type == "operation")
+ {
+ described_name += "(" + member.arguments.map(arg => arg.idlType.idlType).join(", ") + ")";
+ }
test(function()
{
assert_equals(exception, null, "Unexpected exception when evaluating object");
@@ -1897,7 +2234,7 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
assert_equals(typeof obj[member.name], "function");
}
}
- }.bind(this), this.name + " interface: " + desc + ' must inherit property "' + member.name + '" with the proper type (' + i + ')');
+ }.bind(this), this.name + " interface: " + desc + ' must inherit property "' + described_name + '" with the proper type');
}
// TODO: This is wrong if there are multiple operations with the same
// identifier.
@@ -1905,22 +2242,25 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
if (member.type == "operation" && member.name && member.arguments.length)
{
var a_test = async_test( this.name + " interface: calling " + member.name +
- "(" + member.arguments.map(function(m) { return m.idlType.idlType; }) +
+ "(" + member.arguments.map(function(m) { return m.idlType.idlType; }).join(", ") +
") on " + desc + " with too few arguments must throw TypeError");
a_test.step(function()
{
assert_equals(exception, null, "Unexpected exception when evaluating object");
assert_equals(typeof obj, expected_typeof, "wrong typeof object");
+ var fn;
if (!member["static"]) {
if (!this.is_global() && !member.isUnforgeable) {
assert_inherits(obj, member.name);
} else {
assert_own_property(obj, member.name);
}
+ fn = obj[member.name];
}
else
{
- assert_false(member.name in obj);
+ assert_own_property(obj.constructor, member.name, "interface object must have static operation as own property");
+ fn = obj.constructor[member.name];
}
var minLength = minOverloadLength(this.members.filter(function(m) {
@@ -1929,7 +2269,7 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
var args = [];
var cb = awaitNCallbacks(minLength, a_test.done.bind(a_test));
for (var i = 0; i < minLength; i++) {
- throwOrReject(a_test, member, obj[member.name], obj, args, "Called with " + i + " arguments", cb);
+ throwOrReject(a_test, member, fn, obj, args, "Called with " + i + " arguments", cb);
args.push(create_suitable_object(member.arguments[i].idlType));
}
@@ -1938,6 +2278,10 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
}
}.bind(this));
}
+
+ if (member.is_to_json_regular_operation()) {
+ this.test_to_json_operation(obj, member);
+ }
}
};
@@ -1945,6 +2289,11 @@ IdlInterface.prototype.test_interface_of = function(desc, obj, exception, expect
IdlInterface.prototype.has_stringifier = function()
//@{
{
+ if (this.name === "DOMException") {
+ // toString is inherited from Error, so don't assume we have the
+ // default stringifer
+ return true;
+ }
if (this.members.some(function(member) { return member.stringifier; })) {
return true;
}
@@ -2096,6 +2445,10 @@ function IdlInterfaceMember(obj)
//@}
IdlInterfaceMember.prototype = Object.create(IdlObject.prototype);
+IdlInterfaceMember.prototype.is_to_json_regular_operation = function() {
+ return this.type == "operation" && !this.static && this.name == "toJSON";
+};
+
/// Internal helper functions ///
function create_suitable_object(type)
//@{
diff --git a/tests/wpt/web-platform-tests/resources/idlharness.js.headers b/tests/wpt/web-platform-tests/resources/idlharness.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/idlharness.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/resources/sriharness.js b/tests/wpt/web-platform-tests/resources/sriharness.js
new file mode 100644
index 00000000000..9d7fa76a7d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/sriharness.js
@@ -0,0 +1,100 @@
+var SRIScriptTest = function(pass, name, src, integrityValue, crossoriginValue, nonce) {
+ this.pass = pass;
+ this.name = "Script: " + name;
+ this.src = src;
+ this.integrityValue = integrityValue;
+ this.crossoriginValue = crossoriginValue;
+ this.nonce = nonce;
+}
+
+SRIScriptTest.prototype.execute = function() {
+ var test = async_test(this.name);
+ var e = document.createElement("script");
+ e.src = this.src;
+ e.setAttribute("integrity", this.integrityValue);
+ if(this.crossoriginValue) {
+ e.setAttribute("crossorigin", this.crossoriginValue);
+ }
+ if(this.nonce) {
+ e.setAttribute("nonce", this.nonce);
+ }
+ if(this.pass) {
+ e.addEventListener("load", function() {test.done()});
+ e.addEventListener("error", function() {
+ test.step(function(){ assert_unreached("Good load fired error handler.") })
+ });
+ } else {
+ e.addEventListener("load", function() {
+ test.step(function() { assert_unreached("Bad load succeeded.") })
+ });
+ e.addEventListener("error", function() {test.done()});
+ }
+ document.body.appendChild(e);
+};
+
+// <link> tests
+// Style tests must be done synchronously because they rely on the presence
+// and absence of global style, which can affect later tests. Thus, instead
+// of executing them one at a time, the style tests are implemented as a
+// queue that builds up a list of tests, and then executes them one at a
+// time.
+var SRIStyleTest = function(queue, pass, name, attrs, customCallback, altPassValue) {
+ this.pass = pass;
+ this.name = "Style: " + name;
+ this.customCallback = customCallback || function () {};
+ this.attrs = attrs || {};
+ this.passValue = altPassValue || "rgb(255, 255, 0)";
+
+ this.test = async_test(this.name);
+
+ this.queue = queue;
+ this.queue.push(this);
+}
+
+SRIStyleTest.prototype.execute = function() {
+ var that = this;
+ var container = document.getElementById("container");
+ while (container.hasChildNodes()) {
+ container.removeChild(container.firstChild);
+ }
+
+ var test = this.test;
+
+ var div = document.createElement("div");
+ div.className = "testdiv";
+ var e = document.createElement("link");
+ this.attrs.rel = this.attrs.rel || "stylesheet";
+ for (var key in this.attrs) {
+ if (this.attrs.hasOwnProperty(key)) {
+ e.setAttribute(key, this.attrs[key]);
+ }
+ }
+
+ if(this.pass) {
+ e.addEventListener("load", function() {
+ test.step(function() {
+ var background = window.getComputedStyle(div, null).getPropertyValue("background-color");
+ assert_equals(background, that.passValue);
+ test.done();
+ });
+ });
+ e.addEventListener("error", function() {
+ test.step(function(){ assert_unreached("Good load fired error handler.") })
+ });
+ } else {
+ e.addEventListener("load", function() {
+ test.step(function() { assert_unreached("Bad load succeeded.") })
+ });
+ e.addEventListener("error", function() {
+ test.step(function() {
+ var background = window.getComputedStyle(div, null).getPropertyValue("background-color");
+ assert_not_equals(background, that.passValue);
+ test.done();
+ });
+ });
+ }
+ container.appendChild(div);
+ container.appendChild(e);
+ this.customCallback(e, container);
+};
+
diff --git a/tests/wpt/web-platform-tests/resources/test/README.md b/tests/wpt/web-platform-tests/resources/test/README.md
index 3a912a76ab5..1010516ad8e 100644
--- a/tests/wpt/web-platform-tests/resources/test/README.md
+++ b/tests/wpt/web-platform-tests/resources/test/README.md
@@ -16,6 +16,12 @@ by executing the following command from this directory:
tox
+Currently, the tests should be run with Firefox Nightly.
+
+In order to specify the path to Firefox Nightly, use the following command-line option:
+
+ tox -- --binary=/path/to/FirefoxNightly
+
## Authoring Tests
Test cases are expressed as `.html` files located within the `tests/`
diff --git a/tests/wpt/web-platform-tests/resources/test/conftest.py b/tests/wpt/web-platform-tests/resources/test/conftest.py
index cb119632664..047ca1caed2 100644
--- a/tests/wpt/web-platform-tests/resources/test/conftest.py
+++ b/tests/wpt/web-platform-tests/resources/test/conftest.py
@@ -13,12 +13,15 @@ HERE = os.path.dirname(os.path.abspath(__file__))
WPT_ROOT = os.path.normpath(os.path.join(HERE, '..', '..'))
HARNESS = os.path.join(HERE, 'harness.html')
+def pytest_addoption(parser):
+ parser.addoption("--binary", action="store", default=None, help="path to browser binary")
+
def pytest_collect_file(path, parent):
if path.ext.lower() == '.html':
return HTMLItem(str(path), parent)
def pytest_configure(config):
- config.driver = webdriver.Firefox()
+ config.driver = webdriver.Firefox(firefox_binary=config.getoption("--binary"))
config.server = WPTServer(WPT_ROOT)
config.server.start()
config.add_cleanup(lambda: config.server.stop())
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/add_cleanup_count.html b/tests/wpt/web-platform-tests/resources/test/tests/add_cleanup_count.html
new file mode 100644
index 00000000000..a079c9b879b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/add_cleanup_count.html
@@ -0,0 +1,41 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>Test#add_cleanup reported count</title>
+<script src="../../testharness.js"></script>
+<script src="../../testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+
+<script>
+promise_test(function(t) {
+ t.add_cleanup(function() {});
+ t.add_cleanup(function() {});
+ t.add_cleanup(function() { throw new Error(); });
+ new EventWatcher(t, document.body, []);
+
+ return Promise.resolve();
+}, 'test with 3 user-defined cleanup functions');
+</script>
+<script type="text/json" id="expected">
+{
+ "summarized_status": {
+ "status_string": "ERROR",
+ "message": "Test named 'test with 3 user-defined cleanup functions' specified 3 'cleanup' functions, and 1 failed.",
+ "stack": null
+ },
+ "summarized_tests": [
+ {
+ "status_string": "PASS",
+ "name": "test with 3 user-defined cleanup functions",
+ "stack": null,
+ "message": null,
+ "properties": {}
+ }
+ ],
+ "type": "complete"
+}
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/api-tests-1.html b/tests/wpt/web-platform-tests/resources/test/tests/api-tests-1.html
index 454189b323c..53d91c479a2 100644
--- a/tests/wpt/web-platform-tests/resources/test/tests/api-tests-1.html
+++ b/tests/wpt/web-platform-tests/resources/test/tests/api-tests-1.html
@@ -68,12 +68,48 @@
}
test(basicAssertArrayEquals, "basic assert_array_equals test");
+ function assertArrayEqualsUndefined()
+ {
+ assert_array_equals(undefined, [1], "undefined equals [1]?");
+ }
+ test(assertArrayEqualsUndefined, "assert_array_equals with first param undefined");
+
+ function assertArrayEqualsTrue()
+ {
+ assert_array_equals(true, [1], "true equals [1]?");
+ }
+ test(assertArrayEqualsTrue, "assert_array_equals with first param true");
+
+ function assertArrayEqualsFalse()
+ {
+ assert_array_equals(false, [1], "false equals [1]?");
+ }
+ test(assertArrayEqualsFalse, "assert_array_equals with first param false");
+
+ function assertArrayEqualsNull()
+ {
+ assert_array_equals(null, [1], "null equals [1]?");
+ }
+ test(assertArrayEqualsNull, "assert_array_equals with first param null");
+
+ function assertArrayEqualsNumeric()
+ {
+ assert_array_equals(1, [1], "1 equals [1]?");
+ }
+ test(assertArrayEqualsNumeric, "assert_array_equals with first param 1");
+
function basicAssertObjectEquals()
{
assert_object_equals([1, 2, [1, 2]], { 0: 1, 1: 2, 2: { 0: 1, 1: 2} }, "array is equal to object")
}
test(basicAssertObjectEquals, "basic assert_object_equals test");
+ function basicAssertArrayApproxEquals()
+ {
+ assert_array_approx_equals([10, 11], [11, 10], 1, "[10, 11] is approximately (+/- 1) [11, 10]")
+ }
+ test(basicAssertArrayApproxEquals, "basic assert_array_approx_equals test");
+
function basicAssertApproxEquals()
{
assert_approx_equals(10, 11, 1, "10 is approximately (+/- 1) 11")
@@ -240,6 +276,41 @@
"properties": {}
},
{
+ "status_string": "FAIL",
+ "name": "assert_array_equals with first param 1",
+ "stack": "(implementation-defined)",
+ "message": "assert_array_equals: 1 equals [1]? value is 1, expected array",
+ "properties": {}
+ },
+ {
+ "status_string": "FAIL",
+ "name": "assert_array_equals with first param false",
+ "stack": "(implementation-defined)",
+ "message": "assert_array_equals: false equals [1]? value is false, expected array",
+ "properties": {}
+ },
+ {
+ "status_string": "FAIL",
+ "name": "assert_array_equals with first param null",
+ "stack": "(implementation-defined)",
+ "message": "assert_array_equals: null equals [1]? value is null, expected array",
+ "properties": {}
+ },
+ {
+ "status_string": "FAIL",
+ "name": "assert_array_equals with first param true",
+ "stack": "(implementation-defined)",
+ "message": "assert_array_equals: true equals [1]? value is true, expected array",
+ "properties": {}
+ },
+ {
+ "status_string": "FAIL",
+ "name": "assert_array_equals with first param undefined",
+ "stack": "(implementation-defined)",
+ "message": "assert_array_equals: undefined equals [1]? value is undefined, expected array",
+ "properties": {}
+ },
+ {
"status_string": "PASS",
"name": "assert_equals tests",
"stack": null,
@@ -298,12 +369,19 @@
}
},
{
- "status_string": "PASS",
- "name": "basic assert_approx_equals test",
- "stack": null,
- "message": null,
+ "status_string": "PASS",
+ "name": "basic assert_approx_equals test",
+ "stack": null,
+ "message": null,
"properties": {}
- },
+ },
+ {
+ "status_string": "PASS",
+ "name": "basic assert_array_approx_equals test",
+ "stack": null,
+ "message": null,
+ "properties": {}
+ },
{
"status_string": "PASS",
"name": "basic assert_array_equals test",
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlArray/is_json_type.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlArray/is_json_type.html
new file mode 100644
index 00000000000..42f9dd52c29
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlArray/is_json_type.html
@@ -0,0 +1,195 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>IdlArray.prototype.is_json_type()</title>
+</head>
+<body>
+<div id="log"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="../helper.js"></script>
+<script>
+ "use strict";
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_true(idl.is_json_type(typeFrom("DOMString")));
+ assert_true(idl.is_json_type(typeFrom("ByteString")));
+ assert_true(idl.is_json_type(typeFrom("USVString")));
+ idl.add_untested_idls('enum BarEnum { "a", "b", "c" };');
+ assert_true(idl.is_json_type(typeFrom("BarEnum")));
+ }, 'should return true for all string types');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_false(idl.is_json_type(typeFrom("Error")));
+ assert_false(idl.is_json_type(typeFrom("DOMException")));
+ }, 'should return false for all exception types');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_false(idl.is_json_type(typeFrom("Int8Array")));
+ assert_false(idl.is_json_type(typeFrom("Int16Array")));
+ assert_false(idl.is_json_type(typeFrom("Int32Array")));
+ assert_false(idl.is_json_type(typeFrom("Uint8Array")));
+ assert_false(idl.is_json_type(typeFrom("Uint16Array")));
+ assert_false(idl.is_json_type(typeFrom("Uint32Array")));
+ assert_false(idl.is_json_type(typeFrom("Uint8ClampedArray")));
+ assert_false(idl.is_json_type(typeFrom("Float32Array")));
+ assert_false(idl.is_json_type(typeFrom("ArrayBuffer")));
+ assert_false(idl.is_json_type(typeFrom("DataView")));
+ }, 'should return false for all buffer source types');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_true(idl.is_json_type(typeFrom("boolean")));
+ }, 'should return true for boolean');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_true(idl.is_json_type(typeFrom("byte")));
+ assert_true(idl.is_json_type(typeFrom("octet")));
+ assert_true(idl.is_json_type(typeFrom("short")));
+ assert_true(idl.is_json_type(typeFrom("unsigned short")));
+ assert_true(idl.is_json_type(typeFrom("long")));
+ assert_true(idl.is_json_type(typeFrom("unsigned long")));
+ assert_true(idl.is_json_type(typeFrom("long long")));
+ assert_true(idl.is_json_type(typeFrom("unsigned long long")));
+ assert_true(idl.is_json_type(typeFrom("float")));
+ assert_true(idl.is_json_type(typeFrom("unrestricted float")));
+ assert_true(idl.is_json_type(typeFrom("double")));
+ assert_true(idl.is_json_type(typeFrom("unrestricted double")));
+ }, 'should return true for all numeric types');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_false(idl.is_json_type(typeFrom("Promise<DOMString>")));
+ }, 'should return false for promises');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_false(idl.is_json_type(typeFrom("sequence<DOMException>")));
+ assert_true(idl.is_json_type(typeFrom("sequence<DOMString>")));
+ }, 'should handle sequences according to their inner types');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_false(idl.is_json_type(typeFrom("FrozenArray<DOMException>")));
+ assert_true(idl.is_json_type(typeFrom("FrozenArray<DOMString>")));
+ }, 'should handle frozen arrays according to their inner types');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_true(idl.is_json_type(typeFrom("record<DOMString, DOMString>")));
+ assert_false(idl.is_json_type(typeFrom("record<DOMString, Error>")));
+ }, 'should handle records according to their inner types');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_true(idl.is_json_type(typeFrom("object")));
+ }, 'should return true for object type');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_false(idl.is_json_type(typeFrom("any")));
+ }, 'should return false for any type');
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_untested_idls('dictionary Foo { DOMString foo; }; dictionary Bar : Foo { DOMString bar; };');
+ assert_true(idl.is_json_type(typeFrom("Foo")));
+ assert_true(idl.is_json_type(typeFrom("Bar")));
+ }, 'should return true for dictionaries whose members are all JSON types');
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_untested_idls('dictionary Foo { };');
+ assert_true(idl.is_json_type(typeFrom("Foo")));
+ }, 'should return true for dictionaries which have no members');
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_untested_idls('dictionary FooBar { DOMString a; Error b; }; dictionary Baz : FooBar {};');
+ assert_false(idl.is_json_type(typeFrom("FooBar")));
+ assert_false(idl.is_json_type(typeFrom("Baz")));
+ }, 'should return false for dictionaries whose members are not all JSON types');
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_untested_idls('interface Foo { DOMString toJSON(); };');
+ assert_true(idl.is_json_type(typeFrom("Foo")));
+ }, 'should return true for interfaces which declare a toJSON operation');
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_untested_idls('interface Foo { DOMString toJSON(); }; interface Bar : Foo { };');
+ assert_true(idl.is_json_type(typeFrom("Bar")));
+ }, 'should return true for interfaces which inherit from an interface which declares a toJSON operation');
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_untested_idls('interface Foo { }; interface Bar { DOMString toJSON(); }; Foo implements Bar;');
+ assert_true(idl.is_json_type(typeFrom("Foo")));
+ }, 'should return true for interfaces which mixin an interface which declare a toJSON operation');
+
+// test(function() {
+// var idl = new IdlArray();
+// idl.add_untested_idls('interface Foo { }; interface Bar { }; interface Baz { DOMString toJSON(); }; Foo implements Bar; Bar implements Baz;');
+// assert_true(idl.is_json_type(typeFrom("Foo")));
+// }, 'should return true for interfaces which mixin an interface which itself mixes in an interface which declares a toJSON operation');
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_untested_idls('interface Foo { };');
+ assert_false(idl.is_json_type(typeFrom("Foo")));
+ }, 'should return false for interfaces which do not declare a toJSON operation');
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_untested_idls('interface Foo { object toJSON(); };');
+ assert_true(idl.is_json_type(typeFrom("(Foo or DOMString)")));
+ }, 'should return true for union types whose member types are JSON types');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_false(idl.is_json_type(typeFrom("(DataView or DOMString)")));
+ }, 'should return false for union types whose member types are not all JSON types');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_true(idl.is_json_type(typeFrom("DOMString?")));
+ assert_false(idl.is_json_type(typeFrom("DataView?")));
+ }, 'should consider the inner types of nullable types');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_true(idl.is_json_type(typeFrom("[XAttr] long")));
+ assert_false(idl.is_json_type(typeFrom("[XAttr] DataView")));
+ }, 'should consider the inner types of annotated types.');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_throws(new Error(), _ => idl.is_json_type(typeFrom("Foo")));
+ }, "should throw if it references a dictionary, enum or interface which wasn't added to the IdlArray");
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_untested_idls('interface Foo : Bar { };');
+ assert_throws(new Error(), _ => idl.is_json_type(typeFrom("Foo")));
+ }, "should throw for interfaces which inherit from another interface which wasn't added to the IdlArray");
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_true(idl.is_json_type(typedefFrom("typedef double DOMHighResTimeStamp;").idlType));
+ }, 'should return true for typedefs whose source type is a JSON type');
+
+ test(function() {
+ var idl = new IdlArray();
+ assert_false(idl.is_json_type(typedefFrom("typedef DataView DOMHighResTimeStamp;").idlType));
+ }, 'should return false for typedefs whose source type is not a JSON type');
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlDictionary/get_inheritance_stack.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlDictionary/get_inheritance_stack.html
new file mode 100644
index 00000000000..83863fb8d76
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlDictionary/get_inheritance_stack.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>IdlDictionary.prototype.get_inheritance_stack()</title>
+</head>
+<body>
+<div id="log"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="../helper.js"></script>
+<script>
+ "use strict";
+ test(function() {
+ var stack = dictionaryFrom('dictionary A { };').get_inheritance_stack();
+ assert_array_equals(stack.map(d => d.name), ["A"]);
+ }, 'should return an array that includes itself.');
+
+ test(function() {
+ var d = dictionaryFrom('dictionary A : B { };');
+ assert_throws(new Error(), _ => d.get_inheritance_stack());
+ }, "should throw for dictionaries which inherit from another dictionary which wasn't added to the IdlArray");
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_idls('dictionary A : B { };');
+ idl.add_untested_idls('dictionary B : C { }; dictionary C { };');
+ var A = idl.members["A"];
+ assert_array_equals(A.get_inheritance_stack().map(d => d.name), ["A", "B", "C"]);
+ }, 'should return an array of inherited dictionaries in order of inheritance, starting with itself.');
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/default_to_json_operation.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/default_to_json_operation.html
new file mode 100644
index 00000000000..a77ee3e7f1f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/default_to_json_operation.html
@@ -0,0 +1,189 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>IdlDictionary.prototype.default_to_json_operation()</title>
+</head>
+<body>
+<div id="log"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="../helper.js"></script>
+<pre id=fragments>
+ interface A : B {
+ attribute DOMString a;
+ };
+
+ interface B : C {
+ [Default] object toJSON();
+ attribute long b;
+ };
+
+ interface C {
+ attribute DOMString c;
+ };
+
+ interface D : E {
+ [Default] object toJSON();
+ attribute float d;
+ };
+
+ interface E : F {
+ attribute DOMString e;
+ };
+
+ interface F {
+ [Default] object toJSON();
+ attribute unrestricted double f;
+ };
+
+ interface G {
+ [Default] object toJSON();
+ attribute octet g;
+ };
+
+ interface H {
+ [Default] object toJSON();
+ attribute DOMString h;
+ };
+
+ interface I {
+ [Default] object toJSON();
+ attribute boolean i;
+ };
+
+ interface J {
+ [Default] object toJSON();
+ attribute D j;
+ };
+
+ A implements G;
+ A implements H;
+ B implements D;
+ E implements I;
+ H implements J;
+</pre>
+<script>
+ "use strict";
+ test(function() {
+ var map = interfaceFrom('interface A { [Default] object toJSON(); };').default_to_json_operation();
+ assert_equals(map.size, 0);
+ }, 'should return an empty map when there are no attributes');
+
+ test(function() {
+ var r = interfaceFrom('interface A { };').default_to_json_operation();
+ assert_equals(r, null);
+ }, 'should return null when there is no toJSON method');
+
+ test(function() {
+ var r = interfaceFrom('interface A { DOMString toJSON(); };').default_to_json_operation();
+ assert_equals(r, null);
+ }, 'should return null when there is a toJSON method but it does not have the [Default] extended attribute');
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls("interface A : B { DOMString toJSON(); };");
+ context.add_idls("interface B { [Default] object toJSON(); };");
+ var r = context.members.A.default_to_json_operation();
+ assert_equals(r, null);
+ }, 'should return null when there is a toJSON method but it does not have the [Default] extended attribute even if this extended attribute exists on inherited interfaces');
+
+ test(function() {
+ var map = interfaceFrom('interface A { [Default] object toJSON(); static attribute DOMString foo; };').default_to_json_operation();
+ assert_equals(map.size, 0);
+ }, 'should not include static attributes');
+
+ test(function() {
+ var map = interfaceFrom('interface A { [Default] object toJSON(); attribute Promise<DOMString> bar; };').default_to_json_operation();
+ assert_equals(map.size, 0);
+ }, 'should not include attributes which are not JSON types');
+
+ test(function() {
+ var map = interfaceFrom('interface A { [Default] object toJSON(); DOMString bar(); };').default_to_json_operation();
+ assert_equals(map.size, 0);
+ }, 'should not include operations');
+
+ test(function() {
+ var map = interfaceFrom('interface A { [Default] object toJSON(); attribute DOMString bar; };').default_to_json_operation();
+ assert_equals(map.size, 1);
+ assert_true(map.has("bar"));
+ assert_equals(map.get("bar").idlType, "DOMString");
+ }, 'should return a map whose key/value pair represent the identifier and IDL type of valid attributes');
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls("interface A : B { [Default] object toJSON(); attribute DOMString a; };");
+ context.add_idls("interface B { [Default] object toJSON(); attribute long b; };");
+ var map = context.members.A.default_to_json_operation();
+ assert_array_equals([...map.keys()], ["b", "a"]);
+ assert_array_equals([...map.values()].map(v => v.idlType), ["long", "DOMString"]);
+ }, 'should return a properly ordered map that contains IDL types of valid attributes for inherited interfaces');
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls("interface A : B { attribute DOMString a; };");
+ context.add_idls("interface B { [Default] object toJSON(); attribute long b; };");
+ var map = context.members.A.default_to_json_operation();
+ assert_equals(map.size, 1);
+ assert_true(map.has("b"));
+ assert_equals(map.get("b").idlType, "long");
+ assert_array_equals([...map.keys()], ["b"]);
+ }, 'should not include attributes of the current interface when the [Default] toJSON method in inherited');
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls("interface A : B { [Default] object toJSON(); };");
+ context.add_idls("interface B : C { [Default] object toJSON(); attribute DOMString foo; };");
+ context.add_idls("interface C { [Default] object toJSON(); attribute long foo; };");
+ var map = context.members.A.default_to_json_operation();
+ assert_equals(map.size, 1);
+ assert_true(map.has("foo"));
+ assert_equals(map.get("foo").idlType, "DOMString");
+ }, 'attributes declared further away in the inheritance hierarchy should be masked by attributes declared closer');
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls("interface A : B { [Default] object toJSON(); attribute DOMString a; };");
+ context.add_idls("interface B { object toJSON(); attribute long b; };");
+ var map = context.members.A.default_to_json_operation();
+ assert_equals(map.size, 1);
+ assert_true(map.has("a"));
+ assert_false(map.has("b"));
+ assert_equals(map.get("a").idlType, "DOMString");
+ }, 'should return an ordered map that ignores attributes of inherited interfaces which do not declare a [Default] toJSON operation.');
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls("interface A { [Default] object toJSON(); attribute DOMString a; };");
+ context.add_idls("interface N { [Default] object toJSON(); attribute long n; };");
+ context.add_idls("A implements N;");
+ var map = context.members.A.default_to_json_operation();
+ assert_array_equals([...map.keys()], ["a", "n"]);
+ assert_array_equals([...map.values()].map(v => v.idlType), ["DOMString", "long"]);
+ }, 'should return a properly ordered map that accounts for mixed-in interfaces which declare a [Default] toJSON operation.');
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls("interface A { [Default] object toJSON(); attribute DOMString a; };");
+ context.add_idls("interface N { attribute long n; };");
+ context.add_idls("A implements N;");
+ var map = context.members.A.default_to_json_operation();
+ assert_equals(map.size, 1);
+ assert_true(map.has("a"));
+ assert_false(map.has("n"));
+ assert_equals(map.get("a").idlType, "DOMString");
+ }, 'should return a properly ordered map that ignores mixed-in interfaces which do not declare a [Default] toJSON operation.');
+
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls(document.getElementById('fragments').textContent);
+ var map = context.members.A.default_to_json_operation();
+ assert_array_equals([...map.keys()], ["b", "f", "i", "d", "g", "h", "j"]);
+ assert_array_equals([...map.values()].map(v => v.idlType), ["long", "unrestricted double", "boolean", "float", "octet", "DOMString", "D"]);
+ }, 'should return a properly ordered map of name/type pairs handling inherited and consequential interfaces as specified.');
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/get_inheritance_stack.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/get_inheritance_stack.html
new file mode 100644
index 00000000000..c1d61415676
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/get_inheritance_stack.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>IdlInterface.prototype.get_inheritance_stack()</title>
+</head>
+<body>
+<div id="log"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="../helper.js"></script>
+<script>
+ "use strict";
+ test(function() {
+ var stack = interfaceFrom('interface A { };').get_inheritance_stack();
+ assert_array_equals(stack.map(i => i.name), ["A"]);
+ }, 'should return an array that includes itself.');
+
+ test(function() {
+ var i = interfaceFrom('interface A : B { };');
+ assert_throws(new Error(), _ => i.get_inheritance_stack());
+ }, "should throw for interfaces which inherit from another interface which wasn't added to the IdlArray");
+
+ test(function() {
+ var idl = new IdlArray();
+ idl.add_idls('interface A : B { };');
+ idl.add_untested_idls('interface B : C { }; interface C { };');
+ var A = idl.members["A"];
+ assert_array_equals(A.get_inheritance_stack().map(i => i.name), ["A", "B", "C"]);
+ }, 'should return an array of inherited interfaces in order of inheritance, starting with itself.');
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/has_default_to_json_regular_operation.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/has_default_to_json_regular_operation.html
new file mode 100644
index 00000000000..9498a3a7bce
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/has_default_to_json_regular_operation.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>IdlInterface.prototype.has_default_to_json_regular_operation()</title>
+</head>
+<body>
+<div id="log"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="../helper.js"></script>
+<script>
+ "use strict";
+ test(function() {
+ var i = interfaceFrom('interface A { };');
+ assert_false(i.has_default_to_json_regular_operation());
+ }, 'should return false when the interface declares no toJSON operation.');
+
+ test(function() {
+ var i = interfaceFrom('interface A { static object toJSON(); };');
+ assert_false(i.has_default_to_json_regular_operation());
+ }, 'should return false when the interface declares a static toJSON operation.');
+
+ test(function() {
+ var i = interfaceFrom('interface A { object toJSON(); };');
+ assert_false(i.has_default_to_json_regular_operation());
+ }, 'should return false when the interface declares a regular toJSON operation with no extended attribute.');
+
+ test(function() {
+ var i = interfaceFrom('interface A { [x] object toJSON(); };');
+ assert_false(i.has_default_to_json_regular_operation());
+ }, 'should return false when the interface declares a regular toJSON operation with another extented attribute.');
+
+ test(function() {
+ var i = interfaceFrom('interface A { [Default] object toJSON(); };');
+ assert_true(i.has_default_to_json_regular_operation());
+ }, 'should return true when the interface declares a regular toJSON operation with the [Default] extented attribute.');
+
+ test(function() {
+ var i = interfaceFrom('interface A { [Attr, AnotherAttr, Default] object toJSON(); };');
+ assert_true(i.has_default_to_json_regular_operation());
+ }, 'should return true when the interface declares a regular toJSON operation with multiple extended attributes, including [Default].');
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/has_to_json_regular_operation.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/has_to_json_regular_operation.html
new file mode 100644
index 00000000000..a4b4e91b538
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/has_to_json_regular_operation.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>IdlInterface.prototype.has_to_json_regular_operation()</title>
+</head>
+<body>
+<div id="log"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="../helper.js"></script>
+<script>
+ "use strict";
+ test(function() {
+ var i = interfaceFrom('interface A { };');
+ assert_false(i.has_to_json_regular_operation());
+ }, 'should return false when the interface declares no toJSON operation.');
+
+ test(function() {
+ var i = interfaceFrom('interface A { static object toJSON(); };');
+ assert_false(i.has_to_json_regular_operation());
+ }, 'should return false when the interface declares a static toJSON operation.');
+
+ test(function() {
+ var i = interfaceFrom('interface A { object toJSON(); };');
+ assert_true(i.has_to_json_regular_operation());
+ }, 'should return true when the interface declares a regular toJSON operation.');
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/test_immutable_prototype.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/test_immutable_prototype.html
new file mode 100644
index 00000000000..16214c4d24f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/test_immutable_prototype.html
@@ -0,0 +1,321 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>idlharness: Immutable prototypes</title>
+ <script src="../../../../testharness.js"></script>
+ <script src="../../../../testharnessreport.js"></script>
+ <script src="../../../../WebIDLParser.js"></script>
+ <script src="../../../../idlharness.js"></script>
+</head>
+<body>
+<script>
+"use strictt";
+
+Object.defineProperty(window, "Foo", {
+ enumerable: false,
+ writable: true,
+ configurable: true,
+ value: function Foo() {}
+ });
+Object.defineProperty(window.Foo, "prototype", {
+ writable: false,
+ value: window.Foo.prototype
+ });
+Foo.prototype[Symbol.toStringTag] = "Foo";
+
+var idlArray = new IdlArray();
+idlArray.add_untested_idls("interface EventTarget {};");
+idlArray.add_idls(
+ "[Global=Window, Exposed=Window]\n" +
+ "interface Window : EventTarget {};\n" +
+
+ "[Global=Window, Exposed=Window, Constructor()]\n" +
+ "interface Foo {};"
+ );
+idlArray.add_objects({
+ Foo: ["new Foo()"],
+ Window: ["window"]
+});
+idlArray.test();
+</script>
+<script type="text/json" id="expected">
+{
+ "summarized_status": {
+ "message": null,
+ "status_string": "OK",
+ "stack": null
+ },
+ "summarized_tests": [
+ {
+ "name": "Foo interface object length",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo interface object name",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo interface: existence and properties of interface object",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo interface: existence and properties of interface prototype object",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo interface: existence and properties of interface prototype object's \"constructor\" property",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError",
+ "status_string": "FAIL",
+ "properties": {},
+ "message": "assert_throws: function \"function() {\n Object.setPrototypeOf(obj, newValue);\n }\" did not throw",
+ "stack": "(implementation-defined)"
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false",
+ "status_string": "FAIL",
+ "properties": {},
+ "message": "assert_false: expected false got true",
+ "stack": "(implementation-defined)"
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError",
+ "status_string": "FAIL",
+ "properties": {},
+ "message": "assert_throws: function \"function() {\n obj.__proto__ = newValue;\n }\" did not throw",
+ "stack": "(implementation-defined)"
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError",
+ "status_string": "FAIL",
+ "properties": {},
+ "message": "assert_throws: function \"function() {\n Object.setPrototypeOf(obj, newValue);\n }\" did not throw",
+ "stack": "(implementation-defined)"
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false",
+ "status_string": "FAIL",
+ "properties": {},
+ "message": "assert_false: expected false got true",
+ "stack": "(implementation-defined)"
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError",
+ "status_string": "FAIL",
+ "properties": {},
+ "message": "assert_throws: function \"function() {\n obj.__proto__ = newValue;\n }\" did not throw",
+ "stack": "(implementation-defined)"
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Foo must be primary interface of new Foo()",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Stringification of new Foo()",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Stringification of window",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface object length",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface object name",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: existence and properties of interface object",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: existence and properties of interface prototype object",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: existence and properties of interface prototype object's \"constructor\" property",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ },
+ {
+ "name": "Window must be primary interface of window",
+ "status_string": "PASS",
+ "properties": {},
+ "message": null,
+ "stack": null
+ }
+ ],
+ "type": "complete"
+}
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/test_to_json_operation.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/test_to_json_operation.html
new file mode 100644
index 00000000000..18fc3193ff8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/test_to_json_operation.html
@@ -0,0 +1,190 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>IdlInterface.prototype.test_to_json_operation()</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="/resources/WebIDLParser.js"></script>
+ <script src="/resources/idlharness.js"></script>
+ <script src="../helper.js"></script>
+</head>
+<body>
+<script>
+ "use strict";
+ function wrap(obj) {
+ function F(obj) {
+ this._obj = obj;
+ }
+
+ F.prototype.toJSON = function() {
+ return this._obj;
+ }
+
+ return new F(obj);
+ }
+
+ var i, obj;
+ i = interfaceFrom("interface A { [Default] object toJSON(); attribute long foo; };");
+ i.test_to_json_operation(wrap({ foo: 123 }), i.members[0]);
+
+ // should fail (wrong type)
+ i = interfaceFrom("interface B { [Default] object toJSON(); attribute long foo; };");
+ i.test_to_json_operation(wrap({ foo: "a value" }), i.members[0]);
+
+ // should handle extraneous attributes (e.g. from an extension specification)
+ i = interfaceFrom("interface C { [Default] object toJSON(); attribute long foo; };");
+ i.test_to_json_operation(wrap({ foo: 123, bar: 456 }), i.members[0]);
+
+ // should fail (missing property)
+ i = interfaceFrom("interface D { [Default] object toJSON(); attribute long foo; };");
+ i.test_to_json_operation(wrap({ }), i.members[0]);
+
+ // should fail (should be writable)
+ obj = Object.defineProperties({}, { foo: {
+ writable: false,
+ enumerable: true,
+ configurable: true,
+ value: 123
+ }});
+ i = interfaceFrom("interface F { [Default] object toJSON(); attribute long foo; };");
+ i.test_to_json_operation(wrap(obj), i.members[0]);
+
+ // should fail (should be enumerable)
+ obj = Object.defineProperties({}, { foo: {
+ writable: true,
+ enumerable: false,
+ configurable: true,
+ value: 123
+ }});
+ i = interfaceFrom("interface G { [Default] object toJSON(); attribute long foo; };");
+ i.test_to_json_operation(wrap(obj), i.members[0]);
+
+ // should fail (should be configurable)
+ obj = Object.defineProperties({}, { foo: {
+ writable: true,
+ enumerable: true,
+ configurable: false,
+ value: 123
+ }});
+ i = interfaceFrom("interface H { [Default] object toJSON(); attribute long foo; };");
+ i.test_to_json_operation(wrap(obj), i.members[0]);
+
+ var idl = new IdlArray();
+ idl.add_idls("interface I : J { [Default] object toJSON(); attribute long foo; };");
+ idl.add_idls("interface J { [Default] object toJSON(); attribute DOMString foo;};");
+ var i = idl.members.I;
+ i.test_to_json_operation(wrap({ foo: 123 }), i.members[0]);
+
+ i = interfaceFrom("interface K { [Default] object toJSON(); };");
+ i.test_to_json_operation(wrap({}), i.members[0]);
+
+ i = interfaceFrom("interface L { DOMString toJSON(); };");
+ i.test_to_json_operation(wrap("a string"), i.members[0]);
+
+ // should fail (wrong output type)
+ i = interfaceFrom("interface M { DOMString toJSON(); };");
+ i.test_to_json_operation(wrap({}), i.members[0]);
+
+ // should fail (not an IDL type)
+ i = interfaceFrom("interface N { DOMException toJSON(); };");
+ i.test_to_json_operation(wrap({}), i.members[0]);
+</script>
+<script type="text/json" id="expected">
+ {
+ "summarized_status": {
+ "message": null,
+ "stack": null,
+ "status_string": "OK"
+ },
+ "summarized_tests": [
+ {
+ "message": null,
+ "name": "Test default toJSON operation of A",
+ "properties": {},
+ "stack": null,
+ "status_string": "PASS"
+ },
+ {
+ "message": "assert_equals: expected \"number\" but got \"string\"",
+ "name": "Test default toJSON operation of B",
+ "properties": {},
+ "stack": "(implementation-defined)",
+ "status_string": "FAIL"
+ },
+ {
+ "message": null,
+ "name": "Test default toJSON operation of C",
+ "properties": {},
+ "stack": null,
+ "status_string": "PASS"
+ },
+ {
+ "message": "assert_true: property \"foo\" should be present in the output of D.prototype.toJSON() expected true got false",
+ "name": "Test default toJSON operation of D",
+ "properties": {},
+ "stack": "(implementation-defined)",
+ "status_string": "FAIL"
+ },
+ {
+ "message": "assert_true: property foo should be writable expected true got false",
+ "name": "Test default toJSON operation of F",
+ "properties": {},
+ "stack": "(implementation-defined)",
+ "status_string": "FAIL"
+ },
+ {
+ "message": "assert_true: property foo should be enumerable expected true got false",
+ "name": "Test default toJSON operation of G",
+ "properties": {},
+ "stack": "(implementation-defined)",
+ "status_string": "FAIL"
+ },
+ {
+ "message": "assert_true: property foo should be configurable expected true got false",
+ "name": "Test default toJSON operation of H",
+ "properties": {},
+ "stack": "(implementation-defined)",
+ "status_string": "FAIL"
+ },
+ {
+ "message": null,
+ "name": "Test default toJSON operation of I",
+ "properties": {},
+ "stack": null,
+ "status_string": "PASS"
+ },
+ {
+ "message": null,
+ "name": "Test default toJSON operation of K",
+ "properties": {},
+ "stack": null,
+ "status_string": "PASS"
+ },
+ {
+ "message": null,
+ "name": "Test toJSON operation of L",
+ "properties": {},
+ "stack": null,
+ "status_string": "PASS"
+ },
+ {
+ "message": "assert_equals: expected \"string\" but got \"object\"",
+ "name": "Test toJSON operation of M",
+ "properties": {},
+ "stack": "(implementation-defined)",
+ "status_string": "FAIL"
+ },
+ {
+ "message": "assert_true: {\"sequence\":false,\"generic\":null,\"nullable\":false,\"array\":false,\"union\":false,\"idlType\":\"DOMException\"} is not an appropriate return value for the toJSON operation of N expected true got false",
+ "name": "Test toJSON operation of N",
+ "properties": {},
+ "stack": "(implementation-defined)",
+ "status_string": "FAIL"
+ }
+ ],
+ "type": "complete"
+ }
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/traverse_inherited_and_consequential_interfaces.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/traverse_inherited_and_consequential_interfaces.html
new file mode 100644
index 00000000000..1a192919af8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterface/traverse_inherited_and_consequential_interfaces.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>IdlDictionary.prototype.traverse_inherited_and_consequential_interfaces()</title>
+</head>
+<body>
+<div id="log"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="../helper.js"></script>
+<pre id=fragments>
+ interface A : B { };
+ interface B : C { };
+ interface C { };
+ interface D : E { };
+ interface E : F { };
+ interface F { };
+ interface G { };
+ interface H { };
+ interface I { };
+ interface J { };
+
+ A implements G;
+ A implements H;
+ B implements D;
+ E implements I;
+ H implements J;
+</pre>
+<script>
+ "use strict";
+ test(function() {
+ var interfaces = [];
+ interfaceFrom('interface A { };').traverse_inherited_and_consequential_interfaces(function(i) {
+ interfaces.push(i.name);
+ });
+ assert_array_equals(interfaces, ["A"]);
+ }, 'should return an array that includes itself.');
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls("interface A { }; A implements B;");
+ assert_throws(new Error(), _ => context.members["A"].traverse_inherited_and_consequential_interfaces(function() {}));
+ }, "should throw for interfaces which are extended by another interface which wasn't added to the IdlArray.");
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls("interface A { };");
+ assert_throws(new TypeError(), _ => context.members["A"].traverse_inherited_and_consequential_interfaces());
+ }, "should throw if not passed a callback");
+
+ test(function() {
+ var context = new IdlArray();
+ context.add_idls(document.getElementById('fragments').textContent);
+ var interfaces = [];
+ context.members["A"].traverse_inherited_and_consequential_interfaces(function(i) {
+ interfaces.push(i.name);
+ });
+ assert_array_equals(interfaces, ["C", "B", "F", "E", "I", "D", "A", "G", "H", "J"]);
+ }, 'should return an array that includes the identifier of the interfaces in the correct order.');
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterfaceMember/is_to_json_regular_operation.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterfaceMember/is_to_json_regular_operation.html
new file mode 100644
index 00000000000..ac923dd5a8f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/IdlInterfaceMember/is_to_json_regular_operation.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>IdlInterfaceMember.prototype.is_to_json_regular_operation()</title>
+</head>
+<body>
+<div id="log"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="../helper.js"></script>
+<script>
+ "use strict";
+ test(function() {
+ var m = memberFrom("readonly attribute DOMString foo");
+ assert_false(m.is_to_json_regular_operation());
+ }, 'should return false when member is an attribute.');
+
+ test(function() {
+ var m = memberFrom("static void foo()");
+ assert_false(m.is_to_json_regular_operation());
+ }, 'should return false when member is a static operation.');
+
+ test(function() {
+ var m = memberFrom("static object toJSON()");
+ assert_false(m.is_to_json_regular_operation());
+ }, 'should return false when member is a static toJSON operation.');
+
+ test(function() {
+ var m = memberFrom("object toJSON()");
+ assert_true(m.is_to_json_regular_operation());
+ }, 'should return true when member is a regular toJSON operation.');
+
+ test(function() {
+ var m = memberFrom("[Foo] object toJSON()");
+ assert_true(m.is_to_json_regular_operation());
+ }, 'should return true when member is a regular toJSON operation with extensible attributes.');
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/OWNERS b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/OWNERS
new file mode 100644
index 00000000000..37e8095017c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/OWNERS
@@ -0,0 +1 @@
+@tobie
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/basic.html b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/basic.html
new file mode 100644
index 00000000000..da3c3faaa1c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/basic.html
@@ -0,0 +1,35 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>idlharness basic</title>
+</head>
+<body>
+<div id="log"></div>
+<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>
+ "use strict";
+ test(function() {
+ assert_true("IdlArray" in window);
+ }, 'IdlArray constructor should be a global object');
+ test(function() {
+ assert_true(new IdlArray() instanceof IdlArray);
+ }, 'IdlArray constructor should be constructible');
+ test(function() {
+ assert_true("WebIDL2" in window);
+ }, 'WebIDL2 namespace should be a global object');
+ test(function() {
+ assert_equals(typeof WebIDL2.parse, "function");
+ }, 'WebIDL2 namespace should have a parse method');
+ test(function() {
+ assert_throws(new TypeError(), function() { WebIDL2.parse("I'm a syntax error"); });
+ }, 'WebIDL2 parse method should bail on incorrect WebIDL');
+ test(function() {
+ assert_equals(typeof WebIDL2.parse("interface Foo {};"), "object");
+ }, 'WebIDL2 parse method should produce an AST for correct WebIDL');
+</script>
+</body>
+</html>
+
diff --git a/tests/wpt/web-platform-tests/resources/test/tests/idlharness/helper.js b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/helper.js
new file mode 100644
index 00000000000..2b73527ff2b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/test/tests/idlharness/helper.js
@@ -0,0 +1,24 @@
+"use strict";
+
+var typedefFrom = interfaceFrom;
+var dictionaryFrom = interfaceFrom;
+function interfaceFrom(i) {
+ var idl = new IdlArray();
+ idl.add_idls(i);
+ for (var prop in idl.members) {
+ return idl.members[prop];
+ }
+}
+
+function memberFrom(m) {
+ var idl = new IdlArray();
+ idl.add_idls('interface A { ' + m + '; };');
+ return idl.members["A"].members[0];
+}
+
+function typeFrom(type) {
+ var ast = WebIDL2.parse('interface Foo { ' + type + ' a(); };');
+ ast = ast[0]; // get the first fragment
+ ast = ast.members[0]; // get the first member
+ return ast.idlType; // get the type of the first field
+}
diff --git a/tests/wpt/web-platform-tests/resources/test/tox.ini b/tests/wpt/web-platform-tests/resources/test/tox.ini
index f40238131c7..4f45640479f 100644
--- a/tests/wpt/web-platform-tests/resources/test/tox.ini
+++ b/tests/wpt/web-platform-tests/resources/test/tox.ini
@@ -10,4 +10,4 @@ deps =
pyvirtualdisplay
selenium
-commands = pytest -vv tests
+commands = pytest {posargs} -vv tests
diff --git a/tests/wpt/web-platform-tests/resources/test/wptserver.py b/tests/wpt/web-platform-tests/resources/test/wptserver.py
index ec6759e4a4d..b06f3e81745 100644
--- a/tests/wpt/web-platform-tests/resources/test/wptserver.py
+++ b/tests/wpt/web-platform-tests/resources/test/wptserver.py
@@ -21,7 +21,7 @@ class WPTServer(object):
def start(self):
self.devnull = open(os.devnull, 'w')
self.proc = subprocess.Popen(
- [os.path.join(self.wpt_root, 'serve'), '--config=' + _CONFIG_FILE],
+ [os.path.join(self.wpt_root, 'wpt'), 'serve', '--config=' + _CONFIG_FILE],
stdout=self.devnull,
stderr=self.devnull,
cwd=self.wpt_root)
diff --git a/tests/wpt/web-platform-tests/resources/testharness.css.headers b/tests/wpt/web-platform-tests/resources/testharness.css.headers
new file mode 100644
index 00000000000..3d2c3342b7c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/testharness.css.headers
@@ -0,0 +1 @@
+Content-Type: text/css;charset=utf-8
diff --git a/tests/wpt/web-platform-tests/resources/testharness.js b/tests/wpt/web-platform-tests/resources/testharness.js
index 39aa686c6f5..55e1158da0b 100644
--- a/tests/wpt/web-platform-tests/resources/testharness.js
+++ b/tests/wpt/web-platform-tests/resources/testharness.js
@@ -433,15 +433,25 @@ policies and contribution forms [3].
// all imported scripts have been fetched and executed. It's the
// equivalent of an onload event for a document. All tests should have
// been added by the time this event is received, thus it's not
- // necessary to wait until the onactivate event.
- on_event(self, "install",
- function(event) {
- this_obj.all_loaded = true;
- if (this_obj.on_loaded_callback) {
- this_obj.on_loaded_callback();
- }
- });
+ // necessary to wait until the onactivate event. However, tests for
+ // installed service workers need another event which is equivalent to
+ // the onload event because oninstall is fired only on installation. The
+ // onmessage event is used for that purpose since tests using
+ // testharness.js should ask the result to its service worker by
+ // PostMessage. If the onmessage event is triggered on the service
+ // worker's context, that means the worker's script has been evaluated.
+ on_event(self, "install", on_all_loaded);
+ on_event(self, "message", on_all_loaded);
+ function on_all_loaded() {
+ if (this_obj.all_loaded)
+ return;
+ this_obj.all_loaded = true;
+ if (this_obj.on_loaded_callback) {
+ this_obj.on_loaded_callback();
+ }
+ }
}
+
ServiceWorkerTestEnvironment.prototype = Object.create(WorkerTestEnvironment.prototype);
ServiceWorkerTestEnvironment.prototype.add_on_loaded_callback = function(callback) {
@@ -528,7 +538,7 @@ policies and contribution forms [3].
}
tests.promise_tests = tests.promise_tests.then(function() {
var donePromise = new Promise(function(resolve) {
- test.add_cleanup(resolve);
+ test._add_cleanup(resolve);
});
var promise = test.step(func, test, test);
test.step(function() {
@@ -569,12 +579,21 @@ policies and contribution forms [3].
var waitingFor = null;
+ // This is null unless we are recording all events, in which case it
+ // will be an Array object.
+ var recordedEvents = null;
+
var eventHandler = test.step_func(function(evt) {
assert_true(!!waitingFor,
'Not expecting event, but got ' + evt.type + ' event');
assert_equals(evt.type, waitingFor.types[0],
'Expected ' + waitingFor.types[0] + ' event, but got ' +
evt.type + ' event instead');
+
+ if (Array.isArray(recordedEvents)) {
+ recordedEvents.push(evt);
+ }
+
if (waitingFor.types.length > 1) {
// Pop first event from array
waitingFor.types.shift();
@@ -585,7 +604,10 @@ policies and contribution forms [3].
// need to set waitingFor.
var resolveFunc = waitingFor.resolve;
waitingFor = null;
- resolveFunc(evt);
+ // Likewise, we should reset the state of recordedEvents.
+ var result = recordedEvents || evt;
+ recordedEvents = null;
+ resolveFunc(result);
});
for (var i = 0; i < eventTypes.length; i++) {
@@ -595,14 +617,36 @@ policies and contribution forms [3].
/**
* Returns a Promise that will resolve after the specified event or
* series of events has occured.
+ *
+ * @param options An optional options object. If the 'record' property
+ * on this object has the value 'all', when the Promise
+ * returned by this function is resolved, *all* Event
+ * objects that were waited for will be returned as an
+ * array.
+ *
+ * For example,
+ *
+ * ```js
+ * const watcher = new EventWatcher(t, div, [ 'animationstart',
+ * 'animationiteration',
+ * 'animationend' ]);
+ * return watcher.wait_for([ 'animationstart', 'animationend' ],
+ * { record: 'all' }).then(evts => {
+ * assert_equals(evts[0].elapsedTime, 0.0);
+ * assert_equals(evts[1].elapsedTime, 2.0);
+ * });
+ * ```
*/
- this.wait_for = function(types) {
+ this.wait_for = function(types, options) {
if (waitingFor) {
return Promise.reject('Already waiting for an event or events');
}
if (typeof types == 'string') {
types = [types];
}
+ if (options && options.record && options.record === 'all') {
+ recordedEvents = [];
+ }
return new Promise(function(resolve, reject) {
waitingFor = {
types: types,
@@ -618,7 +662,7 @@ policies and contribution forms [3].
}
};
- test.add_cleanup(stop_watching);
+ test._add_cleanup(stop_watching);
return this;
}
@@ -952,6 +996,10 @@ policies and contribution forms [3].
function assert_array_equals(actual, expected, description)
{
+ assert(typeof actual === "object" && actual !== null && "length" in actual,
+ "assert_array_equals", description,
+ "value is ${actual}, expected array",
+ {actual:actual});
assert(actual.length === expected.length,
"assert_array_equals", description,
"lengths differ, expected ${expected} got ${actual}",
@@ -971,6 +1019,34 @@ policies and contribution forms [3].
}
expose(assert_array_equals, "assert_array_equals");
+ function assert_array_approx_equals(actual, expected, epsilon, description)
+ {
+ /*
+ * Test if two primitive arrays are equal withing +/- epsilon
+ */
+ assert(actual.length === expected.length,
+ "assert_array_approx_equals", description,
+ "lengths differ, expected ${expected} got ${actual}",
+ {expected:expected.length, actual:actual.length});
+
+ for (var i = 0; i < actual.length; i++) {
+ assert(actual.hasOwnProperty(i) === expected.hasOwnProperty(i),
+ "assert_array_approx_equals", description,
+ "property ${i}, property expected to be ${expected} but was ${actual}",
+ {i:i, expected:expected.hasOwnProperty(i) ? "present" : "missing",
+ actual:actual.hasOwnProperty(i) ? "present" : "missing"});
+ assert(typeof actual[i] === "number",
+ "assert_array_approx_equals", description,
+ "property ${i}, expected a number but got a ${type_actual}",
+ {i:i, type_actual:typeof actual[i]});
+ assert(Math.abs(actual[i] - expected[i]) <= epsilon,
+ "assert_array_approx_equals", description,
+ "property ${i}, expected ${expected} +/- ${epsilon}, expected ${expected} but got ${actual}",
+ {i:i, expected:expected[i], actual:actual[i]});
+ }
+ }
+ expose(assert_array_approx_equals, "assert_array_approx_equals");
+
function assert_approx_equals(actual, expected, epsilon, description)
{
/*
@@ -1347,6 +1423,7 @@ policies and contribution forms [3].
this.steps = [];
this.cleanup_callbacks = [];
+ this._user_defined_cleanup_count = 0;
tests.push(this);
}
@@ -1471,10 +1548,27 @@ policies and contribution forms [3].
}), timeout * tests.timeout_multiplier);
}
- Test.prototype.add_cleanup = function(callback) {
+ /*
+ * Private method for registering cleanup functions. `testharness.js`
+ * internals should use this method instead of the public `add_cleanup`
+ * method in order to hide implementation details from the harness status
+ * message in the case errors.
+ */
+ Test.prototype._add_cleanup = function(callback) {
this.cleanup_callbacks.push(callback);
};
+ /*
+ * Schedule a function to be run after the test result is known, regardless
+ * of passing or failing state. The behavior of this function will not
+ * influence the result of the test, but if an exception is thrown, the
+ * test harness will report an error.
+ */
+ Test.prototype.add_cleanup = function(callback) {
+ this._user_defined_cleanup_count += 1;
+ this._add_cleanup(callback);
+ };
+
Test.prototype.force_timeout = function() {
this.set_status(this.TIMEOUT);
this.phase = this.phases.HAS_RESULT;
@@ -1545,7 +1639,7 @@ policies and contribution forms [3].
});
if (error_count > 0) {
- total = this.cleanup_callbacks.length;
+ total = this._user_defined_cleanup_count;
tests.status.status = tests.status.ERROR;
tests.status.message = "Test named '" + this.name +
"' specified " + total + " 'cleanup' function" +
diff --git a/tests/wpt/web-platform-tests/resources/testharness.js.headers b/tests/wpt/web-platform-tests/resources/testharness.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/testharness.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/resources/testharnessreport.js b/tests/wpt/web-platform-tests/resources/testharnessreport.js
index 79559773f72..62ddaffb443 100644
--- a/tests/wpt/web-platform-tests/resources/testharnessreport.js
+++ b/tests/wpt/web-platform-tests/resources/testharnessreport.js
@@ -1,7 +1,3 @@
-/* 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/. */
-
var props = {output:%(output)d,
explicit_timeout: true,
message_events: ["completion"]};
diff --git a/tests/wpt/web-platform-tests/resources/testharnessreport.js.headers b/tests/wpt/web-platform-tests/resources/testharnessreport.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/testharnessreport.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/resources/webidl2/lib/webidl2.js.headers b/tests/wpt/web-platform-tests/resources/webidl2/lib/webidl2.js.headers
new file mode 100644
index 00000000000..6805c323df5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/resources/webidl2/lib/webidl2.js.headers
@@ -0,0 +1 @@
+Content-Type: text/javascript; charset=utf-8
diff --git a/tests/wpt/web-platform-tests/selection/addRange.htm b/tests/wpt/web-platform-tests/selection/addRange.htm
new file mode 100644
index 00000000000..4feb69f8486
--- /dev/null
+++ b/tests/wpt/web-platform-tests/selection/addRange.htm
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Selection: Add a range to the selection</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+window.onload = function() {
+ test(function() {
+ var selection = window.getSelection();
+ var p1 = document.getElementById("p1");
+
+ var range = document.createRange();
+ range.selectNode(p1);
+ selection.addRange(range);
+
+ assert_equals(selection.anchorNode, range.startContainer);
+ assert_equals(selection.anchorOffset, range.startOffset);
+ assert_equals(selection.focusNode, range.endContainer);
+ assert_equals(selection.focusOffset, range.endOffset);
+ assert_equals(selection.isCollapsed, range.collapsed);
+ assert_equals(selection.rangeCount, 1);
+ assert_equals(selection.toString(), p1.firstChild.nodeValue);
+ });
+};
+</script>
+<div id=log></div>
+<p id="p1">Add a range to the selection</p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/selection/collapse.htm b/tests/wpt/web-platform-tests/selection/collapse.htm
new file mode 100644
index 00000000000..78fb779c4fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/selection/collapse.htm
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Selection: Collapse the selection using collapse()</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+window.onload = function() {
+ test(function() {
+ var selection = window.getSelection();
+ var p1 = document.getElementById("p1");
+
+ var range = document.createRange();
+ range.selectNode(p1);
+ selection.addRange(range);
+ selection.collapse(p1, 0);
+
+ assert_equals(selection.anchorNode, p1);
+ assert_equals(selection.anchorOffset, 0);
+ assert_equals(selection.focusNode, p1);
+ assert_equals(selection.focusOffset, 0);
+ assert_equals(selection.isCollapsed, true);
+ assert_equals(selection.rangeCount, 1);
+ assert_equals(selection.toString(), "");
+ });
+};
+</script>
+<div id=log></div>
+<p id="p1">Add a range to the selection</p>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/selection/interfaces.html b/tests/wpt/web-platform-tests/selection/interfaces.html
index 8fed814bf28..21b3f3e8248 100644
--- a/tests/wpt/web-platform-tests/selection/interfaces.html
+++ b/tests/wpt/web-platform-tests/selection/interfaces.html
@@ -36,12 +36,41 @@ interface Selection {
optional boolean allowPartialContainment = false);
stringifier DOMString ();
};
+
+partial interface Document {
+ Selection? getSelection();
+};
+
+partial interface Window {
+ Selection? getSelection();
+};
+
+partial interface GlobalEventHandlers {
+ attribute EventHandler onselectstart;
+ attribute EventHandler onselectionchange;
+};
</script>
<script>
"use strict";
-var idlArray = new IdlArray();
-idlArray.add_idls(document.querySelector("script[type=text\\/plain]").textContent);
-idlArray.add_objects({Selection: ['getSelection()']});
-idlArray.test();
+function doTest([dom, cssom, touchevents, uievents, html]) {
+ var idlArray = new IdlArray();
+ idlArray.add_untested_idls(dom + cssom + touchevents + uievents + html);
+ idlArray.add_idls(document.querySelector("script[type=text\\/plain]").textContent);
+ idlArray.add_objects({Selection: ['getSelection()']});
+ idlArray.test();
+}
+
+function fetchData(url) {
+ return fetch(url).then((response) => response.text());
+}
+
+promise_test(function() {
+ return Promise.all([fetchData("/interfaces/dom.idl"),
+ fetchData("/interfaces/cssom.idl"),
+ fetchData("/interfaces/touchevents.idl"),
+ fetchData("/interfaces/uievents.idl"),
+ fetchData("/interfaces/html.idl")])
+ .then(doTest);
+}, "Test driver");
</script>
diff --git a/tests/wpt/web-platform-tests/selection/removeAllRanges.html b/tests/wpt/web-platform-tests/selection/removeAllRanges.html
index 286876f8bda..026280d6b8c 100644
--- a/tests/wpt/web-platform-tests/selection/removeAllRanges.html
+++ b/tests/wpt/web-platform-tests/selection/removeAllRanges.html
@@ -13,8 +13,13 @@ testRanges.unshift("[]");
var range = rangeFromEndpoints([paras[0].firstChild, 0, paras[0].firstChild, 1]);
function testRange(rangeDesc, method) {
+ var endpoints = eval(testRanges[i]);
+ if (endpoints.length && (!isSelectableNode(endpoints[0]) ||
+ !isSelectableNode(endpoints[2]))) {
+ return;
+ }
test(function() {
- setSelectionForwards(eval(rangeDesc));
+ setSelectionForwards(endpoints);
selection[method]();
assert_equals(selection.rangeCount, 0,
"After " + method + "(), rangeCount must be 0");
@@ -28,7 +33,7 @@ function testRange(rangeDesc, method) {
// Copy-pasted from above
test(function() {
- setSelectionBackwards(eval(rangeDesc));
+ setSelectionBackwards(endpoints);
selection[method]();
assert_equals(selection.rangeCount, 0,
"After " + method + "(), rangeCount must be 0");
diff --git a/tests/wpt/web-platform-tests/serve b/tests/wpt/web-platform-tests/serve
deleted file mode 100755
index 51761b02c62..00000000000
--- a/tests/wpt/web-platform-tests/serve
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env python
-import serve
-
-if __name__ == "__main__":
- serve.main()
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/blue.png.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/blue.png.sub.headers
index 5f3e54310d6..23988edc869 100644
--- a/tests/wpt/web-platform-tests/server-timing/resources/blue.png.sub.headers
+++ b/tests/wpt/web-platform-tests/server-timing/resources/blue.png.sub.headers
@@ -1 +1 @@
-Server-Timing: metric2=3.4;blue.png
+Server-Timing: metric2=2.1;blue.png
diff --git a/tests/wpt/web-platform-tests/server-timing/resources/green.png.sub.headers b/tests/wpt/web-platform-tests/server-timing/resources/green.png.sub.headers
index 1c6d74512a4..d559754e7e8 100644
--- a/tests/wpt/web-platform-tests/server-timing/resources/green.png.sub.headers
+++ b/tests/wpt/web-platform-tests/server-timing/resources/green.png.sub.headers
@@ -1 +1 @@
-Server-Timing: metric3=5.6;green.png
+Server-Timing: metric3=3.1;green.png
diff --git a/tests/wpt/web-platform-tests/server-timing/test_server_timing.html b/tests/wpt/web-platform-tests/server-timing/test_server_timing.html
index 2a6ffa26499..fa100301f14 100644
--- a/tests/wpt/web-platform-tests/server-timing/test_server_timing.html
+++ b/tests/wpt/web-platform-tests/server-timing/test_server_timing.html
@@ -9,36 +9,32 @@
setup({explicit_done: true})
window.addEventListener('load', function() {
- // there should be exactly two server-timing entries, 1 for document, 1 for img#one
- test_entries(performance.getEntriesByType('server'), [{
- name: document.location.href,
- entryType: 'server',
- startTime: 0,
- duration: 1.2,
- metric: 'metric1',
+ // there should be exactly three server-timing entries, 2 for document, 1 for img#one
+ test_entries(performance.getEntriesByType('navigation')[0].serverTiming, [{
+ duration: 1.1,
+ name: 'metric1',
description: 'document',
}, {
- name: document.querySelector('img#one').src,
- entryType: 'server',
- startTime: 0,
- duration: 3.4,
- metric: 'metric2',
+ duration: 1.2,
+ name: 'metric1',
+ description: 'document',
+ }])
+ test_entries(performance.getEntriesByName(document.querySelector('img#one').src)[0].serverTiming, [{
+ duration: 2.1,
+ name: 'metric2',
description: 'blue.png',
}])
new PerformanceObserver(function(entryList, observer) {
// there should be exactly one server-timing entry, 1 for img#two
- test_entries(entryList.getEntriesByType('server'), [{
- name: document.querySelector('img#two').src,
- entryType: 'server',
- startTime: 0,
- duration: 5.6,
- metric: 'metric3',
+ test_entries(entryList.getEntriesByName(document.querySelector('img#two').src)[0].serverTiming, [{
+ duration: 3.1,
+ name: 'metric3',
description: 'green.png',
}])
observer.disconnect()
done()
- }).observe({entryTypes: ['server']})
+ }).observe({entryTypes: ['resource']})
var img = document.createElement('img')
img.id = 'two'
diff --git a/tests/wpt/web-platform-tests/server-timing/test_server_timing.html.sub.headers b/tests/wpt/web-platform-tests/server-timing/test_server_timing.html.sub.headers
index ddff591c1e4..c539669710c 100644
--- a/tests/wpt/web-platform-tests/server-timing/test_server_timing.html.sub.headers
+++ b/tests/wpt/web-platform-tests/server-timing/test_server_timing.html.sub.headers
@@ -1 +1 @@
-Server-Timing: metric1=1.2;document
+Server-Timing: metric1=1.1;document, metric1=1.2;document
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/resources/close-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/resources/close-worker.js
index 32ad203df01..41a8bc069af 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/resources/close-worker.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/ServiceWorkerGlobalScope/resources/close-worker.js
@@ -1,4 +1,3 @@
-importScripts('../../resources/interfaces.js');
importScripts('../../resources/worker-testharness.js');
test(function() {
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/claim-fetch.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/claim-fetch.https.html
index ddb74286d0b..050c1ea92ef 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/claim-fetch.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/claim-fetch.https.html
@@ -4,11 +4,12 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
+<body>
<script>
promise_test(function(t) {
var frame;
- var resource = 'resources/simple.txt';
+ var resource = 'simple.txt';
var worker;
var scope = 'resources/';
@@ -65,3 +66,4 @@ promise_test(function(t) {
}, 'fetch() should be intercepted after the client is claimed.')
</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/claim-shared-worker-fetch.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/claim-shared-worker-fetch.https.html
new file mode 100644
index 00000000000..a07db7b75c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/claim-shared-worker-fetch.https.html
@@ -0,0 +1,68 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<body>
+<script>
+
+promise_test(function(t) {
+ var frame;
+ var resource = 'simple.txt';
+
+ var worker;
+ var scope = 'resources/';
+ var script = 'resources/claim-worker.js';
+
+ return Promise.resolve()
+ // Create the test iframe with a shared worker.
+ .then(() => with_iframe('resources/claim-shared-worker-fetch-iframe.html'))
+ .then(f => frame = f)
+
+ // Check the controller and test with fetch in the shared worker.
+ .then(() => assert_equals(frame.contentWindow.navigator.controller,
+ undefined,
+ 'Should have no controller.'))
+ .then(() => frame.contentWindow.fetch_in_shared_worker(resource))
+ .then(response_text => assert_equals(response_text,
+ 'a simple text file\n',
+ 'fetch() should not be intercepted.'))
+ // Register a service worker.
+ .then(() => service_worker_unregister_and_register(t, script, scope))
+ .then(r => worker = r.installing)
+ .then(() => wait_for_state(t, worker, 'activated'))
+
+ // Let the service worker claim the iframe and the shared worker.
+ .then(() => {
+ var channel = new MessageChannel();
+ var saw_message = new Promise(function(resolve) {
+ channel.port1.onmessage = t.step_func(function(e) {
+ assert_equals(e.data, 'PASS',
+ 'Worker call to claim() should fulfill.');
+ resolve();
+ });
+ });
+ worker.postMessage({port: channel.port2}, [channel.port2]);
+ return saw_message;
+ })
+
+ // Check the controller and test with fetch in the shared worker.
+ .then(() => frame.contentWindow.navigator.serviceWorker.getRegistration(scope))
+ .then(r => assert_equals(frame.contentWindow.navigator.serviceWorker.controller,
+ r.active,
+ 'Test iframe should be claimed.'))
+ // TODO(horo): Check the SharedWorker's navigator.seviceWorker.controller.
+ .then(() => frame.contentWindow.fetch_in_shared_worker(resource))
+ .then(response_text =>
+ assert_equals(response_text,
+ 'Intercepted!',
+ 'fetch() in the shared worker should be intercepted.'))
+
+ // Cleanup this testcase.
+ .then(() => frame.remove())
+ .then(() => service_worker_unregister_and_done(t, scope));
+}, 'fetch() in SharedWorker should be intercepted after the client is claimed.')
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/claim-worker-fetch.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/claim-worker-fetch.https.html
new file mode 100644
index 00000000000..2bc65368e8f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/claim-worker-fetch.https.html
@@ -0,0 +1,68 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<body>
+<script>
+
+promise_test(function(t) {
+ var frame;
+ var resource = 'simple.txt';
+
+ var worker;
+ var scope = 'resources/';
+ var script = 'resources/claim-worker.js';
+
+ return Promise.resolve()
+ // Create the test iframe with a dedicated worker.
+ .then(() => with_iframe('resources/claim-worker-fetch-iframe.html'))
+ .then(f => frame = f)
+
+ // Check the controller and test with fetch in the worker.
+ .then(() => assert_equals(frame.contentWindow.navigator.controller,
+ undefined,
+ 'Should have no controller.'))
+ .then(() => frame.contentWindow.fetch_in_worker(resource))
+ .then(response_text => assert_equals(response_text,
+ 'a simple text file\n',
+ 'fetch() should not be intercepted.'))
+ // Register a service worker.
+ .then(() => service_worker_unregister_and_register(t, script, scope))
+ .then(r => worker = r.installing)
+ .then(() => wait_for_state(t, worker, 'activated'))
+
+ // Let the service worker claim the iframe and the worker.
+ .then(() => {
+ var channel = new MessageChannel();
+ var saw_message = new Promise(function(resolve) {
+ channel.port1.onmessage = t.step_func(function(e) {
+ assert_equals(e.data, 'PASS',
+ 'Worker call to claim() should fulfill.');
+ resolve();
+ });
+ });
+ worker.postMessage({port: channel.port2}, [channel.port2]);
+ return saw_message;
+ })
+
+ // Check the controller and test with fetch in the worker.
+ .then(() => frame.contentWindow.navigator.serviceWorker.getRegistration(scope))
+ .then(r => assert_equals(frame.contentWindow.navigator.serviceWorker.controller,
+ r.active,
+ 'Test iframe should be claimed.'))
+ // TODO(horo): Check the worker's navigator.seviceWorker.controller.
+ .then(() => frame.contentWindow.fetch_in_worker(resource))
+ .then(response_text =>
+ assert_equals(response_text,
+ 'Intercepted!',
+ 'fetch() in the worker should be intercepted.'))
+
+ // Cleanup this testcase.
+ .then(() => frame.remove())
+ .then(() => service_worker_unregister_and_done(t, scope));
+}, 'fetch() in Worker should be intercepted after the client is claimed.')
+
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-client-types.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-client-types.https.html
index 5bb50ec3db7..24967172a84 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-client-types.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/clients-matchall-client-types.https.html
@@ -19,9 +19,12 @@ var expected_only_shared_worker = [
var expected_only_dedicated_worker = [
[undefined, undefined, new URL(dedicated_worker_url, location).href, 'worker', 'none']
];
+
+// These are explicitly sorted by URL in the service worker script.
var expected_all_clients = [
- expected_only_window[0], expected_only_shared_worker[0],
- expected_only_dedicated_worker[0]
+ expected_only_dedicated_worker[0],
+ expected_only_window[0],
+ expected_only_shared_worker[0],
];
function test_matchall(frame, expected, query_options) {
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-redirect.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-redirect.https.html
index 2227d3901f9..c72be766646 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-redirect.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-redirect.https.html
@@ -13,81 +13,78 @@
// Utilities for testing non-navigation requests that are intercepted with
// a redirect.
-var host_info = get_host_info();
-var worker = 'resources/fetch-rewrite-worker.js';
-var frameURL = host_info['HTTPS_ORIGIN'] + base_path() +
- 'resources/fetch-event-redirect-iframe.html';
-var baseScope = 'resources/';
-var redirect = 'redirect.py';
-var success = base_path() + 'resources/success.py';
+const host_info = get_host_info();
+const kScript = 'resources/fetch-rewrite-worker.js';
+const kScope = host_info['HTTPS_ORIGIN'] + base_path() +
+ 'resources/blank.html?fetch-event-redirect';
+let frame;
function redirect_fetch_test(t, test) {
- var scope = baseScope + test.name;
- return 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 + '?url=' + encodeURIComponent(frameURL));
- }).then(function(frame) {
- var hostKeySuffix = test['url_credentials'] ? '_WITH_CREDS' : '';
-
- var acaorigin = '';
- var host = host_info['HTTPS_ORIGIN' + hostKeySuffix];
- if (test['redirect_dest'] === 'no-cors') {
- host = host_info['HTTPS_REMOTE_ORIGIN' + hostKeySuffix]
- } else if (test['redirect_dest'] === 'cors') {
- acaorigin = '?ACAOrigin=' + encodeURIComponent(host_info['HTTPS_ORIGIN']);
- host = host_info['HTTPS_REMOTE_ORIGIN' + hostKeySuffix]
- }
-
- var dest = '?Redirect=' + encodeURIComponent(host + success + acaorigin);
-
- var expectedTypeParam = test['expected_type']
- ? '&expected_type=' + test['expected_type']
- : '';
-
- var expectedRedirectedParam = test['expected_redirected']
- ? '&expected_redirected=' + test['expected_redirected']
- : '';
-
- var url = scope +
- '?url=' + encodeURIComponent(redirect + dest) +
- expectedTypeParam + expectedRedirectedParam
-
- var p = new Promise(function(resolve, reject) {
- var channel = new MessageChannel();
- channel.port1.onmessage = function(e) {
- frame.remove();
- if (e.data.result === 'reject') {
- reject(e.data.detail);
- } else if (e.data.result === 'success') {
- resolve(e.data.result);
- } else {
- resolve(e.data.detail);
- }
- };
- frame.contentWindow.postMessage({
- url: url,
- request_init: test.request_init,
- redirect_dest: test.redirect_dest,
- expected_type: test.expected_type,
- expected_redirected: test.expected_redirected,
- }, '*', [channel.port2]);
- });
-
- if (test.should_reject) {
- return assert_promise_rejects(p);
- }
-
- return p.then(function(result) {
- if (result !== 'success') {
- throw(new Error(result));
+ const hostKeySuffix = test['url_credentials'] ? '_WITH_CREDS' : '';
+ const successPath = base_path() + 'resources/success.py';
+
+ let acaOrigin = '';
+ let host = host_info['HTTPS_ORIGIN' + hostKeySuffix];
+ if (test['redirect_dest'] === 'no-cors') {
+ host = host_info['HTTPS_REMOTE_ORIGIN' + hostKeySuffix]
+ } else if (test['redirect_dest'] === 'cors') {
+ acaOrigin = '?ACAOrigin=' + encodeURIComponent(host_info['HTTPS_ORIGIN']);
+ host = host_info['HTTPS_REMOTE_ORIGIN' + hostKeySuffix]
+ }
+
+ const dest = '?Redirect=' + encodeURIComponent(host + successPath + acaOrigin);
+ const expectedTypeParam =
+ test['expected_type']
+ ? '&expected_type=' + test['expected_type']
+ : '';
+ const expectedRedirectedParam =
+ test['expected_redirected']
+ ? '&expected_redirected=' + test['expected_redirected']
+ : '';
+ const url = '/' + test.name +
+ '?url=' + encodeURIComponent('redirect.py' + dest) +
+ expectedTypeParam + expectedRedirectedParam
+ const request = new Request(url, test.request_init);
+
+ if (test.should_reject) {
+ return assert_promise_rejects(
+ frame.contentWindow.fetch(request),
+ new TypeError(),
+ 'Must fail to fetch: url=' + url);
+ }
+ return frame.contentWindow.fetch(request).then((response) => {
+ assert_equals(response.type, test.expected_type,
+ 'response.type');
+ assert_equals(response.redirected, test.expected_redirected,
+ 'response.redirected');
+ if (response.type === 'opaque' || response.type === 'opaqueredirect') {
+ return;
}
+ return response.json().then((json) => {
+ assert_equals(json.result, 'success', 'JSON result must be "success".');
+ });
});
- }).then(function() {
- return service_worker_unregister_and_done(t, scope);
- }).catch(unreached_rejection(t));
}
+// Set up the service worker and the frame.
+promise_test(t => {
+ return service_worker_unregister_and_register(t, kScript, kScope)
+ .then(registration => {
+ promise_test(() => {
+ return registration.unregister();
+ }, 'restore global state');
+
+ return wait_for_state(t, registration.installing, 'activated');
+ })
+ .then(() => {
+ return with_iframe(kScope);
+ })
+ .then(f => {
+ frame = f;
+ add_completion_callback(() => { f.remove(); });
+ });
+ }, 'initialize global state');
+
// ------------------------
// Test every combination of:
// - RequestMode (same-origin, cors, no-cors)
@@ -113,13 +110,11 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'cors'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
- 'same-origin without credentials should fail opaqueredirect interception ' +
- 'and response should not be redirected');
+ 'same-origin without credentials should succeed opaqueredirect ' +
+ 'interception and response should not be redirected');
promise_test(function(t) {
return redirect_fetch_test(t, {
@@ -132,12 +127,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'cors'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
- 'no-cors without credentials should fail opaqueredirect interception ' +
+ 'no-cors without credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -151,12 +144,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'cors'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
- 'cors without credentials should fail opaqueredirect interception ' +
+ 'cors without credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -170,13 +161,11 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'same-origin'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
- 'same-origin without credentials should fail opaqueredirect interception ' +
- 'and response should not be redirected');
+ 'same-origin without credentials should succeed opaqueredirect ' +
+ 'interception and response should not be redirected');
promise_test(function(t) {
return redirect_fetch_test(t, {
@@ -189,12 +178,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'same-origin'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
- 'no-cors without credentials should fail opaqueredirect interception ' +
+ 'no-cors without credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -208,12 +195,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'same-origin'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
- 'cors without credentials should fail opaqueredirect interception ' +
+ 'cors without credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -227,12 +212,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'no-cors'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
- 'same-origin without credentials should fail opaqueredirect interception ' +
+ 'same-origin without credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -280,12 +263,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'cors'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
- 'same-origin with credentials should fail opaqueredirect interception ' +
+ 'same-origin with credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -299,12 +280,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'cors'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
- 'no-cors with credentials should fail opaqueredirect interception ' +
+ 'no-cors with credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -318,12 +297,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'cors'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, cors mode Request redirected to ' +
- 'cors with credentials should fail opaqueredirect interception ' +
+ 'cors with credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -337,12 +314,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'same-origin'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
- 'same-origin with credentials should fail opaqueredirect interception ' +
+ 'same-origin with credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -356,12 +331,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'same-origin'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
- 'no-cors with credentials should fail opaqueredirect interception ' +
+ 'no-cors with credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -375,12 +348,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'same-origin'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, same-origin mode Request redirected to ' +
- 'cors with credentials should fail opaqueredirect interception ' +
+ 'cors with credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -394,12 +365,10 @@ promise_test(function(t) {
redirect: 'manual',
mode: 'no-cors'
},
- // should reject because only navigations can be intercepted with
- // opaqueredirect responses
- should_reject: true
+ should_reject: false
});
}, 'Non-navigation, manual redirect, no-cors mode Request redirected to ' +
- 'same-origin with credentials should fail opaqueredirect interception ' +
+ 'same-origin with credentials should succeed opaqueredirect interception ' +
'and response should not be redirected');
promise_test(function(t) {
@@ -458,8 +427,6 @@ promise_test(function(t) {
name: 'nonav-follow-cors-redirects-to-nocors-nocreds',
redirect_dest: 'no-cors',
url_credentials: false,
- expected_type: 'should-not-get-a-response',
- expected_redirected: false,
request_init: {
redirect: 'follow',
mode: 'cors'
@@ -511,8 +478,6 @@ promise_test(function(t) {
name: 'nonav-follow-sameorigin-redirects-to-nocors-nocreds',
redirect_dest: 'no-cors',
url_credentials: false,
- expected_type: 'should-not-get-a-response',
- expected_redirected: false,
request_init: {
redirect: 'follow',
mode: 'same-origin'
@@ -530,8 +495,6 @@ promise_test(function(t) {
name: 'nonav-follow-sameorigin-redirects-to-cors-nocreds',
redirect_dest: 'cors',
url_credentials: false,
- expected_type: 'should-not-get-a-response',
- expected_redirected: false,
request_init: {
redirect: 'follow',
mode: 'same-origin'
@@ -617,8 +580,6 @@ promise_test(function(t) {
name: 'nonav-follow-cors-redirects-to-nocors-creds',
redirect_dest: 'no-cors',
url_credentials: true,
- expected_type: 'should-not-get-a-response',
- expected_redirected: false,
request_init: {
redirect: 'follow',
mode: 'cors'
@@ -636,8 +597,6 @@ promise_test(function(t) {
name: 'nonav-follow-cors-redirects-to-cors-creds',
redirect_dest: 'cors',
url_credentials: true,
- expected_type: 'cors',
- expected_redirected: true,
request_init: {
redirect: 'follow',
mode: 'cors'
@@ -673,8 +632,6 @@ promise_test(function(t) {
name: 'nonav-follow-sameorigin-redirects-to-nocors-creds',
redirect_dest: 'no-cors',
url_credentials: true,
- expected_type: 'should-not-get-a-response',
- expected_redirected: false,
request_init: {
redirect: 'follow',
mode: 'same-origin'
@@ -692,8 +649,6 @@ promise_test(function(t) {
name: 'nonav-follow-sameorigin-redirects-to-cors-creds',
redirect_dest: 'cors',
url_credentials: true,
- expected_type: 'should-not-get-a-response',
- expected_redirected: false,
request_init: {
redirect: 'follow',
mode: 'same-origin'
@@ -762,8 +717,6 @@ promise_test(function(t) {
name: 'nonav-error-cors-redirects-to-sameorigin-nocreds',
redirect_dest: 'same-origin',
url_credentials: false,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'cors'
@@ -781,8 +734,6 @@ promise_test(function(t) {
name: 'nonav-error-cors-redirects-to-nocors-nocreds',
redirect_dest: 'no-cors',
url_credentials: false,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'cors'
@@ -800,8 +751,6 @@ promise_test(function(t) {
name: 'nonav-error-cors-redirects-to-cors-nocreds',
redirect_dest: 'cors',
url_credentials: false,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'cors'
@@ -819,8 +768,6 @@ promise_test(function(t) {
name: 'nonav-error-sameorigin-redirects-to-sameorigin-nocreds',
redirect_dest: 'same-origin',
url_credentials: false,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'same-origin'
@@ -838,8 +785,6 @@ promise_test(function(t) {
name: 'nonav-error-sameorigin-redirects-to-nocors-nocreds',
redirect_dest: 'no-cors',
url_credentials: false,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'same-origin'
@@ -857,8 +802,6 @@ promise_test(function(t) {
name: 'nonav-error-sameorigin-redirects-to-cors-nocreds',
redirect_dest: 'cors',
url_credentials: false,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'same-origin'
@@ -876,8 +819,6 @@ promise_test(function(t) {
name: 'nonav-error-nocors-redirects-to-sameorigin-nocreds',
redirect_dest: 'same-origin',
url_credentials: false,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'no-cors'
@@ -895,8 +836,6 @@ promise_test(function(t) {
name: 'nonav-error-nocors-redirects-to-nocors-nocreds',
redirect_dest: 'no-cors',
url_credentials: false,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'no-cors'
@@ -914,8 +853,6 @@ promise_test(function(t) {
name: 'nonav-error-nocors-redirects-to-cors-nocreds',
redirect_dest: 'cors',
url_credentials: false,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'no-cors'
@@ -933,8 +870,6 @@ promise_test(function(t) {
name: 'nonav-error-cors-redirects-to-sameorigin-creds',
redirect_dest: 'same-origin',
url_credentials: true,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'cors'
@@ -952,8 +887,6 @@ promise_test(function(t) {
name: 'nonav-error-cors-redirects-to-nocors-creds',
redirect_dest: 'no-cors',
url_credentials: true,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'cors'
@@ -971,8 +904,6 @@ promise_test(function(t) {
name: 'nonav-error-cors-redirects-to-cors-creds',
redirect_dest: 'cors',
url_credentials: true,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'cors'
@@ -990,8 +921,6 @@ promise_test(function(t) {
name: 'nonav-error-sameorigin-redirects-to-sameorigin-creds',
redirect_dest: 'same-origin',
url_credentials: true,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'same-origin'
@@ -1009,8 +938,6 @@ promise_test(function(t) {
name: 'nonav-error-sameorigin-redirects-to-nocors-creds',
redirect_dest: 'no-cors',
url_credentials: true,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'same-origin'
@@ -1028,8 +955,6 @@ promise_test(function(t) {
name: 'nonav-error-sameorigin-redirects-to-cors-creds',
redirect_dest: 'cors',
url_credentials: true,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'same-origin'
@@ -1047,8 +972,6 @@ promise_test(function(t) {
name: 'nonav-error-nocors-redirects-to-sameorigin-creds',
redirect_dest: 'same-origin',
url_credentials: true,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'no-cors'
@@ -1066,8 +989,6 @@ promise_test(function(t) {
name: 'nonav-error-nocors-redirects-to-nocors-creds',
redirect_dest: 'no-cors',
url_credentials: true,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'no-cors'
@@ -1085,8 +1006,6 @@ promise_test(function(t) {
name: 'nonav-error-nocors-redirects-to-cors-creds',
redirect_dest: 'cors',
url_credentials: true,
- expected_type: 'error',
- expected_redirected: false,
request_init: {
redirect: 'error',
mode: 'no-cors'
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https.html
new file mode 100644
index 00000000000..9b67faccac8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-event-referrer-policy.https.html
@@ -0,0 +1,266 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<body>
+<script>
+var worker = 'resources/fetch-event-test-worker.js';
+
+function run_referrer_policy_tests(frame, referrer, href, origin) {
+ return frame.contentWindow.fetch('resources/simple.html?referrerFull',
+ {method: "GET", referrer: referrer})
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + href + '\n' +
+ 'ReferrerPolicy: no-referrer-when-downgrade',
+ 'Service Worker should respond to fetch with the referrer URL when a member of RequestInit is present');
+ var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url,
+ {method: "GET", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: \n' +
+ 'ReferrerPolicy: no-referrer-when-downgrade',
+ 'Service Worker should respond to fetch with no referrer when a member of RequestInit is present with an HTTP request');
+ return frame.contentWindow.fetch('resources/simple.html?referrerFull',
+ {referrerPolicy: "", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + href + '\n' +
+ 'ReferrerPolicy: no-referrer-when-downgrade',
+ 'Service Worker should respond to fetch with the referrer with ""');
+ var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url,
+ {referrerPolicy: "", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: \n' +
+ 'ReferrerPolicy: no-referrer-when-downgrade',
+ 'Service Worker should respond to fetch with no referrer with ""');
+ return frame.contentWindow.fetch('resources/simple.html?referrerFull',
+ {referrerPolicy: "origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + origin + '/' + '\n' +
+ 'ReferrerPolicy: origin',
+ 'Service Worker should respond to fetch with the referrer origin with "origin" and a same origin request');
+ var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url,
+ {referrerPolicy: "origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + origin + '/' + '\n' +
+ 'ReferrerPolicy: origin',
+ 'Service Worker should respond to fetch with the referrer origin with "origin" and a cross origin request');
+ return frame.contentWindow.fetch('resources/simple.html?referrerFull',
+ {referrerPolicy: "origin-when-cross-origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + href + '\n' +
+ 'ReferrerPolicy: origin-when-cross-origin',
+ 'Service Worker should respond to fetch with the referrer URL with "origin-when-cross-origin" and a same origin request');
+ var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url,
+ {referrerPolicy: "origin-when-cross-origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + origin + '/' + '\n' +
+ 'ReferrerPolicy: origin-when-cross-origin',
+ 'Service Worker should respond to fetch with the referrer origin with "origin-when-cross-origin" and a cross origin request');
+ return frame.contentWindow.fetch('resources/simple.html?referrerFull',
+ {referrerPolicy: "no-referrer-when-downgrade", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + href + '\n' +
+ 'ReferrerPolicy: no-referrer-when-downgrade',
+ 'Service Worker should respond to fetch with no referrer with "no-referrer-when-downgrade" and a same origin request');
+ var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url,
+ {referrerPolicy: "no-referrer-when-downgrade", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: \n' +
+ 'ReferrerPolicy: no-referrer-when-downgrade',
+ 'Service Worker should respond to fetch with no referrer with "no-referrer-when-downgrade" and an HTTP request');
+ var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url, {referrerPolicy: "unsafe-url", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + href + '\n' +
+ 'ReferrerPolicy: unsafe-url',
+ 'Service Worker should respond to fetch with no referrer with "unsafe-url"');
+ return frame.contentWindow.fetch('resources/simple.html?referrerFull',
+ {referrerPolicy: "no-referrer", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: \n' +
+ 'ReferrerPolicy: no-referrer',
+ 'Service Worker should respond to fetch with no referrer URL with "no-referrer"');
+ return frame.contentWindow.fetch('resources/simple.html?referrerFull',
+ {referrerPolicy: "same-origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + href + '\n' +
+ 'ReferrerPolicy: same-origin',
+ 'Service Worker should respond to fetch with referrer URL with "same-origin" and a same origin request');
+ var http_url = get_host_info()['HTTPS_REMOTE_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url,
+ {referrerPolicy: "same-origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: \n' +
+ 'ReferrerPolicy: same-origin',
+ 'Service Worker should respond to fetch with no referrer with "same-origin" and cross origin request');
+ var http_url = get_host_info()['HTTPS_REMOTE_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url,
+ {referrerPolicy: "strict-origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + origin + '/' + '\n' +
+ 'ReferrerPolicy: strict-origin',
+ 'Service Worker should respond to fetch with the referrer origin with "strict-origin" and a HTTPS cross origin request');
+ return frame.contentWindow.fetch('resources/simple.html?referrerFull',
+ {referrerPolicy: "strict-origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + origin + '/' + '\n' +
+ 'ReferrerPolicy: strict-origin',
+ 'Service Worker should respond to fetch with the referrer origin with "strict-origin" and a same origin request');
+ var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url,
+ {referrerPolicy: "strict-origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: \n' +
+ 'ReferrerPolicy: strict-origin',
+ 'Service Worker should respond to fetch with no referrer with "strict-origin" and a HTTP request');
+ return frame.contentWindow.fetch('resources/simple.html?referrerFull',
+ {referrerPolicy: "strict-origin-when-cross-origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + href + '\n' +
+ 'ReferrerPolicy: strict-origin-when-cross-origin',
+ 'Service Worker should respond to fetch with the referrer URL with "strict-origin-when-cross-origin" and a same origin request');
+ var http_url = get_host_info()['HTTPS_REMOTE_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url,
+ {referrerPolicy: "strict-origin-when-cross-origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: ' + origin + '/' + '\n' +
+ 'ReferrerPolicy: strict-origin-when-cross-origin',
+ 'Service Worker should respond to fetch with the referrer origin with "strict-origin-when-cross-origin" and a HTTPS cross origin request');
+ var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
+ '/resources/simple.html?referrerFull';
+ return frame.contentWindow.fetch(http_url,
+ {referrerPolicy: "strict-origin-when-cross-origin", referrer: referrer});
+ })
+ .then(function(response) { return response.text(); })
+ .then(function(response_text) {
+ assert_equals(
+ response_text,
+ 'Referrer: \n' +
+ 'ReferrerPolicy: strict-origin-when-cross-origin',
+ 'Service Worker should respond to fetch with no referrer with "strict-origin-when-cross-origin" and a HTTP request');
+ });
+}
+
+async_test(function(t) {
+ var scope = 'resources/simple.html?referrerPolicy';
+ var frame;
+ service_worker_unregister_and_register(t, worker, scope)
+ .then(function(reg) {
+ return wait_for_state(t, reg.installing, 'activated');
+ })
+ .then(function() { return with_iframe(scope); })
+ .then(function(f) {
+ frame = f;
+ assert_equals(
+ frame.contentDocument.body.textContent,
+ 'ReferrerPolicy: no-referrer-when-downgrade',
+ 'Service Worker should respond to fetch with the default referrer policy');
+ // First, run the referrer policy tests without passing a referrer in RequestInit.
+ return run_referrer_policy_tests(frame, undefined, frame.contentDocument.location.href,
+ frame.contentDocument.location.origin);
+ })
+ .then(function() {
+ // Now, run the referrer policy tests while passing a referrer in RequestInit.
+ var referrer = get_host_info()['HTTPS_ORIGIN'] + base_path() + 'fake-referrer';
+ return run_referrer_policy_tests(frame, 'fake-referrer', referrer,
+ frame.contentDocument.location.origin);
+ })
+ .then(function() {
+ frame.remove();
+ return service_worker_unregister_and_done(t, scope);
+ })
+ .catch(unreached_rejection(t));
+ }, 'Service Worker responds to fetch event with the referrer policy');
+
+</script>
+</body>
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 ba313c5f010..51446caebc6 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
@@ -98,261 +98,6 @@ async_test(function(t) {
.catch(unreached_rejection(t));
}, 'Service Worker responds to fetch event with the referrer URL');
-function run_referrer_policy_tests(frame, referrer, href, origin) {
- return frame.contentWindow.fetch('resources/simple.html?referrerFull',
- {method: "GET", referrer: referrer})
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + href + '\n' +
- 'ReferrerPolicy: no-referrer-when-downgrade',
- 'Service Worker should respond to fetch with the referrer URL when a member of RequestInit is present');
- var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url,
- {method: "GET", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: \n' +
- 'ReferrerPolicy: no-referrer-when-downgrade',
- 'Service Worker should respond to fetch with no referrer when a member of RequestInit is present with an HTTP request');
- return frame.contentWindow.fetch('resources/simple.html?referrerFull',
- {referrerPolicy: "", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + href + '\n' +
- 'ReferrerPolicy: no-referrer-when-downgrade',
- 'Service Worker should respond to fetch with the referrer with ""');
- var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url,
- {referrerPolicy: "", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: \n' +
- 'ReferrerPolicy: no-referrer-when-downgrade',
- 'Service Worker should respond to fetch with no referrer with ""');
- return frame.contentWindow.fetch('resources/simple.html?referrerFull',
- {referrerPolicy: "origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + origin + '/' + '\n' +
- 'ReferrerPolicy: origin',
- 'Service Worker should respond to fetch with the referrer origin with "origin" and a same origin request');
- var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url,
- {referrerPolicy: "origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + origin + '/' + '\n' +
- 'ReferrerPolicy: origin',
- 'Service Worker should respond to fetch with the referrer origin with "origin" and a cross origin request');
- return frame.contentWindow.fetch('resources/simple.html?referrerFull',
- {referrerPolicy: "origin-when-cross-origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + href + '\n' +
- 'ReferrerPolicy: origin-when-cross-origin',
- 'Service Worker should respond to fetch with the referrer URL with "origin-when-cross-origin" and a same origin request');
- var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url,
- {referrerPolicy: "origin-when-cross-origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + origin + '/' + '\n' +
- 'ReferrerPolicy: origin-when-cross-origin',
- 'Service Worker should respond to fetch with the referrer origin with "origin-when-cross-origin" and a cross origin request');
- return frame.contentWindow.fetch('resources/simple.html?referrerFull',
- {referrerPolicy: "no-referrer-when-downgrade", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + href + '\n' +
- 'ReferrerPolicy: no-referrer-when-downgrade',
- 'Service Worker should respond to fetch with no referrer with "no-referrer-when-downgrade" and a same origin request');
- var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url,
- {referrerPolicy: "no-referrer-when-downgrade", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: \n' +
- 'ReferrerPolicy: no-referrer-when-downgrade',
- 'Service Worker should respond to fetch with no referrer with "no-referrer-when-downgrade" and an HTTP request');
- var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url, {referrerPolicy: "unsafe-url", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + href + '\n' +
- 'ReferrerPolicy: unsafe-url',
- 'Service Worker should respond to fetch with no referrer with "unsafe-url"');
- return frame.contentWindow.fetch('resources/simple.html?referrerFull',
- {referrerPolicy: "no-referrer", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: \n' +
- 'ReferrerPolicy: no-referrer',
- 'Service Worker should respond to fetch with no referrer URL with "no-referrer"');
- return frame.contentWindow.fetch('resources/simple.html?referrerFull',
- {referrerPolicy: "same-origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + href + '\n' +
- 'ReferrerPolicy: same-origin',
- 'Service Worker should respond to fetch with referrer URL with "same-origin" and a same origin request');
- var http_url = get_host_info()['HTTPS_REMOTE_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url,
- {referrerPolicy: "same-origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: \n' +
- 'ReferrerPolicy: same-origin',
- 'Service Worker should respond to fetch with no referrer with "same-origin" and cross origin request');
- var http_url = get_host_info()['HTTPS_REMOTE_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url,
- {referrerPolicy: "strict-origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + origin + '/' + '\n' +
- 'ReferrerPolicy: strict-origin',
- 'Service Worker should respond to fetch with the referrer origin with "strict-origin" and a HTTPS cross origin request');
- return frame.contentWindow.fetch('resources/simple.html?referrerFull',
- {referrerPolicy: "strict-origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + origin + '/' + '\n' +
- 'ReferrerPolicy: strict-origin',
- 'Service Worker should respond to fetch with the referrer origin with "strict-origin" and a same origin request');
- var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url,
- {referrerPolicy: "strict-origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: \n' +
- 'ReferrerPolicy: strict-origin',
- 'Service Worker should respond to fetch with no referrer with "strict-origin" and a HTTP request');
- return frame.contentWindow.fetch('resources/simple.html?referrerFull',
- {referrerPolicy: "strict-origin-when-cross-origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + href + '\n' +
- 'ReferrerPolicy: strict-origin-when-cross-origin',
- 'Service Worker should respond to fetch with the referrer URL with "strict-origin-when-cross-origin" and a same origin request');
- var http_url = get_host_info()['HTTPS_REMOTE_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url,
- {referrerPolicy: "strict-origin-when-cross-origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: ' + origin + '/' + '\n' +
- 'ReferrerPolicy: strict-origin-when-cross-origin',
- 'Service Worker should respond to fetch with the referrer origin with "strict-origin-when-cross-origin" and a HTTPS cross origin request');
- var http_url = get_host_info()['HTTP_ORIGIN'] + base_path() +
- '/resources/simple.html?referrerFull';
- return frame.contentWindow.fetch(http_url,
- {referrerPolicy: "strict-origin-when-cross-origin", referrer: referrer});
- })
- .then(function(response) { return response.text(); })
- .then(function(response_text) {
- assert_equals(
- response_text,
- 'Referrer: \n' +
- 'ReferrerPolicy: strict-origin-when-cross-origin',
- 'Service Worker should respond to fetch with no referrer with "strict-origin-when-cross-origin" and a HTTP request');
- });
-}
-
-async_test(function(t) {
- var scope = 'resources/simple.html?referrerPolicy';
- var frame;
- service_worker_unregister_and_register(t, worker, scope)
- .then(function(reg) {
- return wait_for_state(t, reg.installing, 'activated');
- })
- .then(function() { return with_iframe(scope); })
- .then(function(f) {
- frame = f;
- assert_equals(
- frame.contentDocument.body.textContent,
- 'ReferrerPolicy: no-referrer-when-downgrade',
- 'Service Worker should respond to fetch with the default referrer policy');
- // First, run the referrer policy tests without passing a referrer in RequestInit.
- return run_referrer_policy_tests(frame, undefined, frame.contentDocument.location.href,
- frame.contentDocument.location.origin);
- })
- .then(function() {
- // Now, run the referrer policy tests while passing a referrer in RequestInit.
- var referrer = get_host_info()['HTTPS_ORIGIN'] + base_path() + 'fake-referrer';
- return run_referrer_policy_tests(frame, 'fake-referrer', referrer,
- frame.contentDocument.location.origin);
- })
- .then(function() {
- frame.remove();
- return service_worker_unregister_and_done(t, scope);
- })
- .catch(unreached_rejection(t));
- }, 'Service Worker responds to fetch event with the referrer policy');
-
async_test(function(t) {
var scope = 'resources/simple.html?clientId';
var frame;
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-frame-resource.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-frame-resource.https.html
index 4d30ff4caf7..2168e3e0d45 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-frame-resource.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-frame-resource.https.html
@@ -11,10 +11,6 @@ var worker = 'resources/fetch-rewrite-worker.js';
var path = base_path() + 'resources/fetch-access-control.py';
var host_info = get_host_info();
-if (window.testRunner) {
- testRunner.setCanOpenWindows();
-}
-
function getLoadedObject(win, contentFunc, closeFunc) {
return new Promise(function(resolve) {
function done(contentString) {
@@ -50,7 +46,12 @@ function getLoadedObject(win, contentFunc, closeFunc) {
win.onload = function() {
clearTimeout(timeout);
- var content = contentFunc(win);
+ let content = '';
+ try {
+ content = contentFunc(win);
+ } catch(e) {
+ // use default empty string for cross-domain window (see above)
+ }
done(content);
};
});
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-request-xhr.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-request-xhr.https.html
index 3f24946c8cc..37a457393b0 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-request-xhr.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/fetch-request-xhr.https.html
@@ -3,35 +3,73 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/test-helpers.sub.js?pipe-sub"></script>
<script>
-async_test(function(t) {
- var SCOPE = 'resources/fetch-request-xhr-iframe.https.html';
- var SCRIPT = 'resources/fetch-request-xhr-worker.js';
- var host_info = get_host_info();
- service_worker_unregister_and_register(t, SCRIPT, SCOPE)
- .then(function(registration) {
+let frame;
+
+// Set up the service worker and the frame.
+promise_test(t => {
+ const kScope = 'resources/fetch-request-xhr-iframe.https.html';
+ const kScript = 'resources/fetch-request-xhr-worker.js';
+ return service_worker_unregister_and_register(t, kScript, kScope)
+ .then(registration => {
+ promise_test(() => {
+ return registration.unregister();
+ }, 'restore global state');
+
return wait_for_state(t, registration.installing, 'activated');
})
- .then(function() { return with_iframe(SCOPE); })
- .then(function(frame) {
- t.add_cleanup(function() { frame.remove(); });
- var channel = new MessageChannel();
- channel.port1.onmessage = t.step_func(function(e) {
- if (e.data.results === 'finish') {
- service_worker_unregister_and_done(t, SCOPE);
- } else if (e.data.results == 'equals') {
- assert_equals(e.data.got, e.data.expected);
- } else if (e.data.results == 'array_equals') {
- assert_array_equals(e.data.got, e.data.expected, e.data.msg);
- } else if (e.data.results == 'failure') {
- throw e.data.error;
- }
- });
- frame.contentWindow.postMessage({},
- host_info['HTTPS_ORIGIN'],
- [channel.port2]);
+ .then(() => {
+ return with_iframe(kScope);
})
- .catch(unreached_rejection(t));
- }, 'Verify the body of FetchEvent using XMLHttpRequest');
+ .then(f => {
+ frame = f;
+ add_completion_callback(() => { f.remove(); });
+ });
+ }, 'initialize global state');
+
+// Run the tests.
+promise_test(t => {
+ return frame.contentWindow.get_header_test();
+ }, 'event.request has the expected headers for same-origin GET.');
+
+promise_test(t => {
+ return frame.contentWindow.post_header_test();
+ }, 'event.request has the expected headers for same-origin POST.');
+
+promise_test(t => {
+ return frame.contentWindow.cross_origin_get_header_test();
+ }, 'event.request has the expected headers for cross-origin GET.');
+
+promise_test(t => {
+ return frame.contentWindow.cross_origin_post_header_test();
+ }, 'event.request has the expected headers for cross-origin POST.');
+
+promise_test(t => {
+ return frame.contentWindow.string_test();
+ }, 'FetchEvent#request.body contains XHR request data (string)');
+
+promise_test(t => {
+ return frame.contentWindow.blob_test();
+ }, 'FetchEvent#request.body contains XHR request data (blob)');
+
+promise_test(t => {
+ return frame.contentWindow.custom_method_test();
+ }, 'FetchEvent#request.method is set to XHR method');
+
+promise_test(t => {
+ return frame.contentWindow.options_method_test();
+ }, 'XHR using OPTIONS method');
+
+promise_test(t => {
+ return frame.contentWindow.form_data_test();
+ }, 'XHR with form data');
+
+promise_test(t => {
+ return frame.contentWindow.mode_credentials_test();
+ }, 'XHR with mode/credentials set');
+
+promise_test(t => {
+ return frame.contentWindow.data_url_test();
+ }, 'XHR to data URL');
</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/immutable-prototype-serviceworker.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/immutable-prototype-serviceworker.https.html
new file mode 100644
index 00000000000..e63f6b348a8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/immutable-prototype-serviceworker.https.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+let expected = ['immutable', 'immutable', 'immutable', 'immutable', 'immutable'];
+
+promise_test(t =>
+ navigator.serviceWorker.register('resources/immutable-prototype-serviceworker.js', {scope: './resources/'})
+ .then(registration => {
+ let worker = registration.installing || registration.waiting || registration.active;
+ let channel = new MessageChannel()
+ worker.postMessage(channel.port2, [channel.port2]);
+ let resolve;
+ let promise = new Promise(r => resolve = r);
+ channel.port1.onmessage = resolve;
+ return promise.then(result => assert_array_equals(expected, result.data));
+ }),
+'worker prototype chain should be immutable');
+</script>
+</html>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/import-scripts-redirect.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/import-scripts-redirect.https.html
new file mode 100644
index 00000000000..e52adfa3780
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/import-scripts-redirect.https.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Tests for importScripts: redirect</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<body>
+<script>
+promise_test(async t => {
+ const scope = 'resources/import-scripts-redirect';
+ await service_worker_unregister(t, scope);
+ let reg = await navigator.serviceWorker.register(
+ 'resources/import-scripts-redirect-worker.js', { scope: scope });
+ assert_not_equals(reg.installing, null, 'worker is installing');
+ await reg.unregister();
+ }, 'importScripts() supports redirects');
+
+promise_test(async t => {
+ const scope = 'resources/import-scripts-redirect';
+ await service_worker_unregister(t, scope);
+ let reg = await navigator.serviceWorker.register(
+ 'resources/import-scripts-redirect-worker.js', { scope: scope });
+ assert_not_equals(reg.installing, null, 'worker is installing');
+ await wait_for_state(t, reg.installing, 'activated');
+ await Promise.all([
+ wait_for_update(t, reg),
+ reg.update()
+ ]);
+ assert_not_equals(reg.installing, null, 'worker is installing');
+ await reg.unregister();
+ }, 'importScripts() supports redirects and can be updated');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-sw.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-sw.https.html
new file mode 100644
index 00000000000..50c76d306dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-sw.https.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<title>Service Worker Global Scope Interfaces</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script>
+'use strict';
+
+service_worker_test(
+ 'resources/interfaces-worker.sub.js',
+ 'Interfaces and attributes in ServiceWorkerGlobalScope');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-window.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-window.https.html
new file mode 100644
index 00000000000..7097df06160
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces-window.https.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>Service Worker: Interfaces</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="resources/interfaces-idls.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script>
+'use strict';
+
+var idlArray = new IdlArray();
+idlArray.add_untested_idls(idls.untested);
+idlArray.add_idls(idls.tested);
+idlArray.add_objects({
+ ServiceWorkerContainer: ['navigator.serviceWorker']
+ });
+
+promise_test(function(t) {
+ var scope = 'resources/scope/interfaces-and-attributes';
+
+ return service_worker_unregister_and_register(
+ t, 'resources/empty-worker.js', scope)
+ .then(function(registration) {
+ t.add_cleanup(function() {
+ registration.unregister();
+ });
+
+ window.registrationInstance = registration;
+ idlArray.add_objects({
+ ServiceWorkerRegistration: ['window.registrationInstance'],
+ ServiceWorker: ['window.registrationInstance.installing']
+ });
+ idlArray.test();
+ });
+ }, 'test setup (worker registration)');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces.https.html
deleted file mode 100644
index 889142fe3af..00000000000
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/interfaces.https.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<title>Service Worker: Interfaces</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/interfaces.js"></script>
-<script src="resources/test-helpers.sub.js"></script>
-<script>
-
-test(function() {
- var EVENT_HANDLER = 'object';
- verify_interface(
- 'ServiceWorkerContainer', navigator.serviceWorker,
- {
- register: 'function',
- getRegistration: 'function',
- oncontrollerchange: EVENT_HANDLER,
- onmessage: EVENT_HANDLER,
- onmessageerror: EVENT_HANDLER
- });
- }, 'Interfaces and attributes of ServiceWorkerContainer');
-
-async_test(function(t) {
- var EVENT_HANDLER = 'object';
- var scope = 'resources/scope/interfaces-and-attributes';
-
- service_worker_unregister_and_register(
- t, 'resources/empty-worker.js', scope)
- .then(function(registration) {
- verify_interface(
- 'ServiceWorkerRegistration', registration,
- {
- installing: 'object',
- waiting: 'object',
- active: 'object',
- scope: 'string',
- unregister: 'function',
- onupdatefound: EVENT_HANDLER
- });
- verify_interface(
- 'ServiceWorker', registration.installing,
- {
- scriptURL: 'string',
- state: 'string',
- onstatechange: EVENT_HANDLER
- });
- return registration.unregister();
- })
- .then(function() {
- t.done();
- })
- .catch(unreached_rejection(t));
- }, 'Interfaces and attributes of ServiceWorker');
-
-service_worker_test(
- 'resources/interfaces-worker.sub.js',
- 'Interfaces and attributes in ServiceWorkerGlobalScope');
-
-</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-basic.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-basic.https.html
new file mode 100644
index 00000000000..83f3f482582
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-basic.https.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Service Worker: Register via link element (basic)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-basic.js"></script>
+<body>
+<script>
+registration_tests_basic(register_using_link, false);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-mime-types.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-mime-types.https.html
new file mode 100644
index 00000000000..beb7d58b627
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-mime-types.https.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Service Worker: Register via link element (MIME types)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-mime-types.js"></script>
+<body>
+<script>
+registration_tests_mime_types(register_using_link, false);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-scope.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-scope.https.html
new file mode 100644
index 00000000000..1b75c3865fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-scope.https.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<title>Service Worker: Register via link element (scope)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-scope.js"></script>
+<body>
+<script>
+registration_tests_scope(register_using_link, false);
+</script>
+</body>
+
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-script-url.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-script-url.https.html
new file mode 100644
index 00000000000..48cb9357a80
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-script-url.https.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Service Worker: Register via link element (scriptURL)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-script-url.js"></script>
+<body>
+<script>
+registration_tests_script_url(register_using_link, false);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-script.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-script.https.html
new file mode 100644
index 00000000000..4a2818df8db
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-script.https.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Service Worker: Register via link element (script)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-script.js"></script>
+<body>
+<script>
+registration_tests_script(register_using_link, false);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-security-error.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-security-error.https.html
new file mode 100644
index 00000000000..eae421d87e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/link-element-register-security-error.https.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Service Worker: Register via link element (SecurityError)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-security-error.js"></script>
+<body>
+<script>
+registration_tests_security_error(register_using_link, false);
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/mime-sniffing.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/mime-sniffing.https.html
new file mode 100644
index 00000000000..8175bcdf877
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/mime-sniffing.https.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>Service Worker: MIME sniffing</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script>
+promise_test(t => {
+ const SCOPE = 'resources/blank.html?mime-sniffing';
+ const SCRIPT = 'resources/mime-sniffing-worker.js';
+ return service_worker_unregister_and_register(t, SCRIPT, SCOPE)
+ .then(registration => {
+ add_completion_callback(() => registration.unregister());
+ return wait_for_state(t, registration.installing, 'activated');
+ })
+ .then(_ => with_iframe(SCOPE))
+ .then(frame => {
+ add_completion_callback(() => frame.remove());
+ assert_equals(frame.contentWindow.document.body.innerText, 'test');
+ const h1 = frame.contentWindow.document.getElementById('testid');
+ assert_equals(h1.innerText,'test');
+ });
+ }, 'The response from service worker should be correctly MIME siniffed.');
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/redirect-scope.py b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/redirect-scope.py
index 88dcc8ebc05..07ddd097690 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/redirect-scope.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/navigation-preload/resources/redirect-scope.py
@@ -16,6 +16,7 @@ def main(request, response):
if type == "no-location-with-body":
response.status = 302
+ response.headers.append("Content-Type", "text/html")
response.headers.append("Custom-Header", "hello")
return "<body>BODY</body>"
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/opaque-response-preloaded.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/opaque-response-preloaded.https.html
index ffe9344ea84..417aa4ebec8 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/opaque-response-preloaded.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/opaque-response-preloaded.https.html
@@ -7,19 +7,35 @@
<script>
const WORKER =
'resources/opaque-response-preloaded-worker.js';
-const SCOPE =
- 'resources/opaque-response-preloaded-iframe.html';
-var resolve_done;
-var done_was_called = new Promise(resolve => resolve_done = resolve);
-// Called by the iframe when done.
-function done(result) { resolve_done(result); }
-// This tests that the browser does not inappropriately use a cached opaque
+var done;
+
+// These test that the browser does not inappropriately use a cached opaque
// response for a request that is not no-cors. The test opens a controlled
// iframe that uses link rel=preload to issue a same-origin no-cors request.
// The service worker responds to the request with an opaque response. Then the
// iframe does an XHR (not no-cors) to that URL again. The request should fail.
promise_test(t => {
+ const SCOPE =
+ 'resources/opaque-response-being-preloaded-xhr.html';
+ const promise = new Promise(resolve => done = resolve);
+
+ return service_worker_unregister_and_register(t, WORKER, SCOPE)
+ .then(reg => {
+ add_completion_callback(() => reg.unregister());
+ return wait_for_state(t, reg.installing, 'activated');
+ })
+ .then(() => with_iframe(SCOPE))
+ .then(frame => t.add_cleanup(() => frame.remove() ))
+ .then(() => promise)
+ .then(result => assert_equals(result, 'PASS'));
+ }, 'Opaque responses should not be reused for XHRs, loading case');
+
+promise_test(t => {
+ const SCOPE =
+ 'resources/opaque-response-preloaded-xhr.html';
+ const promise = new Promise(resolve => done = resolve);
+
return service_worker_unregister_and_register(t, WORKER, SCOPE)
.then(reg => {
add_completion_callback(() => reg.unregister());
@@ -27,7 +43,8 @@ promise_test(t => {
})
.then(() => with_iframe(SCOPE))
.then(frame => t.add_cleanup(() => frame.remove() ))
- .then(() => done_was_called)
+ .then(() => promise)
.then(result => assert_equals(result, 'PASS'));
- }, 'Opaque responses should not be reused for XHRs');
+ }, 'Opaque responses should not be reused for XHRs, done case');
+
</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/register-link-element.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/register-link-element.https.html
deleted file mode 100644
index a4a4a19eb63..00000000000
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/register-link-element.https.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/test-helpers.sub.js"></script>
-<script src="resources/registration-tests.js"></script>
-<body>
-<script>
-
-function registerUsingLink(script, options) {
- var scope = options.scope;
- var link = document.createElement('link');
- link.setAttribute('rel', 'serviceworker');
- link.setAttribute('href', script);
- link.setAttribute('scope', scope);
- document.getElementsByTagName('head')[0].appendChild(link);
- return new Promise(function(resolve, reject) {
- link.onload = resolve;
- link.onerror = reject;
- })
- .then(() => navigator.serviceWorker.getRegistration(scope));
-}
-
-registration_tests(registerUsingLink, false);
-
-</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/registration-basic.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-basic.https.html
new file mode 100644
index 00000000000..1411a5d48cd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-basic.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Service Worker: Registration (basic)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-basic.js"></script>
+<script>
+registration_tests_basic((script, options) => navigator.serviceWorker.register(script, options), true);
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/registration-mime-types.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-mime-types.https.html
new file mode 100644
index 00000000000..9ae5f0956fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-mime-types.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Service Worker: Registration (MIME types)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-mime-types.js"></script>
+<script>
+registration_tests_mime_types((script, options) => navigator.serviceWorker.register(script, options), true);
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/registration-scope.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-scope.https.html
new file mode 100644
index 00000000000..f4a77d72b91
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-scope.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Service Worker: Registration (scope)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-scope.js"></script>
+<script>
+registration_tests_scope((script, options) => navigator.serviceWorker.register(script, options), true);
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/registration-script-url.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-script-url.https.html
new file mode 100644
index 00000000000..ea9ae7fe917
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-script-url.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Service Worker: Registration (scriptURL)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-script-url.js"></script>
+<script>
+registration_tests_script_url((script, options) => navigator.serviceWorker.register(script, options), true);
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/registration-script.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-script.https.html
new file mode 100644
index 00000000000..d1b3f0e700f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-script.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Service Worker: Registration (script)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-script.js"></script>
+<script>
+registration_tests_script((script, options) => navigator.serviceWorker.register(script, options), true);
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/registration-security-error.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-security-error.https.html
new file mode 100644
index 00000000000..8f0609ba5df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-security-error.https.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Service Worker: Registration (SecurityError)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="resources/registration-tests-security-error.js"></script>
+<script>
+registration_tests_security_error((script, options) => navigator.serviceWorker.register(script, options), true);
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html
new file mode 100644
index 00000000000..0df401efcc6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html
@@ -0,0 +1,222 @@
+<!DOCTYPE html>
+<title>Service Worker: Registration-updateViaCache</title>
+<script src="/resources/testharness.js"></script>
+<script src="resources/testharness-helpers.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script>
+ const UPDATE_VIA_CACHE_VALUES = [undefined, 'imports', 'all', 'none'];
+ const SCRIPT_URL = 'resources/update-max-aged-worker.py';
+ const SCOPE = 'resources/blank.html';
+
+ async function cleanup() {
+ const reg = await navigator.serviceWorker.getRegistration(SCOPE);
+ if (!reg) return;
+ if (reg.scope == new URL(SCOPE, location).href) {
+ return reg.unregister();
+ };
+ }
+
+ function getScriptTimes(sw, testName) {
+ return new Promise(resolve => {
+ navigator.serviceWorker.addEventListener('message', function listener(event) {
+ if (event.data.test !== testName) return;
+ navigator.serviceWorker.removeEventListener('message', listener);
+ resolve({
+ mainTime: event.data.mainTime,
+ importTime: event.data.importTime
+ });
+ });
+
+ sw.postMessage('');
+ });
+ }
+
+ function registerViaApi(scriptUrl, opts) {
+ return navigator.serviceWorker.register(scriptUrl, opts);
+ }
+
+ function registerViaLinkElement(scriptUrl, opts) {
+ return new Promise((resolve, reject) => {
+ const link = document.createElement('link');
+
+ if (link.relList.supports('serviceworker') == false) throw Error("link rel=serviceworker not supported");
+
+ link.rel = 'serviceworker';
+ link.href = scriptUrl;
+ link.scope = opts.scope;
+
+ if (opts.updateViaCache) {
+ link.updateViaCache = opts.updateViaCache;
+ }
+
+ link.onload = async () => {
+ const fullScope = new URL(opts.scope, window.location).href;
+
+ const regs = await navigator.serviceWorker.getRegistrations();
+ const reg = regs.find(r => r.scope == fullScope && (r.installing || r.waiting || r.active));
+
+ if (reg) {
+ document.head.removeChild(link);
+ resolve(reg);
+ }
+ else {
+ reject(Error('Service worker not registered'));
+ }
+ };
+
+ document.head.appendChild(link);
+ });
+ }
+
+ async function registerViaLinkHeader(scriptUrl, opts) {
+ const link = document.createElement('link');
+
+ const fullScope = new URL(opts.scope, window.location).href;
+ scriptUrl = new URL(scriptUrl, location).href;
+
+ // Assume that if the link element doesn't support serviceworker, the header doesn't either.
+ if (link.relList.supports('serviceworker') == false) throw Error("link rel=serviceworker not supported");
+
+ let linkHeader = `<${scriptUrl}>; rel=serviceworker; scope="${fullScope}"`;
+
+ if (opts.updateViaCache) {
+ linkHeader += `; updateviacache="${opts.updateViaCache}"`;
+ }
+
+ const linkHeaderSenderURL = new URL('resources/link-header.py', location);
+ linkHeaderSenderURL.searchParams.set('Link', linkHeader);
+
+ await fetch(linkHeaderSenderURL);
+ const frame = await with_iframe(fullScope);
+ await frame.contentWindow.navigator.serviceWorker.ready;
+
+ const regs = await navigator.serviceWorker.getRegistrations();
+ const reg = regs.find(r => r.scope == fullScope && (r.installing || r.waiting || r.active));
+
+ if (!reg) throw Error('Service worker not registered');
+
+ frame.parentNode.removeChild(frame);
+ return reg;
+ }
+
+ const registrationMethods = [
+ [registerViaApi, 'via-api'],
+ [registerViaLinkElement, 'via-link-element'],
+ [registerViaLinkHeader, 'via-link-header']
+ ];
+
+ // Test creating registrations & triggering an update.
+ for (const [registrationMethod, registrationMethodName] of registrationMethods) {
+ for (const updateViaCache of UPDATE_VIA_CACHE_VALUES) {
+ const testName = `register-${registrationMethodName}-updateViaCache-${updateViaCache}`;
+
+ promise_test(async t => {
+ await cleanup();
+
+ const opts = {scope: SCOPE};
+
+ if (updateViaCache) opts.updateViaCache = updateViaCache;
+
+ const reg = await registrationMethod(
+ `${SCRIPT_URL}?test=${testName}`,
+ opts
+ );
+
+ assert_equals(reg.updateViaCache, updateViaCache || 'imports', "reg.updateViaCache");
+
+ const sw = reg.installing || reg.waiting || reg.active;
+ await wait_for_state(t, sw, 'activated');
+ const values = await getScriptTimes(sw, testName);
+ await reg.update();
+
+ if (updateViaCache == 'all') {
+ assert_equals(reg.installing, null, "No new service worker");
+ }
+ else {
+ const newWorker = reg.installing;
+ assert_true(!!newWorker, "New worker installing");
+ const newValues = await getScriptTimes(newWorker, testName);
+
+ if (!updateViaCache || updateViaCache == 'imports') {
+ assert_not_equals(values.mainTime, newValues.mainTime, "Main script should have updated");
+ assert_equals(values.importTime, newValues.importTime, "Imported script should be the same");
+ }
+ else if (updateViaCache == 'none') {
+ assert_not_equals(values.mainTime, newValues.mainTime, "Main script should have updated");
+ assert_not_equals(values.importTime, newValues.importTime, "Imported script should have updated");
+ }
+ else {
+ // We should have handled all of the possible values for updateViaCache.
+ // If this runs, something's gone very wrong.
+ throw Error(`Unexpected updateViaCache value: ${updateViaCache}`);
+ }
+ }
+
+ await cleanup();
+ }, testName);
+ }
+ }
+
+ // Test changing the updateViaCache value of an existing registration.
+ for (const updateViaCache1 of UPDATE_VIA_CACHE_VALUES) {
+ for (const updateViaCache2 of UPDATE_VIA_CACHE_VALUES) {
+ const testName = `register-with-updateViaCache-${updateViaCache1}-then-${updateViaCache2}`;
+
+ promise_test(async t => {
+ await cleanup();
+
+ const fullScriptUrl = `${SCRIPT_URL}?test=${testName}`;
+ let opts = {scope: SCOPE};
+ if (updateViaCache1) opts.updateViaCache = updateViaCache1;
+
+ const reg = await navigator.serviceWorker.register(fullScriptUrl, opts);
+
+ const sw = reg.installing;
+ await wait_for_state(t, sw, 'activated');
+ const values = await getScriptTimes(sw, testName);
+
+ opts = {scope: SCOPE};
+ if (updateViaCache2) opts.updateViaCache = updateViaCache2;
+
+ await navigator.serviceWorker.register(fullScriptUrl, opts);
+
+ assert_equals(reg.updateViaCache, updateViaCache2 || 'imports', "reg.updateViaCache updated");
+
+ // If the update happens via the cache, the scripts will come back byte-identical.
+ // We bypass the byte-identical check if the script URL has changed, but not if
+ // only the updateViaCache value has changed.
+ if (updateViaCache2 == 'all') {
+ assert_equals(reg.installing, null, "No new service worker");
+ }
+ // If there's no change to the updateViaCache value, register should be a no-op.
+ // The default value should behave as 'imports'.
+ else if ((updateViaCache1 || 'imports') == (updateViaCache2 || 'imports')) {
+ assert_equals(reg.installing, null, "No new service worker");
+ }
+ else {
+ const newWorker = reg.installing;
+ assert_true(!!newWorker, "New worker installing");
+ const newValues = await getScriptTimes(newWorker, testName);
+
+ if (!updateViaCache2 || updateViaCache2 == 'imports') {
+ assert_not_equals(values.mainTime, newValues.mainTime, "Main script should have updated");
+ assert_equals(values.importTime, newValues.importTime, "Imported script should be the same");
+ }
+ else if (updateViaCache2 == 'none') {
+ assert_not_equals(values.mainTime, newValues.mainTime, "Main script should have updated");
+ assert_not_equals(values.importTime, newValues.importTime, "Imported script should have updated");
+ }
+ else {
+ // We should have handled all of the possible values for updateViaCache2.
+ // If this runs, something's gone very wrong.
+ throw Error(`Unexpected updateViaCache value: ${updateViaCache}`);
+ }
+ }
+
+ await cleanup();
+ }, testName);
+ }
+ }
+
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/registration.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/registration.https.html
deleted file mode 100644
index 587cac2fe4a..00000000000
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/registration.https.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<title>Service Worker: Registration</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/test-helpers.sub.js"></script>
-<script src="resources/registration-tests.js"></script>
-<script>
-registration_tests((script, options) => navigator.serviceWorker.register(script, options), true);
-</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/bytecheck-worker-imported-script.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/bytecheck-worker-imported-script.py
new file mode 100644
index 00000000000..04f544b9b1b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/bytecheck-worker-imported-script.py
@@ -0,0 +1,19 @@
+import time
+
+def main(request, response):
+ headers = [('Content-Type', 'application/javascript'),
+ ('Cache-Control', 'max-age=0')]
+
+ imported_content_type = ''
+ if 'imported' in request.GET:
+ imported_content_type = request.GET['imported']
+
+ imported_content = 'default'
+ if imported_content_type == 'time':
+ imported_content = '%f' % time.time()
+
+ body = '''
+ // %s
+ ''' % (imported_content)
+
+ return headers, body
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/bytecheck-worker.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/bytecheck-worker.py
new file mode 100644
index 00000000000..df8481b7d1e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/bytecheck-worker.py
@@ -0,0 +1,32 @@
+import time
+
+def main(request, response):
+ headers = [('Content-Type', 'application/javascript'),
+ ('Cache-Control', 'max-age=0')]
+
+ main_content_type = ''
+ if 'main' in request.GET:
+ main_content_type = request.GET['main']
+
+ main_content = 'default'
+ if main_content_type == 'time':
+ main_content = '%f' % time.time()
+
+ imported_request_path = ''
+ if 'path' in request.GET:
+ imported_request_path = request.GET['path']
+
+ imported_request_type = ''
+ if 'imported' in request.GET:
+ imported_request_type = request.GET['imported']
+
+ imported_request = ''
+ if imported_request_type == 'time':
+ imported_request = '?imported=time';
+
+ body = '''
+ // %s
+ importScripts('%sbytecheck-worker-imported-script.py%s');
+ ''' % (main_content, imported_request_path, imported_request)
+
+ return headers, body
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-shared-worker-fetch-iframe.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-shared-worker-fetch-iframe.html
new file mode 100644
index 00000000000..ad865b848f8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-shared-worker-fetch-iframe.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<script>
+var worker = new SharedWorker('./claim-shared-worker-fetch-worker.js');
+
+function fetch_in_shared_worker(url) {
+ return new Promise((resolve) => {
+ worker.port.onmessage = (event) => {
+ resolve(event.data);
+ };
+ worker.port.postMessage(url);
+ });
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-shared-worker-fetch-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-shared-worker-fetch-worker.js
new file mode 100644
index 00000000000..ddc8bea7af4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-shared-worker-fetch-worker.js
@@ -0,0 +1,8 @@
+self.onconnect = (event) => {
+ var port = event.ports[0];
+ event.ports[0].onmessage = (evt) => {
+ fetch(evt.data)
+ .then(response => response.text())
+ .then(text => port.postMessage(text));
+ };
+};
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-worker-fetch-iframe.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-worker-fetch-iframe.html
new file mode 100644
index 00000000000..92c5d15def0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-worker-fetch-iframe.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<script>
+var worker = new Worker('./claim-worker-fetch-worker.js');
+
+function fetch_in_worker(url) {
+ return new Promise((resolve) => {
+ worker.onmessage = (event) => {
+ resolve(event.data);
+ };
+ worker.postMessage(url);
+ });
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-worker-fetch-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-worker-fetch-worker.js
new file mode 100644
index 00000000000..7080181c85c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/claim-worker-fetch-worker.js
@@ -0,0 +1,5 @@
+self.onmessage = (event) => {
+ fetch(event.data)
+ .then(response => response.text())
+ .then(text => self.postMessage(text));
+};
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/extendable-event-async-waituntil.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/extendable-event-async-waituntil.js
index 40a4cbba2a2..abf54934a3b 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/extendable-event-async-waituntil.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/extendable-event-async-waituntil.js
@@ -43,9 +43,10 @@ self.addEventListener('message', function(event) {
async_task_waituntil(event).then(reportResultExpecting('InvalidStateError'));
break;
case 'script-extendable-event':
- new_event_waituntil().then(reportResultExpecting('InvalidStateError'));
+ self.dispatchEvent(new ExtendableEvent('nontrustedevent'));
break;
}
+
event.source.postMessage('ACK');
});
@@ -70,6 +71,10 @@ self.addEventListener('fetch', function(event) {
}
});
+self.addEventListener('nontrustedevent', function(event) {
+ sync_waituntil(event).then(reportResultExpecting('InvalidStateError'));
+ });
+
function reportResultExpecting(expectedResult) {
return function (result) {
port.postMessage({result : result, expected: expectedResult});
@@ -80,19 +85,7 @@ function reportResultExpecting(expectedResult) {
function sync_waituntil(event) {
return new Promise((res, rej) => {
try {
- event.waitUntil(Promise.resolve());
- res('OK');
- } catch (error) {
- res(error.name);
- }
- });
-}
-
-function new_event_waituntil() {
- return new Promise((res, rej) => {
- try {
- let e = new ExtendableEvent('foo');
- e.waitUntil(new Promise(() => {}));
+ event.waitUntil(Promise.resolve());
res('OK');
} catch (error) {
res(error.name);
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-canvas-tainting-iframe.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-canvas-tainting-iframe.html
index 75eca561611..9b068690993 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-canvas-tainting-iframe.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-canvas-tainting-iframe.html
@@ -159,7 +159,7 @@ window.addEventListener('message', function(evt) {
remote_image_url +
'&mode=same-origin&url=' + encodeURIComponent(image_url),
'',
- TAINTED),
+ NOT_TAINTED),
create_test_promise(
remote_image_url +
'&mode=same-origin&url=' + encodeURIComponent(image_url),
@@ -256,10 +256,7 @@ window.addEventListener('message', function(evt) {
encodeURIComponent(remote_image_url +
'&ACAOrigin=' + host_info['HTTPS_ORIGIN']),
'',
- TAINTED), // The cross-origin no-cors request is immediately tainted.
- // Since this happens before the service worker interception,
- // it does not matter what kind of response it returns.
- // The result will always be tainted.
+ NOT_TAINTED),
create_test_promise(
remote_image_url +
'&mode=cors&url=' +
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-redirect-iframe.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-redirect-iframe.html
deleted file mode 100644
index 7548d8af7d6..00000000000
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-event-redirect-iframe.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<script>
-window.addEventListener('message', function(evt) {
- var port = evt.ports[0];
- var data = evt.data;
- fetch(new Request(data.url, data.request_init)).then(function(response) {
- if (data.request_init.mode === 'no-cors' && data.redirect_dest != 'same-origin') {
- if (response.type === data.expected_type &&
- (response.type === 'opaque' || response.type === 'opaqueredirect') &&
- response.redirected === data.expected_redirected) {
- return {result: 'success', detail: ''};
- } else {
- return {result: 'failure',
- detail: 'expected type ' + data.expected_type +
- ', expected redirected ' + data.expected_redirected +
- ' response'};
- }
- }
- return response.json();
- }).then(function(body) {
- port.postMessage({result: body.result, detail: body.detail});
- }).catch(function(e) {
- port.postMessage({result: 'reject', detail: e.toString()});
- });
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-xhr-iframe.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-xhr-iframe.https.html
index 8afa237dc0e..867bf2385de 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-xhr-iframe.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-request-xhr-iframe.https.html
@@ -1,17 +1,9 @@
<script src="/common/get-host-info.sub.js"></script>
-<script src="test-helpers.sub.js?pipe=sub"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/test-helpers.sub.js?pipe=sub"></script>
<script>
-var port;
var host_info = get_host_info();
-function assert_equals(a, b) {
- port.postMessage({results: 'equals', got: a, expected: b});
-}
-
-function assert_array_equals(a, b, msg) {
- port.postMessage({results: 'array_equals', got: a, expected: b, msg: msg});
-}
-
function get_boundary(headers) {
var reg = new RegExp('multipart\/form-data; boundary=(.*)');
for (var i = 0; i < headers.length; ++i) {
@@ -231,24 +223,4 @@ function data_url_test() {
assert_equals(data, 'Foobar');
});
}
-
-window.addEventListener('message', function(evt) {
- port = evt.ports[0];
- get_header_test()
- .then(post_header_test)
- .then(cross_origin_get_header_test)
- .then(cross_origin_post_header_test)
- .then(string_test)
- .then(blob_test)
- .then(custom_method_test)
- .then(options_method_test)
- .then(form_data_test)
- .then(mode_credentials_test)
- .then(data_url_test)
- .then(function() { port.postMessage({results: 'finish'}); })
- .catch(function(reason) {
- var error = String(reason.message || reason);
- port.postMessage({results: 'failure', error: error});
- });
- });
</script>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-response-xhr-iframe.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-response-xhr-iframe.https.html
index 1414596c16e..612c9341eb7 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-response-xhr-iframe.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/fetch-response-xhr-iframe.https.html
@@ -26,7 +26,7 @@ function coalesce_headers_test() {
return new Promise(function(resolve) {
window.addEventListener('message', function handle(evt) {
- if (event.data !== 'ACK') {
+ if (evt.data !== 'ACK') {
return;
}
@@ -40,7 +40,7 @@ function coalesce_headers_test() {
window.addEventListener('message', function(evt) {
var port;
- if (event.data !== 'START') {
+ if (evt.data !== 'START') {
return;
}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/immutable-prototype-serviceworker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/immutable-prototype-serviceworker.js
new file mode 100644
index 00000000000..346b998ceac
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/immutable-prototype-serviceworker.js
@@ -0,0 +1,19 @@
+function prototypeChain(global) {
+ let result = [];
+ while (global !== null) {
+ let thrown = false;
+ let next = global.__proto__;
+ try {
+ global.__proto__ = {};
+ result.push('mutable');
+ } catch (e) {
+ result.push('immutable');
+ }
+ global = next;
+ }
+ return result;
+}
+
+self.onmessage = function(e) {
+ e.data.postMessage(prototypeChain(self));
+};
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-redirect-import.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-redirect-import.js
new file mode 100644
index 00000000000..56c04f09460
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-redirect-import.js
@@ -0,0 +1 @@
+// empty script
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-redirect-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-redirect-worker.js
new file mode 100644
index 00000000000..d02a45349c2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/import-scripts-redirect-worker.js
@@ -0,0 +1 @@
+importScripts('redirect.py?Redirect=import-scripts-version.py');
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces-idls.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces-idls.js
new file mode 100644
index 00000000000..9d0b4f18efe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces-idls.js
@@ -0,0 +1,130 @@
+var idls = {};
+idls.untested = `
+[Exposed=Worker]
+interface WorkerGlobalScope {};
+
+[TreatNonObjectAsNull]
+callback EventHandlerNonNull = any (Event event);
+typedef EventHandlerNonNull? EventHandler;
+
+[NoInterfaceObject, Exposed=(Window,Worker)]
+interface AbstractWorker {
+ attribute EventHandler onerror;
+};
+`;
+idls.tested = `
+[Global=(Worker,ServiceWorker), Exposed=ServiceWorker]
+interface ServiceWorkerGlobalScope : WorkerGlobalScope {
+ [SameObject] readonly attribute Clients clients;
+ [SameObject] readonly attribute ServiceWorkerRegistration registration;
+
+ [NewObject] Promise<void> skipWaiting();
+
+ attribute EventHandler oninstall;
+ attribute EventHandler onactivate;
+ attribute EventHandler onfetch;
+ attribute EventHandler onforeignfetch;
+
+ // event
+ attribute EventHandler onmessage; // event.source of the message events is Client object
+ attribute EventHandler onmessageerror;
+};
+
+[Exposed=ServiceWorker]
+interface Client {
+ readonly attribute USVString url;
+ readonly attribute DOMString id;
+ readonly attribute ClientType type;
+ readonly attribute boolean reserved;
+ void postMessage(any message, optional sequence<object> transfer = []);
+};
+
+[Exposed=ServiceWorker]
+interface WindowClient : Client {
+ readonly attribute VisibilityState visibilityState;
+ readonly attribute boolean focused;
+ [SameObject] readonly attribute FrozenArray<USVString> ancestorOrigins;
+ [NewObject] Promise<WindowClient> focus();
+ [NewObject] Promise<WindowClient> navigate(USVString url);
+};
+
+[Exposed=ServiceWorker]
+interface Clients {
+ // The objects returned will be new instances every time
+ [NewObject] Promise<any> get(DOMString id);
+ [NewObject] Promise<sequence<Client>> matchAll(optional ClientQueryOptions options);
+ [NewObject] Promise<WindowClient?> openWindow(USVString url);
+ [NewObject] Promise<void> claim();
+};
+
+[SecureContext, Exposed=(Window,Worker)]
+interface ServiceWorker : EventTarget {
+ readonly attribute USVString scriptURL;
+ readonly attribute ServiceWorkerState state;
+ void postMessage(any message, optional sequence<object> transfer = []);
+
+ // event
+ attribute EventHandler onstatechange;
+};
+ServiceWorker implements AbstractWorker;
+
+enum ServiceWorkerState {
+ "installing",
+ "installed",
+ "activating",
+ "activated",
+ "redundant"
+};
+
+[SecureContext, Exposed=(Window,Worker)]
+interface ServiceWorkerRegistration : EventTarget {
+ readonly attribute ServiceWorker? installing;
+ readonly attribute ServiceWorker? waiting;
+ readonly attribute ServiceWorker? active;
+ [SameObject] readonly attribute NavigationPreloadManager navigationPreload;
+
+ readonly attribute USVString scope;
+ readonly attribute ServiceWorkerUpdateViaCache updateViaCache;
+
+ [NewObject] Promise<void> update();
+ [NewObject] Promise<boolean> unregister();
+
+ // event
+ attribute EventHandler onupdatefound;
+};
+
+[Exposed=(Window,Worker)]
+interface EventTarget {
+ void addEventListener(DOMString type, EventListener? callback, optional (AddEventListenerOptions or boolean) options);
+ void removeEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options);
+ boolean dispatchEvent(Event event);
+};
+
+[SecureContext, Exposed=(Window,Worker)]
+interface NavigationPreloadManager {
+ Promise<void> enable();
+ Promise<void> disable();
+ Promise<void> setHeaderValue(ByteString value);
+ Promise<NavigationPreloadState> getState();
+};
+
+[SecureContext, Exposed=(Window,Worker)]
+interface Cache {
+ [NewObject] Promise<any> match(RequestInfo request, optional CacheQueryOptions options);
+ [NewObject] Promise<sequence<Response>> matchAll(optional RequestInfo request, optional CacheQueryOptions options);
+ [NewObject] Promise<void> add(RequestInfo request);
+ [NewObject] Promise<void> addAll(sequence<RequestInfo> requests);
+ [NewObject] Promise<void> put(RequestInfo request, Response response);
+ [NewObject] Promise<boolean> delete(RequestInfo request, optional CacheQueryOptions options);
+ [NewObject] Promise<sequence<Request>> keys(optional RequestInfo request, optional CacheQueryOptions options);
+};
+
+[SecureContext, Exposed=(Window,Worker)]
+interface CacheStorage {
+ [NewObject] Promise<any> match(RequestInfo request, optional CacheQueryOptions options);
+ [NewObject] Promise<boolean> has(DOMString cacheName);
+ [NewObject] Promise<Cache> open(DOMString cacheName);
+ [NewObject] Promise<boolean> delete(DOMString cacheName);
+ [NewObject] Promise<sequence<DOMString>> keys();
+};
+`;
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces-worker.sub.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces-worker.sub.js
index abb3417a4e5..ef333cb8400 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces-worker.sub.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces-worker.sub.js
@@ -1,74 +1,32 @@
-importScripts('interfaces.js');
-importScripts('worker-testharness.js');
-importScripts('../resources/testharness-helpers.js');
-
-var EVENT_HANDLER = 'object';
-
-test(function() {
- verify_interface('ServiceWorkerGlobalScope',
- self,
- {
- clients: 'object',
- registration: 'object',
- skipWaiting: 'function',
-
- onactivate: EVENT_HANDLER,
- onfetch: EVENT_HANDLER,
- oninstall: EVENT_HANDLER,
- onmessage: EVENT_HANDLER,
- onmessageerror: EVENT_HANDLER
- });
- }, 'ServiceWorkerGlobalScope');
-
-test(function() {
- verify_interface('Clients',
- self.clients,
- {
- claim: 'function',
- matchAll: 'function'
- });
- }, 'Clients');
+'use strict';
-test(function() {
- verify_interface('Client');
- // FIXME: Get an instance and test it, or ensure property exists on
- // prototype.
- }, 'Client');
-
-test(function() {
- verify_interface('WindowClient');
- // FIXME: Get an instance and test it, or ensure property exists on
- // prototype.
- }, 'WindowClient');
+importScripts('interfaces-idls.js');
+importScripts('worker-testharness.js');
+importScripts('/resources/WebIDLParser.js');
+importScripts('/resources/idlharness.js');
-test(function() {
- verify_interface('CacheStorage',
- self.caches,
- {
- match: 'function',
- has: 'function',
- open: 'function',
- delete: 'function',
- keys: 'function'
- });
- }, 'CacheStorage');
+var idlArray = new IdlArray();
+idlArray.add_untested_idls(idls.untested);
+idlArray.add_idls(idls.tested);
+idlArray.add_objects({
+ ServiceWorkerGlobalScope: ['self'],
+ Clients: ['self.clients'],
+ ServiceWorkerRegistration: ['self.registration'],
+ CacheStorage: ['self.caches']
+ // TODO: Test instances of Client and WindowClient, e.g.
+ // Client: ['self.clientInstance'],
+ // WindowClient: ['self.windowClientInstance']
+ });
promise_test(function(t) {
return create_temporary_cache(t)
.then(function(cache) {
- verify_interface('Cache',
- cache,
- {
- match: 'function',
- matchAll: 'function',
- add: 'function',
- addAll: 'function',
- put: 'function',
- delete: 'function',
- keys: 'function'
- });
+ self.cacheInstance = cache;
+
+ idlArray.add_objects({ Cache: ['self.cacheInstance'] });
+ idlArray.test();
});
- }, 'Cache');
+ }, 'test setup (cache creation)');
test(function() {
var req = new Request('http://{{host}}/',
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces.js
deleted file mode 100644
index eb00df65ff3..00000000000
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/interfaces.js
+++ /dev/null
@@ -1,15 +0,0 @@
-function verify_interface(name, instance, attributes) {
- assert_true(name in self,
- name + ' should be an defined type');
- if (instance) {
- assert_true(instance instanceof self[name],
- instance + ' should be an instance of ' + name);
- Object.keys(attributes || {}).forEach(function(attribute) {
- var type = attributes[attribute];
- assert_true(attribute in instance,
- attribute + ' should be an attribute of ' + name);
- assert_equals(typeof instance[attribute], type,
- attribute + ' should be of type ' + type);
- });
- }
-}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mime-sniffing-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mime-sniffing-worker.js
new file mode 100644
index 00000000000..046628055e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/mime-sniffing-worker.js
@@ -0,0 +1,5 @@
+self.addEventListener('fetch', function(event) {
+ var res = new Response('<!DOCTYPE html>\n<h1 id=\'testid\'>test</h1>');
+ res.headers.delete('content-type');
+ event.respondWith(res);
+ });
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-out-scope.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-out-scope.py
index 0cd5ef18516..907cefa3b1a 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-out-scope.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-out-scope.py
@@ -8,7 +8,7 @@ def main(request, response):
if "noLocationRedirect" in request.GET:
status = 302
- return status, [], '''
+ return status, [("content-type", "text/html")], '''
<!DOCTYPE html>
<script>
window.parent.postMessage(
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-scope1.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-scope1.py
index 0cd5ef18516..907cefa3b1a 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-scope1.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-scope1.py
@@ -8,7 +8,7 @@ def main(request, response):
if "noLocationRedirect" in request.GET:
status = 302
- return status, [], '''
+ return status, [("content-type", "text/html")], '''
<!DOCTYPE html>
<script>
window.parent.postMessage(
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-scope2.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-scope2.py
index 0cd5ef18516..907cefa3b1a 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-scope2.py
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/navigation-redirect-scope2.py
@@ -8,7 +8,7 @@ def main(request, response):
if "noLocationRedirect" in request.GET:
status = 302
- return status, [], '''
+ return status, [("content-type", "text/html")], '''
<!DOCTYPE html>
<script>
window.parent.postMessage(
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-being-preloaded-xhr.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-being-preloaded-xhr.html
new file mode 100644
index 00000000000..9c6d8bd504a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-being-preloaded-xhr.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<body></body>
+<script>
+const URL = 'opaque-response?from=opaque-response-being-preloaded-xhr.html';
+function runTest() {
+ var l = document.createElement('link');
+ // Use link rel=preload to try to get the browser to cache the opaque
+ // response.
+ l.setAttribute('rel', 'preload');
+ l.setAttribute('href', URL);
+ l.setAttribute('as', 'fetch');
+ l.onerror = function() {
+ parent.done('FAIL: preload failed unexpectedly');
+ };
+ document.body.appendChild(l);
+ xhr = new XMLHttpRequest;
+ xhr.withCredentials = true;
+ xhr.open('GET', URL);
+ // opaque-response returns an opaque response from serviceworker and thus
+ // the XHR must fail because it is not no-cors request.
+ // Particularly, the XHR must not reuse the opaque response from the
+ // preload request.
+ xhr.onerror = function() {
+ parent.done('PASS');
+ };
+ xhr.onload = function() {
+ parent.done('FAIL: ' + xhr.responseText);
+ };
+ xhr.send();
+}
+</script>
+<body onload="setTimeout(runTest, 100)"></body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-iframe.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-iframe.html
deleted file mode 100644
index d4d3024ede6..00000000000
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-iframe.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<body></body>
-<script>
-function runTest() {
- var l = document.createElement('link');
- // Use link rel=preload to try to get the browser to cache the opaque
- // response.
- l.setAttribute('rel', 'preload');
- l.setAttribute('href', 'opaque-response');
- l.setAttribute('as', 'fetch');
- l.onload = function() {
- xhr = new XMLHttpRequest;
- xhr.withCredentials = true;
- xhr.open('GET', 'opaque-response');
- // opaque-response returns an opaque response from serviceworker and thus
- // the XHR must fail because it is not no-cors request.
- // Particularly, the XHR must not reuse the opaque response from the
- // preload request.
- xhr.onerror = function() {
- parent.done('PASS');
- };
- xhr.onload = function() {
- parent.done('FAIL: ' + xhr.responseText);
- };
- xhr.send();
- };
- l.onerror = function() {
- parent.done('FAIL: preload failed unexpectedly');
- };
- document.body.appendChild(l);
-}
-</script>
-<body onload="setTimeout(runTest, 100)"></body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-worker.js
index 1615be2fede..9859bad45b7 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-worker.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-worker.js
@@ -4,7 +4,7 @@ var remoteUrl = get_host_info()['HTTPS_REMOTE_ORIGIN'] +
'/service-workers/service-worker/resources/simple.txt'
self.addEventListener('fetch', event => {
- if (!event.request.url.match(/opaque-response$/)) {
+ if (!event.request.url.match(/opaque-response\?from=/)) {
return;
}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-xhr.html b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-xhr.html
new file mode 100644
index 00000000000..f31ac9b5c4c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/opaque-response-preloaded-xhr.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<body></body>
+<script>
+const URL = 'opaque-response?from=opaque-response-preloaded-xhr.html';
+function runTest() {
+ var l = document.createElement('link');
+ // Use link rel=preload to try to get the browser to cache the opaque
+ // response.
+ l.setAttribute('rel', 'preload');
+ l.setAttribute('href', URL);
+ l.setAttribute('as', 'fetch');
+ l.onload = function() {
+ xhr = new XMLHttpRequest;
+ xhr.withCredentials = true;
+ xhr.open('GET', URL);
+ // opaque-response returns an opaque response from serviceworker and thus
+ // the XHR must fail because it is not no-cors request.
+ // Particularly, the XHR must not reuse the opaque response from the
+ // preload request.
+ xhr.onerror = function() {
+ parent.done('PASS');
+ };
+ xhr.onload = function() {
+ parent.done('FAIL: ' + xhr.responseText);
+ };
+ xhr.send();
+ };
+ l.onerror = function() {
+ parent.done('FAIL: preload failed unexpectedly');
+ };
+ document.body.appendChild(l);
+}
+</script>
+<body onload="setTimeout(runTest, 100)"></body>
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-basic.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-basic.js
new file mode 100644
index 00000000000..eedb980a0fc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-basic.js
@@ -0,0 +1,44 @@
+// Basic registration tests that succeed. We don't want too many successful
+// registration tests in the same file since starting a service worker can be
+// slow.
+function registration_tests_basic(register_method, check_error_types) {
+ promise_test(function(t) {
+ var script = 'resources/registration-worker.js';
+ var scope = 'resources/registration/normal';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ assert_true(
+ registration instanceof ServiceWorkerRegistration,
+ 'Successfully registered.');
+ return registration.unregister();
+ });
+ }, 'Registering normal scope');
+
+ promise_test(function(t) {
+ var script = 'resources/registration-worker.js';
+ var scope = 'resources/registration/scope-with-fragment#ref';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ assert_true(
+ registration instanceof ServiceWorkerRegistration,
+ 'Successfully registered.');
+ assert_equals(
+ registration.scope,
+ normalizeURL('resources/registration/scope-with-fragment'),
+ 'A fragment should be removed from scope')
+ return registration.unregister();
+ });
+ }, 'Registering scope with fragment');
+
+ promise_test(function(t) {
+ var script = 'resources/registration-worker.js';
+ var scope = 'resources/';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ assert_true(
+ registration instanceof ServiceWorkerRegistration,
+ 'Successfully registered.');
+ return registration.unregister();
+ });
+ }, 'Registering same scope as the script directory');
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-mime-types.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-mime-types.js
new file mode 100644
index 00000000000..1b8ea9be008
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-mime-types.js
@@ -0,0 +1,86 @@
+// Registration tests that mostly verify the MIME type.
+//
+// This file tests every MIME type so it necessarily starts many service
+// workers, so it may be slow.
+function registration_tests_mime_types(register_method, check_error_types) {
+ promise_test(function(t) {
+ var script = 'resources/mime-type-worker.py';
+ var scope = 'resources/scope/no-mime-type-worker/';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registration of no MIME type script should fail.');
+ }, 'Registering script with no MIME type');
+
+ promise_test(function(t) {
+ var script = 'resources/mime-type-worker.py?mime=text/plain';
+ var scope = 'resources/scope/bad-mime-type-worker/';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registration of plain text script should fail.');
+ }, 'Registering script with bad MIME type');
+
+ promise_test(function(t) {
+ var script = 'resources/import-mime-type-worker.py';
+ var scope = 'resources/scope/no-mime-type-worker/';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registration of no MIME type imported script should fail.');
+ }, 'Registering script that imports script with no MIME type');
+
+ promise_test(function(t) {
+ var script = 'resources/import-mime-type-worker.py?mime=text/plain';
+ var scope = 'resources/scope/bad-mime-type-worker/';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registration of plain text imported script should fail.');
+ }, 'Registering script that imports script with bad MIME type');
+
+ const validMimeTypes = [
+ 'application/ecmascript',
+ 'application/javascript',
+ 'application/x-ecmascript',
+ 'application/x-javascript',
+ 'text/ecmascript',
+ 'text/javascript',
+ 'text/javascript1.0',
+ 'text/javascript1.1',
+ 'text/javascript1.2',
+ 'text/javascript1.3',
+ 'text/javascript1.4',
+ 'text/javascript1.5',
+ 'text/jscript',
+ 'text/livescript',
+ 'text/x-ecmascript',
+ 'text/x-javascript'
+ ];
+
+ for (const validMimeType of validMimeTypes) {
+ promise_test(() => {
+ var script = `resources/mime-type-worker.py?mime=${validMimeType}`;
+ var scope = 'resources/scope/good-mime-type-worker/';
+
+ return register_method(script, {scope}).then(registration => {
+ assert_true(
+ registration instanceof ServiceWorkerRegistration,
+ 'Successfully registered.');
+ return registration.unregister();
+ });
+ }, `Registering script with good MIME type ${validMimeType}`);
+
+ promise_test(() => {
+ var script = `resources/import-mime-type-worker.py?mime=${validMimeType}`;
+ var scope = 'resources/scope/good-mime-type-worker/';
+
+ return register_method(script, { scope }).then(registration => {
+ assert_true(
+ registration instanceof ServiceWorkerRegistration,
+ 'Successfully registered.');
+ return registration.unregister();
+ });
+ }, `Registering script that imports script with good MIME type ${validMimeType}`);
+ }
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-scope.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-scope.js
new file mode 100644
index 00000000000..51b0ab4ad51
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-scope.js
@@ -0,0 +1,102 @@
+// Registration tests that mostly exercise the scope option.
+function registration_tests_scope(register_method, check_error_types) {
+ promise_test(function(t) {
+ var script = 'resources/empty-worker.js';
+ var scope = 'resources/scope%2fencoded-slash-in-scope';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'URL-encoded slash in the scope should be rejected.');
+ }, 'Scope including URL-encoded slash');
+
+ promise_test(function(t) {
+ var script = 'resources/empty-worker.js';
+ var scope = 'resources/scope%5cencoded-slash-in-scope';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'URL-encoded backslash in the scope should be rejected.');
+ }, 'Scope including URL-encoded backslash');
+
+ promise_test(function(t) {
+ // URL-encoded full-width 'scope'.
+ var name = '%ef%bd%93%ef%bd%83%ef%bd%8f%ef%bd%90%ef%bd%85';
+ var script = 'resources/empty-worker.js';
+ var scope = 'resources/' + name + '/escaped-multibyte-character-scope';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ assert_equals(
+ registration.scope,
+ normalizeURL(scope),
+ 'URL-encoded multibyte characters should be available.');
+ return registration.unregister();
+ });
+ }, 'Scope including URL-encoded multibyte characters');
+
+ promise_test(function(t) {
+ // Non-URL-encoded full-width "scope".
+ var name = String.fromCodePoint(0xff53, 0xff43, 0xff4f, 0xff50, 0xff45);
+ var script = 'resources/empty-worker.js';
+ var scope = 'resources/' + name + '/non-escaped-multibyte-character-scope';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ assert_equals(
+ registration.scope,
+ normalizeURL(scope),
+ 'Non-URL-encoded multibyte characters should be available.');
+ return registration.unregister();
+ });
+ }, 'Scope including non-escaped multibyte characters');
+
+ promise_test(function(t) {
+ var script = 'resources/empty-worker.js';
+ var scope = 'resources/././scope/self-reference-in-scope';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ assert_equals(
+ registration.scope,
+ normalizeURL('resources/scope/self-reference-in-scope'),
+ 'Scope including self-reference should be normalized.');
+ return registration.unregister();
+ });
+ }, 'Scope including self-reference');
+
+ promise_test(function(t) {
+ var script = 'resources/empty-worker.js';
+ var scope = 'resources/../resources/scope/parent-reference-in-scope';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ assert_equals(
+ registration.scope,
+ normalizeURL('resources/scope/parent-reference-in-scope'),
+ 'Scope including parent-reference should be normalized.');
+ return registration.unregister();
+ });
+ }, 'Scope including parent-reference');
+
+ promise_test(function(t) {
+ var script = 'resources/empty-worker.js';
+ var scope = 'resources/scope////consecutive-slashes-in-scope';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ // Although consecutive slashes in the scope are not unified, the
+ // scope is under the script directory and registration should
+ // succeed.
+ assert_equals(
+ registration.scope,
+ normalizeURL(scope),
+ 'Should successfully be registered.');
+ return registration.unregister();
+ })
+ }, 'Scope including consecutive slashes');
+
+ promise_test(function(t) {
+ var script = 'resources/empty-worker.js';
+ var scope = 'filesystem:' + normalizeURL('resources/scope/filesystem-scope-url');
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registering with the scope that has same-origin filesystem: URL ' +
+ 'should fail with SecurityError.');
+ }, 'Scope URL is same-origin filesystem: URL');
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-script-url.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-script-url.js
new file mode 100644
index 00000000000..8d777a83099
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-script-url.js
@@ -0,0 +1,64 @@
+// Registration tests that mostly exercise the scriptURL parameter.
+function registration_tests_script_url(register_method, check_error_types) {
+ promise_test(function(t) {
+ var script = 'resources%2fempty-worker.js';
+ var scope = 'resources/scope/encoded-slash-in-script-url';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'URL-encoded slash in the script URL should be rejected.');
+ }, 'Script URL including URL-encoded slash');
+
+ promise_test(function(t) {
+ var script = 'resources%2Fempty-worker.js';
+ var scope = 'resources/scope/encoded-slash-in-script-url';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'URL-encoded slash in the script URL should be rejected.');
+ }, 'Script URL including uppercase URL-encoded slash');
+
+ promise_test(function(t) {
+ var script = 'resources%5cempty-worker.js';
+ var scope = 'resources/scope/encoded-slash-in-script-url';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'URL-encoded backslash in the script URL should be rejected.');
+ }, 'Script URL including URL-encoded backslash');
+
+ promise_test(function(t) {
+ var script = 'resources%5Cempty-worker.js';
+ var scope = 'resources/scope/encoded-slash-in-script-url';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'URL-encoded backslash in the script URL should be rejected.');
+ }, 'Script URL including uppercase URL-encoded backslash');
+
+ promise_test(function(t) {
+ var script = 'resources/././empty-worker.js';
+ var scope = 'resources/scope/parent-reference-in-script-url';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ assert_equals(
+ get_newest_worker(registration).scriptURL,
+ normalizeURL('resources/empty-worker.js'),
+ 'Script URL including self-reference should be normalized.');
+ return registration.unregister();
+ });
+ }, 'Script URL including self-reference');
+
+ promise_test(function(t) {
+ var script = 'resources/../resources/empty-worker.js';
+ var scope = 'resources/scope/parent-reference-in-script-url';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ assert_equals(
+ get_newest_worker(registration).scriptURL,
+ normalizeURL('resources/empty-worker.js'),
+ 'Script URL including parent-reference should be normalized.');
+ return registration.unregister();
+ });
+ }, 'Script URL including parent-reference');
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-script.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-script.js
new file mode 100644
index 00000000000..0e6859bdcea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-script.js
@@ -0,0 +1,88 @@
+// Registration tests that mostly exercise the service worker script contents or
+// response.
+function registration_tests_script(register_method, check_error_types) {
+ promise_test(function(t) {
+ var script = 'resources/invalid-chunked-encoding.py';
+ var scope = 'resources/scope/invalid-chunked-encoding/';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'Registration of invalid chunked encoding script should fail.');
+ }, 'Registering invalid chunked encoding script');
+
+ promise_test(function(t) {
+ var script = 'resources/invalid-chunked-encoding-with-flush.py';
+ var scope = 'resources/scope/invalid-chunked-encoding-with-flush/';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'Registration of invalid chunked encoding script should fail.');
+ }, 'Registering invalid chunked encoding script with flush');
+
+ promise_test(function(t) {
+ var script = 'resources/malformed-worker.py?parse-error';
+ var scope = 'resources/scope/parse-error';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'Registration of script including parse error should fail.');
+ }, 'Registering script including parse error');
+
+ promise_test(function(t) {
+ var script = 'resources/malformed-worker.py?undefined-error';
+ var scope = 'resources/scope/undefined-error';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'Registration of script including undefined error should fail.');
+ }, 'Registering script including undefined error');
+
+ promise_test(function(t) {
+ var script = 'resources/malformed-worker.py?uncaught-exception';
+ var scope = 'resources/scope/uncaught-exception';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'Registration of script including uncaught exception should fail.');
+ }, 'Registering script including uncaught exception');
+
+ promise_test(function(t) {
+ var script = 'resources/malformed-worker.py?import-malformed-script';
+ var scope = 'resources/scope/import-malformed-script';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'Registration of script importing malformed script should fail.');
+ }, 'Registering script importing malformed script');
+
+ promise_test(function(t) {
+ var script = 'resources/no-such-worker.js';
+ var scope = 'resources/scope/no-such-worker';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'Registration of non-existent script should fail.');
+ }, 'Registering non-existent script');
+
+ promise_test(function(t) {
+ var script = 'resources/malformed-worker.py?import-no-such-script';
+ var scope = 'resources/scope/import-no-such-script';
+ return promise_rejects(t,
+ check_error_types ? new TypeError : null,
+ register_method(script, {scope: scope}),
+ 'Registration of script importing non-existent script should fail.');
+ }, 'Registering script importing non-existent script');
+
+ promise_test(function(t) {
+ var script = 'resources/malformed-worker.py?caught-exception';
+ var scope = 'resources/scope/caught-exception';
+ return register_method(script, {scope: scope})
+ .then(function(registration) {
+ assert_true(
+ registration instanceof ServiceWorkerRegistration,
+ 'Successfully registered.');
+ return registration.unregister();
+ });
+ }, 'Registering script including caught exception');
+
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-security-error.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-security-error.js
new file mode 100644
index 00000000000..c84bb66e042
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests-security-error.js
@@ -0,0 +1,78 @@
+// Registration tests that mostly exercise SecurityError cases.
+function registration_tests_security_error(register_method, check_error_types) {
+ promise_test(function(t) {
+ var script = 'resources/registration-worker.js';
+ var scope = 'resources';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registering same scope as the script directory without the last ' +
+ 'slash should fail with SecurityError.');
+ }, 'Registering same scope as the script directory without the last slash');
+
+ promise_test(function(t) {
+ var script = 'resources/registration-worker.js';
+ var scope = 'different-directory/';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registration scope outside the script directory should fail ' +
+ 'with SecurityError.');
+ }, 'Registration scope outside the script directory');
+
+ promise_test(function(t) {
+ var script = 'resources/registration-worker.js';
+ var scope = 'http://example.com/';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registration scope outside domain should fail with SecurityError.');
+ }, 'Registering scope outside domain');
+
+ promise_test(function(t) {
+ var script = 'http://example.com/worker.js';
+ var scope = 'http://example.com/scope/';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registration script outside domain should fail with SecurityError.');
+ }, 'Registering script outside domain');
+
+ promise_test(function(t) {
+ var script = 'resources/redirect.py?Redirect=' +
+ encodeURIComponent('/resources/registration-worker.js');
+ var scope = 'resources/scope/redirect/';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registration of redirected script should fail.');
+ }, 'Registering redirected script');
+
+ promise_test(function(t) {
+ var script = 'resources/empty-worker.js';
+ var scope = 'resources/../scope/parent-reference-in-scope';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Scope not under the script directory should be rejected.');
+ }, 'Scope including parent-reference and not under the script directory');
+
+ promise_test(function(t) {
+ var script = 'resources////empty-worker.js';
+ var scope = 'resources/scope/consecutive-slashes-in-script-url';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Consecutive slashes in the script url should not be unified.');
+ }, 'Script URL including consecutive slashes');
+
+ promise_test(function(t) {
+ var script = 'filesystem:' + normalizeURL('resources/empty-worker.js');
+ var scope = 'resources/scope/filesystem-script-url';
+ return promise_rejects(t,
+ check_error_types ? 'SecurityError' : null,
+ register_method(script, {scope: scope}),
+ 'Registering a script which has same-origin filesystem: URL should ' +
+ 'fail with SecurityError.');
+ }, 'Script URL is same-origin filesystem: URL');
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests.js
deleted file mode 100644
index cf606281912..00000000000
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/registration-tests.js
+++ /dev/null
@@ -1,460 +0,0 @@
-function registration_tests(register_method, check_error_types) {
- // The navigator.serviceWorker.register() method guarantees that the newly
- // installing worker is available as registration.installing when its promise
- // resolves. However these tests are also used to test installation using a
- // <link> element where it is possible for the installing worker to have
- // already become the waiting or active worker. So This method is used to get
- // the newest worker when these tests need access to the ServiceWorker itself.
- function get_newest_worker(registration) {
- if (registration.installing)
- return registration.installing;
- if (registration.waiting)
- return registration.waiting;
- if (registration.active)
- return registration.active;
- }
-
- promise_test(function(t) {
- var script = 'resources/registration-worker.js';
- var scope = 'resources/registration/normal';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- assert_true(
- registration instanceof ServiceWorkerRegistration,
- 'Successfully registered.');
- return registration.unregister();
- });
- }, 'Registering normal scope');
-
- promise_test(function(t) {
- var script = 'resources/registration-worker.js';
- var scope = 'resources/registration/scope-with-fragment#ref';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- assert_true(
- registration instanceof ServiceWorkerRegistration,
- 'Successfully registered.');
- assert_equals(
- registration.scope,
- normalizeURL('resources/registration/scope-with-fragment'),
- 'A fragment should be removed from scope')
- return registration.unregister();
- });
- }, 'Registering scope with fragment');
-
- promise_test(function(t) {
- var script = 'resources/registration-worker.js';
- var scope = 'resources/';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- assert_true(
- registration instanceof ServiceWorkerRegistration,
- 'Successfully registered.');
- return registration.unregister();
- });
- }, 'Registering same scope as the script directory');
-
- promise_test(function(t) {
- var script = 'resources/registration-worker.js';
- var scope = 'resources';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registering same scope as the script directory without the last ' +
- 'slash should fail with SecurityError.');
- }, 'Registering same scope as the script directory without the last slash');
-
- promise_test(function(t) {
- var script = 'resources/registration-worker.js';
- var scope = 'different-directory/';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registration scope outside the script directory should fail ' +
- 'with SecurityError.');
- }, 'Registration scope outside the script directory');
-
- promise_test(function(t) {
- var script = 'resources/registration-worker.js';
- var scope = 'http://example.com/';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registration scope outside domain should fail with SecurityError.');
- }, 'Registering scope outside domain');
-
- promise_test(function(t) {
- var script = 'http://example.com/worker.js';
- var scope = 'http://example.com/scope/';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registration script outside domain should fail with SecurityError.');
- }, 'Registering script outside domain');
-
- promise_test(function(t) {
- var script = 'resources/no-such-worker.js';
- var scope = 'resources/scope/no-such-worker';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'Registration of non-existent script should fail.');
- }, 'Registering non-existent script');
-
- promise_test(function(t) {
- var script = 'resources/invalid-chunked-encoding.py';
- var scope = 'resources/scope/invalid-chunked-encoding/';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'Registration of invalid chunked encoding script should fail.');
- }, 'Registering invalid chunked encoding script');
-
- promise_test(function(t) {
- var script = 'resources/invalid-chunked-encoding-with-flush.py';
- var scope = 'resources/scope/invalid-chunked-encoding-with-flush/';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'Registration of invalid chunked encoding script should fail.');
- }, 'Registering invalid chunked encoding script with flush');
-
- promise_test(function(t) {
- var script = 'resources/mime-type-worker.py';
- var scope = 'resources/scope/no-mime-type-worker/';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registration of no MIME type script should fail.');
- }, 'Registering script with no MIME type');
-
- promise_test(function(t) {
- var script = 'resources/mime-type-worker.py?mime=text/plain';
- var scope = 'resources/scope/bad-mime-type-worker/';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registration of plain text script should fail.');
- }, 'Registering script with bad MIME type');
-
- const validMimeTypes = [
- 'application/ecmascript',
- 'application/javascript',
- 'application/x-ecmascript',
- 'application/x-javascript',
- 'text/ecmascript',
- 'text/javascript',
- 'text/javascript1.0',
- 'text/javascript1.1',
- 'text/javascript1.2',
- 'text/javascript1.3',
- 'text/javascript1.4',
- 'text/javascript1.5',
- 'text/jscript',
- 'text/livescript',
- 'text/x-ecmascript',
- 'text/x-javascript'
- ];
-
- for (const validMimeType of validMimeTypes) {
- promise_test(() => {
- var script = `resources/mime-type-worker.py?mime=${validMimeType}`;
- var scope = 'resources/scope/good-mime-type-worker/';
-
- return register_method(script, {scope}).then(registration => {
- assert_true(
- registration instanceof ServiceWorkerRegistration,
- 'Successfully registered.');
- return registration.unregister();
- });
- }, `Registering script with good MIME type ${validMimeType}`);
-
- promise_test(() => {
- var script = `resources/import-mime-type-worker.py?mime=${validMimeType}`;
- var scope = 'resources/scope/good-mime-type-worker/';
-
- return register_method(script, { scope }).then(registration => {
- assert_true(
- registration instanceof ServiceWorkerRegistration,
- 'Successfully registered.');
- return registration.unregister();
- });
- }, `Registering script that imports script with good MIME type ${validMimeType}`);
- }
-
- promise_test(function(t) {
- var script = 'resources/import-mime-type-worker.py';
- var scope = 'resources/scope/no-mime-type-worker/';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registration of no MIME type imported script should fail.');
- }, 'Registering script that imports script with no MIME type');
-
- promise_test(function(t) {
- var script = 'resources/import-mime-type-worker.py?mime=text/plain';
- var scope = 'resources/scope/bad-mime-type-worker/';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registration of plain text imported script should fail.');
- }, 'Registering script that imports script with bad MIME type');
-
-
- promise_test(function(t) {
- var script = 'resources/redirect.py?Redirect=' +
- encodeURIComponent('/resources/registration-worker.js');
- var scope = 'resources/scope/redirect/';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registration of redirected script should fail.');
- }, 'Registering redirected script');
-
- promise_test(function(t) {
- var script = 'resources/malformed-worker.py?parse-error';
- var scope = 'resources/scope/parse-error';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'Registration of script including parse error should fail.');
- }, 'Registering script including parse error');
-
- promise_test(function(t) {
- var script = 'resources/malformed-worker.py?undefined-error';
- var scope = 'resources/scope/undefined-error';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'Registration of script including undefined error should fail.');
- }, 'Registering script including undefined error');
-
- promise_test(function(t) {
- var script = 'resources/malformed-worker.py?uncaught-exception';
- var scope = 'resources/scope/uncaught-exception';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'Registration of script including uncaught exception should fail.');
- }, 'Registering script including uncaught exception');
-
- promise_test(function(t) {
- var script = 'resources/malformed-worker.py?caught-exception';
- var scope = 'resources/scope/caught-exception';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- assert_true(
- registration instanceof ServiceWorkerRegistration,
- 'Successfully registered.');
- return registration.unregister();
- });
- }, 'Registering script including caught exception');
-
- promise_test(function(t) {
- var script = 'resources/malformed-worker.py?import-malformed-script';
- var scope = 'resources/scope/import-malformed-script';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'Registration of script importing malformed script should fail.');
- }, 'Registering script importing malformed script');
-
- promise_test(function(t) {
- var script = 'resources/malformed-worker.py?import-no-such-script';
- var scope = 'resources/scope/import-no-such-script';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'Registration of script importing non-existent script should fail.');
- }, 'Registering script importing non-existent script');
-
- promise_test(function(t) {
- // URL-encoded full-width 'scope'.
- var name = '%ef%bd%93%ef%bd%83%ef%bd%8f%ef%bd%90%ef%bd%85';
- var script = 'resources/empty-worker.js';
- var scope = 'resources/' + name + '/escaped-multibyte-character-scope';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- assert_equals(
- registration.scope,
- normalizeURL(scope),
- 'URL-encoded multibyte characters should be available.');
- return registration.unregister();
- });
- }, 'Scope including URL-encoded multibyte characters');
-
- promise_test(function(t) {
- // Non-URL-encoded full-width "scope".
- var name = String.fromCodePoint(0xff53, 0xff43, 0xff4f, 0xff50, 0xff45);
- var script = 'resources/empty-worker.js';
- var scope = 'resources/' + name + '/non-escaped-multibyte-character-scope';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- assert_equals(
- registration.scope,
- normalizeURL(scope),
- 'Non-URL-encoded multibyte characters should be available.');
- return registration.unregister();
- });
- }, 'Scope including non-escaped multibyte characters');
-
- promise_test(function(t) {
- var script = 'resources%2fempty-worker.js';
- var scope = 'resources/scope/encoded-slash-in-script-url';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'URL-encoded slash in the script URL should be rejected.');
- }, 'Script URL including URL-encoded slash');
-
- promise_test(function(t) {
- var script = 'resources%2Fempty-worker.js';
- var scope = 'resources/scope/encoded-slash-in-script-url';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'URL-encoded slash in the script URL should be rejected.');
- }, 'Script URL including uppercase URL-encoded slash');
-
- promise_test(function(t) {
- var script = 'resources/empty-worker.js';
- var scope = 'resources/scope%2fencoded-slash-in-scope';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'URL-encoded slash in the scope should be rejected.');
- }, 'Scope including URL-encoded slash');
-
- promise_test(function(t) {
- var script = 'resources%5cempty-worker.js';
- var scope = 'resources/scope/encoded-slash-in-script-url';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'URL-encoded backslash in the script URL should be rejected.');
- }, 'Script URL including URL-encoded backslash');
-
- promise_test(function(t) {
- var script = 'resources%5Cempty-worker.js';
- var scope = 'resources/scope/encoded-slash-in-script-url';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'URL-encoded backslash in the script URL should be rejected.');
- }, 'Script URL including uppercase URL-encoded backslash');
-
- promise_test(function(t) {
- var script = 'resources/empty-worker.js';
- var scope = 'resources/scope%5cencoded-slash-in-scope';
- return promise_rejects(t,
- check_error_types ? new TypeError : null,
- register_method(script, {scope: scope}),
- 'URL-encoded backslash in the scope should be rejected.');
- }, 'Scope including URL-encoded backslash');
-
- promise_test(function(t) {
- var script = 'resources/././empty-worker.js';
- var scope = 'resources/scope/parent-reference-in-script-url';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- assert_equals(
- get_newest_worker(registration).scriptURL,
- normalizeURL('resources/empty-worker.js'),
- 'Script URL including self-reference should be normalized.');
- return registration.unregister();
- });
- }, 'Script URL including self-reference');
-
- promise_test(function(t) {
- var script = 'resources/empty-worker.js';
- var scope = 'resources/././scope/self-reference-in-scope';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- assert_equals(
- registration.scope,
- normalizeURL('resources/scope/self-reference-in-scope'),
- 'Scope including self-reference should be normalized.');
- return registration.unregister();
- });
- }, 'Scope including self-reference');
-
- promise_test(function(t) {
- var script = 'resources/../resources/empty-worker.js';
- var scope = 'resources/scope/parent-reference-in-script-url';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- assert_equals(
- get_newest_worker(registration).scriptURL,
- normalizeURL('resources/empty-worker.js'),
- 'Script URL including parent-reference should be normalized.');
- return registration.unregister();
- });
- }, 'Script URL including parent-reference');
-
- promise_test(function(t) {
- var script = 'resources/empty-worker.js';
- var scope = 'resources/../resources/scope/parent-reference-in-scope';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- assert_equals(
- registration.scope,
- normalizeURL('resources/scope/parent-reference-in-scope'),
- 'Scope including parent-reference should be normalized.');
- return registration.unregister();
- });
- }, 'Scope including parent-reference');
-
- promise_test(function(t) {
- var script = 'resources/empty-worker.js';
- var scope = 'resources/../scope/parent-reference-in-scope';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Scope not under the script directory should be rejected.');
- }, 'Scope including parent-reference and not under the script directory');
-
- promise_test(function(t) {
- var script = 'resources////empty-worker.js';
- var scope = 'resources/scope/consecutive-slashes-in-script-url';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Consecutive slashes in the script url should not be unified.');
- }, 'Script URL including consecutive slashes');
-
- promise_test(function(t) {
- var script = 'resources/empty-worker.js';
- var scope = 'resources/scope////consecutive-slashes-in-scope';
- return register_method(script, {scope: scope})
- .then(function(registration) {
- // Although consecutive slashes in the scope are not unified, the
- // scope is under the script directory and registration should
- // succeed.
- assert_equals(
- registration.scope,
- normalizeURL(scope),
- 'Should successfully be registered.');
- return registration.unregister();
- })
- }, 'Scope including consecutive slashes');
-
- promise_test(function(t) {
- var script = 'filesystem:' + normalizeURL('resources/empty-worker.js');
- var scope = 'resources/scope/filesystem-script-url';
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registering a script which has same-origin filesystem: URL should ' +
- 'fail with SecurityError.');
- }, 'Script URL is same-origin filesystem: URL');
-
- promise_test(function(t) {
- var script = 'resources/empty-worker.js';
- var scope = 'filesystem:' + normalizeURL('resources/scope/filesystem-scope-url');
- return promise_rejects(t,
- check_error_types ? 'SecurityError' : null,
- register_method(script, {scope: scope}),
- 'Registering with the scope that has same-origin filesystem: URL ' +
- 'should fail with SecurityError.');
- }, 'Scope URL is same-origin filesystem: URL');
-}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/skip-waiting-installed-worker.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/skip-waiting-installed-worker.js
index eb63026d5c4..b48d502b136 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/skip-waiting-installed-worker.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/skip-waiting-installed-worker.js
@@ -1,19 +1,11 @@
-self.state = 'starting';
-
-self.addEventListener('install', function() {
- self.state = 'installing';
- });
+var saw_activate_event = false
self.addEventListener('activate', function() {
- self.state = 'activating';
+ saw_activate_event = true;
});
self.addEventListener('message', function(event) {
var port = event.data.port;
- if (self.state !== 'installing') {
- port.postMessage('FAIL: Worker should be waiting in installed state');
- return;
- }
event.waitUntil(self.skipWaiting()
.then(function(result) {
if (result !== undefined) {
@@ -21,9 +13,15 @@ self.addEventListener('message', function(event) {
return;
}
- if (self.state === 'activating') {
+ if (!saw_activate_event) {
+ port.postMessage(
+ 'FAIL: Promise should be resolved after activate event is dispatched');
+ return;
+ }
+
+ if (self.registration.active.state !== 'activating') {
port.postMessage(
- 'FAIL: Promise should be resolved before worker is activated');
+ 'FAITL: Promise should be resolved before ServiceWorker#state is set to activated');
return;
}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/test-helpers.sub.js b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/test-helpers.sub.js
index 1d7643a71e9..1df4363ce2a 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/test-helpers.sub.js
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/test-helpers.sub.js
@@ -226,3 +226,32 @@ function websocket(test, frame) {
function get_websocket_url() {
return 'wss://{{host}}:{{ports[wss][0]}}/echo';
}
+
+// The navigator.serviceWorker.register() method guarantees that the newly
+// installing worker is available as registration.installing when its promise
+// resolves. However some tests test installation using a <link> element where
+// it is possible for the installing worker to have already become the waiting
+// or active worker. So this method is used to get the newest worker when these
+// tests need access to the ServiceWorker itself.
+function get_newest_worker(registration) {
+ if (registration.installing)
+ return registration.installing;
+ if (registration.waiting)
+ return registration.waiting;
+ if (registration.active)
+ return registration.active;
+}
+
+function register_using_link(script, options) {
+ var scope = options.scope;
+ var link = document.createElement('link');
+ link.setAttribute('rel', 'serviceworker');
+ link.setAttribute('href', script);
+ link.setAttribute('scope', scope);
+ document.getElementsByTagName('head')[0].appendChild(link);
+ return new Promise(function(resolve, reject) {
+ link.onload = resolve;
+ link.onerror = reject;
+ })
+ .then(() => navigator.serviceWorker.getRegistration(scope));
+}
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-max-aged-worker-imported-script.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-max-aged-worker-imported-script.py
new file mode 100644
index 00000000000..b9a8a4af079
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-max-aged-worker-imported-script.py
@@ -0,0 +1,12 @@
+import time
+
+def main(request, response):
+ headers = [('Content-Type', 'application/javascript'),
+ ('Cache-Control', 'max-age=86400'),
+ ('Last-Modified', time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime()))]
+
+ body = '''
+ const importTime = {time:8f};
+ '''.format(time=time.time())
+
+ return headers, body
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-max-aged-worker.py b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-max-aged-worker.py
new file mode 100644
index 00000000000..9bdaee795eb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/resources/update-max-aged-worker.py
@@ -0,0 +1,28 @@
+import time
+import json
+
+def main(request, response):
+ headers = [('Content-Type', 'application/javascript'),
+ ('Cache-Control', 'max-age=86400'),
+ ('Last-Modified', time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime()))]
+
+ test = request.GET['test']
+
+ body = '''
+ const mainTime = {time:8f};
+ const testName = {test};
+ importScripts('update-max-aged-worker-imported-script.py');
+
+ addEventListener('message', event => {{
+ event.source.postMessage({{
+ mainTime,
+ importTime,
+ test: {test}
+ }});
+ }});
+ '''.format(
+ time=time.time(),
+ test=json.dumps(test)
+ )
+
+ return headers, body
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/skip-waiting-installed.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/skip-waiting-installed.https.html
index 93dc06d1033..21e26be5128 100644
--- a/tests/wpt/web-platform-tests/service-workers/service-worker/skip-waiting-installed.https.html
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/skip-waiting-installed.https.html
@@ -20,15 +20,14 @@ promise_test(function(t) {
assert_equals(
message, 'PASS',
'skipWaiting promise should be resolved with undefined');
-
- assert_equals(registration.active.scriptURL, normalizeURL(url2),
- 'skipWaiting should make worker become active');
});
var saw_controllerchanged = new Promise(function(resolve) {
oncontrollerchanged = function() {
assert_equals(
frame_sw.controller.scriptURL, normalizeURL(url2),
'Controller scriptURL should change to the second one');
+ assert_equals(registration.active.scriptURL, normalizeURL(url2),
+ 'Worker which calls skipWaiting should be active by controllerchange');
resolve();
};
});
diff --git a/tests/wpt/web-platform-tests/service-workers/service-worker/update-bytecheck.https.html b/tests/wpt/web-platform-tests/service-workers/service-worker/update-bytecheck.https.html
new file mode 100644
index 00000000000..6e4c6ec403a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/service-workers/service-worker/update-bytecheck.https.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src="/resources/testharness.js"></script>
+<script src="resources/testharness-helpers.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script>
+
+/*
+ * @param bolean cors
+ * Determine wether the imported script should be a cross origin script.
+ * @param string main
+ * Decide the content of the main script, where 'default' is for constant
+ * content while 'time' is for time-variant content.
+ * @param string imported
+ * Decide the content of the imported script, where 'default' is for constant
+ * content while 'time' is for time-variant content.
+ */
+const settings = [{cors: false, main: 'default', imported: 'default'},
+ {cors: false, main: 'default', imported: 'time' },
+ {cors: false, main: 'time', imported: 'default'},
+ {cors: false, main: 'time', imported: 'time' },
+ {cors: true, main: 'default', imported: 'default'},
+ {cors: true, main: 'default', imported: 'time' },
+ {cors: true, main: 'time', imported: 'default'},
+ {cors: true, main: 'time', imported: 'time' }];
+
+settings.reduce((p, s) => {
+ return p.then(promise_test(function(t) {
+ var path = !s.cors ? ''
+ : 'https://www1.web-platform.test:8443/' +
+ 'service-workers/service-worker/resources/';
+ var script = 'resources/bytecheck-worker.py' +
+ '?main=' + s.main +
+ '&imported=' + s.imported +
+ '&path=' + path;
+ var scope = 'resources/blank.html';
+
+ var swr, sw;
+ return Promise.resolve()
+ // Register a service worker.
+ .then(_ => service_worker_unregister_and_register(t, script, scope))
+ .then(r => swr = r)
+ .then(_ => wait_for_update(t, swr))
+ .then(w => sw = w)
+ .then(_ => wait_for_state(t, sw, 'activated'))
+ .then(_ => assert_array_equals([swr.active,
+ swr.waiting,
+ swr.installing],
+ [sw, null, null]))
+
+ // Update the service worker registration.
+ .then(_ => swr.update())
+ .then(_ => {
+ // If there should be a new service worker.
+ if (s.main === 'time' || s.imported === 'time') {
+ return wait_for_update(t, swr);
+ }
+ // Otherwise, make sure there is no newly created service worker.
+ assert_array_equals([swr.active,
+ swr.waiting,
+ swr.installing],
+ [sw, null, null]);
+ })
+
+ // Unregister the service worker.
+ .then(_ => service_worker_unregister_and_done(t, scope));
+ }, `Test(cors: ${s.cors}, main: ${s.main}, imported: ${s.imported})`));
+}, Promise.resolve());
+
+</script>
diff --git a/tests/wpt/web-platform-tests/shadow-dom/Extensions-to-Event-Interface.html b/tests/wpt/web-platform-tests/shadow-dom/Extensions-to-Event-Interface.html
index 4d4afaf6552..37d07a777cd 100644
--- a/tests/wpt/web-platform-tests/shadow-dom/Extensions-to-Event-Interface.html
+++ b/tests/wpt/web-platform-tests/shadow-dom/Extensions-to-Event-Interface.html
@@ -59,8 +59,8 @@ A (4) --------------------------- A-SR (3)
function testComposedEvent(mode) {
test(function () {
- var nodes = createTestTree(mode);
- var log = dispatchEventWithLog(nodes, nodes.A1a, new Event('my-event', {composed: true, bubbles: true}));
+ var nodes = createFixedTestTree(mode);
+ var log = dispatchEventWithEventLog(nodes, nodes.A1a, new Event('my-event', {composed: true, bubbles: true}));
var expectedPath = ['A1a', 'A1-SR', 'A1', 'A-SR', 'A'];
assert_array_equals(log.eventPath, expectedPath);
@@ -87,8 +87,8 @@ A ------------------------------- A-SR
function testNonComposedEvent(mode) {
test(function () {
- var nodes = createTestTree(mode);
- var log = dispatchEventWithLog(nodes, nodes.A1a, new Event('my-event', {composed: false, bubbles: true}));
+ var nodes = createFixedTestTree(mode);
+ var log = dispatchEventWithEventLog(nodes, nodes.A1a, new Event('my-event', {composed: false, bubbles: true}));
var expectedPath = ['A1a', 'A1-SR'];
assert_array_equals(log.eventPath, expectedPath);
@@ -113,8 +113,8 @@ A ------------------------------- A-SR
function testNonComposedEventWithRelatedTarget(mode) {
test(function () {
- var nodes = createTestTree(mode);
- var log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {composed: false, bubbles: true, relatedTarget: nodes['A2-S']}));
+ var nodes = createFixedTestTree(mode);
+ var log = dispatchEventWithEventLog(nodes, nodes.A1a, new MouseEvent('foo', {composed: false, bubbles: true, relatedTarget: nodes['A2-S']}));
var expectedPath = ['A1a', 'A1-SR'];
assert_array_equals(log.eventPath, expectedPath);
@@ -140,8 +140,8 @@ A ------------------------------------------------ A-SR
function testScopedEventWithUnscopedRelatedTargetThroughSlot(mode) {
test(function () {
- var nodes = createTestTree(mode);
- var log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {scoped: true, relatedTargetScoped: false, bubbles: true, relatedTarget: nodes['B1b2']}));
+ var nodes = createFixedTestTree(mode);
+ var log = dispatchEventWithEventLog(nodes, nodes.B1a, new MouseEvent('foo', {scoped: true, relatedTargetScoped: false, bubbles: true, relatedTarget: nodes['B1b2']}));
var expectedPath = ['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR'];
var pathExposedToB1a = ['B1a', 'B1', 'B-SR'];
@@ -171,8 +171,8 @@ A ------------------------------- A-SR (3)
function testComposedEventWithRelatedTarget(mode) {
test(function () {
- var nodes = createTestTree(mode);
- log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {composed: true, bubbles: true, relatedTarget: nodes['A2-S']}));
+ var nodes = createFixedTestTree(mode);
+ log = dispatchEventWithEventLog(nodes, nodes.A1a, new MouseEvent('foo', {composed: true, bubbles: true, relatedTarget: nodes['A2-S']}));
var expectedPath = ['A1a', 'A1-SR', 'A1', 'A-SR'];
var pathExposedToA1 = ['A1', 'A-SR'];
@@ -201,8 +201,8 @@ A (8) [0-5,8] ---------------------------------------- A-SR (7)
function testComposedEventThroughSlot(mode) {
test(function () {
- var nodes = createTestTree(mode);
- log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {composed: true, bubbles: true, relatedTarget: nodes.A1a}));
+ var nodes = createFixedTestTree(mode);
+ log = dispatchEventWithEventLog(nodes, nodes.B1a, new MouseEvent('foo', {composed: true, bubbles: true, relatedTarget: nodes.A1a}));
var expectedPath = ['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR', 'B', 'A2-S', 'A-SR', 'A'];
var expectedRelatedTarget = ['A', 'A', 'A', 'A', 'A', 'A', 'A1', 'A1', 'A'];
diff --git a/tests/wpt/web-platform-tests/shadow-dom/event-post-dispatch.html b/tests/wpt/web-platform-tests/shadow-dom/event-post-dispatch.html
new file mode 100644
index 00000000000..d8b07b5895b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/shadow-dom/event-post-dispatch.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html>
+<title>Shadow DOM: Event dispatch post result for event properties.</title>
+<meta name="author" title="Eriko Kurimoto" href="mailto:elkurin@google.com">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/shadow-dom.js"></script>
+<script src="resources/event-path-test-helpers.js"></script>
+
+<div id="test1">
+ <div id="d1">
+ <div id="target"></div>
+ </div>
+</div>
+
+<script>
+let n1 = createTestTree(test1);
+document.body.appendChild(n1.test1);
+test(() => {
+ let log = dispatchEventWithEventLog(n1, n1.target, new Event('my-event', { bubbles: true, composed: true }));
+ assert_equals(log.event.target, n1.target);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch without ShadowRoots (composed: true).');
+
+test(() => {
+ let log = dispatchEventWithEventLog(n1, n1.target, new Event('my-event', { bubbles: true, composed: false }));
+ assert_equals(log.event.target, n1.target);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch without ShadowRoots (composed: false).');
+document.body.removeChild(n1.test1);
+</script>
+
+<div id="test2">
+ <div id="host">
+ <template id="sr" data-mode="open">
+ <div id="target"></div>
+ </template>
+ </div>
+</div>
+
+<script>
+let n2 = createTestTree(test2);
+document.body.appendChild(n2.test2);
+test(() => {
+ let log = dispatchEventWithEventLog(n2, n2.target, new Event('my-event', { bubbles: true, composed: true }));
+ assert_equals(log.event.target, n2.host);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with an open ShadowRoot (composed: true).');
+
+test(() => {
+ let log = dispatchEventWithEventLog(n2, n2.target, new Event('my-event', { bubbles: true, composed: false }));
+ assert_equals(log.event.target, null);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with an open ShadowRoot (composed: false).');
+document.body.removeChild(n2.test2);
+</script>
+
+<div id="test3">
+ <div id="host">
+ <template id="sr" data-mode="closed">
+ <div id="target"></div>
+ </template>
+ </div>
+</div>
+
+<script>
+let n3 = createTestTree(test3);
+document.body.appendChild(n3.test3);
+test(() => {
+ let log = dispatchEventWithEventLog(n3, n3.target, new Event('my-event', { bubbles: true, composed: true }));
+ assert_equals(log.event.target, n3.host);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with a closed ShadowRoot (composed: true).');
+
+test(() => {
+ let log = dispatchEventWithEventLog(n3, n3.target, new Event('my-event', { bubbles: true, composed: false }));
+ assert_equals(log.event.target, null);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with a closed ShadowRoot (composed: false).');
+document.body.removeChild(n3.test3);
+</script>
+
+<div id="test4">
+ <div id="host1">
+ <template id="sr" data-mode="open">
+ <div id="host2">
+ <template id="sr" data-mode="open">
+ <div id="target"></div>
+ </template>
+ </div>
+ </template>
+ </div>
+</div>
+
+<script>
+let n4 = createTestTree(test4);
+document.body.appendChild(n4.test4);
+test(() => {
+ let log = dispatchEventWithEventLog(n4, n4.target, new Event('my-event', { bubbles: true, composed: true }));
+ assert_equals(log.event.target, n4.host1);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with nested ShadowRoots (composed: true).');
+
+test(() => {
+ let log = dispatchEventWithEventLog(n4, n4.target, new Event('my-event', { bubbles: true, composed: false }));
+ assert_equals(log.event.target, null);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with nested ShadowRoots (composed: false).');
+document.body.removeChild(n4.test4);
+</script>
+
+<div id="test5">
+ <div id="host">
+ <template id="sr" data-mode="open">
+ <div id="relatedTarget">
+ <div id="target"></div>
+ </div>
+ </template>
+ </div>
+</div>
+
+<script>
+let n5 = createTestTree(test5);
+document.body.appendChild(n5.test5);
+test(() => {
+ let log = dispatchEventWithEventLog(n5, n5.target, new MouseEvent('my-event', {bubbles: true, compoesed: true, relatedTarget: n5.relatedTarget}));
+ assert_equals(log.event.target, null);
+ assert_equals(log.event.relatedTarget, null);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with relatedTarget in the same shadow tree. (composed: true)');
+
+test(() => {
+ let log = dispatchEventWithEventLog(n5, n5.target, new MouseEvent('my-event', {bubbles: true, compoesed: false, relatedTarget: n5.relatedTarget}));
+ assert_equals(log.event.target, null);
+ assert_equals(log.event.relatedTarget, null);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with relatedTarget in the same shadow tree. (composed: false)');
+document.body.removeChild(n5.test5);
+</script>
+
+<div id="test6">
+ <div id="host">
+ <template id="sr" data-mode="open">
+ <div id="target"></div>
+ </template>
+ </div>
+ <div id="relatedTarget"></div>
+</div>
+
+<script>
+let n6 = createTestTree(test6);
+document.body.appendChild(n6.test6);
+test(() => {
+ let log = dispatchEventWithEventLog(n6, n6.target, new MouseEvent('my-event', {bubbles: true, composed: true, relatedTarget: n6.relatedTarget}));
+ assert_equals(log.event.target, n6.host);
+ assert_equals(log.event.relatedTarget, n6.relatedTarget);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with relatedTarget in the document tree and the shadow tree. (composed: true)');
+
+test(() => {
+ let log = dispatchEventWithEventLog(n6, n6.target, new MouseEvent('my-event', {bubbles: true, composed: false, relatedTarget: n6.relatedTarget}));
+ assert_equals(log.event.target, null);
+ assert_equals(log.event.relatedTarget, null);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with relatedTarget in the document tree and the shadow tree. (composed: false)');
+document.body.removeChild(n6.test6);
+</script>
+
+<div id="test7">
+ <div id="host1">
+ <template id="sr1" data-mode="open">
+ <div id="target"></div>
+ </template>
+ </div>
+ <div id="host2">
+ <template id="sr2" data-mode="open">
+ <div id="relatedTarget"></div>
+ </template>
+ </div>
+</div>
+
+<script>
+let n7 = createTestTree(test7);
+document.body.appendChild(n7.test7);
+test(() => {
+ let log = dispatchEventWithEventLog(n7, n7.target, new MouseEvent('my-event', {bubbles: true, compoesed: true, relatedTarget: n7.relatedTarget}));
+ assert_equals(log.event.target, n7.host1);
+ assert_equals(log.event.relatedTarget, n7.host2);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with relatedTarget in the different shadow trees. (composed: true)');
+
+test(() => {
+ let log = dispatchEventWithEventLog(n7, n7.target, new MouseEvent('my-event', {bubbles: true, compoesed: false, relatedTarget: n7.relatedTarget}));
+ assert_equals(log.event.target, null);
+ assert_equals(log.event.relatedTarget, null);
+ assert_equals(log.event.eventPhase, 0);
+ assert_equals(log.event.currentTarget, null);
+ assert_equals(log.event.composedPath().length, 0);
+}, 'Event properties post dispatch with relatedTarget in the different shadow trees. (composed: false)');
+document.body.removeChild(n7.test7);
+</script>
diff --git a/tests/wpt/web-platform-tests/shadow-dom/event-with-related-target.html b/tests/wpt/web-platform-tests/shadow-dom/event-with-related-target.html
index 36bfbd9e26b..77da4476025 100644
--- a/tests/wpt/web-platform-tests/shadow-dom/event-with-related-target.html
+++ b/tests/wpt/web-platform-tests/shadow-dom/event-with-related-target.html
@@ -24,9 +24,9 @@
*/
function testEventAtB1aWithB1a(mode) {
test(function () {
- var nodes = createTestTree(mode);
+ var nodes = createFixedTestTree(mode);
- log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1}));
+ log = dispatchEventWithEventLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1}));
assert_array_equals(log.eventPath,
['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR'], 'The event path must be correct.');
@@ -50,9 +50,9 @@
*/
function testEventAtB1aWithB1b1(mode) {
test(function () {
- var nodes = createTestTree(mode);
+ var nodes = createFixedTestTree(mode);
- log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1b1}));
+ log = dispatchEventWithEventLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1b1}));
assert_array_equals(log.eventPath,
['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR'], 'The event path must be correct.');
@@ -76,9 +76,9 @@
*/
function testEventAtB1b1WithB1a(mode) {
test(function () {
- var nodes = createTestTree(mode);
+ var nodes = createFixedTestTree(mode);
- log = dispatchEventWithLog(nodes, nodes.B1b1, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a}));
+ log = dispatchEventWithEventLog(nodes, nodes.B1b1, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a}));
assert_array_equals(log.eventPath,
['B1b1', 'B1b-SR', 'B1b', 'B1-SR', 'B1', 'B-SR'], 'The event path must be correct.');
@@ -102,9 +102,9 @@
*/
function testEventAtB1aWithD1(mode) {
test(function () {
- var nodes = createTestTree(mode);
+ var nodes = createFixedTestTree(mode);
- log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.D1}));
+ log = dispatchEventWithEventLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.D1}));
assert_array_equals(log.eventPath,
['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR', 'B', 'A2-S', 'A-SR', 'A'], 'The event path must be correct.');
@@ -128,9 +128,9 @@
*/
function testEventAtD1WithB1a(mode) {
test(function () {
- var nodes = createTestTree(mode);
+ var nodes = createFixedTestTree(mode);
- log = dispatchEventWithLog(nodes, nodes.D1, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a}));
+ log = dispatchEventWithEventLog(nodes, nodes.D1, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a}));
assert_array_equals(log.eventPath,
['D1', 'D-SR', 'D', 'B', 'A2-S', 'A-SR', 'A'], 'The event path must be correct.');
@@ -154,9 +154,9 @@
*/
function testEventAtB1aWithA1a(mode) {
test(function () {
- var nodes = createTestTree(mode);
+ var nodes = createFixedTestTree(mode);
- log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.A1a}));
+ log = dispatchEventWithEventLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.A1a}));
assert_array_equals(log.eventPath,
['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR', 'B', 'A2-S', 'A-SR', 'A'], 'The event path must be correct.');
@@ -180,9 +180,9 @@
*/
function testEventAtA1aWithB1a(mode) {
test(function () {
- var nodes = createTestTree(mode);
+ var nodes = createFixedTestTree(mode);
- log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a}));
+ log = dispatchEventWithEventLog(nodes, nodes.A1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a}));
assert_array_equals(log.eventPath,
['A1a', 'A1-SR', 'A1', 'A-SR', 'A'], 'The event path must be correct.');
@@ -208,10 +208,10 @@
*/
function testEventAtB1aWithDetachedA1a(mode) {
test(function () {
- var nodes = createTestTree(mode);
+ var nodes = createFixedTestTree(mode);
nodes['A-SR'].removeChild(nodes.A1);
- log = dispatchEventWithLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.A1a}));
+ log = dispatchEventWithEventLog(nodes, nodes.B1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.A1a}));
assert_array_equals(log.eventPath,
['B1a', 'B1c-S', 'B1-SR', 'B1', 'B-SR', 'B', 'A2-S', 'A-SR', 'A'], 'The event path must be correct.');
@@ -237,10 +237,10 @@
*/
function testEventAtA1aWithDetachedB1a(mode) {
test(function () {
- var nodes = createTestTree(mode);
+ var nodes = createFixedTestTree(mode);
nodes['A-SR'].removeChild(nodes.A1);
- log = dispatchEventWithLog(nodes, nodes.A1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a}));
+ log = dispatchEventWithEventLog(nodes, nodes.A1a, new MouseEvent('foo', {bubbles: true, composed: true, relatedTarget: nodes.B1a}));
assert_array_equals(log.eventPath, ['A1a', 'A1-SR', 'A1'], 'The event path must be correct.');
assert_array_equals(log.relatedTargets, ['B', 'B', 'B' ], 'The related targets must be correct.');
diff --git a/tests/wpt/web-platform-tests/shadow-dom/historical.html b/tests/wpt/web-platform-tests/shadow-dom/historical.html
new file mode 100644
index 00000000000..2490f05b3e8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/shadow-dom/historical.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<title>Shadow DOM v0 features</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+test(() => {
+ assert_false('createShadowRoot' in Element.prototype)
+}, 'element.createShadowRoot should not exist')
+
+test(() => {
+ assert_false('getDestinationInsertionPoints' in Element.prototype)
+}, 'element.getDestinationInsertionPoints should not exist')
+
+test(() => {
+ assert_false('getDestinationInsertionPoints' in Text.prototype)
+}, 'text.getDestinationInsertionPoints should not exist')
+
+test(() => {
+ assert_false('path' in Event.prototype)
+}, 'event.path should not exist')
+
+test(() => {
+ assert_false('HTMLContentElement' in window)
+}, 'HTMLContentElement should not exist')
+</script>
diff --git a/tests/wpt/web-platform-tests/shadow-dom/resources/event-path-test-helpers.js b/tests/wpt/web-platform-tests/shadow-dom/resources/event-path-test-helpers.js
index 091bcd08233..17d6fff662b 100644
--- a/tests/wpt/web-platform-tests/shadow-dom/resources/event-path-test-helpers.js
+++ b/tests/wpt/web-platform-tests/shadow-dom/resources/event-path-test-helpers.js
@@ -1,6 +1,7 @@
-function dispatchEventWithLog(shadow, target, event) {
+function dispatchEventWithEventLog(shadow, target, event) {
var eventPath = [];
+ var targets = [];
var relatedTargets = [];
var pathAtTargets = [];
@@ -19,13 +20,14 @@ function dispatchEventWithLog(shadow, target, event) {
return;
pathAtTargets.push(event.composedPath().map(function (node) { return node.label; }));
+ targets.push(event.target);
}).bind(node));
}
}
target.dispatchEvent(event);
- return {eventPath: eventPath, relatedTargets: relatedTargets, pathAtTargets: pathAtTargets};
+ return {event: event, targets: targets, eventPath: eventPath, relatedTargets: relatedTargets, pathAtTargets: pathAtTargets};
}
/*
@@ -37,7 +39,7 @@ A ------------------------------- A-SR
+ D1 + B1c-S + B1b1
+ B1b2
*/
-function createTestTree(mode) {
+function createFixedTestTree(mode) {
var namedNodes = {};
function element(name) {
diff --git a/tests/wpt/web-platform-tests/shadow-dom/slotchange-customelements.html b/tests/wpt/web-platform-tests/shadow-dom/slotchange-customelements.html
new file mode 100644
index 00000000000..b0cf93277df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/shadow-dom/slotchange-customelements.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Shadow DOM: slotchange customelements</title>
+<meta name="author" title="Surma" href="mailto:surma@google.com">
+<link rel="help" href="https://dom.spec.whatwg.org/#signaling-slot-change">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<slots-in-constructor id="constructor-upgrade"><div></div></slots-in-constructor>
+<slots-in-callback id="callback-upgrade"><div></div></slots-in-callback>
+<script>
+var calls = [];
+class SlotsInConstructor extends HTMLElement {
+ constructor() {
+ super();
+ this.attachShadow({mode: 'open'});
+ this.shadowRoot.innerHTML = '<slot></slot>';
+ var slot = this.shadowRoot.children[0];
+ slot.addEventListener('slotchange', function() {
+ calls.push(this.id);
+ }.bind(this));
+ }
+}
+customElements.define('slots-in-constructor', SlotsInConstructor);
+class SlotsInCallback extends HTMLElement {
+ constructor() {
+ super();
+ }
+
+ connectedCallback() {
+ this.attachShadow({mode: 'open'});
+ this.shadowRoot.innerHTML = '<slot></slot>';
+ var slot = this.shadowRoot.children[0];
+ slot.addEventListener('slotchange', function() {
+ calls.push(this.id);
+ }.bind(this));
+ }
+}
+customElements.define('slots-in-callback', SlotsInCallback);
+</script>
+<slots-in-constructor id="constructor-parser"><div></div></slots-in-constructor>
+<slots-in-callback id="callback-parser"><div></div></slots-in-callback>
+<script>
+test(function () {
+ assert_true(calls.includes("constructor-parser"));
+ assert_true(calls.includes("callback-parser"));
+ assert_true(calls.includes("constructor-upgrade"));
+ assert_true(calls.includes("callback-upgrade"));
+}, 'slotchange must fire on initialization of custom elements with slotted children');
+done();
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/speech-api/OWNERS b/tests/wpt/web-platform-tests/speech-api/OWNERS
new file mode 100644
index 00000000000..4fe844cf4b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/speech-api/OWNERS
@@ -0,0 +1,3 @@
+@andrenatal
+@fleizach
+@gshires
diff --git a/tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-ownership.html b/tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-ownership.html
new file mode 100644
index 00000000000..64bed13bd53
--- /dev/null
+++ b/tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-ownership.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe></iframe>
+<script>
+// using an utterance for different SpeechSynthesis instances should throw
+test(t => {
+ // the utterance is short to make the test faster
+ const utter = new SpeechSynthesisUtterance('1');
+ const iframe = document.querySelector('iframe');
+ assert_not_equals(speechSynthesis, iframe.contentWindow.speechSynthesis);
+ speechSynthesis.speak(utter);
+ // the spec doesn't say what exception to throw:
+ // https://github.com/w3c/speech-api/issues/8
+ assert_throws(null, () => {
+ iframe.contentWindow.speechSynthesis.speak(utter);
+ });
+}, 'Using the same SpeechSynthesisUtterance with two SpeechSynthesis instances');
+</script>
diff --git a/tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-twice.html b/tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-twice.html
new file mode 100644
index 00000000000..4e4ee34565c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/speech-api/SpeechSynthesis-speak-twice.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+// using an utterance twice on the same SpeechSynthesis instance should work
+// https://github.com/w3c/speech-api/issues/7
+async_test(t => {
+ // the utterance is short to make the test faster
+ const utter = new SpeechSynthesisUtterance('1');
+ speechSynthesis.speak(utter);
+ utter.onend = t.step_func(() => {
+ speechSynthesis.speak(utter);
+ // pass if the utterance finishes a second time
+ utter.onend = t.step_func_done();
+ });
+}, 'Using the same SpeechSynthesisUtterance twice for speechSynthesis.speak()');
+</script>
diff --git a/tests/wpt/web-platform-tests/speech-api/historical.html b/tests/wpt/web-platform-tests/speech-api/historical.html
new file mode 100644
index 00000000000..4ca574b1717
--- /dev/null
+++ b/tests/wpt/web-platform-tests/speech-api/historical.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<title>Historical Speech API features</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+[
+ "webkitSpeechGrammar",
+ "webkitSpeechGrammarList",
+ "webkitSpeechRecognition",
+ "webkitSpeechRecognitionError",
+ "webkitSpeechRecognitionEvent",
+].forEach(name => {
+ test(function() {
+ assert_false(name in window);
+ }, name + " interface should not exist");
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/storage/interfaces.worker.js b/tests/wpt/web-platform-tests/storage/interfaces.https.worker.js
index e6feed7db9d..e6feed7db9d 100644
--- a/tests/wpt/web-platform-tests/storage/interfaces.worker.js
+++ b/tests/wpt/web-platform-tests/storage/interfaces.https.worker.js
diff --git a/tests/wpt/web-platform-tests/streams/byte-length-queuing-strategy.js b/tests/wpt/web-platform-tests/streams/byte-length-queuing-strategy.js
index 54407af9913..e96e68ee406 100644
--- a/tests/wpt/web-platform-tests/streams/byte-length-queuing-strategy.js
+++ b/tests/wpt/web-platform-tests/streams/byte-length-queuing-strategy.js
@@ -104,4 +104,11 @@ test(() => {
}, 'ByteLengthQueuingStrategy\'s highWaterMark property can be set to anything');
+test(() => {
+
+ assert_equals(ByteLengthQueuingStrategy.name, 'ByteLengthQueuingStrategy',
+ 'ByteLengthQueuingStrategy.name must be "ByteLengthQueuingStrategy"');
+
+}, 'ByteLengthQueuingStrategy.name is correct');
+
done();
diff --git a/tests/wpt/web-platform-tests/streams/count-queuing-strategy.js b/tests/wpt/web-platform-tests/streams/count-queuing-strategy.js
index 5ae0063f57d..8da8eb679de 100644
--- a/tests/wpt/web-platform-tests/streams/count-queuing-strategy.js
+++ b/tests/wpt/web-platform-tests/streams/count-queuing-strategy.js
@@ -103,4 +103,11 @@ test(() => {
}, 'CountQueuingStrategy\'s highWaterMark property can be set to anything');
+test(() => {
+
+ assert_equals(CountQueuingStrategy.name, 'CountQueuingStrategy',
+ 'CountQueuingStrategy.name must be "CountQueuingStrategy"');
+
+}, 'CountQueuingStrategy.name is correct');
+
done();
diff --git a/tests/wpt/web-platform-tests/streams/generate-test-wrappers.js b/tests/wpt/web-platform-tests/streams/generate-test-wrappers.js
index d81f06ef1b8..4a406fe75c2 100644
--- a/tests/wpt/web-platform-tests/streams/generate-test-wrappers.js
+++ b/tests/wpt/web-platform-tests/streams/generate-test-wrappers.js
@@ -1,18 +1,15 @@
"use strict";
// Usage: `node generate-test-wrappers.js js-filename1.js [js-filename2.js ...]` will generate:
-// - js-filename1.https.html
+// - js-filename1.html
// - js-filename1.sharedworker.html
// - js-filename1.dedicatedworker.html
-// - js-filename1.serviceworker.html
+// - js-filename1.serviceworker.https.html
// (for each passed filename)
//
// It will turn any importScripts inside the .js file into <script>s in the browser context wrapper.
//
-// This could become obsolete if all of the following happen:
-// - https://github.com/w3c/web-platform-tests/issues/4210 gets fixed, allowing .any.js to work with all four contexts
-// - We find some way to include scripts (<script>/importScripts) in .any.js files
-// - Chrome becomes able to run .any.js tests on its infrastructure
-// (https://bugs.chromium.org/p/chromium/issues/detail?id=653514)
+// This could become obsolete if https://github.com/w3c/web-platform-tests/issues/4210 gets fixed,
+// allowing .any.js to work with all four contexts.
const fs = require("fs");
const path = require("path");
diff --git a/tests/wpt/web-platform-tests/streams/piping/pipe-through.js b/tests/wpt/web-platform-tests/streams/piping/pipe-through.js
index bc4ac909c19..7ba5607ae5d 100644
--- a/tests/wpt/web-platform-tests/streams/piping/pipe-through.js
+++ b/tests/wpt/web-platform-tests/streams/piping/pipe-through.js
@@ -30,6 +30,10 @@ function duckTypedPassThroughTransform() {
};
}
+function uninterestingReadableWritablePair() {
+ return { writable: new WritableStream(), readable: new ReadableStream() };
+}
+
promise_test(() => {
const readableEnd = sequentialReadableStream(5).pipeThrough(duckTypedPassThroughTransform());
@@ -68,10 +72,12 @@ test(() => {
const fakeReadable = { fake: 'readable' };
const arg2 = { arg: 'arg2' };
const arg3 = { arg: 'arg3' };
- ReadableStream.prototype.pipeThrough.call(dummy, { writable: fakeWritable, readable: fakeReadable }, arg2, arg3);
+ const result =
+ ReadableStream.prototype.pipeThrough.call(dummy, { writable: fakeWritable, readable: fakeReadable }, arg2, arg3);
assert_array_equals(calledWithArgs, [fakeWritable, arg2],
'The this value\'s pipeTo method should be called with the appropriate arguments');
+ assert_equals(result, fakeReadable, 'return value should be the passed readable property');
}, 'pipeThrough generically calls pipeTo with the appropriate args');
@@ -82,7 +88,7 @@ test(() => {
}
};
- ReadableStream.prototype.pipeThrough.call(dummy, { });
+ ReadableStream.prototype.pipeThrough.call(dummy, uninterestingReadableWritablePair());
// Test passes if this doesn't throw or crash.
@@ -98,7 +104,7 @@ test(() => {
}
};
- ReadableStream.prototype.pipeThrough.call(dummy, { });
+ ReadableStream.prototype.pipeThrough.call(dummy, uninterestingReadableWritablePair());
// Test passes if this doesn't throw or crash.
@@ -111,7 +117,7 @@ promise_test(() => {
}
};
- ReadableStream.prototype.pipeThrough.call(dummy, { });
+ ReadableStream.prototype.pipeThrough.call(dummy, uninterestingReadableWritablePair());
// The test harness should complain about unhandled rejections by then.
return flushAsyncEvents();
@@ -119,7 +125,7 @@ promise_test(() => {
}, 'pipeThrough should mark a real promise from a fake readable as handled');
test(() => {
- let thenCalled = false
+ let thenCalled = false;
let catchCalled = false;
const dummy = {
pipeTo() {
@@ -136,7 +142,7 @@ test(() => {
};
// An incorrect implementation which uses an internal method to mark the promise as handled will throw or crash here.
- ReadableStream.prototype.pipeThrough.call(dummy, { });
+ ReadableStream.prototype.pipeThrough.call(dummy, uninterestingReadableWritablePair());
// An incorrect implementation that tries to mark the promise as handled by calling .then() or .catch() on the object
// will fail these tests.
@@ -144,4 +150,112 @@ test(() => {
assert_false(catchCalled, 'catch should not be called');
}, 'pipeThrough should not be fooled by an object whose instanceof Promise returns true');
+test(() => {
+ const pairs = [
+ {},
+ { readable: undefined, writable: undefined },
+ { readable: 'readable' },
+ { readable: 'readable', writable: undefined },
+ { writable: 'writable' },
+ { readable: undefined, writable: 'writable' }
+ ];
+ for (let i = 0; i < pairs.length; ++i) {
+ const pair = pairs[i];
+ const rs = new ReadableStream();
+ assert_throws(new TypeError(), () => rs.pipeThrough(pair),
+ `pipeThrough should throw for argument ${JSON.stringify(pair)} (index ${i});`);
+ }
+}, 'undefined readable or writable arguments should cause pipeThrough to throw');
+
+test(() => {
+ const invalidArguments = [null, 0, NaN, '', [], {}, false, () => {}];
+ for (const arg of invalidArguments) {
+ const rs = new ReadableStream();
+ assert_equals(arg, rs.pipeThrough({ writable: new WritableStream(), readable: arg }),
+ 'pipeThrough() should not throw for readable: ' + JSON.stringify(arg));
+ const rs2 = new ReadableStream();
+ assert_equals(rs2, rs.pipeThrough({ writable: arg, readable: rs2 }),
+ 'pipeThrough() should not throw for writable: ' + JSON.stringify(arg));
+ }
+}, 'invalid but not undefined arguments should not cause pipeThrough to throw');
+
+test(() => {
+
+ const thisValue = {
+ pipeTo() {
+ assert_unreached('pipeTo should not be called');
+ }
+ };
+
+ methodThrows(ReadableStream.prototype, 'pipeThrough', thisValue, [undefined, {}]);
+ methodThrows(ReadableStream.prototype, 'pipeThrough', thisValue, [null, {}]);
+
+}, 'pipeThrough should throw when its first argument is not convertible to an object');
+
+test(() => {
+
+ const args = [{ readable: {}, writable: {} }, {}];
+
+ methodThrows(ReadableStream.prototype, 'pipeThrough', undefined, args);
+ methodThrows(ReadableStream.prototype, 'pipeThrough', null, args);
+ methodThrows(ReadableStream.prototype, 'pipeThrough', 1, args);
+ methodThrows(ReadableStream.prototype, 'pipeThrough', { pipeTo: 'test' }, args);
+
+}, 'pipeThrough should throw when "this" has no pipeTo method');
+
+test(() => {
+ const error = new Error('potato');
+
+ const throwingPipeTo = {
+ get pipeTo() {
+ throw error;
+ }
+ };
+ assert_throws(error,
+ () => ReadableStream.prototype.pipeThrough.call(throwingPipeTo, { readable: { }, writable: { } }, {}),
+ 'pipeThrough should rethrow the error thrown by pipeTo');
+
+ const thisValue = {
+ pipeTo() {
+ assert_unreached('pipeTo should not be called');
+ }
+ };
+
+ const throwingWritable = {
+ readable: {},
+ get writable() {
+ throw error;
+ }
+ };
+ assert_throws(error,
+ () => ReadableStream.prototype.pipeThrough.call(thisValue, throwingWritable, {}),
+ 'pipeThrough should rethrow the error thrown by the writable getter');
+
+ const throwingReadable = {
+ get readable() {
+ throw error;
+ },
+ writable: {}
+ };
+ assert_throws(error,
+ () => ReadableStream.prototype.pipeThrough.call(thisValue, throwingReadable, {}),
+ 'pipeThrough should rethrow the error thrown by the readable getter');
+
+}, 'pipeThrough should rethrow errors from accessing pipeTo, readable, or writable');
+
+test(() => {
+
+ let count = 0;
+ const thisValue = {
+ pipeTo() {
+ ++count;
+ }
+ };
+
+ ReadableStream.prototype.pipeThrough.call(thisValue, { readable: {}, writable: {} });
+
+ assert_equals(count, 1, 'pipeTo was called once');
+
+}, 'pipeThrough should work with no options argument');
+
done();
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.dedicatedworker.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.dedicatedworker.html
new file mode 100644
index 00000000000..bb3f11a90e2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.dedicatedworker.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>brand-checks.js dedicated worker wrapper file</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+'use strict';
+fetch_tests_from_worker(new Worker('brand-checks.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.html
new file mode 100644
index 00000000000..98d2e281ffa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>brand-checks.js browser context wrapper file</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script src="../resources/test-utils.js"></script>
+
+<script src="brand-checks.js"></script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.js b/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.js
new file mode 100644
index 00000000000..702c6530165
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.js
@@ -0,0 +1,194 @@
+'use strict';
+
+if (self.importScripts) {
+ self.importScripts('../resources/test-utils.js');
+ self.importScripts('/resources/testharness.js');
+}
+
+let ReadableStreamBYOBReader;
+let ReadableByteStreamController;
+
+test(() => {
+
+ // It's not exposed globally, but we test a few of its properties here.
+ ReadableStreamBYOBReader = realRSBYOBReader().constructor;
+
+ assert_equals(ReadableStreamBYOBReader.name, 'ReadableStreamBYOBReader', 'ReadableStreamBYOBReader should be set');
+
+}, 'Can get the ReadableStreamBYOBReader constructor indirectly');
+
+test(() => {
+
+ // It's not exposed globally, but we test a few of its properties here.
+ ReadableByteStreamController = realRBSController().constructor;
+
+ assert_equals(ReadableByteStreamController.name, 'ReadableByteStreamController',
+ 'ReadableByteStreamController should be set');
+
+}, 'Can get the ReadableByteStreamController constructor indirectly');
+
+function fakeRS() {
+ return Object.setPrototypeOf({
+ cancel() { return Promise.resolve(); },
+ getReader() { return realRSBYOBReader(); },
+ pipeThrough(obj) { return obj.readable; },
+ pipeTo() { return Promise.resolve(); },
+ tee() { return [realRS(), realRS()]; }
+ }, ReadableStream.prototype);
+}
+
+function realRS() {
+ return new ReadableStream();
+}
+
+function fakeRSBYOBReader() {
+ return Object.setPrototypeOf({
+ get closed() { return Promise.resolve(); },
+ cancel() { return Promise.resolve(); },
+ read() { return Promise.resolve({ value: undefined, done: true }); },
+ releaseLock() { return; }
+ }, ReadableStreamBYOBReader.prototype);
+}
+
+function realRSBYOBReader() {
+ return new ReadableStream({ type: 'bytes' }).getReader({ mode: 'byob' });
+}
+
+function fakeRBSController() {
+ return Object.setPrototypeOf({
+ close() { },
+ enqueue() { },
+ error() { }
+ }, ReadableByteStreamController.prototype);
+}
+
+function realRBSController() {
+ let controller;
+ new ReadableStream({
+ start(c) {
+ controller = c;
+ },
+ type: 'bytes'
+ });
+ return controller;
+}
+
+test(() => {
+
+ assert_throws(new TypeError(), () => new ReadableStreamBYOBReader(fakeRS()), 'constructor should throw');
+
+}, 'ReadableStreamBYOBReader enforces a brand check on its argument');
+
+promise_test(t => {
+
+ return getterRejectsForAll(t, ReadableStreamBYOBReader.prototype, 'closed',
+ [fakeRSBYOBReader(), realRS(), realRBSController(), undefined, null]);
+
+}, 'ReadableStreamBYOBReader.prototype.closed enforces a brand check');
+
+promise_test(t => {
+
+ return methodRejectsForAll(t, ReadableStreamBYOBReader.prototype, 'cancel',
+ [fakeRSBYOBReader(), realRS(), realRBSController(), undefined, null]);
+
+}, 'ReadableStreamBYOBReader.prototype.cancel enforces a brand check');
+
+promise_test(t => {
+
+ return methodRejectsForAll(t, ReadableStreamBYOBReader.prototype, 'read',
+ [fakeRSBYOBReader(), realRS(), realRBSController(), undefined, null], [new Uint8Array(1)]);
+
+}, 'ReadableStreamBYOBReader.prototype.read enforces a brand check');
+
+test(() => {
+
+ methodThrowsForAll(ReadableStreamBYOBReader.prototype, 'releaseLock',
+ [fakeRSBYOBReader(), realRS(), realRBSController(), undefined, null]);
+
+}, 'ReadableStreamBYOBReader.prototype.releaseLock enforces a brand check');
+
+test(() => {
+
+ assert_throws(new TypeError(), () => new ReadableByteStreamController(fakeRS()),
+ 'Constructing a ReadableByteStreamController should throw');
+
+}, 'ReadableByteStreamController enforces a brand check on its arguments');
+
+test(() => {
+
+ assert_throws(new TypeError(), () => new ReadableByteStreamController(realRS()),
+ 'Constructing a ReadableByteStreamController should throw');
+
+}, 'ReadableByteStreamController can\'t be given a fully-constructed ReadableStream');
+
+test(() => {
+
+ getterThrowsForAll(ReadableByteStreamController.prototype, 'byobRequest',
+ [fakeRBSController(), realRS(), realRSBYOBReader(), undefined, null]);
+
+}, 'ReadableByteStreamController.prototype.byobRequest enforces a brand check');
+
+test(() => {
+
+ methodThrowsForAll(ReadableByteStreamController.prototype, 'close',
+ [fakeRBSController(), realRS(), realRSBYOBReader(), undefined, null]);
+
+}, 'ReadableByteStreamController.prototype.close enforces a brand check');
+
+test(() => {
+
+ methodThrowsForAll(ReadableByteStreamController.prototype, 'enqueue',
+ [fakeRBSController(), realRS(), realRSBYOBReader(), undefined, null], [new Uint8Array(1)]);
+
+}, 'ReadableByteStreamController.prototype.enqueue enforces a brand check');
+
+test(() => {
+
+ methodThrowsForAll(ReadableByteStreamController.prototype, 'error',
+ [fakeRBSController(), realRS(), realRSBYOBReader(), undefined, null]);
+
+}, 'ReadableByteStreamController.prototype.error enforces a brand check');
+
+// ReadableStreamBYOBRequest can only be accessed asynchronously, so cram everything into one test.
+promise_test(t => {
+
+ let ReadableStreamBYOBRequest;
+ const rs = new ReadableStream({
+ pull(controller) {
+ return t.step(() => {
+ const byobRequest = controller.byobRequest;
+ ReadableStreamBYOBRequest = byobRequest.constructor;
+ brandChecks();
+ byobRequest.respond(1);
+ });
+ },
+ type: 'bytes'
+ });
+ const reader = rs.getReader({ mode: 'byob' });
+ return reader.read(new Uint8Array(1));
+
+ function fakeRSBYOBRequest() {
+ return Object.setPrototypeOf({
+ get view() {},
+ respond() {},
+ respondWithNewView() {}
+ }, ReadableStreamBYOBRequest.prototype);
+ }
+
+ function brandChecks() {
+ for (const badController of [fakeRBSController(), realRS(), realRSBYOBReader(), undefined, null]) {
+ assert_throws(new TypeError(), () => new ReadableStreamBYOBRequest(badController, new Uint8Array(1)),
+ 'ReadableStreamBYOBRequest constructor must throw for an invalid controller argument');
+ }
+ getterThrowsForAll(ReadableStreamBYOBRequest.prototype, 'view',
+ [fakeRSBYOBRequest(), realRS(), realRSBYOBReader(), realRBSController(), undefined, null]);
+ methodThrowsForAll(ReadableStreamBYOBRequest.prototype, 'respond',
+ [fakeRSBYOBRequest(), realRS(), realRSBYOBReader(), realRBSController(), undefined, null], [1]);
+ methodThrowsForAll(ReadableStreamBYOBRequest.prototype, 'respondWithNewView',
+ [fakeRSBYOBRequest(), realRS(), realRSBYOBReader(), realRBSController(), undefined, null],
+ [new Uint8Array(1)]);
+ }
+
+}, 'ReadableStreamBYOBRequest enforces brand checks');
+
+done();
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.serviceworker.https.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.serviceworker.https.html
new file mode 100644
index 00000000000..2439cdb95e9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.serviceworker.https.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>brand-checks.js service worker wrapper file</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>
+'use strict';
+service_worker_test('brand-checks.js', 'Service worker test setup');
+</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.sharedworker.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.sharedworker.html
new file mode 100644
index 00000000000..cff72eca463
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/brand-checks.sharedworker.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>brand-checks.js shared worker wrapper file</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+'use strict';
+fetch_tests_from_worker(new SharedWorker('brand-checks.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.dedicatedworker.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.dedicatedworker.html
new file mode 100644
index 00000000000..d721081a564
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.dedicatedworker.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>detached-buffers.js dedicated worker wrapper file</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+'use strict';
+fetch_tests_from_worker(new Worker('detached-buffers.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.html
new file mode 100644
index 00000000000..9cdc29b7b20
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>detached-buffers.js browser context wrapper file</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+
+
+<script src="detached-buffers.js"></script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.js b/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.js
new file mode 100644
index 00000000000..b1b47f01959
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.js
@@ -0,0 +1,156 @@
+'use strict';
+
+if (self.importScripts) {
+ self.importScripts('/resources/testharness.js');
+}
+
+promise_test(() => {
+ const stream = new ReadableStream({
+ start(c) {
+ c.close();
+ },
+ type: 'bytes'
+ });
+
+ const reader = stream.getReader({ mode: 'byob' });
+ const view = new Uint8Array([1, 2, 3]);
+ return reader.read(view).then(({ value, done }) => {
+ // Sanity checks
+ assert_true(value instanceof Uint8Array, 'The value read must be a Uint8Array');
+ assert_not_equals(value, view, 'The value read must not be the *same* Uint8Array');
+ assert_array_equals(value, [], 'The value read must be an empty Uint8Array, since the stream is closed');
+ assert_true(done, 'done must be true, since the stream is closed');
+
+ // The important assertions
+ assert_not_equals(value.buffer, view.buffer, 'a different ArrayBuffer must underlie the value');
+ assert_equals(view.buffer.byteLength, 0, 'the original buffer must be detached');
+ });
+}, 'ReadableStream with byte source: read()ing from a closed stream still transfers the buffer');
+
+promise_test(() => {
+ const stream = new ReadableStream({
+ start(c) {
+ c.enqueue(new Uint8Array([1, 2, 3]));
+ },
+ type: 'bytes'
+ });
+
+ const reader = stream.getReader({ mode: 'byob' });
+ const view = new Uint8Array([4, 5, 6]);
+ return reader.read(view).then(({ value, done }) => {
+ // Sanity checks
+ assert_true(value instanceof Uint8Array, 'The value read must be a Uint8Array');
+ assert_not_equals(value, view, 'The value read must not be the *same* Uint8Array');
+ assert_array_equals(value, [1, 2, 3], 'The value read must be the enqueued Uint8Array, not the original values');
+ assert_false(done, 'done must be false, since the stream is not closed');
+
+ // The important assertions
+ assert_not_equals(value.buffer, view.buffer, 'a different ArrayBuffer must underlie the value');
+ assert_equals(view.buffer.byteLength, 0, 'the original buffer must be detached');
+ });
+}, 'ReadableStream with byte source: read()ing from a stream with queued chunks still transfers the buffer');
+
+test(() => {
+ const stream = new ReadableStream({
+ start(c) {
+ const view = new Uint8Array([1, 2, 3]);
+ c.enqueue(view);
+ assert_throws(new TypeError(), () => c.enqueue(view), 'enqueuing an already-detached buffer must throw');
+ },
+ type: 'bytes'
+ });
+}, 'ReadableStream with byte source: enqueuing an already-detached buffer throws');
+
+promise_test(t => {
+ const stream = new ReadableStream({
+ start(c) {
+ c.enqueue(new Uint8Array([1, 2, 3]));
+ },
+ type: 'bytes'
+ });
+ const reader = stream.getReader({ mode: 'byob' });
+
+ const view = new Uint8Array([4, 5, 6]);
+ return reader.read(view).then(() => {
+ // view is now detached
+ return promise_rejects(t, new TypeError(), reader.read(view),
+ 'read(view) must reject when given an already-detached buffer');
+ });
+}, 'ReadableStream with byte source: reading into an already-detached buffer rejects');
+
+async_test(t => {
+ const stream = new ReadableStream({
+ pull: t.step_func_done(c => {
+ // Detach it by reading into it
+ reader.read(c.byobRequest.view);
+
+ assert_throws(new TypeError(), () => c.byobRequest.respond(1),
+ 'respond() must throw if the corresponding view has become detached');
+ }),
+ type: 'bytes'
+ });
+ const reader = stream.getReader({ mode: 'byob' });
+
+ reader.read(new Uint8Array([4, 5, 6]));
+}, 'ReadableStream with byte source: respond() throws if the BYOB request\'s buffer has been detached (in the ' +
+ 'readable state)');
+
+async_test(t => {
+ const stream = new ReadableStream({
+ pull: t.step_func_done(c => {
+ // Detach it by reading into it
+ reader.read(c.byobRequest.view);
+
+ c.close();
+
+ assert_throws(new TypeError(), () => c.byobRequest.respond(0),
+ 'respond() must throw if the corresponding view has become detached');
+ }),
+ type: 'bytes'
+ });
+ const reader = stream.getReader({ mode: 'byob' });
+
+ reader.read(new Uint8Array([4, 5, 6]));
+}, 'ReadableStream with byte source: respond() throws if the BYOB request\'s buffer has been detached (in the ' +
+ 'closed state)');
+
+async_test(t => {
+ const stream = new ReadableStream({
+ pull: t.step_func_done(c => {
+ // Detach it by reading into it
+ const view = new Uint8Array([1, 2, 3]);
+ reader.read(view);
+
+ assert_throws(new TypeError(), () => c.byobRequest.respondWithNewView(view),
+ 'respondWithNewView() must throw if passed a detached view');
+ }),
+ type: 'bytes'
+ });
+ const reader = stream.getReader({ mode: 'byob' });
+
+ reader.read(new Uint8Array([4, 5, 6]));
+}, 'ReadableStream with byte source: respondWithNewView() throws if the supplied view\'s buffer has been detached ' +
+ '(in the readable state)');
+
+async_test(t => {
+ const stream = new ReadableStream({
+ pull: t.step_func_done(c => {
+ // Detach it by reading into it
+ const view = new Uint8Array([1, 2, 3]);
+ reader.read(view);
+
+ c.close();
+
+ const zeroLengthView = new Uint8Array(view.buffer, 0, 0);
+ assert_throws(new TypeError(), () => c.byobRequest.respondWithNewView(zeroLengthView),
+ 'respondWithNewView() must throw if passed a (zero-length) view whose buffer has been detached');
+ }),
+ type: 'bytes'
+ });
+ const reader = stream.getReader({ mode: 'byob' });
+
+ reader.read(new Uint8Array([4, 5, 6]));
+}, 'ReadableStream with byte source: respondWithNewView() throws if the supplied view\'s buffer has been detached ' +
+ '(in the closed state)');
+
+done();
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.serviceworker.https.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.serviceworker.https.html
new file mode 100644
index 00000000000..db7d2c54616
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.serviceworker.https.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>detached-buffers.js service worker wrapper file</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>
+'use strict';
+service_worker_test('detached-buffers.js', 'Service worker test setup');
+</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.sharedworker.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.sharedworker.html
new file mode 100644
index 00000000000..dac6917d506
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/detached-buffers.sharedworker.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>detached-buffers.js shared worker wrapper file</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+'use strict';
+fetch_tests_from_worker(new SharedWorker('detached-buffers.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/general.js b/tests/wpt/web-platform-tests/streams/readable-byte-streams/general.js
index 23989113509..1ec9fbca298 100644
--- a/tests/wpt/web-platform-tests/streams/readable-byte-streams/general.js
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/general.js
@@ -1906,7 +1906,7 @@ promise_test(() => {
start(c) {
controller = c;
},
- type: "bytes"
+ type: 'bytes'
});
const readPromise = rs.getReader().read();
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.dedicatedworker.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.dedicatedworker.html
new file mode 100644
index 00000000000..50d63ed0edb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.dedicatedworker.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>properties.js dedicated worker wrapper file</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+'use strict';
+fetch_tests_from_worker(new Worker('properties.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.html
new file mode 100644
index 00000000000..41ab6b28542
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>properties.js browser context wrapper file</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script src="../resources/rs-utils.js"></script>
+
+<script src="properties.js"></script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.js b/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.js
new file mode 100644
index 00000000000..21549bc667b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.js
@@ -0,0 +1,147 @@
+'use strict';
+
+if (self.importScripts) {
+ self.importScripts('../resources/rs-utils.js');
+ self.importScripts('/resources/testharness.js');
+}
+
+let ReadableStreamBYOBReader;
+
+test(() => {
+
+ // It's not exposed globally, but we test a few of its properties here.
+ ReadableStreamBYOBReader = (new ReadableStream({ type: 'bytes' }))
+ .getReader({ mode: 'byob' }).constructor;
+
+}, 'Can get the ReadableStreamBYOBReader constructor indirectly');
+
+test(() => {
+
+ assert_throws(new TypeError(), () => new ReadableStreamBYOBReader('potato'));
+ assert_throws(new TypeError(), () => new ReadableStreamBYOBReader({}));
+ assert_throws(new TypeError(), () => new ReadableStreamBYOBReader());
+
+}, 'ReadableStreamBYOBReader constructor should get a ReadableStream object as argument');
+
+test(() => {
+
+ const methods = ['cancel', 'constructor', 'read', 'releaseLock'];
+ const properties = methods.concat(['closed']).sort();
+
+ const rsReader = new ReadableStreamBYOBReader(new ReadableStream({ type: 'bytes' }));
+ const proto = Object.getPrototypeOf(rsReader);
+
+ assert_array_equals(Object.getOwnPropertyNames(proto).sort(), properties);
+
+ for (const m of methods) {
+ const propDesc = Object.getOwnPropertyDescriptor(proto, m);
+ assert_equals(propDesc.enumerable, false, 'method should be non-enumerable');
+ assert_equals(propDesc.configurable, true, 'method should be configurable');
+ assert_equals(propDesc.writable, true, 'method should be writable');
+ assert_equals(typeof rsReader[m], 'function', 'should have be a method');
+ const expectedName = m === 'constructor' ? 'ReadableStreamBYOBReader' : m;
+ assert_equals(rsReader[m].name, expectedName, 'method should have the correct name');
+ }
+
+ const closedPropDesc = Object.getOwnPropertyDescriptor(proto, 'closed');
+ assert_equals(closedPropDesc.enumerable, false, 'closed should be non-enumerable');
+ assert_equals(closedPropDesc.configurable, true, 'closed should be configurable');
+ assert_not_equals(closedPropDesc.get, undefined, 'closed should have a getter');
+ assert_equals(closedPropDesc.set, undefined, 'closed should not have a setter');
+
+ assert_equals(rsReader.cancel.length, 1, 'cancel has 1 parameter');
+ assert_not_equals(rsReader.closed, undefined, 'has a non-undefined closed property');
+ assert_equals(typeof rsReader.closed.then, 'function', 'closed property is thenable');
+ assert_equals(rsReader.constructor.length, 1, 'constructor has 1 parameter');
+ assert_equals(rsReader.read.length, 1, 'read has 1 parameter');
+ assert_equals(rsReader.releaseLock.length, 0, 'releaseLock has no parameters');
+
+}, 'ReadableStreamBYOBReader instances should have the correct list of properties');
+
+promise_test(t => {
+
+ const rs = new ReadableStream({
+ pull(controller) {
+ return t.step(() => {
+ const byobRequest = controller.byobRequest;
+
+ const methods = ['constructor', 'respond', 'respondWithNewView'];
+ const properties = methods.concat(['view']).sort();
+
+ const proto = Object.getPrototypeOf(byobRequest);
+
+ assert_array_equals(Object.getOwnPropertyNames(proto).sort(), properties);
+
+ for (const m of methods) {
+ const propDesc = Object.getOwnPropertyDescriptor(proto, m);
+ assert_equals(propDesc.enumerable, false, 'method should be non-enumerable');
+ assert_equals(propDesc.configurable, true, 'method should be configurable');
+ assert_equals(propDesc.writable, true, 'method should be writable');
+ assert_equals(typeof byobRequest[m], 'function', 'should have a method');
+ const expectedName = m === 'constructor' ? 'ReadableStreamBYOBRequest' : m;
+ assert_equals(byobRequest[m].name, expectedName, 'method should have the correct name');
+ }
+
+ const viewPropDesc = Object.getOwnPropertyDescriptor(proto, 'view');
+ assert_equals(viewPropDesc.enumerable, false, 'view should be non-enumerable');
+ assert_equals(viewPropDesc.configurable, true, 'view should be configurable');
+ assert_not_equals(viewPropDesc.get, undefined, 'view should have a getter');
+ assert_equals(viewPropDesc.set, undefined, 'view should not have a setter');
+ assert_not_equals(byobRequest.view, undefined, 'has a non-undefined view property');
+ assert_equals(byobRequest.constructor.length, 2, 'constructor has 1 parameter');
+ assert_equals(byobRequest.respond.length, 1, 'respond has 1 parameter');
+ assert_equals(byobRequest.respondWithNewView.length, 1, 'releaseLock has 1 parameter');
+
+ byobRequest.respond(1);
+
+ });
+ },
+ type: 'bytes' });
+ const reader = rs.getReader({ mode: 'byob' });
+ return reader.read(new Uint8Array(1));
+
+}, 'ReadableStreamBYOBRequest instances should have the correct list of properties');
+
+test(() => {
+
+ const methods = ['close', 'constructor', 'enqueue', 'error'];
+ const accessors = ['byobRequest', 'desiredSize'];
+ const properties = methods.concat(accessors).sort();
+
+ let controller;
+ new ReadableStream({
+ start(c) {
+ controller = c;
+ },
+ type: 'bytes'
+ });
+ const proto = Object.getPrototypeOf(controller);
+
+ assert_array_equals(Object.getOwnPropertyNames(proto).sort(), properties);
+
+ for (const m of methods) {
+ const propDesc = Object.getOwnPropertyDescriptor(proto, m);
+ assert_equals(propDesc.enumerable, false, 'method should be non-enumerable');
+ assert_equals(propDesc.configurable, true, 'method should be configurable');
+ assert_equals(propDesc.writable, true, 'method should be writable');
+ assert_equals(typeof controller[m], 'function', 'should have be a method');
+ const expectedName = m === 'constructor' ? 'ReadableByteStreamController' : m;
+ assert_equals(controller[m].name, expectedName, 'method should have the correct name');
+ }
+
+ for (const a of accessors) {
+ const propDesc = Object.getOwnPropertyDescriptor(proto, a);
+ assert_equals(propDesc.enumerable, false, `${a} should be non-enumerable`);
+ assert_equals(propDesc.configurable, true, `${a} should be configurable`);
+ assert_not_equals(propDesc.get, undefined, `${a} should have a getter`);
+ assert_equals(propDesc.set, undefined, `${a} should not have a setter`);
+ }
+
+ assert_equals(controller.close.length, 0, 'cancel has no parameters');
+ assert_equals(controller.constructor.length, 3, 'constructor has 3 parameters');
+ assert_equals(controller.enqueue.length, 1, 'enqueue has 1 parameter');
+ assert_equals(controller.error.length, 1, 'releaseLock has 1 parameter');
+
+}, 'ReadableByteStreamController instances should have the correct list of properties');
+
+done();
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.serviceworker.https.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.serviceworker.https.html
new file mode 100644
index 00000000000..ba5c5135f2f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.serviceworker.https.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>properties.js service worker wrapper file</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>
+'use strict';
+service_worker_test('properties.js', 'Service worker test setup');
+</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.sharedworker.html b/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.sharedworker.html
new file mode 100644
index 00000000000..42fb3e5ebc0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/streams/readable-byte-streams/properties.sharedworker.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>properties.js shared worker wrapper file</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+'use strict';
+fetch_tests_from_worker(new SharedWorker('properties.js'));
+</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/brand-checks.js b/tests/wpt/web-platform-tests/streams/readable-streams/brand-checks.js
index 737154ae758..1b39d1ad661 100644
--- a/tests/wpt/web-platform-tests/streams/readable-streams/brand-checks.js
+++ b/tests/wpt/web-platform-tests/streams/readable-streams/brand-checks.js
@@ -6,7 +6,7 @@ if (self.importScripts) {
}
let ReadableStreamDefaultReader;
-let ReadableStreamController;
+let ReadableStreamDefaultController;
test(() => {
@@ -20,132 +20,145 @@ test(() => {
// It's not exposed globally, but we test a few of its properties here.
new ReadableStream({
start(c) {
- ReadableStreamController = c.constructor;
+ ReadableStreamDefaultController = c.constructor;
}
});
-}, 'Can get the ReadableStreamController constructor indirectly');
+}, 'Can get the ReadableStreamDefaultController constructor indirectly');
-function fakeReadableStream() {
- return {
+function fakeRS() {
+ return Object.setPrototypeOf({
cancel() { return Promise.resolve(); },
getReader() { return new ReadableStreamDefaultReader(new ReadableStream()); },
pipeThrough(obj) { return obj.readable; },
pipeTo() { return Promise.resolve(); },
- tee() { return [realReadableStream(), realReadableStream()]; }
- };
+ tee() { return [realRS(), realRS()]; }
+ }, ReadableStream.prototype);
}
-function realReadableStream() {
+function realRS() {
return new ReadableStream();
}
-function fakeReadableStreamDefaultReader() {
- return {
+function fakeRSDefaultReader() {
+ return Object.setPrototypeOf({
get closed() { return Promise.resolve(); },
cancel() { return Promise.resolve(); },
read() { return Promise.resolve({ value: undefined, done: true }); },
releaseLock() { return; }
- };
+ }, ReadableStreamDefaultReader.prototype);
}
-function fakeReadableStreamController() {
- return {
+function realRSDefaultReader() {
+ return new ReadableStream().getReader();
+}
+
+function fakeRSDefaultController() {
+ return Object.setPrototypeOf({
close() { },
enqueue() { },
error() { }
- };
+ }, ReadableStreamDefaultController.prototype);
+}
+
+function realRSDefaultController() {
+ let controller;
+ new ReadableStream({
+ start(c) {
+ controller = c;
+ }
+ });
+ return controller;
}
promise_test(t => {
- return methodRejects(t, ReadableStream.prototype, 'cancel', fakeReadableStream());
+ return methodRejectsForAll(t, ReadableStream.prototype, 'cancel',
+ [fakeRS(), realRSDefaultReader(), realRSDefaultController(), undefined, null]);
}, 'ReadableStream.prototype.cancel enforces a brand check');
test(() => {
- methodThrows(ReadableStream.prototype, 'getReader', fakeReadableStream());
+ methodThrowsForAll(ReadableStream.prototype, 'getReader',
+ [fakeRS(), realRSDefaultReader(), realRSDefaultController(), undefined, null]);
}, 'ReadableStream.prototype.getReader enforces a brand check');
test(() => {
- methodThrows(ReadableStream.prototype, 'tee', fakeReadableStream());
+ methodThrowsForAll(ReadableStream.prototype, 'tee', [fakeRS(), realRSDefaultReader(), realRSDefaultController(), undefined, null]);
}, 'ReadableStream.prototype.tee enforces a brand check');
test(() => {
- assert_throws(new TypeError(), () => new ReadableStreamDefaultReader(fakeReadableStream()),
+ assert_throws(new TypeError(), () => new ReadableStreamDefaultReader(fakeRS()),
'Constructing a ReadableStreamDefaultReader should throw');
}, 'ReadableStreamDefaultReader enforces a brand check on its argument');
promise_test(t => {
- return Promise.all([
- getterRejects(t, ReadableStreamDefaultReader.prototype, 'closed', fakeReadableStreamDefaultReader()),
- getterRejects(t, ReadableStreamDefaultReader.prototype, 'closed', realReadableStream())
- ]);
+ return getterRejectsForAll(t, ReadableStreamDefaultReader.prototype, 'closed',
+ [fakeRSDefaultReader(), realRS(), realRSDefaultController(), undefined, null]);
}, 'ReadableStreamDefaultReader.prototype.closed enforces a brand check');
promise_test(t => {
- return Promise.all([
- methodRejects(t, ReadableStreamDefaultReader.prototype, 'cancel', fakeReadableStreamDefaultReader()),
- methodRejects(t, ReadableStreamDefaultReader.prototype, 'cancel', realReadableStream())
- ]);
+ return methodRejectsForAll(t, ReadableStreamDefaultReader.prototype, 'cancel',
+ [fakeRSDefaultReader(), realRS(), realRSDefaultController(), undefined, null]);
}, 'ReadableStreamDefaultReader.prototype.cancel enforces a brand check');
promise_test(t => {
- return Promise.all([
- methodRejects(t, ReadableStreamDefaultReader.prototype, 'read', fakeReadableStreamDefaultReader()),
- methodRejects(t, ReadableStreamDefaultReader.prototype, 'read', realReadableStream())
- ]);
+ return methodRejectsForAll(t, ReadableStreamDefaultReader.prototype, 'read',
+ [fakeRSDefaultReader(), realRS(), realRSDefaultController(), undefined, null]);
}, 'ReadableStreamDefaultReader.prototype.read enforces a brand check');
test(() => {
- methodThrows(ReadableStreamDefaultReader.prototype, 'releaseLock', fakeReadableStreamDefaultReader());
- methodThrows(ReadableStreamDefaultReader.prototype, 'releaseLock', realReadableStream());
+ methodThrowsForAll(ReadableStreamDefaultReader.prototype, 'releaseLock',
+ [fakeRSDefaultReader(), realRS(), realRSDefaultController(), undefined, null]);
}, 'ReadableStreamDefaultReader.prototype.releaseLock enforces a brand check');
test(() => {
- assert_throws(new TypeError(), () => new ReadableStreamController(fakeReadableStream()),
- 'Constructing a ReadableStreamController should throw');
+ assert_throws(new TypeError(), () => new ReadableStreamDefaultController(fakeRS()),
+ 'Constructing a ReadableStreamDefaultController should throw');
-}, 'ReadableStreamController enforces a brand check on its argument');
+}, 'ReadableStreamDefaultController enforces a brand check on its argument');
test(() => {
- assert_throws(new TypeError(), () => new ReadableStreamController(realReadableStream()),
- 'Constructing a ReadableStreamController should throw');
+ assert_throws(new TypeError(), () => new ReadableStreamDefaultController(realRS()),
+ 'Constructing a ReadableStreamDefaultController should throw');
-}, 'ReadableStreamController can\'t be given a fully-constructed ReadableStream');
+}, 'ReadableStreamDefaultController can\'t be given a fully-constructed ReadableStream');
test(() => {
- methodThrows(ReadableStreamController.prototype, 'close', fakeReadableStreamController());
+ methodThrowsForAll(ReadableStreamDefaultController.prototype, 'close',
+ [fakeRSDefaultController(), realRS(), realRSDefaultReader(), undefined, null]);
-}, 'ReadableStreamController.prototype.close enforces a brand check');
+}, 'ReadableStreamDefaultController.prototype.close enforces a brand check');
test(() => {
- methodThrows(ReadableStreamController.prototype, 'enqueue', fakeReadableStreamController());
+ methodThrowsForAll(ReadableStreamDefaultController.prototype, 'enqueue',
+ [fakeRSDefaultController(), realRS(), realRSDefaultReader(), undefined, null]);
-}, 'ReadableStreamController.prototype.enqueue enforces a brand check');
+}, 'ReadableStreamDefaultController.prototype.enqueue enforces a brand check');
test(() => {
- methodThrows(ReadableStreamController.prototype, 'error', fakeReadableStreamController());
+ methodThrowsForAll(ReadableStreamDefaultController.prototype, 'error',
+ [fakeRSDefaultController(), realRS(), realRSDefaultReader(), undefined, null]);
-}, 'ReadableStreamController.prototype.error enforces a brand check');
+}, 'ReadableStreamDefaultController.prototype.error enforces a brand check');
done();
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/default-reader.js b/tests/wpt/web-platform-tests/streams/readable-streams/default-reader.js
index 1a5d3a42e94..7543545c4c4 100644
--- a/tests/wpt/web-platform-tests/streams/readable-streams/default-reader.js
+++ b/tests/wpt/web-platform-tests/streams/readable-streams/default-reader.js
@@ -38,6 +38,8 @@ test(() => {
assert_equals(propDesc.configurable, true, 'method should be configurable');
assert_equals(propDesc.writable, true, 'method should be writable');
assert_equals(typeof rsReader[m], 'function', 'should have be a method');
+ const expectedName = m === 'constructor' ? 'ReadableStreamDefaultReader' : m;
+ assert_equals(rsReader[m].name, expectedName, 'method should have the correct name');
}
const closedPropDesc = Object.getOwnPropertyDescriptor(proto, 'closed');
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/general.js b/tests/wpt/web-platform-tests/streams/readable-streams/general.js
index 472fb4bfa7e..5150c365d47 100644
--- a/tests/wpt/web-platform-tests/streams/readable-streams/general.js
+++ b/tests/wpt/web-platform-tests/streams/readable-streams/general.js
@@ -56,6 +56,8 @@ test(() => {
assert_true(propDesc.configurable, 'method should be configurable');
assert_true(propDesc.writable, 'method should be writable');
assert_equals(typeof rs[m], 'function', 'method should be a function');
+ const expectedName = m === 'constructor' ? 'ReadableStream' : m;
+ assert_equals(rs[m].name, expectedName, 'method should have the correct name');
}
const lockedPropDesc = Object.getOwnPropertyDescriptor(proto, 'locked');
@@ -115,6 +117,8 @@ test(() => {
assert_false(propDesc.enumerable, m + ' should be non-enumerable');
assert_true(propDesc.configurable, m + ' should be configurable');
assert_true(propDesc.writable, m + ' should be writable');
+ const expectedName = m === 'constructor' ? 'ReadableStreamDefaultController' : m;
+ assert_equals(controller[m].name, expectedName, 'method should have the correct name');
}
const desiredSizePropDesc = Object.getOwnPropertyDescriptor(proto, 'desiredSize');
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.dedicatedworker.html b/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.dedicatedworker.html
deleted file mode 100644
index 614db80be90..00000000000
--- a/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.dedicatedworker.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>pipe-through.js dedicated worker wrapper file</title>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<script>
-'use strict';
-fetch_tests_from_worker(new Worker('pipe-through.js'));
-</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.html b/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.html
deleted file mode 100644
index 7a5bc3a28a2..00000000000
--- a/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>pipe-through.js browser context wrapper file</title>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<script src="../resources/test-utils.js"></script>
-
-<script src="pipe-through.js"></script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.js b/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.js
deleted file mode 100644
index 7878334bb64..00000000000
--- a/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.js
+++ /dev/null
@@ -1,108 +0,0 @@
-'use strict';
-
-if (self.importScripts) {
- self.importScripts('../resources/test-utils.js');
- self.importScripts('/resources/testharness.js');
-}
-
-test(() => {
-
- let pipeToArguments;
- const thisValue = {
- pipeTo(...args) {
- pipeToArguments = args;
- }
- };
-
- const input = { readable: {}, writable: {} };
- const options = {};
- const result = ReadableStream.prototype.pipeThrough.call(thisValue, input, options);
-
- assert_array_equals(pipeToArguments, [input.writable, options],
- 'correct arguments should be passed to thisValue.pipeTo');
- assert_equals(result, input.readable, 'return value should be the passed readable property');
-
-}, 'ReadableStream.prototype.pipeThrough should work generically on its this and its arguments');
-
-test(() => {
-
- const thisValue = {
- pipeTo() {
- assert_unreached('pipeTo should not be called');
- }
- };
-
- methodThrows(ReadableStream.prototype, 'pipeThrough', thisValue, [undefined, {}]);
- methodThrows(ReadableStream.prototype, 'pipeThrough', thisValue, [null, {}]);
-
-}, 'ReadableStream.prototype.pipeThrough should throw when its first argument is not convertible to an object');
-
-test(() => {
-
- const args = [{ readable: {}, writable: {} }, {}];
-
- methodThrows(ReadableStream.prototype, 'pipeThrough', undefined, args);
- methodThrows(ReadableStream.prototype, 'pipeThrough', null, args);
- methodThrows(ReadableStream.prototype, 'pipeThrough', 1, args);
- methodThrows(ReadableStream.prototype, 'pipeThrough', { pipeTo: 'test' }, args);
-
-}, 'ReadableStream.prototype.pipeThrough should throw when "this" has no pipeTo method');
-
-test(() => {
- const error = new Error('potato');
-
- const throwingPipeTo = {
- get pipeTo() {
- throw error;
- }
- };
- assert_throws(error,
- () => ReadableStream.prototype.pipeThrough.call(throwingPipeTo, { readable: { }, writable: { } }, {}),
- 'pipeThrough should rethrow the error thrown by pipeTo');
-
- const thisValue = {
- pipeTo() {
- assert_unreached('pipeTo should not be called');
- }
- };
-
- const throwingWritable = {
- readable: {},
- get writable() {
- throw error;
- }
- };
- assert_throws(error,
- () => ReadableStream.prototype.pipeThrough.call(thisValue, throwingWritable, {}),
- 'pipeThrough should rethrow the error thrown by the writable getter');
-
- const throwingReadable = {
- get readable() {
- throw error;
- },
- writable: {}
- };
- assert_throws(error,
- () => ReadableStream.prototype.pipeThrough.call(thisValue, throwingReadable, {}),
- 'pipeThrough should rethrow the error thrown by the readable getter');
-
-}, 'ReadableStream.prototype.pipeThrough should rethrow errors from accessing pipeTo, readable, or writable');
-
-test(() => {
-
- let count = 0;
- const thisValue = {
- pipeTo() {
- ++count;
- }
- };
-
- ReadableStream.prototype.pipeThrough.call(thisValue, { readable: {}, writable: {} });
- ReadableStream.prototype.pipeThrough.call(thisValue, { readable: {} }, {});
- ReadableStream.prototype.pipeThrough.call(thisValue, { writable: {} }, {});
-
- assert_equals(count, 3, 'pipeTo was called 3 times');
-
-}, 'ReadableStream.prototype.pipeThrough should work with missing readable, writable, or options');
-
-done();
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.serviceworker.https.html b/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.serviceworker.https.html
deleted file mode 100644
index 21263a3083f..00000000000
--- a/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.serviceworker.https.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>pipe-through.js service worker wrapper file</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>
-'use strict';
-service_worker_test('pipe-through.js', 'Service worker test setup');
-</script>
diff --git a/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.sharedworker.html b/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.sharedworker.html
deleted file mode 100644
index 41603ef0b70..00000000000
--- a/tests/wpt/web-platform-tests/streams/readable-streams/pipe-through.sharedworker.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>pipe-through.js shared worker wrapper file</title>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<script>
-'use strict';
-fetch_tests_from_worker(new SharedWorker('pipe-through.js'));
-</script>
diff --git a/tests/wpt/web-platform-tests/streams/resources/test-utils.js b/tests/wpt/web-platform-tests/streams/resources/test-utils.js
index 24898af10a1..4c58e75f784 100644
--- a/tests/wpt/web-platform-tests/streams/resources/test-utils.js
+++ b/tests/wpt/web-platform-tests/streams/resources/test-utils.js
@@ -3,13 +3,22 @@
self.getterRejects = (t, obj, getterName, target) => {
const getter = Object.getOwnPropertyDescriptor(obj, getterName).get;
- return promise_rejects(t, new TypeError(), getter.call(target));
+ return promise_rejects(t, new TypeError(), getter.call(target), getterName + ' should reject with a TypeError');
+};
+
+self.getterRejectsForAll = (t, obj, getterName, targets) => {
+ return Promise.all(targets.map(target => getterRejects(t, obj, getterName, target)));
};
self.methodRejects = (t, obj, methodName, target, args) => {
const method = obj[methodName];
- return promise_rejects(t, new TypeError(), method.apply(target, args));
+ return promise_rejects(t, new TypeError(), method.apply(target, args),
+ methodName + ' should reject with a TypeError');
+};
+
+self.methodRejectsForAll = (t, obj, methodName, targets, args) => {
+ return Promise.all(targets.map(target => methodRejects(t, obj, methodName, target, args)));
};
self.getterThrows = (obj, getterName, target) => {
@@ -18,12 +27,21 @@ self.getterThrows = (obj, getterName, target) => {
assert_throws(new TypeError(), () => getter.call(target), getterName + ' should throw a TypeError');
};
+self.getterThrowsForAll = (obj, getterName, targets) => {
+ targets.forEach(target => getterThrows(obj, getterName, target));
+}
+
self.methodThrows = (obj, methodName, target, args) => {
const method = obj[methodName];
+ assert_equals(typeof method, 'function', methodName + ' should exist');
assert_throws(new TypeError(), () => method.apply(target, args), methodName + ' should throw a TypeError');
};
+self.methodThrowsForAll = (obj, methodName, targets, args) => {
+ targets.forEach(target => methodThrows(obj, methodName, target, args));
+}
+
self.garbageCollect = () => {
if (self.gc) {
// Use --expose_gc for V8 (and Node.js)
diff --git a/tests/wpt/web-platform-tests/streams/writable-streams/brand-checks.html b/tests/wpt/web-platform-tests/streams/writable-streams/brand-checks.html
index 9fa45b656f2..98d2e281ffa 100644
--- a/tests/wpt/web-platform-tests/streams/writable-streams/brand-checks.html
+++ b/tests/wpt/web-platform-tests/streams/writable-streams/brand-checks.html
@@ -5,6 +5,6 @@
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
-
+<script src="../resources/test-utils.js"></script>
<script src="brand-checks.js"></script>
diff --git a/tests/wpt/web-platform-tests/streams/writable-streams/brand-checks.js b/tests/wpt/web-platform-tests/streams/writable-streams/brand-checks.js
index 79d19ac4b31..256fbb21ff5 100644
--- a/tests/wpt/web-platform-tests/streams/writable-streams/brand-checks.js
+++ b/tests/wpt/web-platform-tests/streams/writable-streams/brand-checks.js
@@ -2,78 +2,113 @@
if (self.importScripts) {
self.importScripts('/resources/testharness.js');
+ self.importScripts('../resources/test-utils.js');
}
-function fakeWritableStreamDefaultWriter() {
- return {
+const WritableStreamDefaultWriter = new WritableStream().getWriter().constructor;
+const WriterProto = WritableStreamDefaultWriter.prototype;
+const WritableStreamDefaultController = getWritableStreamDefaultControllerConstructor();
+
+function getWritableStreamDefaultControllerConstructor() {
+ return realWSDefaultController().constructor;
+}
+
+function fakeWS() {
+ return Object.setPrototypeOf({
+ get locked() { return false; },
+ abort() { return Promise.resolve(); },
+ getWriter() { return fakeWSDefaultWriter(); }
+ }, WritableStream.prototype);
+}
+
+function realWS() {
+ return new WritableStream();
+}
+
+function fakeWSDefaultWriter() {
+ return Object.setPrototypeOf({
get closed() { return Promise.resolve(); },
get desiredSize() { return 1; },
get ready() { return Promise.resolve(); },
abort() { return Promise.resolve(); },
close() { return Promise.resolve(); },
write() { return Promise.resolve(); }
- };
+ }, WritableStreamDefaultWriter.prototype);
}
-function realReadableStreamDefaultWriter() {
- const rs = new ReadableStream();
- return rs.getReader();
+function realWSDefaultWriter() {
+ const ws = new WritableStream();
+ return ws.getWriter();
}
-function getterRejects(t, obj, getterName, target) {
- const getter = Object.getOwnPropertyDescriptor(obj, getterName).get;
-
- return promise_rejects(t, new TypeError(), getter.call(target),
- getterName + ' should reject with a TypeError');
+function fakeWSDefaultController() {
+ return Object.setPrototypeOf({
+ error() { return Promise.resolve(); }
+ }, WritableStreamDefaultController.prototype);
}
-function methodRejects(t, obj, methodName, target) {
- const method = obj[methodName];
-
- return promise_rejects(t, new TypeError(), method.call(target),
- methodName + ' should reject with a TypeError');
+function realWSDefaultController() {
+ let controller;
+ new WritableStream({
+ start(c) {
+ controller = c;
+ }
+ });
+ return controller;
}
-function getterThrows(obj, getterName, target) {
- const getter = Object.getOwnPropertyDescriptor(obj, getterName).get;
+test(() => {
+ getterThrowsForAll(WritableStream.prototype, 'locked',
+ [fakeWS(), realWSDefaultWriter(), realWSDefaultController(), undefined, null]);
+}, 'WritableStream.prototype.locked enforces a brand check');
- assert_throws(new TypeError(), () => getter.call(target), getterName + ' should throw a TypeError');
-}
+promise_test(t => {
+ return methodRejectsForAll(t, WritableStream.prototype, 'abort',
+ [fakeWS(), realWSDefaultWriter(), realWSDefaultController(), undefined, null]);
+}, 'WritableStream.prototype.abort enforces a brand check');
-const ws = new WritableStream();
-const writer = ws.getWriter();
-const WritableStreamDefaultWriter = writer.constructor;
-const WriterProto = WritableStreamDefaultWriter.prototype;
+test(() => {
+ methodThrowsForAll(WritableStream.prototype, 'getWriter',
+ [fakeWS(), realWSDefaultWriter(), realWSDefaultController(), undefined, null]);
+}, 'WritableStream.prototype.getWriter enforces a brand check');
test(() => {
- getterThrows(WriterProto, 'desiredSize', fakeWritableStreamDefaultWriter());
- getterThrows(WriterProto, 'desiredSize', realReadableStreamDefaultWriter());
+ assert_throws(new TypeError(), () => new WritableStreamDefaultWriter(fakeWS()), 'constructor should throw');
+}, 'WritableStreamDefaultWriter constructor enforces a brand check');
+
+test(() => {
+ getterThrowsForAll(WriterProto, 'desiredSize',
+ [fakeWSDefaultWriter(), realWS(), realWSDefaultController(), undefined, null]);
}, 'WritableStreamDefaultWriter.prototype.desiredSize enforces a brand check');
promise_test(t => {
- return Promise.all([getterRejects(t, WriterProto, 'closed', fakeWritableStreamDefaultWriter()),
- getterRejects(t, WriterProto, 'closed', realReadableStreamDefaultWriter())]);
+ return getterRejectsForAll(t, WriterProto, 'closed',
+ [fakeWSDefaultWriter(), realWS(), realWSDefaultController(), undefined, null]);
}, 'WritableStreamDefaultWriter.prototype.closed enforces a brand check');
promise_test(t => {
- return Promise.all([getterRejects(t, WriterProto, 'ready', fakeWritableStreamDefaultWriter()),
- getterRejects(t, WriterProto, 'ready', realReadableStreamDefaultWriter())]);
+ return getterRejectsForAll(t, WriterProto, 'ready',
+ [fakeWSDefaultWriter(), realWS(), realWSDefaultController(), undefined, null]);
}, 'WritableStreamDefaultWriter.prototype.ready enforces a brand check');
-test(t => {
- return Promise.all([methodRejects(t, WriterProto, 'abort', fakeWritableStreamDefaultWriter()),
- methodRejects(t, WriterProto, 'abort', realReadableStreamDefaultWriter())]);
-
+promise_test(t => {
+ return methodRejectsForAll(t, WriterProto, 'abort',
+ [fakeWSDefaultWriter(), realWS(), realWSDefaultController(), undefined, null]);
}, 'WritableStreamDefaultWriter.prototype.abort enforces a brand check');
promise_test(t => {
- return Promise.all([methodRejects(t, WriterProto, 'write', fakeWritableStreamDefaultWriter()),
- methodRejects(t, WriterProto, 'write', realReadableStreamDefaultWriter())]);
+ return methodRejectsForAll(t, WriterProto, 'write',
+ [fakeWSDefaultWriter(), realWS(), realWSDefaultController(), undefined, null]);
}, 'WritableStreamDefaultWriter.prototype.write enforces a brand check');
promise_test(t => {
- return Promise.all([methodRejects(t, WriterProto, 'close', fakeWritableStreamDefaultWriter()),
- methodRejects(t, WriterProto, 'close', realReadableStreamDefaultWriter())]);
+ return methodRejectsForAll(t, WriterProto, 'close',
+ [fakeWSDefaultWriter(), realWS(), realWSDefaultController(), undefined, null]);
}, 'WritableStreamDefaultWriter.prototype.close enforces a brand check');
+test(() => {
+ methodThrowsForAll(WritableStreamDefaultController.prototype, 'error',
+ [fakeWSDefaultController(), realWS(), realWSDefaultWriter(), undefined, null]);
+}, 'WritableStreamDefaultController.prototype.error enforces a brand check');
+
done();
diff --git a/tests/wpt/web-platform-tests/streams/writable-streams/properties.js b/tests/wpt/web-platform-tests/streams/writable-streams/properties.js
index 6ccb1a2b286..99bd09a071a 100644
--- a/tests/wpt/web-platform-tests/streams/writable-streams/properties.js
+++ b/tests/wpt/web-platform-tests/streams/writable-streams/properties.js
@@ -127,8 +127,10 @@ for (const c in expected) {
`${name} should take ${properties[name].length} arguments`);
if (type === 'constructor') {
assert_true(IsConstructor(prototype[name]), `${name} should be a constructor`);
+ assert_equals(prototype[name].name, c, `${name}.name should be '${c}'`);
} else {
assert_false(IsConstructor(prototype[name]), `${name} should not be a constructor`);
+ assert_equals(prototype[name].name, name, `${name}.name should be '${name}`);
}
}, `${fullName} should be a ${type}`);
break;
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-broken-signature.js b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-broken-signature.js
new file mode 100644
index 00000000000..32bf4573b30
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-broken-signature.js
@@ -0,0 +1 @@
+ed25519_broken_signature="trollololo";
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-broken-signature.js.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-broken-signature.js.headers
new file mode 100644
index 00000000000..47d4f9e7cdc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-broken-signature.js.headers
@@ -0,0 +1 @@
+Integrity: ed25519-dY4xEJDd1AMMbFNIhAMzJO6uhp6gZJOhchjJXDB8yY67rYrF4QUmUWS9gkvdY0Cxo8Rnb2kIdoUiigodoatKDQ==
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature-headers.js b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature-headers.js
new file mode 100644
index 00000000000..3a8db871cae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature-headers.js
@@ -0,0 +1 @@
+ed25519_signature=true;
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature-headers.js.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature-headers.js.headers
new file mode 100644
index 00000000000..dad973c3850
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature-headers.js.headers
@@ -0,0 +1,4 @@
+Integrity: sha256-Potato
+Integrity: ed25519-Potato
+Integrity: ed25519-dY4xEJDd1AMMbFNIhAMzJO6uhp6gZJOhchjJXDB8yY67rYrF4QUmUWS9gkvdY0Cxo8Rnb2kIdoUiigodoatKDQ==
+Integrity: ed25519-PotatoPotato
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature.js b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature.js
new file mode 100644
index 00000000000..3a8db871cae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature.js
@@ -0,0 +1 @@
+ed25519_signature=true;
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature.js.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature.js.headers
new file mode 100644
index 00000000000..49098cc5f3d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature.js.headers
@@ -0,0 +1 @@
+Integrity: sha256-Potato ed25519-Potato ed25519-dY4xEJDd1AMMbFNIhAMzJO6uhp6gZJOhchjJXDB8yY67rYrF4QUmUWS9gkvdY0Cxo8Rnb2kIdoUiigodoatKDQ== ed25519-PotatoPotato
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature2.js b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature2.js
new file mode 100644
index 00000000000..3a8db871cae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature2.js
@@ -0,0 +1 @@
+ed25519_signature=true;
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature2.js.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature2.js.headers
new file mode 100644
index 00000000000..00f88d98aa2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-multi-signature2.js.headers
@@ -0,0 +1 @@
+Integrity: sha256-Potato, ed25519-Potato ed25519-dY4xEJDd1AMMbFNIhAMzJO6uhp6gZJOhchjJXDB8yY67rYrF4QUmUWS9gkvdY0Cxo8Rnb2kIdoUiigodoatKDQ== ,ed25519-PotatoPotato
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-no-signature.js b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-no-signature.js
new file mode 100644
index 00000000000..299756023b4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-no-signature.js
@@ -0,0 +1 @@
+ed25519_no_signature=true;
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature.js b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature.js
new file mode 100644
index 00000000000..3a8db871cae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature.js
@@ -0,0 +1 @@
+ed25519_signature=true;
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature.js.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature.js.headers
new file mode 100644
index 00000000000..47d4f9e7cdc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature.js.headers
@@ -0,0 +1 @@
+Integrity: ed25519-dY4xEJDd1AMMbFNIhAMzJO6uhp6gZJOhchjJXDB8yY67rYrF4QUmUWS9gkvdY0Cxo8Rnb2kIdoUiigodoatKDQ==
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature2.js b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature2.js
new file mode 100644
index 00000000000..3a8db871cae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature2.js
@@ -0,0 +1 @@
+ed25519_signature=true;
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature2.js.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature2.js.headers
new file mode 100644
index 00000000000..433867924d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-signature2.js.headers
@@ -0,0 +1 @@
+Integrity: ed25519-jMATgofD8LM8FWYjBhryikPzo9bUJOgBlJLOS0su1vjMrVmemh5AqPWIGxroEOuyjHj/TH2jsyy4nh6Ti8iECw==
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature-headers.css b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature-headers.css
new file mode 100644
index 00000000000..3cde4df12c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature-headers.css
@@ -0,0 +1 @@
+.testdiv{ background-color: yellow }
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature-headers.css.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature-headers.css.headers
new file mode 100644
index 00000000000..3e1d2b618c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature-headers.css.headers
@@ -0,0 +1,4 @@
+Integrity: sha256-Potato
+Integrity: ed25519-Potato
+Integrity: ed25519-k+0f30qLFYl2l2/jK7VgDo6YoWyzWoyGKGgmXxxGUUkaQbvj/n0ABXQqRbHQr+EMXOaJU206t1SjkbSSBPN5CQ==
+Integrity: ed25519-PotatoPotato
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature.css b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature.css
new file mode 100644
index 00000000000..3cde4df12c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature.css
@@ -0,0 +1 @@
+.testdiv{ background-color: yellow }
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature.css.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature.css.headers
new file mode 100644
index 00000000000..e951492d6fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature.css.headers
@@ -0,0 +1 @@
+Integrity: sha256-Potato ed25519-Potato ed25519-k+0f30qLFYl2l2/jK7VgDo6YoWyzWoyGKGgmXxxGUUkaQbvj/n0ABXQqRbHQr+EMXOaJU206t1SjkbSSBPN5CQ== ed25519-PotatoPotato
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature2.css b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature2.css
new file mode 100644
index 00000000000..3cde4df12c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature2.css
@@ -0,0 +1 @@
+.testdiv{ background-color: yellow }
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature2.css.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature2.css.headers
new file mode 100644
index 00000000000..1f1e463aa47
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-multi-signature2.css.headers
@@ -0,0 +1 @@
+Integrity: sha256-Potato, ed25519-Potato ed25519-k+0f30qLFYl2l2/jK7VgDo6YoWyzWoyGKGgmXxxGUUkaQbvj/n0ABXQqRbHQr+EMXOaJU206t1SjkbSSBPN5CQ== ,ed25519-PotatoPotato
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-no-signature.css b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-no-signature.css
new file mode 100644
index 00000000000..3cde4df12c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-no-signature.css
@@ -0,0 +1 @@
+.testdiv{ background-color: yellow }
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-wrong-signature.css b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-wrong-signature.css
new file mode 100644
index 00000000000..3cde4df12c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-wrong-signature.css
@@ -0,0 +1 @@
+.testdiv{ background-color: yellow }
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-wrong-signature.css.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-wrong-signature.css.headers
new file mode 100644
index 00000000000..47d4f9e7cdc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style-wrong-signature.css.headers
@@ -0,0 +1 @@
+Integrity: ed25519-dY4xEJDd1AMMbFNIhAMzJO6uhp6gZJOhchjJXDB8yY67rYrF4QUmUWS9gkvdY0Cxo8Rnb2kIdoUiigodoatKDQ==
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style.css b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style.css
new file mode 100644
index 00000000000..3cde4df12c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style.css
@@ -0,0 +1 @@
+.testdiv{ background-color: yellow }
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style.css.headers b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style.css.headers
new file mode 100644
index 00000000000..de1416372cd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/ed25519-style.css.headers
@@ -0,0 +1,2 @@
+Integrity: ed25519-k+0f30qLFYl2l2/jK7VgDo6YoWyzWoyGKGgmXxxGUUkaQbvj/n0ABXQqRbHQr+EMXOaJU206t1SjkbSSBPN5CQ==
+
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/subresource-css-ed25519.tentative.html b/tests/wpt/web-platform-tests/subresource-integrity/subresource-css-ed25519.tentative.html
new file mode 100644
index 00000000000..7604acb70dd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/subresource-css-ed25519.tentative.html
@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Subresource Integrity</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/sriharness.js"></script>
+
+<div id="log"></div>
+
+<div id="container"></div>
+<script>
+ var public_key = "otDax00eEy6QTMK61lfzrHgZDsXw++rdJkYi02N6X0c="
+ var style_tests = [];
+
+ new SRIStyleTest(
+ style_tests,
+ true,
+ "Passes, with correct key + signature.",
+ {
+ href: "ed25519-style.css?1",
+ integrity: "ed25519-" + public_key
+ }
+ );
+ new SRIStyleTest(
+ style_tests,
+ false,
+ "Fails, because the key is malformed.",
+ {
+ href: "ed25519-style.css?2",
+ integrity: "ed25519-PotatoPotatoPotato"
+ }
+ );
+ new SRIStyleTest(
+ style_tests,
+ false,
+ "Fails because of wrong key.",
+ {
+ href: "ed25519-style.css?3",
+ integrity: "ed25519-PotatoPotatoPotatoPotatoPotatoAvocadoPotato="
+
+ }
+ );
+ new SRIStyleTest(
+ style_tests,
+ false,
+ "Fails, because of missing key.",
+ {
+ href: "ed25519-style-no-signature.css",
+ integrity: "ed25519-" + public_key
+ }
+ );
+ new SRIStyleTest(
+ style_tests,
+ false,
+ "Fails, because of wrong key.",
+ {
+ href: "ed25519-style-wrong-signature.css",
+ integrity: "ed25519-" + public_key
+ }
+ );
+ new SRIStyleTest(
+ style_tests,
+ true,
+ "Passes, because the first of two keys passes.",
+ {
+ href: "ed25519-style.css?1",
+ integrity: "ed25519-" + public_key +
+ " ed25519-PotatoPotatoPotatoPotatoPotatoAvocadoPotato="
+ }
+ );
+ new SRIStyleTest(
+ style_tests,
+ true,
+ "Passes, because the second of two keys passes.",
+ {
+ href: "ed25519-style.css?1",
+ integrity: "ed25519-PotatoPotatoPotatoPotatoPotatoAvocadoPotato= " +
+ "ed25519-" + public_key
+ }
+ );
+ new SRIStyleTest(
+ style_tests,
+ true,
+ "Passes, because at least one signature matches.",
+ {
+ href: "ed25519-style-multi-signature.css",
+ integrity: "ed25519-" + public_key
+ }
+ );
+ new SRIStyleTest(
+ style_tests,
+ true,
+ "Passes (as above), with commas between values.",
+ {
+ href: "ed25519-style-multi-signature2.css",
+ integrity: "ed25519-" + public_key
+ }
+ );
+ new SRIStyleTest(
+ style_tests,
+ true,
+ "Passes (as above), with multiple headers.",
+ {
+ href: "ed25519-style-multi-signature-headers.css",
+ integrity: "ed25519-" + public_key
+ }
+ );
+ new SRIStyleTest(
+ style_tests,
+ true,
+ "Passes, with multiple signatures + multiple keys.",
+ {
+ href: "ed25519-style-multi-signature.css?2",
+ integrity: "ed25519-PotatoPotatoPotatoPotatoPotatoAvocadoPotato= " +
+ "ed25519-" + public_key
+ }
+ );
+
+ // Run all style_tests in sequence.
+ function execute_next_style_test() {
+ if (style_tests.length > 0)
+ style_tests.shift().execute();
+ }
+ add_result_callback(execute_next_style_test);
+ execute_next_style_test();
+</script>
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/subresource-ed25519-with-csp.tentative.html b/tests/wpt/web-platform-tests/subresource-integrity/subresource-ed25519-with-csp.tentative.html
new file mode 100644
index 00000000000..ca80c228655
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/subresource-ed25519-with-csp.tentative.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<meta http-equiv="Content-Security-Policy"
+ content="script-src 'unsafe-inline' 'nonce-abcd' 'ed25519-qGFmwTxlocg707D1cX4w60iTwtfwbMLf8ITDyfko7s0='">
+
+<title>Subresource Integrity with Ed25519 plus Content Security Policy</title>
+<script src="/resources/testharness.js" nonce="abcd"></script>
+<script src="/resources/testharnessreport.js" nonce="abcd"></script>
+<script src="/resources/sriharness.js" nonce="abcd"></script>
+
+<div id="log"></div>
+<div id="container"></div>
+<script nonce="abcd">
+ // This needs to be the same key as in this doc's content security policy.
+ var public_key = "qGFmwTxlocg707D1cX4w60iTwtfwbMLf8ITDyfko7s0=";
+ new SRIScriptTest(
+ true,
+ "Ed25519-with-CSP, passes, valid key, valid signature.",
+ "ed25519-signature.js",
+ "ed25519-" + public_key
+ ).execute();
+
+ new SRIScriptTest(
+ false,
+ "Ed25519-with-CSP, fails, valid key, invalid signature.",
+ "ed25519-broken-signature.js",
+ "ed25519-" + public_key
+ ).execute();
+
+ // The first of these uses the nonce rather than the signature to pass CSP.
+ // That doesn't test anything useful about the Ed25519 feature, but is here
+ // to test the precondition for the next test. So if this test passes and
+ // the second one fails, then we can be sure that the 2nd test failed only
+ // because of the CSP key mismatch, as that's the only difference between
+ // the tests.
+ var key_not_in_csp = "5MVHFfs/9Ri+YSwH4FwneSFp88t1ljryPoLxdiyTKks=";
+ new SRIScriptTest(
+ true,
+ "Ed25519-with-CSP, passes, alternative key.",
+ "ed25519-signature2.js",
+ "ed25519-" + key_not_in_csp,
+ /* cross origin */ undefined,
+ /* nonce */ "abcd").execute();
+ new SRIScriptTest(
+ false,
+ "Ed25519-with-CSP, fails, valid key, valid signature, key not in CSP.",
+ "ed25519-signature2.js",
+ "ed25519-" + key_not_in_csp,
+ ).execute();
+</script>
+
+
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/subresource-ed25519.tentative.html b/tests/wpt/web-platform-tests/subresource-integrity/subresource-ed25519.tentative.html
new file mode 100644
index 00000000000..1f091ebd569
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/subresource-ed25519.tentative.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Subresource Integrity</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/sriharness.js"></script>
+
+<div id="log"></div>
+
+<div id="container"></div>
+<script>
+ var public_key = "qGFmwTxlocg707D1cX4w60iTwtfwbMLf8ITDyfko7s0="
+ new SRIScriptTest(
+ true,
+ "Ed255519 signature, passes.",
+ "ed25519-signature.js?1",
+ "ed25519-" + public_key
+ ).execute();
+ new SRIScriptTest(
+ false,
+ "Ed255519 signature, fails because key is malformed.",
+ "ed25519-signature.js?2",
+ "ed25519-PotatoPotatoPotato"
+ ).execute();
+ new SRIScriptTest(
+ false,
+ "Ed255519 signature, fails because wrong key.",
+ "ed25519-signature.js?3",
+ "ed25519-PotatoPotatoPotatoPotatoPotatoAvocadoPotato="
+ ).execute();
+ new SRIScriptTest(
+ false,
+ "Ed255519 signature, fails because no signature in response header.",
+ "ed25519-no-signature.js",
+ "ed25519-" + public_key
+ ).execute();
+ new SRIScriptTest(
+ false,
+ "Ed255519 signature, fails because incorrect signature in response.",
+ "ed25519-broken-signature.js",
+ "ed25519-" + public_key
+ ).execute();
+ new SRIScriptTest(
+ true,
+ "Ed255519 signature, passes if any (first) of two keys passes.",
+ "ed25519-signature.js?4",
+ "ed25519-" + public_key +
+ " ed25519-PotatoPotatoPotatoPotatoPotatoAvocadoPotato="
+ ).execute();
+ new SRIScriptTest(
+ true,
+ "Ed255519 signature, passes if any (second) of two keys passes.",
+ "ed25519-signature.js?5",
+ "ed25519-PotatoPotatoPotatoPotatoPotatoAvocadoPotato= ed25519-" +
+ public_key
+ ).execute();
+ new SRIScriptTest(
+ true,
+ "Ed255519 signature, passes because at least one signature matches.",
+ "ed25519-multi-signature.js",
+ "ed25519-" + public_key
+ ).execute();
+ new SRIScriptTest(
+ true,
+ "Ed255519 signature, passes (as above), with commas between values.",
+ "ed25519-multi-signature2.js",
+ "ed25519-" + public_key
+ ).execute();
+ new SRIScriptTest(
+ true,
+ "Ed255519 signature, passes (as above), with multiple headers.",
+ "ed25519-multi-signature-headers.js",
+ "ed25519-" + public_key
+ ).execute();
+ new SRIScriptTest(
+ true,
+ "Ed255519 signature, passes, with multiple signature + multiple keys.",
+ "ed25519-multi-signature.js?2",
+ "ed25519-PotatoPotatoPotatoPotatoPotatoAvocadoPotato= ed25519-" +
+ public_key
+ ).execute();
+</script>
+
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/subresource-integrity.sub.html b/tests/wpt/web-platform-tests/subresource-integrity/subresource-integrity.sub.html
index 89ae018e48e..658ea6fd92e 100644
--- a/tests/wpt/web-platform-tests/subresource-integrity/subresource-integrity.sub.html
+++ b/tests/wpt/web-platform-tests/subresource-integrity/subresource-integrity.sub.html
@@ -3,6 +3,7 @@
<title>Subresource Integrity</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/sriharness.js"></script>
<div id="log"></div>
@@ -46,36 +47,6 @@
+ '//' + www_host_and_port
+ '/subresource-integrity/crossorigin-ineligible-script.js';
- var SRIScriptTest = function(pass, name, src, integrityValue, crossoriginValue) {
- this.pass = pass;
- this.name = "Script: " + name;
- this.src = src;
- this.integrityValue = integrityValue;
- this.crossoriginValue = crossoriginValue;
- }
-
- SRIScriptTest.prototype.execute = function() {
- var test = async_test(this.name);
- var e = document.createElement("script");
- e.src = this.src;
- e.setAttribute("integrity", this.integrityValue);
- if(this.crossoriginValue) {
- e.setAttribute("crossorigin", this.crossoriginValue);
- }
- if(this.pass) {
- e.addEventListener("load", function() {test.done()});
- e.addEventListener("error", function() {
- test.step(function(){ assert_unreached("Good load fired error handler.") })
- });
- } else {
- e.addEventListener("load", function() {
- test.step(function() { assert_unreached("Bad load succeeded.") })
- });
- e.addEventListener("error", function() {test.done()});
- }
- document.body.appendChild(e);
- };
-
// Note that all of these style URLs have query parameters started, so any
// additional parameters should be appended starting with '&'.
var xorigin_anon_style = location.protocol
@@ -91,72 +62,6 @@
+ '//' + www_host_and_port
+ '/subresource-integrity/crossorigin-ineligible-style.css?';
- // <link> tests
- // Style tests must be done synchronously because they rely on the presence
- // and absence of global style, which can affect later tests. Thus, instead
- // of executing them one at a time, the style tests are implemented as a
- // queue that builds up a list of tests, and then executes them one at a
- // time.
- var SRIStyleTest = function(queue, pass, name, attrs, customCallback, altPassValue) {
- this.pass = pass;
- this.name = "Style: " + name;
- this.customCallback = customCallback || function () {};
- this.attrs = attrs || {};
- this.passValue = altPassValue || "rgb(255, 255, 0)";
-
- this.test = async_test(this.name);
-
- this.queue = queue;
- this.queue.push(this);
- }
-
- SRIStyleTest.prototype.execute = function() {
- var that = this;
- var container = document.getElementById("container");
- while (container.hasChildNodes()) {
- container.removeChild(container.firstChild);
- }
-
- var test = this.test;
-
- var div = document.createElement("div");
- div.className = "testdiv";
- var e = document.createElement("link");
- this.attrs.rel = this.attrs.rel || "stylesheet";
- for (var key in this.attrs) {
- if (this.attrs.hasOwnProperty(key)) {
- e.setAttribute(key, this.attrs[key]);
- }
- }
-
- if(this.pass) {
- e.addEventListener("load", function() {
- test.step(function() {
- var background = window.getComputedStyle(div, null).getPropertyValue("background-color");
- assert_equals(background, that.passValue);
- test.done();
- });
- });
- e.addEventListener("error", function() {
- test.step(function(){ assert_unreached("Good load fired error handler.") })
- });
- } else {
- e.addEventListener("load", function() {
- test.step(function() { assert_unreached("Bad load succeeded.") })
- });
- e.addEventListener("error", function() {
- test.step(function() {
- var background = window.getComputedStyle(div, null).getPropertyValue("background-color");
- assert_not_equals(background, that.passValue);
- test.done();
- });
- });
- }
- container.appendChild(div);
- container.appendChild(e);
- this.customCallback(e, container);
- };
-
var style_tests = [];
style_tests.execute = function() {
if (this.length > 0) {
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/tools/ed25519.py b/tests/wpt/web-platform-tests/subresource-integrity/tools/ed25519.py
new file mode 100644
index 00000000000..8497786d530
--- /dev/null
+++ b/tests/wpt/web-platform-tests/subresource-integrity/tools/ed25519.py
@@ -0,0 +1,109 @@
+# The original version of this file was downloaded from
+# http://ed25519.cr.yp.to/software.html, and came with the following copyright
+# statement:
+# The Ed25519 software is in the public domain.
+
+import hashlib
+
+b = 256
+q = 2**255 - 19
+l = 2**252 + 27742317777372353535851937790883648493
+
+def H(m):
+ return hashlib.sha512(m).digest()
+
+def expmod(b,e,m):
+ if e == 0: return 1
+ t = expmod(b,e/2,m)**2 % m
+ if e & 1: t = (t*b) % m
+ return t
+
+def inv(x):
+ return expmod(x,q-2,q)
+
+d = -121665 * inv(121666)
+I = expmod(2,(q-1)/4,q)
+
+def xrecover(y):
+ xx = (y*y-1) * inv(d*y*y+1)
+ x = expmod(xx,(q+3)/8,q)
+ if (x*x - xx) % q != 0: x = (x*I) % q
+ if x % 2 != 0: x = q-x
+ return x
+
+By = 4 * inv(5)
+Bx = xrecover(By)
+B = [Bx % q,By % q]
+
+def edwards(P,Q):
+ x1 = P[0]
+ y1 = P[1]
+ x2 = Q[0]
+ y2 = Q[1]
+ x3 = (x1*y2+x2*y1) * inv(1+d*x1*x2*y1*y2)
+ y3 = (y1*y2+x1*x2) * inv(1-d*x1*x2*y1*y2)
+ return [x3 % q,y3 % q]
+
+def scalarmult(P,e):
+ if e == 0: return [0,1]
+ Q = scalarmult(P,e/2)
+ Q = edwards(Q,Q)
+ if e & 1: Q = edwards(Q,P)
+ return Q
+
+def encodeint(y):
+ bits = [(y >> i) & 1 for i in range(b)]
+ return ''.join([chr(sum([bits[i * 8 + j] << j for j in range(8)])) for i in range(b/8)])
+
+def encodepoint(P):
+ x = P[0]
+ y = P[1]
+ bits = [(y >> i) & 1 for i in range(b - 1)] + [x & 1]
+ return ''.join([chr(sum([bits[i * 8 + j] << j for j in range(8)])) for i in range(b/8)])
+
+def bit(h,i):
+ return (ord(h[i/8]) >> (i%8)) & 1
+
+def publickey(sk):
+ h = H(sk)
+ a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2))
+ A = scalarmult(B,a)
+ return encodepoint(A)
+
+def Hint(m):
+ h = H(m)
+ return sum(2**i * bit(h,i) for i in range(2*b))
+
+def signature(m,sk,pk):
+ h = H(sk)
+ a = 2**(b-2) + sum(2**i * bit(h,i) for i in range(3,b-2))
+ r = Hint(''.join([h[i] for i in range(b/8,b/4)]) + m)
+ R = scalarmult(B,r)
+ S = (r + Hint(encodepoint(R) + pk + m) * a) % l
+ return encodepoint(R) + encodeint(S)
+
+def isoncurve(P):
+ x = P[0]
+ y = P[1]
+ return (-x*x + y*y - 1 - d*x*x*y*y) % q == 0
+
+def decodeint(s):
+ return sum(2**i * bit(s,i) for i in range(0,b))
+
+def decodepoint(s):
+ y = sum(2**i * bit(s,i) for i in range(0,b-1))
+ x = xrecover(y)
+ if x & 1 != bit(s,b-1): x = q-x
+ P = [x,y]
+ if not isoncurve(P): raise Exception("decoding point that is not on curve")
+ return P
+
+def checkvalid(s,m,pk):
+ if len(s) != b/4: raise Exception("signature length is wrong")
+ if len(pk) != b/8: raise Exception("public-key length is wrong")
+ R = decodepoint(s[0:b/8])
+ A = decodepoint(pk)
+ S = decodeint(s[b/8:b/4])
+ h = Hint(encodepoint(R) + pk + m)
+ if scalarmult(B,S) != edwards(R,scalarmult(A,h)):
+ raise Exception("signature does not pass verification")
diff --git a/tests/wpt/web-platform-tests/subresource-integrity/tools/list_hashes.py b/tests/wpt/web-platform-tests/subresource-integrity/tools/list_hashes.py
index 5e3830ab61d..44fb940cf40 100644
--- a/tests/wpt/web-platform-tests/subresource-integrity/tools/list_hashes.py
+++ b/tests/wpt/web-platform-tests/subresource-integrity/tools/list_hashes.py
@@ -1,6 +1,8 @@
from os import path, listdir
from hashlib import sha512, sha384, sha256, md5
from base64 import b64encode
+from random import randint
+import ed25519
import re
DIR = path.normpath(path.join(__file__, "..", ".."))
@@ -38,20 +40,38 @@ def sha256_uri(content):
return "sha256-%s" % format_digest(sha256(content).digest())
'''
+Generate an encoded ed25519 signature.
+'''
+def ed25519_signature(private_public_key, content):
+ signature = ed25519.signature(content, *private_public_key)
+ return "ed25519-%s" % format_digest(signature)
+
+'''
+Generate private + public key pair for ed25519 signatures.
+'''
+def ed25519_key_pair():
+ secret_key = ''.join(chr(randint(0, 255)) for _ in range(0,32))
+ public_key = ed25519.publickey(secret_key)
+ return (secret_key, public_key)
+
+'''
Generate an encoded md5 digest URI.
'''
def md5_uri(content):
return "md5-%s" % format_digest(md5(content).digest())
def main():
+ ed25519_key = ed25519_key_pair()
for file in js_and_css_files():
print "Listing hash values for %s" % file
with open(file, "r") as content_file:
content = content_file.read()
- print "\tSHA512 integrity: %s" % sha512_uri(content)
- print "\tSHA384 integrity: %s" % sha384_uri(content)
- print "\tSHA256 integrity: %s" % sha256_uri(content)
- print "\tMD5 integrity: %s" % md5_uri(content)
+ print "\tSHA512 integrity: %s" % sha512_uri(content)
+ print "\tSHA384 integrity: %s" % sha384_uri(content)
+ print "\tSHA256 integrity: %s" % sha256_uri(content)
+ print "\tMD5 integrity: %s" % md5_uri(content)
+ print "\tEd25519 integrity: %s" % ed25519_signature(ed25519_key, content)
+ print "\nEd25519 public key (used above): %s" % format_digest(ed25519_key[1])
if __name__ == "__main__":
main()
diff --git a/tests/wpt/web-platform-tests/svg/historical.html b/tests/wpt/web-platform-tests/svg/historical.html
index 5626dfcd13d..4b8686bd2a9 100644
--- a/tests/wpt/web-platform-tests/svg/historical.html
+++ b/tests/wpt/web-platform-tests/svg/historical.html
@@ -54,6 +54,10 @@ var removedMembers = {
],
"SVGSVGElement": [
"currentView",
+ "pixelUnitToMillimeterX",
+ "pixelUnitToMillimeterY",
+ "screenPixelToMillimeterX",
+ "screenPixelToMillimeterY",
"useCurrentView",
"viewport"
],
diff --git a/tests/wpt/web-platform-tests/svg/interfaces.html b/tests/wpt/web-platform-tests/svg/interfaces.html
index 36132e2dcf1..b1711852d07 100644
--- a/tests/wpt/web-platform-tests/svg/interfaces.html
+++ b/tests/wpt/web-platform-tests/svg/interfaces.html
@@ -1312,8 +1312,6 @@ var ellipse = document.createElementNS("http://www.w3.org/2000/svg", "ellipse");
var line = document.createElementNS("http://www.w3.org/2000/svg", "line");
var polyline = document.createElementNS("http://www.w3.org/2000/svg", "polyline");
var polygon = document.createElementNS("http://www.w3.org/2000/svg", "polygon");
-var textContent = document.createElementNS("http://www.w3.org/2000/svg",
- "textContent");
var text = document.createElementNS("http://www.w3.org/2000/svg", "text");
var tspan = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
var tref = document.createElementNS("http://www.w3.org/2000/svg", "tref");
@@ -1484,7 +1482,6 @@ idlArray.add_objects({
SVGLineElement: ['line'],
SVGPolylineElement: ['polyline'],
SVGPolygonElement: ['polygon'],
- SVGTextContentElement: ['textContent'],
SVGTextElement: ['text'],
SVGTSpanElement: ['tspan'],
SVGTRefElement: ['tref'],
diff --git a/tests/wpt/web-platform-tests/tools/browserutils/browser.py b/tests/wpt/web-platform-tests/tools/browserutils/browser.py
deleted file mode 100644
index 75f5421e6dd..00000000000
--- a/tests/wpt/web-platform-tests/tools/browserutils/browser.py
+++ /dev/null
@@ -1,325 +0,0 @@
-import logging
-import os
-import platform
-import re
-import stat
-from abc import ABCMeta, abstractmethod
-from ConfigParser import RawConfigParser
-from distutils.spawn import find_executable
-
-from utils import call, get, untar, unzip
-
-logger = logging.getLogger(__name__)
-
-uname = platform.uname()
-
-def path(path, exe):
- path = path.replace("/", os.path.sep)
- if exe and uname[0] == "Windows":
- path += ".exe"
- return path
-
-
-class Browser(object):
- __metaclass__ = ABCMeta
-
- @abstractmethod
- def install(self):
- return NotImplemented
-
- @abstractmethod
- def install_webdriver(self):
- return NotImplemented
-
- @abstractmethod
- def version(self):
- return NotImplemented
-
- @abstractmethod
- def requirements(self):
- """Name of the browser-specific wptrunner requirements file"""
- return NotImplemented
-
- def prepare_environment(self):
- """Do any additional setup of the environment required to start the
- browser successfully
- """
- pass
-
-
-class Firefox(Browser):
- """Firefox-specific interface.
-
- Includes installation, webdriver installation, and wptrunner setup methods.
- """
-
- product = "firefox"
- binary = "firefox/firefox"
- platform_ini = "firefox/platform.ini"
- requirements = "requirements_firefox.txt"
-
-
- def platform_string(self):
- platform = {
- "Linux": "linux",
- "Windows": "win",
- "Darwin": "mac"
- }.get(uname[0])
-
- if platform is None:
- raise ValueError("Unable to construct a valid Firefox package name for current platform")
-
- if platform == "linux":
- bits = "-%s" % uname[-1]
- elif platform == "win":
- bits = "64" if uname[-1] == "x86_64" else "32"
- else:
- bits = ""
-
- return "%s%s" % (platform, bits)
-
- def platform_string_geckodriver(self):
- platform = {
- "Linux": "linux",
- "Windows": "win",
- "Darwin": "macos"
- }.get(uname[0])
-
- if platform is None:
- raise ValueError("Unable to construct a valid Geckodriver package name for current platform")
-
- if platform in ("linux", "win"):
- bits = "64" if uname[-1] == "x86_64" else "32"
- else:
- bits = ""
-
- return "%s%s" % (platform, bits)
-
- def latest_nightly_listing(self):
- return get("https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/")
-
- def get_from_nightly(self, pattern):
- index = self.latest_nightly_listing()
- filename = re.compile(pattern).search(index.text).group(1)
- return get("https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/%s" %
- filename)
-
-
- def install(self, dest=None):
- """Install Firefox."""
- if dest is None:
- dest = os.getcwd()
-
- resp = self.get_from_nightly("<a[^>]*>(firefox-\d+\.\d(?:\w\d)?.en-US.%s\.tar\.bz2)" % self.platform_string())
- untar(resp.raw, dest=dest)
- return os.path.join(dest, "firefox")
-
- def find_binary(self):
- return find_executable("firefox")
-
- def find_certutil(self):
- path = find_executable("certutil")
- if os.path.splitdrive(path)[1].split(os.path.sep) == ["", "Windows", "system32", "certutil.exe"]:
- return None
- return path
-
- def find_webdriver(self):
- return find_executable("geckodriver")
-
- def install_certutil(self, dest=None):
- # TODO: this doesn't really work because it just gets the binary, and is missing the
- # libnss3 library. Getting that means either downloading the corresponding Firefox
- # and extracting the library (which is hard on mac becase DMG), or maybe downloading from
- # nss's treeherder builds?
- if dest is None:
- dest = os.pwd
-
- # Don't create a path like bin/bin/certutil
- split = os.path.split(dest)
- if split[1] == "bin":
- dest = split[0]
-
- resp = self.get_from_nightly(
- "<a[^>]*>(firefox-\d+\.\d(?:\w\d)?.en-US.%s\.common\.tests.zip)</a>" % self.platform_string())
- bin_path = path("bin/certutil", exe=True)
- unzip(resp.raw, dest=dest, limit=[bin_path])
-
- return os.path.join(dest, bin_path)
-
- def install_prefs(self, dest=None):
- if dest is None:
- dest = os.pwd
-
- dest = os.path.join(dest, "profiles")
- if not os.path.exists(dest):
- os.makedirs(dest)
- with open(os.path.join(dest, "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)
-
- return dest
-
- def _latest_geckodriver_version(self):
- """Get and return latest version number for geckodriver."""
- # 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, dest=None):
- """Install latest Geckodriver."""
- if dest is None:
- dest = os.getcwd()
-
- version = self._latest_geckodriver_version()
- format = "zip" if uname[0] == "Windows" else "tar.gz"
- logger.debug("Latest geckodriver release %s" % version)
- url = ("https://github.com/mozilla/geckodriver/releases/download/%s/geckodriver-%s-%s.%s" %
- (version, version, self.platform_string_geckodriver(), format))
- if format == "zip":
- unzip(get(url).raw, dest=dest)
- else:
- untar(get(url).raw, dest=dest)
- return find_executable(os.path.join(dest, "geckodriver"))
-
- def version(self, root):
- """Retrieve the release version of the installed browser."""
- platform_info = RawConfigParser()
-
- with open(os.path.join(root, self.platform_ini), "r") as fp:
- platform_info.readfp(BytesIO(fp.read()))
- return "BuildID %s; SourceStamp %s" % (
- platform_info.get("Build", "BuildID"),
- platform_info.get("Build", "SourceStamp"))
-
-
-class Chrome(Browser):
- """Chrome-specific interface.
-
- Includes installation, webdriver installation, and wptrunner setup methods.
- """
-
- product = "chrome"
- binary = "/usr/bin/google-chrome"
- requirements = "requirements_chrome.txt"
-
- def platform_string(self):
- platform = {
- "Linux": "linux",
- "Windows": "win",
- "Darwin": "mac"
- }.get(uname[0])
-
- if platform is None:
- raise ValueError("Unable to construct a valid Chrome package name for current platform")
-
- if platform == "linux":
- bits = "64" if uname[-1] == "x86_64" else "32"
- elif platform == "mac":
- bits = "64"
- elif platform == "win":
- bits = "32"
-
- return "%s%s" % (platform, bits)
-
- def install(self):
- return None
-
- def find_webdriver(self):
- return find_executable("chromedriver")
-
- def install_webdriver(self, dest=None):
- """Install latest Webdriver."""
- if dest is None:
- dest = os.pwd
- latest = get("http://chromedriver.storage.googleapis.com/LATEST_RELEASE").text.strip()
- url = "http://chromedriver.storage.googleapis.com/%s/chromedriver_%s.zip" % (latest,
- self.platform_string())
- unzip(get(url).raw, dest)
- path = find_executable(dest, "chromedriver")
- st = os.stat(path)
- os.chmod(path, st.st_mode | stat.S_IEXEC)
- return path
-
- def version(self, root):
- """Retrieve the release version of the installed browser."""
- output = call(self.binary, "--version")
- return re.search(r"[0-9\.]+( [a-z]+)?$", output.strip()).group(0)
-
- def prepare_environment(self):
- # https://bugs.chromium.org/p/chromium/issues/detail?id=713947
- logger.debug("DBUS_SESSION_BUS_ADDRESS %s" % os.environ.get("DBUS_SESSION_BUS_ADDRESS"))
- if "DBUS_SESSION_BUS_ADDRESS" not in os.environ:
- if find_executable("dbus-launch"):
- logger.debug("Attempting to start dbus")
- dbus_conf = subprocess.check_output(["dbus-launch"])
- logger.debug(dbus_conf)
-
- # From dbus-launch(1):
- #
- # > When dbus-launch prints bus information to standard output,
- # > by default it is in a simple key-value pairs format.
- for line in dbus_conf.strip().split("\n"):
- key, _, value = line.partition("=")
- os.environ[key] = value
- else:
- logger.critical("dbus not running and can't be started")
- sys.exit(1)
-
-
-class Edge(Browser):
- """Edge-specific interface.
-
- Includes installation, webdriver installation, and wptrunner setup methods.
- """
-
- product = "edge"
- requirements = "requirements_edge.txt"
-
- def install(self):
- return None
-
- def find_webdriver(self):
- return find_executable("MicrosoftWebDriver")
-
- def install_webdriver(self, dest=None):
- """Install latest Webdriver."""
- raise NotImplementedError
-
- def version(self):
- raise NotImplementedError
-
-
-class Servo(Browser):
- """Firefox-specific interface.
-
- Includes installation, webdriver installation, and wptrunner setup methods.
- """
-
- product = "servo"
- requirements = "requirements_servo.txt"
-
- def install(self, platform, dest=None):
- """Install Servo."""
- raise NotImplementedError
-
- def find_binary(self):
- return find_executable("servo")
-
- def find_webdriver(self):
- return None
-
- def install_webdriver(self):
- raise NotImplementedError
-
- def version(self, root):
- return None
diff --git a/tests/wpt/web-platform-tests/tools/browserutils/install.py b/tests/wpt/web-platform-tests/tools/browserutils/install.py
deleted file mode 100644
index ee4e6015e8f..00000000000
--- a/tests/wpt/web-platform-tests/tools/browserutils/install.py
+++ /dev/null
@@ -1,23 +0,0 @@
-import argparse
-import browser
-import sys
-
-parser = argparse.ArgumentParser()
-parser.add_argument('browser', choices=['firefox', 'chrome'],
- help='name of web browser product')
-parser.add_argument('component', choices=['browser', 'webdriver'],
- help='name of component')
-parser.add_argument('-d', '--destination',
- help='filesystem directory to place the component')
-
-if __name__ == '__main__':
- args = parser.parse_args()
-
- Subclass = getattr(browser, args.browser.title())
- if args.component == 'webdriver':
- method = 'install_webdriver'
- else:
- method = 'install'
-
- sys.stdout.write('Now installing %s %s...\n' % (args.browser, args.component))
- getattr(Subclass(), method)(dest=args.destination)
diff --git a/tests/wpt/web-platform-tests/tools/browserutils/virtualenv.py b/tests/wpt/web-platform-tests/tools/browserutils/virtualenv.py
deleted file mode 100644
index bcae5c331fb..00000000000
--- a/tests/wpt/web-platform-tests/tools/browserutils/virtualenv.py
+++ /dev/null
@@ -1,52 +0,0 @@
-import os
-import sys
-import logging
-from distutils.spawn import find_executable
-
-from utils import call
-
-logger = logging.getLogger(__name__)
-
-class Virtualenv(object):
- def __init__(self, path):
- self.path = path
- self.virtualenv = find_executable("virtualenv")
- if not self.virtualenv:
- raise ValueError("virtualenv must be installed and on the PATH")
-
- @property
- def exists(self):
- return os.path.isdir(self.path)
-
- def create(self):
- if os.path.exists(self.path):
- shutil.rmtree(self.path)
- call(self.virtualenv, self.path)
-
- @property
- def bin_path(self):
- if sys.platform in ("win32", "cygwin"):
- return os.path.join(self.path, "Scripts")
- return os.path.join(self.path, "bin")
-
- @property
- def pip_path(self):
- path = find_executable("pip", self.bin_path)
- if path is None:
- raise ValueError("pip not found")
- return path
-
- def activate(self):
- path = os.path.join(self.bin_path, "activate_this.py")
- execfile(path, {"__file__": path})
-
- def start(self):
- if not self.exists:
- self.create()
- self.activate()
-
- def install(self, *requirements):
- call(self.pip_path, "install", *requirements)
-
- def install_requirements(self, requirements_path):
- call(self.pip_path, "install", "-r", requirements_path)
diff --git a/tests/wpt/web-platform-tests/tools/certs/cacert.pem b/tests/wpt/web-platform-tests/tools/certs/cacert.pem
new file mode 100644
index 00000000000..24a61c47b37
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/certs/cacert.pem
@@ -0,0 +1,83 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: CN=web-platform-tests
+ Validity
+ Not Before: Dec 22 12:09:15 2014 GMT
+ Not After : Dec 21 12:09:15 2024 GMT
+ Subject: CN=web-platform-tests
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:c0:3e:c3:bd:b7:9e:2e:3e:ec:1f:a5:ae:9f:85:
+ 8d:c0:59:a4:40:a8:fe:66:cf:ef:7d:1f:4a:91:52:
+ e6:55:0f:e5:69:b8:44:da:62:17:c7:88:28:ad:ec:
+ 6d:b0:00:cd:a1:69:0e:e8:19:84:58:ad:e9:ce:31:
+ 50:6c:a4:82:14:91:08:5a:a3:ae:c8:49:13:19:18:
+ 7b:5b:2b:44:30:eb:bf:c7:7c:bb:d4:32:17:6a:4d:
+ eb:84:f1:65:9b:9d:21:3e:91:ae:74:75:b3:7c:b4:
+ cd:fa:98:73:d4:7c:d1:5d:1b:89:72:f7:d4:52:bd:
+ 05:a3:c1:cf:b6:58:e7:51:ec:c2:71:c7:f6:0b:00:
+ 97:58:f9:cb:c3:18:46:7b:55:0f:90:bf:da:a3:7d:
+ d6:c5:48:ea:b3:b5:a8:12:96:ac:38:65:10:b9:b1:
+ 69:cb:4e:3b:4c:c3:83:74:33:63:b4:cc:fe:65:c1:
+ ad:12:51:f1:02:72:50:49:03:ab:a6:28:20:41:15:
+ ca:77:15:d9:85:55:69:9d:31:c1:db:12:be:46:db:
+ e6:d3:8f:2f:66:2d:9b:61:08:30:57:6c:d9:4f:b1:
+ 6a:a8:e5:90:e3:e2:68:96:45:6e:3f:de:5e:13:fe:
+ 8a:bd:f1:3f:7f:26:ec:3c:1a:80:b0:a8:ec:52:c5:
+ 11:03
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ CA:TRUE
+ X509v3 Subject Key Identifier:
+ 6A:AB:53:64:92:36:87:23:34:B3:1D:6F:85:4B:F5:DF:5A:5C:74:8F
+ X509v3 Authority Key Identifier:
+ keyid:6A:AB:53:64:92:36:87:23:34:B3:1D:6F:85:4B:F5:DF:5A:5C:74:8F
+ DirName:/CN=web-platform-tests
+ serial:01
+
+ X509v3 Key Usage:
+ Certificate Sign
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication
+ Signature Algorithm: sha256WithRSAEncryption
+ 46:af:02:04:97:2f:5b:00:11:c5:8f:c4:e1:2b:23:62:d1:61:
+ 4a:28:ed:82:82:57:d7:28:65:88:a5:61:16:20:37:02:90:16:
+ 0b:05:43:46:db:bd:3d:b4:4d:1c:6e:85:ff:5d:dc:0f:a4:a4:
+ 29:98:24:ae:39:ab:e4:97:a9:10:bc:a5:b9:4b:c1:2e:5a:ce:
+ 89:32:00:f1:fc:94:35:a6:71:c8:9c:d9:05:43:44:6c:68:62:
+ ae:b1:71:20:17:5f:c4:fb:ae:05:e6:26:e5:41:88:cc:db:51:
+ 55:ed:85:a0:c9:e5:68:65:a7:fa:7a:db:8f:81:61:60:50:0b:
+ 16:b0:10:49:19:bb:70:0e:37:09:03:20:e8:a2:b9:e5:eb:c2:
+ 6a:7b:4f:60:cd:fb:22:0b:27:c6:0d:2d:e2:32:cc:28:de:c6:
+ e2:14:6a:ad:3f:c4:6e:78:9d:71:24:9b:56:c4:54:28:e9:ec:
+ 09:6e:34:cc:6d:5c:bc:e6:68:96:44:ff:62:d0:54:a0:a4:37:
+ d8:f7:9f:bc:bb:dc:ad:2c:49:e2:64:b9:4d:aa:e4:22:e6:df:
+ 3a:17:23:13:c1:aa:0e:94:27:46:5d:11:b9:0b:dc:3d:cf:93:
+ 20:eb:18:56:c5:ac:e3:92:eb:55:d3:cb:ce:e4:9c:21:85:d6:
+ 21:93:92:4f
+-----BEGIN CERTIFICATE-----
+MIIDTzCCAjegAwIBAgIBATANBgkqhkiG9w0BAQsFADAdMRswGQYDVQQDDBJ3ZWIt
+cGxhdGZvcm0tdGVzdHMwHhcNMTQxMjIyMTIwOTE1WhcNMjQxMjIxMTIwOTE1WjAd
+MRswGQYDVQQDDBJ3ZWItcGxhdGZvcm0tdGVzdHMwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQDAPsO9t54uPuwfpa6fhY3AWaRAqP5mz+99H0qRUuZVD+Vp
+uETaYhfHiCit7G2wAM2haQ7oGYRYrenOMVBspIIUkQhao67ISRMZGHtbK0Qw67/H
+fLvUMhdqTeuE8WWbnSE+ka50dbN8tM36mHPUfNFdG4ly99RSvQWjwc+2WOdR7MJx
+x/YLAJdY+cvDGEZ7VQ+Qv9qjfdbFSOqztagSlqw4ZRC5sWnLTjtMw4N0M2O0zP5l
+wa0SUfECclBJA6umKCBBFcp3FdmFVWmdMcHbEr5G2+bTjy9mLZthCDBXbNlPsWqo
+5ZDj4miWRW4/3l4T/oq98T9/Juw8GoCwqOxSxREDAgMBAAGjgZkwgZYwDAYDVR0T
+BAUwAwEB/zAdBgNVHQ4EFgQUaqtTZJI2hyM0sx1vhUv131pcdI8wRQYDVR0jBD4w
+PIAUaqtTZJI2hyM0sx1vhUv131pcdI+hIaQfMB0xGzAZBgNVBAMMEndlYi1wbGF0
+Zm9ybS10ZXN0c4IBATALBgNVHQ8EBAMCAgQwEwYDVR0lBAwwCgYIKwYBBQUHAwEw
+DQYJKoZIhvcNAQELBQADggEBAEavAgSXL1sAEcWPxOErI2LRYUoo7YKCV9coZYil
+YRYgNwKQFgsFQ0bbvT20TRxuhf9d3A+kpCmYJK45q+SXqRC8pblLwS5azokyAPH8
+lDWmccic2QVDRGxoYq6xcSAXX8T7rgXmJuVBiMzbUVXthaDJ5Whlp/p624+BYWBQ
+CxawEEkZu3AONwkDIOiiueXrwmp7T2DN+yILJ8YNLeIyzCjexuIUaq0/xG54nXEk
+m1bEVCjp7AluNMxtXLzmaJZE/2LQVKCkN9j3n7y73K0sSeJkuU2q5CLm3zoXIxPB
+qg6UJ0ZdEbkL3D3PkyDrGFbFrOOS61XTy87knCGF1iGTkk8=
+-----END CERTIFICATE-----
diff --git a/tests/wpt/web-platform-tests/tools/certs/cakey.pem b/tests/wpt/web-platform-tests/tools/certs/cakey.pem
new file mode 100644
index 00000000000..58b5ff75684
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/certs/cakey.pem
@@ -0,0 +1,30 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIb9ES7h6YGBcCAggA
+MBQGCCqGSIb3DQMHBAi2ZVLgq1XvagSCBMjAmGEVvjwXvF00veuQmJsmcjVHB/qP
+VqSXjCQ94orZb89UfFnPO9zXdvLWxrwb5WP6bbQv+Sh4htExXCD5XZi1AzWNCybe
+da0vvQGgjdzUh2fCrG4K7J0w20lrYgw3HVSj/WtmdbdZFdoX+BgXrxcqkE3M5opZ
+3UD3yIQeXSxUkh3iv6zzZaWujxjDI2JpwxRmMVbrr8OeBrKJsqB2DnKmq+emmvEF
+iXTN3Ww/Aj6GIqfPZ8jpVdwcVN5QpeHAh7b2lszt7GEOGcBhutPq4Aqy8PIiDR80
+sUYI7V8OXm+Y45DnfkvsogZEifOiUrQ2U+aGDu+Zt88661wVzjq+voJlz8EaIPCE
+B/NS2SgNqI2/DrjEEecn6hjgHWIUBwOfeNoSi1Tri6KZFyxG26LE/V8Cd50yodx9
+pBgFxdCbmYLeRcVeXW2bu0ZMjPddRlR5MHfrkM5ZAze7nRxoiyWnB/U8pPf+bQvx
+K4P9KcwCOeHigkaCYZKq7nmZyEy4km89zIugT/YWhMWyVwylTpagaiiJwYLjug8n
+CbFZWAkORBIl2g/YCuTBUJtC2IWX8kw+nYVwqBszpZyC6nbha2UmhQDfMAowQA5v
+n1LnV8I6f7u6HidbB8WX2UZoh03A4beCBz+dq2VaUquLTL4KQTIz+6rw7nEysrnH
+TIb8SlwsYAlzzwyyM9dSWt7iQeNjmH7zL0MozMs3LKHIrsWi7ZZh8BUYnT2vKdNV
+2ZLOMcR0tYVmVZ8uYkR9kny/fbZcKN54xScohA2UX261W+sWiEgN+RaBsQ79pFgi
+vYldfjaGNSvftXa590xn2tlS6/suB5MxiW5g3PuBg5XtVZ95l0f1n376Xh41sJv8
+YHrCtFHOlSpDJULGiXVh/wXBmS7qJ8DhnUUG699EdlsFf6Qg22WB3AZRvEJdYC4z
+P8W+jZ15NTDbHg3Hv7/CFYVzbXv2w0jkiqQgDF/wc6t/EdLD+2hzcN+nJGjtxZbn
+xjbXcg98CUMU+dc/aD4N45K9e9rPg3+iZLwvsRvwx+MszmgxxPv05pNyRO7RVk8r
+gkyyp9/CJFme+4nFKUc0dUy2yNXZtklTX0XKm/YNKin6uUMlIArIa54Cfvt9QslV
+iD+SxU1ZHmzwKT82+5ZeIRLNWvFV/9E4nD+BTagK2Fdwnsu1S2k7ItD9lK/cBPGS
+0tz1HWv4Auj3wMPZklp3SQluOl6eAIVqqI9GaX/d42DctBQWLTa27YibWyNIcw7o
+3N8GDREMawTBdDRwlZ3oT+yiGLX1c8ds2o0/4IcJlOkDoxXErmdlZo9oVe6z4R7g
+62yR53atVTLoUnAjxHXx0bJiyayv9Y3wjOEvuhuqdd9F+HOhTtAHr/BJQNhEk+z8
+531CZTJjb1p11PbOtHGV2IeB0S82mxkkXRykEXOb89ZpDHNRiMinThRkoCmuRI9r
+dTiES9B02yMPxJ3sLQyDxCoS5mwfcAqKTeK+yCvTvBy+t5tw63DbWlMp/7Ahy65K
+rWMHdwqwfoB+ZYw5sYZdPvuBVAT01I2JbOqX36RacQultFns2OinxOJHa1HjtXyS
+cPVEkMa7ci3Ym9j5RQNLVsgJe7YK9HixX5HjQFAowAH2pXZ5pKJIJYxPIUKtZlsz
+qbM=
+-----END ENCRYPTED PRIVATE KEY-----
diff --git a/tests/wpt/web-platform-tests/tools/certs/web-platform.test.key b/tests/wpt/web-platform-tests/tools/certs/web-platform.test.key
new file mode 100644
index 00000000000..a49f4221842
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/certs/web-platform.test.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCzhNaLAVkYhdHc
+Mt8495CFGz6lXoE+L/w6X3937yO7OognD74lRs1jfcuV2KVQENKi0reX0Q1s+/kF
+6G+oS72VZ557lFipbZP94BLFzbSKZFIxXw7jiYRx2pjdS+wCJaV9Nf5j2rOs7KVG
+Dw1kI1xt8+zMKGMjwEua7I/B7rGiPnJNcLUJweu0EFU8i+oblH5LdOb0n0+mRTC1
+8Li00VlQZQqGU+pMn570WGwx9Rc6b1eLy1/wKAtFko0wIEn/UuYsyxia1+buPk80
+NRUTxQLaxV+++1vOjb+1NXY8fOacOyaHTY2A5hbGJ/JQSbZydENJSUQ4u3hDI+4W
+Ptli5qXXAgMBAAECggEBAIcwDQSnIjo2ZECHytQykpG6X6XXEksLhc1Lp0lhPC49
+uNR5pX6a4AcBb3PLr0opMQZO2tUoKA0ff3t0e8loKD+/xXhY0Z/dlioEOP7elwv0
+2nS1mhe9spCuxpk4GGXRhdtR8t2tj8s0do3YvgPgITXoEDX6YBZHNGhZpzSrFPgQ
+/c3eGCVmzWYuLFfdj5OPQ9bwTaY4JSvDLZT0/WTgiica7VySwfz3HP1fFqNykTiK
+ACQREvtxfk5Ym2nT6oni7CM2zOEJL9SXicXI5HO4bERH0ZYh//F3g6mwGiFXUJPd
+NKgaTM1oT9kRGkUaEYsRWrddwR8d5mXLvBuTJbgIsSECgYEA1+2uJSYRW1OqbhYP
+ms59YQHSs3VjpJpnCV2zNa2Wixs57KS2cOH7B6KrQCogJFLtgCDVLtyoErfVkD7E
+FivTgYr1pVCRppJddQzXik31uOINOBVffr7/09g3GcRN+ubHPZPq3K+dD6gHa3Aj
+0nH1EjEEV0QpSTQFn87OF2mc9wcCgYEA1NVqMbbzd+9Xft5FXuSbX6E+S02dOGat
+SgpnkTM80rjqa6eHdQzqk3JqyteHPgdi1vdYRlSPOj/X+6tySY0Ej9sRnYOfddA2
+kpiDiVkmiqVolyJPY69Utj+E3TzJ1vhCQuYknJmB7zP9tDcTxMeq0l/NaWvGshEK
+yC4UTQog1rECgYASOFILfGzWgfbNlzr12xqlRtwanHst9oFfPvLSQrWDQ2bd2wAy
+Aj+GY2mD3oobxouX1i1m6OOdwLlalJFDNauBMNKNgoDnx03vhIfjebSURy7KXrNS
+JJe9rm7n07KoyzRgs8yLlp3wJkOKA0pihY8iW9R78JpzPNqEo5SsURMXnQKBgBlV
+gfuC9H4tPjP6zzUZbyk1701VYsaI6k2q6WMOP0ox+q1v1p7nN7DvaKjWeOG4TVqb
+PKW6gQYE/XeWk9cPcyCQigs+1KdYbnaKsvWRaBYO1GFREzQhdarv6qfPCZOOH40J
+Cgid+Sp4/NULzU2aGspJ3xCSZKdjge4MFhyJfRkxAoGBAJlwqY4nue0MBLGNpqcs
+WwDtSasHvegKAcxGBKL5oWPbLBk7hk+hdqc8f6YqCkCNqv/ooBspL15ESItL+6yT
+zt0YkK4oH9tmLDb+rvqZ7ZdXbWSwKITMoCyyHUtT6OKt/RtA0Vdy9LPnP27oSO/C
+dk8Qf7KgKZLWo0ZNkvw38tEC
+-----END PRIVATE KEY-----
diff --git a/tests/wpt/web-platform-tests/tools/certs/web-platform.test.pem b/tests/wpt/web-platform-tests/tools/certs/web-platform.test.pem
new file mode 100644
index 00000000000..965e887e4ed
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/certs/web-platform.test.pem
@@ -0,0 +1,86 @@
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 2 (0x2)
+ Signature Algorithm: sha256WithRSAEncryption
+ Issuer: CN=web-platform-tests
+ Validity
+ Not Before: Dec 22 12:09:16 2014 GMT
+ Not After : Dec 21 12:09:16 2024 GMT
+ Subject: CN=web-platform.test
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (2048 bit)
+ Modulus:
+ 00:b3:84:d6:8b:01:59:18:85:d1:dc:32:df:38:f7:
+ 90:85:1b:3e:a5:5e:81:3e:2f:fc:3a:5f:7f:77:ef:
+ 23:bb:3a:88:27:0f:be:25:46:cd:63:7d:cb:95:d8:
+ a5:50:10:d2:a2:d2:b7:97:d1:0d:6c:fb:f9:05:e8:
+ 6f:a8:4b:bd:95:67:9e:7b:94:58:a9:6d:93:fd:e0:
+ 12:c5:cd:b4:8a:64:52:31:5f:0e:e3:89:84:71:da:
+ 98:dd:4b:ec:02:25:a5:7d:35:fe:63:da:b3:ac:ec:
+ a5:46:0f:0d:64:23:5c:6d:f3:ec:cc:28:63:23:c0:
+ 4b:9a:ec:8f:c1:ee:b1:a2:3e:72:4d:70:b5:09:c1:
+ eb:b4:10:55:3c:8b:ea:1b:94:7e:4b:74:e6:f4:9f:
+ 4f:a6:45:30:b5:f0:b8:b4:d1:59:50:65:0a:86:53:
+ ea:4c:9f:9e:f4:58:6c:31:f5:17:3a:6f:57:8b:cb:
+ 5f:f0:28:0b:45:92:8d:30:20:49:ff:52:e6:2c:cb:
+ 18:9a:d7:e6:ee:3e:4f:34:35:15:13:c5:02:da:c5:
+ 5f:be:fb:5b:ce:8d:bf:b5:35:76:3c:7c:e6:9c:3b:
+ 26:87:4d:8d:80:e6:16:c6:27:f2:50:49:b6:72:74:
+ 43:49:49:44:38:bb:78:43:23:ee:16:3e:d9:62:e6:
+ a5:d7
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ CA:FALSE
+ X509v3 Subject Key Identifier:
+ 2D:98:A3:99:39:1C:FE:E9:9A:6D:17:94:D2:3A:96:EE:C8:9E:04:22
+ X509v3 Authority Key Identifier:
+ keyid:6A:AB:53:64:92:36:87:23:34:B3:1D:6F:85:4B:F5:DF:5A:5C:74:8F
+
+ X509v3 Key Usage:
+ Digital Signature, Non Repudiation, Key Encipherment
+ X509v3 Extended Key Usage:
+ TLS Web Server Authentication
+ X509v3 Subject Alternative Name:
+ DNS:web-platform.test, DNS:www.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--lve-6lad.web-platform.test, DNS:www2.web-platform.test, DNS:www1.web-platform.test
+ Signature Algorithm: sha256WithRSAEncryption
+ 33:db:f7:f0:f6:92:16:4f:2d:42:bc:b8:aa:e6:ab:5e:f9:b9:
+ b0:48:ae:b5:8d:cc:02:7b:e9:6f:4e:75:f7:17:a0:5e:7b:87:
+ 06:49:48:83:c5:bb:ca:95:07:37:0e:5d:e3:97:de:9e:0c:a4:
+ 82:30:11:81:49:5d:50:29:72:92:a5:ca:17:b1:7c:f1:32:11:
+ 17:57:e6:59:c1:ac:e3:3b:26:d2:94:97:50:6a:b9:54:88:84:
+ 9b:6f:b1:06:f5:80:04:22:10:14:b1:f5:97:25:fc:66:d6:69:
+ a3:36:08:85:23:ff:8e:3c:2b:e0:6d:e7:61:f1:00:8f:61:3d:
+ b0:87:ad:72:21:f6:f0:cc:4f:c9:20:bf:83:11:0f:21:f4:b8:
+ c0:dd:9c:51:d7:bb:27:32:ec:ab:a4:62:14:28:32:da:f2:87:
+ 80:68:9c:ea:ac:eb:f5:7f:f5:de:f4:c0:39:91:c8:76:a4:ee:
+ d0:a8:50:db:c1:4b:f9:c4:3d:d9:e8:8e:b6:3f:c0:96:79:12:
+ d8:fa:4d:0a:b3:36:76:aa:4e:b2:82:2f:a2:d4:0d:db:fd:64:
+ 77:6f:6e:e9:94:7f:0f:c8:3a:3c:96:3d:cd:4d:6c:ba:66:95:
+ f7:b4:9d:a4:94:9f:97:b3:9a:0d:dc:18:8c:11:0b:56:65:8e:
+ 46:4c:e6:5e
+-----BEGIN CERTIFICATE-----
+MIID2jCCAsKgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAdMRswGQYDVQQDDBJ3ZWIt
+cGxhdGZvcm0tdGVzdHMwHhcNMTQxMjIyMTIwOTE2WhcNMjQxMjIxMTIwOTE2WjAc
+MRowGAYDVQQDExF3ZWItcGxhdGZvcm0udGVzdDCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALOE1osBWRiF0dwy3zj3kIUbPqVegT4v/Dpff3fvI7s6iCcP
+viVGzWN9y5XYpVAQ0qLSt5fRDWz7+QXob6hLvZVnnnuUWKltk/3gEsXNtIpkUjFf
+DuOJhHHamN1L7AIlpX01/mPas6zspUYPDWQjXG3z7MwoYyPAS5rsj8HusaI+ck1w
+tQnB67QQVTyL6huUfkt05vSfT6ZFMLXwuLTRWVBlCoZT6kyfnvRYbDH1FzpvV4vL
+X/AoC0WSjTAgSf9S5izLGJrX5u4+TzQ1FRPFAtrFX777W86Nv7U1djx85pw7JodN
+jYDmFsYn8lBJtnJ0Q0lJRDi7eEMj7hY+2WLmpdcCAwEAAaOCASQwggEgMAkGA1Ud
+EwQCMAAwHQYDVR0OBBYEFC2Yo5k5HP7pmm0XlNI6lu7IngQiMB8GA1UdIwQYMBaA
+FGqrU2SSNocjNLMdb4VL9d9aXHSPMAsGA1UdDwQEAwIF4DATBgNVHSUEDDAKBggr
+BgEFBQcDATCBsAYDVR0RBIGoMIGlghF3ZWItcGxhdGZvcm0udGVzdIIVd3d3Lndl
+Yi1wbGF0Zm9ybS50ZXN0gil4bi0tbjhqNmRzNTNsd3drcnFodjI4YS53ZWItcGxh
+dGZvcm0udGVzdIIeeG4tLWx2ZS02bGFkLndlYi1wbGF0Zm9ybS50ZXN0ghZ3d3cy
+LndlYi1wbGF0Zm9ybS50ZXN0ghZ3d3cxLndlYi1wbGF0Zm9ybS50ZXN0MA0GCSqG
+SIb3DQEBCwUAA4IBAQAz2/fw9pIWTy1CvLiq5qte+bmwSK61jcwCe+lvTnX3F6Be
+e4cGSUiDxbvKlQc3Dl3jl96eDKSCMBGBSV1QKXKSpcoXsXzxMhEXV+ZZwazjOybS
+lJdQarlUiISbb7EG9YAEIhAUsfWXJfxm1mmjNgiFI/+OPCvgbedh8QCPYT2wh61y
+IfbwzE/JIL+DEQ8h9LjA3ZxR17snMuyrpGIUKDLa8oeAaJzqrOv1f/Xe9MA5kch2
+pO7QqFDbwUv5xD3Z6I62P8CWeRLY+k0KszZ2qk6ygi+i1A3b/WR3b27plH8PyDo8
+lj3NTWy6ZpX3tJ2klJ+Xs5oN3BiMEQtWZY5GTOZe
+-----END CERTIFICATE-----
diff --git a/tests/wpt/web-platform-tests/tools/browserutils/__init__.py b/tests/wpt/web-platform-tests/tools/ci/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/tools/browserutils/__init__.py
+++ b/tests/wpt/web-platform-tests/tools/ci/__init__.py
diff --git a/tests/wpt/web-platform-tests/tools/ci/before_install.sh b/tests/wpt/web-platform-tests/tools/ci/before_install.sh
new file mode 100755
index 00000000000..ff2609ead5c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/before_install.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+set -e
+
+if [[ $(./wpt test-jobs --includes $JOB; echo $?) -eq 0 ]]; then
+ export RUN_JOB=1
+ git submodule update --init --recursive 1>&2
+ export DISPLAY=:99.0
+ sh -e /etc/init.d/xvfb start 1>&2
+else
+ export RUN_JOB=0
+fi
diff --git a/tests/wpt/web-platform-tests/tools/ci/check_stability.py b/tests/wpt/web-platform-tests/tools/ci/check_stability.py
new file mode 100644
index 00000000000..cf3e10d6d0e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/check_stability.py
@@ -0,0 +1,385 @@
+from __future__ import print_function
+
+import argparse
+import logging
+import os
+import subprocess
+import sys
+from ConfigParser import SafeConfigParser
+
+import requests
+
+wpt_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))
+sys.path.insert(0, wpt_root)
+
+from tools.wpt import testfiles
+from tools.wpt.testfiles import get_git_cmd
+from tools.wpt.virtualenv import Virtualenv
+from tools.wpt.utils import Kwargs
+from tools.wpt.run import create_parser, setup_wptrunner
+from tools.wpt import markdown
+from tools import localpaths
+
+logger = None
+run, write_inconsistent, write_results = None, None, None
+wptrunner = None
+
+def setup_logging():
+ """Set up basic debug logger."""
+ handler = logging.StreamHandler(sys.stdout)
+ formatter = logging.Formatter(logging.BASIC_FORMAT, None)
+ handler.setFormatter(formatter)
+ logger.addHandler(handler)
+ logger.setLevel(logging.DEBUG)
+
+
+def do_delayed_imports():
+ global run, write_inconsistent, write_results, wptrunner
+ from tools.wpt.stability import run, write_inconsistent, write_results
+ from wptrunner import wptrunner
+
+
+class TravisFold(object):
+ """Context for TravisCI folding mechanism. Subclasses object.
+
+ See: https://blog.travis-ci.com/2013-05-22-improving-build-visibility-log-folds/
+ """
+
+ def __init__(self, name):
+ """Register TravisCI folding section name."""
+ self.name = name
+
+ def __enter__(self):
+ """Emit fold start syntax."""
+ print("travis_fold:start:%s" % self.name, file=sys.stderr)
+
+ def __exit__(self, type, value, traceback):
+ """Emit fold end syntax."""
+ print("travis_fold:end:%s" % self.name, file=sys.stderr)
+
+
+class FilteredIO(object):
+ """Wrap a file object, invoking the provided callback for every call to
+ `write` and only proceeding with the operation when that callback returns
+ True."""
+ def __init__(self, original, on_write):
+ self.original = original
+ self.on_write = on_write
+
+ def __getattr__(self, name):
+ return getattr(self.original, name)
+
+ def disable(self):
+ self.write = lambda msg: None
+
+ def write(self, msg):
+ encoded = msg.encode("utf8", "backslashreplace").decode("utf8")
+ if self.on_write(self.original, encoded) is True:
+ self.original.write(encoded)
+
+
+def replace_streams(capacity, warning_msg):
+ # Value must be boxed to support modification from inner function scope
+ count = [0]
+ capacity -= 2 + len(warning_msg)
+ stderr = sys.stderr
+
+ def on_write(handle, msg):
+ length = len(msg)
+ count[0] += length
+
+ if count[0] > capacity:
+ wrapped_stdout.disable()
+ wrapped_stderr.disable()
+ handle.write(msg[0:capacity - count[0]])
+ handle.flush()
+ stderr.write("\n%s\n" % warning_msg)
+ return False
+
+ return True
+
+ # Store local references to the replaced streams to guard against the case
+ # where other code replace the global references.
+ sys.stdout = wrapped_stdout = FilteredIO(sys.stdout, on_write)
+ sys.stderr = wrapped_stderr = FilteredIO(sys.stderr, on_write)
+
+
+def call(*args):
+ """Log terminal command, invoke it as a subprocess.
+
+ Returns a bytestring of the subprocess output if no error.
+ """
+ logger.debug("%s" % " ".join(args))
+ try:
+ return subprocess.check_output(args)
+ except subprocess.CalledProcessError as e:
+ logger.critical("%s exited with return code %i" %
+ (e.cmd, e.returncode))
+ logger.critical(e.output)
+ raise
+
+def fetch_wpt(user, *args):
+ git = get_git_cmd(wpt_root)
+ git("fetch", "https://github.com/%s/web-platform-tests.git" % user, *args)
+
+
+def get_sha1():
+ """ Get and return sha1 of current git branch HEAD commit."""
+ git = get_git_cmd(wpt_root)
+ return git("rev-parse", "HEAD").strip()
+
+
+def install_wptrunner():
+ """Install wptrunner."""
+ call("pip", "install", wptrunner_root)
+
+
+def deepen_checkout(user):
+ """Convert from a shallow checkout to a full one"""
+ fetch_args = [user, "+refs/heads/*:refs/remotes/origin/*"]
+ if os.path.exists(os.path.join(wpt_root, ".git", "shallow")):
+ fetch_args.insert(1, "--unshallow")
+ fetch_wpt(*fetch_args)
+
+
+def get_parser():
+ """Create and return script-specific argument parser."""
+ description = """Detect instabilities in new tests by executing tests
+ repeatedly and comparing results between executions."""
+ parser = argparse.ArgumentParser(description=description)
+ parser.add_argument("--user",
+ action="store",
+ # Travis docs say do not depend on USER env variable.
+ # This is a workaround to get what should be the same value
+ default=os.environ.get("TRAVIS_REPO_SLUG", "w3c").split('/')[0],
+ help="Travis user name")
+ parser.add_argument("--output-bytes",
+ action="store",
+ type=int,
+ help="Maximum number of bytes to write to standard output/error")
+ parser.add_argument("--metadata",
+ dest="metadata_root",
+ action="store",
+ default=wpt_root,
+ help="Directory that will contain MANIFEST.json")
+ parser.add_argument("--config-file",
+ action="store",
+ type=str,
+ help="Location of ini-formatted configuration file",
+ default="check_stability.ini")
+ parser.add_argument("--rev",
+ action="store",
+ default=None,
+ help="Commit range to use")
+ return parser
+
+
+def set_default_args(kwargs):
+ kwargs.set_if_none("sauce_platform",
+ os.environ.get("PLATFORM"))
+ kwargs.set_if_none("sauce_build",
+ os.environ.get("TRAVIS_BUILD_NUMBER"))
+ python_version = os.environ.get("TRAVIS_PYTHON_VERSION")
+ kwargs.set_if_none("sauce_tags",
+ [python_version] if python_version else [])
+ kwargs.set_if_none("sauce_tunnel_id",
+ os.environ.get("TRAVIS_JOB_NUMBER"))
+ kwargs.set_if_none("sauce_user",
+ os.environ.get("SAUCE_USERNAME"))
+ kwargs.set_if_none("sauce_key",
+ os.environ.get("SAUCE_ACCESS_KEY"))
+
+
+def pr():
+ pr = os.environ.get("TRAVIS_PULL_REQUEST", "false")
+ return pr if pr != "false" else None
+
+
+def post_results(results, pr_number, iterations, product, url, status):
+ """Post stability results to a given URL."""
+ payload_results = []
+
+ for test_name, test in results.iteritems():
+ subtests = []
+ for subtest_name, subtest in test['subtests'].items():
+ subtests.append({
+ 'test': subtest_name,
+ 'result': {
+ 'messages': list(subtest['messages']),
+ 'status': subtest['status']
+ },
+ })
+ payload_results.append({
+ 'test': test_name,
+ 'result': {
+ 'status': test['status'],
+ 'subtests': subtests
+ }
+ })
+
+ payload = {
+ "pull": {
+ "number": int(pr_number),
+ "sha": os.environ.get("TRAVIS_PULL_REQUEST_SHA"),
+ },
+ "job": {
+ "id": int(os.environ.get("TRAVIS_JOB_ID")),
+ "number": os.environ.get("TRAVIS_JOB_NUMBER"),
+ "allow_failure": os.environ.get("TRAVIS_ALLOW_FAILURE") == 'true',
+ "status": status,
+ },
+ "build": {
+ "id": int(os.environ.get("TRAVIS_BUILD_ID")),
+ "number": os.environ.get("TRAVIS_BUILD_NUMBER"),
+ },
+ "product": product,
+ "iterations": iterations,
+ "message": "All results were stable." if status == "passed" else "Unstable results.",
+ "results": payload_results,
+ }
+
+ requests.post(url, json=payload)
+
+
+def main():
+ """Perform check_stability functionality and return exit code."""
+
+ venv = Virtualenv(os.environ.get("VIRTUAL_ENV", os.path.join(wpt_root, "_venv")))
+ venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", "requirements.txt"))
+ venv.install("requests")
+
+ args, wpt_args = get_parser().parse_known_args()
+ return run(venv, wpt_args, **vars(args))
+
+
+def run(venv, wpt_args, **kwargs):
+ global logger
+
+ do_delayed_imports()
+
+ retcode = 0
+ parser = get_parser()
+
+ wpt_args = create_parser().parse_args(wpt_args)
+
+ with open(kwargs["config_file"], 'r') as config_fp:
+ config = SafeConfigParser()
+ config.readfp(config_fp)
+ skip_tests = config.get("file detection", "skip_tests").split()
+ ignore_changes = set(config.get("file detection", "ignore_changes").split())
+ results_url = config.get("file detection", "results_url")
+
+ if kwargs["output_bytes"] is not None:
+ replace_streams(kwargs["output_bytes"],
+ "Log reached capacity (%s bytes); output disabled." % kwargs["output_bytes"])
+
+
+ wpt_args.metadata_root = kwargs["metadata_root"]
+ try:
+ os.makedirs(wpt_args.metadata_root)
+ except OSError:
+ pass
+
+ logger = logging.getLogger(os.path.splitext(__file__)[0])
+
+ setup_logging()
+
+ browser_name = wpt_args.product.split(":")[0]
+
+ if browser_name == "sauce" and not wpt_args.sauce_key:
+ logger.warning("Cannot run tests on Sauce Labs. No access key.")
+ return retcode
+
+ pr_number = pr()
+
+ with TravisFold("browser_setup"):
+ logger.info(markdown.format_comment_title(wpt_args.product))
+
+ if pr is not None:
+ deepen_checkout(kwargs["user"])
+
+ # Ensure we have a branch called "master"
+ fetch_wpt(kwargs["user"], "master:master")
+
+ head_sha1 = get_sha1()
+ logger.info("Testing web-platform-tests at revision %s" % head_sha1)
+
+ if not kwargs["rev"]:
+ branch_point = testfiles.branch_point()
+ revish = "%s..HEAD" % branch_point
+ else:
+ revish = kwargs["rev"]
+
+ files_changed, files_ignored = testfiles.files_changed(revish, ignore_changes)
+
+ if files_ignored:
+ logger.info("Ignoring %s changed files:\n%s" % (len(files_ignored),
+ "".join(" * %s\n" % item for item in files_ignored)))
+
+ tests_changed, files_affected = testfiles.affected_testfiles(files_changed, skip_tests,
+ manifest_path=os.path.join(
+ wpt_args.metadata_root,
+ "MANIFEST.json"))
+
+ if not (tests_changed or files_affected):
+ logger.info("No tests changed")
+ return 0
+
+ wpt_kwargs = Kwargs(vars(wpt_args))
+ wpt_kwargs["test_list"] = list(tests_changed | files_affected)
+ set_default_args(wpt_kwargs)
+
+ do_delayed_imports()
+
+ wpt_kwargs["stability"] = True
+ wpt_kwargs["prompt"] = False
+ wpt_kwargs["install_browser"] = True
+ wpt_kwargs["install"] = wpt_kwargs["product"].split(":")[0] == "firefox"
+
+ wpt_kwargs = setup_wptrunner(venv, **wpt_kwargs)
+
+ logger.info("Using binary %s" % wpt_kwargs["binary"])
+
+ if tests_changed:
+ logger.debug("Tests changed:\n%s" % "".join(" * %s\n" % item for item in tests_changed))
+
+ if files_affected:
+ logger.debug("Affected tests:\n%s" % "".join(" * %s\n" % item for item in files_affected))
+
+
+ with TravisFold("running_tests"):
+ logger.info("Starting tests")
+
+
+ wpt_logger = wptrunner.logger
+ iterations, results, inconsistent = run(venv, wpt_logger, **wpt_kwargs)
+
+ if results:
+ if inconsistent:
+ write_inconsistent(logger.error, inconsistent, iterations)
+ retcode = 2
+ else:
+ logger.info("All results were stable\n")
+ with TravisFold("full_results"):
+ write_results(logger.info, results, iterations,
+ pr_number=pr_number,
+ use_details=True)
+ if pr_number:
+ post_results(results, iterations=iterations, url=results_url,
+ product=wpt_args.product, pr_number=pr_number,
+ status="failed" if inconsistent else "passed")
+ else:
+ logger.info("No tests run.")
+
+ return retcode
+
+
+if __name__ == "__main__":
+ try:
+ retcode = main()
+ except:
+ import traceback
+ traceback.print_exc()
+ sys.exit(1)
+ else:
+ sys.exit(retcode)
diff --git a/tests/wpt/web-platform-tests/tools/ci/ci_built_diff.sh b/tests/wpt/web-platform-tests/tools/ci/ci_built_diff.sh
new file mode 100755
index 00000000000..ce9fe6099d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/ci_built_diff.sh
@@ -0,0 +1,25 @@
+set -ex
+
+SCRIPT_DIR=$(dirname $(readlink -f "$0"))
+WPT_ROOT=$(readlink -f $SCRIPT_DIR/../..)
+cd $WPT_ROOT
+
+main() {
+ # Diff PNGs based on pixel-for-pixel identity
+ echo -e '[diff "img"]\n textconv = identify -quiet -format "%#"' >> .git/config
+ echo -e '*.png diff=img' >> .git/info/attributes
+
+ # Exclude tests that rely on font rendering
+ excluded=(
+ '2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.basic.png'
+ '2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.large.png'
+ '2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.rtl.png'
+ '2dcontext/drawing-text-to-the-canvas/2d.text.draw.stroke.basic.png'
+ )
+
+ ./update-built-tests.sh
+ git update-index --assume-unchanged ${excluded[*]}
+ git diff --exit-code
+}
+
+main
diff --git a/tests/wpt/web-platform-tests/tools/ci/ci_lint.sh b/tests/wpt/web-platform-tests/tools/ci/ci_lint.sh
new file mode 100644
index 00000000000..46b317e1a19
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/ci_lint.sh
@@ -0,0 +1,9 @@
+set -ex
+
+SCRIPT_DIR=$(dirname $(readlink -f "$0"))
+WPT_ROOT=$(readlink -f $SCRIPT_DIR/../..)
+cd $WPT_ROOT
+
+mkdir -p ~/meta
+./wpt manifest -p ~/meta/MANIFEST.json
+./wpt lint
diff --git a/tests/wpt/web-platform-tests/tools/ci/ci_resources_unittest.sh b/tests/wpt/web-platform-tests/tools/ci/ci_resources_unittest.sh
new file mode 100755
index 00000000000..fd28db5b7e6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/ci_resources_unittest.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+set -ex
+
+SCRIPT_DIR=$(dirname $(readlink -f "$0"))
+WPT_ROOT=$(readlink -f $SCRIPT_DIR/../..)
+cd $WPT_ROOT
+
+main() {
+ cd $WPT_ROOT
+ pip install -U tox
+ pip install --requirement tools/wpt/requirements.txt
+ ./wpt install firefox browser --destination $HOME
+ ./wpt install firefox webdriver --destination $HOME/firefox
+ export PATH=$HOME/firefox:$PATH
+
+ cd $WPT_ROOT/resources/test
+ tox
+}
+
+main
diff --git a/tests/wpt/web-platform-tests/tools/ci/ci_stability.sh b/tests/wpt/web-platform-tests/tools/ci/ci_stability.sh
new file mode 100644
index 00000000000..1b814ee58e3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/ci_stability.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+set -ex
+
+SCRIPT_DIR=$(dirname $(readlink -f "$0"))
+WPT_ROOT=$(readlink -f $SCRIPT_DIR/../..)
+cd $WPT_ROOT
+
+source tools/ci/lib.sh
+
+test_stability() {
+ ./wpt check-stability $PRODUCT --output-bytes $((1024 * 1024 * 3)) --metadata ~/meta/ --install-fonts
+}
+
+main() {
+ hosts_fixup
+ if [ $(echo $PRODUCT | grep '^chrome:') ]; then
+ install_chrome $(echo $PRODUCT | grep --only-matching '\w\+$')
+ fi
+ test_stability
+}
+
+main
diff --git a/tests/wpt/web-platform-tests/tools/ci/ci_tools_unittest.sh b/tests/wpt/web-platform-tests/tools/ci/ci_tools_unittest.sh
new file mode 100755
index 00000000000..6c74a251244
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/ci_tools_unittest.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+set -ex
+
+SCRIPT_DIR=$(dirname $(readlink -f "$0"))
+WPT_ROOT=$(readlink -f $SCRIPT_DIR/../..)
+cd $WPT_ROOT
+
+if [[ $(./wpt test-jobs --includes tools_unittest; echo $?) -eq 0 ]]; then
+ pip install -U tox codecov
+ cd tools
+ tox
+ cd $WPT_ROOT
+else
+ echo "Skipping tools unittest"
+fi
+
+if [[ $(./wpt test-jobs --includes wptrunner_unittest; echo $?) -eq 0 ]]; then
+ if [ $TOXENV == "py27" ] || [ $TOXENV == "pypy" ]; then
+ cd tools/wptrunner
+ tox
+ fi
+else
+ echo "Skipping wptrunner unittest"
+fi
+
diff --git a/tests/wpt/web-platform-tests/tools/ci/ci_wpt.sh b/tests/wpt/web-platform-tests/tools/ci/ci_wpt.sh
new file mode 100644
index 00000000000..2b634137605
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/ci_wpt.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+set -e
+
+SCRIPT_DIR=$(dirname $(readlink -f "$0"))
+WPT_ROOT=$(readlink -f $SCRIPT_DIR/../..)
+cd $WPT_ROOT
+
+source tools/ci/lib.sh
+
+main() {
+ git fetch --unshallow https://github.com/w3c/web-platform-tests.git +refs/heads/*:refs/remotes/origin/*
+ hosts_fixup
+ install_chrome unstable
+ pip install -U tox codecov
+ cd tools/wpt
+ tox
+}
+
+main
diff --git a/tests/wpt/web-platform-tests/tools/ci/commands.json b/tests/wpt/web-platform-tests/tools/ci/commands.json
new file mode 100644
index 00000000000..d682d2a5064
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/commands.json
@@ -0,0 +1,6 @@
+{
+ "test-jobs": {"path": "jobs.py", "script": "run", "parser": "create_parser", "help": "List test jobs that should run for a set of commits",
+ "virtualenv": false},
+ "check-stability": {"path": "check_stability.py", "script": "run", "parser": "get_parser", "parse_known": true, "help": "Check test stability",
+ "virtualenv": true, "install": ["requests"], "requirements": ["../wptrunner/requirements.txt"]}
+}
diff --git a/tests/wpt/web-platform-tests/tools/ci/install.sh b/tests/wpt/web-platform-tests/tools/ci/install.sh
new file mode 100755
index 00000000000..d1d4368d4ff
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/install.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+set -ex
+
+SCRIPT_DIR=$(dirname $(readlink -f "$0"))
+WPT_ROOT=$(readlink -f $SCRIPT_DIR/../..)
+cd $WPT_ROOT
+
+if [[ $RUN_JOB -eq 1 ]]; then
+ pip install -U setuptools
+ pip install -U requests
+fi
diff --git a/tests/wpt/web-platform-tests/tools/ci/jobs.py b/tests/wpt/web-platform-tests/tools/ci/jobs.py
new file mode 100644
index 00000000000..2d2ef2ae6cb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/jobs.py
@@ -0,0 +1,119 @@
+import argparse
+import os
+import re
+from ..wpt.testfiles import branch_point, files_changed, affected_testfiles
+
+from tools import localpaths
+from six import iteritems
+
+wpt_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))
+
+# Rules are just regex on the path, with a leading ! indicating a regex that must not
+# match for the job
+job_path_map = {
+ "stability": [".*/.*",
+ "!tools/",
+ "!docs/",
+ "!resources/*",
+ "!conformance-checkers/",
+ "!.*/OWNERS",
+ "!.*/tools/",
+ "!.*/README",
+ "!css/[^/]*$"],
+ "lint": [".*"],
+ "resources_unittest": ["resources/"],
+ "tools_unittest": ["tools/"],
+ "wptrunner_unittest": ["tools/wptrunner/*"],
+ "build_css": ["css/"],
+ "update_built": ["2dcontext/",
+ "assumptions/",
+ "html/",
+ "offscreen-canvas/"],
+ "wpt_integration": ["tools/"],
+}
+
+
+class Ruleset(object):
+ def __init__(self, rules):
+ self.include = []
+ self.exclude = []
+ for rule in rules:
+ self.add_rule(rule)
+
+ def add_rule(self, rule):
+ if rule.startswith("!"):
+ target = self.exclude
+ rule = rule[1:]
+ else:
+ target = self.include
+
+ target.append(re.compile("^%s" % rule))
+
+ def __call__(self, path):
+ if os.path.sep != "/":
+ path = path.replace(os.path.sep, "/")
+ path = os.path.normcase(path)
+ for item in self.exclude:
+ if item.match(path):
+ return False
+ for item in self.include:
+ if item.match(path):
+ return True
+ return False
+
+ def __repr__(self):
+ subs = tuple(",".join(item.pattern for item in target)
+ for target in (self.include, self.exclude))
+ return "Rules<include:[%s] exclude:[%s]>" % subs
+
+
+def get_paths(**kwargs):
+ if kwargs["revish"] is None:
+ revish = "%s..HEAD" % branch_point()
+ else:
+ revish = kwargs["revish"]
+
+ changed, _ = files_changed(revish)
+ all_changed = set(os.path.relpath(item, wpt_root)
+ for item in set(changed))
+ return all_changed
+
+
+def get_jobs(paths, **kwargs):
+ jobs = set()
+
+ rules = {}
+ includes = kwargs.get("includes")
+ if includes is not None:
+ includes = set(includes)
+ for key, value in iteritems(job_path_map):
+ if includes is None or key in includes:
+ rules[key] = Ruleset(value)
+
+ for path in paths:
+ for job in list(rules.keys()):
+ ruleset = rules[job]
+ if ruleset(path):
+ rules.pop(job)
+ jobs.add(job)
+ if not rules:
+ break
+
+ return jobs
+
+
+def create_parser():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("revish", default=None, help="Commits to consider. Defaults to the commits on the current branch", nargs="?")
+ parser.add_argument("--includes", default=None, help="Jobs to check for. Return code is 0 if all jobs are found, otherwise 1", nargs="*")
+ return parser
+
+
+def run(**kwargs):
+ paths = get_paths(**kwargs)
+ jobs = get_jobs(paths, **kwargs)
+ if not kwargs["includes"]:
+ for item in sorted(jobs):
+ print(item)
+ else:
+ return 0 if set(kwargs["includes"]) == jobs else 1
diff --git a/tests/wpt/web-platform-tests/tools/ci/lib.sh b/tests/wpt/web-platform-tests/tools/ci/lib.sh
new file mode 100644
index 00000000000..e80499a7d0a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/lib.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+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
+0.0.0.0 nonexistent-origin.web-platform.test
+" >> /etc/hosts'
+ echo "== /etc/hosts =="
+ cat /etc/hosts
+ echo "----------------"
+ echo "travis_fold:end:hosts_fixup"
+}
+
+install_chrome() {
+ channel=$1
+ deb_archive=google-chrome-${channel}_current_amd64.deb
+ wget https://dl.google.com/linux/direct/$deb_archive
+
+ # If the environment provides an installation of Google Chrome, the
+ # existing binary may take precedence over the one introduced in this
+ # script. Remove any previously-existing "alternatives" prior to
+ # installation in order to ensure that the new binary is installed as
+ # intended.
+ if sudo update-alternatives --list google-chrome; then
+ sudo update-alternatives --remove-all google-chrome
+ fi
+
+ # Installation will fail in cases where the package has unmet dependencies.
+ # When this occurs, attempt to use the system package manager to fetch the
+ # required packages and retry.
+ if ! sudo dpkg --install $deb_archive; then
+ sudo apt-get install --fix-broken
+ sudo dpkg --install $deb_archive
+ fi
+}
diff --git a/tests/wpt/web-platform-tests/tools/ci/run.sh b/tests/wpt/web-platform-tests/tools/ci/run.sh
new file mode 100755
index 00000000000..d126dbe3e57
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/run.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+set -ex
+
+SCRIPT_DIR=$(dirname $(readlink -f "$0"))
+WPT_ROOT=$(readlink -f $SCRIPT_DIR/../..)
+cd $WPT_ROOT
+
+if [[ $RUN_JOB -eq 1 ]]; then
+ . $SCRIPT
+fi
diff --git a/tests/wpt/web-platform-tests/tools/ci/tests/test_jobs.py b/tests/wpt/web-platform-tests/tools/ci/tests/test_jobs.py
new file mode 100644
index 00000000000..3192a471b85
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/ci/tests/test_jobs.py
@@ -0,0 +1,76 @@
+from tools.ci import jobs
+
+def test_testharness():
+ assert jobs.get_jobs(["resources/testharness.js"]) == set(["lint", "resources_unittest"])
+ assert jobs.get_jobs(["resources/testharness.js"],
+ includes=["resources_unittest"]) == set(["resources_unittest"])
+ assert jobs.get_jobs(["foo/resources/testharness.js"],
+ includes=["resources_unittest"]) == set()
+
+def test_stability():
+ assert jobs.get_jobs(["dom/historical.html"],
+ includes=["stability"]) == set(["stability"])
+ assert jobs.get_jobs(["tools/pytest.ini"],
+ includes=["stability"]) == set()
+ assert jobs.get_jobs(["serve"],
+ includes=["stability"]) == set()
+ assert jobs.get_jobs(["resources/testharness.js"],
+ includes=["stability"]) == set()
+ assert jobs.get_jobs(["docs/.gitignore"],
+ includes=["stability"]) == set()
+ assert jobs.get_jobs(["dom/tools/example.py"],
+ includes=["stability"]) == set()
+ assert jobs.get_jobs(["conformance-checkers/test.html"],
+ includes=["stability"]) == set()
+ assert jobs.get_jobs(["dom/README.md"],
+ includes=["stability"]) == set()
+ assert jobs.get_jobs(["css/build-css-testsuite.sh"],
+ includes=["stability"]) == set()
+ assert jobs.get_jobs(["css/CSS21/test-001.html"],
+ includes=["stability"]) == set(["stability"])
+ assert jobs.get_jobs(["css/build-css-testsuite.sh",
+ "css/CSS21/test-001.html"],
+ includes=["stability"]) == set(["stability"])
+
+def test_lint():
+ assert jobs.get_jobs(["README.md"]) == set(["lint"])
+
+def test_tools_unittest():
+ assert jobs.get_jobs(["tools/ci/test/test_jobs.py"],
+ includes=["tools_unittest"]) == set(["tools_unittest"])
+ assert jobs.get_jobs(["dom/tools/example.py"],
+ includes=["tools_unittest"]) == set()
+ assert jobs.get_jobs(["dom/historical.html"],
+ includes=["tools_unittest"]) == set()
+
+def test_wptrunner_unittest():
+ assert jobs.get_jobs(["tools/wptrunner/wptrunner/wptrunner.py"],
+ includes=["wptrunner_unittest"]) == set(["wptrunner_unittest"])
+ assert jobs.get_jobs(["tools/example.py"],
+ includes=["wptrunner_unittest"]) == set()
+
+def test_build_css():
+ assert jobs.get_jobs(["css/css-build-testsuites.sh"],
+ includes=["build_css"]) == set(["build_css"])
+ assert jobs.get_jobs(["css/CSS21/test.html"],
+ includes=["build_css"]) == set(["build_css"])
+ assert jobs.get_jobs(["html/css/CSS21/test.html"],
+ includes=["build_css"]) == set()
+
+
+def test_update_built():
+ assert jobs.get_jobs(["2dcontext/foo.html"],
+ includes=["update_built"]) == set(["update_built"])
+ assert jobs.get_jobs(["assumptions/foo.html"],
+ includes=["update_built"]) == set(["update_built"])
+ assert jobs.get_jobs(["html/foo.html"],
+ includes=["update_built"]) == set(["update_built"])
+ assert jobs.get_jobs(["offscreen-canvas/foo.html"],
+ includes=["update_built"]) == set(["update_built"])
+
+
+def test_wpt_integration():
+ assert jobs.get_jobs(["tools/wpt/wpt.py"],
+ includes=["wpt_integration"]) == set(["wpt_integration"])
+ assert jobs.get_jobs(["tools/wptrunner/wptrunner/wptrunner.py"],
+ includes=["wpt_integration"]) == set(["wpt_integration"])
diff --git a/tests/wpt/web-platform-tests/tools/lint/commands.json b/tests/wpt/web-platform-tests/tools/lint/commands.json
new file mode 100644
index 00000000000..a8e9844fafe
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/lint/commands.json
@@ -0,0 +1,3 @@
+{"lint":
+ {"path": "lint.py", "script": "main", "parser": "create_parser", "help": "Run the lint",
+ "virtualenv": false}}
diff --git a/tests/wpt/web-platform-tests/tools/lint/lint.py b/tests/wpt/web-platform-tests/tools/lint/lint.py
index c4c54939770..e4ad323cc8d 100644
--- a/tests/wpt/web-platform-tests/tools/lint/lint.py
+++ b/tests/wpt/web-platform-tests/tools/lint/lint.py
@@ -15,8 +15,9 @@ from collections import defaultdict
from . import fnmatch
from .. import localpaths
from ..gitignore.gitignore import PathFilter
+from ..wpt import testfiles
-from manifest.sourcefile import SourceFile, js_meta_re, python_meta_re
+from manifest.sourcefile import SourceFile, js_meta_re, python_meta_re, space_chars
from six import binary_type, iteritems, itervalues
from six.moves import range
from six.moves.urllib.parse import urlsplit, urljoin
@@ -126,6 +127,13 @@ def check_worker_collision(repo_root, path, css_mode):
return []
+def check_ahem_copy(repo_root, path, css_mode):
+ lpath = path.lower()
+ if "ahem" in lpath and lpath.endswith(".ttf"):
+ return [("AHEM COPY", "Don't add extra copies of Ahem, use /fonts/Ahem.ttf", path, None)]
+ return []
+
+
drafts_csswg_re = re.compile(r"https?\:\/\/drafts\.csswg\.org\/([^/?#]+)")
w3c_tr_re = re.compile(r"https?\:\/\/www\.w3c?\.org\/TR\/([^/?#]+)")
w3c_dev_re = re.compile(r"https?\:\/\/dev\.w3c?\.org\/[^/?#]+\/([^/?#]+)")
@@ -335,12 +343,24 @@ class ConsoleRegexp(Regexp):
file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"]
description = "Console logging API used"
+class GenerateTestsRegexp(Regexp):
+ pattern = b"generate_tests\s*\("
+ error = "GENERATE_TESTS"
+ file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"]
+ description = "generate_tests used"
+
class PrintRegexp(Regexp):
pattern = b"print(?:\s|\s*\()"
error = "PRINT STATEMENT"
file_extensions = [".py"]
description = "Print function used"
+class LayoutTestsRegexp(Regexp):
+ pattern = b"eventSender|testRunner|window\.internals"
+ error = "LAYOUTTESTS APIS"
+ file_extensions = [".html", ".htm", ".js", ".xht", ".xhtml", ".svg"]
+ description = "eventSender/testRunner/window.internals used; these are LayoutTests-specific APIs (WebKit/Blink)"
+
regexps = [item() for item in
[TrailingWhitespaceRegexp,
TabsRegexp,
@@ -349,7 +369,9 @@ regexps = [item() for item in
W3CTestOrgRegexp,
Webidl2Regexp,
ConsoleRegexp,
- PrintRegexp]]
+ GenerateTestsRegexp,
+ PrintRegexp,
+ LayoutTestsRegexp]]
def check_regexp_line(repo_root, path, f, css_mode):
errors = []
@@ -395,7 +417,7 @@ def check_parsed(repo_root, path, f, css_mode):
return [("CONTENT-VISUAL", "Visual test whose filename doesn't end in '-visual'", path, None)]
for reftest_node in source_file.reftest_nodes:
- href = reftest_node.attrib.get("href", "")
+ href = reftest_node.attrib.get("href", "").strip(space_chars)
parts = urlsplit(href)
if parts.scheme or parts.netloc:
errors.append(("ABSOLUTE-URL-REF",
@@ -636,6 +658,7 @@ def output_errors_text(errors):
pos_string += ":%s" % line_number
logger.error("%s: %s (%s)" % (pos_string, description, error_type))
+
def output_errors_markdown(errors):
if not errors:
return
@@ -651,6 +674,7 @@ def output_errors_markdown(errors):
pos_string += ":%s" % line_number
logger.error("%s | %s | %s |" % (error_type, pos_string, description))
+
def output_errors_json(errors):
for error_type, error, path, line_number in errors:
print(json.dumps({"path": path, "lineno": line_number,
@@ -669,7 +693,34 @@ def output_error_count(error_count):
else:
logger.info("There were %d errors (%s)" % (count, by_type))
-def parse_args():
+
+def changed_files(wpt_root):
+ revish = testfiles.get_revish(revish=None)
+ changed, _ = testfiles.files_changed(revish, set(), include_uncommitted=True, include_new=True)
+ return [os.path.relpath(item, wpt_root) for item in changed]
+
+
+def lint_paths(kwargs, wpt_root):
+ if kwargs.get("paths"):
+ paths = kwargs["paths"]
+ elif kwargs["all"]:
+ paths = list(all_filesystem_paths(wpt_root))
+ else:
+ changed_paths = changed_files(wpt_root)
+ force_all = False
+ # If we changed the lint itself ensure that we retest everything
+ for path in changed_paths:
+ path = path.replace(os.path.sep, "/")
+ if path == "lint.whitelist" or path.startswith("tools/lint/"):
+ force_all = True
+ break
+ paths = (list(changed_paths) if not force_all
+ else list(all_filesystem_paths(wpt_root)))
+
+ return paths
+
+
+def create_parser():
parser = argparse.ArgumentParser()
parser.add_argument("paths", nargs="*",
help="List of paths to lint")
@@ -681,7 +732,9 @@ def parse_args():
help="Run CSS testsuite specific lints")
parser.add_argument("--repo-root", help="The WPT directory. Use this"
"option if the lint script exists outside the repository")
- return parser.parse_args()
+ parser.add_argument("--all", action="store_true", help="If no paths are passed, try to lint the whole "
+ "working directory, not just files that changed")
+ return parser
def main(**kwargs):
@@ -695,9 +748,11 @@ def main(**kwargs):
(False, False): "normal"}[(kwargs.get("json", False),
kwargs.get("markdown", False))]
- paths = list(kwargs.get("paths") if kwargs.get("paths") else all_filesystem_paths(repo_root))
if output_format == "markdown":
setup_logging(True)
+
+ paths = lint_paths(kwargs, repo_root)
+
return lint(repo_root, paths, output_format, kwargs.get("css_mode", False))
@@ -760,12 +815,12 @@ def lint(repo_root, paths, output_format, css_mode):
logger.info(line)
return sum(itervalues(error_count))
-path_lints = [check_path_length, check_worker_collision]
+path_lints = [check_path_length, check_worker_collision, check_ahem_copy]
all_paths_lints = [check_css_globally_unique]
file_lints = [check_regexp_line, check_parsed, check_python_ast, check_script_metadata]
if __name__ == "__main__":
- args = parse_args()
+ args = create_parser().parse_args()
error_count = main(**vars(args))
if error_count > 0:
sys.exit(1)
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 dba5b53bec0..1406de2e980 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
@@ -145,6 +145,51 @@ def test_setTimeout():
1)]
+def test_eventSender():
+ error_map = check_with_files(b"<script>eventSender.mouseDown()</script>")
+
+ for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
+ if kind == "python":
+ assert errors == [("PARSE-FAILED", "Unable to parse file", filename, 1)]
+ else:
+ assert errors == [('LAYOUTTESTS APIS',
+ 'eventSender/testRunner/window.internals used; these are LayoutTests-specific APIs (WebKit/Blink)',
+ filename,
+ 1)]
+
+
+def test_testRunner():
+ error_map = check_with_files(b"<script>if (window.testRunner) { testRunner.waitUntilDone(); }</script>")
+
+ for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
+ if kind == "python":
+ assert errors == [("PARSE-FAILED", "Unable to parse file", filename, 1)]
+ else:
+ assert errors == [('LAYOUTTESTS APIS',
+ 'eventSender/testRunner/window.internals used; these are LayoutTests-specific APIs (WebKit/Blink)',
+ filename,
+ 1)]
+
+
+def test_windowDotInternals():
+ error_map = check_with_files(b"<script>if (window.internals) { internals.doAThing(); }</script>")
+
+ for (filename, (errors, kind)) in error_map.items():
+ check_errors(errors)
+
+ if kind == "python":
+ assert errors == [("PARSE-FAILED", "Unable to parse file", filename, 1)]
+ else:
+ assert errors == [('LAYOUTTESTS APIS',
+ 'eventSender/testRunner/window.internals used; these are LayoutTests-specific APIs (WebKit/Blink)',
+ filename,
+ 1)]
+
+
def test_meta_timeout():
code = b"""
<html xmlns="http://www.w3.org/1999/xhtml">
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 2b41701799b..82f432482c9 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
@@ -9,7 +9,7 @@ import six
from ...localpaths import repo_root
from .. import lint as lint_mod
-from ..lint import filter_whitelist_errors, parse_whitelist, lint, parse_args
+from ..lint import filter_whitelist_errors, parse_whitelist, lint, create_parser
_dummy_repo = os.path.join(os.path.dirname(__file__), "dummy")
@@ -389,7 +389,7 @@ def test_main_with_args():
try:
sys.argv = ['./lint', 'a', 'b', 'c']
with _mock_lint('lint', return_value=True) as m:
- lint_mod.main(**vars(parse_args()))
+ lint_mod.main(**vars(create_parser().parse_args()))
m.assert_called_once_with(repo_root, ['a', 'b', 'c'], "normal", False)
finally:
sys.argv = orig_argv
@@ -400,8 +400,20 @@ def test_main_no_args():
try:
sys.argv = ['./lint']
with _mock_lint('lint', return_value=True) as m:
+ with _mock_lint('changed_files', return_value=['foo', 'bar']) as m2:
+ lint_mod.main(**vars(create_parser().parse_args()))
+ m.assert_called_once_with(repo_root, ['foo', 'bar'], "normal", False)
+ finally:
+ sys.argv = orig_argv
+
+
+def test_main_all():
+ orig_argv = sys.argv
+ try:
+ sys.argv = ['./lint', '--all']
+ with _mock_lint('lint', return_value=True) as m:
with _mock_lint('all_filesystem_paths', return_value=['foo', 'bar']) as m2:
- lint_mod.main(**vars(parse_args()))
+ lint_mod.main(**vars(create_parser().parse_args()))
m.assert_called_once_with(repo_root, ['foo', 'bar'], "normal", False)
finally:
sys.argv = orig_argv
diff --git a/tests/wpt/web-platform-tests/tools/localpaths.py b/tests/wpt/web-platform-tests/tools/localpaths.py
index c932ef4b92f..9d59cf815c6 100644
--- a/tests/wpt/web-platform-tests/tools/localpaths.py
+++ b/tests/wpt/web-platform-tests/tools/localpaths.py
@@ -5,7 +5,6 @@ here = os.path.abspath(os.path.split(__file__)[0])
repo_root = os.path.abspath(os.path.join(here, os.pardir))
sys.path.insert(0, os.path.join(here))
-sys.path.insert(0, os.path.join(here, "browserutils"))
sys.path.insert(0, os.path.join(here, "six"))
sys.path.insert(0, os.path.join(here, "html5lib"))
sys.path.insert(0, os.path.join(here, "wptserve"))
diff --git a/tests/wpt/web-platform-tests/tools/manifest/commands.json b/tests/wpt/web-platform-tests/tools/manifest/commands.json
new file mode 100644
index 00000000000..322cc59811b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/manifest/commands.json
@@ -0,0 +1,3 @@
+{"manifest":
+ {"path": "update.py", "script": "run", "parser": "create_parser", "help": "Update the MANIFEST.json file",
+ "virtualenv": false}}
diff --git a/tests/wpt/web-platform-tests/tools/manifest/log.py b/tests/wpt/web-platform-tests/tools/manifest/log.py
index 671154b56f3..55ff6e87c9d 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/log.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/log.py
@@ -2,11 +2,13 @@ import logging
import sys
logger = logging.getLogger("manifest")
-logger.setLevel(logging.DEBUG)
-handler = logging.StreamHandler(sys.stdout)
-formatter = logging.Formatter(logging.BASIC_FORMAT, None)
-handler.setFormatter(formatter)
-logger.addHandler(handler)
+
+def setup():
+ logger.setLevel(logging.DEBUG)
+ handler = logging.StreamHandler(sys.stdout)
+ formatter = logging.Formatter(logging.BASIC_FORMAT, None)
+ handler.setFormatter(formatter)
+ logger.addHandler(handler)
def get_logger():
return logger
diff --git a/tests/wpt/web-platform-tests/tools/manifest/manifest.py b/tests/wpt/web-platform-tests/tools/manifest/manifest.py
index 8bbabc38a44..b153798d6f9 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/manifest.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/manifest.py
@@ -237,6 +237,9 @@ def load(tests_root, manifest):
def write(manifest, manifest_path):
+ dir_name = os.path.dirname(manifest_path)
+ if not os.path.exists(dir_name):
+ os.makedirs(dir_name)
with open(manifest_path, "wb") as f:
json.dump(manifest.to_json(), f, sort_keys=True, indent=1, separators=(',', ': '))
f.write("\n")
diff --git a/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py b/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
index 0798c440272..bf72f45b351 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/sourcefile.py
@@ -21,6 +21,8 @@ python_meta_re = re.compile(b"#\s*META:\s*(\w*)=(.*)$")
reference_file_re = re.compile(r'(^|[\-_])(not)?ref[0-9]*([\-_]|$)')
+space_chars = u"".join(html5lib.constants.spaceCharacters)
+
def replace_end(s, old, new):
"""
Given a string `s` that ends with `old`, replace that occurrence of `old`
@@ -227,7 +229,7 @@ class SourceFile(object):
rel_dir_tree = self.rel_path.split(os.path.sep)
return (rel_dir_tree[0] == "webdriver" and
len(rel_dir_tree) > 1 and
- self.filename != "__init__.py" and
+ self.filename not in ("__init__.py", "conftest.py") and
fnmatch(self.filename, wd_pattern))
@property
@@ -399,7 +401,7 @@ class SourceFile(object):
rel_map = {"match": "==", "mismatch": "!="}
for item in self.reftest_nodes:
if "href" in item.attrib:
- ref_url = urljoin(self.url, item.attrib["href"])
+ ref_url = urljoin(self.url, item.attrib["href"].strip(space_chars))
ref_type = rel_map[item.attrib["rel"]]
rv.append((ref_url, ref_type))
return rv
@@ -451,7 +453,7 @@ class SourceFile(object):
rv = set()
for item in self.spec_link_nodes:
if "href" in item.attrib:
- rv.add(item.attrib["href"])
+ rv.add(item.attrib["href"].strip(space_chars))
return rv
@cached_property
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 b86110e887d..73ef410a30d 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
@@ -542,3 +542,23 @@ def test_no_parse():
def test_relpath_normalized(input, expected):
s = create(input, b"")
assert s.rel_path == expected
+
+
+@pytest.mark.parametrize("url", [b"ref.html",
+ b"\x20ref.html",
+ b"ref.html\x20",
+ b"\x09\x0a\x0c\x0d\x20ref.html\x09\x0a\x0c\x0d\x20"])
+def test_reftest_url_whitespace(url):
+ content = b"<link rel=match href='%s'>" % url
+ s = create("foo/test.html", content)
+ assert s.references == [("/foo/ref.html", "==")]
+
+
+@pytest.mark.parametrize("url", [b"http://example.com/",
+ b"\x20http://example.com/",
+ b"http://example.com/\x20",
+ b"\x09\x0a\x0c\x0d\x20http://example.com/\x09\x0a\x0c\x0d\x20"])
+def test_spec_links_whitespace(url):
+ content = b"<link rel=help href='%s'>" % url
+ s = create("foo/test.html", content)
+ assert s.spec_links == {"http://example.com/"}
diff --git a/tests/wpt/web-platform-tests/tools/manifest/update.py b/tests/wpt/web-platform-tests/tools/manifest/update.py
index be34441cd37..0bbbefb9111 100644
--- a/tests/wpt/web-platform-tests/tools/manifest/update.py
+++ b/tests/wpt/web-platform-tests/tools/manifest/update.py
@@ -10,6 +10,8 @@ from .log import get_logger
here = os.path.dirname(__file__)
+wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir))
+
def update(tests_root, manifest, working_copy=False):
tree = None
@@ -57,7 +59,7 @@ def create_parser():
parser.add_argument(
"-p", "--path", type=abs_path, help="Path to manifest file.")
parser.add_argument(
- "--tests-root", type=abs_path, help="Path to root of tests.")
+ "--tests-root", type=abs_path, default=wpt_root, help="Path to root of tests.")
parser.add_argument(
"-r", "--rebuild", action="store_true", default=False,
help="Force a full rebuild of the manifest.")
@@ -81,24 +83,14 @@ def find_top_repo():
return rv
-def main(default_tests_root=None):
- opts = create_parser().parse_args()
+def run(**kwargs):
+ if kwargs["path"] is None:
+ kwargs["path"] = os.path.join(kwargs["tests_root"], "MANIFEST.json")
- if opts.tests_root is None:
- tests_root = None
- if default_tests_root is not None:
- tests_root = default_tests_root
- else:
- tests_root = find_top_repo()
+ update_from_cli(**kwargs)
- if tests_root is None:
- print >> sys.stderr, """No git repo found; could not determine test root.
-Run again with --test-root"""
- sys.exit(1)
- opts.tests_root = tests_root
-
- if opts.path is None:
- opts.path = os.path.join(opts.tests_root, "MANIFEST.json")
+def main():
+ opts = create_parser().parse_args()
- update_from_cli(**vars(opts))
+ run(**vars(opts))
diff --git a/tests/wpt/web-platform-tests/tools/pytest.ini b/tests/wpt/web-platform-tests/tools/pytest.ini
index 8cc3d6f2239..e1ad451c8b3 100644
--- a/tests/wpt/web-platform-tests/tools/pytest.ini
+++ b/tests/wpt/web-platform-tests/tools/pytest.ini
@@ -1,2 +1,2 @@
[pytest]
-norecursedirs = .* {arch} *.egg html5lib py pytest pywebsocket six wptrunner
+norecursedirs = .* {arch} *.egg html5lib py pytest pywebsocket six wpt wptrunner
diff --git a/tests/wpt/web-platform-tests/tools/serve/commands.json b/tests/wpt/web-platform-tests/tools/serve/commands.json
new file mode 100644
index 00000000000..abcb2970b63
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/serve/commands.json
@@ -0,0 +1,2 @@
+{"serve": {"path": "serve.py", "script": "run", "parser": "get_parser", "help": "Run wptserve server",
+ "virtualenv": false}}
diff --git a/tests/wpt/web-platform-tests/tools/serve/serve.py b/tests/wpt/web-platform-tests/tools/serve/serve.py
index c0991366f2e..96417c326fa 100644
--- a/tests/wpt/web-platform-tests/tools/serve/serve.py
+++ b/tests/wpt/web-platform-tests/tools/serve/serve.py
@@ -40,6 +40,8 @@ class WrapperHandler(object):
__meta__ = abc.ABCMeta
+ headers = []
+
def __init__(self, base_path=None, url_base="/"):
self.base_path = base_path
self.url_base = url_base
@@ -49,6 +51,9 @@ class WrapperHandler(object):
self.handler(request, response)
def handle_request(self, request, response):
+ for header_name, header_value in self.headers:
+ response.headers.set(header_name, header_value)
+
path = self._get_path(request.url_parts.path, True)
meta = "\n".join(self._get_meta(request))
response.content = self.wrapper % {"meta": meta, "path": path}
@@ -169,6 +174,7 @@ self.GLOBAL = {
class AnyWorkerHandler(WrapperHandler):
+ headers = [('Content-Type', 'text/javascript')]
path_replace = [(".any.worker.js", ".any.js")]
wrapper = """%(meta)s
self.GLOBAL = {
@@ -762,10 +768,9 @@ def get_parser():
return parser
-def main():
- kwargs = vars(get_parser().parse_args())
- config = load_config("config.default.json",
- "config.json",
+def run(**kwargs):
+ config = load_config(os.path.join(repo_root, "config.default.json"),
+ os.path.join(repo_root, "config.json"),
**kwargs)
setup_logger(config["log_level"])
@@ -784,3 +789,8 @@ def main():
item.join(1)
except KeyboardInterrupt:
logger.info("Shutting down")
+
+
+def main():
+ kwargs = vars(get_parser().parse_args())
+ return run(**kwargs)
diff --git a/tests/wpt/web-platform-tests/tools/tox.ini b/tests/wpt/web-platform-tests/tools/tox.ini
index 1ea30a5da18..3b97ae4b5f7 100644
--- a/tests/wpt/web-platform-tests/tools/tox.ini
+++ b/tests/wpt/web-platform-tests/tools/tox.ini
@@ -1,5 +1,5 @@
[tox]
-envlist = py27,py35,py36,pypy
+envlist = py27,py36,pypy
skipsdist=True
[testenv]
@@ -21,4 +21,4 @@ passenv =
[flake8]
ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E901,F401,F821,F841
max-line-length = 141
-exclude = .tox,html5lib,py,pytest,pywebsocket,six,_venv,webencodings,wptserve/docs,wptserve/tests/functional/docroot/,wptrunner
+exclude = .tox,html5lib,py,pytest,pywebsocket,six,_venv,webencodings,wptserve/docs,wptserve/tests/functional/docroot/,wpt,wptrunner
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 b90a58c9d73..eb0734ba6bd 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/client.py
@@ -1,8 +1,12 @@
+import json
import urlparse
import error
import transport
+from mozlog import get_default_logger
+
+logger = get_default_logger()
element_key = "element-6066-11e4-a52e-4f735466cecf"
@@ -239,35 +243,51 @@ class Window(object):
@property
@command
+ def rect(self):
+ return self.session.send_session_command("GET", "window/rect")
+
+ @property
+ @command
def size(self):
- resp = self.session.send_session_command("GET", "window/rect")
- return (resp["width"], resp["height"])
+ """Gets the window size as a tuple of `(width, height)`."""
+ rect = self.rect
+ return (rect["width"], rect["height"])
@size.setter
@command
- def size(self, data):
- width, height = data
+ def size(self, new_size):
+ """Set window size by passing a tuple of `(width, height)`."""
+ width, height = new_size
body = {"width": width, "height": height}
self.session.send_session_command("POST", "window/rect", body)
@property
@command
def position(self):
- resp = self.session.send_session_command("GET", "window/rect")
- return (resp["x"], resp["y"])
+ """Gets the window position as a tuple of `(x, y)`."""
+ rect = self.rect
+ return (rect["x"], rect["y"])
@position.setter
@command
- def position(self, data):
- data = x, y
+ def position(self, new_position):
+ """Set window position by passing a tuple of `(x, y)`."""
+ x, y = new_position
body = {"x": x, "y": y}
self.session.send_session_command("POST", "window/rect", body)
- @property
@command
def maximize(self):
return self.session.send_session_command("POST", "window/maximize")
+ @command
+ def minimize(self):
+ return self.session.send_session_command("POST", "window/minimize")
+
+ @command
+ def fullscreen(self):
+ return self.session.send_session_command("POST", "window/fullscreen")
+
class Find(object):
def __init__(self, session):
@@ -376,6 +396,7 @@ class Session(object):
value = self.send_command("POST", "session", body=body)
self.session_id = value["sessionId"]
+ self.capabilities = value["capabilities"]
if self.extension_cls:
self.extension = self.extension_cls(self)
@@ -390,10 +411,6 @@ class Session(object):
self.send_command("DELETE", url)
self.session_id = None
- self.timeouts = None
- self.window = None
- self.find = None
- self.extension = None
def send_command(self, method, url, body=None):
"""
@@ -411,7 +428,12 @@ class Session(object):
an error.
"""
response = self.transport.send(method, url, body)
- value = response.body["value"]
+
+ if "value" in response.body:
+ value = response.body["value"]
+ else:
+ raise error.UnknownErrorException("No 'value' key in response body:\n%s" %
+ json.dumps(response.body))
if response.status != 200:
cls = error.get(value.get("error"))
@@ -600,7 +622,7 @@ class Element(object):
"value": selector}
elem = self.send_element_command("POST", "element", body)
- return self.session.element(elem)
+ return self.session._element(elem)
@command
def click(self):
@@ -637,10 +659,17 @@ class Element(object):
def rect(self):
return self.send_element_command("GET", "rect")
+ @property
@command
- def property(self, name):
- return self.send_element_command("GET", "property/%s" % name)
+ def selected(self):
+ return self.send_element_command("GET", "selected")
@command
def attribute(self, name):
return self.send_element_command("GET", "attribute/%s" % name)
+
+ # This MUST come last because otherwise @property decorators above
+ # will be overridden by this.
+ @command
+ def property(self, name):
+ return self.send_element_command("GET", "property/%s" % name)
diff --git a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/error.py b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/error.py
index 0530ff9c5da..43e9f39ffba 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/error.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/error.py
@@ -62,7 +62,7 @@ class MoveTargetOutOfBoundsException(WebDriverException):
class NoSuchAlertException(WebDriverException):
- http_status = 400
+ http_status = 404
status_code = "no such alert"
@@ -72,12 +72,12 @@ class NoSuchElementException(WebDriverException):
class NoSuchFrameException(WebDriverException):
- http_status = 400
+ http_status = 404
status_code = "no such frame"
class NoSuchWindowException(WebDriverException):
- http_status = 400
+ http_status = 404
status_code = "no such window"
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 a2412643e04..206fd3ca7a0 100644
--- a/tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py
+++ b/tests/wpt/web-platform-tests/tools/webdriver/webdriver/transport.py
@@ -2,6 +2,8 @@ import httplib
import json
import urlparse
+import error
+
class Response(object):
"""Describes an HTTP response received from a remote en"Describes an HTTP
response received from a remote end whose body has been read and parsed as
@@ -27,21 +29,21 @@ class Response(object):
# > "application/json; charset=utf-8"
# > "cache-control"
# > "no-cache"
- assert http_response.getheader("Content-Type") == "application/json; charset=utf-8"
- assert http_response.getheader("Cache-Control") == "no-cache"
if body:
- body = json.loads(body)
-
- # SpecID: dfn-send-a-response
- #
- # > 4. If data is not null, let response's body be a JSON Object
- # with a key `value` set to the JSON Serialization of data.
- assert "value" in body
+ try:
+ body = json.loads(body)
+ except:
+ raise error.UnknownErrorException("Failed to decode body as json:\n%s" % body)
return cls(status, body)
+class ToJsonEncoder(json.JSONEncoder):
+ def default(self, obj):
+ return getattr(obj.__class__, "json", json.JSONEncoder().default)(obj)
+
+
class HTTPWireProtocol(object):
"""Transports messages (commands and responses) over the WebDriver
wire protocol.
@@ -79,7 +81,7 @@ class HTTPWireProtocol(object):
body = {}
if isinstance(body, dict):
- body = json.dumps(body)
+ body = json.dumps(body, cls=ToJsonEncoder)
if isinstance(body, unicode):
body = body.encode("utf-8")
diff --git a/tests/wpt/web-platform-tests/webdriver/actions/__init__.py b/tests/wpt/web-platform-tests/tools/wpt/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/webdriver/actions/__init__.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/__init__.py
diff --git a/tests/wpt/web-platform-tests/tools/wpt/browser.py b/tests/wpt/web-platform-tests/tools/wpt/browser.py
new file mode 100644
index 00000000000..68ffb2a01d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/browser.py
@@ -0,0 +1,374 @@
+import logging
+import os
+import platform
+import re
+import stat
+from abc import ABCMeta, abstractmethod
+from ConfigParser import RawConfigParser
+from distutils.spawn import find_executable
+
+from utils import call, get, untar, unzip
+
+logger = logging.getLogger(__name__)
+
+uname = platform.uname()
+
+def path(path, exe):
+ path = path.replace("/", os.path.sep)
+ if exe and uname[0] == "Windows":
+ path += ".exe"
+ return path
+
+
+class Browser(object):
+ __metaclass__ = ABCMeta
+
+ @abstractmethod
+ def install(self, dest=None):
+ return NotImplemented
+
+ @abstractmethod
+ def install_webdriver(self):
+ return NotImplemented
+
+ @abstractmethod
+ def version(self):
+ return NotImplemented
+
+ @abstractmethod
+ def requirements(self):
+ """Name of the browser-specific wptrunner requirements file"""
+ return NotImplemented
+
+ def prepare_environment(self):
+ """Do any additional setup of the environment required to start the
+ browser successfully
+ """
+ pass
+
+
+class Firefox(Browser):
+ """Firefox-specific interface.
+
+ Includes installation, webdriver installation, and wptrunner setup methods.
+ """
+
+ product = "firefox"
+ binary = "firefox/firefox"
+ platform_ini = "firefox/platform.ini"
+ requirements = "requirements_firefox.txt"
+
+
+ def platform_string(self):
+ platform = {
+ "Linux": "linux",
+ "Windows": "win",
+ "Darwin": "mac"
+ }.get(uname[0])
+
+ if platform is None:
+ raise ValueError("Unable to construct a valid Firefox package name for current platform")
+
+ if platform == "linux":
+ bits = "-%s" % uname[-1]
+ elif platform == "win":
+ bits = "64" if uname[-1] == "x86_64" else "32"
+ else:
+ bits = ""
+
+ return "%s%s" % (platform, bits)
+
+ def platform_string_geckodriver(self):
+ platform = {
+ "Linux": "linux",
+ "Windows": "win",
+ "Darwin": "macos"
+ }.get(uname[0])
+
+ if platform is None:
+ raise ValueError("Unable to construct a valid Geckodriver package name for current platform")
+
+ if platform in ("linux", "win"):
+ bits = "64" if uname[-1] == "x86_64" else "32"
+ else:
+ bits = ""
+
+ return "%s%s" % (platform, bits)
+
+ def latest_nightly_listing(self):
+ return get("https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/")
+
+ def get_from_nightly(self, pattern):
+ index = self.latest_nightly_listing()
+ filename = re.compile(pattern).search(index.text).group(1)
+ return get("https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/%s" %
+ filename)
+
+ def install(self, dest=None):
+ """Install Firefox."""
+ if dest is None:
+ dest = os.getcwd()
+
+ resp = self.get_from_nightly("<a[^>]*>(firefox-\d+\.\d(?:\w\d)?.en-US.%s\.tar\.bz2)" % self.platform_string())
+ untar(resp.raw, dest=dest)
+ return find_executable("firefox", os.path.join(dest, "firefox"))
+
+ def find_binary(self, path=None):
+ return find_executable("firefox", path)
+
+ def find_certutil(self):
+ path = find_executable("certutil")
+ if path is None:
+ return None
+ if os.path.splitdrive(path)[1].split(os.path.sep) == ["", "Windows", "system32", "certutil.exe"]:
+ return None
+ return path
+
+ def find_webdriver(self):
+ return find_executable("geckodriver")
+
+ def install_certutil(self, dest=None):
+ # TODO: this doesn't really work because it just gets the binary, and is missing the
+ # libnss3 library. Getting that means either downloading the corresponding Firefox
+ # and extracting the library (which is hard on mac becase DMG), or maybe downloading from
+ # nss's treeherder builds?
+ if dest is None:
+ dest = os.pwd
+
+ # Don't create a path like bin/bin/certutil
+ split = os.path.split(dest)
+ if split[1] == "bin":
+ dest = split[0]
+
+ resp = self.get_from_nightly(
+ "<a[^>]*>(firefox-\d+\.\d(?:\w\d)?.en-US.%s\.common\.tests.zip)</a>" % self.platform_string())
+ bin_path = path("bin/certutil", exe=True)
+ unzip(resp.raw, dest=dest, limit=[bin_path])
+
+ return os.path.join(dest, bin_path)
+
+ def install_prefs(self, dest=None):
+ if dest is None:
+ dest = os.pwd
+
+ dest = os.path.join(dest, "profiles")
+ if not os.path.exists(dest):
+ os.makedirs(dest)
+ with open(os.path.join(dest, "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)
+
+ return dest
+
+ def _latest_geckodriver_version(self):
+ """Get and return latest version number for geckodriver."""
+ # 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, dest=None):
+ """Install latest Geckodriver."""
+ if dest is None:
+ dest = os.getcwd()
+
+ version = self._latest_geckodriver_version()
+ format = "zip" if uname[0] == "Windows" else "tar.gz"
+ logger.debug("Latest geckodriver release %s" % version)
+ url = ("https://github.com/mozilla/geckodriver/releases/download/%s/geckodriver-%s-%s.%s" %
+ (version, version, self.platform_string_geckodriver(), format))
+ if format == "zip":
+ unzip(get(url).raw, dest=dest)
+ else:
+ untar(get(url).raw, dest=dest)
+ return find_executable(os.path.join(dest, "geckodriver"))
+
+ def version(self, root):
+ """Retrieve the release version of the installed browser."""
+ platform_info = RawConfigParser()
+
+ with open(os.path.join(root, self.platform_ini), "r") as fp:
+ platform_info.readfp(BytesIO(fp.read()))
+ return "BuildID %s; SourceStamp %s" % (
+ platform_info.get("Build", "BuildID"),
+ platform_info.get("Build", "SourceStamp"))
+
+
+class Chrome(Browser):
+ """Chrome-specific interface.
+
+ Includes installation, webdriver installation, and wptrunner setup methods.
+ """
+
+ product = "chrome"
+ binary = "/usr/bin/google-chrome"
+ requirements = "requirements_chrome.txt"
+
+ def install(self, dest=None):
+ raise NotImplementedError
+
+ def platform_string(self):
+ platform = {
+ "Linux": "linux",
+ "Windows": "win",
+ "Darwin": "mac"
+ }.get(uname[0])
+
+ if platform is None:
+ raise ValueError("Unable to construct a valid Chrome package name for current platform")
+
+ if platform == "linux":
+ bits = "64" if uname[-1] == "x86_64" else "32"
+ elif platform == "mac":
+ bits = "64"
+ elif platform == "win":
+ bits = "32"
+
+ return "%s%s" % (platform, bits)
+
+ def find_webdriver(self):
+ return find_executable("chromedriver")
+
+ def install_webdriver(self, dest=None):
+ """Install latest Webdriver."""
+ if dest is None:
+ dest = os.pwd
+ latest = get("http://chromedriver.storage.googleapis.com/LATEST_RELEASE").text.strip()
+ url = "http://chromedriver.storage.googleapis.com/%s/chromedriver_%s.zip" % (latest,
+ self.platform_string())
+ unzip(get(url).raw, dest)
+
+ path = find_executable("chromedriver", dest)
+ st = os.stat(path)
+ os.chmod(path, st.st_mode | stat.S_IEXEC)
+ return path
+
+ def version(self, root):
+ """Retrieve the release version of the installed browser."""
+ output = call(self.binary, "--version")
+ return re.search(r"[0-9\.]+( [a-z]+)?$", output.strip()).group(0)
+
+ def prepare_environment(self):
+ # https://bugs.chromium.org/p/chromium/issues/detail?id=713947
+ logger.debug("DBUS_SESSION_BUS_ADDRESS %s" % os.environ.get("DBUS_SESSION_BUS_ADDRESS"))
+ if "DBUS_SESSION_BUS_ADDRESS" not in os.environ:
+ if find_executable("dbus-launch"):
+ logger.debug("Attempting to start dbus")
+ dbus_conf = subprocess.check_output(["dbus-launch"])
+ logger.debug(dbus_conf)
+
+ # From dbus-launch(1):
+ #
+ # > When dbus-launch prints bus information to standard output,
+ # > by default it is in a simple key-value pairs format.
+ for line in dbus_conf.strip().split("\n"):
+ key, _, value = line.partition("=")
+ os.environ[key] = value
+ else:
+ logger.critical("dbus not running and can't be started")
+ sys.exit(1)
+
+
+class Edge(Browser):
+ """Edge-specific interface.
+
+ Includes installation, webdriver installation, and wptrunner setup methods.
+ """
+
+ product = "edge"
+ requirements = "requirements_edge.txt"
+
+ def install(self, dest=None):
+ raise NotImplementedError
+
+ def find_webdriver(self):
+ return find_executable("MicrosoftWebDriver")
+
+ def install_webdriver(self, dest=None):
+ """Install latest Webdriver."""
+ raise NotImplementedError
+
+ def version(self):
+ raise NotImplementedError
+
+
+class InternetExplorer(Browser):
+ """Internet Explorer-specific interface.
+
+ Includes installation, webdriver installation, and wptrunner setup methods.
+ """
+
+ product = "ie"
+ requirements = "requirements_ie.txt"
+
+ def install(self, dest=None):
+ raise NotImplementedError
+
+ def find_webdriver(self):
+ return find_executable("IEDriverServer.exe")
+
+ def install_webdriver(self, dest=None):
+ """Install latest Webdriver."""
+ raise NotImplementedError
+
+ def version(self):
+ raise NotImplementedError
+
+
+class Servo(Browser):
+ """Servo-specific interface.
+
+ Includes installation, webdriver installation, and wptrunner setup methods.
+ """
+
+ product = "servo"
+ requirements = "requirements_servo.txt"
+
+ def install(self, dest=None):
+ raise NotImplementedError
+
+ def find_binary(self, path=None):
+ return find_executable("servo")
+
+ def find_webdriver(self):
+ return None
+
+ def install_webdriver(self):
+ raise NotImplementedError
+
+ def version(self, root):
+ return None
+
+
+class Sauce(Browser):
+ """Sauce-specific interface.
+
+ Includes installation, webdriver installation, and wptrunner setup methods.
+ """
+
+ product = "sauce"
+ requirements = "requirements_sauce.txt"
+
+ def install(self, dest=None):
+ raise NotImplementedError
+
+ def find_binary(self, path=None):
+ return None
+
+ def find_webdriver(self):
+ return None
+
+ def install_webdriver(self):
+ raise NotImplementedError
+
+ def version(self, root):
+ return None
diff --git a/tests/wpt/web-platform-tests/tools/wpt/commands.json b/tests/wpt/web-platform-tests/tools/wpt/commands.json
new file mode 100644
index 00000000000..1ab767fea6a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/commands.json
@@ -0,0 +1,9 @@
+{
+ "run": {"path": "run.py", "script": "run", "parser": "create_parser", "help": "Run tests in a browser",
+ "virtualenv": true, "install": ["requests"], "requirements": ["../wptrunner/requirements.txt"]},
+ "files-changed": {"path": "testfiles.py", "script": "run_changed_files", "parser": "get_parser",
+ "help": "Get a list of files that have changed", "virtualenv": false},
+ "tests-affected": {"path": "testfiles.py", "script": "run_tests_affected", "parser": "get_parser_affected",
+ "help": "Get a list of tests affected by changes", "virtualenv": false},
+ "install": {"path": "install.py", "script": "run", "parser": "get_parser", "help": "Install browser components"}
+}
diff --git a/tests/wpt/web-platform-tests/tools/wpt/install.py b/tests/wpt/web-platform-tests/tools/wpt/install.py
new file mode 100644
index 00000000000..408744a4a40
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/install.py
@@ -0,0 +1,46 @@
+import argparse
+import browser
+import sys
+
+def get_parser():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('browser', choices=['firefox', 'chrome'],
+ help='name of web browser product')
+ parser.add_argument('component', choices=['browser', 'webdriver'],
+ help='name of component')
+ parser.add_argument('-d', '--destination',
+ help='filesystem directory to place the component')
+ return parser
+
+
+def run(venv, **kwargs):
+ browser = kwargs["browser"]
+ destination = kwargs["destination"]
+
+ if destination is None:
+ if venv:
+ if kwargs["component"] == "browser":
+ destination = venv.path
+ else:
+ destination = venv.bin_path
+ else:
+ raise argparse.ArgumentError(None,
+ "No --destination argument, and no default for the environment")
+
+ install(browser, kwargs["component"], destination)
+
+
+def install(name, component, destination):
+ if component == 'webdriver':
+ method = 'install_webdriver'
+ else:
+ method = 'install'
+
+ subclass = getattr(browser, name.title())
+ sys.stdout.write('Now installing %s %s...\n' % (name, component))
+ getattr(subclass(), method)(dest=destination)
+
+
+if __name__ == '__main__':
+ args = parser.parse_args()
+ run(None, **vars(args))
diff --git a/tests/wpt/web-platform-tests/tools/wpt/markdown.py b/tests/wpt/web-platform-tests/tools/wpt/markdown.py
new file mode 100644
index 00000000000..87018910ac1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/markdown.py
@@ -0,0 +1,55 @@
+def format_comment_title(product):
+ """Produce a Markdown-formatted string based on a given "product"--a string
+ containing a browser identifier optionally followed by a colon and a
+ release channel. (For example: "firefox" or "chrome:dev".) The generated
+ title string is used both to create new comments and to locate (and
+ subsequently update) previously-submitted comments."""
+ parts = product.split(":")
+ title = parts[0].title()
+
+ if len(parts) > 1:
+ title += " (%s)" % parts[1]
+
+ return "# %s #" % title
+
+
+def markdown_adjust(s):
+ """Escape problematic markdown sequences."""
+ s = s.replace('\t', u'\\t')
+ s = s.replace('\n', u'\\n')
+ s = s.replace('\r', u'\\r')
+ s = s.replace('`', u'')
+ s = s.replace('|', u'\\|')
+ return s
+
+
+def table(headings, data, log):
+ """Create and log data to specified logger in tabular format."""
+ 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 err_string(results_dict, iterations):
+ """Create and return string with errors from test run."""
+ 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 ""))
+ if total_results < iterations:
+ rv.append("MISSING: %s/%s" % (iterations - total_results, iterations))
+ rv = ", ".join(rv)
+ if is_inconsistent(results_dict, iterations):
+ rv = "**%s**" % rv
+ return rv
diff --git a/tests/wpt/web-platform-tests/tools/wpt/paths b/tests/wpt/web-platform-tests/tools/wpt/paths
new file mode 100644
index 00000000000..0ef13c96e38
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/paths
@@ -0,0 +1,5 @@
+tools/ci/
+tools/lint/
+tools/manifest/
+tools/serve/
+tools/wpt/
diff --git a/tests/wpt/web-platform-tests/tools/browserutils/requirements.txt b/tests/wpt/web-platform-tests/tools/wpt/requirements.txt
index 7369cb8e02c..7369cb8e02c 100644
--- a/tests/wpt/web-platform-tests/tools/browserutils/requirements.txt
+++ b/tests/wpt/web-platform-tests/tools/wpt/requirements.txt
diff --git a/tests/wpt/web-platform-tests/tools/wpt/run.py b/tests/wpt/web-platform-tests/tools/wpt/run.py
new file mode 100644
index 00000000000..1567a72721b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/run.py
@@ -0,0 +1,419 @@
+import argparse
+import os
+import platform
+import shutil
+import subprocess
+import sys
+import tarfile
+from distutils.spawn import find_executable
+
+wpt_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir))
+sys.path.insert(0, os.path.abspath(os.path.join(wpt_root, "tools")))
+
+from . import browser, utils, virtualenv
+logger = None
+
+
+class WptrunError(Exception):
+ pass
+
+
+class WptrunnerHelpAction(argparse.Action):
+ def __init__(self,
+ option_strings,
+ dest=argparse.SUPPRESS,
+ default=argparse.SUPPRESS,
+ help=None):
+ super(WptrunnerHelpAction, self).__init__(
+ option_strings=option_strings,
+ dest=dest,
+ default=default,
+ nargs=0,
+ help=help)
+
+ def __call__(self, parser, namespace, values, option_string=None):
+ from wptrunner import wptcommandline
+ wptparser = wptcommandline.create_parser()
+ wptparser.usage = parser.usage
+ wptparser.print_help()
+ parser.exit()
+
+
+def create_parser():
+ from wptrunner import wptcommandline
+
+ parser = argparse.ArgumentParser(add_help=False)
+ parser.add_argument("product", action="store",
+ help="Browser to run tests in")
+ parser.add_argument("--yes", "-y", dest="prompt", action="store_false", default=True,
+ help="Don't prompt before installing components")
+ parser.add_argument("--stability", action="store_true",
+ help="Stability check tests")
+ parser.add_argument("--install-browser", action="store_true",
+ help="Install the latest development version of the browser")
+ parser._add_container_actions(wptcommandline.create_parser())
+ return parser
+
+
+def exit(msg):
+ logger.error(msg)
+ sys.exit(1)
+
+
+def args_general(kwargs):
+ kwargs.set_if_none("tests_root", wpt_root)
+ kwargs.set_if_none("metadata_root", wpt_root)
+ kwargs.set_if_none("manifest_update", True)
+
+ if kwargs["ssl_type"] in (None, "pregenerated"):
+ cert_root = os.path.join(wpt_root, "tools", "certs")
+ if kwargs["ca_cert_path"] is None:
+ kwargs["ca_cert_path"] = os.path.join(cert_root, "cacert.pem")
+
+ if kwargs["host_key_path"] is None:
+ kwargs["host_key_path"] = os.path.join(cert_root, "web-platform.test.key")
+
+ if kwargs["host_cert_path"] is None:
+ kwargs["host_cert_path"] = os.path.join(cert_root, "web-platform.test.pem")
+ elif kwargs["ssl_type"] == "openssl":
+ if not find_executable(kwargs["openssl_binary"]):
+ if os.uname()[0] == "Windows":
+ raise WptrunError("""OpenSSL binary not found. If you need HTTPS tests, install OpenSSL from
+
+https://slproweb.com/products/Win32OpenSSL.html
+
+Ensuring that libraries are added to /bin and add the resulting bin directory to
+your PATH.
+
+Otherwise run with --ssl-type=none""")
+ else:
+ raise WptrunError("""OpenSSL not found. If you don't need HTTPS support run with --ssl-type=none,
+otherwise install OpenSSL and ensure that it's on your $PATH.""")
+
+
+def check_environ(product):
+ if product not in ("firefox", "servo"):
+ expected_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",
+ "nonexistent-origin.web-platform.test"]
+ missing_hosts = set(expected_hosts)
+ if platform.uname()[0] != "Windows":
+ hosts_path = "/etc/hosts"
+ else:
+ hosts_path = "C:\Windows\System32\drivers\etc\hosts"
+ with open(hosts_path, "r") as f:
+ for line in f:
+ line = line.split("#", 1)[0].strip()
+ parts = line.split()
+ if len(parts) == 2:
+ host = parts[1]
+ missing_hosts.discard(host)
+ if missing_hosts:
+ raise WptrunError("""Missing hosts file configuration. Expected entries like:
+
+%s
+
+See README.md for more details.""" % "\n".join("%s\t%s" %
+ ("127.0.0.1" if "nonexistent" not in host else "0.0.0.0", host)
+ for host in expected_hosts))
+
+
+class BrowserSetup(object):
+ name = None
+ browser_cls = None
+
+ def __init__(self, venv, prompt=True, sub_product=None):
+ self.browser = self.browser_cls()
+ self.venv = venv
+ self.prompt = prompt
+ self.sub_product = sub_product
+
+ def prompt_install(self, component):
+ if not self.prompt:
+ return True
+ while True:
+ resp = raw_input("Download and install %s [Y/n]? " % component).strip().lower()
+ if not resp or resp == "y":
+ return True
+ elif resp == "n":
+ return False
+
+ def install(self, venv):
+ if self.prompt_install(self.name):
+ return self.browser.install(venv.path)
+
+ def setup(self, kwargs):
+ self.venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", self.browser.requirements))
+ self.setup_kwargs(kwargs)
+
+
+class Firefox(BrowserSetup):
+ name = "firefox"
+ browser_cls = browser.Firefox
+
+ def setup_kwargs(self, kwargs):
+ if kwargs["binary"] is None:
+ binary = self.browser.find_binary()
+ if binary is None:
+ raise WptrunError("""Firefox binary not found on $PATH.
+
+Install Firefox or use --binary to set the binary path""")
+ kwargs["binary"] = binary
+
+ if kwargs["certutil_binary"] is None and kwargs["ssl_type"] != "none":
+ certutil = self.browser.find_certutil()
+
+ if certutil is None:
+ # Can't download this for now because it's missing the libnss3 library
+ raise WptrunError("""Can't find certutil.
+
+This must be installed using your OS package manager or directly e.g.
+
+Debian/Ubuntu:
+ sudo apt install libnss3-tools
+
+macOS/Homebrew:
+ brew install nss
+
+Others:
+ Download the firefox archive and common.tests.zip archive for your platform
+ from https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/
+
+ Then extract certutil[.exe] from the tests.zip package and
+ libnss3[.so|.dll|.dynlib] and but the former on your path and the latter on
+ your library path.
+""")
+ else:
+ print("Using certutil %s" % certutil)
+
+ if certutil is not None:
+ kwargs["certutil_binary"] = certutil
+ else:
+ print("Unable to find or install certutil, setting ssl-type to none")
+ kwargs["ssl_type"] = "none"
+
+ if kwargs["webdriver_binary"] is None and "wdspec" in kwargs["test_types"]:
+ webdriver_binary = self.browser.find_webdriver()
+
+ if webdriver_binary is None:
+ install = self.prompt_install("geckodriver")
+
+ if install:
+ print("Downloading geckodriver")
+ webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path)
+ else:
+ print("Using webdriver binary %s" % webdriver_binary)
+
+ if webdriver_binary:
+ kwargs["webdriver_binary"] = webdriver_binary
+ else:
+ print("Unable to find or install geckodriver, skipping wdspec tests")
+ kwargs["test_types"].remove("wdspec")
+
+ if kwargs["prefs_root"] is None:
+ print("Downloading gecko prefs")
+ prefs_root = self.browser.install_prefs(self.venv.path)
+ kwargs["prefs_root"] = prefs_root
+
+
+class Chrome(BrowserSetup):
+ name = "chrome"
+ browser_cls = browser.Chrome
+
+ def setup_kwargs(self, kwargs):
+ if kwargs["webdriver_binary"] is None:
+ webdriver_binary = self.browser.find_webdriver()
+
+ if webdriver_binary is None:
+ install = self.prompt_install("chromedriver")
+
+ if install:
+ print("Downloading chromedriver")
+ webdriver_binary = self.browser.install_webdriver(dest=self.venv.bin_path)
+ else:
+ print("Using webdriver binary %s" % webdriver_binary)
+
+ if webdriver_binary:
+ kwargs["webdriver_binary"] = webdriver_binary
+ else:
+ raise WptrunError("Unable to locate or install chromedriver binary")
+
+
+class Edge(BrowserSetup):
+ name = "edge"
+ browser_cls = browser.Edge
+
+ def install(self, venv):
+ raise NotImplementedError
+
+ def setup_kwargs(self, kwargs):
+ if kwargs["webdriver_binary"] is None:
+ webdriver_binary = self.browser.find_webdriver()
+
+ if webdriver_binary is None:
+ raise WptrunError("""Unable to find WebDriver and we aren't yet clever enough to work out which
+version to download. Please go to the following URL and install the correct
+version for your Edge/Windows release somewhere on the %PATH%:
+
+https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
+""")
+ kwargs["webdriver_binary"] = webdriver_binary
+
+
+class InternetExplorer(BrowserSetup):
+ name = "ie"
+ browser_cls = browser.InternetExplorer
+
+ def install(self, venv):
+ raise NotImplementedError
+
+ def setup_kwargs(self, kwargs):
+ if kwargs["webdriver_binary"] is None:
+ webdriver_binary = self.browser.find_webdriver()
+
+ if webdriver_binary is None:
+ raise WptrunError("""Unable to find WebDriver and we aren't yet clever enough to work out which
+version to download. Please go to the following URL and install the driver for Internet Explorer
+somewhere on the %PATH%:
+
+https://selenium-release.storage.googleapis.com/index.html
+""")
+ kwargs["webdriver_binary"] = webdriver_binary
+
+
+class Sauce(BrowserSetup):
+ name = "sauce"
+ browser_cls = browser.Sauce
+
+ def install(self, venv):
+ raise NotImplementedError
+
+ def setup_kwargs(self, kwargs):
+ kwargs.set_if_none("sauce_browser", self.sub_product[0])
+ kwargs.set_if_none("sauce_version", self.sub_product[1])
+ kwargs["test_types"] = ["testharness", "reftest"]
+
+
+class Servo(BrowserSetup):
+ name = "servo"
+ browser_cls = browser.Servo
+
+ def install(self, venv):
+ raise NotImplementedError
+
+ def setup_kwargs(self, kwargs):
+ if kwargs["binary"] is None:
+ binary = self.browser.find_binary()
+
+ if binary is None:
+ raise WptrunError("Unable to find servo binary on the PATH")
+ kwargs["binary"] = binary
+
+
+product_setup = {
+ "firefox": Firefox,
+ "chrome": Chrome,
+ "edge": Edge,
+ "ie": InternetExplorer,
+ "servo": Servo,
+ "sauce": Sauce,
+}
+
+
+def setup_wptrunner(venv, prompt=True, install=False, **kwargs):
+ from wptrunner import wptrunner, wptcommandline
+
+ global logger
+
+ kwargs = utils.Kwargs(kwargs.iteritems())
+
+ product_parts = kwargs["product"].split(":")
+ kwargs["product"] = product_parts[0]
+ sub_product = product_parts[1:]
+
+ wptrunner.setup_logging(kwargs, {"mach": sys.stdout})
+ logger = wptrunner.logger
+
+ check_environ(kwargs["product"])
+ args_general(kwargs)
+
+ if kwargs["product"] not in product_setup:
+ raise WptrunError("Unsupported product %s" % kwargs["product"])
+
+ setup_cls = product_setup[kwargs["product"]](venv, prompt, sub_product)
+
+ if install:
+ logger.info("Installing browser")
+ kwargs["binary"] = setup_cls.install(venv)
+
+ setup_cls.setup(kwargs)
+
+ wptcommandline.check_args(kwargs)
+
+ wptrunner_path = os.path.join(wpt_root, "tools", "wptrunner")
+
+ venv.install_requirements(os.path.join(wptrunner_path, "requirements.txt"))
+
+ return kwargs
+
+
+def run(venv, **kwargs):
+ #Remove arguments that aren't passed to wptrunner
+ prompt = kwargs.pop("prompt", True)
+ stability = kwargs.pop("stability", True)
+ install_browser = kwargs.pop("install_browser", False)
+
+ kwargs = setup_wptrunner(venv,
+ prompt=prompt,
+ install=install_browser,
+ **kwargs)
+
+ if stability:
+ import stability
+ iterations, results, inconsistent = stability.run(venv, logger, **kwargs)
+
+ def log(x):
+ print(x)
+
+ if inconsistent:
+ stability.write_inconsistent(log, inconsistent, iterations)
+ else:
+ log("All tests stable")
+ rv = len(inconsistent) > 0
+ else:
+ rv = run_single(venv, **kwargs) > 0
+
+ return rv
+
+
+def run_single(venv, **kwargs):
+ from wptrunner import wptrunner
+ return wptrunner.start(**kwargs)
+
+
+def main():
+ try:
+ parser = create_parser()
+ args = parser.parse_args()
+
+ venv = virtualenv.Virtualenv(os.path.join(wpt_root, "_venv_%s") % platform.uname()[0])
+ venv.start()
+ venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", "requirements.txt"))
+ venv.install("requests")
+
+ return run(venv, vars(args))
+ except WptrunError as e:
+ exit(e.message)
+
+
+if __name__ == "__main__":
+ import pdb
+ from tools import localpaths
+ try:
+ main()
+ except:
+ pdb.post_mortem()
diff --git a/tests/wpt/web-platform-tests/tools/wpt/stability.py b/tests/wpt/web-platform-tests/tools/wpt/stability.py
new file mode 100644
index 00000000000..b3c85700ec3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/stability.py
@@ -0,0 +1,195 @@
+import os
+import sys
+from collections import OrderedDict, defaultdict
+
+from mozlog import reader
+from mozlog.formatters import JSONFormatter, TbplFormatter
+from mozlog.handlers import BaseHandler, LogLevelFilter, StreamHandler
+
+from markdown import markdown_adjust, table
+from wptrunner import wptrunner
+
+
+class LogActionFilter(BaseHandler):
+
+ """Handler that filters out messages not of a given set of actions.
+
+ Subclasses BaseHandler.
+
+ :param inner: Handler to use for messages that pass this filter
+ :param actions: List of actions for which to fire the handler
+ """
+
+ def __init__(self, inner, actions):
+ """Extend BaseHandler and set inner and actions props on self."""
+ BaseHandler.__init__(self, inner)
+ self.inner = inner
+ self.actions = actions
+
+ def __call__(self, item):
+ """Invoke handler if action is in list passed as constructor param."""
+ if item["action"] in self.actions:
+ return self.inner(item)
+
+
+class LogHandler(reader.LogHandler):
+
+ """Handle updating test and subtest status in log.
+
+ Subclasses reader.LogHandler.
+ """
+ def __init__(self):
+ self.results = OrderedDict()
+
+ def find_or_create_test(self, data):
+ test_name = data["test"]
+ if self.results.get(test_name):
+ return self.results[test_name]
+
+ test = {
+ "subtests": OrderedDict(),
+ "status": defaultdict(int)
+ }
+ self.results[test_name] = test
+ return test
+
+ def find_or_create_subtest(self, data):
+ test = self.find_or_create_test(data)
+ subtest_name = data["subtest"]
+
+ if test["subtests"].get(subtest_name):
+ return test["subtests"][subtest_name]
+
+ subtest = {
+ "status": defaultdict(int),
+ "messages": set()
+ }
+ test["subtests"][subtest_name] = subtest
+
+ return subtest
+
+ def test_status(self, data):
+ subtest = self.find_or_create_subtest(data)
+ subtest["status"][data["status"]] += 1
+ if data.get("message"):
+ subtest["messages"].add(data["message"])
+
+ def test_end(self, data):
+ test = self.find_or_create_test(data)
+ test["status"][data["status"]] += 1
+
+
+def is_inconsistent(results_dict, iterations):
+ """Return whether or not a single test is inconsistent."""
+ return len(results_dict) > 1 or sum(results_dict.values()) != iterations
+
+
+def process_results(log, iterations):
+ """Process test log and return overall results and list of inconsistent tests."""
+ inconsistent = []
+ handler = LogHandler()
+ reader.handle_log(reader.read(log), handler)
+ results = handler.results
+ for test_name, test in results.iteritems():
+ if is_inconsistent(test["status"], iterations):
+ inconsistent.append((test_name, None, test["status"], []))
+ for subtest_name, subtest in test["subtests"].iteritems():
+ if is_inconsistent(subtest["status"], iterations):
+ inconsistent.append((test_name, subtest_name, subtest["status"], subtest["messages"]))
+ return results, inconsistent
+
+
+def err_string(results_dict, iterations):
+ """Create and return string with errors from test run."""
+ 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 ""))
+ if total_results < iterations:
+ rv.append("MISSING: %s/%s" % (iterations - total_results, iterations))
+ rv = ", ".join(rv)
+ if is_inconsistent(results_dict, iterations):
+ rv = "**%s**" % rv
+ return rv
+
+
+def write_inconsistent(log, inconsistent, iterations):
+ """Output inconsistent tests to logger.error."""
+ log("## Unstable results ##\n")
+ strings = [(
+ "`%s`" % markdown_adjust(test),
+ ("`%s`" % markdown_adjust(subtest)) if subtest else "",
+ err_string(results, iterations),
+ ("`%s`" % markdown_adjust(";".join(messages))) if len(messages) else "")
+ for test, subtest, results, messages in inconsistent]
+ table(["Test", "Subtest", "Results", "Messages"], strings, log)
+
+
+def write_results(log, results, iterations, pr_number=None, use_details=False):
+ log("## All results ##\n")
+ if use_details:
+ log("<details>\n")
+ log("<summary>%i %s ran</summary>\n\n" % (len(results),
+ "tests" if len(results) > 1
+ else "test"))
+
+ for test_name, test in results.iteritems():
+ baseurl = "http://w3c-test.org/submissions"
+ if "https" in os.path.splitext(test_name)[0].split(".")[1:]:
+ baseurl = "https://w3c-test.org/submissions"
+ title = test_name
+ if use_details:
+ log("<details>\n")
+ if pr_number:
+ title = "<a href=\"%s/%s%s\">%s</a>" % (baseurl, pr_number, test_name, title)
+ log('<summary>%s</summary>\n\n' % title)
+ else:
+ log("### %s ###" % title)
+ strings = [("", err_string(test["status"], iterations), "")]
+
+ strings.extend(((
+ ("`%s`" % markdown_adjust(subtest_name)) if subtest else "",
+ err_string(subtest["status"], iterations),
+ ("`%s`" % markdown_adjust(';'.join(subtest["messages"]))) if len(subtest["messages"]) else "")
+ for subtest_name, subtest in test["subtests"].items()))
+ table(["Subtest", "Results", "Messages"], strings, log)
+ if use_details:
+ log("</details>\n")
+
+ if use_details:
+ log("</details>\n")
+
+
+def run(venv, logger, **kwargs):
+ kwargs["pause_after_test"] = False
+ if kwargs["repeat"] == 1:
+ kwargs["repeat"] = 10
+
+ handler = LogActionFilter(
+ LogLevelFilter(
+ StreamHandler(
+ sys.stdout,
+ TbplFormatter()
+ ),
+ "WARNING"),
+ ["log", "process_output"])
+
+ # There is a public API for this in the next mozlog
+ initial_handlers = logger._state.handlers
+ logger._state.handlers = []
+
+ with open("raw.log", "wb") as log:
+ # Setup logging for wptrunner that keeps process output and
+ # warning+ level logs only
+ logger.add_handler(handler)
+ logger.add_handler(StreamHandler(log, JSONFormatter()))
+
+ wptrunner.run_tests(**kwargs)
+
+ logger._state.handlers = initial_handlers
+
+ with open("raw.log", "rb") as log:
+ results, inconsistent = process_results(log, kwargs["repeat"])
+
+ return kwargs["repeat"], results, inconsistent
diff --git a/tests/wpt/web-platform-tests/tools/wpt/testfiles.py b/tests/wpt/web-platform-tests/tools/wpt/testfiles.py
new file mode 100644
index 00000000000..89e6e2764ae
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/testfiles.py
@@ -0,0 +1,286 @@
+import argparse
+import itertools
+import logging
+import os
+import subprocess
+import sys
+
+from ..manifest import manifest, update
+
+here = os.path.dirname(__file__)
+wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir))
+
+logger = logging.getLogger()
+
+
+def get_git_cmd(repo_path):
+ """Create a function for invoking git commands as a subprocess."""
+ def git(cmd, *args):
+ full_cmd = ["git", cmd] + list(item.decode("utf8") if isinstance(item, bytes) else item for item in args)
+ try:
+ logger.debug(" ".join(full_cmd))
+ return subprocess.check_output(full_cmd, cwd=repo_path, stderr=subprocess.STDOUT).decode("utf8").strip()
+ 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 branch_point():
+ git = get_git_cmd(wpt_root)
+ if os.environ.get("TRAVIS_PULL_REQUEST", "false") != "false":
+ # This is a PR, so the base branch is in TRAVIS_BRANCH
+ travis_branch = os.environ.get("TRAVIS_BRANCH")
+ assert travis_branch, "TRAVIS_BRANCH environment variable is defined"
+ branch_point = git("rev-parse", travis_branch)
+ else:
+ # Otherwise we aren't on a PR, so we try to find commits that are only in the
+ # current branch c.f.
+ # http://stackoverflow.com/questions/13460152/find-first-ancestor-commit-in-another-branch
+ head = git("rev-parse", "HEAD")
+ not_heads = [item for item in git("rev-parse", "--not", "--all").split("\n")
+ if item.strip() and head not in item]
+ commits = git("rev-list", "HEAD", *not_heads).split("\n")
+ branch_point = None
+ if len(commits):
+ first_commit = commits[-1]
+ if first_commit:
+ branch_point = git("rev-parse", first_commit + "^")
+
+ # The above heuristic will fail in the following cases:
+ #
+ # - The current branch has fallen behind the version retrieved via the above
+ # `fetch` invocation
+ # - Changes on the current branch were rebased and therefore do not exist on any
+ # other branch. This will result in the selection of a commit that is earlier
+ # in the history than desired (as determined by calculating the later of the
+ # branch point and the merge base)
+ #
+ # In either case, fall back to using the merge base as the branch point.
+ merge_base = git("merge-base", "HEAD", "origin/master")
+ if (branch_point is None or
+ (branch_point != merge_base and
+ not git("log", "--oneline", "%s..%s" % (merge_base, branch_point)).strip())):
+ logger.debug("Using merge-base as the branch point")
+ branch_point = merge_base
+ else:
+ logger.debug("Using first commit on another branch as the branch point")
+
+ logger.debug("Branch point from master: %s" % branch_point)
+ return branch_point
+
+
+def files_changed(revish, ignore_dirs=None, include_uncommitted=False, include_new=False):
+ """Get and return files changed since current branch diverged from master,
+ excluding those that are located within any directory specifed by
+ `ignore_changes`."""
+ if ignore_dirs is None:
+ ignore_dirs = []
+
+ git = get_git_cmd(wpt_root)
+ files = git("diff", "--name-only", "-z", revish).split("\0")
+ assert not files[-1]
+ files = set(files[:-1])
+
+ if include_uncommitted:
+ entries = git("status", "-z").split("\0")
+ assert not entries[-1]
+ entries = entries[:-1]
+ for item in entries:
+ status, path = item.split()
+ if status == "??" and not include_new:
+ continue
+ else:
+ if not os.path.isdir(path):
+ files.add(path)
+ else:
+ for dirpath, dirnames, filenames in os.walk(path):
+ for filename in filenames:
+ files.add(os.path.join(dirpath, filename))
+
+ if not files:
+ return [], []
+
+ changed = []
+ ignored = []
+ for item in sorted(files):
+ fullpath = os.path.join(wpt_root, item)
+ topmost_dir = item.split(os.sep, 1)[0]
+ if topmost_dir in ignore_dirs:
+ ignored.append(fullpath)
+ else:
+ changed.append(fullpath)
+
+ return changed, ignored
+
+
+def _in_repo_root(full_path):
+ rel_path = os.path.relpath(full_path, wpt_root)
+ path_components = rel_path.split(os.sep)
+ return len(path_components) < 2
+
+def _init_manifest_cache():
+ c = {}
+
+ def load(manifest_path=None):
+ if manifest_path is None:
+ manifest_path = os.path.join(wpt_root, "MANIFEST.json")
+ if c.get(manifest_path):
+ return c[manifest_path]
+ # cache at most one path:manifest
+ c.clear()
+ wpt_manifest = manifest.load(wpt_root, manifest_path)
+ if wpt_manifest is None:
+ wpt_manifest = manifest.Manifest()
+ update.update(wpt_root, wpt_manifest)
+ c[manifest_path] = wpt_manifest
+ return c[manifest_path]
+ return load
+
+load_manifest = _init_manifest_cache()
+
+
+def affected_testfiles(files_changed, skip_tests, manifest_path=None):
+ """Determine and return list of test files that reference changed files."""
+ affected_testfiles = set()
+ # Exclude files that are in the repo root, because
+ # they are not part of any test.
+ files_changed = [f for f in files_changed if not _in_repo_root(f)]
+ nontests_changed = set(files_changed)
+ wpt_manifest = load_manifest(manifest_path)
+
+ test_types = ["testharness", "reftest", "wdspec"]
+ support_files = {os.path.join(wpt_root, path)
+ for _, path, _ in wpt_manifest.itertypes("support")}
+ wdspec_test_files = {os.path.join(wpt_root, path)
+ for _, path, _ in wpt_manifest.itertypes("wdspec")}
+ test_files = {os.path.join(wpt_root, path)
+ for _, path, _ in wpt_manifest.itertypes(*test_types)}
+
+ nontests_changed = nontests_changed.intersection(support_files)
+
+ tests_changed = set(item for item in files_changed if item in test_files)
+
+ nontest_changed_paths = set()
+ for full_path in nontests_changed:
+ rel_path = os.path.relpath(full_path, wpt_root)
+ path_components = rel_path.split(os.sep)
+ top_level_subdir = path_components[0]
+ if top_level_subdir in skip_tests:
+ continue
+ repo_path = "/" + os.path.relpath(full_path, wpt_root).replace(os.path.sep, "/")
+ nontest_changed_paths.add((full_path, repo_path))
+
+ def affected_by_wdspec(test):
+ affected = False
+ if test in wdspec_test_files:
+ for support_full_path, _ in nontest_changed_paths:
+ # parent of support file or of "support" directory
+ parent = os.path.dirname(support_full_path)
+ if os.path.basename(parent) == "support":
+ parent = os.path.dirname(parent)
+ relpath = os.path.relpath(test, parent)
+ if not relpath.startswith(os.pardir):
+ # testfile is in subtree of support file
+ affected = True
+ break
+ return affected
+
+ for root, dirs, fnames in os.walk(wpt_root):
+ # Walk top_level_subdir looking for test files containing either the
+ # relative filepath or absolute filepath to the changed files.
+ if root == wpt_root:
+ for dir_name in skip_tests:
+ dirs.remove(dir_name)
+ for fname in fnames:
+ test_full_path = os.path.join(root, fname)
+ # Skip any file that's not a test file.
+ if test_full_path not in test_files:
+ continue
+ if affected_by_wdspec(test_full_path):
+ affected_testfiles.add(test_full_path)
+ continue
+
+ with open(test_full_path, "rb") as fh:
+ file_contents = fh.read()
+ if file_contents.startswith("\xfe\xff"):
+ file_contents = file_contents.decode("utf-16be", "replace")
+ elif file_contents.startswith("\xff\xfe"):
+ file_contents = file_contents.decode("utf-16le", "replace")
+ else:
+ file_contents = file_contents.decode("utf8", "replace")
+ for full_path, repo_path in nontest_changed_paths:
+ rel_path = os.path.relpath(full_path, root).replace(os.path.sep, "/")
+ if rel_path in file_contents or repo_path in file_contents:
+ affected_testfiles.add(test_full_path)
+ continue
+
+ return tests_changed, affected_testfiles
+
+
+def get_parser():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("revish", default=None, help="Commits to consider. Defaults to the commits on the current branch", nargs="?")
+ parser.add_argument("--ignore-dirs", nargs="*", type=set, default=set(["resources"]),
+ help="Directories to exclude from the list of changes")
+ parser.add_argument("--modified", action="store_true",
+ help="Include files under version control that have been modified or staged")
+ parser.add_argument("--new", action="store_true",
+ help="Include files in the worktree that are not in version control")
+ parser.add_argument("--show-type", action="store_true",
+ help="Print the test type along with each affected test")
+ return parser
+
+
+def get_parser_affected():
+ parser = get_parser()
+ parser.add_argument("--metadata",
+ dest="metadata_root",
+ action="store",
+ default=wpt_root,
+ help="Directory that will contain MANIFEST.json")
+ return parser
+
+def get_revish(**kwargs):
+ revish = kwargs["revish"]
+ if kwargs["revish"] is None:
+ revish = "%s..HEAD" % branch_point()
+ return revish
+
+
+def run_changed_files(**kwargs):
+ revish = get_revish(**kwargs)
+ changed, _ = files_changed(revish, kwargs["ignore_dirs"],
+ include_uncommitted=kwargs["modified"],
+ include_new=kwargs["new"])
+ for item in sorted(changed):
+ print(os.path.relpath(item, wpt_root))
+
+
+def run_tests_affected(**kwargs):
+ revish = get_revish(**kwargs)
+ changed, _ = files_changed(revish, kwargs["ignore_dirs"],
+ include_uncommitted=kwargs["modified"],
+ include_new=kwargs["new"])
+ manifest_path = os.path.join(kwargs["metadata_root"], "MANIFEST.json")
+ tests_changed, dependents = affected_testfiles(
+ changed,
+ set(["conformance-checkers", "docs", "tools"]),
+ manifest_path=manifest_path
+ )
+
+ message = "{path}"
+ if kwargs["show_type"]:
+ wpt_manifest = load_manifest(manifest_path)
+ message = "{path}\t{item_type}"
+ for item in sorted(tests_changed | dependents):
+ results = {
+ "path": os.path.relpath(item, wpt_root)
+ }
+ if kwargs["show_type"]:
+ item_types = {i.item_type for i in wpt_manifest.iterpath(results["path"])}
+ if len(item_types) != 1:
+ item_types = [" ".join(item_types)]
+ results["item_type"] = item_types.pop()
+ print(message.format(**results))
diff --git a/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py b/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py
new file mode 100644
index 00000000000..e3b8d1f5fdb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/tests/test_wpt.py
@@ -0,0 +1,138 @@
+import os
+import shutil
+import socket
+import subprocess
+import time
+import urllib2
+
+import pytest
+
+from tools.wpt import wpt
+
+
+# Tests currently don't work on Windows for path reasons
+
+def test_missing():
+ with pytest.raises(SystemExit):
+ wpt.main(argv=["#missing-command"])
+
+
+def test_help():
+ # TODO: It seems like there's a bug in argparse that makes this argument order required
+ # should try to work around that
+ with pytest.raises(SystemExit) as excinfo:
+ wpt.main(argv=["--help"])
+ assert excinfo.value.code == 0
+
+
+def test_run_firefox():
+ # TODO: It seems like there's a bug in argparse that makes this argument order required
+ # should try to work around that
+ os.environ["MOZ_HEADLESS"] = "1"
+ try:
+ fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "firefox")
+ if os.path.exists(fx_path):
+ shutil.rmtree(fx_path)
+ with pytest.raises(SystemExit) as excinfo:
+ wpt.main(argv=["run", "--no-pause", "--install-browser", "--yes",
+ "--metadata", "~/meta/",
+ "firefox", "/dom/nodes/Element-tagName.html"])
+ assert os.path.exists(fx_path)
+ shutil.rmtree(fx_path)
+ assert excinfo.value.code == 0
+ finally:
+ del os.environ["MOZ_HEADLESS"]
+
+
+def test_run_chrome():
+ with pytest.raises(SystemExit) as excinfo:
+ wpt.main(argv=["run", "--yes", "--no-pause", "--binary-arg", "headless",
+ "--metadata", "~/meta/",
+ "chrome", "/dom/nodes/Element-tagName.html"])
+ assert excinfo.value.code == 0
+
+
+def test_install_chromedriver():
+ chromedriver_path = os.path.join(wpt.localpaths.repo_root, "_venv", "bin", "chromedriver")
+ if os.path.exists(chromedriver_path):
+ os.unlink(chromedriver_path)
+ with pytest.raises(SystemExit) as excinfo:
+ wpt.main(argv=["install", "chrome", "webdriver"])
+ assert excinfo.value.code == 0
+ assert os.path.exists(chromedriver_path)
+ os.unlink(chromedriver_path)
+
+
+def test_install_firefox():
+ fx_path = os.path.join(wpt.localpaths.repo_root, "_venv", "firefox")
+ if os.path.exists(fx_path):
+ shutil.rmtree(fx_path)
+ with pytest.raises(SystemExit) as excinfo:
+ wpt.main(argv=["install", "firefox", "browser"])
+ assert excinfo.value.code == 0
+ assert os.path.exists(fx_path)
+ shutil.rmtree(fx_path)
+
+
+def test_files_changed(capsys):
+ commit = "9047ac1d9f51b1e9faa4f9fad9c47d109609ab09"
+ with pytest.raises(SystemExit) as excinfo:
+ wpt.main(argv=["files-changed", "%s~..%s" % (commit, commit)])
+ assert excinfo.value.code == 0
+ out, err = capsys.readouterr()
+ assert out == """html/browsers/offline/appcache/workers/appcache-worker.html
+html/browsers/offline/appcache/workers/resources/appcache-dedicated-worker-not-in-cache.js
+html/browsers/offline/appcache/workers/resources/appcache-shared-worker-not-in-cache.js
+html/browsers/offline/appcache/workers/resources/appcache-worker-data.py
+html/browsers/offline/appcache/workers/resources/appcache-worker-import.py
+html/browsers/offline/appcache/workers/resources/appcache-worker.manifest
+html/browsers/offline/appcache/workers/resources/appcache-worker.py
+"""
+ assert err == ""
+
+
+def test_tests_affected(capsys):
+ # This doesn't really work properly for random commits because we test the files in
+ # the current working directory for references to the changed files, not the ones at
+ # that specific commit. But we can at least test it returns something sensible
+ commit = "9047ac1d9f51b1e9faa4f9fad9c47d109609ab09"
+ with pytest.raises(SystemExit) as excinfo:
+ wpt.main(argv=["tests-affected", "--metadata", "~/meta/", "%s~..%s" % (commit, commit)])
+ assert excinfo.value.code == 0
+ out, err = capsys.readouterr()
+ assert "html/browsers/offline/appcache/workers/appcache-worker.html" in out
+ assert err == ""
+
+
+def test_serve():
+ def test():
+ s = socket.socket()
+ s.connect(("127.0.0.1", 8000))
+ with pytest.raises(socket.error):
+ test()
+
+ p = subprocess.Popen([os.path.join(wpt.localpaths.repo_root, "wpt"), "serve"],
+ preexec_fn=os.setsid)
+
+ start = time.time()
+ try:
+ while True:
+ if time.time() - start > 60:
+ assert False
+ try:
+ resp = urllib2.urlopen("http://web-platform.test:8000")
+ print resp
+ except urllib2.URLError:
+ print "URLError"
+ time.sleep(1)
+ else:
+ assert resp.code == 200
+ break
+ finally:
+ os.killpg(p.pid, 15)
+
+# The following commands are slow running and used implicitly in other CI
+# jobs, so we skip them here:
+# wpt check-stability
+# wpt manifest
+# wpt lint
diff --git a/tests/wpt/web-platform-tests/tools/wpt/tox.ini b/tests/wpt/web-platform-tests/tools/wpt/tox.ini
new file mode 100644
index 00000000000..5836a52ffa9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/tox.ini
@@ -0,0 +1,21 @@
+[tox]
+envlist = py27
+skipsdist=True
+
+[testenv]
+deps =
+ flake8
+ pytest
+ pytest-cov
+ hypothesis
+ -r{toxinidir}/../wptrunner/requirements.txt
+ -r{toxinidir}/../wptrunner/requirements_chrome.txt
+ -r{toxinidir}/../wptrunner/requirements_firefox.txt
+
+commands =
+ pytest --cov
+ flake8
+
+[flake8]
+ignore = E128,E129,E221,E226,E231,E251,E265,E302,E303,E305,E402,E901,F401,F821,F841
+max-line-length = 141
diff --git a/tests/wpt/web-platform-tests/tools/browserutils/utils.py b/tests/wpt/web-platform-tests/tools/wpt/utils.py
index 32e780f4e17..32e780f4e17 100644
--- a/tests/wpt/web-platform-tests/tools/browserutils/utils.py
+++ b/tests/wpt/web-platform-tests/tools/wpt/utils.py
diff --git a/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py b/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py
new file mode 100644
index 00000000000..8f36aa93585
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/virtualenv.py
@@ -0,0 +1,52 @@
+import os
+import sys
+import logging
+from distutils.spawn import find_executable
+
+from tools.wpt.utils import call
+
+logger = logging.getLogger(__name__)
+
+class Virtualenv(object):
+ def __init__(self, path):
+ self.path = path
+ self.virtualenv = find_executable("virtualenv")
+ if not self.virtualenv:
+ raise ValueError("virtualenv must be installed and on the PATH")
+
+ @property
+ def exists(self):
+ return os.path.isdir(self.path)
+
+ def create(self):
+ if os.path.exists(self.path):
+ shutil.rmtree(self.path)
+ call(self.virtualenv, self.path)
+
+ @property
+ def bin_path(self):
+ if sys.platform in ("win32", "cygwin"):
+ return os.path.join(self.path, "Scripts")
+ return os.path.join(self.path, "bin")
+
+ @property
+ def pip_path(self):
+ path = find_executable("pip", self.bin_path)
+ if path is None:
+ raise ValueError("pip not found")
+ return path
+
+ def activate(self):
+ path = os.path.join(self.bin_path, "activate_this.py")
+ execfile(path, {"__file__": path})
+
+ def start(self):
+ if not self.exists:
+ self.create()
+ self.activate()
+
+ def install(self, *requirements):
+ call(self.pip_path, "install", *requirements)
+
+ def install_requirements(self, requirements_path):
+ call(self.pip_path, "install", "-r", requirements_path)
diff --git a/tests/wpt/web-platform-tests/tools/wpt/wpt.py b/tests/wpt/web-platform-tests/tools/wpt/wpt.py
new file mode 100644
index 00000000000..cf94ce038d6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wpt/wpt.py
@@ -0,0 +1,142 @@
+import argparse
+import os
+import json
+import sys
+
+from tools import localpaths
+
+from six import iteritems
+from . import virtualenv
+
+
+here = os.path.dirname(__file__)
+wpt_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir))
+
+
+def load_commands():
+ rv = {}
+ with open(os.path.join(here, "paths"), "r") as f:
+ paths = [item.strip().replace("/", os.path.sep) for item in f if item.strip()]
+ for path in paths:
+ abs_path = os.path.join(wpt_root, path, "commands.json")
+ base_dir = os.path.dirname(abs_path)
+ with open(abs_path, "r") as f:
+ data = json.load(f)
+ for command, props in iteritems(data):
+ assert "path" in props
+ assert "script" in props
+ rv[command] = {
+ "path": os.path.join(base_dir, props["path"]),
+ "script": props["script"],
+ "parser": props.get("parser"),
+ "parse_known": props.get("parse_known", False),
+ "help": props.get("help"),
+ "virtualenv": props.get("virtualenv", True),
+ "install": props.get("install", []),
+ "requirements": [os.path.join(base_dir, item)
+ for item in props.get("requirements", [])]
+ }
+ return rv
+
+
+def parse_args(argv, commands):
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--venv", action="store", help="Path to an existing virtualenv to use")
+ parser.add_argument("--debug", action="store_true", help="Run the debugger in case of an exception")
+ subparsers = parser.add_subparsers(dest="command")
+ for command, props in iteritems(commands):
+ sub_parser = subparsers.add_parser(command, help=props["help"], add_help=False)
+
+ args, extra = parser.parse_known_args(argv)
+
+ return args, extra
+
+
+def import_command(prog, command, props):
+ # This currently requires the path to be a module,
+ # which probably isn't ideal but it means that relative
+ # imports inside the script work
+ rel_path = os.path.relpath(props["path"], wpt_root)
+
+ parts = os.path.splitext(rel_path)[0].split(os.path.sep)
+
+ mod_name = ".".join(parts)
+
+ mod = __import__(mod_name)
+ for part in parts[1:]:
+ mod = getattr(mod, part)
+
+ script = getattr(mod, props["script"])
+ if props["parser"] is not None:
+ parser = getattr(mod, props["parser"])()
+ parser.prog = "%s %s" % (os.path.basename(prog), command)
+ else:
+ parser = None
+
+ return script, parser
+
+
+def setup_virtualenv(path, props):
+ if path is None:
+ path = os.path.join(wpt_root, "_venv")
+ venv = virtualenv.Virtualenv(path)
+ venv.start()
+ for name in props["install"]:
+ venv.install(name)
+ for path in props["requirements"]:
+ venv.install_requirements(path)
+ return venv
+
+
+def main(prog=None, argv=None):
+ if prog is None:
+ prog = sys.argv[0]
+ if argv is None:
+ argv = sys.argv[1:]
+
+ commands = load_commands()
+
+ main_args, command_args = parse_args(argv, commands)
+
+ if not(len(argv) and argv[0] in commands):
+ sys.exit(1)
+
+ command = main_args.command
+ props = commands[command]
+ venv = None
+ if props["virtualenv"]:
+ venv = setup_virtualenv(main_args.venv, props)
+ script, parser = import_command(prog, command, props)
+ if parser:
+ if props["parse_known"]:
+ kwargs, extras = parser.parse_known_args(command_args)
+ extras = (extras,)
+ kwargs = vars(kwargs)
+ else:
+ extras = ()
+ kwargs = vars(parser.parse_args(command_args))
+ else:
+ extras = ()
+ kwargs = {}
+
+ if venv is not None:
+ args = (venv,) + extras
+ else:
+ args = extras
+
+ if script:
+ try:
+ rv = script(*args, **kwargs)
+ if rv is not None:
+ sys.exit(int(rv))
+ except Exception:
+ if main_args.debug:
+ import pdb
+ pdb.post_mortem()
+ else:
+ raise
+ sys.exit(0)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tests/wpt/web-platform-tests/tools/wptrun.py b/tests/wpt/web-platform-tests/tools/wptrun.py
deleted file mode 100644
index 611fc4af0d6..00000000000
--- a/tests/wpt/web-platform-tests/tools/wptrun.py
+++ /dev/null
@@ -1,308 +0,0 @@
-import argparse
-import os
-import platform
-import shutil
-import subprocess
-import sys
-import tarfile
-from distutils.spawn import find_executable
-
-import localpaths
-from browserutils import browser, utils, virtualenv
-logger = None
-
-wpt_root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
-
-
-class WptrunnerHelpAction(argparse.Action):
- def __init__(self,
- option_strings,
- dest=argparse.SUPPRESS,
- default=argparse.SUPPRESS,
- help=None):
- super(WptrunnerHelpAction, self).__init__(
- option_strings=option_strings,
- dest=dest,
- default=default,
- nargs=0,
- help=help)
-
- def __call__(self, parser, namespace, values, option_string=None):
- from wptrunner import wptcommandline
- wptparser = wptcommandline.create_parser()
- wptparser.usage = parser.usage
- wptparser.print_help()
- parser.exit()
-
-
-def create_parser():
- parser = argparse.ArgumentParser()
- parser.add_argument("product", action="store",
- help="Browser to run tests in")
- parser.add_argument("tests", action="store", nargs="*",
- help="Path to tests to run")
- parser.add_argument("wptrunner_args", nargs=argparse.REMAINDER,
- help="Arguments to pass through to wptrunner")
- parser.add_argument("--yes", "-y", dest="prompt", action="store_false", default=True,
- help="Don't prompt before installing components")
- parser.add_argument("--wptrunner-help",
- action=WptrunnerHelpAction, default=argparse.SUPPRESS,
- help="Print wptrunner help")
- return parser
-
-
-def exit(msg):
- logger.error(msg)
- sys.exit(1)
-
-
-def args_general(kwargs):
- kwargs.set_if_none("tests_root", wpt_root)
- kwargs.set_if_none("metadata_root", wpt_root)
- kwargs.set_if_none("manifest_update", True)
-
- if kwargs["ssl_type"] == "openssl":
- if not find_executable(kwargs["openssl_binary"]):
- if os.uname()[0] == "Windows":
- exit("""OpenSSL binary not found. If you need HTTPS tests, install OpenSSL from
-
-https://slproweb.com/products/Win32OpenSSL.html
-
-Ensuring that libraries are added to /bin and add the resulting bin directory to
-your PATH.
-
-Otherwise run with --ssl-type=none""")
- else:
- exit("""OpenSSL not found. If you don't need HTTPS support run with --ssl-type=none,
-otherwise install OpenSSL and ensure that it's on your $PATH.""")
-
-
-def check_environ(product):
- if product != "firefox":
- expected_hosts = set(["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",
- "nonexistent-origin.web-platform.test"])
- if platform.uname()[0] != "Windows":
- hosts_path = "/etc/hosts"
- else:
- hosts_path = "C:\Windows\System32\drivers\etc\hosts"
- with open(hosts_path, "r") as f:
- for line in f:
- line = line.split("#", 1)[0].strip()
- parts = line.split()
- if len(parts) == 2:
- host = parts[1]
- expected_hosts.discard(host)
- if expected_hosts:
- exit("""Missing hosts file configuration for %s.
-See README.md for more details.""" % ",".join(expected_hosts))
-
-def prompt_install(component, prompt):
- if not prompt:
- return True
- while True:
- resp = raw_input("Download and install %s [Y/n]? " % component).strip().lower()
- if not resp or resp == "y":
- return True
- elif resp == "n":
- return False
-
-
-def args_firefox(venv, kwargs, firefox, prompt=True):
- if kwargs["binary"] is None:
- binary = firefox.find_binary()
- if binary is None:
- exit("""Firefox binary not found on $PATH.
-
-Install Firefox or use --binary to set the binary path""")
- kwargs["binary"] = binary
-
- if kwargs["certutil_binary"] is None and kwargs["ssl_type"] != "none":
- certutil = firefox.find_certutil()
-
- if certutil is None:
- # Can't download this for now because it's missing the libnss3 library
- exit("""Can't find certutil.
-
-This must be installed using your OS package manager or directly e.g.
-
-Debian/Ubuntu:
-sudo apt install libnss3-tools
-
-macOS/Homebrew:
-brew install nss
-
-Others:
-Download the firefox archive and common.tests.zip archive for your platform
-from
-https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/
-Then extract certutil[.exe] from the tests.zip package and
-libnss3[.so|.dll|.dynlib] and but the former on your path and the latter on
-your library path.
-""")
- else:
- print("Using certutil %s" % certutil)
-
- if certutil is not None:
- kwargs["certutil_binary"] = certutil
- else:
- print("Unable to find or install certutil, setting ssl-type to none")
- kwargs["ssl_type"] = "none"
-
- if kwargs["webdriver_binary"] is None and "wdspec" in kwargs["test_types"]:
- webdriver_binary = firefox.find_webdriver()
-
- if webdriver_binary is None:
- install = prompt_install("geckodriver", prompt)
-
- if install:
- print("Downloading geckodriver")
- webdriver_binary = firefox.install_webdriver(dest=venv.bin_path)
- else:
- print("Using webdriver binary %s" % webdriver_binary)
-
- if webdriver_binary:
- kwargs["webdriver_binary"] = webdriver_binary
- else:
- print("Unable to find or install geckodriver, skipping wdspec tests")
- kwargs["test_types"].remove("wdspec")
-
- if kwargs["prefs_root"] is None:
- print("Downloading gecko prefs")
- prefs_root = firefox.install_prefs(venv.path)
- kwargs["prefs_root"] = prefs_root
-
-
-def setup_firefox(venv, kwargs, prompt=True):
- firefox = browser.Firefox()
- args_firefox(venv, kwargs, firefox, prompt)
- venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", firefox.requirements))
-
-
-def args_chrome(venv, kwargs, chrome, prompt=True):
- if kwargs["webdriver_binary"] is None:
- webdriver_binary = chrome.find_webdriver()
-
- if webdriver_binary is None:
- install = prompt_install("chromedriver", prompt)
-
- if install:
- print("Downloading chromedriver")
- webdriver_binary = chrome.install_webdriver(dest=venv.bin_path)
- else:
- print("Using webdriver binary %s" % webdriver_binary)
-
- if webdriver_binary:
- kwargs["webdriver_binary"] = webdriver_binary
- else:
- exit("Unable to locate or install chromedriver binary")
-
-
-def setup_chrome(venv, kwargs, prompt=True):
- chrome = browser.Chrome()
- args_chrome(venv, kwargs, chrome, prompt)
- venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", chrome.requirements))
-
-
-def args_edge(venv, kwargs, edge, prompt=True):
- if kwargs["webdriver_binary"] is None:
- webdriver_binary = edge.find_webdriver()
-
- if webdriver_binary is None:
- exit("""Unable to find WebDriver and we aren't yet clever enough to work out which
-version to download. Please go to the following URL and install the correct
-version for your Edge/Windows release somewhere on the %PATH%:
-
-https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- """)
- kwargs["webdriver_binary"] = webdriver_binary
-
-
-def setup_edge(venv, kwargs, prompt=True):
- edge = browser.Edge()
- args_edge(venv, kwargs, edge, prompt)
- venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", edge.requirements))
-
-
-def setup_sauce(kwargs):
- raise NotImplementedError
-
-
-def args_servo(venv, kwargs, servo, prompt=True):
- if kwargs["binary"] is None:
- binary = servo.find_binary()
-
- if binary is None:
- exit("Unable to find servo binary on the PATH")
- kwargs["binary"] = binary
-
-
-def setup_servo(venv, kwargs, prompt=True):
- servo = browser.Servo()
- args_servo(venv, kwargs, servo, prompt)
- venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", servo.requirements))
-
-
-product_setup = {
- "firefox": setup_firefox,
- "chrome": setup_chrome,
- "edge": setup_edge,
- "servo": setup_servo
-}
-
-
-def setup_wptrunner(venv, product, tests, wptrunner_args, prompt=True,):
- from wptrunner import wptrunner, wptcommandline
-
- global logger
-
- wptparser = wptcommandline.create_parser()
- kwargs = utils.Kwargs(vars(wptparser.parse_args(wptrunner_args)).iteritems())
-
- wptrunner.setup_logging(kwargs, {"mach": sys.stdout})
- logger = wptrunner.logger
-
- kwargs["product"] = product
- kwargs["test_list"] = tests
-
- check_environ(product)
- args_general(kwargs)
-
- if product not in product_setup:
- exit("Unsupported product %s" % product)
-
- product_setup[product](venv, kwargs, prompt)
-
- wptcommandline.check_args(kwargs)
-
- wptrunner_path = os.path.join(wpt_root, "tools", "wptrunner")
-
- venv.install_requirements(os.path.join(wptrunner_path, "requirements.txt"))
-
- return kwargs
-
-
-def main():
- parser = create_parser()
- args = parser.parse_args()
-
- venv = virtualenv.Virtualenv(os.path.join(wpt_root, "_venv_%s") % platform.uname()[0])
- venv.start()
- venv.install_requirements(os.path.join(wpt_root, "tools", "wptrunner", "requirements.txt"))
- venv.install("requests")
-
- kwargs = setup_wptrunner(venv, args.product, args.tests, args.wptrunner_args, prompt=args.prompt)
- from wptrunner import wptrunner
- wptrunner.start(**kwargs)
-
-
-if __name__ == "__main__":
- import pdb
- try:
- main()
- except:
- pdb.post_mortem()
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt
index 319a2ff984a..8281f6d7d3b 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements.txt
@@ -1,4 +1,5 @@
html5lib >= 0.99
mozinfo >= 0.7
-mozlog >= 3.3
+mozlog >= 3.5
mozdebug >= 0.1
+urllib3[secure]
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/requirements_ie.txt b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_ie.txt
new file mode 100644
index 00000000000..a2f54425f3e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/requirements_ie.txt
@@ -0,0 +1,2 @@
+mozprocess >= 0.19
+selenium >= 2.41.0
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
index e3606d23cf0..c4ea971fb6f 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/__init__.py
@@ -25,6 +25,7 @@ module global scope.
product_list = ["chrome",
"edge",
"firefox",
+ "ie",
"sauce",
"servo",
"servodriver"]
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py
index 52527599ffb..e4c9c301bd5 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/base.py
@@ -119,6 +119,10 @@ class Browser(object):
with which it should be instantiated"""
return ExecutorBrowser, {}
+ def check_for_crashes(self):
+ """Check for crashes that didn't cause the browser process to terminate"""
+ return False
+
def log_crash(self, process, test):
"""Return a list of dictionaries containing information about crashes that happend
in the browser, or an empty list if no crashes occurred"""
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py
index 1c08c27922b..215fccffe2a 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/chrome.py
@@ -3,13 +3,15 @@ from ..webdriver_server import ChromeDriverServer
from ..executors import executor_kwargs as base_executor_kwargs
from ..executors.executorselenium import (SeleniumTestharnessExecutor,
SeleniumRefTestExecutor)
+from ..executors.executorchrome import ChromeDriverWdspecExecutor
__wptrunner__ = {"product": "chrome",
"check_args": "check_args",
"browser": "ChromeBrowser",
"executor": {"testharness": "SeleniumTestharnessExecutor",
- "reftest": "SeleniumRefTestExecutor"},
+ "reftest": "SeleniumRefTestExecutor",
+ "wdspec": "ChromeDriverWdspecExecutor"},
"browser_kwargs": "browser_kwargs",
"executor_kwargs": "executor_kwargs",
"env_extras": "env_extras",
@@ -44,6 +46,11 @@ def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
for (kwarg, capability) in [("binary", "binary"), ("binary_args", "args")]:
if kwargs[kwarg] is not None:
capabilities["chromeOptions"][capability] = kwargs[kwarg]
+ if test_type == "testharness":
+ capabilities["chromeOptions"]["useAutomationExtension"] = False
+ capabilities["chromeOptions"]["excludeSwitches"] = ["enable-automation"]
+ if test_type == "wdspec":
+ capabilities["chromeOptions"]["w3c"] = True
executor_kwargs["capabilities"] = capabilities
return executor_kwargs
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/edge.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/edge.py
index b46e5288729..fdc7a7721ad 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/edge.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/edge.py
@@ -55,8 +55,8 @@ class EdgeBrowser(Browser):
print self.server.url
self.server.start()
- def stop(self):
- self.server.stop()
+ def stop(self, force=False):
+ self.server.stop(force=force)
def pid(self):
return self.server.pid
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
index 2d45a69dbe7..f869c82a8ed 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -65,6 +65,7 @@ def browser_kwargs(test_type, run_info_data, **kwargs):
return {"binary": kwargs["binary"],
"prefs_root": kwargs["prefs_root"],
"extra_prefs": kwargs["extra_prefs"],
+ "test_type": test_type,
"debug_info": kwargs["debug_info"],
"symbols_path": kwargs["symbols_path"],
"stackwalk_binary": kwargs["stackwalk_binary"],
@@ -76,7 +77,8 @@ def browser_kwargs(test_type, run_info_data, **kwargs):
"timeout_multiplier": get_timeout_multiplier(test_type,
run_info_data,
**kwargs),
- "leak_check": kwargs["leak_check"]}
+ "leak_check": kwargs["leak_check"],
+ "stylo_threads": kwargs["stylo_threads"]}
def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
@@ -87,10 +89,10 @@ def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
executor_kwargs["timeout_multiplier"] = get_timeout_multiplier(test_type,
run_info_data,
**kwargs)
+ if test_type == "reftest":
+ executor_kwargs["reftest_internal"] = kwargs["reftest_internal"]
+ executor_kwargs["reftest_screenshot"] = kwargs["reftest_screenshot"]
if test_type == "wdspec":
- executor_kwargs["binary"] = kwargs["binary"]
- executor_kwargs["webdriver_binary"] = kwargs.get("webdriver_binary")
- executor_kwargs["webdriver_args"] = kwargs.get("webdriver_args")
fxOptions = {}
if kwargs["binary"]:
fxOptions["binary"] = kwargs["binary"]
@@ -117,11 +119,13 @@ def env_options():
def run_info_extras(**kwargs):
- return {"e10s": kwargs["gecko_e10s"]}
+ return {"e10s": kwargs["gecko_e10s"],
+ "headless": "MOZ_HEADLESS" in os.environ}
def update_properties():
- return ["debug", "e10s", "os", "version", "processor", "bits"], {"debug", "e10s"}
+ return (["debug", "stylo", "e10s", "os", "version", "processor", "bits"],
+ {"debug", "e10s", "stylo"})
class FirefoxBrowser(Browser):
@@ -129,13 +133,14 @@ class FirefoxBrowser(Browser):
init_timeout = 60
shutdown_timeout = 60
- def __init__(self, logger, binary, prefs_root, extra_prefs=None, debug_info=None,
+ def __init__(self, logger, binary, prefs_root, test_type, extra_prefs=None, debug_info=None,
symbols_path=None, stackwalk_binary=None, certutil_binary=None,
ca_certificate_path=None, e10s=False, stackfix_dir=None,
- binary_args=None, timeout_multiplier=None, leak_check=False):
+ binary_args=None, timeout_multiplier=None, leak_check=False, stylo_threads=1):
Browser.__init__(self, logger)
self.binary = binary
self.prefs_root = prefs_root
+ self.test_type = test_type
self.extra_prefs = extra_prefs
self.marionette_port = None
self.runner = None
@@ -147,7 +152,7 @@ class FirefoxBrowser(Browser):
self.certutil_binary = certutil_binary
self.e10s = e10s
self.binary_args = binary_args
- if self.symbols_path and stackfix_dir:
+ if stackfix_dir:
self.stack_fixer = get_stack_fixer_function(stackfix_dir,
self.symbols_path)
else:
@@ -158,6 +163,7 @@ class FirefoxBrowser(Browser):
self.leak_report_file = None
self.leak_check = leak_check
+ self.stylo_threads = stylo_threads
def settings(self, test):
return {"check_leaks": self.leak_check and not test.leaks}
@@ -168,7 +174,10 @@ class FirefoxBrowser(Browser):
self.used_ports.add(self.marionette_port)
env = os.environ.copy()
+ env["MOZ_CRASHREPORTER"] = "1"
+ env["MOZ_CRASHREPORTER_SHUTDOWN"] = "1"
env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"] = "1"
+ env["STYLO_THREADS"] = str(self.stylo_threads)
locations = ServerLocations(filename=os.path.join(here, "server-locations.txt"))
@@ -180,10 +189,14 @@ class FirefoxBrowser(Browser):
"dom.disable_open_during_load": False,
"network.dns.localDomains": ",".join(hostnames),
"network.proxy.type": 0,
- "places.history.enabled": False})
+ "places.history.enabled": False,
+ "dom.send_after_paint_to_content": True})
if self.e10s:
self.profile.set_preferences({"browser.tabs.remote.autostart": True})
+ if self.test_type == "reftest":
+ self.profile.set_preferences({"layout.interruptible-reflow.enabled": False})
+
if self.leak_check and kwargs.get("check_leaks", True):
self.leak_report_file = os.path.join(self.profile.profile, "runtests_leaks.log")
if os.path.exists(self.leak_report_file):
@@ -297,6 +310,14 @@ class FirefoxBrowser(Browser):
assert self.marionette_port is not None
return ExecutorBrowser, {"marionette_port": self.marionette_port}
+ def check_for_crashes(self):
+ dump_dir = os.path.join(self.profile.profile, "minidumps")
+
+ return bool(mozcrash.check_for_crashes(dump_dir,
+ symbols_path=self.symbols_path,
+ stackwalk_binary=self.stackwalk_binary,
+ quiet=True))
+
def log_crash(self, process, test):
dump_dir = os.path.join(self.profile.profile, "minidumps")
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/ie.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/ie.py
new file mode 100644
index 00000000000..c981024f22b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/ie.py
@@ -0,0 +1,81 @@
+from .base import Browser, ExecutorBrowser, require_arg
+from ..webdriver_server import InternetExplorerDriverServer
+from ..executors import executor_kwargs as base_executor_kwargs
+from ..executors.executorselenium import (SeleniumTestharnessExecutor,
+ SeleniumRefTestExecutor)
+from ..executors.executorinternetexplorer import InternetExplorerDriverWdspecExecutor
+
+__wptrunner__ = {"product": "ie",
+ "check_args": "check_args",
+ "browser": "InternetExplorerBrowser",
+ "executor": {"testharness": "SeleniumTestharnessExecutor",
+ "reftest": "SeleniumRefTestExecutor",
+ "wdspec": "InternetExplorerDriverWdspecExecutor"},
+ "browser_kwargs": "browser_kwargs",
+ "executor_kwargs": "executor_kwargs",
+ "env_extras": "env_extras",
+ "env_options": "env_options"}
+
+
+def check_args(**kwargs):
+ require_arg(kwargs, "webdriver_binary")
+
+def browser_kwargs(test_type, run_info_data, **kwargs):
+ return {"webdriver_binary": kwargs["webdriver_binary"],
+ "webdriver_args": kwargs.get("webdriver_args")}
+
+def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
+ **kwargs):
+ from selenium.webdriver import DesiredCapabilities
+
+ ieOptions = {}
+ ieOptions["requireWindowFocus"] = True
+ capabilities = {}
+ capabilities["browserName"] = "internet explorer"
+ capabilities["platformName"] = "windows"
+ capabilities["se:ieOptions"] = ieOptions
+ executor_kwargs = base_executor_kwargs(test_type, server_config,
+ cache_manager, **kwargs)
+ executor_kwargs["close_after_done"] = True
+ executor_kwargs["capabilities"] = capabilities
+ return executor_kwargs
+
+def env_extras(**kwargs):
+ return []
+
+def env_options():
+ return {"host": "web-platform.test",
+ "bind_hostname": "true",
+ "supports_debugger": False}
+
+class InternetExplorerBrowser(Browser):
+ used_ports = set()
+
+ def __init__(self, logger, webdriver_binary, webdriver_args=None):
+ Browser.__init__(self, logger)
+ self.server = InterentExplorerDriverServer(self.logger,
+ binary=webdriver_binary,
+ args=webdriver_args)
+ self.webdriver_host = "localhost"
+ self.webdriver_port = self.server.port
+
+ def start(self, **kwargs):
+ self.server.start()
+
+ def stop(self, force=False):
+ self.server.stop(force=force)
+
+ def pid(self):
+ return self.server.pid
+
+ def is_alive(self):
+ # TODO(ato): This only indicates the server is alive,
+ # and doesn't say anything about whether a browser session
+ # is active.
+ return self.server.is_alive()
+
+ def cleanup(self):
+ self.stop()
+
+ def executor_browser(self):
+ return ExecutorBrowser, {"webdriver_url": self.server.url}
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/sauce.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/sauce.py
index a2f29a4c54f..fca5dbad918 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/sauce.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/browsers/sauce.py
@@ -138,7 +138,7 @@ class SauceConnect():
def __enter__(self, options):
if not self.sauce_connect_binary:
self.temp_dir = tempfile.mkdtemp()
- get_tar("https://saucelabs.com/downloads/sc-latest-linux.tar.gz", self.temp_dir)
+ get_tar("https://saucelabs.com/downloads/sc-4.4.9-linux.tar.gz", self.temp_dir)
self.sauce_connect_binary = glob.glob(os.path.join(self.temp_dir, "sc-*-linux/bin/sc"))[0]
self.upload_prerun_exec('edge-prerun.bat')
@@ -161,9 +161,9 @@ class SauceConnect():
if self.sc_process.returncode is not None and self.sc_process.returncode > 0:
raise SauceException("Unable to start Sauce Connect Proxy. Process exited with code %s", self.sc_process.returncode)
- def __exit__(self, *args):
+ def __exit__(self, exc_type, exc_val, exc_tb):
self.sc_process.terminate()
- if os.path.exists(self.temp_dir):
+ if self.temp_dir and os.path.exists(self.temp_dir):
try:
shutil.rmtree(self.temp_dir)
except OSError:
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py
index 558a44582b8..73b54ceb9f3 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/environment.py
@@ -6,7 +6,7 @@ import socket
import sys
import time
-from mozlog import get_default_logger, handlers
+from mozlog import get_default_logger, handlers, proxy
from wptlogging import LogLevelRewriter
@@ -117,7 +117,7 @@ class TestEnvironment(object):
for port, server in servers:
server.kill()
for cm in self.env_extras:
- cm.__exit__()
+ cm.__exit__(exc_type, exc_val, exc_tb)
self.cache_manager.__exit__(exc_type, exc_val, exc_tb)
self.ssl_env.__exit__(exc_type, exc_val, exc_tb)
self.stash.__exit__()
@@ -168,6 +168,8 @@ class TestEnvironment(object):
log_filter = LogLevelRewriter(log_filter, ["error"], "warning")
server_logger.component_filter = log_filter
+ server_logger = proxy.QueuedProxyLogger(server_logger)
+
try:
#Set as the default logger for wptserve
serve.set_logger(server_logger)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py
index a4bda4faafa..27be0c54b78 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/base.py
@@ -1,7 +1,9 @@
import hashlib
-import json
+import httplib
import os
+import threading
import traceback
+import socket
import urlparse
from abc import ABCMeta, abstractmethod
@@ -9,6 +11,10 @@ from ..testrunner import Stop
here = os.path.split(__file__)[0]
+# Extra timeout to use after internal test timeout at which the harness
+# should force a timeout
+extra_timeout = 5 # seconds
+
def executor_kwargs(test_type, server_config, cache_manager, **kwargs):
timeout_multiplier = kwargs["timeout_multiplier"]
@@ -22,6 +28,11 @@ def executor_kwargs(test_type, server_config, cache_manager, **kwargs):
if test_type == "reftest":
executor_kwargs["screenshot_cache"] = cache_manager.dict()
+ if test_type == "wdspec":
+ executor_kwargs["binary"] = kwargs.get("binary")
+ executor_kwargs["webdriver_binary"] = kwargs.get("webdriver_binary")
+ executor_kwargs["webdriver_args"] = kwargs.get("webdriver_args")
+
return executor_kwargs
@@ -93,7 +104,7 @@ class TestExecutor(object):
convert_result = None
def __init__(self, browser, server_config, timeout_multiplier=1,
- debug_info=None):
+ debug_info=None, **kwargs):
"""Abstract Base class for object that actually executes the tests in a
specific browser. Typically there will be a different TestExecutor
subclass for each test type and method of executing tests.
@@ -196,7 +207,7 @@ class RefTestExecutor(TestExecutor):
convert_result = reftest_result_converter
def __init__(self, browser, server_config, timeout_multiplier=1, screenshot_cache=None,
- debug_info=None):
+ debug_info=None, **kwargs):
TestExecutor.__init__(self, browser, server_config,
timeout_multiplier=timeout_multiplier,
debug_info=debug_info)
@@ -215,6 +226,12 @@ class RefTestImplementation(object):
self.screenshot_cache = self.executor.screenshot_cache
self.message = None
+ def setup(self):
+ pass
+
+ def teardown(self):
+ pass
+
@property
def logger(self):
return self.executor.logger
@@ -304,6 +321,51 @@ class RefTestImplementation(object):
class WdspecExecutor(TestExecutor):
convert_result = pytest_result_converter
+ protocol_cls = None
+
+ def __init__(self, browser, server_config, webdriver_binary,
+ webdriver_args, timeout_multiplier=1, capabilities=None,
+ debug_info=None, **kwargs):
+ self.do_delayed_imports()
+ TestExecutor.__init__(self, browser, server_config,
+ timeout_multiplier=timeout_multiplier,
+ debug_info=debug_info)
+ self.webdriver_binary = webdriver_binary
+ self.webdriver_args = webdriver_args
+ self.timeout_multiplier = timeout_multiplier
+ self.capabilities = capabilities
+ self.protocol = self.protocol_cls(self, browser)
+
+ def is_alive(self):
+ return self.protocol.is_alive
+
+ def on_environment_change(self, new_environment):
+ pass
+
+ def do_test(self, test):
+ timeout = test.timeout * self.timeout_multiplier + extra_timeout
+
+ success, data = WdspecRun(self.do_wdspec,
+ self.protocol.session_config,
+ test.abs_path,
+ timeout).run()
+
+ if success:
+ return self.convert_result(test, data)
+
+ return (test.result_cls(*data), [])
+
+ def do_wdspec(self, session_config, path, timeout):
+ harness_result = ("OK", None)
+ subtest_results = pytestrunner.run(path,
+ self.server_config,
+ session_config,
+ timeout=timeout)
+ return (harness_result, subtest_results)
+
+ def do_delayed_imports(self):
+ global pytestrunner
+ from . import pytestrunner
class Protocol(object):
@@ -323,3 +385,95 @@ class Protocol(object):
def wait(self):
pass
+
+
+class WdspecRun(object):
+ def __init__(self, func, session, path, timeout):
+ self.func = func
+ self.result = (None, None)
+ self.session = session
+ self.path = path
+ self.timeout = timeout
+ self.result_flag = threading.Event()
+
+ def run(self):
+ """Runs function in a thread and interrupts it if it exceeds the
+ given timeout. Returns (True, (Result, [SubtestResult ...])) in
+ case of success, or (False, (status, extra information)) in the
+ event of failure.
+ """
+
+ executor = threading.Thread(target=self._run)
+ executor.start()
+
+ flag = self.result_flag.wait(self.timeout)
+ if self.result[1] is None:
+ self.result = False, ("EXTERNAL-TIMEOUT", None)
+
+ return self.result
+
+ def _run(self):
+ try:
+ self.result = True, self.func(self.session, self.path, self.timeout)
+ except (socket.timeout, IOError):
+ self.result = False, ("CRASH", None)
+ except Exception as e:
+ message = getattr(e, "message")
+ if message:
+ message += "\n"
+ message += traceback.format_exc(e)
+ self.result = False, ("ERROR", message)
+ finally:
+ self.result_flag.set()
+
+
+class WebDriverProtocol(Protocol):
+ server_cls = None
+
+ def __init__(self, executor, browser):
+ Protocol.__init__(self, executor, browser)
+ self.webdriver_binary = executor.webdriver_binary
+ self.webdriver_args = executor.webdriver_args
+ self.capabilities = self.executor.capabilities
+ self.session_config = None
+ self.server = None
+
+ def setup(self, runner):
+ """Connect to browser via the HTTP server."""
+ try:
+ self.server = self.server_cls(
+ self.logger,
+ binary=self.webdriver_binary,
+ args=self.webdriver_args)
+ self.server.start(block=False)
+ self.logger.info(
+ "WebDriver HTTP server listening at %s" % self.server.url)
+ self.session_config = {"host": self.server.host,
+ "port": self.server.port,
+ "capabilities": self.capabilities}
+ except Exception:
+ self.logger.error(traceback.format_exc())
+ self.executor.runner.send_message("init_failed")
+ else:
+ self.executor.runner.send_message("init_succeeded")
+
+ def teardown(self):
+ if self.server is not None and self.server.is_alive:
+ self.server.stop()
+
+ @property
+ def is_alive(self):
+ """Test that the connection is still alive.
+
+ Because the remote communication happens over HTTP we need to
+ make an explicit request to the remote. It is allowed for
+ WebDriver spec tests to not have a WebDriver session, since this
+ may be what is tested.
+
+ An HTTP request to an invalid path that results in a 404 is
+ proof enough to us that the server is alive and kicking.
+ """
+ conn = httplib.HTTPConnection(self.server.host, self.server.port)
+ conn.request("HEAD", self.server.base_path + "invalid")
+ res = conn.getresponse()
+ return res.status == 404
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py
new file mode 100644
index 00000000000..3e0400de11c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorchrome.py
@@ -0,0 +1,10 @@
+from ..webdriver_server import ChromeDriverServer
+from .base import WdspecExecutor, WebDriverProtocol
+
+
+class ChromeDriverProtocol(WebDriverProtocol):
+ server_cls = ChromeDriverServer
+
+
+class ChromeDriverWdspecExecutor(WdspecExecutor):
+ protocol_cls = ChromeDriverProtocol
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorinternetexplorer.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorinternetexplorer.py
new file mode 100644
index 00000000000..898ff144593
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorinternetexplorer.py
@@ -0,0 +1,10 @@
+from ..webdriver_server import InternetExplorerDriverServer
+from .base import WdspecExecutor, WebDriverProtocol
+
+
+class InternetExplorerDriverProtocol(WebDriverProtocol):
+ server_cls = InternetExplorerDriverServer
+
+
+class InternetExplorerDriverWdspecExecutor(WdspecExecutor):
+ protocol_cls = InternetExplorerDriverProtocol
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
index 51b9f30f470..11de653ef25 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -1,15 +1,9 @@
-import hashlib
-import httplib
import os
import socket
import threading
-import time
import traceback
import urlparse
import uuid
-from collections import defaultdict
-
-from ..wpttest import WdspecResult, WdspecSubtestResult
errors = None
marionette = None
@@ -23,16 +17,17 @@ from .base import (ExecutorException,
RefTestImplementation,
TestExecutor,
TestharnessExecutor,
+ WdspecExecutor,
+ WdspecRun,
+ WebDriverProtocol,
+ extra_timeout,
testharness_result_converter,
reftest_result_converter,
- strip_server,
- WdspecExecutor)
+ strip_server)
+
from ..testrunner import Stop
from ..webdriver_server import GeckoDriverServer
-# Extra timeout to use after internal test timeout at which the harness
-# should force a timeout
-extra_timeout = 5 # seconds
def do_delayed_imports():
@@ -176,9 +171,13 @@ class MarionetteProtocol(Protocol):
if socket_timeout:
self.marionette.timeout.script = socket_timeout / 2
+ self.marionette.switch_to_window(self.runner_handle)
while True:
try:
self.marionette.execute_async_script("")
+ except errors.NoSuchWindowException:
+ # The window closed
+ break
except errors.ScriptTimeoutException:
self.logger.debug("Script timed out")
pass
@@ -186,7 +185,7 @@ class MarionetteProtocol(Protocol):
self.logger.debug("Socket closed")
break
except Exception as e:
- self.logger.error(traceback.format_exc(e))
+ self.logger.warning(traceback.format_exc(e))
break
def on_environment_change(self, old_environment, new_environment):
@@ -283,57 +282,6 @@ class MarionetteProtocol(Protocol):
self.marionette.execute_script(script)
-class RemoteMarionetteProtocol(Protocol):
- def __init__(self, executor, browser):
- do_delayed_imports()
- Protocol.__init__(self, executor, browser)
- self.webdriver_binary = executor.webdriver_binary
- self.webdriver_args = executor.webdriver_args
- self.capabilities = self.executor.capabilities
- self.session_config = None
- self.server = None
-
- def setup(self, runner):
- """Connect to browser via the Marionette HTTP server."""
- try:
- self.server = GeckoDriverServer(
- self.logger,
- binary=self.webdriver_binary,
- args=self.webdriver_args)
- self.server.start(block=False)
- self.logger.info(
- "WebDriver HTTP server listening at %s" % self.server.url)
- self.session_config = {"host": self.server.host,
- "port": self.server.port,
- "capabilities": self.capabilities}
- except Exception:
- self.logger.error(traceback.format_exc())
- self.executor.runner.send_message("init_failed")
- else:
- self.executor.runner.send_message("init_succeeded")
-
- def teardown(self):
- if self.server is not None and self.server.is_alive:
- self.server.stop()
-
- @property
- def is_alive(self):
- """Test that the Marionette connection is still alive.
-
- Because the remote communication happens over HTTP we need to
- make an explicit request to the remote. It is allowed for
- WebDriver spec tests to not have a WebDriver session, since this
- may be what is tested.
-
- An HTTP request to an invalid path that results in a 404 is
- proof enough to us that the server is alive and kicking.
- """
- conn = httplib.HTTPConnection(self.server.host, self.server.port)
- conn.request("HEAD", self.server.base_path + "invalid")
- res = conn.getresponse()
- return res.status == 404
-
-
class ExecuteAsyncScriptRun(object):
def __init__(self, logger, func, protocol, url, timeout):
self.logger = logger
@@ -375,9 +323,17 @@ class ExecuteAsyncScriptRun(object):
wait_timeout = None
flag = self.result_flag.wait(wait_timeout)
- if self.result[1] is None:
+
+ if self.result == (None, None):
self.logger.debug("Timed out waiting for a result")
self.result = False, ("EXTERNAL-TIMEOUT", None)
+ elif self.result[1] is None:
+ # We didn't get any data back from the test, so check if the
+ # browser is still responsive
+ if self.protocol.is_alive:
+ self.result = False, ("ERROR", None)
+ else:
+ self.result = False, ("CRASH", None)
return self.result
def _run(self):
@@ -467,8 +423,9 @@ class MarionetteTestharnessExecutor(TestharnessExecutor):
class MarionetteRefTestExecutor(RefTestExecutor):
def __init__(self, browser, server_config, timeout_multiplier=1,
screenshot_cache=None, close_after_done=True,
- debug_info=None, **kwargs):
-
+ debug_info=None, reftest_internal=False,
+ reftest_screenshot="unexpected",
+ group_metadata=None, **kwargs):
"""Marionette-based executor for reftests"""
RefTestExecutor.__init__(self,
browser,
@@ -477,16 +434,36 @@ class MarionetteRefTestExecutor(RefTestExecutor):
timeout_multiplier=timeout_multiplier,
debug_info=debug_info)
self.protocol = MarionetteProtocol(self, browser)
- self.implementation = RefTestImplementation(self)
+ self.implementation = (InternalRefTestImplementation
+ if reftest_internal
+ else RefTestImplementation)(self)
+ self.implementation_kwargs = ({"screenshot": reftest_screenshot} if
+ reftest_internal else {})
+
self.close_after_done = close_after_done
self.has_window = False
self.original_pref_values = {}
+ self.group_metadata = group_metadata
with open(os.path.join(here, "reftest.js")) as f:
self.script = f.read()
- with open(os.path.join(here, "reftest-wait.js")) as f:
+ with open(os.path.join(here, "reftest-wait_marionette.js")) as f:
self.wait_script = f.read()
+ def setup(self, runner):
+ super(self.__class__, self).setup(runner)
+ self.implementation.setup(**self.implementation_kwargs)
+
+ def teardown(self):
+ try:
+ self.implementation.teardown()
+ handle = self.protocol.marionette.window_handles[0]
+ self.protocol.marionette.switch_to_window(handle)
+ super(self.__class__, self).teardown()
+ except Exception as e:
+ # Ignore errors during teardown
+ self.logger.warning(traceback.format_exc(e))
+
def is_alive(self):
return self.protocol.is_alive
@@ -494,16 +471,17 @@ class MarionetteRefTestExecutor(RefTestExecutor):
self.protocol.on_environment_change(self.last_environment, new_environment)
def do_test(self, test):
- if self.close_after_done and self.has_window:
- self.protocol.marionette.close()
- self.protocol.marionette.switch_to_window(
- self.protocol.marionette.window_handles[-1])
- self.has_window = False
-
- if not self.has_window:
- self.protocol.marionette.execute_script(self.script)
- self.protocol.marionette.switch_to_window(self.protocol.marionette.window_handles[-1])
- self.has_window = True
+ if not isinstance(self.implementation, InternalRefTestImplementation):
+ if self.close_after_done and self.has_window:
+ self.protocol.marionette.close()
+ self.protocol.marionette.switch_to_window(
+ self.protocol.marionette.window_handles[-1])
+ self.has_window = False
+
+ if not self.has_window:
+ self.protocol.marionette.execute_script(self.script)
+ self.protocol.marionette.switch_to_window(self.protocol.marionette.window_handles[-1])
+ self.has_window = True
result = self.implementation.run_test(test)
return self.convert_result(test, result)
@@ -518,10 +496,10 @@ class MarionetteRefTestExecutor(RefTestExecutor):
test_url = self.test_url(test)
return ExecuteAsyncScriptRun(self.logger,
- self._screenshot,
- self.protocol,
- test_url,
- timeout).run()
+ self._screenshot,
+ self.protocol,
+ test_url,
+ timeout).run()
def _screenshot(self, marionette, url, timeout):
marionette.navigate(url)
@@ -536,86 +514,55 @@ class MarionetteRefTestExecutor(RefTestExecutor):
return screenshot
-class WdspecRun(object):
- def __init__(self, func, session, path, timeout):
- self.func = func
- self.result = (None, None)
- self.session = session
- self.path = path
- self.timeout = timeout
- self.result_flag = threading.Event()
-
- def run(self):
- """Runs function in a thread and interrupts it if it exceeds the
- given timeout. Returns (True, (Result, [SubtestResult ...])) in
- case of success, or (False, (status, extra information)) in the
- event of failure.
- """
-
- executor = threading.Thread(target=self._run)
- executor.start()
+class InternalRefTestImplementation(object):
+ def __init__(self, executor):
+ self.timeout_multiplier = executor.timeout_multiplier
+ self.executor = executor
- flag = self.result_flag.wait(self.timeout)
- if self.result[1] is None:
- self.result = False, ("EXTERNAL-TIMEOUT", None)
+ @property
+ def logger(self):
+ return self.executor.logger
+
+ def setup(self, screenshot="unexpected"):
+ data = {"screenshot": screenshot}
+ if self.executor.group_metadata is not None:
+ data["urlCount"] = {urlparse.urljoin(self.executor.server_url(key[0]), key[1]):value
+ for key, value in self.executor.group_metadata.get("url_count", {}).iteritems()
+ if value > 1}
+ self.executor.protocol.marionette.set_context(self.executor.protocol.marionette.CONTEXT_CHROME)
+ self.executor.protocol.marionette._send_message("reftest:setup", data)
+
+ def run_test(self, test):
+ viewport_size = test.viewport_size
+ dpi = test.dpi
+
+ references = self.get_references(test)
+ rv = self.executor.protocol.marionette._send_message("reftest:run",
+ {"test": self.executor.test_url(test),
+ "references": references,
+ "expected": test.expected(),
+ "timeout": test.timeout * 1000})["value"]
+ return rv
- return self.result
+ def get_references(self, node):
+ rv = []
+ for item, relation in node.references:
+ rv.append([self.executor.test_url(item), self.get_references(item), relation])
+ return rv
- def _run(self):
+ def teardown(self):
try:
- self.result = True, self.func(self.session, self.path, self.timeout)
- except (socket.timeout, IOError):
- self.result = False, ("CRASH", None)
+ self.executor.protocol.marionette._send_message("reftest:teardown", {})
+ self.executor.protocol.marionette.set_context(self.executor.protocol.marionette.CONTEXT_CONTENT)
except Exception as e:
- message = getattr(e, "message")
- if message:
- message += "\n"
- message += traceback.format_exc(e)
- self.result = False, ("ERROR", message)
- finally:
- self.result_flag.set()
+ # Ignore errors during teardown
+ self.logger.warning(traceback.traceback.format_exc(e))
-class MarionetteWdspecExecutor(WdspecExecutor):
- def __init__(self, browser, server_config, webdriver_binary,
- timeout_multiplier=1, close_after_done=True, debug_info=None,
- capabilities=None, webdriver_args=None, binary=None):
- self.do_delayed_imports()
- WdspecExecutor.__init__(self, browser, server_config,
- timeout_multiplier=timeout_multiplier,
- debug_info=debug_info)
- self.webdriver_binary = webdriver_binary
- self.webdriver_args = webdriver_args + ["--binary", binary]
- self.capabilities = capabilities
- self.protocol = RemoteMarionetteProtocol(self, browser)
- def is_alive(self):
- return self.protocol.is_alive
+class GeckoDriverProtocol(WebDriverProtocol):
+ server_cls = GeckoDriverServer
- def on_environment_change(self, new_environment):
- pass
- def do_test(self, test):
- timeout = test.timeout * self.timeout_multiplier + extra_timeout
-
- success, data = WdspecRun(self.do_wdspec,
- self.protocol.session_config,
- test.abs_path,
- timeout).run()
-
- if success:
- return self.convert_result(test, data)
-
- return (test.result_cls(*data), [])
-
- def do_wdspec(self, session_config, path, timeout):
- harness_result = ("OK", None)
- subtest_results = pytestrunner.run(path,
- self.server_config,
- session_config,
- timeout=timeout)
- return (harness_result, subtest_results)
-
- def do_delayed_imports(self):
- global pytestrunner
- from . import pytestrunner
+class MarionetteWdspecExecutor(WdspecExecutor):
+ protocol_cls = GeckoDriverProtocol
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py
index b5edbec2f6f..728d3c68222 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorselenium.py
@@ -7,14 +7,11 @@ import traceback
import urlparse
import uuid
-from .base import (ExecutorException,
- Protocol,
+from .base import (Protocol,
RefTestExecutor,
RefTestImplementation,
- TestExecutor,
TestharnessExecutor,
- testharness_result_converter,
- reftest_result_converter,
+ extra_timeout,
strip_server)
from ..testrunner import Stop
@@ -24,7 +21,6 @@ webdriver = None
exceptions = None
RemoteConnection = None
-extra_timeout = 5
def do_delayed_imports():
global webdriver
@@ -34,6 +30,7 @@ def do_delayed_imports():
from selenium.common import exceptions
from selenium.webdriver.remote.remote_connection import RemoteConnection
+
class SeleniumProtocol(Protocol):
def __init__(self, executor, browser, capabilities, **kwargs):
do_delayed_imports()
@@ -163,7 +160,8 @@ class SeleniumRun(object):
class SeleniumTestharnessExecutor(TestharnessExecutor):
def __init__(self, browser, server_config, timeout_multiplier=1,
- close_after_done=True, capabilities=None, debug_info=None):
+ close_after_done=True, capabilities=None, debug_info=None,
+ **kwargs):
"""Selenium-based executor for testharness.js tests"""
TestharnessExecutor.__init__(self, browser, server_config,
timeout_multiplier=timeout_multiplier,
@@ -202,10 +200,11 @@ class SeleniumTestharnessExecutor(TestharnessExecutor):
"timeout_multiplier": self.timeout_multiplier,
"timeout": timeout * 1000})
+
class SeleniumRefTestExecutor(RefTestExecutor):
def __init__(self, browser, server_config, timeout_multiplier=1,
screenshot_cache=None, close_after_done=True,
- debug_info=None, capabilities=None):
+ debug_info=None, capabilities=None, **kwargs):
"""Selenium WebDriver-based executor for reftests"""
RefTestExecutor.__init__(self,
browser,
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py
index 5f05500d2d3..216d687fcda 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservo.py
@@ -49,7 +49,7 @@ class ServoTestharnessExecutor(ProcessTestExecutor):
convert_result = testharness_result_converter
def __init__(self, browser, server_config, timeout_multiplier=1, debug_info=None,
- pause_after_test=False):
+ pause_after_test=False, **kwargs):
ProcessTestExecutor.__init__(self, browser, server_config,
timeout_multiplier=timeout_multiplier,
debug_info=debug_info)
@@ -179,7 +179,9 @@ class ServoRefTestExecutor(ProcessTestExecutor):
convert_result = reftest_result_converter
def __init__(self, browser, server_config, binary=None, timeout_multiplier=1,
- screenshot_cache=None, debug_info=None, pause_after_test=False):
+ screenshot_cache=None, debug_info=None, pause_after_test=False,
+ **kwargs):
+ do_delayed_imports()
ProcessTestExecutor.__init__(self,
browser,
server_config,
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py
index 8dd331c7509..af09da6f178 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/executorservodriver.py
@@ -140,7 +140,8 @@ def timeout_func(timeout):
class ServoWebDriverTestharnessExecutor(TestharnessExecutor):
def __init__(self, browser, server_config, timeout_multiplier=1,
- close_after_done=True, capabilities=None, debug_info=None):
+ close_after_done=True, capabilities=None, debug_info=None,
+ **kwargs):
TestharnessExecutor.__init__(self, browser, server_config, timeout_multiplier=1,
debug_info=None)
self.protocol = ServoWebDriverProtocol(self, browser, capabilities=capabilities)
@@ -197,7 +198,8 @@ class TimeoutError(Exception):
class ServoWebDriverRefTestExecutor(RefTestExecutor):
def __init__(self, browser, server_config, timeout_multiplier=1,
- screenshot_cache=None, capabilities=None, debug_info=None):
+ screenshot_cache=None, capabilities=None, debug_info=None,
+ **kwargs):
"""Selenium WebDriver-based executor for reftests"""
RefTestExecutor.__init__(self,
browser,
@@ -209,7 +211,7 @@ class ServoWebDriverRefTestExecutor(RefTestExecutor):
capabilities=capabilities)
self.implementation = RefTestImplementation(self)
self.timeout = None
- with open(os.path.join(here, "reftest-wait_servodriver.js")) as f:
+ with open(os.path.join(here, "reftest-wait_webdriver.js")) as f:
self.wait_script = f.read()
def is_alive(self):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py
index 3a97d40e066..043fccb1fed 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py
@@ -56,6 +56,8 @@ def run(path, server_config, session_config, timeout=0):
"--verbose", # show each individual subtest
"--capture", "no", # enable stdout/stderr from tests
"--basetemp", cache, # temporary directory
+ "-p", "no:mozlog", # use the WPT result recorder
+ "-p", "no:cacheprovider", # disable state preservation across invocations
path],
plugins=plugins)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait.js
deleted file mode 100644
index 7dd96df7803..00000000000
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait.js
+++ /dev/null
@@ -1,18 +0,0 @@
-function test(x) {
- log("classList: " + root.classList);
- if (!root.classList.contains("reftest-wait")) {
- observer.disconnect();
- marionetteScriptFinished();
- }
-}
-
-var root = document.documentElement;
-var observer = new MutationObserver(test);
-
-observer.observe(root, {attributes: true});
-
-if (document.readyState != "complete") {
- onload = test
-} else {
- test();
-}
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_marionette.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_marionette.js
new file mode 100644
index 00000000000..c226027281e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_marionette.js
@@ -0,0 +1,17 @@
+function test(x) {
+ if (!root.classList.contains("reftest-wait")) {
+ observer.disconnect();
+ marionetteScriptFinished();
+ }
+}
+
+var root = document.documentElement;
+var observer = new MutationObserver(test);
+
+observer.observe(root, {attributes: true});
+
+if (document.readyState != "complete") {
+ onload = test
+} else {
+ test();
+}
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_servodriver.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_servodriver.js
deleted file mode 100644
index 5848433b540..00000000000
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_servodriver.js
+++ /dev/null
@@ -1,15 +0,0 @@
-callback = arguments[arguments.length - 1];
-
-function check_done() {
- if (!document.documentElement.classList.contains('reftest-wait')) {
- callback();
- } else {
- setTimeout(check_done, 50);
- }
-}
-
-if (document.readyState === 'complete') {
- check_done();
-} else {
- addEventListener("load", check_done);
-}
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_webdriver.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_webdriver.js
index c3cc453bd49..c1cc649e323 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_webdriver.js
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/reftest-wait_webdriver.js
@@ -1,33 +1,44 @@
var callback = arguments[arguments.length - 1];
-function test(x) {
+function root_wait() {
if (!root.classList.contains("reftest-wait")) {
observer.disconnect();
- // As of 2017-04-05, the Chromium web browser exhibits a rendering bug
- // (https://bugs.chromium.org/p/chromium/issues/detail?id=708757) that
- // produces instability during screen capture. The following use of
- // `requestAnimationFrame` is intended as a short-term workaround, though
- // it is not guaranteed to resolve the issue.
- //
- // For further detail, see:
- // https://github.com/jugglinmike/chrome-screenshot-race/issues/1
+ if (Document.prototype.hasOwnProperty("fonts")) {
+ document.fonts.ready.then(ready_for_screenshot);
+ } else {
+ // This might take the screenshot too early, depending on whether the
+ // load event is blocked on fonts being loaded. See:
+ // https://github.com/w3c/csswg-drafts/issues/1088
+ ready_for_screenshot();
+ }
+ }
+}
+function ready_for_screenshot() {
+ // As of 2017-04-05, the Chromium web browser exhibits a rendering bug
+ // (https://bugs.chromium.org/p/chromium/issues/detail?id=708757) that
+ // produces instability during screen capture. The following use of
+ // `requestAnimationFrame` is intended as a short-term workaround, though
+ // it is not guaranteed to resolve the issue.
+ //
+ // For further detail, see:
+ // https://github.com/jugglinmike/chrome-screenshot-race/issues/1
+
+ requestAnimationFrame(function() {
requestAnimationFrame(function() {
- requestAnimationFrame(function() {
- callback();
- });
+ callback();
});
- }
+ });
}
var root = document.documentElement;
-var observer = new MutationObserver(test);
+var observer = new MutationObserver(root_wait);
observer.observe(root, {attributes: true});
if (document.readyState != "complete") {
- onload = test;
+ onload = root_wait;
} else {
- test();
+ root_wait();
}
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/testharness_marionette.js b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/testharness_marionette.js
index 1cfa85f8949..e2b70a0ad8f 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/testharness_marionette.js
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/executors/testharness_marionette.js
@@ -26,7 +26,6 @@ window.wrappedJSObject.win = window.open("%(abs_url)s", "%(window_id)s");
var timer = null;
if (%(timeout)s) {
timer = setTimeout(function() {
- log("Timeout fired");
window.wrappedJSObject.win.timeout();
}, %(timeout)s);
}
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py
new file mode 100644
index 00000000000..fdf1b1249e2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/font.py
@@ -0,0 +1,110 @@
+import ctypes
+import logging
+import os
+import platform
+
+from shutil import copy2, rmtree
+from subprocess import call
+
+HERE = os.path.split(__file__)[0]
+SYSTEM = platform.system().lower()
+
+
+class FontInstaller(object):
+ def __init__(self, font_dir=None, **fonts):
+ self.font_dir = font_dir
+ self.installed_fonts = False
+ self.created_dir = False
+ self.fonts = fonts
+
+ def __enter__(self, options=None):
+ for _, font_path in self.fonts.items():
+ font_name = font_path.split('/')[-1]
+ install = getattr(self, 'install_%s_font' % SYSTEM, None)
+ if not install:
+ logging.warning('Font installation not supported on %s',
+ SYSTEM)
+ return False
+ if install(font_name, font_path):
+ self.installed_fonts = True
+ logging.info('Installed font: %s', font_name)
+ else:
+ logging.warning('Unable to install font: %s', font_name)
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ if not self.installed_fonts:
+ return False
+
+ for _, font_path in self.fonts.items():
+ font_name = font_path.split('/')[-1]
+ remove = getattr(self, 'remove_%s_font' % SYSTEM, None)
+ if not remove:
+ logging.warning('Font removal not supported on %s', SYSTEM)
+ return False
+ if remove(font_name, font_path):
+ logging.info('Removed font: %s', font_name)
+ else:
+ logging.warning('Unable to remove font: %s', font_name)
+
+ def install_linux_font(self, font_name, font_path):
+ if not self.font_dir:
+ self.font_dir = os.path.join(os.path.expanduser('~'), '.fonts')
+ if not os.path.exists(self.font_dir):
+ os.makedirs(self.font_dir)
+ self.created_dir = True
+ if not os.path.exists(os.path.join(self.font_dir, font_name)):
+ copy2(font_path, self.font_dir)
+ try:
+ fc_cache_returncode = call('fc-cache')
+ return not fc_cache_returncode
+ except OSError: # If fontconfig doesn't exist, return False
+ logging.error('fontconfig not available on this Linux system.')
+ return False
+
+ def install_darwin_font(self, font_name, font_path):
+ if not self.font_dir:
+ self.font_dir = os.path.join(os.path.expanduser('~'),
+ 'Library/Fonts')
+ if not os.path.exists(self.font_dir):
+ os.makedirs(self.font_dir)
+ self.created_dir = True
+ if not os.path.exists(os.path.join(self.font_dir, font_name)):
+ copy2(font_path, self.font_dir)
+ return True
+
+ def install_windows_font(self, _, font_path):
+ hwnd_broadcast = 0xFFFF
+ wm_fontchange = 0x001D
+
+ gdi32 = ctypes.WinDLL('gdi32')
+ if gdi32.AddFontResourceW(font_path):
+ return bool(ctypes.windll.user32.SendMessageW(hwnd_broadcast,
+ wm_fontchange))
+
+ def remove_linux_font(self, font_name, _):
+ if self.created_dir:
+ rmtree(self.font_dir)
+ else:
+ os.remove('%s/%s' % (self.font_dir, font_name))
+ try:
+ fc_cache_returncode = call('fc-cache')
+ return not fc_cache_returncode
+ except OSError: # If fontconfig doesn't exist, return False
+ logging.error('fontconfig not available on this Linux system.')
+ return False
+
+ def remove_darwin_font(self, font_name, _):
+ if self.created_dir:
+ rmtree(self.font_dir)
+ else:
+ os.remove(os.path.join(self.font_dir, font_name))
+ return True
+
+ def remove_windows_font(self, _, font_path):
+ hwnd_broadcast = 0xFFFF
+ wm_fontchange = 0x001D
+
+ gdi32 = ctypes.WinDLL('gdi32')
+ if gdi32.RemoveFontResourceW(font_path):
+ return bool(ctypes.windll.user32.SendMessageW(hwnd_broadcast,
+ wm_fontchange))
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters.py
new file mode 100755
index 00000000000..0e888ce269d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/formatters.py
@@ -0,0 +1,54 @@
+import json
+
+from mozlog.structured.formatters.base import BaseFormatter
+
+
+class WptreportFormatter(BaseFormatter):
+ """Formatter that produces results in the format that wpreport expects."""
+
+ def __init__(self):
+ self.raw_results = {}
+
+ def suite_end(self, data):
+ results = {}
+ results["results"] = []
+ for test_name in self.raw_results:
+ result = {"test": test_name}
+ result.update(self.raw_results[test_name])
+ results["results"].append(result)
+ return json.dumps(results)
+
+ def find_or_create_test(self, data):
+ test_name = data["test"]
+ if test_name not in self.raw_results:
+ self.raw_results[test_name] = {
+ "subtests": [],
+ "status": "",
+ "message": None
+ }
+ return self.raw_results[test_name]
+
+ def create_subtest(self, data):
+ test = self.find_or_create_test(data)
+ subtest_name = data["subtest"]
+
+ subtest = {
+ "name": subtest_name,
+ "status": "",
+ "message": None
+ }
+ test["subtests"].append(subtest)
+
+ return subtest
+
+ def test_status(self, data):
+ subtest = self.create_subtest(data)
+ subtest["status"] = data["status"]
+ if "message" in data:
+ subtest["message"] = data["message"]
+
+ def test_end(self, data):
+ test = self.find_or_create_test(data)
+ test["status"] = data["status"]
+ if "message" in data:
+ test["message"] = data["message"]
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py
index 18d034e34ae..a68fdeb39bc 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/manifestinclude.py
@@ -29,6 +29,10 @@ class IncludeManifest(ManifestItem):
node = DataNode(None)
return cls(node)
+ def set_defaults(self):
+ if not self.has_key("skip"):
+ self.set("skip", "False")
+
def append(self, child):
ManifestItem.append(self, child)
self.child_map[child.name] = child
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
index 7f0e29b2190..73f266fb928 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/metadata.py
@@ -204,7 +204,7 @@ def write_new_expected(metadata_path, expected_map):
dir = os.path.split(path)[0]
if not os.path.exists(dir):
os.makedirs(dir)
- with open(path, "w") as f:
+ with open(path, "wb") as f:
f.write(manifest_str)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
index 2b2033f3d21..10f3586f143 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testloader.py
@@ -341,6 +341,7 @@ class TestFilter(object):
self.manifest = manifestinclude.get_manifest(manifest_path)
else:
self.manifest = manifestinclude.IncludeManifest.create()
+ self.manifest.set_defaults()
if include:
self.manifest.set("skip", "true")
@@ -413,7 +414,7 @@ class ManifestLoader(object):
except manifest.ManifestVersionMismatch:
manifest_file = manifest.Manifest(url_base)
- manifest_update.update(tests_path, manifest_file, True)
+ manifest_update.update(tests_path, manifest_file, True)
manifest.write(manifest_file, manifest_path)
@@ -564,74 +565,77 @@ class TestLoader(object):
class TestSource(object):
__metaclass__ = ABCMeta
- @abstractmethod
- def queue_tests(self, test_queue):
- pass
+ def __init__(self, test_queue):
+ self.test_queue = test_queue
+ self.current_group = None
+ self.current_metadata = None
@abstractmethod
- def requeue_test(self, test):
+ #@classmethod (doesn't compose with @abstractmethod)
+ def make_queue(cls, tests, **kwargs):
pass
- def __enter__(self):
- return self
-
- def __exit__(self, *args, **kwargs):
- pass
+ def group(self):
+ if not self.current_group or len(self.current_group) == 0:
+ try:
+ self.current_group, self.current_metadata = self.test_queue.get(block=False)
+ except Empty:
+ return None, None
+ return self.current_group, self.current_metadata
-class SingleTestSource(TestSource):
- def __init__(self, test_queue):
- self.test_queue = test_queue
+class GroupedSource(TestSource):
+ @classmethod
+ def new_group(cls, state, test, **kwargs):
+ raise NotImplementedError
@classmethod
- def queue_tests(cls, test_queue, test_type, tests):
- for test in tests[test_type]:
- test_queue.put(test)
+ def make_queue(cls, tests, **kwargs):
+ test_queue = Queue()
+ groups = []
- def get_queue(self):
- if self.test_queue.empty():
- return None
- return self.test_queue
+ state = {}
- def requeue_test(self, test):
- self.test_queue.put(test)
+ for test in tests:
+ if cls.new_group(state, test, **kwargs):
+ groups.append((deque(), {}))
-class PathGroupedSource(TestSource):
- def __init__(self, test_queue):
- self.test_queue = test_queue
- self.current_queue = None
-
- @classmethod
- def queue_tests(cls, test_queue, test_type, tests, depth=None):
- if depth is True:
- depth = None
+ group, metadata = groups[-1]
+ group.append(test)
+ test.update_metadata(metadata)
- prev_path = None
- group = None
+ for item in groups:
+ test_queue.put(item)
+ return test_queue
- for test in tests[test_type]:
- path = urlparse.urlsplit(test.url).path.split("/")[1:-1][:depth]
- if path != prev_path:
- group = []
- test_queue.put(group)
- prev_path = path
+class SingleTestSource(TestSource):
+ @classmethod
+ def make_queue(cls, tests, **kwargs):
+ test_queue = Queue()
+ processes = kwargs["processes"]
+ queues = [deque([]) for _ in xrange(processes)]
+ metadatas = [{} for _ in xrange(processes)]
+ for test in tests:
+ idx = hash(test.id) % processes
+ group = queues[idx]
+ metadata = metadatas[idx]
group.append(test)
+ test.update_metadata(metadata)
- def get_queue(self):
- if not self.current_queue or self.current_queue.empty():
- try:
- data = self.test_queue.get(block=True, timeout=1)
- self.current_queue = Queue()
- for item in data:
- self.current_queue.put(item)
- except Empty:
- return None
- return self.current_queue
+ for item in zip(queues, metadatas):
+ test_queue.put(item)
- def requeue_test(self, test):
- self.current_queue.put(test)
+ return test_queue
- def __exit__(self, *args, **kwargs):
- if self.current_queue:
- self.current_queue.close()
+
+class PathGroupedSource(GroupedSource):
+ @classmethod
+ def new_group(cls, state, test, **kwargs):
+ depth = kwargs.get("depth")
+ if depth is True:
+ depth = None
+ path = urlparse.urlsplit(test.url).path.split("/")[1:-1][:depth]
+ rv = path != state.get("prev_path")
+ state["prev_path"] = path
+ return rv
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py
index ee118dc9357..c4655b7fae3 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/testrunner.py
@@ -147,8 +147,6 @@ def next_manager_number():
class BrowserManager(object):
- init_lock = threading.Lock()
-
def __init__(self, logger, browser, command_queue, no_timeout=False):
self.logger = logger
self.browser = browser
@@ -173,34 +171,31 @@ class BrowserManager(object):
"""Launch the browser that is being tested,
and the TestRunner process that will run the tests."""
# It seems that this lock is helpful to prevent some race that otherwise
- # sometimes stops the spawned processes initalising correctly, and
+ # sometimes stops the spawned processes initialising correctly, and
# leaves this thread hung
if self.init_timer is not None:
self.init_timer.cancel()
self.logger.debug("Init called, starting browser and runner")
- with self.init_lock:
- # Guard against problems initialising the browser or the browser
- # remote control method
- if not self.no_timeout:
- self.init_timer = threading.Timer(self.browser.init_timeout,
- self.init_timeout)
- try:
- if self.init_timer is not None:
- self.init_timer.start()
- self.logger.debug("Starting browser with settings %r" % self.browser_settings)
- self.browser.start(**self.browser_settings)
- self.browser_pid = self.browser.pid()
- except:
- self.logger.warning("Failure during init %s" % traceback.format_exc())
- if self.init_timer is not None:
- self.init_timer.cancel()
- self.logger.error(traceback.format_exc())
- succeeded = False
- else:
- succeeded = True
- self.started = True
+ if not self.no_timeout:
+ self.init_timer = threading.Timer(self.browser.init_timeout,
+ self.init_timeout)
+ try:
+ if self.init_timer is not None:
+ self.init_timer.start()
+ self.logger.debug("Starting browser with settings %r" % self.browser_settings)
+ self.browser.start(**self.browser_settings)
+ self.browser_pid = self.browser.pid()
+ except:
+ self.logger.warning("Failure during init %s" % traceback.format_exc())
+ if self.init_timer is not None:
+ self.init_timer.cancel()
+ self.logger.error(traceback.format_exc())
+ succeeded = False
+ else:
+ succeeded = True
+ self.started = True
return succeeded
@@ -228,6 +223,9 @@ class BrowserManager(object):
self.init_timer.cancel()
self.browser.cleanup()
+ def check_for_crashes(self):
+ self.browser.check_for_crashes()
+
def log_crash(self, test_id):
self.browser.log_crash(process=self.browser_pid, test=test_id)
@@ -237,10 +235,10 @@ class BrowserManager(object):
class _RunnerManagerState(object):
before_init = namedtuple("before_init", [])
- initalizing = namedtuple("initalizing_browser",
- ["test", "test_queue", "failure_count"])
- running = namedtuple("running", ["test", "test_queue"])
- restarting = namedtuple("restarting", ["test", "test_queue"])
+ initializing = namedtuple("initializing_browser",
+ ["test", "test_group", "group_metadata", "failure_count"])
+ running = namedtuple("running", ["test", "test_group", "group_metadata"])
+ restarting = namedtuple("restarting", ["test", "test_group", "group_metadata"])
error = namedtuple("error", [])
stop = namedtuple("stop", [])
@@ -249,9 +247,7 @@ RunnerManagerState = _RunnerManagerState()
class TestRunnerManager(threading.Thread):
- init_lock = threading.Lock()
-
- def __init__(self, suite_name, tests, test_source_cls, browser_cls, browser_kwargs,
+ def __init__(self, suite_name, test_queue, test_source_cls, browser_cls, browser_kwargs,
executor_cls, executor_kwargs, stop_flag, pause_after_test=False,
pause_on_unexpected=False, restart_on_unexpected=True, debug_info=None):
"""Thread that owns a single TestRunner process and any processes required
@@ -271,9 +267,7 @@ class TestRunnerManager(threading.Thread):
"""
self.suite_name = suite_name
- self.tests = tests
- self.test_source_cls = test_source_cls
- self.test_queue = None
+ self.test_source = test_source_cls(test_queue)
self.browser_cls = browser_cls
self.browser_kwargs = browser_kwargs
@@ -281,8 +275,6 @@ class TestRunnerManager(threading.Thread):
self.executor_cls = executor_cls
self.executor_kwargs = executor_kwargs
- self.test_source = None
-
# Flags used to shut down this thread if we get a sigint
self.parent_stop_flag = stop_flag
self.child_stop_flag = multiprocessing.Event()
@@ -321,15 +313,14 @@ class TestRunnerManager(threading.Thread):
that the manager should shut down the next time the event loop
spins."""
self.logger = structuredlog.StructuredLogger(self.suite_name)
- with self.browser_cls(self.logger, **self.browser_kwargs) as browser, self.test_source_cls(self.tests) as test_source:
+ with self.browser_cls(self.logger, **self.browser_kwargs) as browser:
self.browser = BrowserManager(self.logger,
browser,
self.command_queue,
no_timeout=self.debug_info is not None)
- self.test_source = test_source
dispatch = {
RunnerManagerState.before_init: self.start_init,
- RunnerManagerState.initalizing: self.init,
+ RunnerManagerState.initializing: self.init,
RunnerManagerState.running: self.run_test,
RunnerManagerState.restarting: self.restart_runner
}
@@ -374,7 +365,7 @@ class TestRunnerManager(threading.Thread):
def wait_event(self):
dispatch = {
RunnerManagerState.before_init: {},
- RunnerManagerState.initalizing:
+ RunnerManagerState.initializing:
{
"init_succeeded": self.init_succeeded,
"init_failed": self.init_failed,
@@ -432,19 +423,18 @@ class TestRunnerManager(threading.Thread):
return
return f(*data)
-
def should_stop(self):
return self.child_stop_flag.is_set() or self.parent_stop_flag.is_set()
def start_init(self):
- test, test_queue = self.get_next_test()
+ test, test_group, group_metadata = self.get_next_test()
if test is None:
return RunnerManagerState.stop()
else:
- return RunnerManagerState.initalizing(test, test_queue, 0)
+ return RunnerManagerState.initializing(test, test_group, group_metadata, 0)
def init(self):
- assert isinstance(self.state, RunnerManagerState.initalizing)
+ assert isinstance(self.state, RunnerManagerState.initializing)
if self.state.failure_count > self.max_restarts:
self.logger.error("Max restarts exceeded")
return RunnerManagerState.error()
@@ -455,17 +445,19 @@ class TestRunnerManager(threading.Thread):
if result is Stop:
return RunnerManagerState.error()
elif not result:
- return RunnerManagerState.initalizing(self.state.test,
- self.state.test_queue,
- self.state.failure_count + 1)
+ return RunnerManagerState.initializing(self.state.test,
+ self.state.test_group,
+ self.state.group_metadata,
+ self.state.failure_count + 1)
else:
+ self.executor_kwargs["group_metadata"] = self.state.group_metadata
self.start_test_runner()
def start_test_runner(self):
# Note that we need to be careful to start the browser before the
# test runner to ensure that any state set when the browser is started
# can be passed in to the test runner.
- assert isinstance(self.state, RunnerManagerState.initalizing)
+ assert isinstance(self.state, RunnerManagerState.initializing)
assert self.command_queue is not None
assert self.remote_queue is not None
self.logger.info("Starting runner")
@@ -486,34 +478,32 @@ class TestRunnerManager(threading.Thread):
# Now we wait for either an init_succeeded event or an init_failed event
def init_succeeded(self):
- assert isinstance(self.state, RunnerManagerState.initalizing)
+ assert isinstance(self.state, RunnerManagerState.initializing)
self.browser.after_init()
return RunnerManagerState.running(self.state.test,
- self.state.test_queue)
+ self.state.test_group,
+ self.state.group_metadata)
def init_failed(self):
- assert isinstance(self.state, RunnerManagerState.initalizing)
+ assert isinstance(self.state, RunnerManagerState.initializing)
self.browser.after_init()
self.stop_runner(force=True)
- return RunnerManagerState.initalizing(self.state.test,
- self.state.test_queue,
- self.state.failure_count + 1)
+ return RunnerManagerState.initializing(self.state.test,
+ self.state.test_group,
+ self.state.group_metadata,
+ self.state.failure_count + 1)
- def get_next_test(self, test_queue=None):
+ def get_next_test(self, test_group=None):
test = None
while test is None:
- if test_queue is None:
- test_queue = self.test_source.get_queue()
- if test_queue is None:
+ while test_group is None or len(test_group) == 0:
+ test_group, group_metadata = self.test_source.group()
+ if test_group is None:
self.logger.info("No more tests")
- return None, None
- try:
- # Need to block here just to allow for contention with other processes
- test = test_queue.get(block=True, timeout=2)
- except Empty:
- if test_queue.empty():
- test_queue = None
- return test, test_queue
+ return None, None, None
+ test = test_group.popleft()
+ return test, test_group, group_metadata
+
def run_test(self):
assert isinstance(self.state, RunnerManagerState.running)
@@ -522,7 +512,8 @@ class TestRunnerManager(threading.Thread):
if self.browser.update_settings(self.state.test):
self.logger.info("Restarting browser for new test environment")
return RunnerManagerState.restarting(self.state.test,
- self.state.test_queue)
+ self.state.test_group,
+ self.state.group_metadata)
self.logger.test_start(self.state.test.id)
self.send_message("run_test", self.state.test)
@@ -560,6 +551,11 @@ class TestRunnerManager(threading.Thread):
# Write the result of the test harness
expected = test.expected()
status = file_result.status if file_result.status != "EXTERNAL-TIMEOUT" else "TIMEOUT"
+
+ if file_result.status in ("TIMEOUT", "EXTERNAL-TIMEOUT"):
+ if self.browser.check_for_crashes():
+ status = "CRASH"
+
is_unexpected = expected != status
if is_unexpected:
self.unexpected_count += 1
@@ -595,22 +591,22 @@ class TestRunnerManager(threading.Thread):
def after_test_end(self, restart):
assert isinstance(self.state, RunnerManagerState.running)
- test, test_queue = self.get_next_test()
+ test, test_group, group_metadata = self.get_next_test()
if test is None:
return RunnerManagerState.stop()
- if test_queue != self.state.test_queue:
+ if test_group != self.state.test_group:
# We are starting a new group of tests, so force a restart
restart = True
if restart:
- return RunnerManagerState.restarting(test, test_queue)
+ return RunnerManagerState.restarting(test, test_group, group_metadata)
else:
- return RunnerManagerState.running(test, test_queue)
+ return RunnerManagerState.running(test, test_group, group_metadata)
def restart_runner(self):
"""Stop and restart the TestRunner"""
assert isinstance(self.state, RunnerManagerState.restarting)
self.stop_runner()
- return RunnerManagerState.initalizing(self.state.test, self.state.test_queue, 0)
+ return RunnerManagerState.initializing(self.state.test, self.state.test_group, self.state.group_metadata, 0)
def log(self, action, kwargs):
getattr(self.logger, action)(**kwargs)
@@ -673,34 +669,16 @@ class TestRunnerManager(threading.Thread):
except Empty:
break
-class TestQueue(object):
- def __init__(self, test_source_cls, test_type, tests, **kwargs):
- self.queue = None
- self.test_source_cls = test_source_cls
- self.test_type = test_type
- self.tests = tests
- self.kwargs = kwargs
- def __enter__(self):
- if not self.tests[self.test_type]:
- return None
-
- self.queue = Queue()
- has_tests = self.test_source_cls.queue_tests(self.queue,
- self.test_type,
- self.tests,
- **self.kwargs)
- # There is a race condition that means sometimes we continue
- # before the tests have been written to the underlying pipe.
- # Polling the pipe for data here avoids that
- self.queue._reader.poll(10)
- assert not self.queue.empty()
- return self.queue
-
- def __exit__(self, *args, **kwargs):
- if self.queue is not None:
- self.queue.close()
- self.queue = None
+def make_test_queue(tests, test_source_cls, **test_source_kwargs):
+ queue = test_source_cls.make_queue(tests, **test_source_kwargs)
+
+ # There is a race condition that means sometimes we continue
+ # before the tests have been written to the underlying pipe.
+ # Polling the pipe for data here avoids that
+ queue._reader.poll(10)
+ assert not queue.empty()
+ return queue
class ManagerGroup(object):
@@ -730,7 +708,6 @@ class ManagerGroup(object):
# of sigint
self.stop_flag = threading.Event()
self.logger = structuredlog.StructuredLogger(suite_name)
- self.test_queue = None
def __enter__(self):
return self
@@ -741,31 +718,29 @@ class ManagerGroup(object):
def run(self, test_type, tests):
"""Start all managers in the group"""
self.logger.debug("Using %i processes" % self.size)
+ type_tests = tests[test_type]
+ if not type_tests:
+ self.logger.info("No %s tests to run" % test_type)
+ return
- self.test_queue = TestQueue(self.test_source_cls,
- test_type,
- tests,
- **self.test_source_kwargs)
- with self.test_queue as test_queue:
- if test_queue is None:
- self.logger.info("No %s tests to run" % test_type)
- return
- for _ in range(self.size):
- manager = TestRunnerManager(self.suite_name,
- test_queue,
- self.test_source_cls,
- self.browser_cls,
- self.browser_kwargs,
- self.executor_cls,
- self.executor_kwargs,
- self.stop_flag,
- self.pause_after_test,
- self.pause_on_unexpected,
- self.restart_on_unexpected,
- self.debug_info)
- manager.start()
- self.pool.add(manager)
- self.wait()
+ test_queue = make_test_queue(type_tests, self.test_source_cls, **self.test_source_kwargs)
+
+ for _ in range(self.size):
+ manager = TestRunnerManager(self.suite_name,
+ test_queue,
+ self.test_source_cls,
+ self.browser_cls,
+ self.browser_kwargs,
+ self.executor_cls,
+ self.executor_kwargs,
+ self.stop_flag,
+ self.pause_after_test,
+ self.pause_on_unexpected,
+ self.restart_on_unexpected,
+ self.debug_info)
+ manager.start()
+ self.pool.add(manager)
+ self.wait()
def is_alive(self):
"""Boolean indicating whether any manager in the group is still alive"""
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py
index 0d967b051fd..556b2b7f3fa 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/tests/test_testloader.py
@@ -18,6 +18,7 @@ skip: true
skip: false
"""
+
def test_filter_unicode():
tests = make_mock_manifest(("test", "a", 10), ("test", "a/b", 10),
("test", "c", 10))
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/metadata.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/metadata.py
index f596766578c..5f6925e7fa9 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/metadata.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/metadata.py
@@ -40,7 +40,7 @@ class CreateMetadataPatch(Step):
"""Create a patch/commit for the metadata checkout"""
def create(self, state):
- if state.no_patch:
+ if not state.patch:
return
local_tree = state.local_tree
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/sync.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/sync.py
index fb7948874c4..b201fe7f167 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/sync.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/sync.py
@@ -169,7 +169,7 @@ class CreateSyncPatch(Step):
"""Add the updated test files to a commit/patch in the local tree."""
def create(self, state):
- if state.no_patch:
+ if not state.patch:
return
local_tree = state.local_tree
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py
index 4c0099e63bb..3d7d772084b 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/update/update.py
@@ -30,7 +30,7 @@ class LoadConfig(Step):
state.tests_path = state.paths["/"]["tests_path"]
state.metadata_path = state.paths["/"]["metadata_path"]
- assert state.tests_path.startswith("/")
+ assert os.path.isabs(state.tests_path)
class LoadTrees(Step):
@@ -71,7 +71,7 @@ class SyncFromUpstream(Step):
with state.push(["sync", "paths", "metadata_path", "tests_path", "local_tree",
"sync_tree"]):
state.target_rev = kwargs["rev"]
- state.no_patch = kwargs["no_patch"]
+ state.patch = kwargs["patch"]
state.suite_name = kwargs["suite_name"]
state.path_excludes = kwargs["exclude"]
state.path_includes = kwargs["include"]
@@ -90,7 +90,7 @@ class UpdateMetadata(Step):
with state.push(["local_tree", "sync_tree", "paths", "serve_root"]):
state.run_log = kwargs["run_log"]
state.ignore_existing = kwargs["ignore_existing"]
- state.no_patch = kwargs["no_patch"]
+ state.patch = kwargs["patch"]
state.suite_name = kwargs["suite_name"]
state.product = kwargs["product"]
state.config = kwargs["config"]
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/webdriver_server.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/webdriver_server.py
index 49d9c73b52e..f78593e4e59 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/webdriver_server.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/webdriver_server.py
@@ -12,8 +12,8 @@ import mozprocess
__all__ = ["SeleniumServer", "ChromeDriverServer",
- "GeckoDriverServer", "ServoDriverServer",
- "WebDriverServer"]
+ "GeckoDriverServer", "InternetExplorerDriverServer",
+ "ServoDriverServer", "WebDriverServer"]
class WebDriverServer(object):
@@ -125,7 +125,7 @@ class SeleniumServer(WebDriverServer):
class ChromeDriverServer(WebDriverServer):
- default_base_path = "/wd/hub"
+ default_base_path = "/"
def __init__(self, logger, binary="chromedriver", port=None,
base_path="", args=None):
@@ -149,6 +149,17 @@ class EdgeDriverServer(WebDriverServer):
"--port=%s" % str(self.port)] + self._args
+class InternetExplorerDriverServer(WebDriverServer):
+ def __init__(self, logger, binary="IEDriverServer.exe", port=None,
+ base_path="", host="localhost", args=None):
+ WebDriverServer.__init__(
+ self, logger, binary, host=host, port=port, args=args)
+
+ def make_command(self):
+ return [self.binary,
+ "--port=%s" % str(self.port)] + self._args
+
+
class GeckoDriverServer(WebDriverServer):
def __init__(self, logger, marionette_port=2828, binary="geckodriver",
host="127.0.0.1", port=None, args=None):
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
index 65a09d5c53b..7901c3d567e 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptcommandline.py
@@ -7,6 +7,7 @@ from distutils.spawn import find_executable
import config
import wpttest
+import formatters
def abs_path(path):
@@ -46,8 +47,10 @@ def create_parser(product_choices=None):
TEST is either the full path to a test file to run, or the URL of a test excluding
scheme host and port.""")
- parser.add_argument("--manifest-update", action="store_true", default=False,
+ parser.add_argument("--manifest-update", action="store_true", default=None,
help="Regenerate the test manifest.")
+ parser.add_argument("--no-manifest-update", action="store_false", dest="manifest_update",
+ help="Prevent regeneration of the test manifest.")
parser.add_argument("--timeout-multiplier", action="store", type=float, default=None,
help="Multiplier relative to standard test timeout to use")
@@ -68,6 +71,9 @@ scheme host and port.""")
mode_group.add_argument("--list-disabled", action="store_true",
default=False,
help="List the tests that are disabled on the current platform")
+ mode_group.add_argument("--list-tests", action="store_true",
+ default=False,
+ help="List all tests that will run")
test_selection_group = parser.add_argument_group("Test Selection")
test_selection_group.add_argument("--test-types", action="store",
@@ -132,6 +138,11 @@ scheme host and port.""")
default=None, help="Browser against which to run tests")
config_group.add_argument("--config", action="store", type=abs_path, dest="config",
help="Path to config file")
+ config_group.add_argument("--install-fonts", action="store_true",
+ default=None,
+ help="Allow the wptrunner to install fonts on your system")
+ config_group.add_argument("--font-dir", action="store", type=abs_path, dest="font_dir",
+ help="Path to local font installation directory", default=None)
build_type = parser.add_mutually_exclusive_group()
build_type.add_argument("--debug-build", dest="debug", action="store_true",
@@ -179,6 +190,15 @@ scheme host and port.""")
help="Defines an extra user preference (overrides those in prefs_root)")
gecko_group.add_argument("--leak-check", dest="leak_check", action="store_true",
help="Enable leak checking")
+ gecko_group.add_argument("--stylo-threads", action="store", type=int, default=1,
+ help="Number of parallel threads to use for stylo")
+ gecko_group.add_argument("--reftest-internal", dest="reftest_internal", action="store_true",
+ default=None, help="Enable reftest runner implemented inside Marionette")
+ gecko_group.add_argument("--reftest-external", dest="reftest_internal", action="store_false",
+ help="Disable reftest runner implemented inside Marionette")
+ gecko_group.add_argument("--reftest-screenshot", dest="reftest_screenshot", action="store",
+ choices=["always", "fail", "unexpected"], default="unexpected",
+ help="With --reftest-internal, when to take a screenshot")
servo_group = parser.add_argument_group("Servo-specific")
servo_group.add_argument("--user-stylesheet",
@@ -211,6 +231,8 @@ scheme host and port.""")
help="List of URLs for tests to run, or paths including tests to run. "
"(equivalent to --include)")
+ commandline.log_formatters["wptreport"] = (formatters.WptreportFormatter, "wptreport format")
+
commandline.add_logging_group(parser)
return parser
@@ -386,6 +408,10 @@ def check_args(kwargs):
kwargs['extra_prefs'] = [tuple(prefarg.split('=', 1)) for prefarg in
kwargs['extra_prefs']]
+ if kwargs["reftest_internal"] is None:
+ # Default to the internal reftest implementation on Linux and OSX
+ kwargs["reftest_internal"] = sys.platform.startswith("linux") or sys.platform.startswith("darwin")
+
return kwargs
@@ -394,6 +420,15 @@ def check_args_update(kwargs):
if kwargs["product"] is None:
kwargs["product"] = "firefox"
+ if kwargs["patch"] is None:
+ kwargs["patch"] = kwargs["sync"]
+
+ for item in kwargs["run_log"]:
+ if os.path.isdir(item):
+ print >> sys.stderr, "Log file %s is a directory" % item
+ sys.exit(1)
+
+ return kwargs
def create_parser_update(product_choices=None):
@@ -421,10 +456,12 @@ def create_parser_update(product_choices=None):
parser.add_argument("--branch", action="store", type=abs_path,
help="Remote branch to sync against")
parser.add_argument("--rev", action="store", help="Revision to sync to")
- parser.add_argument("--no-patch", action="store_true",
- help="Don't create an mq patch or git commit containing the changes.")
+ parser.add_argument("--patch", action="store_true", dest="patch", default=None,
+ help="Create a VCS commit containing the changes.")
+ parser.add_argument("--no-patch", action="store_false", dest="patch",
+ help="Don't create a VCS commit containing the changes.")
parser.add_argument("--sync", dest="sync", action="store_true", default=False,
- help="Sync the tests with the latest from upstream")
+ help="Sync the tests with the latest from upstream (implies --patch)")
parser.add_argument("--ignore-existing", action="store_true", help="When updating test results only consider results from the logfiles provided, not existing expectations.")
parser.add_argument("--continue", action="store_true", help="Continue a previously started run of the update script")
parser.add_argument("--abort", action="store_true", help="Clear state from a previous incomplete run of the update script")
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
index f0f4ecf335f..629d01d7158 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
@@ -61,6 +61,8 @@ class Compiler(NodeVisitor):
self.tree = tree
self.output_node = self._initial_output_node(tree, **kwargs)
self.visit(tree)
+ if hasattr(self.output_node, "set_defaults"):
+ self.output_node.set_defaults()
assert self.output_node is not None
return self.output_node
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/static.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/static.py
index b2b9fbe9429..b3cbedc3818 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/static.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptmanifest/backends/static.py
@@ -139,6 +139,9 @@ class ManifestItem(object):
rv.extend(" %s" % line for line in str(item).split("\n"))
return "\n".join(rv)
+ def set_defaults(self):
+ pass
+
@property
def is_empty(self):
if self._data:
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
index 65e5d7f7e0c..9855ecc672c 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wptrunner.py
@@ -10,6 +10,7 @@ import testloader
import wptcommandline
import wptlogging
import wpttest
+from font import FontInstaller
from testrunner import ManagerGroup
from browsers.base import NullBrowser
@@ -73,8 +74,10 @@ def list_test_groups(test_paths, product, **kwargs):
ssl_env = env.ssl_env(logger, **kwargs)
+ run_info_extras = products.load_product(kwargs["config"], product)[-1](**kwargs)
+
run_info, test_loader = get_loader(test_paths, product, ssl_env,
- **kwargs)
+ run_info_extras=run_info_extras, **kwargs)
for item in sorted(test_loader.groups(kwargs["test_types"])):
print item
@@ -85,10 +88,12 @@ def list_disabled(test_paths, product, **kwargs):
rv = []
+ run_info_extras = products.load_product(kwargs["config"], product)[-1](**kwargs)
+
ssl_env = env.ssl_env(logger, **kwargs)
run_info, test_loader = get_loader(test_paths, product, ssl_env,
- **kwargs)
+ run_info_extras=run_info_extras, **kwargs)
for test_type, tests in test_loader.disabled_tests.iteritems():
for test in tests:
@@ -96,6 +101,22 @@ def list_disabled(test_paths, product, **kwargs):
print json.dumps(rv, indent=2)
+def list_tests(test_paths, product, **kwargs):
+ env.do_delayed_imports(logger, test_paths)
+
+ rv = []
+
+ ssl_env = env.ssl_env(logger, **kwargs)
+
+ run_info_extras = products.load_product(kwargs["config"], product)[-1](**kwargs)
+
+ run_info, test_loader = get_loader(test_paths, product, ssl_env,
+ run_info_extras=run_info_extras, **kwargs)
+
+ for test in test_loader.test_ids:
+ print test
+
+
def get_pause_after_test(test_loader, **kwargs):
total_tests = sum(len(item) for item in test_loader.tests.itervalues())
if kwargs["pause_after_test"] is None:
@@ -121,6 +142,12 @@ def run_tests(config, test_paths, product, **kwargs):
check_args(**kwargs)
+ if kwargs["install_fonts"]:
+ env_extras.append(FontInstaller(
+ font_dir=kwargs["font_dir"],
+ ahem=os.path.join(kwargs["tests_root"], "fonts/Ahem.ttf")
+ ))
+
if "test_loader" in kwargs:
run_info = wpttest.get_run_info(kwargs["run_info"], product, debug=None,
extras=run_info_extras(**kwargs))
@@ -132,13 +159,13 @@ def run_tests(config, test_paths, product, **kwargs):
run_info_extras=run_info_extras(**kwargs),
**kwargs)
+ test_source_kwargs = {"processes": kwargs["processes"]}
if kwargs["run_by_dir"] is False:
test_source_cls = testloader.SingleTestSource
- test_source_kwargs = {}
else:
# A value of None indicates infinite depth
test_source_cls = testloader.PathGroupedSource
- test_source_kwargs = {"depth": kwargs["run_by_dir"]}
+ test_source_kwargs["depth"] = kwargs["run_by_dir"]
logger.info("Using %i client processes" % kwargs["processes"])
@@ -231,7 +258,6 @@ def run_tests(config, test_paths, product, **kwargs):
if repeat_until_unexpected and unexpected_total > 0:
break
logger.suite_end()
-
return unexpected_total == 0
def start(**kwargs):
@@ -239,6 +265,8 @@ def start(**kwargs):
list_test_groups(**kwargs)
elif kwargs["list_disabled"]:
list_disabled(**kwargs)
+ elif kwargs["list_tests"]:
+ list_tests(**kwargs)
else:
return not run_tests(**kwargs)
diff --git a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
index 12701f61117..86320f8ff84 100644
--- a/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
+++ b/tests/wpt/web-platform-tests/tools/wptrunner/wptrunner/wpttest.py
@@ -1,6 +1,5 @@
import os
-
-import mozinfo
+from collections import defaultdict
from wptmanifest.parser import atoms
@@ -66,6 +65,8 @@ def get_run_info(metadata_root, product, **kwargs):
class RunInfo(dict):
def __init__(self, metadata_root, product, debug, extras=None):
+ import mozinfo
+
self._update_mozinfo(metadata_root)
self.update(mozinfo.info)
self["product"] = product
@@ -74,12 +75,20 @@ class RunInfo(dict):
elif "debug" not in self:
# Default to release
self["debug"] = False
+ if product == "firefox" and "stylo" not in self:
+ self["stylo"] = False
+ if "STYLO_FORCE_ENABLED" in os.environ:
+ self["stylo"] = True
+ if "STYLO_FORCE_DISABLED" in os.environ:
+ self["stylo"] = False
if extras is not None:
self.update(extras)
def _update_mozinfo(self, metadata_root):
"""Add extra build information from a mozinfo.json file in a parent
directory"""
+ import mozinfo
+
path = metadata_root
dirs = set()
while path != os.path.expanduser('~'):
@@ -113,6 +122,11 @@ class Test(object):
def __eq__(self, other):
return self.id == other.id
+ def update_metadata(self, metadata=None):
+ if metadata is None:
+ metadata = {}
+ return metadata
+
@classmethod
def from_manifest(cls, manifest_item, inherit_metadata, test_metadata):
timeout = cls.long_timeout if manifest_item.timeout == "long" else cls.default_timeout
@@ -320,6 +334,17 @@ class ReftestTest(Test):
return node
+ def update_metadata(self, metadata):
+ if not "url_count" in metadata:
+ metadata["url_count"] = defaultdict(int)
+ for reference, _ in self.references:
+ # We assume a naive implementation in which a url with multiple
+ # possible screenshots will need to take both the lhs and rhs screenshots
+ # for each possible match
+ metadata["url_count"][(self.environment["protocol"], reference.url)] += 1
+ reference.update_metadata(metadata)
+ return metadata
+
@property
def id(self):
return self.url
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 67119d2cfbd..b9bcb3a4e6c 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
@@ -282,10 +282,10 @@ class TestDirectoryHandler(TestUsingServer):
assert resp.info()["Content-Type"] == "text/html"
def test_subdirectory_no_trailing_slash(self):
- with pytest.raises(HTTPError) as cm:
- self.request("/subdir")
-
- assert cm.value.code == 404
+ # This seems to resolve the 301 transparently, so test for 200
+ resp = self.request("/subdir")
+ assert resp.getcode() == 200
+ assert resp.info()["Content-Type"] == "text/html"
class TestAsIsHandler(TestUsingServer):
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py
index f0ce3c0259c..31f361cc23b 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/handlers.py
@@ -58,7 +58,9 @@ class DirectoryHandler(object):
url_path = request.url_parts.path
if not url_path.endswith("/"):
- raise HTTPException(404)
+ response.status = 301
+ response.headers = [("Location", "%s/" % request.url)]
+ return
path = filesystem_path(self.base_path, request, self.url_base)
diff --git a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py
index 6c073feea9e..50ff00dde94 100644
--- a/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py
+++ b/tests/wpt/web-platform-tests/tools/wptserve/wptserve/response.py
@@ -465,9 +465,11 @@ class ResponseWriter(object):
raise ValueError
def flush(self):
- """Flush the output."""
+ """Flush the output. Returns False if the flush failed due to
+ the socket being closed by the remote end."""
try:
self._wfile.flush()
+ return True
except socket.error:
# This can happen if the socket got closed by the remote end
- pass
+ return False
diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedHTML.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedHTML.tentative.html
new file mode 100644
index 00000000000..2a28f1bf02a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/TrustedHTML.tentative.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js"></script>
+<script>
+ test(t => {
+ var html = TrustedHTML.escape(STRINGS.unescapedHTML);
+
+ assert_equals(html.toString(), STRINGS.escapedHTML);
+ }, "Basic escaping.");
+
+ test(t => {
+ var html = TrustedHTML.unsafelyCreate(STRINGS.unescapedHTML);
+
+ assert_equals(html.toString(), STRINGS.unescapedHTML);
+ }, "Basic unsafe construction.");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedScriptURL.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedScriptURL.tentative.html
new file mode 100644
index 00000000000..39a920a0215
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/TrustedScriptURL.tentative.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js"></script>
+<script>
+ test(t => {
+ var url = TrustedScriptURL.unsafelyCreate(URLS.safe);
+
+ assert_equals(url.toString(), URLS.safe);
+ }, "Basic processing: safe URL, unsafe construction.");
+
+ test(t => {
+ var url = TrustedScriptURL.unsafelyCreate(URLS.javascript);
+
+ assert_equals(url.toString(), URLS.javascript);
+ }, "Basic processing: javascript URL, unsafe construction.");
+
+ test(t => {
+ var url = TrustedScriptURL.unsafelyCreate(URLS.external);
+
+ assert_equals(url.toString(), URLS.external);
+ }, "Basic processing: external protocol URL, unsafe construction.");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/TrustedURL.tentative.html b/tests/wpt/web-platform-tests/trusted-types/TrustedURL.tentative.html
new file mode 100644
index 00000000000..599a0c69ba8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/TrustedURL.tentative.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js"></script>
+<script>
+ test(t => {
+ var url = TrustedURL.create(URLS.safe);
+
+ assert_equals(url.toString(), URLS.safe);
+ }, "Basic processing: safe URL, safe construction.");
+
+ test(t => {
+ var url = TrustedURL.unsafelyCreate(URLS.safe);
+
+ assert_equals(url.toString(), URLS.safe);
+ }, "Basic processing: safe URL, unsafe construction.");
+
+ test(t => {
+ var url = TrustedURL.create(URLS.javascript);
+
+ assert_equals(url.toString(), URLS.sanitized);
+ }, "Basic processing: javascript URL, safe construction.");
+
+ test(t => {
+ var url = TrustedURL.unsafelyCreate(URLS.javascript);
+
+ assert_equals(url.toString(), URLS.javascript);
+ }, "Basic processing: javascript URL, unsafe construction.");
+
+ test(t => {
+ var url = TrustedURL.create(URLS.external);
+
+ assert_equals(url.toString(), URLS.sanitized);
+ }, "Basic processing: external protocol URL, safe construction.");
+
+ test(t => {
+ var url = TrustedURL.unsafelyCreate(URLS.external);
+
+ assert_equals(url.toString(), URLS.external);
+ }, "Basic processing: external protocol URL, unsafe construction.");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-innerHTML.tentative.html b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-innerHTML.tentative.html
new file mode 100644
index 00000000000..698bf9dc494
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-innerHTML.tentative.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="./support/helper.js"></script>
+
+ <meta http-equiv="Content-Security-Policy" content="require-trusted-types">
+</head>
+<body>
+<script>
+ // String assignments throw.
+ test(t => {
+ var d = document.createElement('div');
+ assert_throws(new TypeError(), _ => {
+ d.innerHTML = "Fail.";
+ });
+ }, "`innerHTML = string` throws.");
+
+ // TrustedHTML assignments work.
+ test(t => {
+ var html = TrustedHTML.escape(STRINGS.unescapedHTML);
+ var d = document.createElement('div');
+ d.innerHTML = html;
+ assert_equals(d.innerText, STRINGS.unescapedHTML);
+ }, "innerHTML = TrustedHTML.escape().");
+
+ test(t => {
+ var html = TrustedHTML.unsafelyCreate(STRINGS.unescapedHTML);
+ var d = document.createElement('div');
+ d.innerHTML = html;
+ assert_equals(d.innerText, STRINGS.unescapedText);
+ }, "innerHTML = TrustedHTML.unsafelyCreate().");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-insertAdjacentHTML.tentative.html b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-insertAdjacentHTML.tentative.html
new file mode 100644
index 00000000000..5b3bea85c16
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-insertAdjacentHTML.tentative.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="./support/helper.js"></script>
+
+ <meta http-equiv="Content-Security-Policy" content="require-trusted-types">
+</head>
+<body>
+<div id="container"></div>
+<script>
+ var container = document.querySelector('#container');
+
+ // String assignments throw.
+ test(t => {
+ var d = document.createElement('div');
+ container.appendChild(d);
+
+ assert_throws(new TypeError(), _ => {
+ d.insertAdjacentHTML('beforebegin', "<p>Fail</p>");
+ });
+ assert_throws(new TypeError(), _ => {
+ d.insertAdjacentHTML('afterbegin', "<p>Fail</p>");
+ });
+ assert_throws(new TypeError(), _ => {
+ d.insertAdjacentHTML('beforeend', "<p>Fail</p>");
+ });
+ assert_throws(new TypeError(), _ => {
+ d.insertAdjacentHTML('afterend', "<p>Fail</p>");
+ });
+
+ assert_equals(d.previousSibling, null);
+ assert_equals(d.firstChild, null);
+ assert_equals(d.lastChild, null);
+ assert_equals(d.nextSibling, null);
+ }, "`insertAdjacentHTML(string)` throws.");
+
+ // TrustedHTML assignments work.
+ test(t => {
+ var html = TrustedHTML.escape(STRINGS.unescapedHTML);
+
+ var d = document.createElement('div');
+ container.appendChild(d);
+
+ d.insertAdjacentHTML('beforebegin', html);
+ assert_equals(d.previousSibling.nodeType, Node.TEXT_NODE);
+ assert_equals(d.previousSibling.data, STRINGS.unescapedHTML);
+
+ d.insertAdjacentHTML('afterbegin', html);
+ assert_equals(d.firstChild.nodeType, Node.TEXT_NODE);
+ assert_equals(d.firstChild.data, STRINGS.unescapedHTML);
+
+ d.insertAdjacentHTML('beforeend', html);
+ assert_equals(d.lastChild.nodeType, Node.TEXT_NODE);
+ assert_equals(d.lastChild.data, STRINGS.unescapedHTML);
+
+ d.insertAdjacentHTML('afterend', html);
+ assert_equals(d.nextSibling.nodeType, Node.TEXT_NODE);
+ assert_equals(d.nextSibling.data, STRINGS.unescapedHTML);
+
+ while (container.firstChild)
+ container.firstChild.remove();
+ }, "insertAdjacentHTML = TrustedHTML.escape().");
+
+ test(t => {
+ var html = TrustedHTML.unsafelyCreate(STRINGS.unescapedHTML);
+
+ var d = document.createElement('div');
+ container.appendChild(d);
+
+ d.insertAdjacentHTML('beforebegin', html);
+ assert_equals(d.previousSibling.nodeType, Node.TEXT_NODE);
+ assert_equals(d.previousSibling.data, STRINGS.unescapedText);
+
+ d.insertAdjacentHTML('afterbegin', html);
+ assert_equals(d.firstChild.nodeType, Node.TEXT_NODE);
+ assert_equals(d.firstChild.data, STRINGS.unescapedText);
+
+ d.insertAdjacentHTML('beforeend', html);
+ assert_equals(d.lastChild.nodeType, Node.TEXT_NODE);
+ assert_equals(d.lastChild.data, STRINGS.unescapedText);
+
+ d.insertAdjacentHTML('afterend', html);
+ assert_equals(d.nextSibling.nodeType, Node.TEXT_NODE);
+ assert_equals(d.nextSibling.data, STRINGS.unescapedText);
+
+ while (container.firstChild)
+ container.firstChild.remove();
+ }, "insertAdjacentHTML = TrustedHTML.unsafelyCreate().");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-location-href.tentative.html b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-location-href.tentative.html
new file mode 100644
index 00000000000..6581ac29f5d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-location-href.tentative.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="./support/helper.js"></script>
+
+ <meta http-equiv="Content-Security-Policy" content="require-trusted-types">
+</head>
+<body>
+<script>
+ // String assignments throw.
+ promise_test(t => {
+ return promise_rejects(t, new TypeError(), createFrameAndHref("about:blank"));
+ }, "`location.href = string` throws");
+
+ // TrustedURL assignments work.
+ promise_test(t => {
+ var url = TrustedURL.create(URLS.safe);
+ return createFrameAndHref(url);
+ }, "Basic processing: safe URL, safe construction.");
+
+ promise_test(t => {
+ var url = TrustedURL.unsafelyCreate(URLS.safe);
+ return createFrameAndHref(url);
+ }, "Basic processing: safe URL, unsafe construction.");
+
+ promise_test(t => {
+ var url = TrustedURL.create(URLS.javascript);
+ return createFrameAndHref(url).then(i => {
+ assert_equals(i.contentDocument.body.innerText, "");
+ });
+ }, "Basic processing: javascript URL, safe construction.");
+
+ promise_test(t => {
+ var url = TrustedURL.unsafelyCreate(URLS.javascript);
+ return createFrameAndHref(url).then(i => {
+ assert_equals(i.contentDocument.body.innerText, "scripted");
+ });
+ }, "Basic processing: javascript URL, unsafe construction.");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-outerHTML.tentative.html b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-outerHTML.tentative.html
new file mode 100644
index 00000000000..0e420e5b78c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-outerHTML.tentative.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="./support/helper.js"></script>
+
+ <meta http-equiv="Content-Security-Policy" content="require-trusted-types">
+</head>
+<body>
+<div id="container"></div>
+<script>
+ var container = document.querySelector('#container')
+
+ // String assignments throw.
+ test(t => {
+ var d = document.createElement('div');
+ container.appendChild(d);
+ assert_throws(new TypeError(), _ => {
+ d.outerHTML = "Fail.";
+ });
+ assert_equals(container.innerText, "");
+ while (container.firstChild)
+ container.firstChild.remove();
+ }, "`outerHTML = string` throws.");
+
+ // TrustedHTML assignments work.
+ test(t => {
+ var html = TrustedHTML.escape(STRINGS.unescapedHTML);
+
+ var d = document.createElement('div');
+ document.querySelector('#container').appendChild(d);
+ d.outerHTML = html;
+ assert_equals(container.innerText, STRINGS.unescapedHTML);
+
+ while (container.firstChild)
+ container.firstChild.remove();
+ }, "outerHTML = TrustedHTML.escape().");
+
+ test(t => {
+ var html = TrustedHTML.unsafelyCreate(STRINGS.unescapedHTML);
+
+ var d = document.createElement('div');
+ container.appendChild(d);
+ d.outerHTML = html;
+ assert_equals(container.innerText, STRINGS.unescapedText);
+
+ while (container.firstChild)
+ container.firstChild.remove();
+ }, "outerHTML = TrustedHTML.unsafelyCreate().");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-script-src.tentative.html b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-script-src.tentative.html
new file mode 100644
index 00000000000..e0d2bc7e6d8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/block-string-assignment-to-script-src.tentative.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="./support/helper.js"></script>
+
+ <meta http-equiv="Content-Security-Policy" content="require-trusted-types">
+</head>
+<body>
+<script>
+ // String assignments throw.
+ test(t => {
+ var s = document.createElement('script');
+ assert_throws(new TypeError(), _ => {
+ s.src = URLS.safe;
+ });
+ assert_equals('', s.src);
+ }, "'string'");
+
+ // TrustedURL assignments throw.
+ test(t => {
+ var url = TrustedURL.unsafelyCreate(URLS.safe);
+
+ var s = document.createElement('script');
+ assert_throws(new TypeError(), _ => {
+ s.src = url;
+ });
+ assert_equals('', s.src);
+ }, "TrustedURL(safe)");
+
+ // TrustedScriptURL assignments work.
+ test(t => {
+ var url = TrustedScriptURL.unsafelyCreate(URLS.safe);
+
+ var s = document.createElement('script');
+ s.src = url;
+ assert_equals(url + '', s.src);
+ }, "TrustedScriptURL(safe)");
+
+ test(t => {
+ var url = TrustedScriptURL.unsafelyCreate(URLS.javascript);
+
+ var s = document.createElement('script');
+ s.src = url;
+ assert_equals(url + '', s.src);
+ }, "TrustedScriptURL(javascript)");
+
+ test(t => {
+ var url = TrustedScriptURL.unsafelyCreate(URLS.external);
+
+ var s = document.createElement('script');
+ s.src = url;
+ assert_equals(url + '', s.src);
+ }, "TrustedScriptURL(external)");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/document-write.tentative.html b/tests/wpt/web-platform-tests/trusted-types/document-write.tentative.html
new file mode 100644
index 00000000000..0934db94c16
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/document-write.tentative.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js"></script>
+<body>
+<script>
+ promise_test(t => {
+ var html = TrustedHTML.escape(STRINGS.unescapedHTML);
+ return createFrameAndWrite(html).then(i => {
+ assert_equals(i.contentDocument.body.innerText, STRINGS.unescapedHTML, "innerText");
+ i.remove();
+ });
+ }, "document.write(TrustedHTML).");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/innerHTML.tentative.html b/tests/wpt/web-platform-tests/trusted-types/innerHTML.tentative.html
new file mode 100644
index 00000000000..6a72dfae458
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/innerHTML.tentative.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js"></script>
+<body>
+<script>
+ test(t => {
+ var html = TrustedHTML.escape(STRINGS.unescapedHTML);
+
+ var d = document.createElement('div');
+ d.innerHTML = html;
+ assert_equals(d.innerText, STRINGS.unescapedHTML);
+ }, "innerHTML = TrustedHTML.escape().");
+
+ test(t => {
+ var html = TrustedHTML.unsafelyCreate(STRINGS.unescapedHTML);
+
+ var d = document.createElement('div');
+ d.innerHTML = html;
+ assert_equals(d.innerText, STRINGS.unescapedText);
+ }, "innerHTML = TrustedHTML.unsafelyCreate().");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/insertAdjacentHTML.tentative.html b/tests/wpt/web-platform-tests/trusted-types/insertAdjacentHTML.tentative.html
new file mode 100644
index 00000000000..5341f3b0bec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/insertAdjacentHTML.tentative.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js"></script>
+<body>
+<div id="container"></div>
+<script>
+ var container = document.querySelector('#container');
+
+ test(t => {
+ var html = TrustedHTML.escape(STRINGS.unescapedHTML);
+
+ var d = document.createElement('div');
+ container.appendChild(d);
+
+ d.insertAdjacentHTML('beforebegin', html);
+ assert_equals(d.previousSibling.nodeType, Node.TEXT_NODE);
+ assert_equals(d.previousSibling.data, STRINGS.unescapedHTML);
+
+ d.insertAdjacentHTML('afterbegin', html);
+ assert_equals(d.firstChild.nodeType, Node.TEXT_NODE);
+ assert_equals(d.firstChild.data, STRINGS.unescapedHTML);
+
+ d.insertAdjacentHTML('beforeend', html);
+ assert_equals(d.lastChild.nodeType, Node.TEXT_NODE);
+ assert_equals(d.lastChild.data, STRINGS.unescapedHTML);
+
+ d.insertAdjacentHTML('afterend', html);
+ assert_equals(d.nextSibling.nodeType, Node.TEXT_NODE);
+ assert_equals(d.nextSibling.data, STRINGS.unescapedHTML);
+
+ while (container.firstChild)
+ container.firstChild.remove();
+ }, "insertAdjacentHTML = TrustedHTML.escape().");
+
+ test(t => {
+ var html = TrustedHTML.unsafelyCreate(STRINGS.unescapedHTML);
+
+ var d = document.createElement('div');
+ container.appendChild(d);
+
+ d.insertAdjacentHTML('beforebegin', html);
+ assert_equals(d.previousSibling.nodeType, Node.TEXT_NODE);
+ assert_equals(d.previousSibling.data, STRINGS.unescapedText);
+
+ d.insertAdjacentHTML('afterbegin', html);
+ assert_equals(d.firstChild.nodeType, Node.TEXT_NODE);
+ assert_equals(d.firstChild.data, STRINGS.unescapedText);
+
+ d.insertAdjacentHTML('beforeend', html);
+ assert_equals(d.lastChild.nodeType, Node.TEXT_NODE);
+ assert_equals(d.lastChild.data, STRINGS.unescapedText);
+
+ d.insertAdjacentHTML('afterend', html);
+ assert_equals(d.nextSibling.nodeType, Node.TEXT_NODE);
+ assert_equals(d.nextSibling.data, STRINGS.unescapedText);
+
+ while (container.firstChild)
+ container.firstChild.remove();
+ }, "insertAdjacentHTML = TrustedHTML.unsafelyCreate().");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/location-href.tentative.html b/tests/wpt/web-platform-tests/trusted-types/location-href.tentative.html
new file mode 100644
index 00000000000..6dd4816f9df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/location-href.tentative.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js"></script>
+<body>
+<script>
+ promise_test(t => {
+ var url = TrustedURL.create(URLS.safe);
+ return createFrameAndHref(url);
+ }, "Basic processing: safe URL, safe construction.");
+
+ promise_test(t => {
+ var url = TrustedURL.unsafelyCreate(URLS.safe);
+ return createFrameAndHref(url);
+ }, "Basic processing: safe URL, unsafe construction.");
+
+ promise_test(t => {
+ var url = TrustedURL.create(URLS.javascript);
+ return createFrameAndHref(url).then(i => {
+ assert_equals(i.contentDocument.body.innerText, "");
+ });
+ }, "Basic processing: javascript URL, safe construction.");
+
+ promise_test(t => {
+ var url = TrustedURL.unsafelyCreate(URLS.javascript);
+ return createFrameAndHref(url).then(i => {
+ assert_equals(i.contentDocument.body.innerText, "scripted");
+ });
+ }, "Basic processing: javascript URL, unsafe construction.");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/outerHTML.tentative.html b/tests/wpt/web-platform-tests/trusted-types/outerHTML.tentative.html
new file mode 100644
index 00000000000..0a25dc2a988
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/outerHTML.tentative.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js"></script>
+<body>
+<div id="container"></div>
+<script>
+ var container = document.querySelector('#container')
+ test(t => {
+ var html = TrustedHTML.escape(STRINGS.unescapedHTML);
+
+ var d = document.createElement('div');
+ document.querySelector('#container').appendChild(d);
+ d.outerHTML = html;
+ assert_equals(container.innerText, STRINGS.unescapedHTML);
+ while (container.firstChild)
+ container.firstChild.remove();
+ }, "outerHTML = TrustedHTML.escape().");
+
+ test(t => {
+ var html = TrustedHTML.unsafelyCreate(STRINGS.unescapedHTML);
+
+ var d = document.createElement('div');
+ container.appendChild(d);
+ d.outerHTML = html;
+ assert_equals(container.innerText, STRINGS.unescapedText);
+ while (container.firstChild)
+ container.firstChild.remove();
+ }, "outerHTML = TrustedHTML.unsafelyCreate().");
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/script-src.tentative.html b/tests/wpt/web-platform-tests/trusted-types/script-src.tentative.html
new file mode 100644
index 00000000000..bc8c332b151
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/script-src.tentative.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./support/helper.js"></script>
+<body>
+<script>
+ test(t => {
+ var url = TrustedScriptURL.unsafelyCreate(URLS.safe);
+
+ var s = document.createElement('script');
+ s.src = url;
+ assert_equals(url + '', s.src);
+ });
+
+ test(t => {
+ var url = TrustedScriptURL.unsafelyCreate(URLS.javascript);
+
+ var s = document.createElement('script');
+ s.src = url;
+ assert_equals(url + '', s.src);
+ });
+
+ test(t => {
+ var url = TrustedScriptURL.unsafelyCreate(URLS.external);
+
+ var s = document.createElement('script');
+ s.src = url;
+ assert_equals(url + '', s.src);
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/trusted-types/support/helper.js b/tests/wpt/web-platform-tests/trusted-types/support/helper.js
new file mode 100644
index 00000000000..1094e72c6f8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/trusted-types/support/helper.js
@@ -0,0 +1,47 @@
+var STRINGS = {
+ unescapedHTML: "<html>This has ', \", >, <, &amp; & characters!</html>",
+ escapedHTML: "&lt;html&gt;This has &#39;, &quot;, &gt;, &lt;, &amp;amp; &amp; characters!&lt;/html&gt;",
+ unescapedText: "This has ', \", >, <, & & characters!",
+};
+
+var URLS = {
+ safe: "https://example.test/",
+ javascript: "javascript:'scripted'",
+ external: "custom-handler:whatever",
+ sanitized: "about:invalid"
+};
+
+function createFrameAndWrite(html) {
+ return new Promise((resolve, reject) => {
+ var i = document.createElement('iframe');
+ i.onload = e => {
+ i.contentDocument.open();
+ try {
+ i.contentDocument.write(html);
+ } catch (e) {
+ i.remove();
+ reject(e);
+ }
+ i.contentDocument.close();
+ resolve(i);
+ };
+ document.body.appendChild(i);
+ });
+}
+
+function createFrameAndHref(href) {
+ return new Promise((resolve, reject) => {
+ var i = document.createElement('iframe');
+ i.onload = _ => {
+ i.onload = null;
+ try {
+ i.onload = _ => resolve(i);
+ i.contentWindow.location.href = href;
+ } catch (ex) {
+ i.remove();
+ reject(ex);
+ }
+ };
+ document.body.appendChild(i);
+ });
+}
diff --git a/tests/wpt/web-platform-tests/uievents/OWNERS b/tests/wpt/web-platform-tests/uievents/OWNERS
index aa05033e7f4..dc5daae64bd 100644
--- a/tests/wpt/web-platform-tests/uievents/OWNERS
+++ b/tests/wpt/web-platform-tests/uievents/OWNERS
@@ -1,2 +1,3 @@
@jdm
+@NavidZ
@zqzhang
diff --git a/tests/wpt/web-platform-tests/uievents/constructors/inputevent-constructor.html b/tests/wpt/web-platform-tests/uievents/constructors/inputevent-constructor.html
index f1f5641785e..3876abcd430 100644
--- a/tests/wpt/web-platform-tests/uievents/constructors/inputevent-constructor.html
+++ b/tests/wpt/web-platform-tests/uievents/constructors/inputevent-constructor.html
@@ -5,21 +5,21 @@
<script>
test(function() {
var e = new InputEvent('type');
- assert_equals(e.data, null);
- assert_false(e.isComposing);
+ assert_equals(e.data, null, '.data');
+ assert_false(e.isComposing, '.isComposing');
}, 'InputEvent constructor without InputEventInit.');
test(function() {
var e = new InputEvent('type', { data: null, isComposing: true });
- assert_equals(e.data, null);
- assert_true(e.isComposing);
+ assert_equals(e.data, null, '.data');
+ assert_true(e.isComposing, '.isComposing');
}, 'InputEvent construtor with InputEventInit where data is null');
test(function() {
- assert_equals(new InputEvent('type', { data: ''}).data, '');
+ assert_equals(new InputEvent('type', { data: ''}).data, '', '.data');
}, 'InputEvent construtor with InputEventInit where data is empty string');
test(function() {
- assert_equals(new InputEvent('type', { data: 'data' }).data, 'data');
+ assert_equals(new InputEvent('type', { data: 'data' }).data, 'data', '.data');
}, 'InputEvent construtor with InputEventInit where data is non empty string');
</script>
diff --git a/tests/wpt/web-platform-tests/uievents/interfaces.html b/tests/wpt/web-platform-tests/uievents/interfaces.html
new file mode 100644
index 00000000000..0d20f1d7101
--- /dev/null
+++ b/tests/wpt/web-platform-tests/uievents/interfaces.html
@@ -0,0 +1,48 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>UI Events IDL tests</title>
+<meta name=timeout content=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/WebIDLParser.js></script>
+<script src=/resources/idlharness.js></script>
+
+<h1>UI Events IDL tests</h1>
+<div id=log></div>
+
+<script>
+"use strict";
+function doTest([dom, uievents]) {
+ var idlArray = new IdlArray();
+ idlArray.add_untested_idls(dom);
+ idlArray.add_idls(uievents);
+
+ idlArray.add_objects({
+ FocusEvent: ['new FocusEvent("event")'],
+ MouseEvent: ['new MouseEvent("event")'],
+ WheelEvent: ['new WheelEvent("event")'],
+ KeyboardEvent: ['new KeyboardEvent("event")'],
+ CompositionEvent: ['new CompositionEvent("event")'],
+ UIEvent: ['new UIEvent("event")'],
+ InputEvent: ['new InputEvent("event")'],
+ });
+ idlArray.test();
+};
+
+function fetchData(url) {
+ return fetch(url).then((response) => response.text());
+}
+
+function waitForLoad() {
+ return new Promise(function(resolve) {
+ addEventListener("load", resolve);
+ });
+}
+
+promise_test(function() {
+ return Promise.all([fetchData("/interfaces/dom.idl"),
+ fetchData("/interfaces/uievents.idl")])
+ .then(doTest);
+}, "Test driver");
+
+</script>
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 8b9cb46d0c7..3228c65a839 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
@@ -5,8 +5,8 @@
<title>Keyboard Event Manual Test</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
-<script type="text/javascript" src="key-manual.js" ></script>
-<link rel="stylesheet" type="text/css" href="key-manual.css" />
+<script type="text/javascript" src="key.js" ></script>
+<link rel="stylesheet" type="text/css" href="key.css" />
</head>
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 6521681a73c..c5b51c47bd4 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
@@ -5,8 +5,8 @@
<title>Keyboard Event Manual Test</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
-<script type="text/javascript" src="key-manual.js" ></script>
-<link rel="stylesheet" type="text/css" href="key-manual.css" />
+<script type="text/javascript" src="key.js" ></script>
+<link rel="stylesheet" type="text/css" href="key.css" />
</head>
diff --git a/tests/wpt/web-platform-tests/uievents/keyboard/key-manual.css b/tests/wpt/web-platform-tests/uievents/keyboard/key.css
index b2add2a754d..b2add2a754d 100644
--- a/tests/wpt/web-platform-tests/uievents/keyboard/key-manual.css
+++ b/tests/wpt/web-platform-tests/uievents/keyboard/key.css
diff --git a/tests/wpt/web-platform-tests/uievents/keyboard/key-manual.js b/tests/wpt/web-platform-tests/uievents/keyboard/key.js
index 175258bd887..175258bd887 100644
--- a/tests/wpt/web-platform-tests/uievents/keyboard/key-manual.js
+++ b/tests/wpt/web-platform-tests/uievents/keyboard/key.js
diff --git a/tests/wpt/web-platform-tests/uievents/legacy/Event-subclasses-init.html b/tests/wpt/web-platform-tests/uievents/legacy/Event-subclasses-init.html
new file mode 100644
index 00000000000..676eec92809
--- /dev/null
+++ b/tests/wpt/web-platform-tests/uievents/legacy/Event-subclasses-init.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+for (let eventTypeName of ['UIEvent', 'MouseEvent', 'KeyboardEvent', 'CompositionEvent']) {
+ test(function() {
+ let eventType = self[eventTypeName];
+ assert_equals(eventType.length, 1);
+
+ let event = new eventType('test');
+ let initFunction = "init" + eventTypeName;
+ assert_throws(new TypeError(), function() { eventType.prototype[initFunction].call(event) });
+ }, `Call init${eventTypeName} without parameters`);
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/update-built-tests.sh b/tests/wpt/web-platform-tests/update-built-tests.sh
index 90da26247be..63722f4b1d0 100755
--- a/tests/wpt/web-platform-tests/update-built-tests.sh
+++ b/tests/wpt/web-platform-tests/update-built-tests.sh
@@ -2,6 +2,6 @@
set -ex
2dcontext/tools/build.sh
-assumptions/tools/build.sh
+infrastructure/assumptions/tools/build.sh
html/tools/build.sh
offscreen-canvas/tools/build.sh
diff --git a/tests/wpt/web-platform-tests/url/OWNERS b/tests/wpt/web-platform-tests/url/OWNERS
index a3828440539..ed98ff26b30 100644
--- a/tests/wpt/web-platform-tests/url/OWNERS
+++ b/tests/wpt/web-platform-tests/url/OWNERS
@@ -1,10 +1,10 @@
@mikewest
@tomalec
@rubys
-@zcorpan
@xiaojunwu
@smola
@domenic
@Sebmaster
@annevk
@GPHemsley
+@TimothyGu
diff --git a/tests/wpt/web-platform-tests/url/setters_tests.json b/tests/wpt/web-platform-tests/url/setters_tests.json
index fa40ddafe5a..f35db16e8d1 100644
--- a/tests/wpt/web-platform-tests/url/setters_tests.json
+++ b/tests/wpt/web-platform-tests/url/setters_tests.json
@@ -259,6 +259,16 @@
"href": "view-source+data:text/html,<p>Test",
"protocol": "view-source+data:"
}
+ },
+ {
+ "comment": "Port is set to null if it is the default for new scheme.",
+ "href": "http://foo.com:443/",
+ "new_value": "https",
+ "expected": {
+ "href": "https://foo.com/",
+ "protocol": "https:",
+ "port": ""
+ }
}
],
"username": [
diff --git a/tests/wpt/web-platform-tests/url/urlsearchparams-constructor.html b/tests/wpt/web-platform-tests/url/urlsearchparams-constructor.html
index 1e214e04266..0637a386ec7 100644
--- a/tests/wpt/web-platform-tests/url/urlsearchparams-constructor.html
+++ b/tests/wpt/web-platform-tests/url/urlsearchparams-constructor.html
@@ -23,9 +23,11 @@ test(function() {
}, "URLSearchParams constructor, no arguments")
test(() => {
- params = new URLSearchParams(DOMException.prototype);
+ params = new URLSearchParams(DOMException);
assert_equals(params.toString(), "INDEX_SIZE_ERR=1&DOMSTRING_SIZE_ERR=2&HIERARCHY_REQUEST_ERR=3&WRONG_DOCUMENT_ERR=4&INVALID_CHARACTER_ERR=5&NO_DATA_ALLOWED_ERR=6&NO_MODIFICATION_ALLOWED_ERR=7&NOT_FOUND_ERR=8&NOT_SUPPORTED_ERR=9&INUSE_ATTRIBUTE_ERR=10&INVALID_STATE_ERR=11&SYNTAX_ERR=12&INVALID_MODIFICATION_ERR=13&NAMESPACE_ERR=14&INVALID_ACCESS_ERR=15&VALIDATION_ERR=16&TYPE_MISMATCH_ERR=17&SECURITY_ERR=18&NETWORK_ERR=19&ABORT_ERR=20&URL_MISMATCH_ERR=21&QUOTA_EXCEEDED_ERR=22&TIMEOUT_ERR=23&INVALID_NODE_TYPE_ERR=24&DATA_CLONE_ERR=25")
-}, "URLSearchParams constructor, DOMException.prototype as argument")
+ assert_throws(new TypeError(), () => new URLSearchParams(DOMException.prototype),
+ "Constructing a URLSearchParams from DOMException.prototype should throw due to branding checks");
+}, "URLSearchParams constructor, DOMException as argument")
test(() => {
params = new URLSearchParams('');
diff --git a/tests/wpt/web-platform-tests/url/urlsearchparams-delete.html b/tests/wpt/web-platform-tests/url/urlsearchparams-delete.html
index fca64621a02..d4bc0a6d26a 100644
--- a/tests/wpt/web-platform-tests/url/urlsearchparams-delete.html
+++ b/tests/wpt/web-platform-tests/url/urlsearchparams-delete.html
@@ -36,6 +36,21 @@ test(function() {
params.delete('first');
assert_false(params.has('first'), 'Search params object has no "first" name');
}, 'Deleting appended multiple');
+
+test(function() {
+ var url = new URL('http://example.com/?param1&param2');
+ url.searchParams.delete('param1');
+ url.searchParams.delete('param2');
+ assert_equals(url.href, 'http://example.com/', 'url.href does not have ?');
+ assert_equals(url.search, '', 'url.search does not have ?');
+}, 'Deleting all params removes ? from URL');
+
+test(function() {
+ var url = new URL('http://example.com/?');
+ url.searchParams.delete('param1');
+ assert_equals(url.href, 'http://example.com/', 'url.href does not have ?');
+ assert_equals(url.search, '', 'url.search does not have ?');
+}, 'Removing non-existent param removes ? from URL');
</script>
</head>
</html>
diff --git a/tests/wpt/web-platform-tests/url/urlsearchparams-sort.html b/tests/wpt/web-platform-tests/url/urlsearchparams-sort.html
index e643ed3b5a3..341998943c0 100644
--- a/tests/wpt/web-platform-tests/url/urlsearchparams-sort.html
+++ b/tests/wpt/web-platform-tests/url/urlsearchparams-sort.html
@@ -47,4 +47,11 @@
}
}, "URL parse and sort: " + val.input)
})
+
+test(function() {
+ const url = new URL("http://example.com/?")
+ url.searchParams.sort()
+ assert_equals(url.href, "http://example.com/")
+ assert_equals(url.search, "")
+}, "Sorting non-existent params removes ? from URL")
</script>
diff --git a/tests/wpt/web-platform-tests/url/urltestdata.json b/tests/wpt/web-platform-tests/url/urltestdata.json
index 974b4084931..069176141d5 100644
--- a/tests/wpt/web-platform-tests/url/urltestdata.json
+++ b/tests/wpt/web-platform-tests/url/urltestdata.json
@@ -5564,6 +5564,63 @@
"search": "",
"hash": ""
},
+ "# Windows drive letter quirk in the file slash state",
+ {
+ "input": "/c:/foo/bar",
+ "base": "file:///c:/baz/qux",
+ "href": "file:///c:/foo/bar",
+ "protocol": "file:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "/c:/foo/bar",
+ "search": "",
+ "hash": ""
+ },
+ {
+ "input": "/c|/foo/bar",
+ "base": "file:///c:/baz/qux",
+ "href": "file:///c:/foo/bar",
+ "protocol": "file:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "/c:/foo/bar",
+ "search": "",
+ "hash": ""
+ },
+ {
+ "input": "file:\\c:\\foo\\bar",
+ "base": "file:///c:/baz/qux",
+ "href": "file:///c:/foo/bar",
+ "protocol": "file:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "/c:/foo/bar",
+ "search": "",
+ "hash": ""
+ },
+ {
+ "input": "/c:/foo/bar",
+ "base": "file://host/path",
+ "href": "file:///c:/foo/bar",
+ "protocol": "file:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "/c:/foo/bar",
+ "search": "",
+ "hash": ""
+ },
"# Windows drive letter quirk with not empty host",
{
"input": "file://example.net/C:/",
@@ -5746,6 +5803,24 @@
"base": "about:blank",
"failure": true
},
+ "Port overflow (2^32 + 81)",
+ {
+ "input": "http://f:4294967377/c",
+ "base": "http://example.org/",
+ "failure": true
+ },
+ "Port overflow (2^64 + 81)",
+ {
+ "input": "http://f:18446744073709551697/c",
+ "base": "http://example.org/",
+ "failure": true
+ },
+ "Port overflow (2^128 + 81)",
+ {
+ "input": "http://f:340282366920938463463374607431768211537/c",
+ "base": "http://example.org/",
+ "failure": true
+ },
"# Non-special-URL path tests",
{
"input": "sc://ñ",
@@ -6382,6 +6457,88 @@
"search": "?a",
"hash": "#%GH"
},
+ "Bad bases",
+ {
+ "input": "test-a.html",
+ "base": "a",
+ "failure": true
+ },
+ {
+ "input": "test-a-slash.html",
+ "base": "a/",
+ "failure": true
+ },
+ {
+ "input": "test-a-slash-slash.html",
+ "base": "a//",
+ "failure": true
+ },
+ {
+ "input": "test-a-colon.html",
+ "base": "a:",
+ "failure": true
+ },
+ {
+ "input": "test-a-colon-slash.html",
+ "base": "a:/",
+ "href": "a:/test-a-colon-slash.html",
+ "protocol": "a:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "/test-a-colon-slash.html",
+ "search": "",
+ "hash": ""
+ },
+ {
+ "input": "test-a-colon-slash-slash.html",
+ "base": "a://",
+ "href": "a:///test-a-colon-slash-slash.html",
+ "protocol": "a:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "/test-a-colon-slash-slash.html",
+ "search": "",
+ "hash": ""
+ },
+ {
+ "input": "test-a-colon-b.html",
+ "base": "a:b",
+ "failure": true
+ },
+ {
+ "input": "test-a-colon-slash-b.html",
+ "base": "a:/b",
+ "href": "a:/test-a-colon-slash-b.html",
+ "protocol": "a:",
+ "username": "",
+ "password": "",
+ "host": "",
+ "hostname": "",
+ "port": "",
+ "pathname": "/test-a-colon-slash-b.html",
+ "search": "",
+ "hash": ""
+ },
+ {
+ "input": "test-a-colon-slash-slash-b.html",
+ "base": "a://b",
+ "href": "a://b/test-a-colon-slash-slash-b.html",
+ "protocol": "a:",
+ "username": "",
+ "password": "",
+ "host": "b",
+ "hostname": "b",
+ "port": "",
+ "pathname": "/test-a-colon-slash-slash-b.html",
+ "search": "",
+ "hash": ""
+ },
"Null code point in fragment",
{
"input": "http://example.org/test?a#b\u0000c",
diff --git a/tests/wpt/web-platform-tests/user-timing/measure.html b/tests/wpt/web-platform-tests/user-timing/measure.html
index 4175dbb49da..8f2a618f261 100644
--- a/tests/wpt/web-platform-tests/user-timing/measure.html
+++ b/tests/wpt/web-platform-tests/user-timing/measure.html
@@ -95,7 +95,7 @@
// create the test end mark using the test delay; this will allow for a significant difference between
// the mark values that should be represented in the duration of measures using these marks
- setTimeout(measure_test_cb, measureTestDelay);
+ step_timeout(measure_test_cb, measureTestDelay);
}
}
diff --git a/tests/wpt/web-platform-tests/user-timing/measure_navigation_timing.html b/tests/wpt/web-platform-tests/user-timing/measure_navigation_timing.html
index 93b6dc234d4..fa472fd3f96 100644
--- a/tests/wpt/web-platform-tests/user-timing/measure_navigation_timing.html
+++ b/tests/wpt/web-platform-tests/user-timing/measure_navigation_timing.html
@@ -92,7 +92,7 @@
// create the test end mark using the test delay; this will allow for a significant difference between
// the mark values that should be represented in the duration of measures using these marks
- setTimeout(measure_test_cb, measureTestDelay);
+ step_timeout(measure_test_cb, measureTestDelay);
}
}
diff --git a/tests/wpt/web-platform-tests/vibration/api-is-present.html b/tests/wpt/web-platform-tests/vibration/api-is-present.html
index f5c976dff95..8f6a7e0bb3b 100644
--- a/tests/wpt/web-platform-tests/vibration/api-is-present.html
+++ b/tests/wpt/web-platform-tests/vibration/api-is-present.html
@@ -17,7 +17,6 @@
<div id='log'></div>
<script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script>
- <script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
test(function () {
assert_true(undefined !== navigator.vibrate, "navigator.vibrate exists");
diff --git a/tests/wpt/web-platform-tests/vibration/cancel-when-hidden-manual.html b/tests/wpt/web-platform-tests/vibration/cancel-when-hidden-manual.html
index 569970758a4..0ae30b62352 100644
--- a/tests/wpt/web-platform-tests/vibration/cancel-when-hidden-manual.html
+++ b/tests/wpt/web-platform-tests/vibration/cancel-when-hidden-manual.html
@@ -19,7 +19,6 @@
the test has failed.
</p>
<button id='vib'>Vibrate!</button>
-<script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
var win;
@@ -35,4 +34,3 @@
};
}
</script>
-
diff --git a/tests/wpt/web-platform-tests/vibration/cancel-with-0-manual.html b/tests/wpt/web-platform-tests/vibration/cancel-with-0-manual.html
index 6890d5764a1..86981c11f85 100644
--- a/tests/wpt/web-platform-tests/vibration/cancel-with-0-manual.html
+++ b/tests/wpt/web-platform-tests/vibration/cancel-with-0-manual.html
@@ -16,7 +16,6 @@
the test has failed.
</p>
<button id='vib'>Vibrate!</button>
- <script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
if (undefined !== navigator.vibrate) {
document.getElementById("vib").onclick = function () {
diff --git a/tests/wpt/web-platform-tests/vibration/cancel-with-array-0-manual.html b/tests/wpt/web-platform-tests/vibration/cancel-with-array-0-manual.html
index 60689cc2c38..9cdf282ebca 100644
--- a/tests/wpt/web-platform-tests/vibration/cancel-with-array-0-manual.html
+++ b/tests/wpt/web-platform-tests/vibration/cancel-with-array-0-manual.html
@@ -19,7 +19,6 @@
the test has failed.
</p>
<button id='vib'>Vibrate!</button>
-<script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
if (undefined !== navigator.vibrate) {
document.getElementById('vib').onclick = function () {
@@ -30,4 +29,3 @@
};
}
</script>
-
diff --git a/tests/wpt/web-platform-tests/vibration/cancel-with-empty-array-manual.html b/tests/wpt/web-platform-tests/vibration/cancel-with-empty-array-manual.html
index 9d4be2b3adc..8e48173e7e9 100644
--- a/tests/wpt/web-platform-tests/vibration/cancel-with-empty-array-manual.html
+++ b/tests/wpt/web-platform-tests/vibration/cancel-with-empty-array-manual.html
@@ -16,7 +16,6 @@
the test has failed.
</p>
<button id='vib'>Vibrate!</button>
- <script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
if (undefined !== navigator.vibrate) {
document.getElementById("vib").onclick = function () {
diff --git a/tests/wpt/web-platform-tests/vibration/cancel-with-new-manual.html b/tests/wpt/web-platform-tests/vibration/cancel-with-new-manual.html
index 1cd9daf172f..64e6e9b5482 100644
--- a/tests/wpt/web-platform-tests/vibration/cancel-with-new-manual.html
+++ b/tests/wpt/web-platform-tests/vibration/cancel-with-new-manual.html
@@ -17,7 +17,6 @@
failed.
</p>
<button id='vib'>Vibrate!</button>
- <script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
if (undefined !== navigator.vibrate) {
document.getElementById("vib").onclick = function () {
diff --git a/tests/wpt/web-platform-tests/vibration/invalid-values.html b/tests/wpt/web-platform-tests/vibration/invalid-values.html
index a544ac23c7e..523d2ceddb2 100644
--- a/tests/wpt/web-platform-tests/vibration/invalid-values.html
+++ b/tests/wpt/web-platform-tests/vibration/invalid-values.html
@@ -12,7 +12,6 @@
<div id='log'></div>
<script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script>
-<script src='../support/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
test(function() {
assert_throws(new TypeError(), function() {
@@ -76,4 +75,3 @@
}
}, 'pattern of {} resolves to [{}]');
</script>
-
diff --git a/tests/wpt/web-platform-tests/vibration/pattern-array-extra-manual.html b/tests/wpt/web-platform-tests/vibration/pattern-array-extra-manual.html
index 3f5ccf386fa..b23323ace2f 100644
--- a/tests/wpt/web-platform-tests/vibration/pattern-array-extra-manual.html
+++ b/tests/wpt/web-platform-tests/vibration/pattern-array-extra-manual.html
@@ -15,7 +15,6 @@
by one second intervals.
</p>
<button id='vib'>Vibrate!</button>
- <script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
if (undefined !== navigator.vibrate) {
document.getElementById("vib").onclick = function () {
diff --git a/tests/wpt/web-platform-tests/vibration/pattern-array-manual.html b/tests/wpt/web-platform-tests/vibration/pattern-array-manual.html
index 43674bf8c5d..0c7063f1e02 100644
--- a/tests/wpt/web-platform-tests/vibration/pattern-array-manual.html
+++ b/tests/wpt/web-platform-tests/vibration/pattern-array-manual.html
@@ -14,7 +14,6 @@
by one second intervals.
</p>
<button id='vib'>Vibrate!</button>
- <script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
if (undefined !== navigator.vibrate) {
document.getElementById("vib").onclick = function () {
diff --git a/tests/wpt/web-platform-tests/vibration/pattern-array-with-0-manual.html b/tests/wpt/web-platform-tests/vibration/pattern-array-with-0-manual.html
index dff2f1ed7a1..491f2b16759 100644
--- a/tests/wpt/web-platform-tests/vibration/pattern-array-with-0-manual.html
+++ b/tests/wpt/web-platform-tests/vibration/pattern-array-with-0-manual.html
@@ -17,10 +17,8 @@
</p>
<button id='vib'>Vibrate!</button>
<div id='log'></div>
-<script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
document.getElementById("vib").onclick = function () {
navigator.vibrate([0, 0, 2000]);
};
</script>
-
diff --git a/tests/wpt/web-platform-tests/vibration/silent-ignore.html b/tests/wpt/web-platform-tests/vibration/silent-ignore.html
index c7447df51f0..88ef5092a14 100644
--- a/tests/wpt/web-platform-tests/vibration/silent-ignore.html
+++ b/tests/wpt/web-platform-tests/vibration/silent-ignore.html
@@ -19,7 +19,6 @@
<div id='log'></div>
<script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script>
- <script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
if (undefined !== navigator.vibrate) {
test(function () {
diff --git a/tests/wpt/web-platform-tests/vibration/simple-array-manual.html b/tests/wpt/web-platform-tests/vibration/simple-array-manual.html
index 4a85bd6ad05..52fa99773c9 100644
--- a/tests/wpt/web-platform-tests/vibration/simple-array-manual.html
+++ b/tests/wpt/web-platform-tests/vibration/simple-array-manual.html
@@ -13,7 +13,6 @@
</p>
<button id='vib'>Vibrate!</button>
<div id='log'></div>
- <script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
document.getElementById("vib").onclick = function () {
navigator.vibrate([2000]);
diff --git a/tests/wpt/web-platform-tests/vibration/simple-scalar-manual.html b/tests/wpt/web-platform-tests/vibration/simple-scalar-manual.html
index 0c7637bbad3..16fc2a9f853 100644
--- a/tests/wpt/web-platform-tests/vibration/simple-scalar-manual.html
+++ b/tests/wpt/web-platform-tests/vibration/simple-scalar-manual.html
@@ -13,7 +13,6 @@
After hitting the button below, your device must vibrate continuously for about two seconds, once.
</p>
<button id='vib'>Vibrate!</button>
- <script src='/common/vendor-prefix.js' data-prefixed-objects='[{"ancestors":["navigator"], "name":"vibrate"}]'></script>
<script>
if (undefined !== navigator.vibrate) {
document.getElementById("vib").onclick = function () {
diff --git a/tests/wpt/web-platform-tests/viewport/OWNERS b/tests/wpt/web-platform-tests/viewport/OWNERS
deleted file mode 100644
index c0dd4aac6e8..00000000000
--- a/tests/wpt/web-platform-tests/viewport/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-# TEAM: input-dev@chromium.org
-# COMPONENT: Blink>Input
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-attribute-event-handlers-manual.html b/tests/wpt/web-platform-tests/viewport/viewport-attribute-event-handlers-manual.html
new file mode 100644
index 00000000000..896f6cd98b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/viewport/viewport-attribute-event-handlers-manual.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Viewport: Attribute event handlers test</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="viewport_support.js"></script>
+ <script>
+ setup({explicit_timeout: true, explicit_done: true})
+ </script>
+ </head>
+ <body>
+ <h1>Viewport: Attribute event handlers test</h1>
+ <h4>
+ Test Description: This test checks that attribute event handlers function correctly.
+ </h4>
+ <h2 style="color: red">THIS IS A MANUAL TEST</h2>
+ <p id="skip">
+ <button id="skipbtn" onclick="skipManualTest();">Skip Test</button>
+ </p>
+ <p id="instruction"></p>
+ <button id="continue">Start Test</button>
+ <div id="log"></div>
+ </body>
+ <script>
+ var continueBtn = document.getElementById("continue");
+
+ function continueTest() {
+ nextStep(function(instructionText) {
+ var instruction = document.getElementById("instruction");
+ continueBtn.innerText = "Continue";
+ instruction.innerText = instructionText;
+ });
+ }
+
+ continueBtn.addEventListener('click', continueTest);
+
+ var didFireResize = false;
+ var didFireScroll = false;
+
+ addManualTestStep(
+ function() {
+ test(() => {
+ assert_not_equals(typeof(window.visualViewport.onresize),
+ 'undefined',
+ 'onresize is defined');
+ assert_not_equals(typeof(window.visualViewport.onscroll),
+ 'undefined',
+ 'onscroll is defined');
+ }, 'Attribute event handlers defined');
+
+ window.visualViewport.onresize = function(e) {
+ didFireResize = true;
+ };
+ window.visualViewport.onscroll = function(e) {
+ didFireScroll = true;
+ };
+ },
+ null,
+ '1. Pinch-zoom into the screen anywhere by any amount.');
+
+ addManualTestStep(
+ function() {
+ test(() => {
+ assert_true(didFireResize, 'Resize event fired');
+ assert_true(didFireScroll, 'Scroll event fired');
+ }, 'Event handler functionality');
+ continueBtn.remove();
+ },
+ null,
+ 'Test Complete');
+ </script>
+</html>
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-dimensions-custom-scrollbars-manual.html b/tests/wpt/web-platform-tests/viewport/viewport-dimensions-custom-scrollbars-manual.html
index f4671c9180a..c0d4b17b13b 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-dimensions-custom-scrollbars-manual.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-dimensions-custom-scrollbars-manual.html
@@ -75,16 +75,16 @@
addManualTestStep(
function() {
- originalWidth = window.view.width;
- originalHeight = window.view.height;
+ originalWidth = window.visualViewport.width;
+ originalHeight = window.visualViewport.height;
originalInnerWidth = window.innerWidth;
assert_equals(
- window.view.width,
+ window.visualViewport.width,
window.innerWidth - 20,
"Custom scrollbar width subtracted from viewport.");
assert_equals(
- window.view.height,
+ window.visualViewport.height,
window.innerHeight - 25,
"Custom scrollbar height subtracted from viewport.");
},
@@ -101,11 +101,11 @@
"Browser zoom to correct level");
assert_equals(
- window.view.width,
+ window.visualViewport.width,
window.innerWidth - 20,
"Custom scrollbar width subtracted from viewport.");
assert_equals(
- window.view.height,
+ window.visualViewport.height,
window.innerHeight - 25,
"Custom scrollbar height subtracted from viewport.");
},
@@ -120,18 +120,18 @@
addManualTestStep(
function() {
assert_approx_equals(
- window.view.scale, 2, 0.2, "Pinch zoom to correct scale");
+ window.visualViewport.scale, 2, 0.2, "Pinch zoom to correct scale");
// Scrollbars do not grow with pinch-zoom so they take up fewer
// CSS pixels as you zoom in.
assert_approx_equals(
- window.view.width,
- originalWidth / window.view.scale,
+ window.visualViewport.width,
+ originalWidth / window.visualViewport.scale,
1,
"Custom scrollbar width subtracted from viewport.");
assert_approx_equals(
- window.view.height,
- originalHeight / window.view.scale,
+ window.visualViewport.height,
+ originalHeight / window.visualViewport.scale,
1,
"Custom scrollbar width subtracted from viewport.");
},
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-dimensions-scrollbars-manual.html b/tests/wpt/web-platform-tests/viewport/viewport-dimensions-scrollbars-manual.html
index 078efc75fbb..17454a3698e 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-dimensions-scrollbars-manual.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-dimensions-scrollbars-manual.html
@@ -64,16 +64,16 @@
addManualTestStep(
function() {
- originalWidth = window.view.width;
- originalHeight = window.view.height;
+ originalWidth = window.visualViewport.width;
+ originalHeight = window.visualViewport.height;
originalInnerWidth = window.innerWidth;
assert_equals(
- window.view.width,
+ window.visualViewport.width,
window.innerWidth - scrollbarThickness,
"Scrollbar width subtracted from viewport.");
assert_equals(
- window.view.height,
+ window.visualViewport.height,
window.innerHeight - scrollbarThickness,
"Scrollbar height subtracted from viewport.");
},
@@ -91,11 +91,11 @@
// Scrollbars on the window don't grow with browser-zoom so
// they'll be fewer CSS pixels as the user zooms in.
assert_equals(
- window.view.width,
+ window.visualViewport.width,
window.innerWidth - scrollbarThickness / 2,
"Scrollbar width subtracted from viewport.");
assert_equals(
- window.view.height,
+ window.visualViewport.height,
window.innerHeight - scrollbarThickness / 2,
"Scrollbar height subtracted from viewport.");
},
@@ -110,14 +110,14 @@
addManualTestStep(
function() {
assert_approx_equals(
- window.view.scale, 2, 0.2, "Pinch zoom to correct scale");
+ window.visualViewport.scale, 2, 0.2, "Pinch zoom to correct scale");
- assert_approx_equals(window.view.width,
- originalWidth / window.view.scale,
+ assert_approx_equals(window.visualViewport.width,
+ originalWidth / window.visualViewport.scale,
1,
"Scrollbar width subtracted from viewport.");
- assert_approx_equals(window.view.height,
- originalHeight / window.view.scale,
+ assert_approx_equals(window.visualViewport.height,
+ originalHeight / window.visualViewport.scale,
1,
"Scrollbar width subtracted from viewport.");
},
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-no-resize-event-on-overflow-recalc.html b/tests/wpt/web-platform-tests/viewport/viewport-no-resize-event-on-overflow-recalc.html
index eb5eecadd90..5e73db8e46e 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-no-resize-event-on-overflow-recalc.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-no-resize-event-on-overflow-recalc.html
@@ -26,9 +26,9 @@
<script>
function runTest() {
var t = async_test(
- "Resize event not fired at window.view when content is added");
+ "Resize event not fired at window.visualViewport when content is added");
var viewResized = false;
- window.view.addEventListener('resize', function() {
+ window.visualViewport.addEventListener('resize', function() {
viewResized = true;
});
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-offset-manual.html b/tests/wpt/web-platform-tests/viewport/viewport-offset-manual.html
index 67d41d6975b..c216e405a3e 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-offset-manual.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-offset-manual.html
@@ -78,9 +78,9 @@
addManualTestStep(
function() {
- var actualScale = window.view.scale;
- var actualOffsetLeft = window.view.offsetLeft;
- var actualOffsetTop = window.view.offsetTop;
+ var actualScale = window.visualViewport.scale;
+ var actualOffsetLeft = window.visualViewport.offsetLeft;
+ var actualOffsetTop = window.visualViewport.offsetTop;
// This needs to happen before assertions in case they fail. A
// failed assertion stops running this function.
@@ -88,7 +88,7 @@
// Ensure we zoomed in to about what we expect.
assert_approx_equals(actualScale, scale, 0.2,
- "window.view.scale reflects pinch-zoom level");
+ "window.visualViewport.scale reflects pinch-zoom level");
assert_approx_equals(actualOffsetLeft, xTarget, 5,
"offsetLeft value is correct.");
assert_approx_equals(actualOffsetTop, yTarget, 5,
@@ -109,8 +109,8 @@
continueBtn.style.left = "150%";
continueBtn.style.top = "150%";
- assert_approx_equals(window.view.scale, 2, 0.2,
- "window.view.scale reflects pinch-zoom level");
+ assert_approx_equals(window.visualViewport.scale, 2, 0.2,
+ "window.visualViewport.scale reflects pinch-zoom level");
},
'Tester pinch zoomed in correctly',
'5. Scroll fully to the bottom right. Click the continue button ' +
@@ -121,8 +121,8 @@
var fullscreenBox = document.getElementById('fullscreenBox');
var expectedLeft = fullscreenBox.clientWidth / 2;
var expectedTop = fullscreenBox.clientHeight / 2;
- var viewOffsetLeft = window.view.offsetLeft;
- var viewOffsetTop = window.view.offsetTop;
+ var viewOffsetLeft = window.visualViewport.offsetLeft;
+ var viewOffsetTop = window.visualViewport.offsetTop;
// This needs to happen before assertions in case they fail. A
// failed assertion stops running this function.
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-page-manual.html b/tests/wpt/web-platform-tests/viewport/viewport-page-manual.html
index 00f8cca094d..9fb75ca0a2d 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-page-manual.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-page-manual.html
@@ -63,8 +63,8 @@
continueBtn.style.left = "400%";
continueBtn.style.top = "400%";
- assert_approx_equals(window.view.scale, 1.5, 0.2,
- "window.view.scale reflects pinch-zoom level");
+ assert_approx_equals(window.visualViewport.scale, 1.5, 0.2,
+ "window.visualViewport.scale reflects pinch-zoom level");
},
'Tester pinch zoomed in correctly',
'3. Scroll fully to the bottom right. Click the continue button there.');
@@ -74,13 +74,13 @@
var expectedLeft =
document.documentElement.clientWidth * 4 +
continueBtn.clientWidth -
- window.view.width;
+ window.visualViewport.width;
var expectedTop =
document.documentElement.clientHeight * 4 +
continueBtn.clientHeight -
- window.view.height;
- var viewPageLeft = window.view.pageLeft;
- var viewPageTop = window.view.pageTop;
+ window.visualViewport.height;
+ var viewPageLeft = window.visualViewport.pageLeft;
+ var viewPageTop = window.visualViewport.pageTop;
// This needs to happen before assertions in case they fail. A
// failed assertion stops running this function.
@@ -91,9 +91,9 @@
window.scrollTo(0, 0);
assert_approx_equals(viewPageLeft, expectedLeft, 10,
- "window.view.scale reflects pinch-zoom level");
+ "window.visualViewport.scale reflects pinch-zoom level");
assert_approx_equals(viewPageTop, expectedTop, 10,
- "window.view.scale reflects pinch-zoom level");
+ "window.visualViewport.scale reflects pinch-zoom level");
},
'PageLeft and PageTop correct when scrolled',
'4. Pinch-zoom out fully');
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-read-size-causes-layout.html b/tests/wpt/web-platform-tests/viewport/viewport-read-size-causes-layout.html
index f28231429cf..0520a7cf805 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-read-size-causes-layout.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-read-size-causes-layout.html
@@ -13,17 +13,17 @@
<script>
async_test(function(t) {
window.onload = t.step_func(function() {
- assert_equals(window.view.width, document.documentElement.clientWidth,
- "window.view.width should match the window width.");
- assert_equals(view.height, document.documentElement.clientHeight,
- "window.view.height should match the window height.");
+ assert_equals(window.visualViewport.width, document.documentElement.clientWidth,
+ "window.visualViewport.width should match the window width.");
+ assert_equals(visualViewport.height, document.documentElement.clientHeight,
+ "window.visualViewport.height should match the window height.");
// Add overflow so scrollbars appear.
document.body.style.width = "2000px";
document.body.style.height = "2000px";
- var viewportWidth = window.view.width;
- var viewportHeight = window.view.height;
+ var viewportWidth = window.visualViewport.width;
+ var viewportHeight = window.visualViewport.height;
assert_equals(viewportWidth, document.documentElement.clientWidth,
"Reading viewport width should cause a layout and exclude the new scrollbar.");
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-read-size-in-iframe-causes-layout.html b/tests/wpt/web-platform-tests/viewport/viewport-read-size-in-iframe-causes-layout.html
index 2f4b7341329..a08f7e876fc 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-read-size-in-iframe-causes-layout.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-read-size-in-iframe-causes-layout.html
@@ -14,17 +14,17 @@
<script>
async_test(function(t) {
window.onload = t.step_func(function() {
- assert_equals(frames[0].window.view.width, 200,
+ assert_equals(frames[0].window.visualViewport.width, 200,
"Reading width of iframe viewport should match iframe width.");
- assert_equals(frames[0].window.view.height, 300,
+ assert_equals(frames[0].window.visualViewport.height, 300,
"Reading height of iframe viewport should match iframe height.");
// Add overflow so scrollbars appear.
window.frames[0].window.document.body.style.width = "2000px";
window.frames[0].window.document.body.style.height = "2000px";
- var viewportWidth = frames[0].window.view.width;
- var viewportHeight = frames[0].window.view.height;
+ var viewportWidth = frames[0].window.visualViewport.width;
+ var viewportHeight = frames[0].window.visualViewport.height;
assert_equals(viewportWidth, frames[0].window.document.documentElement.clientWidth,
"Reading width of iframe viewport should cause a layout and exclude the new scrollbar.");
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-resize-event-manual.html b/tests/wpt/web-platform-tests/viewport/viewport-resize-event-manual.html
index ba02e93e29a..9088d1589b3 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-resize-event-manual.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-resize-event-manual.html
@@ -15,7 +15,7 @@
<h1>Viewport: Window Resize Fires Event</h1>
<h4>
Test Description: This test checks that a resize event is fired against
- the window.view object when the browser window is resized.
+ the window.visualViewport object when the browser window is resized.
</h4>
<h2 style="color: red">THIS IS A MANUAL TEST</h2>
<p id="skip">
@@ -51,7 +51,7 @@
addManualTestStep(
function() {
resetValues();
- window.view.addEventListener('resize', function(e) {
+ window.visualViewport.addEventListener('resize', function(e) {
didResizeView = true;
cancelable = e.cancelable;
bubbles = e.bubbles;
@@ -67,7 +67,7 @@
assert_false(cancelable);
assert_false(bubbles);
},
- 'Resize event fired at window.view after window resized',
+ 'Resize event fired at window.visualViewport after window resized',
'2. Unrotate the device or reset window size if needed.');
addManualTestStep(
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-resize-event-on-load-overflowing-page.html b/tests/wpt/web-platform-tests/viewport/viewport-resize-event-on-load-overflowing-page.html
index 4f08b66c6fc..b0603c8752d 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-resize-event-on-load-overflowing-page.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-resize-event-on-load-overflowing-page.html
@@ -18,10 +18,10 @@
});
} else {
var t = async_test(
- "Resize event fired exactly once against window.view if " +
+ "Resize event fired exactly once against window.visualViewport if " +
"scrollbars affect layout.");
var numViewResizes = 0;
- window.view.addEventListener('resize', function() {
+ window.visualViewport.addEventListener('resize', function() {
numViewResizes++;
});
@@ -51,7 +51,7 @@
<h1>Viewport: Resize Event On Load Overflowing Page</h1>
<h4>
Test Description: This test ensures that we fire a resize event against
- window.view if the page has overflow (since this creates a scrollbar
+ window.visualViewport if the page has overflow (since this creates a scrollbar
and thus changes the viewport size).
</h4>
<div id="log"></div>
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-scale-iframe-manual.html b/tests/wpt/web-platform-tests/viewport/viewport-scale-iframe-manual.html
index 29f12906edf..1c27ab71e16 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-scale-iframe-manual.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-scale-iframe-manual.html
@@ -19,7 +19,7 @@
</head>
<body>
<h1>Viewport: Scale iframe</h1>
- <h4>Test Description: Tests the view.scale property inside an iframe</h4>
+ <h4>Test Description: Tests the visualViewport.scale property inside an iframe</h4>
<h2 style="color: red">THIS IS A MANUAL TEST</h2>
<p id="skip">
<button id="skipbtn" onclick="skipManualTest();">Skip Test</button>
@@ -58,10 +58,10 @@
addManualTestStep(
function() {
// Ensure we zoomed in to about what we expect.
- assert_approx_equals(window.view.scale, 2.0, 0.2,
- "Main window.view.scale reflects pinch-zoom level");
+ assert_approx_equals(window.visualViewport.scale, 2.0, 0.2,
+ "Main window.visualViewport.scale reflects pinch-zoom level");
- assert_equals(frames[0].window.view.scale, 1.0,
+ assert_equals(frames[0].window.visualViewport.scale, 1.0,
"Iframe scale unchanged even when pinch-zoomed");
},
'Check iframe scale is unchanged when page is pinch-zoomed',
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-scale-manual.html b/tests/wpt/web-platform-tests/viewport/viewport-scale-manual.html
index 6aaffcc03a3..82bf418e1c3 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-scale-manual.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-scale-manual.html
@@ -13,7 +13,7 @@
</head>
<body>
<h1>Viewport: Scale</h1>
- <h4>Test Description: Tests the view.scale property</h4>
+ <h4>Test Description: Tests the visualViewport.scale property</h4>
<h2 style="color: red">THIS IS A MANUAL TEST</h2>
<p id="skip">
<button id="skipbtn" onclick="skipManualTest();">Skip Test</button>
@@ -50,15 +50,15 @@
addManualTestStep(
function() {
// Ensure we zoomed in to about what we expect.
- assert_approx_equals(window.view.scale, 2.0, 0.2,
- "window.view.scale reflects pinch-zoom level");
+ assert_approx_equals(window.visualViewport.scale, 2.0, 0.2,
+ "window.visualViewport.scale reflects pinch-zoom level");
},
'With ~200% pinch-zoom',
'3. Pinch-zoom back out to the minimum scale');
addManualTestStep(
function() {
- assert_equals(window.view.scale, 1);
+ assert_equals(window.visualViewport.scale, 1);
},
'Fully pinch-zoomed out',
'4. If your browser supports it, browser-zoom in (using ctrl-+). ' +
@@ -66,9 +66,9 @@
addManualTestStep(
function() {
- assert_equals(window.view.scale, 1);
+ assert_equals(window.visualViewport.scale, 1);
},
- 'Browser zoom doesn\'t change view.scale',
+ 'Browser zoom doesn\'t change visualViewport.scale',
'5. Reset browser zoom to default (ctrl-0)');
addManualTestStep(
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-scroll-event-manual.html b/tests/wpt/web-platform-tests/viewport/viewport-scroll-event-manual.html
index 3e286a6acff..3fcce101447 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-scroll-event-manual.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-scroll-event-manual.html
@@ -21,7 +21,7 @@
<h1>Viewport: Scroll Event</h1>
<h4>
Test Description: This test checks that a scroll event is fired against
- the window.view object when the viewport is scrolled.
+ the window.visualViewport object when the viewport is scrolled.
</h4>
<h2 style="color: red">THIS IS A MANUAL TEST</h2>
<p id="skip">
@@ -57,7 +57,7 @@
addManualTestStep(
function() {
- window.view.addEventListener('scroll', function(e) {
+ window.visualViewport.addEventListener('scroll', function(e) {
didGetScrollEvent = true;
cancelable = e.cancelable;
bubbles = e.bubbles;
@@ -115,8 +115,8 @@
continueBtn.style.left = "";
continueBtn.style.top = "";
- offsetLeft = window.view.offsetLeft;
- offsetTop = window.view.offsetTop;
+ offsetLeft = window.visualViewport.offsetLeft;
+ offsetTop = window.visualViewport.offsetTop;
// The visual viewport should be fully scrolled so even if
// scrollTo does normally "push" the layout viewport with the
@@ -124,9 +124,9 @@
window.scrollTo(10000, 10000);
requestAnimationFrame(continueTest);
- assert_equals(window.view.offsetLeft, offsetLeft,
+ assert_equals(window.visualViewport.offsetLeft, offsetLeft,
"OffsetLeft Unchanged");
- assert_equals(window.view.offsetTop, offsetTop,
+ assert_equals(window.visualViewport.offsetTop, offsetTop,
"OffsetTop Unchanged");
assert_false(didGetScrollEvent,
"Should not get view scroll event");
@@ -161,8 +161,8 @@
// make sure it's at least rational if it does change the
// offset values.
var scrollChangedOffset =
- offsetLeft != window.view.offsetLeft ||
- offsetTop != window.view.offsetTop;
+ offsetLeft != window.visualViewport.offsetLeft ||
+ offsetTop != window.visualViewport.offsetTop;
document.body.style.width = "";
document.body.style.height = "";
@@ -171,7 +171,7 @@
'If the scrollTo changed offsets it must have fired a ' +
'scroll event');
},
- 'scrollTo must fire scroll event if it changes view.offsetLeft|Top',
+ 'scrollTo must fire scroll event if it changes visualViewport.offsetLeft|Top',
'6. Pinch-zoom out fully');
addManualTestStep(
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-scrollbars-cause-resize.html b/tests/wpt/web-platform-tests/viewport/viewport-scrollbars-cause-resize.html
index ec3e9ee8df2..d0158c6f625 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-scrollbars-cause-resize.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-scrollbars-cause-resize.html
@@ -12,27 +12,27 @@
<h1>Viewport: Scrollbars Cause Resize</h1>
<h4>
Test Description: This test checks that the appearance of classic
- scrollbars will cause a resize event to be fired at window.view.
+ scrollbars will cause a resize event to be fired at window.visualViewport.
</h4>
<script>
function runTest() {
var scrollbarThickness = calculateScrollbarThickness();
document.documentElement.style.overflow = "hidden";
- var initialWidth = view.width;
- var initialHeight = view.height;
+ var initialWidth = visualViewport.width;
+ var initialHeight = visualViewport.height;
test(function() {
- assert_equals(window.view.width, window.innerWidth);
- assert_equals(window.view.height, window.innerHeight);
+ assert_equals(window.visualViewport.width, window.innerWidth);
+ assert_equals(window.visualViewport.height, window.innerHeight);
}, "view size initially matches window size");
var t = async_test(
- "Resize event was fired at window.view if, and only if, " +
+ "Resize event was fired at window.visualViewport if, and only if, " +
"scrollbars are classic (i.e. affect flow)");
var viewResized = false;
- window.view.addEventListener('resize', function() {
+ window.visualViewport.addEventListener('resize', function() {
viewResized = true;
});
@@ -48,8 +48,8 @@
var expectedHeight = initialHeight - scrollbarThickness;
test(function() {
- assert_equals(window.view.width, expectedWidth);
- assert_equals(window.view.height, expectedHeight);
+ assert_equals(window.visualViewport.width, expectedWidth);
+ assert_equals(window.visualViewport.height, expectedHeight);
}, "view size reflects appearance of classic scrollbars");
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-type.html b/tests/wpt/web-platform-tests/viewport/viewport-type.html
index 77e43547e1a..7a9ca425c08 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-type.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-type.html
@@ -1,30 +1,30 @@
<!doctype html>
<html>
<head>
- <title>Viewport: window.view type</title>
+ <title>Viewport: window.visualViewport type</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
- <h1>Viewport: window.view type</h1>
- <h4>Test Description: This test checks that window.view is an object of type VisualViewport.</h4>
+ <h1>Viewport: window.visualViewport type</h1>
+ <h4>Test Description: This test checks that window.visualViewport is an object of type VisualViewport.</h4>
<script>
test(function() {
- assert_equals(typeof(window.view), "object");
- }, "window.view is an object");
+ assert_equals(typeof(window.visualViewport), "object");
+ }, "window.visualViewport is an object");
test(function() {
- assert_equals(window.view.toString(), "[object VisualViewport]");
- }, "window.view has type `VisualViewport`");
+ assert_equals(window.visualViewport.toString(), "[object VisualViewport]");
+ }, "window.visualViewport has type `VisualViewport`");
addEventListener("load", function() {
- document.getElementById("viewtype-log").innerText = typeof(window.view);
+ document.getElementById("viewtype-log").innerText = typeof(window.visualViewport);
});
</script>
<div id="complete-notice">
- <p>window.view is of type: <span id="viewtype-log"></span>.</p>
+ <p>window.visualViewport is of type: <span id="viewtype-log"></span>.</p>
</div>
<div id="log"></div>
</body>
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scale-iframe.html b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scale-iframe.html
index 72835d725e7..30d9bfbe896 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scale-iframe.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scale-iframe.html
@@ -19,15 +19,15 @@
<h4>Test Description: This test checks that the default value for scale inside an iframe is 1.</h4>
<iframe></iframe>
<div id="complete-notice">
- <p>iframe's window.view.scale is <span id="view-scale-log"></span>.</p>
+ <p>iframe's window.visualViewport.scale is <span id="view-scale-log"></span>.</p>
</div>
<div id="log"></div>
</body>
<script>
test(function() {
- assert_equals(frames[0].window.view.scale, 1);
- }, "iframe's view.scale default value.");
+ assert_equals(frames[0].window.visualViewport.scale, 1);
+ }, "iframe's visualViewport.scale default value.");
- document.getElementById("view-scale-log").innerText = frames[0].window.view.scale;
+ document.getElementById("view-scale-log").innerText = frames[0].window.visualViewport.scale;
</script>
</html>
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scale.html b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scale.html
index 41e7928c20f..b83015d8d16 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scale.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scale.html
@@ -12,15 +12,15 @@
<h1>Viewport: Unscaled scale</h1>
<h4>Test Description: This test checks that the default value for scale is 1.</h4>
<div id="complete-notice">
- <p>window.view.scale is <span id="view-scale-log"></span>.</p>
+ <p>window.visualViewport.scale is <span id="view-scale-log"></span>.</p>
</div>
<div id="log"></div>
</body>
<script>
test(function() {
- assert_equals(window.view.scale, 1);
- }, "view.scale default value.");
+ assert_equals(window.visualViewport.scale, 1);
+ }, "visualViewport.scale default value.");
- document.getElementById("view-scale-log").innerText = window.view.scale;
+ document.getElementById("view-scale-log").innerText = window.visualViewport.scale;
</script>
</html>
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scroll-iframe.html b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scroll-iframe.html
index c7f7b2c99b0..f9e3023ab79 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scroll-iframe.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scroll-iframe.html
@@ -17,11 +17,11 @@
</head>
<body>
<h1>Viewport: Scroll in iframe - no page scale</h1>
- <h4>Test Description: This test checks that window.view returns correct offset and scroll values without any pinch-zoom page scale applied.</h4>
+ <h4>Test Description: This test checks that window.visualViewport returns correct offset and scroll values without any pinch-zoom page scale applied.</h4>
<iframe></iframe>
<div id="complete-notice">
- <p>frames[0].window.view's offsetLeft and offsetTop is (<span id="scroll-offset-log"></span>).</p>
- <p>frames[0].window.view's pageLeft and pageTop is (<span id="scroll-page-log"></span>).</p>
+ <p>frames[0].window.visualViewport's offsetLeft and offsetTop is (<span id="scroll-offset-log"></span>).</p>
+ <p>frames[0].window.visualViewport's pageLeft and pageTop is (<span id="scroll-page-log"></span>).</p>
</div>
<div id="log"></div>
</body>
@@ -36,19 +36,19 @@
test(function() {
- assert_equals(iframe.view.offsetLeft, 0);
+ assert_equals(iframe.visualViewport.offsetLeft, 0);
}, "offsetLeft must be 0.");
test(function() {
- assert_equals(iframe.view.offsetTop, 0);
+ assert_equals(iframe.visualViewport.offsetTop, 0);
}, "offsetTop must be 0.");
test(function() {
- assert_equals(iframe.view.pageLeft, 1000);
+ assert_equals(iframe.visualViewport.pageLeft, 1000);
}, "pageLeft must reflect location of viewport in document.");
test(function() {
- assert_equals(iframe.view.pageTop, 1200);
+ assert_equals(iframe.visualViewport.pageTop, 1200);
}, "pageTop must reflect location of viewport in document.");
- document.getElementById("scroll-offset-log").innerText = iframe.view.offsetLeft+ ", " + iframe.view.offsetTop;
- document.getElementById("scroll-page-log").innerText = iframe.view.pageLeft + ", " + iframe.view.pageTop;
+ document.getElementById("scroll-offset-log").innerText = iframe.visualViewport.offsetLeft+ ", " + iframe.visualViewport.offsetTop;
+ document.getElementById("scroll-page-log").innerText = iframe.visualViewport.pageLeft + ", " + iframe.visualViewport.pageTop;
</script>
</html>
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scroll.html b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scroll.html
index 359713df7a8..93623d19625 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scroll.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-scroll.html
@@ -10,10 +10,10 @@
</head>
<body>
<h1>Viewport: Scroll - no page scale</h1>
- <h4>Test Description: This test checks that window.view returns correct offset and scroll values without any pinch-zoom page scale applied.</h4>
+ <h4>Test Description: This test checks that window.visualViewport returns correct offset and scroll values without any pinch-zoom page scale applied.</h4>
<div id="complete-notice">
- <p>window.view's offsetLeft and offsetTop is (<span id="scroll-offset-log"></span>).</p>
- <p>window.view's pageLeft and pageTop is (<span id="scroll-page-log"></span>).</p>
+ <p>window.visualViewport's offsetLeft and offsetTop is (<span id="scroll-offset-log"></span>).</p>
+ <p>window.visualViewport's pageLeft and pageTop is (<span id="scroll-page-log"></span>).</p>
</div>
<div id="log"></div>
</body>
@@ -25,20 +25,20 @@
scrollTo(1000, 1200);
test(function() {
- assert_equals(window.view.offsetLeft, 0);
+ assert_equals(window.visualViewport.offsetLeft, 0);
}, "offsetLeft must be 0.");
test(function() {
- assert_equals(window.view.offsetTop, 0);
+ assert_equals(window.visualViewport.offsetTop, 0);
}, "offsetTop must be 0.");
test(function() {
- assert_equals(window.view.pageLeft, 1000);
+ assert_equals(window.visualViewport.pageLeft, 1000);
}, "pageLeft must reflect location of viewport in document.");
test(function() {
- assert_equals(window.view.pageTop, 1200);
+ assert_equals(window.visualViewport.pageTop, 1200);
}, "pageTop must reflect location of viewport in document.");
- document.getElementById("scroll-offset-log").innerText = window.view.offsetLeft+ ", " + window.view.offsetTop;
- document.getElementById("scroll-page-log").innerText = window.view.pageLeft + ", " + window.view.pageTop;
+ document.getElementById("scroll-offset-log").innerText = window.visualViewport.offsetLeft+ ", " + window.visualViewport.offsetTop;
+ document.getElementById("scroll-page-log").innerText = window.visualViewport.pageLeft + ", " + window.visualViewport.pageTop;
scrollTo(0, 0);
</script>
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-size-iframe.html b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-size-iframe.html
index de7a591a195..9a3c131a145 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-size-iframe.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-size-iframe.html
@@ -17,11 +17,11 @@
</head>
<body>
<h1>Viewport: Size in iframe - no page scale</h1>
- <h4>Test Description: This test checks that window.view returns correct sizes without any pinch-zoom page scale applied but with scrollbars.</h4>
+ <h4>Test Description: This test checks that window.visualViewport returns correct sizes without any pinch-zoom page scale applied but with scrollbars.</h4>
<iframe></iframe>
<div id="complete-notice">
- <p>frames[0].window.view width and height is (<span id="size-log"></span>).</p>
- <p>frames[0].window.view width and height when scrollbars are present is (<span id="size-scrollbars-log"></span>).</p>
+ <p>frames[0].window.visualViewport width and height is (<span id="size-log"></span>).</p>
+ <p>frames[0].window.visualViewport width and height when scrollbars are present is (<span id="size-scrollbars-log"></span>).</p>
</div>
<div id="log"></div>
</body>
@@ -29,25 +29,25 @@
var scrollbarThickness = calculateScrollbarThickness();
test(function() {
- assert_equals(frames[0].window.view.width, 200);
- }, "window.view.width of iframe viewport should match iframe width.");
+ assert_equals(frames[0].window.visualViewport.width, 200);
+ }, "window.visualViewport.width of iframe viewport should match iframe width.");
test(function() {
- assert_equals(frames[0].window.view.height, 300);
- }, "window.view.height of iframe viewport should match iframe height.");
+ assert_equals(frames[0].window.visualViewport.height, 300);
+ }, "window.visualViewport.height of iframe viewport should match iframe height.");
- document.getElementById("size-log").innerText = frames[0].window.view.width + ", " + frames[0].window.view.height;
+ document.getElementById("size-log").innerText = frames[0].window.visualViewport.width + ", " + frames[0].window.visualViewport.height;
// Add overflow so scrollbars appear.
window.frames[0].window.document.body.style.width = "2000px";
window.frames[0].window.document.body.style.height = "2000px";
test(function() {
- assert_equals(frames[0].window.view.width, 200 - scrollbarThickness);
- }, "window.view.width of iframe viewport should not include scrollbar.");
+ assert_equals(frames[0].window.visualViewport.width, 200 - scrollbarThickness);
+ }, "window.visualViewport.width of iframe viewport should not include scrollbar.");
test(function() {
- assert_equals(frames[0].window.view.height, 300 - scrollbarThickness);
- }, "window.view.height of iframe viewport should not include scrollbar.");
+ assert_equals(frames[0].window.visualViewport.height, 300 - scrollbarThickness);
+ }, "window.visualViewport.height of iframe viewport should not include scrollbar.");
- document.getElementById("size-scrollbars-log").innerText = frames[0].window.view.width + ", " + frames[0].window.view.height;
+ document.getElementById("size-scrollbars-log").innerText = frames[0].window.visualViewport.width + ", " + frames[0].window.visualViewport.height;
</script>
</html>
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-size.html b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-size.html
index 4100995c06d..8ad9fb2cfeb 100644
--- a/tests/wpt/web-platform-tests/viewport/viewport-unscaled-size.html
+++ b/tests/wpt/web-platform-tests/viewport/viewport-unscaled-size.html
@@ -16,10 +16,10 @@
</head>
<body>
<h1>Viewport: Size unscaled</h1>
- <h4>Test Description: This test checks that window.view returns correct sizes without any pinch-zoom page scale applied.</h4>
+ <h4>Test Description: This test checks that window.visualViewport returns correct sizes without any pinch-zoom page scale applied.</h4>
<div id="complete-notice">
- <p>window.view width and height is (<span id="view-size-log"></span>).</p>
- <p>window.view width and height when scrollbars are present is (<span id="view-size-scrollbar-log"></span>).</p>
+ <p>window.visualViewport width and height is (<span id="view-size-log"></span>).</p>
+ <p>window.visualViewport width and height when scrollbars are present is (<span id="view-size-scrollbar-log"></span>).</p>
</div>
<div id="log"></div>
</body>
@@ -27,25 +27,25 @@
var scrollbarThickness = calculateScrollbarThickness();
test(function() {
- assert_equals(window.view.width, document.documentElement.clientWidth);
- }, "view.width should match documentElement.clientWidth when unzoomed.");
+ assert_equals(window.visualViewport.width, document.documentElement.clientWidth);
+ }, "visualViewport.width should match documentElement.clientWidth when unzoomed.");
test(function() {
- assert_equals(window.view.height, document.documentElement.clientHeight);
- }, "view.height should match documentElement.clientHeight when unzoomed.");
+ assert_equals(window.visualViewport.height, document.documentElement.clientHeight);
+ }, "visualViewport.height should match documentElement.clientHeight when unzoomed.");
- document.getElementById("view-size-log").innerText = window.view.width + ", " + window.view.height;
+ document.getElementById("view-size-log").innerText = window.visualViewport.width + ", " + window.visualViewport.height;
// Add overflow so scrollbars appear.
document.body.style.width = "2000px";
document.body.style.height = "2000px";
test(function() {
- assert_equals(window.view.width, document.documentElement.clientWidth);
- }, "view.width should exclude scrollbar.");
+ assert_equals(window.visualViewport.width, document.documentElement.clientWidth);
+ }, "visualViewport.width should exclude scrollbar.");
test(function() {
- assert_equals(window.view.height, document.documentElement.clientHeight);
- }, "view.height should exclude scrollbar.");
+ assert_equals(window.visualViewport.height, document.documentElement.clientHeight);
+ }, "visualViewport.height should exclude scrollbar.");
- document.getElementById("view-size-scrollbar-log").innerText = window.view.width + ", " + window.view.height;
+ document.getElementById("view-size-scrollbar-log").innerText = window.visualViewport.width + ", " + window.visualViewport.height;
</script>
</html>
diff --git a/tests/wpt/web-platform-tests/viewport/viewport-url-bar-changes-height-manual.html b/tests/wpt/web-platform-tests/viewport/viewport-url-bar-changes-height-manual.html
new file mode 100644
index 00000000000..563134236bf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/viewport/viewport-url-bar-changes-height-manual.html
@@ -0,0 +1,87 @@
+<!doctype html>
+<html>
+ <head>
+ <title>Viewport: URL bar changes height</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="viewport_support.js"></script>
+ <script>
+ setup({explicit_timeout: true});
+ </script>
+ <style>
+ body {
+ margin-bottom: 1000px;
+ }
+ </style>
+ </head>
+ <body>
+ <h1>Viewport: URL bar changes height</h1>
+ <h4>
+ Test Description: This test checks that hiding the URL bar correctly
+ affects the visualViewport height. Skip if the UA doesn't have a URL bar
+ that hides/shows with scrolling.
+ </h4>
+ <h2 style="color: red">THIS IS A MANUAL TEST</h2>
+ <p id="skip">
+ <button id="skipbtn" onclick="skipManualTest();">Skip Test</button>
+ </p>
+ <p id="instruction"></p>
+ <button id="continue">Start Test</button>
+ <div id="log"></div>
+ </body>
+ <script>
+ var continueBtn = document.getElementById("continue");
+
+ function continueTest() {
+ nextStep(function(instructionText) {
+ var instruction = document.getElementById("instruction");
+ continueBtn.innerText = "Continue";
+ instruction.innerText = instructionText;
+ });
+ }
+
+ continueBtn.addEventListener('click', continueTest);
+
+ var heights = [ window.visualViewport.height ];
+
+ addManualTestStep(
+ function() {
+ window.visualViewport.addEventListener('resize', function(e) {
+ heights.push( window.visualViewport.height );
+ });
+ },
+ null,
+ '1. Scroll down (slowly, e.g. over ~1 sec) so the URL bar hides.');
+
+ addManualTestStep(
+ function() {
+ continueBtn.remove();
+ assert_greater_than(
+ heights.length, 2, 'URL bar caused multiple resize events');
+
+ var smallest = heights[0];
+ var largest = heights[0];
+ for (var height in heights) {
+ if (height < smallest)
+ smallest = height;
+ if (height > largest)
+ largest = height;
+ }
+
+ var hasIntermediate = false;
+ for (var height in heights) {
+ if (height != smallest && height != largest) {
+ hasIntermediate = true;
+ break;
+ }
+ }
+ assert_true(
+ hasIntermediate,
+ 'Resize fired for intermediate viewport height values');
+ },
+ 'URL bar updates height continually',
+ 'Test Complete');
+ </script>
+</html>
diff --git a/tests/wpt/web-platform-tests/wai-aria/alertdialog_modal_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/alertdialog_modal_false-manual.html
index b4be8c6e5f6..6dd2cee71c0 100644
--- a/tests/wpt/web-platform-tests/wai-aria/alertdialog_modal_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/alertdialog_modal_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>alertdialog modal false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,6 +54,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_DIALOG"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
"IA2_STATE_MODAL"
@@ -94,8 +101,7 @@
"is",
"true"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -120,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/alertdialog_modal_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/alertdialog_modal_true-manual.html
index 07f33ca0e7a..3eba98b4ee3 100644
--- a/tests/wpt/web-platform-tests/wai-aria/alertdialog_modal_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/alertdialog_modal_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>alertdialog modal true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,6 +54,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_DIALOG"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_MODAL"
@@ -94,8 +101,7 @@
"is",
"false"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -120,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/application_activedescendant-manual.html b/tests/wpt/web-platform-tests/wai-aria/application_activedescendant-manual.html
index 1a0a616fc0f..5a103d92939 100644
--- a/tests/wpt/web-platform-tests/wai-aria/application_activedescendant-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/application_activedescendant-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>application activedescendant</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -161,12 +162,6 @@
"states",
"contains",
"STATE_SYSTEM_FOCUSABLE"
- ],
- [
- "event",
- "type",
- "is",
- "EVENT_OBJECT_FOCUS"
]
],
"UIA" : [
@@ -197,7 +192,7 @@
<body>
<p>This test examines the ARIA properties for application activedescendant.</p>
<div id='test' tabindex="0" aria-activedescendant="bob" role='application'>
- <div id='bob' class='bobber'>Hello world</div>
+ <div id='bob' role='group'>Hello world</div>
</div>
then role:application, aria-activedescendant: bob
@@ -206,4 +201,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/application_activedescendant_value_changes-manual.html b/tests/wpt/web-platform-tests/wai-aria/application_activedescendant_value_changes-manual.html
index 319f0ed8051..04260aab7a8 100644
--- a/tests/wpt/web-platform-tests/wai-aria/application_activedescendant_value_changes-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/application_activedescendant_value_changes-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>application activedescendant value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -79,18 +80,6 @@
"AXUIElementIsAttributeSettable(AXFocused)",
"is",
"true"
- ],
- [
- "result",
- "array",
- "isNot",
- "true"
- ],
- [
- "event",
- "type",
- "is",
- "AXSelectedChildrenChanged"
]
],
"IAccessible2" : [
@@ -254,7 +243,7 @@
<body>
<p>This test examines the ARIA properties for application activedescendant value changes.</p>
<div id='test' tabindex="0" role='application'>
- <div id='bob' class='bobber'>Hello world</div>
+ <div id='bob' role='group'>Hello world</div>
</div>
then role:application, aria-activedescendant: bob generates a state change event
@@ -263,4 +252,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-current_not_declared-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-current_not_declared-manual.html
index 2698002c19f..25cf95c9417 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-current_not_declared-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-current_not_declared-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-current not declared</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -55,13 +56,13 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_LISTITEM + STATE_SYSTEM_READONLY"
+ "ROLE_SYSTEM_LISTITEM"
],
[
"property",
- "active",
- "is",
- "false"
+ "objectAttributes",
+ "doesNotContain",
+ "current:false"
]
],
"MSAA" : [
@@ -69,13 +70,13 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_LISTITEM + STATE_SYSTEM_READONLY"
+ "ROLE_SYSTEM_LISTITEM"
],
[
"property",
- "active",
- "is",
- "false"
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
]
],
"UIA" : [
@@ -114,4 +115,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_changes-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_changes-manual.html
index 5ae92b517fb..f4297f1fb67 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_changes-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_changes-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-current with value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -108,4 +109,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_date-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_date-manual.html
index 631c542b47d..8f4cb42ac73 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_date-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_date-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-current with value date</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "active",
- "is",
- "date"
+ "objectAttributes",
+ "contains",
+ "current:date"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "active",
- "is",
- "date"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_location-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_location-manual.html
index eaadd0721bd..4e4444319e7 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_location-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_location-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-current with value location</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "active",
- "is",
- "location"
+ "objectAttributes",
+ "contains",
+ "current:location"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleImage"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_GRAPHIC"
- ],
- [
- "property",
- "active",
- "is",
- "location"
]
],
"UIA" : [
@@ -112,4 +113,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_page-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_page-manual.html
index c3e17b066ea..d8fe5a41d64 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_page-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_page-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-current with value page</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -55,13 +56,19 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_LINK + STATE_LINKED"
+ "ROLE_SYSTEM_LINK"
],
[
"property",
- "active",
- "is",
- "page"
+ "objectAttributes",
+ "contains",
+ "current:page"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleHypertext"
]
],
"MSAA" : [
@@ -69,13 +76,13 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_LINK + STATE_LINKED"
+ "ROLE_SYSTEM_LINK"
],
[
"property",
- "active",
- "is",
- "page"
+ "states",
+ "contains",
+ "STATE_SYSTEM_LINKED"
]
],
"UIA" : [
@@ -112,4 +119,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_step-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_step-manual.html
index a6c4238029e..4b730e7fd4b 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_step-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_step-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-current with value step</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -55,13 +56,19 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_LINK + STATE_LINKED"
+ "ROLE_SYSTEM_LINK"
],
[
"property",
- "active",
- "is",
- "step"
+ "objectAttributes",
+ "contains",
+ "current:step"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleHypertext"
]
],
"MSAA" : [
@@ -69,13 +76,13 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_LINK + STATE_LINKED"
+ "ROLE_SYSTEM_LINK"
],
[
"property",
- "active",
- "is",
- "step"
+ "states",
+ "contains",
+ "STATE_SYSTEM_LINKED"
]
],
"UIA" : [
@@ -112,4 +119,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_time-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_time-manual.html
index 9e9583e736c..ae78d8348ec 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_time-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_time-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-current with value time</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "active",
- "is",
- "time"
+ "objectAttributes",
+ "contains",
+ "current:time"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "active",
- "is",
- "time"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_true-manual.html
index 3438a757a0d..57dcf29c6d7 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-current with value true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,6 +54,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LISTITEM"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"current:true"
@@ -108,4 +115,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_unspecified-manual.html
index 8377d6d1a07..74486b8d180 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-current_with_value_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-current with value unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -49,13 +50,13 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_LISTITEM + STATE_SYSTEM_READONLY"
+ "ROLE_SYSTEM_LISTITEM"
],
[
"property",
- "active",
- "is",
- "false"
+ "objectAttributes",
+ "doesNotContain",
+ "current:false"
]
],
"MSAA" : [
@@ -63,13 +64,13 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_LISTITEM + STATE_SYSTEM_READONLY"
+ "ROLE_SYSTEM_LISTITEM"
],
[
"property",
- "active",
- "is",
- "false"
+ "states",
+ "contains",
+ "STATE_SYSTEM_READONLY"
]
],
"UIA" : [
@@ -108,4 +109,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-details_pointing_to_details_element-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-details_pointing_to_details_element-manual.html
index 9c6318fc547..855584837e0 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-details_pointing_to_details_element-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-details_pointing_to_details_element-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-details pointing to details element</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -21,7 +22,7 @@
"relation",
"RELATION_DETAILS",
"is",
- "details"
+ "[details]"
]
],
"AXAPI" : [
@@ -34,10 +35,10 @@
],
"IAccessible2" : [
[
- "relation",
- "IA2_RELATION_DETAILS",
- "is",
- "details"
+ "property",
+ "relations",
+ "contains",
+ "IA2_RELATION_DETAILS"
]
],
"UIA" : [
@@ -60,18 +61,17 @@
"relation",
"RELATION_DETAILS_FOR",
"is",
- "test"
+ "[test]"
]
],
"IAccessible2" : [
[
- "relation",
- "IA2_RELATION_DETAILS_FOR",
- "is",
- "test"
+ "property",
+ "relations",
+ "contains",
+ "IA2_RELATION_DETAILS_FOR"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -97,4 +97,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/aria-details_pointing_to_div_element-manual.html b/tests/wpt/web-platform-tests/wai-aria/aria-details_pointing_to_div_element-manual.html
index 04d70eb30d3..f92ce596186 100644
--- a/tests/wpt/web-platform-tests/wai-aria/aria-details_pointing_to_div_element-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/aria-details_pointing_to_div_element-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>aria-details pointing to div element</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -21,7 +22,7 @@
"relation",
"RELATION_DETAILS",
"is",
- "details"
+ "[details]"
]
],
"AXAPI" : [
@@ -34,10 +35,10 @@
],
"IAccessible2" : [
[
- "relation",
- "IA2_RELATION_DETAILS",
- "is",
- "details"
+ "property",
+ "relations",
+ "contains",
+ "IA2_RELATION_DETAILS"
]
],
"UIA" : [
@@ -60,18 +61,17 @@
"relation",
"RELATION_DETAILS_FOR",
"is",
- "test"
+ "[test]"
]
],
"IAccessible2" : [
[
- "relation",
- "IA2_RELATION_DETAILS_FOR",
- "is",
- "test"
+ "property",
+ "relations",
+ "contains",
+ "IA2_RELATION_DETAILS_FOR"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -96,4 +96,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/article_in_feed_posinset_and_setsize-manual.html b/tests/wpt/web-platform-tests/wai-aria/article_in_feed_posinset_and_setsize-manual.html
index a55313b9b2f..d7145bda6e7 100644
--- a/tests/wpt/web-platform-tests/wai-aria/article_in_feed_posinset_and_setsize-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/article_in_feed_posinset_and_setsize-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>article in feed posinset and setsize</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -94,14 +95,14 @@
"setsize:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"similarItemsInGroup:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"positionInGroup:4"
]
@@ -168,4 +169,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/article_in_feed_setsize_-1-manual.html b/tests/wpt/web-platform-tests/wai-aria/article_in_feed_setsize_-1-manual.html
index d34c14048ca..0c270171373 100644
--- a/tests/wpt/web-platform-tests/wai-aria/article_in_feed_setsize_-1-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/article_in_feed_setsize_-1-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>article in feed setsize -1</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -76,8 +77,8 @@
"setsize:-1"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"similarItemsInGroup:-1"
]
@@ -138,4 +139,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/article_not_in_feed_posinset_and_setsize-manual.html b/tests/wpt/web-platform-tests/wai-aria/article_not_in_feed_posinset_and_setsize-manual.html
index 6e61ce8d4b7..ab45edccd4e 100644
--- a/tests/wpt/web-platform-tests/wai-aria/article_not_in_feed_posinset_and_setsize-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/article_not_in_feed_posinset_and_setsize-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>article not in feed posinset and setsize</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -77,6 +78,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_DOCUMENT"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"xml-roles:article"
@@ -94,14 +101,14 @@
"setsize:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"similarItemsInGroup:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"positionInGroup:4"
]
@@ -166,4 +173,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_dialog-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_dialog-manual.html
index 14ced7503ee..e69e6c917ae 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_dialog-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_dialog-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button haspopup dialog</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -60,17 +61,17 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:dialog"
@@ -81,7 +82,7 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_BUTTONMENU"
+ "ROLE_SYSTEM_PUSHBUTTON"
],
[
"property",
@@ -130,4 +131,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_emptystring-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_emptystring-manual.html
index 1d69c08dfff..c41c72832cd 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_emptystring-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_emptystring-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button haspopup emptystring</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -60,17 +61,17 @@
"actions",
"doesNotContain",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "doesNotContain",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:false"
@@ -127,4 +128,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_false-manual.html
index 774c7130b7a..a41063cabf1 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button haspopup false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -54,17 +55,17 @@
"actions",
"doesNotContain",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "doesNotContain",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:false"
@@ -121,4 +122,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_foo-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_foo-manual.html
index 94c22caa0c1..92bf3b32402 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_foo-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_foo-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button haspopup foo</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -60,17 +61,17 @@
"actions",
"doesNotContain",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "doesNotContain",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:false"
@@ -127,4 +128,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_grid-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_grid-manual.html
index 7ceb8c23e01..52d325ac4b7 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_grid-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_grid-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button haspopup grid</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -60,17 +61,17 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:grid"
@@ -81,7 +82,7 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_BUTTONMENU"
+ "ROLE_SYSTEM_PUSHBUTTON"
],
[
"property",
@@ -129,10 +130,8 @@
</tr>
</table>
-
<div id="manualMode"></div>
<div id="log"></div>
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_listbox-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_listbox-manual.html
index 573a9db9362..f8494ea1a0b 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_listbox-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_listbox-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button haspopup listbox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -60,17 +61,17 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:listbox"
@@ -81,7 +82,7 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_BUTTONMENU"
+ "ROLE_SYSTEM_PUSHBUTTON"
],
[
"property",
@@ -132,4 +133,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_menu-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_menu-manual.html
index 8f021294d87..261f448379d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_menu-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_menu-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button haspopup menu</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -60,17 +61,17 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:menu"
@@ -81,7 +82,7 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_BUTTONMENU"
+ "ROLE_SYSTEM_PUSHBUTTON"
],
[
"property",
@@ -132,4 +133,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_tree-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_tree-manual.html
index 0a5f939ece0..5dd268d94ba 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_tree-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_tree-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button haspopup tree</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -60,17 +61,17 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:tree"
@@ -81,7 +82,7 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_BUTTONMENU"
+ "ROLE_SYSTEM_PUSHBUTTON"
],
[
"property",
@@ -138,4 +139,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_true-manual.html
index 8f378ace18c..0d7b660c14d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button haspopup true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -27,7 +28,7 @@
"property",
"objectAttributes",
"contains",
- "haspopup:true"
+ "haspopup:menu"
],
[
"property",
@@ -60,20 +61,20 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
- "haspopup:true"
+ "haspopup:menu"
]
],
"MSAA" : [
@@ -81,7 +82,7 @@
"property",
"role",
"is",
- "ROLE_SYSTEM_BUTTONMENU"
+ "ROLE_SYSTEM_PUSHBUTTON"
],
[
"property",
@@ -127,4 +128,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_unspecified-manual.html
index 3bb4ea31914..b03efadce13 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_haspopup_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_haspopup_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button haspopup unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -60,20 +61,20 @@
"actions",
"doesNotContain",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "doesNotContain",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PUSHBUTTON"
+ ],
+ [
+ "property",
"objectAttributes",
- "doesNotContain",
- "haspopup"
+ "contains",
+ "haspopup:false"
]
],
"MSAA" : [
@@ -127,4 +128,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_roledescription_empty-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_roledescription_empty-manual.html
index 81b64553f78..0de1df2566c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_roledescription_empty-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_roledescription_empty-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button roledescription empty</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,7 +54,7 @@
"IAccessible2" : [
[
"property",
- "IAccessible2_2.localizedExtendedRole",
+ "localizedExtendedRole",
"is",
"null"
]
@@ -102,4 +103,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_roledescription_valid-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_roledescription_valid-manual.html
index df0f42e5925..a3ffbc08f92 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_roledescription_valid-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_roledescription_valid-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button roledescription valid</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -52,9 +53,9 @@
],
"IAccessible2" : [
[
- "result",
- "IAccessible2_2.localizedExtendedRole",
- "contains",
+ "property",
+ "localizedExtendedRole",
+ "is",
"SassyButton"
]
],
@@ -100,4 +101,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/button_roledescription_whitespace_only-manual.html b/tests/wpt/web-platform-tests/wai-aria/button_roledescription_whitespace_only-manual.html
index cbf10a035a3..8edd5b99acd 100644
--- a/tests/wpt/web-platform-tests/wai-aria/button_roledescription_whitespace_only-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/button_roledescription_whitespace_only-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>button roledescription whitespace only</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,8 +54,8 @@
"IAccessible2" : [
[
"property",
- "IAccessible2_2.localizedExtendedRole",
- "contains",
+ "localizedExtendedRole",
+ "is",
"null"
]
],
@@ -102,4 +103,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell-manual.html
index 78fd24bd147..f7ea0688562 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -137,14 +138,14 @@
"colcount:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"similarItemsInGroup:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"positionInGroup:4"
]
@@ -214,4 +215,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_div-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_div-manual.html
index 739de21480b..88168fc8651 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_div-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_div-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell aria-colspan 2 on div</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "colspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "colspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "colspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3-manual.html
index f7cb02c486c..38b7c4c5869 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell aria-colspan 2 on td html colspan 3</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,9 @@
],
[
"property",
- "colspan",
- "isNot",
- "2"
+ "objectAttributes",
+ "doesNotContain",
+ "colspan:2"
]
],
"MSAA" : [
@@ -70,12 +71,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "colspan",
- "isNot",
- "2"
]
],
"UIA" : [
@@ -116,4 +111,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_headers_and_border-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_headers_and_border-manual.html
index 242f51bdaaf..b859a1d2010 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_headers_and_border-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_headers_and_border-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell aria-colspan 2 on td html colspan 3 with headers and border</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,9 @@
],
[
"property",
- "colspan",
- "is",
- "3"
+ "objectAttributes",
+ "doesNotContain",
+ "colspan:2"
]
],
"MSAA" : [
@@ -70,12 +71,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "colspan",
- "is",
- "3"
]
],
"UIA" : [
@@ -119,4 +114,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_three_actual_columns-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_three_actual_columns-manual.html
index 7afdeea857d..76a7f2967e4 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_three_actual_columns-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_html_colspan_3_with_three_actual_columns-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell aria-colspan 2 on td html colspan 3 with three actual columns</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,9 +54,9 @@
],
[
"property",
- "colspan",
- "is",
- "3"
+ "objectAttributes",
+ "doesNotContain",
+ "colspan:2"
]
],
"MSAA" : [
@@ -64,12 +65,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "colspan",
- "is",
- "3"
]
],
"UIA" : [
@@ -113,4 +108,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_with_html_colspan_not_specified-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_with_html_colspan_not_specified-manual.html
index 894d074020e..182eefb0df3 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_with_html_colspan_not_specified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_aria-colspan_2_on_td_with_html_colspan_not_specified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell aria-colspan 2 on td with html colspan not specified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "colspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "colspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "colspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_div-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_div-manual.html
index e61de96fcb7..d32621b74c0 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_div-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_div-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell aria-rowspan 2 on div</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "rowspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "rowspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "rowspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3-manual.html
index fd6eb3381a3..949af2787f6 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell aria-rowspan 2 on td html rowspan 3</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,9 @@
],
[
"property",
- "rowspan",
- "isNot",
- "2"
+ "objectAttributes",
+ "doesNotContain",
+ "rowspan:2"
]
],
"MSAA" : [
@@ -70,12 +71,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "rowspan",
- "isNot",
- "2"
]
],
"UIA" : [
@@ -116,4 +111,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3_with_three_actual_rows-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3_with_three_actual_rows-manual.html
index b2eefe48082..a34f7a1bb3a 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3_with_three_actual_rows-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_html_rowspan_3_with_three_actual_rows-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell aria-rowspan 2 on td html rowspan 3 with three actual rows</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,9 +54,9 @@
],
[
"property",
- "rowspan",
- "is",
- "3"
+ "objectAttributes",
+ "doesNotContain",
+ "rowspan:2"
]
],
"MSAA" : [
@@ -64,12 +65,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "rowspan",
- "is",
- "3"
]
],
"UIA" : [
@@ -117,4 +112,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_with_html_rowspan_not_specified-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_with_html_rowspan_not_specified-manual.html
index d473ed4111b..c257e787b67 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_with_html_rowspan_not_specified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_aria-rowspan_2_on_td_with_html_rowspan_not_specified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell aria-rowspan 2 on td with html rowspan not specified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "rowspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "rowspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "rowspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_colindex_4-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_colindex_4-manual.html
index f0e25d16688..78769af1b54 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_colindex_4-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_colindex_4-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell colindex 4</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,7 +60,7 @@
],
[
"property",
- "interface",
+ "interfaces",
"contains",
"IAccessibleTableCell"
],
@@ -68,9 +69,10 @@
"objectAttributes",
"contains",
"colindex:4"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -115,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/cell_rowindex_4-manual.html b/tests/wpt/web-platform-tests/wai-aria/cell_rowindex_4-manual.html
index 8b4dea547e6..b4ff29775a6 100644
--- a/tests/wpt/web-platform-tests/wai-aria/cell_rowindex_4-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/cell_rowindex_4-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>cell rowindex 4</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,9 @@
],
[
"property",
- "rowindex",
- "is",
- "4"
+ "objectAttributes",
+ "contains",
+ "rowindex:4"
]
],
"MSAA" : [
@@ -70,12 +71,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "rowindex",
- "is",
- "4"
]
],
"UIA" : [
@@ -116,4 +111,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_false-manual.html
index 61647ce395c..59e25a6136c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>checkbox readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,15 +60,21 @@
"IAccessible2" : [
[
"property",
- "objectAttribute",
- "checkable",
- "true"
+ "role",
+ "is",
+ "ROLE_SYSTEM_CHECKBUTTON"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "checkable:true"
],
[
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -112,4 +119,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_true-manual.html
index ab9892d8a1f..e73f898f202 100644
--- a/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>checkbox readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,15 +66,15 @@
"IAccessible2" : [
[
"property",
- "objectAttribute",
- "checkable",
- "true"
+ "objectAttributes",
+ "contains",
+ "checkable:true"
],
[
"property",
"states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "doesNotContain",
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -124,4 +125,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_unspecified-manual.html
index 6f359dc9460..73a3b93fc24 100644
--- a/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/checkbox_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>checkbox readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,15 +60,21 @@
"IAccessible2" : [
[
"property",
- "objectAttribute",
- "checkable",
- "true"
+ "role",
+ "is",
+ "ROLE_SYSTEM_CHECKBUTTON"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "checkable:true"
],
[
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -112,4 +119,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_div-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_div-manual.html
index ce05c29847f..7b151c52209 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_div-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_div-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader aria-colspan 2 on div</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "colspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "colspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "colspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3-manual.html
index b24e00b4cc5..51824ee40d6 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader aria-colspan 2 on th html colspan 3</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,9 @@
],
[
"property",
- "colspan",
- "isNot",
- "2"
+ "objectAttributes",
+ "doesNotContain",
+ "colspan:2"
]
],
"MSAA" : [
@@ -70,12 +71,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "colspan",
- "isNot",
- "2"
]
],
"UIA" : [
@@ -116,4 +111,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3_with_three_actual_columns-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3_with_three_actual_columns-manual.html
index 0654a5d288d..a26daed405e 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3_with_three_actual_columns-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_html_colspan_3_with_three_actual_columns-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader aria-colspan 2 on th html colspan 3 with three actual columns</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,9 +54,9 @@
],
[
"property",
- "colspan",
- "is",
- "3"
+ "objectAttributes",
+ "doesNotContain",
+ "colspan:2"
]
],
"MSAA" : [
@@ -64,12 +65,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "colspan",
- "is",
- "3"
]
],
"UIA" : [
@@ -113,4 +108,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_with_html_colspan_not_specified-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_with_html_colspan_not_specified-manual.html
index 99f35b08328..44d11c1d7e6 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_with_html_colspan_not_specified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-colspan_2_on_th_with_html_colspan_not_specified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader aria-colspan 2 on th with html colspan not specified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "colspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "colspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "colspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_div-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_div-manual.html
index 09d958d4612..cae113bace4 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_div-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_div-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader aria-rowspan 2 on div</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "rowspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "rowspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "rowspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3-manual.html
index 6447f6c5267..efff45ff766 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader aria-rowspan 2 on th html rowspan 3</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,9 @@
],
[
"property",
- "rowspan",
- "isNot",
- "2"
+ "objectAttributes",
+ "doesNotContain",
+ "rowspan:2"
]
],
"MSAA" : [
@@ -70,12 +71,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "rowspan",
- "isNot",
- "2"
]
],
"UIA" : [
@@ -116,4 +111,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3_with_three_actual_rows-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3_with_three_actual_rows-manual.html
index 988cf857a49..3d964edb036 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3_with_three_actual_rows-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_html_rowspan_3_with_three_actual_rows-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader aria-rowspan 2 on th html rowspan 3 with three actual rows</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,9 +54,9 @@
],
[
"property",
- "rowspan",
- "is",
- "3"
+ "objectAttributes",
+ "doesNotContain",
+ "rowspan:2"
]
],
"MSAA" : [
@@ -64,12 +65,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "rowspan",
- "is",
- "3"
]
],
"UIA" : [
@@ -117,4 +112,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_with_html_rowspan_not_specified-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_with_html_rowspan_not_specified-manual.html
index 4c5c1ec5f18..f2298d0cc04 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_with_html_rowspan_not_specified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_aria-rowspan_2_on_th_with_html_rowspan_not_specified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader aria-rowspan 2 on th with html rowspan not specified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "rowspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "rowspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "rowspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_colindex_4-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_colindex_4-manual.html
index 7049a447067..c48e5f168f4 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_colindex_4-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_colindex_4-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader colindex 4</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,7 +60,7 @@
],
[
"property",
- "interface",
+ "interfaces",
"contains",
"IAccessibleTableCell"
],
@@ -68,9 +69,10 @@
"objectAttributes",
"contains",
"colindex:4"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -115,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_rowindex_4-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_rowindex_4-manual.html
index f233f922439..1e45ca31e3d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_rowindex_4-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_rowindex_4-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader rowindex 4</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,9 @@
],
[
"property",
- "rowindex",
- "is",
- "4"
+ "objectAttributes",
+ "contains",
+ "rowindex:4"
]
],
"MSAA" : [
@@ -70,12 +71,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "rowindex",
- "is",
- "4"
]
],
"UIA" : [
@@ -116,4 +111,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_selected_false_not_automatically_propagated-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_selected_false_not_automatically_propagated-manual.html
index 95a1758f3b5..4a905976a9a 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_selected_false_not_automatically_propagated-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_selected_false_not_automatically_propagated-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader selected false not automatically propagated</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -131,4 +132,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/columnheader_selected_true_not_automatically_propagated-manual.html b/tests/wpt/web-platform-tests/wai-aria/columnheader_selected_true_not_automatically_propagated-manual.html
index 0902894b4c4..8d000b17e0d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/columnheader_selected_true_not_automatically_propagated-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/columnheader_selected_true_not_automatically_propagated-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>columnheader selected true not automatically propagated</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -131,4 +132,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_controls_an_invalid_id-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_controls_an_invalid_id-manual.html
index ecc54781ccd..88b4229fff9 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_controls_an_invalid_id-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_controls_an_invalid_id-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox controls an invalid ID</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -70,8 +71,7 @@
"doesNotContain",
"IA2_RELATION_CONTROLLED_BY"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -97,4 +97,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_dialog-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_dialog-manual.html
index 0d41e5c22af..4a52872e950 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_dialog-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_dialog-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox haspopup dialog</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -78,17 +79,17 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_COMBOBOX"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:dialog"
@@ -160,4 +161,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_false-manual.html
index 14b281477f8..5a6036ad7ec 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox haspopup false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -72,17 +73,17 @@
"actions",
"doesNotContain",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "doesNotContain",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_COMBOBOX"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:false"
@@ -154,4 +155,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_grid-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_grid-manual.html
index 25a8964d3db..a68ce448308 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_grid-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_grid-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox haspopup grid</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -78,12 +79,6 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
@@ -168,4 +163,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_listbox-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_listbox-manual.html
index 845015c3954..4d97620623d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_listbox-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_listbox-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox haspopup listbox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -78,12 +79,6 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
@@ -158,4 +153,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_menu-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_menu-manual.html
index 69ca2f208cb..8be6b44892d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_menu-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_menu-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox haspopup menu</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -78,12 +79,6 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
@@ -158,4 +153,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_tree-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_tree-manual.html
index c4ee41b4a3c..546e42658c8 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_tree-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_tree-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox haspopup tree</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -78,12 +79,6 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
@@ -175,4 +170,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_true-manual.html
index e9083b9daee..5f324041222 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox haspopup true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -78,17 +79,17 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_COMBOBOX"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:true"
@@ -160,4 +161,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_unspecified-manual.html
index ef75ece29d6..f2d3599d02d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_haspopup_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox haspopup unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -78,17 +79,17 @@
"actions",
"contains",
"AXShowMenu"
- ],
- [
- "property",
- "actions",
- "contains",
- "AXPress"
]
],
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_COMBOBOX"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"haspopup:listbox"
@@ -157,4 +158,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_horizontal-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_horizontal-manual.html
index 459a5420734..1d173cde0b0 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_horizontal-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_horizontal-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox orientation horizontal</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -121,4 +122,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_unspecified-manual.html
index e6e07164485..a31cce50961 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -121,4 +122,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_vertical-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_vertical-manual.html
index 59e108c80a7..40e131e7326 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_vertical-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_orientation_vertical-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox orientation vertical</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -121,4 +122,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_false-manual.html
index c037ad8356d..476bf2f0e84 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -71,15 +72,21 @@
"IAccessible2" : [
[
"property",
- "objectAttribute",
- "checkable",
- "true"
+ "role",
+ "is",
+ "ROLE_SYSTEM_COMBOBOX"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:listbox"
],
[
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -94,6 +101,12 @@
"states",
"contains",
"STATE_SYSTEM_HASPOPUP"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_EXPANDED"
]
],
"UIA" : [
@@ -135,4 +148,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_true-manual.html
index 26a066621a5..a7484763f36 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -71,15 +72,21 @@
"IAccessible2" : [
[
"property",
- "objectAttribute",
- "checkable",
- "true"
+ "role",
+ "is",
+ "ROLE_SYSTEM_COMBOBOX"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:listbox"
],
[
"property",
"states",
"doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -100,6 +107,12 @@
"states",
"contains",
"STATE_SYSTEM_READONLY"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_EXPANDED"
]
],
"UIA" : [
@@ -141,4 +154,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_unspecified-manual.html
index 9c7d08e7c76..1ee51e58460 100644
--- a/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/combobox_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>combobox readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -71,15 +72,21 @@
"IAccessible2" : [
[
"property",
- "objectAttribute",
- "checkable",
- "true"
+ "role",
+ "is",
+ "ROLE_SYSTEM_COMBOBOX"
+ ],
+ [
+ "property",
+ "objectAttributes",
+ "contains",
+ "haspopup:listbox"
],
[
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -94,6 +101,12 @@
"states",
"contains",
"STATE_SYSTEM_HASPOPUP"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "STATE_SYSTEM_EXPANDED"
]
],
"UIA" : [
@@ -135,4 +148,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/dialog_modal_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/dialog_modal_false-manual.html
index f3e0889f1e5..254dbe56c4b 100644
--- a/tests/wpt/web-platform-tests/wai-aria/dialog_modal_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/dialog_modal_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>dialog modal false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,6 +54,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_DIALOG"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
"IA2_STATE_MODAL"
@@ -94,8 +101,7 @@
"is",
"true"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -120,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/dialog_modal_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/dialog_modal_true-manual.html
index e355d650174..4b5dfd689dc 100644
--- a/tests/wpt/web-platform-tests/wai-aria/dialog_modal_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/dialog_modal_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>dialog modal true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,6 +54,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_DIALOG"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_MODAL"
@@ -94,8 +101,7 @@
"is",
"false"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -121,4 +127,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/dialog_modal_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/dialog_modal_unspecified-manual.html
index 9351d52822e..80366a6914b 100644
--- a/tests/wpt/web-platform-tests/wai-aria/dialog_modal_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/dialog_modal_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>dialog modal unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -53,6 +54,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_DIALOG"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
"IA2_STATE_MODAL"
@@ -94,8 +101,7 @@
"is",
"true"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -120,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/div_element_without_role_roledescription_valid-manual.html b/tests/wpt/web-platform-tests/wai-aria/div_element_without_role_roledescription_valid-manual.html
index 3c55e708a15..091c0348978 100644
--- a/tests/wpt/web-platform-tests/wai-aria/div_element_without_role_roledescription_valid-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/div_element_without_role_roledescription_valid-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>div element without role roledescription valid</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,8 +66,14 @@
"IAccessible2" : [
[
"property",
- "IAccessible2_2.localizedExtendedRole",
- "contains",
+ "role",
+ "is",
+ "IA2_ROLE_SECTION"
+ ],
+ [
+ "property",
+ "localizedExtendedRole",
+ "is",
"null"
],
[
@@ -120,4 +127,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/errormessage_object_in_invalid_state-manual.html b/tests/wpt/web-platform-tests/wai-aria/errormessage_object_in_invalid_state-manual.html
index 7be7673189a..3762b340ebe 100644
--- a/tests/wpt/web-platform-tests/wai-aria/errormessage_object_in_invalid_state-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/errormessage_object_in_invalid_state-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>errormessage object in invalid state</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -20,8 +21,8 @@
[
"relation",
"RELATION_ERROR_MESSAGE",
- "exists",
- "false"
+ "is",
+ "[error]"
]
],
"AXAPI" : [
@@ -34,18 +35,18 @@
],
"IAccessible2" : [
[
- "relation",
- "IA2_RELATION_ERROR_MESSAGE",
- "exists",
- "false"
+ "properties",
+ "relations",
+ "contains",
+ "IA2_RELATION_ERROR_MESSAGE"
]
],
"UIA" : [
[
"property",
"IUIAutomationElement.ControllerFor",
- "exists",
- "false"
+ "is",
+ "error"
]
]
},
@@ -59,19 +60,18 @@
[
"relation",
"RELATION_ERROR_FOR",
- "exists",
- "false"
+ "is",
+ "[test]"
]
],
"IAccessible2" : [
[
- "relation",
- "IA2_RELATION_ERROR_FOR",
- "exists",
- "false"
+ "property",
+ "relations",
+ "contains",
+ "IA2_RELATION_ERROR_FOR"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -86,8 +86,8 @@
<body>
<p>This test examines the ARIA properties for errormessage object in invalid state.</p>
<div role="form">
- <label for="test">date</label><input type="text" id="test" value="April 12" aria-errormessage="error2">
- <label for="test1">surname</label><input type="text" id="test1" value="April 14">
+ <label for="test">date</label><input type="text" id="test" value="foo" aria-invalid="true" aria-errormessage="error">
+ <label for="test1">surname</label><input type="text" id="test1">
</div>
<div id="error">
You did not enter a valid date!
@@ -99,4 +99,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/errormessage_object_in_valid_state-manual.html b/tests/wpt/web-platform-tests/wai-aria/errormessage_object_in_valid_state-manual.html
index 5748915eed7..4c08d261fa1 100644
--- a/tests/wpt/web-platform-tests/wai-aria/errormessage_object_in_valid_state-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/errormessage_object_in_valid_state-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>errormessage object in valid state</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -18,10 +19,10 @@
"test" : {
"ATK" : [
[
- "relation",
- "RELATION_ERROR_MESSAGE",
- "is",
- "error"
+ "property",
+ "relations",
+ "doesNotContain",
+ "RELATION_ERROR_MESSAGE"
]
],
"AXAPI" : [
@@ -34,18 +35,18 @@
],
"IAccessible2" : [
[
- "relation",
- "IA2_RELATION_ERROR_MESSAGE",
- "is",
- "error"
+ "property",
+ "relations",
+ "doesNotContain",
+ "IA2_RELATION_ERROR_MESSAGE"
]
],
"UIA" : [
[
"property",
"IUIAutomationElement.ControllerFor",
- "is",
- "error"
+ "exists",
+ "false"
]
]
},
@@ -57,21 +58,20 @@
"test" : {
"ATK" : [
[
- "relation",
- "RELATION_ERROR_FOR",
- "is",
- "test"
+ "property",
+ "relations",
+ "doesNotContain",
+ "RELATION_ERROR_FOR"
]
],
"IAccessible2" : [
[
- "relation",
- "IA2_RELATION_ERROR_FOR",
- "is",
- "test"
+ "property",
+ "relations",
+ "doesNotContain",
+ "IA2_RELATION_ERROR_FOR"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -86,8 +86,8 @@
<body>
<p>This test examines the ARIA properties for errormessage object in valid state.</p>
<div role="form">
- <label for="test">date</label><input type="text" id="test" value="April 12" aria-errormessage="error">
- <label for="test1">surname</label><input type="text" id="test1" value="April 14">
+ <label for="test">date</label><input type="text" id="test" value="April 12" aria-invalid="false" aria-errormessage="error">
+ <label for="test1">surname</label><input type="text" id="test1">
</div>
<div id="error">
You did not enter a valid date!
@@ -99,4 +99,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/feed-manual.html b/tests/wpt/web-platform-tests/wai-aria/feed-manual.html
index 873e8fab33f..ad9f1da823c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/feed-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/feed-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>feed</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -103,4 +104,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/figure-manual.html b/tests/wpt/web-platform-tests/wai-aria/figure-manual.html
index b460d642716..511168685d5 100644
--- a/tests/wpt/web-platform-tests/wai-aria/figure-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/figure-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>figure</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -104,4 +105,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_aria-readonly_false_automatically_propagated-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_aria-readonly_false_automatically_propagated-manual.html
index 8e73577e030..3676a10c092 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_aria-readonly_false_automatically_propagated-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_aria-readonly_false_automatically_propagated-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid aria-readonly false automatically propagated</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -247,4 +248,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_aria-readonly_true_automatically_propagated-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_aria-readonly_true_automatically_propagated-manual.html
index 96a6db40334..0be4cb43175 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_aria-readonly_true_automatically_propagated-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_aria-readonly_true_automatically_propagated-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid aria-readonly true automatically propagated</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -247,4 +248,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_busy_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_busy_false-manual.html
index bc33e8e03e9..1a9572ce800 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_busy_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_busy_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid busy false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -161,4 +162,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_busy_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_busy_true-manual.html
index 29b7ff931fa..37c79ad19d3 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_busy_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_busy_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid busy true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -155,4 +156,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_busy_value_changes-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_busy_value_changes-manual.html
index e296b0b4924..37529516f6d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_busy_value_changes-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_busy_value_changes-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid busy value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -198,4 +199,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_colcount_8-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_colcount_8-manual.html
index 60453cb9728..50641725909 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_colcount_8-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_colcount_8-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid colcount 8</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -80,9 +81,10 @@
"objectAttributes",
"contains",
"colcount:8"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -127,4 +129,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_false-manual.html
index 00379b6daf4..6ff7fe3ab20 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid columnheader readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -44,6 +45,20 @@
"true"
]
],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_COLUMNHEADER"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_EDITABLE"
+ ]
+ ],
"MSAA" : [
[
"property",
@@ -96,4 +111,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_true-manual.html
index da549171006..d90852a8bff 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid columnheader readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -44,6 +45,14 @@
"false"
]
],
+ "IAccessible2" : [
+ [
+ "property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_COLUMNHEADER"
+ ]
+ ],
"MSAA" : [
[
"property",
@@ -96,4 +105,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_unspecified-manual.html
index 862ebb75e4c..35910c361ff 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid columnheader readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -96,4 +97,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_false-manual.html
index 7ebebbfed66..45a5002d237 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid columnheader required false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -52,10 +53,10 @@
"ROLE_SYSTEM_COLUMNHEADER"
],
[
- "state",
- "IA2_STATE_REQUIRED",
- "is",
- "false"
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_REQUIRED"
]
],
"MSAA" : [
@@ -64,12 +65,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "STATE_REQUIRED"
]
],
"UIA" : [
@@ -110,4 +105,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_true-manual.html
index e6aead6abd4..41c936f443c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid columnheader required true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -52,10 +53,10 @@
"ROLE_SYSTEM_COLUMNHEADER"
],
[
- "state",
- "IA2_STATE_REQUIRED",
- "is",
- "true"
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_REQUIRED"
]
],
"MSAA" : [
@@ -64,12 +65,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "states",
- "contains",
- "STATE_REQUIRED"
]
],
"UIA" : [
@@ -110,4 +105,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_unspecified-manual.html
index 39d3ba20cb1..feeef96e38a 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_columnheader_required_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid columnheader required unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -52,10 +53,10 @@
"ROLE_SYSTEM_COLUMNHEADER"
],
[
- "state",
- "IA2_STATE_REQUIRED",
- "is",
- "false"
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_REQUIRED"
]
],
"MSAA" : [
@@ -64,12 +65,6 @@
"role",
"is",
"ROLE_SYSTEM_COLUMNHEADER"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "STATE_REQUIRED"
]
],
"UIA" : [
@@ -110,4 +105,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_rowcount_3-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_rowcount_3-manual.html
index 0da98e3be6c..6a4b1408df3 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_rowcount_3-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_rowcount_3-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid rowcount 3</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -88,18 +89,6 @@
"role",
"is",
"ROLE_SYSTEM_TABLE"
- ],
- [
- "property",
- "objectAttributes",
- "contains",
- "xml-roles:grid"
- ],
- [
- "property",
- "rowcount",
- "is",
- "3"
]
],
"UIA" : [
@@ -142,4 +131,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_false-manual.html
index de9f681fae6..d7e923f7cc0 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid rowheader readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -96,4 +97,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_true-manual.html
index d7ac28398d6..62351e008bc 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid rowheader readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -96,4 +97,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_unspecified-manual.html
index 789bd7e2974..18152526b05 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid rowheader readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -96,4 +97,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_false-manual.html
index f37ad4052cb..92aab07bbb4 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid rowheader required false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -52,10 +53,10 @@
"ROLE_SYSTEM_ROWHEADER"
],
[
- "state",
- "IA2_STATE_REQUIRED",
- "is",
- "false"
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_REQUIRED"
]
],
"MSAA" : [
@@ -64,12 +65,6 @@
"role",
"is",
"ROLE_SYSTEM_ROWHEADER"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "STATE_REQUIRED"
]
],
"UIA" : [
@@ -110,4 +105,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_true-manual.html
index 89a302408ee..69df488c8ec 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid rowheader required true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -52,10 +53,10 @@
"ROLE_SYSTEM_ROWHEADER"
],
[
- "state",
- "IA2_STATE_REQUIRED",
- "is",
- "true"
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_REQUIRED"
]
],
"MSAA" : [
@@ -64,12 +65,6 @@
"role",
"is",
"ROLE_SYSTEM_ROWHEADER"
- ],
- [
- "property",
- "states",
- "contains",
- "STATE_REQUIRED"
]
],
"UIA" : [
@@ -110,4 +105,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_unspecified-manual.html
index 1e89d79c27d..e70bd6ac3d1 100644
--- a/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/grid_rowheader_required_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>grid rowheader required unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -52,10 +53,10 @@
"ROLE_SYSTEM_ROWHEADER"
],
[
- "state",
- "IA2_STATE_REQUIRED",
- "is",
- "false"
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_REQUIRED"
]
],
"MSAA" : [
@@ -64,12 +65,6 @@
"role",
"is",
"ROLE_SYSTEM_ROWHEADER"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "STATE_REQUIRED"
]
],
"UIA" : [
@@ -110,4 +105,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/gridcell_aria-colspan_2_on_div-manual.html b/tests/wpt/web-platform-tests/wai-aria/gridcell_aria-colspan_2_on_div-manual.html
index aa35eb04d3f..9ef3f2856ed 100644
--- a/tests/wpt/web-platform-tests/wai-aria/gridcell_aria-colspan_2_on_div-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/gridcell_aria-colspan_2_on_div-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>gridcell aria-colspan 2 on div</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "colspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "colspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "colspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/gridcell_aria-rowspan_2_on_div-manual.html b/tests/wpt/web-platform-tests/wai-aria/gridcell_aria-rowspan_2_on_div-manual.html
index 4fa60114a3a..ffb187df2c2 100644
--- a/tests/wpt/web-platform-tests/wai-aria/gridcell_aria-rowspan_2_on_div-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/gridcell_aria-rowspan_2_on_div-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>gridcell aria-rowspan 2 on div</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "rowspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "rowspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "rowspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/gridcell_colindex_4-manual.html b/tests/wpt/web-platform-tests/wai-aria/gridcell_colindex_4-manual.html
index 7b81cd6d88b..d90bee37e6d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/gridcell_colindex_4-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/gridcell_colindex_4-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>gridcell colindex 4</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,7 +60,7 @@
],
[
"property",
- "interface",
+ "interfaces",
"contains",
"IAccessibleTableCell"
],
@@ -68,9 +69,10 @@
"objectAttributes",
"contains",
"colindex:4"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -115,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/gridcell_rowindex_4-manual.html b/tests/wpt/web-platform-tests/wai-aria/gridcell_rowindex_4-manual.html
index 0cdc0a7451c..478fc14111e 100644
--- a/tests/wpt/web-platform-tests/wai-aria/gridcell_rowindex_4-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/gridcell_rowindex_4-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>gridcell rowindex 4</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,9 @@
],
[
"property",
- "rowindex",
- "is",
- "4"
+ "objectAttributes",
+ "contains",
+ "rowindex:4"
]
],
"MSAA" : [
@@ -70,12 +71,6 @@
"role",
"is",
"ROLE_SYSTEM_CELL"
- ],
- [
- "property",
- "rowindex",
- "is",
- "4"
]
],
"UIA" : [
@@ -116,4 +111,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/group_hidden_undefined_element_not_rendered-manual.html b/tests/wpt/web-platform-tests/wai-aria/group_hidden_undefined_element_not_rendered-manual.html
index 4fe2852f55a..0f3ea8a42d0 100644
--- a/tests/wpt/web-platform-tests/wai-aria/group_hidden_undefined_element_not_rendered-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/group_hidden_undefined_element_not_rendered-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>group hidden undefined element not rendered</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -78,4 +79,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/group_hidden_undefined_element_rendered-manual.html b/tests/wpt/web-platform-tests/wai-aria/group_hidden_undefined_element_rendered-manual.html
index 00c60ca8f7b..8f8baf849d7 100644
--- a/tests/wpt/web-platform-tests/wai-aria/group_hidden_undefined_element_rendered-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/group_hidden_undefined_element_rendered-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>group hidden undefined element rendered</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -67,7 +68,7 @@
"property",
"objectAttributes",
"doesNotContain",
- "hidden"
+ "hidden:false"
]
],
"MSAA" : [
@@ -76,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_GROUPING"
- ],
- [
- "property",
- "objectAttributes",
- "doesNotContain",
- "hidden"
]
],
"UIA" : [
@@ -120,4 +115,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/heading_level_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/heading_level_unspecified-manual.html
index dd399096962..69962b702eb 100644
--- a/tests/wpt/web-platform-tests/wai-aria/heading_level_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/heading_level_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>heading level unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -118,4 +119,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/keyshortcuts_multiple_shortcuts-manual.html b/tests/wpt/web-platform-tests/wai-aria/keyshortcuts_multiple_shortcuts-manual.html
index 59d0f074bb7..7f0cf9a23de 100644
--- a/tests/wpt/web-platform-tests/wai-aria/keyshortcuts_multiple_shortcuts-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/keyshortcuts_multiple_shortcuts-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>keyshortcuts multiple shortcuts</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -106,4 +107,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/keyshortcuts_one_shortcut-manual.html b/tests/wpt/web-platform-tests/wai-aria/keyshortcuts_one_shortcut-manual.html
index 97d5f78bc9b..2ad4b9856fd 100644
--- a/tests/wpt/web-platform-tests/wai-aria/keyshortcuts_one_shortcut-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/keyshortcuts_one_shortcut-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>keyshortcuts one shortcut</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -106,4 +107,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/listbox_busy_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/listbox_busy_false-manual.html
index ac240850b6a..59e3ad6ca75 100644
--- a/tests/wpt/web-platform-tests/wai-aria/listbox_busy_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/listbox_busy_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>listbox busy false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -119,4 +120,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/listbox_busy_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/listbox_busy_true-manual.html
index 1fc7e05b7f7..5a618aa1fd9 100644
--- a/tests/wpt/web-platform-tests/wai-aria/listbox_busy_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/listbox_busy_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>listbox busy true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -107,4 +108,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_horizontal-manual.html b/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_horizontal-manual.html
index 2255425ea13..8d75c69ba53 100644
--- a/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_horizontal-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_horizontal-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>listbox orientation horizontal</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -126,4 +127,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_unspecified-manual.html
index 1b1a68932b5..36276271c45 100644
--- a/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>listbox orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -126,4 +127,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_vertical-manual.html b/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_vertical-manual.html
index 3e45ecd9e4a..ba8b77bbe8c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_vertical-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/listbox_orientation_vertical-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>listbox orientation vertical</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -126,4 +127,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_false-manual.html
index 8cbf21cbf1d..4733d641a4e 100644
--- a/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>listbox readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,9 +66,15 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LIST"
+ ],
+ [
+ "property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -116,4 +123,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_true-manual.html
index 867c1d3a491..3a9f7940ed9 100644
--- a/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>listbox readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,9 +66,15 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LIST"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -122,4 +129,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_unspecified-manual.html
index a0e5be9cb91..15ed93fe827 100644
--- a/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/listbox_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>listbox readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,9 +66,15 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_LIST"
+ ],
+ [
+ "property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -116,4 +123,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/listitem_setsize_-1-manual.html b/tests/wpt/web-platform-tests/wai-aria/listitem_setsize_-1-manual.html
index bab050aba39..48cd2d08dff 100644
--- a/tests/wpt/web-platform-tests/wai-aria/listitem_setsize_-1-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/listitem_setsize_-1-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>listitem setsize -1</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -70,8 +71,8 @@
"setsize:-1"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"similarItemsInGroup:-1"
]
@@ -132,4 +133,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menu_orientation_horizontal-manual.html b/tests/wpt/web-platform-tests/wai-aria/menu_orientation_horizontal-manual.html
index 4265de223c3..d7a00c9173c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menu_orientation_horizontal-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menu_orientation_horizontal-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menu orientation horizontal</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,6 +60,18 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_MENUPOPUP"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_VERTICAL"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_HORIZONTAL"
@@ -109,4 +122,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menu_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/menu_orientation_unspecified-manual.html
index e20e8a8e6a5..f0a0266a9a9 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menu_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menu_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menu orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -120,4 +121,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menu_orientation_vertical-manual.html b/tests/wpt/web-platform-tests/wai-aria/menu_orientation_vertical-manual.html
index 3e1bf3792d4..530918a7c83 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menu_orientation_vertical-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menu_orientation_vertical-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menu orientation vertical</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,21 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_MENUPOPUP"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_VERTICAL"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_HORIZONTAL"
]
],
"MSAA" : [
@@ -109,4 +122,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menubar_busy_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/menubar_busy_false-manual.html
index 1af63117a3c..e86c24ab99e 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menubar_busy_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menubar_busy_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menubar busy false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -80,7 +81,7 @@
[
"property",
"states",
- "doesNotcontain",
+ "doesNotContain",
"STATE_SYSTEM_BUSY"
]
],
@@ -128,4 +129,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menubar_busy_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/menubar_busy_true-manual.html
index 16afee19bcf..6665c95ffac 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menubar_busy_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menubar_busy_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menubar busy true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -128,4 +129,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_horizontal-manual.html b/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_horizontal-manual.html
index 617be2808c8..e480aa33224 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_horizontal-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_horizontal-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menubar orientation horizontal</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,6 +60,18 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_MENUBAR"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_VERTICAL"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_HORIZONTAL"
@@ -109,4 +122,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_unspecified-manual.html
index 86dc4fb8bd4..dbb162317c8 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menubar orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,6 +60,18 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_MENUBAR"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_VERTICAL"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_HORIZONTAL"
@@ -109,4 +122,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_vertical-manual.html b/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_vertical-manual.html
index 75698ef91a4..a258dd8392f 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_vertical-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menubar_orientation_vertical-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menubar orientation vertical</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -109,4 +110,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menuitem_posinset_and_setsize-manual.html b/tests/wpt/web-platform-tests/wai-aria/menuitem_posinset_and_setsize-manual.html
index d2b31a59364..a8bfb63e383 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menuitem_posinset_and_setsize-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menuitem_posinset_and_setsize-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menuitem posinset and setsize</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -82,14 +83,14 @@
"setsize:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"similarItemsInGroup:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"positionInGroup:4"
]
@@ -146,4 +147,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_posinset_and_setsize-manual.html b/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_posinset_and_setsize-manual.html
index 6bc36186138..ec0c7a3969e 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_posinset_and_setsize-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_posinset_and_setsize-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menuitemcheckbox posinset and setsize</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -112,14 +113,14 @@
"setsize:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"similarItemsInGroup:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"positionInGroup:4"
]
@@ -128,7 +129,7 @@
[
"property",
"role",
- "anyOf",
+ "isAny",
"[ROLE_SYSTEM_MENUITEM, ROLE_SYSTEM_CHECKBUTTON]"
]
],
@@ -183,4 +184,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_false-manual.html
index 8bc0e24f93c..bee4e4f6b65 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menuitemcheckbox readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,15 +66,15 @@
"IAccessible2" : [
[
"property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
- ],
- [
- "property",
"role",
"is",
"IA2_ROLE_CHECK_MENU_ITEM"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -81,7 +82,7 @@
"property",
"role",
"isAny",
- "ROLE_SYSTEM_CHECKBUTTON or ROLE_SYSTEM_MENUITEM"
+ "[ROLE_SYSTEM_CHECKBUTTON, ROLE_SYSTEM_MENUITEM]"
]
],
"UIA" : [
@@ -126,4 +127,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_true-manual.html
index 1c0bd8c14ce..e30b1bda6e9 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menuitemcheckbox readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,15 +60,15 @@
"IAccessible2" : [
[
"property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
- ],
- [
- "property",
"role",
"is",
"IA2_ROLE_CHECK_MENU_ITEM"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -75,7 +76,7 @@
"property",
"role",
"isAny",
- "ROLE_SYSTEM_CHECKBUTTON or ROLE_SYSTEM_MENUITEM"
+ "[ROLE_SYSTEM_CHECKBUTTON, ROLE_SYSTEM_MENUITEM]"
],
[
"property",
@@ -126,4 +127,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_unspecified-manual.html
index 2b8fc57c30b..b9997ab8e4e 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menuitemcheckbox_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menuitemcheckbox readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,15 +60,15 @@
"IAccessible2" : [
[
"property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
- ],
- [
- "property",
"role",
"is",
"IA2_ROLE_CHECK_MENU_ITEM"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -75,7 +76,7 @@
"property",
"role",
"isAny",
- "ROLE_SYSTEM_CHECKBUTTON or ROLE_SYSTEM_MENUITEM"
+ "[ROLE_SYSTEM_CHECKBUTTON, ROLE_SYSTEM_MENUITEM]"
]
],
"UIA" : [
@@ -120,4 +121,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menuitemradio_posinset_and_setsize-manual.html b/tests/wpt/web-platform-tests/wai-aria/menuitemradio_posinset_and_setsize-manual.html
index bd6f8021c50..2d32a57e209 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menuitemradio_posinset_and_setsize-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menuitemradio_posinset_and_setsize-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menuitemradio posinset and setsize</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -112,14 +113,14 @@
"setsize:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"similarItemsInGroup:8"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"positionInGroup:4"
]
@@ -128,7 +129,7 @@
[
"property",
"role",
- "anyOf",
+ "isAny",
"[ROLE_SYSTEM_RADIOBUTTON, ROLE_SYSTEM_MENUITEM]"
]
],
@@ -194,4 +195,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_false-manual.html
index 3ff91d30ae1..d7077250843 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menuitemradio readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,23 +60,23 @@
"IAccessible2" : [
[
"property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
- ],
- [
- "property",
"role",
"is",
"IA2_ROLE_RADIO_MENU_ITEM"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
[
"property",
"role",
- "is",
- "ROLE_SYSTEM_RADIOBUTTON or ROLE_SYSTEM_MENUITEM"
+ "isAny",
+ "[ROLE_SYSTEM_RADIOBUTTON, ROLE_SYSTEM_MENUITEM]"
]
],
"UIA" : [
@@ -126,4 +127,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_true-manual.html
index 45d8294fdf3..990b4fa5d55 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menuitemradio readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,23 +66,23 @@
"IAccessible2" : [
[
"property",
- "states",
- "doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
- ],
- [
- "property",
"role",
"is",
"IA2_ROLE_RADIO_MENU_ITEM"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
[
"property",
"role",
- "is",
- "ROLE_SYSTEM_RADIOBUTTON or ROLE_SYSTEM_MENUITEM"
+ "isAny",
+ "[ROLE_SYSTEM_RADIOBUTTON, ROLE_SYSTEM_MENUITEM]"
],
[
"property",
@@ -138,4 +139,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_unspecified-manual.html
index f06ed0750d2..ccad591be8c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/menuitemradio_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>menuitemradio readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,23 +60,23 @@
"IAccessible2" : [
[
"property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
- ],
- [
- "property",
"role",
"is",
"IA2_ROLE_RADIO_MENU_ITEM"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
[
"property",
"role",
- "is",
- "ROLE_SYSTEM_RADIOBUTTON or ROLE_SYSTEM_MENUITEM"
+ "isAny",
+ "[ROLE_SYSTEM_RADIOBUTTON, ROLE_SYSTEM_MENUITEM]"
]
],
"UIA" : [
@@ -126,4 +127,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/none-manual.html b/tests/wpt/web-platform-tests/wai-aria/none-manual.html
index bb36df8797f..a286a592a51 100644
--- a/tests/wpt/web-platform-tests/wai-aria/none-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/none-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>none</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -76,4 +77,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/option_selected_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/option_selected_false-manual.html
index 9851fcac1c7..e77d50c3cf3 100644
--- a/tests/wpt/web-platform-tests/wai-aria/option_selected_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/option_selected_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>option selected false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -129,4 +130,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/option_selected_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/option_selected_true-manual.html
index a70ca31a0ba..b9839f87207 100644
--- a/tests/wpt/web-platform-tests/wai-aria/option_selected_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/option_selected_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>option selected true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -129,4 +130,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/option_selected_undefined-manual.html b/tests/wpt/web-platform-tests/wai-aria/option_selected_undefined-manual.html
index ce4dc1276a2..f13ccfa3871 100644
--- a/tests/wpt/web-platform-tests/wai-aria/option_selected_undefined-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/option_selected_undefined-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>option selected undefined</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -129,4 +130,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/option_selected_value_changes-manual.html b/tests/wpt/web-platform-tests/wai-aria/option_selected_value_changes-manual.html
index bd44dec2608..f11e4893e4e 100644
--- a/tests/wpt/web-platform-tests/wai-aria/option_selected_value_changes-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/option_selected_value_changes-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>option selected value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -51,14 +52,6 @@
"1"
]
],
- "AXAPI" : [
- [
- "event",
- "type",
- "is",
- "AXSelectedChildrenChanged"
- ]
- ],
"MSAA" : [
[
"event",
@@ -96,7 +89,14 @@
"object:selection-changed"
]
],
- "AXAPI" : []
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXSelectedChildrenChanged"
+ ]
+ ]
},
"title" : "step 5",
"type" : "test"
@@ -145,4 +145,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_horizontal-manual.html b/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_horizontal-manual.html
index 3af635594cf..82b91ec6bde 100644
--- a/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_horizontal-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_horizontal-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>radiogroup orientation horizontal</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,6 +60,18 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_GROUPING"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_VERTICAL"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_HORIZONTAL"
@@ -109,4 +122,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_unspecified-manual.html
index 277649824a6..97e5e5a5eb6 100644
--- a/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>radiogroup orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,6 +66,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_GROUPING"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
"IA2_STATE_VERTICAL"
@@ -127,4 +134,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_vertical-manual.html b/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_vertical-manual.html
index 539967e05ee..4442f25364a 100644
--- a/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_vertical-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/radiogroup_orientation_vertical-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>radiogroup orientation vertical</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -109,4 +110,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_false-manual.html
index 62556327677..e99875afa51 100644
--- a/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>radiogroup readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -67,7 +68,7 @@
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -76,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_GROUPING"
- ],
- [
- "property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -119,4 +114,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_true-manual.html
index 1f881d7bbc7..9955b9d3902 100644
--- a/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>radiogroup readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -67,7 +68,7 @@
"property",
"states",
"doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -76,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_GROUPING"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -119,4 +114,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_unspecified-manual.html
index af22109175d..d822301bdb0 100644
--- a/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/radiogroup_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>radiogroup readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -67,7 +68,7 @@
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -76,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_GROUPING"
- ],
- [
- "property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -119,4 +114,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/region_with_name-manual.html b/tests/wpt/web-platform-tests/wai-aria/region_with_name-manual.html
index 68187b17de8..0763660c892 100644
--- a/tests/wpt/web-platform-tests/wai-aria/region_with_name-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/region_with_name-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>region with name</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -112,4 +113,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/region_without_name-manual.html b/tests/wpt/web-platform-tests/wai-aria/region_without_name-manual.html
index b026c6553fa..bf2333e33bc 100644
--- a/tests/wpt/web-platform-tests/wai-aria/region_without_name-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/region_without_name-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>region without name</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -126,4 +127,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/row_colindex_4-manual.html b/tests/wpt/web-platform-tests/wai-aria/row_colindex_4-manual.html
index c18befeeb7f..060217f7559 100644
--- a/tests/wpt/web-platform-tests/wai-aria/row_colindex_4-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/row_colindex_4-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>row colindex 4</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -50,9 +51,10 @@
"objectAttributes",
"contains",
"colindex:4"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -107,8 +109,7 @@
"is",
"4"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -133,4 +134,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/row_rowindex_4-manual.html b/tests/wpt/web-platform-tests/wai-aria/row_rowindex_4-manual.html
index e3e12c2a83f..e391dffa7c7 100644
--- a/tests/wpt/web-platform-tests/wai-aria/row_rowindex_4-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/row_rowindex_4-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>row rowindex 4</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -47,9 +48,9 @@
],
[
"property",
- "rowindex",
- "is",
- "4"
+ "objectAttributes",
+ "contains",
+ "rowindex:4"
]
],
"MSAA" : [
@@ -58,12 +59,6 @@
"role",
"is",
"ROLE_SYSTEM_ROW"
- ],
- [
- "property",
- "rowindex",
- "is",
- "4"
]
],
"UIA" : [
@@ -114,8 +109,7 @@
"is",
"4"
]
- ],
- "UIA" : []
+ ]
},
"title" : "step 2",
"type" : "test"
@@ -140,4 +134,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/rowheader_aria-colspan_2_on_div-manual.html b/tests/wpt/web-platform-tests/wai-aria/rowheader_aria-colspan_2_on_div-manual.html
index c14243dd63b..883ebe02ee8 100644
--- a/tests/wpt/web-platform-tests/wai-aria/rowheader_aria-colspan_2_on_div-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/rowheader_aria-colspan_2_on_div-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>rowheader aria-colspan 2 on div</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "colspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "colspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_ROWHEADER"
- ],
- [
- "property",
- "colspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/rowheader_aria-rowspan_2_on_div-manual.html b/tests/wpt/web-platform-tests/wai-aria/rowheader_aria-rowspan_2_on_div-manual.html
index 4b535135551..e5c331fd819 100644
--- a/tests/wpt/web-platform-tests/wai-aria/rowheader_aria-rowspan_2_on_div-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/rowheader_aria-rowspan_2_on_div-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>rowheader aria-rowspan 2 on div</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,15 @@
],
[
"property",
- "rowspan",
- "is",
- "2"
+ "objectAttributes",
+ "contains",
+ "rowspan:2"
+ ],
+ [
+ "property",
+ "interfaces",
+ "contains",
+ "IAccessibleTableCell"
]
],
"MSAA" : [
@@ -70,12 +77,6 @@
"role",
"is",
"ROLE_SYSTEM_ROWHEADER"
- ],
- [
- "property",
- "rowspan",
- "is",
- "2"
]
],
"UIA" : [
@@ -116,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/rowheader_colindex_4-manual.html b/tests/wpt/web-platform-tests/wai-aria/rowheader_colindex_4-manual.html
index 601b4faaa1a..a48cd2f45b2 100644
--- a/tests/wpt/web-platform-tests/wai-aria/rowheader_colindex_4-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/rowheader_colindex_4-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>rowheader colindex 4</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,7 +60,7 @@
],
[
"property",
- "interface",
+ "interfaces",
"contains",
"IAccessibleTableCell"
],
@@ -68,9 +69,10 @@
"objectAttributes",
"contains",
"colindex:4"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -115,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/rowheader_rowindex_4-manual.html b/tests/wpt/web-platform-tests/wai-aria/rowheader_rowindex_4-manual.html
index 344bda5e95b..a146fc9bed6 100644
--- a/tests/wpt/web-platform-tests/wai-aria/rowheader_rowindex_4-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/rowheader_rowindex_4-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>rowheader rowindex 4</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,9 @@
],
[
"property",
- "rowindex",
- "is",
- "4"
+ "objectAttributes",
+ "contains",
+ "rowindex:4"
]
],
"MSAA" : [
@@ -70,12 +71,6 @@
"role",
"is",
"ROLE_SYSTEM_ROWHEADER"
- ],
- [
- "property",
- "rowindex",
- "is",
- "4"
]
],
"UIA" : [
@@ -116,4 +111,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/rowheader_selected_false_not_automatically_propagated-manual.html b/tests/wpt/web-platform-tests/wai-aria/rowheader_selected_false_not_automatically_propagated-manual.html
index fe23f4a3867..948b11e2c04 100644
--- a/tests/wpt/web-platform-tests/wai-aria/rowheader_selected_false_not_automatically_propagated-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/rowheader_selected_false_not_automatically_propagated-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>rowheader selected false not automatically propagated</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -131,4 +132,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/rowheader_selected_true_not_automatically_propagated-manual.html b/tests/wpt/web-platform-tests/wai-aria/rowheader_selected_true_not_automatically_propagated-manual.html
index 6b683f9890d..26aab4e6004 100644
--- a/tests/wpt/web-platform-tests/wai-aria/rowheader_selected_true_not_automatically_propagated-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/rowheader_selected_true_not_automatically_propagated-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>rowheader selected true not automatically propagated</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -131,4 +132,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/scrollbar_all_values_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/scrollbar_all_values_unspecified-manual.html
index 12ab554ed60..00d93148ee3 100644
--- a/tests/wpt/web-platform-tests/wai-aria/scrollbar_all_values_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/scrollbar_all_values_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>scrollbar all values unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -89,25 +90,31 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SCROLLBAR"
+ ],
+ [
+ "property",
"interfaces",
"contains",
"AccessibleValue"
],
[
- "result",
- "AccessibleValue.minimumValue",
+ "property",
+ "minimumValue",
"is",
"0"
],
[
- "result",
- "AccessibleValue.currentValue",
+ "property",
+ "currentValue",
"is",
"50"
],
[
- "result",
- "AccessibleValue.maximumValue",
+ "property",
+ "maximumValue",
"is",
"100"
]
@@ -174,4 +181,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/scrollbar_only_valuenow_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/scrollbar_only_valuenow_unspecified-manual.html
index 02414e7f7a7..8efb7edbf8d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/scrollbar_only_valuenow_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/scrollbar_only_valuenow_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>scrollbar only valuenow unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -89,25 +90,31 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SCROLLBAR"
+ ],
+ [
+ "property",
"interfaces",
"contains",
"AccessibleValue"
],
[
- "result",
- "AccessibleValue.minimumValue",
+ "property",
+ "minimumValue",
"is",
"0"
],
[
- "result",
- "AccessibleValue.currentValue",
+ "property",
+ "currentValue",
"is",
"20"
],
[
- "result",
- "AccessibleValue.maximumValue",
+ "property",
+ "maximumValue",
"is",
"40"
]
@@ -174,4 +181,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/scrollbar_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/scrollbar_orientation_unspecified-manual.html
index 5c403d94cf9..890a46498c8 100644
--- a/tests/wpt/web-platform-tests/wai-aria/scrollbar_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/scrollbar_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>scrollbar orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,15 +66,21 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SCROLLBAR"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
- "IA2_STATE_HORIZONTAL cleared"
+ "IA2_STATE_HORIZONTAL"
],
[
"property",
"states",
- "doesNotContain",
- "IA2_STATE_VERTICAL set"
+ "contains",
+ "IA2_STATE_VERTICAL"
]
],
"MSAA" : [
@@ -124,4 +131,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox-manual.html
index 35269b4ca5c..016f77a4d02 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -118,4 +119,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_activedescendant-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_activedescendant-manual.html
index e4044754193..3976c265d42 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_activedescendant-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_activedescendant-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox activedescendant</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -153,18 +154,6 @@
"states",
"contains",
"STATE_FOCUSABLE"
- ],
- [
- "event",
- "type",
- "is",
- "object:state-changed:focused"
- ],
- [
- "event",
- "detail1",
- "is",
- "1"
]
],
"AXAPI" : [
@@ -179,12 +168,6 @@
"AXUIElementIsAttributeSettable(AXFocused)",
"is",
"true"
- ],
- [
- "event",
- "type",
- "is",
- "AXFocusedUIElementChanged"
]
],
"MSAA" : [
@@ -199,12 +182,6 @@
"states",
"contains",
"STATE_SYSTEM_FOCUSABLE"
- ],
- [
- "event",
- "type",
- "is",
- "EVENT_OBJECT_FOCUS"
]
],
"UIA" : [
@@ -219,12 +196,6 @@
"IUIAutomationElement.UIA_HasKeyboardFocusPropertyId",
"is",
"true"
- ],
- [
- "event",
- "type",
- "is",
- "UIA_AutomationFocusChangedEventId"
]
]
},
@@ -241,7 +212,7 @@
<body>
<p>This test examines the ARIA properties for searchbox activedescendant.</p>
<div id='test' tabindex="0" aria-activedescendant="bob" role='searchbox'>
- <div id='bob'>Hello world</div>
+ <div id='bob' role='group'>Hello world</div>
</div>
then role:searchbox, aria-activedescendant: bob
@@ -250,4 +221,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_activedescendant_value_changes-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_activedescendant_value_changes-manual.html
index 9d0fb81bbdf..9f2507cd8be 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_activedescendant_value_changes-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_activedescendant_value_changes-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox activedescendant value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -87,22 +88,10 @@
"false"
],
[
- "event",
- "type",
- "is",
- "AXSelectedChildrenChanged"
- ],
- [
"result",
"AXUIElementIsAttributeSettable(AXFocused)",
"is",
"true"
- ],
- [
- "result",
- "array",
- "isNot",
- "true"
]
],
"IAccessible2" : [
@@ -272,7 +261,7 @@
<body>
<p>This test examines the ARIA properties for searchbox activedescendant value changes.</p>
<div id='test' tabindex="0" role='searchbox'>
- <div id='bob'>Hello world</div>
+ <div id='bob' role='group'>Hello world</div>
</div>
then role:searchbox, aria-activedescendant: bob
@@ -281,4 +270,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_both-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_both-manual.html
index 9af5a547100..1b67134540f 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_both-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_both-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox autocomplete both</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -80,9 +81,10 @@
"objectAttributes",
"contains",
"autocomplete:both"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -130,4 +132,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_inline-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_inline-manual.html
index e0c00ad7a25..4aa12aa91e6 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_inline-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_inline-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox autocomplete inline</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -131,4 +132,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_list-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_list-manual.html
index 505a7c4aaa9..778dfe9d9a5 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_list-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_list-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox autocomplete list</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -80,9 +81,10 @@
"objectAttributes",
"contains",
"autocomplete:list"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -130,4 +132,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_none-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_none-manual.html
index 50f715a39c3..237446195e0 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_none-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_none-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox autocomplete none</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -80,9 +81,10 @@
"objectAttributes",
"contains",
"autocomplete:none"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -130,4 +132,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_unspecified-manual.html
index 87d221a6798..8b137490ce9 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_autocomplete_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox autocomplete unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -74,9 +75,10 @@
"objectAttributes",
"contains",
"autocomplete:none"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -124,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_false-manual.html
index dacf24f9f40..6c0053a0eed 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox multiline false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,9 +60,27 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TEXT"
+ ],
+ [
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_MULTI_LINE"
+ ],
+ [
+ "property",
+ "states",
+ "contains",
+ "IA2_SINGLE_LINE"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
- "xml-roles:search"
+ "text-input-type:search"
]
],
"MSAA" : [
@@ -106,4 +125,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_true-manual.html
index eae20ae69d2..311cbf5589c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox multiline true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,8 +66,14 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TEXT"
+ ],
+ [
+ "property",
"states",
- "doesNotContain",
+ "contains",
"IA2_MULTI_LINE"
],
[
@@ -79,7 +86,7 @@
"property",
"objectAttributes",
"contains",
- "xml-roles:search"
+ "text-input-type:search"
]
],
"MSAA" : [
@@ -130,4 +137,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_unspecified-manual.html
index 9a8914a987c..240698ff59c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_multiline_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox multiline unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -106,4 +107,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_placeholder-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_placeholder-manual.html
index 3ca34ed06e6..086508f1651 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_placeholder-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_placeholder-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox placeholder</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -31,12 +32,6 @@
],
[
"property",
- "states",
- "contains",
- "STATE_SINGLE_LINE"
- ],
- [
- "property",
"objectAttributes",
"contains",
"placeholder-text:DD/MM/YYYY"
@@ -71,6 +66,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TEXT"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
"IA2_STATE_SINGLE_LINE"
@@ -138,4 +139,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_false-manual.html
index 4b5ae2963ce..2c8d4aec546 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -77,15 +78,15 @@
],
[
"property",
- "attribute",
- "is",
+ "objectAttributes",
+ "contains",
"text-input-type:search"
],
[
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -94,18 +95,6 @@
"role",
"is",
"ROLE_SYSTEM_TEXT"
- ],
- [
- "property",
- "attribute",
- "is",
- "text-input-type:search"
- ],
- [
- "property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -149,4 +138,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_true-manual.html
index 9afe83afdb6..ba0f3886fce 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -77,15 +78,15 @@
],
[
"property",
- "attribute",
- "is",
+ "objectAttributes",
+ "contains",
"text-input-type:search"
],
[
"property",
"states",
"doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -94,18 +95,6 @@
"role",
"is",
"ROLE_SYSTEM_TEXT"
- ],
- [
- "property",
- "attribute",
- "is",
- "text-input-type:search"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -149,4 +138,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_unspecified-manual.html
index d3affe0e8ae..c3f49a2505b 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -77,15 +78,15 @@
],
[
"property",
- "attribute",
- "is",
+ "objectAttributes",
+ "contains",
"text-input-type:search"
],
[
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -94,18 +95,6 @@
"role",
"is",
"ROLE_SYSTEM_TEXT"
- ],
- [
- "property",
- "attribute",
- "is",
- "text-input-type:search"
- ],
- [
- "property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -149,4 +138,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_required_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_required_false-manual.html
index d895157b97e..6d576771fc7 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_required_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_required_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox required false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,15 +66,15 @@
],
[
"property",
- "attribute",
- "is",
+ "objectAttributes",
+ "contains",
"text-input-type:search"
],
[
- "state",
- "IA2_STATE_REQUIRED",
- "is",
- "false"
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_REQUIRED"
]
],
"MSAA" : [
@@ -82,18 +83,6 @@
"role",
"is",
"ROLE_SYSTEM_TEXT"
- ],
- [
- "property",
- "attribute",
- "is",
- "text-input-type:search"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "STATE_REQUIRED"
]
],
"UIA" : [
@@ -137,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_required_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_required_true-manual.html
index 6dba349dba0..764fe33729d 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_required_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_required_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox required true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,15 +66,15 @@
],
[
"property",
- "attribute",
- "is",
+ "objectAttributes",
+ "contains",
"text-input-type:search"
],
[
- "state",
- "IA2_STATE_REQUIRED",
- "is",
- "true"
+ "property",
+ "states",
+ "contains",
+ "IA2_STATE_REQUIRED"
]
],
"MSAA" : [
@@ -82,18 +83,6 @@
"role",
"is",
"ROLE_SYSTEM_TEXT"
- ],
- [
- "property",
- "attribute",
- "is",
- "text-input-type:search"
- ],
- [
- "property",
- "states",
- "contains",
- "STATE_REQUIRED"
]
],
"UIA" : [
@@ -137,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/searchbox_required_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/searchbox_required_unspecified-manual.html
index bda0004a3ca..592e0e4898b 100644
--- a/tests/wpt/web-platform-tests/wai-aria/searchbox_required_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/searchbox_required_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>searchbox required unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,15 +66,15 @@
],
[
"property",
- "attribute",
- "is",
+ "objectAttributes",
+ "contains",
"text-input-type:search"
],
[
- "state",
- "IA2_STATE_REQUIRED",
- "is",
- "false"
+ "property",
+ "states",
+ "doesNotContain",
+ "IA2_STATE_REQUIRED"
]
],
"MSAA" : [
@@ -82,18 +83,6 @@
"role",
"is",
"ROLE_SYSTEM_TEXT"
- ],
- [
- "property",
- "attribute",
- "is",
- "text-input-type:search"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "STATE_REQUIRED"
]
],
"UIA" : [
@@ -137,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/separator_focusable_all_values_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/separator_focusable_all_values_unspecified-manual.html
index b36413c3913..971f4548ca7 100644
--- a/tests/wpt/web-platform-tests/wai-aria/separator_focusable_all_values_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/separator_focusable_all_values_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>separator focusable all values unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -89,25 +90,31 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SEPARATOR"
+ ],
+ [
+ "property",
"interfaces",
"contains",
"AccessibleValue"
],
[
- "result",
- "AccessibleValue.minimumValue",
+ "property",
+ "minimumValue",
"is",
"0"
],
[
- "result",
- "AccessibleValue.currentValue",
+ "property",
+ "currentValue",
"is",
"50"
],
[
- "result",
- "AccessibleValue.maximumValue",
+ "property",
+ "maximumValue",
"is",
"100"
]
@@ -174,4 +181,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/separator_focusable_only_valuenow_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/separator_focusable_only_valuenow_unspecified-manual.html
index 4cebd9216e3..abc35fe81a6 100644
--- a/tests/wpt/web-platform-tests/wai-aria/separator_focusable_only_valuenow_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/separator_focusable_only_valuenow_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>separator focusable only valuenow unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -89,25 +90,31 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SEPARATOR"
+ ],
+ [
+ "property",
"interfaces",
"contains",
"AccessibleValue"
],
[
- "result",
- "AccessibleValue.minimumValue",
+ "property",
+ "minimumValue",
"is",
"0"
],
[
- "result",
- "AccessibleValue.currentValue",
+ "property",
+ "currentValue",
"is",
"50"
],
[
- "result",
- "AccessibleValue.maximumValue",
+ "property",
+ "maximumValue",
"is",
"100"
]
@@ -174,4 +181,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/separator_focusable_valuetext-manual.html b/tests/wpt/web-platform-tests/wai-aria/separator_focusable_valuetext-manual.html
index fbe0268ceab..edbb7bd5a4b 100644
--- a/tests/wpt/web-platform-tests/wai-aria/separator_focusable_valuetext-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/separator_focusable_valuetext-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>separator focusable valuetext</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -101,6 +102,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SEPARATOR"
+ ],
+ [
+ "property",
"interfaces",
"contains",
"AccessibleValue"
@@ -112,20 +119,20 @@
"valuetext:Bonaire"
],
[
- "result",
- "AccessibleValue.minimumValue",
+ "property",
+ "minimumValue",
"is",
"0"
],
[
- "result",
- "AccessibleValue.currentValue",
+ "property",
+ "currentValue",
"is",
"50"
],
[
- "result",
- "AccessibleValue.maximumValue",
+ "property",
+ "maximumValue",
"is",
"100"
]
@@ -204,4 +211,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/separator_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/separator_orientation_unspecified-manual.html
index bf678cf208e..3b496a87ce9 100644
--- a/tests/wpt/web-platform-tests/wai-aria/separator_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/separator_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>separator orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,15 +60,21 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SEPARATOR"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
- "IA2_STATE_VERTICAL cleared"
+ "IA2_STATE_VERTICAL"
],
[
"property",
"states",
- "doesNotContain",
- "IA2_STATE_HORIZONTAL set"
+ "contains",
+ "IA2_STATE_HORIZONTAL"
]
],
"MSAA" : [
@@ -112,4 +119,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/separator_unfocusable_all_values_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/separator_unfocusable_all_values_unspecified-manual.html
index 4834a0d22e2..8ab8e96b027 100644
--- a/tests/wpt/web-platform-tests/wai-aria/separator_unfocusable_all_values_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/separator_unfocusable_all_values_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>separator unfocusable all values unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -22,6 +23,12 @@
"role",
"is",
"ROLE_SEPARATOR"
+ ],
+ [
+ "property",
+ "interfaces",
+ "doesNotContain",
+ "Value"
]
],
"AXAPI" : [
@@ -82,4 +89,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/separator_unfocusable_valuetext-manual.html b/tests/wpt/web-platform-tests/wai-aria/separator_unfocusable_valuetext-manual.html
index 98e7c3ccdbb..71527bf7996 100644
--- a/tests/wpt/web-platform-tests/wai-aria/separator_unfocusable_valuetext-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/separator_unfocusable_valuetext-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>separator unfocusable valuetext</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -64,8 +65,8 @@
"valuetext:Bonaire"
],
[
- "result",
- "getAccessibleValue()",
+ "property",
+ "value",
"isNot",
"Bonaire"
]
@@ -114,4 +115,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/slider_all_values_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/slider_all_values_unspecified-manual.html
index 07540dd1b98..2b3e4405c54 100644
--- a/tests/wpt/web-platform-tests/wai-aria/slider_all_values_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/slider_all_values_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>slider all values unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -89,25 +90,31 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SLIDER"
+ ],
+ [
+ "property",
"interfaces",
"contains",
"AccessibleValue"
],
[
- "result",
- "AccessibleValue.minimumValue",
+ "property",
+ "minimumValue",
"is",
"0"
],
[
- "result",
- "AccessibleValue.currentValue",
+ "property",
+ "currentValue",
"is",
"50"
],
[
- "result",
- "AccessibleValue.maximumValue",
+ "property",
+ "maximumValue",
"is",
"100"
]
@@ -174,4 +181,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/slider_only_valuenow_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/slider_only_valuenow_unspecified-manual.html
index 05e02e1ffcb..9421dfcc90c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/slider_only_valuenow_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/slider_only_valuenow_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>slider only valuenow unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -89,25 +90,31 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SLIDER"
+ ],
+ [
+ "property",
"interfaces",
"contains",
"AccessibleValue"
],
[
- "result",
- "AccessibleValue.minimumValue",
+ "property",
+ "minimumValue",
"is",
"0"
],
[
- "result",
- "AccessibleValue.currentValue",
+ "property",
+ "currentValue",
"is",
"20"
],
[
- "result",
- "AccessibleValue.maximumValue",
+ "property",
+ "maximumValue",
"is",
"40"
]
@@ -174,4 +181,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/slider_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/slider_orientation_unspecified-manual.html
index 052830779d6..d882fc42889 100644
--- a/tests/wpt/web-platform-tests/wai-aria/slider_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/slider_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>slider orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,15 +66,21 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SLIDER"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
- "IA2_STATE_VERTICAL cleared"
+ "IA2_STATE_VERTICAL"
],
[
"property",
"states",
- "doesNotContain",
- "IA2_STATE_HORIZONTAL set"
+ "contains",
+ "IA2_STATE_HORIZONTAL"
]
],
"MSAA" : [
@@ -124,4 +131,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/slider_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/slider_readonly_false-manual.html
index bc997a19a0b..666cb12e979 100644
--- a/tests/wpt/web-platform-tests/wai-aria/slider_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/slider_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>slider readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -79,7 +80,7 @@
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -88,18 +89,6 @@
"role",
"is",
"ROLE_SYSTEM_SLIDER"
- ],
- [
- "property",
- "interfaces",
- "contains",
- "IAcesssibleValue"
- ],
- [
- "property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -137,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/slider_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/slider_readonly_true-manual.html
index 7e48600c4df..f33e07e6045 100644
--- a/tests/wpt/web-platform-tests/wai-aria/slider_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/slider_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>slider readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -79,7 +80,7 @@
"property",
"states",
"doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -88,18 +89,6 @@
"role",
"is",
"ROLE_SYSTEM_SLIDER"
- ],
- [
- "property",
- "interfaces",
- "contains",
- "IAcesssibleValue"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -137,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/slider_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/slider_readonly_unspecified-manual.html
index 0fdaba39473..86f7500ed95 100644
--- a/tests/wpt/web-platform-tests/wai-aria/slider_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/slider_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>slider readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -79,7 +80,7 @@
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -88,18 +89,6 @@
"role",
"is",
"ROLE_SYSTEM_SLIDER"
- ],
- [
- "property",
- "interfaces",
- "contains",
- "IAcesssibleValue"
- ],
- [
- "property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -137,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/spinbutton_all_values_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/spinbutton_all_values_unspecified-manual.html
index cac28e46f82..eb7e2880f27 100644
--- a/tests/wpt/web-platform-tests/wai-aria/spinbutton_all_values_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/spinbutton_all_values_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>spinbutton all values unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -89,25 +90,31 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SPINBUTTON"
+ ],
+ [
+ "property",
"interfaces",
"contains",
"AccessibleValue"
],
[
- "result",
- "AccessibleValue.minimumValue",
+ "property",
+ "minimumValue",
"isLTE",
"-9007199254740992"
],
[
- "result",
- "AccessibleValue.currentValue",
+ "property",
+ "currentValue",
"is",
"0"
],
[
- "result",
- "AccessibleValue.maximumValue",
+ "property",
+ "maximumValue",
"isGTE",
"9007199254740992"
]
@@ -175,4 +182,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/spinbutton_only_aria-valuenow_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/spinbutton_only_aria-valuenow_unspecified-manual.html
index 62276a0f9b2..8a9dc74090c 100644
--- a/tests/wpt/web-platform-tests/wai-aria/spinbutton_only_aria-valuenow_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/spinbutton_only_aria-valuenow_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>spinbutton only aria-valuenow unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -89,25 +90,31 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_SPINBUTTON"
+ ],
+ [
+ "property",
"interfaces",
"contains",
"AccessibleValue"
],
[
- "result",
- "AccessibleValue.minimumValue",
+ "property",
+ "minimumValue",
"is",
"0"
],
[
- "result",
- "AccessibleValue.currentValue",
+ "property",
+ "currentValue",
"is",
"0"
],
[
- "result",
- "AccessibleValue.maximumValue",
+ "property",
+ "maximumValue",
"is",
"100"
]
@@ -175,4 +182,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_false-manual.html
index 7f6b515cd55..bda4b583e46 100644
--- a/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>spinbutton readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -79,7 +80,7 @@
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -88,18 +89,6 @@
"role",
"is",
"ROLE_SYSTEM_SPINBUTTON"
- ],
- [
- "property",
- "interfaces",
- "contains",
- "IAcesssibleValue"
- ],
- [
- "property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -137,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_true-manual.html
index b264c47be66..6234e50d1f4 100644
--- a/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>spinbutton readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -79,7 +80,7 @@
"property",
"states",
"doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -88,18 +89,6 @@
"role",
"is",
"ROLE_SYSTEM_SPINBUTTON"
- ],
- [
- "property",
- "interfaces",
- "contains",
- "IAcesssibleValue"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -137,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_unspecified-manual.html
index 00c0acaf85d..c96f2e00d38 100644
--- a/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/spinbutton_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>spinbutton readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -79,7 +80,7 @@
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"MSAA" : [
@@ -88,18 +89,6 @@
"role",
"is",
"ROLE_SYSTEM_SPINBUTTON"
- ],
- [
- "property",
- "interfaces",
- "contains",
- "IAcesssibleValue"
- ],
- [
- "property",
- "states",
- "contains",
- "IA2_STATE_SYSTEM_EDITABLE"
]
],
"UIA" : [
@@ -137,4 +126,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/switch_checked_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/switch_checked_false-manual.html
index 5e7bf6e00f0..f499550bdcd 100644
--- a/tests/wpt/web-platform-tests/wai-aria/switch_checked_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/switch_checked_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>switch checked false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -122,4 +123,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/switch_checked_mixed-manual.html b/tests/wpt/web-platform-tests/wai-aria/switch_checked_mixed-manual.html
index c662c63bc7c..e6320e0cad8 100644
--- a/tests/wpt/web-platform-tests/wai-aria/switch_checked_mixed-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/switch_checked_mixed-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>switch checked mixed</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -128,4 +129,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/switch_checked_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/switch_checked_true-manual.html
index c90a6c02c88..8ae8579a3bf 100644
--- a/tests/wpt/web-platform-tests/wai-aria/switch_checked_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/switch_checked_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>switch checked true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -136,4 +137,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/switch_checked_undefined-manual.html b/tests/wpt/web-platform-tests/wai-aria/switch_checked_undefined-manual.html
index ed2f0e53278..7ae70c6765a 100644
--- a/tests/wpt/web-platform-tests/wai-aria/switch_checked_undefined-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/switch_checked_undefined-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>switch checked undefined</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -122,4 +123,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/switch_checked_value_changes-manual.html b/tests/wpt/web-platform-tests/wai-aria/switch_checked_value_changes-manual.html
index 0f573d991ed..699f332a858 100644
--- a/tests/wpt/web-platform-tests/wai-aria/switch_checked_value_changes-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/switch_checked_value_changes-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>switch checked value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -161,4 +162,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/switch_readonly_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/switch_readonly_false-manual.html
index 87bed9e243e..4afbff1808f 100644
--- a/tests/wpt/web-platform-tests/wai-aria/switch_readonly_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/switch_readonly_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>switch readonly false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,35 +66,15 @@
],
[
"property",
- "attribute",
- "is",
- "xml-roles:switch"
- ],
- [
- "property",
- "states",
+ "objectAttributes",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
- ]
- ],
- "MSAA" : [
- [
- "property",
- "role",
- "is",
- "IA2_ROLE_TOGGLE_BUTTON"
- ],
- [
- "property",
- "attribute",
- "is",
"xml-roles:switch"
],
[
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"UIA" : [
@@ -137,4 +118,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/switch_readonly_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/switch_readonly_true-manual.html
index 2bdca202136..eab0bf59ff9 100644
--- a/tests/wpt/web-platform-tests/wai-aria/switch_readonly_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/switch_readonly_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>switch readonly true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,35 +66,15 @@
],
[
"property",
- "attribute",
- "is",
- "xml-roles:switch"
- ],
- [
- "property",
- "states",
- "doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
- ]
- ],
- "MSAA" : [
- [
- "property",
- "role",
- "is",
- "IA2_ROLE_TOGGLE_BUTTON"
- ],
- [
- "property",
- "attribute",
- "is",
+ "objectAttributes",
+ "contains",
"xml-roles:switch"
],
[
"property",
"states",
"doesNotContain",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"UIA" : [
@@ -137,4 +118,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/switch_readonly_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/switch_readonly_unspecified-manual.html
index 2679fb4de5c..f3e1f6b97ae 100644
--- a/tests/wpt/web-platform-tests/wai-aria/switch_readonly_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/switch_readonly_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>switch readonly unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,35 +66,15 @@
],
[
"property",
- "attribute",
- "is",
- "xml-roles:switch"
- ],
- [
- "property",
- "states",
+ "objectAttributes",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
- ]
- ],
- "MSAA" : [
- [
- "property",
- "role",
- "is",
- "IA2_ROLE_TOGGLE_BUTTON"
- ],
- [
- "property",
- "attribute",
- "is",
"xml-roles:switch"
],
[
"property",
"states",
"contains",
- "IA2_STATE_SYSTEM_EDITABLE"
+ "IA2_STATE_EDITABLE"
]
],
"UIA" : [
@@ -137,4 +118,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/tab_posinset_and_setsize-manual.html b/tests/wpt/web-platform-tests/wai-aria/tab_posinset_and_setsize-manual.html
index 9ba4b8b8f9e..6f3d796ab1b 100644
--- a/tests/wpt/web-platform-tests/wai-aria/tab_posinset_and_setsize-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/tab_posinset_and_setsize-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>tab posinset and setsize</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -89,6 +90,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PAGETAB"
+ ],
+ [
+ "property",
"objectAttributes",
"contains",
"posinset:3"
@@ -100,14 +107,14 @@
"setsize:7"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"similarItemsInGroup:7"
],
[
- "result",
- "groupPosition()",
+ "property",
+ "groupPosition",
"contains",
"positionInGroup:3"
]
@@ -181,4 +188,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/table_colcount_-1-manual.html b/tests/wpt/web-platform-tests/wai-aria/table_colcount_-1-manual.html
index 93c0f7b258c..751642659db 100644
--- a/tests/wpt/web-platform-tests/wai-aria/table_colcount_-1-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/table_colcount_-1-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>table colcount -1</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -68,9 +69,10 @@
"objectAttributes",
"contains",
"colcount:-1"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -115,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/table_colcount_8-manual.html b/tests/wpt/web-platform-tests/wai-aria/table_colcount_8-manual.html
index d31fd19fe10..daaa03f4334 100644
--- a/tests/wpt/web-platform-tests/wai-aria/table_colcount_8-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/table_colcount_8-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>table colcount 8</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -110,4 +111,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/table_rowcount_-1-manual.html b/tests/wpt/web-platform-tests/wai-aria/table_rowcount_-1-manual.html
index 7b7abd4d44c..8ca67174275 100644
--- a/tests/wpt/web-platform-tests/wai-aria/table_rowcount_-1-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/table_rowcount_-1-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>table rowcount -1</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -74,9 +75,10 @@
"objectAttributes",
"contains",
"rowcount:-1"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -123,4 +125,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/table_rowcount_3-manual.html b/tests/wpt/web-platform-tests/wai-aria/table_rowcount_3-manual.html
index eb1c03643c6..bb685bdbd0a 100644
--- a/tests/wpt/web-platform-tests/wai-aria/table_rowcount_3-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/table_rowcount_3-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>table rowcount 3</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -68,9 +69,10 @@
"objectAttributes",
"contains",
"rowcount:3"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -115,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_horizontal-manual.html b/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_horizontal-manual.html
index 3fb8d088fc6..a01acf18108 100644
--- a/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_horizontal-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_horizontal-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>tablist orientation horizontal</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -71,9 +72,15 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PAGETABLIST"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
- "IA2_STATE_VERTICAL set"
+ "IA2_STATE_VERTICAL"
],
[
"property",
@@ -134,4 +141,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_unspecified-manual.html
index c23666d54e1..f4524c291b5 100644
--- a/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>tablist orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,15 +66,21 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_PAGETABLIST"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
- "IA2_STATE_VERTICAL cleared"
+ "IA2_STATE_VERTICAL"
],
[
"property",
"states",
- "doesNotContain",
- "IA2_STATE_HORIZONTAL set"
+ "contains",
+ "IA2_STATE_HORIZONTAL"
]
],
"MSAA" : [
@@ -128,4 +135,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_vertical-manual.html b/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_vertical-manual.html
index 29e8ae8a333..9cf69cafa24 100644
--- a/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_vertical-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/tablist_orientation_vertical-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>tablist orientation vertical</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -128,4 +129,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/term_role-manual.html b/tests/wpt/web-platform-tests/wai-aria/term_role-manual.html
index 331e30cc334..d583765095e 100644
--- a/tests/wpt/web-platform-tests/wai-aria/term_role-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/term_role-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>term role</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -104,4 +105,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/textbox_placeholder-manual.html b/tests/wpt/web-platform-tests/wai-aria/textbox_placeholder-manual.html
index e2147c0bff6..6c234a13947 100644
--- a/tests/wpt/web-platform-tests/wai-aria/textbox_placeholder-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/textbox_placeholder-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>textbox placeholder</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -71,6 +72,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TEXT"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
"IA2_STATE_SINGLE_LINE"
@@ -126,4 +133,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_horizontal-manual.html b/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_horizontal-manual.html
index f954c0a51b5..e2327e7e127 100644
--- a/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_horizontal-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_horizontal-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>toolbar orientation horizontal</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,15 +60,21 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TOOLBAR"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
- "IA2_STATE_VERTICAL cleared"
+ "IA2_STATE_VERTICAL"
],
[
"property",
"states",
- "doesNotContain",
- "IA2_STATE_HORIZONTAL set"
+ "contains",
+ "IA2_STATE_HORIZONTAL"
]
],
"MSAA" : [
@@ -114,4 +121,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_unspecified-manual.html
index aa42984ca80..a08e45a4261 100644
--- a/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>toolbar orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,15 +60,21 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TOOLBAR"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
- "IA2_STATE_VERTICAL cleared"
+ "IA2_STATE_VERTICAL"
],
[
"property",
"states",
- "doesNotContain",
- "IA2_STATE_HORIZONTAL set"
+ "contains",
+ "IA2_STATE_HORIZONTAL"
]
],
"MSAA" : [
@@ -114,4 +121,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_vertical-manual.html b/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_vertical-manual.html
index 6b9ad655463..92a39cd353b 100644
--- a/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_vertical-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/toolbar_orientation_vertical-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>toolbar orientation vertical</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -59,15 +60,21 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_TOOLBAR"
+ ],
+ [
+ "property",
"states",
- "doesNotContain",
- "IA2_STATE_VERTICAL set"
+ "contains",
+ "IA2_STATE_VERTICAL"
],
[
"property",
"states",
"doesNotContain",
- "IA2_STATE_HORIZONTAL cleared"
+ "IA2_STATE_HORIZONTAL"
]
],
"MSAA" : [
@@ -114,4 +121,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/tools/make_tests.pl b/tests/wpt/web-platform-tests/wai-aria/tools/make_tests.pl
index 6de9c4d9dea..36de4493264 100644
--- a/tests/wpt/web-platform-tests/wai-aria/tools/make_tests.pl
+++ b/tests/wpt/web-platform-tests/wai-aria/tools/make_tests.pl
@@ -30,6 +30,7 @@ my %specs = (
);
my @apiNames = qw(UIA MSAA ATK IAccessible2 AXAPI);
+my $apiNamesRegex = "(" . join("|", @apiNames) . ")";
# the suffix to attach to the automatically generated test case names
my $theSuffix = "-manual.html";
@@ -302,14 +303,17 @@ while (<$io>) {
} else {
print STDERR "Unknown operation type: $type at line " . $lineCounter . "; skipping.\n";
}
- } elsif (m/^\|rowspan="*([0-9])"*\|(.*)$/) {
- my $rows = $1;
- my $theString = $2;
+ } elsif (m/($apiNamesRegex)$/) {
+ my $theString = $1;
$theString =~ s/ +$//;
$theString =~ s/^ +//;
if ($theString eq "IA2") {
$theString = "IAccessible2" ;
}
+ my $rows = 1;
+ if (m/^\|rowspan="*([0-9])"*\|(.*)$/) {
+ $rows = $1
+ }
if (grep { $_ eq $theString } @apiNames) {
# we found an API name - were we already processing assertions?
if (!$theAsserts) {
@@ -421,76 +425,11 @@ sub build_test() {
$tests->{"WAIFAKE"} = [ [ "property", "role", "is", "ROLE_TABLE_CELL" ], [ "property", "interfaces", "contains", "TableCell" ] ];
}
foreach my $name (@apiNames) {
- if (exists $asserts->{$name}) {
+ if (exists $asserts->{$name} && scalar(@{$asserts->{$name}})) {
$tests->{$name} = $asserts->{$name};
}
};
-
- # massage the data to make it more sensible
- if (exists $tests->{"ATK"}) {
- # # print "processing ATK for $title\n";
- my @conditions = @{$tests->{"ATK"}};
- for (my $i = 0; $i < scalar(@conditions); $i++) {
- my @new = ();
- my $start = 0;
- my $assert = "true";
- if ($conditions[$i]->[0] =~ m/^NOT/) {
- $start = 1;
- $assert = "false";
- }
-
- # print qq(Looking at $title $conditions[$i]->[$start]\n);
- if ($conditions[$i]->[$start] =~ m/^ROLE_/) {
- $new[0] = "role";
- $new[1] = $conditions[$i]->[$start];
- $new[2] = $assert;
- } elsif ($conditions[$i]->[$start] =~ m/(.*) interface/i) {
- $new[0] = "interface";
- $new[1] = $1;
- # print "$1 condition is " . $conditions[$i]->[1] . "\n";
- if ($conditions[$i]->[1] ne '<shown>'
- && $conditions[$i]->[1] !~ m/true/i ) {
- $assert = "false";
- }
- $new[2] = $assert;
- } elsif ($conditions[$i]->[$start] eq "object" || $conditions[$i]->[$start] eq "attribute" ) {
- $new[0] = "attribute";
- my $val = $conditions[$i]->[2];
- $val =~ s/"//g;
- $new[1] = $conditions[$i]->[1] . ":" . $val;
- if ($conditions[$i]->[3] eq "not exposed"
- || $conditions[$i]->[3] eq "false") {
- $new[2] = "false";
- } else {
- $new[2] = "true";
- }
- } elsif ($conditions[$i]->[$start] =~ m/^STATE_/) {
- $new[0] = "state";
- $new[1] = $conditions[$i]->[$start];
- $new[2] = $assert;
- } elsif ($conditions[$i]->[$start] =~ m/^object attribute (.*)/) {
- my $name = $1;
- $new[0] = "attribute";
- my $val = $conditions[$i]->[1];
- $val =~ s/"//g;
- if ($val eq "not exposed" || $val eq "not mapped") {
- $new[1] = $name;
- $new[2] = "false";
- } else {
- $new[1] = $name . ":" . $val;
- $new[2] = "true";
- }
- } else {
- @new = @{$conditions[$i]};
- if ($conditions[$i]->[2] eq '<shown>') {
- $new[2] = "true";
- }
- }
- $conditions[$i] = \@new;
- }
- $tests->{"ATK"} = \@conditions;
- }
$step->{test} = $tests;
} elsif ($asserts->{type} eq "attribute") {
@@ -529,7 +468,8 @@ sub build_test() {
$fileName =~ s/\s*$//;
$fileName =~ s/\///g;
$fileName =~ s/\s+/_/g;
- $fileName =~ s/[",=]/_/g;
+ $fileName =~ s/[,=:]/_/g;
+ $fileName =~ s/['"]//g;
my $count = 2;
if ($testNames->{$fileName}) {
@@ -549,6 +489,7 @@ sub build_test() {
<html>
<head>
<title>$title</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -569,8 +510,7 @@ sub build_test() {
<div id="log"></div>
<div id="ATTAmessages"></div>
</body>
-</html>
-);
+</html>);
my $file ;
diff --git a/tests/wpt/web-platform-tests/wai-aria/tree_orientation_horizontal-manual.html b/tests/wpt/web-platform-tests/wai-aria/tree_orientation_horizontal-manual.html
index 803ac34d3fb..74788212475 100644
--- a/tests/wpt/web-platform-tests/wai-aria/tree_orientation_horizontal-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/tree_orientation_horizontal-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>tree orientation horizontal</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,6 +66,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_OUTLINE"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_HORIZONTAL"
@@ -121,4 +128,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/tree_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/tree_orientation_unspecified-manual.html
index da013a8e96d..ada952dadd0 100644
--- a/tests/wpt/web-platform-tests/wai-aria/tree_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/tree_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>tree orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,6 +66,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_OUTLINE"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_VERTICAL"
@@ -121,4 +128,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/tree_orientation_vertical-manual.html b/tests/wpt/web-platform-tests/wai-aria/tree_orientation_vertical-manual.html
index a89001003ce..799413b20ce 100644
--- a/tests/wpt/web-platform-tests/wai-aria/tree_orientation_vertical-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/tree_orientation_vertical-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>tree orientation vertical</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,6 +66,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_OUTLINE"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_VERTICAL"
@@ -121,4 +128,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/treegrid_colcount_8-manual.html b/tests/wpt/web-platform-tests/wai-aria/treegrid_colcount_8-manual.html
index 2b334e4cdce..b44672ca724 100644
--- a/tests/wpt/web-platform-tests/wai-aria/treegrid_colcount_8-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/treegrid_colcount_8-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>treegrid colcount 8</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -68,9 +69,10 @@
"objectAttributes",
"contains",
"colcount:8"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -115,4 +117,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_horizontal-manual.html b/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_horizontal-manual.html
index 2796352dca8..180aebd26bc 100644
--- a/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_horizontal-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_horizontal-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>treegrid orientation horizontal</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,6 +66,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_OUTLINE"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
"IA2_STATE_VERTICAL"
@@ -129,4 +136,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_unspecified-manual.html b/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_unspecified-manual.html
index fcc381f09f8..4bc2a05f76e 100644
--- a/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_unspecified-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_unspecified-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>treegrid orientation unspecified</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -77,6 +78,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_OUTLINE"
+ ],
+ [
+ "property",
"states",
"doesNotContain",
"IA2_STATE_VERTICAL"
@@ -147,4 +154,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_vertical-manual.html b/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_vertical-manual.html
index 000876ac710..3bed156a7f3 100644
--- a/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_vertical-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/treegrid_orientation_vertical-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>treegrid orientation vertical</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -65,6 +66,12 @@
"IAccessible2" : [
[
"property",
+ "role",
+ "is",
+ "ROLE_SYSTEM_OUTLINE"
+ ],
+ [
+ "property",
"states",
"contains",
"IA2_STATE_VERTICAL"
@@ -129,4 +136,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/treegrid_rowcount_3-manual.html b/tests/wpt/web-platform-tests/wai-aria/treegrid_rowcount_3-manual.html
index 71a2a62fe80..15b63f309d2 100644
--- a/tests/wpt/web-platform-tests/wai-aria/treegrid_rowcount_3-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/treegrid_rowcount_3-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>treegrid rowcount 3</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -68,9 +69,10 @@
"objectAttributes",
"contains",
"rowcount:3"
- ],
+ ]
+ ],
+ "MSAA" : [
[
- "MSAA",
"property",
"role",
"is",
@@ -117,4 +119,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_false-manual.html b/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_false-manual.html
index 4f1fe1eb74b..f401a522504 100644
--- a/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_false-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_false-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>treeitem selected false</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -123,4 +124,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_true-manual.html b/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_true-manual.html
index c1aa9c7d242..80cf62783aa 100644
--- a/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_true-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_true-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>treeitem selected true</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -123,4 +124,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_undefined-manual.html b/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_undefined-manual.html
index 8958c53f86d..a7ca892b6f4 100644
--- a/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_undefined-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_undefined-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>treeitem selected undefined</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -123,4 +124,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_value_changes-manual.html b/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_value_changes-manual.html
index 2364fc6d0a1..06b48fc4948 100644
--- a/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_value_changes-manual.html
+++ b/tests/wpt/web-platform-tests/wai-aria/treeitem_selected_value_changes-manual.html
@@ -2,6 +2,7 @@
<html>
<head>
<title>treeitem selected value changes</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
<link rel="stylesheet" href="/resources/testharness.css">
<link rel="stylesheet" href="/wai-aria/scripts/manual.css">
<script src="/resources/testharness.js"></script>
@@ -51,14 +52,6 @@
"1"
]
],
- "AXAPI" : [
- [
- "event",
- "type",
- "is",
- "AXSelectedChildrenChanged"
- ]
- ],
"MSAA" : [
[
"event",
@@ -96,7 +89,14 @@
"object:selection-changed"
]
],
- "AXAPI" : []
+ "AXAPI" : [
+ [
+ "event",
+ "type",
+ "is",
+ "AXSelectedChildrenChanged"
+ ]
+ ]
},
"title" : "step 5",
"type" : "test"
@@ -145,4 +145,3 @@
<div id="ATTAmessages"></div>
</body>
</html>
-
diff --git a/tests/wpt/web-platform-tests/wasm/create_multiple_memory.worker.js b/tests/wpt/web-platform-tests/wasm/create_multiple_memory.worker.js
new file mode 100644
index 00000000000..f5733b7c8da
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wasm/create_multiple_memory.worker.js
@@ -0,0 +1,13 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// The WebAssembly spec doesn't specify a limit on how many Memory objects can
+// be allocated. This test makes sure we can have at least two at once.
+
+importScripts("/resources/testharness.js");
+test(function () {
+ const mem1 = new WebAssembly.Memory({initial: 1});
+ const mem2 = new WebAssembly.Memory({initial: 1});
+}, "WebAssembly#CreateMultipleMemories.");
+done();
diff --git a/tests/wpt/web-platform-tests/wasm/many-memories.window.js b/tests/wpt/web-platform-tests/wasm/many-memories.window.js
new file mode 100644
index 00000000000..0613a008ac3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wasm/many-memories.window.js
@@ -0,0 +1,19 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This test makes sure browsers behave reasonably when asked to allocate a
+// large number of WebAssembly.Memory objects at once.
+test(function() {
+ let memories = [];
+ try {
+ for (let i = 0; i < 600; i++) {
+ memories.push(new WebAssembly.Memory({initial: 1}));
+ }
+ } catch (e) {
+ if (e instanceof RangeError) {
+ return;
+ }
+ throw e;
+ }
+}, "WebAssembly#CreateManyMemories");
diff --git a/tests/wpt/web-platform-tests/wasm/wasm_service_worker_test.html b/tests/wpt/web-platform-tests/wasm/wasm_service_worker_test.html
deleted file mode 100644
index 9d4afb81766..00000000000
--- a/tests/wpt/web-platform-tests/wasm/wasm_service_worker_test.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<title>Service Worker: postMessage with wasm</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/serviceworker/resources/test-helpers.js"></script>
-<script>
- promise_test(async test => {
- var registration = await service_worker_unregister_and_register(
- test, 'resources/service-worker.js', 'resources/blank.html');
- add_completion_callback(() => registration.unregister());
- var worker = registration.installing;
- var data = await new Promise((resolve, reject) => {
- var messageChannel = new MessageChannel();
- worker.postMessage({port: messageChannel.port2}, [messageChannel.port2]);
- worker.postMessage({compile: true});
- messageChannel.port1.onmessage = event => resolve(event.data);
- });
- assert_equals(data, null);
- }, 'postMessaging wasm from a service worker should fail');
-</script>
diff --git a/tests/wpt/web-platform-tests/wasm/wasm_service_worker_test.https.html b/tests/wpt/web-platform-tests/wasm/wasm_service_worker_test.https.html
new file mode 100644
index 00000000000..e350ed95eaf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wasm/wasm_service_worker_test.https.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>Service Worker: postMessage with wasm</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
+<script>
+ promise_test(async test => {
+ var registration = await service_worker_unregister_and_register(
+ test, 'resources/service-worker.js', 'resources/blank.html');
+ add_completion_callback(() => registration.unregister());
+ var worker = registration.installing;
+ var data = await new Promise((resolve, reject) => {
+ var messageChannel = new MessageChannel();
+ worker.postMessage({port: messageChannel.port2}, [messageChannel.port2]);
+ worker.postMessage({compile: true});
+ messageChannel.port1.onmessage = event => resolve(event.data);
+ });
+ assert_equals(data, null);
+ }, 'postMessaging wasm from a service worker should fail');
+</script>
diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js
index acf80787a33..4315d0fe716 100644
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js
+++ b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-list.js
@@ -190,7 +190,7 @@ var gCSSProperties = {
'border-image-outset': {
// https://drafts.csswg.org/css-backgrounds-3/#border-image-outset
types: [
- { type: 'discrete', options: [ [ '1 1 1 1', '5 5 5 5' ] ] }
+ { type: 'discrete', options: [ [ '1 2 3 4', '5 6 7 8' ] ] }
]
},
'border-image-repeat': {
@@ -202,7 +202,7 @@ var gCSSProperties = {
'border-image-slice': {
// https://drafts.csswg.org/css-backgrounds-3/#border-image-slice
types: [
- { type: 'discrete', options: [ [ '1 1 1 1', '5 5 5 5' ] ] }
+ { type: 'discrete', options: [ [ '1 2 3 4', '5 6 7 8' ] ] }
]
},
'border-image-source': {
@@ -216,7 +216,7 @@ var gCSSProperties = {
'border-image-width': {
// https://drafts.csswg.org/css-backgrounds-3/#border-image-width
types: [
- { type: 'discrete', options: [ [ '1 1 1 1', '5 5 5 5' ] ] }
+ { type: 'discrete', options: [ [ '1 2 3 4', '5 6 7 8' ] ] }
]
},
'border-left-color': {
@@ -471,8 +471,7 @@ var gCSSProperties = {
},
'fill-opacity': {
// https://svgwg.org/svg2-draft/painting.html#FillOpacityProperty
- types: [
- ]
+ types: [ 'opacity' ]
},
'fill-rule': {
// https://svgwg.org/svg2-draft/painting.html#FillRuleProperty
@@ -517,8 +516,7 @@ var gCSSProperties = {
},
'flood-opacity': {
// https://drafts.fxtf.org/filters/#propdef-flood-opacity
- types: [
- ]
+ types: [ 'opacity' ]
},
'font-size': {
// https://drafts.csswg.org/css-fonts-3/#propdef-font-size
@@ -532,8 +530,7 @@ var gCSSProperties = {
},
'font-stretch': {
// https://drafts.csswg.org/css-fonts-3/#propdef-font-stretch
- types: [
- ]
+ types: [ 'fontStretch' ]
},
'font-style': {
// https://drafts.csswg.org/css-fonts/#propdef-font-style
@@ -621,6 +618,16 @@ var gCSSProperties = {
{ type: 'discrete', options: [ [ 'sub', 'super' ] ] }
]
},
+ 'font-variation-settings': {
+ // https://drafts.csswg.org/css-fonts-4/#descdef-font-face-font-variation-settings
+ types: [
+ 'fontVariationSettings',
+ { type: 'discrete',
+ options: [ ['"wght" 1.1, "wdth" 1', '"wdth" 5'],
+ ['"wdth" 5', 'normal']
+ ] },
+ ]
+ },
'font-weight': {
// https://drafts.csswg.org/css-fonts-3/#propdef-font-weight
types: [
@@ -1225,8 +1232,7 @@ var gCSSProperties = {
},
'stop-opacity': {
// https://svgwg.org/svg2-draft/pservers.html#StopOpacityProperty
- types: [
- ]
+ types: [ 'opacity' ]
},
'stroke': {
// https://svgwg.org/svg2-draft/painting.html#StrokeProperty
@@ -1235,7 +1241,10 @@ var gCSSProperties = {
},
'stroke-dasharray': {
// https://svgwg.org/svg2-draft/painting.html#StrokeDasharrayProperty
- types: [ 'dasharray' ]
+ types: [
+ 'dasharray',
+ { type: 'discrete', options: [ [ 'none', '10, 20' ] ] }
+ ]
},
'stroke-dashoffset': {
// https://svgwg.org/svg2-draft/painting.html#StrokeDashoffsetProperty
@@ -1464,16 +1473,43 @@ var gCSSProperties = {
};
function testAnimationSamples(animation, idlName, testSamples) {
- var type = animation.effect.target.type;
- var target = type
- ? animation.effect.target.parentElement
- : animation.effect.target;
- testSamples.forEach(function(testSample) {
+ const type = animation.effect.target.type;
+ const target = animation.effect.target.constructor.name === 'CSSPseudoElement'
+ ? animation.effect.target.parentElement
+ : animation.effect.target;
+ testSamples.forEach(testSample => {
animation.currentTime = testSample.time;
assert_equals(getComputedStyle(target, type)[idlName],
testSample.expected,
- 'The value should be ' + testSample.expected +
- ' at ' + testSample.time + 'ms');
+ `The value should be ${testSample.expected}` +
+ ` at ${testSample.time}ms`);
+ });
+}
+
+function toOrderedArray(string) {
+ return string.split(/\s*,\s/).sort();
+}
+
+// This test is for some list-based CSS properties such as font-variant-settings
+// don't specify an order for serializing computed values.
+// This test is for such the property.
+function testAnimationSamplesWithAnyOrder(animation, idlName, testSamples) {
+ const type = animation.effect.target.type;
+ const target = animation.effect.target.constructor.name === 'CSSPseudoElement'
+ ? animation.effect.target.parentElement
+ : animation.effect.target;
+ testSamples.forEach(testSample => {
+ animation.currentTime = testSample.time;
+
+ // Convert to array and sort the expected and actual value lists first
+ // before comparing them.
+ const computedValues =
+ toOrderedArray(getComputedStyle(target, type)[idlName]);
+ const expectedValues = toOrderedArray(testSample.expected);
+
+ assert_array_equals(computedValues, expectedValues,
+ `The computed values should be ${expectedValues}` +
+ ` at ${testSample.time}ms`);
});
}
diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js
index 1fa1a2df7ec..217cec52258 100644
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js
+++ b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/property-types.js
@@ -884,6 +884,35 @@ const transformListType = {
[{ time: 500, expected: rotate3dToMatrix(1, 1, 0, Math.PI * 2 / 4) }]);
}, property + ': matrix3d');
+ // This test aims for forcing the two mismatched transforms to be
+ // decomposed into matrix3d before interpolation. Therefore, we not only
+ // test the interpolation, but also test the 3D matrix decomposition.
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation =
+ target.animate({ [idlName]: ['scale(0.3)',
+ // scale(0.5) translateZ(1px)
+ 'matrix3d(0.5, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1)'] },
+ 1000);
+
+ testAnimationSampleMatrices(animation, idlName,
+ [{ time: 500, expected: [ 0.4, 0, 0, 0,
+ 0, 0.4, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0.5, 1] }]);
+ }, property + ': mismatched 3D transforms');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation =
+ target.animate({ [idlName]: ['rotateY(60deg)', 'none' ] }, 1000);
+
+ testAnimationSampleMatrices(animation, idlName,
+ // rotateY(30deg) == rotate3D(0, 1, 0, 30deg)
+ [{ time: 500, expected: rotate3dToMatrix(0, 1, 0, Math.PI / 6) }]);
+ }, property + ': rotateY');
},
testAddition: function(property, setup) {
@@ -1198,10 +1227,190 @@ const transformListType = {
[{ time: 0, expected: rotate3dToMatrix(1, 1, 0, -Math.PI / 4) },
{ time: 1000, expected: rotate3dToMatrix(1, 1, 0, 3 * Math.PI / 4) }]);
}, property + ': matrix3d');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var matrixArray = [ 1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 1, 1 ];
+
+ target.style[idlName] = createMatrixFromArray(matrixArray);
+ var animation =
+ target.animate({ [idlName]: [ 'none', 'none' ] },
+ { duration: 1000, fill: 'both', composite: 'accumulate' });
+
+ testAnimationSampleMatrices(animation, idlName,
+ [{ time: 0, expected: matrixArray },
+ { time: 1000, expected: matrixArray }]);
+ }, property + ': none');
},
};
const filterListType = {
+ testInterpolation: function(property, setup) {
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation = target.animate({ [idlName]:
+ ['blur(10px)', 'blur(50px)'] },
+ 1000);
+
+ testAnimationSamples(animation, idlName,
+ [{ time: 500, expected: 'blur(30px)' }]);
+ }, property + ': blur function' );
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation = target.animate({ [idlName]: ['hue-rotate(0deg)',
+ 'hue-rotate(100deg)'] },
+ 1000);
+
+ testAnimationSamples(animation, idlName,
+ [{ time: 500, expected: 'hue-rotate(50deg)' }]);
+ }, property + ': hue-rotate function with same unit(deg)' );
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation = target.animate({ [idlName]: ['hue-rotate(10deg)',
+ 'hue-rotate(100rad)'] },
+ 1000);
+
+ // 10deg = 0.1745rad.
+ testAnimationSamples(animation, idlName,
+ [{ time: 500, expected: 'hue-rotate(50.0873rad)' }]);
+ }, property + ': hue-rotate function with different unit(deg -> rad)');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation = target.animate(
+ { [idlName]:
+ ['drop-shadow(10px 10px 10px rgba(255, 0, 0, 0.4))',
+ 'drop-shadow(50px 50px 50px rgba(0, 0, 255, 0.8))'] },
+ 1000);
+
+ testAnimationSamples(
+ animation, idlName,
+ [{ time: 500,
+ expected: 'drop-shadow(rgba(85, 0, 170, 0.6) 30px 30px 30px)' }]);
+ }, property + ': drop-shadow function' );
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation = target.animate(
+ { [idlName]:
+ ['brightness(0.1) contrast(0.1) grayscale(0.1) invert(0.1) ' +
+ 'opacity(0.1) saturate(0.1) sepia(0.1)',
+ 'brightness(0.5) contrast(0.5) grayscale(0.5) invert(0.5) ' +
+ 'opacity(0.5) saturate(0.5) sepia(0.5)'] },
+ 1000);
+
+ testAnimationSamples(animation, idlName,
+ [{ time: 500,
+ expected: 'brightness(0.3) contrast(0.3) grayscale(0.3) ' +
+ 'invert(0.3) opacity(0.3) saturate(0.3) sepia(0.3)' }]);
+ }, property + ': percentage or numeric-specifiable functions' +
+ '(number value)');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation = target.animate(
+ { [idlName]:
+ ['brightness(10%) contrast(10%) grayscale(10%) invert(10%) ' +
+ 'opacity(10%) saturate(10%) sepia(10%)',
+ 'brightness(50%) contrast(50%) grayscale(50%) invert(50%) ' +
+ 'opacity(50%) saturate(50%) sepia(50%)'] },
+ 1000);
+
+ testAnimationSamples(animation, idlName,
+ [{ time: 500,
+ expected: 'brightness(0.3) contrast(0.3) grayscale(0.3) ' +
+ 'invert(0.3) opacity(0.3) saturate(0.3) sepia(0.3)' }]);
+ }, property + ': percentage or numeric-specifiable functions' +
+ '(percentage value)');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation = target.animate(
+ { [idlName]:
+ // To make missing filter-function-lists, specified the grayscale.
+ ['grayscale(0)',
+ 'grayscale(1) brightness(0) contrast(0) opacity(0) saturate(0)' ]},
+ 1000);
+
+ testAnimationSamples(animation, idlName,
+ [{ time: 500,
+ expected: 'grayscale(0.5) brightness(0.5) contrast(0.5) ' +
+ 'opacity(0.5) saturate(0.5)' }]);
+ }, property + ': interpolate different length of filter-function-list ' +
+ ' with function which lacuna value is 1');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation = target.animate(
+ { [idlName]:
+ // To make missing filter-function-lists, specified the opacity.
+ ['opoacity(1)',
+ 'opacity(0) grayscale(1) invert(1) sepia(1) blur(10px)'] },
+ 1000);
+
+ testAnimationSamples(animation, idlName,
+ [{ time: 500,
+ expected:
+ 'opacity(0.5) grayscale(0.5) invert(0.5) sepia(0.5) blur(5px)' }]);
+ }, property + ': interpolate different length of filter-function-list ' +
+ ' with function which lacuna value is 0');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ target.style.color = "rgba(255, 0, 0, 0.4)";
+ var animation = target.animate(
+ { [idlName]:
+ ['blur(0px)',
+ 'blur(10px) drop-shadow(10px 10px 10px rgba(0, 0, 255, 0.8))'] },
+ 1000);
+
+ testAnimationSamples(animation, idlName,
+ [{ time: 500,
+ // The lacuna value of drop-shadow's color is taken from
+ // the color property.
+ expected: 'blur(5px) drop-shadow(rgba(85, 0, 170, 0.6) 5px 5px 5px' }]);
+ }, property + ': interpolate different length of filter-function-list ' +
+ 'with drop-shadow function');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation = target.animate({ [idlName]: ['none', 'blur(10px)'] },
+ 1000);
+
+ testAnimationSamples(animation, idlName,
+ [{ time: 500, expected: 'blur(5px)' }]);
+ }, property + ': interpolate from none');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation = target.animate(
+ { [idlName]:
+ ['blur(0px) url(\"#f1\")',
+ 'blur(10px) url(\"#f2\")']},
+ 1000);
+ testAnimationSamples(animation, idlName,
+ [{ time: 499, expected: 'blur(0px) url(\"#f1\")' },
+ { time: 500, expected: 'blur(10px) url(\"#f2\")' }]);
+ }, property + ': url function (interpoalte as discrete)');
+ },
+
testAddition: function(property, setup) {
test(function(t) {
var idlName = propertyToIDL(property);
@@ -1331,6 +1540,18 @@ const textShadowListType = {
[{ time: 500, expected: 'rgb(150, 150, 150) 15px 15px 15px, '
+ 'rgba(100, 100, 100, 0.5) 5px 5px 5px' }]);
}, property + ': mismatched list length (from shorter to longer)');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ target.style.color = 'rgb(0, 255, 0)';
+ var animation =
+ target.animate({ [idlName]: [ 'currentcolor 0px 0px 0px',
+ 'currentcolor 10px 10px 10px'] },
+ { duration: 1000, fill: 'both' });
+ testAnimationSamples(animation, idlName,
+ [{ time: 500, expected: 'rgb(0, 255, 0) 5px 5px 5px' }]);
+ }, property + ': with currentcolor');
},
testAddition: function(property, setup) {
@@ -1440,6 +1661,18 @@ const boxShadowListType = {
[{ time: 500, expected: 'rgb(150, 150, 150) 15px 15px 15px 10px, '
+ 'rgba(100, 100, 100, 0.5) 5px 5px 5px 0px' }]);
}, property + ': mismatched list length (from longer to shorter)');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ target.style.color = 'rgb(0, 255, 0)';
+ var animation =
+ target.animate({ [idlName]: [ 'currentcolor 0px 0px 0px 0px',
+ 'currentcolor 10px 10px 10px 10px'] },
+ { duration: 1000, fill: 'both' });
+ testAnimationSamples(animation, idlName,
+ [{ time: 500, expected: 'rgb(0, 255, 0) 5px 5px 5px 5px' }]);
+ }, property + ': with currentcolor');
},
testAddition: function(property, setup) {
@@ -1610,6 +1843,118 @@ const dasharrayType = {
},
}
+const fontStretchType = {
+ testInterpolation: function(property, setup) {
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation =
+ target.animate({ [idlName]: ['ultra-condensed', 'extra-condensed'] },
+ { duration: 1000, fill: 'both' });
+ testAnimationSamples(animation, idlName,
+ [{ time: 499, expected: 'ultra-condensed' },
+ { time: 500, expected: 'extra-condensed' }]);
+ }, property + ' supports animating as a font-stretch (adjacent values)');
+
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ var animation =
+ target.animate({ [idlName]: ['ultra-condensed', 'condensed'] },
+ { duration: 1000, fill: 'both' });
+ testAnimationSamples(animation, idlName,
+ [{ time: 500, expected: 'extra-condensed' }]);
+ }, property + ' supports animating as a font-stretch (between value)');
+ },
+
+ testAdditionOrAccumulation: function(property, setup, composite) {
+ test(function(t) {
+ var idlName = propertyToIDL(property);
+ var target = createTestElement(t, setup);
+ target.style[idlName] = 'condensed';
+ var animation =
+ target.animate({ [idlName]: ['expanded', 'ultra-expanded'] },
+ { duration: 1000, composite: composite });
+ testAnimationSamples(animation, idlName,
+ [{ time: 0, expected: 'normal' },
+ { time: 250, expected: 'semi-expanded' }]);
+ }, property + ' uses font-stretch behavior for composite type ' + composite);
+ },
+
+ testAddition: function(property, setup) {
+ this.testAdditionOrAccumulation(property, setup, 'add');
+ },
+
+ testAccumulation: function(property, setup) {
+ this.testAdditionOrAccumulation(property, setup, 'accumulate');
+ },
+}
+
+const fontVariationSettingsType = {
+ testInterpolation: (property, setup) => {
+ test(t => {
+ const idlName = propertyToIDL(property);
+ const target = createTestElement(t, setup);
+ const animation =
+ target.animate({ [idlName]: ['"wght" 1.1', '"wght" 1.5'] },
+ { duration: 1000, fill: 'both' });
+ testAnimationSamples(animation, idlName,
+ [{ time: 0, expected: '"wght" 1.1' },
+ { time: 250, expected: '"wght" 1.2' },
+ { time: 750, expected: '"wght" 1.4' } ]);
+ }, `${property} supports animation as float`);
+
+ test(t => {
+ const idlName = propertyToIDL(property);
+ const target = createTestElement(t, setup);
+ const animation =
+ target.animate({ [idlName]: ['"wdth" 1, "wght" 1.1',
+ '"wght" 1.5, "wdth" 5'] },
+ { duration: 1000, fill: 'both' });
+ testAnimationSamplesWithAnyOrder(
+ animation, idlName,
+ [{ time: 0, expected: '"wdth" 1, "wght" 1.1' },
+ { time: 250, expected: '"wdth" 2, "wght" 1.2' },
+ { time: 750, expected: '"wdth" 4, "wght" 1.4' } ]);
+ }, `${property} supports animation as float with multiple tags`);
+
+ test(t => {
+ const idlName = propertyToIDL(property);
+ const target = createTestElement(t, setup);
+ const animation =
+ target.animate({ [idlName]: ['"wdth" 1, "wght" 1.1',
+ '"wght" 10, "wdth" 5, "wght" 1.5'] },
+ { duration: 1000, fill: 'both' });
+ testAnimationSamplesWithAnyOrder(
+ animation, idlName,
+ [{ time: 250, expected: '"wdth" 2, "wght" 1.2' },
+ { time: 750, expected: '"wdth" 4, "wght" 1.4' } ]);
+ }, `${property} supports animation as float with multiple duplicate tags`);
+ },
+
+ testAdditionOrAccumulation: (property, setup, composite) => {
+ test(t => {
+ const idlName = propertyToIDL(property);
+ const target = createTestElement(t, setup);
+ target.style[idlName] = '"wght" 1';
+ const animation =
+ target.animate({ [idlName]: ['"wght" 1.1', '"wght" 1.5'] },
+ { duration: 1000, composite: composite });
+ testAnimationSamples(animation, idlName,
+ [{ time: 250, expected: '"wght" 2.2' },
+ { time: 750, expected: '"wght" 2.4' } ]);
+ }, `${property} with composite type ${composite}`);
+ },
+
+ testAddition: function(property, setup) {
+ this.testAdditionOrAccumulation(property, setup, 'add');
+ },
+
+ testAccumulation: function(property, setup) {
+ this.testAdditionOrAccumulation(property, setup, 'accumulate');
+ },
+}
+
const types = {
color: colorType,
discrete: discreteType,
@@ -1629,5 +1974,6 @@ const types = {
rect: rectType,
position: positionType,
dasharray: dasharrayType,
+ fontStretch: fontStretchType,
+ fontVariationSettings: fontVariationSettingsType,
};
-
diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-filters.html b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-filters.html
deleted file mode 100644
index ad930408450..00000000000
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-filters.html
+++ /dev/null
@@ -1,210 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>Keyframe spacing tests on filters</title>
-<link rel="help" href="https://w3c.github.io/web-animations/#spacing-keyframes">
-<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";
-
-// Help function for testing the computed offsets by the distance array.
-function assert_animation_offsets(anim, dist) {
- const frames = anim.effect.getKeyframes();
- const cumDist = dist.reduce( (prev, curr) => {
- prev.push(prev.length == 0 ? curr : curr + prev[prev.length - 1]);
- return prev;
- }, []);
-
- const total = cumDist[cumDist.length - 1];
- for (var i = 0; i < frames.length; ++i) {
- assert_equals(frames[i].computedOffset, cumDist[i] / total,
- 'computedOffset of frame ' + i);
- }
-}
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'blur(1px)'},
- { filter: 'none' }, // The default value is 0px.
- { filter: 'blur(10px)' },
- { filter: 'blur(8px)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0, 1, 10, (10 - 8) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on blur' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'brightness(50%)'},
- { filter: 'none' }, // The default value is 1.
- { filter: 'brightness(2)' },
- { filter: 'brightness(175%)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0, (1 - 0.5), (2 - 1), (2.0 - 1.75) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on brightness' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'contrast(50%)'},
- { filter: 'none' }, // The default value is 1.
- { filter: 'contrast(2)' },
- { filter: 'contrast(175%)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0, (1 - 0.5), (2 - 1), (2.0 - 1.75) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on contrast' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'drop-shadow(10px 10px 10px blue)'},
- { filter: 'none' },
- // none filter: 'drop-shadow(0, 0, 0, rgba(0, 0, 0, 0))'
- { filter: 'drop-shadow(5px 5px 1px black)' },
- { filter: 'drop-shadow(20px 20px yellow)' } ],
- { spacing: 'paced(filter)' });
-
- // Blue: rgba(0, 0, 255, 1.0) = rgba( 0%, 0%, 100%, 100%).
- // Black: rgba(0, 0, 0, 1.0) = rgba( 0%, 0%, 0%, 100%).
- // Yellow: rgba(255, 255, 0, 1.0) = rgba(100%, 100%, 0%, 100%).
- var dist = [ 0,
- Math.sqrt(10 * 10 + 10 * 10 + 10 * 10 + (1 * 1 + 1 * 1)),
- Math.sqrt(5 * 5 + 5 * 5 + 1 * 1 + (1 * 1)),
- Math.sqrt(15 * 15 + 15 * 15 + 1 * 1 + (1 * 1 + 1 * 1)) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on drop-shadow' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'drop-shadow(10px 10px 10px)'},
- { filter: 'drop-shadow(0 0)' },
- { filter: 'drop-shadow(5px 5px 1px black)' },
- { filter: 'drop-shadow(20px 20px yellow)' } ],
- { spacing: 'paced(filter)' });
-
- // Black: rgba(0, 0, 0, 1.0) = rgba( 0%, 0%, 0%, 100%).
- // Yellow: rgba(255, 255, 0, 1.0) = rgba(100%, 100%, 0%, 100%).
- var dist = [ 0,
- Math.sqrt(10 * 10 + 10 * 10 + 10 * 10),
- 0, // The distance is zero because the 2nd frame uses no-color.
- Math.sqrt(15 * 15 + 15 * 15 + 1 * 1 + (1 * 1 + 1 * 1)) ];
- assert_animation_offsets(anim, dist);
-}, 'Test getting zero distance when computing distance between ' +
- 'color and no-color on drop-shadow');
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'grayscale(50%)'},
- { filter: 'none' }, // The default value is 0.
- // Values of grayscale over 100% are clamped to 1.
- { filter: 'grayscale(2)' },
- { filter: 'grayscale(75%)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0, 0.5, 1, (1.0 - 0.75) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on grayscale' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'hue-rotate(180deg)'},
- { filter: 'none' }, // The default value is 0deg.
- { filter: 'hue-rotate(720deg)' },
- { filter: 'hue-rotate(-180deg)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0, 180, 720, 720 + 180 ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on hue-rotate' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'invert(50%)'},
- { filter: 'none' }, // The default value is 0.
- // Values of invert over 100% are clamped to 1.
- { filter: 'invert(2)' },
- { filter: 'invert(75%)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0, 0.5, 1, (1.0 - 0.75) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on invert' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'opacity(50%)'},
- { filter: 'none' }, // The default value is 1.
- // Values of opacity over 100% are clamped to 1.
- { filter: 'opacity(2)' },
- { filter: 'opacity(75%)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0, (1 - 0.5), (1 - 1), (1.0 - 0.75) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on opacity' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'saturate(50%)'},
- { filter: 'none' }, // The default value is 1.
- { filter: 'saturate(2)' },
- { filter: 'saturate(175%)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0, (1 - 0.5), (2 - 1), (2.0 - 1.75) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on saturate' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'sepia(50%)'},
- { filter: 'none' }, // The default value is 0.
- // Values of sepia over 100% are clamped to 1.
- { filter: 'sepia(2)' },
- { filter: 'sepia(75%)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0, 0.5, 1, (1.0 - 0.75) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on sepia' );
-
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'grayscale(50%) opacity(100%) blur(5px)' },
- { filter: 'none' },
- // none filter: 'grayscale(0) opacity(1) blur(0px)'
- { filter: 'grayscale(100%) opacity(50%) blur(1px)' },
- { filter: 'grayscale(75%) opacity(50%)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0,
- Math.sqrt(0.5 * 0.5 + 5 * 5),
- Math.sqrt(1 * 1 + 0.5 * 0.5 + 1 * 1),
- Math.sqrt(0.25 * 0.25 + 1 * 1) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on filter function lists with consistent sequence' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { filter: 'grayscale(50%) opacity(100%)' },
- { filter: 'opacity(10%) grayscale(50%)' },
- { filter: 'grayscale(100%) opacity(50%) blur(1px)' },
- { filter: 'grayscale(75%) opacity(50%)' } ],
- { spacing: 'paced(filter)' });
-
- var dist = [ 0,
- 0,
- 0,
- Math.sqrt(0.25 * 0.25 + 1 * 1) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on filter function lists with inconsistent sequence' );
-
-</script>
-</body>
diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-shapes.html b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-shapes.html
deleted file mode 100644
index 9f7cfaea1e4..00000000000
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-shapes.html
+++ /dev/null
@@ -1,152 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>Keyframe spacing tests on shapes</title>
-<link rel="help" href="https://w3c.github.io/web-animations/#spacing-keyframes">
-<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";
-
-// Help function for testing the computed offsets by the distance array.
-function assert_animation_offsets(anim, dist) {
- const frames = anim.effect.getKeyframes();
- const cumDist = dist.reduce( (prev, curr) => {
- prev.push(prev.length == 0 ? curr : curr + prev[prev.length - 1]);
- return prev;
- }, []);
-
- const total = cumDist[cumDist.length - 1];
- for (var i = 0; i < frames.length; ++i) {
- assert_equals(frames[i].computedOffset, cumDist[i] / total,
- 'computedOffset of frame ' + i);
- }
-}
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { clipPath: 'circle(20px)' },
- { clipPath: 'ellipse(10px 20px)' },
- { clipPath: 'polygon(50px 0px, 100px 50px, ' +
- ' 50px 100px, 0px 50px)' },
- { clipPath: 'inset(20px round 10px)' } ],
- { spacing: 'paced(clip-path)' });
-
- const frames = anim.effect.getKeyframes();
- const slots = frames.length - 1;
- for (var i = 0; i < frames.length; ++i) {
- assert_equals(frames[i].computedOffset, i / slots,
- 'computedOffset of frame ' + i);
- }
-}, 'Test falling back to distribute spacing when using different basic shapes');
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { clipPath: 'circle(10px)' },
- { clipPath: 'circle(20px) content-box' },
- { clipPath: 'circle(70px)' },
- { clipPath: 'circle(10px) padding-box' } ],
- { spacing: 'paced(clip-path)' });
-
- const frames = anim.effect.getKeyframes();
- const slots = frames.length - 1;
- for (var i = 0; i < frames.length; ++i) {
- assert_equals(frames[i].computedOffset, i / slots,
- 'computedOffset of frame ' + i);
- }
-}, 'Test falling back to distribute spacing when using different ' +
- 'reference boxes');
-
-test(function(t) {
- // 1st: circle(calc(20px) at calc(20px + 0%) calc(10px + 0%))
- // 2nd: circle(calc(50px) at calc(10px + 0%) calc(10px + 0%))
- // 3rd: circle(70px at calc(10px + 0%) calc(50px + 0%))
- // 4th: circle(10px at calc(50px + 0%) calc(30px + 0%))
- var anim =
- createDiv(t).animate([ { clipPath: 'circle(calc(10px + 10px) ' +
- ' at 20px 10px)' },
- { clipPath: 'circle(calc(20px + 30px) ' +
- ' at 10px 10px)' },
- { clipPath: 'circle(70px at 10px 50px)' },
- { clipPath: 'circle(10px at 50px 30px)' } ],
- { spacing: 'paced(clip-path)' });
-
- var dist = [ 0,
- Math.sqrt(30 * 30 + 10 * 10),
- Math.sqrt(20 * 20 + 40 * 40),
- Math.sqrt(60 * 60 + 40 * 40 + 20 * 20) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on circle' );
-
-test(function(t) {
- // 1st: ellipse(20px calc(20px) at calc(0px + 50%) calc(0px + 50%))
- // 2nd: ellipse(20px calc(50px) at calc(0px + 50%) calc(0px + 50%))
- // 3rd: ellipse(30px 70px at calc(0px + 50%) calc(0px + 50%))
- // 4th: ellipse(30px 10px at calc(0px + 50%) calc(0px + 50%))
- var anim =
- createDiv(t).animate([ { clipPath: 'ellipse(20px calc(10px + 10px))' },
- { clipPath: 'ellipse(20px calc(20px + 30px))' },
- { clipPath: 'ellipse(30px 70px)' },
- { clipPath: 'ellipse(30px 10px)' } ],
- { spacing: 'paced(clip-path)' });
-
- var dist = [ 0,
- Math.sqrt(30 * 30),
- Math.sqrt(10 * 10 + 20 * 20),
- Math.sqrt(60 * 60) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on ellipse' );
-
-test(function(t) {
- // 1st: polygon(nonzero, 50px 0px, 100px 50px, 50px 100px, 0px 50px)
- // 2nd: polygon(nonzero, 40px 0px, 100px 70px, 10px 100px, 0px 70px)
- // 3rd: polygon(nonzero, 100px 0px, 100px 100px, 10px 80px, 0px 50px)
- // 4th: polygon(nonzero, 100px 100px, -10px 100px, 20px 80px, 20px 50px)
- var anim =
- createDiv(t).animate([ { clipPath: 'polygon(50px 0px, 100px 50px, ' +
- ' 50px 100px, 0px 50px)' },
- { clipPath: 'polygon(40px 0px, 100px 70px, ' +
- ' 10px 100px, 0px 70px)' },
- { clipPath: 'polygon(100px 0px, 100px 100px, ' +
- ' 10px 80px, 0px 50px)' },
- { clipPath: 'polygon(100px 100px, -10px 100px, ' +
- ' 20px 80px, 20px 50px)' } ],
- { spacing: 'paced(clip-path)' });
-
- var dist = [ 0,
- Math.sqrt(10 * 10 + 20 * 20 + 40 * 40 + 20 * 20),
- Math.sqrt(60 * 60 + 30 * 30 + 20 * 20 + 20 * 20),
- Math.sqrt(100 * 100 + 110 * 110 + 10 * 10 + 20 * 20) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on polygon' );
-
-test(function(t) {
- // Note: Rounding corners are 4 CSS pair values and
- // each pair has x & y components.
- // 1st: inset(5px 5px 5px 5px round 40px 30px 20px 5px / 40px 30px 20px 5px)
- // 2nd: inset(10px 5px 10px 5px round 50px 60px / 50px 60px)
- // 3rd: inset(40px 40px 40px 40px round 10px / 10px)
- // 4th: inset(30px 40px 30px 40px round 20px / 20px)
- var anim =
- createDiv(t).animate([ { clipPath: 'inset(5px 5px 5px 5px ' +
- ' round 40px 30px 20px 5px)' },
- { clipPath: 'inset(10px 5px round 50px 60px)' },
- { clipPath: 'inset(40px 40px round 10px)' },
- { clipPath: 'inset(30px 40px round 20px)' } ],
- { spacing: 'paced(clip-path)' });
-
- var dist = [ 0,
- Math.sqrt(5 * 5 * 2 + (50 - 40) * (50 - 40) * 2 +
- (60 - 30) * (60 - 30) * 2 +
- (50 - 20) * (50 - 20) * 2 +
- (60 - 5) * (60 - 5) * 2),
- Math.sqrt(30 * 30 * 2 + 35 * 35 * 2 + (50 - 10) * (50 - 10) * 4 +
- (60 - 10) * (60 - 10) * 4),
- Math.sqrt(10 * 10 * 2 + (20 - 10) * (20 - 10) * 8) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on inset' );
-
-</script>
-</body>
diff --git a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-transform.html b/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-transform.html
deleted file mode 100644
index 189a25e1b01..00000000000
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/animation-types/spacing-keyframes-transform.html
+++ /dev/null
@@ -1,242 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>Keyframe spacing tests on transform</title>
-<link rel="help" href="https://w3c.github.io/web-animations/#spacing-keyframes">
-<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";
-
-const pi = Math.PI;
-const cos = Math.cos;
-const sin = Math.sin;
-const tan = Math.tan;
-const sqrt = Math.sqrt;
-
-// Help function for testing the computed offsets by the distance array.
-function assert_animation_offsets(anim, dist) {
- const epsilon = 0.00000001;
- const frames = anim.effect.getKeyframes();
- const cumDist = dist.reduce( (prev, curr) => {
- prev.push(prev.length == 0 ? curr : curr + prev[prev.length - 1]);
- return prev;
- }, []);
-
- const total = cumDist[cumDist.length - 1];
- for (var i = 0; i < frames.length; ++i) {
- assert_approx_equals(frames[i].computedOffset, cumDist[i] / total,
- epsilon, 'computedOffset of frame ' + i);
- }
-}
-
-function getAngleDist(rotate1, rotate2) {
- function quaternion(axis, angle) {
- var x = axis[0] * sin(angle/2.0);
- var y = axis[1] * sin(angle/2.0);
- var z = axis[2] * sin(angle/2.0);
- var w = cos(angle/2.0);
- return { 'x': x, 'y': y, 'z': z, 'w': w };
- }
- var q1 = quaternion(rotate1.axis, rotate1.angle);
- var q2 = quaternion(rotate2.axis, rotate2.angle);
- var dotProduct = q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w;
- return 2.0 * Math.acos(dotProduct);
-}
-
-function createMatrix(elements, Is3D) {
- return (Is3D ? "matrix3d" : "matrix") + "(" + elements.join() + ")";
-}
-
-test(function(t) {
- var anim = createDiv(t).animate([ { transform: "none" },
- { transform: "translate(-20px)" },
- { transform: "translate(100px)" },
- { transform: "translate(50px)"} ],
- { spacing: "paced(transform)" });
- assert_animation_offsets(anim, [ 0, 20, 120, 50 ]);
-}, 'Test spacing on translate' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { transform: "none" },
- { transform: "translate3d(-20px, 10px, 100px)" },
- { transform: "translate3d(100px, 200px, 50px)" },
- { transform: "translate(50px, -10px)"} ],
- { spacing: "paced(transform)" });
- var dist = [ 0,
- sqrt(20 * 20 + 10 * 10 + 100 * 100),
- sqrt(120 * 120 + 190 * 190 + 50 * 50),
- sqrt(50 * 50 + 210 * 210 + 50 * 50) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on translate3d' );
-
-test(function(t) {
- var anim = createDiv(t).animate([ { transform: "scale(0.5)" },
- { transform: "scale(4.5)" },
- { transform: "scale(2.5)" },
- { transform: "none"} ],
- { spacing: "paced(transform)" });
- assert_animation_offsets(anim, [ 0, 4.0, 2.0, 1.5 ]);
-}, 'Test spacing on scale' );
-
-test(function(t) {
- var anim = createDiv(t).animate([ { transform: "scale(0.5, 0.5)" },
- { transform: "scale3d(4.5, 5.0, 2.5)" },
- { transform: "scale3d(2.5, 1.0, 2.0)" },
- { transform: "scale3d(1, 0.5, 1.0)"} ],
- { spacing:"paced(transform)" });
- var dist = [ 0,
- sqrt(4.0 * 4.0 + 4.5 * 4.5 + 1.5 * 1.5),
- sqrt(2.0 * 2.0 + 4.0 * 4.0 + 0.5 * 0.5),
- sqrt(1.5 * 1.5 + 0.5 * 0.5 + 1.0 * 1.0) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on scale3d' );
-
-test(function(t) {
- var anim = createDiv(t).animate([ { transform: "rotate(60deg)" },
- { transform: "none" },
- { transform: "rotate(720deg)" },
- { transform: "rotate(-360deg)"} ],
- { spacing: "paced(transform)" });
- assert_animation_offsets(anim, [ 0, 60, 720, 1080 ]);
-}, 'Test spacing on rotate' );
-
-test(function(t) {
- var anim = createDiv(t).animate([ { transform: "rotate3d(1,0,0,60deg)" },
- { transform: "rotate3d(1,0,0,70deg)" },
- { transform: "rotate3d(0,0,1,-110deg)" },
- { transform: "rotate3d(1,0,0,219deg)"} ],
- { spacing: "paced(transform)" });
- var dist = [ 0,
- getAngleDist({ axis: [1,0,0], angle: 60 * pi / 180 },
- { axis: [1,0,0], angle: 70 * pi / 180 }),
- getAngleDist({ axis: [0,1,0], angle: 70 * pi / 180 },
- { axis: [0,0,1], angle: -110 * pi / 180 }),
- getAngleDist({ axis: [0,0,1], angle: -110 * pi / 180 },
- { axis: [1,0,0], angle: 219 * pi / 180 }) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on rotate3d' );
-
-test(function(t) {
- var anim = createDiv(t).animate([ { transform: "skew(60deg)" },
- { transform: "none" },
- { transform: "skew(-90deg)" },
- { transform: "skew(90deg)"} ],
- { spacing: "paced(transform)" });
- assert_animation_offsets(anim, [ 0, 60, 90, 180 ]);
-}, 'Test spacing on skew' );
-
-test(function(t) {
- var anim = createDiv(t).animate([ { transform: "skew(60deg, 30deg)" },
- { transform: "none" },
- { transform: "skew(-90deg, 60deg)" },
- { transform: "skew(90deg, 60deg)"} ],
- { spacing: "paced(transform)" });
- var dist = [ 0,
- sqrt(60 * 60 + 30 * 30),
- sqrt(90 * 90 + 60 * 60),
- sqrt(180 * 180 + 0) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on skew along both X and Y' );
-
-test(function(t) {
- // We calculate the distance of two perspective functions by converting them
- // into two matrix3ds, and then do matrix decomposition to get two
- // perspective vectors, so the equivalent perspective vectors are:
- // perspective 1: (0, 0, -1/128, 1);
- // perspective 2: (0, 0, -1/infinity = 0, 1);
- // perspective 3: (0, 0, -1/1024, 1);
- // perspective 4: (0, 0, -1/32, 1);
- var anim = createDiv(t).animate([ { transform: "perspective(128px)" },
- { transform: "none" },
- { transform: "perspective(1024px)" },
- { transform: "perspective(32px)"} ],
- { spacing: "paced(transform)" });
- assert_animation_offsets(anim, [ 0, 1/128, 1/1024, 1/32 - 1/1024 ]);
-}, 'Test spacing on perspective' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { transform: "none" },
- { transform: "rotate(180deg) translate(0px)" },
- { transform: "rotate(180deg) translate(1000px)" },
- { transform: "rotate(360deg) translate(1000px)"} ],
- { spacing: "paced(transform)" });
- var dist = [ 0,
- sqrt(pi * pi + 0),
- sqrt(1000 * 1000),
- sqrt(pi * pi + 0) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on matched transform lists' );
-
-test(function(t) {
- // matrix1 => translate(100px, 50px), skewX(60deg).
- // matrix2 => translate(1000px), rotate(180deg).
- // matrix3 => translate(1000px), scale(1.5, 0.7).
- const matrix1 = createMatrix([ 1, 0, tan(pi/4.0), 1, 100, 50 ]);
- const matrix2 = createMatrix([ cos(pi), sin(pi),
- -sin(pi), cos(pi),
- 1000, 0 ]);
- const matrix3 = createMatrix([ 1.5, 0, 0, 0.7, 1000, 0 ]);
- var anim = createDiv(t).animate([ { transform: "none" },
- { transform: matrix1 },
- { transform: matrix2 },
- { transform: matrix3 } ],
- { spacing: "paced(transform)" });
- var dist = [ 0,
- sqrt(100 * 100 + 50 * 50 + pi/4 * pi/4),
- sqrt(900 * 900 + 50 * 50 + pi * pi + pi/4 * pi/4),
- sqrt(pi * pi + 0.5 * 0.5 + 0.3 * 0.3) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on matrix' );
-
-test(function(t) {
- // matrix1 => translate3d(100px, 50px, -10px), skew(60deg).
- // matrix2 => translate3d(1000px, 0, 0), rotate3d(1, 0, 0, 180deg).
- // matrix3 => translate3d(1000px, 0, 0), scale3d(1.5, 0.7, 2.2).
- const matrix1 = createMatrix([ 1, 0, 0, 0,
- tan(pi/4.0), 1, 0, 0,
- 0, 0, 1, 0,
- 100, 50, -10, 1 ], true);
- const matrix2 = createMatrix([ 1, 0, 0, 0,
- 0, cos(pi), sin(pi), 0,
- 0, -sin(pi), cos(pi), 0,
- 1000, 0, 0, 1 ], true);
- const matrix3 = createMatrix([ 1.5, 0, 0, 0,
- 0, 0.7, 0, 0,
- 0, 0, 2.2, 0,
- 1000, 0, 0, 1 ], true);
- var anim = createDiv(t).animate([ { transform: "none" },
- { transform: matrix1 },
- { transform: matrix2 },
- { transform: matrix3 } ],
- { spacing: "paced(transform)" });
- var dist = [ 0,
- sqrt(100 * 100 + 50 * 50 + 10 * 10 + pi/4 * pi/4),
- sqrt(900 * 900 + 50 * 50 + 10 * 10 + pi/4 * pi/4 + pi * pi),
- sqrt(0.5 * 0.5 + 0.3 * 0.3 + 1.2 * 1.2 + pi * pi) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on matrix3d' );
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { transform: "none" },
- { transform: "translate(100px, 50px) skew(45deg)" },
- { transform: "translate(1000px) " +
- "rotate3d(1, 0, 0, 180deg)" },
- { transform: "translate(1000px) " +
- "scale3d(2.5, 0.5, 0.7)" } ],
- { spacing: "paced(transform)" });
-
- var dist = [ 0,
- sqrt(100 * 100 + 50 * 50 + pi/4 * pi/4),
- sqrt(900 * 900 + 50 * 50 + pi/4 * pi/4 + pi * pi),
- sqrt(1.5 * 1.5 + 0.5 * 0.5 + 0.3 * 0.3 + pi * pi) ];
- assert_animation_offsets(anim, dist);
-}, 'Test spacing on mismatched transform list' );
-
-</script>
-</body>
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
deleted file mode 100644
index 90e26d276d8..00000000000
--- a/tests/wpt/web-platform-tests/web-animations/animation-model/keyframe-effects/spacing-keyframes.html
+++ /dev/null
@@ -1,391 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>Keyframe spacing tests</title>
-<link rel="help" href="https://w3c.github.io/web-animations/#spacing-keyframes">
-<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([ { marginLeft: '0px' },
- { marginLeft: '-20px' },
- { marginLeft: '100px' },
- { marginLeft: '50px' } ],
- { duration: 100 * MS_PER_SEC });
-
- 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');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { marginLeft: '0px' },
- { marginLeft: '-20px' },
- { marginLeft: '100px', offset: 0.5 },
- { marginLeft: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'distribute' });
-
- var frames = anim.effect.getKeyframes();
- assert_equals(frames[0].computedOffset, 0.0, '1st frame offset');
- assert_equals(frames[1].computedOffset, 0.5 * 1 / 2, '2nd frame offset');
- assert_equals(frames[2].computedOffset, 0.5, '3rd frame offset');
- assert_equals(frames[3].computedOffset, 1.0, 'last frame offset');
-}, 'Test distribute spacing with specific offsets');
-
-test(function(t) {
- var anim = createDiv(t).animate(null,
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin-left)' });
-
- var frames = anim.effect.getKeyframes();
- assert_equals(frames.length, 0, "empty keyframe list");
-}, 'Test paced spacing without any keyframe');
-
-
-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)' });
-
- 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');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { marginLeft: '0px' },
- { marginLeft: '-20px' },
- { marginLeft: '100px', offset: 0.5 },
- { marginLeft: '120px' },
- { marginLeft: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin-left)' });
-
- var frames = anim.effect.getKeyframes();
- var cumDist1 = [ 0, 20, 140 ];
- var cumDist2 = [ 0, 20, 90 ];
- assert_equals(frames[1].computedOffset, 0.5 * cumDist1[1] / cumDist1[2],
- '2nd frame offset');
- assert_equals(frames[2].computedOffset, 0.5,
- '3rd frame offset');
- assert_equals(frames[3].computedOffset, 0.5 + 0.5 * cumDist2[1] / cumDist2[2],
- '4th frame offset');
-}, 'Test paced spacing with specific offsets');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { marginLeft: '0px' },
- { marginLeft: '0px' },
- { marginLeft: '100px' },
- { marginLeft: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin-left)' });
-
- var frames = anim.effect.getKeyframes();
- var cumDist = [0, 0, 100, 150];
- assert_equals(frames[1].computedOffset, cumDist[1] / cumDist[3],
- '2nd frame offset');
- assert_equals(frames[2].computedOffset, cumDist[2] / cumDist[3],
- '3rd frame offset');
-}, 'Test paced spacing if some paced property values are equal');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { marginLeft: '0px' },
- { marginLeft: '0px' },
- { marginLeft: '0px' },
- { marginLeft: '0px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin-left)' });
-
- var frames = anim.effect.getKeyframes();
- var slots = frames.length - 1;
- assert_equals(frames[1].computedOffset, 1.0 / slots, '2nd frame offset');
- assert_equals(frames[2].computedOffset, 2.0 / slots, '3rd frame offset');
-}, 'Test falling back to distribute spacing if all paced property value ' +
- 'are equal');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { margin: '0px' },
- { marginTop: '-20px' },
- { marginLeft: '100px' },
- { margin: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin-left)' });
-
- var frames = anim.effect.getKeyframes();
- assert_equals(frames[1].computedOffset, frames[2].computedOffset * 1 / 2,
- '2nd frame offset using distribute spacing');
- assert_equals(frames[2].computedOffset, 100 / 150,
- '3rd frame offset using paced spacing');
-}, 'Test paced spacing if there a keyframe without the paced property');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { margin: '0px' },
- { marginTop: '40px' },
- { marginTop: '-20px' },
- { marginLeft: '40px' },
- { marginTop: '60px' },
- { margin: '10px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin-left)' });
-
- var frames = anim.effect.getKeyframes();
- var cumDist = [0, 0, 0, 40, 40, 70];
- assert_equals(frames[1].computedOffset, frames[3].computedOffset * 1 / 3,
- '2nd frame offset using distribute spacing');
- assert_equals(frames[2].computedOffset, frames[3].computedOffset * 2 / 3,
- '3rd frame offset using distribute spacing');
- assert_equals(frames[3].computedOffset, cumDist[3] / cumDist[5],
- '4th frame offset using paced spacing');
- assert_equals(frames[4].computedOffset,
- frames[3].computedOffset +
- (1 - frames[3].computedOffset) * 1 / 2,
- '5th frame offset using distribute spacing');
-}, 'Test paced spacing if a paced property that appears on only some ' +
- 'keyframes');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { margin: '0px' },
- { marginTop: '-20px', offset: 0.5 },
- { marginLeft: '40px' },
- { marginLeft: '100px' },
- { margin: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin-left)' });
-
- var frames = anim.effect.getKeyframes();
- assert_equals(frames[2].computedOffset, 0.5 + 0.5 * 1 / 3,
- '3rd frame offset using distribute spacing because it is the ' +
- 'first paceable keyframe');
- assert_equals(frames[3].computedOffset,
- frames[2].computedOffset +
- (1.0 - frames[2].computedOffset) * 60 / 110,
- '4th frame offset using paced spacing');
-}, 'Test paced spacing if a paced property that appears on only some ' +
- 'keyframes and there is a specific offset');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { margin: '0px' },
- { marginTop: '20px', offset: 0.2 },
- { marginTop: '40px' },
- { marginTop: '-20px' },
- { marginLeft: '-20px' },
- { marginLeft: '40px' },
- { marginTop: '60px' },
- { marginLeft: '100px' },
- { marginTop: '50px' },
- { marginTop: '100px', offset: 0.8 },
- { margin: '0px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin-left)' });
- var frames = anim.effect.getKeyframes();
- // Test distribute spacing in (A, Paced A] and [Paced B, frame B).
- var slots = frames.length - 3;
- var start = 0.2;
- var diff = 0.8 - start;
- assert_equals(frames[2].computedOffset, start + diff * 1.0 / slots,
- '3nd frame offset using distribute spacing');
- assert_equals(frames[3].computedOffset, start + diff * 2.0 / slots,
- '4rd frame offset using distribute spacing');
- assert_equals(frames[4].computedOffset, start + diff * 3.0 / slots,
- '5th frame offset using distribute spacing because it is ' +
- 'the first paceable keyframe');
- assert_equals(frames[7].computedOffset, start + diff * 6.0 / slots,
- '8th frame offset using distribute spacing because it is ' +
- 'the last paceable keyframe');
- assert_equals(frames[8].computedOffset, start + diff * 7.0 / slots,
- '9th frame offset using distribute spacing');
- // Test paced spacing and other null computed offsets in (Paced A, Paced B).
- var cumDist = [0, 60, 60, 120];
- assert_equals(frames[5].computedOffset,
- frames[4].computedOffset + cumDist[2] / cumDist[3] *
- (frames[7].computedOffset - frames[4].computedOffset),
- '6th frame offset using paced spacing');
- assert_equals(frames[6].computedOffset,
- frames[5].computedOffset + 1.0 / 2.0 *
- (frames[7].computedOffset - frames[5].computedOffset),
- '7th frame offset using distribute spacing');
-}, 'Test paced spacing where there are some keyframes without offsets and ' +
- 'without the paced property before the first paceable keyframe and ' +
- 'after the last paceable keyframe');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { margin: '0px' },
- { margin: '-20px' },
- { margin: '100px' },
- { margin: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin)' });
-
- var frames = anim.effect.getKeyframes();
- var cumDist = [0, 20, 140, 190];
- assert_equals(frames[1].computedOffset, cumDist[1] / cumDist[3],
- '2nd frame offset');
- assert_equals(frames[2].computedOffset, cumDist[2] / cumDist[3],
- '3rd frame offset');
-}, 'Test paced spacing for using shorthand property');
-
-test(function(t) {
- var anim =
- createDiv(t).animate([ { marginLeft: '0px', marginRight: '0px',
- marginTop: '10px', marginBottom: '10px' },
- { marginLeft: '-20px', marginRight: '-20px',
- marginTop: '0px', marginBottom: '0px' },
- { marginLeft: '100px', marginRight: '100px',
- marginTop: '-50px', marginBottom: '-50px' },
- { marginLeft: '50px', marginRight: '50px',
- marginTop: '80px', marginBottom: '80px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin)' });
-
- var frames = anim.effect.getKeyframes();
- var dist = [ 0,
- Math.sqrt(20 * 20 * 2 + 10 * 10 * 2),
- Math.sqrt(120 * 120 * 2 + 50 * 50 * 2),
- Math.sqrt(50 * 50 * 2 + 130 * 130 * 2) ];
- var cumDist = [];
- dist.reduce(function(prev, curr, i) { return cumDist[i] = prev + curr; }, 0);
- assert_approx_equals(frames[1].computedOffset, cumDist[1] / cumDist[3],
- 0.0001, '2nd frame offset');
- assert_approx_equals(frames[2].computedOffset, cumDist[2] / cumDist[3],
- 0.0001, '3rd frame offset');
-}, 'Test paced spacing using shorthand property where only the longhand ' +
- 'components are specified');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { marginLeft: '0px', marginTop: '0px' },
- { marginLeft: '-20px', marginTop: '-20px' },
- { marginLeft: '100px', marginTop: '100px' },
- { marginLeft: '50px', marginTop: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin)' });
-
- var frames = anim.effect.getKeyframes();
- var slots = frames.length - 1;
- assert_equals(frames[1].computedOffset, 1 / slots, '2nd frame offset');
- assert_equals(frames[2].computedOffset, 2 / slots, '3rd frame offset');
-}, 'Test falling back to distribute spacing if all keyframe miss some ' +
- 'components');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { margin: '0px' },
- { marginLeft: '-20px' },
- { marginTop: '40px' },
- { margin: '100px' },
- { margin: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin)' });
-
- var frames = anim.effect.getKeyframes();
- assert_equals(frames[1].computedOffset, frames[3].computedOffset * 1 / 3,
- '2nd frame offset using distribute spacing');
- assert_equals(frames[2].computedOffset, frames[3].computedOffset * 2 / 3,
- '3rd frame offset using distribute spacing');
- assert_equals(frames[3].computedOffset, 100 / 150,
- '4th frame offset using paced spacing');
-}, 'Test paced spacing only for keyframes specifying all longhand ' +
- 'components, and falling back to distribute spacing for the reset');
-
-test(function(t) {
- var anim = createDiv(t).animate([ { margin: '0px' },
- { marginLeft: '-20px' },
- { marginTop: '40px', offset: 0.5 },
- { margin: '100px' },
- { margin: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin)' });
-
- var frames = anim.effect.getKeyframes();
- assert_equals(frames[1].computedOffset, 0.5 * 1 / 2,
- '2nd frame offset using distribute spacing');
- assert_equals(frames[3].computedOffset, 0.5 + 0.5 * 1 / 2,
- '4th frame offset using distribute spacing because it is the ' +
- 'first paceable keyframe from a non-null offset keyframe');
-}, 'Test paced spacing only for keyframes specifying all some components, ' +
- 'and falling back to distribute spacing for the reset with some specific ' +
- 'offsets');
-
-// 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/Animatable/animate-no-browsing-context.html b/tests/wpt/web-platform-tests/web-animations/interfaces/Animatable/animate-no-browsing-context.html
new file mode 100644
index 00000000000..10371959d33
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/Animatable/animate-no-browsing-context.html
@@ -0,0 +1,108 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Animatable.animate tests in combination with elements in documents
+ without a browsing context</title>
+<link rel="help" href="https://w3c.github.io/web-animations/#dom-animatable-animate">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../testcommon.js"></script>
+<div id="log"></div>
+<script>
+'use strict';
+
+//
+// The following tests relate to animations on elements in documents without
+// a browsing context. This is NOT the same as documents that are not bound to
+// a document tree.
+//
+
+function getXHRDoc(t) {
+ return new Promise(resolve => {
+ const xhr = new XMLHttpRequest();
+ xhr.open('GET', '../../resources/xhr-doc.py');
+ xhr.responseType = 'document';
+ xhr.onload = t.step_func(() => {
+ assert_equals(xhr.readyState, xhr.DONE,
+ 'Request should complete successfully');
+ assert_equals(xhr.status, 200,
+ 'Response should be OK');
+ resolve(xhr.responseXML);
+ });
+ xhr.send();
+ });
+}
+
+promise_test(t => {
+ return getXHRDoc(t).then(xhrdoc => {
+ const div = xhrdoc.getElementById('test');
+ const anim = div.animate(null);
+ assert_class_string(anim.timeline, 'DocumentTimeline',
+ 'Animation should have a timeline');
+ assert_equals(anim.timeline, xhrdoc.timeline,
+ 'Animation timeline should be the default document timeline'
+ + ' of the XHR doc');
+ assert_not_equals(anim.timeline, document.timeline,
+ 'Animation timeline should NOT be the same timeline as'
+ + ' the default document timeline for the current'
+ + ' document');
+
+ });
+}, 'Element.animate() creates an animation with the correct timeline'
+ + ' when called on an element in a document without a browsing context');
+
+//
+// The following tests are cross-cutting tests that are not specific to the
+// Animatable.animate() interface. Instead, they draw on assertions from
+// various parts of the spec. These assertions are tested in other tests
+// but are repeated here to confirm that user agents are not doing anything
+// different in the particular case of document without a browsing context.
+//
+
+promise_test(t => {
+ return getXHRDoc(t).then(xhrdoc => {
+ const div = xhrdoc.getElementById('test');
+ const anim = div.animate(null);
+ // Since a document from XHR will not be active by itself, its document
+ // timeline will also be inactive.
+ assert_equals(anim.timeline.currentTime, null,
+ 'Document timeline time should be null');
+ });
+}, 'The timeline associated with an animation trigger on an element in'
+ + ' a document without a browsing context is inactive');
+
+promise_test(t => {
+ let anim;
+ return getXHRDoc(t).then(xhrdoc => {
+ const div = xhrdoc.getElementById('test');
+ anim = div.animate(null);
+ anim.timeline = document.timeline;
+ assert_equals(anim.playState, 'pending',
+ 'The animation should be initially pending');
+ return waitForAnimationFrames(2);
+ }).then(() => {
+ // Because the element is in a document without a browsing context, it will
+ // not be rendered and hence the user agent will never deem it ready to
+ // animate.
+ assert_equals(anim.playState, 'pending',
+ 'The animation should still be pending after replacing'
+ + ' the document timeline');
+ });
+}, 'Replacing the timeline of an animation targetting an element in a'
+ + ' document without a browsing context leaves it in the pending state');
+
+promise_test(t => {
+ let anim;
+ return getXHRDoc(t).then(xhrdoc => {
+ const div = xhrdoc.getElementById('test');
+ anim = div.animate({ opacity: [ 0, 1 ] }, 1000);
+ anim.timeline = document.timeline;
+ document.body.appendChild(div);
+ assert_equals(getComputedStyle(div).opacity, '0',
+ 'Style should be updated');
+ });
+}, 'Replacing the timeline of an animation targetting an element in a'
+ + ' document without a browsing context and then adopting that element'
+ + ' causes it to start updating style');
+
+</script>
+</body>
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 29c89140772..3ec4e9ca2d0 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
@@ -25,7 +25,7 @@ interface DocumentTimeline : AnimationTimeline {
var idlArray;
test(function() {
idlArray = new IdlArray();
- idlArray.add_untested_idls(
+ idlArray.add_idls(
document.getElementById('AnimationTimeline-IDL').textContent);
idlArray.add_idls(
document.getElementById('DocumentTimeline-IDL').textContent);
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/constructor.html b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/constructor.html
index 6be0c7872a6..ab52c5fbb15 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/constructor.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/constructor.html
@@ -228,8 +228,6 @@ test(function(t) {
assert_equals(effect.composite, "replace", "default composite");
assert_equals(effect.iterationComposite, "replace",
"default iterationComposite");
- assert_equals(effect.spacing, "distribute",
- "default spacing");
}, "a KeyframeEffectReadOnly constructed without any " +
"KeyframeEffectOptions object");
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
index eb5c032941b..7719fa9c1c5 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/iterationComposite.html
@@ -447,15 +447,15 @@ test(function(t) {
anim.pause();
anim.currentTime = anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_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,
+ assert_matrix_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,
+ assert_matrix_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');
@@ -471,16 +471,16 @@ test(function(t) {
anim.pause();
anim.currentTime = anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_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,
+ assert_matrix_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,
+ assert_matrix_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');
@@ -497,15 +497,15 @@ test(function(t) {
anim.pause();
anim.currentTime = anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_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,
+ assert_matrix_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,
+ assert_matrix_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');
@@ -521,15 +521,15 @@ test(function(t) {
anim.pause();
anim.currentTime = anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_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,
+ assert_matrix_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,
+ assert_matrix_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');
@@ -546,15 +546,15 @@ test(function(t) {
anim.pause();
anim.currentTime = anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_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,
+ assert_matrix_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,
+ assert_matrix_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');
@@ -571,16 +571,16 @@ test(function(t) {
anim.pause();
anim.currentTime = anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
'matrix(2.5, 0, 0, 2.5, 15, 0)',
'Animated transform of matrix function at 50s of the first iteration');
anim.currentTime = anim.effect.timing.duration * 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
// scale(2) + (scale(3-1)*2) + translateX(30px)*2
'matrix(6, 0, 0, 6, 60, 0)',
'Animated transform of matrix function at 0s of the third iteration');
anim.currentTime += anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
// from: matrix(6, 0, 0, 6, 60, 0)
// to: matrix(7, 0, 0, 7, 90, 0)
// = scale(3) + (scale(3-1)*2) + translateX(30px)*3
@@ -600,20 +600,20 @@ test(function(t) {
anim.pause();
anim.currentTime = anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
// Interpolate between matrix(2, 0, 0, 2, 0, 0) = translateX(0px) scale(2)
// and matrix(3, 0, 0, 3, 30, 0) = scale(3) translateX(10px)
'matrix(2.5, 0, 0, 2.5, 15, 0)',
'Animated transform list at 50s of the first iteration');
anim.currentTime = anim.effect.timing.duration * 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
// 'from' and 'to' value are mismatched, so accumulate
// matrix(2, 0, 0, 2, 0, 0) onto matrix(3, 0, 0, 3, 30, 0) * 2
// = scale(2) + (scale(3-1)*2) + translateX(30px)*2
'matrix(6, 0, 0, 6, 60, 0)',
'Animated transform list at 0s of the third iteration');
anim.currentTime += anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
// Interpolate between matrix(6, 0, 0, 6, 60, 0)
// and matrix(7, 0, 0, 7, 210, 0) = scale(7) translate(30px)
'matrix(6.5, 0, 0, 6.5, 135, 0)',
@@ -634,20 +634,20 @@ test(function(t) {
anim.pause();
anim.currentTime = anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
// Interpolate between matrix(1, 0, 0, 1, 0, 0) = translateX(0px)
// and matrix(2, 0, 0, 2, 20, 0) = scale(2) translateX(10px)
'matrix(1.5, 0, 0, 1.5, 10, 0)',
'Animated transform list at 50s of the first iteration');
anim.currentTime = anim.effect.timing.duration * 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
// 'from' and 'to' value are mismatched, so accumulate
// matrix(1, 0, 0, 1, 0, 0) onto matrix(2, 0, 0, 2, 20, 0) * 2
// = scale(1) + (scale(2-1)*2) + translateX(20px)*2
'matrix(3, 0, 0, 3, 40, 0)',
'Animated transform list at 0s of the third iteration');
anim.currentTime += anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
// Interpolate between matrix(3, 0, 0, 3, 40, 0)
// and matrix(4, 0, 0, 4, 120, 0) =
// scale(2 + (2-1)*2) translate(10px * 3)
@@ -668,16 +668,19 @@ test(function(t) {
anim.pause();
anim.currentTime = anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
- 'matrix(1, 0, 0, 1, 5, 0)', // (0px + 10px) / 2
+ assert_matrix_equals(getComputedStyle(div).transform,
+ // translateX(none) -> translateX(10px) @ 50%
+ 'matrix(1, 0, 0, 1, 5, 0)',
'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, 0, 0)', // 'none' overrides any transforms.
+ assert_matrix_equals(getComputedStyle(div).transform,
+ // translateX(10px * 2 + none) -> translateX(10px * 2 + 10px) @ 0%
+ 'matrix(1, 0, 0, 1, 20, 0)',
'Animated transform list at 0s of the third iteration');
anim.currentTime += anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
- 'matrix(1, 0, 0, 1, 15, 0)', // (0px + 10px*2)/2
+ assert_matrix_equals(getComputedStyle(div).transform,
+ // translateX(10px * 2 + none) -> translateX(10px * 2 + 10px) @ 50%
+ 'matrix(1, 0, 0, 1, 25, 0)',
'Animated transform list at 50s of the third iteration');
}, 'iterationComposite of transform from none to translate');
@@ -699,16 +702,16 @@ test(function(t) {
anim.pause();
anim.currentTime = anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 40, 1)',
'Animated transform of matrix3d function at 50s of the first iteration');
anim.currentTime = anim.effect.timing.duration * 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
// translateZ(30px) + (translateZ(50px)*2)
'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 130, 1)',
'Animated transform of matrix3d function at 0s of the third iteration');
anim.currentTime += anim.effect.timing.duration / 2;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
// from: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 130, 1)
// to: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 150, 1)
'matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 140, 1)',
@@ -727,7 +730,7 @@ test(function(t) {
anim.pause();
anim.currentTime = 0;
- assert_equals(getComputedStyle(div).transform,
+ assert_matrix_equals(getComputedStyle(div).transform,
'matrix(1, 0, 0, 1, 0, 0)', // Actually not rotated at all.
'Animated transform of rotate3d function at 50s of the first iteration');
anim.currentTime = anim.effect.timing.duration * 2;
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html
index cbd50900429..5b340801c57 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument.html
@@ -258,9 +258,10 @@ test(() => {
{done: true},
]));
assert_frame_lists_equal(effect.getKeyframes(), [
- {offset: null, computedOffset: 1, easing: 'linear', left: '100px,200px'}
+ {offset: null, computedOffset: 1, easing: 'linear'}
]);
-}, 'Custom iterator with value list in keyframe should give bizarre string representation of list.');
+}, 'Custom iterator with value list in keyframe should not contain invalid ' +
+ 'property value pair of list.');
test(function(t) {
var keyframe = {};
diff --git a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/setTarget.html b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/setTarget.html
index 2b07d3de6e0..49ef8402d90 100644
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/setTarget.html
+++ b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/setTarget.html
@@ -85,76 +85,5 @@ test(function(t) {
'changing the animation current time.');
}, 'Test setting target from a valid target to another target');
-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.target = null;
-
- 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 falling back to distribute spacing mode after setting null target');
-
-test(function(t) {
- var effect = new KeyframeEffect(null,
- [ { marginLeft: '0px' },
- { marginLeft: '-20px' },
- { marginLeft: '100px' },
- { marginLeft: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin-left)' });
- var frames = effect.getKeyframes();
- var slots = frames.length - 1;
- assert_equals(frames[1].computedOffset, 1.0 / slots, '2nd frame offset');
- assert_equals(frames[2].computedOffset, 2.0 / slots, '3rd frame offset');
-}, 'Test falling back to distribute spacing mode if there is no context ' +
- 'element');
-
-test(function(t) {
- var div1 = createDiv(t);
- var div2 = createDiv(t);
- div1.style.marginLeft = '-20px';
- div2.style.marginLeft = '-50px';
- var child1 = document.createElement('div');
- var child2 = document.createElement('div');
- div1.appendChild(child1);
- div2.appendChild(child2);
- // body
- // / \
- // div1 div2
- // (-20px) (-50px)
- // | |
- // child1 child2
- var anim = child1.animate([ { marginLeft: '0px' },
- { marginLeft: 'inherit' },
- { marginLeft: '100px' },
- { marginLeft: '50px' } ],
- { duration: 100 * MS_PER_SEC,
- spacing: 'paced(margin-left)' });
-
- var frames = anim.effect.getKeyframes();
- var cumDist = [0, 20, 140, 190];
- assert_equals(frames[1].computedOffset, cumDist[1] / cumDist[3],
- '2nd frame offset');
- assert_equals(frames[2].computedOffset, cumDist[2] / cumDist[3],
- '3rd frame offset');
-
- anim.effect.target = child2;
- frames = anim.effect.getKeyframes();
- cumDist = [0, 50, 200, 250];
- assert_equals(frames[1].computedOffset, cumDist[1] / cumDist[3],
- '2nd frame offset after setting a new target');
- assert_equals(frames[2].computedOffset, cumDist[2] / cumDist[3],
- '3rd frame offset after setting a new target');
-}, 'Test paced spacing mode after setting a new target');
-
</script>
</body>
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
deleted file mode 100644
index 612a3af8d9e..00000000000
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffect/spacing.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!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/interfaces/KeyframeEffectReadOnly/spacing.html b/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffectReadOnly/spacing.html
deleted file mode 100644
index 9c54d970a22..00000000000
--- a/tests/wpt/web-platform-tests/web-animations/interfaces/KeyframeEffectReadOnly/spacing.html
+++ /dev/null
@@ -1,239 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>KeyframeEffectReadOnly spacing attribute tests</title>
-<link rel="help"
-href="https://w3c.github.io/web-animations/#dom-keyframeeffectreadonly-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) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: '' });
- });
-}, 'Test throwing TypeError if using empty string');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'dist' });
- });
-}, 'Test throwing TypeError if not using the correct keyword');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: ' paced(margin-left)' });
- });
-}, 'Test throwing TypeError if adding leading spaces');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(margin-left) ' });
- });
-}, 'Test throwing TypeError if adding trailing spaces');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced( margin-left)' });
- });
-}, 'Test throwing TypeError if adding leading spaces before the ' +
- 'paced property');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(margin-left )' });
- });
-}, 'Test throwing TypeError if adding trailing spaces after the ' +
- 'paced property');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced()' });
- });
-}, 'Test throwing TypeError if these is no paced property');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(.margin)' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'a period');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(1margin)' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'a number');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(\\)' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'an invalid escape');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(\\\fmargin)' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'an invalid escape (FF)');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(\\\rmargin)' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'an invalid escape (CR)');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(\\\nmargin)' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'an invalid escape (LF)');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(- )' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'a leading minus and an invalid name-start code point');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(-\\)' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'a leading minus and an invalid escape');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(-\\\fmargin)' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'a leading minus and an invalid escape (FF)');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(-\\\rmargin)' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'a leading minus and an invalid escape (CR)');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(-\\\nmargin)' });
- });
-}, 'Test throwing TypeError if using a non-ident started string with ' +
- 'a leading minus and an invalid escape (LF)');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(--\\)' });
- });
-}, 'Test throwing TypeError if using a non-ident string with an invalid ' +
- 'escape');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(--\\\fmargin)' });
- });
-}, 'Test throwing TypeError if using a non-ident string with an invalid ' +
- 'escape (FF)');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(--\\\rmargin)' });
- });
-}, 'Test throwing TypeError if using a non-ident string with an invalid ' +
- 'escape (CR)');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(--\\\nmargin)' });
- });
-}, 'Test throwing TypeError if using a non-ident string with an invalid ' +
- 'escape (LF)');
-
-test(function(t) {
- assert_throws(new TypeError, function() {
- createDiv(t).animate(null, { spacing: 'paced(margin.left)' });
- });
-}, 'Test throwing TypeError if using a non-ident string with an invalid name ' +
- 'code point');
-
-test(function(t) {
- var anim = createDiv(t).animate(null, { 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, { spacing: 'paced(\\.margin)' });
- assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
-}, 'Test falling back to distribute spacing if using a unrecognized property ' +
- 'which starts with a valid escape (Full stop)');
-
-test(function(t) {
- var anim = createDiv(t).animate(null, { spacing: 'paced(\\ margin)' });
- assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
-}, 'Test falling back to distribute spacing if using a unrecognized property ' +
- 'which starts with a valid escape (white space)');
-
-test(function(t) {
- var anim = createDiv(t).animate(null, { spacing: 'paced(_margin)' });
- assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
-}, 'Test falling back to distribute spacing if using a unrecognized property ' +
- 'which starts with a valid escape (low line)');
-
-test(function(t) {
- var anim = createDiv(t).animate(null, { spacing: 'paced(-_margin)' });
- assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
-}, 'Test falling back to distribute spacing if using a unrecognized property ' +
- 'which starts with a minus and a low line');
-
-test(function(t) {
- var anim = createDiv(t).animate(null, { spacing: 'paced(-\\.margin)' });
- assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
-}, 'Test falling back to distribute spacing if using a unrecognized property ' +
- 'which starts with a minus and a valid escape');
-
-test(function(t) {
- var anim = createDiv(t).animate(null, { 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, { spacing: 'paced(animation)' });
- assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
-}, 'Test falling back to distribute spacing if using a non-animatable ' +
- 'shorthand property');
-
-test(function(t) {
- var anim = createDiv(t).animate(null,
- { 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);
- assert_equals(anim.effect.spacing, 'distribute', 'spacing mode');
-}, 'Test default value of spacing');
-
-test(function(t) {
- var anim = createDiv(t).animate(null, { 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, { spacing: 'paced(margin-left)' });
- assert_equals(anim.effect.spacing, 'paced(margin-left)', 'spacing mode');
-}, 'Test spacing value if setting paced');
-
-</script>
-</body>
diff --git a/tests/wpt/web-platform-tests/web-animations/resources/keyframe-utils.js b/tests/wpt/web-platform-tests/web-animations/resources/keyframe-utils.js
index 53d0f2340cd..1d4ad9253d5 100644
--- a/tests/wpt/web-platform-tests/web-animations/resources/keyframe-utils.js
+++ b/tests/wpt/web-platform-tests/web-animations/resources/keyframe-utils.js
@@ -128,7 +128,7 @@ var gPropertyIndexedKeyframesTests = [
{ offset: null, computedOffset: 0.25, easing: "linear",
left: "20px", top: "25px" },
{ offset: null, computedOffset: 0.50, easing: "linear",
- left: "30px", top: "invalid" },
+ left: "30px" },
{ offset: null, computedOffset: 0.75, easing: "linear",
left: "40px", top: "45px" },
{ offset: null, computedOffset: 1.00, easing: "linear",
@@ -166,8 +166,7 @@ var gPropertyIndexedKeyframesTests = [
{ desc: "a one property two value property-indexed keyframes specification"
+ " where the first value is invalid",
input: { left: ["invalid", "10px"] },
- output: [{ offset: null, computedOffset: 0, easing: "linear",
- left: "invalid" },
+ output: [{ offset: null, computedOffset: 0, easing: "linear" },
{ offset: null, computedOffset: 1, easing: "linear",
left: "10px" }] },
{ desc: "a one property two value property-indexed keyframes specification"
@@ -175,8 +174,7 @@ var gPropertyIndexedKeyframesTests = [
input: { left: ["10px", "invalid"] },
output: [{ offset: null, computedOffset: 0, easing: "linear",
left: "10px" },
- { offset: null, computedOffset: 1, easing: "linear",
- left: "invalid" }] },
+ { offset: null, computedOffset: 1, easing: "linear" }] },
];
var gKeyframeSequenceTests = [
diff --git a/tests/wpt/web-platform-tests/web-animations/resources/xhr-doc.py b/tests/wpt/web-platform-tests/web-animations/resources/xhr-doc.py
new file mode 100644
index 00000000000..a1b948558c6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-animations/resources/xhr-doc.py
@@ -0,0 +1,5 @@
+def main(request, response):
+ headers = [("Content-type", "text/html;charset=utf-8")]
+ content = "<!doctype html><div id=test></div>"
+
+ return headers, content
diff --git a/tests/wpt/web-platform-tests/web-animations/testcommon.js b/tests/wpt/web-platform-tests/web-animations/testcommon.js
index 302fb8ba177..008d424df1f 100644
--- a/tests/wpt/web-platform-tests/web-animations/testcommon.js
+++ b/tests/wpt/web-platform-tests/web-animations/testcommon.js
@@ -78,7 +78,8 @@ function createStyle(test, rules, doc) {
// Create a pseudo element
function createPseudo(test, type) {
createStyle(test, { '@keyframes anim': '',
- ['.pseudo::' + type]: 'animation: anim 10s;' });
+ ['.pseudo::' + type]: 'animation: anim 10s; ' +
+ 'content: \'\';' });
var div = createDiv(test);
div.classList.add('pseudo');
var anims = document.getAnimations();
@@ -238,6 +239,6 @@ function assert_matrix_equals(actual, expected, description) {
'dimension of the matrix: ' + description);
for (var i = 0; i < actualMatrixArray.length; i++) {
assert_approx_equals(actualMatrixArray[i], expectedMatrixArray[i], 0.0001,
- 'expecetd ' + expected + ' but got ' + actual + ": " + description);
+ 'expected ' + expected + ' but got ' + actual + ": " + description);
}
}
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_hw_disabled-manual.https.html b/tests/wpt/web-platform-tests/web-nfc/nfc_hw_disabled-manual.https.html
new file mode 100644
index 00000000000..cd84961c91b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_hw_disabled-manual.https.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC Test: NFC HW Disabled</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+<meta name="flags" content="interact">
+
+<h2>Precondition</h2>
+<ol>
+ <li>
+ Disable the NFC Module.
+ </li>
+</ol>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+promise_test(t => {
+ return promise_rejects(t, 'NotSupportedError', navigator.nfc.watch(noop));
+}, "Test that nfc.watch fails if NFC HW is disabled.");
+
+promise_test(t => {
+ return promise_rejects(t, 'NotSupportedError', navigator.nfc.push(test_text_data));
+}, "nfc.push should fail when NFC HW is disabled.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_insecure_context.html b/tests/wpt/web-platform-tests/web-nfc/nfc_insecure_context.html
new file mode 100644
index 00000000000..9745fc25a45
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_insecure_context.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC Test: insecure context</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+
+<h2>Note</h2>
+<ol>
+ <li>
+ Run test is an insecure context, e.g. http://example.com/
+ </li>
+</ol>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+promise_test(t => {
+ return promise_rejects(t, 'SecurityError', navigator.nfc.push(test_text_data));
+}, "nfc.push should fail with SecurityError in an insecure context.");
+
+promise_test(t => {
+ return promise_rejects(t, 'SecurityError', navigator.nfc.cancelPush());
+}, "nfc.cancelPush should fail with SecurityError in an insecure context.");
+
+promise_test(t => {
+ return promise_rejects(t, 'SecurityError', navigator.nfc.watch(noop));
+}, "nfc.watch should fail with SecurityError in an insecure context.");
+
+promise_test(t => {
+ return promise_rejects(t, 'SecurityError', navigator.nfc.cancelWatch());
+}, "nfc.cancelWatch should fail with SecurityError in an insecure context.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_push.https.html b/tests/wpt/web-platform-tests/web-nfc/nfc_push.https.html
new file mode 100644
index 00000000000..19ee5d3da88
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_push.https.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC: Test exceptions in nfc.push</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+const invalid_type_messages =
+ [
+ // Invalid NFCPushMessage type
+ undefined,
+
+ // NFCMessage.records: should have at least 1 valid record.
+ // https://w3c.github.io/web-nfc/#the-push-method - Step 8.
+ createMessage([{}]),
+
+ // https://w3c.github.io/web-nfc/#dfn-map-text-to-ndef
+ // NFCRecord must have data.
+ createMessage([createTextRecord()]),
+
+ // NFCRecord.data for 'text' record must be number or string.
+ createMessage([createTextRecord(test_buffer_data)]),
+ createMessage([createTextRecord(test_json_data)]),
+
+ // https://w3c.github.io/web-nfc/#dfn-map-a-json-object-to-ndef
+ // NFCRecord must have data.
+ createMessage([createJsonRecord()]),
+
+ // NFCRecord.data for 'json' record must be object.
+ createMessage([createJsonRecord(test_buffer_data)]),
+ createMessage([createJsonRecord(test_number_data)]),
+ createMessage([createJsonRecord(test_text_data)]),
+
+ // https://w3c.github.io/web-nfc/#dfn-map-a-url-to-ndef
+ // NFCRecord must have data.
+ createMessage([createUrlRecord()]),
+
+ // NFCRecord.data for 'url' record must be string.
+ createMessage([createUrlRecord(test_buffer_data)]),
+ createMessage([createUrlRecord(test_number_data)]),
+ createMessage([createUrlRecord(test_json_data)]),
+
+ // https://w3c.github.io/web-nfc/#dfn-map-binary-data-to-ndef
+ // NFCRecord must have data.
+ createMessage([createOpaqueRecord()]),
+
+ // NFCRecord.data for 'opaque' record must be ArrayBuffer.
+ createMessage([createOpaqueRecord(test_text_data)]),
+ createMessage([createOpaqueRecord(test_number_data)]),
+ createMessage([createOpaqueRecord(test_json_data)])
+ ];
+
+const invalid_syntax_messages =
+ [
+ // NFCRecord.mediaType for 'text' record must be 'text/*'.
+ createMessage([createRecord('text', 'application/json',
+ test_number_data)]),
+
+ // Data for 'url' record, must be a valid URL.
+ createMessage([createUrlRecord('Invalid URL:// Data')]),
+
+ // NFCRecord.mediaType for 'json' record must be 'application/json' or
+ // starts with 'application/' and ends with '+json'.
+ createMessage([createRecord('json', 'image/png', test_json_data)]),
+ createMessage([createRecord('json', 'application/x+y', test_json_data)]),
+ createMessage([createRecord('json', 'custom/app+json', test_json_data)]),
+ ];
+
+promise_test(t => {
+ let promises = [];
+ invalid_type_messages.forEach(message => {
+ promises.push(
+ promise_rejects(t, new TypeError(), navigator.nfc.push(message)));
+ });
+ return Promise.all(promises);
+}, "Test that promise is rejected with TypeError if NFCMessage is invalid.");
+
+promise_test(t => {
+ let promises = [];
+ invalid_syntax_messages.forEach(message => {
+ promises.push(
+ promise_rejects(t, 'SyntaxError', navigator.nfc.push(message)));
+ });
+ return Promise.all(promises);
+}, "'Test that promise is rejected with SyntaxError if NFCMessage contains invalid records.");
+
+promise_test(t => {
+ return promise_rejects(t, new TypeError(), navigator.nfc.push(test_text_data, { timeout: "invalid"}));
+}, "nfc.push should fail with TypeError when invalid timeout is provided.");
+
+promise_test(t => {
+ return promise_rejects(t, new TypeError(), navigator.nfc.push(test_text_data, { timeout: -1 }));
+}, "nfc.push should fail with TypeError when invalid negative timeout value is provided.");
+
+promise_test(t => {
+ return promise_rejects(t, 'TimeoutError', navigator.nfc.push(test_text_data, { timeout: 1 }));
+}, "nfc.push should fail with TimeoutError when timer expires.");
+
+promise_test(t => {
+ let promise = navigator.nfc.push(test_text_data, { timeout: 100 });
+ navigator.nfc.cancelPush();
+ return promise_rejects(t, 'AbortError', promise);
+}, "nfc.cancelPush should reject pending promise with AbortError.");
+
+promise_test(t => {
+ return promise_rejects(t, 'NotSupportedError', navigator.nfc.push(new ArrayBuffer(32 * 1024 + 1)));
+}, "Reject promise with NotSupportedError if NFC message size exceeds 32KB.");
+
+promise_test(t => {
+ let message = createMessage([createTextRecord(test_text_data)]);
+ message.url = '%00/invalid/ path';
+ return promise_rejects(t, 'SyntaxError', navigator.nfc.push(message));
+}, "Reject promise with SyntaxError if WebNFC Id cannot be created from provided URL.");
+
+promise_test(t => {
+ let message = createMessage([createRecord('json','application/json',
+ { get x(){ return this; } })]);
+ return promise_rejects(t, 'SyntaxError', navigator.nfc.push(message));
+}, "Reject promise with SyntaxError if 'json' record cannot be serialized.");
+
+promise_test(t => {
+ return promise_rejects(t, new TypeError(), navigator.nfc.push(test_text_data, {target: "invalid"}));
+}, "nfc.push should fail with TypeError when invalid target value is provided.");
+
+promise_test(t => {
+ return promise_rejects(t, new TypeError(), navigator.nfc.cancelPush("invalid"));
+}, "nfc.cancelPush should fail with TypeError when invalid id value is provided.");
+
+promise_test(() => {
+ return new Promise((resolve,reject) => {
+ let iframe = document.createElement('iframe');
+ iframe.srcdoc = '<script>' +
+ ' window.onmessage = message => {' +
+ ' if (message.data === "Ready") {' +
+ ' let onSuccess = () => { parent.postMessage("Failure", "*"); };' +
+ ' let onError = error => {' +
+ ' if (error.name == "SecurityError") {' +
+ ' parent.postMessage("Success", "*");' +
+ ' } else {' +
+ ' parent.postMessage("Failure", "*");' +
+ ' }' +
+ ' };' +
+ ' navigator.nfc.push("Test").then(onSuccess, onError);' +
+ ' }' +
+ ' };' +
+ '<\/script>';
+ iframe.onload = () => iframe.contentWindow.postMessage('Ready', '*');
+ document.body.appendChild(iframe);
+ window.onmessage = message => {
+ if (message.data == 'Success') {
+ resolve();
+ } else if (message.data == 'Failure') {
+ reject();
+ }
+ }
+ });
+}, 'Test that WebNFC API is not accessible from iframe context.');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_push_ArrayBuffer-manual.https.html b/tests/wpt/web-platform-tests/web-nfc/nfc_push_ArrayBuffer-manual.https.html
new file mode 100644
index 00000000000..89dbff038ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_push_ArrayBuffer-manual.https.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC Test: push ArrayBuffer message</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+<meta name="flags" content="interact">
+<meta name="timeout" content="long">
+
+<p>Tap an NFC tag to the test device with NFC support.</p>
+
+<p>Note: All the actions need to be done in 60 seconds, otherwise it will get TIMEOUT.</p>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+setup({ explicit_timeout: true });
+
+promise_test(t => {
+ return navigator.nfc.push(test_buffer_data)
+ .then(() => {
+ return new Promise(resolve => {
+ navigator.nfc.watch(message => resolve(message))
+ }).then((message) => {
+ for (let record of message.records) {
+ assert_equals(record.recordType, "opaque");
+ assert_equals(record.mediaType, "application/octet-stream");
+ assert_array_equals(new Uint8Array(record.data),
+ new Uint8Array(test_buffer_data));
+ }
+ });
+ });
+}, "Test that nfc.push succeeds when message is ArrayBuffer.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_push_DOMString-manual.https.html b/tests/wpt/web-platform-tests/web-nfc/nfc_push_DOMString-manual.https.html
new file mode 100644
index 00000000000..9782f67b29b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_push_DOMString-manual.https.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC Test: push DOMString message</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+<meta name="flags" content="interact">
+<meta name="timeout" content="long">
+
+<p>Tap an NFC tag to the test device with NFC support.</p>
+
+<p>Note: All the actions need to be done in 60 seconds, otherwise it will get TIMEOUT.</p>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+setup({ explicit_timeout: true });
+
+promise_test(t => {
+ return navigator.nfc.push(test_text_data)
+ .then(() => {
+ return new Promise(resolve => {
+ navigator.nfc.watch(message => resolve(message))
+ }).then((message) => {
+ for (let record of message.records) {
+ assert_equals(record.data, test_text_data);
+ }
+ });
+ });
+}, "Test that nfc.push succeeds when message is DOMString.");
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_empty-manual.https.html b/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_empty-manual.https.html
new file mode 100644
index 00000000000..a213537716b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_empty-manual.https.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC Test: push and watch empty records</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+<meta name="flags" content="interact">
+<meta name="timeout" content="long">
+
+<p>Tap an NFC tag to the test device with NFC support.</p>
+
+<p>Note: All the actions need to be done in 60 seconds, otherwise it will get TIMEOUT.</p>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+setup({ explicit_timeout: true });
+
+let desc = "Test that nfc.push and nfc.watch succeed when recordType is set to 'empty'.";
+let watchOptions = {
+ recordType: "empty",
+ mediaType: "",
+ url: ""
+}
+let message = createMessage([createRecord('empty', '')]);
+
+testNFCMessage(message, watchOptions, desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_json-manual.https.html b/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_json-manual.https.html
new file mode 100644
index 00000000000..883bbe731ec
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_json-manual.https.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC Test: push and watch json records</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+<meta name="flags" content="interact">
+<meta name="timeout" content="long">
+
+<p>Tap an NFC tag to the test device with NFC support.</p>
+
+<p>Note: All the actions need to be done in 60 seconds, otherwise it will get TIMEOUT.</p>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+setup({ explicit_timeout: true });
+
+let desc = "Test that nfc.push and nfc.watch succeed when recordType is set to 'json'.";
+let watchOptions = {
+ recordType : "json",
+ mediaType : "application/json",
+ url : ""
+}
+let message = createMessage([createJsonRecord(test_json_data)]);
+
+testNFCMessage(message, watchOptions, desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_opaque-manual.https.html b/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_opaque-manual.https.html
new file mode 100644
index 00000000000..81e9ec12f52
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_opaque-manual.https.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC Test: push and watch opaque records</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+<meta name="flags" content="interact">
+<meta name="timeout" content="long">
+
+<p>Tap an NFC tag to the test device with NFC support.</p>
+
+<p>Note: All the actions need to be done in 60 seconds, otherwise it will get TIMEOUT.</p>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+setup({ explicit_timeout: true });
+
+let desc = "Test that nfc.push and nfc.watch succeed when recordType is set to 'opaque'."
+let watchOptions = {
+ recordType : "opaque",
+ mediaType : "application/octet-stream",
+ url : ""
+}
+let message = createMessage([createOpaqueRecord(test_buffer_data)]);
+
+testNFCMessage(message, watchOptions, desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_text-manual.https.html b/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_text-manual.https.html
new file mode 100644
index 00000000000..279bd6634fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_text-manual.https.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC Test: push and watch text records</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+<meta name="flags" content="interact">
+<meta name="timeout" content="long">
+
+<p>Tap an NFC tag to the test device with NFC support.</p>
+
+<p>Note: All the actions need to be done in 60 seconds, otherwise it will get TIMEOUT.</p>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+setup({ explicit_timeout: true });
+
+let desc = "Test that nfc.push and nfc.watch succeed when recordType is set to 'text'."
+let watchOptions = {
+ recordType : "text",
+ mediaType : "text/plain",
+ url : ""
+}
+let message = createMessage([createTextRecord(test_text_data)]);
+
+testNFCMessage(message, watchOptions, desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_url-manual.https.html b/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_url-manual.https.html
new file mode 100644
index 00000000000..70f982373d3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_recordType_url-manual.https.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC Test: push and watch url records</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+<meta name="flags" content="interact">
+<meta name="timeout" content="long">
+
+<p>Tap an NFC tag to the test device with NFC support.</p>
+
+<p>Note: All the actions need to be done in 60 seconds, otherwise it will get TIMEOUT.</p>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+setup({ explicit_timeout: true });
+
+let test_message_origin = window.location.href.origin;
+let desc = "Test that nfc.push and nfc.watch succeed when recordType is set to 'url'.";
+let watchOptions = {
+ recordType: "url",
+ mediaType: "text/plain",
+ url: test_message_origin
+}
+let message = createMessage([createUrlRecord(test_url_data)]);
+
+testNFCMessage(message, watchOptions, desc);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/nfc_watch.https.html b/tests/wpt/web-platform-tests/web-nfc/nfc_watch.https.html
new file mode 100644
index 00000000000..455b6437a8e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/nfc_watch.https.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Web NFC: nfc.watch tests</title>
+<link rel="author" title="Intel" href="http://www.intel.com"/>
+<link rel="help" href="https://w3c.github.io/web-nfc/"/>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/nfc_help.js"></script>
+
+<div id="log"></div>
+
+<script>
+
+"use strict";
+
+promise_test(t => {
+ return promise_rejects(t, 'NotFoundError', navigator.nfc.cancelWatch(1));
+}, "Test that nfc.cancelWatch fails if invalid watch ID is provided.");
+
+promise_test(t => {
+ return promise_rejects(t, 'NotFoundError', navigator.nfc.cancelWatch());
+}, "Test that nfc.cancelWatch fails if there are no active watchers.");
+
+promise_test(t => {
+ return navigator.nfc.watch(noop).then(id => {
+ assert_equals(typeof(id), "number");
+ assert_greater_than(id, 0, "greater than zero");
+ });
+}, "Test that nfc watch success if NFC HW is enable.");
+
+promise_test(t => {
+ return navigator.nfc.watch(noop).
+ then(id => navigator.nfc.cancelWatch(id));
+}, "Test that nfc.cancelWatch succeeds if correct watch id is provided.");
+
+promise_test(t => {
+ return navigator.nfc.watch(noop).then(() => {
+ navigator.nfc.cancelWatch();
+ });
+}, "Test that nfc.cancelWatch succeeds if there are active watchers.");
+
+promise_test(t => {
+ return promise_rejects(t, 'SyntaxError', navigator.nfc.watch(noop, {url:"www.a.com"}));
+}, 'Test that nfc.watch fails if NFCWatchOptions.url is missing components.');
+
+promise_test(t => {
+ return promise_rejects(t, 'SyntaxError', navigator.nfc.watch(noop, {url:"invalid"}));
+}, 'Test that nfc.watch fails if NFCWatchOptions.url is invalid.');
+
+promise_test(t => {
+ return promise_rejects(t, 'SyntaxError', navigator.nfc.watch(noop, {url:"http://a.com"}));
+}, 'Test that nfc.watch fails if NFCWatchOptions.url has wrong protocol.');
+
+promise_test(t => {
+ return navigator.nfc.watch(noop, {url:"https://a.com"});
+}, 'Test that nfc.watch succeeds if NFCWatchOptions.url is valid URL.');
+
+promise_test(t => {
+ return navigator.nfc.watch(noop, {url:"https://a.com/*"});
+}, 'Test that nfc.watch succeeds if NFCWatchOptions.url is valid URL with "*"' +
+ ' wildcard character in path.');
+
+promise_test(t => {
+ return navigator.nfc.watch(noop, {url:"https://a.com/*/bar"});
+}, 'Test that nfc.watch succeeds if NFCWatchOptions.url is valid URL with "*"' +
+ ' wildcard character in the beginning of path component followed by' +
+ ' subpath.');
+
+promise_test(t => {
+ return navigator.nfc.watch(noop, {url:""});
+}, 'Test that nfc.watch succeeds if NFCWatchOptions.url is empty.');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/web-nfc/resources/nfc_help.js b/tests/wpt/web-platform-tests/web-nfc/resources/nfc_help.js
new file mode 100644
index 00000000000..ad35a0a9188
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-nfc/resources/nfc_help.js
@@ -0,0 +1,81 @@
+'use strict';
+
+const test_text_data = "Test text data.";
+const test_text_byte_array = new TextEncoder('utf-8').encode(test_text_data);
+const test_number_data = 42;
+const test_json_data = {level: 1, score: 100, label: 'Game'};
+const test_url_data = "https://w3c.github.io/web-nfc";
+const test_buffer_data = new ArrayBuffer(test_text_byte_array.length);
+
+function noop() {};
+
+function createMessage(records) {
+ if (records !== undefined) {
+ let message = {};
+ message.records = records;
+ return message;
+ }
+}
+
+function createRecord(recordType, mediaType, data) {
+ let record = {};
+ if (recordType !== undefined) {
+ record.recordType = recordType;
+ }
+ if (mediaType !== undefined) {
+ record.mediaType = mediaType;
+ }
+ if (data !== undefined) {
+ record.data = data;
+ }
+ return record;
+}
+
+function createTextRecord(text) {
+ return createRecord('text', 'text/plain', text);
+}
+
+function createJsonRecord(json) {
+ return createRecord('json', 'application/json', json);
+}
+
+function createOpaqueRecord(buffer) {
+ return createRecord('opaque', 'application/octet-stream', buffer);
+}
+
+function createUrlRecord(url) {
+ return createRecord('url', 'text/plain', url);
+}
+
+function assertWebNFCMessagesEqual(a, b) {
+ assert_equals(a.records.length, b.records.length);
+ for(let i in a.records) {
+ let recordA = a.records[i];
+ let recordB = b.records[i];
+ assert_equals(recordA.recordType, recordB.recordType);
+ assert_equals(recordA.mediaType, recordB.mediaType);
+ if (recordA.data instanceof ArrayBuffer) {
+ assert_array_equals(new Uint8Array(recordA.data),
+ new Uint8Array(recordB.data));
+ } else if (typeof recordA.data === 'object') {
+ assert_object_equals(recordA.data, recordB.data);
+ }
+ if (typeof recordA.data === 'number'
+ || typeof recordA.data === 'string') {
+ assert_true(recordA.data == recordB.data);
+ }
+ }
+}
+
+function testNFCMessage(pushedMessage, watchOptions, desc) {
+ promise_test(t => {
+ return navigator.nfc.push(pushedMessage)
+ .then(() => {
+ return new Promise(resolve => {
+ navigator.nfc.watch((message) => resolve(message), watchOptions);
+ }).then((message) => {
+ assertWebNFCMessagesEqual(message, pushedMessage);
+ });
+ });
+ }, desc);
+}
diff --git a/tests/wpt/web-platform-tests/web-share/OWNERS b/tests/wpt/web-platform-tests/web-share/OWNERS
new file mode 100644
index 00000000000..f69142351bc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/OWNERS
@@ -0,0 +1,2 @@
+@mgiuca
+@marcoscaceres
diff --git a/tests/wpt/web-platform-tests/web-share/idlharness.https.html b/tests/wpt/web-platform-tests/web-share/idlharness.https.html
new file mode 100644
index 00000000000..f68e51e5ed1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/idlharness.https.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare IDL test</title>
+ <link rel="help" href="https://wicg.github.io/web-share/">
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/resources/WebIDLParser.js></script>
+ <script src=/resources/idlharness.js></script>
+ </head>
+ <body>
+ <script>
+ "use strict";
+ var idl_array = new IdlArray();
+
+ function doTest(idl) {
+ idl_array.add_untested_idls('interface Navigator {};');
+ idl_array.add_idls(idl);
+ idl_array.add_objects({
+ Navigator: ['navigator']
+ });
+ idl_array.test();
+ }
+
+ promise_test(async () => {
+ const response = await fetch('../interfaces/web-share.idl');
+ doTest(await response.text());
+ }, 'Test driver');
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/resources/manual-helper.js b/tests/wpt/web-platform-tests/web-share/resources/manual-helper.js
new file mode 100644
index 00000000000..2c38eab34ee
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/resources/manual-helper.js
@@ -0,0 +1,78 @@
+// Internal function. Returns [instruction, list] DOM elements.
+function setupManualShareTestCommon() {
+ const div = document.createElement('div');
+ document.body.appendChild(div);
+
+ const instruction = document.createElement('div');
+ instruction.id = 'instruction';
+ div.appendChild(instruction);
+
+ const shareButton = document.createElement('input');
+ shareButton.id = 'share_button';
+ shareButton.value = 'Share button';
+ shareButton.type = 'button';
+ div.appendChild(shareButton);
+
+ let heading = document.createElement('h2');
+ heading.innerText = 'Instructions:';
+ instruction.appendChild(heading);
+ let list = document.createElement('ol');
+ instruction.appendChild(list);
+ let item = document.createElement('li');
+ list.appendChild(item);
+ item.innerText = 'Click the Share button.';
+
+ return [instruction, list];
+}
+
+// Sets up the page for running manual tests. Automatically creates the
+// instructions (based on the parameters) and the share button.
+function setupManualShareTest(expected_share_data) {
+ const {title, text, url} = expected_share_data;
+ let [instruction, list] = setupManualShareTestCommon();
+ let item = document.createElement('li');
+ list.appendChild(item);
+ item.innerText = 'Choose a valid share target.';
+
+ heading = document.createElement('h2');
+ heading.innerText = 'Pass the test iff the target app received:';
+ instruction.appendChild(heading);
+
+ list = document.createElement('ul');
+ instruction.appendChild(list);
+
+ item = document.createElement('li');
+ list.appendChild(item);
+ item.innerText = `title = "${title}"`;
+ item = document.createElement('li');
+ list.appendChild(item);
+ item.innerText = `text = "${text}"`;
+ item = document.createElement('li');
+ list.appendChild(item);
+ item.innerText = `url = "${url}"`;
+}
+
+function setupManualShareTestRequiringCancellation() {
+ const [instruction, list] = setupManualShareTestCommon();
+ const item = document.createElement('li');
+ list.appendChild(item);
+ item.innerText = 'Cancel the share dialog.';
+}
+
+// Returns a promise. When the user clicks the button, calls
+// |click_handler| and resolves the promise with the result.
+function callWhenButtonClicked(click_handler) {
+ return new Promise((resolve, reject) => {
+ document.querySelector('#share_button').onclick = () => {
+ try {
+ resolve(click_handler());
+ } catch (e) {
+ reject(e);
+ }
+ };
+ });
+}
+
+function getAbsoluteUrl(url) {
+ return new URL(url, document.baseURI).toString();
+}
diff --git a/tests/wpt/web-platform-tests/web-share/share-cancel-manual.html b/tests/wpt/web-platform-tests/web-share/share-cancel-manual.html
new file mode 100644
index 00000000000..b523fb5c221
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-cancel-manual.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share cancelled by user</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ setupManualShareTestRequiringCancellation();
+
+ promise_test(t => {
+ return callWhenButtonClicked(() => promise_rejects(
+ t, 'AbortError',
+ navigator.share({title: 'the title', text: 'the message',
+ url: 'data:the url'})));
+ }, 'share with user cancellation');
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-empty.https.html b/tests/wpt/web-platform-tests/web-share/share-empty.https.html
new file mode 100644
index 00000000000..ee1051812c6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-empty.https.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share no known fields</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ promise_test(t => {
+ return promise_rejects(t, new TypeError(), navigator.share());
+ }, 'share with no arguments (same as empty dictionary)');
+
+ promise_test(t => {
+ return promise_rejects(t, new TypeError(), navigator.share({}));
+ }, 'share with an empty dictionary');
+
+ promise_test(t => {
+ return promise_rejects(t, new TypeError(), navigator.share(undefined));
+ }, 'share with a undefined argument (same as empty dictionary)');
+
+ promise_test(t => {
+ return promise_rejects(t, new TypeError(), navigator.share(null));
+ }, 'share with a null argument (same as empty dictionary)');
+
+ promise_test(t => {
+ return promise_rejects(t,
+ new TypeError(), navigator.share({unused: 'unexpected field'}));
+ }, 'share with a dictionary containing only surplus fields');
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-extra-argument-manual.html b/tests/wpt/web-platform-tests/web-share/share-extra-argument-manual.html
new file mode 100644
index 00000000000..29e7a564544
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-extra-argument-manual.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Surplus arguments ignored</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ setupManualShareTest(
+ {title: 'the title', text: 'the message', url: 'data:the url'});
+ callWhenButtonClicked(() => navigator.share(
+ {title: 'the title', text: 'the message', url: 'data:the url'},
+ 'more than required'));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-extra-field-manual.html b/tests/wpt/web-platform-tests/web-share/share-extra-field-manual.html
new file mode 100644
index 00000000000..d601c7df7ab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-extra-field-manual.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Surplus fields ignored</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ setupManualShareTest(
+ {title: 'the title', text: 'the message', url: 'data:the url'});
+ callWhenButtonClicked(() => navigator.share(
+ {title: 'the title', text: 'the message', url: 'data:the url',
+ unused: 'unexpected field'}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-non-string-manual.html b/tests/wpt/web-platform-tests/web-share/share-non-string-manual.html
new file mode 100644
index 00000000000..b70f8fc23d2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-non-string-manual.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share non-string types (test implicit conversion)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ // Expect that each of the non-string values is converted into a string.
+ setupManualShareTest(
+ {title: 'true', text: 'the object', url: getAbsoluteUrl('384957')});
+
+ const objectWithToString = {toString() { return 'the object'; }};
+ callWhenButtonClicked(() => navigator.share(
+ {title: true, text: objectWithToString, url: 384957}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-null-manual.html b/tests/wpt/web-platform-tests/web-share/share-null-manual.html
new file mode 100644
index 00000000000..4c74225cbe7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-null-manual.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share null and undefined values</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ // Expect null to be converted into the string 'null'. On the other
+ // hand, undefined should be equivalent to omitting the attribute.
+ setupManualShareTest(
+ {title: 'null', text: '', url: getAbsoluteUrl('null')});
+ callWhenButtonClicked(() => navigator.share(
+ {title: null, text: undefined, url: null}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-securecontext.http.html b/tests/wpt/web-platform-tests/web-share/share-securecontext.http.html
new file mode 100644
index 00000000000..8139c411e12
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-securecontext.http.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share from non-secure context</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <script>
+ test(() => {
+ assert_false('share' in navigator, 'navigator has attribute \'share\'.');
+ }, 'navigator.share must be undefined in non-secure context');
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-simple-manual.html b/tests/wpt/web-platform-tests/web-share/share-simple-manual.html
new file mode 100644
index 00000000000..d88beda83c6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-simple-manual.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Simple share</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ const url = 'https://www.example.com/some/path?some_query#some_fragment';
+ setupManualShareTest({title: 'the title', text: 'the message', url});
+ callWhenButtonClicked(() => navigator.share(
+ {title: 'the title', text: 'the message', url})).then(
+ result => {
+ // Check that promise resolved with undefined. This is guarded
+ // by an if statement because we do not want it to register as a
+ // test if it passes (since this is a manual test).
+ if (result !== undefined) {
+ assert_equals(result, undefined);
+ }
+ });
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-unicode-strings-manual.html b/tests/wpt/web-platform-tests/web-share/share-unicode-strings-manual.html
new file mode 100644
index 00000000000..8cdaa87de78
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-unicode-strings-manual.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share with non-ASCII Unicode strings</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ // Title is a string with BMP and non-BMP characters.
+ // Text contains invalid surrogates which should be converted into U+FFFD.
+ // URL contains non-ASCII characters in host and path.
+ const title = 'fáncy 写作 😱';
+ const url = 'https://测试.example.com/📄';
+ // Host is IDNA-encoded. Path is percent-encoded.
+ const url_ascii = 'https://xn--0zwm56d.example.com/%F0%9F%93%84';
+ setupManualShareTest({title, text: '\ufffdx', url: url_ascii});
+ callWhenButtonClicked(() => navigator.share({title, text: '\ud9a3x', url}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-unicode-strings-nonutf8-manual.html b/tests/wpt/web-platform-tests/web-share/share-unicode-strings-nonutf8-manual.html
new file mode 100644
index 00000000000..deabec3def5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-unicode-strings-nonutf8-manual.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="windows-1252">
+ <title>WebShare Test: Share with non-ASCII Unicode strings in a Latin-1-encoded page</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ assert_equals(document.characterSet, 'windows-1252');
+
+ // Exact same test as in share-unicode-strings-manual.html, with same
+ // expectations. This tests that the page's encoding (ISO-8859-1) is
+ // ignored and Unicode characters are always percent-encoded in UTF-8.
+ const title = 'f\xe1ncy \u5199\u4f5c \ud83d\ude31';
+ const url = 'https://\u6d4b\u8bd5.example.com/\ud83d\udcc4';
+ // Host is IDNA-encoded. Path is percent-encoded with UTF-8.
+ const url_ascii = 'https://xn--0zwm56d.example.com/%F0%9F%93%84';
+ setupManualShareTest({title, text: '\ufffdx', url: url_ascii});
+ callWhenButtonClicked(() => navigator.share({title, text: '\ud9a3x', url}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-url-data-manual.html b/tests/wpt/web-platform-tests/web-share/share-url-data-manual.html
new file mode 100644
index 00000000000..e634c0c01c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-url-data-manual.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share with data URL</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ const url = 'data:foo';
+ setupManualShareTest({title: '', text: '', url: getAbsoluteUrl(url)});
+ callWhenButtonClicked(() => navigator.share({url}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-url-empty-manual.html b/tests/wpt/web-platform-tests/web-share/share-url-empty-manual.html
new file mode 100644
index 00000000000..4038dab8cf2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-url-empty-manual.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share with empty URL</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ setupManualShareTest({title: '', text: '', url: document.baseURI});
+ callWhenButtonClicked(() => navigator.share({url: ''}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-url-encoding-manual.html b/tests/wpt/web-platform-tests/web-share/share-url-encoding-manual.html
new file mode 100644
index 00000000000..0f03b5a8b71
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-url-encoding-manual.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share URL with illegal characters (test percent encoding)</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ const url = 'http://example.com/foo\\ab%63\r\n\t "<>`{}';
+ // Expect '\' to normalize to '/', "%63" to normalize to 'c', '\r\n\t'
+ // to be removed, and all the other illegal characters to be percent-escaped.
+ const url_encoded = 'http://example.com/foo/abc%20%22%3C%3E%60%7B%7D';
+ setupManualShareTest({title: '', text: '', url: url_encoded});
+ callWhenButtonClicked(() => navigator.share({url}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-url-invalid.https.html b/tests/wpt/web-platform-tests/web-share/share-url-invalid.https.html
new file mode 100644
index 00000000000..5f2545d5e12
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-url-invalid.https.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share with an invalid URL</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <script>
+ promise_test(t => {
+ // URL is invalid in that the URL Parser returns failure (port is too
+ // large).
+ const url = 'http://example.com:65536';
+ return promise_rejects(
+ t, new TypeError(), navigator.share({url}));
+ }, 'share with an invalid URL');
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-url-noscheme-manual.html b/tests/wpt/web-platform-tests/web-share/share-url-noscheme-manual.html
new file mode 100644
index 00000000000..e9d7eefeb74
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-url-noscheme-manual.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share with URL without a scheme</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ const url = '//www.example.com/some/path?some_query#some_fragment';
+ setupManualShareTest({title: '', text: '', url: getAbsoluteUrl(url)});
+ callWhenButtonClicked(() => navigator.share({url}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-url-pathonly-manual.html b/tests/wpt/web-platform-tests/web-share/share-url-pathonly-manual.html
new file mode 100644
index 00000000000..0487bc85216
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-url-pathonly-manual.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share with absolute path-only URL</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ const url = '/some/path?some_query#some_fragment';
+ setupManualShareTest({title: '', text: '', url: getAbsoluteUrl(url)});
+ callWhenButtonClicked(() => navigator.share({url}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-url-relative-manual.html b/tests/wpt/web-platform-tests/web-share/share-url-relative-manual.html
new file mode 100644
index 00000000000..bbea3860a58
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-url-relative-manual.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share with relative URL</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/manual-helper.js"></script>
+ <base href="https://www.example.com/some/path.html">
+ </head>
+ <body>
+ <script>
+ setup({explicit_timeout: true});
+
+ const url = 'foo';
+ setupManualShareTest({title: '', text: '', url: getAbsoluteUrl(url)});
+ callWhenButtonClicked(() => navigator.share({url}));
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/web-share/share-without-user-gesture.https.html b/tests/wpt/web-platform-tests/web-share/share-without-user-gesture.https.html
new file mode 100644
index 00000000000..cf933b8bc7f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/web-share/share-without-user-gesture.https.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>WebShare Test: Share without user gesture error</title>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <script>
+ promise_test(t => {
+ return promise_rejects(
+ t, 'NotAllowedError',
+ navigator.share({title: 'the title', text: 'the message',
+ url: 'data:the url'}));
+ }, 'share without a user gesture');
+ </script>
+ </body>
+</html>
diff --git a/tests/wpt/web-platform-tests/webaudio/historical.html b/tests/wpt/web-platform-tests/webaudio/historical.html
new file mode 100644
index 00000000000..2407a873c3d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webaudio/historical.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<title>Historical Web Audio API features</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+[
+ "webkitAudioContext",
+ "webkitAudioPannerNode",
+ "webkitOfflineAudioContext",
+].forEach(name => {
+ test(function() {
+ assert_false(name in window);
+ }, name + " interface should not exist");
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/webaudio/js/helpers.js b/tests/wpt/web-platform-tests/webaudio/js/helpers.js
index 9e4ee6fa343..f3d198498f7 100644
--- a/tests/wpt/web-platform-tests/webaudio/js/helpers.js
+++ b/tests/wpt/web-platform-tests/webaudio/js/helpers.js
@@ -1,13 +1,3 @@
-function assert_array_approx_equals(actual, expected, epsilon, description)
-{
- assert_true(actual.length === expected.length,
- (description + ": lengths differ, expected " + expected.length + " got " + actual.length))
-
- for (var i=0; i < actual.length; i++) {
- assert_approx_equals(actual[i], expected[i], epsilon, (description + ": element " + i))
- }
-}
-
/*
Returns an array (typed or not), of the passed array with removed trailing and ending
zero-valued elements
diff --git a/tests/wpt/web-platform-tests/webaudio/js/vendor-prefixes.js b/tests/wpt/web-platform-tests/webaudio/js/vendor-prefixes.js
deleted file mode 100644
index 287d692b3c3..00000000000
--- a/tests/wpt/web-platform-tests/webaudio/js/vendor-prefixes.js
+++ /dev/null
@@ -1,2 +0,0 @@
-window.AudioContext = window.AudioContext || window.webkitAudioContext;
-window.OfflineAudioContext = window.OfflineAudioContext || window.webkitOfflineAudioContext;
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html
index 41b07e9f423..634c0f5909c 100644
--- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiobuffer-interface/idl-test.html
@@ -2,7 +2,13 @@
<html class="a">
<head>
<title>AudioBuffer IDL Test</title>
-<script src="/resources/testharness.js"></script><script src="/resources/testharnessreport.js"></script><script src="/resources/idlharness.js"></script><script src="/resources/WebIDLParser.js"></script><script src="/webaudio/js/lodash.js"></script><script src="/webaudio/js/vendor-prefixes.js"></script><script src="/webaudio/js/helpers.js"></script><style type="text/css">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/webaudio/js/lodash.js"></script>
+<script src="/webaudio/js/helpers.js"></script>
+<style type="text/css">
#event-target-idl,
#base-audio-context-idl
{ visibility:hidden; height: 0px;}
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiodestinationnode-interface/idl-test.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiodestinationnode-interface/idl-test.html
index e4bd9778fb2..46ae0744f9d 100644
--- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiodestinationnode-interface/idl-test.html
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audiodestinationnode-interface/idl-test.html
@@ -2,7 +2,13 @@
<html class="a">
<head>
<title>AudioDestinationNode IDL Test</title>
-<script src="/resources/testharness.js"></script><script src="/resources/testharnessreport.js"></script><script src="/resources/idlharness.js"></script><script src="/resources/WebIDLParser.js"></script><script src="/webaudio/js/lodash.js"></script><script src="/webaudio/js/vendor-prefixes.js"></script><script src="/webaudio/js/helpers.js"></script><style type="text/css">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/webaudio/js/lodash.js"></script>
+<script src="/webaudio/js/helpers.js"></script>
+<style type="text/css">
#event-target-idl,
#base-audio-context-idl,
#audio-node-idl
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audioparam-interface/idl-test.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audioparam-interface/idl-test.html
index 6118748ccf3..f1f6b4156aa 100644
--- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audioparam-interface/idl-test.html
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-audioparam-interface/idl-test.html
@@ -2,7 +2,13 @@
<html class="a">
<head>
<title>AudioParam IDL Test</title>
-<script src="/resources/testharness.js"></script><script src="/resources/testharnessreport.js"></script><script src="/resources/idlharness.js"></script><script src="/resources/WebIDLParser.js"></script><script src="/webaudio/js/lodash.js"></script><script src="/webaudio/js/vendor-prefixes.js"></script><script src="/webaudio/js/helpers.js"></script><style type="text/css">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/webaudio/js/lodash.js"></script>
+<script src="/webaudio/js/helpers.js"></script>
+<style type="text/css">
#audio-param-idl
{ visibility:hidden; height: 0px;}
</style>
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-delaynode-interface/idl-test.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-delaynode-interface/idl-test.html
index 8787414a2fe..df65b58c57a 100644
--- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-delaynode-interface/idl-test.html
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-delaynode-interface/idl-test.html
@@ -2,7 +2,13 @@
<html class="a">
<head>
<title>DelayNode IDL Test</title>
-<script src="/resources/testharness.js"></script><script src="/resources/testharnessreport.js"></script><script src="/resources/idlharness.js"></script><script src="/resources/WebIDLParser.js"></script><script src="/webaudio/js/lodash.js"></script><script src="/webaudio/js/vendor-prefixes.js"></script><script src="/webaudio/js/helpers.js"></script><style type="text/css">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/webaudio/js/lodash.js"></script>
+<script src="/webaudio/js/helpers.js"></script>
+<style type="text/css">
#event-target-idl,
#base-audio-context-idl,
#audio-node-idl,
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html
index e8500b85393..098f1623118 100644
--- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-gainnode-interface/idl-test.html
@@ -2,7 +2,13 @@
<html class="a">
<head>
<title>GainNode IDL Test</title>
-<script src="/resources/testharness.js"></script><script src="/resources/testharnessreport.js"></script><script src="/resources/idlharness.js"></script><script src="/resources/WebIDLParser.js"></script><script src="/webaudio/js/lodash.js"></script><script src="/webaudio/js/vendor-prefixes.js"></script><script src="/webaudio/js/helpers.js"></script><style type="text/css">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/webaudio/js/lodash.js"></script>
+<script src="/webaudio/js/helpers.js"></script>
+<style type="text/css">
#event-target-idl,
#base-audio-context-idl,
#audio-node-idl,
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html
index 4f92fbbe58b..b2b9f79bb9e 100644
--- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-gainnode-interface/test-gainnode.html
@@ -15,7 +15,6 @@ Based on a test from the WebKit test suite
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/js/lodash.js"></script>
- <script src="/webaudio/js/vendor-prefixes.js"></script>
<script src="/webaudio/js/helpers.js"></script>
<script src="/webaudio/js/buffer-loader.js"></script>
</head>
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html
index ba6eec6686a..b234e649ab2 100644
--- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html
@@ -17,7 +17,6 @@ Somewhat similiar to a test from Mozilla:
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webaudio/js/lodash.js"></script>
- <script src="/webaudio/js/vendor-prefixes.js"></script>
<script src="/webaudio/js/helpers.js"></script>
<script src="/webaudio/js/buffer-loader.js"></script>
</head>
diff --git a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-waveshapernode-interface/curve-tests.html b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-waveshapernode-interface/curve-tests.html
index ad313663116..a2e40777d42 100644
--- a/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-waveshapernode-interface/curve-tests.html
+++ b/tests/wpt/web-platform-tests/webaudio/the-audio-api/the-waveshapernode-interface/curve-tests.html
@@ -5,7 +5,6 @@
<script type="text/javascript" src="/resources/testharness.js"></script>
<script type="text/javascript" src="/resources/testharnessreport.js"></script>
- <script type="text/javascript" src="../../js/vendor-prefixes.js"></script>
</head>
<body>
<div id="log">
diff --git a/tests/wpt/web-platform-tests/webdriver/OWNERS b/tests/wpt/web-platform-tests/webdriver/OWNERS
index a9972635f98..07296e312b3 100644
--- a/tests/wpt/web-platform-tests/webdriver/OWNERS
+++ b/tests/wpt/web-platform-tests/webdriver/OWNERS
@@ -1,5 +1,6 @@
+@AutomatedTester
+@JKereliuk
@andreastt
@lukeis
-@AutomatedTester
-@shs96c
@mjzffr
+@shs96c
diff --git a/tests/wpt/web-platform-tests/webdriver/README.md b/tests/wpt/web-platform-tests/webdriver/README.md
index bc863c47f9c..78d9aba7b9b 100644
--- a/tests/wpt/web-platform-tests/webdriver/README.md
+++ b/tests/wpt/web-platform-tests/webdriver/README.md
@@ -5,96 +5,13 @@ for the W3C web browser automation specification
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.
+whether they meet the recognized 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>.
+We are using a [tracking spreadsheet](https://docs.google.com/spreadsheets/d/1GUK_sdY2cv59VAJNDxZQIfypnOpapSQhMjfcJ9Wc42U/edit#gid=0)
+to coordinate work on these tests. Please look there to see who
+is working on what, and which areas are currently under-tested.
-* 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
+The spec contributors and editors can frequently be found on the W3C
+#webdriver IRC channel.
diff --git a/tests/wpt/web-platform-tests/webdriver/actions/conftest.py b/tests/wpt/web-platform-tests/webdriver/actions/conftest.py
deleted file mode 100644
index f5aeb894ce5..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/actions/conftest.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import pytest
-
-
-@pytest.fixture
-def key_chain(session):
- return session.actions.sequence("key", "keyboard_id")
-
-
-@pytest.fixture
-def mouse_chain(session):
- return session.actions.sequence(
- "pointer",
- "pointer_id",
- {"pointerType": "mouse"})
-
-
-@pytest.fixture(autouse=True)
-def release_actions(session, request):
- # release all actions after each test
- # equivalent to a teardown_function, but with access to session fixture
- request.addfinalizer(session.actions.release)
-
-
-@pytest.fixture
-def key_reporter(session, test_actions_page, request):
- """Represents focused input element from `test_keys_page` fixture."""
- input_el = session.find.css("#keys", all=False)
- input_el.click()
- return input_el
-
-
-@pytest.fixture
-def test_actions_page(session, url):
- session.url = url("/webdriver/actions/support/test_actions_wdspec.html")
diff --git a/tests/wpt/web-platform-tests/webdriver/actions/key.py b/tests/wpt/web-platform-tests/webdriver/actions/key.py
deleted file mode 100644
index 2a9dcf8af9b..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/actions/key.py
+++ /dev/null
@@ -1,154 +0,0 @@
-import pytest
-
-from support.keys import Keys
-from support.refine import filter_dict, get_keys, get_events
-
-
-def test_lone_keyup_sends_no_events(session, key_reporter, key_chain):
- key_chain.key_up("a").perform()
- assert len(get_keys(key_reporter)) == 0
- assert len(get_events(session)) == 0
- session.actions.release()
- assert len(get_keys(key_reporter)) == 0
- assert len(get_events(session)) == 0
-
-
-@pytest.mark.parametrize("value,code", [
- (u"a", "KeyA",),
- ("a", "KeyA",),
- (u"\"", "Quote"),
- (u",", "Comma"),
- (u"\u00E0", ""),
- (u"\u0416", ""),
- (u"@", "Digit2"),
- (u"\u2603", ""),
- (u"\uF6C2", ""), # PUA
-])
-def test_single_printable_key_sends_correct_events(session,
- key_reporter,
- key_chain,
- value,
- code):
- key_chain \
- .key_down(value) \
- .key_up(value) \
- .perform()
- expected = [
- {"code": code, "key": value, "type": "keydown"},
- {"code": code, "key": value, "type": "keypress"},
- {"code": code, "key": value, "type": "keyup"},
- ]
- events = [filter_dict(e, expected[0]) for e in get_events(session)]
- assert events == expected
- assert get_keys(key_reporter) == value
-
-
-@pytest.mark.parametrize("value", [
- (u"\U0001F604"),
- (u"\U0001F60D"),
-])
-def test_single_emoji_records_correct_key(session, key_reporter, key_chain, value):
- # Not using key_chain.send_keys() because we always want to treat value as
- # one character here. `len(value)` varies by platform for non-BMP characters,
- # so we don't want to iterate over value.
- key_chain \
- .key_down(value) \
- .key_up(value) \
- .perform()
- # events sent by major browsers are inconsistent so only check key value
- assert get_keys(key_reporter) == value
-
-
-@pytest.mark.parametrize("value,code,key", [
- (u"\uE050", "ShiftRight", "Shift"),
- (u"\uE053", "OSRight", "Meta"),
- (Keys.CONTROL, "ControlLeft", "Control"),
-])
-def test_single_modifier_key_sends_correct_events(session,
- key_reporter,
- key_chain,
- value,
- code,
- key):
- key_chain \
- .key_down(value) \
- .key_up(value) \
- .perform()
- all_events = get_events(session)
- expected = [
- {"code": code, "key": key, "type": "keydown"},
- {"code": code, "key": key, "type": "keyup"},
- ]
- events = [filter_dict(e, expected[0]) for e in all_events]
- assert events == expected
- assert len(get_keys(key_reporter)) == 0
-
-
-@pytest.mark.parametrize("value,code,key", [
- (Keys.ESCAPE, "Escape", "Escape"),
- (Keys.RIGHT, "ArrowRight", "ArrowRight"),
-])
-def test_single_nonprintable_key_sends_events(session,
- key_reporter,
- key_chain,
- value,
- code,
- key):
- key_chain \
- .key_down(value) \
- .key_up(value) \
- .perform()
- expected = [
- {"code": code, "key": key, "type": "keydown"},
- {"code": code, "key": key, "type": "keypress"},
- {"code": code, "key": key, "type": "keyup"},
- ]
- events = [filter_dict(e, expected[0]) for e in get_events(session)]
- if len(events) == 2:
- # most browsers don't send a keypress for non-printable keys
- assert events == [expected[0], expected[2]]
- else:
- assert events == expected
- assert len(get_keys(key_reporter)) == 0
-
-
-def test_sequence_of_keydown_printable_keys_sends_events(session,
- key_reporter,
- key_chain):
- key_chain \
- .key_down("a") \
- .key_down("b") \
- .perform()
- expected = [
- {"code": "KeyA", "key": "a", "type": "keydown"},
- {"code": "KeyA", "key": "a", "type": "keypress"},
- {"code": "KeyB", "key": "b", "type": "keydown"},
- {"code": "KeyB", "key": "b", "type": "keypress"},
- ]
- events = [filter_dict(e, expected[0]) for e in get_events(session)]
- assert events == expected
- assert get_keys(key_reporter) == "ab"
-
-
-def test_sequence_of_keydown_character_keys(session, key_reporter, key_chain):
- key_chain.send_keys("ef").perform()
- expected = [
- {"code": "KeyE", "key": "e", "type": "keydown"},
- {"code": "KeyE", "key": "e", "type": "keypress"},
- {"code": "KeyE", "key": "e", "type": "keyup"},
- {"code": "KeyF", "key": "f", "type": "keydown"},
- {"code": "KeyF", "key": "f", "type": "keypress"},
- {"code": "KeyF", "key": "f", "type": "keyup"},
- ]
- events = [filter_dict(e, expected[0]) for e in get_events(session)]
- assert events == expected
- assert get_keys(key_reporter) == "ef"
-
-
-def test_backspace_erases_keys(session, key_reporter, key_chain):
- key_chain \
- .send_keys("efcd") \
- .send_keys([Keys.BACKSPACE, Keys.BACKSPACE]) \
- .perform()
- assert get_keys(key_reporter) == "ef"
-
diff --git a/tests/wpt/web-platform-tests/webdriver/actions/mouse.py b/tests/wpt/web-platform-tests/webdriver/actions/mouse.py
deleted file mode 100644
index bf4ad6c9da9..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/actions/mouse.py
+++ /dev/null
@@ -1,113 +0,0 @@
-import pytest
-import urllib
-
-from support.refine import get_events, filter_dict
-
-
-# TODO use support.inline module once available from upstream
-def inline(doc):
- return "data:text/html;charset=utf-8,%s" % urllib.quote(doc)
-
-
-def link_doc(dest):
- content = "<a href=\"{}\" id=\"link\">destination</a>".format(dest)
- return inline(content)
-
-
-def get_center(rect):
- return {
- "x": rect["width"] / 2 + rect["x"],
- "y": rect["height"] / 2 + rect["y"],
- }
-
-
-# TODO use pytest.approx once we upgrade to pytest > 3.0
-def approx(n, m, tolerance=1):
- return abs(n - m) < tolerance
-
-
-def test_click_at_coordinates(session, test_actions_page, mouse_chain):
- div_point = {
- "x": 82,
- "y": 187,
- }
- mouse_chain \
- .pointer_move(div_point["x"], div_point["y"], duration=1000) \
- .click() \
- .perform()
- events = get_events(session)
- assert len(events) == 4
- for e in events:
- if e["type"] != "mousemove":
- assert e["pageX"] == div_point["x"]
- assert e["pageY"] == div_point["y"]
- assert e["target"] == "outer"
- if e["type"] != "mousedown":
- assert e["buttons"] == 0
- assert e["button"] == 0
- expected = [
- {"type": "mousedown", "buttons": 1},
- {"type": "mouseup", "buttons": 0},
- {"type": "click", "buttons": 0},
- ]
- filtered_events = [filter_dict(e, expected[0]) for e in events]
- assert expected == filtered_events[1:]
-
-
-def test_click_element_center(session, test_actions_page, mouse_chain):
- outer = session.find.css("#outer", all=False)
- center = get_center(outer.rect)
- mouse_chain.click(element=outer).perform()
- events = get_events(session)
- assert len(events) == 4
- event_types = [e["type"] for e in events]
- assert ["mousemove", "mousedown", "mouseup", "click"] == event_types
- for e in events:
- if e["type"] != "mousemove":
- assert approx(e["pageX"], center["x"])
- assert approx(e["pageY"], center["y"])
- assert e["target"] == "outer"
-
-
-def test_click_navigation(session, url):
- destination = url("/webdriver/actions/support/test_actions_wdspec.html")
- start = link_doc(destination)
-
- def click(link):
- mouse_chain = session.actions.sequence(
- "pointer", "pointer_id", {"pointerType": "mouse"})
- mouse_chain.click(element=link).pause(300).perform()
-
- session.url = start
- click(session.find.css("#link", all=False))
- assert session.url == destination
- # repeat steps to check behaviour after document unload
- session.url = start
- click(session.find.css("#link", all=False))
- assert session.url == destination
-
-
-@pytest.mark.parametrize("drag_duration", [0, 300, 800])
-@pytest.mark.parametrize("dx, dy", [(20, 0), (0, 15), (10, 15)])
-def test_drag_and_drop(session, test_actions_page, mouse_chain, dx, dy, drag_duration):
- drag_target = session.find.css("#dragTarget", all=False)
- initial_rect = drag_target.rect
- initial_center = get_center(initial_rect)
- # Conclude chain with extra move to allow time for last queued
- # coordinate-update of drag_target and to test that drag_target is "dropped".
- mouse_chain \
- .pointer_move(0, 0, origin=drag_target) \
- .pointer_down() \
- .pointer_move(dx, dy, duration=drag_duration, origin="pointer") \
- .pointer_up() \
- .pointer_move(80, 50, duration=100, origin="pointer") \
- .perform()
- # mouseup that ends the drag is at the expected destination
- e = get_events(session)[1]
- assert e["type"] == "mouseup"
- assert approx(e["pageX"], initial_center["x"] + dx)
- assert approx(e["pageY"], initial_center["y"] + dy)
- # check resulting location of the dragged element
- final_rect = drag_target.rect
- assert initial_rect["x"] + dx == final_rect["x"]
- assert initial_rect["y"] + dy == final_rect["y"]
diff --git a/tests/wpt/web-platform-tests/webdriver/actions/sequence.py b/tests/wpt/web-platform-tests/webdriver/actions/sequence.py
deleted file mode 100644
index 960b800dff8..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/actions/sequence.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from support.refine import get_keys, filter_dict, get_events
-
-
-def test_no_actions_send_no_events(session, key_reporter, key_chain):
- key_chain.perform()
- assert len(get_keys(key_reporter)) == 0
- assert len(get_events(session)) == 0
-
-
-def test_release_char_sequence_sends_keyup_events_in_reverse(session,
- key_reporter,
- key_chain):
- key_chain \
- .key_down("a") \
- .key_down("b") \
- .perform()
- # reset so we only see the release events
- session.execute_script("resetEvents();")
- session.actions.release()
- expected = [
- {"code": "KeyB", "key": "b", "type": "keyup"},
- {"code": "KeyA", "key": "a", "type": "keyup"},
- ]
- events = [filter_dict(e, expected[0]) for e in get_events(session)]
- assert events == expected
-
-
-def test_release_no_actions_sends_no_events(session, key_reporter):
- session.actions.release()
- assert len(get_keys(key_reporter)) == 0
- assert len(get_events(session)) == 0
diff --git a/tests/wpt/web-platform-tests/webdriver/actions/special_keys.py b/tests/wpt/web-platform-tests/webdriver/actions/special_keys.py
deleted file mode 100644
index 6c53fd75545..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/actions/special_keys.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# META: timeout=long
-
-import pytest
-from support.keys import ALL_EVENTS, Keys
-from support.refine import filter_dict, get_keys, get_events
-
-
-@pytest.mark.parametrize("name,expected", ALL_EVENTS.items())
-def test_webdriver_special_key_sends_keydown(session,
- key_reporter,
- key_chain,
- name,
- expected):
- key_chain.key_down(getattr(Keys, name)).perform()
- # only interested in keydown
- first_event = get_events(session)[0]
- # make a copy so we can throw out irrelevant keys and compare to events
- expected = dict(expected)
-
-
- del expected["value"]
- # check and remove keys that aren't in expected
- assert first_event["type"] == "keydown"
- assert first_event["repeat"] == False
- first_event = filter_dict(first_event, expected)
- assert first_event == expected
- # only printable characters should be recorded in input field
- entered_keys = get_keys(key_reporter)
- if len(expected["key"]) == 1:
- assert entered_keys == expected["key"]
- else:
- assert len(entered_keys) == 0
diff --git a/tests/wpt/web-platform-tests/webdriver/actions/support/test_actions_wdspec.html b/tests/wpt/web-platform-tests/webdriver/actions/support/test_actions_wdspec.html
deleted file mode 100644
index 1d3ea891a08..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/actions/support/test_actions_wdspec.html
+++ /dev/null
@@ -1,170 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<head>
- <title>Test Actions</title>
- <style>
- div { padding:0px; margin: 0px; }
- #trackPointer { position: fixed; }
- #resultContainer { width: 600px; height: 60px; }
- .area { width: 100px; height: 50px; background-color: #ccc; }
- .block { width: 5px; height: 5px; border: solid 1px red; }
- #dragArea { position: relative; }
- #dragTarget { position: absolute; top:22px; left:47px;}
- </style>
- <script>
- "use strict";
- var els = {};
- var allEvents = {events: []};
- function displayMessage(message) {
- document.getElementById("events").innerHTML = "<p>" + message + "</p>";
- }
-
- function appendMessage(message) {
- document.getElementById("events").innerHTML += "<p>" + message + "</p>";
- }
-
- /**
- * Escape |key| if it's in a surrogate-half character range.
- *
- * Example: given "\ud83d" return "U+d83d".
- *
- * Otherwise JSON.stringify will convert it to U+FFFD (REPLACEMENT CHARACTER)
- * when returning a value from executeScript, for example.
- */
- function escapeSurrogateHalf(key) {
- if (typeof key !== "undefined" && key.length === 1) {
- var charCode = key.charCodeAt(0);
- var highSurrogate = charCode >= 0xD800 && charCode <= 0xDBFF;
- var surrogate = highSurrogate || (charCode >= 0xDC00 && charCode <= 0xDFFF);
- if (surrogate) {
- key = "U+" + charCode.toString(16);
- }
- }
- return key;
- }
-
- function recordKeyboardEvent(event) {
- var key = escapeSurrogateHalf(event.key);
- allEvents.events.push({
- "code": event.code,
- "key": key,
- "which": event.which,
- "location": event.location,
- "ctrl": event.ctrlKey,
- "meta": event.metaKey,
- "shift": event.shiftKey,
- "repeat": event.repeat,
- "type": event.type
- });
- appendMessage(`${event.type}(` +
- `code: ${event.code}, ` +
- `key: ${key}, ` +
- `which: ${event.which}, ` +
- `keyCode: ${event.keyCode})`);
- }
-
- function recordPointerEvent(event) {
- allEvents.events.push({
- "type": event.type,
- "button": event.button,
- "buttons": event.buttons,
- "pageX": event.pageX,
- "pageY": event.pageY,
- "target": event.target.id
- });
- appendMessage(`${event.type}(` +
- `button: ${event.button}, ` +
- `pageX: ${event.pageX}, ` +
- `pageY: ${event.pageY}, ` +
- `button: ${event.button}, ` +
- `buttons: ${event.buttons}, ` +
- `target id: ${event.target.id})`);
- }
-
- function recordFirstPointerMove(event) {
- recordPointerEvent(event);
- window.removeEventListener("mousemove", recordFirstPointerMove);
- }
-
- function resetEvents() {
- allEvents.events.length = 0;
- displayMessage("");
- }
-
- function drop(moveHandler) {
- return function (event) {
- els.dragArea.removeEventListener("mousemove", moveHandler);
- els.dragTarget.style.backgroundColor = "yellow";
- els.dragTarget.addEventListener("mousedown", grab);
- recordPointerEvent(event);
- };
- }
-
- function move(el, offsetX, offsetY, timeout) {
- return (event) => {
- setTimeout(() => {
- el.style.top = event.clientY + offsetY + "px";
- el.style.left = event.clientX + offsetX + "px";
- }, timeout);
- };
- }
-
- function grab(event) {
- event.target.style.backgroundColor = "red";
- let boxRect = event.target.getBoundingClientRect();
- let areaRect = event.target.parentElement.getBoundingClientRect();
- let moveHandler = move(
- event.target,
- // coordinates of dragTarget must be relative to dragArea such that
- // dragTarget remains under the pointer
- -(areaRect.left + (event.clientX - boxRect.left)),
- -(areaRect.top + (event.clientY - boxRect.top)),
- 20);
- els.dragArea.addEventListener("mousemove", moveHandler);
- els.dragArea.addEventListener("mouseup", drop(moveHandler), {once: true});
- }
-
- document.addEventListener("DOMContentLoaded", () => {
- var keyReporter = document.getElementById("keys");
- ["keyup", "keypress", "keydown"].forEach((e) => {
- keyReporter.addEventListener(e, recordKeyboardEvent);
- });
- var outer = document.getElementById("outer");
- ["click", "dblclick", "mousedown",
- "mouseup", "contextmenu"].forEach((e) => {
- outer.addEventListener(e, recordPointerEvent);
- });
- window.addEventListener("mousemove", recordPointerEvent, {once: true});
- //visual cue for mousemove
- var pointer = document.getElementById("trackPointer");
- window.addEventListener("mousemove", move(pointer, 15, 15, 30));
- // drag and drop
- els.dragArea = document.getElementById("dragArea");
- els.dragTarget = document.getElementById("dragTarget");
- els.dragTarget.addEventListener("mousedown", grab, {once: true});
- });
- </script>
-</head>
-<body>
- <div id="trackPointer" class="block"></div>
- <div>
- <h2>KeyReporter</h2>
- <input type="text" id="keys" size="80">
- </div>
- <div>
- <h2>ClickReporter</h2>
- <div id="outer" class="area">
- </div>
- </div>
- <div>
- <h2>DragReporter</h2>
- <div id="dragArea" class="area">
- <div id="dragTarget" class="block"></div>
- </div>
- </div>
- <div id="resultContainer">
- <h2>Events</h2>
- <div id="events"></div>
- </div>
-</body>
-</html>
diff --git a/tests/wpt/web-platform-tests/webdriver/conftest.py b/tests/wpt/web-platform-tests/webdriver/conftest.py
deleted file mode 100644
index ff4b229c12f..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/conftest.py
+++ /dev/null
@@ -1,14 +0,0 @@
-import pytest
-from support.fixtures import (
- configuration, create_dialog, create_frame, create_window, http,
- new_session, server_config, session, url)
-
-pytest.fixture(scope="session")(configuration)
-pytest.fixture()(create_dialog)
-pytest.fixture()(create_frame)
-pytest.fixture()(create_window)
-pytest.fixture()(http)
-pytest.fixture(scope="function")(new_session)
-pytest.fixture()(server_config)
-pytest.fixture(scope="function")(session)
-pytest.fixture()(url)
diff --git a/tests/wpt/web-platform-tests/webdriver/contexts.py b/tests/wpt/web-platform-tests/webdriver/contexts.py
deleted file mode 100644
index 4d54adf39c8..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/contexts.py
+++ /dev/null
@@ -1,97 +0,0 @@
-import json
-import pytest
-import webdriver
-
-
-def window_size_supported(session):
- try:
- session.window.size = ("a", "b")
- except webdriver.UnsupportedOperationException:
- return False
- except webdriver.InvalidArgumentException:
- return True
-
-def window_position_supported(session):
- try:
- session.window.position = ("a", "b")
- except webdriver.UnsupportedOperationException:
- return False
- except webdriver.InvalidArgumentException:
- return True
-
-def test_window_size_types(http, session):
- if not window_size_supported(session):
- pytest.skip()
-
- with http.get("/session/%s/window/size" % session.session_id) as resp:
- assert resp.status == 200
- body = json.load(resp)
- assert "value" in body
- assert "width" in body["value"]
- assert "height" in body["value"]
- assert isinstance(body["value"]["width"], int)
- assert isinstance(body["value"]["height"], int)
-
- size = session.window.size
- assert isinstance(size, tuple)
- assert isinstance(size[0], int)
- assert isinstance(size[1], int)
-
-
-def test_window_resize(session):
- if not window_size_supported(session):
- pytest.skip()
-
- # setting the window size by webdriver is synchronous
- # so we should see the results immediately
-
- session.window.size = (400, 500)
- assert session.window.size == (400, 500)
-
- session.window.size = (500, 600)
- assert session.window.size == (500, 600)
-
-
-"""
-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(700, 800)")
- size1 = session.window.size
- while size0 == size1:
- size1 = session.window.size
- assert size1 == (700, 800)
-
- 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}
-"""
-
-def test_window_position_types(http, session):
- if not window_position_supported(session):
- pytest.skip()
-
- with http.get("/session/%s/window/position" % session.session_id) as resp:
- assert resp.status == 200
- body = json.load(resp)
- assert "value" in body
- assert "x" in body["value"]
- assert "y" in body["value"]
- assert isinstance(body["value"]["x"], int)
- assert isinstance(body["value"]["y"], int)
-
- pos = session.window.position
- assert isinstance(pos, tuple)
- assert isinstance(pos[0], int)
- assert isinstance(pos[1], int)
diff --git a/tests/wpt/web-platform-tests/webdriver/elements/active.py b/tests/wpt/web-platform-tests/webdriver/elements/active.py
index f639725fe22..8286633e89d 100644
--- a/tests/wpt/web-platform-tests/webdriver/elements/active.py
+++ b/tests/wpt/web-platform-tests/webdriver/elements/active.py
@@ -1,8 +1,8 @@
import pytest
-from support.asserts import assert_error, assert_success, assert_dialog_handled, assert_same_element
-from support.fixtures import create_dialog
-from support.inline import inline
+from tests.support.asserts import assert_error, assert_success, assert_dialog_handled, assert_same_element
+from tests.support.fixtures import create_dialog
+from tests.support.inline import inline
def assert_result_is_active_element(session, result):
"""Ensure that the provided object is a successful WebDriver response
diff --git a/tests/wpt/web-platform-tests/webdriver/get_title.py b/tests/wpt/web-platform-tests/webdriver/get_title.py
deleted file mode 100644
index 53001a1ea9f..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/get_title.py
+++ /dev/null
@@ -1,282 +0,0 @@
-import pytest
-import time
-
-from support.asserts import assert_error, assert_success, assert_dialog_handled
-from support.fixtures import create_dialog
-from support.inline import inline
-
-def read_global(session, name):
- return session.execute_script("return %s;" % name)
-
-# 1. If the current top-level browsing context is no longer open, return error
-# with error code no such window.
-def test_title_from_closed_context(session, create_window):
- new_window = create_window()
- session.window_handle = new_window
- session.close()
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_error(result, "no such window")
-
-# [...]
-# 2. Handle any user prompts and return its value if it is an error.
-# [...]
-# In order to handle any user prompts a remote end must take the following
-# steps:
-# 2. Run the substeps of the first matching user prompt handler:
-#
-# [...]
-# - dismiss state
-# 1. Dismiss the current user prompt.
-# [...]
-#
-# 3. Return success.
-def test_title_handle_prompt_dismiss(new_session):
- _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "dismiss"}})
- session.url = inline("<title>WD doc title</title>")
-
- expected_title = read_global(session, "document.title")
- create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, expected_title)
- assert_dialog_handled(session, "dismiss #1")
- assert read_global(session, "dismiss1") == None
-
- expected_title = read_global(session, "document.title")
- create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, expected_title)
- assert_dialog_handled(session, "dismiss #2")
- assert read_global(session, "dismiss2") == None
-
- expected_title = read_global(session, "document.title")
- create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, expected_title)
- assert_dialog_handled(session, "dismiss #3")
- assert read_global(session, "dismiss3") == None
-
-# [...]
-# 2. Handle any user prompts and return its value if it is an error.
-# [...]
-# In order to handle any user prompts a remote end must take the following
-# steps:
-# 2. Run the substeps of the first matching user prompt handler:
-#
-# [...]
-# - accept state
-# 1. Accept the current user prompt.
-# [...]
-#
-# 3. Return success.
-def test_title_handle_prompt_accept(new_session):
- _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
- session.url = inline("<title>WD doc title</title>")
- create_dialog(session)("alert", text="accept #1", result_var="accept1")
-
- expected_title = read_global(session, "document.title")
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, expected_title)
- assert_dialog_handled(session, "accept #1")
- assert read_global(session, "accept1") == None
-
- expected_title = read_global(session, "document.title")
- create_dialog(session)("confirm", text="accept #2", result_var="accept2")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, expected_title)
- assert_dialog_handled(session, "accept #2")
- assert read_global(session, "accept2"), True
-
- expected_title = read_global(session, "document.title")
- create_dialog(session)("prompt", text="accept #3", result_var="accept3")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, expected_title)
- assert_dialog_handled(session, "accept #3")
- assert read_global(session, "accept3") == ""
-
-# [...]
-# 2. Handle any user prompts and return its value if it is an error.
-# [...]
-# In order to handle any user prompts a remote end must take the following
-# steps:
-# 2. Run the substeps of the first matching user prompt handler:
-#
-# [...]
-# - missing value default state
-# - not in the table of simple dialogs
-# 1. Dismiss the current user prompt.
-# 2. Return error with error code unexpected alert open.
-def test_title_handle_prompt_missing_value(session, create_dialog):
- session.url = inline("<title>WD doc title</title>")
- create_dialog("alert", text="dismiss #1", result_var="dismiss1")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_error(result, "unexpected alert open")
- assert_dialog_handled(session, "dismiss #1")
- assert read_global(session, "accept1") == None
-
- create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_error(result, "unexpected alert open")
- assert_dialog_handled(session, "dismiss #2")
- assert read_global(session, "dismiss2") == False
-
- create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_error(result, "unexpected alert open")
- assert_dialog_handled(session, "dismiss #3")
- assert read_global(session, "dismiss3") == None
-
-# The behavior of the `window.print` function is platform-dependent and may not
-# trigger the creation of a dialog at all. Therefore, this test should only be
-# run in contexts that support the dialog (a condition that may not be
-# determined automatically).
-#def test_title_with_non_simple_dialog(session):
-# document = "<title>With non-simple dialog</title><h2>Hello</h2>"
-# spawn = """
-# var done = arguments[0];
-# setTimeout(function() {
-# done();
-# }, 0);
-# setTimeout(function() {
-# window['print']();
-# }, 0);
-# """
-# session.url = inline(document)
-# session.execute_async_script(spawn)
-#
-# result = session.transport.send("GET",
-# "session/%s/title" % session.session_id)
-# assert_error(result, "unexpected alert open")
-
-# [...]
-# 3. Let title be the initial value of the title IDL attribute of the current
-# top-level browsing context's active document.
-# 4. Return success with data title.
-# [...]
-# The title attribute must, on getting, run the following algorithm:
-# [...]
-# 2. Otherwise, let value be the child text content of the title element [...]
-# [...]
-# 4. Return value.
-def test_title_from_top_context(session):
- session.url = inline("<title>Foobar</title><h2>Hello</h2>")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
- assert_success(result, read_global(session, "document.title"))
-
-# [...]
-# 3. Let title be the initial value of the title IDL attribute of the current
-# top-level browsing context's active document.
-# 4. Return success with data title.
-# [...]
-# The title attribute must, on getting, run the following algorithm:
-# [...]
-# 2. Otherwise, let value be the child text content of the title element [...]
-#
-# The title element of a document is the first title element in the document
-# (in tree order), if there is one, or null otherwise.
-#
-# [...]
-# 4. Return value.
-def test_title_with_duplicate_element(session):
- session.url = inline("<title>First</title><title>Second</title>")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, read_global(session, "document.title"))
-
-# [...]
-# 3. Let title be the initial value of the title IDL attribute of the current
-# top-level browsing context's active document.
-# 4. Return success with data title.
-# [...]
-# The title attribute must, on getting, run the following algorithm:
-# [...]
-# 2. Otherwise, let value be the child text content of the title element, or
-# the empty string if the title element is null.
-# [...]
-# 4. Return value.
-def test_title_without_element(session):
- session.url = inline("<h2>Hello</h2>")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, read_global(session, "document.title"))
-
-# [...]
-# 3. Let title be the initial value of the title IDL attribute of the current
-# top-level browsing context's active document.
-# 4. Return success with data title.
-def test_title_after_modification(session):
- session.url = inline("<title>Initial</title><h2>Hello</h2>")
- session.execute_script("document.title = 'updated'")
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, read_global(session, "document.title"))
-
-# [...]
-# 3. Let title be the initial value of the title IDL attribute of the current
-# top-level browsing context's active document.
-# 4. Return success with data title.
-# [...]
-# The title attribute must, on getting, run the following algorithm:
-# [...]
-# 2. Otherwise, let value be the child text content of the title element [...]
-# 3. Strip and collapse ASCII whitespace in value.
-# 4. Return value.
-def test_title_strip_and_collapse(session):
- document = "<title> a b\tc\nd\t \n e\t\n </title><h2>Hello</h2>"
- session.url = inline(document)
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, read_global(session, "document.title"))
-
-# [...]
-# 3. Let title be the initial value of the title IDL attribute of the current
-# top-level browsing context's active document.
-# 4. Return success with data title.
-def test_title_from_frame(session, create_frame):
- session.url = inline("<title>Parent</title>parent")
-
- session.switch_frame(create_frame())
- session.switch_frame(create_frame())
-
- result = session.transport.send("GET",
- "session/%s/title" % session.session_id)
-
- assert_success(result, read_global(session, "document.title"))
diff --git a/tests/wpt/web-platform-tests/webdriver/interface/interface.html b/tests/wpt/web-platform-tests/webdriver/interface/interface.html
new file mode 100644
index 00000000000..e29fa63e933
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/interface/interface.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+
+test(function() {
+ if ("webdriver" in navigator) {
+ var descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator), "webdriver");
+ assert_true(descriptor !== undefined);
+ assert_true(descriptor.configurable);
+ assert_true(descriptor.enumerable);
+ assert_true(descriptor.set === undefined);
+ assert_true(navigator.webdriver);
+ } else {
+ assert_true(navigator.webdriver === undefined);
+ }
+}, "Test that the navigator.webdriver descriptor has expected properties or doesn't exist at all");
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/webdriver/navigation.py b/tests/wpt/web-platform-tests/webdriver/navigation.py
deleted file mode 100644
index bfe0be594a6..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/navigation.py
+++ /dev/null
@@ -1,102 +0,0 @@
-import json
-import pytest
-import types
-
-from support.inline import inline
-from support.asserts import assert_error, assert_success
-
-alert_doc = inline("<script>window.alert()</script>")
-frame_doc = inline("<p>frame")
-one_frame_doc = inline("<iframe src='%s'></iframe>" % frame_doc)
-two_frames_doc = inline("<iframe src='%s'></iframe>" % one_frame_doc)
-
-
-# TODO(ato): 7.1 Get
-
-
-def test_get_current_url_no_browsing_context(session, create_window):
- # 7.2 step 1
- session.window_handle = create_window()
- session.close()
-
- result = session.transport.send("GET", "session/%s/url" % session.session_id)
-
- assert_error(result, "no such window")
-
-
-def test_get_current_url_alert_prompt(session):
- # 7.2 step 2
- session.url = alert_doc
-
- result = session.transport.send("GET", "session/%s/url" % session.session_id)
-
- assert_error(result, "unexpected alert open")
-
-def test_get_current_url_matches_location(session):
- # 7.2 step 3
- url = session.execute_script("return window.location.href")
- assert session.url == url
-
-def test_get_current_url_payload(session):
- # 7.2 step 4-5
- session.start()
-
- result = session.transport.send("GET", "session/%s/url" % session.session_id)
-
- assert result.status == 200
- assert isinstance(result.body["value"], basestring)
-
-def test_get_current_url_special_pages(session):
- session.url = "about:blank"
-
- result = session.transport.send("GET", "session/%s/url" % session.session_id)
-
- assert_success(result, "about:blank")
-
-# TODO(ato): This test requires modification to pass on Windows
-def test_get_current_url_file_protocol(session):
- # tests that the browsing context remains the same
- # when navigated privileged documents
- session.url = "file:///"
-
- result = session.transport.send("GET", "session/%s/url" % session.session_id)
-
- assert_success(result, "file:///")
-
-# TODO(ato): Test for http:// and https:// protocols.
-# We need to expose a fixture for accessing
-# documents served by wptserve in order to test this.
-
-def test_set_malformed_url(session):
- result = session.transport.send("POST",
- "session/%s/url" % session.session_id,
- {"url": "foo"})
-
- assert_error(result, "invalid argument")
-
-def test_get_current_url_after_modified_location(session):
- session.execute_script("window.location.href = 'about:blank#wd_test_modification'")
-
- result = session.transport.send("GET", "session/%s/url" % session.session_id)
-
- assert_success(result, "about:blank#wd_test_modification")
-
-def test_get_current_url_nested_browsing_context(session, create_frame):
- session.url = "about:blank#wd_from_within_frame"
- session.switch_frame(create_frame())
-
- result = session.transport.send("GET", "session/%s/url" % session.session_id)
-
- assert_success(result, "about:blank#wd_from_within_frame")
-
-def test_get_current_url_nested_browsing_contexts(session):
- session.url = two_frames_doc
- top_level_url = session.url
-
- outer_frame = session.find.css("iframe", all=False)
- session.switch_frame(outer_frame)
-
- inner_frame = session.find.css("iframe", all=False)
- session.switch_frame(inner_frame)
-
- assert session.url == top_level_url
diff --git a/tests/wpt/web-platform-tests/webdriver/support/asserts.py b/tests/wpt/web-platform-tests/webdriver/support/asserts.py
deleted file mode 100644
index a90934078fb..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/support/asserts.py
+++ /dev/null
@@ -1,119 +0,0 @@
-from webdriver.client import Element, element_key
-from webdriver.error import WebDriverException
-
-# WebDriver specification ID: dfn-error-response-data
-errors = {
- "element click intercepted": 400,
- "element not selectable": 400,
- "element not interactable": 400,
- "insecure certificate": 400,
- "invalid argument": 400,
- "invalid cookie domain": 400,
- "invalid coordinates": 400,
- "invalid element state": 400,
- "invalid selector": 400,
- "invalid session id": 404,
- "javascript error": 500,
- "move target out of bounds": 500,
- "no such alert": 400,
- "no such cookie": 404,
- "no such element": 404,
- "no such frame": 400,
- "no such window": 400,
- "script timeout": 408,
- "session not created": 500,
- "stale element reference": 400,
- "timeout": 408,
- "unable to set cookie": 500,
- "unable to capture screen": 500,
- "unexpected alert open": 500,
- "unknown command": 404,
- "unknown error": 500,
- "unknown method": 405,
- "unsupported operation": 500,
-}
-
-# WebDriver specification ID: dfn-send-an-error
-#
-# > When required to send an error, with error code, a remote end must run the
-# > following steps:
-# >
-# > 1. Let http status and name be the error response data for error code.
-# > 2. Let message be an implementation-defined string containing a
-# > human-readable description of the reason for the error.
-# > 3. Let stacktrace be an implementation-defined string containing a stack
-# > trace report of the active stack frames at the time when the error
-# > occurred.
-# > 4. Let data be a new JSON Object initialised with the following properties:
-# >
-# > error
-# > name
-# > message
-# > message
-# > stacktrace
-# > stacktrace
-# >
-# > 5. Send a response with status and data as arguments.
-def assert_error(response, error_code):
- """Verify that the provided wdclient.Response instance described a valid
- error response as defined by `dfn-send-an-error` and the provided error
- code.
-
- :param response: wdclient.Response instance
- :param error_code: string value of the expected "error code"
- """
- assert response.status == errors[error_code]
- assert "value" in response.body
- assert response.body["value"]["error"] == error_code
- assert isinstance(response.body["value"]["message"], basestring)
- assert isinstance(response.body["value"]["stacktrace"], basestring)
-
-def assert_success(response, value):
- """Verify that the provided wdclient.Response instance described a valid
- error response as defined by `dfn-send-an-error` and the provided error
- code.
- :param response: wdclient.Response instance
- :param value: expected value of the response body
- """
-
- assert response.status == 200
- assert response.body["value"] == value
-
-def assert_dialog_handled(session, expected_text):
- result = session.transport.send("GET",
- "session/%s/alert/text" % session.session_id)
-
- # If there were any existing dialogs prior to the creation of this
- # fixture's dialog, then the "Get Alert Text" command will return
- # successfully. In that case, the text must be different than that
- # of this fixture's dialog.
- try:
- assert_error(result, "no such alert")
- except:
- assert (result.status == 200 and
- result.body["value"] != expected_text), (
- "Dialog with text '%s' was not handled." % expected_text)
-
-def assert_same_element(session, a, b):
- """Verify that two element references describe the same element."""
- assert isinstance(a, dict), "Actual value is not a dictionary"
- assert isinstance(b, dict), "Expected value is not a dictionary"
- assert element_key in a, "Actual value does not describe an element"
- assert element_key in b, "Expected value does not describe an element"
-
- if a[element_key] == b[element_key]:
- return
-
- message = ("Expected element references to describe the same element, " +
- "but they did not.")
-
- # Attempt to provide more information, accounting for possible errors such
- # as stale element references or not visible elements.
- try:
- a_markup = session.execute_script("return arguments[0].outerHTML;", args=[a])
- b_markup = session.execute_script("return arguments[0].outerHTML;", args=[b])
- message += " Actual: `%s`. Expected: `%s`." % (a_markup, b_markup)
- except WebDriverException:
- pass
-
- raise AssertionError(message)
diff --git a/tests/wpt/web-platform-tests/webdriver/support/fixtures.py b/tests/wpt/web-platform-tests/webdriver/support/fixtures.py
deleted file mode 100644
index bd0daee03f9..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/support/fixtures.py
+++ /dev/null
@@ -1,222 +0,0 @@
-import json
-import os
-import urlparse
-import re
-
-import webdriver
-
-from support.asserts import assert_error
-from support.http_request import HTTPRequest
-from support import merge_dictionaries
-
-default_host = "http://127.0.0.1"
-default_port = "4444"
-
-def _ensure_valid_window(session):
- """If current window is not open anymore, ensure to have a valid one selected."""
- try:
- session.window_handle
- except webdriver.NoSuchWindowException:
- session.window_handle = session.handles[0]
-
-
-def _dismiss_user_prompts(session):
- """Dismisses any open user prompts in windows."""
- current_window = session.window_handle
-
- for window in _windows(session):
- session.window_handle = window
- try:
- session.alert.dismiss()
- except webdriver.NoSuchAlertException:
- pass
-
- session.window_handle = current_window
-
-
-def _restore_windows(session):
- """Closes superfluous windows opened by the test without ending
- the session implicitly by closing the last window.
- """
- current_window = session.window_handle
-
- for window in _windows(session, exclude=[current_window]):
- session.window_handle = window
- if len(session.handles) > 1:
- session.close()
-
- session.window_handle = current_window
-
-
-def _switch_to_top_level_browsing_context(session):
- """If the current browsing context selected by WebDriver is a
- `<frame>` or an `<iframe>`, switch it back to the top-level
- browsing context.
- """
- session.switch_frame(None)
-
-
-def _windows(session, exclude=None):
- """Set of window handles, filtered by an `exclude` list if
- provided.
- """
- if exclude is None:
- exclude = []
- wins = [w for w in session.handles if w not in exclude]
- return set(wins)
-
-
-def create_frame(session):
- """Create an `iframe` element in the current browsing context and insert it
- into the document. Return a reference to the newly-created element."""
- def create_frame():
- append = """
- var frame = document.createElement('iframe');
- document.body.appendChild(frame);
- return frame;
- """
- return session.execute_script(append)
-
- return create_frame
-
-
-def create_window(session):
- """Open new window and return the window handle."""
- def create_window():
- windows_before = session.handles
- name = session.execute_script("window.open()")
- assert len(session.handles) == len(windows_before) + 1
- new_windows = list(set(session.handles) - set(windows_before))
- return new_windows.pop()
- return create_window
-
-
-def http(session):
- return HTTPRequest(session.transport.host, session.transport.port)
-
-
-def server_config():
- return json.loads(os.environ.get("WD_SERVER_CONFIG"))
-
-
-def configuration():
- host = os.environ.get("WD_HOST", default_host)
- port = int(os.environ.get("WD_PORT", default_port))
- capabilities = json.loads(os.environ.get("WD_CAPABILITIES", "{}"))
-
- return {
- "host": host,
- "port": port,
- "capabilities": capabilities
- }
-
-
-_current_session = None
-
-
-def session(configuration, request):
- """Create and start a session for a test that does not itself test session creation.
-
- By default the session will stay open after each test, but we always try to start a
- new one and assume that if that fails there is already a valid session. This makes it
- possible to recover from some errors that might leave the session in a bad state, but
- does not demand that we start a new session per test."""
- global _current_session
- if _current_session is None:
- _current_session = webdriver.Session(configuration["host"],
- configuration["port"],
- capabilities={"alwaysMatch": configuration["capabilities"]})
- try:
- _current_session.start()
- except webdriver.errors.SessionNotCreatedException:
- if not _current_session.session_id:
- raise
-
- # finalisers are popped off a stack,
- # making their ordering reverse
- request.addfinalizer(lambda: _switch_to_top_level_browsing_context(_current_session))
- request.addfinalizer(lambda: _restore_windows(_current_session))
- request.addfinalizer(lambda: _dismiss_user_prompts(_current_session))
- request.addfinalizer(lambda: _ensure_valid_window(_current_session))
-
- return _current_session
-
-
-def new_session(configuration, request):
- """Return a factory function that will attempt to start a session with a given body.
-
- This is intended for tests that are themselves testing new session creation, and the
- session created is closed at the end of the test."""
- def end():
- global _current_session
- if _current_session is not None and _current_session.session_id:
- _current_session.end()
- _current_session = None
-
- def create_session(body):
- global _current_session
- _session = webdriver.Session(configuration["host"],
- configuration["port"],
- capabilities=None)
- # TODO: merge in some capabilities from the confguration capabilities
- # since these might be needed to start the browser
- value = _session.send_command("POST", "session", body=body)
- # Don't set the global session until we are sure this succeeded
- _current_session = _session
- _session.session_id = value["sessionId"]
-
- return value, _current_session
-
- end()
- request.addfinalizer(end)
-
- return create_session
-
-
-def url(server_config):
- def inner(path, query="", fragment=""):
- rv = urlparse.urlunsplit(("http",
- "%s:%s" % (server_config["host"],
- server_config["ports"]["http"][0]),
- path,
- query,
- fragment))
- return rv
- return inner
-
-def create_dialog(session):
- """Create a dialog (one of "alert", "prompt", or "confirm") and provide a
- function to validate that the dialog has been "handled" (either accepted or
- dismissed) by returning some value."""
-
- def create_dialog(dialog_type, text=None, result_var=None):
- assert dialog_type in ("alert", "confirm", "prompt"), (
- "Invalid dialog type: '%s'" % dialog_type)
-
- if text is None:
- text = ""
-
- assert isinstance(text, basestring), "`text` parameter must be a string"
-
- if result_var is None:
- result_var = "__WEBDRIVER"
-
- assert re.search(r"^[_$a-z$][_$a-z0-9]*$", result_var, re.IGNORECASE), (
- 'The `result_var` must be a valid JavaScript identifier')
-
- # Script completion and modal summoning are scheduled on two separate
- # turns of the event loop to ensure that both occur regardless of how
- # the user agent manages script execution.
- spawn = """
- var done = arguments[0];
- setTimeout(done, 0);
- setTimeout(function() {{
- window.{0} = window.{1}("{2}");
- }}, 0);
- """.format(result_var, dialog_type, text)
-
- session.send_session_command("POST",
- "execute/async",
- {"script": spawn, "args": []})
-
- return create_dialog
diff --git a/tests/wpt/web-platform-tests/webdriver/support/http_request.py b/tests/wpt/web-platform-tests/webdriver/support/http_request.py
deleted file mode 100644
index 6b7d12144f1..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/support/http_request.py
+++ /dev/null
@@ -1,22 +0,0 @@
-import contextlib
-import httplib
-
-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()
diff --git a/tests/wpt/web-platform-tests/webdriver/support/inline.py b/tests/wpt/web-platform-tests/webdriver/support/inline.py
deleted file mode 100644
index 2004bbc3d2d..00000000000
--- a/tests/wpt/web-platform-tests/webdriver/support/inline.py
+++ /dev/null
@@ -1,19 +0,0 @@
-import urllib
-
-def inline(doc, doctype="html", mime="text/html;charset=utf-8"):
- if doctype == "html":
- mime = "text/html;charset=utf-8"
- elif doctype == "xhtml":
- mime = "application/xhtml+xml"
- doc = r"""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <title>XHTML might be the future</title>
- </head>
-
- <body>
- {}
- </body>
-</html>""".format(doc)
- return "data:{},{}".format(mime, urllib.quote(doc))
diff --git a/tests/wpt/web-platform-tests/webdriver/actions/support/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/webdriver/actions/support/__init__.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/__init__.py
diff --git a/tests/wpt/web-platform-tests/microdata/encoding-microdata/microdata-and-other-namespaces/.gitkeep b/tests/wpt/web-platform-tests/webdriver/tests/actions/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/encoding-microdata/microdata-and-other-namespaces/.gitkeep
+++ b/tests/wpt/web-platform-tests/webdriver/tests/actions/__init__.py
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/actions/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/actions/conftest.py
new file mode 100644
index 00000000000..75209383eab
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/actions/conftest.py
@@ -0,0 +1,34 @@
+import pytest
+
+
+@pytest.fixture
+def key_chain(session):
+ return session.actions.sequence("key", "keyboard_id")
+
+
+@pytest.fixture
+def mouse_chain(session):
+ return session.actions.sequence(
+ "pointer",
+ "pointer_id",
+ {"pointerType": "mouse"})
+
+
+@pytest.fixture(autouse=True)
+def release_actions(session, request):
+ # release all actions after each test
+ # equivalent to a teardown_function, but with access to session fixture
+ request.addfinalizer(session.actions.release)
+
+
+@pytest.fixture
+def key_reporter(session, test_actions_page, request):
+ """Represents focused input element from `test_keys_page` fixture."""
+ input_el = session.find.css("#keys", all=False)
+ input_el.click()
+ return input_el
+
+
+@pytest.fixture
+def test_actions_page(session, url):
+ session.url = url("/webdriver/tests/actions/support/test_actions_wdspec.html")
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/actions/key.py b/tests/wpt/web-platform-tests/webdriver/tests/actions/key.py
new file mode 100644
index 00000000000..43887ed432a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/actions/key.py
@@ -0,0 +1,154 @@
+import pytest
+
+from tests.actions.support.keys import Keys
+from tests.actions.support.refine import filter_dict, get_keys, get_events
+
+
+def test_lone_keyup_sends_no_events(session, key_reporter, key_chain):
+ key_chain.key_up("a").perform()
+ assert len(get_keys(key_reporter)) == 0
+ assert len(get_events(session)) == 0
+ session.actions.release()
+ assert len(get_keys(key_reporter)) == 0
+ assert len(get_events(session)) == 0
+
+
+@pytest.mark.parametrize("value,code", [
+ (u"a", "KeyA",),
+ ("a", "KeyA",),
+ (u"\"", "Quote"),
+ (u",", "Comma"),
+ (u"\u00E0", ""),
+ (u"\u0416", ""),
+ (u"@", "Digit2"),
+ (u"\u2603", ""),
+ (u"\uF6C2", ""), # PUA
+])
+def test_single_printable_key_sends_correct_events(session,
+ key_reporter,
+ key_chain,
+ value,
+ code):
+ key_chain \
+ .key_down(value) \
+ .key_up(value) \
+ .perform()
+ expected = [
+ {"code": code, "key": value, "type": "keydown"},
+ {"code": code, "key": value, "type": "keypress"},
+ {"code": code, "key": value, "type": "keyup"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ assert events == expected
+ assert get_keys(key_reporter) == value
+
+
+@pytest.mark.parametrize("value", [
+ (u"\U0001F604"),
+ (u"\U0001F60D"),
+])
+def test_single_emoji_records_correct_key(session, key_reporter, key_chain, value):
+ # Not using key_chain.send_keys() because we always want to treat value as
+ # one character here. `len(value)` varies by platform for non-BMP characters,
+ # so we don't want to iterate over value.
+ key_chain \
+ .key_down(value) \
+ .key_up(value) \
+ .perform()
+ # events sent by major browsers are inconsistent so only check key value
+ assert get_keys(key_reporter) == value
+
+
+@pytest.mark.parametrize("value,code,key", [
+ (u"\uE050", "ShiftRight", "Shift"),
+ (u"\uE053", "OSRight", "Meta"),
+ (Keys.CONTROL, "ControlLeft", "Control"),
+])
+def test_single_modifier_key_sends_correct_events(session,
+ key_reporter,
+ key_chain,
+ value,
+ code,
+ key):
+ key_chain \
+ .key_down(value) \
+ .key_up(value) \
+ .perform()
+ all_events = get_events(session)
+ expected = [
+ {"code": code, "key": key, "type": "keydown"},
+ {"code": code, "key": key, "type": "keyup"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in all_events]
+ assert events == expected
+ assert len(get_keys(key_reporter)) == 0
+
+
+@pytest.mark.parametrize("value,code,key", [
+ (Keys.ESCAPE, "Escape", "Escape"),
+ (Keys.RIGHT, "ArrowRight", "ArrowRight"),
+])
+def test_single_nonprintable_key_sends_events(session,
+ key_reporter,
+ key_chain,
+ value,
+ code,
+ key):
+ key_chain \
+ .key_down(value) \
+ .key_up(value) \
+ .perform()
+ expected = [
+ {"code": code, "key": key, "type": "keydown"},
+ {"code": code, "key": key, "type": "keypress"},
+ {"code": code, "key": key, "type": "keyup"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ if len(events) == 2:
+ # most browsers don't send a keypress for non-printable keys
+ assert events == [expected[0], expected[2]]
+ else:
+ assert events == expected
+ assert len(get_keys(key_reporter)) == 0
+
+
+def test_sequence_of_keydown_printable_keys_sends_events(session,
+ key_reporter,
+ key_chain):
+ key_chain \
+ .key_down("a") \
+ .key_down("b") \
+ .perform()
+ expected = [
+ {"code": "KeyA", "key": "a", "type": "keydown"},
+ {"code": "KeyA", "key": "a", "type": "keypress"},
+ {"code": "KeyB", "key": "b", "type": "keydown"},
+ {"code": "KeyB", "key": "b", "type": "keypress"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ assert events == expected
+ assert get_keys(key_reporter) == "ab"
+
+
+def test_sequence_of_keydown_character_keys(session, key_reporter, key_chain):
+ key_chain.send_keys("ef").perform()
+ expected = [
+ {"code": "KeyE", "key": "e", "type": "keydown"},
+ {"code": "KeyE", "key": "e", "type": "keypress"},
+ {"code": "KeyE", "key": "e", "type": "keyup"},
+ {"code": "KeyF", "key": "f", "type": "keydown"},
+ {"code": "KeyF", "key": "f", "type": "keypress"},
+ {"code": "KeyF", "key": "f", "type": "keyup"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ assert events == expected
+ assert get_keys(key_reporter) == "ef"
+
+
+def test_backspace_erases_keys(session, key_reporter, key_chain):
+ key_chain \
+ .send_keys("efcd") \
+ .send_keys([Keys.BACKSPACE, Keys.BACKSPACE]) \
+ .perform()
+ assert get_keys(key_reporter) == "ef"
+
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/actions/mouse.py b/tests/wpt/web-platform-tests/webdriver/tests/actions/mouse.py
new file mode 100644
index 00000000000..3ff1e3eb5a7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/actions/mouse.py
@@ -0,0 +1,136 @@
+import pytest
+
+from tests.support.inline import inline
+from tests.actions.support.refine import get_events, filter_dict
+from tests.support.wait import wait
+
+
+def link_doc(dest):
+ content = "<a href=\"{}\" id=\"link\">destination</a>".format(dest)
+ return inline(content)
+
+
+def get_center(rect):
+ return {
+ "x": rect["width"] / 2 + rect["x"],
+ "y": rect["height"] / 2 + rect["y"],
+ }
+
+
+# TODO use pytest.approx once we upgrade to pytest > 3.0
+def approx(n, m, tolerance=1):
+ return abs(n - m) < tolerance
+
+
+def test_click_at_coordinates(session, test_actions_page, mouse_chain):
+ div_point = {
+ "x": 82,
+ "y": 187,
+ }
+ mouse_chain \
+ .pointer_move(div_point["x"], div_point["y"], duration=1000) \
+ .click() \
+ .perform()
+ events = get_events(session)
+ assert len(events) == 4
+ for e in events:
+ if e["type"] != "mousemove":
+ assert e["pageX"] == div_point["x"]
+ assert e["pageY"] == div_point["y"]
+ assert e["target"] == "outer"
+ if e["type"] != "mousedown":
+ assert e["buttons"] == 0
+ assert e["button"] == 0
+ expected = [
+ {"type": "mousedown", "buttons": 1},
+ {"type": "mouseup", "buttons": 0},
+ {"type": "click", "buttons": 0},
+ ]
+ filtered_events = [filter_dict(e, expected[0]) for e in events]
+ assert expected == filtered_events[1:]
+
+
+def test_context_menu_at_coordinates(session, test_actions_page, mouse_chain):
+ div_point = {
+ "x": 82,
+ "y": 187,
+ }
+ mouse_chain \
+ .pointer_move(div_point["x"], div_point["y"]) \
+ .pointer_down(button=2) \
+ .pointer_up(button=2) \
+ .perform()
+ events = get_events(session)
+ expected = [
+ {"type": "mousedown", "button": 2},
+ {"type": "contextmenu", "button": 2},
+ ]
+ assert len(events) == 4
+ filtered_events = [filter_dict(e, expected[0]) for e in events]
+ mousedown_contextmenu_events = [
+ x for x in filtered_events
+ if x["type"] in ["mousedown", "contextmenu"]
+ ]
+ assert expected == mousedown_contextmenu_events
+
+
+def test_click_element_center(session, test_actions_page, mouse_chain):
+ outer = session.find.css("#outer", all=False)
+ center = get_center(outer.rect)
+ mouse_chain.click(element=outer).perform()
+ events = get_events(session)
+ assert len(events) == 4
+ event_types = [e["type"] for e in events]
+ assert ["mousemove", "mousedown", "mouseup", "click"] == event_types
+ for e in events:
+ if e["type"] != "mousemove":
+ assert approx(e["pageX"], center["x"])
+ assert approx(e["pageY"], center["y"])
+ assert e["target"] == "outer"
+
+
+def test_click_navigation(session, url):
+ destination = url("/webdriver/tests/actions/support/test_actions_wdspec.html")
+ start = link_doc(destination)
+
+ def click(link):
+ mouse_chain = session.actions.sequence(
+ "pointer", "pointer_id", {"pointerType": "mouse"})
+ mouse_chain.click(element=link).perform()
+
+ session.url = start
+ error_message = "Did not navigate to %s" % destination
+
+ click(session.find.css("#link", all=False))
+ wait(session, lambda s: s.url == destination, error_message)
+ # repeat steps to check behaviour after document unload
+ session.url = start
+ click(session.find.css("#link", all=False))
+ wait(session, lambda s: s.url == destination, error_message)
+
+
+@pytest.mark.parametrize("drag_duration", [0, 300, 800])
+@pytest.mark.parametrize("dx, dy",
+ [(20, 0), (0, 15), (10, 15), (-20, 0), (10, -15), (-10, -15)])
+def test_drag_and_drop(session, test_actions_page, mouse_chain, dx, dy, drag_duration):
+ drag_target = session.find.css("#dragTarget", all=False)
+ initial_rect = drag_target.rect
+ initial_center = get_center(initial_rect)
+ # Conclude chain with extra move to allow time for last queued
+ # coordinate-update of drag_target and to test that drag_target is "dropped".
+ mouse_chain \
+ .pointer_move(0, 0, origin=drag_target) \
+ .pointer_down() \
+ .pointer_move(dx, dy, duration=drag_duration, origin="pointer") \
+ .pointer_up() \
+ .pointer_move(80, 50, duration=100, origin="pointer") \
+ .perform()
+ # mouseup that ends the drag is at the expected destination
+ e = get_events(session)[1]
+ assert e["type"] == "mouseup"
+ assert approx(e["pageX"], initial_center["x"] + dx)
+ assert approx(e["pageY"], initial_center["y"] + dy)
+ # check resulting location of the dragged element
+ final_rect = drag_target.rect
+ assert initial_rect["x"] + dx == final_rect["x"]
+ assert initial_rect["y"] + dy == final_rect["y"]
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/actions/sequence.py b/tests/wpt/web-platform-tests/webdriver/tests/actions/sequence.py
new file mode 100644
index 00000000000..3e83b15b353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/actions/sequence.py
@@ -0,0 +1,146 @@
+# META: timeout=long
+
+import pytest
+
+from tests.actions.support.refine import get_keys, filter_dict, get_events
+from tests.actions.support.keys import Keys
+
+
+def test_no_actions_send_no_events(session, key_reporter, key_chain):
+ key_chain.perform()
+ assert len(get_keys(key_reporter)) == 0
+ assert len(get_events(session)) == 0
+
+
+def test_release_char_sequence_sends_keyup_events_in_reverse(session,
+ key_reporter,
+ key_chain):
+ key_chain \
+ .key_down("a") \
+ .key_down("b") \
+ .perform()
+ # reset so we only see the release events
+ session.execute_script("resetEvents();")
+ session.actions.release()
+ expected = [
+ {"code": "KeyB", "key": "b", "type": "keyup"},
+ {"code": "KeyA", "key": "a", "type": "keyup"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ assert events == expected
+
+
+def test_release_no_actions_sends_no_events(session, key_reporter):
+ session.actions.release()
+ assert len(get_keys(key_reporter)) == 0
+ assert len(get_events(session)) == 0
+
+
+@pytest.mark.parametrize("modifier, prop", [
+ (Keys.CONTROL, "ctrlKey"),
+ (Keys.ALT, "altKey"),
+ (Keys.META, "metaKey"),
+ (Keys.SHIFT, "shiftKey"),
+ (Keys.R_CONTROL, "ctrlKey"),
+ (Keys.R_ALT, "altKey"),
+ (Keys.R_META, "metaKey"),
+ (Keys.R_SHIFT, "shiftKey"),
+])
+def test_control_click(session,
+ test_actions_page,
+ key_chain,
+ mouse_chain,
+ modifier,
+ prop):
+ key_chain \
+ .pause(0) \
+ .key_down(modifier) \
+ .pause(200) \
+ .key_up(modifier)
+ outer = session.find.css("#outer", all=False)
+ mouse_chain.click(element=outer)
+ session.actions.perform([key_chain.dict, mouse_chain.dict])
+ expected = [
+ {"type": "mousemove"},
+ {"type": "mousedown"},
+ {"type": "mouseup"},
+ {"type": "click"},
+ ]
+ defaults = {
+ "altKey": False,
+ "metaKey": False,
+ "shiftKey": False,
+ "ctrlKey": False
+ }
+ for e in expected:
+ e.update(defaults)
+ if e["type"] != "mousemove":
+ e[prop] = True
+ filtered_events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ assert expected == filtered_events
+
+
+def test_release_control_click(session, key_reporter, key_chain, mouse_chain):
+ key_chain \
+ .pause(0) \
+ .key_down(Keys.CONTROL)
+ mouse_chain \
+ .pointer_move(0, 0, origin=key_reporter) \
+ .pointer_down()
+ session.actions.perform([key_chain.dict, mouse_chain.dict])
+ session.execute_script("""
+ var keyReporter = document.getElementById("keys");
+ ["mousedown", "mouseup"].forEach((e) => {
+ keyReporter.addEventListener(e, recordPointerEvent);
+ });
+ resetEvents();
+ """)
+ session.actions.release()
+ expected = [
+ {"type": "mouseup"},
+ {"type": "keyup"},
+ ]
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ assert events == expected
+
+
+def test_many_modifiers_click(session, test_actions_page, key_chain, mouse_chain):
+ outer = session.find.css("#outer", all=False)
+ key_chain \
+ .pause(0) \
+ .key_down(Keys.CONTROL) \
+ .key_down(Keys.SHIFT) \
+ .pause(0) \
+ .key_up(Keys.CONTROL) \
+ .key_up(Keys.SHIFT)
+ mouse_chain \
+ .pointer_move(0, 0, origin=outer) \
+ .pause(0) \
+ .pointer_down() \
+ .pointer_up() \
+ .pause(0) \
+ .pause(0) \
+ .pointer_down()
+ session.actions.perform([key_chain.dict, mouse_chain.dict])
+ expected = [
+ {"type": "mousemove"},
+ # shift and ctrl presses
+ {"type": "mousedown"},
+ {"type": "mouseup"},
+ {"type": "click"},
+ # no modifiers pressed
+ {"type": "mousedown"},
+ ]
+ defaults = {
+ "altKey": False,
+ "metaKey": False,
+ "shiftKey": False,
+ "ctrlKey": False
+ }
+ for e in expected:
+ e.update(defaults)
+ for e in expected[1:4]:
+ e["shiftKey"] = True
+ e["ctrlKey"] = True
+ events = [filter_dict(e, expected[0]) for e in get_events(session)]
+ assert events == expected
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/actions/special_keys.py b/tests/wpt/web-platform-tests/webdriver/tests/actions/special_keys.py
new file mode 100644
index 00000000000..ee2d13faf4e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/actions/special_keys.py
@@ -0,0 +1,39 @@
+# META: timeout=long
+
+import pytest
+from tests.actions.support.keys import ALL_EVENTS, Keys
+from tests.actions.support.refine import filter_dict, get_keys, get_events
+
+
+@pytest.mark.parametrize("name,expected", ALL_EVENTS.items())
+def test_webdriver_special_key_sends_keydown(session,
+ key_reporter,
+ key_chain,
+ name,
+ expected):
+ if name.startswith("F"):
+ # Prevent default behavior for F1, etc., but only after keydown
+ # bubbles up to body. (Otherwise activated browser menus/functions
+ # may interfere with subsequent tests.)
+ session.execute_script("""
+ document.body.addEventListener("keydown",
+ (e) => e.preventDefault());
+ """)
+ key_chain.key_down(getattr(Keys, name)).perform()
+ # only interested in keydown
+ first_event = get_events(session)[0]
+ # make a copy so we can throw out irrelevant keys and compare to events
+ expected = dict(expected)
+
+ del expected["value"]
+ # check and remove keys that aren't in expected
+ assert first_event["type"] == "keydown"
+ assert first_event["repeat"] == False
+ first_event = filter_dict(first_event, expected)
+ assert first_event == expected
+ # only printable characters should be recorded in input field
+ entered_keys = get_keys(key_reporter)
+ if len(expected["key"]) == 1:
+ assert entered_keys == expected["key"]
+ else:
+ assert len(entered_keys) == 0
diff --git a/tests/wpt/web-platform-tests/microdata/encoding-microdata/names-the-itemprop-attribute/.gitkeep b/tests/wpt/web-platform-tests/webdriver/tests/actions/support/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/encoding-microdata/names-the-itemprop-attribute/.gitkeep
+++ b/tests/wpt/web-platform-tests/webdriver/tests/actions/support/__init__.py
diff --git a/tests/wpt/web-platform-tests/webdriver/actions/support/keys.py b/tests/wpt/web-platform-tests/webdriver/tests/actions/support/keys.py
index 85517916678..85517916678 100644
--- a/tests/wpt/web-platform-tests/webdriver/actions/support/keys.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/actions/support/keys.py
diff --git a/tests/wpt/web-platform-tests/webdriver/actions/support/refine.py b/tests/wpt/web-platform-tests/webdriver/tests/actions/support/refine.py
index 3a6d63e04ce..3a6d63e04ce 100644
--- a/tests/wpt/web-platform-tests/webdriver/actions/support/refine.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/actions/support/refine.py
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/actions/support/test_actions_wdspec.html b/tests/wpt/web-platform-tests/webdriver/tests/actions/support/test_actions_wdspec.html
new file mode 100644
index 00000000000..be273229a3b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/actions/support/test_actions_wdspec.html
@@ -0,0 +1,181 @@
+<!doctype html>
+<meta charset=utf-8>
+<head>
+ <title>Test Actions</title>
+ <style>
+ div { padding:0px; margin: 0px; }
+ #trackPointer { position: fixed; }
+ #resultContainer { width: 600px; height: 60px; }
+ .area { width: 100px; height: 50px; background-color: #ccc; }
+ .block { width: 5px; height: 5px; border: solid 1px red; }
+ #dragArea { position: relative; }
+ #dragTarget { position: absolute; top:22px; left:47px;}
+ </style>
+ <script>
+ "use strict";
+ var els = {};
+ var allEvents = {events: []};
+ function displayMessage(message) {
+ document.getElementById("events").innerHTML = "<p>" + message + "</p>";
+ }
+
+ function appendMessage(message) {
+ document.getElementById("events").innerHTML += "<p>" + message + "</p>";
+ }
+
+ /**
+ * Escape |key| if it's in a surrogate-half character range.
+ *
+ * Example: given "\ud83d" return "U+d83d".
+ *
+ * Otherwise JSON.stringify will convert it to U+FFFD (REPLACEMENT CHARACTER)
+ * when returning a value from executeScript, for example.
+ */
+ function escapeSurrogateHalf(key) {
+ if (typeof key !== "undefined" && key.length === 1) {
+ var charCode = key.charCodeAt(0);
+ var highSurrogate = charCode >= 0xD800 && charCode <= 0xDBFF;
+ var surrogate = highSurrogate || (charCode >= 0xDC00 && charCode <= 0xDFFF);
+ if (surrogate) {
+ key = "U+" + charCode.toString(16);
+ }
+ }
+ return key;
+ }
+
+ function recordKeyboardEvent(event) {
+ var key = escapeSurrogateHalf(event.key);
+ allEvents.events.push({
+ "code": event.code,
+ "key": key,
+ "which": event.which,
+ "location": event.location,
+ "ctrl": event.ctrlKey,
+ "meta": event.metaKey,
+ "shift": event.shiftKey,
+ "repeat": event.repeat,
+ "type": event.type
+ });
+ appendMessage(`${event.type}(` +
+ `code: ${event.code}, ` +
+ `key: ${key}, ` +
+ `which: ${event.which}, ` +
+ `keyCode: ${event.keyCode})`);
+ }
+
+ function recordPointerEvent(event) {
+ if (event.type === "contextmenu") {
+ event.preventDefault();
+ }
+ allEvents.events.push({
+ "type": event.type,
+ "button": event.button,
+ "buttons": event.buttons,
+ "pageX": event.pageX,
+ "pageY": event.pageY,
+ "ctrlKey": event.ctrlKey,
+ "metaKey": event.metaKey,
+ "altKey": event.altKey,
+ "shiftKey": event.shiftKey,
+ "target": event.target.id
+ });
+ appendMessage(`${event.type}(` +
+ `button: ${event.button}, ` +
+ `pageX: ${event.pageX}, ` +
+ `pageY: ${event.pageY}, ` +
+ `button: ${event.button}, ` +
+ `buttons: ${event.buttons}, ` +
+ `ctrlKey: ${event.ctrlKey}, ` +
+ `altKey: ${event.altKey}, ` +
+ `metaKey: ${event.metaKey}, ` +
+ `shiftKey: ${event.shiftKey}, ` +
+ `target id: ${event.target.id})`);
+ }
+
+ function recordFirstPointerMove(event) {
+ recordPointerEvent(event);
+ window.removeEventListener("mousemove", recordFirstPointerMove);
+ }
+
+ function resetEvents() {
+ allEvents.events.length = 0;
+ displayMessage("");
+ }
+
+ function drop(moveHandler) {
+ return function (event) {
+ els.dragArea.removeEventListener("mousemove", moveHandler);
+ els.dragTarget.style.backgroundColor = "yellow";
+ els.dragTarget.addEventListener("mousedown", grab);
+ recordPointerEvent(event);
+ };
+ }
+
+ function move(el, offsetX, offsetY, timeout) {
+ return (event) => {
+ setTimeout(() => {
+ el.style.top = event.clientY + offsetY + "px";
+ el.style.left = event.clientX + offsetX + "px";
+ }, timeout);
+ };
+ }
+
+ function grab(event) {
+ event.target.style.backgroundColor = "red";
+ let boxRect = event.target.getBoundingClientRect();
+ let areaRect = event.target.parentElement.getBoundingClientRect();
+ let moveHandler = move(
+ event.target,
+ // coordinates of dragTarget must be relative to dragArea such that
+ // dragTarget remains under the pointer
+ -(areaRect.left + (event.clientX - boxRect.left)),
+ -(areaRect.top + (event.clientY - boxRect.top)),
+ 20);
+ els.dragArea.addEventListener("mousemove", moveHandler);
+ els.dragArea.addEventListener("mouseup", drop(moveHandler), {once: true});
+ }
+
+ document.addEventListener("DOMContentLoaded", () => {
+ var keyReporter = document.getElementById("keys");
+ ["keyup", "keypress", "keydown"].forEach((e) => {
+ keyReporter.addEventListener(e, recordKeyboardEvent);
+ });
+ var outer = document.getElementById("outer");
+ ["click", "dblclick", "mousedown",
+ "mouseup", "contextmenu"].forEach((e) => {
+ outer.addEventListener(e, recordPointerEvent);
+ });
+ window.addEventListener("mousemove", recordPointerEvent, {once: true});
+ //visual cue for mousemove
+ var pointer = document.getElementById("trackPointer");
+ window.addEventListener("mousemove", move(pointer, 15, 15, 30));
+ // drag and drop
+ els.dragArea = document.getElementById("dragArea");
+ els.dragTarget = document.getElementById("dragTarget");
+ els.dragTarget.addEventListener("mousedown", grab, {once: true});
+ });
+ </script>
+</head>
+<body>
+ <div id="trackPointer" class="block"></div>
+ <div>
+ <h2>KeyReporter</h2>
+ <input type="text" id="keys" size="80">
+ </div>
+ <div>
+ <h2>ClickReporter</h2>
+ <div id="outer" class="area">
+ </div>
+ </div>
+ <div>
+ <h2>DragReporter</h2>
+ <div id="dragArea" class="area">
+ <div id="dragTarget" class="block"></div>
+ </div>
+ </div>
+ <div id="resultContainer">
+ <h2>Events</h2>
+ <div id="events"></div>
+ </div>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/conftest.py
new file mode 100644
index 00000000000..e1491a68026
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/conftest.py
@@ -0,0 +1,14 @@
+import pytest
+from tests.support.fixtures import (
+ configuration, create_dialog, create_frame, create_window, http,
+ new_session, server_config, session, url)
+
+pytest.fixture(scope="session")(configuration)
+pytest.fixture()(create_dialog)
+pytest.fixture()(create_frame)
+pytest.fixture()(create_window)
+pytest.fixture()(http)
+pytest.fixture(scope="function")(new_session)
+pytest.fixture()(server_config)
+pytest.fixture(scope="function")(session)
+pytest.fixture()(url)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/contexts/maximize_window.py b/tests/wpt/web-platform-tests/webdriver/tests/contexts/maximize_window.py
new file mode 100644
index 00000000000..4173b170881
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/contexts/maximize_window.py
@@ -0,0 +1,277 @@
+# META: timeout=long
+
+from tests.support.asserts import assert_error, assert_dialog_handled, assert_success
+from tests.support.fixtures import create_dialog
+from tests.support.inline import inline
+
+
+alert_doc = inline("<script>window.alert()</script>")
+
+
+def maximize(session):
+ return session.transport.send("POST", "session/%s/window/maximize" % session.session_id)
+
+
+# 10.7.3 Maximize Window
+
+
+def test_no_browsing_context(session, create_window):
+ """
+ 2. If the current top-level browsing context is no longer open,
+ return error with error code no such window.
+
+ """
+ session.window_handle = create_window()
+ session.close()
+ response = maximize(session)
+ assert_error(response, "no such window")
+
+
+def test_handle_prompt_dismiss_and_notify():
+ """TODO"""
+
+
+def test_handle_prompt_accept_and_notify():
+ """TODO"""
+
+
+def test_handle_prompt_ignore():
+ """TODO"""
+
+
+def test_handle_prompt_accept(new_session):
+ """
+ 3. Handle any user prompts and return its value if it is an error.
+
+ [...]
+
+ In order to handle any user prompts a remote end must take the
+ following steps:
+
+ [...]
+
+ 2. Perform the following substeps based on the current session's
+ user prompt handler:
+
+ [...]
+
+ - accept state
+ Accept the current user prompt.
+
+ """
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+ session.url = inline("<title>WD doc title</title>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+ response = maximize(session)
+ assert response.status == 200
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+ response = maximize(session)
+ assert response.status == 200
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+ response = maximize(session)
+ assert response.status == 200
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_missing_value(session, create_dialog):
+ """
+ 3. Handle any user prompts and return its value if it is an error.
+
+ [...]
+
+ In order to handle any user prompts a remote end must take the
+ following steps:
+
+ [...]
+
+ 2. Perform the following substeps based on the current session's
+ user prompt handler:
+
+ [...]
+
+ - missing value default state
+ 1. Dismiss the current user prompt.
+ 2. Return error with error code unexpected alert open.
+
+ """
+ session.url = inline("<title>WD doc title</title>")
+ create_dialog("alert", text="dismiss #1", result_var="dismiss1")
+
+ response = maximize(session)
+
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
+
+ response = maximize(session)
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
+
+ response = maximize(session)
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_fully_exit_fullscreen(session):
+ """
+ 4. Fully exit fullscreen.
+
+ [...]
+
+ To fully exit fullscreen a document document, run these steps:
+
+ 1. If document's fullscreen element is null, terminate these steps.
+
+ 2. Unfullscreen elements whose fullscreen flag is set, within
+ document's top layer, except for document's fullscreen element.
+
+ 3. Exit fullscreen document.
+
+ """
+ session.window.fullscreen()
+ assert session.execute_script("return window.fullScreen") is True
+
+ response = maximize(session)
+ assert_success(response)
+ assert session.execute_script("return window.fullScreen") is False
+
+
+def test_restore_the_window(session):
+ """
+ 5. Restore the window.
+
+ [...]
+
+ To restore the window, given an operating system level window with
+ an associated top-level browsing context, run implementation-specific
+ steps to restore or unhide the window to the visible screen. Do not
+ return from this operation until the visibility state of the top-level
+ browsing context's active document has reached the visible state,
+ or until the operation times out.
+
+ """
+ session.window.minimize()
+ assert session.execute_script("return document.hidden") is True
+
+ response = maximize(session)
+ assert_success(response)
+
+
+def test_maximize(session):
+ """
+ 6. Maximize the window of the current browsing context.
+
+ [...]
+
+ To maximize the window, given an operating system level window with an
+ associated top-level browsing context, run the implementation-specific
+ steps to transition the operating system level window into the
+ maximized window state. If the window manager supports window
+ resizing but does not have a concept of window maximation, the window
+ dimensions must be increased to the maximum available size permitted
+ by the window manager for the current screen. Return when the window
+ has completed the transition, or within an implementation-defined
+ timeout.
+
+ """
+ before_size = session.window.size
+
+ response = maximize(session)
+ assert_success(response)
+
+ assert before_size != session.window.size
+
+
+def test_payload(session):
+ """
+ 7. Return success with the JSON serialization of the current top-level
+ browsing context's window rect.
+
+ [...]
+
+ A top-level browsing context's window rect is defined as a
+ dictionary of the screenX, screenY, width and height attributes of
+ the WindowProxy. Its JSON representation is the following:
+
+ "x"
+ WindowProxy's screenX attribute.
+
+ "y"
+ WindowProxy's screenY attribute.
+
+ "width"
+ Width of the top-level browsing context's outer dimensions,
+ including any browser chrome and externally drawn window
+ decorations in CSS reference pixels.
+
+ "height"
+ Height of the top-level browsing context's outer dimensions,
+ including any browser chrome and externally drawn window
+ decorations in CSS reference pixels.
+
+ """
+ before_size = session.window.size
+
+ response = maximize(session)
+
+ # step 5
+ assert response.status == 200
+ assert isinstance(response.body["value"], dict)
+
+ value = response.body["value"]
+ assert "width" in value
+ assert "height" in value
+ assert "x" in value
+ assert "y" in value
+ assert isinstance(value["width"], int)
+ assert isinstance(value["height"], int)
+ assert isinstance(value["x"], int)
+ assert isinstance(value["y"], int)
+
+ assert before_size != session.window.size
+
+
+def test_maximize_twice_is_idempotent(session):
+ first_response = maximize(session)
+ assert_success(first_response)
+ max_size = session.window.size
+
+ second_response = maximize(session)
+ assert_success(second_response)
+ assert session.window.size == max_size
+
+
+"""
+TODO(ato): Implicit session start does not use configuration passed on
+from wptrunner. This causes an exception.
+
+See https://bugzil.la/1398459.
+
+def test_maximize_when_resized_to_max_size(session):
+ # Determine the largest available window size by first maximising
+ # the window and getting the window rect dimensions.
+ #
+ # Then resize the window to the maximum available size.
+ session.end()
+ available = session.window.maximize()
+ session.end()
+
+ session.window.size = available
+
+ # In certain window managers a window extending to the full available
+ # dimensions of the screen may not imply that the window is maximised,
+ # since this is often a special state. If a remote end expects a DOM
+ # resize event, this may not fire if the window has already reached
+ # its expected dimensions.
+ before = session.window.size
+ session.window.maximize()
+ assert session.window.size == before
+"""
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/contexts/resizing_and_positioning.py b/tests/wpt/web-platform-tests/webdriver/tests/contexts/resizing_and_positioning.py
new file mode 100644
index 00000000000..66331faa22b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/contexts/resizing_and_positioning.py
@@ -0,0 +1,61 @@
+import json
+import pytest
+import webdriver
+
+
+def window_size_supported(session):
+ try:
+ session.window.size = ("a", "b")
+ except webdriver.UnsupportedOperationException:
+ return False
+ except webdriver.InvalidArgumentException:
+ return True
+
+def window_position_supported(session):
+ try:
+ session.window.position = ("a", "b")
+ except webdriver.UnsupportedOperationException:
+ return False
+ except webdriver.InvalidArgumentException:
+ return True
+
+
+def test_window_resize(session):
+ if not window_size_supported(session):
+ pytest.skip()
+
+ # setting the window size by webdriver is synchronous
+ # so we should see the results immediately
+
+ session.window.size = (400, 500)
+ assert session.window.size == (400, 500)
+
+ session.window.size = (500, 600)
+ assert session.window.size == (500, 600)
+
+
+"""
+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(700, 800)")
+ size1 = session.window.size
+ while size0 == size1:
+ size1 = session.window.size
+ assert size1 == (700, 800)
+
+ 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}
+"""
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/cookies/cookies.py b/tests/wpt/web-platform-tests/webdriver/tests/cookies/cookies.py
new file mode 100644
index 00000000000..42a8c4480f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/cookies/cookies.py
@@ -0,0 +1,28 @@
+def test_get_named_cookie(session, url):
+ session.url = url("/common/blank.html")
+ session.execute_script("document.cookie = 'foo=bar'")
+
+ result = session.transport.send("GET", "session/%s/cookie/foo" % session.session_id)
+ assert result.status == 200
+ assert isinstance(result.body["value"], dict)
+
+ # table for cookie conversion
+ # https://w3c.github.io/webdriver/webdriver-spec.html#dfn-table-for-cookie-conversion
+ cookie = result.body["value"]
+ assert "name" in cookie
+ assert isinstance(cookie["name"], basestring)
+ assert "value" in cookie
+ assert isinstance(cookie["value"], basestring)
+ assert "path" in cookie
+ assert isinstance(cookie["path"], basestring)
+ assert "domain" in cookie
+ assert isinstance(cookie["domain"], basestring)
+ assert "secure" in cookie
+ assert isinstance(cookie["secure"], bool)
+ assert "httpOnly" in cookie
+ assert isinstance(cookie["httpOnly"], bool)
+ assert "expiry" in cookie
+ assert isinstance(cookie["expiry"], (int, long))
+
+ assert cookie["name"] == "foo"
+ assert cookie["value"] == "bar"
diff --git a/tests/wpt/web-platform-tests/microdata/encoding-microdata/the-microdata-model/.gitkeep b/tests/wpt/web-platform-tests/webdriver/tests/element_click/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/encoding-microdata/the-microdata-model/.gitkeep
+++ b/tests/wpt/web-platform-tests/webdriver/tests/element_click/__init__.py
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/element_click/select.py b/tests/wpt/web-platform-tests/webdriver/tests/element_click/select.py
new file mode 100644
index 00000000000..15c36fc454f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/element_click/select.py
@@ -0,0 +1,213 @@
+from tests.support.inline import inline
+
+
+def test_click_option(session):
+ session.url = inline("""
+ <select>
+ <option>first
+ <option>second
+ </select>""")
+ options = session.find.css("option")
+
+ assert options[0].selected
+ assert not options[1].selected
+
+ options[1].click()
+ assert options[1].selected
+ assert not options[0].selected
+
+
+def test_click_multiple_option(session):
+ session.url = inline("""
+ <select multiple>
+ <option>first
+ <option>second
+ </select>""")
+ options = session.find.css("option")
+
+ assert not options[0].selected
+ assert not options[1].selected
+
+ options[0].click()
+ assert options[0].selected
+ assert not options[1].selected
+
+
+def test_click_preselected_option(session):
+ session.url = inline("""
+ <select>
+ <option>first
+ <option selected>second
+ </select>""")
+ options = session.find.css("option")
+
+ assert not options[0].selected
+ assert options[1].selected
+
+ options[1].click()
+ assert options[1].selected
+ assert not options[0].selected
+
+ options[0].click()
+ assert options[0].selected
+ assert not options[1].selected
+
+
+def test_click_preselected_multiple_option(session):
+ session.url = inline("""
+ <select multiple>
+ <option>first
+ <option selected>second
+ </select>""")
+ options = session.find.css("option")
+
+ assert not options[0].selected
+ assert options[1].selected
+
+ options[1].click()
+ assert not options[1].selected
+ assert not options[0].selected
+
+ options[0].click()
+ assert options[0].selected
+ assert not options[1].selected
+
+
+def test_click_deselects_others(session):
+ session.url = inline("""
+ <select>
+ <option>first
+ <option>second
+ <option>third
+ </select>""")
+ options = session.find.css("option")
+
+ options[0].click()
+ assert options[0].selected
+ options[1].click()
+ assert options[1].selected
+ options[2].click()
+ assert options[2].selected
+ options[0].click()
+ assert options[0].selected
+
+
+def test_click_multiple_does_not_deselect_others(session):
+ session.url = inline("""
+ <select multiple>
+ <option>first
+ <option>second
+ <option>third
+ </select>""")
+ options = session.find.css("option")
+
+ options[0].click()
+ assert options[0].selected
+ options[1].click()
+ assert options[0].selected
+ assert options[1].selected
+ options[2].click()
+ assert options[0].selected
+ assert options[1].selected
+ assert options[2].selected
+
+
+def test_click_selected_option(session):
+ session.url = inline("""
+ <select>
+ <option>first
+ <option>second
+ </select>""")
+ options = session.find.css("option")
+
+ # First <option> is selected in dropdown
+ assert options[0].selected
+ assert not options[1].selected
+
+ options[1].click()
+ assert options[1].selected
+ options[1].click()
+ assert options[1].selected
+
+
+def test_click_selected_multiple_option(session):
+ session.url = inline("""
+ <select multiple>
+ <option>first
+ <option>second
+ </select>""")
+ options = session.find.css("option")
+
+ # No implicitly selected <option> in <select multiple>
+ assert not options[0].selected
+ assert not options[1].selected
+
+ options[0].click()
+ assert options[0].selected
+ assert not options[1].selected
+
+ # Second click in <select multiple> deselects
+ options[0].click()
+ assert not options[0].selected
+ assert not options[1].selected
+
+
+def test_out_of_view_dropdown(session):
+ session.url = inline("""
+ <select>
+ <option>1
+ <option>2
+ <option>3
+ <option>4
+ <option>5
+ <option>6
+ <option>7
+ <option>8
+ <option>9
+ <option>10
+ <option>11
+ <option>12
+ <option>13
+ <option>14
+ <option>15
+ <option>16
+ <option>17
+ <option>18
+ <option>19
+ <option>20
+ </select>""")
+ options = session.find.css("option")
+
+ options[14].click()
+ assert options[14].selected
+
+
+def test_out_of_view_multiple(session):
+ session.url = inline("""
+ <select multiple>
+ <option>1
+ <option>2
+ <option>3
+ <option>4
+ <option>5
+ <option>6
+ <option>7
+ <option>8
+ <option>9
+ <option>10
+ <option>11
+ <option>12
+ <option>13
+ <option>14
+ <option>15
+ <option>16
+ <option>17
+ <option>18
+ <option>19
+ <option>20
+ </select>""")
+ options = session.find.css("option")
+
+ last_option = options[-1]
+ last_option.click()
+ assert last_option.selected
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/fullscreen_window.py b/tests/wpt/web-platform-tests/webdriver/tests/fullscreen_window.py
new file mode 100644
index 00000000000..696c579c266
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/fullscreen_window.py
@@ -0,0 +1,208 @@
+# META: timeout=long
+
+from tests.support.asserts import assert_error, assert_success, assert_dialog_handled
+from tests.support.fixtures import create_dialog
+from tests.support.inline import inline
+
+
+alert_doc = inline("<script>window.alert()</script>")
+
+
+def read_global(session, name):
+ return session.execute_script("return %s;" % name)
+
+
+def fullscreen(session):
+ return session.transport.send("POST", "session/%s/window/fullscreen" % session.session_id)
+
+
+# 10.7.5 Fullscreen Window
+
+
+def test_no_browsing_context(session, create_window):
+ """
+ 1. If the current top-level browsing context is no longer open,
+ return error with error code no such window.
+
+ """
+ session.window_handle = create_window()
+ session.close()
+ response = fullscreen(session)
+ assert_error(response, "no such window")
+
+
+def test_handle_prompt_dismiss_and_notify():
+ """TODO"""
+
+
+def test_handle_prompt_accept_and_notify():
+ """TODO"""
+
+
+def test_handle_prompt_ignore():
+ """TODO"""
+
+
+def test_handle_prompt_accept(new_session):
+ """
+ 2. Handle any user prompts and return its value if it is an error.
+
+ [...]
+
+ In order to handle any user prompts a remote end must take the
+ following steps:
+
+ [...]
+
+ 2. Perform the following substeps based on the current session's
+ user prompt handler:
+
+ [...]
+
+ - accept state
+ Accept the current user prompt.
+
+ """
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+ session.url = inline("<title>WD doc title</title>")
+ create_dialog(session)("alert", text="accept #1", result_var="accept1")
+
+ expected_title = read_global(session, "document.title")
+ response = fullscreen(session)
+
+ assert_success(response, expected_title)
+ assert_dialog_handled(session, "accept #1")
+ assert read_global(session, "accept1") == None
+
+ expected_title = read_global(session, "document.title")
+ create_dialog(session)("confirm", text="accept #2", result_var="accept2")
+
+ response = fullscreen(session)
+
+ assert_success(response, expected_title)
+ assert_dialog_handled(session, "accept #2")
+ assert read_global(session, "accept2"), True
+
+ expected_title = read_global(session, "document.title")
+ create_dialog(session)("prompt", text="accept #3", result_var="accept3")
+
+ response = fullscreen(session)
+
+ assert_success(response, expected_title)
+ assert_dialog_handled(session, "accept #3")
+ assert read_global(session, "accept3") == ""
+
+
+def test_handle_prompt_missing_value(session, create_dialog):
+ """
+ 2. Handle any user prompts and return its value if it is an error.
+
+ [...]
+
+ In order to handle any user prompts a remote end must take the
+ following steps:
+
+ [...]
+
+ 2. Perform the following substeps based on the current session's
+ user prompt handler:
+
+ [...]
+
+ - missing value default state
+ 1. Dismiss the current user prompt.
+ 2. Return error with error code unexpected alert open.
+
+ """
+ session.url = inline("<title>WD doc title</title>")
+ create_dialog("alert", text="dismiss #1", result_var="dismiss1")
+
+ response = fullscreen(session)
+
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #1")
+ assert read_global(session, "accept1") == None
+
+ create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
+
+ response = fullscreen(session)
+
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #2")
+ assert read_global(session, "dismiss2") == False
+
+ create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
+
+ response = fullscreen(session)
+
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #3")
+ assert read_global(session, "dismiss3") == None
+
+
+def test_fullscreen(session):
+ """
+ 4. Call fullscreen an element with the current top-level browsing
+ context's active document's document element.
+
+ """
+ response = fullscreen(session)
+ assert_success(response)
+ assert session.execute_script("return window.fullScreen") is True
+
+
+def test_payload(session):
+ """
+ 5. Return success with the JSON serialization of the current top-level
+ browsing context's window rect.
+
+ [...]
+
+ A top-level browsing context's window rect is defined as a
+ dictionary of the screenX, screenY, width and height attributes of
+ the WindowProxy. Its JSON representation is the following:
+
+ "x"
+ WindowProxy's screenX attribute.
+
+ "y"
+ WindowProxy's screenY attribute.
+
+ "width"
+ Width of the top-level browsing context's outer dimensions,
+ including any browser chrome and externally drawn window
+ decorations in CSS reference pixels.
+
+ "height"
+ Height of the top-level browsing context's outer dimensions,
+ including any browser chrome and externally drawn window
+ decorations in CSS reference pixels.
+
+ """
+ response = fullscreen(session)
+
+ # step 5
+ assert response.status == 200
+ assert isinstance(response.body["value"], dict)
+
+ value = response.body["value"]
+ assert "width" in value
+ assert "height" in value
+ assert "x" in value
+ assert "y" in value
+ assert isinstance(value["width"], int)
+ assert isinstance(value["height"], int)
+ assert isinstance(value["x"], int)
+ assert isinstance(value["y"], int)
+
+
+def test_fullscreen_twice_is_idempotent(session):
+ assert session.execute_script("return window.fullScreen") is False
+
+ first_response = fullscreen(session)
+ assert_success(first_response)
+ assert session.execute_script("return window.fullScreen") is True
+
+ second_response = fullscreen(session)
+ assert_success(second_response)
+ assert session.execute_script("return window.fullScreen") is True
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/get_window_rect.py b/tests/wpt/web-platform-tests/webdriver/tests/get_window_rect.py
new file mode 100644
index 00000000000..3ec8ce71d47
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/get_window_rect.py
@@ -0,0 +1,161 @@
+from tests.support.asserts import assert_error, assert_dialog_handled, assert_success
+from tests.support.fixtures import create_dialog
+from tests.support.inline import inline
+
+
+alert_doc = inline("<script>window.alert()</script>")
+
+
+def get_window_rect(session):
+ return session.transport.send("GET", "session/%s/window/rect" % session.session_id)
+
+
+# 10.7.1 Get Window Rect
+
+
+def test_no_browsing_context(session, create_window):
+ """
+ 1. If the current top-level browsing context is no longer open,
+ return error with error code no such window.
+
+ """
+ session.window_handle = create_window()
+ session.close()
+ response = get_window_rect(session)
+ assert_error(response, "no such window")
+
+
+def test_handle_prompt_dismiss_and_notify():
+ """TODO"""
+
+
+def test_handle_prompt_accept_and_notify():
+ """TODO"""
+
+
+def test_handle_prompt_ignore():
+ """TODO"""
+
+
+def test_handle_prompt_accept(new_session):
+ """
+ 2. Handle any user prompts and return its value if it is an error.
+
+ [...]
+
+ In order to handle any user prompts a remote end must take the
+ following steps:
+
+ [...]
+
+ 2. Perform the following substeps based on the current session's
+ user prompt handler:
+
+ [...]
+
+ - accept state
+ Accept the current user prompt.
+
+ """
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+ session.url = inline("<title>WD doc title</title>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+ response = get_window_rect(session)
+ assert response.status == 200
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+ response = get_window_rect(session)
+ assert response.status == 200
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+ response = get_window_rect(session)
+ assert response.status == 200
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_missing_value(session, create_dialog):
+ """
+ 2. Handle any user prompts and return its value if it is an error.
+
+ [...]
+
+ In order to handle any user prompts a remote end must take the
+ following steps:
+
+ [...]
+
+ 2. Perform the following substeps based on the current session's
+ user prompt handler:
+
+ [...]
+
+ - missing value default state
+ 1. Dismiss the current user prompt.
+ 2. Return error with error code unexpected alert open.
+
+ """
+ session.url = inline("<title>WD doc title</title>")
+ create_dialog("alert", text="dismiss #1", result_var="dismiss1")
+
+ response = get_window_rect(session)
+
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
+
+ response = get_window_rect(session)
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
+
+ response = get_window_rect(session)
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_payload(session):
+ """
+ 3. Return success with the JSON serialization of the current top-level
+ browsing context's window rect.
+
+ [...]
+
+ A top-level browsing context's window rect is defined as a
+ dictionary of the screenX, screenY, width and height attributes of
+ the WindowProxy. Its JSON representation is the following:
+
+ "x"
+ WindowProxy's screenX attribute.
+
+ "y"
+ WindowProxy's screenY attribute.
+
+ "width"
+ Width of the top-level browsing context's outer dimensions,
+ including any browser chrome and externally drawn window
+ decorations in CSS reference pixels.
+
+ "height"
+ Height of the top-level browsing context's outer dimensions,
+ including any browser chrome and externally drawn window
+ decorations in CSS reference pixels.
+
+ """
+ response = get_window_rect(session)
+
+ assert response.status == 200
+ assert isinstance(response.body["value"], dict)
+ value = response.body["value"]
+ assert "width" in value
+ assert "height" in value
+ assert "x" in value
+ assert "y" in value
+ assert isinstance(value["width"], int)
+ assert isinstance(value["height"], int)
+ assert isinstance(value["x"], int)
+ assert isinstance(value["y"], int)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/interaction/send_keys_content_editable.py b/tests/wpt/web-platform-tests/webdriver/tests/interaction/send_keys_content_editable.py
new file mode 100644
index 00000000000..a4bba8e534f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/interaction/send_keys_content_editable.py
@@ -0,0 +1,23 @@
+import pytest
+
+from tests.support.inline import inline
+
+
+def test_sets_insertion_point_to_end(session):
+ session.url = inline('<div contenteditable=true>Hello,</div>')
+ input = session.find.css("div", all=False)
+ input.send_keys(' world!')
+ text = session.execute_script('return arguments[0].innerText', args=[input])
+ assert "Hello, world!" == text.strip()
+
+
+# 12. Let current text length be the element’s length.
+#
+# 13. Set the text insertion caret using set selection range using current
+# text length for both the start and end parameters.
+def test_sets_insertion_point_to_after_last_text_node(session):
+ session.url = inline('<div contenteditable=true>Hel<span>lo</span>,</div>')
+ input = session.find.css("div", all=False)
+ input.send_keys(" world!")
+ text = session.execute_script("return arguments[0].innerText", args=[input])
+ assert "Hello, world!" == text.strip()
diff --git a/tests/wpt/web-platform-tests/webdriver/interface.html b/tests/wpt/web-platform-tests/webdriver/tests/interface.html
index 143a8643f3c..143a8643f3c 100644
--- a/tests/wpt/web-platform-tests/webdriver/interface.html
+++ b/tests/wpt/web-platform-tests/webdriver/tests/interface.html
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/minimize_window.py b/tests/wpt/web-platform-tests/webdriver/tests/minimize_window.py
new file mode 100644
index 00000000000..497d967d982
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/minimize_window.py
@@ -0,0 +1,225 @@
+from tests.support.asserts import assert_error, assert_success, assert_dialog_handled
+from tests.support.fixtures import create_dialog
+from tests.support.inline import inline
+
+
+alert_doc = inline("<script>window.alert()</script>")
+
+
+def minimize(session):
+ return session.transport.send("POST", "session/%s/window/minimize" % session.session_id)
+
+
+# 10.7.4 Minimize Window
+
+
+def test_no_browsing_context(session, create_window):
+ """
+ 1. If the current top-level browsing context is no longer open,
+ return error with error code no such window.
+
+ """
+ session.window_handle = create_window()
+ session.close()
+ response = minimize(session)
+ assert_error(response, "no such window")
+
+
+def test_handle_prompt_dismiss_and_notify():
+ """TODO"""
+
+
+def test_handle_prompt_accept_and_notify():
+ """TODO"""
+
+
+def test_handle_prompt_ignore():
+ """TODO"""
+
+
+def test_handle_prompt_accept(new_session):
+ """
+ 2. Handle any user prompts and return its value if it is an error.
+
+ [...]
+
+ In order to handle any user prompts a remote end must take the
+ following steps:
+
+ [...]
+
+ 2. Perform the following substeps based on the current session's
+ user prompt handler:
+
+ [...]
+
+ - accept state
+ Accept the current user prompt.
+
+ """
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+ session.url = inline("<title>WD doc title</title>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+ response = minimize(session)
+ assert response.status == 200
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+ response = minimize(session)
+ assert response.status == 200
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+ response = minimize(session)
+ assert response.status == 200
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_missing_value(session, create_dialog):
+ """
+ 2. Handle any user prompts and return its value if it is an error.
+
+ [...]
+
+ In order to handle any user prompts a remote end must take the
+ following steps:
+
+ [...]
+
+ 2. Perform the following substeps based on the current session's
+ user prompt handler:
+
+ [...]
+
+ - missing value default state
+ 1. Dismiss the current user prompt.
+ 2. Return error with error code unexpected alert open.
+
+ """
+ session.url = inline("<title>WD doc title</title>")
+ create_dialog("alert", text="dismiss #1", result_var="dismiss1")
+
+ response = minimize(session)
+
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
+
+ response = minimize(session)
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
+
+ response = minimize(session)
+ assert_error(response, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_fully_exit_fullscreen(session):
+ """
+ 4. Fully exit fullscreen.
+
+ [...]
+
+ To fully exit fullscreen a document document, run these steps:
+
+ 1. If document's fullscreen element is null, terminate these steps.
+
+ 2. Unfullscreen elements whose fullscreen flag is set, within
+ document's top layer, except for document's fullscreen element.
+
+ 3. Exit fullscreen document.
+
+ """
+ session.window.fullscreen()
+ assert session.execute_script("return window.fullScreen") is True
+
+ response = minimize(session)
+ assert_success(response)
+ assert session.execute_script("return window.fullScreen") is False
+ assert session.execute_script("return document.hidden") is True
+
+
+def test_minimize(session):
+ """
+ 5. Iconify the window.
+
+ [...]
+
+ To iconify the window, given an operating system level window with an
+ associated top-level browsing context, run implementation-specific
+ steps to iconify, minimize, or hide the window from the visible
+ screen. Do not return from this operation until the visibility state
+ of the top-level browsing context's active document has reached the
+ hidden state, or until the operation times out.
+
+ """
+ assert not session.execute_script("return document.hidden")
+
+ response = minimize(session)
+ assert_success(response)
+
+ assert session.execute_script("return document.hidden")
+
+
+def test_payload(session):
+ """
+ 6. Return success with the JSON serialization of the current top-level
+ browsing context's window rect.
+
+ [...]
+
+ A top-level browsing context's window rect is defined as a
+ dictionary of the screenX, screenY, width and height attributes of
+ the WindowProxy. Its JSON representation is the following:
+
+ "x"
+ WindowProxy's screenX attribute.
+
+ "y"
+ WindowProxy's screenY attribute.
+
+ "width"
+ Width of the top-level browsing context's outer dimensions,
+ including any browser chrome and externally drawn window
+ decorations in CSS reference pixels.
+
+ "height"
+ Height of the top-level browsing context's outer dimensions,
+ including any browser chrome and externally drawn window
+ decorations in CSS reference pixels.
+
+ """
+ assert not session.execute_script("return document.hidden")
+
+ response = minimize(session)
+
+ assert response.status == 200
+ assert isinstance(response.body["value"], dict)
+
+ value = response.body["value"]
+ assert "width" in value
+ assert "height" in value
+ assert "x" in value
+ assert "y" in value
+ assert isinstance(value["width"], int)
+ assert isinstance(value["height"], int)
+ assert isinstance(value["x"], int)
+ assert isinstance(value["y"], int)
+
+ assert session.execute_script("return document.hidden")
+
+
+def test_minimize_twice_is_idempotent(session):
+ assert not session.execute_script("return document.hidden")
+
+ first_response = minimize(session)
+ assert_success(first_response)
+ assert session.execute_script("return document.hidden")
+
+ second_response = minimize(session)
+ assert_success(second_response)
+ assert session.execute_script("return document.hidden")
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/navigation/current_url.py b/tests/wpt/web-platform-tests/webdriver/tests/navigation/current_url.py
new file mode 100644
index 00000000000..45e462fb8e1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/navigation/current_url.py
@@ -0,0 +1,102 @@
+import json
+import pytest
+import types
+
+from tests.support.inline import inline
+from tests.support.asserts import assert_error, assert_success
+
+alert_doc = inline("<script>window.alert()</script>")
+frame_doc = inline("<p>frame")
+one_frame_doc = inline("<iframe src='%s'></iframe>" % frame_doc)
+two_frames_doc = inline("<iframe src='%s'></iframe>" % one_frame_doc)
+
+
+# TODO(ato): 7.1 Get
+
+
+def test_get_current_url_no_browsing_context(session, create_window):
+ # 7.2 step 1
+ session.window_handle = create_window()
+ session.close()
+
+ result = session.transport.send("GET", "session/%s/url" % session.session_id)
+
+ assert_error(result, "no such window")
+
+
+def test_get_current_url_alert_prompt(session):
+ # 7.2 step 2
+ session.url = alert_doc
+
+ result = session.transport.send("GET", "session/%s/url" % session.session_id)
+
+ assert_error(result, "unexpected alert open")
+
+def test_get_current_url_matches_location(session):
+ # 7.2 step 3
+ url = session.execute_script("return window.location.href")
+ assert session.url == url
+
+def test_get_current_url_payload(session):
+ # 7.2 step 4-5
+ session.start()
+
+ result = session.transport.send("GET", "session/%s/url" % session.session_id)
+
+ assert result.status == 200
+ assert isinstance(result.body["value"], basestring)
+
+def test_get_current_url_special_pages(session):
+ session.url = "about:blank"
+
+ result = session.transport.send("GET", "session/%s/url" % session.session_id)
+
+ assert_success(result, "about:blank")
+
+# TODO(ato): This test requires modification to pass on Windows
+def test_get_current_url_file_protocol(session):
+ # tests that the browsing context remains the same
+ # when navigated privileged documents
+ session.url = "file:///"
+
+ result = session.transport.send("GET", "session/%s/url" % session.session_id)
+
+ assert_success(result, "file:///")
+
+# TODO(ato): Test for http:// and https:// protocols.
+# We need to expose a fixture for accessing
+# documents served by wptserve in order to test this.
+
+def test_set_malformed_url(session):
+ result = session.transport.send("POST",
+ "session/%s/url" % session.session_id,
+ {"url": "foo"})
+
+ assert_error(result, "invalid argument")
+
+def test_get_current_url_after_modified_location(session):
+ session.execute_script("window.location.href = 'about:blank#wd_test_modification'")
+
+ result = session.transport.send("GET", "session/%s/url" % session.session_id)
+
+ assert_success(result, "about:blank#wd_test_modification")
+
+def test_get_current_url_nested_browsing_context(session, create_frame):
+ session.url = "about:blank#wd_from_within_frame"
+ session.switch_frame(create_frame())
+
+ result = session.transport.send("GET", "session/%s/url" % session.session_id)
+
+ assert_success(result, "about:blank#wd_from_within_frame")
+
+def test_get_current_url_nested_browsing_contexts(session):
+ session.url = two_frames_doc
+ top_level_url = session.url
+
+ outer_frame = session.find.css("iframe", all=False)
+ session.switch_frame(outer_frame)
+
+ inner_frame = session.find.css("iframe", all=False)
+ session.switch_frame(inner_frame)
+
+ assert session.url == top_level_url
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/navigation/get_title.py b/tests/wpt/web-platform-tests/webdriver/tests/navigation/get_title.py
new file mode 100644
index 00000000000..e0f39acebad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/navigation/get_title.py
@@ -0,0 +1,282 @@
+import pytest
+import time
+
+from tests.support.asserts import assert_error, assert_success, assert_dialog_handled
+from tests.support.fixtures import create_dialog
+from tests.support.inline import inline
+
+def read_global(session, name):
+ return session.execute_script("return %s;" % name)
+
+# 1. If the current top-level browsing context is no longer open, return error
+# with error code no such window.
+def test_title_from_closed_context(session, create_window):
+ new_window = create_window()
+ session.window_handle = new_window
+ session.close()
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_error(result, "no such window")
+
+# [...]
+# 2. Handle any user prompts and return its value if it is an error.
+# [...]
+# In order to handle any user prompts a remote end must take the following
+# steps:
+# 2. Run the substeps of the first matching user prompt handler:
+#
+# [...]
+# - dismiss state
+# 1. Dismiss the current user prompt.
+# [...]
+#
+# 3. Return success.
+def test_title_handle_prompt_dismiss(new_session):
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "dismiss"}})
+ session.url = inline("<title>WD doc title</title>")
+
+ expected_title = read_global(session, "document.title")
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, expected_title)
+ assert_dialog_handled(session, "dismiss #1")
+ assert read_global(session, "dismiss1") == None
+
+ expected_title = read_global(session, "document.title")
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, expected_title)
+ assert_dialog_handled(session, "dismiss #2")
+ assert read_global(session, "dismiss2") == None
+
+ expected_title = read_global(session, "document.title")
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, expected_title)
+ assert_dialog_handled(session, "dismiss #3")
+ assert read_global(session, "dismiss3") == None
+
+# [...]
+# 2. Handle any user prompts and return its value if it is an error.
+# [...]
+# In order to handle any user prompts a remote end must take the following
+# steps:
+# 2. Run the substeps of the first matching user prompt handler:
+#
+# [...]
+# - accept state
+# 1. Accept the current user prompt.
+# [...]
+#
+# 3. Return success.
+def test_title_handle_prompt_accept(new_session):
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+ session.url = inline("<title>WD doc title</title>")
+ create_dialog(session)("alert", text="accept #1", result_var="accept1")
+
+ expected_title = read_global(session, "document.title")
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, expected_title)
+ assert_dialog_handled(session, "accept #1")
+ assert read_global(session, "accept1") == None
+
+ expected_title = read_global(session, "document.title")
+ create_dialog(session)("confirm", text="accept #2", result_var="accept2")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, expected_title)
+ assert_dialog_handled(session, "accept #2")
+ assert read_global(session, "accept2"), True
+
+ expected_title = read_global(session, "document.title")
+ create_dialog(session)("prompt", text="accept #3", result_var="accept3")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, expected_title)
+ assert_dialog_handled(session, "accept #3")
+ assert read_global(session, "accept3") == ""
+
+# [...]
+# 2. Handle any user prompts and return its value if it is an error.
+# [...]
+# In order to handle any user prompts a remote end must take the following
+# steps:
+# 2. Run the substeps of the first matching user prompt handler:
+#
+# [...]
+# - missing value default state
+# - not in the table of simple dialogs
+# 1. Dismiss the current user prompt.
+# 2. Return error with error code unexpected alert open.
+def test_title_handle_prompt_missing_value(session, create_dialog):
+ session.url = inline("<title>WD doc title</title>")
+ create_dialog("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #1")
+ assert read_global(session, "dismiss1") == None
+
+ create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #2")
+ assert read_global(session, "dismiss2") == False
+
+ create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #3")
+ assert read_global(session, "dismiss3") == None
+
+# The behavior of the `window.print` function is platform-dependent and may not
+# trigger the creation of a dialog at all. Therefore, this test should only be
+# run in contexts that support the dialog (a condition that may not be
+# determined automatically).
+#def test_title_with_non_simple_dialog(session):
+# document = "<title>With non-simple dialog</title><h2>Hello</h2>"
+# spawn = """
+# var done = arguments[0];
+# setTimeout(function() {
+# done();
+# }, 0);
+# setTimeout(function() {
+# window['print']();
+# }, 0);
+# """
+# session.url = inline(document)
+# session.execute_async_script(spawn)
+#
+# result = session.transport.send("GET",
+# "session/%s/title" % session.session_id)
+# assert_error(result, "unexpected alert open")
+
+# [...]
+# 3. Let title be the initial value of the title IDL attribute of the current
+# top-level browsing context's active document.
+# 4. Return success with data title.
+# [...]
+# The title attribute must, on getting, run the following algorithm:
+# [...]
+# 2. Otherwise, let value be the child text content of the title element [...]
+# [...]
+# 4. Return value.
+def test_title_from_top_context(session):
+ session.url = inline("<title>Foobar</title><h2>Hello</h2>")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+ assert_success(result, read_global(session, "document.title"))
+
+# [...]
+# 3. Let title be the initial value of the title IDL attribute of the current
+# top-level browsing context's active document.
+# 4. Return success with data title.
+# [...]
+# The title attribute must, on getting, run the following algorithm:
+# [...]
+# 2. Otherwise, let value be the child text content of the title element [...]
+#
+# The title element of a document is the first title element in the document
+# (in tree order), if there is one, or null otherwise.
+#
+# [...]
+# 4. Return value.
+def test_title_with_duplicate_element(session):
+ session.url = inline("<title>First</title><title>Second</title>")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, read_global(session, "document.title"))
+
+# [...]
+# 3. Let title be the initial value of the title IDL attribute of the current
+# top-level browsing context's active document.
+# 4. Return success with data title.
+# [...]
+# The title attribute must, on getting, run the following algorithm:
+# [...]
+# 2. Otherwise, let value be the child text content of the title element, or
+# the empty string if the title element is null.
+# [...]
+# 4. Return value.
+def test_title_without_element(session):
+ session.url = inline("<h2>Hello</h2>")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, read_global(session, "document.title"))
+
+# [...]
+# 3. Let title be the initial value of the title IDL attribute of the current
+# top-level browsing context's active document.
+# 4. Return success with data title.
+def test_title_after_modification(session):
+ session.url = inline("<title>Initial</title><h2>Hello</h2>")
+ session.execute_script("document.title = 'updated'")
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, read_global(session, "document.title"))
+
+# [...]
+# 3. Let title be the initial value of the title IDL attribute of the current
+# top-level browsing context's active document.
+# 4. Return success with data title.
+# [...]
+# The title attribute must, on getting, run the following algorithm:
+# [...]
+# 2. Otherwise, let value be the child text content of the title element [...]
+# 3. Strip and collapse ASCII whitespace in value.
+# 4. Return value.
+def test_title_strip_and_collapse(session):
+ document = "<title> a b\tc\nd\t \n e\t\n </title><h2>Hello</h2>"
+ session.url = inline(document)
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, read_global(session, "document.title"))
+
+# [...]
+# 3. Let title be the initial value of the title IDL attribute of the current
+# top-level browsing context's active document.
+# 4. Return success with data title.
+def test_title_from_frame(session, create_frame):
+ session.url = inline("<title>Parent</title>parent")
+
+ session.switch_frame(create_frame())
+ session.switch_frame(create_frame())
+
+ result = session.transport.send("GET",
+ "session/%s/title" % session.session_id)
+
+ assert_success(result, read_global(session, "document.title"))
diff --git a/tests/wpt/web-platform-tests/microdata/encoding-microdata/values/.gitkeep b/tests/wpt/web-platform-tests/webdriver/tests/retrieval/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/encoding-microdata/values/.gitkeep
+++ b/tests/wpt/web-platform-tests/webdriver/tests/retrieval/__init__.py
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element.py b/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element.py
new file mode 100644
index 00000000000..d59c7823421
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element.py
@@ -0,0 +1,59 @@
+import pytest
+
+
+from tests.support.asserts import assert_error, assert_success
+from tests.support.inline import inline
+
+
+def find_element(session, using, value):
+ return session.transport.send("POST",
+ "session/%s/element" % session.session_id,
+ {"using": using, "value": value})
+
+
+# 12.2 Find Element
+
+@pytest.mark.parametrize("using", ["a", True, None, 1, [], {}])
+def test_invalid_using_argument(session, using):
+ # Step 1 - 2
+ response = find_element(session, using, "value")
+ assert_error(response, "invalid argument")
+
+
+@pytest.mark.parametrize("value", [None, [], {}])
+def test_invalid_selector_argument(session, value):
+ # Step 3 - 4
+ response = find_element(session, "css selector", value)
+ assert_error(response, "invalid argument")
+
+
+def test_closed_context(session, create_window):
+ # Step 5
+ new_window = create_window()
+ session.window_handle = new_window
+ session.close()
+
+ response = find_element(session, "css selector", "foo")
+
+ assert_error(response, "no such window")
+
+
+@pytest.mark.parametrize("using,value",
+ [("css selector", "#linkText"),
+ ("link text", "full link text"),
+ ("partial link text", "link text"),
+ ("tag name", "a"),
+ ("xpath", "//a")])
+def test_find_element(session, using, value):
+ # Step 8 - 9
+ session.url = inline("<a href=# id=linkText>full link text</a>")
+
+ response = find_element(session, using, value)
+ assert_success(response)
+
+
+@pytest.mark.parametrize("using,value", [("css selector", "#wontExist")])
+def test_no_element(session, using, value):
+ # Step 8 - 9
+ response = find_element(session, using, value)
+ assert_error(response, "no such element")
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element_from_element.py b/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element_from_element.py
new file mode 100644
index 00000000000..d1d8dd571df
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element_from_element.py
@@ -0,0 +1,59 @@
+import pytest
+
+
+from tests.support.asserts import assert_error, assert_success
+from tests.support.inline import inline
+
+
+def find_element(session, element, using, value):
+ return session.transport.send("POST",
+ "session/%s/element/%s/element" % (session.session_id, element),
+ {"using": using, "value": value})
+
+
+@pytest.mark.parametrize("using", ["a", True, None, 1, [], {}])
+def test_invalid_using_argument(session, using):
+ # Step 1 - 2
+ response = find_element(session, "notReal", using, "value")
+ assert_error(response, "invalid argument")
+
+
+@pytest.mark.parametrize("value", [None, [], {}])
+def test_invalid_selector_argument(session, value):
+ # Step 3 - 4
+ response = find_element(session, "notReal", "css selector", value)
+ assert_error(response, "invalid argument")
+
+
+def test_closed_context(session, create_window):
+ # Step 5
+ new_window = create_window()
+ session.window_handle = new_window
+ session.close()
+
+ response = find_element(session, "notReal", "css selector", "foo")
+
+ assert_error(response, "no such window")
+
+
+@pytest.mark.parametrize("using,value",
+ [("css selector", "#linkText"),
+ ("link text", "full link text"),
+ ("partial link text", "link text"),
+ ("tag name", "a"),
+ ("xpath", "//a")])
+def test_find_element(session, using, value):
+ # Step 8 - 9
+ session.url = inline("<div><a href=# id=linkText>full link text</a></div>")
+ element = session.find.css("div", all=False)
+ response = find_element(session, element.id, using, value)
+ assert_success(response)
+
+
+@pytest.mark.parametrize("using,value",[("css selector", "#wontExist")])
+def test_no_element(session, using, value):
+ # Step 8 - 9
+ session.url = inline("<div></div>")
+ element = session.find.css("div", all=False)
+ response = find_element(session, element.id, using, value)
+ assert_error(response, "no such element")
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element_from_elements.py b/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element_from_elements.py
new file mode 100644
index 00000000000..116f5ddbed4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_element_from_elements.py
@@ -0,0 +1,58 @@
+import pytest
+
+
+from tests.support.asserts import assert_error, assert_success
+from tests.support.inline import inline
+
+
+def find_elements(session, element, using, value):
+ return session.transport.send("POST",
+ "session/%s/element/%s/elements" % (session.session_id, element),
+ {"using": using, "value": value})
+
+@pytest.mark.parametrize("using", [("a"), (True), (None), (1), ([]), ({})])
+def test_invalid_using_argument(session, using):
+ # Step 1 - 2
+ response = find_elements(session, "notReal", using, "value")
+ assert_error(response, "invalid argument")
+
+
+@pytest.mark.parametrize("value", [None, [], {}])
+def test_invalid_selector_argument(session, value):
+ # Step 3 - 4
+ response = find_elements(session, "notReal", "css selector", value)
+ assert_error(response, "invalid argument")
+
+
+def test_closed_context(session, create_window):
+ # Step 5
+ new_window = create_window()
+ session.window_handle = new_window
+ session.close()
+
+ response = find_elements(session, "notReal", "css selector", "foo")
+
+ assert_error(response, "no such window")
+
+
+@pytest.mark.parametrize("using,value",
+ [("css selector", "#linkText"),
+ ("link text", "full link text"),
+ ("partial link text", "link text"),
+ ("tag name", "a"),
+ ("xpath", "//a")])
+def test_find_elements(session, using, value):
+ # Step 8 - 9
+ session.url = inline("<div><a href=# id=linkText>full link text</a></div>")
+ element = session.find.css("div", all=False)
+ response = find_elements(session, element.id, using, value)
+ assert_success(response)
+
+
+@pytest.mark.parametrize("using,value", [("css selector", "#wontExist")])
+def test_no_element(session, using, value):
+ # Step 8 - 9
+ session.url = inline("<div></div>")
+ element = session.find.css("div", all=False)
+ response = find_elements(session, element.id, using, value)
+ assert response.body["value"] == []
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_elements.py b/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_elements.py
new file mode 100644
index 00000000000..3812694f9f6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/retrieval/find_elements.py
@@ -0,0 +1,60 @@
+import pytest
+
+from tests.support.asserts import assert_error, assert_success
+from tests.support.inline import inline
+
+
+def find_elements(session, using, value):
+ return session.transport.send("POST",
+ "session/%s/elements" % session.session_id,
+ {"using": using, "value": value})
+
+
+@pytest.mark.parametrize("using", ["a", True, None, 1, [], {}])
+def test_invalid_using_argument(session, using):
+ # Step 1 - 2
+ response = find_elements(session, using, "value")
+ assert_error(response, "invalid argument")
+
+
+@pytest.mark.parametrize("value", [None, [], {}])
+def test_invalid_selector_argument(session, value):
+ # Step 3 - 4
+ response = find_elements(session, "css selector", value)
+ assert_error(response, "invalid argument")
+
+
+def test_closed_context(session, create_window):
+ # Step 5
+ new_window = create_window()
+ session.window_handle = new_window
+ session.close()
+
+ response = session.transport.send("POST",
+ "session/%s/elements" % session.session_id,
+ {"using": "css selector", "value": "foo"})
+
+ assert_error(response, "no such window")
+
+
+@pytest.mark.parametrize("using,value",
+ [("css selector", "#linkText"),
+ ("link text", "full link text"),
+ ("partial link text", "link text"),
+ ("tag name", "a"),
+ ("xpath", "//a")])
+def test_find_elements(session, using, value):
+ # Step 8 - 9
+ session.url = inline("<a href=# id=linkText>full link text</a>")
+
+ response = find_elements(session, using, value)
+ assert_success(response)
+ assert len(response.body["value"]) == 1
+
+
+@pytest.mark.parametrize("using,value", [("css selector", "#wontExist")])
+def test_no_element(session, using, value):
+ # Step 8 - 9
+ response = find_elements(session, using, value)
+ assert_success(response)
+ assert response.body["value"] == []
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/sessions/get_timeouts.py b/tests/wpt/web-platform-tests/webdriver/tests/sessions/get_timeouts.py
new file mode 100644
index 00000000000..96767e98121
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/sessions/get_timeouts.py
@@ -0,0 +1,46 @@
+from tests.support.asserts import assert_success
+
+
+def get_timeouts(session):
+ return session.transport.send("GET", "session/{session_id}/timeouts"
+ .format(session_id=session.session_id))
+
+
+# 8.4 Get Timeouts
+
+def test_get_timeouts(session):
+ # 8.4 step 1
+ response = get_timeouts(session)
+
+ assert_success(response)
+ assert "value" in response.body
+ assert isinstance(response.body["value"], dict)
+
+ value = response.body["value"]
+ assert "script" in value
+ assert "implicit" in value
+ assert "pageLoad" in value
+
+ assert isinstance(value["script"], int)
+ assert isinstance(value["implicit"], int)
+ assert isinstance(value["pageLoad"], int)
+
+
+def test_get_default_timeouts(session):
+ response = get_timeouts(session)
+
+ assert_success(response)
+ assert response.body["value"]["script"] == 30000
+ assert response.body["value"]["implicit"] == 0
+ assert response.body["value"]["pageLoad"] == 300000
+
+
+def test_get_new_timeouts(session):
+ session.timeouts.script = 60
+ session.timeouts.implicit = 1
+ session.timeouts.page_load = 200
+ response = get_timeouts(session)
+ assert_success(response)
+ assert response.body["value"]["script"] == 60000
+ assert response.body["value"]["implicit"] == 1000
+ assert response.body["value"]["pageLoad"] == 200000
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/conftest.py b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/conftest.py
new file mode 100644
index 00000000000..d3ee199fb28
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/conftest.py
@@ -0,0 +1,22 @@
+import pytest
+import sys
+
+import webdriver
+
+
+def product(a, b):
+ return [(a, item) for item in b]
+
+
+def flatten(l):
+ return [item for x in l for item in x]
+
+@pytest.fixture(scope="session")
+def platform_name():
+ return {
+ "linux2": "linux",
+ "win32": "windows",
+ "cygwin": "windows",
+ "darwin": "mac"
+ }.get(sys.platform)
+
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/create.py b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/create.py
new file mode 100644
index 00000000000..5766dbda8fd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/create.py
@@ -0,0 +1,27 @@
+#META: timeout=long
+
+import pytest
+
+from conftest import product, flatten
+
+
+# Note that we can only test things here all implementations must support
+valid_data = [
+ ("acceptInsecureCerts", [False, None]),
+ ("browserName", [None]),
+ ("browserVersion", [None]),
+ ("platformName", [None]),
+ ("pageLoadStrategy", ["none", "eager", "normal", None]),
+ ("proxy", [None]),
+ ("unhandledPromptBehavior", ["dismiss", "accept", None]),
+ ("test:extension", [True, "abc", 123, [], {"key": "value"}, None]),
+]
+
+
+@pytest.mark.parametrize("body", [lambda key, value: {"alwaysMatch": {key: value}},
+ lambda key, value: {"firstMatch": [{key: value}]}])
+@pytest.mark.parametrize("key,value", flatten(product(*item) for item in valid_data))
+def test_valid(new_session, body, key, value):
+ resp = new_session({"capabilities": body(key, value)})
+
+# Continued in create-1.py to avoid timeouts
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/default_values.py b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/default_values.py
new file mode 100644
index 00000000000..bfe4144f5a3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/default_values.py
@@ -0,0 +1,48 @@
+# META: timeout=long
+
+import uuid
+
+import pytest
+
+from webdriver import error
+
+
+def test_basic(new_session):
+ resp, _ = new_session({"capabilities": {}})
+ assert set(resp.keys()) == {"sessionId", "capabilities"}
+
+
+def test_repeat_new_session(new_session):
+ resp, _ = new_session({"capabilities": {}})
+ with pytest.raises(error.SessionNotCreatedException):
+ new_session({"capabilities": {}})
+
+
+def test_no_capabilites(new_session):
+ with pytest.raises(error.InvalidArgumentException):
+ new_session({})
+
+
+def test_missing_first_match(new_session):
+ resp, _ = new_session({"capabilities": {"alwaysMatch": {}}})
+
+
+def test_missing_always_match(new_session):
+ resp, _ = new_session({"capabilities": {"firstMatch": [{}]}})
+
+
+def test_desired(new_session):
+ with pytest.raises(error.InvalidArgumentException):
+ resp, _ = new_session({"desiredCapbilities": {}})
+
+
+def test_ignore_non_spec_fields_in_capabilities(new_session):
+ resp, _ = new_session({"capabilities": {"desiredCapbilities": {"pageLoadStrategy": "eager"}}})
+ assert resp["capabilities"]["pageLoadStrategy"] == "normal"
+
+
+def test_valid_but_unmatchable_key(new_session):
+ resp, _ = new_session({"capabilities": {
+ "firstMatch": [{"pageLoadStrategy": "eager", "foo:unmatchable": True},
+ {"pageLoadStrategy": "none"}]}})
+ assert resp["capabilities"]["pageLoadStrategy"] == "none"
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/invalid_capabilities.py b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/invalid_capabilities.py
new file mode 100644
index 00000000000..325c9b281af
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/invalid_capabilities.py
@@ -0,0 +1,88 @@
+#META: timeout=long
+
+import pytest
+from webdriver import error
+
+from conftest import product, flatten
+
+
+@pytest.mark.parametrize("value", [None, 1, "{}", []])
+def test_invalid_capabilites(new_session, value):
+ with pytest.raises(error.InvalidArgumentException):
+ new_session({"capabilities": value})
+
+
+@pytest.mark.parametrize("value", [None, 1, "{}", []])
+def test_invalid_always_match(new_session, value):
+ with pytest.raises(error.InvalidArgumentException):
+ new_session({"capabilities": {"alwaysMatch": value}})
+
+
+@pytest.mark.parametrize("value", [None, 1, "[]", {}])
+def test_invalid_first_match(new_session, value):
+ with pytest.raises(error.InvalidArgumentException):
+ new_session({"capabilities": {"firstMatch": value}})
+
+
+invalid_data = [
+ ("acceptInsecureCerts", [1, [], {}, "false"]),
+ ("browserName", [1, [], {}, False]),
+ ("browserVersion", [1, [], {}, False]),
+ ("platformName", [1, [], {}, False]),
+ ("pageLoadStrategy", [1, [], {}, False, "invalid", "NONE", "Eager", "eagerblah", "interactive",
+ " eager", "eager "]),
+ ("proxy", [1, [], "{}", {"proxyType": "SYSTEM"}, {"proxyType": "systemSomething"},
+ {"proxy type": "pac"}, {"proxy-Type": "system"}, {"proxy_type": "system"},
+ {"proxytype": "system"}, {"PROXYTYPE": "system"}, {"proxyType": None},
+ {"proxyType": 1}, {"proxyType": []}, {"proxyType": {"value": "system"}},
+ {" proxyType": "system"}, {"proxyType ": "system"}, {"proxyType ": " system"},
+ {"proxyType": "system "}]),
+ ("timeouts", [1, [], "{}", {}, False, {"pageLOAD": 10}, {"page load": 10},
+ {"page load": 10}, {"pageLoad": "10"}, {"pageLoad": {"value": 10}},
+ {"invalid": 10}, {"pageLoad": -1}, {"pageLoad": 2**64},
+ {"pageLoad": None}, {"pageLoad": 1.1}, {"pageLoad": 10, "invalid": 10},
+ {" pageLoad": 10}, {"pageLoad ": 10}]),
+ ("unhandledPromptBehavior", [1, [], {}, False, "DISMISS", "dismissABC", "Accept",
+ " dismiss", "dismiss "])
+]
+
+@pytest.mark.parametrize("body", [lambda key, value: {"alwaysMatch": {key: value}},
+ lambda key, value: {"firstMatch": [{key: value}]}])
+@pytest.mark.parametrize("key,value", flatten(product(*item) for item in invalid_data))
+def test_invalid(new_session, body, key, value):
+ with pytest.raises(error.InvalidArgumentException):
+ resp = new_session({"capabilities": body(key, value)})
+
+
+invalid_extensions = [
+ "firefox",
+ "firefox_binary",
+ "firefoxOptions",
+ "chromeOptions",
+ "automaticInspection",
+ "automaticProfiling",
+ "platform",
+ "version",
+ "browser",
+ "platformVersion",
+ "javascriptEnabled",
+ "nativeEvents",
+ "seleniumProtocol",
+ "profile",
+ "trustAllSSLCertificates",
+ "initialBrowserUrl",
+ "requireWindowFocus",
+ "logFile",
+ "logLevel",
+ "safari.options",
+ "ensureCleanSession",
+]
+
+
+@pytest.mark.parametrize("body", [lambda key, value: {"alwaysMatch": {key: value}},
+ lambda key, value: {"firstMatch": [{key: value}]}])
+@pytest.mark.parametrize("key", invalid_extensions)
+def test_invalid(new_session, body, key):
+ with pytest.raises(error.InvalidArgumentException):
+ resp = new_session({"capabilities": body(key, {})})
+
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/merge.py b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/merge.py
new file mode 100644
index 00000000000..2e64620455c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/merge.py
@@ -0,0 +1,76 @@
+#META: timeout=long
+
+import pytest
+from webdriver import error
+
+from conftest import platform_name
+
+
+@pytest.mark.skipif(platform_name() is None, reason="Unsupported platform")
+@pytest.mark.parametrize("body", [lambda key, value: {"alwaysMatch": {key: value}},
+ lambda key, value: {"firstMatch": [{key: value}]}])
+def test_platform_name(new_session, platform_name, body):
+ resp, _ = new_session({"capabilities": body("platformName", platform_name)})
+ assert resp["capabilities"]["platformName"] == platform_name
+
+
+invalid_merge = [
+ ("acceptInsecureCerts", (True, True)),
+ ("unhandledPromptBehavior", ("accept", "accept")),
+ ("unhandledPromptBehavior", ("accept", "dismiss")),
+ ("timeouts", ({"script": 10}, {"script": 10})),
+ ("timeouts", ({"script": 10}, {"pageLoad": 10})),
+]
+
+
+@pytest.mark.parametrize("key,value", invalid_merge)
+def test_merge_invalid(new_session, key, value):
+ with pytest.raises(error.InvalidArgumentException):
+ new_session({"capabilities":
+ {"alwaysMatch": {key: value[0]},
+ "firstMatch": [{}, {key: value[1]}]}})
+
+
+@pytest.mark.skipif(platform_name() is None, reason="Unsupported platform")
+def test_merge_platformName(new_session, platform_name):
+ resp, _ = new_session({"capabilities":
+ {"alwaysMatch": {"timeouts": {"script": 10}}},
+ "firstMatch": [
+ {
+ "platformName": platform_name.upper(),
+ "pageLoadStrategy": "none"
+ },
+ {
+ "platformName": platform_name,
+ "pageLoadStrategy": "eager"
+ }
+ ]})
+
+ assert resp["capabilities"]["platformName"] == platform_name
+ assert resp["capabilities"]["pageLoadStrategy"] == "eager"
+
+
+def test_merge_browserName(new_session):
+ resp, session = new_session({})
+ browser_settings = {
+ "browserName": resp["capabilities"]["browserName"],
+ "browserVersion": resp["capabilities"]["browserVersion"],
+ "platformName": resp["capabilities"]["platformName"]
+ }
+ session.end()
+
+ resp, _ = new_session({"capabilities":
+ {"alwaysMatch": {"timeouts": {"script": 10}}},
+ "firstMatch": [
+ {
+ "browserName": browser_settings["browserName"] + "invalid",
+ "pageLoadStrategy": "none"
+ },
+ {
+ "browserName": browser_settings["browserName"],
+ "pageLoadStrategy": "eager"
+ }
+ ]})
+
+ assert resp["capabilities"]["browserName"] == browser_settings['browserName']
+ assert resp["capabilities"]["pageLoadStrategy"] == "eager"
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/response.py b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/response.py
new file mode 100644
index 00000000000..6669573ba2c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/sessions/new_session/response.py
@@ -0,0 +1,54 @@
+# META: timeout=long
+
+import uuid
+
+def test_resp_sessionid(new_session):
+ resp, _ = new_session({"capabilities": {}})
+ assert isinstance(resp["sessionId"], unicode)
+ uuid.UUID(hex=resp["sessionId"])
+
+
+def test_resp_capabilites(new_session):
+ resp, _ = new_session({"capabilities": {}})
+ assert isinstance(resp["sessionId"], unicode)
+ assert isinstance(resp["capabilities"], dict)
+ assert {"browserName",
+ "browserVersion",
+ "platformName",
+ "acceptInsecureCerts",
+ "setWindowRect",
+ "timeouts",
+ "proxy",
+ "pageLoadStrategy"}.issubset(
+ set(resp["capabilities"].keys()))
+
+
+def test_resp_data(new_session, platform_name):
+ resp, _ = new_session({"capabilities": {}})
+
+ assert isinstance(resp["capabilities"]["browserName"], unicode)
+ assert isinstance(resp["capabilities"]["browserVersion"], unicode)
+ if platform_name:
+ assert resp["capabilities"]["platformName"] == platform_name
+ else:
+ assert "platformName" in resp["capabilities"]
+ assert resp["capabilities"]["acceptInsecureCerts"] is False
+ assert isinstance(resp["capabilities"]["setWindowRect"], bool)
+ assert resp["capabilities"]["timeouts"]["implicit"] == 0
+ assert resp["capabilities"]["timeouts"]["pageLoad"] == 300000
+ assert resp["capabilities"]["timeouts"]["script"] == 30000
+ assert resp["capabilities"]["proxy"] == {}
+ assert resp["capabilities"]["pageLoadStrategy"] == "normal"
+
+
+def test_timeouts(new_session, platform_name):
+ resp, _ = new_session({"capabilities": {"alwaysMatch": {"timeouts": {"implicit": 1000}}}})
+ assert resp["capabilities"]["timeouts"] == {
+ "implicit": 1000,
+ "pageLoad": 300000,
+ "script": 30000
+ }
+
+def test_pageLoadStrategy(new_session, platform_name):
+ resp, _ = new_session({"capabilities": {"alwaysMatch": {"pageLoadStrategy": "eager"}}})
+ assert resp["capabilities"]["pageLoadStrategy"] == "eager"
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/set_window_rect.py b/tests/wpt/web-platform-tests/webdriver/tests/set_window_rect.py
new file mode 100644
index 00000000000..b300d09d111
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/set_window_rect.py
@@ -0,0 +1,506 @@
+# META: timeout=long
+
+import pytest
+
+from tests.support.asserts import assert_error, assert_dialog_handled, assert_success
+from tests.support.fixtures import create_dialog
+from tests.support.inline import inline
+
+
+alert_doc = inline("<script>window.alert()</script>")
+
+
+def set_window_rect(session, rect):
+ return session.transport.send("POST", "session/%s/window/rect" % session.session_id, rect)
+
+
+# 10.7.2 Set Window Rect
+
+
+def test_current_top_level_browsing_context_no_longer_open(session, create_window):
+ """
+ 1. If the current top-level browsing context is no longer open,
+ return error with error code no such window.
+
+ """
+ session.window_handle = create_window()
+ session.close()
+ response = set_window_rect(session, {})
+ assert_error(response, "no such window")
+
+
+def test_handle_prompt_dismiss():
+ """TODO"""
+
+
+def test_handle_prompt_accept(new_session):
+ """
+ 2. Handle any user prompts and return its value if it is an error.
+
+ [...]
+
+ In order to handle any user prompts a remote end must take the
+ following steps:
+
+ [...]
+
+ 2. Perform the following substeps based on the current session's
+ user prompt handler:
+
+ [...]
+
+ - accept state
+ Accept the current user prompt.
+
+ """
+ _, session = new_session(
+ {"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+ original = session.window.rect
+
+ # step 2
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+ result = set_window_rect(session, {"x": original["x"],
+ "y": original["y"]})
+ assert result.status == 200
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+ result = set_window_rect(session, {"x": original["x"],
+ "y": original["y"]})
+ assert result.status == 200
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+ result = set_window_rect(session, {"x": original["x"],
+ "y": original["y"]})
+ assert_success(result)
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_dismiss_and_notify():
+ """TODO"""
+
+
+def test_handle_prompt_accept_and_notify():
+ """TODO"""
+
+
+def test_handle_prompt_ignore():
+ """TODO"""
+
+
+def test_handle_prompt_missing_value(session, create_dialog):
+ """
+ 2. Handle any user prompts and return its value if it is an error.
+
+ [...]
+
+ In order to handle any user prompts a remote end must take the
+ following steps:
+
+ [...]
+
+ 2. Perform the following substeps based on the current session's
+ user prompt handler:
+
+ [...]
+
+ - missing value default state
+ 1. Dismiss the current user prompt.
+ 2. Return error with error code unexpected alert open.
+
+ """
+
+ original = session.window.rect
+
+ # step 2
+ create_dialog("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = set_window_rect(session, {"x": original["x"],
+ "y": original["y"]})
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = set_window_rect(session, {"x": original["x"],
+ "y": original["y"]})
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = set_window_rect(session, {"x": original["x"],
+ "y": original["y"]})
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+@pytest.mark.parametrize("rect", [
+ {"width": "a"},
+ {"height": "b"},
+ {"width": "a", "height": "b"},
+ {"x": "a"},
+ {"y": "b"},
+ {"x": "a", "y": "b"},
+ {"width": "a", "height": "b", "x": "a", "y": "b"},
+
+ {"width": True},
+ {"height": False},
+ {"width": True, "height": False},
+ {"x": True},
+ {"y": False},
+ {"x": True, "y": False},
+ {"width": True, "height": False, "x": True, "y": False},
+
+ {"width": []},
+ {"height": []},
+ {"width": [], "height": []},
+ {"x": []},
+ {"y": []},
+ {"x": [], "y": []},
+ {"width": [], "height": [], "x": [], "y": []},
+
+ {"height": {}},
+ {"width": {}},
+ {"height": {}, "width": {}},
+ {"x": {}},
+ {"y": {}},
+ {"x": {}, "y": {}},
+ {"width": {}, "height": {}, "x": {}, "y": {}},
+])
+def test_invalid_types(session, rect):
+ """
+ 8. If width or height is neither null nor a Number from 0 to 2^31 -
+ 1, return error with error code invalid argument.
+
+ 9. If x or y is neither null nor a Number from -(2^31) to 2^31 - 1,
+ return error with error code invalid argument.
+ """
+ response = set_window_rect(session, rect)
+ assert_error(response, "invalid argument")
+
+
+@pytest.mark.parametrize("rect", [
+ {"width": -1},
+ {"height": -2},
+ {"width": -1, "height": -2},
+])
+def test_out_of_bounds(session, rect):
+ """
+ 8. If width or height is neither null nor a Number from 0 to 2^31 -
+ 1, return error with error code invalid argument.
+
+ 9. If x or y is neither null nor a Number from -(2^31) to 2^31 - 1,
+ return error with error code invalid argument.
+ """
+ response = set_window_rect(session, rect)
+ assert_error(response, "invalid argument")
+
+
+def test_width_height_floats(session):
+ """
+ 8. If width or height is neither null nor a Number from 0 to 2^31 -
+ 1, return error with error code invalid argument.
+ """
+
+ response = set_window_rect(session, {"width": 500.5, "height": 420})
+ value = assert_success(response)
+ assert value["width"] == 500
+ assert value["height"] == 420
+
+ response = set_window_rect(session, {"width": 500, "height": 450.5})
+ value = assert_success(response)
+ assert value["width"] == 500
+ assert value["height"] == 450
+
+
+def test_x_y_floats(session):
+ """
+ 9. If x or y is neither null nor a Number from -(2^31) to 2^31 - 1,
+ return error with error code invalid argument.
+ """
+
+ response = set_window_rect(session, {"x": 0.5, "y": 420})
+ value = assert_success(response)
+ assert value["x"] == 0
+ assert value["y"] == 420
+
+ response = set_window_rect(session, {"x": 100, "y": 450.5})
+ value = assert_success(response)
+ assert value["x"] == 100
+ assert value["y"] == 450
+
+
+@pytest.mark.parametrize("rect", [
+ {},
+
+ {"width": None},
+ {"height": None},
+ {"width": None, "height": None},
+
+ {"x": None},
+ {"y": None},
+ {"x": None, "y": None},
+
+ {"width": None, "x": None},
+ {"width": None, "y": None},
+ {"height": None, "x": None},
+ {"height": None, "Y": None},
+
+ {"width": None, "height": None, "x": None, "y": None},
+
+ {"width": 200},
+ {"height": 200},
+ {"x": 200},
+ {"y": 200},
+ {"width": 200, "x": 200},
+ {"height": 200, "x": 200},
+ {"width": 200, "y": 200},
+ {"height": 200, "y": 200},
+])
+def test_no_change(session, rect):
+ """
+ 13. If width and height are not null:
+
+ [...]
+
+ 14. If x and y are not null:
+
+ [...]
+
+ 15. Return success with the JSON serialization of the current
+ top-level browsing context's window rect.
+ """
+
+ original = session.window.rect
+ response = set_window_rect(session, rect)
+ assert_success(response, original)
+
+
+def test_fully_exit_fullscreen(session):
+ """
+ 10. Fully exit fullscreen.
+
+ [...]
+
+ To fully exit fullscreen a document document, run these steps:
+
+ 1. If document's fullscreen element is null, terminate these steps.
+
+ 2. Unfullscreen elements whose fullscreen flag is set, within
+ document's top layer, except for document's fullscreen element.
+
+ 3. Exit fullscreen document.
+ """
+ session.window.fullscreen()
+ assert session.execute_script("return window.fullScreen") is True
+
+ response = set_window_rect(session, {"width": 400, "height": 400})
+ value = assert_success(response)
+ assert value["width"] == 400
+ assert value["height"] == 400
+
+ assert session.execute_script("return window.fullScreen") is False
+
+
+def test_restore_from_minimized(session):
+ """
+ 12. If the visibility state of the top-level browsing context's
+ active document is hidden, restore the window.
+
+ [...]
+
+ To restore the window, given an operating system level window with
+ an associated top-level browsing context, run implementation-specific
+ steps to restore or unhide the window to the visible screen. Do not
+ return from this operation until the visibility state of the top-level
+ browsing context's active document has reached the visible state,
+ or until the operation times out.
+ """
+
+ session.window.minimize()
+ assert session.execute_script("return document.hidden") is True
+
+ response = set_window_rect(session, {"width": 450, "height": 450})
+ value = assert_success(response)
+ assert value["width"] == 450
+ assert value["height"] == 450
+
+ assert session.execute_script("return document.hidden") is False
+
+
+def test_restore_from_maximized(session):
+ """
+ 12. If the visibility state of the top-level browsing context's
+ active document is hidden, restore the window.
+
+ [...]
+
+ To restore the window, given an operating system level window with
+ an associated top-level browsing context, run implementation-specific
+ steps to restore or unhide the window to the visible screen. Do not
+ return from this operation until the visibility state of the top-level
+ browsing context's active document has reached the visible state,
+ or until the operation times out.
+ """
+
+ original_size = session.window.size
+ session.window.maximize()
+ assert session.window.size != original_size
+
+ response = set_window_rect(session, {"width": 400, "height": 400})
+ value = assert_success(response)
+ assert value["width"] == 400
+ assert value["height"] == 400
+
+
+def test_height_width(session):
+ original = session.window.rect
+ max = session.execute_script("""
+ return {
+ width: window.screen.availWidth,
+ height: window.screen.availHeight,
+ }""")
+
+ # step 12
+ response = set_window_rect(session, {"width": max["width"] - 100,
+ "height": max["height"] - 100})
+
+ # step 14
+ assert_success(response, {"x": original["x"],
+ "y": original["y"],
+ "width": max["width"] - 100,
+ "height": max["height"] - 100})
+
+
+def test_height_width_larger_than_max(session):
+ max = session.execute_script("""
+ return {
+ width: window.screen.availWidth,
+ height: window.screen.availHeight,
+ }""")
+
+ # step 12
+ response = set_window_rect(session, {"width": max["width"] + 100,
+ "height": max["height"] + 100})
+
+ # step 14
+ rect = assert_success(response)
+ assert rect["width"] >= max["width"]
+ assert rect["height"] >= max["height"]
+
+
+def test_height_width_as_current(session):
+ original = session.window.rect
+
+ # step 12
+ response = set_window_rect(session, {"width": original["width"],
+ "height": original["height"]})
+
+ # step 14
+ assert_success(response, {"x": original["x"],
+ "y": original["y"],
+ "width": original["width"],
+ "height": original["height"]})
+
+
+def test_x_y(session):
+ original = session.window.rect
+
+ # step 13
+ response = set_window_rect(session, {"x": original["x"] + 10,
+ "y": original["y"] + 10})
+
+ # step 14
+ assert_success(response, {"x": original["x"] + 10,
+ "y": original["y"] + 10,
+ "width": original["width"],
+ "height": original["height"]})
+
+
+def test_negative_x_y(session):
+ original = session.window.rect
+
+ # step 13
+ response = set_window_rect(session, {"x": - 8, "y": - 8})
+
+ # step 14
+ os = session.capabilities["platformName"]
+ # certain WMs prohibit windows from being moved off-screen
+ if os == "linux":
+ rect = assert_success(response)
+ assert rect["x"] <= 0
+ assert rect["y"] <= 0
+ assert rect["width"] == original["width"]
+ assert rect["height"] == original["height"]
+
+ # On macOS, windows can only be moved off the screen on the
+ # horizontal axis. The system menu bar also blocks windows from
+ # being moved to (0,0).
+ elif os == "darwin":
+ assert_success(response, {"x": -8,
+ "y": 23,
+ "width": original["width"],
+ "height": original["height"]})
+
+ # It turns out that Windows is the only platform on which the
+ # window can be reliably positioned off-screen.
+ elif os == "windows_nt":
+ assert_success(response, {"x": -8,
+ "y": -8,
+ "width": original["width"],
+ "height": original["height"]})
+
+
+def test_move_to_same_position(session):
+ original_position = session.window.position
+ position = session.window.position = original_position
+ assert position == original_position
+
+
+def test_move_to_same_x(session):
+ original_x = session.window.position[0]
+ position = session.window.position = (original_x, 345)
+ assert position == (original_x, 345)
+
+
+def test_move_to_same_y(session):
+ original_y = session.window.position[1]
+ position = session.window.position = (456, original_y)
+ assert position == (456, original_y)
+
+
+def test_resize_to_same_size(session):
+ original_size = session.window.size
+ size = session.window.size = original_size
+ assert size == original_size
+
+
+def test_resize_to_same_width(session):
+ original_width = session.window.size[0]
+ size = session.window.size = (original_width, 345)
+ assert size == (original_width, 345)
+
+
+def test_resize_to_same_height(session):
+ original_height = session.window.size[1]
+ size = session.window.size = (456, original_height)
+ assert size == (456, original_height)
+
+
+def test_payload(session):
+ # step 14
+ response = set_window_rect(session, {"x": 400, "y": 400})
+
+ assert response.status == 200
+ assert isinstance(response.body["value"], dict)
+ value = response.body["value"]
+ assert "width" in value
+ assert "height" in value
+ assert "x" in value
+ assert "y" in value
+ assert isinstance(value["width"], int)
+ assert isinstance(value["height"], int)
+ assert isinstance(value["x"], int)
+ assert isinstance(value["y"], int)
diff --git a/tests/wpt/web-platform-tests/microdata/iana/.gitkeep b/tests/wpt/web-platform-tests/webdriver/tests/state/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/iana/.gitkeep
+++ b/tests/wpt/web-platform-tests/webdriver/tests/state/__init__.py
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/state/get_element_attribute.py b/tests/wpt/web-platform-tests/webdriver/tests/state/get_element_attribute.py
new file mode 100644
index 00000000000..e662d95a9c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/state/get_element_attribute.py
@@ -0,0 +1,192 @@
+import pytest
+
+from tests.support.asserts import assert_error, assert_success, assert_dialog_handled
+from tests.support.fixtures import create_dialog
+from tests.support.inline import inline
+
+
+def get_attribute(session, element, attr):
+ return session.transport.send("GET", "session/{session_id}/element/{element_id}/attribute/{attr}"
+ .format(session_id=session.session_id,
+ element_id=element,
+ attr=attr))
+
+
+# 13.2 Get Element Attribute
+
+def test_no_browsing_context(session, create_window):
+ # 13.2 step 1
+ session.window_handle = create_window()
+ session.close()
+
+ result = get_attribute(session, "foo", "id")
+
+ assert_error(result, "no such window")
+
+
+def test_handle_prompt_dismiss(new_session):
+ # 13.2 step 2
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "dismiss"}})
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = get_attribute(session, "foo", "id")
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = get_attribute(session, "foo", "id")
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = get_attribute(session, "foo", "id")
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_accept(new_session):
+ # 13.2 step 2
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = get_attribute(session, "foo", "id")
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = get_attribute(session, "foo", "id")
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = get_attribute(session, "foo", "id")
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_missing_value(session, create_dialog):
+ # 13.2 step 2
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = get_attribute(session, "foo", "id")
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = get_attribute(session, "foo", "id")
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = get_attribute(session, "foo", "id")
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_element_not_found(session):
+ # 13.2 Step 3
+ result = get_attribute(session, "foo", "id")
+
+ assert_error(result, "no such element")
+
+
+def test_element_stale(session):
+ # 13.2 step 4
+ session.url = inline("<input id=foo>")
+ element = session.find.css("input", all=False)
+ session.refresh()
+ result = get_attribute(session, element.id, "id")
+
+ assert_error(result, "stale element reference")
+
+
+def test_normal(session):
+ # 13.2 Step 5
+ session.url = inline("<input type=checkbox>")
+ element = session.find.css("input", all=False)
+ result = get_attribute(session, element.id, "input")
+ assert_success(result, None)
+ assert False == session.execute_script("return document.querySelector('input').checked")
+
+ # Check we are not returning the property which will have a different value
+ element.click()
+ assert True == session.execute_script("return document.querySelector('input').checked")
+ result = get_attribute(session, element.id, "input")
+ assert_success(result, None)
+
+
+@pytest.mark.parametrize("tag,attrs", [
+ ("audio", ["autoplay", "controls", "loop", "muted"]),
+ ("button", ["autofocus", "disabled", "formnovalidate"]),
+ ("details", ["open"]),
+ ("dialog", ["open"]),
+ ("fieldset", ["disabled"]),
+ ("form", ["novalidate"]),
+ ("iframe", ["allowfullscreen"]),
+ ("img", ["ismap"]),
+ ("input", ["autofocus", "checked", "disabled", "formnovalidate", "multiple", "readonly", "required"]),
+ ("menuitem", ["checked", "default", "disabled"]),
+ ("object", ["typemustmatch"]),
+ ("ol", ["reversed"]),
+ ("optgroup", ["disabled"]),
+ ("option", ["disabled", "selected"]),
+ ("script", ["async", "defer"]),
+ ("select", ["autofocus", "disabled", "multiple", "required"]),
+ ("textarea", ["autofocus", "disabled", "readonly", "required"]),
+ ("track", ["default"]),
+ ("video", ["autoplay", "controls", "loop", "muted"])
+])
+def test_boolean_attribute(session, tag, attrs):
+ # 13.2 Step 5
+ for attr in attrs:
+ session.url = inline("<{0} {1}>".format(tag, attr))
+
+ element = session.find.css(tag, all=False)
+ result = result = get_attribute(session, element.id, attr)
+ assert_success(result, "true")
+
+
+def test_global_boolean_attributes(session):
+ # 13.2 Step 5
+ session.url = inline("<p hidden>foo")
+ element = session.find.css("p", all=False)
+ result = result = get_attribute(session, element.id, "hidden")
+
+ assert_success(result, "true")
+
+ session.url = inline("<p>foo")
+ element = session.find.css("p", all=False)
+ result = result = get_attribute(session, element.id, "hidden")
+ assert_success(result, None)
+
+ session.url = inline("<p itemscope>foo")
+ element = session.find.css("p", all=False)
+ result = result = get_attribute(session, element.id, "itemscope")
+
+ assert_success(result, "true")
+
+ session.url = inline("<p>foo")
+ element = session.find.css("p", all=False)
+ result = result = get_attribute(session, element.id, "itemscope")
+ assert_success(result, None)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/state/get_element_property.py b/tests/wpt/web-platform-tests/webdriver/tests/state/get_element_property.py
new file mode 100644
index 00000000000..00a85af69b5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/state/get_element_property.py
@@ -0,0 +1,164 @@
+from tests.support.asserts import assert_error, assert_dialog_handled, assert_success
+from tests.support.inline import inline
+from tests.support.fixtures import create_dialog
+
+_input = inline("<input id=i1>")
+
+
+# 13.3 Get Element Property
+
+def test_no_browsing_context(session, create_window):
+ # 13.3 step 1
+ session.window_handle = create_window()
+ session.close()
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "no such window")
+
+
+def test_handle_prompt_dismiss(new_session):
+ # 13.3 step 2
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "dismiss"}})
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+
+def test_handle_prompt_accept(new_session):
+ # 13.3 step 2
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_missing_value(session, create_dialog):
+ # 13.3 step 2
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #3")
+
+def test_element_not_found(session):
+ # 13.3 Step 3
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "no such element")
+
+
+def test_element_stale(session):
+ # 13.3 step 4
+ session.url = _input
+ element = session.find.css("input", all=False)
+ session.refresh()
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id=element.id))
+
+ assert_error(result, "stale element reference")
+
+
+def test_element_non_existent(session):
+ # 13.3 step 5-7
+ session.url = _input
+ element = session.find.css("input", all=False)
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/foo"
+ .format(session_id=session.session_id,
+ element_id=element.id))
+
+ assert_success(result, None)
+ assert None == session.execute_script("return arguments[0].foo",
+ args=[element])
+
+
+def test_element(session):
+ # 13.3 step 5-7
+ session.url = inline("<input type=checkbox>")
+ element = session.find.css("input", all=False)
+ element.click()
+ assert None == session.execute_script("return arguments[0].hasAttribute('checked')",
+ args=[element])
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/property/id"
+ .format(session_id=session.session_id,
+ element_id=element.id))
+ assert_success(result, True)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/state/get_element_tag_name.py b/tests/wpt/web-platform-tests/webdriver/tests/state/get_element_tag_name.py
new file mode 100644
index 00000000000..4100e9b1e17
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/state/get_element_tag_name.py
@@ -0,0 +1,146 @@
+from tests.support.asserts import assert_error, assert_dialog_handled, assert_success
+from tests.support.inline import inline
+from tests.support.fixtures import create_dialog
+
+
+# 13.6 Get Element Tag Name
+
+def test_no_browsing_context(session, create_window):
+ # 13.6 step 1
+ session.window_handle = create_window()
+ session.close()
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "no such window")
+
+
+def test_handle_prompt_dismiss(new_session):
+ # 13.6 step 2
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "dismiss"}})
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_accept(new_session):
+ # 13.6 step 2
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_missing_value(session, create_dialog):
+ # 13.6 step 2
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_element_not_found(session):
+ # 13.6 Step 3
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "no such element")
+
+
+def test_element_stale(session):
+ # 13.6 step 4
+ session.url = inline("<input id=foo>")
+ element = session.find.css("input", all=False)
+ session.refresh()
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id=element.id))
+
+ assert_error(result, "stale element reference")
+
+
+def test_get_element_tag_name(session):
+ # 13.6 step 6
+ session.url = inline("<input id=foo>")
+ element = session.find.css("input", all=False)
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/name"
+ .format(session_id=session.session_id,
+ element_id=element.id))
+ assert_success(result, "input")
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/state/is_element_selected.py b/tests/wpt/web-platform-tests/webdriver/tests/state/is_element_selected.py
new file mode 100644
index 00000000000..c82f26fa912
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/state/is_element_selected.py
@@ -0,0 +1,180 @@
+from tests.support.asserts import assert_error, assert_dialog_handled, assert_success
+from tests.support.inline import inline
+from tests.support.fixtures import create_dialog
+
+
+alert_doc = inline("<script>window.alert()</script>")
+check_doc = inline("<input id=checked type=checkbox checked/><input id=notChecked type=checkbox/>")
+option_doc = inline("""<select>
+ <option id=notSelected>r-</option>
+ <option id=selected selected>r+</option>
+ </select>
+ """)
+
+
+# 13.1 Is Element Selected
+
+def test_no_browsing_context(session, create_window):
+ # 13.1 step 1
+ session.window_handle = create_window()
+ session.close()
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "no such window")
+
+
+def test_handle_prompt_dismiss(new_session):
+ # 13.1 step 2
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "dismiss"}})
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_accept(new_session):
+ # 13.1 step 2
+ _, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_success(result, "foo")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_handle_prompt_missing_value(session, create_dialog):
+ # 13.1 step 2
+ session.url = inline("<input id=foo>")
+
+ create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #1")
+
+ create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #2")
+
+ create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
+
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id="foo"))
+
+ assert_error(result, "unexpected alert open")
+ assert_dialog_handled(session, "dismiss #3")
+
+
+def test_element_stale(session):
+ # 13.1 step 4
+ session.url = check_doc
+ element = session.find.css("#checked", all=False)
+ session.refresh()
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id=element.id))
+
+ assert_error(result, "stale element reference")
+
+
+def test_element_checked(session):
+ # 13.1 step 5
+ session.url = check_doc
+ element = session.find.css("#checked", all=False)
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id=element.id))
+
+ assert_success(result, True)
+
+
+def test_checkbox_not_selected(session):
+ # 13.1 step 5
+ session.url = check_doc
+ element = session.find.css("#notChecked", all=False)
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id=element.id))
+
+ assert_success(result, False)
+
+
+def test_element_selected(session):
+ # 13.1 step 5
+ session.url = option_doc
+ element = session.find.css("#selected", all=False)
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id=element.id))
+
+ assert_success(result, True)
+
+
+def test_element_not_selected(session):
+ # 13.1 step 5
+ session.url = option_doc
+ element = session.find.css("#notSelected", all=False)
+ result = session.transport.send("GET", "session/{session_id}/element/{element_id}/selected"
+ .format(session_id=session.session_id,
+ element_id=element.id))
+
+ assert_success(result, False)
diff --git a/tests/wpt/web-platform-tests/microdata/introduction/.gitkeep b/tests/wpt/web-platform-tests/webdriver/tests/state/text/__init__.py
index e69de29bb2d..e69de29bb2d 100644
--- a/tests/wpt/web-platform-tests/microdata/introduction/.gitkeep
+++ b/tests/wpt/web-platform-tests/webdriver/tests/state/text/__init__.py
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/state/text/get_text.py b/tests/wpt/web-platform-tests/webdriver/tests/state/text/get_text.py
new file mode 100644
index 00000000000..aa07b8dc1f4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/state/text/get_text.py
@@ -0,0 +1,29 @@
+import pytest
+import uuid
+
+from tests.support.asserts import assert_error, assert_success
+from tests.support.inline import inline
+
+# For failing tests, the Get Element Text end-point is used
+# directly. In all other cases, the Element.text() function is used.
+
+def test_getting_text_of_a_non_existant_element_is_an_error(session):
+ session.url = inline("""<body>Hello world</body>""")
+ id = uuid.uuid4()
+
+ result = session.transport.send(
+ "GET",
+ "session/%s/element/%s/text" % (session.session_id, id))
+
+ assert_error(result, "no such element")
+
+
+def test_read_element_text(session):
+ session.url = inline("""
+ <body>
+ Noise before <span id='id'>This has an ID</span>. Noise after
+ </body>""")
+
+ element = session.find.css("#id", all=False)
+
+ assert element.text == "This has an ID"
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/status.py b/tests/wpt/web-platform-tests/webdriver/tests/status.py
new file mode 100644
index 00000000000..9472f8a80bb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/status.py
@@ -0,0 +1,21 @@
+import pytest
+import json
+
+
+def test_get_status_no_session(http):
+ with http.get("/status") as response:
+ # GET /status should never return an error
+ assert response.status == 200
+
+ # parse JSON response and unwrap 'value' property
+ parsed_obj = json.loads(response.read().decode('utf-8'))
+ value = parsed_obj["value"]
+
+ # Let body be a new JSON Object with the following properties:
+ # "ready"
+ # The remote end's readiness state.
+ assert value["ready"] in [True, False]
+ # "message"
+ # An implementation-defined string explaining the remote end's
+ # readiness state.
+ assert isinstance(value["message"], basestring)
diff --git a/tests/wpt/web-platform-tests/webdriver/support/__init__.py b/tests/wpt/web-platform-tests/webdriver/tests/support/__init__.py
index d37faf6da04..d37faf6da04 100644
--- a/tests/wpt/web-platform-tests/webdriver/support/__init__.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/support/__init__.py
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/asserts.py b/tests/wpt/web-platform-tests/webdriver/tests/support/asserts.py
new file mode 100644
index 00000000000..21cc07b9c81
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/support/asserts.py
@@ -0,0 +1,122 @@
+from webdriver.client import Element, element_key
+from webdriver.error import WebDriverException
+
+# WebDriver specification ID: dfn-error-response-data
+errors = {
+ "element click intercepted": 400,
+ "element not selectable": 400,
+ "element not interactable": 400,
+ "insecure certificate": 400,
+ "invalid argument": 400,
+ "invalid cookie domain": 400,
+ "invalid coordinates": 400,
+ "invalid element state": 400,
+ "invalid selector": 400,
+ "invalid session id": 404,
+ "javascript error": 500,
+ "move target out of bounds": 500,
+ "no such alert": 404,
+ "no such cookie": 404,
+ "no such element": 404,
+ "no such frame": 404,
+ "no such window": 404,
+ "script timeout": 408,
+ "session not created": 500,
+ "stale element reference": 400,
+ "timeout": 408,
+ "unable to set cookie": 500,
+ "unable to capture screen": 500,
+ "unexpected alert open": 500,
+ "unknown command": 404,
+ "unknown error": 500,
+ "unknown method": 405,
+ "unsupported operation": 500,
+}
+
+# WebDriver specification ID: dfn-send-an-error
+#
+# > When required to send an error, with error code, a remote end must run the
+# > following steps:
+# >
+# > 1. Let http status and name be the error response data for error code.
+# > 2. Let message be an implementation-defined string containing a
+# > human-readable description of the reason for the error.
+# > 3. Let stacktrace be an implementation-defined string containing a stack
+# > trace report of the active stack frames at the time when the error
+# > occurred.
+# > 4. Let data be a new JSON Object initialised with the following properties:
+# >
+# > error
+# > name
+# > message
+# > message
+# > stacktrace
+# > stacktrace
+# >
+# > 5. Send a response with status and data as arguments.
+def assert_error(response, error_code):
+ """Verify that the provided wdclient.Response instance described a valid
+ error response as defined by `dfn-send-an-error` and the provided error
+ code.
+
+ :param response: wdclient.Response instance
+ :param error_code: string value of the expected "error code"
+ """
+ assert response.status == errors[error_code]
+ assert "value" in response.body
+ assert response.body["value"]["error"] == error_code
+ assert isinstance(response.body["value"]["message"], basestring)
+ assert isinstance(response.body["value"]["stacktrace"], basestring)
+
+def assert_success(response, value=None):
+ """Verify that the provided wdclient.Response instance described a valid
+ error response as defined by `dfn-send-an-error` and the provided error
+ code.
+
+ :param response: wdclient.Response instance.
+ :param value: Expected value of the response body, if any.
+
+ """
+ assert response.status == 200
+ if value is not None:
+ assert response.body["value"] == value
+ return response.body.get("value")
+
+def assert_dialog_handled(session, expected_text):
+ result = session.transport.send("GET",
+ "session/%s/alert/text" % session.session_id)
+
+ # If there were any existing dialogs prior to the creation of this
+ # fixture's dialog, then the "Get Alert Text" command will return
+ # successfully. In that case, the text must be different than that
+ # of this fixture's dialog.
+ try:
+ assert_error(result, "no such alert")
+ except:
+ assert (result.status == 200 and
+ result.body["value"] != expected_text), (
+ "Dialog with text '%s' was not handled." % expected_text)
+
+def assert_same_element(session, a, b):
+ """Verify that two element references describe the same element."""
+ assert isinstance(a, dict), "Actual value is not a dictionary"
+ assert isinstance(b, dict), "Expected value is not a dictionary"
+ assert element_key in a, "Actual value does not describe an element"
+ assert element_key in b, "Expected value does not describe an element"
+
+ if a[element_key] == b[element_key]:
+ return
+
+ message = ("Expected element references to describe the same element, " +
+ "but they did not.")
+
+ # Attempt to provide more information, accounting for possible errors such
+ # as stale element references or not visible elements.
+ try:
+ a_markup = session.execute_script("return arguments[0].outerHTML;", args=[a])
+ b_markup = session.execute_script("return arguments[0].outerHTML;", args=[b])
+ message += " Actual: `%s`. Expected: `%s`." % (a_markup, b_markup)
+ except WebDriverException:
+ pass
+
+ raise AssertionError(message)
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures.py b/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures.py
new file mode 100644
index 00000000000..f51c498274f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/support/fixtures.py
@@ -0,0 +1,250 @@
+import json
+import os
+import urlparse
+import re
+
+import webdriver
+import mozlog
+
+from tests.support.asserts import assert_error
+from tests.support.http_request import HTTPRequest
+from tests.support import merge_dictionaries
+
+default_host = "http://127.0.0.1"
+default_port = "4444"
+
+logger = mozlog.get_default_logger()
+
+
+def ignore_exceptions(f):
+ def inner(*args, **kwargs):
+ try:
+ return f(*args, **kwargs)
+ except webdriver.error.WebDriverException as e:
+ logger.warning("Ignored exception %s" % e)
+ inner.__name__ = f.__name__
+ return inner
+
+
+@ignore_exceptions
+def _ensure_valid_window(session):
+ """If current window is not open anymore, ensure to have a valid
+ one selected.
+
+ """
+ try:
+ session.window_handle
+ except webdriver.NoSuchWindowException:
+ session.window_handle = session.handles[0]
+
+
+@ignore_exceptions
+def _dismiss_user_prompts(session):
+ """Dismisses any open user prompts in windows."""
+ current_window = session.window_handle
+
+ for window in _windows(session):
+ session.window_handle = window
+ try:
+ session.alert.dismiss()
+ except webdriver.NoSuchAlertException:
+ pass
+
+ session.window_handle = current_window
+
+
+@ignore_exceptions
+def _restore_window_state(session):
+ """Reset window to an acceptable size, bringing it out of maximized,
+ minimized, or fullscreened state
+
+ """
+ session.window.size = (800, 600)
+
+
+@ignore_exceptions
+def _restore_windows(session):
+ """Closes superfluous windows opened by the test without ending
+ the session implicitly by closing the last window.
+ """
+ current_window = session.window_handle
+
+ for window in _windows(session, exclude=[current_window]):
+ session.window_handle = window
+ if len(session.handles) > 1:
+ session.close()
+
+ session.window_handle = current_window
+
+
+def _switch_to_top_level_browsing_context(session):
+ """If the current browsing context selected by WebDriver is a
+ `<frame>` or an `<iframe>`, switch it back to the top-level
+ browsing context.
+ """
+ session.switch_frame(None)
+
+
+def _windows(session, exclude=None):
+ """Set of window handles, filtered by an `exclude` list if
+ provided.
+ """
+ if exclude is None:
+ exclude = []
+ wins = [w for w in session.handles if w not in exclude]
+ return set(wins)
+
+
+def create_frame(session):
+ """Create an `iframe` element in the current browsing context and insert it
+ into the document. Return a reference to the newly-created element."""
+ def create_frame():
+ append = """
+ var frame = document.createElement('iframe');
+ document.body.appendChild(frame);
+ return frame;
+ """
+ return session.execute_script(append)
+
+ return create_frame
+
+
+def create_window(session):
+ """Open new window and return the window handle."""
+ def create_window():
+ windows_before = session.handles
+ name = session.execute_script("window.open()")
+ assert len(session.handles) == len(windows_before) + 1
+ new_windows = list(set(session.handles) - set(windows_before))
+ return new_windows.pop()
+ return create_window
+
+
+def http(configuration):
+ return HTTPRequest(configuration["host"], configuration["port"])
+
+
+def server_config():
+ return json.loads(os.environ.get("WD_SERVER_CONFIG"))
+
+
+def configuration():
+ host = os.environ.get("WD_HOST", default_host)
+ port = int(os.environ.get("WD_PORT", default_port))
+ capabilities = json.loads(os.environ.get("WD_CAPABILITIES", "{}"))
+
+ return {
+ "host": host,
+ "port": port,
+ "capabilities": capabilities
+ }
+
+
+_current_session = None
+
+
+def session(configuration, request):
+ """Create and start a session for a test that does not itself test session creation.
+
+ By default the session will stay open after each test, but we always try to start a
+ new one and assume that if that fails there is already a valid session. This makes it
+ possible to recover from some errors that might leave the session in a bad state, but
+ does not demand that we start a new session per test."""
+ global _current_session
+ if _current_session is None:
+ _current_session = webdriver.Session(configuration["host"],
+ configuration["port"],
+ capabilities={"alwaysMatch": configuration["capabilities"]})
+ try:
+ _current_session.start()
+ except webdriver.error.SessionNotCreatedException:
+ if not _current_session.session_id:
+ raise
+
+ # finalisers are popped off a stack,
+ # making their ordering reverse
+ request.addfinalizer(lambda: _switch_to_top_level_browsing_context(_current_session))
+ request.addfinalizer(lambda: _restore_window_state(_current_session))
+ request.addfinalizer(lambda: _restore_windows(_current_session))
+ request.addfinalizer(lambda: _dismiss_user_prompts(_current_session))
+ request.addfinalizer(lambda: _ensure_valid_window(_current_session))
+
+ return _current_session
+
+
+def new_session(configuration, request):
+ """Return a factory function that will attempt to start a session with a given body.
+
+ This is intended for tests that are themselves testing new session creation, and the
+ session created is closed at the end of the test."""
+ def end():
+ global _current_session
+ if _current_session is not None and _current_session.session_id:
+ _current_session.end()
+ _current_session = None
+
+ def create_session(body):
+ global _current_session
+ _session = webdriver.Session(configuration["host"],
+ configuration["port"],
+ capabilities=None)
+ # TODO: merge in some capabilities from the confguration capabilities
+ # since these might be needed to start the browser
+ value = _session.send_command("POST", "session", body=body)
+ # Don't set the global session until we are sure this succeeded
+ _current_session = _session
+ _session.session_id = value["sessionId"]
+
+ return value, _current_session
+
+ end()
+ request.addfinalizer(end)
+
+ return create_session
+
+
+def url(server_config):
+ def inner(path, protocol="http", query="", fragment=""):
+ port = server_config["ports"][protocol][0]
+ host = "%s:%s" % (server_config["host"], port)
+ return urlparse.urlunsplit((protocol, host, path, query, fragment))
+
+ inner.__name__ = "url"
+ return inner
+
+def create_dialog(session):
+ """Create a dialog (one of "alert", "prompt", or "confirm") and provide a
+ function to validate that the dialog has been "handled" (either accepted or
+ dismissed) by returning some value."""
+
+ def create_dialog(dialog_type, text=None, result_var=None):
+ assert dialog_type in ("alert", "confirm", "prompt"), (
+ "Invalid dialog type: '%s'" % dialog_type)
+
+ if text is None:
+ text = ""
+
+ assert isinstance(text, basestring), "`text` parameter must be a string"
+
+ if result_var is None:
+ result_var = "__WEBDRIVER"
+
+ assert re.search(r"^[_$a-z$][_$a-z0-9]*$", result_var, re.IGNORECASE), (
+ 'The `result_var` must be a valid JavaScript identifier')
+
+ # Script completion and modal summoning are scheduled on two separate
+ # turns of the event loop to ensure that both occur regardless of how
+ # the user agent manages script execution.
+ spawn = """
+ var done = arguments[0];
+ setTimeout(done, 0);
+ setTimeout(function() {{
+ window.{0} = window.{1}("{2}");
+ }}, 0);
+ """.format(result_var, dialog_type, text)
+
+ session.send_session_command("POST",
+ "execute/async",
+ {"script": spawn, "args": []})
+
+ return create_dialog
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/http_request.py b/tests/wpt/web-platform-tests/webdriver/tests/support/http_request.py
new file mode 100644
index 00000000000..ae28a6486b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/support/http_request.py
@@ -0,0 +1,23 @@
+import contextlib
+import httplib
+
+
+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()
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/inline.py b/tests/wpt/web-platform-tests/webdriver/tests/support/inline.py
new file mode 100644
index 00000000000..99418d974d3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/support/inline.py
@@ -0,0 +1,40 @@
+import urllib
+
+
+def inline(doc, doctype="html", mime="text/html;charset=utf-8", protocol="http"):
+ from .fixtures import server_config, url
+ build_url = url(server_config())
+
+ if doctype == "html":
+ mime = "text/html;charset=utf-8"
+ elif doctype == "xhtml":
+ mime = "application/xhtml+xml"
+ doc = r"""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <title>XHTML might be the future</title>
+ </head>
+
+ <body>
+ {}
+ </body>
+</html>""".format(doc)
+
+ query = {"doc": doc}
+ if mime != "text/html;charset=utf8":
+ query["content-type"] = mime
+
+ return build_url("/webdriver/tests/support/inline.py",
+ query=urllib.urlencode(query),
+ protocol=protocol)
+
+
+def main(request, response):
+ doc = request.GET.first("doc", None)
+ content_type = request.GET.first("content-type", "text/html;charset=utf8")
+ if doc is None:
+ rv = 404, [("Content-Type", "text/plain")], "Missing doc parameter in query"
+ else:
+ rv = [("Content-Type", content_type)], doc
+ return rv
diff --git a/tests/wpt/web-platform-tests/webdriver/support/merge_dictionaries.py b/tests/wpt/web-platform-tests/webdriver/tests/support/merge_dictionaries.py
index cf06c9b433c..cf06c9b433c 100644
--- a/tests/wpt/web-platform-tests/webdriver/support/merge_dictionaries.py
+++ b/tests/wpt/web-platform-tests/webdriver/tests/support/merge_dictionaries.py
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/support/wait.py b/tests/wpt/web-platform-tests/webdriver/tests/support/wait.py
new file mode 100644
index 00000000000..f645abe7367
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/support/wait.py
@@ -0,0 +1,28 @@
+import time
+
+class TimeoutException(Exception):
+ pass
+
+
+def wait(session, condition, message, interval=0.1, timeout=5):
+ """ Poll a condition until it's true or the timeout ellapses.
+
+ :param session: WebDriver session to use with `condition`
+ :param condition: function that accepts a WebDriver session and returns a boolean
+ :param message: failure description to display in case the timeout is reached
+ :param interval: seconds between each call to `condition`. Default: 0.1
+ :param timeout: seconds until we stop polling. Default: 5
+ """
+
+ start = time.time()
+ end = start + timeout
+
+ while not (time.time() >= end):
+ next_step = time.time() + interval
+ success = condition(session)
+ next_interval = max(next_step - time.time(), 0)
+ if not success:
+ time.sleep(next_interval)
+ continue
+ return success
+ raise TimeoutException("Timed out after %d seconds: %s" % (timeout, message))
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/user_prompts/accept_alert.py b/tests/wpt/web-platform-tests/webdriver/tests/user_prompts/accept_alert.py
new file mode 100644
index 00000000000..d97aa73739a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/user_prompts/accept_alert.py
@@ -0,0 +1,46 @@
+from tests.support.asserts import assert_error, assert_success
+
+
+def accept_alert(session):
+ return session.transport.send("POST", "session/{session_id}/alert/accept"
+ .format(session_id=session.session_id))
+
+
+# 18.2 Accept Alert
+
+def test_no_browsing_context(session, create_window):
+ # 18.2 step 1
+ session.window_handle = create_window()
+ session.close()
+
+ response = accept_alert(session)
+ assert_error(response, "no such window")
+
+
+def test_no_user_prompt(session):
+ # 18.2 step 2
+ response = accept_alert(session)
+ assert_error(response, "no such alert")
+
+
+def test_accept_alert(session):
+ # 18.2 step 3
+ session.execute_script("window.alert(\"Hello\");")
+ response = accept_alert(session)
+ assert_success(response)
+
+
+def test_accept_confirm(session):
+ # 18.2 step 3
+ session.execute_script("window.result = window.confirm(\"Hello\");")
+ response = accept_alert(session)
+ assert_success(response)
+ assert session.execute_script("return window.result") is True
+
+
+def test_accept_prompt(session):
+ # 18.2 step 3
+ session.execute_script("window.result = window.prompt(\"Enter Your Name: \", \"Federer\");")
+ response = accept_alert(session)
+ assert_success(response)
+ assert session.execute_script("return window.result") == "Federer"
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/user_prompts/dismiss_alert.py b/tests/wpt/web-platform-tests/webdriver/tests/user_prompts/dismiss_alert.py
new file mode 100644
index 00000000000..73f9822fc57
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/user_prompts/dismiss_alert.py
@@ -0,0 +1,46 @@
+from tests.support.asserts import assert_error, assert_success
+
+
+def dismiss_alert(session):
+ return session.transport.send("POST", "session/{session_id}/alert/dismiss"
+ .format(session_id=session.session_id))
+
+
+# 18.1 Dismiss Alert
+
+def test_no_browsing_context(session, create_window):
+ # 18.1 step 1
+ session.window_handle = create_window()
+ session.close()
+
+ response = dismiss_alert(session)
+ assert_error(response, "no such window")
+
+
+def test_no_user_prompt(session):
+ # 18.1 step 2
+ response = dismiss_alert(session)
+ assert_error(response, "no such alert")
+
+
+def test_dismiss_alert(session):
+ # 18.1 step 3
+ session.execute_script("window.alert(\"Hello\");")
+ response = dismiss_alert(session)
+ assert_success(response)
+
+
+def test_dismiss_confirm(session):
+ # 18.1 step 3
+ session.execute_script("window.result = window.confirm(\"Hello\");")
+ response = dismiss_alert(session)
+ assert_success(response)
+ assert session.execute_script("return window.result;") is False
+
+
+def test_dismiss_prompt(session):
+ # 18.1 step 3
+ session.execute_script("window.result = window.prompt(\"Enter Your Name: \", \"Federer\");")
+ response = dismiss_alert(session)
+ assert_success(response)
+ assert session.execute_script("return window.result") is None
diff --git a/tests/wpt/web-platform-tests/webdriver/tests/user_prompts/get_alert_text.py b/tests/wpt/web-platform-tests/webdriver/tests/user_prompts/get_alert_text.py
new file mode 100644
index 00000000000..85506eea4f2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webdriver/tests/user_prompts/get_alert_text.py
@@ -0,0 +1,59 @@
+from tests.support.asserts import assert_error, assert_success
+
+
+def get_dialog_text(session):
+ return session.transport.send("GET", "session/{session_id}/alert/text"
+ .format(session_id=session.session_id))
+
+
+# 18.3 Get Alert Text
+
+def test_no_browsing_context(session, create_window):
+ # 18.3 step 1
+ session.window_handle = create_window()
+ session.close()
+
+ response = get_dialog_text(session)
+ assert_error(response, "no such window")
+
+
+def test_no_user_prompt(session):
+ # 18.3 step 2
+ response = get_dialog_text(session)
+ assert_error(response, "no such alert")
+
+
+def test_get_alert_text(session):
+ # 18.3 step 3
+ session.execute_script("window.alert(\"Hello\");")
+ response = get_dialog_text(session)
+ assert_success(response)
+ assert isinstance(response.body, dict)
+ assert "value" in response.body
+ alert_text = response.body["value"]
+ assert isinstance(alert_text, basestring)
+ assert alert_text == "Hello"
+
+
+def test_get_confirm_text(session):
+ # 18.3 step 3
+ session.execute_script("window.confirm(\"Hello\");")
+ response = get_dialog_text(session)
+ assert_success(response)
+ assert isinstance(response.body, dict)
+ assert "value" in response.body
+ confirm_text = response.body["value"]
+ assert isinstance(confirm_text, basestring)
+ assert confirm_text == "Hello"
+
+
+def test_get_prompt_text(session):
+ # 18.3 step 3
+ session.execute_script("window.prompt(\"Enter Your Name: \", \"Federer\");")
+ response = get_dialog_text(session)
+ assert_success(response)
+ assert isinstance(response.body, dict)
+ assert "value" in response.body
+ prompt_text = response.body["value"]
+ assert isinstance(prompt_text, basestring)
+ assert prompt_text == "Enter Your Name: "
diff --git a/tests/wpt/web-platform-tests/webmessaging/Channel_postMessage_ports_readonly_array.htm b/tests/wpt/web-platform-tests/webmessaging/Channel_postMessage_ports_readonly_array.htm
index de2952dc12d..4ccf3ac4f35 100644
--- a/tests/wpt/web-platform-tests/webmessaging/Channel_postMessage_ports_readonly_array.htm
+++ b/tests/wpt/web-platform-tests/webmessaging/Channel_postMessage_ports_readonly_array.htm
@@ -8,6 +8,7 @@
<body>
<div id=log></div>
<script>
+ "use strict";
var TargetPort = null;
var description = "The postMessage() method - Make new ports into a read only array.";
@@ -27,9 +28,9 @@
function TestMessageEvent(evt)
{
var channel3 = new MessageChannel();
- evt.ports.push(channel3.port1);
- evt.ports.push(channel3.port1);
-
+ assert_throws(new TypeError(), () => {
+ evt.ports.push(channel3.port1);
+ }, "ports is a frozen object");
assert_equals(evt.ports.length, 1, "ports is a read only array with length == 1.");
t.done();
}
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCCertificate.html b/tests/wpt/web-platform-tests/webrtc/RTCCertificate.html
index 65f3f1e44c5..1a0282038e2 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCCertificate.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCCertificate.html
@@ -69,7 +69,7 @@
// Helper function that takes in an RTCDtlsFingerprint
// and return an a=fingerprint SDP line
function fingerprintToSdpLine(fingerprint) {
- return `\r\na=fingerprint ${fingerprint.algorithm} ${fingerprint.value.toUpperCase()}\r\n`;
+ return `\r\na=fingerprint:${fingerprint.algorithm} ${fingerprint.value.toUpperCase()}\r\n`;
}
// Assert that an SDP string has fingerprint line for all the cert's fingerprints
@@ -159,7 +159,7 @@
promise_test(t => {
return generateCertificate()
.then(cert => {
- assert_own_property(cert, 'getFingerprints');
+ assert_idl_attribute(cert, 'getFingerprints');
const fingerprints = cert.getFingerprints();
assert_true(Array.isArray(fingerprints),
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-bundlePolicy.html b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-bundlePolicy.html
new file mode 100644
index 00000000000..6b64cf8ddd5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-bundlePolicy.html
@@ -0,0 +1,128 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCConfiguration bundlePolicy</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ /*
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ ...
+ RTCConfiguration getConfiguration();
+ void setConfiguration(RTCConfiguration configuration);
+ };
+
+ 4.2.1. RTCConfiguration Dictionary
+ dictionary RTCConfiguration {
+ RTCBundlePolicy bundlePolicy = "balanced";
+ ...
+ };
+
+ 4.2.6. RTCBundlePolicy Enum
+ enum RTCBundlePolicy {
+ "balanced",
+ "max-compat",
+ "max-bundle"
+ };
+ */
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ assert_equals(pc.getConfiguration().bundlePolicy, 'balanced');
+ }, 'Default bundlePolicy should be balanced');
+
+ test(() => {
+ const pc = new RTCPeerConnection({ bundlePolicy: undefined });
+ assert_equals(pc.getConfiguration().bundlePolicy, 'balanced');
+ }, `new RTCPeerConnection({ bundlePolicy: undefined }) should have bundlePolicy balanced`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ bundlePolicy: 'balanced' });
+ assert_equals(pc.getConfiguration().bundlePolicy, 'balanced');
+ }, `new RTCPeerConnection({ bundlePolicy: 'balanced' }) should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ bundlePolicy: 'max-compat' });
+ assert_equals(pc.getConfiguration().bundlePolicy, 'max-compat');
+ }, `new RTCPeerConnection({ bundlePolicy: 'max-compat' }) should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ bundlePolicy: 'max-bundle' });
+ assert_equals(pc.getConfiguration().bundlePolicy, 'max-bundle');
+ }, `new RTCPeerConnection({ bundlePolicy: 'max-bundle' }) should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ pc.setConfiguration({});
+ }, 'setConfiguration({}) with initial default bundlePolicy balanced should succeed');
+
+ test(() => {
+ const pc = new RTCPeerConnection({ bundlePolicy: 'balanced' });
+ pc.setConfiguration({});
+ }, 'setConfiguration({}) with initial bundlePolicy balanced should succeed');
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ pc.setConfiguration({ bundlePolicy: 'balanced' });
+ }, 'setConfiguration({ bundlePolicy: balanced }) with initial default bundlePolicy balanced should succeed');
+
+ test(() => {
+ const pc = new RTCPeerConnection({ bundlePolicy: 'balanced' });
+ pc.setConfiguration({ bundlePolicy: 'balanced' });
+ }, `setConfiguration({ bundlePolicy: 'balanced' }) with initial bundlePolicy balanced should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ bundlePolicy: 'max-compat' });
+ pc.setConfiguration({ bundlePolicy: 'max-compat' });
+ }, `setConfiguration({ bundlePolicy: 'max-compat' }) with initial bundlePolicy max-compat should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ bundlePolicy: 'max-bundle' });
+ pc.setConfiguration({ bundlePolicy: 'max-bundle' });
+ }, `setConfiguration({ bundlePolicy: 'max-bundle' }) with initial bundlePolicy max-bundle should succeed`);
+
+ test(() => {
+ assert_throws(new TypeError(), () =>
+ new RTCPeerConnection({ bundlePolicy: null }));
+ }, `new RTCPeerConnection({ bundlePolicy: null }) should throw TypeError`);
+
+ test(() => {
+ assert_throws(new TypeError(), () =>
+ new RTCPeerConnection({ bundlePolicy: 'invalid' }));
+ }, `new RTCPeerConnection({ bundlePolicy: 'invalid' }) should throw TypeError`);
+
+ /*
+ 4.3.2. Interface Definition
+ To set a configuration
+ 5. If configuration.bundlePolicy is set and its value differs from the
+ connection's bundle policy, throw an InvalidModificationError.
+ */
+ test(() => {
+ const pc = new RTCPeerConnection({ bundlePolicy: 'max-bundle' });
+ assert_idl_attribute(pc, 'setConfiguration');
+
+ assert_throws('InvalidModificationError', () =>
+ pc.setConfiguration({ bundlePolicy: 'max-compat' }));
+ }, `setConfiguration({ bundlePolicy: 'max-compat' }) with initial bundlePolicy max-bundle should throw InvalidModificationError`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ bundlePolicy: 'max-bundle' });
+ assert_idl_attribute(pc, 'setConfiguration');
+
+ // the default value for bundlePolicy is balanced
+ assert_throws('InvalidModificationError', () =>
+ pc.setConfiguration({}));
+ }, `setConfiguration({}) with initial bundlePolicy max-bundle should throw InvalidModificationError`);
+
+ /*
+ Coverage Report
+ Tested 2
+ Total 2
+ */
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-helper.js b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-helper.js
new file mode 100644
index 00000000000..fb8eb509952
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-helper.js
@@ -0,0 +1,24 @@
+'use strict';
+
+// Run a test function as two test cases.
+// The first test case test the configuration by passing a given config
+// to the constructor.
+// The second test case create an RTCPeerConnection object with default
+// configuration, then call setConfiguration with the provided config.
+// The test function is given a constructor function to create
+// a new instance of RTCPeerConnection with given config,
+// either directly as constructor parameter or through setConfiguration.
+function config_test(test_func, desc) {
+ test(() => {
+ test_func(config => new RTCPeerConnection(config));
+ }, `new RTCPeerConnection(config) - ${desc}`);
+
+ test(() => {
+ test_func(config => {
+ const pc = new RTCPeerConnection();
+ assert_idl_attribute(pc, 'setConfiguration');
+ pc.setConfiguration(config);
+ return pc;
+ })
+ }, `setConfiguration(config) - ${desc}`);
+}
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceCandidatePoolSize.html b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceCandidatePoolSize.html
index f424ec600b7..2e6859d2596 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceCandidatePoolSize.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceCandidatePoolSize.html
@@ -26,6 +26,7 @@ dictionary RTCConfiguration {
*/
test(() => {
const pc = new RTCPeerConnection();
+ assert_idl_attribute(pc, "getConfiguration");
assert_equals(pc.getConfiguration().iceCandidatePoolSize, 0);
}, "Initialize a new RTCPeerConnection with no iceCandidatePoolSize");
@@ -33,6 +34,7 @@ test(() => {
const pc = new RTCPeerConnection({
iceCandidatePoolSize: 0
});
+ assert_idl_attribute(pc, "getConfiguration");
assert_equals(pc.getConfiguration().iceCandidatePoolSize, 0);
}, "Initialize a new RTCPeerConnection with iceCandidatePoolSize: 0");
@@ -40,6 +42,7 @@ test(() => {
const pc = new RTCPeerConnection({
iceCandidatePoolSize: 255
});
+ assert_idl_attribute(pc, "getConfiguration");
assert_equals(pc.getConfiguration().iceCandidatePoolSize, 255);
}, "Initialize a new RTCPeerConnection with iceCandidatePoolSize: 255");
@@ -63,9 +66,11 @@ test(() => {
/*
Reconfiguration
*/
-const pc = new RTCPeerConnection({});
test(() => {
+ const pc = new RTCPeerConnection();
+ assert_idl_attribute(pc, "getConfiguration");
+ assert_idl_attribute(pc, "setConfiguration");
pc.setConfiguration({
iceCandidatePoolSize: 0
});
@@ -73,6 +78,9 @@ test(() => {
}, "Reconfigure RTCPeerConnection instance iceCandidatePoolSize to 0");
test(() => {
+ const pc = new RTCPeerConnection();
+ assert_idl_attribute(pc, "getConfiguration");
+ assert_idl_attribute(pc, "setConfiguration");
pc.setConfiguration({
iceCandidatePoolSize: 255
});
@@ -88,8 +96,8 @@ been implemented). Without this check, these tests will pass incorrectly.
*/
test(() => {
+ const pc = new RTCPeerConnection();
assert_equals(typeof pc.setConfiguration, "function", "RTCPeerConnection.prototype.setConfiguration is not implemented");
-
assert_throws(new TypeError(), () => {
pc.setConfiguration({
iceCandidatePoolSize: -1
@@ -98,8 +106,8 @@ test(() => {
}, "Reconfigure RTCPeerConnection instance iceCandidatePoolSize to -1 (Out Of Range)");
test(() => {
+ const pc = new RTCPeerConnection();
assert_equals(typeof pc.setConfiguration, "function", "RTCPeerConnection.prototype.setConfiguration is not implemented");
-
assert_throws(new TypeError(), () => {
pc.setConfiguration({
iceCandidatePoolSize: 256
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceServers.html b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceServers.html
new file mode 100644
index 00000000000..42bc896349c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceServers.html
@@ -0,0 +1,570 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCConfiguration iceServers</title>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script src='RTCConfiguration-helper.js'></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor's draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper function is called from
+ // RTCConfiguration-helper.js:
+ // config_test
+
+ /*
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ ...
+ };
+
+ 4.2.1. RTCConfiguration Dictionary
+ dictionary RTCConfiguration {
+ sequence<RTCIceServer> iceServers;
+ ...
+ };
+
+ 4.2.2. RTCIceCredentialType Enum
+ enum RTCIceCredentialType {
+ "password",
+ "oauth"
+ };
+
+ 4.2.3. RTCOAuthCredential Dictionary
+ dictionary RTCOAuthCredential {
+ required DOMString macKey;
+ required DOMString accessToken;
+ };
+
+ 4.2.4. RTCIceServer Dictionary
+ dictionary RTCIceServer {
+ required (DOMString or sequence<DOMString>) urls;
+ DOMString username;
+ (DOMString or RTCOAuthCredential) credential;
+ RTCIceCredentialType credentialType = "password";
+ };
+ */
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ assert_equals(pc.getConfiguration().iceServers, undefined);
+ }, 'new RTCPeerConnection() should have default configuration.iceServers of undefined');
+
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ iceServers: null }));
+ }, '{ iceServers: null } should throw TypeError');
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: undefined });
+ assert_equals(pc.getConfiguration().iceServers, undefined);
+ }, '{ iceServers: undefined } should succeed');
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [] });
+ assert_array_equals(pc.getConfiguration().iceServers, []);
+ }, '{ iceServers: [] } should succeed');
+
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ iceServers: [null] }));
+ }, '{ iceServers: [null] } should throw TypeError');
+
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ iceServers: [undefined] }));
+ }, '{ iceServers: [undefined] } should throw TypeError');
+
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ iceServers: [{}] }));
+ }, '{ iceServers: [{}] } should throw TypeError');
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: []
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, []);
+ assert_equals(server.credentialType, 'password');
+ }, 'with empty list urls should succeed');
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: 'stun:stun1.example.net'
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['stun:stun1.example.net']);
+ assert_equals(server.credentialType, 'password');
+
+ }, `with stun server should succeed`);
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: ['stun:stun1.example.net']
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['stun:stun1.example.net']);
+ assert_equals(server.credentialType, 'password');
+
+ }, `with stun server array should succeed`);
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: ['stun:stun1.example.net', 'stun:stun2.example.net']
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['stun:stun1.example.net', 'stun:stun2.example.net']);
+ assert_equals(server.credentialType, 'password');
+
+ }, `with 2 stun servers should succeed`);
+
+ config_test(makePc => {
+ const pc = new RTCPeerConnection({ iceServers: [{
+ urls: 'turn:turn.example.org',
+ username: 'user',
+ credential: 'cred'
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['turn:turn.example.org']);
+ assert_equals(server.credentialType, 'password');
+ assert_equals(server.username, 'user');
+ assert_equals(server.credential, 'cred');
+
+ }, `with turn server, username, credential should succeed`);
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: 'turns:turn.example.org',
+ username: '',
+ credential: ''
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['turns:turn.example.org']);
+ assert_equals(server.username, '');
+ assert_equals(server.credential, '');
+
+ }, `with turns server and empty string username, credential should succeed`);
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: 'turn:turn.example.org',
+ username: '',
+ credential: ''
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['turn:turn.example.org']);
+ assert_equals(server.username, '');
+ assert_equals(server.credential, '');
+
+ }, `with turn server and empty string username, credential should succeed`);
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: ['turns:turn.example.org', 'turn:turn.example.net'],
+ username: 'user',
+ credential: 'cred'
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['turns:turn.example.org', 'turn:turn.example.net']);
+ assert_equals(server.username, 'user');
+ assert_equals(server.credential, 'cred');
+
+ }, `with one turns server, one turn server, username, credential should succeed`);
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: 'stun:stun1.example.net',
+ credentialType: 'password'
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['stun:stun1.example.net']);
+ assert_equals(server.credentialType, 'password');
+
+ }, `with stun server and credentialType password should succeed`);
+
+ /*
+ 4.3.2. To set a configuration
+ 11.4. If scheme name is turn or turns, and either of server.username or
+ server.credential are omitted, then throw an InvalidAccessError.
+ */
+ config_test(makePc => {
+ assert_throws('InvalidAccessError', () =>
+ makePc({ iceServers: [{
+ urls: 'turn:turn.example.net'
+ }] }));
+ }, 'with turn server and no credentials should throw InvalidAccessError');
+
+ config_test(makePc => {
+ assert_throws('InvalidAccessError', () =>
+ makePc({ iceServers: [{
+ urls: 'turn:turn.example.net',
+ username: 'user'
+ }] }));
+ }, 'with turn server and only username should throw InvalidAccessError');
+
+ config_test(makePc => {
+ assert_throws('InvalidAccessError', () =>
+ makePc({ iceServers: [{
+ urls: 'turn:turn.example.net',
+ credential: 'cred'
+ }] }));
+ }, 'with turn server and only credential should throw InvalidAccessError');
+
+ config_test(makePc => {
+ assert_throws('InvalidAccessError', () =>
+ makePc({ iceServers: [{
+ urls: 'turns:turn.example.net'
+ }] }));
+ }, 'with turns server and no credentials should throw InvalidAccessError');
+
+ config_test(makePc => {
+ assert_throws('InvalidAccessError', () =>
+ makePc({ iceServers: [{
+ urls: 'turns:turn.example.net',
+ username: 'user'
+ }] }));
+ }, 'with turns server and only username should throw InvalidAccessError');
+
+ config_test(makePc => {
+ assert_throws('InvalidAccessError', () =>
+ makePc({ iceServers: [{
+ urls: 'turns:turn.example.net',
+ credential: 'cred'
+ }] }));
+ }, 'with turns server and only credential should throw InvalidAccessError');
+
+ /*
+ 4.3.2. To set a configuration
+ 11.3. For each url in server.urls parse url and obtain scheme name.
+ - If the scheme name is not implemented by the browser, throw a SyntaxError.
+ - or if parsing based on the syntax defined in [ RFC7064] and [RFC7065] fails,
+ throw a SyntaxError.
+
+ [RFC7064] URI Scheme for the Session Traversal Utilities for NAT (STUN) Protocol
+ 3.1. URI Scheme Syntax
+ stunURI = scheme ":" host [ ":" port ]
+ scheme = "stun" / "stuns"
+
+ [RFC7065] Traversal Using Relays around NAT (TURN) Uniform Resource Identifiers
+ 3.1. URI Scheme Syntax
+ turnURI = scheme ":" host [ ":" port ]
+ [ "?transport=" transport ]
+ scheme = "turn" / "turns"
+ transport = "udp" / "tcp" / transport-ext
+ transport-ext = 1*unreserved
+ */
+ config_test(makePc => {
+ assert_throws('SyntaxError', () =>
+ makePc({ iceServers: [{
+ urls: 'relative-url'
+ }] }));
+ }, 'with relative url should throw SyntaxError');
+
+ config_test(makePc => {
+ assert_throws('SyntaxError', () =>
+ makePc({ iceServers: [{
+ urls: 'http://example.com'
+ }] }));
+ }, 'with http url should throw SyntaxError');
+
+ config_test(makePc => {
+ assert_throws('SyntaxError', () =>
+ makePc({ iceServers: [{
+ urls: 'turn://example.org/foo?x=y'
+ }] }));
+ }, 'with invalid turn url should throw SyntaxError');
+
+ config_test(makePc => {
+ assert_throws('SyntaxError', () =>
+ makePc({ iceServers: [{
+ urls: 'stun://example.org/foo?x=y'
+ }] }));
+ }, 'with invalid stun url should throw SyntaxError');
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: [],
+ credentialType: 'password'
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, []);
+ assert_equals(server.credentialType, 'password');
+ }, `with empty urls and credentialType password should succeed`);
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: [],
+ credentialType: 'oauth'
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, []);
+ assert_equals(server.credentialType, 'oauth');
+ }, `with empty urls and credentialType oauth should succeed`);
+
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ iceServers: [{
+ urls: [],
+ credentialType: 'invalid'
+ }] }));
+ }, 'with invalid credentialType should throw TypeError');
+
+ // token credentialType was removed from the spec since 20170508
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ iceServers: [{
+ urls: [],
+ credentialType: 'token'
+ }] }));
+ }, 'with credentialType token should throw TypeError');
+
+ // Blink and Gecko fall back to url, but it's not in the spec.
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ iceServers: [{
+ url: 'stun:stun1.example.net'
+ }] }));
+ }, 'with url field should throw TypeError');
+
+ /*
+ 4.3.2. To set a configuration
+ 11.5. If scheme name is turn or turns, and server.credentialType is "password",
+ and server.credential is not a DOMString, then throw an InvalidAccessError
+ and abort these steps.
+ */
+ config_test(makePc => {
+ assert_throws('InvalidAccessError', () =>
+ makePc({ iceServers: [{
+ urls: 'turns:turn.example.org',
+ credentialType: 'password',
+ username: 'user',
+ credential: {
+ macKey: '',
+ accessToken: ''
+ }
+ }] }));
+ }, 'with turns server, credentialType password, and RTCOauthCredential credential should throw InvalidAccessError');
+
+ /*
+ 4.3.2. To set a configuration
+ 11.6. If scheme name is turn or turns, and server.credentialType is "oauth",
+ and server.credential is not an RTCOAuthCredential, then throw an
+ InvalidAccessError and abort these steps.
+ */
+ config_test(makePc => {
+ assert_throws('InvalidAccessError', () =>
+ makePc({ iceServers: [{
+ urls: 'turns:turn.example.org',
+ credentialType: 'oauth',
+ username: 'user',
+ credential: 'cred'
+ }] }));
+ }, 'with turns server, credentialType oauth, and string credential should throw InvalidAccessError');
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: 'turns:turn.example.org',
+ credentialType: 'oauth',
+ username: 'user',
+ credential: {
+ macKey: 'mac',
+ accessToken: 'token'
+ }
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['turns:turn.example.org']);
+ assert_equals(server.credentialType, 'oauth');
+ assert_equals(server.username, 'user');
+
+ const { credential } = server;
+ assert_equals(credential.macKey, 'mac');
+ assert_equals(credential.accessToken, 'token');
+
+ }, `with turns server, credentialType oauth and RTCOAuthCredential credential should succeed`);
+
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: ['turns:turn.example.org', 'stun:stun1.example.net'],
+ credentialType: 'oauth',
+ username: 'user',
+ credential: {
+ macKey: 'mac',
+ accessToken: 'token'
+ }
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['turns:turn.example.org', 'stun:stun1.example.net']);
+ assert_equals(server.credentialType, 'oauth');
+ assert_equals(server.username, 'user');
+
+ const { credential } = server;
+ assert_equals(credential.macKey, 'mac');
+ assert_equals(credential.accessToken, 'token');
+
+ }, `with both turns and stun server, credentialType oauth and RTCOAuthCredential credential should succeed`);
+
+ // credential type validation is ignored when scheme name is stun
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: 'stun:stun1.example.net',
+ credentialType: 'oauth',
+ username: 'user',
+ credential: 'cred'
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+ const server = iceServers[0];
+
+ assert_array_equals(server.urls, ['stun:stun1.example.net']);
+ assert_equals(server.credentialType, 'oauth');
+ assert_equals(server.username, 'user');
+ assert_equals(server.credential, 'cred');
+
+ }, 'with stun server, credentialType oauth, and string credential should succeed');
+
+ // credential type validation is ignored when scheme name is stun
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: 'stun:stun1.example.net',
+ credentialType: 'password',
+ username: 'user',
+ credential: {
+ macKey: '',
+ accessToken: ''
+ }
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, ['stun:stun1.example.net']);
+ assert_equals(server.credentialType, 'password');
+ assert_equals(server.username, 'user');
+
+ const { credential } = server;
+ assert_equals(credential.macKey, '');
+ assert_equals(credential.accessToken, '');
+
+ }, 'with stun server, credentialType password, and RTCOAuthCredential credential should succeed');
+
+ // credential type validation is ignored when urls is empty and there is no scheme name
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: [],
+ credentialType: 'oauth',
+ username: 'user',
+ credential: 'cred'
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+ const server = iceServers[0];
+
+ assert_array_equals(server.urls, []);
+ assert_equals(server.credentialType, 'oauth');
+ assert_equals(server.username, 'user');
+ assert_equals(server.credential, 'cred');
+
+ }, 'with empty urls list, credentialType oauth, and string credential should succeed');
+
+ // credential type validation is ignored when urls is empty and there is no scheme name
+ config_test(makePc => {
+ const pc = makePc({ iceServers: [{
+ urls: [],
+ credentialType: 'password',
+ username: 'user',
+ credential: {
+ macKey: '',
+ accessToken: ''
+ }
+ }] });
+
+ const { iceServers } = pc.getConfiguration();
+ assert_equals(iceServers.length, 1);
+
+ const server = iceServers[0];
+ assert_array_equals(server.urls, []);
+ assert_equals(server.credentialType, 'password');
+ assert_equals(server.username, 'user');
+
+ const { credential } = server;
+ assert_equals(credential.macKey, '');
+ assert_equals(credential.accessToken, '');
+
+ }, 'with empty urls list, credentialType password, and RTCOAuthCredential credential should succeed');
+
+ /*
+ Tested
+ 4.3.2. To set a configuration
+ 11.1-6.
+
+ Untestable
+ 4.3.2. To set a configuration
+ 11.7. Append server to validatedServers.
+
+ Coverage Report
+ Tested 9
+ Not Tested 0
+ Untestable 1
+ Total 10
+ */
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceTransportPolicy.html b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceTransportPolicy.html
new file mode 100644
index 00000000000..7387c5424cd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-iceTransportPolicy.html
@@ -0,0 +1,119 @@
+<!doctype html>
+<title>RTCConfiguration iceTransportPolicy</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCConfiguration-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper function is called from RTCConfiguration-helper.js:
+ // config_test
+
+ /*
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ RTCConfiguration getConfiguration();
+ void setConfiguration(RTCConfiguration configuration);
+ ...
+ };
+
+ dictionary RTCConfiguration {
+ sequence<RTCIceServer> iceServers;
+ RTCIceTransportPolicy iceTransportPolicy = "all";
+ };
+
+ enum RTCIceTransportPolicy {
+ "relay",
+ "all"
+ };
+ */
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ assert_equals(pc.getConfiguration().iceTransportPolicy, 'all');
+ }, `new RTCPeerConnection() should have default iceTransportPolicy all`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ iceTransportPolicy: undefined });
+ assert_equals(pc.getConfiguration().iceTransportPolicy, 'all');
+ }, `new RTCPeerConnection({ iceTransportPolicy: undefined }) should have default iceTransportPolicy all`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ iceTransportPolicy: 'all' });
+ assert_equals(pc.getConfiguration().iceTransportPolicy, 'all');
+ }, `new RTCPeerConnection({ iceTransportPolicy: 'all' }) should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ iceTransportPolicy: 'relay' });
+ assert_equals(pc.getConfiguration().iceTransportPolicy, 'relay');
+ }, `new RTCPeerConnection({ iceTransportPolicy: 'relay' }) should succeed`);
+
+ /*
+ 4.3.2. Set a configuration
+ 8. Set the ICE Agent's ICE transports setting to the value of
+ configuration.iceTransportPolicy. As defined in [JSEP] (section 4.1.16.),
+ if the new ICE transports setting changes the existing setting, no action
+ will be taken until the next gathering phase. If a script wants this to
+ happen immediately, it should do an ICE restart.
+ */
+ test(() => {
+ const pc = new RTCPeerConnection({ iceTransportPolicy: 'all' });
+ assert_equals(pc.getConfiguration().iceTransportPolicy, 'all');
+
+ pc.setConfiguration({ iceTransportPolicy: 'relay' });
+ assert_equals(pc.getConfiguration(), iceTransportPolicy, 'relay');
+ }, `setConfiguration({ iceTransportPolicy: 'relay' }) with initial iceTransportPolicy all should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ iceTransportPolicy: 'relay' });
+ assert_equals(pc.getConfiguration().iceTransportPolicy, 'relay');
+
+ pc.setConfiguration({ iceTransportPolicy: 'all' });
+ assert_equals(pc.getConfiguration(), iceTransportPolicy, 'all');
+ }, `setConfiguration({ iceTransportPolicy: 'all' }) with initial iceTransportPolicy relay should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ iceTransportPolicy: 'relay' });
+ assert_equals(pc.getConfiguration().iceTransportPolicy, 'relay');
+
+ // default value for iceTransportPolicy is all
+ pc.setConfiguration({});
+ assert_equals(pc.getConfiguration(), iceTransportPolicy, 'all');
+ }, `setConfiguration({}) with initial iceTransportPolicy relay should set new value to all`);
+
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ iceTransportPolicy: 'invalid' }));
+ }, `with invalid iceTransportPolicy should throw TypeError`);
+
+ // "none" is in Blink and Gecko's IDL, but not in the spec.
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ iceTransportPolicy: 'none' }));
+ }, `with none iceTransportPolicy should throw TypeError`);
+
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ iceTransportPolicy: null }));
+ }, `with null iceTransportPolicy should throw TypeError`);
+
+ // iceTransportPolicy is called iceTransports in Blink.
+ test(() => {
+ const pc = new RTCPeerConnection({ iceTransports: 'relay' });
+ assert_equals(pc.getConfiguration().iceTransportPolicy, 'all');
+ }, `new RTCPeerConnection({ iceTransports: 'relay' }) should have no effect`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ iceTransports: 'invalid' });
+ assert_equals(pc.getConfiguration().iceTransportPolicy, 'all');
+ }, `new RTCPeerConnection({ iceTransports: 'invalid' }) should have no effect`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ iceTransports: null });
+ assert_equals(pc.getConfiguration().iceTransportPolicy, 'all');
+ }, `new RTCPeerConnection({ iceTransports: null }) should have no effect`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-rtcpMuxPolicy.html b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-rtcpMuxPolicy.html
new file mode 100644
index 00000000000..6b65a12f07f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCConfiguration-rtcpMuxPolicy.html
@@ -0,0 +1,143 @@
+<!doctype html>
+<title>RTCConfiguration rtcpMuxPolicy</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCConfiguration-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper function is called from RTCConfiguration-helper.js:
+ // config_test
+
+ /*
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ RTCConfiguration getConfiguration();
+ void setConfiguration(RTCConfiguration configuration);
+ ...
+ };
+
+ dictionary RTCConfiguration {
+ RTCRtcpMuxPolicy rtcpMuxPolicy = "require";
+ ...
+ };
+
+ enum RTCRtcpMuxPolicy {
+ "negotiate",
+ "require"
+ };
+ */
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ assert_equals(pc.getConfiguration().rtcpMuxPolicy, 'require');
+ }, `new RTCPeerConnection() should have default rtcpMuxPolicy require`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ rtcpMuxPolicy: undefined });
+ assert_equals(pc.getConfiguration().rtcpMuxPolicy, 'require');
+ }, `new RTCPeerConnection({ rtcpMuxPolicy: undefined }) should have default rtcpMuxPolicy require`);
+
+ test(() => {
+ const pc = new RTCPeerConnection({ rtcpMuxPolicy: 'require' });
+ assert_equals(pc.getConfiguration().rtcpMuxPolicy, 'require');
+ }, `new RTCPeerConnection({ rtcpMuxPolicy: 'require' }) should succeed`);
+
+ /*
+ 4.3.1.1. Constructor
+ 3. If configuration.rtcpMuxPolicy is negotiate, and the user agent does not
+ implement non-muxed RTCP, throw a NotSupportedError.
+ */
+ test(() => {
+ let pc;
+ try {
+ pc = new RTCPeerConnection({ rtcpMuxPolicy: 'negotiate' });
+ } catch(err) {
+ // NotSupportedError is a DOMException with code 9
+ if(err.code === 9 && err.name === 'NotSupportedError') {
+ // ignore error and pass test if negotiate is not supported
+ return;
+ } else {
+ throw err;
+ }
+ }
+
+ assert_equals(pc.getConfiguration().rtcpMuxPolicy, 'negotiate');
+
+ }, `new RTCPeerConnection({ rtcpMuxPolicy: 'negotiate' }) may succeed or throw NotSupportedError`);
+
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ rtcpMuxPolicy: null }));
+ }, `with { rtcpMuxPolicy: null } should throw TypeError`);
+
+ config_test(makePc => {
+ assert_throws(new TypeError(), () =>
+ makePc({ rtcpMuxPolicy: 'invalid' }));
+ }, `with { rtcpMuxPolicy: 'invalid' } should throw TypeError`);
+
+ /*
+ 4.3.2. Set a configuration
+ 6. If configuration.rtcpMuxPolicy is set and its value differs from the
+ connection's rtcpMux policy, throw an InvalidModificationError.
+ */
+
+ test(() => {
+ const pc = new RTCPeerConnection({ rtcpMuxPolicy: 'require' });
+ assert_idl_attribute(pc, 'setConfiguration');
+ assert_throws('InvalidModificationError', () =>
+ pc.setConfiguration({ rtcpMuxPolicy: 'negotiate' }));
+
+ }, `setConfiguration({ rtcpMuxPolicy: 'negotiate' }) with initial rtcpMuxPolicy require should throw InvalidModificationError`);
+
+ test(() => {
+ let pc;
+ try {
+ pc = new RTCPeerConnection({ rtcpMuxPolicy: 'negotiate' });
+ } catch(err) {
+ // NotSupportedError is a DOMException with code 9
+ if(err.code === 9 && err.name === 'NotSupportedError') {
+ // ignore error and pass test if negotiate is not supported
+ return;
+ } else {
+ throw err;
+ }
+ }
+
+ assert_idl_attribute(pc, 'setConfiguration');
+ assert_throws('InvalidModificationError', () =>
+ pc.setConfiguration({ rtcpMuxPolicy: 'require' }));
+
+ }, `setConfiguration({ rtcpMuxPolicy: 'require' }) with initial rtcpMuxPolicy negotiate should throw InvalidModificationError`);
+
+ test(() => {
+ let pc;
+ try {
+ pc = new RTCPeerConnection({ rtcpMuxPolicy: 'negotiate' });
+ } catch(err) {
+ // NotSupportedError is a DOMException with code 9
+ if(err.code === 9 && err.name === 'NotSupportedError') {
+ // ignore error and pass test if negotiate is not supported
+ return;
+ } else {
+ throw err;
+ }
+ }
+
+ assert_idl_attribute(pc, 'setConfiguration');
+ // default value for rtcpMuxPolicy is require
+ assert_throws('InvalidModificationError', () =>
+ pc.setConfiguration({}));
+
+ }, `setConfiguration({}) with initial rtcpMuxPolicy negotiate should throw InvalidModificationError`);
+
+ /*
+ Coverage Report
+
+ Tested 2
+ Total 2
+ */
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-helper.js b/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-helper.js
new file mode 100644
index 00000000000..865d0ea72a6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-helper.js
@@ -0,0 +1,114 @@
+'use strict';
+
+// Test is based on the following editor draft:
+// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+// Code using this helper should also include RTCPeerConnection-helper.js
+// in the main HTML file
+
+// The following helper functions are called from RTCPeerConnection-helper.js:
+// getTrackFromUserMedia
+
+// Create a RTCDTMFSender using getUserMedia()
+function createDtmfSender(pc = new RTCPeerConnection()) {
+ return getTrackFromUserMedia('audio')
+ .then(([track, mediaStream]) => {
+ const sender = pc.addTrack(track, mediaStream);
+ const dtmfSender = sender.dtmf;
+
+ assert_true(dtmfSender instanceof RTCDTMFSender,
+ 'Expect audio sender.dtmf to be set to a RTCDTMFSender');
+
+ return dtmfSender;
+ });
+}
+
+/*
+ Create an RTCDTMFSender and test tonechange events on it.
+ testFunc
+ Test function that is going to manipulate the DTMFSender.
+ It will be called with:
+ t - the test object
+ sender - the created RTCDTMFSender
+ pc - the associated RTCPeerConnection as second argument.
+ toneChanges
+ Array of expected tonechange events fired. The elements
+ are array of 3 items:
+ expectedTone
+ The expected character in event.tone
+ expectedToneBuffer
+ The expected new value of dtmfSender.toneBuffer
+ expectedDuration
+ The rough time since beginning or last tonechange event
+ was fired.
+ desc
+ Test description.
+ */
+function test_tone_change_events(testFunc, toneChanges, desc) {
+ async_test(t => {
+ const pc = new RTCPeerConnection();
+
+ createDtmfSender(pc)
+ .then(dtmfSender => {
+ let lastEventTime = Date.now();
+
+ const onToneChange = t.step_func(ev => {
+ assert_true(ev instanceof RTCDTMFToneChangeEvent,
+ 'Expect tone change event object to be an RTCDTMFToneChangeEvent');
+
+ const { tone } = ev;
+ assert_equals(typeof tone, 'string',
+ 'Expect event.tone to be the tone string');
+
+ assert_greater_than(toneChanges.length, 0,
+ 'More tonechange event is fired than expected');
+
+ const [
+ expectedTone, expectedToneBuffer, expectedDuration
+ ] = toneChanges.shift();
+
+ assert_equals(tone, expectedTone,
+ `Expect current event.tone to be ${expectedTone}`);
+
+ assert_equals(dtmfSender.toneBuffer, expectedToneBuffer,
+ `Expect dtmfSender.toneBuffer to be updated to ${expectedToneBuffer}`);
+
+ const now = Date.now();
+ const duration = now - lastEventTime;
+
+ assert_approx_equals(duration, expectedDuration, 50,
+ `Expect tonechange event for "${tone}" to be fired approximately after ${expectedDuration} seconds`);
+
+ lastEventTime = now;
+
+ if(toneChanges.length === 0) {
+ // Wait for same duration as last expected duration + 100ms
+ // before passing test in case there are new tone events fired,
+ // in which case the test should fail.
+ t.step_timeout(
+ t.step_func(() => {
+ t.done();
+ pc.close();
+ }), expectedDuration + 100);
+ }
+ });
+
+ dtmfSender.addEventListener('tonechange', onToneChange);
+
+ testFunc(t, dtmfSender, pc);
+ })
+ .catch(t.step_func(err => {
+ assert_unreached(`Unexpected promise rejection: ${err}`);
+ }));
+ }, desc);
+}
+
+// Get the one and only tranceiver from pc.getTransceivers().
+// Assumes that there is only one tranceiver in pc.
+function getTransceiver(pc) {
+ const transceivers = pc.getTransceivers();
+ assert_equals(transceivers.length, 1,
+ 'Expect there to be only one tranceiver in pc');
+
+ return transceivers[0];
+}
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https.html b/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https.html
new file mode 100644
index 00000000000..1f6a453db54
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-insertDTMF.https.html
@@ -0,0 +1,165 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCDTMFSender.prototype.insertDTMF</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script src="RTCDTMFSender-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js
+ // generateAnswer
+
+ // The following helper functions are called from RTCDTMFSender-helper.js
+ // createDtmfSender
+ // test_tone_change_events
+ // getTransceiver
+
+ /*
+ 7. Peer-to-peer DTMF
+ partial interface RTCRtpSender {
+ readonly attribute RTCDTMFSender? dtmf;
+ };
+
+ interface RTCDTMFSender : EventTarget {
+ void insertDTMF(DOMString tones,
+ optional unsigned long duration = 100,
+ optional unsigned long interToneGap = 70);
+ attribute EventHandler ontonechange;
+ readonly attribute DOMString toneBuffer;
+ };
+ */
+
+ /*
+ 7.2. insertDTMF
+ The tones parameter is treated as a series of characters.
+
+ The characters 0 through 9, A through D, #, and * generate the associated
+ DTMF tones.
+
+ The characters a to d MUST be normalized to uppercase on entry and are
+ equivalent to A to D.
+
+ As noted in [RTCWEB-AUDIO] Section 3, support for the characters 0 through 9,
+ A through D, #, and * are required.
+
+ The character ',' MUST be supported, and indicates a delay of 2 seconds
+ before processing the next character in the tones parameter.
+
+ All other characters (and only those other characters) MUST be considered
+ unrecognized.
+ */
+ promise_test(t => {
+ return createDtmfSender()
+ .then(dtmfSender => {
+ dtmfSender.insertDTMF('');
+ dtmfSender.insertDTMF('012345689');
+ dtmfSender.insertDTMF('ABCD');
+ dtmfSender.insertDTMF('abcd');
+ dtmfSender.insertDTMF('#*');
+ dtmfSender.insertDTMF(',');
+ dtmfSender.insertDTMF('0123456789ABCDabcd#*,');
+ });
+ }, 'insertDTMF() should succeed if tones contains valid DTMF characters');
+
+
+ /*
+ 7.2. insertDTMF
+ 6. If tones contains any unrecognized characters, throw an
+ InvalidCharacterError.
+ */
+ promise_test(t => {
+ return createDtmfSender()
+ .then(dtmfSender => {
+ assert_throws('InvalidCharacterError', () =>
+ // 'F' is invalid
+ dtmfSender.insertDTMF('123FFABC'));
+
+ assert_throws('InvalidCharacterError', () =>
+ // 'E' is invalid
+ dtmfSender.insertDTMF('E'));
+
+ assert_throws('InvalidCharacterError', () =>
+ // ' ' is invalid
+ dtmfSender.insertDTMF('# *'));
+ });
+ }, 'insertDTMF() should throw InvalidCharacterError if tones contains invalid DTMF characters');
+
+ /*
+ 7.2. insertDTMF
+ 3. If transceiver.stopped is true, throw an InvalidStateError.
+ */
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const dtmfSender = transceiver.sender.dtmf;
+
+ transceiver.stop();
+ assert_throws('InvalidStateError', () => dtmfSender.insertDTMF(''));
+
+ }, 'insertDTMF() should throw InvalidStateError if transceiver is stopped');
+
+ /*
+ 7.2. insertDTMF
+ 4. If transceiver.currentDirection is recvonly or inactive, throw an InvalidStateError.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio', {
+ direction: 'recvonly'
+ });
+ const dtmfSender = transceiver.sender.dtmf;
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(() => {
+ assert_equals(transceiver.currentDirection, 'inactive');
+ assert_throws('InvalidStateError', () => dtmfSender.insertDTMF(''));
+ });
+ }, 'insertDTMF() should throw InvalidStateError if transceiver.currentDirection is recvonly');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio', {
+ direction: 'inactive'
+ });
+ const dtmfSender = transceiver.sender.dtmf;
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(() => {
+ assert_equals(transceiver.currentDirection, 'inactive');
+ assert_throws('InvalidStateError', () => dtmfSender.insertDTMF(''));
+ });
+ }, 'insertDTMF() should throw InvalidStateError if transceiver.currentDirection is inactive');
+
+ /*
+ 7.2. insertDTMF
+ The characters a to d MUST be normalized to uppercase on entry and are
+ equivalent to A to D.
+
+ 7. Set the object's toneBuffer attribute to tones.
+ */
+ promise_test(() => {
+ return createDtmfSender()
+ .then(dtmfSender => {
+ dtmfSender.insertDTMF('123');
+ assert_equals(dtmfSender.toneBuffer, '123');
+
+ dtmfSender.insertDTMF('ABC');
+ assert_equals(dtmfSender.toneBuffer, 'ABC');
+
+ dtmfSender.insertDTMF('bcd');
+ assert_equals(dtmfSender.toneBuffer, 'BCD');
+ });
+ }, 'insertDTMF() should set toneBuffer to provided tones normalized, with old tones overridden');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-ontonechange-long.https.html b/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-ontonechange-long.https.html
new file mode 100644
index 00000000000..852194d024a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-ontonechange-long.https.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta name="timeout" content="long">
+<title>RTCDTMFSender.prototype.ontonechange (Long Timeout)</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script src="RTCDTMFSender-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCDTMFSender-helper.js
+ // test_tone_change_events
+
+ /*
+ 7. Peer-to-peer DTMF
+ partial interface RTCRtpSender {
+ readonly attribute RTCDTMFSender? dtmf;
+ };
+
+ interface RTCDTMFSender : EventTarget {
+ void insertDTMF(DOMString tones,
+ optional unsigned long duration = 100,
+ optional unsigned long interToneGap = 70);
+ attribute EventHandler ontonechange;
+ readonly attribute DOMString toneBuffer;
+ };
+
+ [Constructor(DOMString type, RTCDTMFToneChangeEventInit eventInitDict)]
+ interface RTCDTMFToneChangeEvent : Event {
+ readonly attribute DOMString tone;
+ };
+ */
+
+ /*
+ 7.2. insertDTMF
+ 8. If the value of the duration parameter is less than 40, set it to 40.
+ If, on the other hand, the value is greater than 6000, set it to 6000.
+ */
+ test_tone_change_events((t, dtmfSender) => {
+ dtmfSender.insertDTMF('A', 8000, 70);
+ }, [
+ ['A', '', 0],
+ ['', '', 6070]
+ ],'insertDTMF with duration greater than 6000 should be clamped to 6000');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-ontonechange.https.html b/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-ontonechange.https.html
new file mode 100644
index 00000000000..fcaa5099c23
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCDTMFSender-ontonechange.https.html
@@ -0,0 +1,285 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCDTMFSender.prototype.ontonechange</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script src="RTCDTMFSender-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js
+ // generateAnswer
+
+ // The following helper functions are called from RTCDTMFSender-helper.js
+ // test_tone_change_events
+ // getTransceiver
+
+ /*
+ 7. Peer-to-peer DTMF
+ partial interface RTCRtpSender {
+ readonly attribute RTCDTMFSender? dtmf;
+ };
+
+ interface RTCDTMFSender : EventTarget {
+ void insertDTMF(DOMString tones,
+ optional unsigned long duration = 100,
+ optional unsigned long interToneGap = 70);
+ attribute EventHandler ontonechange;
+ readonly attribute DOMString toneBuffer;
+ };
+
+ [Constructor(DOMString type, RTCDTMFToneChangeEventInit eventInitDict)]
+ interface RTCDTMFToneChangeEvent : Event {
+ readonly attribute DOMString tone;
+ };
+ */
+
+ /*
+ 7.2. insertDTMF
+ 11. If a Playout task is scheduled to be run; abort these steps; otherwise queue
+ a task that runs the following steps (Playout task):
+ 3. If toneBuffer is an empty string, fire an event named tonechange with an
+ empty string at the RTCDTMFSender object and abort these steps.
+ 4. Remove the first character from toneBuffer and let that character be tone.
+ 6. Queue a task to be executed in duration + interToneGap ms from now that
+ runs the steps labelled Playout task.
+ 7. Fire an event named tonechange with a string consisting of tone at the
+ RTCDTMFSender object.
+ */
+ test_tone_change_events(dtmfSender => {
+ dtmfSender.insertDTMF('123');
+ }, [
+ ['1', '23', 0],
+ ['2', '3', 170],
+ ['3', '', 170],
+ ['', '', 170]
+ ], 'insertDTMF() with default duration and intertoneGap should fire tonechange events at the expected time');
+
+ test_tone_change_events(dtmfSender => {
+ dtmfSender.insertDTMF('abc', 100, 70);
+ }, [
+ ['A', 'BC', 0],
+ ['B', 'C', 170],
+ ['C', '', 170],
+ ['', '', 170]
+ ], 'insertDTMF() with explicit duration and intertoneGap should fire tonechange events at the expected time');
+
+ /*
+ 7.2. insertDTMF
+ 10. If toneBuffer is an empty string, abort these steps.
+ */
+ async_test(t => {
+ createDtmfSender()
+ .then(dtmfSender => {
+ dtmfSender.addEventListener('tonechange',
+ t.unreached_func('Expect no tonechange event to be fired'));
+
+ dtmfSender.insertDTMF('', 100, 70);
+
+ t.step_timeout(t.step_func_done(), 300);
+ })
+ .catch(t.step_func(err => {
+ assert_unreached(`Unexpected promise rejection: ${err}`);
+ }));
+ }, `insertDTMF('') should not fire any tonechange event, including for '' tone`);
+
+ /*
+ 7.2. insertDTMF
+ 8. If the value of the duration parameter is less than 40, set it to 40.
+ If, on the other hand, the value is greater than 6000, set it to 6000.
+ */
+ test_tone_change_events((t, dtmfSender) => {
+ dtmfSender.insertDTMF('ABC', 10, 70);
+ }, [
+ ['A', 'BC', 0],
+ ['B', 'C', 110],
+ ['C', '', 110],
+ ['', '', 110]
+ ], 'insertDTMF() with duration less than 40 should be clamped to 40');
+
+ /*
+ 7.2. insertDTMF
+ 9. If the value of the interToneGap parameter is less than 30, set it to 30.
+ */
+ test_tone_change_events((t, dtmfSender) => {
+ dtmfSender.insertDTMF('ABC', 100, 10);
+ }, [
+ ['A', 'BC', 0],
+ ['B', 'C', 130],
+ ['C', '', 130],
+ ['', '', 130]
+ ],
+ 'insertDTMF() with interToneGap less than 30 should be clamped to 30');
+
+ /*
+ [w3c/webrtc-pc#1373]
+ This step is added to handle the "," character correctly. "," supposed to delay the next
+ tonechange event by 2000ms.
+
+ 7.2. insertDTMF
+ 11.5. If tone is "," delay sending tones for 2000 ms on the associated RTP media
+ stream, and queue a task to be executed in 2000 ms from now that runs the
+ steps labelled Playout task.
+ */
+ test_tone_change_events((t, dtmfSender) => {
+ dtmfSender.insertDTMF('A,B', 100, 70);
+
+ }, [
+ ['A', ',B', 0],
+ [',', 'B', 170],
+ ['B', '', 2000],
+ ['', '', 170]
+ ], 'insertDTMF with comma should delay next tonechange event for a constant 2000ms');
+
+ /*
+ 7.2. insertDTMF
+ 11.1. If transceiver.stopped is true, abort these steps.
+ */
+ test_tone_change_events((t, dtmfSender, pc) => {
+ const transceiver = getTransceiver(pc);
+ dtmfSender.addEventListener('tonechange', ev => {
+ if(ev.tone === 'B') {
+ transceiver.stop();
+ }
+ });
+
+ dtmfSender.insertDTMF('ABC', 100, 70);
+ }, [
+ ['A', 'BC', 0],
+ ['B', 'C', 170]
+ ], 'insertDTMF() with transceiver stopped in the middle should stop future tonechange events from firing');
+
+ /*
+ 7.2. insertDTMF
+ 3. If a Playout task is scheduled to be run, abort these steps;
+ otherwise queue a task that runs the following steps (Playout task):
+ */
+ test_tone_change_events((t, dtmfSender) => {
+ dtmfSender.addEventListener('tonechange', ev => {
+ if(ev.tone === 'B') {
+ // Set a timeout to make sure the toneBuffer
+ // is changed after the tonechange event listener
+ // by test_tone_change_events is called.
+ // This is to correctly test the expected toneBuffer.
+ t.step_timeout(() => {
+ dtmfSender.insertDTMF('12', 100, 70);
+ }, 10);
+ }
+ });
+
+ dtmfSender.insertDTMF('ABC', 100, 70);
+ }, [
+ ['A', 'BC', 0],
+ ['B', 'C', 170],
+ ['1', '2', 170],
+ ['2', '', 170],
+ ['', '', 170]
+ ], 'Calling insertDTMF() in the middle of tonechange events should cause future tonechanges to be updated to new tones');
+
+
+ /*
+ 7.2. insertDTMF
+ 3. If a Playout task is scheduled to be run, abort these steps;
+ otherwise queue a task that runs the following steps (Playout task):
+ */
+ test_tone_change_events((t, dtmfSender) => {
+ dtmfSender.addEventListener('tonechange', ev => {
+ if(ev.tone === 'B') {
+ t.step_timeout(() => {
+ dtmfSender.insertDTMF('12', 100, 70);
+ dtmfSender.insertDTMF('34', 100, 70);
+ }, 10);
+ }
+ });
+
+ dtmfSender.insertDTMF('ABC', 100, 70);
+ }, [
+ ['A', 'BC', 0],
+ ['B', 'C', 170],
+ ['3', '4', 170],
+ ['4', '', 170],
+ ['', '', 170]
+ ], 'Calling insertDTMF() multiple times in the middle of tonechange events should cause future tonechanges to be updated the last provided tones');
+
+ /*
+ 7.2. insertDTMF
+ 3. If a Playout task is scheduled to be run, abort these steps;
+ otherwise queue a task that runs the following steps (Playout task):
+ */
+ test_tone_change_events((t, dtmfSender) => {
+ dtmfSender.addEventListener('tonechange', ev => {
+ if(ev.tone === 'B') {
+ t.step_timeout(() => {
+ dtmfSender.insertDTMF('');
+ }, 10);
+ }
+ });
+
+ dtmfSender.insertDTMF('ABC', 100, 70);
+ }, [
+ ['A', 'BC', 0],
+ ['B', 'C', 170],
+ ['', '', 170]
+ ], `Calling insertDTMF('') in the middle of tonechange events should stop future tonechange events from firing`);
+
+ /*
+ 7.2. insertDTMF
+ 11.2. If transceiver.currentDirection is recvonly or inactive, abort these steps.
+ */
+ async_test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio', { direction: 'sendrecv' });
+ const dtmfSender = transceiver.sender.dtmf;
+
+ // Since setRemoteDescription happens in parallel with tonechange event,
+ // We use a flag and allow tonechange events to be fired as long as
+ // the promise returned by setRemoteDescription is not yet resolved.
+ let remoteDescriptionIsSet = false;
+
+ // We only do basic tone verification and not check timing here
+ let expectedTones = ['A', 'B', 'C', 'D', ''];
+
+ const onToneChange = t.step_func(ev => {
+ assert_false(remoteDescriptionIsSet,
+ 'Expect no tonechange event to be fired after currentDirection is changed to recvonly');
+
+ const { tone } = ev;
+ const expectedTone = expectedTones.shift();
+ assert_equals(tone, expectedTone,
+ `Expect fired event.tone to be ${expectedTone}`);
+
+ // Only change transceiver.currentDirection after the first
+ // tonechange event, to make sure that tonechange is triggered
+ // then stopped
+ if(tone === 'A') {
+ transceiver.setDirection('recvonly');
+
+ pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer => pc.setRemoteDescription(answer))
+ .then(() => {
+ assert_equals(transceiver.currentDirection, 'recvonly');
+ remoteDescriptionIsSet = true;
+
+ // Pass the test if no further tonechange event is
+ // fired in the next 300ms
+ t.step_timeout(t.step_func_done(), 300);
+ })
+ .catch(t.step_func(err => {
+ assert_unreached(`Unexpected promise rejection: ${err}`);
+ }));
+ }
+ });
+
+ dtmfSender.addEventListener('tonechange', onToneChange);
+ dtmfSender.insertDTMF('ABCD', 100, 70);
+
+ }, `Setting transceiver.currentDirection to recvonly in the middle of tonechange events should stop future tonechange events from firing`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/tests/wpt/web-platform-tests/webrtc/RTCDtlsTransport-getRemoteCertificates.html
new file mode 100644
index 00000000000..0fd5340006b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCDtlsTransport-getRemoteCertificates.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>RTCDtlsTransport.prototype.getRemoteCertificates</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // exchangeIceCandidates
+ // doSignalingHandshake
+
+ /*
+ 5.5. RTCDtlsTransport Interface
+ interface RTCDtlsTransport : EventTarget {
+ readonly attribute RTCDtlsTransportState state;
+ sequence<ArrayBuffer> getRemoteCertificates();
+ attribute EventHandler onstatechange;
+ attribute EventHandler onerror;
+ ...
+ };
+
+ enum RTCDtlsTransportState {
+ "new",
+ "connecting",
+ "connected",
+ "closed",
+ "failed"
+ };
+
+ getRemoteCertificates
+ Returns the certificate chain in use by the remote side, with each certificate
+ encoded in binary Distinguished Encoding Rules (DER) [X690].
+ getRemoteCertificates() will return an empty list prior to selection of the
+ remote certificate, which will be completed by the time RTCDtlsTransportState
+ transitions to "connected".
+ */
+ async_test(t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ pc1.createDataChannel('test');
+ exchangeIceCandidates(pc1, pc2);
+
+ doSignalingHandshake(pc1, pc2)
+ .then(t.step_func(() => {
+ // pc.sctp is set when set*Description(answer) is called
+ const sctpTransport1 = pc1.sctp;
+ const sctpTransport2 = pc2.sctp;
+
+ assert_true(sctpTransport1 instanceof RTCSctpTransport,
+ 'Expect pc.sctp to be set to valid RTCSctpTransport');
+
+ assert_true(sctpTransport2 instanceof RTCSctpTransport,
+ 'Expect pc.sctp to be set to valid RTCSctpTransport');
+
+ const dtlsTransport1 = sctpTransport1.transport;
+ const dtlsTransport2 = sctpTransport2.transport;
+
+ const testedTransports = new Set();
+
+ // Callback function that test the respective DTLS transports
+ // when they become connected.
+ const onConnected = t.step_func(dtlsTransport => {
+ const certs = dtlsTransport.getRemoteCertificates();
+
+ assert_greater_than(certs.length, 0,
+ 'Expect DTLS transport to have at least one remote certificate when connected');
+
+ for(const cert of certs) {
+ assert_true(cert instanceof ArrayBuffer,
+ 'Expect certificate elements be instance of ArrayBuffer');
+ }
+
+ testedTransports.add(dtlsTransport);
+
+ // End the test if both dtlsTransports are tested.
+ if(testedTransports.has(dtlsTransport1) && testedTransports.has(dtslTransport2)) {
+ t.done();
+ }
+ })
+
+ for(const dtlsTransport of [dtlsTransport1, dtlsTransport2]) {
+ if(dtlsTransport.state === 'connected') {
+ onConnected(dtlsTransport);
+ } else {
+ assert_array_equals(dtlsTransport.getCertificates(), [],
+ 'Expect DTLS certificates be initially empty until become connected');
+
+ dtlsTransport.addEventListener('statechange', t.step_func(() => {
+ if(dtlsTransport.state === 'connected') {
+ onConnected(dtlsTransport);
+ }
+ }));
+
+ dtlsTransport.addEventListener('error', t.step_func(err => {
+ assert_unreached(`Unexpected error during DTLS handshake: ${err}`);
+ }));
+ }
+ }
+ }));
+ });
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCIceTransport.html b/tests/wpt/web-platform-tests/webrtc/RTCIceTransport.html
new file mode 100644
index 00000000000..57ecf07f7b1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCIceTransport.html
@@ -0,0 +1,190 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCIceTransport</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // createDataChannelPair
+ // awaitMessage
+
+ /*
+ 5.6. RTCIceTransport Interface
+ interface RTCIceTransport {
+ readonly attribute RTCIceRole role;
+ readonly attribute RTCIceComponent component;
+ readonly attribute RTCIceTransportState state;
+ readonly attribute RTCIceGathererState gatheringState;
+ sequence<RTCIceCandidate> getLocalCandidates();
+ sequence<RTCIceCandidate> getRemoteCandidates();
+ RTCIceCandidatePair? getSelectedCandidatePair();
+ RTCIceParameters? getLocalParameters();
+ RTCIceParameters? getRemoteParameters();
+ ...
+ };
+
+ getLocalCandidates
+ Returns a sequence describing the local ICE candidates gathered for this
+ RTCIceTransport and sent in onicecandidate
+
+ getRemoteCandidates
+ Returns a sequence describing the remote ICE candidates received by this
+ RTCIceTransport via addIceCandidate()
+
+ getSelectedCandidatePair
+ Returns the selected candidate pair on which packets are sent, or null if
+ there is no such pair.
+
+ getLocalParameters
+ Returns the local ICE parameters received by this RTCIceTransport via
+ setLocalDescription , or null if the parameters have not yet been received.
+
+ getRemoteParameters
+ Returns the remote ICE parameters received by this RTCIceTransport via
+ setRemoteDescription or null if the parameters have not yet been received.
+ */
+ function getIceTransportFromSctp(pc) {
+ const sctpTransport = pc.sctp;
+ assert_true(sctpTransport instanceof RTCSctpTransport,
+ 'Expect pc.sctp to be instantiated from RTCSctpTransport');
+
+ const dtlsTransport = sctpTransport.transport;
+ assert_true(dtlsTransport instanceof RTCDtlsTransport,
+ 'Expect sctp.transport to be an RTCDtlsTransport');
+
+ const iceTransport = dtlsTransport.transport;
+ assert_true(iceTransport instanceof RTCIceTransport,
+ 'Expect dtlsTransport.transport to be an RTCIceTransport');
+
+ return iceTransport;
+ }
+
+ function validateCandidates(candidates) {
+ assert_greater_than(candidates.length, 0,
+ 'Expect at least one ICE candidate returned from get*Candidates()');
+
+ for(const candidate of candidates) {
+ assert_true(candidate instanceof RTCIceCandidate,
+ 'Expect candidate elements to be instance of RTCIceCandidate');
+ }
+ }
+
+ function validateCandidateParameter(param) {
+ assert_not_equals(param, null,
+ 'Expect candidate parameter to be non-null after data channels are connected');
+
+ assert_equals(typeof param.usernameFragment, 'string',
+ 'Expect param.usernameFragment to be set with string value');
+
+ assert_equals(typeof param.password, 'string',
+ 'Expect param.password to be set with string value');
+ }
+
+ function validateConnectedIceTransport(iceTransport) {
+ const { state, gatheringState, role, component } = iceTransport;
+
+ assert_true(role === 'controlling' || role === 'controlled',
+ 'Expect RTCIceRole to be either controlling or controlled');
+
+ assert_true(component === 'rtp' || component === 'rtcp',
+ 'Expect RTCIceComponent to be either rtp or rtcp');
+
+ assert_true(state === 'connected' || state === 'completed',
+ 'Expect ICE transport to be in connected or completed state after data channels are connected');
+
+ assert_true(gatheringState === 'gathering' || gatheringState === 'completed',
+ 'Expect ICE transport to be in gathering or completed gatheringState after data channels are connected');
+
+ validateCandidates(iceTransport.getLocalCandidates());
+ validateCandidates(iceTransport.getRemoteCandidates());
+
+ const candidatePair = iceTransport.getSelectedCandidatePair();
+ assert_not_equals(candidatePair, null,
+ 'Expect selected candidate pair to be non-null after ICE transport is connected');
+
+ assert_true(candidatePair.local instanceof RTCIceCandidate,
+ 'Expect candidatePair.local to be instance of RTCIceCandidate');
+
+ assert_true(candidatePair.remote instanceof RTCIceCandidate,
+ 'Expect candidatePair.remote to be instance of RTCIceCandidate');
+
+ validateCandidateParameter(iceTransport.getLocalParameters());
+ validateCandidateParameter(iceTransport.getRemoteParameters());
+ }
+
+ promise_test(() => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ return createDataChannelPair(pc1, pc2)
+ .then(([channel1, channel2]) => {
+ // Send a ping message and wait for it just to make sure
+ // that the connection is fully working before testing
+ channel1.send('ping');
+ return awaitMessage(channel2);
+ })
+ .then(() => {
+ const iceTransport1 = getIceTransportFromSctp(pc1);
+ const iceTransport2 = getIceTransportFromSctp(pc2);
+
+ validateConnectedIceTransport(iceTransport1);
+ validateConnectedIceTransport(iceTransport2);
+
+ assert_equals(
+ iceTransport1.getLocalCandidates().length,
+ iceTransport2.getRemoteCandidates().length,
+ `Expect iceTransport1 to have same number of local candidate as iceTransport2's remote candidates`);
+
+ assert_equals(
+ iceTransport1.getRemoteCandidates().length,
+ iceTransport2.getLocalCandidates().length,
+ `Expect iceTransport1 to have same number of remote candidate as iceTransport2's local candidates`);
+
+ const candidatePair1 = iceTransport1.getSelectedCandidatePair();
+ const candidatePair2 = iceTransport2.getSelectedCandidatePair();
+
+ assert_equals(candidatePair1.local.candidate, candidatePair2.remote.candidate,
+ 'Expect selected local candidate of one pc is the selected remote candidate or another');
+
+ assert_equals(candidatePair1.remote.candidate, candidatePair2.local.candidate,
+ 'Expect selected local candidate of one pc is the selected remote candidate or another');
+
+ assert_equals(iceTransport1.role, 'controlling',
+ `Expect offerer's iceTransport to take the controlling role`);
+
+ assert_equals(iceTransport2.role, 'controlled',
+ `Expect answerer's iceTransport to take the controlled role`);
+ });
+ }, 'Two connected iceTransports should has matching local/remote candidates returned');
+
+ promise_test(() => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+ pc1.createDataChannel('');
+
+ // setRemoteDescription(answer) without the other peer
+ // setting answer it's localDescription
+ return pc1.createOffer()
+ .then(offer =>
+ pc1.setLocalDescription(offer)
+ .then(() => pc2.setRemoteDescription(offer))
+ .then(() => pc2.createAnswer()))
+ .then(answer => pc1.setRemoteDescription(answer))
+ .then(() => {
+ const iceTransport = getIceTransportFromSctp(pc1);
+
+ assert_array_equals(iceTransport.getRemoteCandidates(), [],
+ 'Expect iceTransport to not have any remote candidate');
+
+ assert_equals(iceTransport.getSelectedCandidatePair(), null,
+ 'Expect selectedCandidatePair to be null');
+ });
+ }, 'Unconnected iceTransport should have empty remote candidates and selected pair');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addIceCandidate.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addIceCandidate.html
index 541e2b304f6..e55cc61b558 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addIceCandidate.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addIceCandidate.html
@@ -5,6 +5,32 @@
<script>
'use strict';
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.htm
+
+ /*
+ 4.3.2. Interface Definition
+ interface RTCPeerConnection : EventTarget {
+ ...
+ Promise<void> addIceCandidate((RTCIceCandidateInit or RTCIceCandidate) candidate);
+ };
+
+ interface RTCIceCandidate {
+ readonly attribute DOMString candidate;
+ readonly attribute DOMString? sdpMid;
+ readonly attribute unsigned short? sdpMLineIndex;
+ readonly attribute DOMString? ufrag;
+ ...
+ };
+
+ dictionary RTCIceCandidateInit {
+ DOMString candidate = "";
+ DOMString? sdpMid = null;
+ unsigned short? sdpMLineIndex = null;
+ DOMString ufrag;
+ };
+ */
+
// SDP copied from JSEP Example 7.1
// It contains two media streams with different ufrags
// to test if candidate is added to the correct stream
@@ -110,6 +136,24 @@ a=rtcp-rsize
`Expect candidate line to be found after media line ${beforeMediaLine}`);
}
+ // Reject because WebIDL for addIceCandidate does not allow null argument
+ // null can be accidentally passed from onicecandidate event handler
+ // when null is used to indicate end of candidate
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.setRemoteDescription(sessionDesc)
+ .then(() =>
+ promise_rejects(t, new TypeError(),
+ pc.addIceCandidate(null)));
+ }, 'Add null candidate should reject with TypeError');
+
+ /*
+ 4.3.2. addIceCandidate
+ 4. Return the result of enqueuing the following steps:
+ 1. If remoteDescription is null return a promise rejected with a
+ newly created InvalidStateError.
+ */
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -120,6 +164,9 @@ a=rtcp-rsize
}));
}, 'Add ICE candidate before setting remote description should reject with InvalidStateError');
+ /*
+ Success cases
+ */
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -144,6 +191,28 @@ a=rtcp-rsize
const pc = new RTCPeerConnection();
return pc.setRemoteDescription(sessionDesc)
+ .then(() => pc.addIceCandidate({ sdpMid }));
+ }, 'Add candidate with only valid sdpMid should succeed');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.setRemoteDescription(sessionDesc)
+ .then(() => pc.addIceCandidate({ sdpMLineIndex }));
+ }, 'Add candidate with only valid sdpMLineIndex should succeed');
+
+ /*
+ 4.3.2. addIceCandidate
+ 4.6.2. If candidate is applied successfully, the user agent MUST queue
+ a task that runs the following steps:
+ 2. Let remoteDescription be connection's pendingRemoteDescription
+ if not null, otherwise connection's currentRemoteDescription.
+ 3. Add candidate to remoteDescription.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({
candidate: candidateStr1,
sdpMid, sdpMLineIndex, ufrag
@@ -152,7 +221,7 @@ a=rtcp-rsize
assert_candidate_line_between(pc.remoteDescription.sdp,
mediaLine1, candidateLine1, mediaLine2);
});
- }, 'Added candidate should be found in first media stream');
+ }, 'addIceCandidate with first sdpMid and sdpMLineIndex add candidate to first media stream');
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -168,7 +237,22 @@ a=rtcp-rsize
assert_candidate_line_after(pc.remoteDescription.sdp,
mediaLine2, candidateLine2);
});
- }, 'Added candidate should be found in second media stream');
+ }, 'addIceCandidate with second sdpMid and sdpMLineIndex should add candidate to second media stream');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.setRemoteDescription(sessionDesc)
+ .then(() => pc.addIceCandidate({
+ candidate: candidateStr1,
+ sdpMid, sdpMLineIndex,
+ ufrag: null
+ }))
+ .then(() => {
+ assert_candidate_line_between(pc.remoteDescription.sdp,
+ mediaLine1, candidateLine1, mediaLine2);
+ });
+ }, 'Add candidate for first media stream with null ufrag should add candidate to first media stream');
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -191,8 +275,19 @@ a=rtcp-rsize
assert_candidate_line_after(pc.remoteDescription.sdp,
mediaLine2, candidateLine2);
});
- }, 'Multiple candidates should be added to their corresponding media stream');
-
+ }, 'Adding multiple candidates should add candidates to their corresponding media stream');
+
+ /*
+ 4.3.2. addIceCandidate
+ 4.6. If candidate.candidate is an empty string, process candidate as an
+ end-of-candidates indication for the corresponding media description
+ and ICE candidate generation.
+ 2. If candidate is applied successfully, the user agent MUST queue
+ a task that runs the following steps:
+ 2. Let remoteDescription be connection's pendingRemoteDescription
+ if not null, otherwise connection's currentRemoteDescription.
+ 3. Add candidate to remoteDescription.
+ */
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -215,18 +310,11 @@ a=rtcp-rsize
});
}, 'Add with empty candidate string (end of candidate) should succeed');
- // Reject because WebIDL for addIceCandidate does not allow null argument
- // null can be accidentally passed from onicecandidate event handler
- // when null is used to indicate end of candidate
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return pc.setRemoteDescription(sessionDesc)
- .then(() =>
- promise_rejects(t, new TypeError(),
- pc.addIceCandidate(null)));
- }, 'Add null candidate should reject withTypeError');
-
+ /*
+ 4.3.2. addIceCandidate
+ 3. If both sdpMid and sdpMLineIndex are null, return a promise rejected
+ with a newly created TypeError.
+ */
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -245,12 +333,11 @@ a=rtcp-rsize
return pc.setRemoteDescription(sessionDesc)
.then(() =>
- promise_rejects(t, 'OperationError',
+ promise_rejects(t, new TypeError(),
pc.addIceCandidate({
- candidate: invalidCandidateStr,
- sdpMid, sdpMLineIndex, ufrag
+ candidate: candidateStr1
})));
- }, 'Add candidate with invalid candidate string should reject with OperationError');
+ }, 'Add candidate with only valid candidate string should reject with TypeError');
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -271,17 +358,6 @@ a=rtcp-rsize
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, new TypeError(),
- pc.addIceCandidate({
- candidate: candidateStr1
- })));
- }, 'Add candidate with only valid candidate string should reject with TypeError');
-
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return pc.setRemoteDescription(sessionDesc)
- .then(() =>
- promise_rejects(t, new TypeError(),
pc.addIceCandidate({})));
}, 'Add candidate with empty dict should reject with TypeError');
@@ -299,20 +375,13 @@ a=rtcp-rsize
})));
}, 'Add candidate with manually filled default values should reject with TypeError');
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return pc.setRemoteDescription(sessionDesc)
- .then(() => pc.addIceCandidate({ sdpMid }));
- }, 'Add candidate with only valid sdpMid should succeed');
-
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return pc.setRemoteDescription(sessionDesc)
- .then(() => pc.addIceCandidate({ sdpMLineIndex }));
- }, 'Add candidate with only valid sdpMLineIndex should succeed');
-
+ /*
+ 4.3.2. addIceCandidate
+ 4.3. If candidate.sdpMid is not null, run the following steps:
+ 1. If candidate.sdpMid is not equal to the mid of any media
+ description in remoteDescription , reject p with a newly
+ created OperationError and abort these steps.
+ */
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -325,6 +394,14 @@ a=rtcp-rsize
})));
}, 'Add candidate with invalid sdpMid should reject with OperationError');
+ /*
+ 4.3.2. addIceCandidate
+ 4.4. Else, if candidate.sdpMLineIndex is not null, run the following
+ steps:
+ 1. If candidate.sdpMLineIndex is equal to or larger than the
+ number of media descriptions in remoteDescription , reject p
+ with a newly created OperationError and abort these steps.
+ */
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -356,34 +433,6 @@ a=rtcp-rsize
const pc = new RTCPeerConnection();
return pc.setRemoteDescription(sessionDesc)
- .then(() =>
- promise_rejects(t, 'OperationError',
- pc.addIceCandidate({
- candidate: candidateStr1,
- sdpMid, sdpMLineIndex,
- ufrag: 'invalid'
- })));
- }, 'Add candidate with invalid ufrag should reject with OperationError');
-
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return pc.setRemoteDescription(sessionDesc)
- .then(() => pc.addIceCandidate({
- candidate: candidateStr1,
- sdpMid, sdpMLineIndex,
- ufrag: null
- }))
- .then(() => {
- assert_candidate_line_between(pc.remoteDescription.sdp,
- mediaLine1, candidateLine1, mediaLine2);
- });
- }, 'Add candidate for media stream 1 with null ufrag should succeed');
-
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({
candidate: candidateStr2,
sdpMid: sdpMid2,
@@ -396,6 +445,13 @@ a=rtcp-rsize
});
}, 'Add candidate for media stream 2 with null ufrag should succeed');
+ /*
+ 4.3.2. addIceCandidate
+ 4.5. If candidate.ufrag is neither undefined nor null, and is not equal
+ to any ufrag present in the corresponding media description of an
+ applied remote description, reject p with a newly created
+ OperationError and abort these steps.
+ */
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -403,122 +459,87 @@ a=rtcp-rsize
.then(() =>
promise_rejects(t, 'OperationError',
pc.addIceCandidate({
- candidate: candidateStr2,
- sdpMid: sdpMid2,
- sdpMLineIndex: sdpMLineIndex2,
- ufrag: ufrag
+ candidate: candidateStr1,
+ sdpMid, sdpMLineIndex,
+ ufrag: 'invalid'
})));
- }, 'Add candidate with sdpMid belonging to different ufrag should reject with OperationError');
+ }, 'Add candidate with invalid ufrag should reject with OperationError');
- // The check for sdpMid and sdpMLineIndex being null is done outside
- // of enqueuing task, so it rejects even when pc is closed.
+ /*
+ 4.3.2. addIceCandidate
+ 4.6.1. If candidate could not be successfully added the user agent MUST
+ queue a task that runs the following steps:
+ 2. Reject p with a DOMException object whose name attribute has
+ the value OperationError and abort these steps.
+ */
promise_test(t => {
const pc = new RTCPeerConnection();
return pc.setRemoteDescription(sessionDesc)
- .then(() => {
- const promise = pc.addIceCandidate({
- candidate: candidateStr1,
- sdpMid: null,
- sdpMLineIndex: null
- });
-
- pc.close();
- return promise_rejects(t, new TypeError(), promise);
- });
- }, 'Add candidate with both sdpMid and sdpMLineIndex null should still reject with TypeError after pc is closed');
-
- function assert_never_resolves(t, promise) {
- promise.then(
- t.step_func(result => {
- assert_unreached(`Pending promise should never be resolved. Instead it is fulfilled with: ${result}`);
- }),
- t.step_func(err => {
- assert_unreached(`Pending promise should never be resolved. Instead it is rejected with: ${err}`);
- }));
-
- t.step_timeout(t.step_func_done(), 100);
- }
-
- async_test(t => {
- const pc = new RTCPeerConnection();
-
- pc.setRemoteDescription(sessionDesc)
- .then(() => {
- assert_never_resolves(t,
+ .then(() =>
+ promise_rejects(t, 'OperationError',
pc.addIceCandidate({
- candidate: candidateStr1,
+ candidate: invalidCandidateStr,
sdpMid, sdpMLineIndex, ufrag
- }));
-
- pc.close();
-
- // When pc is closed, the remote description is not modified
- // even if succeed
- t.step_timeout(t.step_func(() => {
- assert_false(pc.remoteDescription.sdp.includes(candidateLine1),
- 'Candidate should not be added to SDP because pc is closed');
- }), 80);
- });
- }, 'Add valid candidate should never resolve when pc is closed');
-
- async_test(t => {
- const pc = new RTCPeerConnection();
-
- assert_never_resolves(t, pc.addIceCandidate({
- candidate: candidateStr1,
- sdpMid, sdpMLineIndex, ufrag
- }));
-
- pc.close();
- }, 'Add candidate when remote description is null should never resolve when pc is closed');
-
- async_test(t => {
- const pc = new RTCPeerConnection();
-
- pc.setRemoteDescription(sessionDesc)
- .then(() => {
- assert_never_resolves(t, pc.addIceCandidate({
- candidate: invalidCandidateStr,
- sdpMid, sdpMLineIndex, ufrag
- }));
- pc.close();
- });
- }, 'Add candidate with invalid candidate string should never resolve when pc is closed');
-
- async_test(t => {
- const pc = new RTCPeerConnection();
-
- pc.setRemoteDescription(sessionDesc)
- .then(() => {
- assert_never_resolves(t, pc.addIceCandidate({
- candidate: candidateStr1,
- sdpMid: 'invalid',
- sdpMLineIndex, ufrag
- }));
- pc.close();
- });
- }, 'Add candidate with invalid sdpMid should never resolve when pc is closed');
+ })));
+ }, 'Add candidate with invalid candidate string should reject with OperationError');
- async_test(t => {
+ promise_test(t => {
const pc = new RTCPeerConnection();
- pc.setRemoteDescription(sessionDesc)
- .then(() => {
- assert_never_resolves(t, pc.addIceCandidate({
- candidate: candidateStr1,
- sdpMLineIndex: 2,
- ufrag
- }));
- pc.close();
- });
- }, 'Add candidate with invalid sdpMLineIndex should never resolve when pc is closed');
-
- // TODO: More tests need to be added:
- // - Set pc with both current and pending remote descriptions with different ufrags,
- // Check that addIceCandidate with specific ufrag adds candidate to the correct
- // remote description.
- // - Call with candidate string containing partial malformed syntax, i.e. malformed IP.
- // Some browsers may ignore the syntax error and add it to the SDP regardless.
+ return pc.setRemoteDescription(sessionDesc)
+ .then(() =>
+ promise_rejects(t, 'OperationError',
+ pc.addIceCandidate({
+ candidate: candidateStr2,
+ sdpMid: sdpMid2,
+ sdpMLineIndex: sdpMLineIndex2,
+ ufrag: ufrag
+ })));
+ }, 'Add candidate with sdpMid belonging to different ufrag should reject with OperationError');
+ /*
+ TODO
+ 4.3.2. addIceCandidate
+ 4.6. In parallel, add the ICE candidate candidate as described in [JSEP]
+ (section 4.1.17.). Use candidate.ufrag to identify the ICE generation;
+
+ If the ufrag is null, process the candidate for the most recent ICE
+ generation.
+
+ - Call with candidate string containing partial malformed syntax, i.e. malformed IP.
+ Some browsers may ignore the syntax error and add it to the SDP regardless.
+
+ Non-Testable
+ 4.3.2. addIceCandidate
+ 4.6. (The steps are non-testable because the abort step in enqueue operation
+ steps in before they can reach here):
+ 1. If candidate could not be successfully added the user agent MUST
+ queue a task that runs the following steps:
+ 1. If connection's [[isClosed]] slot is true, then abort
+ these steps.
+
+ 2. If candidate is applied successfully, the user agent MUST queue
+ a task that runs the following steps:
+ 1. If connection's [[isClosed]] slot is true, then abort these steps.
+
+ Issues
+ w3c/webrtc-pc#1213
+ addIceCandidate end of candidates woes
+
+ w3c/webrtc-pc#1216
+ Clarify addIceCandidate behavior when adding candidate after end of candidate
+
+ w3c/webrtc-pc#1227
+ addIceCandidate may add ice candidate to the wrong remote description
+
+ w3c/webrtc-pc#1345
+ Make promise rejection/enqueing consistent
+
+ Coverage Report
+ Total: 23
+ Tested: 19
+ Not Tested: 2
+ Non-Testable: 2
+ */
</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addTrack.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addTrack.https.html
new file mode 100644
index 00000000000..406e2d7ce5d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addTrack.https.html
@@ -0,0 +1,285 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.addTrack</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateMediaStreamTrack
+
+ /*
+ 5.1. RTCPeerConnection Interface Extensions
+ partial interface RTCPeerConnection {
+ ...
+ sequence<RTCRtpSender> getSenders();
+ sequence<RTCRtpReceiver> getReceivers();
+ sequence<RTCRtpTransceiver> getTransceivers();
+ RTCRtpSender addTrack(MediaStreamTrack track,
+ MediaStream... streams);
+ RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
+ optional RTCRtpTransceiverInit init);
+ };
+
+ Note
+ While addTrack checks if the MediaStreamTrack given as an argument is
+ already being sent to avoid sending the same MediaStreamTrack twice,
+ the other ways do not, allowing the same MediaStreamTrack to be sent
+ several times simultaneously.
+ */
+
+ /*
+ 5.1. addTrack
+ 4. If connection's [[isClosed]] slot is true, throw an InvalidStateError.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return navigator.mediaDevices.getUserMedia({ audio: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ 'Expect getUserMedia to return at least one audio track');
+
+ const track = tracks[0];
+
+ pc.close();
+ assert_throws('InvalidStateError', () => pc.addTrack(track, mediaStream))
+ });
+ }, 'addTrack when pc is closed should throw InvalidStateError');
+
+ /*
+ 5.1. addTrack
+ 8. If sender is null, run the following steps:
+ 1. Create an RTCRtpSender with track and streams and let sender be
+ the result.
+ 2. Create an RTCRtpReceiver with track.kind as kind and let receiver
+ be the result.
+ 3. Create an RTCRtpTransceiver with sender and receiver and let
+ transceiver be the result.
+ 4. Add transceiver to connection's set of transceivers.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return navigator.mediaDevices.getUserMedia({ audio: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ 'Expect getUserMedia to return at least one audio track');
+
+ const track = tracks[0];
+ const sender = pc.addTrack(track);
+
+ assert_true(sender instanceof RTCRtpSender,
+ 'Expect sender to be instance of RTCRtpSender');
+
+ assert_equals(sender.track, track,
+ `Expect sender's track to be the added track`);
+
+ const transceivers = pc.getTransceivers();
+ assert_equals(transceivers.length, 1,
+ 'Expect only one transceiver with sender added');
+
+ const [transceiver] = transceivers;
+ assert_equals(transceiver.sender, sender);
+
+ assert_array_equals([sender], pc.getSenders(),
+ 'Expect only one sender with given track added');
+
+ const { receiver } = transceiver;
+ assert_equals(receiver.track.kind, 'audio');
+ assert_array_equals([transceiver.receiver], pc.getReceivers(),
+ 'Expect only one receiver associated with transceiver added');
+ });
+ }, 'addTrack with single track argument and no mediaStream should succeed');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return navigator.mediaDevices.getUserMedia({ audio: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ 'Expect getUserMedia to return at least one audio track');
+
+ const track = tracks[0];
+ const sender = pc.addTrack(track, mediaStream);
+
+ assert_true(sender instanceof RTCRtpSender,
+ 'Expect sender to be instance of RTCRtpSender');
+
+ assert_equals(sender.track, track,
+ `Expect sender's track to be the added track`);
+ });
+ }, 'addTrack with single track argument and single mediaStream should succeed');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return navigator.mediaDevices.getUserMedia({ audio: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ 'Expect getUserMedia to return at least one audio track');
+
+ const track = tracks[0];
+ const mediaStream2 = new MediaStream([track]);
+ const sender = pc.addTrack(track, mediaStream, mediaStream2);
+
+ assert_true(sender instanceof RTCRtpSender,
+ 'Expect sender to be instance of RTCRtpSender');
+
+ assert_equals(sender.track, track,
+ `Expect sender's track to be the added track`);
+ });
+ }, 'addTrack with single track argument and multiple mediaStreams should succeed');
+
+ /*
+ 5.1. addTrack
+ 5. Let senders be the result of executing the CollectSenders algorithm.
+ If an RTCRtpSender for track already exists in senders, throw an
+ InvalidAccessError.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return navigator.mediaDevices.getUserMedia({ audio: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ 'Expect getUserMedia to return at least one audio track');
+
+ const track = tracks[0];
+
+ pc.addTrack(track, mediaStream);
+ assert_throws('InvalidAccessError', () => pc.addTrack(track, mediaStream));
+ });
+ }, 'Adding the same track multiple times should throw InvalidAccessError');
+
+ /*
+ 5.1. addTrack
+ 6. The steps below describe how to determine if an existing sender can
+ be reused.
+
+ If any RTCRtpSender object in senders matches all the following
+ criteria, let sender be that object, or null otherwise:
+ - The sender's track is null.
+ - The transceiver kind of the RTCRtpTransceiver, associated with
+ the sender, matches track's kind.
+ - The sender has never been used to send. More precisely, the
+ RTCRtpTransceiver associated with the sender has never had a
+ currentDirection of sendrecv or sendonly.
+ 7. If sender is not null, run the following steps to use that sender:
+ 1. Set sender.track to track.
+ 3. Enable sending direction on the RTCRtpTransceiver associated
+ with sender.
+ */
+ test(t => {
+ const pc = new RTCPeerConnection();
+
+ const transceiver = pc.addTransceiver('audio', { direction: 'recvonly' });
+ assert_equals(transceiver.sender.track, null);
+ assert_equals(transceiver.direction, 'recvonly');
+
+ const track = generateMediaStreamTrack('audio');
+ const sender = pc.addTrack(track);
+
+ assert_equals(sender, transceiver.sender);
+ assert_equals(sender.track, track);
+ assert_equals(transceiver.direction, 'sendrecv');
+ assert_array_equals([sender], pc.getSenders());
+
+ }, 'addTrack with existing sender with null track, same kind, and recvonly direction should reuse sender');
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+
+ const transceiver = pc.addTransceiver('audio');
+ assert_equals(transceiver.sender.track, null);
+ assert_equals(transceiver.direction, 'sendrecv');
+
+ const track = generateMediaStreamTrack('audio');
+ const sender = pc.addTrack(track);
+
+ assert_equals(sender.track, track);
+ assert_not_equals(sender, transceiver.sender);
+
+ const senders = pc.getSenders();
+ assert_equals(senders.length, 2,
+ 'Expect 2 senders added to connection');
+
+ assert_true(senders.includes(sender),
+ 'Expect senders list to include sender');
+
+ assert_true(senders.includes(transceiver.sender),
+ `Expect senders list to include first transceiver's sender`);
+
+ }, 'addTrack with existing sender with null track, same kind, and sendrecv direction should create new sender');
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+
+ const transceiver = pc.addTransceiver('video', { direction: 'recvonly' });
+ assert_equals(transceiver.sender.track, null);
+ assert_equals(transceiver.direction, 'recvonly');
+
+ const track = generateMediaStreamTrack('audio');
+ const sender = pc.addTrack(track);
+
+ assert_equals(sender.track, track);
+ assert_not_equals(sender, transceiver.sender);
+
+ const senders = pc.getSenders();
+ assert_equals(senders.length, 2,
+ 'Expect 2 senders added to connection');
+
+ assert_true(senders.includes(sender),
+ 'Expect senders list to include sender');
+
+ assert_true(senders.includes(transceiver.sender),
+ `Expect senders list to include first transceiver's sender`);
+
+ }, 'addTrack with existing sender with null track, different kind, and recvonly direction should create new sender');
+
+ /*
+ TODO
+ 5.1. addTrack
+ 3. Let streams be a list of MediaStream objects constructed from the
+ method's remaining arguments, or an empty list if the method was
+ called with a single argument.
+ 6. The steps below describe how to determine if an existing sender can
+ be reused. Doing so will cause future calls to createOffer and
+ createAnswer to mark the corresponding media description as sendrecv
+ or sendonly and add the MSID of the track added, as defined in [JSEP]
+ (section 5.2.2. and section 5.3.2.).
+ 9. A track could have contents that are inaccessible to the application.
+ This can be due to being marked with a peerIdentity option or anything
+ that would make a track CORS cross-origin. These tracks can be supplied
+ to the addTrack method, and have an RTCRtpSender created for them, but
+ content must not be transmitted, unless they are also marked with
+ peerIdentity and they meet the requirements for sending (see isolated
+ streams and RTCPeerConnection).
+
+ All other tracks that are not accessible to the application must not be
+ sent to the peer, with silence (audio), black frames (video) or
+ equivalently absent content being sent in place of track content.
+
+ Note that this property can change over time.
+
+ Non-Testable
+ 5.1. addTrack
+ 7. If sender is not null, run the following steps to use that sender:
+ 2. Set sender's [[associated MediaStreams]] to streams.
+
+ Tested in RTCPeerConnection-onnegotiationneeded.html:
+ 5.1. addTrack
+ 10. Update the negotiation-needed flag for connection.
+
+ */
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addTransceiver.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addTransceiver.html
index 0c69652d1d5..ce1c2827aac 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addTransceiver.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-addTransceiver.html
@@ -3,63 +3,130 @@
<title>RTCPeerConnection.prototype.addTransceiver</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
<script>
'use strict';
// Test is based on the following editor draft:
- // https://w3c.github.io/webrtc-pc/archives/20170515/webrtc.html
+ // https://rawgit.com/w3c/webrtc-pc/cc8d80f455b86c8041d63bceb8b457f45c72aa89/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateMediaStreamTrack()
/*
- * 5.1. RTCPeerConnection Interface Extensions
- * partial interface RTCPeerConnection {
- * sequence<RTCRtpSender> getSenders();
- * sequence<RTCRtpReceiver> getReceivers();
- * sequence<RTCRtpTransceiver> getTransceivers();
- * RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
- * optional RTCRtpTransceiverInit init);
- * ...
- * };
- *
- * dictionary RTCRtpTransceiverInit {
- * RTCRtpTransceiverDirection direction = "sendrecv";
- * sequence<MediaStream> streams;
- * sequence<RTCRtpEncodingParameters> sendEncodings;
- * };
+ 5.1. RTCPeerConnection Interface Extensions
+
+ partial interface RTCPeerConnection {
+ sequence<RTCRtpSender> getSenders();
+ sequence<RTCRtpReceiver> getReceivers();
+ sequence<RTCRtpTransceiver> getTransceivers();
+ RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
+ optional RTCRtpTransceiverInit init);
+ ...
+ };
+
+ dictionary RTCRtpTransceiverInit {
+ RTCRtpTransceiverDirection direction = "sendrecv";
+ sequence<MediaStream> streams;
+ sequence<RTCRtpEncodingParameters> sendEncodings;
+ };
+
+ enum RTCRtpTransceiverDirection {
+ "sendrecv",
+ "sendonly",
+ "recvonly",
+ "inactive"
+ };
+
+ 5.2. RTCRtpSender Interface
+
+ interface RTCRtpSender {
+ readonly attribute MediaStreamTrack? track;
+ ...
+ };
+
+ 5.3. RTCRtpReceiver Interface
+
+ interface RTCRtpReceiver {
+ readonly attribute MediaStreamTrack track;
+ ...
+ };
+
+ 5.4. RTCRtpTransceiver Interface
+
+ interface RTCRtpTransceiver {
+ readonly attribute DOMString? mid;
+ [SameObject]
+ readonly attribute RTCRtpSender sender;
+ [SameObject]
+ readonly attribute RTCRtpReceiver receiver;
+ readonly attribute boolean stopped;
+ readonly attribute RTCRtpTransceiverDirection direction;
+ readonly attribute RTCRtpTransceiverDirection? currentDirection;
+ ...
+ };
+
+ Note
+ While addTrack checks if the MediaStreamTrack given as an argument is
+ already being sent to avoid sending the same MediaStreamTrack twice,
+ the other ways do not, allowing the same MediaStreamTrack to be sent
+ several times simultaneously.
*/
/*
- * 5.1. addTransceiver
- * The initial value of mid is null.
- *
- * 3. If the first argument is a string, let it be kind and run the following steps:
- * 2. Let track be null.
- * 5. Create an RTCRtpSender with track, streams and sendEncodings and let sender
- * be the result.
- * 6. Create an RTCRtpReceiver with kind and let receiver be the result.
- * 7. Create an RTCRtpTransceiver with sender and receiver and let transceiver
- * be the result.
- * 8. Add transceiver to connection's set of transceivers.
- *
- * 5.3. RTCRtpReceiver Interface
- * Create an RTCRtpReceiver
- * 2. Let track be a new MediaStreamTrack object [GETUSERMEDIA]. The source of
- * track is a remote source provided by receiver.
- * 3. Initialize track.kind to kind.
- * 5. Initialize track.label to the result of concatenating the string "remote "
- * with kind.
- * 6. Initialize track.readyState to live.
- * 7. Initialize track.muted to true.
- *
- * 5.4. RTCRtpTransceiver Interface
- * Create an RTCRtpTransceiver
- * 2. Set transceiver.sender to sender.
- * 3. Set transceiver.receiver to receiver.
- * 4. Set transceiver.stopped to false.
+ 5.1. addTransceiver
+ 3. If the first argument is a string, let it be kind and run the following steps:
+ 1. If kind is not a legal MediaStreamTrack kind, throw a TypeError.
+ */
+ test(t => {
+ const pc = new RTCPeerConnection();
+ assert_idl_attribute(pc, 'addTransceiver');
+ assert_throws(new TypeError(), () => pc.addTransceiver('invalid'));
+ }, 'addTransceiver() with string argument as invalid kind should throw TypeError');
+
+ /*
+ 5.1. addTransceiver
+ The initial value of mid is null.
+
+ 3. If the dictionary argument is present, let direction be the value of the
+ direction member. Otherwise let direction be sendrecv.
+ 4. If the first argument is a string, let it be kind and run the following steps:
+ 2. Let track be null.
+ 8. Create an RTCRtpSender with track, streams and sendEncodings and let
+ sender be the result.
+ 9. Create an RTCRtpReceiver with kind and let receiver be the result.
+ 10. Create an RTCRtpTransceiver with sender, receiver and direction, and let
+ transceiver be the result.
+ 11. Add transceiver to connection's set of transceivers.
+
+ 5.2. RTCRtpSender Interface
+ Create an RTCRtpSender
+ 2. Set sender.track to track.
+
+ 5.3. RTCRtpReceiver Interface
+ Create an RTCRtpReceiver
+ 2. Let track be a new MediaStreamTrack object [GETUSERMEDIA]. The source of
+ track is a remote source provided by receiver.
+ 3. Initialize track.kind to kind.
+ 5. Initialize track.label to the result of concatenating the string "remote "
+ with kind.
+ 6. Initialize track.readyState to live.
+ 7. Initialize track.muted to true.
+ 8. Set receiver.track to track.
+
+ 5.4. RTCRtpTransceiver Interface
+ Create an RTCRtpTransceiver
+ 2. Set transceiver.sender to sender.
+ 3. Set transceiver.receiver to receiver.
+ 4. Let transceiver have a [[Direction]] internal slot, initialized to direction.
+ 5. Let transceiver have a [[CurrentDirection]] internal slot, initialized
+ to null.
+ 6. Set transceiver.stopped to false.
*/
test(t => {
const pc = new RTCPeerConnection();
- assert_own_property(pc, 'addTransceiver');
+ assert_idl_attribute(pc, 'addTransceiver');
const transceiver = pc.addTransceiver('audio');
assert_true(transceiver instanceof RTCRtpTransceiver,
@@ -68,6 +135,7 @@
assert_equals(transceiver.mid, null);
assert_equals(transceiver.stopped, false);
assert_equals(transceiver.direction, 'sendrecv');
+ assert_equals(transceiver.currentDirection, null);
assert_array_equals([transceiver], pc.getTransceivers(),
`Expect added transceiver to be the only element in connection's list of transceivers`);
@@ -86,7 +154,7 @@
assert_true(receiver instanceof RTCRtpReceiver,
'Expect receiver to be instance of RTCRtpReceiver');
- const track = receiver.track
+ const track = receiver.track;
assert_true(track instanceof MediaStreamTrack,
'Expect receiver.track to be instance of MediaStreamTrack');
@@ -103,7 +171,7 @@
test(t => {
const pc = new RTCPeerConnection();
- assert_own_property(pc, 'addTransceiver');
+ assert_idl_attribute(pc, 'addTransceiver');
const transceiver = pc.addTransceiver('video');
assert_true(transceiver instanceof RTCRtpTransceiver,
@@ -130,7 +198,7 @@
assert_true(receiver instanceof RTCRtpReceiver,
'Expect receiver to be instance of RTCRtpReceiver');
- const track = receiver.track
+ const track = receiver.track;
assert_true(track instanceof MediaStreamTrack,
'Expect receiver.track to be instance of MediaStreamTrack');
@@ -144,14 +212,264 @@
}, `addTransceiver('video') should return a video transceiver`);
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio', { direction: 'sendonly' });
+ assert_equals(transceiver.direction, 'sendonly');
+ }, `addTransceiver() with direction sendonly should have result transceiver.direction be the same`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio', { direction: 'inactive' });
+ assert_equals(transceiver.direction, 'inactive');
+ }, `addTransceiver() with direction inactive should have result transceiver.direction be the same`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ assert_idl_attribute(pc, 'addTransceiver');
+ assert_throws(new TypeError(), () =>
+ pc.addTransceiver('audio', { direction: 'invalid' }));
+ }, `addTransceiver() with invalid direction should throw TypeError`);
+
/*
- * 5.1. addTransceiver
- * 3.1. If kind is not a legal MediaStreamTrack kind, throw a TypeError.
+ 5.1. addTransceiver
+ 5. If the first argument is a MediaStreamTrack , let it be track and let
+ kind be track.kind.
*/
test(t => {
const pc = new RTCPeerConnection();
- assert_own_property(pc, 'addTransceiver');
- assert_throws(new TypeError(), () => pc.addTransceiver('invalid'));
- }, 'addTransceiver() with string argument as invalid kind should throw TypeError');
+ const track = generateMediaStreamTrack('audio');
+ const transceiver = pc.addTransceiver(track);
+ const { sender, receiver } = transceiver;
+
+ assert_true(sender instanceof RTCRtpSender,
+ 'Expect sender to be instance of RTCRtpSender');
+
+ assert_true(receiver instanceof RTCRtpReceiver,
+ 'Expect receiver to be instance of RTCRtpReceiver');
+
+ assert_equals(sender.track, track,
+ 'Expect sender.track should be the track that is added');
+
+ const receiverTrack = receiver.track;
+ assert_true(receiverTrack instanceof MediaStreamTrack,
+ 'Expect receiver.track to be instance of MediaStreamTrack');
+
+ assert_equals(receiverTrack.kind, 'audio',
+ `receiver.track should have the same kind as added track's kind`);
+
+ assert_equals(receiverTrack.label, 'remote audio');
+ assert_equals(receiverTrack.readyState, 'live');
+ assert_equals(receiverTrack.muted, true);
+
+ assert_array_equals([transceiver], pc.getTransceivers(),
+ `Expect added transceiver to be the only element in connection's list of transceivers`);
+
+ assert_array_equals([sender], pc.getSenders(),
+ `Expect added sender to be the only element in connection's list of senders`);
+
+ assert_array_equals([receiver], pc.getReceivers(),
+ `Expect added receiver to be the only element in connection's list of receivers`);
+
+ }, 'addTransceiver(track) should have result with sender.track be given track');
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const track = generateMediaStreamTrack('audio');
+
+ const transceiver1 = pc.addTransceiver(track);
+ const transceiver2 = pc.addTransceiver(track);
+
+ assert_not_equals(transceiver1, transceiver2);
+
+ const sender1 = transceiver1.sender;
+ const sender2 = transceiver2.sender;
+
+ assert_not_equals(sender1, sender2);
+ assert_equals(transceiver1.sender.track, track);
+ assert_equals(transceiver2.sender.track, track);
+
+ const transceivers = pc.getTransceivers();
+ assert_equals(transceivers.length, 2);
+ assert_true(transceivers.includes(transceiver1));
+ assert_true(transceivers.includes(transceiver2));
+
+ const senders = pc.getSenders();
+ assert_equals(senders.length, 2);
+ assert_true(senders.includes(sender1));
+ assert_true(senders.includes(sender2));
+
+ }, 'addTransceiver(track) multiple times should create multiple transceivers');
+
+
+ /*
+ 5.1. addTransceiver
+ 6. Verify that each rid value in sendEncodings is composed only of
+ case-sensitive alphanumeric characters (a-z, A-Z, 0-9) up to a maximum
+ of 16 characters. If one of the RIDs does not meet these requirements,
+ throw a TypeError.
+ */
+ test(() => {
+ const pc = new RTCPeerConnection();
+ assert_idl_attribute(pc, 'addTransceiver');
+
+ assert_throws(new TypeError(), () =>
+ pc.addTransceiver('audio', {
+ sendEncodings: [{
+ rid: '@Invalid!'
+ }]
+ }));
+ }, 'addTransceiver() with rid containing invalid non-alphanumeric characters should throw TypeError');
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ assert_idl_attribute(pc, 'addTransceiver');
+
+ assert_throws(new TypeError(), () =>
+ pc.addTransceiver('audio', {
+ sendEncodings: [{
+ rid: 'a'.repeat(17)
+ }]
+ }));
+ }, 'addTransceiver() with rid longer than 16 characters should throw TypeError');
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ pc.addTransceiver('audio', {
+ sendEncodings: [{
+ rid: 'foo'
+ }]
+ });
+ }, `addTransceiver() with valid rid value should succeed`);
+
+ /*
+ 5.1. addTransceiver
+ 7. If any RTCRtpEncodingParameters dictionary in sendEncodings contains a
+ read-only parameter other than rid, throw an InvalidAccessError.
+
+ - The sendEncodings argument can be used to specify the number of offered
+ simulcast encodings, and optionally their RIDs and encoding parameters.
+ Aside from rid , all read-only parameters in the RTCRtpEncodingParameters
+ dictionaries, such as ssrc, must be left unset, or an error will be thrown.
+ */
+ test(() => {
+ const pc = new RTCPeerConnection();
+
+ assert_throws('InvalidAccessError', () =>
+ pc.addTransceiver('audio', {
+ sendEncodings: [{
+ ssrc: 2
+ }]
+ }));
+ }, `addTransceiver() with readonly ssrc set should throw InvalidAccessError`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+
+ assert_throws('InvalidAccessError', () =>
+ pc.addTransceiver('audio', {
+ sendEncodings: [{
+ rtx: {
+ ssrc: 2
+ }
+ }]
+ }));
+ }, `addTransceiver() with readonly rtx set should throw InvalidAccessError`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+
+ assert_throws('InvalidAccessError', () =>
+ pc.addTransceiver('audio', {
+ sendEncodings: [{
+ fec: {
+ ssrc: 2
+ }
+ }]
+ }));
+ }, `addTransceiver() with readonly fec set should throw InvalidAccessError`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ pc.addTransceiver('audio', {
+ sendEncodings: [{
+ dtx: 'enabled',
+ active: false,
+ priority: 'low',
+ ptime: 5,
+ maxBitrate: 8,
+ maxFramerate: 25,
+ rid: 'foo'
+ }]
+ });
+ }, `addTransceiver() with valid sendEncodings should succeed`);
+
+ /*
+ TODO
+ 5.1. addTransceiver
+ - Adding a transceiver will cause future calls to createOffer to add a media
+ description for the corresponding transceiver, as defined in [JSEP]
+ (section 5.2.2.).
+
+ - Setting a new RTCSessionDescription may change mid to a non-null value,
+ as defined in [JSEP] (section 5.5. and section 5.6.).
+
+ 1. If the dictionary argument is present, and it has a streams member, let
+ streams be that list of MediaStream objects.
+
+ 5.2. RTCRtpSender Interface
+ Create an RTCRtpSender
+ 3. Let sender have an [[associated MediaStreams]] internal slot, representing
+ a list of MediaStream objects that the MediaStreamTrack object of this
+ sender is associated with.
+
+ 4. Set sender's [[associated MediaStreams]] slot to streams.
+
+ 5. Let sender have a [[send encodings]] internal slot, representing a list
+ of RTCRtpEncodingParameters dictionaries.
+
+ 6. If sendEncodings is given as input to this algorithm, and is non-empty,
+ set the [[send encodings]] slot to sendEncodings. Otherwise, set it to a
+ list containing a single RTCRtpEncodingParameters with active set to true.
+
+ 5.3. RTCRtpReceiver Interface
+ Create an RTCRtpReceiver
+ 4. If an id string, id, was given as input to this algorithm, initialize
+ track.id to id. (Otherwise the value generated when track was created
+ will be used.)
+
+ Tested in RTCPeerConnection-onnegotiationneeded.html
+ 5.1. addTransceiver
+ 12. Update the negotiation-needed flag for connection.
+
+ Out of Scope
+ 5.1. addTransceiver
+ 8. If sendEncodings is set, then subsequent calls to createOffer will be
+ configured to send multiple RTP encodings as defined in [JSEP]
+ (section 5.2.2. and section 5.2.1.).
+
+ When setRemoteDescription is called with a corresponding remote
+ description that is able to receive multiple RTP encodings as defined
+ in [JSEP] (section 3.7.), the RTCRtpSender may send multiple RTP
+ encodings and the parameters retrieved via the transceiver's
+ sender.getParameters() will reflect the encodings negotiated.
+
+ 9. This specification does not define how to configure createOffer to
+ receive multiple RTP encodings. However when setRemoteDescription is
+ called with a corresponding remote description that is able to send
+ multiple RTP encodings as defined in [JSEP], the RTCRtpReceiver may
+ receive multiple RTP encodings and the parameters retrieved via the
+ transceiver's receiver.getParameters() will reflect the encodings
+ negotiated.
+
+ Coverage Report
+ Tested Not-Tested Non-Testable Total
+ addTransceiver 14 1 3 18
+ Create Sender 3 4 0 7
+ Create Receiver 8 1 0 9
+ Create Transceiver 7 0 0 7
+
+ Total 32 6 3 41
+ */
</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-constructor.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-constructor.html
index 97cc200b8ef..331eefe458d 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-constructor.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-constructor.html
@@ -23,68 +23,6 @@ const testArgs = {
'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,
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createAnswer.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createAnswer.html
index 86e38639b4f..19b3a4537aa 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createAnswer.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createAnswer.html
@@ -13,7 +13,6 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer()
// generateAnswer()
- // test_never_resolve()
/*
* 4.3.2. createAnswer()
@@ -37,7 +36,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
- return generateOffer({ video: true })
+ return pc.createOffer({ offerToReceiveVideo: true })
.then(offer => pc.setRemoteDescription(offer))
.then(() => pc.createAnswer())
.then(answer => {
@@ -52,7 +51,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
- return generateOffer({ data: true })
+ return generateOffer({ pc, data: true })
.then(offer => pc.setRemoteDescription(offer))
.then(() => {
pc.close();
@@ -61,18 +60,6 @@
});
}, 'createAnswer() when connection is closed reject with InvalidStateError');
- test_never_resolve(t => {
- const pc = new RTCPeerConnection();
-
- return generateOffer({ data: true })
- .then(offer => pc.setRemoteDescription(offer))
- .then(() => {
- const promise = pc.createAnswer();
- pc.close();
- return promise;
- });
- }, 'createAnswer() when connection is closed in parallel should never resolve');
-
/*
* TODO
* 4.3.2 createAnswer
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createDataChannel.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createDataChannel.html
index 1022e8fae3b..a446280eaaa 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createDataChannel.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createDataChannel.html
@@ -7,7 +7,7 @@
'use strict';
// Test is based on the following editor draft:
-// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+// https://rawgit.com/w3c/webrtc-pc/cc8d80f455b86c8041d63bceb8b457f45c72aa89/webrtc.html
/*
6.1. RTCPeerConnection Interface Extensions
@@ -19,6 +19,19 @@
};
6.2. RTCDataChannel
+
+ interface RTCDataChannel : EventTarget {
+ readonly attribute USVString label;
+ readonly attribute boolean ordered;
+ readonly attribute unsigned short? maxPacketLifeTime;
+ readonly attribute unsigned short? maxRetransmits;
+ readonly attribute USVString protocol;
+ readonly attribute boolean negotiated;
+ readonly attribute unsigned short? id;
+ readonly attribute RTCPriorityType priority;
+ readonly attribute RTCDataChannelState readyState;
+ };
+
dictionary RTCDataChannelInit {
boolean ordered = true;
unsigned short maxPacketLifeTime;
@@ -29,6 +42,15 @@
unsigned short id;
RTCPriorityType priority = "low";
};
+
+ 4.9.1. RTCPriorityType Enum
+
+ enum RTCPriorityType {
+ "very-low",
+ "low",
+ "medium",
+ "high"
+ };
*/
test(() => {
@@ -49,33 +71,85 @@ test(() => {
}, 'createDataChannel with closed connection should throw InvalidStateError');
/*
- 6.2. createDataChannel
- 4. Initialize channel's label attribute to the value of the first argument.
- 5. Set channel's ordered , maxPacketLifeTime , maxRetransmits , protocol,
- negotiated , id and priority attributes to the values of the corresponding
- members of the dataChannelDict argument, using a value of null if the
- corresponding dictionary member is missing.
+ 6.1. createDataChannel
+ 4. Let channel have a [[Label]] internal slot initialized to the value of the
+ first argument.
+ 5. Let options be the second argument.
+ 6. Let channel have an [[MaxPacketLifeTime]] internal slot initialized to
+ option's maxPacketLifeTime member, if present, otherwise null.
+ 7. Let channel have an [[MaxRetransmits]] internal slot initialized to
+ option's maxRetransmits member, if present, otherwise null.
+ 8. Let channel have an [[DataChannelId]] internal slot initialized to
+ option's id member, if present, otherwise null.
+ 9. Let channel have an [[Ordered]] internal slot initialized to option's
+ ordered member.
+ 10. Let channel have an [[Protocol]] internal slot initialized to option's
+ protocol member.
+ 11. Let channel have an [[Negotiated]] internal slot initialized to option's
+ negotiated member.
+ 12. Let channel have an [[DataChannelPriority]] internal slot initialized
+ to option's priority member.
+
+ 6.2. RTCDataChannel
+
+ A RTCDataChannel, created with createDataChannel or dispatched via a
+ RTCDataChannelEvent, MUST initially be in the connecting state
+
+ binaryType
+ When a RTCDataChannel object is created, the binaryType attribute MUST
+ be initialized to the string "blob".
*/
test(() => {
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('');
assert_true(channel instanceof RTCDataChannel, 'is RTCDataChannel');
- assert_equals(channel.label, '', 'label');
- assert_equals(channel.ordered, true, 'ordered');
- assert_equals(channel.maxPacketLifeTime, null, 'maxPacketLifeTime');
- assert_equals(channel.maxRetransmits, null, 'maxRetransmits');
- assert_equals(channel.protocol, '', 'protocol');
- assert_equals(channel.negotiated, false, 'negotiated');
+ assert_equals(channel.label, '');
+ assert_equals(channel.ordered, true);
+ assert_equals(channel.maxPacketLifeTime, null);
+ assert_equals(channel.maxRetransmits, null);
+ assert_equals(channel.protocol, '');
+ assert_equals(channel.negotiated, false);
+
// Since no offer/answer exchange has occurred yet, the DTLS role is unknown
// and so the ID should be null.
- assert_equals(channel.id, null, 'id');
- assert_equals(channel.priority, 'low', 'priority');
+ assert_equals(channel.id, null);
+ assert_equals(channel.priority, 'low');
+
+ assert_equals(channel.readyState, 'connecting');
+ assert_equals(channel.binaryType, 'blob');
+
}, 'createDataChannel attribute default values');
+test(() => {
+ const pc = new RTCPeerConnection();
+ const channel = pc.createDataChannel('test', {
+ ordered: false,
+ maxPacketLifeTime: null,
+ maxRetransmits: 1,
+ protocol: 'custom',
+ negotiated: true,
+ id: 3,
+ priority: 'high'
+ });
+
+ assert_true(channel instanceof RTCDataChannel, 'is RTCDataChannel');
+ assert_equals(channel.label, 'test');
+ assert_equals(channel.ordered, false);
+ assert_equals(channel.maxPacketLifeTime, null);
+ assert_equals(channel.maxRetransmits, 1);
+ assert_equals(channel.protocol, 'custom');
+ assert_equals(channel.negotiated, true);
+ assert_equals(channel.id, 3);
+ assert_equals(channel.priority, 'high');
+ assert_equals(channel.readyState, 'connecting');
+ assert_equals(channel.binaryType, 'blob');
+
+}, 'createDataChannel with provided parameters should initialize attributes to provided values');
/*
6.2. createDataChannel
- 4. Initialize channel's label attribute to the value of the first argument.
+ 4. Let channel have a [[Label]] internal slot initialized to the value of the
+ first argument.
[ECMA262] 7.1.12. ToString(argument)
undefined -> "undefined"
@@ -99,10 +173,9 @@ for (const [description, label, expected] of labels) {
/*
6.2. RTCDataChannel
- dictionary RTCDataChannelInit {
- boolean ordered = true;
- ...
- }
+ createDataChannel
+ 9. Let channel have an [[Ordered]] internal slot initialized to option's
+ ordered member.
*/
test(() => {
const pc = new RTCPeerConnection();
@@ -122,10 +195,9 @@ test(() => {
/*
6.2. RTCDataChannel
- dictionary RTCDataChannelInit {
- unsigned short maxPacketLifeTime;
- ...
- }
+ createDataChannel
+ 6. Let channel have an [[MaxPacketLifeTime]] internal slot initialized to
+ option's maxPacketLifeTime member, if present, otherwise null.
*/
test(() => {
const pc = new RTCPeerConnection;
@@ -135,10 +207,9 @@ test(() => {
/*
6.2. RTCDataChannel
- dictionary RTCDataChannelInit {
- unsigned short maxRetransmits;
- ...
- }
+ createDataChannel
+ 7. Let channel have an [[MaxRetransmits]] internal slot initialized to
+ option's maxRetransmits member, if present, otherwise null.
*/
test(() => {
const pc = new RTCPeerConnection;
@@ -148,12 +219,12 @@ test(() => {
/*
6.2. createDataChannel
- 8. If both the maxPacketLifeTime and maxRetransmits attributes are set
- (not null), throw a SyntaxError.
+ 15. If both [[MaxPacketLifeTime]] and [[MaxRetransmits]] attributes are set
+ (not null), throw a TypeError.
*/
test(() => {
const pc = new RTCPeerConnection;
- assert_throws('SyntaxError', () => pc.createDataChannel('', {
+ assert_throws(new TypeError(), () => pc.createDataChannel('', {
maxPacketLifeTime: 0,
maxRetransmits: 0
}));
@@ -161,10 +232,9 @@ test(() => {
/*
6.2. RTCDataChannel
- dictionary RTCDataChannelInit {
- USVString protocol = "";
- ...
- }
+ createDataChannel
+ 10. Let channel have an [[Protocol]] internal slot initialized to option's
+ protocol member.
*/
const protocols = [
['"foo"', 'foo', 'foo'],
@@ -182,10 +252,9 @@ for (const [description, protocol, expected] of protocols) {
/*
6.2. RTCDataChannel
- dictionary RTCDataChannelInit {
- boolean negotiated = false;
- ...
- }
+ createDataChannel
+ 11. Let channel have an [[Negotiated]] internal slot initialized to option's
+ negotiated member.
*/
test(() => {
const pc = new RTCPeerConnection;
@@ -196,12 +265,6 @@ test(() => {
/*
6.2. RTCDataChannel
- dictionary RTCDataChannelInit {
- [EnforceRange]
- unsigned short id;
- ...
- }
-
createDataChannel
10. If id is equal to 65535, which is greater than the maximum allowed ID
of 65534 but still qualifies as an unsigned short, throw a TypeError.
@@ -223,18 +286,10 @@ for (const id of [-1, 65535, 65536]) {
/*
6.2. RTCDataChannel
- dictionary RTCDataChannelInit {
- RTCPriorityType priority = "low";
- ...
- }
+ createDataChannel
+ 12. Let channel have an [[DataChannelPriority]] internal slot initialized
+ to option's priority member.
- 4.9.1. RTCPriorityType Enum
- enum RTCPriorityType {
- "very-low",
- "low",
- "medium",
- "high"
- };
*/
test(() => {
const pc = new RTCPeerConnection();
@@ -250,9 +305,8 @@ test(() => {
/*
6.2. createDataChannel
- 6. If negotiated is false and label is longer than 65535 bytes long,
- throw a TypeError.
- */
+ 13. If [[Negotiated]] is false and [[Label]] is longer than 65535 bytes
+ long, throw a TypeError. */
test(() => {
const pc = new RTCPeerConnection();
assert_throws(new TypeError(), () =>
@@ -264,7 +318,7 @@ test(() => {
/*
6.2. createDataChannel
- 7. If negotiated is false and protocol is longer than 65535 bytes long,
+ 14. If [[Negotiated]] is false and [[Protocol]] is longer than 65535 bytes long,
throw a TypeError.
*/
test(() => {
@@ -278,29 +332,106 @@ test(() => {
test(() => {
const pc = new RTCPeerConnection();
- pc.createDataChannel('', {
- label: ' '.repeat(65536),
+ const label = ' '.repeat(65536)
+
+ const channel = pc.createDataChannel('', {
+ label,
protocol: ' '.repeat(65536),
negotiated: true
});
+
+ assert_equals(channel.label, label);
}, 'createDataChannel with negotiated true and long label and long protocol should succeed');
/*
- TODO
+ 4.4.1.6. Set the RTCSessionSessionDescription
+ 2.2.6. If description is of type "answer" or "pranswer", then run the
+ following steps:
+ 1. If description initiates the establishment of a new SCTP association,
+ as defined in [SCTP-SDP], Sections 10.3 and 10.4, set the value of
+ connection's [[sctpTransport]] internal slot to a newly created RTCSctpTransport.
+ 2. If description negotiates the DTLS role of the SCTP transport, and
+ there is an RTCDataChannel with a null id, then generate an ID according
+ to [RTCWEB-DATA-PROTOCOL].
+
6.2. createDataChannel
- 11. If the id attribute is null (due to no ID being passed into
+ 18. If the [[DataChannelId]] slot is null (due to no ID being passed into
createDataChannel), and the DTLS role of the SCTP transport has already
- been negotiated, then initialize id to a value generated by the user
- agent, according to [RTCWEB-DATA-PROTOCOL], and skip to the next step.
- If no available ID could be generated, or if the value of the id member
- of the dictionary is taken by an existing RTCDataChannel , throw a
- ResourceInUse exception.
+ been negotiated, then initialize [[DataChannelId]] to a value generated
+ by the user agent, according to [RTCWEB-DATA-PROTOCOL].
+ */
+promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const channel1 = pc.createDataChannel('channel');
+ assert_equals(channel1.id, null,
+ 'Expect initial id to be null');
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer => pc.setRemoteDescription(answer))
+ .then(() => {
+ assert_not_equals(channel1.id, null,
+ 'Expect channel1.id to be assigned');
+
+ assert_greater_than_equals(channel1.id, 0,
+ 'Expect channel1.id to be set to valid unsigned short');
+
+ assert_less_than(channel1.id, 65535,
+ 'Expect channel1.id to be set to valid unsigned short');
+
+ const channel2 = pc.createDataChannel('channel');
+
+ assert_not_equals(channel2.id, null,
+ 'Expect channel2.id to be assigned');
+
+ assert_greater_than_equals(channel2.id, 0,
+ 'Expect channel2.id to be set to valid unsigned short');
+
+ assert_less_than(channel2.id, 65535,
+ 'Expect channel2.id to be set to valid unsigned short');
+
+ assert_not_equals(channel2, channel1,
+ 'Expect channels created from same label to be different');
+
+ assert_equals(channel2.label, channel1.label,
+ 'Expect different channnels can have the same label but different id');
+
+ assert_not_equals(channel2.id, channel1.id,
+ 'Expect different channnels can have the same label but different id');
+ });
+}, 'Channels created after SCTP transport is established should have id assigned');
+
+/*
+ TODO
+ 6.1. createDataChannel
+ 18. If no available ID could be generated, or if the value of the
+ id member of the dictionary is taken by an existing RTCDataChannel, throw
+ a ResourceInUse exception.
Untestable
- 6.2. createDataChannel
- 9. If an attribute, either maxPacketLifeTime or maxRetransmits , has been
- set to indicate unreliable mode, and that value exceeds the maximum
- value supported by the user agent, the value must be set to the user
- agents maximum value.
- */
+ 6.1. createDataChannel
+ 16. If a setting, either [[MaxPacketLifeTime]] or [[MaxRetransmits]], has
+ been set to indicate unreliable mode, and that value exceeds the maximum
+ value supported by the user agent, the value MUST be set to the user
+ agents maximum value.
+
+ 20. Create channel's associated underlying data transport and configure
+ it according to the relevant properties of channel.
+
+ Tested in RTCPeerConnection-onnegotiationneeded.html
+ 21. If channel was the first RTCDataChannel created on connection, update
+ the negotiation-needed flag for connection.
+
+ Issues
+ w3c/webrtc-pc#1412
+ ResourceInUse exception is not defined
+
+ Coverage Report
+ Tested 22
+ Not Tested 1
+ Untestable 2
+ Total 25
+*/
</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createOffer.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createOffer.html
index a717bf08c33..dfa4bdc43de 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createOffer.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-createOffer.html
@@ -16,7 +16,6 @@
// countAudioLine()
// countVideoLine()
// test_state_change_event()
- // test_never_resolve()
// assert_session_desc_equals()
/*
@@ -49,7 +48,7 @@
return pc.createOffer({ offerToReceiveAudio: true })
.then(offer =>
pc.setLocalDescription(offer)
- .then(offer => {
+ .then(() => {
assert_equals(pc.signalingState, 'have-local-offer');
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.pendingLocalDescription, offer);
@@ -65,15 +64,6 @@
pc.createOffer());
}, 'createOffer() after connection is closed should reject with InvalidStateError');
- test_never_resolve(t => {
- const pc = new RTCPeerConnection();
- const promise = pc.createOffer();
-
- pc.close();
- return promise;
-
- }, 'createOffer() when connection is closed halfway should never resolve');
-
/*
* Final steps to create an offer
* 2. If connection was modified in such a way that additional inspection of the
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getDefaultIceServers.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getDefaultIceServers.html
new file mode 100644
index 00000000000..4fdbdb8dec4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getDefaultIceServers.html
@@ -0,0 +1,98 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.getDefaultIceServers</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ /*
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ static sequence<RTCIceServer> getDefaultIceServers();
+ ...
+ };
+
+ dictionary RTCIceServer {
+ required (DOMString or sequence<DOMString>) urls;
+ DOMString username;
+ (DOMString or RTCOAuthCredential) credential;
+ RTCIceCredentialType credentialType = "password";
+ };
+
+ dictionary RTCOAuthCredential {
+ required DOMString macKey;
+ required DOMString accessToken;
+ };
+
+ enum RTCIceCredentialType {
+ "password",
+ "oauth"
+ };
+ */
+
+ test(() => {
+ const iceServers = RTCPeerConnection.getDefaultIceServers();
+
+ assert_true(Array.isArray(iceServers),
+ 'Expect iceServers to be an array');
+
+ // dictionary IDL cannot be tested automatically using idlharness
+ for(const server of iceServers) {
+ const { urls, username, credential, credentialType } = server;
+
+ if(Array.isArray(urls)) {
+ for(const url of urls) {
+ assert_equals(typeof url, 'string',
+ 'Expect elements in urls array to be string');
+ }
+ } else {
+ assert_equals(typeof urls, 'string',
+ 'Expect urls to be either string or array');
+ }
+
+ if(username !== undefined) {
+ assert_equals(typeof username, 'string',
+ 'Expect username to be either undefined or string');
+ }
+
+ assert_true(credentialType === 'password' || credentialType === 'oauth',
+ 'Expect credentialType to be either password or oauth')
+
+ if(credential) {
+ if(typeof(credential) === 'object') {
+ const { macKey, accessToken } = credential;
+ assert_equals(typeof macKey, 'string',
+ 'Expect macKey to be string');
+
+ assert_equals(typeof accessToken, 'string',
+ 'Expect accessToken to be string');
+
+ } else {
+ assert_equals(typeof credential, 'string',
+ 'Expect credential to be either undefined, string, or RTCOauthCredential dictionary');
+ }
+ }
+ }
+
+ // Expect default ice servers to be accepted as valid configuration
+ const pc = new RTCPeerConnection({ iceServers });
+
+ // Only make sure there are same number of ice servers configured
+ // and not do any deep equality checking
+ assert_equals(pc.getConfiguration().iceServers.length, iceServers.length);
+
+ }, 'RTCPeerConnection.getDefaultIceServers() should return array of RTCIceServer');
+
+ /*
+ Coverage Report
+ Since there is no steps involved and we are only checking basic call,
+ This is counted as 1 trivial test coverage.
+
+ Tested 1
+ Total 1
+ */
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getIdentityAssertion.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getIdentityAssertion.html
new file mode 100644
index 00000000000..2ecce8363b3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getIdentityAssertion.html
@@ -0,0 +1,400 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.getIdentityAssertion</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="identity-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The tests here interacts with the mock identity provider located at
+ // /.well-known/idp-proxy/mock-idp.js
+
+ // The following helper functions are called from identity-helper.js
+ // parseAssertionResult
+ // getIdpDomains
+ // assert_rtcerror_rejection
+ // hostString
+
+ /*
+ 9.6. RTCPeerConnection Interface Extensions
+ partial interface RTCPeerConnection {
+ void setIdentityProvider(DOMString provider,
+ optional RTCIdentityProviderOptions options);
+ Promise<DOMString> getIdentityAssertion();
+ readonly attribute Promise<RTCIdentityAssertion> peerIdentity;
+ readonly attribute DOMString? idpLoginUrl;
+ readonly attribute DOMString? idpErrorInfo;
+ };
+
+ dictionary RTCIdentityProviderOptions {
+ DOMString protocol = "default";
+ DOMString usernameHint;
+ DOMString peerIdentity;
+ };
+ */
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ const port = window.location.port;
+
+ const [idpDomain] = getIdpDomains();
+ const idpHost = hostString(idpDomain, port);
+
+ pc.setIdentityProvider(idpHost, {
+ protocol: 'mock-idp.js?foo=bar',
+ usernameHint: `alice@${idpDomain}`,
+ peerIdentity: 'bob@example.org'
+ });
+
+ return pc.getIdentityAssertion()
+ .then(assertionResultStr => {
+ const { idp, assertion } = parseAssertionResult(assertionResultStr);
+
+ assert_equals(idp.domain, idpHost,
+ 'Expect mock-idp.js to construct domain from its location.host');
+
+ assert_equals(idp.protocol, 'mock-idp.js',
+ 'Expect mock-idp.js to return protocol of itself with no query string');
+
+ const {
+ watermark,
+ args,
+ env,
+ query,
+ } = assertion;
+
+ assert_equals(watermark, 'mock-idp.js.watermark',
+ 'Expect assertion result to contain watermark left by mock-idp.js');
+
+ assert_equals(args.origin, window.origin,
+ 'Expect args.origin argument to be the origin of this window');
+
+ assert_equals(env.location,
+ `https://${idpHost}/.well-known/idp-proxy/idp-test.js?foo=bar`,
+ 'Expect IdP proxy to be loaded with full well-known URL constructed from provider and protocol');
+
+ assert_equals(env.origin, `https://${idpHost}`,
+ 'Expect IdP to have its own origin');
+
+ assert_equals(args.options.protocol, 'idp-test.js?foo=bar',
+ 'Expect options.protocol to be the same value as being passed from here');
+
+ assert_equals(args.options.usernameHint, `alice@${idpDomain}`,
+ 'Expect options.usernameHint to be the same value as being passed from here');
+
+ assert_equals(args.options.peerIdentity, 'bob@example.org',
+ 'Expect options.peerIdentity to be the same value as being passed from here');
+
+ assert_equals(query.foo, 'bar',
+ 'Expect query string to be parsed by mock-idp.js and returned back');
+ });
+ }, 'getIdentityAssertion() should load IdP proxy and return assertion generated');
+
+ // When generating assertion, the RTCPeerConnection doesn't care if the returned assertion
+ // represents identity of different domain
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ const port = window.location.port;
+
+ const [idpDomain1, idpDomain2] = getIdpDomains();
+ assert_not_equals(idpDomain1, idpDomain2,
+ 'Sanity check two idpDomains are different');
+
+ // Ask mock-idp.js to return a custom domain idpDomain2 and custom protocol foo
+ pc.setIdentityProvider(hostString(idpDomain1, port), {
+ protocol: `mock-idp.js?generatorAction=return-custom-idp&domain=${idpDomain2}&protocol=foo`,
+ usernameHint: `alice@${idpDomain2}`,
+ });
+
+ return pc.getIdentityAssertion()
+ .then(assertionResultStr => {
+ const { idp, assertion } = parseAssertionResult(assertionResultStr);
+ assert_equals(idp.domain, idpDomain2);
+ assert_equals(idp.protocol, 'foo');
+ assert_equals(assertion.options.usernameHint, `alice@${idpDomain2}`);
+ });
+ }, 'getIdentityAssertion() should succeed if mock-idp.js return different domain and protocol in assertion');
+
+ /*
+ 9.3. Requesting Identity Assertions
+ 4. If the IdP proxy produces an error or returns a promise that does not resolve to
+ a valid RTCIdentityValidationResult (see 9.5 IdP Error Handling), then identity
+ validation fails.
+
+ 9.5. IdP Error Handling
+ - If an identity provider throws an exception or returns a promise that is ultimately
+ rejected, then the procedure that depends on the IdP MUST also fail. These types of
+ errors will cause an IdP failure with an RTCError with errorDetail set to
+ "idp-execution-failure".
+
+ 9.6. RTCPeerConnection Interface Extensions
+ idpErrorInfo
+ An attribute that the IdP can use to pass additional information back to the
+ applications about the error. The format of this string is defined by the IdP and
+ may be JSON.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ assert_equals(pc.idpErrorInfo, null,
+ 'Expect initial pc.idpErrorInfo to be null');
+
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+
+ // Ask mock-idp.js to throw an error with err.errorInfo set to bar
+ pc.setIdentityProvider(hostString(idpDomain, port), {
+ protocol: `mock-idp.js?generatorAction=throw-error&errorInfo=bar`,
+ usernameHint: `alice@${idpDomain}`,
+ });
+
+ return assert_rtcerror_rejection('idp-execution-failure',
+ pc.getIdentityAssertion())
+ .then(() => {
+ assert_equals(pc.idpErrorInfo, 'bar',
+ 'Expect pc.idpErrorInfo to be set to the err.idpErrorInfo thrown by mock-idp.js');
+ });
+ }, `getIdentityAssertion() should reject with RTCError('idp-execution-failure') if mock-idp.js throws error`);
+
+ /*
+ 9.5. IdP Error Handling
+ - If the script loaded from the identity provider is not valid JavaScript or does
+ not implement the correct interfaces, it causes an IdP failure with an RTCError
+ with errorDetail set to "idp-bad-script-failure".
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+
+ // Ask mock-idp.js to not register its callback to the
+ // RTCIdentityProviderRegistrar
+ pc.setIdentityProvider(hostString(idpDomain, port), {
+ protocol: `mock-idp.js?action=do-not-register`,
+ usernameHint: `alice@${idpDomain}`,
+ });
+
+ return assert_rtcerror_rejection('idp-bad-script-failure',
+ pc.getIdentityAssertion());
+
+ }, `getIdentityAssertion() should reject with RTCError('idp-bad-script-failure') if IdP proxy script do not register its callback`);
+
+ /*
+ 9.3. Requesting Identity Assertions
+ 4. If the IdP proxy produces an error or returns a promise that does not resolve
+ to a valid RTCIdentityAssertionResult (see 9.5 IdP Error Handling), then assertion
+ generation fails.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+
+ // Ask mock-idp.js to return an invalid result that is not proper
+ // RTCIdentityAssertionResult
+ pc.setIdentityProvider(hostString(idpDomain, port), {
+ protocol: `mock-idp.js?generatorAction=return-invalid-result`,
+ usernameHint: `alice@${idpDomain}`,
+ });
+
+ return promise_rejects(t, 'OperationError',
+ pc.getIdentityAssertion());
+ }, `getIdentityAssertion() should reject with OperationError if mock-idp.js return invalid result`);
+
+ /*
+ 9.5. IdP Error Handling
+ - A RTCPeerConnection might be configured with an identity provider, but loading of
+ the IdP URI fails. Any procedure that attempts to invoke such an identity provider
+ and cannot load the URI fails with an RTCError with errorDetail set to
+ "idp-load-failure" and the httpRequestStatusCode attribute of the error set to the
+ HTTP status code of the response.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ pc.setIdentityProvider('nonexistent-origin.web-platform.test', {
+ protocol: `non-existent`,
+ usernameHint: `alice@example.org`,
+ });
+
+ return assert_rtcerror_rejection('idp-load-failure',
+ pc.getIdentityAssertion());
+ }, `getIdentityAssertion() should reject with RTCError('idp-load-failure') if IdP cannot be loaded`);
+
+ /*
+ 9.3.1. User Login Procedure
+ Rejecting the promise returned by generateAssertion will cause the error to
+ propagate to the application. Login errors are indicated by rejecting the
+ promise with an RTCError with errorDetail set to "idp-need-login".
+
+ The URL to login at will be passed to the application in the idpLoginUrl
+ attribute of the RTCPeerConnection.
+
+ 9.5. IdP Error Handling
+ - If the identity provider requires the user to login, the operation will fail
+ RTCError with errorDetail set to "idp-need-login" and the idpLoginUrl attribute
+ of the error set to the URL that can be used to login.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ assert_equals(pc.idpLoginUrl, null,
+ 'Expect initial pc.idpLoginUrl to be null');
+
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+ const idpHost = hostString(idpDomain, port);
+
+ pc.setIdentityProvider(idpHost, {
+ protocol: `mock-idp.js?generatorAction=require-login`,
+ usernameHint: `alice@${idpDomain}`,
+ });
+
+ return assert_rtcerror_rejection('idp-need-login',
+ pc.getIdentityAssertion())
+ .then(err => {
+ assert_equals(err.idpLoginUrl, `https://${idpHost}/login`,
+ 'Expect err.idpLoginUrl to be set to url set by mock-idp.js');
+
+ assert_equals(pc.idpLoginUrl, `https://${idpHost}/login`,
+ 'Expect pc.idpLoginUrl to be set to url set by mock-idp.js');
+
+ assert_equals(pc.idpErrorInfo, 'login required',
+ 'Expect pc.idpErrorInfo to be set to info set by mock-idp.js');
+ });
+ }, `getIdentityAssertion() should reject with RTCError('idp-need-login') when mock-idp.js requires login`);
+
+ /*
+ RTCIdentityProviderOptions Members
+ peerIdentity
+ The identity of the peer. For identity providers that bind their assertions to a
+ particular pair of communication peers, this allows them to generate an assertion
+ that includes both local and remote identities. If this value is omitted, but a
+ value is provided for the peerIdentity member of RTCConfiguration, the value from
+ RTCConfiguration is used.
+ */
+ promise_test(() => {
+ const pc = new RTCPeerConnection({
+ peerIdentity: 'bob@example.net'
+ });
+
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+ const idpHost = hostString(idpDomain, port);
+
+ pc.setIdentityProvider(idpHost, {
+ protocol: 'mock-idp.js'
+ });
+
+ return pc.getIdentityAssertion()
+ .then(assertionResultStr => {
+ const { assertion } = parseAssertionResult(assertionResultStr);
+ assert_equals(assertion.args.options.peerIdentity, 'bob@example.net');
+ });
+ }, 'setIdentityProvider() with no peerIdentity provided should use peerIdentity value from getConfiguration()');
+
+ /*
+ 9.6. setIdentityProvider
+ 3. If any identity provider value has changed, discard any stored identity assertion.
+ */
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+ const idpHost = hostString(idpDomain, port);
+
+ pc.setIdentityProvider(idpHost, {
+ protocol: 'mock-idp.js?mark=first'
+ });
+
+ return pc.getIdentityAssertion()
+ .then(assertionResultStr => {
+ const { assertion } = parseAssertionResult(assertionResultStr);
+ assert_equals(assertion.query.mark, 'first');
+
+ pc.setIdentityProvider(idpHost, {
+ protocol: 'mock-idp.js?mark=second'
+ });
+
+ return pc.getIdentityAssertion();
+ })
+ .then(assertionResultStr => {
+ const { assertion } = parseAssertionResult(assertionResultStr);
+ assert_equals(assertion.query.mark, 'second',
+ 'Expect generated assertion is from second IdP config');
+ });
+ }, `Calling setIdentityProvider() multiple times should reset identity assertions`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+
+ pc.setIdentityProvider(hostString(idpDomain, port), {
+ protocol: 'mock-idp.js',
+ usernameHint: `alice@${idpDomain}`
+ });
+
+ return pc.getIdentityAssertion()
+ .then(assertionResultStr =>
+ pc.createOffer()
+ .then(offer => {
+ assert_true(offer.sdp.includes(`\r\na=identity:${assertionResultStr}`,
+ 'Expect SDP to have a=identity line containing assertion string'));
+ }));
+ }, 'createOffer() should return SDP containing identity assertion string if identity provider is set');
+
+ /*
+ 4.4.2. Steps to create an offer
+ 1. If the need for an identity assertion was identified when createOffer was
+ invoked, wait for the identity assertion request process to complete.
+ 2. If the identity provider was unable to produce an identity assertion, reject p
+ with a newly created NotReadableError and abort these steps.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+
+ pc.setIdentityProvider(hostString(idpDomain, port), {
+ protocol: 'mock-idp.js?generatorAction=throw-error',
+ usernameHint: `alice@${idpDomain}`
+ });
+
+ return promise_rejects(t, 'NotReadableError',
+ pc.createOffer());
+ }, 'createOffer() should reject with NotReadableError if identitity assertion request fails');
+
+ /*
+ 4.4.2. Steps to create an answer
+ 1. If the need for an identity assertion was identified when createAnswer was
+ invoked, wait for the identity assertion request process to complete.
+
+ 2. If the identity provider was unable to produce an identity assertion, reject p
+ with a newly created NotReadableError and abort these steps.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+
+ pc.setIdentityProvider(hostString(idpDomain, port), {
+ protocol: 'mock-idp.js?generatorAction=throw-error',
+ usernameHint: `alice@${idpDomain}`
+ });
+
+ return new RTCPeerConnection()
+ .createOffer()
+ .then(offer => pc.setRemoteDescription(offer))
+ .then(() =>
+ promise_rejects(t, 'NotReadableError',
+ pc.createAnswer()));
+
+ }, 'createAnswer() should reject with NotReadableError if identitity assertion request fails');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html
new file mode 100644
index 00000000000..a4df5630a3a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getStats.https.html
@@ -0,0 +1,187 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.getStats</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCStats-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+ // https://w3c.github.io/webrtc-stats/archives/20170614/webrtc-stats.html
+
+ // The following helper function is called from RTCPeerConnection-helper.js
+ // getTrackFromUserMedia
+
+ // The following helper function is called from RTCStats-helper.js
+ // validateStatsReport
+ // assert_stats_report_has_stats
+
+ /*
+ 8.2. RTCPeerConnection Interface Extensions
+ partial interface RTCPeerConnection {
+ Promise<RTCStatsReport> getStats(optional MediaStreamTrack? selector = null);
+ };
+
+ 8.3. RTCStatsReport Object
+ interface RTCStatsReport {
+ readonly maplike<DOMString, object>;
+ };
+
+ 8.4. RTCStats Dictionary
+ dictionary RTCStats {
+ DOMHighResTimeStamp timestamp;
+ RTCStatsType type;
+ DOMString id;
+ };
+
+ id
+ Two RTCStats objects, extracted from two different RTCStatsReport objects, MUST
+ have the same id if they were produced by inspecting the same underlying object.
+
+ 8.2. getStats
+ 1. Let selectorArg be the method's first argument.
+ 2. Let connection be the RTCPeerConnection object on which the method was invoked.
+ 3. If selectorArg is neither null nor a valid MediaStreamTrack, return a promise
+ rejected with a newly created TypeError.
+ 5. Let p be a new promise.
+ 6. Run the following steps in parallel:
+ 1. Gather the stats indicated by selector according to the stats selection algorithm.
+ 2. Resolve p with the resulting RTCStatsReport object, containing the gathered stats.
+ */
+
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ return pc.getStats();
+ }, 'getStats() with no argument should succeed');
+
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ return pc.getStats(null);
+ }, 'getStats(null) should succeed');
+
+ /*
+ 8.2. getStats
+ 4. Let selector be a RTCRtpSender or RTCRtpReceiver on connection which track
+ member matches selectorArg. If no such sender or receiver exists, return a promise
+ rejected with a newly created InvalidAccessError.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ return getTrackFromUserMedia('audio')
+ .then(([track, mediaStream]) => {
+ return promise_rejects(t, 'InvalidAccessError', pc.getStats(track));
+ });
+ }, 'getStats() with track not added to connection should reject with InvalidAccessError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ return getTrackFromUserMedia('audio')
+ .then(([track, mediaStream]) => {
+ pc.addTrack(track, mediaStream);
+ return pc.getStats(track);
+ });
+ }, 'getStats() with track added via addTrack should succeed');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const track = generateMediaStreamTrack();
+ pc.addTransceiver(track);
+
+ return pc.getStats(track);
+ }, 'getStats() with track added via addTransceiver should succeed');
+
+ /*
+ 8.2. getStats
+ 4. Let selector be a RTCRtpSender or RTCRtpReceiver on connection which track
+ member matches selectorArg. If more than one sender or receiver fit this criteria,
+ return a promise rejected with a newly created InvalidAccessError.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ return getTrackFromUserMedia('audio')
+ .then(([track, mediaStream]) => {
+ // addTransceiver allows adding same track multiple times
+ const transceiver1 = pc.addTransceiver(track);
+ const transceiver2 = pc.addTransceiver(track);
+
+ assert_not_equals(transceiver1, transceiver2);
+ assert_not_equals(transceiver1.sender, transceiver2.sender);
+ assert_equals(transceiver1.sender.track, transceiver2.sender.track);
+
+ return promise_rejects(t, 'InvalidAccessError', pc.getStats(track));
+ });
+ }, `getStats() with track associated with more than one sender should reject with InvalidAccessError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver1 = pc.addTransceiver('audio');
+
+ // Create another transceiver that resends what
+ // is being received, kind of like echo
+ const transceiver2 = pc.addTransceiver(transceiver1.receiver.track);
+ assert_equals(transceiver1.receiver.track, transceiver2.sender.track);
+
+ return promise_rejects(t, 'InvalidAccessError', pc.getStats(transceiver1.receiver.track));
+ }, 'getStats() with track associated with both sender and receiver should reject with InvalidAccessError');
+
+ /*
+ 8.5. The stats selection algorithm
+ 2. If selector is null, gather stats for the whole connection, add them to result,
+ return result, and abort these steps.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ return pc.getStats()
+ .then(statsReport => {
+ validateStatsReport(statsReport);
+ assert_stats_report_has_stats(statsReport, ['peer-connection']);
+ });
+ }, 'getStats() with no argument should return stats report containing peer-connection stats');
+
+ /*
+ 8.5. The stats selection algorithm
+ 3. If selector is an RTCRtpSender, gather stats for and add the following objects
+ to result:
+ - All RTCOutboundRTPStreamStats objects corresponding to selector.
+ - All stats objects referenced directly or indirectly by the RTCOutboundRTPStreamStats
+ objects added.
+ */
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ return getTrackFromUserMedia('audio')
+ .then(([track, mediaStream]) => {
+ pc.addTrack(track, mediaStream);
+
+ return pc.getStats(track)
+ .then(statsReport => {
+ validateStatsReport(statsReport);
+ assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
+ });
+ });
+ }, `getStats() on track associated with RtpSender should return stats report containing outbound-rtp stats`);
+
+
+ /*
+ 8.5. The stats selection algorithm
+ 4. If selector is an RTCRtpReceiver, gather stats for and add the following objects
+ to result:
+ - All RTCInboundRTPStreamStats objects corresponding to selector.
+ - All stats objects referenced directly or indirectly by the RTCInboundRTPStreamStats
+ added.
+ */
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+
+ return pc.getStats(transceiver.receiver.track)
+ .then(statsReport => {
+ validateStatsReport(statsReport);
+ assert_stats_report_has_stats(statsReport, ['inbound-rtp']);
+ });
+ }, `getStats() on track associated with RtpReceiver should return stats report containing inbound-rtp stats`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getTransceivers.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getTransceivers.html
index 1dfcf4e1422..381b42b0cff 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getTransceivers.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-getTransceivers.html
@@ -7,7 +7,7 @@
'use strict';
// Test is based on the following editor draft:
- // https://w3c.github.io/webrtc-pc/archives/20170515/webrtc.html
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
/*
* 5.1. RTCPeerConnection Interface Extensions
@@ -22,15 +22,15 @@
test(t => {
const pc = new RTCPeerConnection();
- assert_own_property(pc, 'getSenders');
+ assert_idl_attribute(pc, 'getSenders');
const senders = pc.getSenders();
assert_array_equals([], senders, 'Expect senders to be empty array');
- assert_own_property(pc, 'getReceivers');
+ assert_idl_attribute(pc, 'getReceivers');
const receivers = pc.getReceivers();
assert_array_equals([], receivers, 'Expect receivers to be empty array');
- assert_own_property(pc, 'getTransceivers');
+ assert_idl_attribute(pc, 'getTransceivers');
const transceivers = pc.getTransceivers();
assert_array_equals([], transceivers, 'Expect transceivers to be empty array');
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-helper.js b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-helper.js
index 08a65ee438e..5f1813f9b52 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-helper.js
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-helper.js
@@ -61,7 +61,7 @@ function assert_is_session_description(sessionDesc) {
}
assert_not_equals(sessionDesc, undefined,
- 'Expect session description to be defined, but got undefined');
+ 'Expect session description to be defined');
assert_true(typeof(sessionDesc) === 'object',
'Expect sessionDescription to be either a RTCSessionDescription or an object');
@@ -69,7 +69,7 @@ function assert_is_session_description(sessionDesc) {
assert_true(typeof(sessionDesc.type) === 'string',
'Expect sessionDescription.type to be a string');
- assert_true(typeof(sessionDesc.type) === 'string',
+ assert_true(typeof(sessionDesc.sdp) === 'string',
'Expect sessionDescription.sdp to be a string');
}
@@ -107,21 +107,27 @@ function assert_session_desc_not_equals(sessionDesc1, sessionDesc2) {
// object with any audio, video, data media lines present
function generateOffer(options={}) {
const {
- audio=false,
- video=false,
- data=false
+ audio = false,
+ video = false,
+ data = false,
+ pc,
} = options;
- const pc = new RTCPeerConnection();
-
- if(data) {
+ if (data) {
pc.createDataChannel('test');
}
- return pc.createOffer({
- offerToReceiveAudio: audio,
- offerToReceiveVideo: video
- }).then(offer => {
+ const setup = {};
+
+ if (audio) {
+ setup.offerToReceiveAudio = true;
+ }
+
+ if (video) {
+ setup.offerToReceiveVideo = true;
+ }
+
+ return pc.createOffer(setup).then(offer => {
// Guard here to ensure that the generated offer really
// contain the number of media lines we want
const { sdp } = offer;
@@ -251,10 +257,11 @@ function doSignalingHandshake(localPc, remotePc) {
// It does the heavy lifting of performing signaling handshake,
// ICE candidate exchange, and waiting for data channel at two
// end points to open.
-function createDataChannelPair() {
- const pc1 = new RTCPeerConnection();
- const pc2 = new RTCPeerConnection();
- const channel1 = pc1.createDataChannel('test');
+function createDataChannelPair(
+ pc1=new RTCPeerConnection(),
+ pc2=new RTCPeerConnection())
+{
+ const channel1 = pc1.createDataChannel('');
exchangeIceCandidates(pc1, pc2);
@@ -278,7 +285,7 @@ function createDataChannelPair() {
}
function onDataChannel(event) {
- channel2 = event.channel
+ channel2 = event.channel;
channel2.addEventListener('error', reject);
const { readyState } = channel2;
@@ -360,7 +367,7 @@ function assert_equals_array_buffer(buffer1, buffer2) {
function generateMediaStreamTrack(kind) {
const pc = new RTCPeerConnection();
- assert_own_property(pc, 'addTransceiver',
+ assert_idl_attribute(pc, 'addTransceiver',
'Expect pc to have addTransceiver() method');
const transceiver = pc.addTransceiver(kind);
@@ -372,3 +379,18 @@ function generateMediaStreamTrack(kind) {
return track;
}
+
+// Obtain a MediaStreamTrack of kind using getUserMedia.
+// Return Promise of pair of track and associated mediaStream.
+// Assumes that there is at least one available device
+// to generate the track.
+function getTrackFromUserMedia(kind) {
+ return navigator.mediaDevices.getUserMedia({ [kind]: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ `Expect getUserMedia to return at least one track of kind ${kind}`);
+ const [ track ] = tracks;
+ return [track, mediaStream];
+ });
+}
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-onnegotiationneeded.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-onnegotiationneeded.html
index 6d0fe6f83b5..a71625c0715 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-onnegotiationneeded.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-onnegotiationneeded.html
@@ -3,13 +3,16 @@
<title>Test RTCPeerConnection.prototype.onnegotiationneeded</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
<script>
'use strict';
// Test is based on the following editor draft:
- // https://w3c.github.io/webrtc-pc/archives/20170515/webrtc.html
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
- /* Helper Functions */
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateAnswer
+ // test_never_resolve
// Listen to the negotiationneeded event on a peer connection
// Returns a promise that resolves when the first event is fired.
@@ -59,33 +62,6 @@
});
}
- // Run a test function that return a promise that should
- // never be resolved. For lack of better options,
- // we wait for a time out and pass the test if the
- // promise doesn't resolve within that time.
- function test_never_resolve(testFunc, testName) {
- async_test(t => {
- testFunc(t)
- .then(
- t.step_func(result => {
- assert_unreached(`Pending promise should never be resolved. Instead it is fulfilled with: ${result}`);
- }),
- t.step_func(err => {
- assert_unreached(`Pending promise should never be resolved. Instead it is rejected with: ${err}`);
- }));
-
- t.step_timeout(t.step_func_done(), 200)
- }, testName);
- }
-
- // Helper function to generate answer based on given offer using a freshly
- // created RTCPeerConnection object
- function generateAnswer(offer) {
- const pc = new RTCPeerConnection();
- return pc.setRemoteDescription(offer)
- .then(() => pc.createAnswer());
- }
-
/*
4.7.3. Updating the Negotiation-Needed flag
@@ -106,39 +82,18 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
- const promise = awaitNegotiation(pc);
- pc.createDataChannel('test');
- return promise;
- }, 'Creating first data channel should fire negotiationneeded event');
+ const negotiated = awaitNegotiation(pc);
- promise_test(t => {
- const pc = new RTCPeerConnection();
pc.createDataChannel('test');
- // Attaching the event handler after the negotiation-needed steps
- // are performed should still receive the event, because the event
- // firing is queued as a task
- return awaitNegotiation(pc);
- }, 'task for negotiationneeded event should be enqueued for next tick');
-
- /*
- 4.7.3. Updating the Negotiation-Needed flag
+ return negotiated;
+ }, 'Creating first data channel should fire negotiationneeded event');
- To update the negotiation-needed flag
- 6. Queue a task that runs the following steps:
- 1. If connection's [[isClosed]] slot is true, abort these steps.
- */
test_never_resolve(t => {
const pc = new RTCPeerConnection();
- pc.createDataChannel('test');
- pc.close();
- return awaitNegotiation(pc);
- }, 'negotiationneeded event should not fire if connection is closed');
+ const negotiated = awaitNegotiation(pc);
- test_never_resolve(t => {
- const pc = new RTCPeerConnection();
pc.createDataChannel('foo');
-
- return awaitNegotiation(pc)
+ return negotiated
.then(({nextPromise}) => {
pc.createDataChannel('bar');
return nextPromise;
@@ -159,8 +114,10 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
+ const negotiated = awaitNegotiation(pc);
+
pc.addTransceiver('audio');
- return awaitNegotiation(pc);
+ return negotiated;
}, 'addTransceiver() should fire negotiationneeded event');
/*
@@ -170,8 +127,10 @@
*/
test_never_resolve(t => {
const pc = new RTCPeerConnection();
+ const negotiated = awaitNegotiation(pc);
+
pc.addTransceiver('audio');
- return awaitNegotiation(pc)
+ return negotiated
.then(({nextPromise}) => {
pc.addTransceiver('video');
return nextPromise;
@@ -185,8 +144,10 @@
*/
test_never_resolve(t => {
const pc = new RTCPeerConnection();
+ const negotiated = awaitNegotiation(pc);
+
pc.createDataChannel('test');
- return awaitNegotiation(pc)
+ return negotiated
.then(({nextPromise}) => {
pc.addTransceiver('video');
return nextPromise;
@@ -200,34 +161,32 @@
*/
test_never_resolve(t => {
const pc = new RTCPeerConnection();
- const promise = awaitNegotiation(pc);
+ const negotiated = awaitNegotiation(pc);
- return pc.createOffer()
+ return pc.createOffer({ offerToReceiveAudio: true })
.then(offer => pc.setLocalDescription(offer))
- .then(() => {
+ .then(() => negotiated)
+ .then(({nextPromise}) => {
assert_equals(pc.signalingState, 'have-local-offer');
pc.createDataChannel('test');
- return promise;
+ return nextPromise;
});
}, 'negotiationneeded event should not fire if signaling state is not stable');
/*
- 4.3.1. RTCPeerConnection Operation
- To set an RTCSessionDescription description
- 10. If connection's signaling state is now stable, update the
- negotiation-needed flag. If connection's [[needNegotiation]] slot
- was true both before and after this update, queue a task that runs
- the following steps:
- 1. If connection's [[isClosed]] slot is true, abort these steps.
- 2. If connection's [[needNegotiation]] slot is false, abort these steps.
- 3. Fire a simple event named negotiationneeded at connection.
+ 4.4.1.6. Set the RTCSessionSessionDescription
+ 2.2.10. If connection's signaling state is now stable, update the negotiation-needed
+ flag. If connection's [[NegotiationNeeded]] slot was true both before and after
+ this update, queue a task that runs the following steps:
+ 2. If connection's [[NegotiationNeeded]] slot is false, abort these steps.
+ 3. Fire a simple event named negotiationneeded at connection.
*/
promise_test(t => {
const pc = new RTCPeerConnection();
return assert_first_promise_fulfill_after_second(
awaitNegotiation(pc),
- pc.createOffer()
+ pc.createOffer({ offerToReceiveAudio: true })
.then(offer =>
pc.setLocalDescription(offer)
.then(() => {
@@ -243,7 +202,6 @@
4.7.3. Updating the Negotiation-Needed flag
To update the negotiation-needed flag
- 1. If connection's [[isClosed]] slot is true, abort these steps.
3. If the result of checking if negotiation is needed is "false",
clear the negotiation-needed flag by setting connection's
[[needNegotiation]] slot to false, and abort these steps.
@@ -293,6 +251,12 @@
stop
11. Update the negotiation-needed flag for connection.
+
+ Untestable
+ 4.7.3. Updating the Negotiation-Needed flag
+ 1. If connection's [[isClosed]] slot is true, abort these steps.
+ 6. Queue a task that runs the following steps:
+ 1. If connection's [[isClosed]] slot is true, abort these steps.
*/
</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-ontrack.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-ontrack.https.html
new file mode 100644
index 00000000000..66101398ec3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-ontrack.https.html
@@ -0,0 +1,270 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.ontrack</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // getTrackFromUserMedia
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.2.8. If description is set as a remote description, then run the following
+ steps for each media description in description:
+ 3. Set transceiver's mid value to the mid of the corresponding media
+ description. If the media description has no MID, and transceiver's
+ mid is unset, generate a random value as described in [JSEP] (section 5.9.).
+ 4. If the direction of the media description is sendrecv or sendonly, and
+ transceiver.receiver.track has not yet been fired in a track event,
+ process the remote track for the media description, given transceiver.
+
+ 5.1.1. Processing Remote MediaStreamTracks
+ To process the remote track for an incoming media description [JSEP]
+ (section 5.9.) given RTCRtpTransceiver transceiver, the user agent MUST
+ run the following steps:
+
+ 1. Let connection be the RTCPeerConnection object associated with transceiver.
+ 2. Let streams be a list of MediaStream objects that the media description
+ indicates the MediaStreamTrack belongs to.
+ 3. Add track to all MediaStream objects in streams.
+ 4. Queue a task to fire an event named track with transceiver, track, and
+ streams at the connection object.
+
+ 5.7. RTCTrackEvent
+ [Constructor(DOMString type, RTCTrackEventInit eventInitDict)]
+ interface RTCTrackEvent : Event {
+ readonly attribute RTCRtpReceiver receiver;
+ readonly attribute MediaStreamTrack track;
+ [SameObject]
+ readonly attribute FrozenArray<MediaStream> streams;
+ readonly attribute RTCRtpTransceiver transceiver;
+ };
+
+ [mediacapture-main]
+ 4.2. MediaStream
+ interface MediaStream : EventTarget {
+ readonly attribute DOMString id;
+ sequence<MediaStreamTrack> getTracks();
+ ...
+ };
+
+ [mediacapture-main]
+ 4.3. MediaStreamTrack
+ interface MediaStreamTrack : EventTarget {
+ readonly attribute DOMString kind;
+ readonly attribute DOMString id;
+ ...
+ };
+ */
+
+ function validateTrackEvent(trackEvent) {
+ const { receiver, track, streams, transceiver } = trackEvent;
+
+ assert_true(track instanceof MediaStreamTrack,
+ 'Expect track to be instance of MediaStreamTrack');
+
+ assert_true(Array.isArray(streams),
+ 'Expect streams to be an array');
+
+ for(const mediaStream of streams) {
+ assert_true(mediaStream instanceof MediaStream,
+ 'Expect elements in streams to be instance of MediaStream');
+
+ assert_true(mediaStream.getTracks().includes(track),
+ 'Expect each mediaStream to have track as one of their tracks');
+ }
+
+ assert_true(receiver instanceof RTCRtpReceiver,
+ 'Expect trackEvent.receiver to be defined and is instance of RTCRtpReceiver');
+
+ assert_equals(receiver.track, track,
+ 'Expect trackEvent.receiver.track to be the same as trackEvent.track');
+
+ assert_true(transceiver instanceof RTCRtpTransceiver,
+ 'Expect trackEvent.transceiver to be defined and is instance of RTCRtpTransceiver');
+
+ assert_equals(transceiver.receiver, receiver,
+ 'Expect trackEvent.transceiver.receiver to be the same as trackEvent.receiver');
+ }
+
+ // tests that ontrack is called and parses the msid information from the SDP and creates
+ // the streams with matching identifiers.
+ async_test(t => {
+ const pc = new RTCPeerConnection();
+
+ // Fail the test if the ontrack event handler is not implemented
+ assert_idl_attribute(pc, 'ontrack', 'Expect pc to have ontrack event handler attribute');
+
+ const sdp = `v=0
+o=- 166855176514521964 2 IN IP4 127.0.0.1
+s=-
+t=0 0
+a=msid-semantic:WMS *
+m=audio 9 UDP/TLS/RTP/SAVPF 111
+c=IN IP4 0.0.0.0
+a=rtcp:9 IN IP4 0.0.0.0
+a=ice-ufrag:someufrag
+a=ice-pwd:somelongpwdwithenoughrandomness
+a=fingerprint:sha-256 8C:71:B3:8D:A5:38:FD:8F:A4:2E:A2:65:6C:86:52:BC:E0:6E:94:F2:9F:7C:4D:B5:DF:AF:AA:6F:44:90:8D:F4
+a=setup:actpass
+a=rtcp-mux
+a=mid:mid1
+a=sendonly
+a=rtpmap:111 opus/48000/2
+a=msid:stream1 track1
+a=ssrc:1001 cname:some
+`;
+
+ pc.ontrack = t.step_func(trackEvent => {
+ const { streams, track, transceiver } = trackEvent;
+
+ assert_equals(streams.length, 1,
+ 'the track belongs to one MediaStream');
+
+ const [stream] = streams;
+ assert_equals(stream.id, 'stream1',
+ 'Expect stream.id to be the same as specified in the a=msid line');
+
+ assert_equals(track.kind, 'audio',
+ 'Expect track.kind to be audio');
+
+ validateTrackEvent(trackEvent);
+
+ assert_equals(transceiver.direction, 'recvonly',
+ 'Expect transceiver.direction to be reverse of sendonly (recvonly)');
+
+ t.done();
+ });
+
+ pc.setRemoteDescription({ type: 'offer', sdp })
+ .catch(t.step_func(err => {
+ assert_unreached('Error ' + err.name + ': ' + err.message);
+ }));
+ }, 'setRemoteDescription should trigger ontrack event when the MSID of the stream is is parsed.');
+
+ async_test(t => {
+ const pc = new RTCPeerConnection();
+
+ assert_idl_attribute(pc, 'ontrack', 'Expect pc to have ontrack event handler attribute');
+
+ const sdp = `v=0
+o=- 166855176514521964 2 IN IP4 127.0.0.1
+s=-
+t=0 0
+a=msid-semantic:WMS *
+m=audio 9 UDP/TLS/RTP/SAVPF 111
+c=IN IP4 0.0.0.0
+a=rtcp:9 IN IP4 0.0.0.0
+a=ice-ufrag:someufrag
+a=ice-pwd:somelongpwdwithenoughrandomness
+a=fingerprint:sha-256 8C:71:B3:8D:A5:38:FD:8F:A4:2E:A2:65:6C:86:52:BC:E0:6E:94:F2:9F:7C:4D:B5:DF:AF:AA:6F:44:90:8D:F4
+a=setup:actpass
+a=rtcp-mux
+a=mid:mid1
+a=recvonly
+a=rtpmap:111 opus/48000/2
+a=msid:stream1 track1
+a=ssrc:1001 cname:some
+`;
+
+ pc.ontrack = t.unreached_func('ontrack event should not fire for track with recvonly direction');
+
+ pc.setRemoteDescription({ type: 'offer', sdp })
+ .catch(t.step_func(err => {
+ assert_unreached('Error ' + err.name + ': ' + err.message);
+ }))
+ .then(t.step_func(() => {
+ t.step_timeout(t.step_func_done(), 100);
+ }));
+
+ }, 'setRemoteDescription() with m= line of recvonly direction should not trigger track event');
+
+ async_test(t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ pc2.ontrack = t.step_func(trackEvent => {
+ const { track } = trackEvent;
+
+ assert_equals(track.kind, 'audio',
+ 'Expect track.kind to be audio');
+
+ validateTrackEvent(trackEvent);
+
+ t.done();
+ });
+
+ return getTrackFromUserMedia('audio')
+ .then(([track, mediaStream]) => {
+ pc1.addTrack(track, mediaStream);
+
+ return pc1.createOffer()
+ .then(offer => pc2.setRemoteDescription(offer));
+ })
+ .catch(t.step_func(err => {
+ assert_unreached('Error ' + err.name + ': ' + err.message);
+ }));
+
+ }, 'addTrack() should cause remote connection to fire ontrack when setRemoteDescription()');
+
+ async_test(t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ pc2.ontrack = t.step_func(trackEvent => {
+ const { track } = trackEvent;
+
+ assert_equals(track.kind, 'video',
+ 'Expect track.kind to be video');
+
+ validateTrackEvent(trackEvent);
+
+ t.done();
+ });
+
+ pc1.addTransceiver('video');
+
+ return pc1.createOffer()
+ .then(offer => pc2.setRemoteDescription(offer))
+ .catch(t.step_func(err => {
+ assert_unreached('Error ' + err.name + ': ' + err.message);
+ }));
+
+ }, `addTransceiver('video') should cause remote connection to fire ontrack when setRemoteDescription()`);
+
+ async_test(t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ pc2.ontrack = t.step_func(trackEvent => {
+ const { track } = trackEvent;
+
+ assert_equals(track.kind, 'video',
+ 'Expect track.kind to be video');
+
+ validateTrackEvent(trackEvent);
+
+ t.done();
+ });
+
+ pc1.addTransceiver('audio', { direction: 'inactive' });
+ pc2.ontrack = t.unreached_func('ontrack event should not fire for track with inactive direction');
+
+ return pc1.createOffer()
+ .then(offer => pc2.setRemoteDescription(offer))
+ .catch(t.step_func(err => {
+ assert_unreached('Error ' + err.name + ': ' + err.message);
+ }))
+ .then(t.step_func(() => {
+ t.step_timeout(t.step_func_done(), 100);
+ }));
+
+ }, `addTransceiver() with inactive direction should not cause remote connection to fire ontrack when setRemoteDescription()`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-peerIdentity.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-peerIdentity.html
new file mode 100644
index 00000000000..845c55dc6d2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-peerIdentity.html
@@ -0,0 +1,318 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.peerIdentity</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="identity-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The tests here interacts with the mock identity provider located at
+ // /.well-known/idp-proxy/mock-idp.js
+
+ // The following helper functions are called from identity-helper.js
+ // parseAssertionResult
+ // getIdpDomains
+ // assert_rtcerror_rejection
+ // hostString
+
+ /*
+ 9.6. RTCPeerConnection Interface Extensions
+ partial interface RTCPeerConnection {
+ void setIdentityProvider(DOMString provider,
+ optional RTCIdentityProviderOptions options);
+ Promise<DOMString> getIdentityAssertion();
+ readonly attribute Promise<RTCIdentityAssertion> peerIdentity;
+ readonly attribute DOMString? idpLoginUrl;
+ readonly attribute DOMString? idpErrorInfo;
+ };
+
+ dictionary RTCIdentityProviderOptions {
+ DOMString protocol = "default";
+ DOMString usernameHint;
+ DOMString peerIdentity;
+ };
+
+ [Constructor(DOMString idp, DOMString name)]
+ interface RTCIdentityAssertion {
+ attribute DOMString idp;
+ attribute DOMString name;
+ };
+ */
+
+ /*
+ 4.3.2. setRemoteDescription
+ If an a=identity attribute is present in the session description, the browser
+ validates the identity assertion..
+
+ If the "peerIdentity" configuration is applied to the RTCPeerConnection, this
+ establishes a target peer identity of the provided value. Alternatively, if the
+ RTCPeerConnection has previously authenticated the identity of the peer (that
+ is, there is a current value for peerIdentity ), then this also establishes a
+ target peer identity.
+ */
+ promise_test(() => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+ const idpHost = hostString(idpDomain, port);
+
+ pc1.setIdentityProvider(idpHost, {
+ protocol: 'mock-idp.js',
+ usernameHint: `alice@${idpDomain}`
+ });
+
+ return pc1.createOffer()
+ .then(offer => pc2.setRemoteDescription(offer))
+ .then(() => pc2.peerIdentity)
+ .then(identityAssertion => {
+ const { idp, name } = identityAssertion;
+ assert_equals(idp, idpDomain, `Expect IdP domain to be ${idpDomain}`);
+ assert_equals(identityAssertion, `alice@${idpDomain}`,
+ `Expect validated identity from mock-idp.js to be same as specified in usernameHint`);
+ });
+ }, 'setRemoteDescription() on offer with a=identity should establish peerIdentity');
+
+ /*
+ 4.3.2. setRemoteDescription
+ The target peer identity cannot be changed once set. Once set, if a different
+ value is provided, the user agent MUST reject the returned promise with a newly
+ created InvalidModificationError and abort this operation. The RTCPeerConnection
+ MUST be closed if the validated peer identity does not match the target peer
+ identity.
+ */
+ promise_test(t => {
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+ const idpHost = hostString(idpDomain, port);
+
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection({
+ peerIdentity: `bob@${idpDomain}`
+ });
+
+ pc1.setIdentityProvider(idpHost, {
+ protocol: 'mock-idp.js',
+ usernameHint: `alice@${idpDomain}`
+ });
+
+ return pc1.createOffer()
+ .then(offer =>
+ promise_rejects(t, 'InvalidModificationError',
+ pc2.setRemoteDescription(offer)))
+ .then(() => {
+ assert_true(pc2.signalingState, 'closed',
+ 'Expect peer connection to be closed after mismatch peer identity');
+ });
+ }, 'setRemoteDescription() on offer with a=identity that resolve to value different from target peer identity should reject with InvalidModificationError');
+
+ /*
+ 9.4. Verifying Identity Assertions
+ 8. The RTCPeerConnection decodes the contents and validates that it contains a
+ fingerprint value for every a=fingerprint attribute in the session description.
+ This ensures that the certificate used by the remote peer for communications
+ is covered by the identity assertion.
+
+ If identity validation fails, the peerIdentity promise is rejected with a newly
+ created OperationError.
+
+ If identity validation fails and there is a target peer identity for the
+ RTCPeerConnection, the promise returned by setRemoteDescription MUST be rejected
+ with the same DOMException.
+ */
+ promise_test(t => {
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+ const idpHost = hostString(idpDomain, port);
+
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection({
+ peerIdentity: `alice@${idpDomain}`
+ });
+
+ // Ask mockidp.js to return custom contents in validation result
+ pc1.setIdentityProvider(idpHost, {
+ protocol: 'mock-idp.js?validatorAction=return-custom-contents&contents=bogus',
+ usernameHint: `alice@${idpDomain}`
+ });
+
+ const peerIdentityPromise = pc2.peerIdentity;
+
+ return pc1.createOffer()
+ .then(offer => Promise.all([
+ promise_rejects(t, 'OperationError',
+ pc2.setRemoteDescription(offer)),
+ promise_rejects(t, 'OperationError',
+ peerIdentityPromise)
+ ]));
+ }, 'setRemoteDescription() with peerIdentity set and with IdP proxy that return validationAssertion with mismatch contents should reject with OperationError');
+
+ /*
+ 9.4. Verifying Identity Assertions
+ 9. The RTCPeerConnection validates that the domain portion of the identity matches
+ the domain of the IdP as described in [RTCWEB-SECURITY-ARCH]. If this check
+ fails then the identity validation fails.
+ */
+ promise_test(t => {
+ const port = window.location.port;
+ const [idpDomain1, idpDomain2] = getIdpDomains();
+ assert_not_equals(idpDomain1, idpDomain2,
+ 'Sanity check two idpDomains are different');
+
+ const idpHost1 = hostString(idpDomain1, port);
+
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection({
+ peerIdentity: `alice@${idpDomain2}`
+ });
+
+ // mock-idp.js will return assertion of domain2 identity
+ // with domain1 in the idp.domain field
+ pc1.setIdentityProvider(idpHost1, {
+ protocol: 'mock-idp.js',
+ usernameHint: `alice@${idpDomain2}`
+ });
+
+ return pc1.getIdentityAssertion()
+ .then(assertionResultStr => {
+ const { idp, assertion } = parseAssertionResult(assertionResultStr);
+
+ assert_equals(idp.domain, idpDomain1,
+ 'Sanity check domain of assertion is domain1');
+
+ assert_equals(assertion.options.usernameHint, `alice@${idpDomain2}`,
+ 'Sanity check domain1 is going to validate a domain2 identity');
+
+ return pc1.createOffer();
+ })
+ .then(offer => Promise.all([
+ promise_rejects(t, 'OperationError',
+ pc2.setRemoteDescription(offer)),
+ promise_rejects(t, 'OperationError',
+ pc2.peerIdentity)
+ ]));
+ }, 'setRemoteDescription() and peerIdentity should reject with OperationError if IdP return validated identity that is different from its own domain');
+
+ /*
+ 9.4 Verifying Identity Assertions
+ If identity validation fails and there is a target peer identity for the
+ RTCPeerConnection, the promise returned by setRemoteDescription MUST be rejected
+ with the same DOMException.
+
+ 9.5 IdP Error Handling
+ - If an identity provider throws an exception or returns a promise that is ultimately
+ rejected, then the procedure that depends on the IdP MUST also fail. These types of
+ errors will cause an IdP failure with an RTCError with errorDetail set to
+ "idp-execution-failure".
+
+ Any error generated by the IdP MAY provide additional information in the
+ idpErrorInfo attribute. The information in this string is defined by the
+ IdP in use.
+ */
+ promise_test(t => {
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+ const idpHost = hostString(idpDomain, port);
+
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection({
+ peerIdentity: `alice@${idpDomain}`
+ });
+
+ // Ask mock-idp.js to throw error during validation,
+ // i.e. during pc2.setRemoteDescription()
+ pc1.setIdentityProvider(idpHost, {
+ protocol: 'mock-idp.js?validatorAction=throw-error&errorInfo=bar',
+ usernameHint: `alice@${idpDomain}`
+ });
+
+ return pc1.createOffer()
+ .then(offer => Promise.all([
+ assert_rtcerror_rejection('idp-execution-failure',
+ pc2.setRemoteDescription(offer)),
+ assert_rtcerror_rejection('idp-execution-failure',
+ pc2.peerIdentity)
+ ]))
+ .then(() => {
+ assert_equals(pc2.idpErrorInfo, 'bar',
+ 'Expect pc2.idpErrorInfo to be set to the err.idpErrorInfo thrown by mock-idp.js');
+ });
+ }, `When IdP throws error and pc has target peer identity, setRemoteDescription() and peerIdentity rejected with RTCError('idp-execution-error')`);
+
+ /*
+ 4.3.2. setRemoteDescription
+ If there is no target peer identity, then setRemoteDescription does not await the
+ completion of identity validation.
+
+ 9.5. IdP Error Handling
+ - If an identity provider throws an exception or returns a promise that is
+ ultimately rejected, then the procedure that depends on the IdP MUST also fail.
+ These types of errors will cause an IdP failure with an RTCError with errorDetail
+ set to "idp-execution-failure".
+
+ 9.4. Verifying Identity Assertions
+ If identity validation fails and there is no a target peer identity, the value of
+ the peerIdentity MUST be set to a new, unresolved promise instance. This permits
+ the use of renegotiation (or a subsequent answer, if the session description was
+ a provisional answer) to resolve or reject the identity.
+ */
+ promise_test(t => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ const port = window.location.port;
+ const [idpDomain] = getIdpDomains();
+ const idpHost = hostString(idpDomain, port);
+
+ // Ask mock-idp.js to throw error during validation,
+ // i.e. during pc2.setRemoteDescription()
+ pc1.setIdentityProvider(idpHost, {
+ protocol: 'mock-idp.js?validatorAction=throw-error',
+ usernameHint: `alice@${idpDomain}`
+ });
+
+ const peerIdentityPromise1 = pc2.peerIdentity;
+
+ return pc1.createOffer()
+ .then(offer =>
+ // setRemoteDescription should succeed because there is no target peer identity set
+ pc2.setRemoteDescription(offer))
+ .then(() =>
+ assert_rtcerror_rejection('idp-execution-failure',
+ peerIdentityPromise,
+ `Expect first peerIdentity promise to be rejected with RTCError('idp-execution-failure')`))
+ .then(() => {
+ const peerIdentityPromise2 = pc2.peerIdentity;
+ assert_not_equals(peerIdentityPromise2, peerIdentityPromise1,
+ 'Expect pc2.peerIdentity to be replaced with a fresh unresolved promise');
+
+ // regenerate an identity assertion with no test option to throw error
+ pc1.setIdentityProvider(idpHost, {
+ protocol: 'idp-test.js',
+ usernameHint: `alice@${idpDomain}`
+ });
+
+ return pc1.createOffer()
+ .then(offer => pc2.setRemoteDescription(offer))
+ .then(peerIdentityPromise2)
+ .then(identityAssertion => {
+ const { idp, name } = identityAssertion;
+
+ assert_equals(idp, idpDomain,
+ `Expect IdP domain to be ${idpDomain}`);
+
+ assert_equals(name, `alice@${idpDomain}`,
+ `Expect validated identity to be alice@${idpDomain}`);
+
+ assert_equals(pc2.peeridentity, peerIdentityPromise2,
+ 'Expect pc2.peerIdentity to stay fixed after identity is validated');
+ });
+ });
+ }, 'IdP failure with no target peer identity should have following setRemoteDescription() succeed and replace pc.peerIdentity with a new promise');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.html
deleted file mode 100644
index 85ffc63d8f9..00000000000
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.html
+++ /dev/null
@@ -1,232 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<title>RTCPeerConnection.prototype.removeTrack</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="RTCPeerConnection-helper.js"></script>
-<script>
- 'use strict';
-
- // Test is based on the following editor draft:
- // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
-
- // The following helper functions are called from RTCPeerConnection-helper.js:
- // generateAnswer
- // generateMediaStreamTrack
-
- /*
- 5.1. RTCPeerConnection Interface Extensions
- partial interface RTCPeerConnection {
- ...
- void removeTrack(RTCRtpSender sender);
- RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
- optional RTCRtpTransceiverInit init);
- };
- */
-
- /*
- 5.1. removeTrack
- 3. If connection's [[isClosed]] slot is true, throw an InvalidStateError.
- */
- test(t => {
- const pc = new RTCPeerConnection();
- const track = generateMediaStreamTrack('audio');
- const transceiver = pc.addTransceiver(track);
- const { sender } = transceiver;
-
- pc.close();
- assert_throws('InvalidStateError', () => pc.removeTrack(sender));
-
- }, 'Calling removeTrack when connection is closed should throw InvalidStateError');
-
- test(t => {
- const pc = new RTCPeerConnection();
- const track = generateMediaStreamTrack('audio');
- const transceiver = pc.addTransceiver(track);
- const { sender } = transceiver;
-
- const pc2 = new RTCPeerConnection();
- pc2.close();
- assert_throws('InvalidStateError', () => pc2.removeTrack(sender));
-
- }, 'Calling removeTrack on different connection that is closed should throw InvalidStateError');
-
- /*
- 5.1. removeTrack
- 4. If sender was not created by connection, throw an InvalidAccessError.
- */
- test(t => {
- const pc = new RTCPeerConnection();
- const track = generateMediaStreamTrack('audio');
- const transceiver = pc.addTransceiver(track);
- const { sender } = transceiver;
-
- const pc2 = new RTCPeerConnection();
- assert_throws('InvalidAccessError', () => pc2.removeTrack(sender));
-
- }, 'Calling removeTrack on different connection should throw InvalidAccessError');
-
- /*
- 5.1. removeTrack
- 7. Set sender.track to null.
- */
- test(t => {
- const pc = new RTCPeerConnection();
- const track = generateMediaStreamTrack('audio');
- const transceiver = pc.addTransceiver(track);
- const { sender } = transceiver;
-
- assert_equals(sender.track, track);
- assert_equals(transceiver.direction, 'sendrecv');
- assert_equals(transceiver.currentDirection, null);
-
- pc.removeTrack(sender);
- assert_equals(sender.track, null);
- assert_equals(transceiver.direction, 'sendrecv',
- 'direction should not be altered');
-
- }, 'Calling removeTrack with valid sender should set sender.track to null');
-
- /*
- 5.1. removeTrack
- 7. Set sender.track to null.
- 10. If transceiver.currentDirection is sendrecv set transceiver.direction
- to recvonly.
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
- const track = generateMediaStreamTrack('audio');
- const transceiver = pc.addTransceiver(track);
- const { sender } = transceiver;
-
- assert_equals(sender.track, track);
- assert_equals(transceiver.direction, 'sendrecv');
- assert_equals(transceiver.currentDirection, null);
-
- return pc.createOffer()
- .then(offer =>
- pc.setLocalDescription(offer)
- .then(() => generateAnswer(offer)))
- .then(answer => pc.setRemoteDescription(answer))
- .then(() => {
- assert_equals(transceiver.currentDirection, 'sendrecv');
-
- pc.removeTrack(sender);
- assert_equals(sender.track, null);
- assert_equals(transceiver.direction, 'recvonly');
- assert_equals(transceiver.currentDirection, 'sendrecv',
- 'Expect currentDirection to not change');
- });
- }, 'Calling removeTrack with currentDirection sendrecv should set direction to recvonly');
-
- /*
- 5.1. removeTrack
- 7. Set sender.track to null.
- 11. If transceiver.currentDirection is sendonly set transceiver.direction
- to inactive.
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
- const track = generateMediaStreamTrack('audio');
- const transceiver = pc.addTransceiver(track, { direction: 'sendonly' });
- const { sender } = transceiver;
-
- assert_equals(sender.track, track);
- assert_equals(transceiver.direction, 'sendonly');
- assert_equals(transceiver.currentDirection, null);
-
- return pc.createOffer()
- .then(offer =>
- pc.setLocalDescription(offer)
- .then(() => generateAnswer(offer)))
- .then(answer => pc.setRemoteDescription(answer))
- .then(() => {
- assert_equals(transceiver.currentDirection, 'sendonly');
-
- pc.removeTrack(sender);
- assert_equals(sender.track, null);
- assert_equals(transceiver.direction, 'inactive');
- assert_equals(transceiver.currentDirection, 'sendonly',
- 'Expect currentDirection to not change');
- });
- }, 'Calling removeTrack with currentDirection sendonly should set direction to inactive');
-
- /*
- 5.1. removeTrack
- 7. Set sender.track to null.
- 9. If transceiver.currentDirection is recvonly or inactive,
- then abort these steps.
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
- const track = generateMediaStreamTrack('audio');
- const transceiver = pc.addTransceiver(track, { direction: 'recvonly' });
- const { sender } = transceiver;
-
- assert_equals(sender.track, track);
- assert_equals(transceiver.direction, 'recvonly');
- assert_equals(transceiver.currentDirection, null);
-
- return pc.createOffer()
- .then(offer =>
- pc.setLocalDescription(offer)
- .then(() => generateAnswer(offer)))
- .then(answer => pc.setRemoteDescription(answer))
- .then(() => {
- assert_equals(transceiver.currentDirection, 'recvonly');
-
- pc.removeTrack(sender);
- assert_equals(sender.track, null);
- assert_equals(transceiver.direction, 'recvonly');
- assert_equals(transceiver.currentDirection, 'recvonly');
- });
- }, 'Calling removeTrack with currentDirection recvonly should not change direction');
-
- /*
- 5.1. removeTrack
- 7. Set sender.track to null.
- 9. If transceiver.currentDirection is recvonly or inactive,
- then abort these steps.
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
- const track = generateMediaStreamTrack('audio');
- const transceiver = pc.addTransceiver(track, { direction: 'inactive' });
- const { sender } = transceiver;
-
- assert_equals(sender.track, track);
- assert_equals(transceiver.direction, 'inactive');
- assert_equals(transceiver.currentDirection, null);
-
- return pc.createOffer()
- .then(offer =>
- pc.setLocalDescription(offer)
- .then(() => generateAnswer(offer)))
- .then(answer => pc.setRemoteDescription(answer))
- .then(() => {
- assert_equals(transceiver.currentDirection, 'inactive');
-
- pc.removeTrack(sender);
- assert_equals(sender.track, null);
- assert_equals(transceiver.direction, 'inactive');
- assert_equals(transceiver.currentDirection, 'inactive');
- });
- }, 'Calling removeTrack with currentDirection inactive should not change direction');
-
- /*
- TODO
- 5.1. removeTrack
- Stops sending media from sender. The RTCRtpSender will still appear
- in getSenders. Doing so will cause future calls to createOffer to
- mark the media description for the corresponding transceiver as
- recvonly or inactive, as defined in [JSEP] (section 5.2.2.).
-
- When the other peer stops sending a track in this manner, an ended
- event is fired at the MediaStreamTrack object.
-
- 6. If sender is not in senders (which indicates that it was removed
- due to setting an RTCSessionDescription of type "rollback"),
- then abort these steps.
- 12. Update the negotiation-needed flag for connection.
- */
-</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https.html
new file mode 100644
index 00000000000..e2da02b9dcf
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-removeTrack.https.html
@@ -0,0 +1,310 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.removeTrack</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateAnswer
+ // generateMediaStreamTrack
+
+ /*
+ 5.1. RTCPeerConnection Interface Extensions
+ partial interface RTCPeerConnection {
+ ...
+ void removeTrack(RTCRtpSender sender);
+ RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
+ optional RTCRtpTransceiverInit init);
+ };
+ */
+
+ // Before calling removeTrack can be tested, one needs to add MediaStreamTracks to
+ // a peer connection. There are two ways for adding MediaStreamTrack: addTrack and
+ // addTransceiver. addTransceiver is a newer API while addTrack has been implemented
+ // in current browsers for some time. As a result some of the removeTrack tests have
+ // two versions so that removeTrack can be partially tested without addTransceiver
+ // and the transceiver APIs being implemented.
+
+ /*
+ 5.1. removeTrack
+ 3. If connection's [[isClosed]] slot is true, throw an InvalidStateError.
+ */
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const track = generateMediaStreamTrack('audio');
+ const transceiver = pc.addTransceiver(track);
+ const { sender } = transceiver;
+
+ pc.close();
+ assert_throws('InvalidStateError', () => pc.removeTrack(sender));
+
+ }, 'addTransceiver - Calling removeTrack when connection is closed should throw InvalidStateError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return navigator.mediaDevices.getUserMedia({ audio: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ 'Expect getUserMedia to return at least one audio track');
+
+ const track = tracks[0];
+ const sender = pc.addTrack(track, mediaStream);
+
+ pc.close();
+ assert_throws('InvalidStateError', () => pc.removeTrack(sender));
+ });
+ }, 'addTrack - Calling removeTrack when connection is closed should throw InvalidStateError');
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const track = generateMediaStreamTrack('audio');
+ const transceiver = pc.addTransceiver(track);
+ const { sender } = transceiver;
+
+ const pc2 = new RTCPeerConnection();
+ pc2.close();
+ assert_throws('InvalidStateError', () => pc2.removeTrack(sender));
+
+ }, 'addTransceiver - Calling removeTrack on different connection that is closed should throw InvalidStateError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return navigator.mediaDevices.getUserMedia({ audio: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ 'Expect getUserMedia to return at least one audio track');
+
+ const track = tracks[0];
+ const sender = pc.addTrack(track, mediaStream);
+
+ const pc2 = new RTCPeerConnection();
+ pc2.close();
+ assert_throws('InvalidStateError', () => pc2.removeTrack(sender));
+ });
+ }, 'addTrack - Calling removeTrack on different connection that is closed should throw InvalidStateError');
+
+ /*
+ 5.1. removeTrack
+ 4. If sender was not created by connection, throw an InvalidAccessError.
+ */
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const track = generateMediaStreamTrack('audio');
+ const transceiver = pc.addTransceiver(track);
+ const { sender } = transceiver;
+
+ const pc2 = new RTCPeerConnection();
+ assert_throws('InvalidAccessError', () => pc2.removeTrack(sender));
+
+ }, 'addTransceiver - Calling removeTrack on different connection should throw InvalidAccessError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return navigator.mediaDevices.getUserMedia({ audio: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ 'Expect getUserMedia to return at least one audio track');
+
+ const track = tracks[0];
+ const sender = pc.addTrack(track, mediaStream);
+
+ const pc2 = new RTCPeerConnection();
+ assert_throws('InvalidAccessError', () => pc2.removeTrack(sender));
+ });
+ }, 'addTrack - Calling removeTrack on different connection should throw InvalidAccessError')
+
+ /*
+ 5.1. removeTrack
+ 7. Set sender.track to null.
+ */
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const track = generateMediaStreamTrack('audio');
+ const transceiver = pc.addTransceiver(track);
+ const { sender } = transceiver;
+
+ assert_equals(sender.track, track);
+ assert_equals(transceiver.direction, 'sendrecv');
+ assert_equals(transceiver.currentDirection, null);
+
+ pc.removeTrack(sender);
+ assert_equals(sender.track, null);
+ assert_equals(transceiver.direction, 'sendrecv',
+ 'direction should not be altered');
+
+ }, 'addTransceiver - Calling removeTrack with valid sender should set sender.track to null');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return navigator.mediaDevices.getUserMedia({ audio: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ 'Expect getUserMedia to return at least one audio track');
+
+ const track = tracks[0];
+ const sender = pc.addTrack(track, mediaStream);
+
+ assert_equals(sender.track, track);
+
+ pc.removeTrack(sender);
+ assert_equals(sender.track, null);
+ });
+ }, 'addTrack - Calling removeTrack with valid sender should set sender.track to null');
+
+ /*
+ 5.1. removeTrack
+ 7. Set sender.track to null.
+ 10. If transceiver.currentDirection is sendrecv set transceiver.direction
+ to recvonly.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const track = generateMediaStreamTrack('audio');
+ const transceiver = pc.addTransceiver(track);
+ const { sender } = transceiver;
+
+ assert_equals(sender.track, track);
+ assert_equals(transceiver.direction, 'sendrecv');
+ assert_equals(transceiver.currentDirection, null);
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer => pc.setRemoteDescription(answer))
+ .then(() => {
+ assert_equals(transceiver.currentDirection, 'sendrecv');
+
+ pc.removeTrack(sender);
+ assert_equals(sender.track, null);
+ assert_equals(transceiver.direction, 'recvonly');
+ assert_equals(transceiver.currentDirection, 'sendrecv',
+ 'Expect currentDirection to not change');
+ });
+ }, 'Calling removeTrack with currentDirection sendrecv should set direction to recvonly');
+
+ /*
+ 5.1. removeTrack
+ 7. Set sender.track to null.
+ 11. If transceiver.currentDirection is sendonly set transceiver.direction
+ to inactive.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const track = generateMediaStreamTrack('audio');
+ const transceiver = pc.addTransceiver(track, { direction: 'sendonly' });
+ const { sender } = transceiver;
+
+ assert_equals(sender.track, track);
+ assert_equals(transceiver.direction, 'sendonly');
+ assert_equals(transceiver.currentDirection, null);
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer => pc.setRemoteDescription(answer))
+ .then(() => {
+ assert_equals(transceiver.currentDirection, 'sendonly');
+
+ pc.removeTrack(sender);
+ assert_equals(sender.track, null);
+ assert_equals(transceiver.direction, 'inactive');
+ assert_equals(transceiver.currentDirection, 'sendonly',
+ 'Expect currentDirection to not change');
+ });
+ }, 'Calling removeTrack with currentDirection sendonly should set direction to inactive');
+
+ /*
+ 5.1. removeTrack
+ 7. Set sender.track to null.
+ 9. If transceiver.currentDirection is recvonly or inactive,
+ then abort these steps.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const track = generateMediaStreamTrack('audio');
+ const transceiver = pc.addTransceiver(track, { direction: 'recvonly' });
+ const { sender } = transceiver;
+
+ assert_equals(sender.track, track);
+ assert_equals(transceiver.direction, 'recvonly');
+ assert_equals(transceiver.currentDirection, null);
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer => pc.setRemoteDescription(answer))
+ .then(() => {
+ assert_equals(transceiver.currentDirection, 'recvonly');
+
+ pc.removeTrack(sender);
+ assert_equals(sender.track, null);
+ assert_equals(transceiver.direction, 'recvonly');
+ assert_equals(transceiver.currentDirection, 'recvonly');
+ });
+ }, 'Calling removeTrack with currentDirection recvonly should not change direction');
+
+ /*
+ 5.1. removeTrack
+ 7. Set sender.track to null.
+ 9. If transceiver.currentDirection is recvonly or inactive,
+ then abort these steps.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const track = generateMediaStreamTrack('audio');
+ const transceiver = pc.addTransceiver(track, { direction: 'inactive' });
+ const { sender } = transceiver;
+
+ assert_equals(sender.track, track);
+ assert_equals(transceiver.direction, 'inactive');
+ assert_equals(transceiver.currentDirection, null);
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer => pc.setRemoteDescription(answer))
+ .then(() => {
+ assert_equals(transceiver.currentDirection, 'inactive');
+
+ pc.removeTrack(sender);
+ assert_equals(sender.track, null);
+ assert_equals(transceiver.direction, 'inactive');
+ assert_equals(transceiver.currentDirection, 'inactive');
+ });
+ }, 'Calling removeTrack with currentDirection inactive should not change direction');
+
+ /*
+ TODO
+ 5.1. removeTrack
+ Stops sending media from sender. The RTCRtpSender will still appear
+ in getSenders. Doing so will cause future calls to createOffer to
+ mark the media description for the corresponding transceiver as
+ recvonly or inactive, as defined in [JSEP] (section 5.2.2.).
+
+ When the other peer stops sending a track in this manner, an ended
+ event is fired at the MediaStreamTrack object.
+
+ 6. If sender is not in senders (which indicates that it was removed
+ due to setting an RTCSessionDescription of type "rollback"),
+ then abort these steps.
+ 12. Update the negotiation-needed flag for connection.
+ */
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver.html
new file mode 100644
index 00000000000..ed41d66319e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver.html
@@ -0,0 +1,267 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection Set Session Description - Transceiver Tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateAnswer
+
+ /*
+ 4.3.2. Interface Definition
+
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setLocalDescription(
+ RTCSessionDescriptionInit description);
+
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
+
+ 5.4. RTCRtpTransceiver Interface
+
+ interface RTCRtpTransceiver {
+ readonly attribute DOMString? mid;
+ [SameObject]
+ readonly attribute RTCRtpSender sender;
+ [SameObject]
+ readonly attribute RTCRtpReceiver receiver;
+ readonly attribute RTCRtpTransceiverDirection direction;
+ readonly attribute RTCRtpTransceiverDirection? currentDirection;
+ ...
+ };
+ */
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 7. If description is set as a local description, then run the following steps for
+ each media description in description that is not yet associated with an
+ RTCRtpTransceiver object:
+ 1. Let transceiver be the RTCRtpTransceiver used to create the media
+ description.
+ 2. Set transceiver's mid value to the mid of the corresponding media
+ description.
+ */
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ assert_equals(transceiver.mid, null);
+
+ return pc.createOffer()
+ .then(offer => {
+ assert_equals(transceiver.mid, null,
+ 'Expect transceiver.mid to still be null after createOffer');
+
+ return pc.setLocalDescription(offer)
+ .then(() => {
+ assert_equals(typeof transceiver.mid, 'string',
+ 'Expect transceiver.mid to set to valid string value');
+
+ assert_equals(offer.sdp.includes(`\r\na=mid:${transceiver.mid}`), true,
+ 'Expect transceiver mid to be found in offer SDP');
+ });
+ });
+ }, 'setLocalDescription(offer) with m= section should assign mid to corresponding transceiver');
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 8. If description is set as a remote description, then run the following steps
+ for each media description in description:
+ 2. If no suitable transceiver is found (transceiver is unset), run the following
+ steps:
+ 1. Create an RTCRtpSender, sender, from the media description.
+ 2. Create an RTCRtpReceiver, receiver, from the media description.
+ 3. Create an RTCRtpTransceiver with sender, receiver and direction, and let
+ transceiver be the result.
+ 3. Set transceiver's mid value to the mid of the corresponding media description.
+ */
+ promise_test(() => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ const transceiver1 = pc1.addTransceiver('audio');
+ assert_array_equals(pc1.getTransceivers(), [transceiver1]);
+ assert_array_equals(pc2.getTransceivers(), []);
+
+ return pc1.createOffer()
+ .then(offer => {
+ return Promise.all([
+ pc1.setLocalDescription(offer),
+ pc2.setRemoteDescrption(offer)
+ ])
+ .then(() => {
+ const transceivers = pc2.getTransceivers();
+ assert_equals(transceivers.length, 1,
+ 'Expect new transceiver added to pc2 after setRemoteDescription');
+
+ const [ transceiver2 ] = transceivers;
+
+ assert_equals(typeof transceiver2.mid, 'string',
+ 'Expect transceiver2.mid to be set');
+
+ assert_equals(transceiver1.mid, transceiver2.mid,
+ 'Expect transceivers of both side to have the same mid');
+
+ assert_equals(offer.sdp.includes(`\r\na=mid:${transceiver2.mid}`), true,
+ 'Expect transceiver mid to be found in offer SDP');
+ });
+ });
+ }, 'setRemoteDescription(offer) with m= section and no existing transceiver should create corresponding transceiver');
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 9. If description is of type "rollback", then run the following steps:
+ 1. If the mid value of an RTCRtpTransceiver was set to a non-null value by
+ the RTCSessionDescription that is being rolled back, set the mid value
+ of that transceiver to null, as described by [JSEP] (section 4.1.8.2.).
+ */
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ assert_equals(transceiver.mid, null);
+
+ return pc.createOffer()
+ .then(offer => {
+ assert_equals(transceiver.mid, null);
+ return pc.setLocalDescription(offer);
+ })
+ .then(() => {
+ assert_not_equals(transceiver.mid, null);
+ return pc.setLocalDescription({ type: 'rollback' });
+ })
+ .then(() => {
+ assert_equals(transceiver.mid, null,
+ 'Expect transceiver.mid to become null again after rollback');
+ });
+ }, 'setLocalDescription(rollback) should unset transceiver.mid');
+
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver1 = pc.addTransceiver('audio');
+ assert_equals(transceiver1.mid, null);
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer => pc.setRemoteDescription(answer))
+ .then(() => {
+ // pc is back to stable state
+ // create another transceiver
+ const transceiver2 = pc.addTransceiver('video');
+
+ assert_not_equals(transceiver1.mid, null);
+ assert_equals(transceiver2.mid, null);
+
+ return pc.createOffer()
+ .then(offer => pc.setLocalDescription(offer))
+ .then(() => {
+ assert_not_equals(transceiver1.mid, null);
+ assert_not_equals(transceiver2.mid, null,
+ 'Expect transceiver2.mid to become set');
+
+ return pc.setLocalDescription({ type: 'rollback' });
+ })
+ .then(() => {
+ assert_not_equals(transceiver1.mid, null,
+ 'Expect transceiver1.mid to stay set');
+
+ assert_equals(transceiver2.mid, null,
+ 'Expect transceiver2.mid to be rolled back to null');
+ });
+ })
+ }, 'setLocalDescription(rollback) should only unset transceiver mids associated with current round');
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 9. If description is of type "rollback", then run the following steps:
+ 2. If an RTCRtpTransceiver was created by applying the RTCSessionDescription
+ that is being rolled back, and a track has not been attached to it via
+ addTrack, remove that transceiver from connection's set of transceivers,
+ as described by [JSEP] (section 4.1.8.2.).
+ */
+ promise_test(() => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ pc1.addTransceiver('audio');
+
+ return pc1.createOffer()
+ .then(offer => pc2.setRemoteDescription(offer))
+ .then(() => {
+ const transceivers = pc2.getTransceivers();
+ assert_equals(transceivers.length, 1);
+ const [ transceiver ] = transceivers;
+
+ assert_equals(typeof transceiver.mid, 'string',
+ 'Expect transceiver.mid to be set');
+
+ return pc2.setRemoteDescription({ type: 'rollback' })
+ .then(() => {
+ assert_equals(transceiver.mid, null,
+ 'Expect transceiver.mid to be unset');
+
+ assert_array_equals(pc2.getTransceivers(), [],
+ `Expect transceiver to be removed from pc2's transceiver list`);
+ });
+ });
+ }, 'setRemoteDescription(rollback) should remove newly created transceiver from transceiver list');
+
+ /*
+ TODO
+ - Steps for transceiver direction is added to tip of tree draft, but not yet
+ published as editor's draft
+
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 8. If description is set as a remote description, then run the following steps
+ for each media description in description:
+ 1. As described by [JSEP] (section 5.9.), attempt to find an existing
+ RTCRtpTransceiver object, transceiver, to represent the media description.
+ 3. If the media description has no MID, and transceiver's mid is unset, generate
+ a random value as described in [JSEP] (section 5.9.).
+ 4. If the direction of the media description is sendrecv or sendonly, and
+ transceiver.receiver.track has not yet been fired in a track event, process
+ the remote track for the media description, given transceiver.
+ 5. If the media description is rejected, and transceiver is not already stopped,
+ stop the RTCRtpTransceiver transceiver.
+
+ [JSEP]
+ 5.9. Applying a Remote Description
+ - If the m= section is not associated with any RtpTransceiver
+ (possibly because it was dissociated in the previous step),
+ either find an RtpTransceiver or create one according to the
+ following steps:
+
+ - If the m= section is sendrecv or recvonly, and there are
+ RtpTransceivers of the same type that were added to the
+ PeerConnection by addTrack and are not associated with any
+ m= section and are not stopped, find the first (according to
+ the canonical order described in Section 5.2.1) such
+ RtpTransceiver.
+
+ - If no RtpTransceiver was found in the previous step, create
+ one with a recvonly direction.
+ */
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-answer.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-answer.html
new file mode 100644
index 00000000000..99f0d48d20a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-answer.html
@@ -0,0 +1,164 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.setLocalDescription</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateOffer
+ // generateAnswer
+ // assert_session_desc_equals
+ // test_state_change_event
+
+ /*
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
+ */
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.2.2. If description is set as a local description, then run one of the following
+ steps:
+
+ - If description is of type "answer", then this completes an offer answer
+ negotiation.
+
+ Set connection's currentLocalDescription to description and
+ currentRemoteDescription to the value of pendingRemoteDescription.
+
+ Set both pendingRemoteDescription and pendingLocalDescription to null.
+
+ Finally set connection's signaling state to stable.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ test_state_change_event(t, pc, ['have-remote-offer', 'stable']);
+
+ return pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer =>
+ pc.setRemoteDescription(offer)
+ .then(() => pc.createAnswer())
+ .then(answer =>
+ pc.setLocalDescription(answer)
+ .then(() => {
+ assert_equals(pc.signalingState, 'stable');
+ assert_session_desc_equals(pc.localDescription, answer);
+ assert_session_desc_equals(pc.remoteDescription, offer);
+
+ assert_session_desc_equals(pc.currentLocalDescription, answer);
+ assert_session_desc_equals(pc.currentRemoteDescription, offer);
+
+ assert_equals(pc.pendingLocalDescription, null);
+ assert_equals(pc.pendingRemoteDescription, null);
+ })));
+ }, 'setLocalDescription() with valid answer should succeed');
+
+ /*
+ 4.3.2. setLocalDescription
+ 3. Let lastAnswer be the result returned by the last call to createAnswer.
+ 4. If description.sdp is null and description.type is answer, set description.sdp
+ to lastAnswer.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer =>
+ pc.setRemoteDescription(offer)
+ .then(() => pc.createAnswer())
+ .then(answer =>
+ pc.setLocalDescription({ type: 'answer' })
+ .then(() => {
+ assert_equals(pc.signalingState, 'stable');
+ assert_session_desc_equals(pc.localDescription, answer);
+ assert_session_desc_equals(pc.remoteDescription, offer);
+
+ assert_session_desc_equals(pc.currentLocalDescription, answer);
+ assert_session_desc_equals(pc.currentRemoteDescription, offer);
+
+ assert_equals(pc.pendingLocalDescription, null);
+ assert_equals(pc.pendingRemoteDescription, null);
+ })));
+ }, 'setLocalDescription() with type answer and null sdp should use lastAnswer generated from createAnswer');
+
+ /*
+ 4.3.2. setLocalDescription
+ 3. Let lastAnswer be the result returned by the last call to createAnswer.
+ 7. If description.type is answer and description.sdp does not match lastAnswer,
+ reject the promise with a newly created InvalidModificationError and abort these
+ steps.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer =>
+ pc.setRemoteDescription(offer)
+ .then(() => generateAnswer(offer))
+ .then(answer =>
+ promise_rejects(t, 'InvalidModificationError',
+ pc.setLocalDescription(answer))));
+ }, 'setLocalDescription() with answer not created by own createAnswer() should reject with InvalidModificationError');
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.3. If the description's type is invalid for the current signaling state of
+ connection, then reject p with a newly created InvalidStateError and abort
+ these steps.
+
+ [jsep]
+ 5.5. If the type is "pranswer" or "answer", the PeerConnection
+ state MUST be either "have-remote-offer" or "have-local-pranswer".
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.createOffer()
+ .then(offer =>
+ promise_rejects(t, 'InvalidStateError',
+ pc.setLocalDescription({ type: 'answer', sdp: offer.sdp })));
+
+ }, 'Calling setLocalDescription(answer) from stable state should reject with InvalidStateError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer =>
+ promise_rejects(t, 'InvalidStateError',
+ pc.setLocalDescription(answer)));
+ }, 'Calling setLocalDescription(answer) from have-local-offer state should reject with InvalidStateError');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html
new file mode 100644
index 00000000000..5de04e916e6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-offer.html
@@ -0,0 +1,147 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.setLocalDescription</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateOffer
+ // assert_session_desc_not_equals
+ // assert_session_desc_equals
+ // test_state_change_event
+
+ /*
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
+ */
+
+ /*
+ 4.3.2. setLocalDescription
+ 2. Let lastOffer be the result returned by the last call to createOffer.
+ 5. If description.sdp is null and description.type is offer, set description.sdp
+ to lastOffer.
+
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.2.2. If description is set as a local description, then run one of the following
+ steps:
+ - If description is of type "offer", set connection.pendingLocalDescription
+ to description and signaling state to have-local-offer.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ test_state_change_event(t, pc, ['have-local-offer']);
+
+ return pc.createOffer({ offerToReceiveAudio: true })
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => {
+ assert_equals(pc.signalingState, 'have-local-offer');
+ assert_session_desc_equals(pc.localDescription, offer);
+ assert_session_desc_equals(pc.pendingLocalDescription, offer);
+ assert_equals(pc.currentLocalDescription, null);
+ }));
+ }, 'setLocalDescription with valid offer should succeed');
+
+ /*
+ 4.3.2. setLocalDescription
+ 2. Let lastOffer be the result returned by the last call to createOffer.
+ 5. If description.sdp is null and description.type is offer, set description.sdp
+ to lastOffer.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ return pc.createOffer({ offerToReceiveAudio: true })
+ .then(offer =>
+ pc.setLocalDescription({ type: 'offer' })
+ .then(() => {
+ assert_equals(pc.signalingState, 'have-local-offer');
+ assert_session_desc_equals(pc.localDescription, offer);
+ assert_session_desc_equals(pc.pendingLocalDescription, offer);
+ assert_equals(pc.currentLocalDescription, null);
+ }));
+ }, 'setLocalDescription with type offer and null sdp should use lastOffer generated from createOffer');
+
+ /*
+ 4.3.2. setLocalDescription
+ 2. Let lastOffer be the result returned by the last call to createOffer.
+ 6. If description.type is offer and description.sdp does not match lastOffer,
+ reject the promise with a newly created InvalidModificationError and abort
+ these steps.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return generateOffer({ pc, data: true })
+ .then(offer =>
+ promise_rejects(t, 'InvalidModificationError',
+ pc.setLocalDescription(offer)));
+ }, 'setLocalDescription() with offer not created by own createOffer() should reject with InvalidModificationError');
+
+ promise_test(t => {
+ // Create first offer with audio line, then second offer with
+ // both audio and video line. Since the second offer is the
+ // last offer, setLocalDescription would reject when setting
+ // with the first offer
+ const pc = new RTCPeerConnection();
+ return pc.createOffer({ offerToReceiveAudio: true })
+ .then(offer1 =>
+ pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer2 => {
+ assert_session_desc_not_equals(offer1, offer2);
+ return promise_rejects(t, 'InvalidModificationError',
+ pc.setLocalDescription(offer1));
+ }));
+ }, 'Set created offer other than last offer should reject with InvalidModificationError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ // Only one state change event should be fired
+ test_state_change_event(t, pc, ['have-local-offer']);
+
+ return pc.createOffer({ offerToReceiveAudio: true })
+ .then(offer1 =>
+ pc.setLocalDescription(offer1)
+ .then(() =>
+ pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer2 =>
+ pc.setLocalDescription(offer2)
+ .then(offer2 => {
+ assert_session_desc_not_equals(offer1, offer2);
+ assert_equals(pc.signalingState, 'have-local-offer');
+ assert_session_desc_equals(pc.localDescription, offer2);
+ assert_session_desc_equals(pc.pendingLocalDescription, offer2);
+ assert_equals(pc.currentLocalDescription, null);
+ }))));
+ }, 'Creating and setting offer multiple times should succeed');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html
new file mode 100644
index 00000000000..4d6b011bee6
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html
@@ -0,0 +1,153 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.setLocalDescription pranswer</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateOffer
+ // generateAnswer
+ // assert_session_desc_equals
+ // test_state_change_event
+
+ /*
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setLocalDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? localDescription;
+ readonly attribute RTCSessionDescription? currentLocalDescription;
+ readonly attribute RTCSessionDescription? pendingLocalDescription;
+
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
+ */
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.3. If the description's type is invalid for the current signaling state of
+ connection, then reject p with a newly created InvalidStateError and abort
+ these steps.
+
+ [jsep]
+ 5.5. If the type is "pranswer" or "answer", the PeerConnection
+ state MUST be either "have-remote-offer" or "have-local-pranswer".
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.createOffer()
+ .then(offer =>
+ promise_rejects(t, 'InvalidStateError',
+ pc.setLocalDescription({ type: 'pranswer', sdp: offer.sdp })));
+
+ }, 'setLocalDescription(pranswer) from stable state should reject with InvalidStateError');
+
+ /*
+ 4.3.1.6 Set the RTCSessionSessionDescription
+ 2.2.2. If description is set as a local description, then run one of the
+ following steps:
+ - If description is of type "pranswer", then set
+ connection.pendingLocalDescription to description and signaling state to
+ have-local-pranswer.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ test_state_change_event(t, pc, ['have-remote-offer', 'have-local-pranswer']);
+
+ return pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer =>
+ pc.setRemoteDescription(offer)
+ .then(() => pc.createAnswer())
+ .then(answer => {
+ const pranswer = { type: 'pranswer', sdp: answer.sdp };
+
+ return pc.setLocalDescription(pranswer)
+ .then(() => {
+ assert_equals(pc.signalingState, 'have-local-pranswer');
+
+ assert_session_desc_equals(pc.remoteDescription, offer);
+ assert_session_desc_equals(pc.pendingRemoteDescription, offer);
+ assert_equals(pc.currentRemoteDescription, null);
+
+ assert_session_desc_equals(pc.localDescription, pranswer);
+ assert_session_desc_equals(pc.pendingLocalDescription, pranswer);
+ assert_equals(pc.currentLocalDescription, null);
+
+ assert_equals(pc.pendingRemoteDescription, null);
+ });
+ }));
+ }, 'setLocalDescription(pranswer) should succeed');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ test_state_change_event(t, pc, ['have-remote-offer', 'have-local-pranswer']);
+
+ return pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer =>
+ pc.setRemoteDescription(offer)
+ .then(() => pc.createAnswer())
+ .then(answer => {
+ const pranswer = { type: 'pranswer', sdp: answer.sdp };
+
+ return pc.setLocalDescription(pranswer)
+ .then(() => pc.setLocalDescription(pranswer));
+ }));
+ }, 'setLocalDescription(pranswer) can be applied multiple times while still in have-local-pranswer');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ test_state_change_event(t, pc, ['have-remote-offer', 'have-local-pranswer', 'stable']);
+
+ return pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer =>
+ pc.setRemoteDescription(offer)
+ .then(() => pc.createAnswer())
+ .then(answer => {
+ const pranswer = { type: 'pranswer', sdp: answer.sdp };
+
+ return pc.setLocalDescription(pranswer)
+ .then(() => pc.setLocalDescription(answer))
+ .then(() => {
+ assert_equals(pc.signalingState, 'stable');
+ assert_session_desc_equals(pc.localDescription, answer);
+ assert_session_desc_equals(pc.remoteDescription, offer);
+
+ assert_session_desc_equals(pc.currentLocalDescription, answer);
+ assert_session_desc_equals(pc.currentRemoteDescription, offer);
+
+ assert_equals(pc.pendingLocalDescription, null);
+ assert_equals(pc.pendingRemoteDescription, null);
+ });
+ }));
+ }, 'setLocalDescription(answer) from have-local-pranswer state should succeed');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-rollback.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-rollback.html
new file mode 100644
index 00000000000..5cafb1e3d2d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription-rollback.html
@@ -0,0 +1,123 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.setLocalDescription rollback</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // assert_session_desc_equals
+ // test_state_change_event
+
+ /*
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setLocalDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? localDescription;
+ readonly attribute RTCSessionDescription? currentLocalDescription;
+ readonly attribute RTCSessionDescription? pendingLocalDescription;
+
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
+ */
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.2.2. If description is set as a local description, then run one of the
+ following steps:
+ - If description is of type "rollback", then this is a rollback. Set
+ connection.pendingLocalDescription to null and signaling state to stable.
+ */
+ promise_test(t=> {
+ const pc = new RTCPeerConnection();
+
+ test_state_change_event(t, pc, ['have-local-offer', 'stable']);
+
+ return pc.createOffer()
+ .then(offer => pc.setLocalDescription(offer))
+ .then(() => {
+ assert_equals(pc.signalingState, 'have-local-offer');
+ assert_not_equals(pc.localDescription, null);
+ assert_not_equals(pc.pendingLocalDescription, null);
+ assert_equals(pc.currentLocalDescription, null);
+
+ return pc.setLocalDescription({ type: 'rollback' });
+ })
+ .then(() => {
+ assert_equals(pc.signalingState, 'stable');
+ assert_equals(pc.localDescription, null);
+ assert_equals(pc.pendingLocalDescription, null);
+ assert_equals(pc.currentLocalDescription, null);
+ });
+ }, 'setLocalDescription(rollback) from have-local-offer state should reset back to stable state');
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.3. If the description's type is invalid for the current signaling state of
+ connection, then reject p with a newly created InvalidStateError and abort
+ these steps. Note that this implies that once the answerer has performed
+ setLocalDescription with his answer, this cannot be rolled back.
+
+ [jsep]
+ 4.1.8.2. Rollback
+ - Rollback can only be used to cancel proposed changes;
+ there is no support for rolling back from a stable state to a
+ previous stable state
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ return promise_rejects(t, 'InvalidStateError',
+ pc.setLocalDescription({ type: 'rollback' }));
+ }, `setLocalDescription(rollback) from stable state should reject with InvalidStateError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ return pc.createOffer({ offerToReceiveAudio: true })
+ .then(offer =>
+ pc.setRemoteDescription(offer)
+ .then(() => pc.createAnswer()))
+ .then(answer => pc.setLocalDescription(answer))
+ .then(() => {
+ return promise_rejects(t, 'InvalidStateError',
+ pc.setLocalDescription({ type: 'rollback' }));
+ });
+ }, `setLocalDescription(rollback) after setting answer description should reject with InvalidStateError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ return pc.createOffer()
+ .then(offer => pc.setLocalDescription(offer))
+ .then(() => pc.setLocalDescription({
+ type: 'rollback',
+ sdp: '!<Invalid SDP Content>;'
+ }));
+ }, `setLocalDescription(rollback) should ignore invalid sdp content and succeed`);
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription.html
index be8ae58c29e..72685bd7b09 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setLocalDescription.html
@@ -8,179 +8,40 @@
'use strict';
// Test is based on the following editor draft:
- // https://w3c.github.io/webrtc-pc/archives/20170515/webrtc.html
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCPeerConnection-helper.js:
- // generateOffer()
- // generateAnswer()
- // assert_session_desc_not_equals()
- // assert_session_desc_equals()
- // test_state_change_event()
- // test_never_resolve()
-
-
- /*
- * 4.3.2. setLocalDescription(offer)
- */
-
- /*
- * 5. If description.sdp is null and description.type is offer, set description.sdp
- * to lastOffer.
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
- return pc.createOffer()
- .then(offer =>
- pc.setLocalDescription({ type: 'offer' })
- .then(() => {
- assert_equals(pc.signalingState, 'have-local-offer');
- assert_session_desc_equals(pc.localDescription, offer);
- assert_session_desc_equals(pc.pendingLocalDescription, offer);
- assert_equals(pc.currentLocalDescription, null);
- }));
- }, 'setLocalDescription with type offer and null sdp should use lastOffer generated from createOffer');
-
- /*
- * 6. If description.type is offer and description.sdp does not match lastOffer,
- * reject the promise with a newly created InvalidModificationError and abort
- * these steps.
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return generateOffer({ data: true })
- .then(offer =>
- promise_rejects(t, 'InvalidModificationError',
- pc.setLocalDescription(offer)));
- }, 'setLocalDescription() with offer not created by own createOffer() should reject with InvalidModificationError');
-
- /*
- * 6. If description.type is offer and description.sdp does not match lastOffer,
- * reject the promise with a newly created InvalidModificationError and abort
- * these steps.
- */
- promise_test(t => {
- // Create first offer with audio line, then second offer with
- // both audio and video line. Since the second offer is the
- // last offer, setLocalDescription would reject when setting
- // with the first offer
- const pc = new RTCPeerConnection();
- return pc.createOffer({ offerToReceiveAudio: true })
- .then(offer1 =>
- pc.createOffer({ offerToReceiveVideo: true })
- .then(offer2 => {
- assert_session_desc_not_equals(offer1, offer2);
- return promise_rejects(t, 'InvalidModificationError',
- pc.setLocalDescription(offer1));
- }));
- }, 'Set created offer other than last offer should reject with InvalidModificationError');
-
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- // Only one state change event should be fired
- test_state_change_event(t, pc, ['have-local-offer']);
-
- return pc.createOffer({ offerToReceiveAudio: true })
- .then(offer1 =>
- pc.setLocalDescription(offer1)
- .then(() =>
- pc.createOffer({ offerToReceiveVideo: true })
- .then(offer2 =>
- pc.setLocalDescription(offer2)
- .then(offer2 => {
- assert_session_desc_not_equals(offer1, offer2);
- assert_equals(pc.signalingState, 'have-local-offer');
- assert_session_desc_equals(pc.localDescription, offer2);
- assert_session_desc_equals(pc.pendingLocalDescription, offer2);
- assert_equals(pc.currentLocalDescription, null);
- }))));
- }, 'Creating and setting offer multiple times should succeed');
-
- test_never_resolve(t => {
- const pc = new RTCPeerConnection();
-
- return pc.createOffer()
- .then(offer => {
- const promise = pc.setLocalDescription(offer);
- pc.close();
- return promise;
- });
- }, 'setLocalDescription(offer) should never resolve if connection is closed in parallel')
+ // generateOffer
+ // assert_session_desc_not_equals
+ // assert_session_desc_equals
+ // test_state_change_event
/*
- * TODO
- * 4.3.1. Setting an RTCSessionDescription
- * 2.2.2. If description is set as a local description, then run one of
- * the following steps:
- * - If description is of type "rollback", then this is a rollback. Set
- * connection.pendingLocalDescription to null and signaling state to stable.
- * - If description is of type "pranswer", then set connection.pendingLocalDescription
- * to description and signaling state to have-local-pranswer.
- */
-
-
- /* setLocalDescription(answer) */
-
- promise_test(t => {
- const pc = new RTCPeerConnection();
- test_state_change_event(t, pc, ['have-remote-offer', 'stable']);
-
- return generateOffer({ video: true })
- .then(offer =>
- pc.setRemoteDescription(offer)
- .then(() => pc.createAnswer())
- .then(answer =>
- pc.setLocalDescription(answer)
- .then(() => {
- assert_equals(pc.signalingState, 'stable');
- assert_session_desc_equals(pc.localDescription, answer);
- assert_session_desc_equals(pc.remoteDescription, offer);
-
- assert_session_desc_equals(pc.currentLocalDescription, answer);
- assert_session_desc_equals(pc.currentRemoteDescription, offer);
-
- assert_equals(pc.pendingLocalDescription, null);
- assert_equals(pc.pendingRemoteDescription, null);
- })));
- }, 'setLocalDescription() with valid answer should succeed');
-
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return generateOffer({ video: true })
- .then(offer =>
- pc.setRemoteDescription(offer)
- .then(() => pc.createAnswer())
- .then(answer =>
- pc.setLocalDescription({ type: 'answer' })
- .then(() => {
- assert_equals(pc.signalingState, 'stable');
- assert_session_desc_equals(pc.localDescription, answer);
- assert_session_desc_equals(pc.remoteDescription, offer);
-
- assert_session_desc_equals(pc.currentLocalDescription, answer);
- assert_session_desc_equals(pc.currentRemoteDescription, offer);
-
- assert_equals(pc.pendingLocalDescription, null);
- assert_equals(pc.pendingRemoteDescription, null);
- })));
- }, 'setLocalDescription() with type answer and null sdp should use lastAnswer generated from createAnswer');
-
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return generateOffer({ video: true })
- .then(offer =>
- pc.setRemoteDescription(offer)
- .then(() => generateAnswer(offer))
- .then(answer =>
- promise_rejects(t, 'InvalidModificationError',
- pc.setLocalDescription(answer))));
- }, 'setLocalDescription() with answer not created by own createAnswer() should reject with InvalidModificationError');
-
- /*
- * Operations after returning to stable state
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
*/
promise_test(t => {
@@ -212,7 +73,7 @@
test_state_change_event(t, pc,
['have-remote-offer', 'stable', 'have-local-offer']);
- return generateOffer({ data: true })
+ return generateOffer({ pc, data: true })
.then(offer => pc.setRemoteDescription(offer))
.then(() => pc.createAnswer())
.then(answer =>
@@ -230,41 +91,13 @@
}, 'Switching role from answerer to offerer after going back to stable state should succeed');
/*
- * InvalidStateError
- * [webrtc-pc] 4.3.1. Setting the RTCSessionDescription
- * 2.3. If the description's type is invalid for the current signaling state
- * of connection, then reject p with a newly created InvalidStateError
- * and abort these steps.
- */
-
- /*
- * [jsep] 5.5. If the type is "pranswer" or "answer", the PeerConnection
- * state MUST be either "have-remote-offer" or "have-local-pranswer".
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return generateOffer()
- .then(offer =>
- promise_rejects(t, 'InvalidStateError',
- pc.setLocalDescription({ type: 'answer', sdp: offer.sdp })));
-
- }, 'Calling setLocalDescription(answer) from stable state should reject with InvalidStateError');
-
- /*
- * [jsep] 5.5. If the type is "pranswer" or "answer", the PeerConnection
- * state MUST be either "have-remote-offer" or "have-local-pranswer".
+ TODO
+ 4.3.2. setLocalDescription
+ 4. If description.sdp is null and description.type is pranswer, set description.sdp
+ to lastAnswer.
+ 7. If description.type is pranswer and description.sdp does not match lastAnswer,
+ reject the promise with a newly created InvalidModificationError and abort these
+ steps.
*/
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return pc.createOffer()
- .then(offer =>
- pc.setLocalDescription(offer)
- .then(() => generateAnswer(offer)))
- .then(answer =>
- promise_rejects(t, 'InvalidStateError',
- pc.setLocalDescription(answer)));
- }, 'Calling setLocalDescription(answer) from have-local-offer state should reject with InvalidStateError');
</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-answer.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-answer.html
new file mode 100644
index 00000000000..75bbec80c28
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-answer.html
@@ -0,0 +1,117 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.setRemoteDescription - answer</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateOffer()
+ // generateAnswer()
+ // assert_session_desc_equals()
+ // test_state_change_event()
+
+ /*
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
+ */
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.2.3. Otherwise, if description is set as a remote description, then run one of
+ the following steps:
+ - If description is of type "answer", then this completes an offer answer
+ negotiation.
+
+ Set connection's currentRemoteDescription to description and
+ currentLocalDescription to the value of pendingLocalDescription.
+
+ Set both pendingRemoteDescription and pendingLocalDescription to null.
+
+ Finally setconnection's signaling state to stable.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ test_state_change_event(t, pc, ['have-local-offer', 'stable']);
+
+ return pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer))
+ .then(answer =>
+ pc.setRemoteDescription(answer)
+ .then(() => {
+ assert_equals(pc.signalingState, 'stable');
+
+ assert_session_desc_equals(pc.localDescription, offer);
+ assert_session_desc_equals(pc.remoteDescription, answer);
+
+ assert_session_desc_equals(pc.currentLocalDescription, offer);
+ assert_session_desc_equals(pc.currentRemoteDescription, answer);
+
+ assert_equals(pc.pendingLocalDescription, null);
+ assert_equals(pc.pendingRemoteDescription, null);
+ })));
+ }, 'setRemoteDescription() with valid state and answer should succeed');
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.1.3. If the description's type is invalid for the current signaling state of
+ connection, then reject p with a newly created InvalidStateError and abort
+ these steps.
+
+ [JSEP]
+ 5.6. If the type is "answer", the PeerConnection state MUST be either
+ "have-local-offer" or "have-remote-pranswer".
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.createOffer()
+ .then(offer =>
+ promise_rejects(t, 'InvalidStateError',
+ pc.setRemoteDescription({ type: 'answer', sdp: offer.sdp })));
+ }, 'Calling setRemoteDescription(answer) from stable state should reject with InvalidStateError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setRemoteDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer =>
+ promise_rejects(t, 'InvalidStateError',
+ pc.setRemoteDescription(answer)));
+
+ }, 'Calling setRemoteDescription(answer) from have-remote-offer state should reject with InvalidStateError');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html
new file mode 100644
index 00000000000..133199a55c5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-offer.html
@@ -0,0 +1,135 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.setRemoteDescription - offer</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateOffer()
+ // assert_session_desc_equals()
+ // test_state_change_event()
+
+ /*
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
+ */
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.2.3. Otherwise, if description is set as a remote description, then run one of
+ the following steps:
+ - If description is of type "offer", set connection.pendingRemoteDescription
+ attribute to description and signaling state to have-remote-offer.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ test_state_change_event(t, pc, ['have-remote-offer']);
+
+ return generateOffer({ pc, data: true })
+ .then(offer =>
+ pc.setRemoteDescription(offer)
+ .then(() => {
+ assert_equals(pc.signalingState, 'have-remote-offer');
+ assert_session_desc_equals(pc.remoteDescription, offer);
+ assert_session_desc_equals(pc.pendingRemoteDescription, offer);
+ assert_equals(pc.currentRemoteDescription, null);
+ }));
+ }, 'setRemoteDescription with valid offer should succeed');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ // have-remote-offer event should only fire once
+ test_state_change_event(t, pc, ['have-remote-offer']);
+
+ return Promise.all([
+ pc.createOffer({ offerToReceiveAudio: true }),
+ generateOffer({ pc, data: true })
+ ]).then(([offer1, offer2]) =>
+ pc.setRemoteDescription(offer1)
+ .then(() => pc.setRemoteDescription(offer2))
+ .then(() => {
+ assert_equals(pc.signalingState, 'have-remote-offer');
+ assert_session_desc_equals(pc.remoteDescription, offer2);
+ assert_session_desc_equals(pc.pendingRemoteDescription, offer2);
+ assert_equals(pc.currentRemoteDescription, null);
+ }));
+ }, 'Setting remote description multiple times with different offer should succeed');
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.1.4. If the content of description is not valid SDP syntax, then reject p with
+ an RTCError (with errorDetail set to "sdp-syntax-error" and the
+ sdpLineNumber attribute set to the line number in the SDP where the syntax
+ error was detected) and abort these steps.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.setRemoteDescription({
+ type: 'offer',
+ sdp: 'Invalid SDP'
+ })
+ .then(() => {
+ assert_unreached('Expect promise to be rejected');
+ }, err => {
+ assert_equals(err.errorDetail, 'sdp-syntax-error',
+ 'Expect error detail field to set to sdp-syntax-error');
+
+ assert_true(err instanceof RTCError,
+ 'Expect err to be instance of RTCError');
+ });
+ }, 'setRemoteDescription(offer) with invalid SDP should reject with RTCError');
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.1.3. If the description's type is invalid for the current signaling state of
+ connection, then reject p with a newly created InvalidStateError and abort
+ these steps.
+
+ [JSEP]
+ 5.6. If the type is "offer", the PeerConnection state MUST be either "stable" or
+ "have-remote-offer".
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.createOffer()
+ .then(offer => pc.setLocalDescription(offer))
+ .then(() => pc.createOffer())
+ .then(offer2 =>
+ promise_rejects(t, 'InvalidStateError',
+ pc.setRemoteDescription(offer2)));
+ }, 'Calling setRemoteDescription(offer) from have-local-offer state should reject with InvalidStateError');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html
new file mode 100644
index 00000000000..521290fc955
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-pranswer.html
@@ -0,0 +1,150 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.setRemoteDescription pranswer</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateOffer
+ // generateAnswer
+ // assert_session_desc_equals
+ // test_state_change_event
+
+ /*
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setLocalDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? localDescription;
+ readonly attribute RTCSessionDescription? currentLocalDescription;
+ readonly attribute RTCSessionDescription? pendingLocalDescription;
+
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
+ */
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.1.3. If the description's type is invalid for the current signaling state of
+ connection, then reject p with a newly created InvalidStateError and abort
+ these steps.
+
+ [JSEP]
+ 5.6. If the type is "pranswer" or "answer", the PeerConnection state MUST be either
+ "have-local-offer" or "have-remote-pranswer".
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ return pc.createOffer()
+ .then(offer =>
+ promise_rejects(t, 'InvalidStateError',
+ pc.setRemoteDescription({ type: 'pranswer', sdp: offer.sdp })));
+ }, 'setRemoteDescription(pranswer) from stable state should reject with InvalidStateError');
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.2.3. Otherwise, if description is set as a remote description, then run one
+ of the following steps:
+ - If description is of type "pranswer", then set
+ connection.pendingRemoteDescription to description and signaling state
+ to have-remote-pranswer.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ test_state_change_event(t, pc, ['have-local-offer', 'have-remote-pranswer']);
+
+ return pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer))
+ .then(answer => {
+ const pranswer = { type: 'pranswer', sdp: answer.sdp };
+
+ return pc.setRemoteDescription(pranswer)
+ .then(() => {
+ assert_equals(pc.signalingState, 'have-remote-pranswer');
+
+ assert_session_desc_equals(pc.localDescription, offer);
+ assert_session_desc_equals(pc.pendingLocalDescription, offer);
+ assert_equals(pc.currentLocalDescription, null);
+
+ assert_session_desc_equals(pc.remoteDescription, pranswer);
+ assert_session_desc_equals(pc.pendingRemoteDescription, pranswer);
+ assert_equals(pc.currentRemoteDescription, null);
+ });
+ }));
+ }, 'setRemoteDescription(pranswer) from have-local-offer state should succeed');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ test_state_change_event(t, pc, ['have-local-offer', 'have-remote-pranswer']);
+
+ return pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer))
+ .then(answer => {
+ const pranswer = { type: 'pranswer', sdp: answer.sdp };
+
+ return pc.setRemoteDescription(pranswer)
+ .then(() => pc.setRemoteDescription(pranswer));
+ }));
+ }, 'setRemoteDescription(pranswer) multiple times should succeed');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ test_state_change_event(t, pc, ['have-local-offer', 'have-remote-pranswer', 'stable']);
+
+ return pc.createOffer({ offerToReceiveVideo: true })
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer))
+ .then(answer => {
+ const pranswer = { type: 'pranswer', sdp: answer.sdp };
+
+ return pc.setRemoteDescription(pranswer)
+ .then(() => pc.setRemoteDescription(answer))
+ .then(() => {
+ assert_equals(pc.signalingState, 'stable');
+
+ assert_session_desc_equals(pc.localDescription, offer);
+ assert_session_desc_equals(pc.currentLocalDescription, offer);
+ assert_equals(pc.pendingLocalDescription, null);
+
+ assert_session_desc_equals(pc.remoteDescription, answer);
+ assert_session_desc_equals(pc.currentRemoteDescription, answer);
+ assert_equals(pc.pendingRemoteDescription, null);
+ });
+ }));
+ }, 'setRemoteDescription(answer) from have-remote-pranswer state should succeed');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html
new file mode 100644
index 00000000000..931a25f92b0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription-rollback.html
@@ -0,0 +1,111 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection.prototype.setRemoteDescription rollback</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateOffer
+ // assert_session_desc_equals
+ // test_state_change_event
+
+ /*
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setLocalDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? localDescription;
+ readonly attribute RTCSessionDescription? currentLocalDescription;
+ readonly attribute RTCSessionDescription? pendingLocalDescription;
+
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
+ */
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.2.3. Otherwise, if description is set as a remote description, then run one
+ of the following steps:
+ - If description is of type "rollback", then this is a rollback.
+ Set connection.pendingRemoteDescription to null and signaling state to stable.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+
+ test_state_change_event(t, pc, ['have-remote-offer', 'stable']);
+
+ return generateOffer({ data: true })
+ .then(offer => pc.setRemoteDescription(offer))
+ .then(() => {
+ assert_equals(pc.signalingState, 'have-remote-offer');
+ assert_not_equals(pc.remoteDescription, null);
+ assert_not_equals(pc.pendingRemoteDescription, null);
+ assert_equals(pc.currentRemoteDescription, null);
+
+ return pc.setRemoteDescription({ type: 'rollback' });
+ })
+ .then(() => {
+ assert_equals(pc.signalingState, 'stable');
+ assert_equals(pc.remoteDescription, null);
+ assert_equals(pc.pendingRemoteDescription, null);
+ assert_equals(pc.currentRemoteDescription, null);
+ });
+ }, 'setRemoteDescription(rollback) in have-remote-offer state should revert to stable state');
+
+ /*
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.3. If the description's type is invalid for the current signaling state of
+ connection, then reject p with a newly created InvalidStateError and abort
+ these steps.
+
+ [jsep]
+ 4.1.8.2. Rollback
+ - Rollback can only be used to cancel proposed changes;
+ there is no support for rolling back from a stable state to a
+ previous stable state
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ return promise_rejects(t, 'InvalidStateError',
+ pc.setRemoteDescription({ type: 'rollback' }));
+ }, `setRemoteDescription(rollback) from stable state should reject with InvalidStateError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ return pc.createOffer({ offerToReceiveAudio: true })
+ .then(offer => pc.setRemoteDescription(offer))
+ .then(() => pc.setRemoteDescription({
+ type: 'rollback',
+ sdp: '!<Invalid SDP Content>;'
+ }));
+ }, `setRemoteDescription(rollback) should ignore invalid sdp content and succeed`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription.html b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription.html
index da1f488efbc..2efd3019003 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCPeerConnection-setRemoteDescription.html
@@ -8,7 +8,7 @@
'use strict';
// Test is based on the following editor draft:
- // https://w3c.github.io/webrtc-pc/archives/20170515/webrtc.html
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer()
@@ -16,86 +16,37 @@
// assert_session_desc_not_equals()
// assert_session_desc_equals()
// test_state_change_event()
- // test_never_resolve()
/*
- * 4.3.2. setRemoteDescription(offer)
+ 4.3.2. Interface Definition
+ [Constructor(optional RTCConfiguration configuration)]
+ interface RTCPeerConnection : EventTarget {
+ Promise<void> setRemoteDescription(
+ RTCSessionDescriptionInit description);
+
+ readonly attribute RTCSessionDescription? remoteDescription;
+ readonly attribute RTCSessionDescription? currentRemoteDescription;
+ readonly attribute RTCSessionDescription? pendingRemoteDescription;
+ ...
+ };
+
+ 4.6.2. RTCSessionDescription Class
+ dictionary RTCSessionDescriptionInit {
+ required RTCSdpType type;
+ DOMString sdp = "";
+ };
+
+ 4.6.1. RTCSdpType
+ enum RTCSdpType {
+ "offer",
+ "pranswer",
+ "answer",
+ "rollback"
+ };
*/
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- test_state_change_event(t, pc, ['have-remote-offer']);
-
- return generateOffer({ data: true })
- .then(offer =>
- pc.setRemoteDescription(offer)
- .then(offer => {
- assert_equals(pc.signalingState, 'have-remote-offer');
- assert_session_desc_equals(pc.remoteDescription, offer);
- assert_session_desc_equals(pc.pendingRemoteDescription, offer);
- assert_equals(pc.currentRemoteDescription, null);
- }));
- }, 'setRemoteDescription with valid offer should succeed');
-
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- // have-remote-offer event should only fire once
- test_state_change_event(t, pc, ['have-remote-offer']);
-
- return Promise.all([
- generateOffer({ audio: true }),
- generateOffer({ data: true })
- ]).then(([offer1, offer2]) =>
- pc.setRemoteDescription(offer1)
- .then(() => pc.setRemoteDescription(offer2))
- .then(() => {
- assert_equals(pc.signalingState, 'have-remote-offer');
- assert_session_desc_equals(pc.remoteDescription, offer2);
- assert_session_desc_equals(pc.pendingRemoteDescription, offer2);
- assert_equals(pc.currentRemoteDescription, null);
- }));
- }, 'Setting remote description multiple times with different offer should succeed');
-
- test_never_resolve(t => {
- const pc = new RTCPeerConnection();
-
- return generateOffer()
- .then(offer => {
- const promise = pc.setRemoteDescription(offer);
- pc.close();
- return promise;
- });
- }, 'setRemoteDescription(offer) should never resolve if connection is closed in parallel')
-
- /*
- * 4.3.1. Setting an RTCSessionDescription
- * 2.4. If the content of description is not valid SDP syntax, then reject p
- * with an RTCError (with errorDetail set to "sdp-syntax-error" and the
- * sdpLineNumber attribute set to the line number in the SDP where the
- * syntax error was detected) and abort these steps.
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return pc.setRemoteDescription({
- type: 'offer',
- sdp: 'Invalid SDP'
- })
- .then(() => {
- assert_unreached('Expect promise to be rejected');
- }, err => {
- assert_equals(err.errorDetail, 'sdp-syntax-error',
- 'Expect error detail field to set to sdp-syntax-error');
-
- assert_true(err instanceof RTCError,
- 'Expect err to be instance of RTCError');
- });
- }, 'setRemoteDescription(offer) with invalid SDP should reject with RTCError');
-
/*
- * 4.6.1. enum RTCSdpType
+ 4.6.1. enum RTCSdpType
*/
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -106,7 +57,7 @@
type: 'bogus',
sdp: 'bogus'
}));
- }, 'setRemoteDescription with invalid type and invalid SDP should reject with TypeError')
+ }, 'setRemoteDescription with invalid type and invalid SDP should reject with TypeError');
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -117,71 +68,9 @@
type: 'answer',
sdp: 'invalid'
}));
- }, 'setRemoteDescription() with invalid SDP and stable state should reject with InvalidStateError')
-
- /*
- * TODO
- * Setting an RTCSessionDescription
- * 2.1.5. If the content of description is invalid, then reject p with
- * a newly created InvalidAccessError and abort these steps.
- * 2.2.5-10
- * setRemoteDescription(rollback)
- * setRemoteDescription(pranswer)
- *
- * Non-testable
- * Setting an RTCSessionDescription
- * 6. For all other errors, for example if description cannot be
- * applied at the media layer, reject p with a newly created OperationError.
- */
+ }, 'setRemoteDescription() with invalid SDP and stable state should reject with InvalidStateError');
- /*
- * 4.3.2. setRemoteDescription(answer)
- */
-
- promise_test(t => {
- const pc = new RTCPeerConnection();
- test_state_change_event(t, pc, ['have-local-offer', 'stable']);
-
- return pc.createOffer({ offerToReceiveVideo: true })
- .then(offer =>
- pc.setLocalDescription(offer)
- .then(() => generateAnswer(offer))
- .then(answer =>
- pc.setRemoteDescription(answer)
- .then(() => {
- assert_session_desc_equals(pc.localDescription, offer);
- assert_session_desc_equals(pc.remoteDescription, answer);
-
- assert_session_desc_equals(pc.currentLocalDescription, offer);
- assert_session_desc_equals(pc.currentRemoteDescription, answer);
-
- assert_equals(pc.pendingLocalDescription, null);
- assert_equals(pc.pendingRemoteDescription, null);
- })));
- }, 'setRemoteDescription() with valid state and answer should succeed');
-
- /*
- * TODO
- * 4.3.2 setRemoteDescription
- * If an a=identity attribute is present in the session description,
- * the browser validates the identity assertion.
- *
- * If the "peerIdentity" configuration is applied to the RTCPeerConnection,
- * this establishes a target peer identity of the provided value. Alternatively,
- * if the RTCPeerConnection has previously authenticated the identity of the
- * peer (that is, there is a current value for peerIdentity ), then this also
- * establishes a target peer identity.
- *
- * The target peer identity cannot be changed once set. Once set,
- * if a different value is provided, the user agent must reject
- * the returned promise with a newly created InvalidModificationError
- * and abort this operation. The RTCPeerConnection must be closed if
- * the validated peer identity does not match the target peer identity.
- */
-
- /*
- * Operations after returning to stable state
- */
+ /* Operations after returning to stable state */
promise_test(t => {
const pc = new RTCPeerConnection();
@@ -190,21 +79,22 @@
test_state_change_event(t, pc,
['have-remote-offer', 'stable', 'have-remote-offer']);
- return generateOffer({ audio: true })
+ return pc2.createOffer({ offerToReceiveAudio: true })
.then(offer1 =>
pc.setRemoteDescription(offer1)
.then(() => pc.createAnswer())
.then(answer => pc.setLocalDescription(answer))
- .then(() => generateOffer({ data: true }))
- .then(offer2 =>
- pc.setRemoteDescription(offer2)
+ .then(() => pc2.createOffer({ offerToReceiveVideo: true }))
+ .then(offer2 => {
+ return pc.setRemoteDescription(offer2)
.then(() => {
assert_equals(pc.signalingState, 'have-remote-offer');
assert_session_desc_not_equals(offer1, offer2);
assert_session_desc_equals(pc.remoteDescription, offer2);
assert_session_desc_equals(pc.currentRemoteDescription, offer1);
assert_session_desc_equals(pc.pendingRemoteDescription, offer2);
- })));
+ });
+ }));
}, 'Calling setRemoteDescription() again after one round of remote-offer/local-answer should succeed');
promise_test(t => {
@@ -219,7 +109,7 @@
.then(() => generateAnswer(offer)))
.then(answer =>
pc.setRemoteDescription(answer)
- .then(() => generateOffer({ data: true }))
+ .then(() => generateOffer({ pc, data: true }))
.then(offer =>
pc.setRemoteDescription(offer)
.then(() => {
@@ -231,97 +121,10 @@
}, 'Switching role from offerer to answerer after going back to stable state should succeed');
/*
- * InvalidStateError
- * [webrtc-pc] 4.3.1. Setting the RTCSessionDescription
- * 2.3. If the description's type is invalid for the current signaling state
- * of connection, then reject p with a newly created InvalidStateError
- * and abort these steps.
- */
-
- /*
- * [jsep] 5.6. If the type is "pranswer" or "answer", the PeerConnection
- * state MUST be either "have-local-offer" or "have-remote-pranswer".
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return generateOffer()
- .then(offer =>
- promise_rejects(t, 'InvalidStateError',
- pc.setRemoteDescription({ type: 'answer', sdp: offer.sdp })));
- }, 'Calling setRemoteDescription(answer) from stable state should reject with InvalidStateError');
-
-
- /*
- * [jsep] 5.6. If the type is "offer", the PeerConnection state
- * MUST be either "stable" or "have-remote-offer".
+ TODO
+ 4.3.2. setRemoteDescription
+ - If an a=identity attribute is present in the session description, the browser
+ validates the identity assertion.
*/
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return pc.createOffer()
- .then(offer => pc.setLocalDescription(offer))
- .then(() => generateOffer())
- .then(offer =>
- promise_rejects(t, 'InvalidStateError',
- pc.setRemoteDescription(offer)));
- }, 'Calling setRemoteDescription(offer) from have-local-offer state should reject with InvalidStateError');
-
- /*
- * [jsep] 5.6. If the type is "pranswer" or "answer", the PeerConnection
- * state MUST be either "have-local-offer" or "have-remote-pranswer".
- */
- promise_test(t => {
- const pc = new RTCPeerConnection();
-
- return generateOffer()
- .then(offer =>
- pc.setRemoteDescription(offer)
- .then(() => generateAnswer(offer)))
- .then(answer =>
- promise_rejects(t, 'InvalidStateError',
- pc.setRemoteDescription(answer)));
-
- }, 'Calling setRemoteDescription(answer) from have-remote-offer state should reject with InvalidStateError');
-
- // tests that ontrack is called and parses the msid information from the SDP and creates
- // the streams with matching identifiers.
- async_test(t => {
- const pc = new RTCPeerConnection();
-
- // Fail the test if the ontrack event handler is not implemented
- assert_own_property(pc, 'ontrack', 'Expect pc to have ontrack event handler attribute');
-
- const sdp = `v=0
-o=- 166855176514521964 2 IN IP4 127.0.0.1
-s=-
-t=0 0
-a=msid-semantic:WMS *
-m=audio 9 UDP/TLS/RTP/SAVPF 111
-c=IN IP4 0.0.0.0
-a=rtcp:9 IN IP4 0.0.0.0
-a=ice-ufrag:someufrag
-a=ice-pwd:somelongpwdwithenoughrandomness
-a=fingerprint:sha-256 8C:71:B3:8D:A5:38:FD:8F:A4:2E:A2:65:6C:86:52:BC:E0:6E:94:F2:9F:7C:4D:B5:DF:AF:AA:6F:44:90:8D:F4
-a=setup:actpass
-a=rtcp-mux
-a=mid:mid1
-a=sendonly
-a=rtpmap:111 opus/48000/2
-a=msid:stream1 track1
-a=ssrc:1001 cname:some
-`;
-
- pc.ontrack = t.step_func(event => {
- assert_equals(event.streams.length, 1, 'the track belongs to one MediaStream');
- assert_equals(event.streams[0].id, 'stream1', 'the stream name is parsed from the MSID line');
- t.done();
- });
-
- pc.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp}))
- .catch(t.step_func(err => {
- assert_unreached('Error ' + err.name + ': ' + err.message);
- }));
- }, 'setRemoteDescription should trigger ontrack event when the MSID of the stream is is parsed.');
</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpCapabilities-helper.js b/tests/wpt/web-platform-tests/webrtc/RTCRtpCapabilities-helper.js
new file mode 100644
index 00000000000..8617e7f4f97
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpCapabilities-helper.js
@@ -0,0 +1,52 @@
+'use strict'
+
+// Test is based on the following editor draft:
+// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+// This file depends on dictionary-helper.js which should
+// be loaded from the main HTML file.
+
+/*
+ 5.2. RTCRtpSender Interface
+ dictionary RTCRtpCapabilities {
+ sequence<RTCRtpCodecCapability> codecs;
+ sequence<RTCRtpHeaderExtensionCapability> headerExtensions;
+ };
+
+ dictionary RTCRtpCodecCapability {
+ DOMString mimeType;
+ unsigned long clockRate;
+ unsigned short channels;
+ DOMString sdpFmtpLine;
+ };
+
+ dictionary RTCRtpHeaderExtensionCapability {
+ DOMString uri;
+ };
+ */
+
+function validateRtpCapabilities(capabilities) {
+ assert_array_field(capabilities, 'codecs');
+ for(const codec of capabilities.codecs) {
+ validateCodecCapability(codec);
+ }
+
+ assert_greater_than(capabilities.codec, 0,
+ 'Expect at least one codec capability available');
+
+ assert_array_field(capabilities, 'headerExtensions');
+ for(const headerExt of capabilities.headerExtensions) {
+ validateHeaderExtensionCapability(headerExt);
+ }
+}
+
+function validateCodecCapability(codec) {
+ assert_optional_string_field(codec, 'mimeType');
+ assert_optional_unsigned_int_field(codec, 'clockRate');
+ assert_optional_unsigned_int_field(codec, 'channels');
+ assert_optional_string_field(codec, 'sdpFmtpLine');
+}
+
+function validateHeaderExtensionCapability(headerExt) {
+ assert_optional_string_field(uri);
+}
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-codecs.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-codecs.html
new file mode 100644
index 00000000000..58cad8ae1c3
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-codecs.html
@@ -0,0 +1,233 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpParameters codecs</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCRtpParameters-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCRtpParameters-helper.js:
+ // validateSenderRtpParameters
+
+ /*
+ 5.2. RTCRtpSender Interface
+ interface RTCRtpSender {
+ Promise<void> setParameters(optional RTCRtpParameters parameters);
+ RTCRtpParameters getParameters();
+ };
+
+ dictionary RTCRtpParameters {
+ DOMString transactionId;
+ sequence<RTCRtpEncodingParameters> encodings;
+ sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
+ RTCRtcpParameters rtcp;
+ sequence<RTCRtpCodecParameters> codecs;
+ RTCDegradationPreference degradationPreference;
+ };
+
+ dictionary RTCRtpCodecParameters {
+ [readonly]
+ unsigned short payloadType;
+
+ [readonly]
+ DOMString mimeType;
+
+ [readonly]
+ unsigned long clockRate;
+
+ [readonly]
+ unsigned short channels;
+
+ [readonly]
+ DOMString sdpFmtpLine;
+ };
+
+ getParameters
+ - The codecs sequence is populated based on the codecs that have been negotiated
+ for sending, and which the user agent is currently capable of sending.
+
+ If setParameters has removed or reordered codecs, getParameters MUST return
+ the shortened/reordered list. However, every time codecs are renegotiated by
+ a new offer/answer exchange, the list of codecs MUST be restored to the full
+ negotiated set, in the priority order indicated by the remote description,
+ in effect discarding the effects of setParameters.
+
+ codecs
+ - When using the setParameters method, the codecs sequence from the corresponding
+ call to getParameters can be reordered and entries can be removed, but entries
+ cannot be added, and the RTCRtpCodecParameters dictionary members cannot be modified.
+ */
+
+ // Get the first codec from param.codecs.
+ // Assert that param.codecs has at least one element
+ function getFirstCodec(param) {
+ const { codecs } = param;
+ assert_greater_than(codecs.length, 0);
+ return codecs[0];
+ }
+
+ /*
+ 5.2. setParameters
+ 7. If parameters.encodings.length is different from N, or if any parameter
+ in the parameters argument, marked as a Read-only parameter, has a value
+ that is different from the corresponding parameter value returned from
+ sender.getParameters(), abort these steps and return a promise rejected
+ with a newly created InvalidModificationError. Note that this also applies
+ to transactionId.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const codec = getFirstCodec(param);
+
+ if(codec.payloadType === undefined) {
+ codec.payloadType = 8;
+ } else {
+ codec.payloadType += 1;
+ }
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, 'setParameters() with codec.payloadType modified should reject with InvalidModificationError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const codec = getFirstCodec(param);
+
+ if(codec.mimeType === undefined) {
+ codec.mimeType = 'audio/piedpiper';
+ } else {
+ codec.mimeType = `${codec.mimeType}-modified`;
+ }
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, 'setParameters() with codec.mimeType modified should reject with InvalidModificationError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const codec = getFirstCodec(param);
+
+ if(codec.clockRate === undefined) {
+ codec.clockRate = 8000;
+ } else {
+ codec.clockRate += 1;
+ }
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, 'setParameters() with codec.clockRate modified should reject with InvalidModificationError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const codec = getFirstCodec(param);
+
+ if(codec.channels === undefined) {
+ codec.channels = 6;
+ } else {
+ codec.channels += 1;
+ }
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, 'setParameters() with codec.channels modified should reject with InvalidModificationError');
+
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const codec = getFirstCodec(param);
+
+ if(codec.sdpFmtpLine === undefined) {
+ codec.sdpFmtpLine = 'a=fmtp:98 0-15';
+ } else {
+ codec.sdpFmtpLine = `${codec.sdpFmtpLine};foo=1`;
+ }
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, 'setParameters() with codec.sdpFmtpLine modified should reject with InvalidModificationError');
+
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const { codecs } = param;
+
+ codecs.push({
+ payloadType: 2,
+ mimeType: 'audio/piedpiper',
+ clockRate: 1000,
+ channels: 2
+ });
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, 'setParameters() with new codecs inserted should reject with InvalidModificationError');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const { codecs } = param;
+
+ // skip and pass test if there is less than 2 codecs
+ if(codecs.length >= 2) {
+ const tmp = codecs[0];
+ codecs[0] = codecs[1];
+ codecs[1] = tmp;
+ }
+
+ return sender.setParameters(param);
+
+ }, 'setParameters with reordered codecs should succeed');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const { codecs } = param;
+
+ param.codecs = codecs.slice(1);
+
+ return sender.setParameters(param);
+
+ }, 'setParameters with dropped codec should succeed');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-degradationPreference.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-degradationPreference.html
new file mode 100644
index 00000000000..8d0ab7e2b2c
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-degradationPreference.html
@@ -0,0 +1,85 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpParameters degradationPreference</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCRtpParameters-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCRtpParameters-helper.js:
+ // validateSenderRtpParameters
+
+ /*
+ 5.2. RTCRtpSender Interface
+ interface RTCRtpSender {
+ Promise<void> setParameters(optional RTCRtpParameters parameters);
+ RTCRtpParameters getParameters();
+ };
+
+ dictionary RTCRtpParameters {
+ DOMString transactionId;
+ sequence<RTCRtpEncodingParameters> encodings;
+ sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
+ RTCRtcpParameters rtcp;
+ sequence<RTCRtpCodecParameters> codecs;
+ RTCDegradationPreference degradationPreference;
+ };
+
+ enum RTCDegradationPreference {
+ "maintain-framerate",
+ "maintain-resolution",
+ "balanced"
+ };
+
+ - degradationPreference is set to the last value passed into setParameters,
+ or the default value of "balanced" if setParameters hasn't been called.
+ */
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ assert_equals(param.degradationPreference, 'balanced',
+ 'Expect initial param.degradationPreference to be balanced');
+
+ param.degradationPreference = 'maintain-framerate';
+
+ return pc.setParameters(param)
+ .then(() => {
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ assert_equals(param.degradationPreference, 'maintain-framerate');
+ });
+ }, 'setParameters with degradationPreference set should succeed');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ assert_equals(param.degradationPreference, 'balanced',
+ 'Expect initial param.degradationPreference to be balanced');
+
+ param.degradationPreference = undefined;
+
+ return pc.setParameters(param)
+ .then(() => {
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ assert_equals(param.degradationPreference, undefined);
+ });
+ }, 'setParameters with degradationPreference unset should succeed');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-encodings.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-encodings.html
new file mode 100644
index 00000000000..5a9630e1532
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-encodings.html
@@ -0,0 +1,396 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpParameters encodings</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCRtpParameters-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCRtpParameters-helper.js:
+ // validateSenderRtpParameters
+
+ /*
+ 5.1. RTCPeerConnection Interface Extensions
+ partial interface RTCPeerConnection {
+ RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
+ optional RTCRtpTransceiverInit init);
+ ...
+ };
+
+ dictionary RTCRtpTransceiverInit {
+ RTCRtpTransceiverDirection direction = "sendrecv";
+ sequence<MediaStream> streams;
+ sequence<RTCRtpEncodingParameters> sendEncodings;
+ };
+
+ 5.2. RTCRtpSender Interface
+ interface RTCRtpSender {
+ Promise<void> setParameters(optional RTCRtpParameters parameters);
+ RTCRtpParameters getParameters();
+ };
+
+ dictionary RTCRtpParameters {
+ DOMString transactionId;
+ sequence<RTCRtpEncodingParameters> encodings;
+ sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
+ RTCRtcpParameters rtcp;
+ sequence<RTCRtpCodecParameters> codecs;
+ RTCDegradationPreference degradationPreference;
+ };
+
+ dictionary RTCRtpEncodingParameters {
+ [readonly]
+ unsigned long ssrc;
+
+ [readonly]
+ RTCRtpRtxParameters rtx;
+
+ [readonly]
+ RTCRtpFecParameters fec;
+
+ RTCDtxStatus dtx;
+ boolean active;
+ RTCPriorityType priority;
+ unsigned long ptime;
+ unsigned long maxBitrate;
+ double maxFramerate;
+
+ [readonly]
+ DOMString rid;
+
+ double scaleResolutionDownBy;
+ };
+
+ dictionary RTCRtpRtxParameters {
+ [readonly]
+ unsigned long ssrc;
+ };
+
+ dictionary RTCRtpFecParameters {
+ [readonly]
+ unsigned long ssrc;
+ };
+
+ enum RTCDtxStatus {
+ "disabled",
+ "enabled"
+ };
+
+ enum RTCPriorityType {
+ "very-low",
+ "low",
+ "medium",
+ "high"
+ };
+
+ getParameters
+ - encodings is set to the value of the [[send encodings]] internal slot.
+ */
+
+ // Get the first encoding in param.encodings.
+ // Asserts that param.encodings has at least one element.
+ function getFirstEncoding(param) {
+ const { encodings } = param;
+ assert_equals(encodings.length, 1);
+ return encodings[0];
+ }
+
+ /*
+ 5.1. addTransceiver
+ 7. Create an RTCRtpSender with track, streams and sendEncodings and let sender
+ be the result.
+
+ 5.2. create an RTCRtpSender
+ 5. Let sender have a [[send encodings]] internal slot, representing a list
+ of RTCRtpEncodingParameters dictionaries.
+ 6. If sendEncodings is given as input to this algorithm, and is non-empty,
+ set the [[send encodings]] slot to sendEncodings.
+
+ Otherwise, set it to a list containing a single RTCRtpEncodingParameters
+ with active set to true.
+ */
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const param = transceiver.sender.getParameters();
+ validateSenderRtpParameters(param);
+ const { encodings } = param;
+ const encoding = getFirstEncoding(param);
+
+ assert_equals(encoding.active, true);
+ }, 'addTransceiver() with undefined sendEncodings should have default encoding parameter with active set to true');
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio', { sendEncodings: [] });
+
+ const param = transceiver.sender.getParameters();
+ validateSenderRtpParameters(param);
+ const { encodings } = param;
+ const encoding = getFirstEncoding(param);
+
+ assert_equals(encoding.active, true);
+ }, 'addTransceiver() with empty list sendEncodings should have default encoding parameter with active set to true');
+
+ /*
+ 5.2. create an RTCRtpSender
+ To create an RTCRtpSender with a MediaStreamTrack , track, a list of MediaStream
+ objects, streams, and optionally a list of RTCRtpEncodingParameters objects,
+ sendEncodings, run the following steps:
+ 5. Let sender have a [[send encodings]] internal slot, representing a list
+ of RTCRtpEncodingParameters dictionaries.
+
+ 6. If sendEncodings is given as input to this algorithm, and is non-empty,
+ set the [[send encodings]] slot to sendEncodings.
+
+ 5.2. getParameters
+ - encodings is set to the value of the [[send encodings]] internal slot.
+ */
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio', {
+ sendEncodings: [{
+ dtx: 'enabled',
+ active: false,
+ priority: 'low',
+ ptime: 5,
+ maxBitrate: 8,
+ maxFramerate: 25,
+ rid: 'foo'
+ }]
+ });
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+ const encoding = getFirstEncoding(param);
+
+ assert_equals(encoding.dtx, 'enabled');
+ assert_equals(encoding.active, false);
+ assert_equals(encoding.priority, 'low');
+ assert_equals(encoding.ptime, 5);
+ assert_equals(encoding.maxBitrate, 8);
+ assert_equals(encoding.maxFramerate, 25);
+ assert_equals(encoding.rid, 'foo');
+
+ }, `sender.getParameters() should return sendEncodings set by addTransceiver()`);
+
+ /*
+ 5.2. setParameters
+ 3. Let N be the number of RTCRtpEncodingParameters stored in sender's internal
+ [[send encodings]] slot.
+ 7. If parameters.encodings.length is different from N, or if any parameter
+ in the parameters argument, marked as a Read-only parameter, has a value
+ that is different from the corresponding parameter value returned from
+ sender.getParameters(), abort these steps and return a promise rejected
+ with a newly created InvalidModificationError. Note that this also applies
+ to transactionId.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const { encodings } = param;
+ assert_equals(encodings.length, 1);
+
+ // {} is valid RTCRtpEncodingParameters because all fields are optional
+ encodings.push({});
+ assert_equals(param.encodings.length, 2);
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `sender.setParameters() with mismatch number of encodings should reject with InvalidModificationError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ param.encodings = undefined;
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `sender.setParameters() with encodings unset should reject with InvalidModificationError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+ const encoding = getFirstEncoding(param);
+ const { ssrc } = encoding;
+
+ // ssrc may not be set since it is optional
+ if(ssrc === undefined) {
+ encoding.ssrc = 2;
+ } else {
+ // If it is set, increase the number by 1 to make it different from original
+ encoding.ssrc = ssrc + 1;
+ }
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `setParameters() with modified encoding.ssrc field should reject with InvalidModificationError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+ const encoding = getFirstEncoding(param);
+ const { rtx } = encoding;
+
+ if(rtx === undefined) {
+ encoding.rtx = { ssrc: 2 };
+ } else if(rtx.ssrc === undefined) {
+ rtx.ssrc = 2;
+ } else {
+ rtx.ssrc += 1;
+ }
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `setParameters() with modified encoding.rtx field should reject with InvalidModificationError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+ const encoding = getFirstEncoding(param);
+ const { fec } = encoding;
+
+ if(fec === undefined) {
+ encoding.fec = { ssrc: 2 };
+ } else if(fec.ssrc === undefined) {
+ fec.ssrc = 2;
+ } else {
+ fec.ssrc += 1;
+ }
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `setParameters() with modified encoding.fec field should reject with InvalidModificationError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio', {
+ sendEncodings: [{ rid: 'foo' }],
+ });
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+ const encoding = getFirstEncoding(param);
+
+ assert_equals(encoding.rid, 'foo');
+
+ encoding.rid = 'bar';
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `setParameters() with modified encoding.rid field should reject with InvalidModificationError`);
+
+ /*
+ 5.2. setParameters
+ 8. If the scaleResolutionDownBy parameter in the parameters argument has a
+ value less than 1.0, abort these steps and return a promise rejected with
+ a newly created RangeError.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+ const encoding = getFirstEncoding(param);
+
+ encoding.scaleResolutionDownBy = 0.5;
+ return promise_rejects(t, 'RangeError',
+ sender.setParameters(param));
+
+ }, `setParameters() with encoding.scaleResolutionDownBy field set to less than 1.0 should reject with RangeError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+ const encoding = getFirstEncoding(param);
+
+ encoding.scaleResolutionDownBy = 1.5;
+ return sender.setParameters(param)
+ .then(() => {
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+ const encoding = getFirstEncoding(param);
+
+ assert_approx_equals(encoding.scaleResolutionDownBy, 1.5, 0.01);
+ });
+
+ }, `setParameters() with encoding.scaleResolutionDownBy field set to greater than 1.0 should succeed`);
+
+ // Helper function to test that modifying an encoding field should succeed
+ function test_modified_encoding(field, value1, value2, desc) {
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio', {
+ sendEncodings: [{
+ [field]: value1
+ }]
+ });
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+ const encoding = getFirstEncoding(param);
+
+ assert_equals(encoding[field], value1);
+ encoding[field] = value2;
+
+ return sender.setParameters(param)
+ .then(() => {
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+ const encoding = getFirstEncoding(param);
+ assert_equals(encoding[field], value2);
+ });
+ }, desc);
+ }
+
+ test_modified_encoding('dtx', 'enabled', 'disabled',
+ 'setParameters() with modified encoding.dtx should succeed');
+
+ test_modified_encoding('dtx', 'enabled', undefined,
+ 'setParameters() with unset encoding.dtx should succeed');
+
+ test_modified_encoding('active', true, false,
+ 'setParameters() with modified encoding.active should succeed');
+
+ test_modified_encoding('priority', 'very-low', 'high',
+ 'setParameters() with modified encoding.priority should succeed');
+
+ test_modified_encoding('ptime', 2, 4,
+ 'setParameters() with modified encoding.ptime should succeed');
+
+ test_modified_encoding('maxBitrate', 2, 4,
+ 'setParameters() with modified encoding.maxBitrate should succeed');
+
+ test_modified_encoding('maxBitrate', 24, 16,
+ 'setParameters() with modified encoding.maxFramerate should succeed');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-headerExtensions.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-headerExtensions.html
new file mode 100644
index 00000000000..ed6b1e682a7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-headerExtensions.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpParameters headerExtensions</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCRtpParameters-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCRtpParameters-helper.js:
+ // validateSenderRtpParameters
+
+ /*
+ 5.2. RTCRtpSender Interface
+ interface RTCRtpSender {
+ Promise<void> setParameters(optional RTCRtpParameters parameters);
+ RTCRtpParameters getParameters();
+ };
+
+ dictionary RTCRtpParameters {
+ DOMString transactionId;
+ sequence<RTCRtpEncodingParameters> encodings;
+ sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
+ RTCRtcpParameters rtcp;
+ sequence<RTCRtpCodecParameters> codecs;
+ RTCDegradationPreference degradationPreference;
+ };
+
+ dictionary RTCRtpHeaderExtensionParameters {
+ [readonly]
+ DOMString uri;
+
+ [readonly]
+ unsigned short id;
+
+ [readonly]
+ boolean encrypted;
+ };
+
+ getParameters
+ - The headerExtensions sequence is populated based on the header extensions
+ that have been negotiated for sending.
+ */
+
+ /*
+ 5.2. setParameters
+ 7. If parameters.encodings.length is different from N, or if any parameter
+ in the parameters argument, marked as a Read-only parameter, has a value
+ that is different from the corresponding parameter value returned from
+ sender.getParameters(), abort these steps and return a promise rejected
+ with a newly created InvalidModificationError. Note that this also applies
+ to transactionId.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ param.headerExtensions = [{
+ uri: 'non-existent.example.org',
+ id: 404,
+ encrypted: false
+ }];
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `setParameters() with modified headerExtensions should reject with InvalidModificationError`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-helper.js b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-helper.js
new file mode 100644
index 00000000000..a46f15b291d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-helper.js
@@ -0,0 +1,262 @@
+'use strict';
+
+// Test is based on the following editor draft:
+// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+// Helper function for testing RTCRtpParameters dictionary fields
+
+// This file depends on dictionary-helper.js which should
+// be loaded from the main HTML file.
+
+/*
+ Validates the RTCRtpParameters returned from RTCRtpSender.prototype.getParameters
+
+ 5.2. RTCRtpSender Interface
+ getParameters
+ - transactionId is set to a new unique identifier, used to match this getParameters
+ call to a setParameters call that may occur later.
+
+ - encodings is set to the value of the [[SendEncodings]] internal slot.
+
+ - The headerExtensions sequence is populated based on the header extensions that
+ have been negotiated for sending.
+
+ - The codecs sequence is populated based on the codecs that have been negotiated
+ for sending, and which the user agent is currently capable of sending. If
+ setParameters has removed or reordered codecs, getParameters MUST return the
+ shortened/reordered list. However, every time codecs are renegotiated by a
+ new offer/answer exchange, the list of codecs MUST be restored to the full
+ negotiated set, in the priority order indicated by the remote description,
+ in effect discarding the effects of setParameters.
+
+ - rtcp.cname is set to the CNAME of the associated RTCPeerConnection. rtcp.reducedSize
+ is set to true if reduced-size RTCP has been negotiated for sending, and false otherwise.
+
+ - degradationPreference is set to the last value passed into setParameters, or the
+ default value of "balanced" if setParameters hasn't been called.
+ */
+function validateSenderRtpParameters(param) {
+ validateRtpParameters(param);
+
+ assert_not_equals(param.transactionId, undefined,
+ 'Expect sender param.transactionId to be set');
+
+ assert_not_equals(param.rtcp.cname, undefined,
+ 'Expect sender param.rtcp.cname to be set');
+
+ assert_not_equals(param.rtcp.reducedSize, undefined,
+ 'Expect sender param.rtcp.reducedSize to be set to either true or false');
+}
+
+/*
+ Validates the RTCRtpParameters returned from RTCRtpReceiver.prototype.getParameters
+
+ 5.3. RTCRtpReceiver Interface
+ getParameters
+ When getParameters is called, the RTCRtpParameters dictionary is constructed
+ as follows:
+
+ - encodings is populated based on SSRCs and RIDs present in the current remote
+ description, including SSRCs used for RTX and FEC, if signaled. Every member
+ of the RTCRtpEncodingParameters dictionaries other than the SSRC and RID fields
+ is left undefined.
+
+ - The headerExtensions sequence is populated based on the header extensions that
+ the receiver is currently prepared to receive.
+
+ - The codecs sequence is populated based on the codecs that the receiver is currently
+ prepared to receive.
+
+ - rtcp.reducedSize is set to true if the receiver is currently prepared to receive
+ reduced-size RTCP packets, and false otherwise. rtcp.cname is left undefined.
+
+ - transactionId and degradationPreference are left undefined.
+ */
+function validateReceiverRtpParameters(param) {
+ validateRtpParameters(param);
+
+ assert_equals(param.transactionId, undefined,
+ 'Expect receiver param.transactionId to be unset');
+
+ assert_not_equals(param.rtcp.reducedSize, undefined,
+ 'Expect receiver param.rtcp.reducedSize to be set');
+
+ assert_equals(param.rtcp.cname, undefined,
+ 'Expect receiver param.rtcp.cname to be unset');
+
+ assert_equals(param.degradationPreference, undefined,
+ 'Expect receiver param.degradationPreference to be unset');
+}
+
+/*
+ dictionary RTCRtpParameters {
+ DOMString transactionId;
+ sequence<RTCRtpEncodingParameters> encodings;
+ sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
+ RTCRtcpParameters rtcp;
+ sequence<RTCRtpCodecParameters> codecs;
+ RTCDegradationPreference degradationPreference;
+ };
+
+ enum RTCDegradationPreference {
+ "maintain-framerate",
+ "maintain-resolution",
+ "balanced"
+ };
+ */
+function validateRtpParameters(param) {
+ assert_optional_string_field(param, 'transactionId');
+
+ assert_array_field(param, 'encodings');
+ for(const encoding of param.encodings) {
+ validateEncodingParameters(encoding);
+ }
+
+ assert_array_field(param, 'headerExtensions');
+ for(const headerExt of param.headerExtensions) {
+ validateHeaderExtensionParameters(headerExt);
+ }
+
+ assert_dict_field(param, 'rtcp');
+ validateRtcpParameters(param.rtcp);
+
+ assert_array_field(param, 'codecs');
+ for(const codec of param.codecs) {
+ validateCodecParameters(codec);
+ }
+
+ assert_optional_enum_field(param, 'degradationPreference',
+ ['maintain-framerate', 'maintain-resolution', 'balanced']);
+}
+
+/*
+ dictionary RTCRtpEncodingParameters {
+ [readonly]
+ unsigned long ssrc;
+
+ [readonly]
+ RTCRtpRtxParameters rtx;
+
+ [readonly]
+ RTCRtpFecParameters fec;
+
+ RTCDtxStatus dtx;
+ boolean active;
+ RTCPriorityType priority;
+ unsigned long ptime;
+ unsigned long maxBitrate;
+ double maxFramerate;
+
+ [readonly]
+ DOMString rid;
+
+ double scaleResolutionDownBy;
+ };
+
+ dictionary RTCRtpRtxParameters {
+ [readonly]
+ unsigned long ssrc;
+ };
+
+ dictionary RTCRtpFecParameters {
+ [readonly]
+ unsigned long ssrc;
+ };
+
+ enum RTCDtxStatus {
+ "disabled",
+ "enabled"
+ };
+
+ enum RTCPriorityType {
+ "very-low",
+ "low",
+ "medium",
+ "high"
+ };
+ */
+function validateEncodingParameters(encoding) {
+ assert_optional_unsigned_int_field(encoding, 'ssrc');
+
+ assert_optional_dict_field(encoding, 'rtx');
+ if(encoding.rtx) {
+ assert_unsigned_int_field(encoding.rtx, 'ssrc');
+ }
+
+ assert_optional_dict_field(encoding, 'fec');
+ if(encoding.fec) {
+ assert_unsigned_int_field(encoding.fec, 'ssrc');
+ }
+
+ assert_optional_enum_field(encoding, 'dtx',
+ ['disabled', 'enabled']);
+
+ assert_optional_boolean_field(encoding, 'active');
+ assert_optional_enum_field(encoding, 'priority',
+ ['very-low', 'low', 'medium', 'high']);
+
+ assert_optional_unsigned_int_field(encoding, 'ptime');
+ assert_optional_unsigned_int_field(encoding, 'maxBitrate');
+ assert_optional_number_field(encoding, 'maxFramerate');
+
+ assert_optional_string_field(encoding, 'rid');
+ assert_optional_number_field(encoding, 'scaleResolutionDownBy');
+}
+
+/*
+ dictionary RTCRtcpParameters {
+ [readonly]
+ DOMString cname;
+
+ [readonly]
+ boolean reducedSize;
+ };
+ */
+function validateRtcpParameters(rtcp) {
+ assert_optional_string_field(rtcp, 'cname');
+ assert_optional_boolean_field(rtcp, 'reducedSize');
+}
+
+/*
+ dictionary RTCRtpHeaderExtensionParameters {
+ [readonly]
+ DOMString uri;
+
+ [readonly]
+ unsigned short id;
+
+ [readonly]
+ boolean encrypted;
+ };
+ */
+function validateHeaderExtensionParameters(headerExt) {
+ assert_optional_string_field(headerExt, 'uri');
+ assert_optional_unsigned_int_field(headerExt, 'id');
+ assert_optional_boolean_field(headerExt, 'encrypted');
+}
+
+/*
+ dictionary RTCRtpCodecParameters {
+ [readonly]
+ unsigned short payloadType;
+
+ [readonly]
+ DOMString mimeType;
+
+ [readonly]
+ unsigned long clockRate;
+
+ [readonly]
+ unsigned short channels;
+
+ [readonly]
+ DOMString sdpFmtpLine;
+ };
+ */
+function validateCodecParameters(codec) {
+ assert_optional_unsigned_int_field(codec, 'payloadType');
+ assert_optional_string_field(codec, 'mimeType');
+ assert_optional_unsigned_int_field(codec, 'clockRate');
+ assert_optional_unsigned_int_field(codec, 'channels');
+ assert_optional_string_field(codec, 'sdpFmtpLine');
+}
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-rtcp.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-rtcp.html
new file mode 100644
index 00000000000..94d5afdb180
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-rtcp.html
@@ -0,0 +1,105 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpParameters rtcp</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCRtpParameters-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCRtpParameters-helper.js:
+ // validateSenderRtpParameters
+
+ /*
+ 5.2. RTCRtpSender Interface
+ interface RTCRtpSender {
+ Promise<void> setParameters(optional RTCRtpParameters parameters);
+ RTCRtpParameters getParameters();
+ };
+
+ dictionary RTCRtpParameters {
+ DOMString transactionId;
+ sequence<RTCRtpEncodingParameters> encodings;
+ sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
+ RTCRtcpParameters rtcp;
+ sequence<RTCRtpCodecParameters> codecs;
+ RTCDegradationPreference degradationPreference;
+ };
+
+ dictionary RTCRtcpParameters {
+ [readonly]
+ DOMString cname;
+
+ [readonly]
+ boolean reducedSize;
+ };
+
+ getParameters
+ - rtcp.cname is set to the CNAME of the associated RTCPeerConnection.
+
+ rtcp.reducedSize is set to true if reduced-size RTCP has been negotiated for
+ sending, and false otherwise.
+ */
+
+ /*
+ 5.2. setParameters
+ 7. If parameters.encodings.length is different from N, or if any parameter
+ in the parameters argument, marked as a Read-only parameter, has a value
+ that is different from the corresponding parameter value returned from
+ sender.getParameters(), abort these steps and return a promise rejected
+ with a newly created InvalidModificationError. Note that this also applies
+ to transactionId.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const { rtcp } = param;
+
+ if(rtcp === undefined) {
+ param.rtcp = { cname: 'foo' };
+
+ } else if(rtcp.cname === undefined) {
+ rtcp.cname = 'foo';
+
+ } else {
+ rtcp.cname = `${rtcp.cname}-modified`;
+ }
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `setParameters() with modified rtcp.cname should reject with InvalidModificationError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const { rtcp } = param;
+
+ if(rtcp === undefined) {
+ param.rtcp = { reducedSize: true };
+
+ } else if(rtcp.reducedSize === undefined) {
+ rtcp.reducedSize = true;
+
+ } else {
+ rtcp.reducedSize = !rtcp.reducedSize;
+ }
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `setParameters() with modified rtcp.reducedSize should reject with InvalidModificationError`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-transactionId.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-transactionId.html
new file mode 100644
index 00000000000..184cdb5a715
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpParameters-transactionId.html
@@ -0,0 +1,146 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpParameters transactionId</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCRtpParameters-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCRtpParameters-helper.js:
+ // validateSenderRtpParameters
+
+ /*
+ 5.1. RTCPeerConnection Interface Extensions
+ partial interface RTCPeerConnection {
+ RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
+ optional RTCRtpTransceiverInit init);
+ ...
+ };
+
+ dictionary RTCRtpTransceiverInit {
+ RTCRtpTransceiverDirection direction = "sendrecv";
+ sequence<MediaStream> streams;
+ sequence<RTCRtpEncodingParameters> sendEncodings;
+ };
+
+ addTransceiver
+ 2. If the dictionary argument is present, and it has a sendEncodings member,
+ let sendEncodings be that list of RTCRtpEncodingParameters objects, or an
+ empty list otherwise.
+ 7. Create an RTCRtpSender with track, streams and sendEncodings and let
+ sender be the result.
+
+ 5.2. RTCRtpSender Interface
+ interface RTCRtpSender {
+ Promise<void> setParameters(optional RTCRtpParameters parameters);
+ RTCRtpParameters getParameters();
+ };
+
+ dictionary RTCRtpParameters {
+ DOMString transactionId;
+ sequence<RTCRtpEncodingParameters> encodings;
+ sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
+ RTCRtcpParameters rtcp;
+ sequence<RTCRtpCodecParameters> codecs;
+ RTCDegradationPreference degradationPreference;
+ };
+
+ getParameters
+ - transactionId is set to a new unique identifier, used to match this
+ getParameters call to a setParameters call that may occur later.
+ */
+
+ /*
+ 5.2. getParameters
+ - transactionId is set to a new unique identifier, used to match this
+ getParameters call to a setParameters call that may occur later.
+ */
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param1 = sender.getParameters();
+ const param2 = sender.getParameters();
+
+ validateSenderRtpParameters(param1);
+ validateSenderRtpParameters(param2);
+
+ assert_not_equals(param1.transactionId, param2.transactionId);
+
+ }, `sender.getParameters() should return different transaction IDs for each call`);
+
+ /*
+ 5.2. setParameters
+ 7. If parameters.encodings.length is different from N, or if any parameter
+ in the parameters argument, marked as a Read-only parameter, has a value
+ that is different from the corresponding parameter value returned from
+ sender.getParameters(), abort these steps and return a promise rejected
+ with a newly created InvalidModificationError. Note that this also applies
+ to transactionId.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ const { transactionId } = param;
+ param.transactionId = `${transactionId}-modified`;
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `sender.setParameters() with transaction ID different from last getParameters() should reject with InvalidModificationError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ param.transactionId = undefined;
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param));
+
+ }, `sender.setParameters() with transaction ID unset should reject with InvalidModificationError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param = sender.getParameters();
+ validateSenderRtpParameters(param);
+
+ return sender.setParameters(param)
+ .then(() =>
+ promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param)));
+
+ }, `setParameters() twice with the same parameters should reject with InvalidModificationError`);
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ const param1 = sender.getParameters();
+ const param2 = sender.getParameters();
+
+ validateSenderRtpParameters(param1);
+ validateSenderRtpParameters(param2);
+
+ assert_not_equals(param1.transactionId, param2.transactionId);
+
+ return promise_rejects(t, 'InvalidModificationError',
+ sender.setParameters(param1));
+
+ }, `setParameters() with parameters older than last getParameters() should reject with InvalidModificationError`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getCapabilities.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getCapabilities.html
new file mode 100644
index 00000000000..fda71690c2e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getCapabilities.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpReceiver.getCapabilities</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCRtpCapabilities-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCRtpCapabilities-helper.js:
+ // validateRtpCapabilities
+
+ /*
+ 5.3. RTCRtpReceiver Interface
+ interface RTCRtpReceiver {
+ ...
+ static RTCRtpCapabilities getCapabilities(DOMString kind);
+ };
+ */
+ test(() => {
+ const capabilities = RTCRtpReceiver.getCapabilities('audio');
+ validateRtpCapabilities(capabilities);
+ }, `RTCRtpSender.getCapabilities('audio') should return RTCRtpCapabilities dictionary`);
+
+ test(() => {
+ const capabilities = RTCRtpReceiver.getCapabilities('video');
+ validateRtpCapabilities(capabilities);
+ }, `RTCRtpSender.getCapabilities('video') should return RTCRtpCapabilities dictionary`);
+
+ </script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getContributingSources.https.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getContributingSources.https.html
new file mode 100644
index 00000000000..de1e143a6ad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getContributingSources.https.html
@@ -0,0 +1,86 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpReceiver.prototype.getContributingSources</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper function is called from RTCPeerConnection-helper.js
+ // getTrackFromUserMedia
+ // exchangeIceCandidates
+ // doSignalingHandshake
+
+ /*
+ 5.3. RTCRtpReceiver Interface
+ interface RTCRtpReceiver {
+ ...
+ sequence<RTCRtpContributingSource> getContributingSources();
+ };
+
+ interface RTCRtpContributingSource {
+ readonly attribute DOMHighResTimeStamp timestamp;
+ readonly attribute unsigned long source;
+ readonly attribute byte? audioLevel;
+ };
+
+ audioLevel
+ The audio level contained in the last RTP packet played from this source.
+ audioLevel will be the level value defined in [RFC6465] if the RFC 6465
+ header extension is present, and otherwise null. RFC 6465 defines the
+ level as a integral value from 0 to 127 representing the audio level in
+ negative decibels relative to the loudest signal that the system could
+ possibly encode. Thus, 0 represents the loudest signal the system could
+ possibly encode, and 127 represents silence.
+ */
+
+ promise_test(() => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ const ontrackPromise = new Promise(resolve => {
+ pc2.addEventListener('track', trackEvent => {
+ const { receiver } = trackEvent;
+ assert_true(receiver instanceof RTCRtpReceiver,
+ 'Expect trackEvent.receiver to be instance of RTCRtpReceiver');
+
+ resolve(receiver);
+ });
+ });
+
+ return getTrackFromUserMedia('audio')
+ .then(([track, mediaStream]) => {
+ pc1.addTrack(track, mediaStream);
+ exchangeIceCandidates(pc1, pc2);
+ return doSignalingHandshake(pc1, pc2);
+ })
+ .then(() => ontrackPromise)
+ .then(receiver => {
+ const contributingSources = receiver.getContributingSources();
+ assert_greater_than(contributingSources.length, 0,
+ 'Expect CSRCs to be available after RTP connection is established');
+
+ for(const csrc of contributingSources) {
+ assert_true(csrc instanceof RTCRtpContributingSource,
+ 'Expect contributingSources elements to be instance of RTCRtpContributingSource');
+
+ assert_equals(typeof csrc.timestamp, 'number',
+ 'Expect csrc.timestamp attribute to be DOMHighResTimeStamp');
+
+ assert_true(Number.isInteger(csrc.source) && csrc.source > 0,
+ 'Expect CSRC identifier to be unsigned long');
+
+ if(csrc.audioLevel !== null) {
+ assert_true(Number.isInteger(csrc.audioLevel) &&
+ csrc.audioLevel >= 0 && csrc.audioLevel <= 127,
+ 'Expect csrc.audioLevel to be either null or byte value from 0-127.');
+ }
+ }
+ });
+ }, `getContributingSources() should return list of CSRC after connection is established`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getParameters.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getParameters.html
new file mode 100644
index 00000000000..8b6d648bf61
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getParameters.html
@@ -0,0 +1,47 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpReceiver.prototype.getParameters</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCRtpParameters-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCRtpParameters-helper.js:
+ // validateReceiverRtpParameters
+
+ /*
+ Validates the RTCRtpParameters returned from RTCRtpReceiver.prototype.getParameters
+
+ 5.3. RTCRtpReceiver Interface
+ getParameters
+ When getParameters is called, the RTCRtpParameters dictionary is constructed
+ as follows:
+
+ - encodings is populated based on SSRCs and RIDs present in the current remote
+ description, including SSRCs used for RTX and FEC, if signaled. Every member
+ of the RTCRtpEncodingParameters dictionaries other than the SSRC and RID fields
+ is left undefined.
+
+ - The headerExtensions sequence is populated based on the header extensions that
+ the receiver is currently prepared to receive.
+
+ - The codecs sequence is populated based on the codecs that the receiver is currently
+ prepared to receive.
+
+ - rtcp.reducedSize is set to true if the receiver is currently prepared to receive
+ reduced-size RTCP packets, and false otherwise. rtcp.cname is left undefined.
+
+ - transactionId and degradationPreference are left undefined.
+ */
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const { receiver } = pc.addTransceiver('audio');
+ const param = pc.getParameters();
+ validateReceiverRtpParameters(param);
+ });
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getStats.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getStats.html
new file mode 100644
index 00000000000..c30c9613c69
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getStats.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpReceiver.prototype.getStats</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCStats-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+ // https://w3c.github.io/webrtc-stats/archives/20170614/webrtc-stats.html
+
+ // The following helper function is called from RTCStats-helper.js
+ // validateStatsReport
+ // assert_stats_report_has_stats
+
+ /*
+ 5.3. RTCRtpReceiver Interface
+ interface RTCRtpReceiver {
+ Promise<RTCStatsReport> getStats();
+ ...
+ };
+
+ getStats
+ 1. Let selector be the RTCRtpReceiver object on which the method was invoked.
+ 2. Let p be a new promise, and run the following steps in parallel:
+ 1. Gather the stats indicated by selector according to the stats selection
+ algorithm.
+ 2. Resolve p with the resulting RTCStatsReport object, containing the
+ gathered stats.
+ 3. Return p.
+
+ 8.5. The stats selection algorithm
+ 4. If selector is an RTCRtpReceiver, gather stats for and add the following objects
+ to result:
+ - All RTCInboundRTPStreamStats objects corresponding to selector.
+ - All stats objects referenced directly or indirectly by the RTCInboundRTPStreamStats
+ added.
+ */
+
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ const { receiver } = pc.addTransceiver('audio');
+
+ return receiver.getStats()
+ .then(statsReport => {
+ validateStatsReport(statsReport);
+ assert_stats_report_has_stats(statsReport, ['inbound-rtp']);
+ });
+ }, 'receiver.getStats() should return stats report containing inbound-rtp stats');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html
new file mode 100644
index 00000000000..3494a911c87
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html
@@ -0,0 +1,76 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpReceiver.prototype.getSynchronizationSources</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ /*
+ 5.3. RTCRtpReceiver Interface
+ interface RTCRtpReceiver {
+ ...
+ sequence<RTCRtpSynchronizationSource> getSynchronizationSources();
+ };
+
+ interface RTCRtpSynchronizationSource {
+ readonly attribute DOMHighResTimeStamp timestamp;
+ readonly attribute unsigned long source;
+ readonly attribute byte audioLevel;
+ readonly attribute boolean? voiceActivityFlag;
+ };
+ */
+
+ promise_test(() => {
+ const pc1 = new RTCPeerConnection();
+ const pc2 = new RTCPeerConnection();
+
+ const ontrackPromise = new Promise(resolve => {
+ pc2.addEventListener('track', trackEvent => {
+ const { receiver } = trackEvent;
+ assert_true(receiver instanceof RTCRtpReceiver,
+ 'Expect trackEvent.receiver to be instance of RTCRtpReceiver');
+
+ resolve(receiver);
+ });
+ });
+
+ return getTrackFromUserMedia('audio')
+ .then(([track, mediaStream]) => {
+ pc1.addTrack(track, mediaStream);
+ exchangeIceCandidates(pc1, pc2);
+ return doSignalingHandshake(pc1, pc2);
+ })
+ .then(() => ontrackPromise)
+ .then(receiver => {
+ const syncSources = receiver.getSynchronizationSources();
+ assert_greater_than(syncSources.length, 0,
+ 'Expect SSRCs to be available after RTP connection is established');
+
+ for(const ssrc of syncSources) {
+ assert_true(ssrc instanceof RTCRtpSynchronizationSource,
+ 'Expect synchronizationSources elements to be instance of RTCSynchronizationSource');
+
+ assert_equals(typeof ssrc.timestamp, 'number',
+ 'Expect ssrc.timestamp attribute to be DOMHighResTimeStamp');
+
+ assert_true(Number.isInteger(ssrc.source) && ssrc.source > 0,
+ 'Expect SSRC identifier to be unsigned long');
+
+ assert_true(Number.isInteger(ssrc.audioLevel) &&
+ ssrc.audioLevel >= 0 && ssrc.audioLevel <= 127,
+ 'Expect ssrc.audioLevel to be byte value from 0-127.');
+
+ if(ssrc.voiceActivityFlag !== null) {
+ assert_equals(typeof ssrc.voiceActivityFlag, 'boolean',
+ 'Expect ssrc.voiceActivity to be either null or boolean');
+ }
+ }
+ });
+ }, `getContributingSources() should return list of CSRC after connection is established`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-getCapabilities.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-getCapabilities.html
new file mode 100644
index 00000000000..d4544ffeccd
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-getCapabilities.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpSender.getCapabilities</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCRtpCapabilities-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ // The following helper functions are called from RTCRtpCapabilities-helper.js:
+ // validateRtpCapabilities
+
+ /*
+ 5.2. RTCRtpSender Interface
+ interface RTCRtpSender {
+ ...
+ static RTCRtpCapabilities getCapabilities(DOMString kind);
+ };
+
+ getCapabilities
+ The getCapabilities() method returns the most optimist view on the capabilities
+ of the system for sending media of the given kind. It does not reserve any
+ resources, ports, or other state but is meant to provide a way to discover
+ the types of capabilities of the browser including which codecs may be supported.
+ */
+ test(() => {
+ const capabilities = RTCRtpSender.getCapabilities('audio');
+ validateRtpCapabilities(capabilities);
+ }, `RTCRtpSender.getCapabilities('audio') should return RTCRtpCapabilities dictionary`);
+
+ test(() => {
+ const capabilities = RTCRtpSender.getCapabilities('video');
+ validateRtpCapabilities(capabilities);
+ }, `RTCRtpSender.getCapabilities('video') should return RTCRtpCapabilities dictionary`);
+
+ </script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-getStats.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-getStats.html
new file mode 100644
index 00000000000..00aa680f53e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-getStats.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpSender.prototype.getStats</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="dictionary-helper.js"></script>
+<script src="RTCStats-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+ // https://w3c.github.io/webrtc-stats/archives/20170614/webrtc-stats.html
+
+ // The following helper function is called from RTCStats-helper.js
+ // validateStatsReport
+ // assert_stats_report_has_stats
+
+ /*
+ 5.2. RTCRtpSender Interface
+ interface RTCRtpSender {
+ Promise<RTCStatsReport> getStats();
+ ...
+ };
+
+ getStats
+ 1. Let selector be the RTCRtpSender object on which the method was invoked.
+ 2. Let p be a new promise, and run the following steps in parallel:
+ 1. Gather the stats indicated by selector according to the stats selection
+ algorithm.
+ 2. Resolve p with the resulting RTCStatsReport object, containing the
+ gathered stats.
+ 3. Return p.
+
+ 8.5. The stats selection algorithm
+ 3. If selector is an RTCRtpSender, gather stats for and add the following objects
+ to result:
+ - All RTCOutboundRTPStreamStats objects corresponding to selector.
+ - All stats objects referenced directly or indirectly by the RTCOutboundRTPStreamStats
+ objects added.
+ */
+
+ promise_test(() => {
+ const pc = new RTCPeerConnection();
+ const { sender } = pc.addTransceiver('audio');
+
+ return sender.getStats()
+ .then(statsReport => {
+ validateStatsReport(statsReport);
+ assert_stats_report_has_stats(statsReport, ['outbound-rtp']);
+ });
+ }, 'sender.getStats() should return stats report containing outbound-rtp stats');
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-replaceTrack.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-replaceTrack.html
index 0ec3a812c2e..587ca572e4e 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-replaceTrack.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-replaceTrack.html
@@ -220,29 +220,6 @@
}, 'Calling replaceTrack on sender with similar track and and set to session description should resolve with sender.track set to new track');
/*
- 5.2. replaceTrack
- Not 8. If transceiver is not yet associated with a media description
- [JSEP] (section 3.4.1.), then set sender's track attribute to
- withTrack, and return a promise resolved with undefined.
- 10. Run the following steps in parallel:
- 3. Queue a task that runs the following steps:
- 1. If connection's [[isClosed]] slot is true, abort these steps.
- */
- test_never_resolve(t => {
- const pc = new RTCPeerConnection();
- const track = generateMediaStreamTrack('audio');
- const { transceiver: { sender } } = pc.addTransceiver('audio');
-
- return pc.createOffer()
- .then(offer => pc.setLocalDescription(offer))
- .then(() => {
- const promise = sender.replaceTrack(track);
- pc.close();
- return promise;
- });
- }, 'replaceTrack should never resolve if connection is closed in parallel');
-
- /*
TODO
5.2. replaceTrack
To avoid track identifiers changing on the remote receiving end when
@@ -266,5 +243,7 @@
negotiating. Otherwise, have the sender switch seamlessly to
transmitting withTrack instead of the sender's existing track,
without negotiating.
+ 3. Queue a task that runs the following steps:
+ 1. If connection's [[isClosed]] slot is true, abort these steps.
*/
</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-setParameters.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-setParameters.html
new file mode 100644
index 00000000000..d8fbe35e75a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpSender-setParameters.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpSender.prototype.setParameters</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ /*
+ 5.2. setParameters
+ 6. If transceiver.stopped is true, abort these steps and return a promise
+ rejected with a newly created InvalidStateError.
+ */
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const { sender } = transceiver;
+
+ const param = sender.getParameters();
+ transceiver.stop();
+
+ return promise_rejects(t, 'InvalidStateError',
+ sender.setParameters(param));
+
+ }, `setParameters() when transceiver is stopped should reject with InvalidStateError`);
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver-setCodecPreferences.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver-setCodecPreferences.html
new file mode 100644
index 00000000000..a1f7854e1a2
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver-setCodecPreferences.html
@@ -0,0 +1,136 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpTransceiver.prototype.setCodecPreferences</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ /*
+ 5.4. RTCRtpTransceiver Interface
+ interface RTCRtpTransceiver {
+ ...
+ void setCodecPreferences(sequence<RTCRtpCodecCapability> codecs);
+ };
+
+ setCodecPreferences
+ - Setting codecs to an empty sequence resets codec preferences to any
+ default value.
+
+ - The codecs sequence passed into setCodecPreferences can only contain
+ codecs that are returned by RTCRtpSender.getCapabilities(kind) or
+ RTCRtpReceiver.getCapabilities(kind), where kind is the kind of the
+ RTCRtpTransceiver on which the method is called. Additionally, the
+ RTCRtpCodecParameters dictionary members cannot be modified. If
+ codecs does not fulfill these requirements, the user agent MUST throw
+ an InvalidAccessError.
+ */
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const capabilities = RTCRtpSender.getCapabilities('audio');
+ transceiver.setCodecPreferences(capabilities.codecs);
+
+ }, `setCodecPreferences() on audio transceiver with codecs returned from RTCRtpSender.getCapabilities('audio') should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('video');
+ const capabilities = RTCRtpReceiver.getCapabilities('video');
+ transceiver.setCodecPreferences(capabilities.codecs);
+
+ }, `setCodecPreferences() on video transceiver with codecs returned from RTCRtpReceiver.getCapabilities('video') should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const capabilities1 = RTCRtpSender.getCapabilities('audio');
+ const capabilities2 = RTCRtpReceiver.getCapabilities('audio');
+ transceiver.setCodecPreferences([...capabilities1.codecs, ... capabilities2.codecs]);
+
+ }, `setCodecPreferences() with both sender receiver codecs combined should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ transceiver.setCodecPreferences([]);
+
+ }, `setCodecPreferences([]) should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const capabilities = RTCRtpSender.getCapabilities('audio');
+ const { codecs } = capabilities;
+
+ if(codecs.length >= 2) {
+ const tmp = codecs[0];
+ codecs[0] = codecs[1];
+ codecs[1] = tmp;
+ }
+
+ transceiver.setCodecPreferences(codecs);
+
+ }, `setCodecPreferences() with reordered codecs should succeed`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const capabilities = RTCRtpSender.getCapabilities('video');
+ assert_throws(() => transceiver.setCodecPreferences(capabilities.codecs));
+
+ }, `setCodecPreferences() on audio transceiver with codecs returned from getCapabilities('video') should throw InvalidAccessError`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const codecs = [{
+ mimeType: 'audio/piepiper',
+ clockRate: 2000,
+ channels: 2,
+ sdpFmtpLine: 'a=fmtp:98 0-15'
+ }];
+
+ assert_throws(() => transceiver.setCodecPreferences(codecs));
+
+ }, `setCodecPreferences() with user defined codec should throw InvalidAccessError`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const capabilities = RTCRtpSender.getCapabilities('audio');
+ const codecs = [
+ ...capabilities.codecs,
+ {
+ mimeType: 'audio/piepiper',
+ clockRate: 2000,
+ channels: 2,
+ sdpFmtpLine: 'a=fmtp:98 0-15'
+ }];
+
+ assert_throws(() => transceiver.setCodecPreferences(codecs));
+
+ }, `setCodecPreferences() with user defined codec together with codecs returned from getCapabilities() should throw InvalidAccessError`);
+
+ test(() => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const capabilities = RTCRtpSender.getCapabilities('audio');
+
+ const { codecs } = capabilities;
+ assert_greater_than(codecs.length, 0,
+ 'Expect at least one codec available');
+
+ const [ codec ] = codecs;
+ const { channels=2 } = codec;
+ codec.channels = channels+1;
+
+ assert_throws(() => transceiver.setCodecPreferences(codecs));
+
+ }, `setCodecPreferences() with modified codecs returned from getCapabilities() should throw InvalidAccessError`);
+
+ </script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver-setDirection.html b/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver-setDirection.html
new file mode 100644
index 00000000000..00cddce7d40
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCRtpTransceiver-setDirection.html
@@ -0,0 +1,94 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCRtpTransceiver.prototype.setDirection</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://rawgit.com/w3c/webrtc-pc/cc8d80f455b86c8041d63bceb8b457f45c72aa89/webrtc.html
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateAnswer
+
+ /*
+ 5.4. RTCRtpTransceiver Interface
+ interface RTCRtpTransceiver {
+ readonly attribute RTCRtpTransceiverDirection direction;
+ readonly attribute RTCRtpTransceiverDirection? currentDirection;
+ void setDirection(RTCRtpTransceiverDirection direction);
+ ...
+ };
+ */
+
+ /*
+ 5.4. setDirection
+ 4. Set transceiver's [[Direction]] slot to newDirection.
+ */
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ assert_equals(transceiver.direction, 'sendrecv');
+ assert_equals(transceiver.currentDirection, null);
+
+ transceiver.setDirection('recvonly');
+ assert_equals(transceiver.direction, 'recvonly');
+ assert_equals(transceiver.currentDirection, null,
+ 'Expect transceiver.currentDirection to not change');
+
+ }, 'setDirection should change transceiver.direction');
+
+ /*
+ 5.4. setDirection
+ 3. If newDirection is equal to transceiver's [[Direction]] slot, abort
+ these steps.
+ */
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio', { direction: 'sendonly' });
+ assert_equals(transceiver.direction, 'sendonly');
+ transceiver.setDirection('sendonly');
+ assert_equals(transceiver.direction, 'sendonly');
+
+ }, 'setDirection with same direction should have no effect');
+
+ promise_test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio', { direction: 'recvonly' });
+ assert_equals(transceiver.direction, 'recvonly');
+ assert_equals(transceiver.currentDirection, null);
+
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer => pc.setRemoteDescription(answer))
+ .then(() => {
+ assert_equals(transceiver.currentDirection, 'recvonly');
+ transceiver.setDirection('sendrecv');
+ assert_equals(transceiver.direction, 'sendrecv');
+ assert_equals(transceiver.currentDirection, 'recvonly');
+ });
+ }, 'setDirection should change transceiver.direction independent of transceiver.currentDirection');
+
+ /*
+ TODO
+ Calls to setDirection() do not take effect immediately. Instead, future calls
+ to createOffer and createAnswer mark the corresponding media description as
+ sendrecv, sendonly, recvonly or inactive as defined in [JSEP] (section 5.2.2.
+ and section 5.3.2.).
+
+ Tested in RTCPeerConnection-onnegotiationneeded.html
+ 5.4. setDirection
+ 6. Update the negotiation-needed flag for connection.
+
+ Coverage Report
+ Tested 6
+ Not Tested 1
+ Untestable 0
+ Total 7
+ */
+
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCSctpTransport-constructor.html b/tests/wpt/web-platform-tests/webrtc/RTCSctpTransport-constructor.html
index f840f1e9475..347aa0ef4bd 100644
--- a/tests/wpt/web-platform-tests/webrtc/RTCSctpTransport-constructor.html
+++ b/tests/wpt/web-platform-tests/webrtc/RTCSctpTransport-constructor.html
@@ -8,7 +8,7 @@
'use strict';
// Test is based on the following editor draft:
- // https://w3c.github.io/webrtc-pc/archives/20170515/webrtc.html
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer()
@@ -27,18 +27,16 @@
readonly attribute unsigned long maxMessageSize;
};
- 4.3.1. Operation
- When the RTCPeerConnection() constructor is invoked
- 8. Let connection have an [[sctpTransport]] internal slot,
- initialized to null.
+ 4.4.1.1. Constructor
+ 8. Let connection have an [[sctpTransport]] internal slot, initialized to null.
- To set an RTCSessionDescription description
- 6. If description is of type "answer" or "pranswer", then run the
- following steps:
- 1. If description initiates the establishment of a new SCTP
- association, as defined in [SCTP-SDP], Sections 10.3 and 10.4,
- set the value of connection's [[sctpTransport]] internal slot
- to a newly created RTCSctpTransport.
+ 4.3.1.6. Set the RTCSessionSessionDescription
+ 2.2.6. If description is of type "answer" or "pranswer", then run the
+ following steps:
+ 1. If description initiates the establishment of a new SCTP association,
+ as defined in [SCTP-SDP], Sections 10.3 and 10.4, set the value of
+ connection's [[SctpTransport]] internal slot to a newly created
+ RTCSctpTransport.
*/
promise_test(t => {
@@ -69,7 +67,7 @@
const pc = new RTCPeerConnection();
assert_equals(pc.sctp, null);
- return generateOffer({ data: true })
+ return generateOffer({ pc, data: true })
.then(offer => pc.setRemoteDescription(offer))
.then(() => pc.createAnswer())
.then(answer => pc.setLocalDescription(answer))
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCStats-helper.js b/tests/wpt/web-platform-tests/webrtc/RTCStats-helper.js
new file mode 100644
index 00000000000..1ff3ae6711b
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCStats-helper.js
@@ -0,0 +1,857 @@
+'use strict';
+
+// Test is based on the following editor draft:
+// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+// https://w3c.github.io/webrtc-stats/archives/20170614/webrtc-stats.html
+
+
+// This file depends on dictionary-helper.js which should
+// be loaded from the main HTML file.
+
+// To improve readability, the WebIDL definitions of the Stats
+// dictionaries are modified to annotate with required fields when
+// they are required by section 8.6 of webrtc-pc. ID fields are
+// also annotated with the stats type that they are linked to.
+
+/*
+ [webrtc-stats]
+ 6.1. RTCStatsType enum
+ enum RTCStatsType {
+ "codec",
+ "inbound-rtp",
+ "outbound-rtp",
+ "remote-inbound-rtp",
+ "remote-outbound-rtp",
+ "csrc",
+ "peer-connection",
+ "data-channel",
+ "stream",
+ "track",
+ "transport",
+ "candidate-pair",
+ "local-candidate",
+ "remote-candidate",
+ "certificate"
+ };
+ */
+const statsValidatorTable = {
+ 'codec': validateCodecStats,
+ 'inbound-rtp': validateInboundRtpStreamStats,
+ 'outbound-rtp': validateOutboundRtpStreamStats,
+ 'remote-inbound-rtp': validateRemoteInboundRtpStreamStats,
+ 'remote-outbound-rtp': validateRemoteOutboundRtpStreamStats,
+ 'csrc': validateContributingSourceStats,
+ 'peer-connection': validatePeerConnectionStats,
+ 'data-channel': validateDataChannelStats,
+ 'stream': validateMediaStreamStats,
+ 'track': validateMediaStreamTrackStats,
+ 'transport': validateTransportStats,
+ 'candidate-pair': validateIceCandidatePairStats,
+ 'local-candidate': validateIceCandidateStats,
+ 'remote-candidate': validateIceCandidateStats,
+ 'certificate': validateCertificateStats
+};
+
+// Validate that the stats objects in a stats report
+// follows the respective definitions.
+// Stats objects with unknown type are ignored and
+// only basic validation is done.
+function validateStatsReport(statsReport) {
+ for(const [id, stats] of statsReport.entries()) {
+ assert_equals(stats.id, id,
+ 'expect stats.id to be the same as the key in statsReport');
+
+ const validator = statsValidatorTable[stats.type];
+ if(validator) {
+ validator(statsReport, stats);
+ } else {
+ validateRtcStats(statsReport, stats);
+ }
+ }
+}
+
+// Assert that the stats report have stats objects of
+// given types
+function assert_stats_report_has_stats(statsReport, statsTypes) {
+ const hasTypes = new Set([...statsReport.values()]
+ .map(stats => stats.type));
+
+ for(const type of statsTypes) {
+ assert_true(hasTypes.has(type),
+ `Expect statsReport to contain stats object of type ${type}`);
+ }
+}
+
+// Get stats object of type that is expected to be
+// found in the statsReport
+function getRequiredStats(statsReport, type) {
+ for(const stats of statsReport.values()) {
+ if(stats.type === type) {
+ return stats;
+ }
+ }
+
+ assert_unreached(`required stats of type ${type} is not found in stats report`);
+}
+
+// Get stats object by the stats ID.
+// This is used to retreive other stats objects
+// linked to a stats object
+function getStatsById(statsReport, statsId) {
+ assert_true(statsReport.has(statsId),
+ `Expect stats report to have stats object with id ${statsId}`);
+
+ return statsReport.get(statsId);
+}
+
+// Validate an ID field in a stats object by making sure
+// that the linked stats object is found in the stats report
+// and have the type field value same as expected type
+// It doesn't validate the other fields of the linked stats
+// as validateStatsReport already does all validations
+function validateIdField(statsReport, stats, field, type) {
+ assert_string_field(stats, field);
+ const linkedStats = getStatsById(statsReport, stats[field]);
+ assert_equals(linkedStats.type, type,
+ `Expect linked stats object to have type ${type}`);
+}
+
+function validateOptionalIdField(statsReport, stats, field, type) {
+ if(stats[field] !== undefined) {
+ validateIdField(statsReport, stats, field, type);
+ }
+}
+
+/*
+ [webrtc-pc]
+ 8.4. RTCStats Dictionary
+ dictionary RTCStats {
+ required DOMHighResTimeStamp timestamp;
+ required RTCStatsType type;
+ required DOMString id;
+ };
+ */
+function validateRtcStats(statsReport, stats) {
+ assert_number_field(stats, 'timeStamp');
+ assert_string_field(stats, 'type');
+ assert_string_field(stats, 'id');
+}
+
+/*
+ [webrtc-stats]
+ 7.1. RTCRTPStreamStats dictionary
+ dictionary RTCRTPStreamStats : RTCStats {
+ required unsigned long ssrc;
+ required DOMString mediaType;
+
+ [RTCMediaStreamTrackStats]
+ required DOMString trackId;
+
+ [RTCTransportStats]
+ required DOMString transportId;
+
+ [RTCCodecStats]
+ required DOMString codecId;
+
+ unsigned long firCount;
+ unsigned long pliCount;
+ required unsigned long nackCount;
+ unsigned long sliCount;
+ unsigned long long qpSum;
+ };
+
+ [webrtc-pc]
+ 8.6. Mandatory To Implement Stats
+ - RTCRTPStreamStats, with attributes ssrc, associateStatsId, isRemote, mediaType,
+ mediaTrackId, transportId, codecId, nackCount
+ */
+function validateRtpStreamStats(statsReport, stats) {
+ validateRtcStats(statsReport, stats);
+
+ assert_unsigned_int_field(stats, 'ssrc');
+ assert_string_field(stats, 'mediaType');
+
+ validateIdField(statsReport, stats, 'trackId', 'track');
+ validateIdField(statsReport, stats, 'transportId', 'transport');
+ validateIdField(statsReport, stats, 'codecId', 'codec');
+
+ assert_optional_unsigned_int_field(stats, 'firCount');
+ assert_optional_unsigned_int_field(stats, 'pliCount');
+ assert_unsigned_int_field(stats, 'nackCount');
+ assert_optional_unsigned_int_field(stats, 'sliCount');
+ assert_optional_unsigned_int_field(stats, 'qpSum');
+}
+
+/*
+ [webrtc-stats]
+ 7.2. RTCCodecStats dictionary
+ dictionary RTCCodecStats : RTCStats {
+ required unsigned long payloadType;
+ required RTCCodecType codecType;
+
+ [RTCTransportStats]
+ DOMString transportId;
+
+ DOMString mimeType;
+ required unsigned long clockRate;
+ required unsigned long channels;
+ DOMString sdpFmtpLine;
+ DOMString implementation;
+ };
+
+ enum RTCCodecType {
+ "encode",
+ "decode",
+ };
+
+ [webrtc-pc]
+ 8.6. Mandatory To Implement Stats
+ - RTCCodecStats, with attributes payloadType, codec, clockRate, channels, parameters
+ */
+
+function validateCodecStats(statsReport, stats) {
+ validateRtcStats(statsReport, stats);
+
+ assert_unsigned_int_field(stats, 'payloadType');
+ assert_enum_field(stats, 'codecType', ['encode', 'decode']);
+
+ validateOptionalIdField(statsReport, stats, 'transportId', 'transport');
+
+ assert_optional_string_field(stats, 'mimeType');
+ assert_unsigned_int_field(stats, 'clockRate');
+ assert_unsigned_int_field(stats, 'channels');
+
+ assert_optional_string_field(stats, 'sdpFmtpLine');
+ assert_optional_string_field(stats, 'implementation');
+}
+
+/*
+ [webrtc-stats]
+ 7.3. RTCReceivedRTPStreamStats dictionary
+ dictionary RTCReceivedRTPStreamStats : RTCRTPStreamStats {
+ unsigned long packetsReceived;
+ unsigned long long bytesReceived;
+ unsigned long packetsLost;
+ double jitter;
+ double fractionLost;
+ unsigned long packetsDiscarded;
+ unsigned long packetsRepaired;
+ unsigned long burstPacketsLost;
+ unsigned long burstPacketsDiscarded;
+ unsigned long burstLossCount;
+ unsigned long burstDiscardCount;
+ double burstLossRate;
+ double burstDiscardRate;
+ double gapLossRate;
+ double gapDiscardRate;
+ };
+ */
+function validateReceivedRtpStreamStats(statsReport, stats) {
+ validateRtpStreamStats(statsReport, stats);
+
+ assert_optional_unsigned_int_field(stats, 'packetsReceived');
+ assert_optional_unsigned_int_field(stats, 'bytesReceived');
+ assert_optional_unsigned_int_field(stats, 'packetsLost');
+
+ assert_optional_number_field(stats, 'jitter');
+ assert_optional_number_field(stats, 'fractionLost');
+
+ assert_optional_unsigned_int_field(stats, 'packetsDiscarded');
+ assert_optional_unsigned_int_field(stats, 'packetsRepaired');
+ assert_optional_unsigned_int_field(stats, 'burstPacketsLost');
+ assert_optional_unsigned_int_field(stats, 'burstPacketsDiscarded');
+ assert_optional_unsigned_int_field(stats, 'burstLossCount');
+ assert_optional_unsigned_int_field(stats, 'burstDiscardCount');
+
+ assert_optional_number_field(stats, 'burstLossRate');
+ assert_optional_number_field(stats, 'burstDiscardRate');
+ assert_optional_number_field(stats, 'gapLossRate');
+ assert_optional_number_field(stats, 'gapDiscardRate');
+}
+
+/*
+ [webrtc-stats]
+ 7.4. RTCInboundRTPStreamStats dictionary
+ dictionary RTCInboundRTPStreamStats : RTCReceivedRTPStreamStats {
+ required unsigned long packetsReceived;
+ required unsigned long long bytesReceived;
+ required unsigned long packetsLost;
+ required double jitter;
+ required unsigned long packetsDiscarded;
+
+ [RTCRemoteOutboundRTPStreamStats]
+ DOMString remoteId;
+
+ unsigned long framesDecoded;
+ DOMHighResTimeStamp lastPacketReceivedTimestamp;
+ };
+
+ [webrtc-pc]
+ 8.6. Mandatory To Implement Stats
+ - RTCInboundRTPStreamStats, with all required attributes from RTCRTPStreamStats,
+ and also attributes packetsReceived, bytesReceived, packetsLost, jitter,
+ packetsDiscarded
+ */
+function validateInboundRtpStreamStats(statsReport, stats) {
+ validateReceivedRtpStreamStats(statsReport, stats);
+
+ assert_unsigned_int_field(stats, 'packetsReceived');
+ assert_unsigned_int_field(stats, 'bytesReceived');
+ assert_unsigned_int_field(stats, 'packetsLost');
+ assert_number_field(stats, 'jitter');
+ assert_unsigned_int_field(stats, 'packetsDiscarded');
+
+ validateOptionalIdField(statsReport, stats, 'remoteId', 'remote-outbound-rtp');
+
+ assert_optional_unsigned_int_field(stats, 'framesDecoded');
+ assert_optional_number_field(stats, 'lastPacketReceivedTimeStamp');
+}
+
+/*
+ [webrtc-stats]
+ 7.5. RTCRemoteInboundRTPStreamStats dictionary
+ dictionary RTCRemoteInboundRTPStreamStats : RTCReceivedRTPStreamStats {
+ [RTCOutboundRTPStreamStats]
+ DOMString localId;
+
+ double roundTripTime;
+ };
+ */
+
+function validateRemoteInboundRtpStreamStats(statsReport, stats) {
+ validateReceivedRtpStreamStats(statsReport, stats);
+
+ validateOptionalIdField(statsReport, stats, 'localId', 'outbound-rtp');
+ assert_optional_number_field(stats, 'roundTripTime');
+}
+
+/*
+ [webrtc-stats]
+ 7.6. RTCSentRTPStreamStats dictionary
+ dictionary RTCSentRTPStreamStats : RTCRTPStreamStats {
+ unsigned long packetsSent;
+ unsigned long packetsDiscardedOnSend;
+ unsigned long long bytesSent;
+ unsigned long long bytesDiscardedOnSend;
+ };
+ */
+function validateSentRtpStreamStats(statsReport, stats) {
+ validateRtpStreamStats(statsReport, stats);
+
+ assert_optional_unsigned_int_field(stats, 'packetsSent');
+ assert_optional_unsigned_int_field(stats, 'packetsDiscardedOnSend');
+ assert_optional_unsigned_int_field(stats, 'bytesSent');
+ assert_optional_unsigned_int_field(stats, 'bytesDiscardedOnSend');
+}
+
+/*
+ [webrtc-stats]
+ 7.7. RTCOutboundRTPStreamStats dictionary
+ dictionary RTCOutboundRTPStreamStats : RTCSentRTPStreamStats {
+ required unsigned long packetsSent;
+ required unsigned long long bytesSent;
+
+ [RTCRemoteInboundRTPStreamStats]
+ DOMString remoteId;
+
+ DOMHighResTimeStamp lastPacketSentTimestamp;
+ double targetBitrate;
+ unsigned long framesEncoded;
+ double totalEncodeTime;
+ double averageRTCPInterval;
+ };
+
+ [webrtc-pc]
+ 8.6. Mandatory To Implement Stats
+ - RTCOutboundRTPStreamStats, with all required attributes from RTCRTPStreamStats,
+ and also attributes packetsSent, bytesSent, roundTripTime
+ */
+function validateOutboundRtpStreamStats(statsReport, stats) {
+ validateOptionalIdField(statsReport, stats, 'remoteId', 'remote-inbound-rtp');
+
+ assert_unsigned_int_field(stats, 'packetsSent');
+ assert_unsigned_int_field(stats, 'bytesSent');
+
+ assert_optional_number_field(stats, 'lastPacketSentTimestamp');
+ assert_optional_number_field(stats, 'targetBitrate');
+ assert_optional_unsigned_int_field(stats, 'framesEncoded');
+ assert_optional_number_field(stats, 'totalEncodeTime');
+ assert_optional_number_field(stats, 'averageRTCPInterval');
+}
+
+/*
+ [webrtc-stats]
+ 7.8. RTCRemoteOutboundRTPStreamStats dictionary
+ dictionary RTCRemoteOutboundRTPStreamStats : RTCSentRTPStreamStats {
+ [RTCInboundRTPStreamStats]
+ DOMString localId;
+
+ DOMHighResTimeStamp remoteTimestamp;
+ };
+ */
+function validateRemoteOutboundRtpStreamStats(statsReport, stats) {
+ validateSentRtpStreamStats(statsReport, stats);
+
+ validateOptionalIdField(statsReport, stats, 'localId', 'inbound-rtp');
+ assert_optional_number_field(stats, 'remoteTimeStamp');
+}
+
+/*
+ [webrtc-stats]
+ 7.9. RTCRTPContributingSourceStats
+ dictionary RTCRTPContributingSourceStats : RTCStats {
+ unsigned long contributorSsrc;
+
+ [RTCInboundRTPStreamStats]
+ DOMString inboundRtpStreamId;
+
+ unsigned long packetsContributedTo;
+ double audioLevel;
+ };
+ */
+function validateContributingSourceStats(statsReport, stats) {
+ validateRtcStats(statsReport, stats);
+
+ assert_optional_unsigned_int_field(stats, 'contributorSsrc');
+
+ validateOptionalIdField(statsReport, stats, 'inboundRtpStreamId', 'inbound-rtp');
+ assert_optional_unsigned_int_field(stats, 'packetsContributedTo');
+ assert_optional_number_field(stats, 'audioLevel');
+}
+
+/*
+ [webrtc-stats]
+ 7.10. RTCPeerConnectionStats dictionary
+ dictionary RTCPeerConnectionStats : RTCStats {
+ required unsigned long dataChannelsOpened;
+ required unsigned long dataChannelsClosed;
+ unsigned long dataChannelsRequested;
+ unsigned long dataChannelsAccepted;
+ };
+
+ [webrtc-pc]
+ 8.6. Mandatory To Implement Stats
+ - RTCPeerConnectionStats, with attributes dataChannelsOpened, dataChannelsClosed
+ */
+function validatePeerConnectionStats(statsReport, stats) {
+ validateRtcStats(statsReport, stats);
+
+ assert_unsigned_int_field(stats, 'dataChannelsOpened');
+ assert_unsigned_int_field(stats, 'dataChannelsClosed');
+ assert_optional_unsigned_int_field(stats, 'dataChannelsRequested');
+ assert_optional_unsigned_int_field(stats, 'dataChannelsAccepted');
+}
+
+/*
+ [webrtc-stats]
+ 7.11. RTCMediaStreamStats dictionary
+ dictionary RTCMediaStreamStats : RTCStats {
+ required DOMString streamIdentifier;
+
+ [RTCMediaStreamTrackStats]
+ required sequence<DOMString> trackIds;
+ };
+
+ [webrtc-pc]
+ 8.6. Mandatory To Implement Stats
+ - RTCMediaStreamStats, with attributes streamIdentifer, trackIds
+ */
+function validateMediaStreamStats(statsReport, stats) {
+ validateRtcStats(statsReport, stats);
+
+ assert_string_field(stats, 'streamIdentifier');
+ assert_array_field(stats, 'trackIds');
+
+ for(const trackId of stats.trackIds) {
+ assert_equals(typeof trackId, 'string',
+ 'Expect trackId elements to be string');
+
+ assert_true(statsReport.has(trackId),
+ `Expect stats report to have stats object with id ${trackId}`);
+
+ const trackStats = statsReport.get(trackId);
+ assert_equals(trackStats.type, 'track',
+ `Expect track stats object to have type 'track'`);
+ }
+}
+
+/*
+ [webrtc-stats]
+ 7.12. RTCMediaStreamTrackStats dictionary
+ dictionary RTCMediaStreamTrackStats : RTCStats {
+ required DOMString trackIdentifier;
+ required boolean remoteSource;
+ required boolean ended;
+ required boolean detached;
+ DOMString kind;
+ DOMHighResTimeStamp estimatedPlayoutTimestamp;
+ required unsigned long frameWidth;
+ required unsigned long frameHeight;
+ required double framesPerSecond;
+ unsigned long framesCaptured;
+ required unsigned long framesSent;
+ required unsigned long framesReceived;
+ required unsigned long framesDecoded;
+ required unsigned long framesDropped;
+ required unsigned long framesCorrupted;
+ unsigned long partialFramesLost;
+ unsigned long fullFramesLost;
+ required double audioLevel;
+ double totalAudioEnergy;
+ boolean voiceActivityFlag;
+ double echoReturnLoss;
+ double echoReturnLossEnhancement;
+ unsigned long long totalSamplesSent;
+ unsigned long long totalSamplesReceived;
+ double totalSamplesDuration;
+ unsigned long long concealedSamples;
+ unsigned long long concealmentEvents;
+ double jitterBufferDelay;
+ RTCPriorityType priority;
+ };
+
+ [webrtc-pc]
+ 4.9.1. RTCPriorityType Enum
+ enum RTCPriorityType {
+ "very-low",
+ "low",
+ "medium",
+ "high"
+ };
+
+ 8.6. Mandatory To Implement Stats
+ - RTCMediaStreamTrackStats, with attributes trackIdentifier, remoteSource, ended,
+ detached, ssrcIds, frameWidth, frameHeight, framesPerSecond, framesSent,
+ framesReceived, framesDecoded, framesDropped, framesCorrupted, audioLevel
+ */
+
+function validateMediaStreamTrackStats(stats, stat) {
+ validateRtcStats(statsReport, stats);
+
+ assert_string_field(stat, 'trackIdentifier');
+ assert_boolean_field(stat, 'remoteSource');
+ assert_boolean_field(stat, 'ended');
+ assert_boolean_field(stat, 'detached');
+
+ assert_optional_string_field(stat, 'kind');
+ assert_optional_number_field(stat, 'estimatedPlayoutTimestamp');
+
+ assert_unsigned_int_field(stat, 'frameWidth');
+ assert_unsigned_int_field(stat, 'frameHeight');
+ assert_number_field(stat, 'framesPerSecond');
+
+ assert_optional_unsigned_int_field(stat, 'framesCaptured');
+ assert_unsigned_int_field(stat, 'frameSent');
+ assert_unsigned_int_field(stat, 'frameReceived');
+ assert_unsigned_int_field(stat, 'frameDecoded');
+ assert_unsigned_int_field(stat, 'frameDropped');
+ assert_unsigned_int_field(stat, 'frameCorrupted');
+
+ assert_optional_unsigned_int_field(stat, 'partialFramesLost');
+ assert_optional_unsigned_int_field(stat, 'fullFramesLost');
+
+ assert_number_field(stat, 'audioLevel');
+ assert_optional_number_field(stat, 'totalAudioEnergy');
+ assert_optional_boolean_field(stat, 'voiceActivityFlag');
+ assert_optional_number_field(stat, 'echoReturnLoss');
+ assert_optional_number_field(stat, 'echoReturnLossEnhancement');
+
+ assert_optional_unsigned_int_field(stat, 'totalSamplesSent');
+ assert_optional_unsigned_int_field(stat, 'totalSamplesReceived');
+ assert_optional_number_field(stat, 'totalSamplesDuration');
+ assert_optional_unsigned_int_field(stat, 'concealedSamples');
+ assert_optional_unsigned_int_field(stat, 'concealmentEvents');
+ assert_optional_number_field(stat, 'jitterBufferDelay');
+
+ assert_optional_enum_field(stats, 'priority',
+ ['very-low', 'low', 'medium', 'high']);
+}
+
+/*
+ [webrtc-stats]
+ 7.13. RTCDataChannelStats dictionary
+ dictionary RTCDataChannelStats : RTCStats {
+ required DOMString label;
+ required DOMString protocol;
+ required long datachannelid;
+
+ [RTCTransportStats]
+ DOMString transportId;
+
+ required RTCDataChannelState state;
+ required unsigned long messagesSent;
+ required unsigned long long bytesSent;
+ required unsigned long messagesReceived;
+ required unsigned long long bytesReceived;
+ };
+
+ [webrtc-pc]
+ 6.2. RTCDataChannel
+ enum RTCDataChannelState {
+ "connecting",
+ "open",
+ "closing",
+ "closed"
+ };
+
+ 8.6. Mandatory To Implement Stats
+ - RTCDataChannelStats, with attributes label, protocol, datachannelId, state,
+ messagesSent, bytesSent, messagesReceived, bytesReceived
+ */
+
+function validateDataChannelStats(statsReport, stats) {
+ validateRtcStats(statsReport, stats);
+
+ assert_string_field(stats, 'label');
+ assert_string_field(stats, 'protocol');
+ assert_int_field(stats, 'datachannelid');
+
+ validateOptionalIdField(statsReport, stats, 'transportId', 'transport');
+
+ assert_enum_field(stats, 'state',
+ ['connecting', 'open', 'closing', 'closed']);
+
+ assert_unsigned_int_field(stats, 'messageSent');
+
+ assert_unsigned_int_field(stats, 'messageSent');
+ assert_unsigned_int_field(stats, 'bytesSent');
+ assert_unsigned_int_field(stats, 'messagesReceived');
+ assert_unsigned_int_field(stats, 'bytesReceived');
+}
+
+/*
+ [webrtc-stats]
+ 7.14. RTCTransportStats dictionary
+ dictionary RTCTransportStats : RTCStats {
+ unsigned long packetsSent;
+ unsigned long packetsReceived;
+ required unsigned long long bytesSent;
+ required unsigned long long bytesReceived;
+
+ [RTCTransportStats]
+ required DOMString rtcpTransportStatsId;
+
+ RTCIceRole iceRole;
+ RTCDtlsTransportState dtlsState;
+
+ [RTCIceCandidatePairStats]
+ required DOMString selectedCandidatePairId;
+
+ [RTCCertificateStats]
+ required DOMString localCertificateId;
+
+ [RTCCertificateStats]
+ required DOMString remoteCertificateId;
+ };
+
+ [webrtc-pc]
+ 5.5. RTCDtlsTransportState Enum
+ enum RTCDtlsTransportState {
+ "new",
+ "connecting",
+ "connected",
+ "closed",
+ "failed"
+ };
+
+ 5.6. RTCIceRole Enum
+ enum RTCIceRole {
+ "controlling",
+ "controlled"
+ };
+
+ 8.6. Mandatory To Implement Stats
+ - RTCTransportStats, with attributes bytesSent, bytesReceived, rtcpTransportStatsId,
+ activeConnection, selectedCandidatePairId, localCertificateId, remoteCertificateId
+ */
+
+function validateTransportStats(statsReport, stats) {
+ validateRtcStats(statsReport, stats);
+
+ assert_optional_unsigned_int_field(stats, 'packetsSent');
+ assert_optional_unsigned_int_field(stats, 'packetsReceived');
+ assert_unsigned_int_field(stats, 'bytesSent');
+ assert_unsigned_int_field(stats, 'bytesReceived');
+
+ validateIdField(statsReport, stats, 'rtcpTransportStatsId', 'transport');
+
+ assert_optional_enum_field(stats, 'iceRole',
+ ['controlling', 'controlled']);
+
+ assert_optional_enum_field(stats, 'dtlsState',
+ ['new', 'connecting', 'connected', 'closed', 'failed']);
+
+ validateIdField(statsReport, stats, 'selectedCandidatePairId', 'candidate-pair');
+ validateIdField(stateReport, stats, 'localCertificateId', 'certificate');
+ validateIdField(stateReport, stats, 'remoteCertificateId', 'certificate');
+}
+
+/*
+ [webrtc-stats]
+ 7.15. RTCIceCandidateStats dictionary
+ dictionary RTCIceCandidateStats : RTCStats {
+ [RTCTransportStats]
+ DOMString transportId;
+
+ boolean isRemote;
+ required DOMString ip;
+ required long port;
+ required DOMString protocol;
+ required RTCIceCandidateType candidateType;
+ required long priority;
+ required DOMString url;
+ DOMString relayProtocol;
+ boolean deleted = false;
+ };
+
+ [webrtc-pc]
+ 4.8.1.3. RTCIceCandidateType Enum
+ enum RTCIceCandidateType {
+ "host",
+ "srflx",
+ "prflx",
+ "relay"
+ };
+
+ 8.6. Mandatory To Implement Stats
+ - RTCIceCandidateStats, with attributes ip, port, protocol, candidateType, priority,
+ url
+ */
+
+function validateIceCandidateStats(statsReport, stats) {
+ validateRtcStats(statsReport, stats);
+
+ validateOptionalIdField(statsReport, stats, 'transportId', 'transport');
+ assert_optional_boolean_field(stats, 'isRemote');
+
+ assert_string_field(stats, 'ip');
+ assert_int_field(stats, 'port');
+ assert_string_field(stats, 'protocol');
+
+ assert_enum_field(stats, 'candidateType',
+ ['host', 'srflx', 'prflx', 'relay']);
+
+ assert_int_field(stats, 'priority');
+ assert_string_field(stats, 'url');
+ assert_optional_string_field(stats, 'relayProtocol');
+ assert_optional_boolean_field(stats, 'deleted');
+}
+
+/*
+ [webrtc-stats]
+ 7.16. RTCIceCandidatePairStats dictionary
+ dictionary RTCIceCandidatePairStats : RTCStats {
+ [RTCTransportStats]
+ required DOMString transportId;
+
+ [RTCIceCandidateStats]
+ required DOMString localCandidateId;
+
+ [RTCIceCandidateStats]
+ required DOMString remoteCandidateId;
+
+ required RTCStatsIceCandidatePairState state;
+ required unsigned long long priority;
+ required boolean nominated;
+ unsigned long packetsSent;
+ unsigned long packetsReceived;
+ required unsigned long long bytesSent;
+ required unsigned long long bytesReceived;
+ DOMHighResTimeStamp lastPacketSentTimestamp;
+ DOMHighResTimeStamp lastPacketReceivedTimestamp;
+ DOMHighResTimeStamp firstRequestTimestamp;
+ DOMHighResTimeStamp lastRequestTimestamp;
+ DOMHighResTimeStamp lastResponseTimestamp;
+ required double totalRoundTripTime;
+ required double currentRoundTripTime;
+ double availableOutgoingBitrate;
+ double availableIncomingBitrate;
+ unsigned long circuitBreakerTriggerCount;
+ unsigned long long requestsReceived;
+ unsigned long long requestsSent;
+ unsigned long long responsesReceived;
+ unsigned long long responsesSent;
+ unsigned long long retransmissionsReceived;
+ unsigned long long retransmissionsSent;
+ unsigned long long consentRequestsSent;
+ DOMHighResTimeStamp consentExpiredTimestamp;
+ };
+
+ enum RTCStatsIceCandidatePairState {
+ "frozen",
+ "waiting",
+ "in-progress",
+ "failed",
+ "succeeded"
+ };
+
+ [webrtc-pc]
+ 8.6. Mandatory To Implement Stats
+ - RTCIceCandidatePairStats, with attributes transportId, localCandidateId,
+ remoteCandidateId, state, priority, nominated, writable, readable, bytesSent,
+ bytesReceived, totalRtt, currentRtt
+ */
+function validateIceCandidatePairStats(statsReport, stats) {
+ validateRtcStats(statsReport, stats);
+
+ validateIdField(statsReport, stats, 'transportId', 'transport');
+ validateIdField(statsReport, stats, 'localCandidateId', 'local-candidate');
+ validateIdField(statsReport, stats, 'remoteCandidateId', 'remote-candidate');
+
+ assert_enum_field(stats, 'state',
+ ['frozen', 'waiting', 'in-progress', 'failed', 'succeeded']);
+
+ assert_unsigned_int_field(stats, 'priority');
+ assert_boolean_field(stats, 'nominated');
+ assert_optional_unsigned_int_field(stats, 'packetsSent');
+ assert_optional_unsigned_int_field(stats, 'packetsReceived');
+ assert_unsigned_int_field(stats, 'bytesSent');
+ assert_unsigned_int_field(stats, 'byteReceived');
+
+ assert_optional_number_field(stats, 'lastPacketSentTimestamp');
+ assert_optional_number_field(stats, 'lastPacketReceivedTimestamp');
+ assert_optional_number_field(stats, 'firstRequestTimestamp');
+ assert_optional_number_field(stats, 'lastRequestTimestamp');
+ assert_optional_number_field(stats, 'lastResponseTimestamp');
+
+ assert_number_field(stats, 'totalRoundTripTime');
+ assert_number_field(stats, 'currentRoundTripTime');
+
+ assert_optional_number_field(stats, 'availableOutgoingBitrate');
+ assert_optional_number_field(stats, 'availableIncomingBitrate');
+
+ assert_optional_unsigned_int_field(stats, 'circuitBreakerTriggerCount');
+ assert_optional_unsigned_int_field(stats, 'requestsReceived');
+ assert_optional_unsigned_int_field(stats, 'requestsSent');
+ assert_optional_unsigned_int_field(stats, 'responsesReceived');
+ assert_optional_unsigned_int_field(stats, 'responsesSent');
+ assert_optional_unsigned_int_field(stats, 'retransmissionsReceived');
+ assert_optional_unsigned_int_field(stats, 'retransmissionsSent');
+ assert_optional_unsigned_int_field(stats, 'consentRequestsSent');
+ assert_optional_number_field(stats, 'consentExpiredTimestamp');
+}
+
+/*
+ [webrtc-stats]
+ 7.17. RTCCertificateStats dictionary
+ dictionary RTCCertificateStats : RTCStats {
+ required DOMString fingerprint;
+ required DOMString fingerprintAlgorithm;
+ required DOMString base64Certificate;
+ required DOMString issuerCertificateId;
+ };
+
+ [webrtc-pc]
+ 8.6. Mandatory To Implement Stats
+ - RTCCertificateStats, with attributes fingerprint, fingerprintAlgorithm,
+ base64Certificate, issuerCertificateId
+ */
+
+function validateCertificateStats(statsReport, stats) {
+ validateRtcStats(statsReport, stats);
+
+ assert_string_field(stats, 'fingerprint');
+ assert_string_field(stats, 'fingerprintAlgorithm');
+ assert_string_field(stats, 'base64Certificate');
+ assert_string_field(stats, 'issuerCertificateId');
+}
diff --git a/tests/wpt/web-platform-tests/webrtc/RTCTrackEvent-constructor.html b/tests/wpt/web-platform-tests/webrtc/RTCTrackEvent-constructor.html
new file mode 100644
index 00000000000..d5c5f621f80
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/RTCTrackEvent-constructor.html
@@ -0,0 +1,158 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCTrackEvent constructor</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+ 'use strict';
+
+ // Test is based on the following editor draft:
+ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+ /*
+ 5.7. RTCTrackEvent
+ [Constructor(DOMString type, RTCTrackEventInit eventInitDict)]
+ interface RTCTrackEvent : Event {
+ readonly attribute RTCRtpReceiver receiver;
+ readonly attribute MediaStreamTrack track;
+ [SameObject]
+ readonly attribute FrozenArray<MediaStream> streams;
+ readonly attribute RTCRtpTransceiver transceiver;
+ };
+
+ dictionary RTCTrackEventInit : EventInit {
+ required RTCRtpReceiver receiver;
+ required MediaStreamTrack track;
+ sequence<MediaStream> streams = [];
+ required RTCRtpTransceiver transceiver;
+ };
+ */
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const { receiver } = transceiver;
+ const { track } = receiver;
+
+ const trackEvent = new RTCTrackEvent('track', {
+ receiver, track, transceiver
+ });
+
+ assert_equals(trackEvent.receiver, receiver);
+ assert_equals(trackEvent.track, track);
+ assert_array_equals(trackEvent.streams, []);
+ assert_equals(trackEvent.transceiver, transceiver);
+
+ assert_equals(trackEvent.type, 'track');
+ assert_false(trackEvent.bubbles);
+ assert_false(trackEvent.cancelable);
+
+ }, `new RTCTrackEvent() with valid receiver, track, transceiver should succeed`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const { receiver } = transceiver;
+ const { track } = receiver;
+
+ const stream = new MediaStream([track]);
+
+ const trackEvent = new RTCTrackEvent('track', {
+ receiver, track, transceiver,
+ streams: [stream]
+ });
+
+ assert_equals(trackEvent.receiver, receiver);
+ assert_equals(trackEvent.track, track);
+ assert_array_equals(trackEvent.streams, [stream]);
+ assert_equals(trackEvent.transceiver, transceiver);
+
+ }, `new RTCTrackEvent() with valid receiver, track, streams, transceiver should succeed`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const { receiver } = transceiver;
+ const { track } = receiver;
+
+ const stream1 = new MediaStream([track]);
+ const stream2 = new MediaStream([track]);
+
+ const trackEvent = new RTCTrackEvent('track', {
+ receiver, track, transceiver,
+ streams: [stream1, stream2]
+ });
+
+ assert_equals(trackEvent.receiver, receiver);
+ assert_equals(trackEvent.track, track);
+ assert_array_equals(trackEvent.streams, [stream1, stream2]);
+ assert_equals(trackEvent.transceiver, transceiver);
+
+ }, `new RTCTrackEvent() with valid receiver, track, multiple streams, transceiver should succeed`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const receiver = pc.addTransceiver('audio').receiver;
+ const track = pc.addTransceiver('audio').receiver.track;
+
+ const stream = new MediaStream();
+
+ const trackEvent = new RTCTrackEvent('track', {
+ receiver, track, transceiver,
+ streams: [stream]
+ });
+
+ assert_equals(trackEvent.receiver, receiver);
+ assert_equals(trackEvent.track, track);
+ assert_array_equals(trackEvent.streams, [stream]);
+ assert_equals(trackEvent.transceiver, transceiver);
+
+ }, `new RTCTrackEvent() with unrelated receiver, track, streams, transceiver should succeed`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const { receiver } = transceiver;
+ const { track } = receiver;
+
+ assert_throws(new TypeError(), () =>
+ new RTCTrackEvent('track', {
+ receiver, track
+ }));
+
+ }, `new RTCTrackEvent() with no transceiver should throw TypeError`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const { receiver } = transceiver;
+
+ assert_throws(new TypeError(), () =>
+ new RTCTrackEvent('track', {
+ receiver, transceiver
+ }));
+
+ }, `new RTCTrackEvent() with no track should throw TypeError`);
+
+ test(t => {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const { receiver } = transceiver;
+ const { track } = receiver;
+
+ assert_throws(new TypeError(), () =>
+ new RTCTrackEvent('track', {
+ track, transceiver
+ }));
+
+ }, `new RTCTrackEvent() with no receiver should throw TypeError`);
+
+ /*
+ Coverage Report
+ Interface tests are counted as 1 trivial test
+
+ Tested 1
+ Total 1
+ */
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/coverage/RTCDTMFSender.txt b/tests/wpt/web-platform-tests/webrtc/coverage/RTCDTMFSender.txt
new file mode 100644
index 00000000000..aa300213238
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/coverage/RTCDTMFSender.txt
@@ -0,0 +1,122 @@
+Coverage is based on the following editor draft:
+https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+7. insertDTMF
+
+ [Trivial]
+ - The tones parameter is treated as a series of characters.
+
+ [RTCDTMFSender-insertDTMF]
+ - The characters 0 through 9, A through D, #, and * generate the associated
+ DTMF tones.
+
+ [RTCDTMFSender-insertDTMF]
+ - The characters a to d MUST be normalized to uppercase on entry and are equivalent
+ to A to D.
+
+ [RTCDTMFSender-insertDTMF]
+ - As noted in [RTCWEB-AUDIO] Section 3, support for the characters 0 through 9,
+ A through D, #, and * are required.
+
+ [RTCDTMFSender-insertDTMF]
+ - The character ',' MUST be supported, and indicates a delay of 2 seconds before
+ processing the next character in the tones parameter.
+
+ [RTCDTMFSender-insertDTMF]
+ - All other characters (and only those other characters) MUST
+ be considered unrecognized.
+
+ [Trivial]
+ - The duration parameter indicates the duration in ms to use for each character passed
+ in the tones parameters.
+
+ [RTCDTMFSender-ontonechange]
+ - The duration cannot be more than 6000 ms or less than 40 ms.
+
+ [RTCDTMFSender-ontonechange]
+ - The default duration is 100 ms for each tone.
+
+ [RTCDTMFSender-ontonechange]
+ - The interToneGap parameter indicates the gap between tones in ms. The user agent
+ clamps it to at least 30 ms. The default value is 70 ms.
+
+ [Untestable]
+ - The browser MAY increase the duration and interToneGap times to cause the times
+ that DTMF start and stop to align with the boundaries of RTP packets but it MUST
+ not increase either of them by more than the duration of a single RTP audio packet.
+
+ [Trivial]
+ When the insertDTMF() method is invoked, the user agent MUST run the following steps:
+
+ [Trivial]
+ 1. let sender be the RTCRtpSender used to send DTMF.
+
+ [Trivial]
+ 2. Let transceiver be the RTCRtpTransceiver object associated with sender.
+
+ [RTCDTMFSender-insertDTMF]
+ 3. If transceiver.stopped is true, throw an InvalidStateError.
+
+ [RTCDTMFSender-insertDTMF]
+ 4. If transceiver.currentDirection is recvonly or inactive, throw an
+ InvalidStateError.
+
+ [Trivial]
+ 5. Let tones be the method's first argument.
+
+ [RTCDTMFSender-insertDTMF]
+ 6. If tones contains any unrecognized characters, throw an InvalidCharacterError.
+
+ [RTCDTMFSender-insertDTMF]
+ 7. Set the object's toneBuffer attribute to tones.
+
+ [RTCDTMFSender-ontonechange]
+ 8. If the value of the duration parameter is less than 40, set it to 40.
+
+ [RTCDTMFSender-ontonechange-long]
+ If, on the other hand, the value is greater than 6000, set it to 6000.
+
+ [RTCDTMFSender-ontonechange]
+ 9. If the value of the interToneGap parameter is less than 30, set it to 30.
+
+ [RTCDTMFSender-ontonechange]
+ 10. If toneBuffer is an empty string, abort these steps.
+
+ [RTCDTMFSender-ontonechange]
+ 11. If a Playout task is scheduled to be run; abort these steps;
+
+ [RTCDTMFSender-ontonechange]
+ otherwise queue a task that runs the following steps (Playout task):
+
+ [RTCDTMFSender-ontonechange]
+ 1. If transceiver.stopped is true, abort these steps.
+
+ [RTCDTMFSender-ontonechange]
+ 2. If transceiver.currentDirection is recvonly or inactive, abort these steps.
+
+ [RTCDTMFSender-ontonechange]
+ 3. If toneBuffer is an empty string, fire an event named tonechange with an
+ empty string at the RTCDTMFSender object and abort these steps.
+
+ [RTCDTMFSender-ontonechange]
+ 4. Remove the first character from toneBuffer and let that character be tone.
+
+ [Untestable]
+ 5. Start playout of tone for duration ms on the associated RTP media stream,
+ using the appropriate codec.
+
+ [RTCDTMFSender-ontonechange]
+ 6. Queue a task to be executed in duration + interToneGap ms from now that
+ runs the steps labelled Playout task.
+
+ [RTCDTMFSender-ontonechange]
+ 7. Fire an event named tonechange with a string consisting of tone at the
+ RTCDTMFSender object.
+
+Coverage Report
+
+ Tested 31
+ Not Tested 0
+ Untestable 1
+
+ Total 32
diff --git a/tests/wpt/web-platform-tests/webrtc/coverage/identity.txt b/tests/wpt/web-platform-tests/webrtc/coverage/identity.txt
new file mode 100644
index 00000000000..0d1bcca7ed0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/coverage/identity.txt
@@ -0,0 +1,220 @@
+Coverage is based on the following editor draft:
+https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+9.3 Requesting Identity Assertions
+
+ [Trivial]
+ The identity assertion request process is triggered by a call to createOffer,
+ createAnswer, or getIdentityAssertion. When these calls are invoked and an
+ identity provider has been set, the following steps are executed:
+
+ [RTCPeerConnection-getIdentityAssertion]
+ 1. The RTCPeerConnection instantiates an IdP as described in Identity Provider
+ Selection and Registering an IdP Proxy. If the IdP cannot be loaded, instantiated,
+ or the IdP proxy is not registered, this process fails.
+
+ [RTCPeerConnection-getIdentityAssertion]
+ 2. The RTCPeerConnection invokes the generateAssertion method on the
+ RTCIdentityProvider methods registered by the IdP.
+
+ [RTCPeerConnection-getIdentityAssertion]
+ The RTCPeerConnection generates the contents parameter to this method as
+ described in [RTCWEB-SECURITY-ARCH]. The value of contents includes the
+ fingerprint of the certificate that was selected or generated during the
+ construction of the RTCPeerConnection. The origin parameter contains the
+ origin of the script that calls the RTCPeerConnection method that triggers
+ this behavior. The usernameHint value is the same value that is provided
+ to setIdentityProvider, if any such value was provided.
+
+ [RTCPeerConnection-getIdentityAssertion]
+ 3. The IdP proxy returns a Promise to the RTCPeerConnection. The IdP proxy is
+ expected to generate the identity assertion asynchronously.
+
+ [RTCPeerConnection-getIdentityAssertion]
+ If the user has been authenticated by the IdP, and the IdP is able to generate
+ an identity assertion, the IdP resolves the promise with an identity assertion
+ in the form of an RTCIdentityAssertionResult .
+
+ [RTCPeerConnection-getIdentityAssertion]
+ This step depends entirely on the IdP. The methods by which an IdP authenticates
+ users or generates assertions is not specified, though they could involve
+ interacting with the IdP server or other servers.
+
+ [RTCPeerConnection-getIdentityAssertion]
+ 4. If the IdP proxy produces an error or returns a promise that does not resolve
+ to a valid RTCIdentityValidationResult (see 9.5 IdP Error Handling), then
+ identity validation fails.
+
+ [Untestable]
+ 5. The RTCPeerConnection MAY store the identity assertion for use with future
+ offers or answers. If a fresh identity assertion is needed for any reason,
+ applications can create a new RTCPeerConnection.
+
+ [RTCPeerConnection-getIdentityAssertion]
+ 6. If the identity request was triggered by a createOffer() or createAnswer(),
+ then the assertion is converted to a JSON string, base64-encoded and inserted
+ into an a=identity attribute in the session description.
+
+ [RTCPeerConnection-getIdentityAssertion]
+ If assertion generation fails, then the promise for the corresponding function call
+ is rejected with a newly created OperationError.
+
+9.3.1 User Login Procedure
+ [RTCPeerConnection-getIdentityAssertion]
+ An IdP MAY reject an attempt to generate an identity assertion if it is unable to
+ verify that a user is authenticated. This might be due to the IdP not having the
+ necessary authentication information available to it (such as cookies).
+
+ [RTCPeerConnection-getIdentityAssertion]
+ Rejecting the promise returned by generateAssertion will cause the error to propagate
+ to the application. Login errors are indicated by rejecting the promise with an RTCError
+ with errorDetail set to "idp-need-login".
+
+ [RTCPeerConnection-getIdentityAssertion]
+ The URL to login at will be passed to the application in the idpLoginUrl attribute of
+ the RTCPeerConnection.
+
+ [Out of Scope]
+ An application can load the login URL in an IFRAME or popup window; the resulting page
+ then SHOULD provide the user with an opportunity to enter any information necessary to
+ complete the authorization process.
+
+ [Out of Scope]
+ Once the authorization process is complete, the page loaded in the IFRAME or popup sends
+ a message using postMessage [webmessaging] to the page that loaded it (through the
+ window.opener attribute for popups, or through window.parent for pages loaded in an IFRAME).
+ The message MUST consist of the DOMString "LOGINDONE". This message informs the application
+ that another attempt at generating an identity assertion is likely to be successful.
+
+9.4. Verifying Identity Assertions
+ The identity assertion request process involves the following asynchronous steps:
+
+ [TODO]
+ 1. The RTCPeerConnection awaits any prior identity validation. Only one identity
+ validation can run at a time for an RTCPeerConnection. This can happen because
+ the resolution of setRemoteDescription is not blocked by identity validation
+ unless there is a target peer identity.
+
+ [RTCPeerConnection-peerIdentity]
+ 2. The RTCPeerConnection loads the identity assertion from the session description
+ and decodes the base64 value, then parses the resulting JSON. The idp parameter
+ of the resulting dictionary contains a domain and an optional protocol value
+ that identifies the IdP, as described in [RTCWEB-SECURITY-ARCH].
+
+ [RTCPeerConnection-peerIdentity]
+ 3. The RTCPeerConnection instantiates the identified IdP as described in 9.1.1
+ Identity Provider Selection and 9.2 Registering an IdP Proxy. If the IdP
+ cannot be loaded, instantiated or the IdP proxy is not registered, this
+ process fails.
+
+ [RTCPeerConnection-peerIdentity]
+ 4. The RTCPeerConnection invokes the validateAssertion method registered by the IdP.
+
+ [RTCPeerConnection-peerIdentity]
+ The assertion parameter is taken from the decoded identity assertion. The origin
+ parameter contains the origin of the script that calls the RTCPeerConnection
+ method that triggers this behavior.
+
+ [RTCPeerConnection-peerIdentity]
+ 5. The IdP proxy returns a promise and performs the validation process asynchronously.
+
+ [Out of Scope]
+ The IdP proxy verifies the identity assertion using whatever means necessary.
+ Depending on the authentication protocol this could involve interacting with the
+ IdP server.
+
+ [RTCPeerConnection-peerIdentity]
+ 6. If the IdP proxy produces an error or returns a promise that does not resolve
+ to a valid RTCIdentityValidationResult (see 9.5 IdP Error Handling), then
+ identity validation fails.
+
+ [RTCPeerConnection-peerIdentity]
+ 7. Once the assertion is successfully verified, the IdP proxy resolves the promise
+ with an RTCIdentityValidationResult containing the validated identity and the
+ original contents that are the payload of the assertion.
+
+ [RTCPeerConnection-peerIdentity]
+ 8. The RTCPeerConnection decodes the contents and validates that it contains a
+ fingerprint value for every a=fingerprint attribute in the session description.
+ This ensures that the certificate used by the remote peer for communications
+ is covered by the identity assertion.
+
+ [RTCPeerConnection-peerIdentity]
+ 9. The RTCPeerConnection validates that the domain portion of the identity matches
+ the domain of the IdP as described in [RTCWEB-SECURITY-ARCH]. If this check fails
+ then the identity validation fails.
+
+ [RTCPeerConnection-peerIdentity]
+ 10. The RTCPeerConnection resolves the peerIdentity attribute with a new instance
+ of RTCIdentityAssertion that includes the IdP domain and peer identity.
+
+ [Out of Scope]
+ 11. The user agent MAY display identity information to a user in its UI. Any user
+ identity information that is displayed in this fashion MUST use a mechanism that
+ cannot be spoofed by content.
+
+ [RTCPeerConnection-peerIdentity]
+ If identity validation fails, the peerIdentity promise is rejected with a newly
+ created OperationError.
+
+ [RTCPeerConnection-peerIdentity]
+ If identity validation fails and there is a target peer identity for the
+ RTCPeerConnection, the promise returned by setRemoteDescription MUST be rejected
+ with the same DOMException.
+
+9.5. IdP Error Handling
+ [RTCPeerConnection-getIdentityAssertion]
+ - A RTCPeerConnection might be configured with an identity provider, but loading of
+ the IdP URI fails. Any procedure that attempts to invoke such an identity provider
+ and cannot load the URI fails with an RTCError with errorDetail set to
+ "idp-load-failure" and the httpRequestStatusCode attribute of the error set to the
+ HTTP status code of the response.
+
+ [Untestable]
+ - If the IdP loads fails due to the TLS certificate used for the HTTPS connection not
+ being trusted, it fails with an RTCError with errorDetail set to "idp-tls-failure".
+ This typically happens when the IdP uses certificate pinning and an intermediary
+ such as an enterprise firewall has intercepted the TLS connection.
+
+ [RTCPeerConnection-getIdentityAssertion]
+ - If the script loaded from the identity provider is not valid JavaScript or does not
+ implement the correct interfaces, it causes an IdP failure with an RTCError with
+ errorDetail set to "idp-bad-script-failure".
+
+ [TODO]
+ - An apparently valid identity provider might fail in several ways.
+
+ If the IdP token has expired, then the IdP MUST fail with an RTCError with
+ errorDetail set to "idp-token-expired".
+
+ If the IdP token is not valid, then the IdP MUST fail with an RTCError with
+ errorDetail set to "idp-token-invalid".
+
+ [Untestable]
+ - The user agent SHOULD limit the time that it allows for an IdP to 15 seconds.
+ This includes both the loading of the IdP proxy and the identity assertion
+ generation or validation. Failure to do so potentially causes the corresponding
+ operation to take an indefinite amount of time. This timer can be cancelled when
+ the IdP proxy produces a response. Expiration of this timer cases an IdP failure
+ with an RTCError with errorDetail set to "idp-timeout".
+
+ [RTCPeerConnection-getIdentityAssertion]
+ - If the identity provider requires the user to login, the operation will fail
+ RTCError with errorDetail set to "idp-need-login" and the idpLoginUrl attribute
+ of the error set to the URL that can be used to login.
+
+ [RTCPeerConnection-peerIdentity]
+ - Even when the IdP proxy produces a positive result, the procedure that uses this
+ information might still fail. Additional validation of a RTCIdentityValidationResult
+ value is still necessary. The procedure for validation of identity assertions
+ describes additional steps that are required to successfully validate the output
+ of the IdP proxy.
+
+
+Coverage Report
+
+ Tested 29
+ Not Tested 2
+ Untestable 4
+
+ Total 35
diff --git a/tests/wpt/web-platform-tests/webrtc/coverage/set-session-description.txt b/tests/wpt/web-platform-tests/webrtc/coverage/set-session-description.txt
new file mode 100644
index 00000000000..f2bb4227034
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/coverage/set-session-description.txt
@@ -0,0 +1,240 @@
+Coverage Report is based on the following editor draft:
+https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
+
+4.3.1.6 Set the RTCSessionSessionDescription
+
+ [Trivial]
+ 1. Let p be a new promise.
+
+ [Trivial]
+ 2. In parallel, start the process to apply description as described in [JSEP]
+ (section 5.5. and section 5.6.).
+
+ [Trivial]
+ 1. If the process to apply description fails for any reason, then user agent
+ MUST queue a task that runs the following steps:
+
+ [Untestable]
+ 1. If connection's [[IsClosed]] slot is true, then abort these steps.
+
+ [Untestable]
+ 2. If elements of the SDP were modified, then reject p with a newly created
+ InvalidModificationError and abort these steps.
+
+ [RTCPeerConnection-setLocalDescription-answer]
+ [RTCPeerConnection-setRemoteDescription-offer]
+ [RTCPeerConnection-setRemoteDescription-answer]
+ 3. If the description's type is invalid for the current signaling state of
+ connection as described in [JSEP] (section 5.5. and section 5.6.), then
+ reject p with a newly created InvalidStateError and abort these steps.
+
+ [RTCPeerConnection-setRemoteDescription-offer]
+ 4. If the content of description is not valid SDP syntax, then reject p
+ with an RTCError (with errorDetail set to "sdp-syntax-error" and the
+ sdpLineNumber attribute set to the line number in the SDP where the
+ syntax error was detected) and abort these steps.
+
+ [Untestable]
+ 5. If the content of description is invalid, then reject p with a newly
+ created InvalidAccessError and abort these steps.
+
+ [Untestable]
+ 6. For all other errors, for example if description cannot be applied at
+ the media layer, reject p with a newly created OperationError.
+
+ [Trivial]
+ 2. If description is applied successfully, the user agent MUST queue a task
+ that runs the following steps:
+
+ [Untestable]
+ 1. If connection's [[isClosed]] slot is true, then abort these steps.
+
+ [RTCPeerConnection-setLocalDescription]
+ 2. If description is set as a local description, then run one of the
+ following steps:
+
+ [RTCPeerConnection-setLocalDescription-offer]
+ - If description is of type "offer", set connection.pendingLocalDescription
+ to description and signaling state to have-local-offer.
+
+ [RTCPeerConnection-setLocalDescription-answer]
+ - If description is of type "answer", then this completes an offer answer
+ negotiation.
+
+ Set connection's currentLocalDescription to description and
+ currentRemoteDescription to the value of pendingRemoteDescription.
+
+ Set both pendingRemoteDescription and pendingLocalDescription to null.
+ Finally set connection's signaling state to stable
+
+ [RTCPeerConnection-setLocalDescription-rollback]
+ - If description is of type "rollback", then this is a rollback. Set
+ connection.pendingLocalDescription to null and signaling state to stable.
+
+ [RTCPeerConnection-setLocalDescription-pranswer]
+ - If description is of type "pranswer", then set
+ connection.pendingLocalDescription to description and signaling state to
+ have-local-pranswer.
+
+ [RTCPeerConnection-setRemoteDescription]
+ 3. Otherwise, if description is set as a remote description, then run one of the
+ following steps:
+
+ [RTCPeerConnection-setRemoteDescription-offer]
+ - If description is of type "offer", set connection.pendingRemoteDescription
+ attribute to description and signaling state to have-remote-offer.
+
+ [RTCPeerConnection-setRemoteDescription-answer]
+ - If description is of type "answer", then this completes an offer answer
+ negotiation.
+
+ Set connection's currentRemoteDescription to description and
+ currentLocalDescription to the value of pendingLocalDescription.
+
+ Set both pendingRemoteDescription and pendingLocalDescription to null.
+
+ Finally setconnection's signaling state to stable
+
+ [RTCPeerConnection-setRemoteDescription-rollback]
+ - If description is of type "rollback", then this is a rollback.
+ Set connection.pendingRemoteDescription to null and signaling state to stable.
+
+ [RTCPeerConnection-setRemoteDescription-rollback]
+ - If description is of type "pranswer", then set
+ connection.pendingRemoteDescription to description and signaling state
+ to have-remote-pranswer.
+
+ [RTCPeerConnection-setLocalDescription]
+ [RTCPeerConnection-setRemoteDescription]
+ 4. If connection's signaling state changed above, fire a simple event named
+ signalingstatechange at connection.
+
+ [TODO]
+ 5. If description is of type "answer", and it initiates the closure of an existing
+ SCTP association, as defined in [SCTP-SDP], Sections 10.3 and 10.4, set the value
+ of connection's [[sctpTransport]] internal slot to null.
+
+ [RTCSctpTransport]
+ 6. If description is of type "answer" or "pranswer", then run the following steps:
+
+ [RTCSctpTransport]
+ 1. If description initiates the establishment of a new SCTP association,
+ as defined in [SCTP-SDP], Sections 10.3 and 10.4, set the value of connection's
+ [[sctpTransport]] internal slot to a newly created RTCSctpTransport.
+
+ [TODO]
+ 2. If description negotiates the DTLS role of the SCTP transport, and there is an
+ RTCDataChannel with a null id, then generate an ID according to
+ [RTCWEB-DATA-PROTOCOL].
+
+ [Untestable]
+ If no available ID could be generated, then run the following steps:
+
+ [Untestable]
+ 1. Let channel be the RTCDataChannel object for which an ID could not be
+ generated.
+
+ [Untestable]
+ 2. Set channel's readyState attribute to closed.
+
+ [Untestable]
+ 3. Fire an event named error with a ResourceInUse exception at channel.
+
+ [Untestable]
+ 4. Fire a simple event named close at channel.
+
+ [TODO RTCPeerConnection-setDescription-transceiver]
+ 7. If description is set as a local description, then run the following steps for
+ each media description in description that is not yet associated with an
+ RTCRtpTransceiver object:
+
+ [TODO RTCPeerConnection-setDescription-transceiver]
+ 1. Let transceiver be the RTCRtpTransceiver used to create the media
+ description.
+
+ [TODO RTCPeerConnection-setDescription-transceiver]
+ 2. Set transceiver's mid value to the mid of the corresponding media
+ description.
+
+ [RTCPeerConnection-ontrack]
+ 8. If description is set as a remote description, then run the following steps
+ for each media description in description:
+
+ [TODO RTCPeerConnection-setDescription-transceiver]
+ 1. As described by [JSEP] (section 5.9.), attempt to find an existing
+ RTCRtpTransceiver object, transceiver, to represent the media description.
+
+ [RTCPeerConnection-ontrack]
+ 2. If no suitable transceiver is found (transceiver is unset), run the following
+ steps:
+
+ [RTCPeerConnection-ontrack]
+ 1. Create an RTCRtpSender, sender, from the media description.
+
+ [RTCPeerConnection-ontrack]
+ 2. Create an RTCRtpReceiver, receiver, from the media description.
+
+ [RTCPeerConnection-ontrack]
+ 3. Create an RTCRtpTransceiver with sender, receiver and direction, and let
+ transceiver be the result.
+
+ [RTCPeerConnection-ontrack]
+ 3. Set transceiver's mid value to the mid of the corresponding media description.
+ If the media description has no MID, and transceiver's mid is unset, generate
+ a random value as described in [JSEP] (section 5.9.).
+
+ [RTCPeerConnection-ontrack]
+ 4. If the direction of the media description is sendrecv or sendonly, and
+ transceiver.receiver.track has not yet been fired in a track event, process
+ the remote track for the media description, given transceiver.
+
+ [TODO RTCPeerConnection-setDescription-transceiver]
+ 5. If the media description is rejected, and transceiver is not already stopped,
+ stop the RTCRtpTransceiver transceiver.
+
+
+ [TODO RTCPeerConnection-setDescription-transceiver]
+ 9. If description is of type "rollback", then run the following steps:
+
+ [TODO RTCPeerConnection-setDescription-transceiver]
+ 1. If the mid value of an RTCRtpTransceiver was set to a non-null value by
+ the RTCSessionDescription that is being rolled back, set the mid value
+ of that transceiver to null, as described by [JSEP] (section 4.1.8.2.).
+
+ [TODO RTCPeerConnection-setDescription-transceiver]
+ 2. If an RTCRtpTransceiver was created by applying the RTCSessionDescription
+ that is being rolled back, and a track has not been attached to it via
+ addTrack, remove that transceiver from connection's set of transceivers,
+ as described by [JSEP] (section 4.1.8.2.).
+
+ [TODO RTCPeerConnection-setDescription-transceiver]
+ 3. Restore the value of connection's [[SctpTransport]] internal slot to its
+ value at the last stable signaling state.
+
+ [RTCPeerConnection-onnegotiationneeded]
+ 10. If connection's signaling state is now stable, update the negotiation-needed
+ flag. If connection's [[NegotiationNeeded]] slot was true both before and after
+ this update, queue a task that runs the following steps:
+
+ [Untestable]
+ 1. If connection's [[IsClosed]] slot is true, abort these steps.
+
+ [RTCPeerConnection-onnegotiationneeded]
+ 2. If connection's [[NegotiationNeeded]] slot is false, abort these steps.
+
+ [RTCPeerConnection-onnegotiationneeded]
+ 3. Fire a simple event named negotiationneeded at connection.
+
+ [Trivial]
+ 11. Resolve p with undefined.
+
+ [Trivial]
+ 3. Return p.
+
+
+Coverage Report
+
+ Tested 35
+ Not Tested 15
+ Untestable 8
+ Total 58
diff --git a/tests/wpt/web-platform-tests/webrtc/dictionary-helper.js b/tests/wpt/web-platform-tests/webrtc/dictionary-helper.js
new file mode 100644
index 00000000000..dab7e49fad0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/dictionary-helper.js
@@ -0,0 +1,101 @@
+'use strict';
+
+// Helper assertion functions to validate dictionary fields
+// on dictionary objects returned from APIs
+
+function assert_unsigned_int_field(object, field) {
+ const num = object[field];
+ assert_true(Number.isInteger(num) && (num >= 0),
+ `Expect dictionary.${field} to be unsigned integer`);
+}
+
+function assert_int_field(object, field) {
+ const num = object[field];
+ assert_true(Number.isInteger(num),
+ `Expect dictionary.${field} to be integer`);
+}
+
+function assert_string_field(object, field) {
+ const str = object[field];
+ assert_equals(typeof str, 'string',
+ `Expect dictionary.${field} to be string`);
+}
+
+function assert_number_field(object, field) {
+ const num = object[field];
+ assert_equals(typeof num, 'number',
+ `Expect dictionary.${field} to be number`);
+}
+
+function assert_boolean_field(object, field) {
+ const bool = object[field];
+ assert_equals(typeof bool, 'boolean',
+ `Expect dictionary.${field} to be boolean`);
+}
+
+function assert_array_field(object, field) {
+ assert_true(Array.isArray(object[field]),
+ `Expect dictionary.${field} to be array`);
+}
+
+function assert_dict_field(object, field) {
+ assert_equals(typeof object[field], 'object',
+ `Expect dictionary.${field} to be plain object`);
+
+ assert_not_equals(object[field], null,
+ `Expect dictionary.${field} to not be null`);
+}
+
+function assert_enum_field(object, field, validValues) {
+ assert_string_field(object, field);
+ assert_true(validValues.includes(object[field]),
+ `Expect dictionary.${field} to have one of the valid enum values: ${validValues}`);
+}
+
+function assert_optional_unsigned_int_field(object, field) {
+ if(object[field] !== undefined) {
+ assert_unsigned_int_field(object, field);
+ }
+}
+
+function assert_optional_int_field(object, field) {
+ if(object[field] !== undefined) {
+ assert_int_field(object, field);
+ }
+}
+
+function assert_optional_string_field(object, field) {
+ if(object[field] !== undefined) {
+ assert_string_field(object, field);
+ }
+}
+
+function assert_optional_number_field(object, field) {
+ if(object[field] !== undefined) {
+ assert_number_field(object, field);
+ }
+}
+
+function assert_optional_boolean_field(object, field) {
+ if(object[field] !== undefined) {
+ assert_boolean_field(object, field);
+ }
+}
+
+function assert_optional_array_field(object, field) {
+ if(object[field] !== undefined) {
+ assert_array_field(object, field);
+ }
+}
+
+function assert_optional_dict_field(object, field) {
+ if(object[field] !== undefined) {
+ assert_dict_field(object, field);
+ }
+}
+
+function assert_optional_enum_field(object, field, validValues) {
+ if(object[field] !== undefined) {
+ assert_enum_field(object, field, validValues);
+ }
+}
diff --git a/tests/wpt/web-platform-tests/webrtc/historical.html b/tests/wpt/web-platform-tests/webrtc/historical.html
new file mode 100644
index 00000000000..c57a1ca362e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/historical.html
@@ -0,0 +1,37 @@
+<!doctype html>
+<title>Historical WebRTC features</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+test(function() {
+ assert_false("reliable" in RTCDataChannel.prototype);
+}, "RTCDataChannel member reliable should not exist");
+
+[
+ "addStream",
+ "createDTMFSender",
+ "getLocalStreams",
+ "getRemoteStreams",
+ "getStreamById",
+ "onaddstream",
+ "onremovestream",
+ "removeStream",
+ "updateIce",
+].forEach(function(name) {
+ test(function() {
+ assert_false(name in RTCPeerConnection.prototype);
+ }, "RTCPeerConnection member " + name + " should not exist");
+});
+
+[
+ "mozRTCIceCandidate",
+ "mozRTCPeerConnection",
+ "mozRTCSessionDescription",
+ "webkitRTCPeerConnection",
+].forEach(function(name) {
+ test(function() {
+ assert_false(name in window);
+ }, name + " interface should not exist");
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/identity-helper.js b/tests/wpt/web-platform-tests/webrtc/identity-helper.js
new file mode 100644
index 00000000000..bd35d0fbbe9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webrtc/identity-helper.js
@@ -0,0 +1,70 @@
+'use strict';
+
+/*
+ In web-platform-test, the following domains are required to be set up locally:
+ 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
+ 0.0.0.0 nonexistent-origin.web-platform.test
+ */
+
+/*
+ dictionary RTCIdentityProviderDetails {
+ required DOMString domain;
+ DOMString protocol = "default";
+ };
+ */
+
+// Parse a base64 JSON encoded string returned from getIdentityAssertion().
+// This is also the string that is set in the a=identity line.
+// Returns a { idp, assertion } where idp is of type RTCIdentityProviderDetails
+// and assertion is the deserialized JSON that was returned by the
+// IdP proxy's generateAssertion() function.
+function parseAssertionResult(assertionResultStr) {
+ const assertionResult = JSON.parse(atob(assertionResultStr));
+
+ const { idp } = assertionResult;
+ const assertion = JSON.parse(assertionResult.assertion);
+
+ return { idp, assertion };
+}
+
+// Return two distinct IdP domains that are different from current domain
+function getIdpDomains() {
+ if(window.location.hostname === 'www1.web-platform.test') {
+ return ['www.web-platform.test', 'www2.web-platform.test'];
+ } else if(window.location.hostname === 'www2.web-platform.test') {
+ return ['www.web-platform.test', 'www1.web-platform.test'];
+ } else {
+ return ['www1.web-platform.test', 'www2.web-platform.test'];
+ }
+}
+
+function assert_rtcerror_rejection(errorDetail, promise, desc) {
+ return promise.then(
+ res => {
+ assert_unreached(`Expect promise to be rejected with RTCError, but instead got ${res}`);
+ }, err => {
+ assert_true(err instanceof RTCError,
+ 'Expect error object to be instance of RTCError');
+
+ assert_equals(err.errorDetail, errorDetail,
+ `Expect RTCError object have errorDetail set to ${errorDetail}`);
+
+ return err;
+ });
+}
+
+// construct a host string consist of domain and optionally port
+// If the default HTTP/HTTPS port is used, window.location.port returns
+// empty string.
+function hostString(domain, port) {
+ if(port === '') {
+ return domain;
+ } else {
+ return `${domain}:${port}`;
+ }
+}
diff --git a/tests/wpt/web-platform-tests/webrtc/interfaces.html b/tests/wpt/web-platform-tests/webrtc/interfaces.html
index e64286d8d6b..e6e6846a7ca 100644
--- a/tests/wpt/web-platform-tests/webrtc/interfaces.html
+++ b/tests/wpt/web-platform-tests/webrtc/interfaces.html
@@ -1,57 +1,180 @@
<!doctype html>
-<html>
- <head>
- <title>WebRTC IDL Tests</title>
- </head>
- <body>
- <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>
- 'use strict';
-
- function generateCertificate() {
- if (!RTCPeerConnection.generateCertificate)
- return null;
- return RTCPeerConnection.generateCertificate({
- name: 'RSASSA-PKCS1-v1_5',
- modulusLength: 2048,
- publicExponent: new Uint8Array([1, 0, 1]),
- hash: 'SHA-256'
- })
- .catch(() => {}); // ignore error
- }
-
- function doIdlTest([idlText, certificate]) {
- const idlArray = new IdlArray();
-
- idlArray.add_untested_idls('interface EventHandler {};');
- idlArray.add_untested_idls('interface MediaStreamTrack {};');
- idlArray.add_idls(idlText);
-
- // TODO: Add object for all IDL interfaces
- idlArray.add_objects({
- 'RTCPeerConnection': ['new RTCPeerConnection'],
- 'RTCSessionDescription': ['new RTCSessionDescription({ type: "offer" })'],
- 'RTCIceCandidate': ['new RTCIceCandidate'],
- 'RTCPeerConnectionIceEvent': ['new RTCPeerConnectionIceEvent("ice")'],
- 'RTCPeerConnectionIceErrorEvent': ['new RTCPeerConnectionIceErrorEvent("ice-error", { errorCode: 701 });'],
+<meta charset=utf-8>
+<title>WebRTC IDL Tests</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script src="./RTCPeerConnection-helper.js"></script>
+<script>
+ 'use strict';
+
+ // The following helper functions are called from RTCPeerConnection-helper.js:
+ // generateAnswer()
+ // generateMediaStreamTrack()
+
+ // Put the global IDL test objects under a parent object.
+ // This allows easier search for the test cases when
+ // viewing the web page
+ const idlTestObjects = {};
+
+ // Helper function to create RTCTrackEvent object
+ function initTrackEvent() {
+ const pc = new RTCPeerConnection();
+ const transceiver = pc.addTransceiver('audio');
+ const { sender, receiver } = transceiver;
+ const { track } = receiver;
+ return new RTCTrackEvent('track', {
+ receiver, track, transceiver
+ });
+ }
+
+ // List of async test driver functions
+ const asyncInitTasks = [
+ asyncInitCertificate,
+ asyncInitTransports,
+ asyncInitMediaStreamTrack,
+ ];
+
+ // Asynchronously generate an RTCCertificate
+ function asyncInitCertificate() {
+ return RTCPeerConnection.generateCertificate({
+ name: 'RSASSA-PKCS1-v1_5',
+ modulusLength: 2048,
+ publicExponent: new Uint8Array([1, 0, 1]),
+ hash: 'SHA-256'
+ }).then(cert => {
+ idlTestObjects.certificate = cert;
+ });
+ }
+
+ // Asynchronously generate instances of
+ // RTCSctpTransport, RTCDtlsTransport,
+ // and RTCIceTransport
+ function asyncInitTransports() {
+ const pc = new RTCPeerConnection();
+ pc.createDataChannel('test');
+
+ // setting answer description initializes pc.sctp
+ return pc.createOffer()
+ .then(offer =>
+ pc.setLocalDescription(offer)
+ .then(() => generateAnswer(offer)))
+ .then(answer => pc.setRemoteDescription(answer))
+ .then(() => {
+ const sctpTransport = pc.sctp;
+ assert_true(sctpTransport instanceof RTCSctpTransport,
+ 'Expect pc.sctp to be instance of RTCSctpTransport');
+ idlTestObjects.sctpTransport = sctpTransport;
+
+ const dtlsTransport = sctpTransport.transport;
+ assert_true(dtlsTransport instanceof RTCDtlsTransport,
+ 'Expect sctpTransport.transport to be instance of RTCDtlsTransport');
+ idlTestObjects.dtlsTransport = dtlsTransport;
+
+ const iceTransport = dtlsTransport.transport;
+ idlTestObjects.iceTransport = iceTransport;
+ });
+ }
+
+ // Asynchoronously generate MediaStreamTrack from getUserMedia
+ function asyncInitMediaStreamTrack() {
+ return navigator.mediaDevices.getUserMedia({ audio: true })
+ .then(mediaStream => {
+ const tracks = mediaStream.getTracks();
+ assert_greater_than(tracks.length, 0,
+ 'Expect media stream to have at least one track');
+
+ idlTestObjects.mediaStreamTrack = tracks[0];
+ });
+ }
+
+ // Run all async test drivers, report and swallow any error
+ // thrown/rejected. Proper test for correct initialization
+ // of the objects are done in their respective test files.
+ function asyncInit() {
+ return Promise.all(asyncInitTasks.map(
+ task => {
+ const t = async_test(`Test driver for ${task.name}`);
+ let promise;
+ t.step(() => {
+ promise = task().then(
+ t.step_func_done(),
+ t.step_func(err =>
+ assert_unreached(`Failed to run ${task.name}: ${err}`)));
});
+ return promise;
+ }));
+ }
+
+ // Main function to do the IDL test, using fetched IDL text
+ function doIdlTest(idlText) {
+ const idlArray = new IdlArray();
+
+ idlArray.add_untested_idls('interface EventHandler {};');
+ idlArray.add_idls('interface MediaStreamTrack : EventTarget {};');
+ idlArray.add_idls(idlText);
+
+ idlArray.add_objects({
+ 'RTCPeerConnection': [`new RTCPeerConnection()`],
+
+ 'RTCSessionDescription': [`new RTCSessionDescription({ type: 'offer' })`],
+
+ 'RTCIceCandidate': [`new RTCIceCandidate({ sdpMid: 1 })`],
+
+ 'RTCDataChannel': [`new RTCPeerConnection().createDataChannel('')`],
+
+ 'RTCRtpTransceiver': [`new RTCPeerConnection().addTransceiver('audio')`],
+
+ 'RTCRtpSender': [`new RTCPeerConnection().addTransceiver('audio').sender`],
+
+ 'RTCRtpReceiver': [`new RTCPeerConnection().addTransceiver('audio').receiver`],
+
+ 'RTCPeerConnectionIceEvent': [`new RTCPeerConnectionIceEvent('ice')`],
+
+ 'RTCPeerConnectionIceErrorEvent':
+ [`new RTCPeerConnectionIceErrorEvent('ice-error', { errorCode: 701 });`],
+
+ 'RTCTrackEvent': [`initTrackEvent()`],
+
+ 'RTCErrorEvent': [`new RTCErrorEvent('error')`],
+
+ 'RTCDataChannelEvent': [`new RTCDataChannelEvent('channel',
+ { channel: new RTCPeerConnection().createDataChannel('') })`],
+
+ // Async initialized objects below
+
+ 'RTCCertificate': ['idlTestObjects.certificate'],
+
+ 'RTCSctpTransport': ['idlTestObjects.sctpTransport'],
+
+ 'RTCDtlsTransport': ['idlTestObjects.dtlsTransport'],
+
+ 'RTCIceTransport': ['idlTestObjects.iceTransport'],
+
+ // Test on both MediaStreamTrack from getUserMedia and transceiver
+ 'MediaStreamTrack': [
+ `idlTestObjects.mediaStreamTrack`,
+ `generateMediaStreamTrack('audio')`]
+ });
+
+ idlArray.test();
+ }
+
+ promise_test(t => {
+ return asyncInit()
+ .then(() => fetch('/interfaces/webrtc-pc.idl'))
+ .then(response => response.text())
+ .then(doIdlTest);
+ }, 'Main test driver');
- if (certificate) {
- window.certificate = certificate;
- idlArray.add_objects({'RTCCertificate': ['certificate']});
- }
-
- idlArray.test();
- }
-
- promise_test(() => {
- return Promise.all([fetch('/interfaces/webrtc-pc.idl').then(response => response.text()),
- generateCertificate()])
- .then(doIdlTest);
- }, 'Test driver');
- </script>
- </body>
-</html>
+ /*
+ TODO
+ RTCRtpContributingSource
+ RTCRtpSynchronizationSource
+ RTCDTMFSender
+ RTCDTMFToneChangeEvent
+ RTCIdentityProviderRegistrar
+ RTCIdentityAssertion
+ */
+</script>
diff --git a/tests/wpt/web-platform-tests/webrtc/simplecall.html b/tests/wpt/web-platform-tests/webrtc/simplecall.html
index bf12e5db1b6..f27c7ff1e85 100644
--- a/tests/wpt/web-platform-tests/webrtc/simplecall.html
+++ b/tests/wpt/web-platform-tests/webrtc/simplecall.html
@@ -24,12 +24,6 @@ property to true in Firefox.
<!-- These files are in place when executing on W3C. -->
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
- <script src="/common/vendor-prefix.js"
- data-prefixed-objects=
- '[{"ancestors":["navigator"], "name":"getUserMedia"}]'
- data-prefixed-prototypes=
- '[{"ancestors":["HTMLMediaElement"],"name":"srcObject"}]'>
- </script>
<script type="text/javascript">
var test = async_test('Can set up a basic WebRTC call.', {timeout: 5000});
@@ -108,15 +102,13 @@ property to true in Firefox.
// Returns a suitable error callback.
function failed(function_name) {
- return test.step_func(function() {
- assert_unreached('WebRTC called error callback for ' + function_name);
- });
+ return test.unreached_func('WebRTC called error callback for ' + function_name);
}
// This function starts the test.
test.step(function() {
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
- .then(getUserMediaOkCallback, failed('getUserMedia'));
+ .then(test.step_func(getUserMediaOkCallback), failed('getUserMedia'));
});
</script>
diff --git a/tests/wpt/web-platform-tests/websockets/OWNERS b/tests/wpt/web-platform-tests/websockets/OWNERS
index 705040182a2..074b077829e 100644
--- a/tests/wpt/web-platform-tests/websockets/OWNERS
+++ b/tests/wpt/web-platform-tests/websockets/OWNERS
@@ -1,5 +1,4 @@
@kristijanburnik
-@zcorpan
@zqzhang
@Jxck
@jdm
diff --git a/tests/wpt/web-platform-tests/websockets/constructor/010.html b/tests/wpt/web-platform-tests/websockets/constructor/010.html
index 95ec83d19dc..aee4d78af99 100644
--- a/tests/wpt/web-platform-tests/websockets/constructor/010.html
+++ b/tests/wpt/web-platform-tests/websockets/constructor/010.html
@@ -9,14 +9,13 @@
<script>
async_test(function(t) {
var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/handshake_protocol');
- ws.onerror = ws.onmessage = ws.onclose = t.step_func(e => assert_unreached(e.type));
- ws.onopen = t.step_func(function(e) {
+ ws.onopen = ws.onmessage = ws.onclose = t.step_func(e => assert_unreached(e.type));
+ ws.onerror = t.step_func(function(e) {
ws.onclose = t.step_func(function(e) {
- ws.onclose = t.step_func(e => assert_unreached(e.type));
- t.step_timeout(() => t.done(), 50);
- })
- ws.close();
+ assert_false(e.wasClean, 'e.wasClean should be false');
+ assert_equals(e.code, 1006, 'e.code should be 1006');
+ t.done();
+ });
})
});
</script>
-
diff --git a/tests/wpt/web-platform-tests/websockets/constructor/011.html b/tests/wpt/web-platform-tests/websockets/constructor/011.html
index 6f55bc0eab4..f7a2b99b830 100644
--- a/tests/wpt/web-platform-tests/websockets/constructor/011.html
+++ b/tests/wpt/web-platform-tests/websockets/constructor/011.html
@@ -8,20 +8,20 @@
<div id=log></div>
<script>
async_test(function(t) {
+ // Sub-protocol matching is case-sensitive.
var ws = new WebSocket(SCHEME_DOMAIN_PORT+'/handshake_protocol', 'FOOBAR');
var gotOpen = false;
var gotError = false;
ws.onopen = t.step_func(function(e) {
gotOpen = true;
- })
+ });
ws.onerror = t.step_func(function(e) {
gotError = true;
- })
+ });
ws.onclose = t.step_func(function(e) {
- assert_true(gotOpen, 'got open');
+ assert_false(gotOpen, 'got open');
assert_true(gotError, 'got error');
- ws.onclose = t.unreached_func();
- t.step_timeout(() => t.done(), 50);
- })
+ t.done();
+ });
});
</script>
diff --git a/tests/wpt/web-platform-tests/websockets/unload-a-document/001-1.html b/tests/wpt/web-platform-tests/websockets/unload-a-document/001-1.html
index 8ae83af3795..bd0c3668695 100644
--- a/tests/wpt/web-platform-tests/websockets/unload-a-document/001-1.html
+++ b/tests/wpt/web-platform-tests/websockets/unload-a-document/001-1.html
@@ -22,7 +22,7 @@ t.step(function() {
}, 1000);
controller.navigate();
})
- ws.onerror = ws.onmessage = ws.onclose = t.step_func(e => assert_unreached("Got unexpected event " + e.type));
+ ws.onerror = ws.onmessage = t.step_func(e => assert_unreached("Got unexpected event " + e.type));
}
});
</script>
diff --git a/tests/wpt/web-platform-tests/websockets/unload-a-document/001-2.html b/tests/wpt/web-platform-tests/websockets/unload-a-document/001-2.html
new file mode 100644
index 00000000000..24c419ce185
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/unload-a-document/001-2.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<title>WebSockets: navigating top-level browsing context</title>
+<body onload="history.back()"></body>
+</html>
diff --git a/tests/wpt/web-platform-tests/websockets/unload-a-document/001.html b/tests/wpt/web-platform-tests/websockets/unload-a-document/001.html
index d949b6eba09..56e883c6492 100644
--- a/tests/wpt/web-platform-tests/websockets/unload-a-document/001.html
+++ b/tests/wpt/web-platform-tests/websockets/unload-a-document/001.html
@@ -20,6 +20,6 @@ t.step(function() {
});
});
navigate = t.step_func(function() {
- w.location = 'data:text/html,<body onload="history.back()">';
+ w.location = w.location.href.replace("001-1.html", "001-2.html");
});
</script>
diff --git a/tests/wpt/web-platform-tests/websockets/unload-a-document/002-1.html b/tests/wpt/web-platform-tests/websockets/unload-a-document/002-1.html
index 8432d84db70..d151b231f25 100644
--- a/tests/wpt/web-platform-tests/websockets/unload-a-document/002-1.html
+++ b/tests/wpt/web-platform-tests/websockets/unload-a-document/002-1.html
@@ -28,7 +28,7 @@ t.step(function() {
controller.navigate();
});
})
- ws.onerror = ws.onmessage = ws.onclose = t.step_func(e => assert_unreached("Got unexpected event " + e.type));
+ ws.onerror = ws.onmessage = t.step_func(e => assert_unreached("Got unexpected event " + e.type));
}
});
</script>
diff --git a/tests/wpt/web-platform-tests/websockets/unload-a-document/002-2.html b/tests/wpt/web-platform-tests/websockets/unload-a-document/002-2.html
new file mode 100644
index 00000000000..9a246a1dd8d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/websockets/unload-a-document/002-2.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<title>WebSockets: navigating top-level browsing context with closed websocket</title>
+<body onload="history.back()"></body>
+</html>
diff --git a/tests/wpt/web-platform-tests/websockets/unload-a-document/002.html b/tests/wpt/web-platform-tests/websockets/unload-a-document/002.html
index df35192d6a4..03764c345e9 100644
--- a/tests/wpt/web-platform-tests/websockets/unload-a-document/002.html
+++ b/tests/wpt/web-platform-tests/websockets/unload-a-document/002.html
@@ -21,6 +21,6 @@ t.step(function() {
});
});
navigate = t.step_func(function() {
- w.location = 'data:text/html,<body onload="history.back()">';
+ w.location = w.location.href.replace("002-1.html", "002-2.html");
});
</script>
diff --git a/tests/wpt/web-platform-tests/webstorage/resources/storage_session_window_noopener_second.html b/tests/wpt/web-platform-tests/webstorage/resources/storage_session_window_noopener_second.html
new file mode 100644
index 00000000000..7e477375aea
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webstorage/resources/storage_session_window_noopener_second.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>WebStorage Test: sessionStorage - second page</title>
+</head>
+<body>
+<script>
+
+var storage = window.sessionStorage;
+
+var assertions = [];
+
+assertions.push({
+ actual: storage.getItem("FOO"),
+ expected: null,
+ message: "storage.getItem('FOO')"
+});
+
+storage.setItem("FOO", "BAR-NEWWINDOW");
+
+assertions.push({
+ actual: storage.getItem("FOO"),
+ expected: "BAR-NEWWINDOW",
+ message: "value for FOO after changing"
+});
+
+let channel = new BroadcastChannel('storage_session_window_noopener');
+channel.postMessage(assertions, '*');
+
+window.close();
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/webstorage/storage_enumerate.html b/tests/wpt/web-platform-tests/webstorage/storage_enumerate.html
index 1586f7a6128..bc68ae656f0 100644
--- a/tests/wpt/web-platform-tests/webstorage/storage_enumerate.html
+++ b/tests/wpt/web-platform-tests/webstorage/storage_enumerate.html
@@ -23,17 +23,45 @@
storage.alpha = "beta";
storage.zeta = "gamma";
- var enumeratedArray = new Array();
- for (var n in storage)
- enumeratedArray.push(n);
+ const enumeratedArray = Object.keys(storage);
+ enumeratedArray.sort(); // Storage order is implementation-defined.
- // Sort the array, since the storage order isn't guaranteed
- enumeratedArray.sort();
-
- var expectArray = ["alpha", "bar", "batman", "foo", "fu", "prototypeTestKey", "zeta"];
+ const expectArray = ["alpha", "bar", "batman", "foo", "fu", "zeta"];
assert_array_equals(enumeratedArray, expectArray);
+ // 'prototypeTestKey' is not an actual storage key, it is just a
+ // property set on Storage's prototype object.
+ assert_equals(storage.length, 6);
+ assert_equals(storage.getItem("prototypeTestKey"), null);
+ assert_equals(storage.prototypeTestKey, "prototypeTestValue");
}, name + ": enumerate a Storage object and get only the keys as a result and the built-in properties of the Storage object should be ignored");
+
+ test(function() {
+ const storage = window[name];
+ storage.clear();
+
+ storage.setItem("foo", "bar");
+ storage.baz = "quux";
+ storage.setItem(0, "alpha");
+ storage[42] = "beta";
+
+ for (let prop in storage) {
+ if (!storage.hasOwnProperty(prop))
+ continue;
+ const desc = Object.getOwnPropertyDescriptor(storage, prop);
+ assert_true(desc.configurable);
+ assert_true(desc.enumerable);
+ assert_true(desc.writable);
+ }
+
+ const keys = Object.keys(storage);
+ keys.sort(); // Storage order is implementation-defined.
+ assert_array_equals(keys, ["0", "42", "baz", "foo"]);
+
+ const values = Object.values(storage);
+ values.sort(); // Storage order is implementation-defined.
+ assert_array_equals(values, ["alpha", "bar", "beta", "quux"]);
+ }, name + ": test enumeration of numeric and non-numeric keys");
});
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/webstorage/storage_session_window_noopener.html b/tests/wpt/web-platform-tests/webstorage/storage_session_window_noopener.html
new file mode 100644
index 00000000000..034402f5ef8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webstorage/storage_session_window_noopener.html
@@ -0,0 +1,36 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>WebStorage Test: sessionStorage - open a new window with noopener</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+</head>
+<body>
+<div id="log"></div>
+<script>
+
+async_test(function(t) {
+
+ var storage = window.sessionStorage;
+ storage.clear();
+
+ storage.setItem("FOO", "BAR");
+
+ let channel = new BroadcastChannel("storage_session_window_noopener");
+ channel.addEventListener("message", t.step_func(function(e) {
+ e.data.forEach(t.step_func(function(assertion) {
+ assert_equals(assertion.actual, assertion.expected, assertion.message);
+ }));
+ assert_equals(storage.getItem("FOO"), "BAR", "value for FOO in original window");
+ t.done();
+ }));
+
+ var win = window.open("resources/storage_session_window_noopener_second.html",
+ "_blank",
+ "noopener");
+
+}, "A new noopener window to make sure there is a not copy of the previous window's sessionStorage");
+
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/webusb/README.md b/tests/wpt/web-platform-tests/webusb/README.md
new file mode 100644
index 00000000000..107a5bb1447
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/README.md
@@ -0,0 +1,12 @@
+# WebUSB Testing
+
+WebUSB testing relies on the [WebUSB Testing API] which must be
+provided by browsers under test.
+
+In this test suite `resources/usb-helpers.js` detects and triggers
+the API to be loaded as needed.
+
+The Chromium implementation is provided by
+`../resources/chromium/webusb-test.js`.
+
+[WebUSB Testing API]: https://wicg.github.io/webusb/test/
diff --git a/tests/wpt/web-platform-tests/webusb/idlharness.https.html b/tests/wpt/web-platform-tests/webusb/idlharness.https.html
index 8cee0434159..f69c53c61b6 100644
--- a/tests/wpt/web-platform-tests/webusb/idlharness.https.html
+++ b/tests/wpt/web-platform-tests/webusb/idlharness.https.html
@@ -8,210 +8,63 @@
<script src=/resources/testharnessreport.js></script>
<script src=/resources/WebIDLParser.js></script>
<script src=/resources/idlharness.js></script>
+ <script src=resources/fake-devices.js></script>
+ <script src=resources/usb-helpers.js></script>
</head>
<body>
- <script type="text/plain" id="untested">
- interface Event {};
- dictionary EventInit {};
- interface EventHandler {};
- interface EventTarget {};
- interface Navigator {};
- </script>
- <script type="text/plain" id="tested">
- // Copied from https://wicg.github.io/webusb/#idl-index minus the
- // definitions related to Permissions API integration which is unstable.
-
- dictionary USBDeviceFilter {
- unsigned short vendorId;
- unsigned short productId;
- octet classCode;
- octet subclassCode;
- octet protocolCode;
- DOMString serialNumber;
- };
-
- dictionary USBDeviceRequestOptions {
- required sequence<USBDeviceFilter> filters;
- };
-
- interface USB : EventTarget {
- attribute EventHandler onconnect;
- attribute EventHandler ondisconnect;
- Promise<sequence<USBDevice>> getDevices();
- Promise<USBDevice> requestDevice(USBDeviceRequestOptions options);
- };
-
- [SecureContext]
- partial interface Navigator {
- [SameObject] readonly attribute USB usb;
- };
-
- dictionary USBConnectionEventInit : EventInit {
- required USBDevice device;
- };
-
- [Constructor(DOMString type, USBConnectionEventInit eventInitDict)]
- interface USBConnectionEvent : Event {
- [SameObject] readonly attribute USBDevice device;
- };
-
- interface USBDevice {
- readonly attribute octet usbVersionMajor;
- readonly attribute octet usbVersionMinor;
- readonly attribute octet usbVersionSubminor;
- readonly attribute octet deviceClass;
- readonly attribute octet deviceSubclass;
- readonly attribute octet deviceProtocol;
- readonly attribute unsigned short vendorId;
- readonly attribute unsigned short productId;
- readonly attribute octet deviceVersionMajor;
- readonly attribute octet deviceVersionMinor;
- readonly attribute octet deviceVersionSubminor;
- readonly attribute DOMString? manufacturerName;
- readonly attribute DOMString? productName;
- readonly attribute DOMString? serialNumber;
- readonly attribute USBConfiguration? configuration;
- readonly attribute FrozenArray<USBConfiguration> configurations;
- readonly attribute boolean opened;
- Promise<void> open();
- Promise<void> close();
- Promise<void> selectConfiguration(octet configurationValue);
- Promise<void> claimInterface(octet interfaceNumber);
- Promise<void> releaseInterface(octet interfaceNumber);
- Promise<void> selectAlternateInterface(octet interfaceNumber, octet alternateSetting);
- Promise<USBInTransferResult> controlTransferIn(USBControlTransferParameters setup, unsigned short length);
- Promise<USBOutTransferResult> controlTransferOut(USBControlTransferParameters setup, optional BufferSource data);
- Promise<void> clearHalt(USBDirection direction, octet endpointNumber);
- Promise<USBInTransferResult> transferIn(octet endpointNumber, unsigned long length);
- Promise<USBOutTransferResult> transferOut(octet endpointNumber, BufferSource data);
- Promise<USBIsochronousInTransferResult> isochronousTransferIn(octet endpointNumber, sequence<unsigned long> packetLengths);
- Promise<USBIsochronousOutTransferResult> isochronousTransferOut(octet endpointNumber, BufferSource data, sequence<unsigned long> packetLengths);
- Promise<void> reset();
- };
-
- enum USBRequestType {
- "standard",
- "class",
- "vendor"
- };
-
- enum USBRecipient {
- "device",
- "interface",
- "endpoint",
- "other"
- };
-
- enum USBTransferStatus {
- "ok",
- "stall",
- "babble"
- };
-
- dictionary USBControlTransferParameters {
- required USBRequestType requestType;
- required USBRecipient recipient;
- required octet request;
- required unsigned short value;
- required unsigned short index;
- };
-
- [Constructor(USBTransferStatus status, optional DataView? data)]
- interface USBInTransferResult {
- readonly attribute DataView? data;
- readonly attribute USBTransferStatus status;
- };
-
- [Constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0)]
- interface USBOutTransferResult {
- readonly attribute unsigned long bytesWritten;
- readonly attribute USBTransferStatus status;
- };
-
- [Constructor(USBTransferStatus status, optional DataView? data)]
- interface USBIsochronousInTransferPacket {
- readonly attribute DataView? data;
- readonly attribute USBTransferStatus status;
- };
-
- [Constructor(sequence<USBIsochronousInTransferPacket> packets, optional DataView? data)]
- interface USBIsochronousInTransferResult {
- readonly attribute DataView? data;
- readonly attribute FrozenArray<USBIsochronousInTransferPacket> packets;
- };
-
- [Constructor(USBTransferStatus status, optional unsigned long bytesWritten = 0)]
- interface USBIsochronousOutTransferPacket {
- readonly attribute unsigned long bytesWritten;
- readonly attribute USBTransferStatus status;
- };
-
- [Constructor(sequence<USBIsochronousOutTransferPacket> packets)]
- interface USBIsochronousOutTransferResult {
- readonly attribute FrozenArray<USBIsochronousOutTransferPacket> packets;
- };
-
- [Constructor(USBDevice device, octet configurationValue)]
- interface USBConfiguration {
- readonly attribute octet configurationValue;
- readonly attribute DOMString? configurationName;
- readonly attribute FrozenArray<USBInterface> interfaces;
- };
-
- [Constructor(USBConfiguration configuration, octet interfaceNumber)]
- interface USBInterface {
- readonly attribute octet interfaceNumber;
- readonly attribute USBAlternateInterface alternate;
- readonly attribute FrozenArray<USBAlternateInterface> alternates;
- readonly attribute boolean claimed;
- };
-
- [Constructor(USBInterface deviceInterface, octet alternateSetting)]
- interface USBAlternateInterface {
- readonly attribute octet alternateSetting;
- readonly attribute octet interfaceClass;
- readonly attribute octet interfaceSubclass;
- readonly attribute octet interfaceProtocol;
- readonly attribute DOMString? interfaceName;
- readonly attribute FrozenArray<USBEndpoint> endpoints;
- };
-
- enum USBDirection {
- "in",
- "out"
- };
-
- enum USBEndpointType {
- "bulk",
- "interrupt",
- "isochronous"
- };
-
- [Constructor(USBAlternateInterface alternate, octet endpointNumber, USBDirection direction)]
- interface USBEndpoint {
- readonly attribute octet endpointNumber;
- readonly attribute USBDirection direction;
- readonly attribute USBEndpointType type;
- readonly attribute unsigned long packetSize;
- };
- </script>
<script>
'use strict';
- 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({
- Navigator: ['navigator'],
- USB: ['navigator.usb'],
- USBInTransferResult: ['new USBInTransferResult("ok")'],
- USBOutTransferResult: ['new USBOutTransferResult("ok")'],
- USBIsochronousInTransferResult: ['new USBIsochronousInTransferResult([])'],
- USBIsochronousOutTransferResult: ['new USBIsochronousOutTransferResult([])'],
- USBIsochronousInTransferPacket: ['new USBIsochronousInTransferPacket("ok")'],
- USBIsochronousOutTransferPacket: ['new USBIsochronousOutTransferPacket("ok")']
- });
- idl_array.test();
+ // Object instances used by the IDL test.
+ var usbDevice;
+ var usbConfiguration;
+ var usbInterface;
+ var usbAlternateInterface;
+ var usbEndpoint;
+ var usbConnectionEvent;
+
+ usb_test(async () => {
+ let response = await fetch('/interfaces/webusb.idl');
+ let idl_text = await response.text();
+ let idl_array = new IdlArray();
+ idl_array.add_idls(idl_text);
+
+ // Untested IDL interfaces
+ idl_array.add_untested_idls('interface Event {};');
+ idl_array.add_untested_idls('interface EventHandler {};');
+ idl_array.add_untested_idls('dictionary EventInit {};');
+ idl_array.add_untested_idls('interface EventTarget {};');
+ idl_array.add_untested_idls('interface Navigator {};');
+
+ let {device} = await getFakeDevice();
+
+ usbDevice = device;
+ usbConfiguration = usbDevice.configurations[0];
+ usbInterface = usbConfiguration.interfaces[0];
+ usbAlternateInterface = usbInterface.alternates[0];
+ usbEndpoint = usbAlternateInterface.endpoints[0];
+ usbConnectionEvent =
+ new USBConnectionEvent('connect', { device: usbDevice })
+
+ idl_array.add_objects({
+ Navigator: ['navigator'],
+ USB: ['navigator.usb'],
+ USBAlternateInterface: ['usbAlternateInterface'],
+ USBConfiguration: ['usbConfiguration'],
+ USBConnectionEvent: ['usbConnectionEvent'],
+ USBDevice: ['usbDevice'],
+ USBEndpoint: ['usbEndpoint'],
+ USBInterface: ['usbInterface'],
+ USBInTransferResult: ['new USBInTransferResult("ok")'],
+ USBOutTransferResult: ['new USBOutTransferResult("ok")'],
+ USBIsochronousInTransferResult: ['new USBIsochronousInTransferResult([])'],
+ USBIsochronousOutTransferResult: ['new USBIsochronousOutTransferResult([])'],
+ USBIsochronousInTransferPacket: ['new USBIsochronousInTransferPacket("ok")'],
+ USBIsochronousOutTransferPacket: ['new USBIsochronousOutTransferPacket("ok")'],
+ });
+
+ idl_array.test();
+ }, 'WebUSB IDL test');
</script>
</body>
</html>
diff --git a/tests/wpt/web-platform-tests/webusb/resources/check-availability.html b/tests/wpt/web-platform-tests/webusb/resources/check-availability.html
deleted file mode 100644
index f1e3bb53cfe..00000000000
--- a/tests/wpt/web-platform-tests/webusb/resources/check-availability.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<script>
-'use strict';
-
-Promise.resolve().then(() => navigator.usb.getDevices()).then(devices => {
- window.parent.postMessage('#OK', '*');
-}, error => {
- window.parent.postMessage('#' + error.name, '*');
-});
-</script>
diff --git a/tests/wpt/web-platform-tests/webusb/resources/fake-devices.js b/tests/wpt/web-platform-tests/webusb/resources/fake-devices.js
new file mode 100644
index 00000000000..975d2242c94
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/resources/fake-devices.js
@@ -0,0 +1,90 @@
+'use strict';
+
+let fakeDeviceInit = {
+ usbVersionMajor: 2,
+ usbVersionMinor: 0,
+ usbVersionSubminor: 0,
+ deviceClass: 7,
+ deviceSubclass: 1,
+ deviceProtocol: 2,
+ vendorId: 0x18d1,
+ productId: 0xf00d,
+ deviceVersionMajor: 1,
+ deviceVersionMinor: 2,
+ deviceVersionSubminor: 3,
+ manufacturerName: 'Google, Inc.',
+ productName: 'The amazing imaginary printer',
+ serialNumber: '4',
+ activeConfigurationValue: 0,
+ configurations: [{
+ configurationValue: 1,
+ configurationName: 'Printer Mode',
+ interfaces: [{
+ interfaceNumber: 0,
+ alternates: [{
+ alternateSetting: 0,
+ interfaceClass: 0xff,
+ interfaceSubclass: 0x01,
+ interfaceProtocol: 0x01,
+ interfaceName: 'Control',
+ endpoints: [{
+ endpointNumber: 1,
+ direction: 'in',
+ type: 'interrupt',
+ packetSize: 8
+ }]
+ }]
+ }, {
+ interfaceNumber: 1,
+ alternates: [{
+ alternateSetting: 0,
+ interfaceClass: 0xff,
+ interfaceSubclass: 0x02,
+ interfaceProtocol: 0x01,
+ interfaceName: 'Data',
+ endpoints: [{
+ endpointNumber: 2,
+ direction: 'in',
+ type: 'bulk',
+ packetSize: 1024
+ }, {
+ endpointNumber: 2,
+ direction: 'out',
+ type: 'bulk',
+ packetSize: 1024
+ }]
+ }]
+ }]
+ }, {
+ configurationValue: 2,
+ configurationName: 'Fighting Robot Mode',
+ interfaces: [{
+ interfaceNumber: 0,
+ alternates: [{
+ alternateSetting: 0,
+ interfaceClass: 0xff,
+ interfaceSubclass: 0x42,
+ interfaceProtocol: 0x01,
+ interfaceName: 'Disabled',
+ endpoints: []
+ }, {
+ alternateSetting: 1,
+ interfaceClass: 0xff,
+ interfaceSubclass: 0x42,
+ interfaceProtocol: 0x01,
+ interfaceName: 'Activate!',
+ endpoints: [{
+ endpointNumber: 1,
+ direction: 'in',
+ type: 'isochronous',
+ packetSize: 1024
+ }, {
+ endpointNumber: 1,
+ direction: 'out',
+ type: 'isochronous',
+ packetSize: 1024
+ }]
+ }]
+ }]
+ }]
+};
diff --git a/tests/wpt/web-platform-tests/webusb/resources/featurepolicytest.js b/tests/wpt/web-platform-tests/webusb/resources/featurepolicytest.js
deleted file mode 100644
index 243242eefbb..00000000000
--- a/tests/wpt/web-platform-tests/webusb/resources/featurepolicytest.js
+++ /dev/null
@@ -1,14 +0,0 @@
-function assert_usb_available_in_iframe(test, origin, expected) {
- let frame = document.createElement('iframe');
- frame.src = origin + '/webusb/resources/check-availability.html';
-
- window.addEventListener('message', test.step_func(evt => {
- if (evt.source == frame.contentWindow) {
- assert_equals(evt.data, expected);
- document.body.removeChild(frame);
- test.done();
- }
- }));
-
- document.body.appendChild(frame);
-}
diff --git a/tests/wpt/web-platform-tests/webusb/resources/open-in-iframe.html b/tests/wpt/web-platform-tests/webusb/resources/open-in-iframe.html
new file mode 100644
index 00000000000..0b04a3e03aa
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/resources/open-in-iframe.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<script>
+'use strict';
+window.onmessage = messageEvent => {
+ if (messageEvent.data === 'Ready') {
+ navigator.usb.addEventListener('connect', connectEvent => {
+ connectEvent.device.open().then(() => {
+ parent.postMessage('Success', '*');
+ }).catch(error => {
+ parent.postMessage('FAIL: open rejected ' + error, '*');
+ });
+ });
+ parent.postMessage('Ready', '*');
+ }
+};
+</script>
diff --git a/tests/wpt/web-platform-tests/webusb/resources/usb-helpers.js b/tests/wpt/web-platform-tests/webusb/resources/usb-helpers.js
new file mode 100644
index 00000000000..989e8f1f4c0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/resources/usb-helpers.js
@@ -0,0 +1,129 @@
+'use strict';
+
+// These tests rely on the User Agent providing an implementation of the
+// WebUSB Testing API (https://wicg.github.io/webusb/test/).
+//
+// In Chromium-based browsers this implementation is provided by a polyfill
+// in order to reduce the amount of test-only code shipped to users. To enable
+// these tests the browser must be run with these options:
+//
+// --enable-blink-features=MojoJS,MojoJSTest
+let loadChromiumResources = Promise.resolve().then(() => {
+ if (!MojoInterfaceInterceptor) {
+ // Do nothing on non-Chromium-based browsers or when the Mojo bindings are
+ // not present in the global namespace.
+ return;
+ }
+
+ let chain = Promise.resolve();
+ [
+ '/resources/chromium/mojo_bindings.js',
+ '/resources/chromium/string16.mojom.js',
+ '/resources/chromium/device.mojom.js',
+ '/resources/chromium/device_manager.mojom.js',
+ '/resources/chromium/chooser_service.mojom.js',
+ '/resources/chromium/webusb-test.js',
+ ].forEach(path => {
+ let script = document.createElement('script');
+ script.src = path;
+ script.async = false;
+ chain = chain.then(() => new Promise(resolve => {
+ script.onload = () => resolve();
+ }));
+ document.head.appendChild(script);
+ });
+
+ return chain;
+});
+
+function usb_test(func, name, properties) {
+ promise_test(async () => {
+ if (navigator.usb.test === undefined) {
+ // Try loading a polyfill for the WebUSB Testing API.
+ await loadChromiumResources;
+ }
+
+ await navigator.usb.test.initialize();
+ try {
+ await func();
+ } finally {
+ await navigator.usb.test.reset();
+ }
+ }, name, properties);
+}
+
+// Returns a promise that is resolved when the next USBConnectionEvent of the
+// given type is received.
+function connectionEventPromise(eventType) {
+ return new Promise(resolve => {
+ let eventHandler = e => {
+ assert_true(e instanceof USBConnectionEvent);
+ navigator.usb.removeEventListener(eventType, eventHandler);
+ resolve(e.device);
+ };
+ navigator.usb.addEventListener(eventType, eventHandler);
+ });
+}
+
+// Creates a fake device and returns a promise that resolves once the
+// 'connect' event is fired for the fake device. The promise is resolved with
+// an object containing the fake USB device and the corresponding USBDevice.
+function getFakeDevice() {
+ let promise = connectionEventPromise('connect');
+ let fakeDevice = navigator.usb.test.addFakeDevice(fakeDeviceInit);
+ return promise.then(device => {
+ return { device: device, fakeDevice: fakeDevice };
+ });
+}
+
+// Disconnects the given device and returns a promise that is resolved when it
+// is done.
+function waitForDisconnect(fakeDevice) {
+ let promise = connectionEventPromise('disconnect');
+ fakeDevice.disconnect();
+ return promise;
+}
+
+function assertRejectsWithError(promise, name, message) {
+ return promise.then(() => {
+ assert_unreached('expected promise to reject with ' + name);
+ }, error => {
+ assert_equals(error.name, name);
+ if (message !== undefined)
+ assert_equals(error.message, message);
+ });
+}
+
+function assertDeviceInfoEquals(usbDevice, deviceInit) {
+ for (var property in deviceInit) {
+ if (property == 'activeConfigurationValue') {
+ if (deviceInit.activeConfigurationValue == 0) {
+ assert_equals(usbDevice.configuration, null);
+ } else {
+ assert_equals(usbDevice.configuration.configurationValue,
+ deviceInit.activeConfigurationValue);
+ }
+ } else if (Array.isArray(deviceInit[property])) {
+ assert_equals(usbDevice[property].length, deviceInit[property].length);
+ for (var i = 0; i < usbDevice[property].length; ++i)
+ assertDeviceInfoEquals(usbDevice[property][i], deviceInit[property][i]);
+ } else {
+ assert_equals(usbDevice[property], deviceInit[property], property);
+ }
+ }
+}
+
+function callWithTrustedClick(callback) {
+ return new Promise(resolve => {
+ let button = document.createElement('button');
+ button.textContent = 'click to continue test';
+ button.style.display = 'block';
+ button.style.fontSize = '20px';
+ button.style.padding = '10px';
+ button.onclick = () => {
+ resolve(callback());
+ document.body.removeChild(button);
+ };
+ document.body.appendChild(button);
+ });
+}
diff --git a/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html b/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html
new file mode 100644
index 00000000000..0b53f09fed0
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy-attribute-redirect-on-load.https.sub.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<body>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/feature-policy/resources/featurepolicy.js></script>
+<script>
+'use strict';
+var relative_path = '/feature-policy/resources/feature-policy-usb.html';
+var base_src = '/feature-policy/resources/redirect-on-load.html#';
+var same_origin_src = base_src + relative_path;
+var cross_origin_src = base_src + 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ relative_path;
+var header = 'Feature-Policy allow="usb"';
+
+async_test(t => {
+ test_feature_availability(
+ 'usb.getDevices()', t, same_origin_src,
+ expect_feature_available_default, 'usb');
+}, header + ' allows same-origin relocation.');
+
+async_test(t => {
+ test_feature_availability(
+ 'usb.getDevices()', t, cross_origin_src,
+ expect_feature_unavailable_default, 'usb');
+}, header + ' disallows cross-origin relocation.');
+</script>
+</body>
diff --git a/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy-attribute.https.sub.html b/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy-attribute.https.sub.html
index 302e7f4a565..f62135c4653 100644
--- a/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy-attribute.https.sub.html
+++ b/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy-attribute.https.sub.html
@@ -2,23 +2,25 @@
<body>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
+<script src=/feature-policy/resources/featurepolicy.js></script>
<script>
'use strict';
+var same_origin_src = '/feature-policy/resources/feature-policy-usb.html';
+var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+var feature_name = 'Feature policy "usb"';
+var header = 'allow="usb" attribute';
async_test(t => {
- let frame = document.createElement('iframe');
- frame.src = 'https://{{domains[www]}}:{{ports[https][0]}}/webusb/resources/check-availability.html';
- frame.allow = 'usb';
+ test_feature_availability(
+ 'usb.getDevices()', t, same_origin_src,
+ expect_feature_available_default, 'usb');
+}, feature_name + ' can be enabled in same-origin iframe using ' + header);
- window.addEventListener('message', t.step_func(evt => {
- if (evt.source == frame.contentWindow) {
- assert_equals(evt.data, '#OK');
- document.body.removeChild(frame);
- t.done();
- }
- }));
-
- document.body.appendChild(frame);
-}, 'Feature policy "usb" can be enabled in cross-origin iframes using "allowed" attribute.');
+async_test(t => {
+ test_feature_availability(
+ 'usb.getDevices()', t, cross_origin_src,
+ expect_feature_available_default, 'usb');
+}, feature_name + ' can be enabled in cross-origin iframe using ' + header);
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy.https.sub.html
index 288a3acc71d..f9af55076d3 100644
--- a/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy.https.sub.html
+++ b/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy.https.sub.html
@@ -2,20 +2,26 @@
<body>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src=resources/featurepolicytest.js></script>
+<script src=/feature-policy/resources/featurepolicy.js></script>
<script>
'use strict';
+var same_origin_src = '/feature-policy/resources/feature-policy-usb.html';
+var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+var header = 'Feature-Policy header {"usb" : ["*"]}';
promise_test(
() => navigator.usb.getDevices(),
- 'Feature-Policy header {"usb": ["*"]} allows the top-level document.');
+ header + ' allows the top-level document.');
async_test(t => {
- assert_usb_available_in_iframe(t, '', '#OK');
-}, 'Feature-Policy header {"usb": ["*"]} allows same-origin iframes.');
+ test_feature_availability('usb.getDevices()', t, same_origin_src,
+ expect_feature_available_default);
+}, header + ' allows same-origin iframes.');
async_test(t => {
- assert_usb_available_in_iframe(t, 'https://{{domains[www]}}:{{ports[https][0]}}', '#OK');
-}, 'Feature-Policy header {"usb": ["*"]} allows cross-origin iframes.');
+ test_feature_availability('usb.getDevices()', t, cross_origin_src,
+ expect_feature_available_default);
+}, header + ' allows cross-origin iframes.');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy.https.sub.html.headers b/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy.https.sub.html.headers
index f10a282c556..5c7eac0d623 100644
--- a/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy.https.sub.html.headers
+++ b/tests/wpt/web-platform-tests/webusb/usb-allowed-by-feature-policy.https.sub.html.headers
@@ -1 +1 @@
-Feature-Policy: {"usb": ["*"]}
+Feature-Policy: usb *
diff --git a/tests/wpt/web-platform-tests/webusb/usb-default-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/webusb/usb-default-feature-policy.https.sub.html
index 157981591c4..34dda528012 100644
--- a/tests/wpt/web-platform-tests/webusb/usb-default-feature-policy.https.sub.html
+++ b/tests/wpt/web-platform-tests/webusb/usb-default-feature-policy.https.sub.html
@@ -2,20 +2,26 @@
<body>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src=resources/featurepolicytest.js></script>
+<script src=/feature-policy/resources/featurepolicy.js></script>
<script>
'use strict';
+var same_origin_src = '/feature-policy/resources/feature-policy-usb.html';
+var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+var header = 'Default "usb" feature policy ["self"]';
promise_test(
() => navigator.usb.getDevices(),
- 'Default "usb" feature policy ["self"] allows the top-level document.');
+ header + ' allows the top-level document.');
async_test(t => {
- assert_usb_available_in_iframe(t, '', '#OK');
-}, 'Default "usb" feature policy ["self"] allows same-origin iframes.');
+ test_feature_availability('usb.getDevices()', t, same_origin_src,
+ expect_feature_available_default);
+}, header + ' allows same-origin iframes.');
async_test(t => {
- assert_usb_available_in_iframe(t, 'https://{{domains[www]}}:{{ports[https][0]}}', '#SecurityError');
-}, 'Default "usb" feature policy ["self"] disallows cross-origin iframes.');
+ test_feature_availability('usb.getDevices()', t, cross_origin_src,
+ expect_feature_unavailable_default);
+}, header + ' disallows cross-origin iframes.');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/webusb/usb-disabled-by-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/webusb/usb-disabled-by-feature-policy.https.sub.html
index b1e555cb996..f090fffce2d 100644
--- a/tests/wpt/web-platform-tests/webusb/usb-disabled-by-feature-policy.https.sub.html
+++ b/tests/wpt/web-platform-tests/webusb/usb-disabled-by-feature-policy.https.sub.html
@@ -2,9 +2,13 @@
<body>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
-<script src=resources/featurepolicytest.js></script>
+<script src=/feature-policy/resources/featurepolicy.js></script>
<script>
'use strict';
+var same_origin_src = '/feature-policy/resources/feature-policy-usb.html';
+var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+var header = 'Feature-Policy header {"usb" : []}';
promise_test(() => {
return navigator.usb.getDevices().then(() => {
@@ -12,14 +16,16 @@ promise_test(() => {
}, error => {
assert_equals(error.name, 'SecurityError');
});
-}, 'Feature-Policy header {"usb": []} disallows the top-level document.');
+}, header + ' disallows the top-level document.');
async_test(t => {
- assert_usb_available_in_iframe(t, '', '#SecurityError');
-}, 'Feature-Policy header {"usb": []} disallows same-origin iframes.');
+ test_feature_availability('usb.getDevices()', t, same_origin_src,
+ expect_feature_unavailable_default);
+}, header + ' disallows same-origin iframes.');
async_test(t => {
- assert_usb_available_in_iframe(t, 'https://{{domains[www]}}:{{ports[https][0]}}', '#SecurityError');
-}, 'Feature-Policy header {"usb": []} disallows cross-origin iframes.');
+ test_feature_availability('usb.getDevices()', t, cross_origin_src,
+ expect_feature_unavailable_default);
+}, header + ' disallows cross-origin iframes.');
</script>
</body>
diff --git a/tests/wpt/web-platform-tests/webusb/usb-disabled-by-feature-policy.https.sub.html.headers b/tests/wpt/web-platform-tests/webusb/usb-disabled-by-feature-policy.https.sub.html.headers
index 24332c7398e..4fd1e269362 100644
--- a/tests/wpt/web-platform-tests/webusb/usb-disabled-by-feature-policy.https.sub.html.headers
+++ b/tests/wpt/web-platform-tests/webusb/usb-disabled-by-feature-policy.https.sub.html.headers
@@ -1 +1 @@
-Feature-Policy: {"usb": []}
+Feature-Policy: usb 'none'
diff --git a/tests/wpt/web-platform-tests/webusb/usb-manual.https.html b/tests/wpt/web-platform-tests/webusb/usb-manual.https.html
new file mode 100644
index 00000000000..62b20c1592f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usb-manual.https.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/fake-devices.js"></script>
+<script src="resources/usb-helpers.js"></script>
+<script>
+'use strict';
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return navigator.usb.getDevices().then(devices => {
+ assert_equals(devices.length, 1);
+ assert_equals(device, devices[0]);
+ assertDeviceInfoEquals(devices[0], fakeDeviceInit);
+ });
+ });
+}, 'getDevices returns devices that are connected');
+
+usb_test(() => {
+ return getFakeDevice().then(() => {
+ return navigator.usb.getDevices().then(devicesFirstTime => {
+ assert_equals(devicesFirstTime.length, 1);
+ return navigator.usb.getDevices().then(devicesSecondTime => {
+ assert_array_equals(devicesSecondTime, devicesFirstTime);
+ });
+ });
+ });
+}, 'getDevices returns the same objects for each USB device');
+
+usb_test(() => {
+ return navigator.usb.requestDevice({ filters: [] })
+ .then(device => {
+ assert_unreachable('requestDevice should reject without a user gesture');
+ })
+ .catch(error => {
+ assert_equals(error.code, DOMException.SECURITY_ERR);
+ });
+}, 'requestDevice rejects when called without a user gesture');
+
+usb_test(() => {
+ return callWithTrustedClick(() => navigator.usb.requestDevice({ filters: [] })
+ .then(device => {
+ assert_unreachable('requestDevice should reject when no device selected');
+ })
+ .catch(error => {
+ assert_equals(error.code, DOMException.NOT_FOUND_ERR);
+ })
+ );
+}, 'requestDevice rejects when no device is chosen');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ navigator.usb.test.onrequestdevice = event => {
+ navigator.usb.test.onrequestdevice = undefined;
+ event.respondWith(fakeDevice);
+ }
+ return callWithTrustedClick(() => {
+ return navigator.usb.requestDevice({ filters: [] }).then(chosenDevice => {
+ assert_equals(chosenDevice, device);
+ });
+ });
+ });
+}, 'requestDevice returns the device chosen by the user');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ navigator.usb.test.onrequestdevice = event => {
+ navigator.usb.test.onrequestdevice = undefined;
+ event.respondWith(fakeDevice);
+ }
+ return callWithTrustedClick(() => {
+ return navigator.usb.requestDevice({ filters: [] }).then(chosenDevice => {
+ assert_equals(chosenDevice, device);
+ return navigator.usb.getDevices().then(devices => {
+ assert_equals(devices.length, 1);
+ assert_equals(devices[0], chosenDevice);
+ });
+ });
+ });
+ });
+}, 'getDevices returns the same object as requestDevice');
+
+usb_test(() => {
+ const expectedFilters = [
+ { vendorId: 1234, classCode: 0xFF, serialNumber: "123ABC" },
+ { vendorId: 5678, productId: 0xF00F }
+ ];
+
+ navigator.usb.test.onrequestdevice = event => {
+ navigator.usb.test.onrequestdevice = undefined;
+
+ assert_equals(event.filters.length, expectedFilters.length);
+ for (var i = 0; i < event.filters.length; ++i) {
+ assert_object_equals(event.filters[i], expectedFilters[i]);
+ }
+
+ event.respondWith(null);
+ }
+
+ return callWithTrustedClick(() => {
+ return navigator.usb.requestDevice({ filters: expectedFilters })
+ .then(device => {
+ assert_unreachable('requestDevice should reject because no device selected');
+ })
+ .catch(error => {
+ assert_equals(error.code, DOMException.NOT_FOUND_ERR);
+ });
+ });
+}, 'filters are sent correctly');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ assertDeviceInfoEquals(device, fakeDeviceInit);
+ return device.open().then(() => device.close());
+ });
+}, 'onconnect event is trigged by adding a device');
+
+usb_test(usb => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return waitForDisconnect(fakeDevice).then(removedDevice => {
+ assertDeviceInfoEquals(removedDevice, fakeDeviceInit);
+ assert_equals(removedDevice, device);
+ return removedDevice.open().then(() => {
+ assert_unreachable('should not be able to open a disconnected device');
+ }, error => {
+ assert_equals(error.code, DOMException.NOT_FOUND_ERR);
+ });
+ });
+ });
+}, 'ondisconnect event is triggered by removing a device');
+</script>
diff --git a/tests/wpt/web-platform-tests/webusb/usbConnectionEvent.https.html b/tests/wpt/web-platform-tests/webusb/usbConnectionEvent.https.html
new file mode 100644
index 00000000000..90b547f94f7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usbConnectionEvent.https.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/fake-devices.js"></script>
+<script src="resources/usb-helpers.js"></script>
+<script>
+'use strict';
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ let evt = new USBConnectionEvent('connect', { device: device });
+ assert_equals(evt.type, 'connect');
+ assert_equals(evt.device, device);
+ });
+}, 'Can construct a USBConnectionEvent with a device');
+
+test(t => {
+ assert_throws(TypeError(), () =>
+ new USBConnectionEvent('connect', { device: null }));
+ assert_throws(TypeError(), () => new USBConnectionEvent('connect', {}));
+}, 'Cannot construct a USBConnectionEvent without a device');
+</script>
diff --git a/tests/wpt/web-platform-tests/webusb/usbDevice-iframe.https.html b/tests/wpt/web-platform-tests/webusb/usbDevice-iframe.https.html
new file mode 100644
index 00000000000..02b2c5010fb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usbDevice-iframe.https.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/fake-devices.js"></script>
+<script src="resources/usb-helpers.js"></script>
+<script>
+'use strict';
+
+function runIframeDisconnectTest(onDeviceConnected) {
+ return new Promise((resolve, reject) => {
+ let opened = false;
+
+ let iframe = document.createElement('iframe');
+ iframe.src = 'resources/open-in-iframe.html';
+ iframe.onload = () => {
+ navigator.usb.test.attachToWindow(iframe.contentWindow).then(() => {
+ iframe.contentWindow.postMessage('Ready', '*');
+ });
+ };
+
+ window.onmessage = messageEvent => {
+ if (messageEvent.data == 'Ready') {
+ let fakeDevice = navigator.usb.test.addFakeDevice(fakeDeviceInit);
+ fakeDevice.onclose = () => {
+ assert_true(opened);
+ resolve();
+ };
+ } else if (messageEvent.data == 'Success') {
+ opened = true;
+ onDeviceConnected(iframe);
+ } else {
+ reject(messageEvent.data);
+ }
+ };
+
+ document.body.appendChild(iframe);
+ });
+}
+
+usb_test(() => {
+ return runIframeDisconnectTest(iframe => {
+ document.body.removeChild(iframe);
+ });
+}, 'detaching iframe disconnects device.');
+
+usb_test(() => {
+ return runIframeDisconnectTest(iframe => {
+ iframe.src = 'about:blank';
+ });
+}, 'navigating iframe disconnects device.');
+</script>
diff --git a/tests/wpt/web-platform-tests/webusb/usbDevice.https.html b/tests/wpt/web-platform-tests/webusb/usbDevice.https.html
new file mode 100644
index 00000000000..b167e70c353
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usbDevice.https.html
@@ -0,0 +1,654 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/fake-devices.js"></script>
+<script src="resources/usb-helpers.js"></script>
+<script>
+'use strict';
+
+function assertRejectsWithNotFoundError(promise) {
+ return assertRejectsWithError(promise, 'NotFoundError');
+}
+
+function assertRejectsWithNotOpenError(promise) {
+ return assertRejectsWithError(
+ promise, 'InvalidStateError', 'The device must be opened first.')
+}
+
+function assertRejectsWithNotConfiguredError(promise) {
+ return assertRejectsWithError(
+ promise, 'InvalidStateError',
+ 'The device must have a configuration selected.');
+}
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return waitForDisconnect(fakeDevice)
+ .then(() => assertRejectsWithNotFoundError(device.open()));
+ });
+}, 'open rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => {
+ assert_false(device.opened);
+ });
+ });
+}, 'disconnection closes the device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ assert_false(device.opened);
+ return device.open().then(() => {
+ assert_true(device.opened);
+ return device.close().then(() => {
+ assert_false(device.opened);
+ });
+ });
+ });
+}, 'a device can be opened and closed');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.open())
+ .then(() => device.open())
+ .then(() => device.open())
+ .then(() => device.close())
+ .then(() => device.close())
+ .then(() => device.close())
+ .then(() => device.close());
+ });
+}, 'open and close can be called multiple times');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ const message =
+ 'An operation that changes the device state is in progress.';
+ return Promise.all([
+ device.open(),
+ assertRejectsWithError(device.open(), 'InvalidStateError', message),
+ assertRejectsWithError(device.close(), 'InvalidStateError', message),
+ ]).then(() => Promise.all([
+ device.close(),
+ assertRejectsWithError(device.open(), 'InvalidStateError', message),
+ assertRejectsWithError(device.close(), 'InvalidStateError', message),
+ ]));
+ });
+}, 'open and close cannot be called again while open or close are in progress');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.close()));
+ });
+}, 'close rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.selectConfiguration(1)));
+ });
+}, 'selectConfiguration rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => Promise.all([
+ assertRejectsWithNotOpenError(device.selectConfiguration(1)),
+ assertRejectsWithNotOpenError(device.claimInterface(0)),
+ assertRejectsWithNotOpenError(device.releaseInterface(0)),
+ assertRejectsWithNotOpenError(device.selectAlternateInterface(0, 1)),
+ assertRejectsWithNotOpenError(device.controlTransferIn({
+ requestType: 'vendor',
+ recipient: 'device',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5678
+ }, 7)),
+ assertRejectsWithNotOpenError(device.controlTransferOut({
+ requestType: 'vendor',
+ recipient: 'device',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5678
+ }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))),
+ assertRejectsWithNotOpenError(device.clearHalt('in', 1)),
+ assertRejectsWithNotOpenError(device.transferIn(1, 8)),
+ assertRejectsWithNotOpenError(
+ device.transferOut(1, new ArrayBuffer(8))),
+ assertRejectsWithNotOpenError(device.isochronousTransferIn(1, [8])),
+ assertRejectsWithNotOpenError(
+ device.isochronousTransferOut(1, new ArrayBuffer(8), [8])),
+ assertRejectsWithNotOpenError(device.reset())
+ ]));
+}, 'methods requiring it reject when the device is not open');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ assert_equals(device.configuration, null);
+ return device.open()
+ .then(() => {
+ assert_equals(device.configuration, null);
+ return device.selectConfiguration(1);
+ })
+ .then(() => {
+ assertDeviceInfoEquals(
+ device.configuration, fakeDeviceInit.configurations[0]);
+ })
+ .then(() => device.close());
+ });
+}, 'device configuration can be set and queried');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ assert_equals(device.configuration, null);
+ return device.open()
+ .then(() => assertRejectsWithError(
+ device.selectConfiguration(3), 'NotFoundError',
+ 'The configuration value provided is not supported by the device.'))
+ .then(() => device.close());
+ });
+}, 'selectConfiguration rejects on invalid configurations');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ assert_equals(device.configuration, null);
+ return device.open().then(() => Promise.all([
+ assertRejectsWithNotConfiguredError(device.claimInterface(0)),
+ assertRejectsWithNotConfiguredError(device.releaseInterface(0)),
+ assertRejectsWithNotConfiguredError(device.selectAlternateInterface(0, 1)),
+ assertRejectsWithNotConfiguredError(device.controlTransferIn({
+ requestType: 'vendor',
+ recipient: 'device',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5678
+ }, 7)),
+ assertRejectsWithNotConfiguredError(device.controlTransferOut({
+ requestType: 'vendor',
+ recipient: 'device',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5678
+ }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))),
+ assertRejectsWithNotConfiguredError(device.clearHalt('in', 1)),
+ assertRejectsWithNotConfiguredError(device.transferIn(1, 8)),
+ assertRejectsWithNotConfiguredError(
+ device.transferOut(1, new ArrayBuffer(8))),
+ assertRejectsWithNotConfiguredError(
+ device.isochronousTransferIn(1, [8])),
+ assertRejectsWithNotConfiguredError(
+ device.isochronousTransferOut(1, new ArrayBuffer(8), [8])),
+ ])).then(() => device.close());
+ });
+}, 'methods requiring it reject when the device is unconfigured');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(0))
+ .then(() => {
+ assert_true(device.configuration.interfaces[0].claimed);
+ return device.releaseInterface(0);
+ })
+ .then(() => {
+ assert_false(device.configuration.interfaces[0].claimed);
+ return device.close();
+ });
+ });
+}, 'an interface can be claimed and released');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(0))
+ .then(() => {
+ assert_true(device.configuration.interfaces[0].claimed);
+ return device.close(0);
+ })
+ .then(() => {
+ assert_false(device.configuration.interfaces[0].claimed);
+ });
+ });
+}, 'interfaces are released on close');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ const message = 'The interface number provided is not supported by the ' +
+ 'device in its current configuration.';
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => Promise.all([
+ assertRejectsWithError(
+ device.claimInterface(2), 'NotFoundError', message),
+ assertRejectsWithError(
+ device.releaseInterface(2), 'NotFoundError', message),
+ ]))
+ .then(() => device.close());
+ });
+}, 'a non-existent interface cannot be claimed or released');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.claimInterface(0)));
+ });
+}, 'claimInterface rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(0))
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.releaseInterface(0)));
+ });
+}, 'releaseInterface rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(2))
+ .then(() => device.claimInterface(0))
+ .then(() => device.selectAlternateInterface(0, 1))
+ .then(() => device.close());
+ });
+}, 'can select an alternate interface');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(2))
+ .then(() => device.claimInterface(0))
+ .then(() => assertRejectsWithError(
+ device.selectAlternateInterface(0, 2), 'NotFoundError',
+ 'The alternate setting provided is not supported by the device in ' +
+ 'its current configuration.'))
+ .then(() => device.close());
+ });
+}, 'cannot select a non-existent alternate interface');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(2))
+ .then(() => device.claimInterface(0))
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.selectAlternateInterface(0, 1)));
+ });
+}, 'selectAlternateInterface rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.controlTransferIn({
+ requestType: 'vendor',
+ recipient: 'device',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5678
+ }, 7))
+ .then(result => {
+ assert_true(result instanceof USBInTransferResult);
+ assert_equals(result.status, 'ok');
+ assert_equals(result.data.byteLength, 7);
+ assert_equals(result.data.getUint16(0), 0x07);
+ assert_equals(result.data.getUint8(2), 0x42);
+ assert_equals(result.data.getUint16(3), 0x1234);
+ assert_equals(result.data.getUint16(5), 0x5678);
+ return device.close();
+ });
+ });
+}, 'can issue IN control transfer');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.controlTransferIn({
+ requestType: 'vendor',
+ recipient: 'device',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5678
+ }, 7)));
+ });
+}, 'controlTransferIn rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.controlTransferOut({
+ requestType: 'vendor',
+ recipient: 'device',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5678
+ }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8])))
+ .then(result => {
+ assert_true(result instanceof USBOutTransferResult);
+ assert_equals(result.status, 'ok');
+ assert_equals(result.bytesWritten, 8);
+ return device.close();
+ })
+ });
+}, 'can issue OUT control transfer');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.controlTransferOut({
+ requestType: 'vendor',
+ recipient: 'device',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5678
+ }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))));
+ });
+}, 'controlTransferOut rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ let interfaceRequest = {
+ requestType: 'vendor',
+ recipient: 'interface',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5600 // Last byte of index is interface number.
+ };
+ let endpointRequest = {
+ requestType: 'vendor',
+ recipient: 'endpoint',
+ request: 0x42,
+ value: 0x1234,
+ index: 0x5681 // Last byte of index is endpoint address.
+ };
+ let data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => Promise.all([
+ assertRejectsWithError(
+ device.controlTransferIn(interfaceRequest, 7),
+ 'InvalidStateError'),
+ assertRejectsWithError(
+ device.controlTransferIn(endpointRequest, 7),
+ 'NotFoundError'),
+ assertRejectsWithError(
+ device.controlTransferOut(interfaceRequest, data),
+ 'InvalidStateError'),
+ assertRejectsWithError(
+ device.controlTransferOut(endpointRequest, data),
+ 'NotFoundError'),
+ ]))
+ .then(() => device.claimInterface(0))
+ .then(() => Promise.all([
+ device.controlTransferIn(interfaceRequest, 7).then(result => {
+ assert_true(result instanceof USBInTransferResult);
+ assert_equals(result.status, 'ok');
+ assert_equals(result.data.byteLength, 7);
+ assert_equals(result.data.getUint16(0), 0x07);
+ assert_equals(result.data.getUint8(2), 0x42);
+ assert_equals(result.data.getUint16(3), 0x1234);
+ assert_equals(result.data.getUint16(5), 0x5600);
+ }),
+ device.controlTransferIn(endpointRequest, 7).then(result => {
+ assert_true(result instanceof USBInTransferResult);
+ assert_equals(result.status, 'ok');
+ assert_equals(result.data.byteLength, 7);
+ assert_equals(result.data.getUint16(0), 0x07);
+ assert_equals(result.data.getUint8(2), 0x42);
+ assert_equals(result.data.getUint16(3), 0x1234);
+ assert_equals(result.data.getUint16(5), 0x5681);
+ }),
+ device.controlTransferOut(interfaceRequest, data),
+ device.controlTransferOut(endpointRequest, data),
+ ]))
+ .then(() => device.close());
+ });
+}, 'requests to interfaces and endpoint require an interface claim');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(0))
+ .then(() => device.clearHalt('in', 1))
+ .then(() => device.close());
+ });
+}, 'can clear a halt condition');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(0))
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.clearHalt('in', 1)));
+ });
+}, 'clearHalt rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ let data = new DataView(new ArrayBuffer(1024));
+ for (let i = 0; i < 1024; ++i)
+ data.setUint8(i, i & 0xff);
+ const notFoundMessage = 'The specified endpoint is not part of a claimed ' +
+ 'and selected alternate interface.';
+ const rangeError = 'The specified endpoint number is out of range.';
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(0))
+ .then(() => Promise.all([
+ assertRejectsWithError(device.transferIn(2, 8),
+ 'NotFoundError', notFoundMessage), // Unclaimed
+ assertRejectsWithError(device.transferIn(3, 8), 'NotFoundError',
+ notFoundMessage), // Non-existent
+ assertRejectsWithError(
+ device.transferIn(16, 8), 'IndexSizeError', rangeError),
+ assertRejectsWithError(device.transferOut(2, data),
+ 'NotFoundError', notFoundMessage), // Unclaimed
+ assertRejectsWithError(device.transferOut(3, data), 'NotFoundError',
+ notFoundMessage), // Non-existent
+ assertRejectsWithError(
+ device.transferOut(16, data), 'IndexSizeError', rangeError),
+ ]));
+ });
+}, 'transfers to unavailable endpoints are rejected');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(0))
+ .then(() => device.transferIn(1, 8))
+ .then(result => {
+ assert_true(result instanceof USBInTransferResult);
+ assert_equals(result.status, 'ok');
+ assert_equals(result.data.byteLength, 8);
+ for (let i = 0; i < 8; ++i)
+ assert_equals(result.data.getUint8(i), i, 'mismatch at byte ' + i);
+ return device.close();
+ });
+ });
+}, 'can issue IN interrupt transfer');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(1))
+ .then(() => device.transferIn(2, 1024))
+ .then(result => {
+ assert_true(result instanceof USBInTransferResult);
+ assert_equals(result.status, 'ok');
+ assert_equals(result.data.byteLength, 1024);
+ for (let i = 0; i < 1024; ++i)
+ assert_equals(result.data.getUint8(i), i & 0xff,
+ 'mismatch at byte ' + i);
+ return device.close();
+ });
+ });
+}, 'can issue IN bulk transfer');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(1))
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.transferIn(2, 1024)));
+ });
+}, 'transferIn rejects if called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(1))
+ .then(() => {
+ let data = new DataView(new ArrayBuffer(1024));
+ for (let i = 0; i < 1024; ++i)
+ data.setUint8(i, i & 0xff);
+ return device.transferOut(2, data);
+ })
+ .then(result => {
+ assert_true(result instanceof USBOutTransferResult);
+ assert_equals(result.status, 'ok');
+ assert_equals(result.bytesWritten, 1024);
+ return device.close();
+ });
+ });
+}, 'can issue OUT bulk transfer');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(1))
+ .then(() => device.claimInterface(1))
+ .then(() => {
+ let data = new DataView(new ArrayBuffer(1024));
+ for (let i = 0; i < 1024; ++i)
+ data.setUint8(i, i & 0xff);
+ return waitForDisconnect(fakeDevice)
+ .then(() => assertRejectsWithNotFoundError(device.transferOut(2, data)));
+ });
+ });
+}, 'transferOut rejects if called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(2))
+ .then(() => device.claimInterface(0))
+ .then(() => device.selectAlternateInterface(0, 1))
+ .then(() => device.isochronousTransferIn(
+ 1, [64, 64, 64, 64, 64, 64, 64, 64]))
+ .then(result => {
+ assert_true(result instanceof USBIsochronousInTransferResult);
+ assert_equals(result.data.byteLength, 64 * 8, 'buffer size');
+ assert_equals(result.packets.length, 8, 'number of packets');
+ let byteOffset = 0;
+ for (let i = 0; i < result.packets.length; ++i) {
+ assert_true(
+ result.packets[i] instanceof USBIsochronousInTransferPacket);
+ assert_equals(result.packets[i].status, 'ok');
+ assert_equals(result.packets[i].data.byteLength, 64);
+ assert_equals(result.packets[i].data.buffer, result.data.buffer);
+ assert_equals(result.packets[i].data.byteOffset, byteOffset);
+ for (let j = 0; j < 64; ++j)
+ assert_equals(result.packets[i].data.getUint8(j), j & 0xff,
+ 'mismatch at byte ' + j + ' of packet ' + i);
+ byteOffset += result.packets[i].data.byteLength;
+ }
+ return device.close();
+ });
+ });
+}, 'can issue IN isochronous transfer');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(2))
+ .then(() => device.claimInterface(0))
+ .then(() => device.selectAlternateInterface(0, 1))
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.isochronousTransferIn(
+ 1, [64, 64, 64, 64, 64, 64, 64, 64])));
+ });
+}, 'isochronousTransferIn rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(2))
+ .then(() => device.claimInterface(0))
+ .then(() => device.selectAlternateInterface(0, 1))
+ .then(() => {
+ let data = new DataView(new ArrayBuffer(64 * 8));
+ for (let i = 0; i < 8; ++i) {
+ for (let j = 0; j < 64; ++j)
+ data.setUint8(i * j, j & 0xff);
+ }
+ return device.isochronousTransferOut(
+ 1, data, [64, 64, 64, 64, 64, 64, 64, 64]);
+ })
+ .then(result => {
+ assert_true(result instanceof USBIsochronousOutTransferResult);
+ assert_equals(result.packets.length, 8, 'number of packets');
+ let byteOffset = 0;
+ for (let i = 0; i < result.packets.length; ++i) {
+ assert_true(
+ result.packets[i] instanceof USBIsochronousOutTransferPacket);
+ assert_equals(result.packets[i].status, 'ok');
+ assert_equals(result.packets[i].bytesWritten, 64);
+ }
+ return device.close();
+ });
+ });
+}, 'can issue OUT isochronous transfer');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => device.selectConfiguration(2))
+ .then(() => device.claimInterface(0))
+ .then(() => device.selectAlternateInterface(0, 1))
+ .then(() => {
+ let data = new DataView(new ArrayBuffer(64 * 8));
+ for (let i = 0; i < 8; ++i) {
+ for (let j = 0; j < 64; ++j)
+ data.setUint8(i * j, j & 0xff);
+ }
+ return waitForDisconnect(fakeDevice)
+ .then(() => assertRejectsWithNotFoundError(device.isochronousTransferOut(
+ 1, data, [64, 64, 64, 64, 64, 64, 64, 64])));
+ });
+ });
+}, 'isochronousTransferOut rejects when called on a disconnected device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device }) => {
+ return device.open().then(() => device.reset()).then(() => device.close());
+ });
+}, 'can reset the device');
+
+usb_test(() => {
+ return getFakeDevice().then(({ device, fakeDevice }) => {
+ return device.open()
+ .then(() => waitForDisconnect(fakeDevice))
+ .then(() => assertRejectsWithNotFoundError(device.reset()));
+ });
+}, 'resetDevice rejects when called on a disconnected device');
+</script>
diff --git a/tests/wpt/web-platform-tests/webusb/usbInTransferResult.https.html b/tests/wpt/web-platform-tests/webusb/usbInTransferResult.https.html
new file mode 100644
index 00000000000..c176d28108a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usbInTransferResult.https.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+test(t => {
+ let data_view = new DataView(Uint8Array.from([1, 2, 3, 4]).buffer);
+ let result = new USBInTransferResult('ok', data_view);
+ assert_equals(result.status, 'ok');
+ assert_equals(result.data.getInt32(0), 16909060);
+}, 'Can construct a USBInTransferResult');
+
+test(t => {
+ let result = new USBInTransferResult('stall');
+ assert_equals(result.status, 'stall');
+ assert_equals(result.data, null);
+
+ result = new USBInTransferResult('babble', null);
+ assert_equals(result.status, 'babble');
+ assert_equals(result.data, null);
+}, 'Can construct a USBInTransferResult without a DataView');
+
+test(t => {
+ assert_throws(TypeError(), () => new USBInTransferResult('invalid_status'));
+}, 'Cannot construct USBInTransferResult with an invalid status');
+
+test(t => {
+ assert_throws(TypeError(), () => new USBInTransferResult());
+}, 'Cannot construct USBInTransferResult without a status');
+</script>
diff --git a/tests/wpt/web-platform-tests/webusb/usbIsochronousInTransferPacket.https.html b/tests/wpt/web-platform-tests/webusb/usbIsochronousInTransferPacket.https.html
new file mode 100644
index 00000000000..c2aa78a0662
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usbIsochronousInTransferPacket.https.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+test(t => {
+ let data_view = new DataView(Uint8Array.from([1, 2, 3, 4]).buffer);
+ let packet = new USBIsochronousInTransferPacket('ok', data_view);
+ assert_equals(packet.status, 'ok');
+ assert_equals(packet.data.getInt32(0), 16909060);
+}, 'Can construct a USBIsochronousInTransferPacket');
+
+test(t => {
+ let packet = new USBIsochronousInTransferPacket('stall');
+ assert_equals(packet.status, 'stall');
+ assert_equals(packet.data, null);
+
+ packet = new USBIsochronousInTransferPacket('stall', null);
+ assert_equals(packet.status, 'stall');
+ assert_equals(packet.data, null);
+}, 'Can construct a USBIsochronousInTransferPacket without a DataView');
+
+test(t => {
+ assert_throws(TypeError(), () => {
+ new USBIsochronousInTransferPacket('invalid_status');
+ });
+}, 'Cannot construct USBIsochronousInTransferPacket with an invalid status');
+
+test(t => {
+ assert_throws(TypeError(), () => new USBIsochronousInTransferPacket());
+}, 'Cannot construct USBIsochronousInTransferPacket without a status');
+</script>
diff --git a/tests/wpt/web-platform-tests/webusb/usbIsochronousInTransferResult.https.html b/tests/wpt/web-platform-tests/webusb/usbIsochronousInTransferResult.https.html
new file mode 100644
index 00000000000..5cad38aff9a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usbIsochronousInTransferResult.https.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+test(t => {
+ let data_view = new DataView(Uint8Array.from([1, 2, 3, 4]).buffer);
+ let packet_data_view = new DataView(data_view.buffer);
+ let packets = [
+ new USBIsochronousInTransferPacket('ok', packet_data_view),
+ new USBIsochronousInTransferPacket('stall')
+ ];
+
+ let result = new USBIsochronousInTransferResult(packets, data_view);
+ assert_equals(result.data.getInt32(0), 16909060);
+ assert_equals(result.packets.length, 2);
+ assert_equals(result.packets[0].status, 'ok');
+ assert_equals(result.packets[0].data.getInt32(0), 16909060);
+ assert_equals(result.packets[1].status, 'stall');
+ assert_equals(result.packets[1].data, null);
+}, 'Can construct a USBIsochronousInTransferResult');
+
+test(t => {
+ let packets = [
+ new USBIsochronousInTransferPacket('stall'),
+ new USBIsochronousInTransferPacket('stall')
+ ];
+ let result = new USBIsochronousInTransferResult(packets);
+ assert_equals(result.data, null);
+ assert_equals(result.packets.length, 2);
+ assert_equals(result.packets[0].status, 'stall');
+ assert_equals(result.packets[0].data, null);
+ assert_equals(result.packets[1].status, 'stall');
+ assert_equals(result.packets[1].data, null);
+}, 'Can construct a USBIsochronousInTransferResult without a DataView');
+
+test(t => {
+ assert_throws(TypeError(), () => new USBIsochronousInTransferResult());
+}, 'Cannot construct a USBIsochronousInTransferResult without packets');
+</script>
diff --git a/tests/wpt/web-platform-tests/webusb/usbIsochronousOutTransferPacket.https.html b/tests/wpt/web-platform-tests/webusb/usbIsochronousOutTransferPacket.https.html
new file mode 100644
index 00000000000..137d0fba6dc
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usbIsochronousOutTransferPacket.https.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+test(t => {
+ let packet = new USBIsochronousOutTransferPacket('ok', 42);
+ assert_equals(packet.status, 'ok');
+ assert_equals(packet.bytesWritten, 42);
+
+ packet = new USBIsochronousOutTransferPacket('stall');
+ assert_equals(packet.status, 'stall');
+ assert_equals(packet.bytesWritten, 0);
+}, 'Can construct USBIsochronousOutTransferPacket');
+
+test(t => {
+ assert_throws(TypeError(), () => {
+ new USBIsochronousOutTransferPacket('invalid_status');
+ });
+}, 'Cannot construct USBIsochronousOutTransferPacket with an invalid status');
+
+test(t => {
+ assert_throws(TypeError(), () => new USBIsochronousOutTransferPacket());
+}, 'Cannot construct USBIsochronousOutTransferPacket without a status');
+</script>
diff --git a/tests/wpt/web-platform-tests/webusb/usbIsochronousOutTransferResult.https.html b/tests/wpt/web-platform-tests/webusb/usbIsochronousOutTransferResult.https.html
new file mode 100644
index 00000000000..ae105caa0c7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usbIsochronousOutTransferResult.https.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+test(t => {
+ let packets = [
+ new USBIsochronousOutTransferPacket('ok', 42),
+ new USBIsochronousOutTransferPacket('stall')
+ ];
+
+ let result = new USBIsochronousOutTransferResult(packets);
+ assert_equals(result.packets.length, 2);
+ assert_equals(result.packets[0].status, 'ok');
+ assert_equals(result.packets[0].bytesWritten, 42);
+ assert_equals(result.packets[1].status, 'stall');
+ assert_equals(result.packets[1].bytesWritten, 0);
+}, 'Can construct a USBIsochronousOutTransferResult');
+
+test(t => {
+ assert_throws(TypeError(), () => new USBIsochronousOutTransferResult());
+}, 'Cannot construct a USBIsochronousOutTransferResult without packets');
+</script>
diff --git a/tests/wpt/web-platform-tests/webusb/usbOutTransferResult.https.html b/tests/wpt/web-platform-tests/webusb/usbOutTransferResult.https.html
new file mode 100644
index 00000000000..7d6a63c782d
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webusb/usbOutTransferResult.https.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+'use strict';
+
+test(t => {
+ let result = new USBOutTransferResult('ok', 42);
+ assert_equals(result.status, 'ok');
+ assert_equals(result.bytesWritten, 42);
+
+ result = new USBOutTransferResult('stall');
+ assert_equals(result.status, 'stall');
+ assert_equals(result.bytesWritten, 0);
+}, 'Can construct USBOutTransferResult');
+
+test(t => {
+ assert_throws(TypeError(), () => new USBOutTransferResult('invalid_status'));
+}, 'Cannot construct USBOutTransferResult with an invalid status');
+
+test(t => {
+ assert_throws(TypeError(), () => new USBOutTransferResult());
+}, 'Cannot construct USBOutTransferResult without a status');
+</script>
diff --git a/tests/wpt/web-platform-tests/webvr/idlharness.html b/tests/wpt/web-platform-tests/webvr/idlharness.html
index b7158117c60..ecb89f37565 100644
--- a/tests/wpt/web-platform-tests/webvr/idlharness.html
+++ b/tests/wpt/web-platform-tests/webvr/idlharness.html
@@ -87,11 +87,11 @@ interface VRDisplay : EventTarget {
/**
* Begin presenting to the VRDisplay. Must be called in response to a user gesture.
- * Repeat calls while already presenting will update the VRLayers being displayed.
+ * Repeat calls while already presenting will update the layers being displayed.
* If the number of values in the leftBounds/rightBounds arrays is not 0 or 4 for any of the passed layers the promise is rejected
* If the source of any of the layers is not present (null), the promise is rejected.
*/
- Promise<void> requestPresent(sequence<VRLayer> layers);
+ Promise<void> requestPresent(sequence<VRLayerInit> layers);
/**
* Stops presenting to the VRDisplay.
@@ -101,10 +101,10 @@ interface VRDisplay : EventTarget {
/**
* Get the layers currently being presented.
*/
- sequence<VRLayer> getLayers();
+ sequence<VRLayerInit> getLayers();
/**
- * The VRLayer provided to the VRDisplay will be captured and presented
+ * The layer provided to the VRDisplay will be captured and presented
* in the HMD. Calling this function has the same effect on the source
* canvas as any other operation that uses its source image, and canvases
* created without preserveDrawingBuffer set to true will be cleared.
@@ -115,7 +115,7 @@ interface VRDisplay : EventTarget {
typedef (HTMLCanvasElement or
OffscreenCanvas) VRSource;
-dictionary VRLayer {
+dictionary VRLayerInit {
VRSource? source = null;
sequence<float> leftBounds = [];
diff --git a/tests/wpt/web-platform-tests/webvr/webvr-disabled-by-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/webvr/webvr-disabled-by-feature-policy.https.sub.html
new file mode 100644
index 00000000000..567499cefad
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvr/webvr-disabled-by-feature-policy.https.sub.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+
+ <script>
+ 'use strict';
+ var same_origin_src = '/feature-policy/resources/feature-policy-webvr.html';
+ var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+ var header = 'Feature-Policy header vr "none"';
+
+ promise_test(() => {
+ return navigator.getVRDisplays().then(() => {
+ assert_unreached('expected promise to reject');
+ }, error => {
+ });
+ }, header + ' disallows the top-level document.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'navigator.getVRDisplays()', t, same_origin_src,
+ expect_feature_unavailable_default);
+ }, header + ' disallows same-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'navigator.getVRDisplays()', t, cross_origin_src,
+ expect_feature_unavailable_default);
+ }, header + ' disallows cross-origin iframes.');
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/webvr/webvr-disabled-by-feature-policy.https.sub.html.headers b/tests/wpt/web-platform-tests/webvr/webvr-disabled-by-feature-policy.https.sub.html.headers
new file mode 100644
index 00000000000..d021af75636
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvr/webvr-disabled-by-feature-policy.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: vr 'none'
diff --git a/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html b/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html
new file mode 100644
index 00000000000..da01dafd1c1
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+ <script>
+ 'use strict';
+ var relative_path = '/feature-policy/resources/feature-policy-webvr.html';
+ var base_src = '/feature-policy/resources/redirect-on-load.html#';
+ var same_origin_src = base_src + relative_path;
+ var cross_origin_src = base_src + 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ relative_path;
+ var header = 'Feature-Policy allow="vr" attribute';
+
+ async_test(t => {
+ test_feature_availability(
+ 'navigator.getVRDisplays()', t, same_origin_src,
+ expect_feature_available_default, 'vr');
+ }, header + ' allows same-origin relocation');
+
+ async_test(t => {
+ test_feature_availability(
+ 'navigator.getVRDisplays()', t, cross_origin_src,
+ expect_feature_unavailable_default, 'vr');
+ }, header + ' disallows cross-origin relocation');
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy-attribute.https.sub.html b/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy-attribute.https.sub.html
new file mode 100644
index 00000000000..d715f902138
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy-attribute.https.sub.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+ <script>
+ 'use strict';
+ var same_origin_src = '/feature-policy/resources/feature-policy-webvr.html';
+ var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+ var header = 'Feature-Policy allow="vr" attribute';
+
+ async_test(t => {
+ test_feature_availability(
+ 'navigator.getVRDisplays()', t, same_origin_src,
+ expect_feature_available_default, 'vr');
+ }, header + ' allows same-origin iframe');
+
+ async_test(t => {
+ test_feature_availability(
+ 'navigator.getVRDisplays()', t, cross_origin_src,
+ expect_feature_available_default, 'vr');
+ }, header + ' allows cross-origin iframe');
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy.https.sub.html
new file mode 100644
index 00000000000..ee0256684f9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy.https.sub.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+
+ <script>
+ 'use strict';
+ var same_origin_src = '/feature-policy/resources/feature-policy-webvr.html';
+ var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+ var header = 'Feature-Policy header vr *';
+
+ promise_test(
+ () => navigator.getVRDisplays(),
+ header + ' allows the top-level document.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'navigator.getVRDisplays()', t, same_origin_src,
+ expect_feature_available_default);
+ }, header + ' allows same-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'navigator.getVRDisplays()', t, cross_origin_src,
+ expect_feature_available_default);
+ }, header + ' allows cross-origin iframes.');
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy.https.sub.html.headers b/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy.https.sub.html.headers
new file mode 100644
index 00000000000..e7427ee8c7e
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvr/webvr-enabled-by-feature-policy.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: vr *
diff --git a/tests/wpt/web-platform-tests/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html b/tests/wpt/web-platform-tests/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html
new file mode 100644
index 00000000000..bd7e82f6068
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<body>
+ <script src=/resources/testharness.js></script>
+ <script src=/resources/testharnessreport.js></script>
+ <script src=/feature-policy/resources/featurepolicy.js></script>
+
+ <script>
+ 'use strict';
+ var same_origin_src = '/feature-policy/resources/feature-policy-webvr.html';
+ var cross_origin_src = 'https://{{domains[www]}}:{{ports[https][0]}}' +
+ same_origin_src;
+ var header = 'Feature-Policy header vr "self"';
+
+ promise_test(
+ () => navigator.getVRDisplays(),
+ header + ' allows the top-level document.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'navigator.getVRDisplays()', t, same_origin_src,
+ expect_feature_available_default);
+ }, header + ' allows same-origin iframes.');
+
+ async_test(t => {
+ test_feature_availability(
+ 'navigator.getVRDisplays()', t, cross_origin_src,
+ expect_feature_unavailable_default);
+ }, header + ' disallows cross-origin iframes.');
+ </script>
+</body>
diff --git a/tests/wpt/web-platform-tests/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html.headers b/tests/wpt/web-platform-tests/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html.headers
new file mode 100644
index 00000000000..87d343d8f84
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html.headers
@@ -0,0 +1 @@
+Feature-Policy: vr 'self'
diff --git a/tests/wpt/web-platform-tests/webvtt/OWNERS b/tests/wpt/web-platform-tests/webvtt/OWNERS
index fb085bbd546..60dda3bacc2 100644
--- a/tests/wpt/web-platform-tests/webvtt/OWNERS
+++ b/tests/wpt/web-platform-tests/webvtt/OWNERS
@@ -1,3 +1,2 @@
@silviapfeiffer
-@zcorpan
@BenjaminSchaaf
diff --git a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/align.html b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/align.html
index f06a172bf77..e3a920ae944 100644
--- a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/align.html
+++ b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/align.html
@@ -3,6 +3,7 @@
<link rel="help" href="https://w3c.github.io/webvtt/#dom-vttcue-align">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
+<script src=common.js></script>
<div id=log></div>
<script>
test(function(){
@@ -56,10 +57,10 @@ t_parsed.step(function(){
t.onerror = this.step_func(function() {
assert_unreached('got error event');
});
- t.src = 'data:text/vtt,'+encodeURIComponent('WEBVTT\n\n00:00:00.000 --> 00:00:00.001\ntest\n\n'+
- '00:00:00.000 --> 00:00:00.001 align:start\ntest\n\n'+
- '00:00:00.000 --> 00:00:00.001 align:center\ntest\n\n'+
- '00:00:00.000 --> 00:00:00.001 align:end\ntest');
+ t.src = make_vtt_track('WEBVTT\n\n00:00:00.000 --> 00:00:00.001\ntest\n\n'+
+ '00:00:00.000 --> 00:00:00.001 align:start\ntest\n\n'+
+ '00:00:00.000 --> 00:00:00.001 align:center\ntest\n\n'+
+ '00:00:00.000 --> 00:00:00.001 align:end\ntest', this);
t.track.mode = 'showing';
video.appendChild(t);
});
diff --git a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/common.js b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/common.js
new file mode 100644
index 00000000000..2c39352a844
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/common.js
@@ -0,0 +1,8 @@
+function make_vtt_track(contents, test) {
+ var track_blob = new Blob([contents], { type: 'text/vtt' });
+ var track_url = URL.createObjectURL(track_blob);
+ test.add_cleanup(function() {
+ URL.revokeObjectURL(track_url);
+ });
+ return track_url;
+}
diff --git a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/line.html b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/line.html
index e0c4ddc143d..dcf46db0523 100644
--- a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/line.html
+++ b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/line.html
@@ -3,6 +3,7 @@
<link rel="help" href="https://w3c.github.io/webvtt/#dom-vttcue-line">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
+<script src=common.js></script>
<div id=log></div>
<script>
test(function(){
@@ -55,9 +56,9 @@ t_parsed.step(function(){
t.onerror = this.step_func(function() {
assert_unreached('got error event');
});
- t.src = 'data:text/vtt,'+encodeURIComponent('WEBVTT\n\n00:00:00.000 --> 00:00:00.001\ntest\n\n'+
- '00:00:00.000 --> 00:00:00.001 line:0\ntest\n\n'+
- '00:00:00.000 --> 00:00:00.001 line:0%\ntest');
+ t.src = make_vtt_track('WEBVTT\n\n00:00:00.000 --> 00:00:00.001\ntest\n\n'+
+ '00:00:00.000 --> 00:00:00.001 line:0\ntest\n\n'+
+ '00:00:00.000 --> 00:00:00.001 line:0%\ntest', this);
t.track.mode = 'showing';
video.appendChild(t);
});
diff --git a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/snapToLines.html b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/snapToLines.html
index ac9f843dbba..b3f9f34f10b 100644
--- a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/snapToLines.html
+++ b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/snapToLines.html
@@ -3,6 +3,7 @@
<link rel="help" href="https://w3c.github.io/webvtt/#dom-vttcue-snaptolines">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
+<script src=common.js></script>
<div id=log></div>
<script>
setup(function(){
@@ -90,9 +91,9 @@ t_parsed.step(function(){
t.onerror = this.step_func(function() {
assert_unreached('got error event');
});
- t.src = 'data:text/vtt,'+encodeURIComponent('WEBVTT\n\n00:00:00.000 --> 00:00:00.001\ntest\n\n'+
- '00:00:00.000 --> 00:00:00.001 line:0\ntest\n\n'+
- '00:00:00.000 --> 00:00:00.001 line:0%\ntest');
+ t.src = make_vtt_track('WEBVTT\n\n00:00:00.000 --> 00:00:00.001\ntest\n\n'+
+ '00:00:00.000 --> 00:00:00.001 line:0\ntest\n\n'+
+ '00:00:00.000 --> 00:00:00.001 line:0%\ntest', this);
t.track.mode = 'showing';
video.appendChild(t);
});
diff --git a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/text.html b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/text.html
index 8ceb3a62718..a61c600db91 100644
--- a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/text.html
+++ b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/text.html
@@ -3,6 +3,7 @@
<link rel="help" href="https://w3c.github.io/webvtt/#dom-vttcue-text">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
+<script src=common.js></script>
<div id=log></div>
<script>
setup(function(){
@@ -32,8 +33,8 @@ t_parsed.step(function(){
t.onerror = this.step_func(function() {
assert_unreached('got error event');
});
- t.src = 'data:text/vtt,'+encodeURIComponent('WEBVTT\n\n00:00:00.000 --> 00:00:00.001\n'+
- '\n\nfoobar\n00:00:00.000 --> 00:00:00.001\ntest');
+ t.src = make_vtt_track('WEBVTT\n\n00:00:00.000 --> 00:00:00.001\n'+
+ '\n\nfoobar\n00:00:00.000 --> 00:00:00.001\ntest', this);
t.track.mode = 'showing';
video.appendChild(t);
});
diff --git a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/vertical.html b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/vertical.html
index 63ca161c822..8b93f6b003c 100644
--- a/tests/wpt/web-platform-tests/webvtt/api/VTTCue/vertical.html
+++ b/tests/wpt/web-platform-tests/webvtt/api/VTTCue/vertical.html
@@ -3,6 +3,7 @@
<link rel="help" href="https://w3c.github.io/webvtt/#dom-vttcue-vertical">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
+<script src=common.js></script>
<div id=log></div>
<script>
setup(function(){
@@ -47,9 +48,9 @@ t_parsed.step(function(){
t.onerror = this.step_func(function() {
assert_unreached('got error event');
});
- t.src = 'data:text/vtt,'+encodeURIComponent('WEBVTT\n\n00:00:00.000 --> 00:00:00.001\ntest\n\n'+
- '00:00:00.000 --> 00:00:00.001 vertical:rl\ntest\n\n'+
- '00:00:00.000 --> 00:00:00.001 vertical:lr\ntest');
+ t.src = make_vtt_track('WEBVTT\n\n00:00:00.000 --> 00:00:00.001\ntest\n\n'+
+ '00:00:00.000 --> 00:00:00.001 vertical:rl\ntest\n\n'+
+ '00:00:00.000 --> 00:00:00.001 vertical:lr\ntest', this);
t.track.mode = 'showing';
video.appendChild(t);
});
diff --git a/tests/wpt/web-platform-tests/webvtt/api/VTTRegion/id.html b/tests/wpt/web-platform-tests/webvtt/api/VTTRegion/id.html
new file mode 100644
index 00000000000..1eabac2d168
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvtt/api/VTTRegion/id.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<title>VTTRegion.id</title>
+<link rel="help" href="https://w3c.github.io/webvtt/#dom-vttregion-id">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<script>
+test(function() {
+ var region = new VTTRegion();
+ assert_true('id' in region, 'id is not supported');
+
+ assert_equals(region.id, '', 'initial value');
+
+ region.id = '1';
+ assert_equals(region.id, '1', 'value after setting to "1"');
+
+ region.id = '';
+ assert_equals(region.id, '', 'value after setting to the empty string');
+
+}, document.title + ' script-created region');
+</script>
diff --git a/tests/wpt/web-platform-tests/webvtt/api/historical.html b/tests/wpt/web-platform-tests/webvtt/api/historical.html
new file mode 100644
index 00000000000..8f6c09bf526
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvtt/api/historical.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<title>Historical WebVTT APIs must not be supported</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+// Also see /html/semantics/embedded-content/media-elements/historical.html
+
+[
+ // https://github.com/w3c/webvtt/pull/31
+ ['VTTCue', 'regionId'],
+ ['TextTrack', 'regions'],
+ ['TextTrack', 'addRegion'],
+ ['TextTrack', 'removeRegion'],
+ ['VTTRegion', 'track'],
+ // id re-introduced in https://github.com/w3c/webvtt/pull/349/files
+
+].forEach(function(feature) {
+ var interf = feature[0];
+ var member = feature[1];
+ test(function() {
+ assert_true(interf in window, interf + ' is not supported');
+ assert_false(member in window[interf].prototype);
+ }, interf + ' ' + member + ' member must be nuked');
+});
+
+[
+ // https://github.com/w3c/webvtt/pull/31
+ 'VTTRegionList',
+
+].forEach(function(interf) {
+ test(function() {
+ assert_false(interf in window);
+ }, interf + ' interface must be nuked');
+});
+</script>
diff --git a/tests/wpt/web-platform-tests/webvtt/api/interfaces.html b/tests/wpt/web-platform-tests/webvtt/api/interfaces.html
index d4565bb8d42..5e112dafd2e 100644
--- a/tests/wpt/web-platform-tests/webvtt/api/interfaces.html
+++ b/tests/wpt/web-platform-tests/webvtt/api/interfaces.html
@@ -123,7 +123,8 @@ enum DirectionSetting { "" /* horizontal */, "rl", "lr" };
enum LineAlignSetting { "start", "center", "end" };
enum PositionAlignSetting { "line-left", "center", "line-right", "auto" };
enum AlignSetting { "start", "center", "end", "left", "right" };
-[Constructor(double startTime, double endTime, DOMString text)]
+[Exposed=Window,
+ Constructor(double startTime, double endTime, DOMString text)]
interface VTTCue : TextTrackCue {
attribute VTTRegion? region;
attribute DirectionSetting vertical;
@@ -139,8 +140,10 @@ interface VTTCue : TextTrackCue {
};
enum ScrollSetting { "" /* none */, "up" };
-[Constructor]
+[Exposed=Window,
+ Constructor]
interface VTTRegion {
+ attribute DOMString id;
attribute double width;
attribute long lines;
attribute double regionAnchorX;
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/buildtests.py b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/buildtests.py
index 5ad788bc088..2152055000b 100644
--- a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/buildtests.py
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/buildtests.py
@@ -1,11 +1,13 @@
-#!/usr/bin/python
+#!/usr/bin/python3
import os
-import urllib
+import urllib.parse
import hashlib
-doctmpl = """<!doctype html>
+doctmpl = """\
+<!doctype html>
<title>WebVTT cue data parser test %s</title>
+<link rel="help" href="https://w3c.github.io/webvtt/#cue-text-parsing-rules">
<style>video { display:none }</style>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
@@ -17,51 +19,53 @@ doctmpl = """<!doctype html>
runTests([
%s
]);
-</script>"""
+</script>
+"""
testobj = "{name:'%s', input:'%s', expected:'%s'}"
def appendtest(tests, input, expected):
- tests.append(testobj % (hashlib.sha1(input).hexdigest(), urllib.quote(input[:-1]), urllib.quote(expected[:-1])))
+ tests.append(testobj % (hashlib.sha1(input.encode('UTF-8')).hexdigest(), urllib.parse.quote(input[:-1]), urllib.parse.quote(expected[:-1])))
files = os.listdir('dat/')
for file in files:
if os.path.isdir('dat/'+file) or file[0] == ".":
continue
+
tests = []
input = ""
expected = ""
state = ""
- f = open('dat/'+file, "r")
- while 1:
- line = f.readline()
- if not line:
- if state != "":
- appendtest(tests, input, expected)
- input = ""
- expected = ""
- state = ""
- break
- if line[0] == "#":
- state = line
- if line == "#document-fragment\n":
- expected = expected + line
- elif state == "#data\n":
- input = input + line
- elif state == "#errors\n":
- pass
- elif state == "#document-fragment\n":
- if line == "\n":
- appendtest(tests, input, expected)
- input = ""
- expected = ""
- state = ""
+ with open('dat/'+file, "r") as f:
+ while True:
+ line = f.readline()
+ if not line:
+ if state != "":
+ appendtest(tests, input, expected)
+ input = ""
+ expected = ""
+ state = ""
+ break
+
+ if line[0] == "#":
+ state = line
+ if line == "#document-fragment\n":
+ expected += bytes(line, 'UTF-8').decode('unicode-escape')
+ elif state == "#data\n":
+ input += bytes(line, 'UTF-8').decode('unicode-escape')
+ elif state == "#errors\n":
+ pass
+ elif state == "#document-fragment\n":
+ if line == "\n":
+ appendtest(tests, input, expected)
+ input = ""
+ expected = ""
+ state = ""
+ else:
+ expected += bytes(line, 'UTF-8').decode('unicode-escape')
else:
- expected = expected + line
- else:
- raise Exception("failed to parse file "+file+" line:"+line+" (state: "+state+")")
- f.close()
- barename = file.replace(".dat", "")
- out = open('tests/'+barename+".html", "w")
- out.write(doctmpl % (barename, ",\n".join(tests)))
- out.close()
+ raise Exception("failed to parse file %s:%s (state: %s)" % (file, line, state))
+
+ name = os.path.splitext(file)[0]
+ with open('tests/'+name+".html", "w") as out:
+ out.write(doctmpl % (name, ",\n".join(tests)))
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/common.js b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/common.js
index 543fe46556f..c72bdc06d91 100644
--- a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/common.js
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/common.js
@@ -154,7 +154,14 @@ function runTests(tests) {
t.test_id = test.name;
t.url_encoded_input = test.input;
t.expected = expected;
- track.src = 'data:text/vtt,'+encodeURIComponent('WEBVTT\n\n00:00.000 --> 00:01.000\n')+test.input;
+ var track_blob = new Blob(['WEBVTT\n\n00:00.000 --> 00:01.000\n',
+ decodeURIComponent(test.input)],
+ { type: 'text/vtt' });
+ var track_url = URL.createObjectURL(track_blob);;
+ track.src = track_url;
+ t.add_cleanup(function() {
+ URL.revokeObjectURL(track_url);
+ });
track['default'] = true;
track.kind = 'subtitles';
track.onload = t.step_func(trackLoaded);
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/entities.dat b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/entities.dat
index cddcb27ffaa..6522e3f5b8d 100644
--- a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/entities.dat
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/entities.dat
@@ -8,7 +8,7 @@
&amp
#errors
#document-fragment
-| "&amp"
+| "&"
#data
&amp;
@@ -20,7 +20,7 @@
&AMP;
#errors
#document-fragment
-| "&AMP;"
+| "&"
#data
&lt;
@@ -38,31 +38,31 @@
a&lrm;b
#errors
#document-fragment
-| "a‎b"
+| "a\u200Eb"
#data
a&rlm;b
#errors
#document-fragment
-| "a‏b"
+| "a\u200Fb"
#data
&quot;
#errors
#document-fragment
-| "&quot;"
+| "\u0022"
#data
&nbsp;
#errors
#document-fragment
-| " "
+| "\u00A0"
#data
&copy;
#errors
#document-fragment
-| "&copy;"
+| "\u00A9"
#data
&&
@@ -99,16 +99,52 @@ a&rlm;b
&#32;
#errors
#document-fragment
-| "&#32;"
+| " "
#data
&#x20;
#errors
#document-fragment
-| "&#x20;"
+| " "
#data
&;
#errors
#document-fragment
| "&;"
+
+#data
+&ClockwiseContourIntegral;
+#errors
+#document-fragment
+| "\u2232"
+
+#data
+&nsubE;
+#errors
+#document-fragment
+| "\u2AC5\u0338"
+
+#data
+&notin;
+#errors
+#document-fragment
+| "\u2209"
+
+#data
+&not;
+#errors
+#document-fragment
+| "\u00AC"
+
+#data
+&not
+#errors
+#document-fragment
+| "\u00AC"
+
+#data
+&notit;
+#errors
+#document-fragment
+| "\u00ACit;"
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/tags.dat b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/tags.dat
index 425af32e281..0ef77a09a15 100644
--- a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/tags.dat
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/tags.dat
@@ -9,18 +9,17 @@
#document-fragment
#data
-<
+<\t
#errors
#document-fragment
#data
-<
-
+<\n
#errors
#document-fragment
#data
-<
+<\x20
#errors
#document-fragment
@@ -54,3 +53,162 @@ c>x
#document-fragment
| <span>
| "x"
+
+#data
+<c>test
+#errors
+#document-fragment
+| <span>
+| "test"
+
+#data
+a<c.d e>b</c>c
+#errors
+#document-fragment
+| "a"
+| <span>
+| class="d"
+| "b"
+| "c"
+
+#data
+<i>test
+#errors
+#document-fragment
+| <i>
+| "test"
+
+#data
+a<i.d e>b</i>c
+#errors
+#document-fragment
+| "a"
+| <i>
+| class="d"
+| "b"
+| "c"
+
+#data
+<b>test
+#errors
+#document-fragment
+| <b>
+| "test"
+
+#data
+a<b.d e>b</b>c
+#errors
+#document-fragment
+| "a"
+| <b>
+| class="d"
+| "b"
+| "c"
+
+#data
+<u>test
+#errors
+#document-fragment
+| <u>
+| "test"
+
+#data
+a<u.d e>b</u>c
+#errors
+#document-fragment
+| "a"
+| <u>
+| class="d"
+| "b"
+| "c"
+
+#data
+<ruby>test
+#errors
+#document-fragment
+| <ruby>
+| "test"
+
+#data
+a<ruby.f g>b<rt.h j>c</rt>d</ruby>e
+#errors
+#document-fragment
+| "a"
+| <ruby>
+| class="f"
+| "b"
+| <rt>
+| class="h"
+| "c"
+| "d"
+| "e"
+
+#data
+<rt>test
+#errors
+#document-fragment
+| "test"
+
+#data
+<v>test
+#errors
+#document-fragment
+| <span>
+| title=""
+| "test"
+
+#data
+<v a>test
+#errors
+#document-fragment
+| <span>
+| title="a"
+| "test"
+
+#data
+<v a b>test
+#errors
+#document-fragment
+| <span>
+| title="a b"
+| "test"
+
+#data
+<v.a>test
+#errors
+#document-fragment
+| <span>
+| class="a"
+| title=""
+| "test"
+
+#data
+<v.a.b>test
+#errors
+#document-fragment
+| <span>
+| class="a b"
+| title=""
+| "test"
+
+#data
+a<v.d e>b</v>c
+#errors
+#document-fragment
+| "a"
+| <span>
+| class="d"
+| title="e"
+| "b"
+| "c"
+
+#data
+a<lang.d e>b</lang>c
+#errors
+#document-fragment
+| "a"
+| <span>
+| class="d"
+| lang="e"
+| "b"
+| "c"
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/text.dat b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/text.dat
new file mode 100644
index 00000000000..e4129a2ec94
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/text.dat
@@ -0,0 +1,29 @@
+#data
+text
+#errors
+#document-fragment
+| "text"
+
+#data
+text1\ntext2
+#errors
+#document-fragment
+| "text1\ntext2"
+
+#data
+foo\x00bar
+#errors
+#document-fragment
+| "foo\uFFFDbar"
+
+#data
+\u2713
+#errors
+#document-fragment
+| "\u2713"
+
+#data
+text1\n\ntext2
+#errors
+#document-fragment
+| "text1"
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/timestamps.dat b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/timestamps.dat
index ba0f686ae95..a3aea9af6c2 100644
--- a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/timestamps.dat
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/timestamps.dat
@@ -14,6 +14,11 @@
#document-fragment
#data
+<00:\x0000:00.500>
+#errors
+#document-fragment
+
+#data
<00:00.500
#errors
#document-fragment
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/tree-building.dat b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/tree-building.dat
index 08410d1ffad..48d7ab20bf8 100644
--- a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/tree-building.dat
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/dat/tree-building.dat
@@ -5,47 +5,6 @@ test
| "test"
#data
-<c>test
-#errors
-#document-fragment
-| <span>
-| "test"
-
-#data
-<i>test
-#errors
-#document-fragment
-| <i>
-| "test"
-
-#data
-<b>test
-#errors
-#document-fragment
-| <b>
-| "test"
-
-#data
-<u>test
-#errors
-#document-fragment
-| <u>
-| "test"
-
-#data
-<ruby>test
-#errors
-#document-fragment
-| <ruby>
-| "test"
-
-#data
-<rt>test
-#errors
-#document-fragment
-| "test"
-
-#data
<ruby>test<rt>test
#errors
#document-fragment
@@ -127,45 +86,3 @@ test
| <b>
| "test"
| "test"
-
-#data
-<v>test
-#errors
-#document-fragment
-| <span>
-| title=""
-| "test"
-
-#data
-<v a>test
-#errors
-#document-fragment
-| <span>
-| title="a"
-| "test"
-
-#data
-<v a b>test
-#errors
-#document-fragment
-| <span>
-| title="a b"
-| "test"
-
-#data
-<v.a>test
-#errors
-#document-fragment
-| <span>
-| class="a"
-| title=""
-| "test"
-
-#data
-<v.a.b>test
-#errors
-#document-fragment
-| <span>
-| class="a b"
-| title=""
-| "test"
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/entities.html b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/entities.html
index 2568258a266..dbae784de1e 100644
--- a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/entities.html
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/entities.html
@@ -1,5 +1,6 @@
<!doctype html>
<title>WebVTT cue data parser test entities</title>
+<link rel="help" href="https://w3c.github.io/webvtt/#cue-text-parsing-rules">
<style>video { display:none }</style>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
@@ -10,23 +11,29 @@
<script>
runTests([
{name:'3686fc0cdc60dc536e75df054b0bd372273db2cc', input:'%26', expected:'%23document-fragment%0A%7C%20%22%26%22'},
-{name:'f1869f6e2853635eec81cc3afa3e2b8148ccbdc0', input:'%26amp', expected:'%23document-fragment%0A%7C%20%22%26amp%22'},
+{name:'f1869f6e2853635eec81cc3afa3e2b8148ccbdc0', input:'%26amp', expected:'%23document-fragment%0A%7C%20%22%26%22'},
{name:'92d76530d723b6b4e4ef8280c01cf1c80f9bebdb', input:'%26amp%3B', expected:'%23document-fragment%0A%7C%20%22%26%22'},
-{name:'261cd4e9df4a12535b66a0c39e9635aab2bb19aa', input:'%26AMP%3B', expected:'%23document-fragment%0A%7C%20%22%26AMP%3B%22'},
+{name:'261cd4e9df4a12535b66a0c39e9635aab2bb19aa', input:'%26AMP%3B', expected:'%23document-fragment%0A%7C%20%22%26%22'},
{name:'1a2269cdb73bf97ec6a99b0edabfe646c471b67e', input:'%26lt%3B', expected:'%23document-fragment%0A%7C%20%22%3C%22'},
{name:'44ceb90884cceeeccb4f7024e3598f7dc5ceebfa', input:'%26gt%3B', expected:'%23document-fragment%0A%7C%20%22%3E%22'},
{name:'05def72af03fc2b1617da950d871b9fd0ba20e5a', input:'a%26lrm%3Bb', expected:'%23document-fragment%0A%7C%20%22a%E2%80%8Eb%22'},
{name:'da999a55445eca43aa41e039ec439c1a812db297', input:'a%26rlm%3Bb', expected:'%23document-fragment%0A%7C%20%22a%E2%80%8Fb%22'},
-{name:'0fd9e3823b62c028c1d50e35b1f3ee3df02a62eb', input:'%26quot%3B', expected:'%23document-fragment%0A%7C%20%22%26quot%3B%22'},
+{name:'0fd9e3823b62c028c1d50e35b1f3ee3df02a62eb', input:'%26quot%3B', expected:'%23document-fragment%0A%7C%20%22%22%22'},
{name:'e7387003fbacb22b706796c98b781eb4ebf5ff85', input:'%26nbsp%3B', expected:'%23document-fragment%0A%7C%20%22%C2%A0%22'},
-{name:'216cd0e914b9f2ccd04eff6d02a0b1ce24441d95', input:'%26copy%3B', expected:'%23document-fragment%0A%7C%20%22%26copy%3B%22'},
+{name:'216cd0e914b9f2ccd04eff6d02a0b1ce24441d95', input:'%26copy%3B', expected:'%23document-fragment%0A%7C%20%22%C2%A9%22'},
{name:'2cdf20980d17a5d077299215e6a7e97f3c6b07e2', input:'%26%26', expected:'%23document-fragment%0A%7C%20%22%26%26%22'},
{name:'83f4500c0bd8598480713997a041d8f70fd3f11e', input:'%261', expected:'%23document-fragment%0A%7C%20%22%261%22'},
{name:'2c6b2ba38a08eca45370f28a5b7df2aa463fb3dc', input:'%261%3B', expected:'%23document-fragment%0A%7C%20%22%261%3B%22'},
{name:'f4bb977c0a06851bdd19260c035a766c5c8ea093', input:'%26%3C', expected:'%23document-fragment%0A%7C%20%22%26%22'},
{name:'b1fff1ac42688d16e00f6c758d84e5152e39702d', input:'%26%3Cc', expected:'%23document-fragment%0A%7C%20%22%26%22%0A%7C%20%3Cspan%3E'},
-{name:'bd68f6beda2c2264e61dff7359c1ad48bc0a9934', input:'%26%2332%3B', expected:'%23document-fragment%0A%7C%20%22%26%2332%3B%22'},
-{name:'5b77a0be23453dfe6eea59d43bb0708f89e1df82', input:'%26%23x20%3B', expected:'%23document-fragment%0A%7C%20%22%26%23x20%3B%22'},
-{name:'87986551b0e6180cb279f2aa4cdddf77daa90c11', input:'%26%3B', expected:'%23document-fragment%0A%7C%20%22%26%3B%22'}
+{name:'bd68f6beda2c2264e61dff7359c1ad48bc0a9934', input:'%26%2332%3B', expected:'%23document-fragment%0A%7C%20%22%20%22'},
+{name:'5b77a0be23453dfe6eea59d43bb0708f89e1df82', input:'%26%23x20%3B', expected:'%23document-fragment%0A%7C%20%22%20%22'},
+{name:'87986551b0e6180cb279f2aa4cdddf77daa90c11', input:'%26%3B', expected:'%23document-fragment%0A%7C%20%22%26%3B%22'},
+{name:'e3ac2060b915f0f499b2863f999dcdb38a5db79b', input:'%26ClockwiseContourIntegral%3B', expected:'%23document-fragment%0A%7C%20%22%E2%88%B2%22'},
+{name:'31c8a5ecfa5c54d8c0ec5b4ee8f0bbea0d6d40af', input:'%26nsubE%3B', expected:'%23document-fragment%0A%7C%20%22%E2%AB%85%CC%B8%22'},
+{name:'9ed59950764468c4ef2948d71cf75c3f2b60c74d', input:'%26notin%3B', expected:'%23document-fragment%0A%7C%20%22%E2%88%89%22'},
+{name:'71a6efcfab81264fb95bb3234c59687c11c72baf', input:'%26not%3B', expected:'%23document-fragment%0A%7C%20%22%C2%AC%22'},
+{name:'86d7c20ca3c060f9e699c7da43927c4a07a5d569', input:'%26not', expected:'%23document-fragment%0A%7C%20%22%C2%AC%22'},
+{name:'314cd94292df37044e90ce27b5606bf8ec636b94', input:'%26notit%3B', expected:'%23document-fragment%0A%7C%20%22%C2%ACit%3B%22'}
]);
</script>
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/tags.html b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/tags.html
index d42478dc988..c624320f2b8 100644
--- a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/tags.html
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/tags.html
@@ -1,5 +1,6 @@
<!doctype html>
<title>WebVTT cue data parser test tags</title>
+<link rel="help" href="https://w3c.github.io/webvtt/#cue-text-parsing-rules">
<style>video { display:none }</style>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
@@ -18,6 +19,24 @@ runTests([
{name:'0d7df935b172f2a1b357b94596d68f2443f30f8b', input:'%3Cc.', expected:'%23document-fragment%0A%7C%20%3Cspan%3E'},
{name:'cd1d6dd274e03ae8fc56bc4ef163998d9ff24496', input:'%3C/', expected:'%23document-fragment'},
{name:'fca1a11d42b735453117f42456360e88082a3fd7', input:'%3Cc%3E%3C/%3Ex', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20%22x%22'},
-{name:'fe3b6277edf5c2f84e7a6779eddd0cac30552bca', input:'%3Cc%3E%3C/%0Ac%3Ex', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20%22x%22'}
+{name:'fe3b6277edf5c2f84e7a6779eddd0cac30552bca', input:'%3Cc%3E%3C/%0Ac%3Ex', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20%22x%22'},
+{name:'6ceded63b53eeab3681a0fc540e959ca88f7dce9', input:'%3Cc%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20%22test%22'},
+{name:'cdcdb0d5d6a975c5612eabcbea5d732ff3bc9f56', input:'a%3Cc.d%20e%3Eb%3C/c%3Ec', expected:'%23document-fragment%0A%7C%20%22a%22%0A%7C%20%3Cspan%3E%0A%7C%20%20%20class%3D%22d%22%0A%7C%20%20%20%22b%22%0A%7C%20%22c%22'},
+{name:'71de37451e7d5524eacc8a190d21cd64c4304e14', input:'%3Ci%3Etest', expected:'%23document-fragment%0A%7C%20%3Ci%3E%0A%7C%20%20%20%22test%22'},
+{name:'70f72cc4d2139d9e8c33189a1a9b89ecd6014a15', input:'a%3Ci.d%20e%3Eb%3C/i%3Ec', expected:'%23document-fragment%0A%7C%20%22a%22%0A%7C%20%3Ci%3E%0A%7C%20%20%20class%3D%22d%22%0A%7C%20%20%20%22b%22%0A%7C%20%22c%22'},
+{name:'985284b688a09f1f55e3c9aab49d7e4ca11f870a', input:'%3Cb%3Etest', expected:'%23document-fragment%0A%7C%20%3Cb%3E%0A%7C%20%20%20%22test%22'},
+{name:'39c36af6d6850bc474f1d9962c1133933fd50dd0', input:'a%3Cb.d%20e%3Eb%3C/b%3Ec', expected:'%23document-fragment%0A%7C%20%22a%22%0A%7C%20%3Cb%3E%0A%7C%20%20%20class%3D%22d%22%0A%7C%20%20%20%22b%22%0A%7C%20%22c%22'},
+{name:'fa6993eaa94404648d8b52e2830e53369404fdcb', input:'%3Cu%3Etest', expected:'%23document-fragment%0A%7C%20%3Cu%3E%0A%7C%20%20%20%22test%22'},
+{name:'45221829445210412642152bfb22fa2ed222d46e', input:'a%3Cu.d%20e%3Eb%3C/u%3Ec', expected:'%23document-fragment%0A%7C%20%22a%22%0A%7C%20%3Cu%3E%0A%7C%20%20%20class%3D%22d%22%0A%7C%20%20%20%22b%22%0A%7C%20%22c%22'},
+{name:'e4d351e1a6b40a7dace801b722efaa200c4895f2', input:'%3Cruby%3Etest', expected:'%23document-fragment%0A%7C%20%3Cruby%3E%0A%7C%20%20%20%22test%22'},
+{name:'a8481eabd1dcac1d02e57e74d499e2395ac171cd', input:'a%3Cruby.f%20g%3Eb%3Crt.h%20j%3Ec%3C/rt%3Ed%3C/ruby%3Ee', expected:'%23document-fragment%0A%7C%20%22a%22%0A%7C%20%3Cruby%3E%0A%7C%20%20%20class%3D%22f%22%0A%7C%20%20%20%22b%22%0A%7C%20%20%20%3Crt%3E%0A%7C%20%20%20%20%20class%3D%22h%22%0A%7C%20%20%20%20%20%22c%22%0A%7C%20%20%20%22d%22%0A%7C%20%22e%22'},
+{name:'68e1d0376f827ebe0c047751a2067594ff41b612', input:'%3Crt%3Etest', expected:'%23document-fragment%0A%7C%20%22test%22'},
+{name:'ab2024b4e65ed64a751adbe8aae1e84ee61bf3e6', input:'%3Cv%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20title%3D%22%22%0A%7C%20%20%20%22test%22'},
+{name:'10f4823ffb17c71654c4602bc45c58300e3ecbcc', input:'%3Cv%20a%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20title%3D%22a%22%0A%7C%20%20%20%22test%22'},
+{name:'909924ef392fb20c9526acfa4f18f891eda61a0c', input:'%3Cv%20a%20b%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20title%3D%22a%20b%22%0A%7C%20%20%20%22test%22'},
+{name:'e5ca35cc29404efc0ebd58aa5f6efefc86fc5287', input:'%3Cv.a%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20class%3D%22a%22%0A%7C%20%20%20title%3D%22%22%0A%7C%20%20%20%22test%22'},
+{name:'e535c486dac7dc571463b150adc55fd841bc3008', input:'%3Cv.a.b%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20class%3D%22a%20b%22%0A%7C%20%20%20title%3D%22%22%0A%7C%20%20%20%22test%22'},
+{name:'bb7abafab60a0ea63f57420759fac4093148ecc8', input:'a%3Cv.d%20e%3Eb%3C/v%3Ec', expected:'%23document-fragment%0A%7C%20%22a%22%0A%7C%20%3Cspan%3E%0A%7C%20%20%20class%3D%22d%22%0A%7C%20%20%20title%3D%22e%22%0A%7C%20%20%20%22b%22%0A%7C%20%22c%22'},
+{name:'b53365151e0b2434837d6cce15c3d51e666a813e', input:'a%3Clang.d%20e%3Eb%3C/lang%3Ec', expected:'%23document-fragment%0A%7C%20%22a%22%0A%7C%20%3Cspan%3E%0A%7C%20%20%20class%3D%22d%22%0A%7C%20%20%20lang%3D%22e%22%0A%7C%20%20%20%22b%22%0A%7C%20%22c%22'}
]);
</script>
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/text.html b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/text.html
new file mode 100644
index 00000000000..f7241a5c15a
--- /dev/null
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/text.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<title>WebVTT cue data parser test text</title>
+<link rel="help" href="https://w3c.github.io/webvtt/#cue-text-parsing-rules">
+<style>video { display:none }</style>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/html/syntax/parsing/template.js></script>
+<script src=/html/syntax/parsing/common.js></script>
+<script src=../common.js></script>
+<div id=log></div>
+<script>
+runTests([
+{name:'aa785adca3fcdfe1884ae840e13c6d294a2414e8', input:'text', expected:'%23document-fragment%0A%7C%20%22text%22'},
+{name:'3979f3c0c7664ee8a9f78854626bc7bc39b86c96', input:'text1%0Atext2', expected:'%23document-fragment%0A%7C%20%22text1%0Atext2%22'},
+{name:'6805ac5ddce21cfceb4eccf04a6a9013760f5d5b', input:'foo%00bar', expected:'%23document-fragment%0A%7C%20%22foo%EF%BF%BDbar%22'},
+{name:'5cfbdbe32701516fc90c3786da1db4716ac09fb8', input:'%E2%9C%93', expected:'%23document-fragment%0A%7C%20%22%E2%9C%93%22'},
+{name:'a34d27ca7b23f07db6ec2e32226fca105e958db6', input:'text1%0A%0Atext2', expected:'%23document-fragment%0A%7C%20%22text1%22'}
+]);
+</script>
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/timestamps.html b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/timestamps.html
index bc19e2d8e05..1739d963670 100644
--- a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/timestamps.html
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/timestamps.html
@@ -1,5 +1,6 @@
<!doctype html>
<title>WebVTT cue data parser test timestamps</title>
+<link rel="help" href="https://w3c.github.io/webvtt/#cue-text-parsing-rules">
<style>video { display:none }</style>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
@@ -12,6 +13,7 @@ runTests([
{name:'54c245f3fbe7a3e25398b13971d44f2bb3a5f947', input:'%3C0', expected:'%23document-fragment'},
{name:'5e190a1b4541fcb10e403af111c14ef152fecb0d', input:'%3C0.500', expected:'%23document-fragment'},
{name:'92b97d3497836259e0b9305e27f2b91ea1dc9b31', input:'%3C0%3A00.500', expected:'%23document-fragment'},
+{name:'2f0e84518d356cb1e56a366296fa491c5bed1e3a', input:'%3C00%3A%0000%3A00.500%3E', expected:'%23document-fragment'},
{name:'47fa4306a695161da88533d456ce94829e53b13d', input:'%3C00%3A00.500', expected:'%23document-fragment%0A%7C%20%3C%3Ftimestamp%2000%3A00%3A00.500%3E'},
{name:'c1036a4322c1852e02e5a1843a9a81dfca6d7af3', input:'%3C00%3A00%3A00.500', expected:'%23document-fragment%0A%7C%20%3C%3Ftimestamp%2000%3A00%3A00.500%3E'},
{name:'70ec34d828ca661a583c651207becb968bb41653', input:'test%3C00%3A00%3A00.500%3Etest', expected:'%23document-fragment%0A%7C%20%22test%22%0A%7C%20%3C%3Ftimestamp%2000%3A00%3A00.500%3E%0A%7C%20%22test%22'},
diff --git a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/tree-building.html b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/tree-building.html
index 98062f8303e..6cd617decef 100644
--- a/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/tree-building.html
+++ b/tests/wpt/web-platform-tests/webvtt/parsing/cue-text-parsing/tests/tree-building.html
@@ -1,5 +1,6 @@
<!doctype html>
<title>WebVTT cue data parser test tree-building</title>
+<link rel="help" href="https://w3c.github.io/webvtt/#cue-text-parsing-rules">
<style>video { display:none }</style>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
@@ -10,12 +11,6 @@
<script>
runTests([
{name:'4e1243bd22c66e76c2ba9eddc1f91394e57f9f83', input:'test', expected:'%23document-fragment%0A%7C%20%22test%22'},
-{name:'6ceded63b53eeab3681a0fc540e959ca88f7dce9', input:'%3Cc%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20%22test%22'},
-{name:'71de37451e7d5524eacc8a190d21cd64c4304e14', input:'%3Ci%3Etest', expected:'%23document-fragment%0A%7C%20%3Ci%3E%0A%7C%20%20%20%22test%22'},
-{name:'985284b688a09f1f55e3c9aab49d7e4ca11f870a', input:'%3Cb%3Etest', expected:'%23document-fragment%0A%7C%20%3Cb%3E%0A%7C%20%20%20%22test%22'},
-{name:'fa6993eaa94404648d8b52e2830e53369404fdcb', input:'%3Cu%3Etest', expected:'%23document-fragment%0A%7C%20%3Cu%3E%0A%7C%20%20%20%22test%22'},
-{name:'e4d351e1a6b40a7dace801b722efaa200c4895f2', input:'%3Cruby%3Etest', expected:'%23document-fragment%0A%7C%20%3Cruby%3E%0A%7C%20%20%20%22test%22'},
-{name:'68e1d0376f827ebe0c047751a2067594ff41b612', input:'%3Crt%3Etest', expected:'%23document-fragment%0A%7C%20%22test%22'},
{name:'2564487cfc7e317428fb437ef8de8de4f4963426', input:'%3Cruby%3Etest%3Crt%3Etest', expected:'%23document-fragment%0A%7C%20%3Cruby%3E%0A%7C%20%20%20%22test%22%0A%7C%20%20%20%3Crt%3E%0A%7C%20%20%20%20%20%22test%22'},
{name:'9b1902c975558eeaff4afbaf0a6dc100e1978769', input:'%3Cruby%3Etest%3Crt%3Etest%3C/rt%3Etest', expected:'%23document-fragment%0A%7C%20%3Cruby%3E%0A%7C%20%20%20%22test%22%0A%7C%20%20%20%3Crt%3E%0A%7C%20%20%20%20%20%22test%22%0A%7C%20%20%20%22test%22'},
{name:'119c596ea09649d3bd03934485e3067e89377412', input:'%3Cruby%3Etest%3Crt%3Etest%3C/rt%3E%3C/ruby%3Etest', expected:'%23document-fragment%0A%7C%20%3Cruby%3E%0A%7C%20%20%20%22test%22%0A%7C%20%20%20%3Crt%3E%0A%7C%20%20%20%20%20%22test%22%0A%7C%20%22test%22'},
@@ -23,11 +18,6 @@ runTests([
{name:'325c1e590e74f1ff33ca5b4838c04cf6b6dd71ba', input:'%3Cruby%3Etest%3Crt%3E%3Cb%3Etest%3C/rt%3E%3C/ruby%3Etest', expected:'%23document-fragment%0A%7C%20%3Cruby%3E%0A%7C%20%20%20%22test%22%0A%7C%20%20%20%3Crt%3E%0A%7C%20%20%20%20%20%3Cb%3E%0A%7C%20%20%20%20%20%20%20%22test%22%0A%7C%20%20%20%20%20%20%20%22test%22'},
{name:'92847ed2694c9639ba96f4cc61e2215362a74904', input:'%3Cruby%3Etest%3Crt%3E%3Cb%3Etest%3C/ruby%3Etest', expected:'%23document-fragment%0A%7C%20%3Cruby%3E%0A%7C%20%20%20%22test%22%0A%7C%20%20%20%3Crt%3E%0A%7C%20%20%20%20%20%3Cb%3E%0A%7C%20%20%20%20%20%20%20%22test%22%0A%7C%20%20%20%20%20%20%20%22test%22'},
{name:'c0da62d1c8716ca544c96799f06ac7e4664500fb', input:'%3Cruby%3Etest%3Crt%3E%3Cb%3Etest%3C/rt%3E%3C/ruby%3E%3C/b%3Etest', expected:'%23document-fragment%0A%7C%20%3Cruby%3E%0A%7C%20%20%20%22test%22%0A%7C%20%20%20%3Crt%3E%0A%7C%20%20%20%20%20%3Cb%3E%0A%7C%20%20%20%20%20%20%20%22test%22%0A%7C%20%20%20%20%20%22test%22'},
-{name:'b85bd616672eba0591718182ef32e3307d223bb0', input:'%3Cruby%3Etest%3Crt%3E%3Cb%3Etest%3C/rt%3E%3C/b%3E%3C/ruby%3Etest', expected:'%23document-fragment%0A%7C%20%3Cruby%3E%0A%7C%20%20%20%22test%22%0A%7C%20%20%20%3Crt%3E%0A%7C%20%20%20%20%20%3Cb%3E%0A%7C%20%20%20%20%20%20%20%22test%22%0A%7C%20%22test%22'},
-{name:'ab2024b4e65ed64a751adbe8aae1e84ee61bf3e6', input:'%3Cv%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20title%3D%22%22%0A%7C%20%20%20%22test%22'},
-{name:'10f4823ffb17c71654c4602bc45c58300e3ecbcc', input:'%3Cv%20a%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20title%3D%22a%22%0A%7C%20%20%20%22test%22'},
-{name:'909924ef392fb20c9526acfa4f18f891eda61a0c', input:'%3Cv%20a%20b%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20title%3D%22a%20b%22%0A%7C%20%20%20%22test%22'},
-{name:'e5ca35cc29404efc0ebd58aa5f6efefc86fc5287', input:'%3Cv.a%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20class%3D%22a%22%0A%7C%20%20%20title%3D%22%22%0A%7C%20%20%20%22test%22'},
-{name:'e535c486dac7dc571463b150adc55fd841bc3008', input:'%3Cv.a.b%3Etest', expected:'%23document-fragment%0A%7C%20%3Cspan%3E%0A%7C%20%20%20class%3D%22a%20b%22%0A%7C%20%20%20title%3D%22%22%0A%7C%20%20%20%22test%22'}
+{name:'b85bd616672eba0591718182ef32e3307d223bb0', input:'%3Cruby%3Etest%3Crt%3E%3Cb%3Etest%3C/rt%3E%3C/b%3E%3C/ruby%3Etest', expected:'%23document-fragment%0A%7C%20%3Cruby%3E%0A%7C%20%20%20%22test%22%0A%7C%20%20%20%3Crt%3E%0A%7C%20%20%20%20%20%3Cb%3E%0A%7C%20%20%20%20%20%20%20%22test%22%0A%7C%20%22test%22'}
]);
</script>
diff --git a/tests/wpt/web-platform-tests/workers/OWNERS b/tests/wpt/web-platform-tests/workers/OWNERS
index f7dee93e615..066bbc500fb 100644
--- a/tests/wpt/web-platform-tests/workers/OWNERS
+++ b/tests/wpt/web-platform-tests/workers/OWNERS
@@ -1,6 +1,5 @@
@zqzhang
@chunywang
-@zcorpan
@caitp
@jdm
@annevk
diff --git a/tests/wpt/web-platform-tests/workers/WorkerLocation-origin.sub.window.js b/tests/wpt/web-platform-tests/workers/WorkerLocation-origin.sub.window.js
new file mode 100644
index 00000000000..7e808105dd7
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/WorkerLocation-origin.sub.window.js
@@ -0,0 +1,11 @@
+async_test(t => {
+ const frame = document.createElement("iframe"),
+ asciiOrigin = location.protocol + "//{{domains[天気の良い日]}}:" + location.port,
+ path = new URL("support/WorkerLocation-origin.html", location).pathname;
+ frame.src = asciiOrigin + path;
+ self.onmessage = t.step_func_done(e => {
+ assert_equals(e.data.origin, asciiOrigin);
+ });
+ document.body.appendChild(frame);
+ t.add_cleanup(() => frame.remove());
+}, "workerLocation.origin must use ASCII code points");
diff --git a/tests/wpt/web-platform-tests/workers/Worker_dispatchEvent_ErrorEvent.htm b/tests/wpt/web-platform-tests/workers/Worker_dispatchEvent_ErrorEvent.htm
index aea7e025c16..11ade605057 100644
--- a/tests/wpt/web-platform-tests/workers/Worker_dispatchEvent_ErrorEvent.htm
+++ b/tests/wpt/web-platform-tests/workers/Worker_dispatchEvent_ErrorEvent.htm
@@ -25,12 +25,6 @@ async_test(function(t) {
});
test(function() {
- var e = document.createEvent("ErrorEvent");
- var eProto = Object.getPrototypeOf(e);
- assert_equals(eProto, ErrorEvent.prototype);
-}, "document.createEvent('ErrorEvent')");
-
-test(function() {
var e = new ErrorEvent("error");
assert_false("initErrorEvent" in e, "should not be supported");
}, "initErrorEvent");
diff --git a/tests/wpt/web-platform-tests/workers/data-url.html b/tests/wpt/web-platform-tests/workers/data-url.html
index 306eaf92b5e..1308eba8f62 100644
--- a/tests/wpt/web-platform-tests/workers/data-url.html
+++ b/tests/wpt/web-platform-tests/workers/data-url.html
@@ -26,6 +26,7 @@ function assert_worker_construction_fails(test_desc, mime_type, worker_code) {
assert_unreached('Should not receive any message back.');
});
w.onerror = t.step_func_done(function(e) {
+ assert_true(true, 'Should throw ' + e.message);
// Stop the error from being propagated to the WPT test harness
e.preventDefault();
});
@@ -52,8 +53,9 @@ assert_worker_throws('Web SQL Database inaccessible', 'self.openDatabase("someDB
assert_worker_sends_pass('cross-origin worker', '', 'fetch("/").then(() => self.postMessage("FAIL"), () => self.postMessage("PASS"))');
// 'data:' workers have opaque origin
-assert_worker_sends_pass('worker has opaque origin', 'application/javascript', 'if (self.location.origin == "null") postMessage("PASS"); else postMessage("FAIL");');
+assert_worker_sends_pass('worker has opaque origin', 'application/javascript', 'if (self.location.origin == "null") {postMessage("PASS");} else {postMessage("FAIL");}');
+setup({allow_uncaught_exception:true});
// invalid javascript will trigger an ErrorEvent
assert_worker_construction_fails('invalid javascript produces error', 'application/javascript', '}x=3');
diff --git a/tests/wpt/web-platform-tests/workers/interfaces.idl b/tests/wpt/web-platform-tests/workers/interfaces.idl
deleted file mode 100644
index 531a59cfbd2..00000000000
--- a/tests/wpt/web-platform-tests/workers/interfaces.idl
+++ /dev/null
@@ -1,104 +0,0 @@
-// -----------------------------------------------------------------------------
-// DOM
-// -----------------------------------------------------------------------------
-[Exposed=(Window,Worker)]
-interface EventTarget {
- void addEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
- void removeEventListener(DOMString type, EventListener? callback, optional boolean capture = false);
- boolean dispatchEvent(Event event);
-};
-
-callback interface EventListener {
- void handleEvent(Event event);
-};
-
-// -----------------------------------------------------------------------------
-// HTML
-// -----------------------------------------------------------------------------
-[TreatNonCallableAsNull]
-callback EventHandlerNonNull = any (Event event);
-typedef EventHandlerNonNull? EventHandler;
-
-[TreatNonCallableAsNull]
-callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional DOMString source, optional unsigned long lineno, optional unsigned long column, optional any error);
-typedef OnErrorEventHandlerNonNull? OnErrorEventHandler;
-
-[Exposed=Worker]
-interface WorkerGlobalScope : EventTarget {
- readonly attribute WorkerGlobalScope self;
- readonly attribute WorkerLocation location;
- readonly attribute WorkerNavigator navigator;
-
- void importScripts(DOMString... urls);
-
- attribute OnErrorEventHandler onerror;
-
- attribute EventHandler onoffline;
- attribute EventHandler ononline;
-};
-
-[Global=(Worker,DedicatedWorker),Exposed=DedicatedWorker]
-/*sealed*/ interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
- void postMessage(any message, optional sequence<Transferable> transfer);
- void close();
- attribute EventHandler onmessage;
-};
-
-WorkerGlobalScope implements WindowTimers;
-WorkerGlobalScope implements WindowBase64;
-
-[NoInterfaceObject, Exposed=(Window,Worker)]
-interface WindowTimers {
- long setTimeout(Function handler, optional long timeout = 0, any... arguments);
- long setTimeout(DOMString handler, optional long timeout = 0, any... arguments);
- void clearTimeout(optional long handle = 0);
- long setInterval(Function handler, optional long timeout = 0, any... arguments);
- long setInterval(DOMString handler, optional long timeout = 0, any... arguments);
- void clearInterval(optional long handle = 0);
-};
-
-[NoInterfaceObject, Exposed=(Window,Worker)]
-interface WindowBase64 {
- DOMString btoa(DOMString btoa);
- DOMString atob(DOMString atob);
-};
-
-[Exposed=Worker]
-interface WorkerNavigator {};
-WorkerNavigator implements NavigatorID;
-WorkerNavigator implements NavigatorLanguage;
-WorkerNavigator implements NavigatorOnLine;
-
-[NoInterfaceObject, Exposed=(Window,Worker)]
-interface NavigatorID {
- readonly attribute DOMString appCodeName; // constant "Mozilla"
- readonly attribute DOMString appName;
- readonly attribute DOMString appVersion;
- readonly attribute DOMString platform;
- readonly attribute DOMString product; // constant "Gecko"
- readonly attribute DOMString userAgent;
-};
-
-[NoInterfaceObject, Exposed=(Window,Worker)]
-interface NavigatorLanguage {
- readonly attribute DOMString? language;
- readonly attribute DOMString[] languages;
-};
-
-[NoInterfaceObject, Exposed=(Window,Worker)]
-interface NavigatorOnLine {
- readonly attribute boolean onLine;
-};
-
-[Exposed=Worker]
-interface WorkerLocation {
- stringifier readonly attribute USVString href;
- readonly attribute USVString origin;
- readonly attribute USVString protocol;
- readonly attribute USVString host;
- readonly attribute USVString hostname;
- readonly attribute USVString port;
- readonly attribute USVString pathname;
- readonly attribute USVString search;
- readonly attribute USVString hash;
-};
diff --git a/tests/wpt/web-platform-tests/workers/interfaces.worker.js b/tests/wpt/web-platform-tests/workers/interfaces.worker.js
index f07669ba71c..fc9f3606fae 100644
--- a/tests/wpt/web-platform-tests/workers/interfaces.worker.js
+++ b/tests/wpt/web-platform-tests/workers/interfaces.worker.js
@@ -16,5 +16,5 @@ request.onload = function() {
idlArray.test();
done();
};
-request.open("GET", "interfaces.idl");
+request.open("GET", "/interfaces/dedicated-workers.idl");
request.send();
diff --git a/tests/wpt/web-platform-tests/workers/name-property.html b/tests/wpt/web-platform-tests/workers/name-property.html
index b16be688f8f..939601e5e36 100644
--- a/tests/wpt/web-platform-tests/workers/name-property.html
+++ b/tests/wpt/web-platform-tests/workers/name-property.html
@@ -14,6 +14,12 @@
const worker = new Worker("support/name.js", { name: "my name" });
fetch_tests_from_worker(worker);
+const worker2 = new Worker("support/name-as-accidental-global.js");
+fetch_tests_from_worker(worker2);
+
const sharedWorker = new SharedWorker("support/name.js", { name: "my name" });
fetch_tests_from_worker(sharedWorker);
+
+const sharedWorker2 = new SharedWorker("support/name-as-accidental-global.js");
+fetch_tests_from_worker(sharedWorker2);
</script>
diff --git a/tests/wpt/web-platform-tests/workers/postMessage_ports_readonly_array.htm b/tests/wpt/web-platform-tests/workers/postMessage_ports_readonly_array.htm
index 5e2b9054afa..0645ea7ef5f 100644
--- a/tests/wpt/web-platform-tests/workers/postMessage_ports_readonly_array.htm
+++ b/tests/wpt/web-platform-tests/workers/postMessage_ports_readonly_array.htm
@@ -4,14 +4,16 @@
<script src="/resources/testharnessreport.js"></script>
<div id=log></div>
<script>
+"use strict";
async_test(function(t) {
var channel = new MessageChannel();
var targetPort = channel.port2;
targetPort.start();
targetPort.addEventListener("message", t.step_func_done(function(e) {
var channel3 = new MessageChannel();
- e.ports.push(channel3.port1);
- e.ports.push(channel3.port1);
+ assert_throws(new TypeError(), () => {
+ e.ports.push(channel3.port1);
+ }, "ports is a frozen object");
assert_equals(e.ports.length, 1, "ports is a read only array with length == 1.");
}), true);
var channel2 = new MessageChannel();
diff --git a/tests/wpt/web-platform-tests/workers/semantics/interface-objects/002.worker.js b/tests/wpt/web-platform-tests/workers/semantics/interface-objects/002.worker.js
index 8fc0b6a46f9..2c5f5a5f44a 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/interface-objects/002.worker.js
+++ b/tests/wpt/web-platform-tests/workers/semantics/interface-objects/002.worker.js
@@ -41,6 +41,9 @@ var unexpected = [
"InputEvent",
"KeyboardEvent",
"CompositionEvent",
+ // https://w3c.github.io/webvtt/
+ "VTTCue",
+ "VTTRegion",
];
for (var i = 0; i < unexpected.length; ++i) {
test(function () {
diff --git a/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.html b/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.html
index 9d7ecee1767..8f619484f4d 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/navigation/001-1.html
@@ -16,7 +16,7 @@ onload = function() {
}
}
</script>
-<a href='data:text/html,<title>foo</title><script>onload=function(){parent.after_load()}</script>'>link</a>
+<a href='data:text/html,<title>foo</title><script>onload=function(){window.parent.postMessage({title: window.document.title}, "*")}</script>'>link</a>
<!--
*/
//-->
diff --git a/tests/wpt/web-platform-tests/workers/semantics/navigation/001.html b/tests/wpt/web-platform-tests/workers/semantics/navigation/001.html
index 658df062458..95cd9aff47d 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/navigation/001.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/navigation/001.html
@@ -20,15 +20,17 @@ onload = function() {
var start_test = function() {
window[0].document.links[0].click();
};
-var after_load = function() {
+var after_load = function(event) {
history.back();
newDate = new Date();
setTimeout(function() {
assert_greater_than(Number(date), Number(newDate));
assert_equals(window[0].document.title, '001-1');
+ window.removeEventListener("message", after_load);
done();
}, 2000);
};
+window.addEventListener("message", after_load);
</script>
<!--
*/
diff --git a/tests/wpt/web-platform-tests/workers/semantics/navigation/002.html b/tests/wpt/web-platform-tests/workers/semantics/navigation/002.html
index c0d5eb5c093..8ea98ef2d44 100644
--- a/tests/wpt/web-platform-tests/workers/semantics/navigation/002.html
+++ b/tests/wpt/web-platform-tests/workers/semantics/navigation/002.html
@@ -21,14 +21,16 @@ onload = t.step_func(function() {
var start_test = t.step_func(function() {
window[0].document.links[0].click();
});
-var after_load = t.step_func(function() {
+var after_load = t.step_func(function(event) {
newDate = new Date();
setTimeout(this.step_func(function() {
assert_less_than(Number(date), Number(newDate));
- assert_equals(window[0].document.title, 'foo');
+ assert_equals(event.data.title, 'foo');
+ window.removeEventListener("message", after_load);
this.done();
}), 500);
});
+window.addEventListener("message", after_load);
</script>
<!--
*/
diff --git a/tests/wpt/web-platform-tests/workers/support/WorkerLocation-origin.html b/tests/wpt/web-platform-tests/workers/support/WorkerLocation-origin.html
new file mode 100644
index 00000000000..3d948030a79
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/support/WorkerLocation-origin.html
@@ -0,0 +1,6 @@
+<script>
+const w = new Worker("./WorkerLocation.js");
+w.onmessage = e => {
+ parent.postMessage(e.data, "*");
+}
+</script>
diff --git a/tests/wpt/web-platform-tests/workers/support/WorkerLocation.js b/tests/wpt/web-platform-tests/workers/support/WorkerLocation.js
index a57e2fc6609..901e21542a0 100644
--- a/tests/wpt/web-platform-tests/workers/support/WorkerLocation.js
+++ b/tests/wpt/web-platform-tests/workers/support/WorkerLocation.js
@@ -1,6 +1,7 @@
var obj = new Object();
obj.location = location.toString();
obj.href = location.href;
+obj.origin = location.origin;
obj.protocol = location.protocol;
obj.host = location.host;
obj.hostname = location.hostname;
diff --git a/tests/wpt/web-platform-tests/workers/support/name-as-accidental-global.js b/tests/wpt/web-platform-tests/workers/support/name-as-accidental-global.js
new file mode 100644
index 00000000000..8783a389632
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/support/name-as-accidental-global.js
@@ -0,0 +1,8 @@
+"use strict";
+
+var name = "something else";
+
+// This just makes the test name not "Untitled"
+test(() => { }, "Declaring name as an accidental global must not cause a harness error");
+
+done();
diff --git a/tests/wpt/web-platform-tests/workers/support/name.js b/tests/wpt/web-platform-tests/workers/support/name.js
index 0f3537cce26..7c42c780856 100644
--- a/tests/wpt/web-platform-tests/workers/support/name.js
+++ b/tests/wpt/web-platform-tests/workers/support/name.js
@@ -6,4 +6,13 @@ test(() => {
assert_equals(self.name, "my name")
}, `name property value for ${self.constructor.name}`);
+test(() => {
+ self.name = "something new";
+ const propDesc = Object.getOwnPropertyDescriptor(self, "name");
+ assert_equals(propDesc.value, "something new", "value");
+ assert_true(propDesc.configurable, "configurable");
+ assert_true(propDesc.writable, "writable");
+ assert_true(propDesc.enumerable, "enumerable");
+}, `name property is replaceable for ${self.constructor.name}`);
+
done();
diff --git a/tests/wpt/web-platform-tests/workers/worker-performance.worker.js b/tests/wpt/web-platform-tests/workers/worker-performance.worker.js
new file mode 100644
index 00000000000..c4e562b68eb
--- /dev/null
+++ b/tests/wpt/web-platform-tests/workers/worker-performance.worker.js
@@ -0,0 +1,128 @@
+"use strict";
+
+// Tests that most of the functionality of the window.performance object is available in web workers.
+
+importScripts("/resources/testharness.js");
+
+function verifyEntry (entry, name, type, duration, assertName) {
+ assert_equals(entry.name, name, assertName + " has the right name");
+ assert_equals(entry.entryType, type, assertName + " has the right type");
+ assert_equals(entry.duration, duration, assertName + "has the right duration");
+}
+
+var start;
+test(function testPerformanceNow () {
+ start = performance.now();
+}, "Can use performance.now in workers");
+
+test(function testPerformanceMark () {
+ performance.mark("mark1");
+ // Stall the minimum amount of time to ensure the marks are separate
+ var now = performance.now();
+ while (performance.now() == now) { }
+ performance.mark("mark2");
+}, "Can use performance.mark in workers");
+
+test(function testPerformanceMeasure () {
+ performance.measure("measure1", "mark1", "mark2");
+}, "Can use performance.measure in workers");
+
+test(function testPerformanceGetEntriesByName () {
+ var mark1s = performance.getEntriesByName("mark1");
+ assert_equals(mark1s.length, 1, "getEntriesByName gave correct number of entries");
+ verifyEntry(mark1s[0], "mark1", "mark", 0, "Entry got by name");
+}, "Can use performance.getEntriesByName in workers");
+
+var marks;
+var measures;
+test(function testPerformanceGetEntriesByType () {
+ marks = performance.getEntriesByType("mark");
+ assert_equals(marks.length, 2, "getEntriesByType gave correct number of entries");
+ verifyEntry(marks[0], "mark1", "mark", 0, "First mark entry");
+ verifyEntry(marks[1], "mark2", "mark", 0, "Second mark entry");
+ measures = performance.getEntriesByType("measure");
+ assert_equals(measures.length, 1, "getEntriesByType(\"measure\") gave correct number of entries");
+ verifyEntry(measures[0], "measure1", "measure", marks[1].startTime - marks[0].startTime, "Measure entry");
+}, "Can use performance.getEntriesByType in workers");
+
+test(function testPerformanceEntryOrder () {
+ assert_greater_than(marks[0].startTime, start, "First mark startTime is after a time before it");
+ assert_greater_than(marks[1].startTime, marks[0].startTime, "Second mark startTime is after first mark startTime");
+ assert_equals(measures[0].startTime, marks[0].startTime, "measure's startTime is the first mark's startTime");
+}, "Performance marks and measures seem to be working correctly in workers");
+
+test(function testPerformanceClearing () {
+ performance.clearMarks();
+ assert_equals(performance.getEntriesByType("mark").length, 0, "clearMarks cleared the marks");
+ performance.clearMeasures();
+ assert_equals(performance.getEntriesByType("measure").length, 0, "clearMeasures cleared the measures");
+}, "Can use clearMarks and clearMeasures in workers");
+
+test(function testPerformanceResourceTiming () { // Resource timing
+ var start = performance.now();
+ var xhr = new XMLHttpRequest();
+ // Do a synchronous request and add a little artificial delay
+ xhr.open("GET", "/resources/testharness.js?pipe=trickle(d0.25)", false);
+ xhr.send();
+ // The browser might or might not have added a resource performance entry for the importScripts() above; we're only interested in xmlhttprequest entries
+ var entries = performance.getEntriesByType("resource").filter(entry => entry.initiatorType == "xmlhttprequest");
+ assert_equals(entries.length, 1, "getEntriesByType(\"resource\") returns one entry with initiatorType of xmlhttprequest");
+ assert_true(!!entries[0].name.match(/\/resources\/testharness.js/), "Resource entry has loaded url as its name");
+ assert_equals(entries[0].entryType, "resource", "Resource entry has correct entryType");
+ assert_equals(entries[0].initiatorType, "xmlhttprequest", "Resource entry has correct initiatorType");
+ var currentTimestamp = start;
+ var currentTimestampName = "a time before it";
+ [
+ "startTime", "fetchStart", "requestStart", "responseStart", "responseEnd"
+ ].forEach((name) => {
+ var timestamp = entries[0][name];
+ // We want to skip over values that are 0 because of TAO securty rescritions
+ // Or else this test will fail. This can happen for "requestStart", "responseStart".
+ if (timestamp != 0) {
+ assert_greater_than_equal(timestamp, currentTimestamp, "Resource entry " + name + " is after " + currentTimestampName);
+ currentTimestamp = timestamp;
+ currentTimestampName = name;
+ }
+ });
+ assert_greater_than(entries[0].responseEnd, entries[0].startTime, "The resource request should have taken at least some time");
+ // We requested a delay of 250ms, but it could be a little bit less, and could be significantly more.
+ assert_greater_than(entries[0].responseEnd - entries[0].responseStart, 230, "Resource timing numbers reflect reality somewhat");
+}, "Resource timing seems to work in workers");
+
+test(function testPerformanceClearResourceTimings () {
+ performance.clearResourceTimings();
+ assert_equals(performance.getEntriesByType("resource").length, 0, "clearResourceTimings cleared the resource timings");
+}, "performance.clearResourceTimings in workers");
+
+test(function testPerformanceSetResourceTimingBufferSize () {
+ performance.setResourceTimingBufferSize(0);
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", "/resources/testharness.js", false); // synchronous request
+ xhr.send();
+ assert_equals(performance.getEntriesByType("resource").length, 0, "setResourceTimingBufferSize(0) prevents resource entries from being added");
+}, "performance.setResourceTimingBufferSize in workers");
+
+test(function testPerformanceHasNoTiming () {
+ assert_equals(typeof(performance.timing), "undefined", "performance.timing is undefined");
+}, "performance.timing is not available in workers");
+
+test(function testPerformanceHasNoNavigation () {
+ assert_equals(typeof(performance.navigation), "undefined", "performance.navigation is undefined");
+}, "performance.navigation is not available in workers");
+
+test(function testPerformanceHasNoToJSON () {
+ assert_equals(typeof(performance.toJSON), "undefined", "performance.toJSON is undefined");
+}, "performance.toJSON is not available in workers");
+
+test(function testPerformanceNoNavigationEntries () {
+ assert_equals(performance.getEntriesByType("navigation").length, 0, "getEntriesByType(\"navigation\") returns nothing");
+ assert_equals(performance.getEntriesByName("document", "navigation").length, 0, "getEntriesByName(\"document\", \"navigation\") returns nothing");
+ assert_equals(performance.getEntriesByName("document").length, 0, "getEntriesByName(\"document\") returns nothing");
+ var hasNavigation = performance.getEntries().some((e,i,a) => {
+ return e.entryType == "navigation";
+ });
+ assert_false(hasNavigation, "getEntries should return no navigation entries.");
+
+}, "There are no navigation type performance entries in workers");
+
+done();
diff --git a/tests/wpt/web-platform-tests/worklets/README.md b/tests/wpt/web-platform-tests/worklets/README.md
new file mode 100644
index 00000000000..027b23216d5
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/README.md
@@ -0,0 +1 @@
+These are the tests for the [Worklets Level 1 spec](https://drafts.css-houdini.org/worklets/).
diff --git a/tests/wpt/web-platform-tests/worklets/animation-worklet-import.html b/tests/wpt/web-platform-tests/worklets/animation-worklet-import.html
new file mode 100644
index 00000000000..3457d445046
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/animation-worklet-import.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/import-tests.js"></script>
+</head>
+<body>
+<script>
+ runImportTests(window.animationWorklet);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/worklets/paint-worklet-import.html b/tests/wpt/web-platform-tests/worklets/paint-worklet-import.html
new file mode 100644
index 00000000000..f65e308af85
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/paint-worklet-import.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <script src="/common/get-host-info.sub.js"></script>
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ <script src="resources/import-tests.js"></script>
+</head>
+<body>
+<script>
+ runImportTests(CSS.paintWorklet);
+</script>
+</body>
+</html>
diff --git a/tests/wpt/web-platform-tests/worklets/resources/empty-worklet-script.js b/tests/wpt/web-platform-tests/worklets/resources/empty-worklet-script.js
new file mode 100644
index 00000000000..49ceb2648a9
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/resources/empty-worklet-script.js
@@ -0,0 +1 @@
+// Do nothing.
diff --git a/tests/wpt/web-platform-tests/worklets/resources/import-cyclic-worklet-script.js b/tests/wpt/web-platform-tests/worklets/resources/import-cyclic-worklet-script.js
new file mode 100644
index 00000000000..2dc7e0bd3c4
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/resources/import-cyclic-worklet-script.js
@@ -0,0 +1 @@
+import './import-cyclic-worklet-script.js';
diff --git a/tests/wpt/web-platform-tests/worklets/resources/import-nested-internal-worklet-script.js b/tests/wpt/web-platform-tests/worklets/resources/import-nested-internal-worklet-script.js
new file mode 100644
index 00000000000..5fe8d91100f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/resources/import-nested-internal-worklet-script.js
@@ -0,0 +1 @@
+import './empty-worklet-script.js';
diff --git a/tests/wpt/web-platform-tests/worklets/resources/import-nested-worklet-script.js b/tests/wpt/web-platform-tests/worklets/resources/import-nested-worklet-script.js
new file mode 100644
index 00000000000..b63685f6421
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/resources/import-nested-worklet-script.js
@@ -0,0 +1 @@
+import './import-nested-internal-worklet-script.js';
diff --git a/tests/wpt/web-platform-tests/worklets/resources/import-tests.js b/tests/wpt/web-platform-tests/worklets/resources/import-tests.js
new file mode 100644
index 00000000000..d40ed3ef855
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/resources/import-tests.js
@@ -0,0 +1,114 @@
+// Runs a series of tests related to importing scripts on a worklet.
+//
+// Usage:
+// runImportTests(workletType);
+function runImportTests(worklet) {
+ promise_test(() => {
+ const kScriptURL = 'resources/empty-worklet-script.js';
+ return worklet.addModule(kScriptURL).then(undefined_arg => {
+ assert_equals(undefined_arg, undefined,
+ 'Promise should resolve with no arguments.');
+ });
+ }, 'Importing a script resolves the given promise.');
+
+ promise_test(() => {
+ const kScriptURL = 'resources/empty-worklet-script.js';
+ return Promise.all([
+ worklet.addModule(kScriptURL + '?1'),
+ worklet.addModule(kScriptURL + '?2'),
+ worklet.addModule(kScriptURL + '?3')
+ ]).then(undefined_args => {
+ assert_array_equals(undefined_args,
+ [undefined, undefined, undefined],
+ 'Promise should resolve with no arguments.');
+ });
+ }, 'Importing scripts resolves all the given promises.');
+
+ promise_test(() => {
+ const kScriptURL = 'resources/import-nested-worklet-script.js';
+ return worklet.addModule(kScriptURL).then(undefined_arg => {
+ assert_equals(undefined_arg, undefined,
+ 'Promise should resolve with no arguments.');
+ });
+ }, 'Importing nested scripts resolves the given promise');
+
+ promise_test(() => {
+ const kScriptURL = 'resources/import-cyclic-worklet-script.js';
+ return worklet.addModule(kScriptURL).then(undefined_arg => {
+ assert_equals(undefined_arg, undefined,
+ 'Promise should resolve with no arguments.');
+ });
+ }, 'Importing cyclic scripts resolves the given promise');
+
+ promise_test(() => {
+ const kScriptURL = 'resources/throwing-worklet-script.js';
+ return worklet.addModule(kScriptURL).then(undefined_arg => {
+ assert_equals(undefined_arg, undefined,
+ 'Promise should resolve with no arguments.');
+ });
+ }, 'Importing a script which throws should still resolve the given ' +
+ 'promise.');
+
+ promise_test(t => {
+ const kScriptURL = 'non-existent-worklet-script.js';
+ return promise_rejects(t, new DOMException('', 'AbortError'),
+ worklet.addModule(kScriptURL));
+ }, 'Importing a non-existent script rejects the given promise with an ' +
+ 'AbortError.');
+
+ promise_test(t => {
+ const kInvalidScriptURL = 'http://invalid:123$'
+ return promise_rejects(t, new DOMException('', 'SyntaxError'),
+ worklet.addModule(kInvalidScriptURL));
+ }, 'Importing an invalid URL should reject the given promise with a ' +
+ 'SyntaxError.');
+
+ promise_test(() => {
+ const kBlob = new Blob([""], {type: 'text/javascript'});
+ const kBlobURL = URL.createObjectURL(kBlob);
+ return worklet.addModule(kBlobURL).then(undefined_arg => {
+ assert_equals(undefined_arg, undefined);
+ });
+ }, 'Importing a blob URL should resolve the given promise.');
+
+ promise_test(t => {
+ const kFileURL = 'file:///empty-worklet-script.js';
+ return promise_rejects(t, new DOMException('', 'AbortError'),
+ worklet.addModule(kFileURL));
+ }, 'Importing a file:// URL should reject the given promise.');
+
+ promise_test(() => {
+ const kDataURL = 'data:text/javascript, // Do nothing.';
+ return worklet.addModule(kDataURL).then(undefined_arg => {
+ assert_equals(undefined_arg, undefined);
+ });
+ }, 'Importing a data URL should resolve the given promise.');
+
+ promise_test(t => {
+ const kScriptURL = 'about:blank';
+ return promise_rejects(t, new DOMException('', 'AbortError'),
+ worklet.addModule(kScriptURL));
+ }, 'Importing about:blank should reject the given promise.');
+
+ promise_test(() => {
+ // Specify the Access-Control-Allow-Origin header to enable cross origin
+ // access.
+ const kScriptURL = get_host_info().HTTP_REMOTE_ORIGIN +
+ '/worklets/resources/empty-worklet-script.js' +
+ '?pipe=header(Access-Control-Allow-Origin, *)';
+ return worklet.addModule(kScriptURL).then(undefined_arg => {
+ assert_equals(undefined_arg, undefined);
+ });
+ }, 'Importing a cross origin resource with the ' +
+ 'Access-Control-Allow-Origin header should resolve the given promise');
+
+ promise_test(t => {
+ // Don't specify the Access-Control-Allow-Origin header. addModule()
+ // should be rejected because of disallowed cross origin access.
+ const kScriptURL = get_host_info().HTTP_REMOTE_ORIGIN +
+ '/worklets/resources/empty-worklet-script.js';
+ return promise_rejects(t, new DOMException('', 'AbortError'),
+ worklet.addModule(kScriptURL));
+ }, 'Importing a cross origin resource without the ' +
+ 'Access-Control-Allow-Origin header should reject the given promise');
+}
diff --git a/tests/wpt/web-platform-tests/worklets/resources/throwing-worklet-script.js b/tests/wpt/web-platform-tests/worklets/resources/throwing-worklet-script.js
new file mode 100644
index 00000000000..6417d6c5f7f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/worklets/resources/throwing-worklet-script.js
@@ -0,0 +1 @@
+throw Error();
diff --git a/tests/wpt/web-platform-tests/wpt b/tests/wpt/web-platform-tests/wpt
new file mode 100755
index 00000000000..a24bc83a919
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wpt
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+
+if __name__ == "__main__":
+ from tools.wpt import wpt
+ wpt.main()
diff --git a/tests/wpt/web-platform-tests/wpt.py b/tests/wpt/web-platform-tests/wpt.py
new file mode 100644
index 00000000000..0736186c5d8
--- /dev/null
+++ b/tests/wpt/web-platform-tests/wpt.py
@@ -0,0 +1 @@
+execfile("wpt") \ No newline at end of file
diff --git a/tests/wpt/web-platform-tests/wptrun b/tests/wpt/web-platform-tests/wptrun
deleted file mode 100755
index c0a96f4ae1b..00000000000
--- a/tests/wpt/web-platform-tests/wptrun
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env python
-
-if __name__ == "__main__":
- from tools import wptrun
- wptrun.main()